web-dev-qa-db-fra.com

pourquoi les nombres négatifs Javascript ne sont-ils pas toujours vrais ou faux?

-1 == true;        //false
-1 == false        //false
-1 ? true : false; //true

Quelqu'un peut-il expliquer la sortie ci-dessus? Je sais que je pourrais contourner cela en comparant à 0 mais je suis intéressé. Je m'attendrais à ce qu'au moins une des déclarations d'égalité bâclée soit vraie car elles font une conversion de type implicite, et je ne m'attendais certainement pas à ce que le ternaire fournisse un résultat totalement différent.

50
Ollie Edwards

Dans les deux premiers cas, le booléen est converti en un nombre - 1 pour vrai et 0 pour false . Dans le dernier cas, c'est un nombre qui est converti en booléen et n'importe quel nombre à l'exception de 0 et NaN sera converti en vrai . Donc, vos cas de test ressemblent vraiment à ceci:

-1 == 1; // false
-1 == 0; // false
true ? true : false; // true

La même chose serait vraie pour tout nombre qui n'est pas 0 ou 1.

Pour plus de détails, lisez la documentation ECMAScript. Extrait de la section e édition [PDF] 11.9.3 L'algorithme de comparaison d'égalité abstraite :

19 . Si Type (y) est booléen, retournez le résultat de la comparaison x == ToNumber (y).

Cela vaut la peine de lire l'algorithme complet, car d'autres types peuvent causer de pires accrochages.

60
Andy E

Dans la plupart des systèmes, les valeurs non nulles sont considérées comme une valeur vraie, mais cela ne signifie pas nécessairement qu'elles sont la valeur vraie même que true. Donc, -1 == true ne tient pas nécessairement, mais -1 peut toujours être considéré comme une vraie valeur car il est différent de zéro.

Vraiment, cependant, vous ne devriez pas comparer des entiers à des booléens si vous pouvez l'éviter.

1
Amber