javascript - injection - meta title html
¿Por qué es verdadero[]+{}==={}+[]? (2)
El segundo punto en esta magnífica respuesta explica lo que sucede cuando "sumas" una matriz y un objeto.
var result = [] + {};
console.log(result);
console.log(typeof result);
Lo que obtienes es la cadena [object Object]
porque cada uno de los argumentos se convierte en una cadena. Para una matriz, que resulta en llamar a .join()
en ella, lo que a su vez, produce una cadena vacía. Para los objetos, produce la cadena "[object Object]"
; al agregarlos juntos se deja la segunda cadena.
Lo mismo sucede en ambos lados de la comparación: en el lado derecho, el orden es diferente, pero eso no importa. El resultado no será el mismo que el punto 3 en la respuesta, ya que la diferencia es que {} + []
está al principio de la línea, por lo que {}
se interpreta como un bloque vacío. En esta situación, (correctamente) se interpretará como una notación de objeto simple). Se ejecutará la misma lógica de conversión y producirá la misma cadena que antes: "[object Object]"
Entonces, al final, estás comparando "[object Object]" === "[object Object]"
que devuelve true
.
Tenga en cuenta que {} + [] === [] + {}
no producirá lo mismo - nuevamente, debido al punto 3 de la respuesta enlazada - la primera {}
se interpretará como un bloque vacío, por lo que el lado izquierdo se convierte en +[]
que convierte la matriz en un número, por lo tanto, el resultado de la comparación será false
. Sin embargo, si prueba esta expresión en las herramientas de desarrollo de Chrome, ciertamente se volverá true
. Esto se debe a que Chrome envolverá automáticamente su expresión entre paréntesis, lo que obliga a que {}
inicial se interprete como un objeto. La comprobación de {} + [] === [] + {}
en Firefox o Node REPL u otros debe producir el "correcto" false
.
Esta pregunta ya tiene una respuesta aquí:
Si abres tu consola JS y escribes [] + {} === {} + []
te dice que es verdad.
No entiendo por qué esto es. Intenté mirar cómo se analiza.
Para [] + {}
el +
aquí es el operador de suma, ya que los operandos son literales. LHS no produce un número a través de .valueOf()
por lo que realiza la concatenación de cadenas utilizando .toString()
en ambos operandos, lo que nos da ""
+ "[object Object]"
Para {} + []
el {}
es un bloque de código vacío y se ''ignora'', el operador +
aquí se analiza como el operador más unario, convierte su operando en un Número. Las matrices vacías convertidas a un número se convierten en 0
Entonces, esto parece ser "[object Object]" === 0
que seguramente debería ser falso.
El operador de identidad comprueba si los dos operandos son iguales sin conversión de tipo. No puedo ver cómo esto podría ser verdad. ¿Qué parte de la historia me estoy perdiendo?
Editar:
Veo si escribes ({} + [])
lo analiza como un objeto vacío haciendo que el RHS sea igual a "[objeto Object]". Busqué esto y ( )
es el operador de agrupación. Entonces, ¿quizás esto tiene algo que ver con esto?
Esto no es un duplicado de ¿Cuál es la explicación de estos comportamientos de JavaScript extraños mencionados en la charla ''Wat'' para CodeMash 2012? . Los puntos de respuesta 1 === 2 NO deben ser verdaderos.
var array = [''test1'', ''test2'', ''test3'']
var emptyObject = {}
console.log(typeof(array+emptyObject));
console.log(array+emptyObject);
console.log(emptyObject+array);
console.log(array+emptyObject === emptyObject+array);
var array = [];
var emptyObject = {}
console.log(typeof(array+emptyObject));
console.log(array+emptyObject);
console.log(emptyObject+array);
console.log(array+emptyObject === emptyObject+array);
var array = [''firstArrayElement'', ''secondArrayElement''];
var object = {a:1, b:2}
console.log(typeof(array+object));
console.log(array+object);
console.log(object+array);
console.log(array+object === object+array);
console.log([''a'',''b'']+[''c'',''d'']);
Cuando convierte una matriz vacía en una cadena, recibirá una cadena vacía.
Cuando conviertes un objeto ({}) en una cadena, siempre recibirás una cadena: "[objeto Objeto]".
El operador Plus no está definido para matrices y objetos, por lo que JS siempre convierte la matriz y el objeto en una cadena cuando se usa el operador plus.