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:
- Sont-ils du même type? Non
- Est-ce que l'opérande est un nombre ou un booléen? Oui
- Pouvons-nous convertir les deux en un nombre? Non (
isNaN(Number("true")) // true
) - Est-ce que l'un ou l'autre des opérandes est une chaîne? Oui
- 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é?
javascript
string
equals
Isaac
la source
la source
if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}
---> "non oui"Réponses:
Parce que
"true"
est converti enNaN
, whiletrue
est converti en1
. Donc, ils diffèrent.Comme vous l'avez signalé, les deux sont convertis en nombres, car au moins
true
peuvent l'être (voir le commentaire d'Erik Reppen), puis comparés.la source
Can we convert both to a number?
sera un jour faux alors? Si mêmeNaN
est un nombre, comment cette étape peut-elle échouer?Number(true)
etNumber('true')
L'
==
opérateur de comparaison est défini dans ECMA 5 comme:renvoie le résultat de la comparaison x == ToNumber (y).
renvoie le résultat de la comparaison ToNumber (x) == y.
Ainsi, "true" == true est évalué comme:
===> faux
la source
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.la source