Je vais vous expliquer par exemple:
Opérateur Elvis (?:)
L '"opérateur Elvis" est un raccourci de l'opérateur ternaire de Java. Un exemple où cela est pratique consiste à renvoyer une valeur «sensible par défaut» si une expression se résout à faux ou null. Un exemple simple pourrait ressembler à ceci:
def gender = user.male ? "male" : "female" //traditional ternary operator usage
def displayName = user.name ?: "Anonymous" //more compact Elvis operator
Opérateur de navigation sécurisée (?.)
L'opérateur de navigation sécurisée est utilisé pour éviter une exception NullPointerException. En règle générale, lorsque vous avez une référence à un objet, vous devrez peut-être vérifier qu'il n'est pas nul avant d'accéder aux méthodes ou aux propriétés de l'objet. Pour éviter cela, l'opérateur de navigation sécurisée retournera simplement null au lieu de lever une exception, comme ceci:
def user = User.find( "admin" ) //this might be null if 'admin' does not exist
def streetName = user?.address?.street //streetName will be null if user or user.address is null - no NPE thrown
??
) en javascript? Tout ce que je trouve jusqu'à présent suggère que JS a seulement une fusion (falsey) (utilisation||
).Réponses:
Vous pouvez utiliser l'opérateur logique «OU» à la place de l'opérateur Elvis:
Par exemple
displayname = user.name || "Anonymous"
.Mais Javascript n'a actuellement pas les autres fonctionnalités. Je recommanderais de regarder CoffeeScript si vous voulez une syntaxe alternative. Il a une sténographie similaire à ce que vous recherchez.
Par exemple, l'opérateur existentiel
Raccourcis de fonction
Appel de fonction sexy
Il existe également des commentaires et des classes multilignes. Évidemment, vous devez le compiler en javascript ou l'insérer dans la page,
<script type='text/coffeescript>'
mais cela ajoute beaucoup de fonctionnalités :). L'utilisation<script type='text/coffeescript'>
n'est vraiment destinée qu'au développement et non à la production.la source
<script type='coffee/script>'
?<script type="text/coffeescript">
.x === undefined
.Je pense que ce qui suit est équivalent à l'opérateur de navigation sécurisée, bien qu'un peu plus long:
streetName
sera alors soit la valeur deuser.address.street
ouundefined
.Si vous voulez qu'il par défaut soit différent, vous pouvez le combiner avec le raccourci ci-dessus ou donner:
la source
Javascript de l' opérateur logique OR est un court-circuit et peut remplacer votre opérateur « Elvis »:
Cependant, à ma connaissance, il n'y a pas d'équivalent à votre
?.
opérateur.la source
||
pouvait l'utiliser de cette façon. Sachez que ce fusionneront non seulement lorsque l'expression estnull
, mais aussi quand il est indéfini,false
,0
ou la chaîne vide.""
ou0
peut être inattendu, cependant :)J'ai parfois trouvé l'idiome suivant utile:
peut être réécrit comme:
Cela profite du fait que l'obtention d'attributs inconnus sur un objet renvoie undefined, plutôt que de lever une exception comme il le fait sur
null
ouundefined
, nous remplaçons donc null et undefined par un objet vide avant de naviguer.la source
&&
méthode verbeuse . +1.je pense que lodash
_.get()
peut aider ici, comme dans_.get(user, 'name')
, et des tâches plus complexes comme_.get(o, 'a[0].b.c', 'default-value')
la source
Il existe actuellement un projet de spécification:
https://github.com/tc39/proposal-optional-chaining
https://tc39.github.io/proposal-optional-chaining/
Pour l'instant, cependant, j'aime utiliser lodash
get(object, path [,defaultValue])
ou dlvdelve(obj, keypath)
Mise à jour (au 23 décembre 2019):
la source
Mise à jour 2019
JavaScript a maintenant des équivalents à la fois pour l'opérateur Elvis et pour l'opérateur de navigation sécurisée.
Accès sécurisé aux propriétés
L' opérateur de chaînage facultatif (
?.
) est actuellement une proposition ECMAScript de stade 4 . Vous pouvez l' utiliser aujourd'hui avec Babel .L' opérateur logique ET (
&&
) est la «vieille» manière plus détaillée de gérer ce scénario.Fournir un défaut
L' opérateur coalescent nul (
??
) est actuellement une proposition ECMAScript de stade 3 . Vous pouvez l' utiliser aujourd'hui avec Babel . Il vous permet de définir une valeur par défaut si le côté gauche de l'opérateur est une valeur nulle ( / ).null
undefined
L' opérateur logique OR (
||
) est une solution alternative avec un comportement légèrement différent . Il vous permet de définir une valeur par défaut si le côté gauche de l'opérateur est faux . Notez que le résultatmyVariable3
ci - dessous diffère de celuimyVariable3
ci-dessus.la source
Pour les premiers, vous pouvez utiliser
||
. L'opérateur Javascript "logique ou", plutôt que de simplement renvoyer des valeurs vraies et fausses prédéfinies, suit la règle de renvoyer son argument gauche s'il est vrai, et autrement d'évaluer et de renvoyer son argument droit. Lorsque vous êtes uniquement intéressé par la valeur de vérité, cela fonctionne de la même manière, mais cela signifie également quefoo || bar || baz
renvoie le plus à gauche de foo, bar ou baz qui contient une vraie valeur .Cependant, vous n'en trouverez pas qui puisse distinguer faux de null, et 0 et une chaîne vide sont de fausses valeurs, alors évitez d'utiliser la
value || default
construction oùvalue
peut légitimement être 0 ou""
.la source
Oui il y a! 🍾
Le chaînage facultatif est à l'étape 4 et cela vous permet d'utiliser la
user?.address?.street
formule.Si vous ne pouvez pas attendre la sortie, installez
@babel/plugin-proposal-optional-chaining
et vous pouvez l'utiliser. Voici mes paramètres qui fonctionnent pour moi, ou lisez simplement l'article de Nimmo .la source
Voici un simple équivalent d'opérateur elvis:
la source
MISE À JOUR SEP 2019
Oui, JS prend désormais cela en charge. Le chaînage optionnel arrive bientôt sur v8 en savoir plus
la source
Ceci est plus communément appelé opérateur à coalescence nulle. Javascript n'en a pas.
la source
Vous pouvez obtenir à peu près le même effet en disant:
la source
J'ai une solution pour cela, adaptez-la à vos propres besoins, un extrait de l'une de mes bibliothèques:
fonctionne comme un charme. Profitez du moins de douleur!
la source
Vous pouvez rouler le vôtre:
Et utilisez-le comme ceci:
* le résultat n'est pas défini si l'un des éléments a, b, c ou d n'est pas défini.
la source
J'ai lu cet article ( https://www.beyondjava.net/elvis-operator-aka-safe-navigation-javascript-typescript ) et modifié la solution à l'aide de proxys.
Vous l'appelez comme ceci:
Le résultat sera indéfini pour une expression qui rencontre null ou indéfini le long de son chemin. Vous pouvez vous déchaîner et modifier le prototype d'objet!
la source
Saut très tard, il y a une proposition [1] pour le chaînage optionnel actuellement au stade 2, avec un plugin babel [2] disponible. Ce n'est actuellement dans aucun navigateur que je connaisse.
la source
Cela a été un problème pour moi pendant longtemps. J'ai dû trouver une solution qui peut être facilement migrée une fois que nous obtenons l'opérateur Elvis ou quelque chose.
C'est ce que j'utilise; fonctionne pour les tableaux et les objets
mettre cela dans le fichier tools.js ou quelque chose
exemple d'utilisation:
Eh bien, je sais que cela rend le code un peu illisible, mais c'est une solution simple et fonctionne très bien. J'espère que ça aide quelqu'un :)
la source
C'était une solution intéressante pour l'opérateur de navigation en toute sécurité utilisant un mixin ..
http://jsfiddle.net/avernet/npcmv/
la source
J'ai créé un package qui rend cela beaucoup plus facile à utiliser.
NPM jsdig Github jsdig
Vous pouvez gérer des choses simples comme et objet:
ou un peu plus compliqué:
la source
Personnellement j'utilise
et par exemple obtenir en toute sécurité:
la source
e({a:{b:{c:{d:'test'}}}}, 'a.b.c.d')
revientnull
.e = eval
,var a = eval('obj.a.b.c.d')
.eval
ne prend même pas un deuxième paramètre ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…