Warum zeigt "true" == true in JavaScript false an?

87

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" == trueFolgendes bewerten :

  1. Sind sie vom gleichen Typ? Nein
  2. Ist entweder der Operand eine Zahl oder ein Boolescher Wert? Ja
  3. Können wir beide in eine Zahl umwandeln? Nein ( isNaN(Number("true")) // true)
  4. Ist einer der Operanden eine Zeichenfolge? Ja
  5. 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?

Isaac
quelle
Relevant: es5.github.com/#x11.9.1
zzzzBov
6
Mit so viel JavaScript ist die Welt ein beängstigender Ort: if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}---> "nein ja"
user1068352
1
Ich muss sagen, ich bin überrascht, und das ist sooo dumm, dass das passiert. Noch ein Grund, immer immer immer zu verwenden ===
BT
@ user1068352 überprüfen Sie das Chaos :) dorey.github.io/JavaScript-Equality-Table
João Pimentel Ferreira

Antworten:

87

Weil "true"konvertiert wird in NaN, während truekonvertiert wird in1 . Sie unterscheiden sich also.

Wie Sie berichtet haben, werden beide in Zahlen umgewandelt, weil dies zumindest truemöglich ist (siehe Erik Reppens Kommentar), und dann verglichen.

MaxArt
quelle
Können Sie mir sagen, wann der Schritt Can we convert both to a number?dann jemals falsch sein wird? Wenn gerade NaNeine Zahl ist, wie kann dieser Schritt jemals fehlschlagen?
Isaac
5
Entweder gegen keine. Wenn beide zu NaN führen würden, würden sie zur String-Auswertung wechseln. Wenn nur eine konvertiert werden kann, gibt es immer noch einen Zahlenvergleich.
Erik Reppen
2
Es gibt tatsächlich einige seltsame Objekte in Javascript, die sich ziemlich seltsam verhalten. Beispielsweise lösen XML-Dokumente in IE <9 einen Fehler aus, wenn Sie versuchen, sie in Zahlen zu konvertieren.
MaxArt
Sie können die Umwandlungen selbst sehen , indem Sie Number(true)undNumber('true')
Erik Reppen
9

Der ==Vergleichsoperator ist in ECMA 5 definiert als:

  1. Wenn Typ (x) Zahl und Typ (y) Zeichenfolge ist,
    geben Sie das Ergebnis des Vergleichs x == ToNumber (y) zurück.
  2. Wenn Type (x) String und Type (y) Number ist,
    geben Sie das Ergebnis des Vergleichs ToNumber zurück (x) == y zurück.
  3. Wenn Typ (x) Boolesch ist, geben Sie das Ergebnis des Vergleichs ToNumber (x) == y zurück.
  4. Wenn Typ (y) boolesch ist, geben Sie das Ergebnis des Vergleichs x == ToNumber (y) zurück.

"True" == true wird also wie folgt bewertet:

  1. "true" == ToNumber (true)   (über Regel 7)
  2. "true" == 1
  3. ToNumber ("true") == 1   (über Regel 5)
  4. NaN == 1

===> false

nobitavn94
quelle
3

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.

Zohaib Ijaz
quelle
Habe ich auf folgende Weise richtig gefolgert? "true" == true wird zu "true" == 1 und dann zu "true" == "1" Deshalb geben sie false zurück?
Vuquanghoang