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é?

Isaac
la source
Pertinentes: es5.github.com/#x11.9.1
zzzzBov
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
@ user1068352 vérifier le chaos :) dorey.github.io/JavaScript-Equality-Table
João Pimentel Ferreira

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.

MaxArt
la source
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

nobitavn94
la source
3

Selon l'algorithme de comparaison d'égalité abstraite

http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

si l'un des oprends est un booléen et l'autre non, boolean est un convertisseur en nombre 0 ou 1. donc true == "true"faux.

Zohaib Ijaz
la source
Ai-je déduit juste de la manière suivante? "true" == true devient "true" == 1 puis devient "true" == "1" C'est pourquoi ils renvoient false?
vuquanghoang