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 ==
.
La risposta più spiegata, grazie – rickyduck