Un if en JavaScript n'attend pas un booléen. Il accepte n'importe quelle valeur et la convertit lui-même en vrai ou en faux. C'est confortable au début, et c'est la source d'une famille entière de bogues difficiles à voir.
Le cas typique : un compteur qui vaut 0 disparaît de l'affichage, alors que 0 est une valeur parfaitement valide. Comprendre truthy et falsy, c'est arrêter de se faire piéger par ce genre de disparition.
Définition
Une valeur est dite falsy si le langage la considère comme fausse dans un contexte booléen, et truthy dans le cas contraire. La liste des valeurs falsy est courte et fermée : tout le reste est truthy.
| Valeur falsy | Ce qu'elle représente |
|---|---|
false | Le booléen false lui-même |
0 et -0 | Le zéro numérique |
0n | Le zéro en BigInt |
"" | La chaîne vide |
null | L'absence volontaire de valeur |
undefined | La valeur jamais renseignée |
NaN | Le résultat d'un calcul impossible |
Il n'y en a pas d'autres. Un tableau vide est truthy, un objet vide est truthy, la chaîne "0" est truthy, la chaîne "false" aussi.
console.log(Boolean(0)); // false
console.log(Boolean("")); // false
console.log(Boolean([])); // true, un tableau vide reste un objet
console.log(Boolean({})); // true
console.log(Boolean("0")); // true, c'est une chaîne non videLà où ça se retourne contre vous
Le piège n'apparaît jamais sur des valeurs franches, mais quand une valeur légitime se trouve être falsy.
- Un compteur à zéro.
if (nombre)ignore le cas 0, qui est pourtant une réponse valide. - Un champ de formulaire vide. La chaîne vide est falsy, donc indistinguable d'un champ absent si on ne teste que sa présence.
- Une valeur de repli mal choisie.
prix || 49remplace un prix de 0 par 49, ce qui n'a jamais été l'intention.
Le dernier cas se règle avec la Coalescence des nuls (??), qui ne se déclenche que sur null et undefined et laisse passer 0 et la chaîne vide.
Tester proprement
La règle pratique tient en une distinction : demandez-vous si vous testez une présence ou une valeur.
const stock = 0;
if (stock) console.log("jamais affiché");
if (stock !== undefined) console.log("le stock est renseigné");
if (stock > 0) console.log("il reste des places");La condition courte reste légitime sur ce qui est réellement optionnel. Elle devient dangereuse dès que 0 ou la chaîne vide font partie des valeurs attendues. Sur une comparaison explicite, préférez l'Égalité stricte (===).
Questions fréquentes
Pourquoi un tableau vide est-il truthy ?
Parce que la conversion en booléen ne regarde pas le contenu, seulement le type. Tout objet, et un tableau en est un, est truthy sans exception. Pour tester un tableau vide, il faut donc passer par sa longueur avec tableau.length === 0, ce qui est aussi plus explicite à la relecture.
Comment convertir explicitement une valeur en booléen ?
Deux écritures existent et donnent exactement le même résultat : Boolean(valeur) et la double négation !!valeur. La première est plus lisible, la seconde plus courte et très répandue. Le terme Boolean (booléen) détaille les deux et les cas où cette conversion est réellement utile.
NaN est falsy, mais pourquoi est-il si difficile à détecter ?
Parce que NaN n'est égal à rien, pas même à lui-même : NaN === NaN vaut false. La seule méthode fiable est Number.isNaN(valeur). C'est une conséquence directe de la Coercition (conversion de type) silencieuse, qui produit ce NaN sans jamais lever d'erreur.