image auteur
Lucas BENTO-VERSACE 8min • 01-09-2022

Typescript - Différences entre null et undefined

Typescript - Différences entre null et undefined

Dans cet article, découvrez les différences entre null et undefined en Typescript.

Typescript (et JavaScript) a deux valeurs spéciales pour exprimer la nullité : null et undefined. Les deux représentent l'absence de toute valeur.

Mais pourquoi avoir 2 valeurs différentes pour exprimer l'absence de valeur ?

C'est ce que nous allons explorer dans cet article.

La différence entre undefined et null

La valeur undefined signifie que la valeur n'est pas affectée. Cela signifie qu'une variable a été déclarée mais n'a pas encore reçu de valeur. undefined est donc nécessairement une valeur acceptée pour des variables de n'importe quel type.

La valeur null indique que vous savez que le champ n'a pas de valeur, c'est une absence intentionnelle de valeur. On affecte null à une variable. null n'est généralement pas une valeur autorisée pour les variables typées.

Dans quel cas une variable est undefined ou null ?

undefined

Chaque fois que vous déclarez une variable sans l'initialiser avec une valeur, JavaScript l'initialise à la valeur undefined.

L'exemple suivant déclare la variable myVar. Nous ne lui avons donné aucune valeur initiale. Par défaut, elle prend donc la valeur undefined. Mais pour null, nous devons explicitement lui attribuer la valeur.

1
2
3
4
5
let myVar: any;              
console.log(myVar);         // undefined
 
myVar = null;               // Affectation de la valeur null 
console.log(myVar);         // Affiche 'null'
Affectation de valeur nulle

Voici quelques-uns des cas où une variable obtient automatiquement la valeur undefined :

  • Variable non initialisée
  • Argument de fonction facultatif qui n'a pas été fourni
  • Propriétée d'objet inexistante
  • Éléments de tableau inexistants

null

JavaScript n'attribuera jamais automatiquement null à aucune variable.

null doit être utilisé dans tous les cas où l'affectation est réalisée par le développeur. Ainsi, undefined ne représente que les cas où la variable n'a jamais eu de valeur.

Par exemple :

1
2
3
4
5
6
7
function findBob(names: string[]): string | null {
    const bob = names.find('Bob');
    if (bob) {
        return bob;
    }
    return null;
}
Exemple d'utilisation de null

Dans cet exemple, on renvoie la valeur null et non undefined. Car la valeur est intentionnellement nulle. On ne renvoie pas une variable non initialisée mais bien null pour signifier que Bob n'est pas dans la liste.

L'avantage est que le code qui utilisera un appel à cette fonction sera incité à prévoir le cas où null sera renvoyé.

On utilise null également pour supprimer une valeur, au lieu d'affecter undefined.

Les types undefined et null

Les valeurs undefined & null ont des types de donnée correspondants, nommés avec le même nom que la valeur . Le type de données de undefined est undefined et celui de null est null.

1
2
3
4
5
let a: undefined;         // a est une variable de type undefined
let b: null = null;       // b est une variable de type null
 
console.log(typeof(a));   // undefined
console.log(typeof(b));   // object
Typage de valeurs nulles

Vous pouvez vous demander pourquoi l'opérateur typeof renvoie 'object' pour une valeur nulle. Il s'agit en fait d'une erreur dans l'implémentation JavaScript d'origine, qui a ensuite été gardée pour éviter les régressions. Logiquement le type de null devrait être null.

Aujourd'hui, il est rationalisé que null est considéré comme un espace réservé pour un objet, même si, techniquement, il s'agit d'une valeur primitive.

Affectations de valeures nulles

À une variable typée

Si vous typez une variable comme étant un number (par exemple), vous ne pourrez pas lui affecter la valeur null. Mais elle pourra prendre la valeur undefined.

1
2
3
4
let myVar: number;             
console.log(myVar);         // La valeur est : undefined
 
myVar = null;               // TypeError: Type 'null' is not assignable to type 'number'.
null ne peut pas être assigné à une variable typé

Si l'on voulait autoriser myVar à prendre la valeur null, il faudrait la typer ainsi :

1
2
3
4
5
let myVar: number | null;             
console.log(myVar);         // La valeur est : undefined
 
myVar = null;
console.log(myVar);         // Affiche 'null'
Union avec le type null
Si vous désactivez l'option StrictNullCheck dans votre tsconfig, vous pourez affecter null à n'importe quel type de variable.

À une variable typée undefined

La seule valeur que vous pouvez affecter à une variable undefined est undefined. Vous pouvez attribuer null uniquement si l'option StrictNullCheck est désactivée dans votre configuration TypeScript.

Toutes les autres valeurs telles que chaîne, objet, nombres, etc. ne sont pas autorisées.

1
2
3
4
5
6
7
8
9
10
11
let uVar: undefined;
 
// Autorisé
uVar = undefined;     // Ok
 
// Autorisé seulement si StrictNullCheck est désactivé
uVar = null;          // TypeError: Type 'null' is not assignable to type 'undefined'
 
// Non autorisé
uVar = 10;            // 10 is not assignable to type 'undefined'
uVar = {};            // {} is not assignable to type 'undefined'
TypeError : assignation de valeur à une variable undefined

À une variable typée null

Dans le cas d'une variable typée null, la seule valeur que vous pouvez lui attribuer est null. Vous pouvez également attribuer undefined si StrictNullCheck est désactivée.

1
2
3
4
5
6
7
8
9
10
11
let nVar: null;
 
// Autorisé
nVar = null;        // Ok
 
// Autorisé seulement si StrictNullCheck est désactivé
nVar = undefined;   // Type 'null' is not assignable to type 'null'.
 
// Non autorisé
nVar = 10;          // Type '10' is not assignable to type 'null'
nVar = {};           // Type '{}' is not assignable to type 'null'
TypeError : assignation de valeur à une variable null

Valeur fausse (falsy value)

null & undefined sont des valeurs fausses (falsy value) en JavaScript. C'est-à-dire que lorsque vous les utilisez dans une expression booléenne, ils sont équivalents à false.

1
2
3
4
5
let a = undefined;
let b = null;

if (!a) console.log('false');        // Affiche 'false'
if (!b) console.log('false');        // Affiche 'false'
undefined et null sont des falsy values

Opérateurs de comparaison entre null et undefined

La comparaison de null avec des résultats indéfinis donne des résultats différents selon que vous utilisez un vérificateur d'égalité == ou un vérificateur d'égalité strict ===.

null et undefined ne représentent aucune valeur, donc le vérificateur d'égalité == renvoie true. C'est parce que le vérificateur d'égalité ne vérifie pas le type de données.

1
2
console.log(null == undefined);      // true
console.log(null === undefined);     // false
Vérification d'égalité

Tous les autres opérateurs de comparaisons renverront false.

1
2
3
4
console.log(null > undefined);      // false
console.log(undefined > null);      // false
console.log(null >= undefined);     // false
etc.
Vérification d'inégalité

Conclusion

J'espère que cet article vous a aidé à bien comprendre les différences subtiles entre null et undefined.

N'hésitez pas à laisser un commentaire si vous avez une question ou une remarque !

Sources

Auteur

image auteur
Lucas BENTO-VERSACE Alternant chez Codewise / Étudiant en développement web lucas.bentoversace@ynov.com
"Alternant chez Codewise, passioné par l'informatique et les technologies depuis mon plus jeune âge. J'ai découvert le monde du web et depuis je ne m'en lasse pas ! Fan de jeux vidéos, de sports et de musiques. "