Lâopérateur de coalescence des nuls est écrit sous la forme de deux points dâinterrogation ??.
Comme il traite null et undefined de la même manière, nous utiliserons un terme spécial ici, dans cet article. Par souci de brièveté, nous dirons quâune expression est âdéfinieâ lorsquâelle nâest ni null ni undefined.
Le résultat de a ?? b est :
- si
aest défini, alorsa, - si
anâest pas défini, alorsb.
En dâautres termes, ?? renvoie le premier argument sâil nâest pas null/undefined. Sinon, le second.
Lâopérateur de coalescence des nuls nâest pas complètement nouveau. Câest juste une belle syntaxe pour obtenir la première valeur âdefinedâ des deux.
Nous pouvons réécrire result = a ?? b en utilisant les opérateurs que nous connaissons déjà , comme ceci :
result = (a !== null && a !== undefined) ? a : b;
Maintenant, il devrait être absolument clair ce que fait ??. Voyons où cela aide.
Le cas dâutilisation courant de ?? est de fournir une valeur par défaut.
Par exemple, nous affichons ici user si sa valeur nâest pas null/undefined, sinon Anonymous :
let user;
alert(user ?? "Anonymous"); // Anonymous (user is undefined)
Voici lâexemple avec user attribué à un nom :
let user = "John";
alert(user ?? "Anonymous"); // John (user is not null/undefined)
Nous pouvons également utiliser une séquence de ?? pour sélectionner la première valeur dans une liste qui nâest pas null/undefined.
Disons que nous avons les données dâun utilisateur dans les variables firstName, lastName ou nickName. Tous peuvent être indéfinis, si lâutilisateur décide de ne pas entrer de valeurs correspondantes.
Nous aimerions afficher le nom dâutilisateur à lâaide de lâune de ces variables, ou afficher âAnonymeâ si toutes sont null/undefined.
Utilisons lâopérateur ?? pour cela :
let firstName = null;
let lastName = null;
let nickName = "Supercoder";
// affiche la première valeur définie :
alert(firstName ?? lastName ?? nickName ?? "Anonymous"); // Supercoder
Comparaison avec ||
Lâopérateur OR || peut être utilisé de la même manière que ??, comme il a été décrit dans le chapitre précédent.
Par exemple, dans le code ci-dessus, nous pourrions remplacer ?? par || et toujours obtenir le même résultat :
let firstName = null;
let lastName = null;
let nickName = "Supercoder";
// affiche la première valeur vraie :
alert(firstName || lastName || nickName || "Anonymous"); // Supercoder
Historiquement, lâopérateur OR || était là en premier. Il existe depuis le début de JavaScript, donc les développeurs lâutilisaient à de telles fins depuis longtemps.
Dâun autre côté, lâopérateur de coalescence des nuls ?? nâa été ajouté à JavaScript que récemment, et la raison en était que les gens nâétaient pas tout à fait satisfaits de ||.
La différence importante entre eux est que :
||renvoie la première valeur vraie.??renvoie la première valeur définie.
En dâautres termes, || ne fait pas la distinction entre false, 0, une chaîne vide " " et null/undefined. Ce sont tous les mêmes â des valeurs fausses. Si lâun de ceux-ci est le premier argument de ||, alors nous obtiendrons le deuxième argument comme résultat.
Dans la pratique cependant, nous pouvons vouloir utiliser la valeur par défaut uniquement lorsque la variable est null/undefined. Autrement dit, lorsque la valeur est vraiment inconnue/non définie.
Par exemple, considérez ceci :
let height = 0;
alert(height || 100); // 100
alert(height ?? 100); // 0
- Lâexpression
height || 100vérifie queheightest une valeur fausse, et câest0, elle est fausse en effet.- donc le résultat de
||est le deuxième argument,100.
- donc le résultat de
- Lâexpression
height ?? 100vérifie queheightestnull/undefined, et ce nâest pas le cas,- donc le résultat est
heightâtel quelâ, câest-Ã -dire0.
- donc le résultat est
En pratique, la hauteur zéro est souvent une valeur valide, qui ne doit pas être remplacée par la valeur par défaut. Alors ?? fait ce quâil faut.
Priorité
La priorité de lâopérateur ?? est la même que celle de ||. Elle est égale à 3 dans le tableau MDN.
Cela signifie que, tout comme ||, lâopérateur de coalescence des nuls ?? est évalué avant = et ?, mais après la plupart des autres opérations, telles que +, *.
Nous devrons donc peut-être ajouter des parenthèses dans des expressions comme celle-ci :
let height = null;
let width = null;
// important : utilisez des parenthèses
let area = (height ?? 100) * (width ?? 50);
alert(area); // 5000
Sinon, si nous omettons les parenthèses, alors que * a une priorité plus élevée que ??, il sâexécuterait en premier, conduisant à des résultats incorrects.
// sans parenthèses
let area = height ?? 100 * width ?? 50;
// ...fonctionne de cette façon (pas ce que nous voulons) :
let area = height ?? (100 * width) ?? 50;
En utilisant ?? avec && ou ||
Pour des raisons de sécurité, JavaScript interdit dâutiliser ?? avec les opérateurs && et ||, à moins que la priorité ne soit explicitement spécifiée entre parenthèses.
Le code ci-dessous déclenche une erreur de syntaxe :
let x = 1 && 2 ?? 3; // Syntax error
La limitation est sûrement discutable, mais elle a été ajoutée à la spécification du langage dans le but dâéviter les erreurs de programmation, quand les gens commencent à passer de || à ??.
Utilisez des parenthèses explicites pour la contourner :
let x = (1 && 2) ?? 3; // fonctionne
alert(x); // 2
Résumé
-
Lâopérateur de coalescence des nuls
??fournit un moyen court de choisir une valeur âdéfinieâ à partir dâune liste.Il est utilisé pour attribuer des valeurs par défaut aux variables :
// configurer height = 100, si height est null ou undefined height = height ?? 100; -
Lâopérateur
??a une priorité très faible, un peu plus élevée que?et=, pensez donc à ajouter des parenthèses lors de son utilisation dans une expression. -
Il est interdit de lâutiliser avec
||ou&&sans parenthèses explicites.
Commentaires
<code>, pour plusieurs lignes â enveloppez-les avec la balise<pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepenâ¦)