2012-06-21 12 views
12

Stavo guardando la prima tabella su http://zero.milosz.ca/ e volevo capire perché, ad esempio, 0 == [] e 0 != {}. Suppongo che sia perché Number([]) == 0 e Number({}) == NaN. Tuttavia, quella parte sembra arbitraria. Perché una lista vuota è 0 e l'oggetto vuoto è NaN?Perché Number ([]) === 0 e Number ({}) === NaN in Javascript?

+3

Gli array sono strani come quello. Mi piace '[[[[[[[123]]]]]]]] == 123'. –

+0

@Kolink ... ma cosa fa funzionare? (Quale regola di '==', non trovata in '===', viene applicata?) –

+4

@Kolink: chiami * che * strano? [ '(! [] + []) [+ []] + (! [] + []) [+! + []] + ([! []] + [] [[]]) [+! + [] + [+ []]] + (! [] + []) [! + [] +! + []] === 'fail''] (http://wtfjs.com/2010/07/ 12/fail) – ThiefMaster

risposta

16

L'utilizzo di Number(some_object) utilizzerà la rappresentazione di stringa dell'oggetto specificato. Per i vostri esempi le rappresentazioni di stringa sono:

js> ({}).toString(); 
[object Object] 
js> [].toString(); 

js> 

La stringa '[object Object]' non può essere convertito in un numero, ma la stringa vuota '' può.

+1

Ma perché la stringa vuota '''' è stata convertita in 0? – tskuzzy

+2

È piuttosto comune che i valori di falsy vengano convertiti in 0 se utilizzati in un contesto numerico. Gli oggetti vuoti non sono * falsi a proposito. – ThiefMaster

+6

@tskuzzy: Perché è definito in questo modo: * "MV di StringNumericLiteral ::: [vuoto] è 0." *. Vedi http://es5.github.com/#x9.3.1 –

9

Elaborare un po 'la risposta di ThiefMaster, ho preso uno sguardo in ECMAScript di specifications:

Quando si converte una stringa in un numero, una grammatica viene utilizzato per la conversione. In particolare, il valore matematico di StringNumericLiteral ::: [empty] è definito come 0. Infatti, è 0 per qualsiasi spazio bianco.

+3

Per coloro che sono troppo pigri per cercare questo nel PDF, http://es5.github.com/#x9.3.1 è la sezione pertinente del spec. – ThiefMaster

+0

Grazie, ho aggiornato il collegamento con la versione HTML ufficiale. – tskuzzy

2

Quando un valore è un oggetto ([], {}) e l'altro è un numero o una stringa, operator == converte l'oggetto in un valore primitivo (un numero in questo caso) utilizzando i metodi di conversione incorporati che tutti gli oggetti in Javascript ereditano: toString() e valueOf().

Per gli oggetti generici come {}, valueOf viene utilizzato, e per impostazione predefinita restituisce l'oggetto in sé, che è! = 0.

Per gli array built-in, toString viene utilizzato. Questo metodo applicato a un array restituisce una stringa contenente tutti gli elementi uniti da virgole. Per l'array vuoto, restituisce una stringa vuota, ''.

Quindi l'interprete applica valueOf a tale stringa; il valore di ritorno di questo metodo per una stringa vuota è 0, quindi [] == 0.

Problemi correlati