Estaba viendo la primera tabla en http://zero.milosz.ca/, y quería entender por qué, por ejemplo, 0 == []
y 0 != {}
. Supongo que es porque Number([]) == 0
y Number({}) == NaN
. Sin embargo, esa parte parece arbitraria. ¿Por qué es una lista vacía 0
y el objeto vacío es NaN
?¿Por qué el número ([]) === 0 y el número ({}) === NaN en Javascript?
Respuesta
Usando Number(some_object)
usará la representación de cadena del objeto dado. Para sus ejemplos las representaciones de cadena son:
js> ({}).toString();
[object Object]
js> [].toString();
js>
La cadena '[object Object]'
no se puede convertir en un número pero la cadena vacía ''
lata.
¿Pero por qué la cadena vacía '''' se convierte a 0? – tskuzzy
Es bastante común que los valores de falsy se conviertan a 0 cuando se usan en un contexto numérico. Por cierto, los objetos vacíos son * no * falsos. – ThiefMaster
@tskuzzy: Porque está definido de esta manera: * "El MV de StringNumericLiteral ::: [vacío] es 0." *. Ver http://es5.github.com/#x9.3.1 –
Para elaborar un poco sobre la respuesta de ThiefMaster, he tomado una mirada en ECMAScript de specifications:
Al convertir una cadena en un número, una gramática se utiliza para la conversión. En particular, el valor matemático de StringNumericLiteral ::: [empty]
se define como 0. De hecho, es 0 para cualquier espacio en blanco.
Para aquellos que son demasiado perezosos para buscar esto en el PDF, http://es5.github.com/#x9.3.1 es la sección relevante de la especulación. – ThiefMaster
Gracias, actualicé el enlace con la versión oficial de HTML. – tskuzzy
Cuando un valor es un objeto ([], {}) y el otro es un número o cadena, operator == convierte el objeto a un valor primitivo (un número en este caso) utilizando los métodos de conversión incorporados que todos los objetos en Javascript heredan: toString() y valueOf().
Para objetos genéricos como {}, valueOf se utiliza, y por defecto devuelve el objeto en sí mismo, que es! = 0.
Para las matrices incorporadas, toString se utiliza. Este método aplicado a una matriz devuelve una cadena que contiene todos los elementos unidos por comas. Para la matriz vacía, devuelve una cadena vacía, ''.
Luego el intérprete aplica valueOf a esa cadena; el valor de retorno de este método para una cadena vacía es 0, entonces [] == 0.
- 1. ¿Por qué JavaScript dice que un número no es un número?
- 2. ver número NaN
- 3. ¿Cómo x | 0 planta el número en JavaScript?
- 4. ¿Por qué 0 == "" verdadero en JavaScript
- 5. matriz de JavaScript al número
- 6. ¿El número en JavaScript es inmutable?
- 7. Ruby ordenar por booleano y el número
- 8. Comprobando si un número complejo tiene NaN
- 9. Truncar/redondear el número entero en JavaScript?
- 10. JavaScript: ¿qué es NaN, Object o primitive?
- 11. ¿Por qué Math.round() devuelve 0 para argumentos NaN?
- 12. por qué el emulador da el número IMEI 000000000000000
- 13. ¿por qué jquery no puede animar el número con precisión?
- 14. ¿por qué funciona esto? (encontrar el número impar en C++)
- 15. ¿Cómo declaro NaN (no un número) en Ruby?
- 16. ¿Por qué el resultado 2 + 1 y 0 es 0?
- 17. CALayerInvalidGeometry ', razón:' CALayer bounds contiene NaN: [0 0; nan nan] crash in view
- 18. Por qué: ayudar a ignorar: establecer el número en .vimrc?
- 19. Obteniendo el número aleatorio divisible por 16
- 20. Número aleatorio: 0 o 1
- 21. número entero en javascript?
- 22. ¿Por qué Random.Next() siempre devuelven el mismo número
- 23. ¿Por qué es (1 <NaN) falso en JavaScript?
- 24. Javascript/jQuery - Obtener el número de secuencia
- 25. ¿Existe alguna forma confiable en JavaScript para obtener el número de decimales de un número arbitrario?
- 26. ¿Por qué {} + [] devuelve 0 en Javascript?
- 27. ¿Cómo obtengo el número de campos en el objeto JavaScript?
- 28. Generar y repetir el número en C#
- 29. ¿Por qué es "0 === -0" verdadero en JavaScript?
- 30. Fecha y hora en el número entero
Las matrices son raras así. Me gusta '[[[[[[[123]]]]]]]] == 123'. –
@Kolink ... pero ¿qué hace que esto funcione? (¿Qué regla de '==', no encontrada en '===', se está aplicando?) –
@Kolink: ¿Llamas * ese * raro? ['(! [] + []) [+ []] + (! [] + []) [+! + []] + ([! []] + [] [[]]) [+! + [] + [+] []] + (! [] + []) [! + [] +! + []] === 'fail''] (http://wtfjs.com/2010/07/ 12/fail) – ThiefMaster