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.
la source
if()
onglet pour la véracité.[[]] == ""
mais[] != []
? Ma têteRéponses:
Valeurs de Falsey en JavaScript
false
Number
Type:0
et aussi-0
,0.0
et la forme hexagonale0x0
( grâce RBT )BigInt
type:0n
et-0n
(nouveau en 2020, merci GetMeARemoteJob )""
,''
et``
- chaînes de longueur 0null
undefined
NaN
document.all
(dans les navigateurs HTML uniquement)document.all
est un objet falsey, avectypeof
asundefined
. Il s'agissait d'une fonction propriétaire de Microsoft dans IE avant IE11, et a été ajoutée à la spécification HTML comme une "violation délibérée de la spécification JavaScript" afin que les sites écrits pour IE ne s'arrêtent pas en essayant d'accéder, par exempledocument.all.something
; c'est faux parce qu'avantif (document.all)
c'était un moyen populaire pour détecter IE, avant les commentaires conditionnels. Voir Pourquoi est document.all falsy? pour plus de détails"Falsey" signifie simplement que la
ToBoolean
fonction interne de JavaScript revientfalse
.ToBoolean
sous!value
- tend ,value ? ... : ...;
etif (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, etBigInt
, mentionnés ci-dessus:Comparaisons avec
==
(égalité lâche)Il vaut la peine de parler des comparaisons lâches
==
des valeurs de falsification , qui utilisentToNumber()
et peuvent causer une certaine confusion en raison des différences sous-jacentes. Ils forment effectivement trois groupes:false, 0, -0, "", ''
tous correspondent avec==
false == ""
,'' == 0
et donc4/2 - 2 == 'some string'.slice(11);
null, undefined
correspond avec==
null == undefined
maisundefined != false
typeof null
rendements'object'
,null
est 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.all
lorsque Javascript est implémenté en HTML)NaN
ne correspond à rien, avec==
ou===
, pas même lui-mêmeNaN != NaN
,NaN !== NaN
,NaN != false
,NaN != null
Avec "l'égalité stricte" (
===
), il n'y a pas de tels groupements. Seulementfalse
===
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
ToBoolean
fonction interne de JavaScript revienttrue
. 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 (ToBoolean
rendementtrue
), 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 exemple42 == "42"
). Depuis0 == false
, si"0" == 0
,"0" == false
.new Number(0)
etnew 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
[]
,[[]]
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 espacesTout ce qui provient de
typeof
, qui renvoie toujours une chaîne non vide, par exemple:typeof null
(renvoie une chaîne en'object'
raison d'un bug / bizarrerie de longue date )typeof undefined
(retourne une chaîne'undefined'
)N'importe quel objet (sauf cette "violation délibérée"
document.all
dans les navigateurs; rappelez-vous que cenull
n'est pas vraiment un objet malgré le fait detypeof
suggérer le contraire). Comprenant:{}
[]
function(){}
ou() => {}
(toute fonction, y compris les fonctions vides)Error
et toute instance deError
new
(y comprisnew Number(0)
etnew Boolean(false)
)true
,1
,"1"
Et[1]
retourtrue
par rapport à l'autre avec==
.la source
!
,if
et?..:
ont en commun, c'est qu'ils appellent laToBoolean
fonction 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 estfalse
, mais avec!!
, il esttrue
» , mais ne comprends pas le concept sous - jacent. Deux autres points: 1)v ? true : false
est juste une façon verbeuse de!!v
. 2) renvoietypeof
toujours une chaîne non vide, ce qui est vrai.typeof null
outypeof undefined
spécifiquement. Vous pourriez simplement dire que les chaînes non vides sont véridiques.document.all
c'est aussi de la falsification .x == false
appelleraToNumber(x)
ce qui est très différent deToBoolean(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: DN'oubliez pas la chaîne non vide
"false"
qui évalue àtrue
la source
:-)
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.
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:
L'extrait de code ci-dessus s'imprime à nouveau
I am a falsy value
.la source
0
,0x0
,0.0
Et0.00
sont juste différents littéraux pour la même valeur à virgule flottante IEEE-754 64 bits zéro.Outre le sujet, depuis ES2020, nous avons une nouvelle valeur qui est fausse, c'est BigInt zéro (0n):
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).
la source