2012-12-13 14 views

risposta

9

Ciò è dovuto alle regole di confusione, come javascript digita la coercizione. Puoi leggere questo argomento nello §11.9.3 della specifica EcmaScript 5.

Due oggetti (che Arrays troppo) non sono mai uguali, quindi tutti i confronti del primo blocco resa falso (§11.9.3.1.c.vi)

Il secondo blocco è più difficile:

La prima cosa da sapere è che == utilizza la coercizione di tipo per confrontare gli operandi.

Quando un confronto ha un booleano coinvolto, questo viene prima convertito in un numero.

[]==false 
[]==0 

dopo che gli oggetti sono costretti ai valori primitivi chiamando Object.prototype.toString

"" == 0 

Poi la stringa è coereced ad un numero ("" diventa 0)

0 == 0 

cedevole vero. Applicando le stesse regole, puoi vedere il motivo per cui anche i tuoi altri esempi diventano veri.

Nota che === non causa mai la coercizione di tipo, ma verifica innanzitutto i tipi corretti e restituisce false se non sono uguali! Solo se i tipi sono uguali, confronta i valori effettivi. Quindi questo metodo di confronto è molto più affidabile di ==.

+0

La risposta più spiegata, grazie – rickyduck

4

Tutto l'esempio di provocare false può essere facilmente spiegato con il fatto che nel caso in cui si sta confrontando gli oggetti (e gli array sono oggetti speciali), JavaScript sarà confronta riferimenti oggetto. Mentre crei nuovi oggetti con tutti questi confronti, tutti punteranno a oggetti diversi, quindi il risultato sarà false.

Come per [0]=='0': non appena un operando è una stringa, anche l'altro viene convertito in stringa. La conversione stringa di [0] è '0', quindi il risultato è true.

Lo stesso vale per un operando costituito da un numero o da un valore booleano, che spiega i risultati degli ultimi due confronti.

Per ulteriori informazioni dare un'occhiata allo respective MDN page.

Citando la parte importante:

Equal (==)

Se i due operandi non sono dello stesso tipo, JavaScript converte gli operandi quindi applica confronto rigoroso. Se uno degli operandi è un numero o un booleano, gli operandi vengono convertiti in numeri, se possibile; altrimenti se uno degli operandi è una stringa, l'altro operando viene convertito in una stringa, se possibile. Se entrambi gli operandi sono oggetti, allora JavaScript confronta i riferimenti interni che sono uguali quando gli operandi si riferiscono allo stesso oggetto in memoria.

3

Quando si utilizza l'inizializzazione di matrice/oggetto litterale, anche se è vuota, si crea un nuovo oggetto e viene restituito il riferimento. Quindi, quando li paragoni, confronti il ​​valore del riferimento degli oggetti che hai creato.

Gli altri esempi restituiscono true perché si stanno confrontando diversi tipi di variabili, quindi gli oggetti/array sono transtyped per essere comparabili con loro.

Problemi correlati