practica - Conflicto de valores booleanos de una matriz de JavaScript vacía
operadores logicos javascript (2)
El primero:
[] == false
El operador ==
escribe la conversión a sus operandos, en este caso ambos lados se convierten a Número, los pasos tomados en el Algoritmo de comparación de igualdad abstracta serían:
- objeto == booleano
- objeto == número
- cadena == número
- número == número
En codigo:
[] == 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 primitiva, sus métodos valueOf
y toString
se ejecutan, pero como valueOf
en objetos Array, devuelve el objeto en sí (se hereda de Object.prototype
), se usa el método toString
.
Al final como puede ver, ambos operandos se convierten en Número, y ambos rinden cero, por ejemplo:
Number([]) == 0;
Number(false) == 0;
Y la matriz vacía produce cero cuando se convierte en Número porque su representación de cadena es una cadena vacía:
[].toString(); // ""
Y una cadena vacía convertida en Número arroja cero:
+""; // 0
Ahora, la doble negación ( !![]
) produce verdadero porque todas las instancias de objeto son verdaderas:
![]; // false, [] is truthy
!![]; // true, negation
Los únicos valores que son falsey son:
-
null
-
undefined
-
0
-
NaN
-
""
(una cadena vacía) -
false
Cualquier otra cosa producirá true
cuando se convierte a Boolean.
Ver también:
¿Alguien puede explicar por qué las dos afirmaciones siguientes se evalúan como verdaderas ?
[] == false
y
!![]
Esta pregunta es puramente por curiosidad sobre por qué ocurre esto y no sobre cómo probar mejor si una matriz está vacía.
[] == falso
En este caso, el tipo del lado izquierdo es el objeto, el tipo del lado derecho 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 Algoritmo de comparación de igualdad abstracta
!! []
En este caso, Javascript convierte el objeto a boolean true, luego lo invierte, lo que da como resultado falso.