Il existe une telle question dans un ensemble de questions de test compilé par cssrain :
<LANGUE SCRIPT="JavaScript">
var a = 0 ;
varb = -1 ;
var c = 1 ;
fonction assert (aVar) {
if (aVar==true) alert(true);
sinon alerte (faux);
}
affirmer(a);
affirmer(b);
affirmer(c);
</SCRIPT>
Boîte de code d'exécution
[Ctrl+A Sélectionner tous les conseils : vous pouvez d'abord modifier une partie du code, puis appuyer sur Exécuter]
D'après ma compréhension, toute valeur booléenne différente de 0 devrait être vraie.
Mais le résultat correct de cette question est : faux faux vrai.
La valeur de (-1==true) est fausse.
Regardons l'exemple suivant :
<LANGUE SCRIPT="JavaScript">
var a = 0 ;
varb = -1 ;
var c = 1 ;
fonction assert (aVar) {
if (aVar) alerte (true);
sinon alerte (faux);
}
affirmer(a);
affirmer(b);
affirmer(c);
</SCRIPT>
Boîte de code d'exécution
[Ctrl+A Sélectionner tous les conseils : vous pouvez d'abord modifier une partie du code, puis appuyer sur Exécuter]
Les résultats en cours sont : faux, vrai, vrai.
Ici, nous constatons que les résultats de if(aVar) et if(aVar == true) ne sont pas les mêmes.
L'explication de cssrain dans la réponse est la suivante :
if(aVar) et if (aVar==true) ont des réponses très différentes pour les nombres négatifs.
Est-ce vraiment la raison du nombre négatif ? Prenons l'exemple suivant :
Boîte de code d'exécution
[Ctrl+A Sélectionner tous les conseils : vous pouvez d'abord modifier une partie du code, puis appuyer sur Exécuter]
Pourquoi le nombre positif 2 renvoie-t-il également faux ? Convertissons le nombre en valeur booléenne et jetons un coup d'œil.
Boîte de code d'exécution
[Ctrl+A Sélectionner tous les conseils : vous pouvez d'abord modifier une partie du code, puis appuyer sur Exécuter]
Les valeurs booléennes non nulles ici sont effectivement vraies, ce qui signifie que tous les problèmes se concentrent sur l'opérateur == dans 2==true. Il est fondamentalement certain que == ne doit pas convertir les nombres en valeurs booléennes puis les comparer.
Regardez ce que dit ECMA-262 (page 80) :
6.Si Type(x) est booléen, renvoie le résultat de la comparaison ToNumber(x) == y.
7.Si Type(y) est booléen, renvoie le résultat de la comparaison x == ToNumber(y).
Autrement dit, les valeurs booléennes sont d'abord converties en nombres puis comparées. La valeur numérique de vrai est 1 et faux est 0. Donc ni 2 ni -1 ne peuvent être égaux à vrai.
Examinez de plus près l'exemple suivant :
<LANGUE SCRIPT="JavaScript">
var a = "indéfini" ;
var b = "faux" ;
varc = "";
fonction assert (aVar) {
if (aVar==true) alert(true);
sinon alerte (faux);
}
affirmer(a);
affirmer(b);
affirmer(c);
</SCRIPT>
Boîte de code d'exécution
[Ctrl+A Sélectionner tous les conseils : vous pouvez d'abord modifier une partie du code, puis appuyer sur Exécuter]
Selon l’idée précédente, vrai sera converti en 1, donc les trois déclarations renverront faux. Exécutez-le et constatez que c’est bien le cas.
Ensuite, remplacez if(aVar==true) par if(aVar).
Boîte de code d'exécution
[Ctrl+A Sélectionner tous les conseils : vous pouvez d'abord modifier une partie du code, puis appuyer sur Exécuter]
Les résultats actuels sont vrais, vrais, faux. Parce que les résultats de Boolean("undefined"), Boolean("false") et Boolean("") sont vrai, vrai et faux. Les chaînes non vides sont converties en booléen vrai.
Enfin, il existe un exemple pour expliquer les règles de comparaison lorsque les deux côtés de == sont des chaînes et des nombres.
Boîte de code d'exécution
[Ctrl+A Sélectionner tous les conseils : vous pouvez d'abord modifier une partie du code, puis appuyer sur Exécuter]
Avez-vous trouvé que ce "001"==true est vrai.
Parce que true est d'abord converti en 1. Référez-vous ensuite aux règles de l’ECMA :
4.Si Type(x) est Number et Type(y) est String, renvoie le résultat de la comparaison x == ToNumber(y).
5.Si Type(x) est String et Type(y) est Number, renvoie le résultat de la comparaison ToNumber(x) == y.
La chaîne doit être convertie en nombre et la valeur de Number("001") est également 1, donc le résultat est vrai.