MDC beschreibt den ==
Bediener wie folgt :
Wenn die beiden Operanden nicht vom gleichen Typ sind, konvertiert JavaScript die Operanden und wendet dann einen strengen Vergleich an. Wenn einer der Operanden eine Zahl oder ein Boolescher Wert ist, werden die Operanden nach Möglichkeit in Zahlen konvertiert. Andernfalls, wenn einer der Operanden eine Zeichenfolge ist, wird der andere Operand nach Möglichkeit in eine Zeichenfolge konvertiert.
In diesem Sinne würde ich "true" == true
Folgendes bewerten :
- Sind sie vom gleichen Typ? Nein
- Ist entweder der Operand eine Zahl oder ein Boolescher Wert? Ja
- Können wir beide in eine Zahl umwandeln? Nein (
isNaN(Number("true")) // true
) - Ist einer der Operanden eine Zeichenfolge? Ja
- Können wir den anderen Operanden in einen String konvertieren? Ja (
String(true) === "true" // true
)
Ich habe mit den Saiten "true"
und "true"
, die zu bewerten solltentrue
, aber JavaScript zeigt falsch.
Was habe ich vermisst?
javascript
string
equals
Isaac
quelle
quelle
if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}
---> "nein ja"Antworten:
Weil
"true"
konvertiert wird inNaN
, währendtrue
konvertiert wird in1
. Sie unterscheiden sich also.Wie Sie berichtet haben, werden beide in Zahlen umgewandelt, weil dies zumindest
true
möglich ist (siehe Erik Reppens Kommentar), und dann verglichen.quelle
Can we convert both to a number?
dann jemals falsch sein wird? Wenn geradeNaN
eine Zahl ist, wie kann dieser Schritt jemals fehlschlagen?Number(true)
undNumber('true')
Der
==
Vergleichsoperator ist in ECMA 5 definiert als:geben Sie das Ergebnis des Vergleichs x == ToNumber (y) zurück.
geben Sie das Ergebnis des Vergleichs ToNumber zurück (x) == y zurück.
"True" == true wird also wie folgt bewertet:
===> false
quelle
Gemäß dem abstrakten Gleichheitsvergleichsalgorithmus
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
Wenn einer der oprends ein Boolescher Wert ist und der andere nicht, wird der Boolesche Wert in die Zahl 0 oder 1 konvertiert. Dies ist also
true == "true"
falsch.quelle