237 votes

Tout ce qu’elle découvre est à la fois vrai et faux.

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 ?

307voto

wildcard Points 2443

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.

68voto

lwburk Points 29313

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)

0voto

user2846569 Points 124

Juste une comparaison des performances entre les deux approches pour tester le tableau vide :

http://jsperf.com/If-on-Array

Prograide.com

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.

Powered by:

X