Es ist nach Spezifikation.
12.5 Die if-Anweisung
..... .....
2. Wenn ToBoolean (GetValue (exprRef)) wahr ist, dann
ein. Geben Sie das Ergebnis der Auswertung der ersten Anweisung zurück.
3. Sonst
....
ToBoolean ist laut Spezifikation
Die abstrakte Operation ToBoolean konvertiert ihr Argument gemäß Tabelle 11 in einen Wert vom Typ Boolean:
Und diese Tabelle sagt dies über Zeichenfolgen:
Das Ergebnis ist falsch, wenn das Argument der leere String ist (seine Länge ist Null). Andernfalls ist das Ergebnis wahr
Um zu erklären, warum "0" == false
Sie den Gleichheitsoperator lesen sollten, der angibt, dass er seinen Wert aus der abstrakten Operation erhält, GetValue(lref)
stimmt dies für die rechte Seite überein.
Welches beschreibt diesen relevanten Teil als:
wenn IsPropertyReference (V), dann
ein. Wenn HasPrimitiveBase (V) falsch ist, sei get die interne Methode [[Get]] der Basis, andernfalls sei get
sei die spezielle [[Get]] interne Methode, die unten definiert ist.
b. Gibt das Ergebnis des Aufrufs der internen Methode get unter Verwendung von base als diesen Wert und der Übergabe zurück
GetReferencedName (V) für das Argument
Mit anderen Worten, eine Zeichenfolge hat eine primitive Basis, die die interne get-Methode zurückruft und am Ende falsch aussieht.
Wenn Sie Dinge mit der Operation GetValue auswerten möchten, verwenden Sie ==
, wenn Sie mit der Operation bewerten möchten ToBoolean
, verwenden Sie ===
(auch als "strenger" Gleichheitsoperator bezeichnet).
"0"
ist eine Zeichenfolge, und da sie nicht leer ist, wird sie als wahr ausgewertet.