Menu
Français

null vs undefined en JavaScript : différences et usages

Comprendre ce qui distingue vraiment null de undefined en JavaScript, comment tester l'un ou l'autre, et lequel choisir dans votre propre code.

Deux façons de dire « rien »

La plupart des langages ont une seule valeur pour représenter l'absence. JavaScript en a deux : null et undefined. Leur comportement se ressemble assez pour embrouiller les débutants, et diffère juste assez pour piéger les développeurs aguerris. Comprendre la différence entre null et undefined en JavaScript mérite bien dix minutes de votre temps.

En résumé :

  • undefined, c'est ce que JavaScript vous renvoie quand quelque chose manque.
  • null, c'est ce que vous écrivez vous-même pour signaler « volontairement vide ».
index.js
Output
Click Run to see the output here.

Vous voyez le schéma : chaque undefined ci-dessus apparaît parce que JavaScript n'a pas trouvé de valeur. Le null, lui, est là parce que quelqu'un l'a écrit explicitement.

D'où vient undefined ?

undefined surgit dans une poignée de situations bien précises, toutes des variantes du même thème : « aucune valeur disponible ».

index.js
Output
Click Run to see the output here.

Dans tous les cas, JavaScript est allé chercher une valeur et n'a rien trouvé. undefined, c'est la façon qu'a le moteur de dire : « J'ai regardé, il n'y avait rien. »

Techniquement, tu peux affecter undefined toi-même (let x = undefined;), mais évite. Laisse-le jouer son rôle de signal : « JavaScript n'a rien trouvé. » Quand c'est toi qui prends la décision, utilise plutôt null.

D'où vient null en JavaScript

null n'apparaît jamais tout seul : il faut que quelqu'un l'ait écrit. C'est tout l'intérêt — c'est un marqueur intentionnel.

index.js
Output
Click Run to see the output here.

Les APIs du DOM utilisent beaucoup null : document.getElementById("missing") renvoie null, pas undefined, parce que le navigateur te dit explicitement « j'ai cherché, et la réponse est : aucun élément ». Pareil pour JSON.parse("null"), qui te donne null — le format JSON ne connaît tout simplement pas undefined.

Le modèle mental à retenir : undefined est l'absence par défaut, null est une absence choisie.

Le piège de typeof

Voilà le cas célèbre :

index.js
Output
Click Run to see the output here.

typeof null qui renvoie "object", c'est un bug datant de 1995 qu'on n'a jamais pu corriger sans casser des sites existants — du coup, il est resté là pour toujours. null n'est pas un objet : c'est une primitive, au même titre qu'undefined, les nombres, les chaînes ou les booléens. C'est simplement typeof qui ment à son sujet.

Conséquence concrète : typeof ne sert à rien pour détecter null. Il faut passer par une comparaison directe :

index.js
Output
Click Run to see the output here.

Ou, plus souvent, vérifier les deux d'un coup — voyons ça dans la section suivante.

Tester null ou undefined en JavaScript : l'astuce == null

La plupart du temps, on se fiche de savoir laquelle des deux valeurs absentes on a sous la main — on veut juste s'assurer qu'il y a bien quelque chose avant de s'en servir. L'idiome consacré, c'est l'égalité faible avec null :

index.js
Output
Click Run to see the output here.

value == null renvoie true uniquement pour null et undefined, et false pour tout le reste — y compris 0, "" et false, ce qui correspond généralement à ce qu'on veut. C'est l'unique cas où == est préférable à ===. Les linters le savent et tolèrent cette écriture.

Si vous préférez être explicite, value === null || value === undefined veut dire la même chose et se lit très clairement.

Les opérateurs nullish : ?? et ?.

Deux opérateurs ont été ajoutés au langage justement pour faciliter le travail avec null et undefined. Tous les deux traitent ces deux valeurs de la même manière et ignorent le reste.

Le coalescing nullish (??) fournit une valeur de repli uniquement si l'opérande de gauche vaut null ou undefined :

index.js
Output
Click Run to see the output here.

À comparer avec ||, qui remplacerait 0 par 3 puisque 0 est falsy. ?? est plus strict : il ne se déclenche que pour les deux valeurs nullish.

Le chaînage optionnel (?.) interrompt l'évaluation d'une chaîne et renvoie undefined dès qu'il tombe sur null ou undefined :

