javascript - tipos - ¿Console.log invoca al método String de un objeto?
pasar parametros a una funcion javascript desde html (3)
Según esta documentación ,
Las representaciones de cadena de cada uno de estos objetos se anexan juntas en el orden indicado y la salida.
También según la respuesta
El + x coacciona al objeto x en una cadena, que es solo [object Object]:
Entonces, mi pregunta es
Si lo hago
str = new String("hello")
console.log(str) //prints the string object but not ''hello''
console.log(""+str) //prints "hello"
Entonces, en el primer caso, simplemente imprime el objeto (no invoca el método toString()
).
Pero en el segundo caso, no coacciona sino que simplemente imprime el valor primitivo. ¿Por qué es así?
¿Qué método invoca console.log
para imprimir el objeto?
Tenga en cuenta que esto no es un duplicado de esta pregunta .
Console API no es una API estándar definida en ninguna especificación, sino que es algo implementado en todos los navegadores, por lo que los proveedores suelen tener la libertad de implementarlo a su manera ya que no hay especificaciones estándar para definir el resultado de ningún método en API. .
A menos que compruebe la implementación real de la API de consola para un navegador en particular, nunca puede estar seguro. Hay un rastreador en GitHub que enumera las diferencias entre la implementación de los principales navegadores.
Si observa la implementación en FF (disponible aquí - buscar registro), tiene un comentario debajo
Una cadena de múltiples líneas de un objeto, diseñado para ser utilizado por humanos
La implementación real verifica el tipo de argumento que se pasa a log()
y, en función de su tipo, genera una representación diferente.
Viniendo a su caso, log()
imprime dos valores diferentes para cadenas creadas usando notación literal
y cadenas creadas usando String
constructor de String
porque son dos types
diferentes. Como se explica aquí , las cadenas creadas usando notación literal se llaman String Primitives
y las cadenas creadas usando el constructor de cadena se denominan String Objects
.
var str1 = ''test'';
var str2 = new String(''hello'');
typeof str1 // prints "string"
typeof str2 // prints "object"
Como los tipos difieren, su representación de cadena difiere en la API de consola. Si revisa el código para la implementación de la consola de FF, la última declaración es
return " " + aThing.toString() + "/n";
Entonces, para responder a su pregunta, la API de consola en FF llama toString()
en el argumento solo si el tipo de argumento no es uno de los tipos {undefined,null,object,set,map}
. No siempre llama a los métodos toString()
o valueOf()
. No revisé la implementación de Chrome, así que no comentaré sobre eso.
No utiliza toString, puedes hacer algo como esto
clog = function(msg){console.log(msg.toString());}
clog(myObj);
console.log(str)
llama a str.valueOf()
, supongo. De JavaScript: la guía definitiva Su trabajo es convertir un objeto a un valor primitivo. El método valueOf()
se invoca automáticamente cuando se utiliza un objeto en un contexto numérico, con operadores aritméticos (que no sean +) y con los operadores relacionales, por ejemplo. La mayoría de los objetos no tienen una representación primitiva razonable y no definen este método.
--- editar ---- Lo siento, copie la línea incorrecta, me refiero a "" + str, ya que hay un tipo de conversión