Tableaux vides sont vraies mais ils sont aussi égales à false.
Sortie :
Je suppose que cela est dû à la conversion implicite, exploitée par l’opérateur d’égalité.
Quelqu'un peut-il expliquer ce qui se passe dans les coulisses ?
Tableaux vides sont vraies mais ils sont aussi égales à false.
Sortie :
Je suppose que cela est dû à la conversion implicite, exploitée par l’opérateur d’égalité.
Quelqu'un peut-il expliquer ce qui se passe dans les coulisses ?
vous faites des tests de choses différentes ici. if (arr)
appelée sur l'objet (Tableau est une instance de l'Objet en JS) vérifie si l'objet est présent, et renvoie true/false. lorsque vous appelez if (arr == false)
vous comparez les valeurs de cet objet et le primitif false
de la valeur. en interne, arr.toString()
est appelée, ce qui renvoie une chaîne vide ""
(parce qu' toString
appelé Tableau renvoie Array.join()
), et la chaîne vide est l'un des falsy valeurs en JavaScript.
Quant à 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
Je crois que ce qui se passe est que le booléen false
est contrainte d' 0
pour la comparaison avec un objet (la gauche). L'objet est contraint à une chaîne (la chaîne vide). Ensuite, la chaîne vide est contrainte d'un nombre, ainsi, à savoir zéro. Et donc la dernière comparaison est - 0
== 0
, ce qui est true
.
Edit: Voir cette section de la spécification pour plus de détails sur exactement comment cela fonctionne.
Voici ce qui se passe, en commençant à la règle n ° 1:
1. Si le Type(x) est différent de Type(y), passez à l'étape 14.
La prochaine règle qui s'applique est #19:
19. Si le Type(y) est un Booléen, retourner le résultat de la comparaison x == ToNumber(y).
Le résultat de l' ToNumber(false)
est 0
, de sorte que nous avons maintenant:
[] == 0
Encore une fois, la règle n ° 1 nous dit de sauter à l'étape n ° 14, mais l'étape suivante qui s'applique en fait est #21:
21. Si le Type(x) est l'Objet et le Type(y) est une Chaîne ou un Nombre, le retour de la résultat de la comparaison ToPrimitive(x)== y.
Le résultat de l' ToPrimitive([])
est la chaîne vide, de sorte que nous avons maintenant:
"" == 0
Encore une fois, la règle n ° 1 nous dit de sauter à l'étape n ° 14, mais l'étape suivante qui s'applique en fait est #17:
17. Si le Type(x) est une Chaîne et le Type(y) est le Nombre, de retourner le résultat de la comparaison ToNumber(x)== y.
Le résultat de l' ToNumber("")
est 0
, ce qui nous laisse avec:
0 == 0
Maintenant, les deux valeurs ont le même type, de sorte que les étapes de continuer à partir du n ° 1 jusqu'au n ° 7, qui dit:
7. Si x est le même numéro de valeur y, retourner la valeur true.
Donc, nous revenons true
.
En bref:
ToNumber(ToPrimitive([])) == ToNumber(false)
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.