JavaScript costringe gli oggetti ai valori booleani quando si utilizza il non-strict operatore di uguaglianza.
0 == []
perché JavaScript costringe entrambi i valori (che sono entrambi non dello stesso tipo) a valori booleani per confrontarli. In altre parole, false == false
.
Se si utilizza ===
, d'altra parte, si sta verificando l'uguaglianza degli oggetti.
Un caso interessante sarebbe questo:
[] === []; // => false
Questo perché ===
sta controllando la posizione di memoria degli oggetti. Due matrici non condividono la stessa posizione di memoria. Tuttavia:
var arr = [];
arr === arr; // ==> true
Ma, qui è un'altra caratteristica molto interessante:
1 === 1; // ==> true
Nel caso di array e gli oggetti semplici, JavaScript fa riferimento alla posizione di memoria. Ma con valori come stringhe e numeri, JavaScript verifica se i valori sono assolutamente uguali all'operatore ===
.
Quindi la grande differenza si riduce alle differenze in ==
e ===
e come JavaScript costringe i tipi.
Suggerimento: Questo è il motivo per cui di solito è consigliabile utilizzare il ===
operatore rigoroso se è necessario per evitare che la coercizione (tuttavia, a volte la coercizione può lavorare a vostro vantaggio, per esempio quando si lavora con problemi di cross-browser, dove un valore potrebbe essere undefined
in un browser ma null
nell'altro browser, quindi è possibile pronunciare qualcosa come !!thatStrangeValue
e entrambi undefined
e null
saranno forzati alla stessa cosa).
Modifica
OP portato un buon punto:
[] == false;
![] == false;
Le dichiarazioni di cui sopra sono entrambi corretti, il che è strano. Direi che la prima affermazione è il controllo del vuoto, mentre il secondo sta verificando l'esistenza. Qualcuno conosce la risposta a questo ultimo punto?
'[]' come stringa è "" e false come numero è 0 – dandavis
Dove stai ricevendo '[] == true', perché dovrebbe essere' false' –
@Matt Burland, digitare nella console "console.log (! [])", restituisce "false" –