In einem von cssrain zusammengestellten Testfragensatz gibt es eine solche Frage:
<SCRIPT LANGUAGE="JavaScript">
var a = 0;
var b = -1;
var c = 1;
Funktion affirm (aVar) {
if (aVar==true) alarm(true);
sonst alarm(false);
}
behaupten(a);
behaupten(b);
behaupten(c);
</SCRIPT>
Codefeld ausführen
[Strg+A Alle Tipps auswählen: Sie können zuerst einen Teil des Codes ändern und dann Ausführen drücken]
Nach meinem Verständnis sollte jeder boolesche Wert, der nicht 0 ist, wahr sein.
Die korrekte Ausgabe dieser Frage lautet jedoch: falsch falsch wahr.
Der Wert von (-1==true) ist falsch.
Schauen wir uns das folgende Beispiel an:
<SCRIPT LANGUAGE="JavaScript">
var a = 0;
var b = -1;
var c = 1;
Funktion affirm (aVar) {
if (aVar) alarm(true);
sonst alarm(false);
}
behaupten(a);
behaupten(b);
behaupten(c);
</SCRIPT>
Codefeld ausführen
[Strg+A Alle Tipps auswählen: Sie können zuerst einen Teil des Codes ändern und dann Ausführen drücken]
Die laufenden Ergebnisse sind: falsch, wahr, wahr.
Hier stellen wir fest, dass die Ergebnisse von if(aVar) und if(aVar == true) nicht gleich sind.
Die Erklärung von cssrain in der Antwort lautet:
if(aVar) und if (aVar==true) haben sehr unterschiedliche Antworten für negative Zahlen.
Ist das wirklich der Grund für die negative Zahl? Betrachten Sie das folgende Beispiel:
Codefeld ausführen
[Strg+A Alle Tipps auswählen: Sie können zuerst einen Teil des Codes ändern und dann Ausführen drücken]
Warum gibt die positive Zahl 2 auch false zurück? Lassen Sie uns die Zahl in einen booleschen Wert umwandeln und einen Blick darauf werfen.
Codefeld ausführen
[Strg+A Alle Tipps auswählen: Sie können zuerst einen Teil des Codes ändern und dann Ausführen drücken]
Die booleschen Werte ungleich Null sind hier tatsächlich wahr, was bedeutet, dass sich alle Probleme auf den ==-Operator in 2==true konzentrieren. Grundsätzlich gilt, dass == Zahlen nicht in boolesche Werte umwandeln und anschließend vergleichen darf.
Schauen Sie, was ECMA-262 (Seite 80) sagt:
6.Wenn Type(x) boolesch ist, geben Sie das Ergebnis des Vergleichs ToNumber(x) == y zurück.
7.Wenn Type(y) boolesch ist, wird das Ergebnis des Vergleichs x == ToNumber(y) zurückgegeben.
Das heißt, boolesche Werte werden zunächst in Zahlen umgewandelt und dann verglichen. Der numerische Wert von true ist 1 und false ist 0. Daher können weder 2 noch -1 gleich wahr sein.
Schauen Sie sich das folgende Beispiel genauer an:
<SCRIPT LANGUAGE="JavaScript">
var a = "undefiniert";
var b = „falsch“;
var c = "";
Funktion affirm (aVar) {
if (aVar==true) alarm(true);
sonst alarm(false);
}
behaupten(a);
behaupten(b);
behaupten(c);
</SCRIPT>
Codefeld ausführen
[Strg+A Alle Tipps auswählen: Sie können zuerst einen Teil des Codes ändern und dann Ausführen drücken]
Gemäß der vorherigen Idee wird true in 1 umgewandelt, sodass alle drei Aussagen false zurückgeben. Führen Sie es aus und stellen Sie fest, dass dies tatsächlich der Fall ist.
Als nächstes ändern Sie if(aVar==true) in if(aVar).
Codefeld ausführen
[Strg+A Alle Tipps auswählen: Sie können zuerst einen Teil des Codes ändern und dann Ausführen drücken]
Die aktuellen Ergebnisse sind wahr, wahr, falsch. Weil die Ergebnisse von Boolean("undefiniert"), Boolean("false") und Boolean("") wahr, wahr und falsch sind. Nicht leere Zeichenfolgen werden in den booleschen Wert true konvertiert.
Abschließend gibt es ein Beispiel zur Erläuterung der Vergleichsregeln, wenn beide Seiten von == Zeichenfolgen und Zahlen sind.
Codefeld ausführen
[Strg+A Alle Tipps auswählen: Sie können zuerst einen Teil des Codes ändern und dann Ausführen drücken]
Haben Sie festgestellt, dass „001“==true wahr ist?
Weil true zuerst in 1 konvertiert wird. Dann beachten Sie die ECMA-Regeln:
4.Wenn Typ(x) eine Zahl und Typ(y) ein String ist, geben Sie das Ergebnis des Vergleichs x == ToNumber(y) zurück.
5.Wenn Type(x) String und Type(y) Number ist, geben Sie das Ergebnis des Vergleichs ToNumber(x) == y zurück.
Die Zeichenfolge soll in eine Zahl umgewandelt werden und der Wert von Number("001") ist ebenfalls 1, sodass das Ergebnis wahr ist.