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:
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. :-) –
In realtà, usare == o! = Non è mai un buon stile. Usa sempre === o! == e lancia gli operandi a mano. –
'[] == []; // false' –