index.js
Output
Click Run to see the output here.

Les deux opérateurs existent précisément parce que la question « cette valeur est-elle nullish ? » revient sans arrêt. On les aborde plus en détail plus loin dans le cursus.

Les paramètres par défaut ne se déclenchent que pour undefined

Voici une règle subtile mais cruciale : les valeurs par défaut des paramètres ne s'activent que si l'argument vaut undefined, jamais null.

index.js
Output
Click Run to see the output here.

Passer null signifie « j'ai choisi explicitement de ne pas mettre de valeur », et c'est respecté tel quel. Si tu veux que null déclenche aussi la valeur par défaut, utilise ?? à l'intérieur de la fonction :

index.js
Output
Click Run to see the output here.

Cette distinction piège pas mal de monde. Les valeurs par défaut gèrent les arguments manquants ; ?? gère les arguments nullish.

JSON et l'absence d'undefined

JSON connaît null, mais pas undefined. Résultat : des surprises silencieuses au moment de sérialiser :

index.js
Output
Click Run to see the output here.

Le champ age a complètement disparu : JSON.stringify supprime purement et simplement les propriétés dont la valeur est undefined. À l'inverse, null est conservé, car JSON le prend en charge nativement. Faire un aller-retour d'un objet via JSON est d'ailleurs une façon courante de voir des propriétés undefined s'évaporer sans crier gare.

Dans les tableaux, undefined est converti en null :

index.js
Output
Click Run to see the output here.

Si tu construis le payload d'une API, préfère null à undefined pour les champs « sans valeur ». C'est le seul des deux qui survit au voyage.

Quand utiliser null et quand utiliser undefined

Voici une convention qui tient la route dans ton propre code :

  • Laisse undefined signifier « non fourni » — arguments manquants, variables non initialisées, propriétés absentes. Ne l'assigne jamais à la main.
  • Utilise null quand tu veux dire explicitement « c'est vide, et c'est voulu » : un utilisateur déconnecté, une option non sélectionnée, un champ de formulaire vidé.
  • Aux frontières de ton API, accepte les deux (avec == null ou ??), mais reste cohérent sur celui que tu produis.

Certains guides de style (dont celui de TypeScript) font carrément l'impasse sur null et n'utilisent que undefined. Ça se défend — une seule valeur, c'est plus simple que deux. Choisis une règle par projet et tiens-t'y partout.

La suite : la coercition de type

null et undefined se comportent chacun à leur manière quand JavaScript les convertit en nombres, en chaînes ou en booléens — Number(null) vaut 0, mais Number(undefined) donne NaN, et ce genre d'asymétrie provoque de vrais bugs. On attaque la coercition de type juste après, et une fois que tu auras les règles complètes en tête, beaucoup de bizarreries de JavaScript cesseront d'en être.

Questions fréquentes

Quelle est la différence entre null et undefined en JavaScript ?

undefined signifie qu'aucune valeur n'a encore été affectée : c'est ce que JavaScript renvoie pour une variable non initialisée, un argument manquant ou une propriété d'objet inexistante. null, lui, est une absence de valeur volontaire, que vous assignez vous-même. JavaScript ne produit jamais null tout seul — il faut l'écrire explicitement.

Comment tester null et undefined en une seule fois ?

Utilisez value == null. L'égalité faible considère que null et undefined sont égaux entre eux, mais à rien d'autre : x == null est donc vrai uniquement pour ces deux valeurs. C'est le seul cas où l'on préfère == à === sans se faire taper sur les doigts.

Pourquoi typeof null renvoie 'object' ?

C'est un bug qui traîne depuis la toute première version de JavaScript, et qu'on ne peut plus corriger sans casser la moitié du web. typeof null renvoie 'object' alors que null est bel et bien une primitive. Pour tester précisément null, comparez directement : value === null.

Faut-il utiliser null ou undefined dans son propre code ?

Laissez undefined représenter « rien n'a été fourni » et réservez null pour signaler « c'est volontairement vide ». Beaucoup de codebases (et le style guide TypeScript) évitent carrément null et se contentent d'undefined. L'essentiel : choisir une convention par projet et s'y tenir.

Apprendre à coder avec Coddy

COMMENCER