toString() y Object.prototype.toString.call()
Lo que hace es: Convertir el valor en una cadena
Echemos un vistazo a una demostración:
En el ejemplo anterior, definimos tres tipos Para Llame al método toString: objeto, matriz y cadena, pero los resultados son completamente diferentes. ¿Extraño?
Del ejemplo,
Entonces, según los resultados, parece que los métodos toString de diferentes tipos no tienen la misma funcionalidad (a pesar de que el nombre es toString).
Cualquiera que entienda los prototipos de objetos y los tipos encapsulados básicos sabe que en el ejemplo anterior:
Aunque t2 también es un objeto, está en el primer nivel de la cadena de prototipos Array.prototype tiene un método toString, por lo que hereda directamente ese método sin buscar el método Array.prototype.__proto_.
Entonces, según los resultados, los métodos toString de diferentes tipos tienen la misma funcionalidad (aunque todos se llamen toString). Object.prototype.__proto____, por lo que la cadena de prototipos de diferentes tipos cubre más o menos el método toString, por lo que la funcionalidad es diferente.
A continuación, analicemos las diferencias en los valores de retorno de diferentes tipos de llamadas al método toString().
null e indefinido no tienen constructores, por lo que no llaman ni pueden llamar a toString(), lo que significa que no pueden acceder a ninguna propiedad o método, son solo tipos primitivos.
Por lo tanto:
Debido a que
window es un objeto especial en js, Window no tiene constructor, es decir, no existe ningún prototipo Window.prototype para anular toString. (), buscará la cadena de prototipos y llamará a Object.prototype.toString().
Arriba, probamos el método toString llamando y llamando directamente. Sabemos que el resultado devuelto por el objeto correspondiente es [tipo de objeto], donde tipo es el tipo de objeto, por lo que podemos juzgar el tipo en función de la función que devuelve el objeto.
Es decir, llamar directamente al método toString() es equivalente a
Es decir: aquí, llamar directamente al método toString() no debe entenderse como un global referencia a la llamada de alcance del método toString(), es decir, window.toString()
Por lo tanto, llamar a toString() directamente debe ser un método undefined.toString() disfrazado (estamos discutiendo el método equivalente). aquí, el método indefinido real no funciona, la llamada generará un error).
La gente suele utilizar toString.call/apply(type) en lugar de Object.prototype.toString.call/apply(type). call/apply(type). De hecho, esto no es riguroso y puede causar fácilmente algunos problemas, como se muestra a continuación
Podemos encontrar que cuando personalizamos el método toString(), podemos encontrarlo. que cuando personalizamos el método toString(), cuando llamamos directamente al método toString(), ya no llamará al método toString() de la clase Object de forma predeterminada, sino que utilizará nuestro método personalizado, lo que puede no ser el caso. Obtendrá los resultados que queremos, por lo que aún deberíamos intentar usar el método Object.prototype.toString.call/apply(type).
prototipo.toString.call/apply(tipo).
Al igual que el método toString(), diferentes subtipos de Object también anularán toLocaleString(), valueOf() y otros métodos. Lo que quiero decir aquí es que no importa cómo el subtipo del objeto anule estos métodos, siempre que entendamos el origen de estos métodos y cómo llamarlos, debemos intentar usar el método Object.prototype.toString(). . prototipo. strong>Y cómo llamarlos, ¡podemos comprender bien los resultados de estas llamadas a métodos!
¡Finalmente, comprender objetos y prototipos en JS es realmente importante!
¡Al final, comprender objetos y prototipos en JS es realmente importante!