Concernant la ligne:
if (arr == false) console.log("It's false!");
Peut-être que cela aidera:
console.log(0 == false) // true
console.log([] == 0) // true
console.log([] == "") // true
Ce qui, je crois, se produit, c'est que le booléen false
est contraint de le 0
comparer à un objet (le côté gauche). L'objet est contraint à une chaîne (la chaîne vide). Ensuite, la chaîne vide est également contrainte en un nombre, à savoir zéro. Et donc la comparaison finale est 0
== 0
, ce qui est true
.
Modifier: voir cette section de la spécification pour plus de détails sur la façon dont cela fonctionne.
Voici ce qui se passe, à partir de la règle n ° 1:
1. Si le type (x) est différent du type (y), passez à l'étape 14.
La prochaine règle qui s'applique est # 19:
19. Si Type (y) est booléen, retournez le résultat de la comparaison x == ToNumber (y).
Le résultat de ToNumber(false)
est 0
, nous avons donc maintenant:
[] == 0
Encore une fois, la règle n ° 1 nous dit de passer à l'étape n ° 14, mais la prochaine étape qui s'applique réellement est la n ° 21:
21. Si Type (x) est Object et Type (y) est String ou Number, retourne le résultat de la comparaison ToPrimitive (x) == y.
Le résultat de ToPrimitive([])
est la chaîne vide, nous avons donc maintenant:
"" == 0
Encore une fois, la règle n ° 1 nous dit de passer à l'étape n ° 14, mais la prochaine étape qui s'applique réellement est la n ° 17:
17. Si Type (x) est String et Type (y) Number, renvoyez le résultat de la comparaison ToNumber (x) == y.
Le résultat de ToNumber("")
is 0
, qui nous laisse avec:
0 == 0
Maintenant, les deux valeurs ont le même type, donc les étapes continuent de # 1 à # 7, qui dit:
7. Si x est la même valeur numérique que y, retournez true.
Donc, nous revenons true
.
En bref:
ToNumber(ToPrimitive([])) == ToNumber(false)