2015-05-21 22 views
5

Almeno in JavaScript seguente requisito:Perché 0 == [], ma 0 == false e! [] == false?

0 == []  // true 
0 == false // true 
![] == false // true 

Perché? So che == significa uguale ma non è uguale a tipo, ma come è false == true, per così dire, in tal caso?

+0

'[]' come stringa è "" e false come numero è 0 – dandavis

+7

Dove stai ricevendo '[] == true', perché dovrebbe essere' false' –

+0

@Matt Burland, digitare nella console "console.log (! [])", restituisce "false" –

risposta

1

In JavaScript esistono due tipi di uguaglianza. Esiste l'uguaglianza di valore rappresentata da == e l'uguaglianza di valore e tipo, rappresentata da ===. Quest'ultimo è l'operatore rigoroso di uguaglianza.

Nel tuo caso, controlliamo solo l'uguaglianza per valore, non per tipo.

[] rappresenta un oggetto vuoto, ovvero [] e 0 hanno lo stesso valore.

In JavaScript, il valore di qualsiasi numero maggiore o uguale a 1 è true e il valore di 0 è false

Spero che questo aiuti

+1

capisco tutto fino al punto "[] è anche falso e non falso restituisce sempre vero"? –

+0

Questo fa parte della logica booleana. 'non false' uguale a' true' –

+0

Non false è '! false', che è l'opposto di' false'. L'opposto di 'false' è' true'. Pertanto, '! False === true'. –

3

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?

+1

Post eccellente e ben pensato. È importante ricordare che esiste una differenza tra uguaglianza e uguaglianza rigorosa. Questo può essere difficile per i nuovi arrivati ​​a volte –

+0

Grazie per la risposta e per le intuizioni, ma manca un punto, perché è! [] == falso, quando 0 == []? –

+0

@FrederikWitte, grazie. Sì, fai un buon punto. Ho modificato la mia risposta per dare un esempio specifico di dove si trova la riaggancio. Non sono esattamente sicuro di quale sia la risposta a quest'ultimo punto, però. –

Problemi correlati