Toutes les valeurs de Falsey en JavaScript


215

Quelles sont les valeurs en JavaScript qui sont «falsey» , ce qui signifie qu'elles sont évaluées comme fausses dans des expressions comme if(value), value ?et !value?


Il y a déjà des discussions sur le but des valeurs de falsey sur Stack Overflow , mais aucune réponse complète exhaustive ne répertorie toutes les valeurs de falsey.

Je n'ai trouvé aucune liste complète sur la référence JavaScript MDN , et j'ai été surpris de constater que les meilleurs résultats lors de la recherche d'une liste complète et faisant autorité de valeurs falsey en JavaScript étaient des articles de blog, dont certains avaient des omissions évidentes (par exemple, NaN), et aucun d'entre eux n'avait un format comme celui de Stack Overflow où des commentaires ou des réponses alternatives pouvaient être ajoutés pour signaler des caprices, des surprises, des omissions, des erreurs ou des mises en garde. Donc, il semblait logique d'en faire un.




5
dorey.github.io/JavaScript-Equality-Table est une excellente ressource et a un if()onglet pour la véracité.
cloudfeet

4
Wow, vraiment utile, merci! [[]] == ""mais [] != []? Ma tête
me

La spécification ECMA 262 détaille ces règles de comparaison, en particulier les sections 11.9.1 à 11.9.6: ecma-international.org/ecma-262/5.1/#sec-11.9.3 Ce serait génial si vous mettiez à jour votre réponse pour inclure cette référence , car il fournit les règles sur la façon dont les déterminations vraies / fausses sont (supposées être) effectuées.
Shaun Wilson

Réponses:


367

Valeurs de Falsey en JavaScript

  • false
  • Zéro de NumberType: 0et aussi -0, 0.0et la forme hexagonale 0x0( grâce RBT )
  • Zéro de BigInttype: 0net -0n(nouveau en 2020, merci GetMeARemoteJob )
  • "", ''et ``- chaînes de longueur 0
  • null
  • undefined
  • NaN
  • document.all (dans les navigateurs HTML uniquement)

"Falsey" signifie simplement que la ToBooleanfonction interne de JavaScript revient false. ToBooleansous !value- tend , value ? ... : ...;et if (value). Voici sa spécification officielle (projet de travail 2020) (les seuls changements depuis la toute première spécification ECMAscript en 1997 sont l'ajout des symboles ES6 , qui sont toujours véridiques, et BigInt, mentionnés ci-dessus:

Non défini: retourne faux.  Null: Return false.  Boolean: argument de retour.  Number: Si l'argument est +0, -0 ou NaN, retourne false;  sinon retourne vrai.  String: si l'argument est la chaîne vide (sa longueur est nulle), retourne false;  sinon retourne vrai.  BigInt: si l'argument est 0n, retourne false;  sinon retourne vrai.  Symbole: retour vrai.  Object: Return true.


Comparaisons avec ==(égalité lâche)

Il vaut la peine de parler des comparaisons lâches== des valeurs de falsification , qui utilisent ToNumber()et peuvent causer une certaine confusion en raison des différences sous-jacentes. Ils forment effectivement trois groupes:

  • false, 0, -0, "", '' tous correspondent avec ==
    • par exemple false == "", '' == 0et donc4/2 - 2 == 'some string'.slice(11);
  • null, undefined correspond avec ==
    • par exemple null == undefinedmaisundefined != false
    • Il est également intéressant de mentionner que si les typeof nullrendements 'object', nullest pas un objet, c'est un bug de longue date / bizarrerie qui n'a pas été fixé afin de maintenir la compatibilité. Ce n'est pas un vrai objet, et les objets sont véridiques (sauf pour cette "violation volontaire" document.alllorsque Javascript est implémenté en HTML)
  • NaN ne correspond à rien, avec ==ou ===, pas même lui-même
    • par exemple NaN != NaN, NaN !== NaN, NaN != false,NaN != null

Avec "l'égalité stricte" ( ===), il n'y a pas de tels groupements. Seulement false === false.

C'est l'une des raisons pour lesquelles de nombreux développeurs et de nombreux guides de style (par exemple standardjs ) préfèrent ===et n'utilisent presque jamais ==.


Des valeurs véridiques qui == false

"Truthy" signifie simplement que la ToBooleanfonction interne de JavaScript revient true. Une bizarrerie de Javascript pour être au courant (et une autre bonne raison de préférer ===plus ==): il est possible pour une valeur à truthy ( ToBooleanrendement true), mais aussi == false.

Vous pourriez penser que if (value && value == false) alert('Huh?')c'est une impossibilité logique qui ne pourrait pas se produire, mais ce sera le cas pour:

  • "0"et '0'- ce sont des chaînes non vides, qui sont véridiques, mais Javascript fait ==correspondre les nombres avec des chaînes équivalentes (par exemple 42 == "42"). Depuis 0 == false, si "0" == 0, "0" == false.
  • new Number(0)et new Boolean(false)- ce sont des objets, qui sont véridiques, mais qui ==voient leurs valeurs, qui == false.
  • 0 .toExponential(); - un objet avec une valeur numérique équivalente à 0
  • Toutes constructions similaires qui vous donnent une valeur de fausse égalité enveloppée dans un type qui est véridique
  • [], [[]]et [0](merci cloudfeet pour le lien JavaScript Equality Table )

Quelques valeurs plus véridiques

Ce ne sont que quelques valeurs que certaines personnes pourraient s'attendre à ce qu'elles soient fausses, mais elles sont en réalité véridiques.

  • -1 et tous les nombres négatifs non nuls
  • ' ', " ", "false", 'null'... toutes les chaînes non vides, y compris les chaînes qui sont juste des espaces
  • Tout ce qui provient de typeof, qui renvoie toujours une chaîne non vide, par exemple:

  • N'importe quel objet (sauf cette "violation délibérée" document.alldans les navigateurs; rappelez-vous que ce nulln'est pas vraiment un objet malgré le fait de typeofsuggérer le contraire). Comprenant:

    • {}
    • []
    • function(){}ou () => {}(toute fonction, y compris les fonctions vides)
    • Error et toute instance de Error
    • Toute expression régulière
    • Tout ce qui a été créé avec new(y compris new Number(0)et new Boolean(false))
  • Tout symbole

