Lo esencial
Puede que no lo sepas, pero en JavaScript, cada vez que interactuamos con cadenas, números o primitivas booleanas, entramos en un mundo oculto de sombras de objetos y coerción.
cadena, número, booleano, nulo, indefinido y símbolo.
En JavaScript hay 7 tipos primitivos: undefined
, null
, boolean
, string
, number
, bigint
ysymbol
. Todo lo demás es un objeto. Los tipos de primitivas boolean
, string
y number
se pueden envolver por sus homólogos de objeto. Estos objetos son instancias de los constructores Boolean
, String
y Number
respectivamente.
typeof true; //"boolean"
typeof new Boolean(true); //"object"
typeof "this is a string"; //"string"
typeof new String("this is a string"); //"object"
typeof 123; //"number"
typeof new Number(123); //"object"
Si las primitivas no tienen propiedades, ¿por qué "this is a string".length
devuelven un valor?
Porque JavaScript coaccionará fácilmente entre primitivas y objetos. En este caso, el valor de la cadena se convierte en un objeto de cadena para acceder a la longitud de la propiedad. El objeto de cuerda solo se usa durante una fracción de segundo, después de lo cual se sacrifica a los dioses de la recolección de basura, pero en el espíritu de los programas de descubrimiento de televisión, atraparemos a la criatura elusiva y la conservaremos para un análisis posterior ...
Para demostrar esto, considere el siguiente ejemplo en el que estamos agregando una nueva propiedad al prototipo del constructor de cadenas.
String.prototype.sampleProperty = 5;
var str = "this is a string";
str.sampleProperty; // 5
De este modo, las primitivas tienen acceso a todas las propiedades (incluidos los métodos) definidas por sus respectivos constructores de objetos.
Así que vimos que los tipos primitivos coaccionarán apropiadamente a su respectiva contraparte de Objeto cuando sea necesario.
Análisis de toString()
método
Considere el siguiente código
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
myObj.toString(); // "[object Object]"
myFunc.toString(); // "function(){}"
myString.toString(); // "This is a sample String"
myNumber.toString(); // "4"
myArray.toString(); // "2,3,5"
Como se discutió anteriormente, lo que realmente está sucediendo es que cuando llamamos toString()
a un método en un tipo primitivo, debe ser forzado a su contraparte de objeto antes de que pueda invocar el método.
es decirmyNumber.toString()
es es equivalente aNumber.prototype.toString.call(myNumber)
y similar a otros tipos primitivos.
Pero, ¿qué pasa si en lugar de pasar el tipo primitivo al toString()
método de su correspondiente función de constructor de objetos, forzamos el tipo primitivo a pasar como parámetro al toString()
método del constructor de funciones de objeto (Object.prototype.toString.call(x)
)?
Un vistazo más de cerca a Object.prototype.toString ()
Según la documentación , cuando se llama al método toString, se siguen los siguientes pasos:
- Si el
this
valor es undefined
, regrese "[object Undefined]"
.
- Si el
this
valor es null
, regrese "[object Null]"
.
- Si este valor no es ninguno de los anteriores,
O
sea el resultado de llamar toObject
pasando elthis
valor como argumento.
- Sea class el valor de la
[[Class]]
propiedad interna de O
.
- Devuelve el valor de cadena que es el resultado de la concatenación de las tres cuerdas
"[object "
, class
y "]"
.
Comprenda esto con el siguiente ejemplo
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
var myUndefined = undefined;
var myNull = null;
Object.prototype.toString.call(myObj); // "[object Object]"
Object.prototype.toString.call(myFunc); // "[object Function]"
Object.prototype.toString.call(myString); // "[object String]"
Object.prototype.toString.call(myNumber); // "[object Number]"
Object.prototype.toString.call(myArray); // "[object Array]"
Object.prototype.toString.call(myUndefined); // "[object Undefined]"
Object.prototype.toString.call(myNull); // "[object Null]"
Referencias:
https://es5.github.io/x15.2.html#x15.2.4.2
https://es5.github.io/x9.html#x9.9
https://javascriptweblog.wordpress.com/ 2010/09/27 / la-vida-secreta-de-las-primitivas-javascript /