Alle Falsey-Werte in JavaScript

215

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.

user56reinstatemonica8
quelle
1
@tibos blog.stackoverflow.com/2011/07/…
user56reinstatemonica8
5
dorey.github.io/JavaScript-Equality-Table ist eine großartige Ressource und verfügt über eine if()Registerkarte für Wahrhaftigkeit.
Wolkenfüße
4
Wow, wirklich nützlich, danke! [[]] == ""aber [] != []? Mein Kopf tut weh ...
user56reinstatemonica8
In der ECMA 262-Spezifikation sind diese Vergleichsregeln aufgeführt, insbesondere in den Abschnitten 11.9.1 bis 11.9.6: ecma-international.org/ecma-262/5.1/#sec-11.9.3. Es wäre sehr hilfreich , wenn Sie Ihre Antwort mit dieser Referenz aktualisieren würden , da es die Regeln dafür liefert, wie wahre / falsche Bestimmungen getroffen werden (sollen).
Shaun Wilson

Antworten:

367

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:

Undefiniert: Gibt false zurück.  Null: Gibt false zurück.  Boolean: Rückgabeargument.  Nummer: Wenn das Argument +0, -0 oder NaN ist, geben Sie false zurück.  Andernfalls wird true zurückgegeben.  String: Wenn das Argument der leere String ist (seine Länge ist Null), geben Sie false zurück.  Andernfalls wird true zurückgegeben.  BigInt: Wenn das Argument 0n ist, geben Sie false zurück.  Andernfalls wird true zurückgegeben.  Symbol: Rückgabe true.  Objekt: Rückgabe true.


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 ==.

user56reinstatemonica8
quelle
3
FYI, was !, ifund ?..:gemeinsam haben , ist , dass sie die internen Aufruf ToBooleanFunktion auf den Wert. Wie diese Werte im Rahmen verhalten !, ifetc. 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 ist false, aber mit !!, es ist true , aber nicht verstehen , die zugrunde liegende Konzept. Zwei weitere Punkte: 1) v ? true : falseist nur ein ausführlicher Weg von !!v. 2) gibt typeof immer eine nicht leere Zeichenfolge zurück, was wahr ist.
Felix Kling
1
Das heißt, es macht keinen Sinn, etwas zu betrachten typeof nulloder typeof undefinedspezifisch zu betrachten. Man könnte einfach sagen, dass nicht leere Zeichenfolgen wahr sind.
Felix Kling
1
Ich verstehe, aber das hat nichts mit der ursprünglichen Frage zu tun;) Das Hinzufügen zu vieler verwandter, aber nicht relevanter Informationen könnte für die Leser ziemlich verwirrend sein.
Felix Kling
5
Ich habe gerade gelernt, dass document.alldas auch falsch ist .
Claudiu
3
In Bezug auf den losen Vergleich: Da Boolesche Werte in Zahlen umgewandelt werden, x == falsewird aufgerufen, ToNumber(x)was sich nur sehr von unterscheidet ToBoolean(x). Könnte es wert sein, erklärt zu werden. Auch ich habe gerade bemerkt, dass ich diese Antwort bereits vor Ewigkeiten kommentiert habe: D
Felix Kling
3

Vergessen Sie nicht die nicht leere Zeichenfolge, "false"die ausgewertet wirdtrue

MrMcPlad
quelle
8
… Und ist also kein falscher Wert, nach dem gefragt wurde?
Bergi
5
touché. Es ist ein Wert, von dem man erwarten könnte, dass er falsch ist und nicht, was es immer noch wert ist, beachtet zu werden, und ich denke, er
verdient es
4
Zur Liste hinzugefügt ... aber versuchen wir nicht, daraus eine umfassende Liste aller möglichen Wahrheitswerte zu machen! Das würde eine Weile :-)
dauern
3

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.

    var myNum = 0.0;
    if(myNum){
        console.log('I am a truthy value');
    }
    else {
        console.log('I am a falsy value');
    }
    

    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:

    var myNum = 0x0; //hex representation of 0
    if(myNum){
        console.log('I am a truthy value');
    }   
    else {
        console.log('I am a falsy value');
    }
    

    Das obige Code-Snippet wird erneut gedruckt I am a falsy value.

RBT
quelle
7
JavaScript hat keine Ganzzahlen. 0, 0x0, 0.0Und 0.00sind nur verschiedene Literale für die gleiche IEEE-754 64-Bit - Gleitkomma - Wert Null.
Fredoverflow
1

Zusätzlich zum Thema haben wir ab ES2020 einen neuen Wert, der falsch ist: BigInt Null (0n):

0n == false // true
-0n == false // true

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).

GetMeARemoteJob
quelle
1
Nett! Vielen Dank, ich hatte noch nichts davon gehört. Ich habe es der großen Liste mit einem Link hinzugefügt, der Ihre Antwort für die Erhöhung
angibt