Hay dos problemas con los valores de 'falsey' en JavaScript.
Primero está el esquema de conversión oficial, que es el que devuelve Boolean (x). Esto devuelve falso cuando x es falso o 0 o NaN o nulo o indefinido o "" y verdadero de lo contrario. Este es el mismo comportamiento que el
if (condition) {/*true path*/} else {/*false path*/}
es decir, se ejecuta el camino falso si booleana (condición) habría vuelto falso y el verdadero camino está ejecutado de otra manera. Este comportamiento se usa a menudo para verificar si una propiedad está definida. Sin embargo, hacer eso no es seguro a menos que esté seguro de que la propiedad sería un objeto o una matriz si está definida. La forma más segura de probar si una propiedad se define es hacer
if (property != null) { /*property is defined*/}
el que se asegura de que la propiedad no es nulo o no definido. Si sólo quiere asegurarse de que la propiedad no está definido qué
if (property !== undefined) { /*property is not undefined (but may be null)*/ }
(observe el extra en =! ==).
En segundo lugar, hay todos los valores que == falso. Esto es todo lo que se puede forzar a 0 (que es lo que se coacciona a falso). Esto incluye todos los valores que se convierten en falsos excepto NaN (que no puede == falso en virtud de que nunca == nada), nulo e indefinido. Pero también incluye todos los objetos que cuando se convierten en una cadena y luego se convierten en un número son iguales a 0. Por ejemplo, esto incluye todo lo que cuando se convierte a una cadena es la cadena vacía "" o "0" o "-0 "o "0" o "0x00" o "000" o "0E0" o "0,0000" ...., por ejemplo,
({toString: function() {return "-00.0e000";}}) == false
es cierto. Curiosamente, esto incluye la matriz vacía y cualquier agrupación de matrices que contenga un solo elemento que devuelva una cadena vacía o 0, ya que las matrices procesadas como cadenas muestran solo los contenidos sin los corchetes circundantes. Es decir,
[[[[0]]]] == false; // Because [[[[0]]]].toString() === "0"
[] == false;
[[[""]]] == false;
["0"] == false;
[[({toString: function() {return "0";}})]] == false;
El algoritmo completo para calcular == false se describe here.
La razón por la que esto importa es porque puede llevar a errores sutiles y difíciles de encontrar si no entiende la mayoría de estas reglas. Las conclusiones más importantes son, probablemente, cómo funciona el if (condition)
y que el uso de === evita la mayoría de las otras cosas locas.
NaN en lugar de NAn, nulo en lugar de nulo (JavaScript distingue entre mayúsculas y minúsculas) –
Una de las cosas que te encanta de la programación es tener que estar al día con los términos del idioma (inglés).¿Es "falsey" realmente un término de programación legítimo, o simplemente significa "valores falsos"? Si se trata de un término -real, y no solo geek speak, ¿dónde está una url que lo define, ya que no puedo encontrar una definición legítima del término. – Bill
@Bill Creo que "truthy" y "falsy" son neologismos entonces ... http://javascript.crockford.com/style2.html –