2012-06-21 15 views
12

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?

+3

Las matrices son raras así. Me gusta '[[[[[[[123]]]]]]]] == 123'. –

+0

@Kolink ... pero ¿qué hace que esto funcione? (¿Qué regla de '==', no encontrada en '===', se está aplicando?) –

+4

@Kolink: ¿Llamas * ese * raro? ['(! [] + []) [+ []] + (! [] + []) [+! + []] + ([! []] + [] [[]]) [+! + [] + [+] []] + (! [] + []) [! + [] +! + []] === 'fail''] (http://wtfjs.com/2010/07/ 12/fail) – ThiefMaster

Respuesta

16

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.

+1

¿Pero por qué la cadena vacía '''' se convierte a 0? – tskuzzy

+2

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

+6

@tskuzzy: Porque está definido de esta manera: * "El MV de StringNumericLiteral ::: [vacío] es 0." *. Ver http://es5.github.com/#x9.3.1 –

9

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.

+3

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

+0

Gracias, actualicé el enlace con la versión oficial de HTML. – tskuzzy

2

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.

Cuestiones relacionadas