2010-11-19 16 views
33

¿Alguien puede explicar por qué las siguientes dos afirmaciones se evalúan como true?Valores booleanos conflictivos de una matriz de JavaScript vacía

[] == false 

y

!![] 

Esta pregunta es puramente por curiosidad de por qué sucede esto y no acerca de cuál es la mejor prueba de si una matriz está vacía.

+1

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. :-) –

+1

En realidad, usar == o! = Nunca es un buen estilo. Siempre use === o! ==, y moldee los operandos a mano. –

+1

'[] == []; // false' –

Respuesta

58

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:

+0

Muy interesante.Gracias por la descripción detallada y compartir esos enlaces. –

+0

Vaya, parece que respondí la misma pregunta de la misma manera. No me di cuenta hasta que alguien marcó esa pregunta un duplicado de esta. http://stackoverflow.com/a/10556035/2653 –

1

[] == false

En este caso, el tipo de la parte izquierda es objeto, el tipo de la derecha lado de la mano es booleano. Cuando se compara el objeto con (== La Comparación de Igualdad Abstracta) booleano, Javascript primero convierte el valor booleano a un número, produciendo 0. Luego convierte el objeto a un "primitivo", produciendo la cadena vacía "". Luego compara la cadena vacía a 0. La cadena vacía se convierte en un número, produciendo 0, que es numéricamente igual a 0 en el lado derecho, por lo que el resultado de la expresión completa es verdadero.

Ref: http://es5.github.com/#x11.9.3 11.9.3 El resumen Igualdad Comparación Algoritmo

!! []

En este caso Javascript convierte el objeto a la booleano verdadero, entonces la invierte, resultando en falso.

+0

: Sea más descriptivo sobre su solución. Consulte: [Cómo responder] (http://stackoverflow.com/questions/how-to-answer) – askmish

Cuestiones relacionadas