2010-11-19 16 views
33

Qualcuno può spiegare perché entrambe le seguenti affermazioni valgono entrambe come true?Conflitto di valori booleani di un array JavaScript vuoto

[] == false 

e

!![] 

Questa domanda è puramente curiosità del perché questo accade e non su come meglio test se un array è vuoto.

+1

Se vuoi davvero sporcarti le mani, dai un'occhiata alla sezione 11.9.1 (* "L'operatore uguale ==" *) e Sezione 8.7.1 (* "GetValue (V)" *) in [il spec] (http://www.ecma-international.org/publications/standards/Ecma-262.htm). E questo sarebbe un altro grande esempio del perché '== true' e' == false' non sono in genere uno stile ideale. :-) –

+1

In realtà, usare == o! = Non è mai un buon stile. Usa sempre === o! == e lancia gli operandi a mano. –

+1

'[] == []; // false' –

risposta

58

Il primo:

[] == false 

Il == operatore fa digitare conversione ai suoi operandi, in questo caso entrambi i lati vengono convertiti in numero, sarebbero le misure prese sulla Abstract Equality Comparison Algorithm:

  • oggetto == booleano
  • oggetto == numero
  • stringa == numero
  • numero == numero

In codice:

[] == false; // convert false to Number 
[] == 0;  // convert [] to Primitive (toString/valueOf) 
"" == 0;  // convert "" to Number 
0 == 0;  // end 

Il secondo comparatore, [] viene convertito primitivo, vengono eseguiti i valueOf e toString metodi, ma poiché valueOf su oggetti Array, restituisce l'oggetto stesso (è ereditato da Object.prototype), quindi viene utilizzato il metodo toString.

Alla fine, come si vede, entrambi gli operandi vengono convertiti in numero, ed entrambi tassi zero, per esempio:

Number([]) == 0; 
Number(false) == 0; 

E array vuoto produce zero quando convertito in numero perché la sua rappresentazione stringa è una stringa vuota :

[].toString(); // "" 

E una stringa vuota convertito in numero, rese a zero:

+""; // 0 

Ora, la doppia negazione (!![]) produce vero perché tutte le istanze di oggetti sono truthy:

![]; // false, [] is truthy 
!![]; // true, negation 

Gli unici valori che sono Falsey sono:

  • null
  • undefined
  • 0
  • NaN
  • "" (una stringa vuota)
  • false

Qualsiasi altra produrrà true quando convertito in booleana.

Vedi anche:

+0

Molto interessante.Grazie per la descrizione dettagliata e la condivisione di questi collegamenti. –

+0

Whoops, sembra che abbia risposto alla stessa domanda allo stesso modo. Non ho notato fino a quando qualcuno ha segnato quella domanda un duplicato di questo. http://stackoverflow.com/a/10556035/2653 –

1

[] == false

In questo caso, il tipo di sinistra è oggetto, il tipo di destra il lato della mano è booleano. Quando l'oggetto viene confrontato con il valore booleano (== The Abstract Equality Comparison), Javascript converte dapprima il valore booleano in un numero, restituendo 0. Quindi converte l'oggetto in "primitivo", restituendo la stringa vuota "". Quindi confronta la stringa vuota con 0. La stringa vuota viene convertita in un numero, ottenendo 0, che è numericamente uguale allo 0 sul lato destro, quindi il risultato dell'intera espressione è true.

Rif: http://es5.github.com/#x11.9.3 11.9.3 L'astratta uguaglianza Confronto Algoritmo

!! []

In questo caso Javascript converte l'oggetto al booleano vero, allora si inverte, con conseguente falsa.

+0

: Si prega di essere più descrittivo sulla soluzione. Riferire: [Come rispondere] (http://stackoverflow.com/questions/how-to-answer) – askmish

Problemi correlati