web-dev-qa-db-fra.com

Pourquoi "true" == true affiche false en JavaScript?

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" == true Comme suit:

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

Je me suis retrouvé avec les chaînes "true" Et "true", Qui devraient être évaluées à true, mais JavaScript affiche false.

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

81
Isaac

Car "true" est converti en NaN, tandis que true est converti en 1. Ils diffèrent donc.

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

81
MaxArt

== opérateur de comparaison défini dans Ecma 5 comme

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

Donc, "true" == true est interprété par le moteur js comme

  1. "true" == toNumber (true)
  2. "vrai" == 1
  3. toNumber ("true") == 1
  4. NaN == 1

===> faux

5
nobitavn94

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

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

si l'une des tendances est un booléen et que l'autre ne l'est pas, le booléen est le convertisseur en nombre 0 ou 1. so true == "true" c'est faux.

3
Zohaib Ijaz