143 votes

Opérateur ternaire abrégé JavaScript

Je sais qu'en PHP 5.3 au lieu d'utiliser cette syntaxe redondante avec l'opérateur ternaire :

startingNum = startingNum ? startingNum : 1

...nous pouvons utiliser une syntaxe abrégée pour nos opérateurs ternaires, si elle s'applique :

startingNum = startingNum ?: 1

Et je connais l'opérateur ternaire en JavaScript :

startingNum = startingNum ? startingNum : 1

...mais y a-t-il une abréviation ?

229voto

Brad Christie Points 58505
var startingNumber = startingNumber || 1;

Quelque chose comme ça que vous recherchez, où cela est par défaut si non défini?

var foo = bar || 1; // 1
var bar = 2;
foo = bar || 1;     // 2

À propos, cela fonctionne pour de nombreux scénarios, y compris les objets:

var foo = bar || {}; // sécurise un objet est assigné lorsque bar est absent

2 votes

Merci! Tu as bien réussi. En fait, j'utilise un objet dans cette instance. :)

21 votes

Pour ceux qui se posent la question, cela fonctionne parce que l'opérateur || de JS ne renvoie pas vrai ou faux, il renvoie la première valeur 'truthy'. Supposons que vous ayez val0 et val1 comme undefined, et que val2 soit 2, val3 soit 3. val0 || val1 || val2 || val3 renverra 2, car c'est la première valeur 'truthy'.

2 votes

N'est-ce pas là un anti-pattern? Et si vous passez 0 ou une chaîne vide, l'expression 'OU' le sautera et utilisera la valeur par défaut là où vous vouliez réellement 0 ou une chaîne vide.

33voto

Adam Rackis Points 45559

|| renverra la première valeur truthy qu'elle rencontre, et peut donc être utilisée comme un opérateur de fusion, similaire à celui de C# ??

startingNum = startingNum || 1;

0 votes

J'aime davantage votre explication que les autres

0 votes

Il vaut également la peine de noter qu'il renvoie également la dernière valeur si aucune n'est vraie, ce qui est pratique pour revenir à un type connu, par exemple stringOrUndefinedVar || ''.

13voto

Josh Vanyo Points 49

Avec l'ajout de l'ES2020 :

Nouveau avec Nullish Coalescence : const difficulté = var?.nest[i]?.prop ?? false

Ancienne opération : const difficulté = var.nest[i].prop ? var.nest[i].prop : false

Le point d'interrogation avant la propriété vérifiera d'abord si l'objet existe (si vous n'êtes pas sûr : comme dans les données de l'API) et, s'il manque un objet, il renverra undefined

Le ?? vérifie si la valeur à gauche est null ou undefined et, si c'est le cas, renverra une valeur fournie à droite.

12voto

Tadeck Points 37046

Oui, il y a :

var startingNum = startingNum || 1;

En général, expr1 || expr2 fonctionne de la manière suivante (comme mentionné dans la documentation):

Retourne expr1 s'il peut être converti en true; sinon, retourne expr2. Ainsi, lorsqu'utilisé avec des valeurs Boolean, || retourne true si l'un des opérandes est true; si les deux sont false, retourne false.

0 votes

N'est-il pas plus correct de dire si a est truthy vs. si a est évalué à vrai ?

3 votes

@JaredPar: Pour éviter toute ambiguïté, j'ai remplacé ma explication détaillée originale par celle du Mozilla Developer Network. Elle devrait être moins ambiguë.

6voto

user3336882 Points 11

Dans la plupart des navigateurs modernes, vous pouvez maintenant utiliser :

startingNum ??= 1;

Cela ne changera que si startingNum est null ou undefined.

Voir : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_nullish_assignment

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X