Une variable vide, ce n'est pas si simple qu'il y paraît. Il y a le rien qu'on a décidé, écrit noir sur blanc pour signaler qu'une case est libre, et le rien subi, celui d'une valeur que personne n'a renseignée. JavaScript distingue les deux.
Définition
null est une valeur primitive qui signifie l'absence volontaire de valeur. C'est un mot-clé réservé : il s'écrit tel quel, en minuscules, sans guillemets.
Tout tient dans un seul mot, volontaire. Personne ne trouve null par hasard : il est là parce que quelqu'un l'a écrit, ou parce qu'une fonction a choisi de le renvoyer pour dire qu'elle n'a rien trouvé.
let utilisateurConnecte = null; // personne pour l'instant
// Une recherche infructueuse renvoie null, pas une erreur
const bouton = document.querySelector(".introuvable");
console.log(bouton); // nullCes deux lignes résument l'usage courant : une valeur de départ à remplir plus tard, et une recherche qui n'a rien donné.
null face à undefined
Les deux valeurs disent qu'il n'y a rien, mais la première est une décision et la seconde un constat.
| Question | null | undefined |
|---|---|---|
| Qui l'a mis là | Vous, ou une fonction | Le moteur JavaScript |
| Ce que ça veut dire | Vide exprès | Jamais rempli |
Résultat de typeof | "object" | "undefined" |
Conservé par JSON.stringify | Oui | Non, la clé disparaît |
La dernière ligne compte dès qu'une donnée part vers un serveur. Envoyer { ville: null } demande d'effacer la ville. Envoyer { ville: undefined } n'envoie rien, et le serveur garde l'ancienne valeur.
Le bug le plus célèbre du langage
console.log(typeof null); // "object"
console.log(null instanceof Object); // falseLes deux lignes se contredisent, et la seconde a raison. C'est un défaut d'origine, hérité de la première implémentation du langage en 1995, jamais corrigé parce que le rectifier casserait trop de sites.
Conséquence pratique : typeof valeur === "object" ne suffit pas à reconnaître un objet. Il faut passer par Object (objet).prototype.toString.call(valeur).
Le tester proprement
Trois écritures reviennent, qui ne posent pas la même question.
const v = null;
v === null // true : uniquement null
v == null // true : null OU undefined
v ?? "secours" // "secours" : la valeur de repliLa troisième est celle du quotidien : la Coalescence des nuls (??) traite null et undefined ensemble, ce qui correspond presque toujours au besoin réel. Méfiez-vous en revanche des comparaisons d'ordre, qui convertissent null en zéro là où l'Égalité faible (==) ne le fait pas.
Questions fréquentes
Faut-il initialiser une variable à null ou la laisser vide ?
Mettez null quand le vide fait partie du scénario prévu, un utilisateur pas encore connecté par exemple. Laissez la variable non affectée quand elle sera remplie juste après : la première écriture documente une intention, la seconde un simple constat.
Pourquoi une API renvoie-t-elle null plutôt que d'omettre le champ ?
Parce que les deux réponses ne disent pas la même chose. Un champ présent à null affirme que l'information a été cherchée et n'existe pas. Un champ absent laisse le doute : peut-être n'a-t-il pas été demandé. Les API sérieuses gardent le champ.
Comment éviter l'erreur « cannot read properties of null » ?
Elle survient quand on lit une propriété sur une valeur vide. Le Chaînage optionnel (?.) la neutralise en une ligne : element?.textContent renvoie undefined au lieu de faire planter la page. Sur du code ancien, un if (element) fait le même travail.