Falsey-Werte in JavaScript
false
- Null -
Number
Typ: 0
und auch -0
, 0.0
und Hex - Form 0x0
( dank RBT )
- Null vom
BigInt
Typ: 0n
und -0n
(neu im Jahr 2020, danke GetMeARemoteJob )
""
, ''
und ``
- Zeichenfolgen der Länge 0
null
undefined
NaN
document.all
(nur in HTML-Browsern)
- Das ist komisch.
document.all
ist ein Falsey-Objekt mit typeof
as undefined
. Es war eine Microsoft-proprietäre Funktion im IE vor IE11 und wurde der HTML-Spezifikation als "vorsätzliche Verletzung der JavaScript-Spezifikation" hinzugefügt, damit Websites, die für den IE geschrieben wurden, beispielsweise beim Versuch des Zugriffs nicht kaputt gehen document.all.something
. Es ist falsch, weil es if (document.all)
früher eine beliebte Methode war, IE vor bedingten Kommentaren zu erkennen. Siehe Warum ist document.all falsch? für Details
"Falsey" bedeutet einfach, dass die interne ToBoolean
Funktion von JavaScript zurückgegeben wird false
. ToBoolean
unterliegt !value
, value ? ... : ...;
und if (value)
. Hier ist die offizielle Spezifikation (Arbeitsentwurf 2020) (die einzigen Änderungen seit der allerersten ECMAscript-Spezifikation im Jahr 1997 sind die Hinzufügung der ES6-Symbole , die immer wahr sind und BigInt
oben erwähnt wurden:

Vergleiche mit ==
(lose Gleichheit)
Es lohnt sich, über die losen Vergleiche==
von Falschwerten zu sprechen , die ToNumber()
aufgrund der zugrunde liegenden Unterschiede Verwirrung stiften . Sie bilden effektiv drei Gruppen:
false, 0, -0, "", ''
alle passen zusammen mit ==
- zB
false == ""
, '' == 0
und deshalb4/2 - 2 == 'some string'.slice(11);
null, undefined
passt zu ==
- zB
null == undefined
aberundefined != false
- Es ist auch erwähnenswert , dass während
typeof null
kehrt 'object'
, null
ist kein Objekt, das ist eine langjährige Bug / Marotte , die nicht um die Kompatibilität zu erhalten festgesetzt wurden. Es ist kein echtes Objekt, und Objekte sind wahr (mit Ausnahme dieser "vorsätzlichen Verletzung", document.all
wenn Javascript in HTML implementiert ist).
NaN
passt zu nichts, mit ==
oder ===
, nicht einmal zu sich selbst
- zB
NaN != NaN
, NaN !== NaN
, NaN != false
,NaN != null
Bei "strikter Gleichheit" ( ===
) gibt es keine solchen Gruppierungen. Nur false
===
false
.
Dies ist einer der Gründe, warum viele Entwickler und viele Styleguides (z. B. Standardjs ) es vorziehen ===
und fast nie verwenden ==
.
Die Wahrheit schätzt das tatsächlich == false
"Truthy" bedeutet einfach, dass die interne ToBoolean
Funktion von JavaScript zurückgegeben wird true
. Eine Marotte von Javascript bewusst zu sein (und ein weiterer guter Grund zu bevorzugen ===
über ==
): Es ist möglich , dass ein Wert (sein truthy ToBoolean
kehrt true
), aber auch == false
.
Sie könnten denken, es if (value && value == false) alert('Huh?')
ist eine logische Unmöglichkeit, die nicht passieren könnte, aber es wird, für:
"0"
und '0'
- es sind nicht leere Zeichenfolgen, die wahr sind, aber Javascript ==
passt Zahlen mit äquivalenten Zeichenfolgen an (z 42 == "42"
. B. ). Da 0 == false
, wenn "0" == 0
, "0" == false
.
new Number(0)
und new Boolean(false)
- sie sind Objekte, die wahr sind, aber ==
ihre Werte sehen, die == false
.
0 .toExponential();
- ein Objekt mit einem numerischen Wert, der äquivalent zu ist 0
- Alle ähnlichen Konstruktionen, die Ihnen einen falsch gleichen Wert geben, der in einen Typ eingeschlossen ist, der wahr ist
[]
, [[]]
und [0]
(danke cloudfeet für den Link JavaScript Equality Table )
Noch mehr wahrheitsgemäße Werte
Dies sind nur einige Werte, von denen manche erwarten, dass sie falsch sind, aber tatsächlich wahr sind.
-1
und alle negativen Zahlen ungleich Null
' '
, " "
, "false"
, 'null'
... alle nicht-leere Strings, darunter Strings , die nur Leerzeichen sind
Alles von typeof
, was immer eine nicht leere Zeichenfolge zurückgibt, zum Beispiel:
Jedes Objekt (mit Ausnahme dieser "vorsätzlichen Verletzung" document.all
in Browsern; denken Sie daran, dass dies null
kein Objekt ist, obwohl Sie etwas typeof
anderes vorschlagen). Einschließlich:
{}
[]
function(){}
oder () => {}
(jede Funktion, einschließlich leerer Funktionen)
Error
und jede Instanz von Error
- Jeder reguläre Ausdruck
- Alles, was mit
new
(einschließlich new Number(0)
und new Boolean(false)
) erstellt wurde
- Beliebiges Symbol
true
, 1
, "1"
Und [1]
Rückkehr , true
wenn sie miteinander verglichen mit ==
.