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, bigintysymbol . Todo lo demás es un objeto. Los tipos de primitivas boolean, stringy numberse pueden envolver por sus homólogos de objeto. Estos objetos son instancias de los constructores Boolean, Stringy Numberrespectivamente.
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".lengthdevuelven 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
thisvalor es undefined, regrese "[object Undefined]".
- Si el
thisvalor es null, regrese "[object Null]".
- Si este valor no es ninguno de los anteriores,
Osea el resultado de llamar toObjectpasando 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 ", classy "]".
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 /