Folgendes zeigt, dass dies "0"
in Javascript falsch ist:
>>> "0" == false
true
>>> false == "0"
true
Warum druckt der folgende "ha"
?
>>> if ("0") console.log("ha")
ha
javascript
boolean
Unpolarität
quelle
quelle
"0"
ist eine Zeichenfolge, und da sie nicht leer ist, wird sie als wahr ausgewertet."0" === false [...] false
'0'==false
aber '0' ist kein Falsey-Wert (ja, Javascript kann seltsam sein)==
, werden sie nie in Boolesche Werte konvertiert, sodass sie nicht zutreffen. (Die Regeln für die Konvertierung scheinen die Konvertierung in Zahlen zu begünstigen.)Antworten:
Der Grund dafür ist, dass, wenn Sie dies explizit tun
"0" == false
, beide Seiten in Zahlen konvertiert werden und dann der Vergleich durchgeführt wird.Wenn Sie Folgendes tun:
if ("0") console.log("ha")
wird der Zeichenfolgenwert getestet. Jede nicht leere Zeichenfolge isttrue
, während eine leere Zeichenfolge istfalse
.quelle
Tabellen mit dem Problem:
und ==
Moral der Geschichte verwenden ===
Guthaben für die Tabellengenerierung: https://github.com/dorey/JavaScript-Equality-Table
quelle
NaN
verstehe. Ich meine,typeof NaN // number
aberNaN === NaN // false
, hmm ...NaN
müssen. Wenn Sie also 2 NaNs vergleichen, haben sie unterschiedliche Werte (denke ich). Lesen Sie das erste Zitat hier .==
noch===
Betreiber für die[]
,{}
,[[]]
,[0]
und[1]
Werte auswerten nicht auf true. Ich meine[] == []
und[] === []
auch falsch.Es ist nach Spezifikation.
ToBoolean ist laut Spezifikation
Und diese Tabelle sagt dies über Zeichenfolgen:
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:
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öchtenToBoolean
, verwenden Sie===
(auch als "strenger" Gleichheitsoperator bezeichnet).quelle
"a string has a primitive base, which calls back the internal get method and ends up looking false"
Gilt das für alle Saiten?Section 8.12.3: [[Get]] (P)
beschreibt, wie es funktioniert. Dies gilt nur für Fälle, in denen die Zeichenfolge 0 ist, da schließlich eine Reihe anderer interner Aufrufe ausgeführt werden, bei denen festgestellt wird,GetOwnProperty
dass "was auch immer" eine Dateneigenschaft ist, die diesen Wert dann vollständig zurückgibt. Deshalb ist "0" falsch und "bla" ist wahr. Schauen Sie sich einige von Douglas Crockfords Videos im Yahoo Developer Theatre an. Er beschreibt "Wahrhaftigkeit" in JavaScript etwas weniger komplex als ich. Wenn Sie verstehen, was "wahr" und "falsch" bedeutet, werden Sie die Antwort von Bobince sofort verstehen.Es ist PHP, wo die Zeichenfolge
"0"
falsch ist (falsch, wenn sie im booleschen Kontext verwendet wird). In JavaScript sind alle nicht leeren Zeichenfolgen wahr.Der Trick besteht darin, dass
==
ein Boolescher Wert in einem booleschen Kontext nicht ausgewertet wird, sondern in eine Zahl konvertiert wird. Bei Zeichenfolgen wird dies als Dezimalanalyse analysiert. Sie erhalten also die Zahl0
anstelle der Booleschen Wahrheittrue
.Dies ist ein wirklich schlechtes Sprachdesign und einer der Gründe, warum wir versuchen, den unglücklichen
==
Operator nicht zu verwenden . Verwenden Sie===
stattdessen.quelle
quelle
Ihre Anführungszeichen
0
machen es zu einer Zeichenfolge, die als wahr bewertet wird.Entfernen Sie die Anführungszeichen und es sollte funktionieren.
quelle
Es ist alles wegen der ECMA-Spezifikationen ...
"0" == false
wegen der hier angegebenen Regeln http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3 ... und wirdif ('0')
aufgrund der hier angegebenen Regeln als wahr ausgewertet http: / /ecma262-5.com/ELS5_HTML.htm#Section_12.5quelle
Der "if" -Ausdruck prüft die Wahrhaftigkeit, während der Doppelgleichheitsprüfung die typunabhängige Äquivalenz prüft. Eine Saite ist immer wahr, wie andere hier betont haben. Wenn das Doppelgleiche beide Operanden auf Wahrhaftigkeit prüft und dann die Ergebnisse vergleicht, erhalten Sie das Ergebnis, das Sie intuitiv angenommen haben, d
("0" == true) === true
. H. Wie Doug Crockford in seinem ausgezeichneten JavaScript sagt : The Good Parts , "sind die Regeln, nach denen [== die Typen seiner Operanden erzwingt] kompliziert und unvergesslich ... Der Mangel an Transitivität ist alarmierend." Es genügt zu sagen, dass einer der Operanden typgezwungen ist, um mit dem anderen übereinzustimmen, und dass "0" als numerische Null interpretiert wird.quelle
== Der Gleichheitsoperator wertet die Argumente aus, nachdem sie in Zahlen konvertiert wurden. So String Null „0“ Number - Datentyp und boolean false umgewandelt wird Nummer 0 umgewandelt , so
Gleiches gilt für `
=== Strikte Gleichheitsprüfung wertet die Argumente mit dem ursprünglichen Datentyp aus
Gleiches gilt für
Im
Die Zeichenfolge "0" wird nicht mit Argumenten verglichen, und die Zeichenfolge ist ein wahrer Wert, bis oder sofern sie nicht mit Argumenten verglichen wird. Es ist genau so
Aber
`
quelle
Dies liegt daran, dass JavaScript in booleschen Kontexten und in Ihrem Code Typzwang verwendet
wird in booleschen Kontexten zu true gezwungen.
Es gibt andere wahrheitsgemäße Werte in Javascript, die in booleschen Kontexten zu true gezwungen werden und daher den if-Block ausführen: -
quelle
erzwingt x mithilfe des internen toBoolean von JavaScript (http://es5.github.com/#x9.2)
zwingt beide Seiten mit internem toNumber-Zwang (http://es5.github.com/#x9.3) oder toPrimitive für Objekte (http://es5.github.com/#x9.1)
Ausführliche Informationen finden Sie unter http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
quelle