Pourquoi «true» == true affiche false en JavaScript?


89

MDC décrit l' ==opérateur comme suit :

Si les deux opérandes ne sont pas du même type, JavaScript convertit les opérandes puis applique une comparaison stricte. Si l'un des opérandes est un nombre ou un booléen, les opérandes sont convertis en nombres si possible; sinon si l'un des opérandes est une chaîne, l'autre opérande est converti en chaîne si possible.

Dans cet esprit, j'évaluerais "true" == truecomme suit:

  1. Sont-ils du même type? Non
  2. Est-ce que l'opérande est un nombre ou un booléen? Oui
  3. Pouvons-nous convertir les deux en un nombre? Non ( isNaN(Number("true")) // true)
  4. Est-ce que l'un ou l'autre des opérandes est une chaîne? Oui
  5. Pouvons-nous convertir l'autre opérande en chaîne? Oui ( String(true) === "true" // true)

J'ai fini avec les chaînes "true"et "true", qui devraient être évaluées à true, mais JavaScript montre false.

Qu'est-ce que j'ai manqué?



6
Avec autant de JavaScript, le monde est un endroit effrayant: if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}---> "non oui"
user1068352

1
Je dois dire, je suis surpris, et c'est tellement stupide que cela arrive. Encore une autre raison de toujours toujours utiliser ===
BT

Réponses:


89

Parce que "true"est converti en NaN, while trueest converti en 1. Donc, ils diffèrent.

Comme vous l'avez signalé, les deux sont convertis en nombres, car au moins truepeuvent l'être (voir le commentaire d'Erik Reppen), puis comparés.


Pouvez-vous me dire quand le pas Can we convert both to a number?sera un jour faux alors? Si même NaNest un nombre, comment cette étape peut-elle échouer?
Isaac

5
Ni l'un ni l'autre. Si les deux aboutissaient à NaN, ils passeraient à l'évaluation de chaîne. Si un seul peut être converti, il y a toujours une comparaison numérique.
Erik Reppen

2
Il y a en fait des objets bizarres en Javascript qui se comportent assez bizarrement. Par exemple, les documents XML dans IE <9 génèrent une erreur lorsque vous essayez de les convertir en nombres.
MaxArt

Vous pouvez voir les conversions vous-même en faisant Number(true)etNumber('true')
Erik Reppen

10

L' ==opérateur de comparaison est défini dans ECMA 5 comme:

  1. Si Type (x) est Number et Type (y) est String,
    renvoie le résultat de la comparaison x == ToNumber (y).
  2. Si Type (x) est String et Type (y) est Number,
    renvoie le résultat de la comparaison ToNumber (x) == y.
  3. Si Type (x) est booléen, renvoie le résultat de la comparaison ToNumber (x) == y.
  4. Si Type (y) est booléen, renvoie le résultat de la comparaison x == ToNumber (y).

Ainsi, "true" == true est évalué comme:

  1. "true" == ToNumber (true)   (via la règle 7)
  2. "vrai" == 1
  3. ToNumber ("true") == 1   (via la règle 5)
  4. NaN == 1

===> faux


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.