true, 1, "1"Et [1]retour truepar rapport à l'autre avec ==.


3
Pour info, quoi !, ifet ?..:ont en commun, c'est qu'ils appellent la ToBooleanfonction interne sur la valeur. Comment ces valeurs se comportent dans le contexte de !, if, etc. , est déjà sous - entendus par leur nom: Ils sont des valeurs « falsy ». Je suis un peu peur que les autres lisent la réponse et de penser « Oh si , dans ce contexte ( !, if, ?...:), la valeur est false, mais avec !!, il est true» , mais ne comprends pas le concept sous - jacent. Deux autres points: 1) v ? true : falseest juste une façon verbeuse de !!v. 2) renvoie typeof toujours une chaîne non vide, ce qui est vrai.
Felix Kling

1
C'est-à-dire qu'il est inutile de regarder typeof nullou typeof undefinedspécifiquement. Vous pourriez simplement dire que les chaînes non vides sont véridiques.
Felix Kling

1
Je vois, mais cela n'a rien à voir avec la question d'origine;) Ajouter trop d'informations quelque peu liées mais pas pertinentes pourrait être assez déroutant pour les lecteurs.
Felix Kling

5
Je viens d'apprendre que document.allc'est aussi de la falsification .
Claudiu

3
Concernant la comparaison lâche: parce que les booléens sont convertis en nombres, x == falseappellera ToNumber(x)ce qui est très différent de ToBoolean(x). Cela pourrait valoir la peine d'être expliqué. De plus, je viens de remarquer que j'ai déjà commenté cette réponse il y a longtemps: D
Felix Kling

3

N'oubliez pas la chaîne non vide "false"qui évalue àtrue


8
… Et n'est donc pas une valeur falsifiée, qui a été demandée?
Bergi

5
touché. c'est une valeur à laquelle vous pourriez vous attendre et ce n'est pas le cas, ce qui vaut la peine d'être connu, et je pense, mérite d'être mentionné sur une liste complète
MrMcPlad

4
Ajouté à la liste ... mais n'essayons pas d'en faire une liste complète de toutes les valeurs véridiques possibles! Cela prendrait un certain temps:-)
user56reinstatemonica8

3

Juste pour ajouter à la liste des valeurs de falsification de @ user568458:

  • En plus du nombre entier 0, le nombre décimal 0,0, 0,00 ou un tel nombre de zéros est également une valeur fausse.

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

    Impressions d'extraits de code ci-dessus I am a falsy value

  • De même, la représentation hexadécimale du nombre 0 est également une valeur fausse, comme indiqué dans l'extrait de code ci-dessous:

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

    L'extrait de code ci-dessus s'imprime à nouveau I am a falsy value.


7
JavaScript n'a pas de nombres entiers. 0, 0x0, 0.0Et 0.00sont juste différents littéraux pour la même valeur à virgule flottante IEEE-754 64 bits zéro.
fredoverflow

1

Outre le sujet, depuis ES2020, nous avons une nouvelle valeur qui est fausse, c'est BigInt zéro (0n):

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

Donc, avec cela, nous avons maintenant 7 valeurs "fausses" au total (sans compter document.all comme mentionné par l'utilisateur ci-dessus car il fait partie de DOM et non de JS).


1
Agréable! Merci, je n'en avais pas encore entendu parler, je l'ai ajouté à la grande liste avec un lien attribuant votre réponse pour l'avoir
soulevée
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.