Falsey-Werte in JavaScript
false
- Null -
NumberTyp: 0und auch -0, 0.0und Hex - Form 0x0( dank RBT )
- Null vom
BigIntTyp: 0nund -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.allist ein Falsey-Objekt mit typeofas 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 ToBooleanFunktion von JavaScript zurückgegeben wird false. ToBooleanunterliegt !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 BigIntoben 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 == "", '' == 0und deshalb4/2 - 2 == 'some string'.slice(11);
null, undefined passt zu ==
- zB
null == undefinedaberundefined != false
- Es ist auch erwähnenswert , dass während
typeof nullkehrt 'object', nullist 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.allwenn 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 ToBooleanFunktion 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 ToBooleankehrt 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.allin Browsern; denken Sie daran, dass dies nullkein Objekt ist, obwohl Sie etwas typeofanderes 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 , truewenn sie miteinander verglichen mit ==.