Truthy et falsy en JavaScript : les valeurs qui passent pour vraies

Truthy et falsy désignent les valeurs qui se comportent comme vraies ou fausses dans une condition, sans être des booléens.
3 min de lecture
Believemy logo

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 falsyCe qu'elle représente
falseLe booléen false lui-même
0 et -0Le zéro numérique
0nLe zéro en BigInt
""La chaîne vide
nullL'absence volontaire de valeur
undefinedLa valeur jamais renseignée
NaNLe 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.

JAVASCRIPT
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 vide


Là 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 || 49 remplace un prix de 0 par 49, ce qui n'a jamais été l'intention.
Bon à savoir

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.

JAVASCRIPT
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

Question

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.


Question

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.


Question

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.

Termes connexes

Découvrez notre glossaire JavaScript

Tous les mots de JavaScript expliqués simplement : mots-clés, objets natifs, méthodes, erreurs et concepts. Définitions claires et exemples qui tournent, pour apprendre et pour se dépanner.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.