-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.
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.
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.