Existe-t-il un opérateur de coalescence nul en Javascript?
Par exemple, en C #, je peux faire ceci:
String someString = null;
var whatIWant = someString ?? "Cookies!";
La meilleure approximation que je puisse trouver pour Javascript utilise l'opérateur conditionnel:
var someString = null;
var whatIWant = someString ? someString : 'Cookies!';
Ce qui est sorta icky à mon humble avis. Puis-je faire mieux?
javascript
operators
null-coalescing-operator
null-coalescing
Daniel Schaffer
la source
la source
x ?? y
syntaxe est maintenant dans l'état de proposition de l'étape 1 - coalescencex ?? y
) et l'opérateur de chaînage facultatif (user.address?.street
) sont maintenant tous les deux à l'étape 4. Voici une bonne description de ce que cela signifie: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Réponses:
Mise à jour
JavaScript prend désormais en charge l' opérateur de coalescence nul (??) . Il renvoie son opérande de droite lorsque son opérande de gauche est
null
ouundefined
, et renvoie sinon son opérande de gauche.Veuillez vérifier la compatibilité avant de l'utiliser.
L'équivalent JavaScript de l'opérateur de coalescence nul C # (
??
) utilise un OU logique (||
):Il y a des cas (clarifiés ci-dessous) où le comportement ne correspondra pas à celui de C #, mais c'est la manière générale et laconique d'attribuer des valeurs par défaut / alternatives en JavaScript.
Clarification
Quel que soit le type du premier opérande, si la conversion en un résultat booléen entraîne
false
, l'affectation utilisera le deuxième opérande. Méfiez-vous de tous les cas ci-dessous:Ça signifie:
la source
||
renvoie la première valeur "truey" ou la dernière valeur "falsey" (si aucune ne peut être évaluée comme vraie) et cela&&
fonctionne dans le sens inverse: renvoyer la dernière valeur truey ou la première valeur falsey.var whatIWant = new Number(0) || 42; // is Number {[[PrimitiveValue]]: 0} var whatIWant = new String("") || "a million bucks"; // is String {length: 0, [[PrimitiveValue]]: ""}
var value = myObj && myObj.property || ''
retombera''
si myObj ou myObj.property est faux.cette solution fonctionne comme la fonction de fusion SQL, elle accepte n'importe quel nombre d'arguments et retourne null si aucun d'entre eux n'a de valeur. Il se comporte comme le C # ?? dans le sens où "", false et 0 sont considérés comme NON NULS et comptent donc comme des valeurs réelles. Si vous venez d'un arrière-plan .net, ce sera la solution de sensation la plus naturelle.
la source
for(var i in arguments)
ordonnance d'itération ne garantit pas, selon MDN . Voir aussi Pourquoi la boucle For… In de JavaScript n'est-elle pas recommandée pour les tableaux? et Pourquoi l'utilisation de «for… in» avec l'itération du tableau est-elle une si mauvaise idée? .Oui, ça arrive bientôt. Voir la proposition ici et l' état de mise en œuvre ici .
Cela ressemble à ceci:
Exemple
la source
x ?? y
) et l'opérateur de chaînage facultatif (user.address?.street
) sont maintenant tous les deux à l'étape 4. Voici une bonne description de ce que cela signifie: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Si
||
le remplacement des C #??
n'est pas suffisant dans votre cas, car il avale des chaînes vides et des zéros, vous pouvez toujours écrire votre propre fonction:la source
false
si (strictement) nulle / non définie ettrue
autrement - en utilisant cela avec un logique ou; il pourrait être plus lisible que de nombreux appels de fonctions imbriquées. par exemple,$N(a) || $N(b) || $N(c) || d
est plus lisible que$N($N($N(a, b), c), d)
.if .. return .. else ... return
est le cas parfait pour un ternaire.return (value === null || value === void 0) ? ifnull : value;
Personne n'a mentionné ici le potentiel pour
NaN
, qui - pour moi - est également une valeur nulle. J'ai donc pensé ajouter mes deux cents.Pour le code donné:
Si vous deviez utiliser l'
||
opérateur, vous obtenez la première valeur non fausse:Si vous utilisez la méthode de fusion standard, telle que publiée ici , vous obtiendrez
c
, qui a la valeur:NaN
Aucun de ces éléments ne me semble juste. Dans mon propre petit monde de logique de fusion, qui peut différer de votre monde, je considère undefined, null et NaN comme étant tous "null-ish". Donc, je m'attendrais à revenir
d
(zéro) de la méthode de fusion.Si le cerveau de quelqu'un fonctionne comme le mien et que vous souhaitez l'exclure
NaN
, cette méthode accomplira cela:Pour ceux qui veulent un code aussi court que possible, et qui ne se soucient pas d'un petit manque de clarté, vous pouvez également l'utiliser comme suggéré par @impinball. Cela profite du fait que NaN n'est jamais égal à NaN. Vous pouvez en savoir plus ici: Pourquoi NaN n'est-il pas égal à NaN?
la source
typeof
+num.toString() === 'NaN'
est redondant), stockez l'argument actuel dans une variable au lieu dearguments[i]
.!== 'number'
chèque car j'ai déjà évalué que ce n'était pasnull
ouundefined
, mais cela a l'avantage d'être très clair pour quiconque lit ce code et la condition fonctionnera indépendamment de l'ordre. Vos autres suggestions raccourcissent légèrement le code, je vais donc les utiliser.arg !== arg
, mais vous en avez besoinarg === arg
... alors ça marche. Cependant, cela a l'inconvénient d'être très peu clair sur ce que vous faites ... nécessite un commentaire dans le code pour éviter d'être supprimé par la prochaine personne qui passe par le code et pense quearg === arg
c'est redondant ... mais je vais le mettre en place en tous cas.méfiez-vous de la définition spécifique JavaScript de null. il existe deux définitions de «aucune valeur» en javascript. 1. Null: lorsqu'une variable est nulle, cela signifie qu'elle ne contient aucune donnée, mais la variable est déjà définie dans le code. comme ça:
dans ce cas, le type de votre variable est en fait Object. Essaye-le.
Non défini: lorsqu'une variable n'a pas été définie auparavant dans le code, et comme prévu, elle ne contient aucune valeur. comme ça:
si tel est le cas, le type de votre variable est «non défini».
notez que si vous utilisez l'opérateur de comparaison de conversion de type (==), JavaScript agira de la même manière pour ces deux valeurs vides. pour les distinguer, utilisez toujours l'opérateur de comparaison de type strict (===).
la source
var u = undefined;
Après avoir lu votre clarification, la réponse de @Ates Goral explique comment effectuer la même opération que vous effectuez en C # en JavaScript.
La réponse de @ Gumbo fournit le meilleur moyen de vérifier la nullité; cependant, il est important de noter la différence par
==
rapport===
à JavaScript, en particulier en ce qui concerne les problèmes de vérification deundefined
et / ounull
.Il y a un très bon article sur la différence en deux termes ici . Fondamentalement, sachez que si vous utilisez à la
==
place de===
, JavaScript va essayer de fusionner les valeurs que vous comparez et de renvoyer le résultat de la comparaison après cette coalescence.la source
Notez que la
create-react-app
chaîne d' outils de React prend en charge la fusion nulle depuis la version 3.3.0 (publiée le 5.12.2019) . D'après les notes de version:Cela dit, si vous utilisez la version
create-react-app
3.3.0+, vous pouvez commencer à utiliser l'opérateur null-coalesce dès aujourd'hui dans vos applications React.la source
Oui, et sa proposition est maintenant à l' étape 4 . Cela signifie que la proposition est prête à être incluse dans la norme ECMAScript officielle. Vous pouvez déjà l'utiliser dans les versions de bureau récentes de Chrome, Edge et Firefox, mais nous devrons attendre un peu plus longtemps jusqu'à ce que cette fonctionnalité atteigne la stabilité entre les navigateurs.
Jetez un œil à l'exemple suivant pour illustrer son comportement:
L'exemple précédent équivaut à:
Notez que nullish coalescent sera pas menace falsy les valeurs de la façon dont l'
||
opérateur a fait (il vérifie uniquementundefined
ounull
valeurs), d' où l'extrait suivant agira comme suit:Pour les utilisateurs de TypesScript, à partir de TypeScript 3.7 , cette fonctionnalité est également disponible maintenant.
la source
Nous espérons qu'il sera bientôt disponible en Javascript, car il est en phase de proposition à partir d'avril 2020. Vous pouvez surveiller l'état ici pour la compatibilité et le support - https://developer.mozilla.org/en-US/docs/Web/ JavaScript / Référence / Opérateurs / Nullish_coalescing_operator
Pour les personnes utilisant Typescript, vous pouvez utiliser l' opérateur de coalescence nulle de Typescript 3.7
De la documentation -
la source
Ok une bonne réponse
Existe-t-il en JavaScript? Oui. MAIS. Il est actuellement en date du 2020-02-06 au stade 3 et n'est pas encore pris en charge partout. Suivez le lien dans l'URL ci-dessous et accédez aux en-têtes "Spécifications" et "Compatibilité du navigateur" pour plus d'informations sur l'endroit où il se trouve.
Citation de: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
Vous voulez des exemples? Suivez le lien que j'ai posté, il a tout.
la source
Maintenant, il a un support complet dans la dernière version des principaux navigateurs comme Chrome, Edge, Firefox, Safari, etc. Voici la comparaison entre l'opérateur nul et l'opérateur coalescent nul.
la source