La primera:
[] == false
El ==
operador hace Tipo de conversión para sus operandos, en este caso los dos lados se convierten en número, las medidas adoptadas en el Abstract Equality Comparison Algorithm sería:
- objeto == boolean
- objeto == número
- cadena == número
- número == número
En código:
[] == false; // convert false to Number
[] == 0; // convert [] to Primitive (toString/valueOf)
"" == 0; // convert "" to Number
0 == 0; // end
La segunda comparación, []
se convierte en primitivo, se ejecutan sus métodos valueOf
y toString
, pero desde valueOf
en objetos Array, devuelve el objeto en sí (se hereda de Object.prototype
), se utiliza el método toString
.
Al final como se ve, ambos operadores se convierten en número, y tanto el rendimiento cero, por ejemplo:
Number([]) == 0;
Number(false) == 0;
Y matriz vacía produce cero cuando se convierte en número debido a que su representación de cadena es una cadena vacía :
[].toString(); // ""
Y una cadena vacía se convierte a Number, rendimientos cero:
+""; // 0
Ahora, la doble negación (!![]
) produce cierto porque todas las instancias de objetos son Truthy:
![]; // false, [] is truthy
!![]; // true, negation
Los únicos valores que se Falsey son:
null
undefined
0
NaN
""
(una cadena vacía)
false
Cualquier otra cosa producirá true
cuando se convierte a Boole.
Consulte también:
Si realmente quiere ensuciarse las manos, consulte la sección 11.9.1 (* "The Equals Operator ==" *) y la Sección 8.7.1 (* "GetValue (V)" *) en [la spec] (http://www.ecma-international.org/publications/standards/Ecma-262.htm). Y este sería otro gran ejemplo de por qué '== true' y' == false' generalmente no son estilos ideales. :-) –
En realidad, usar == o! = Nunca es un buen estilo. Siempre use === o! ==, y moldee los operandos a mano. –
'[] == []; // false' –