Das Verhalten von == ist ein wenig langatmig, aber klar definiert in der ecma-262-Spezifikation :
11.9.3 Der abstrakte Gleichheitsvergleichsalgorithmus
Der Vergleich x == y, wobei x und y Werte sind, ergibt wahr oder falsch. Ein solcher Vergleich wird wie folgt durchgeführt wie folgt durchgeführt:
- Wenn Typ(x) sich von Typ(y) unterscheidet, gehen Sie zu Schritt 14.
- Wenn Type(x) Undefined ist, wird true zurückgegeben.
- Wenn Type(x) Null ist, wird true zurückgegeben.
- Wenn Typ(x) nicht Zahl ist, fahren Sie mit Schritt 11 fort.
- Wenn x NaN ist, wird false zurückgegeben.
- Wenn y gleich NaN ist, wird false zurückgegeben.
- Wenn x der gleiche Zahlenwert wie y ist, wird true zurückgegeben.
- Wenn x gleich +0 und y gleich 0 ist, wird true zurückgegeben.
- Wenn x gleich 0 und y gleich +0 ist, wird true zurückgegeben.
- Return false.
- Wenn Type(x) String ist, dann wird true zurückgegeben, wenn x und y genau die gleiche Folge von Zeichen sind (gleiche Länge und gleiche Zeichen an entsprechenden Positionen). Andernfalls wird false zurückgegeben.
- Wenn Type(x) Boolean ist, wird true zurückgegeben, wenn x und y beide true sind oder beide falsch sind. Andernfalls wird false zurückgegeben.
- Gibt true zurück, wenn x und y sich auf dasselbe Objekt beziehen oder wenn sie sich auf Objekte verweisen, die miteinander verbunden sind (siehe 13.1.2). Andernfalls wird false zurückgegeben.
- Wenn x null und y undefiniert ist, wird true zurückgegeben.
- Wenn x undefiniert ist und y null ist, wird true zurückgegeben.
- Wenn Typ(x) eine Zahl und Typ(y) ein String ist, wird das Ergebnis der Vergleichs x == ToNumber(y) zurück.
- Wenn Typ(x) gleich String und Typ(y) gleich Zahl ist, wird das Ergebnis der Vergleichs ToNumber(x) == y.
- Wenn Type(x) Boolean ist, wird das Ergebnis des Vergleichs ToNumber(x) == y zurückgegeben.
- Wenn Type(y) Boolean ist, wird das Ergebnis des Vergleichs x == ToNumber(y).
- Wenn Type(x) entweder String oder Number und Type(y) Object ist, wird zurückgegeben das Ergebnis des Vergleichs x == ToPrimitive(y).
- Wenn Type(x) Object und Type(y) entweder String oder Number ist, wird die Ergebnis des Vergleichs zurück ToPrimitive(x) == y.
- Return false.
Schritt 16 gilt für Ihr früheres Beispiel:
0 == "0" // apply 16
0 == toNumber("0")
0 == 0 // apply 7
true
Für letztere gilt Schritt 18, für letztere Schritt 16:
true == "true" // apply 18
toNumber(true) == "true"
1 == "true" // apply 16
1 == toNumber("true")
1 == NaN // apply 6
false