Was sind die Werte in JavaScript , die ‚Falsey‘ sind was bedeutet, dass sie als falsch bewerten in Ausdrücken wie if(value)
, value ?
und !value
?
Es gibt bereits einige Diskussionen über den Zweck von Falsey-Werten bei Stack Overflow , aber keine vollständige Antwort, in der alle Falsey-Werte aufgeführt sind.
Ich konnte keine vollständige Liste in der MDN-JavaScript-Referenz finden , und ich war überrascht, dass die besten Ergebnisse bei der Suche nach einer vollständigen, maßgeblichen Liste von Falsey-Werten in JavaScript Blog-Artikel waren, von denen einige offensichtliche Auslassungen aufwiesen (z. NaN
), und keines davon hatte ein Format wie das von Stack Overflow, in dem Kommentare oder alternative Antworten hinzugefügt werden konnten, um auf Macken, Überraschungen, Auslassungen, Fehler oder Vorbehalte hinzuweisen. Es schien also sinnvoll zu sein, einen zu machen.
quelle
if()
Registerkarte für Wahrhaftigkeit.[[]] == ""
aber[] != []
? Mein Kopf tut weh ...Antworten:
Falsey-Werte in JavaScript
false
Number
Typ:0
und auch-0
,0.0
und Hex - Form0x0
( dank RBT )BigInt
Typ:0n
und-0n
(neu im Jahr 2020, danke GetMeARemoteJob )""
,''
und``
- Zeichenfolgen der Länge 0null
undefined
NaN
document.all
(nur in HTML-Browsern)document.all
ist ein Falsey-Objekt mittypeof
asundefined
. 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 gehendocument.all.something
. Es ist falsch, weil esif (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 wirdfalse
.ToBoolean
unterliegt!value
,value ? ... : ...;
undif (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 undBigInt
oben erwähnt wurden:Vergleiche mit
==
(lose Gleichheit)Es lohnt sich, über die losen Vergleiche
==
von Falschwerten zu sprechen , dieToNumber()
aufgrund der zugrunde liegenden Unterschiede Verwirrung stiften . Sie bilden effektiv drei Gruppen:false, 0, -0, "", ''
alle passen zusammen mit==
false == ""
,'' == 0
und deshalb4/2 - 2 == 'some string'.slice(11);
null, undefined
passt zu==
null == undefined
aberundefined != false
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 selbstNaN != NaN
,NaN !== NaN
,NaN != false
,NaN != null
Bei "strikter Gleichheit" (
===
) gibt es keine solchen Gruppierungen. Nurfalse
===
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 wirdtrue
. Eine Marotte von Javascript bewusst zu sein (und ein weiterer guter Grund zu bevorzugen===
über==
): Es ist möglich , dass ein Wert (sein truthyToBoolean
kehrttrue
), 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 (z42 == "42"
. B. ). Da0 == false
, wenn"0" == 0
,"0" == false
.new Number(0)
undnew 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 ist0
[]
,[[]]
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 sindAlles von
typeof
, was immer eine nicht leere Zeichenfolge zurückgibt, zum Beispiel:typeof null
(Gibt eine Zeichenfolge'object'
aufgrund eines langjährigen Fehlers / einer Eigenart zurück. )typeof undefined
(gibt einen String zurück'undefined'
)Jedes Objekt (mit Ausnahme dieser "vorsätzlichen Verletzung"
document.all
in Browsern; denken Sie daran, dass diesnull
kein Objekt ist, obwohl Sie etwastypeof
anderes vorschlagen). Einschließlich:{}
[]
function(){}
oder() => {}
(jede Funktion, einschließlich leerer Funktionen)Error
und jede Instanz vonError
new
(einschließlichnew Number(0)
undnew Boolean(false)
) erstellt wurdetrue
,1
,"1"
Und[1]
Rückkehr ,true
wenn sie miteinander verglichen mit==
.quelle
!
,if
und?..:
gemeinsam haben , ist , dass sie die internen AufrufToBoolean
Funktion auf den Wert. Wie diese Werte im Rahmen verhalten!
,if
etc. ist bereits durch ihren Namen angedeutet: Sie sind „falsy“ Werte. Ich bin ein bisschen Angst , dass andere die Antwort zu lesen und denken : „Oh , so ist in diesem Zusammenhang (!
,if
,?...:
), der Wert istfalse
, aber mit!!
, es isttrue
“ , aber nicht verstehen , die zugrunde liegende Konzept. Zwei weitere Punkte: 1)v ? true : false
ist nur ein ausführlicher Weg von!!v
. 2) gibttypeof
immer eine nicht leere Zeichenfolge zurück, was wahr ist.typeof null
odertypeof undefined
spezifisch zu betrachten. Man könnte einfach sagen, dass nicht leere Zeichenfolgen wahr sind.document.all
das auch falsch ist .x == false
wird aufgerufen,ToNumber(x)
was sich nur sehr von unterscheidetToBoolean(x)
. Könnte es wert sein, erklärt zu werden. Auch ich habe gerade bemerkt, dass ich diese Antwort bereits vor Ewigkeiten kommentiert habe: DVergessen Sie nicht die nicht leere Zeichenfolge,
"false"
die ausgewertet wirdtrue
quelle
:-)
Nur um der Liste der falschen Werte von @ user568458 hinzuzufügen:
Zusätzlich zur Ganzzahl 0 ist die Dezimalzahl 0,0, 0,00 oder eine solche Nullzahl auch ein falscher Wert.
Der obige Codeausschnitt wird gedruckt
I am a falsy value
In ähnlicher Weise ist die hexadezimale Darstellung der Zahl 0 auch ein falscher Wert, wie im folgenden Codeausschnitt gezeigt:
Das obige Code-Snippet wird erneut gedruckt
I am a falsy value
.quelle
0
,0x0
,0.0
Und0.00
sind nur verschiedene Literale für die gleiche IEEE-754 64-Bit - Gleitkomma - Wert Null.Zusätzlich zum Thema haben wir ab ES2020 einen neuen Wert, der falsch ist: BigInt Null (0n):
Damit haben wir jetzt insgesamt 7 "falsche" Werte (ohne document.all, wie vom Benutzer oben erwähnt, da es Teil von DOM und nicht von JS ist).
quelle