Existe-t-il un null
opérateur d'accès aux propriétés -safe (propagation / existence nulles) dans ES6 (ES2015 / JavaScript.next / Harmony) comme ?.
dans CoffeeScript par exemple? Ou est-ce prévu pour ES7?
var aThing = getSomething()
...
aThing = possiblyNull?.thing
Ce sera à peu près comme:
if (possiblyNull != null) aThing = possiblyNull.thing
Idéalement, la solution ne doit pas attribuer (même undefined
) à aThing
if possiblyNull
isnull
if( obj?.nested?.property?.value )
au lieu deif( obj && obj.nested && obj.nested.property && obj.nested.property.value )
var appConfig = loadConfig(config, process.env); connect(appConfig.database);
àconnect(config)
. Vous pouvez passer un objet beaucoup plus simple à laconnect
place de passer l'ensembleconfig
objet, vous pouvez utiliserconf.username
, auconf.password
lieu d'essayer quelque chose commeconfig[process.env]?.database?.username
,config[process.env]?.database?.password
. Référence: Law of Demeter .loadConfig
l'exemple ci-dessus), vous pouvez faire des hypothèses sur l'existence de propriétés et ignorer la vérification des valeurs nulles dans d'innombrables zones de votre application.Réponses:
Mise à jour (2020-01-31): Il semble que les gens trouvent toujours ceci, voici l'histoire actuelle:
Mise à jour (01/08/2017): Si vous souhaitez utiliser un plugin officiel, vous pouvez essayer la version alpha de Babel 7 avec la nouvelle transformation. Votre kilométrage peut varier
https://www.npmjs.com/package/babel-plugin-transform-optional-chaining
Original :
Une fonctionnalité qui accomplit qui est actuellement à l'étape 1: Chaînage facultatif.
https://github.com/tc39/proposal-optional-chaining
Si vous souhaitez l'utiliser aujourd'hui, il existe un plugin Babel qui accomplit cela.
https://github.com/davidyaha/ecmascript-optionals-proposal
la source
street = user.address?.street
serait misstreet
en tout cas?Street
Je pense qu'il serait attribuéundefined
. Mais au moins, cela ne reviendrait pas à essayer d'accéder aux propriétés sur undefined.=
, il semble que cela ne soit pas pris en charge dans la spécification officielle actuellement. github.com/tc39/proposal-optional-chaining#not-supportedCe n'est pas aussi beau que le?. opérateur, mais pour obtenir un résultat similaire, vous pouvez faire:
Puisque
null
etundefined
sont tous les deux des valeurs fausses ( voir cette référence ), la propriété après l'&&
opérateur n'est accessible que si le précédent n'est pas nul ou indéfini.Vous pouvez également écrire une fonction comme celle-ci:
Usage:
Ou, avec une valeur de repli:
la source
!(user && user.address && user.address.postcode)
:)foo && foo.bar && foo.bar.quux ...
dans une grande base de code, c'est moche et ajoute beaucoup de complexité qu'il vaut mieux éviter._get<T>(func: () => T, fallbackValue?: T) :T
user.address.postcode
n'est pas défini,_try(() => user.address.postcode, "")
retournera à laundefined
place de""
. Le code_try(() => user.address.postcode, "").length
lèvera donc une exception.Non. Vous pouvez utiliser lodash # get ou quelque chose comme ça pour cela en JavaScript.
la source
lodash.get
est légèrement différent en ce qu'il ne peut évidemment pas faire d'assignation conditionnelle.Alternative à la vanille pour un accès sécurisé à la propriété
L'affectation conditionnelle la plus concise serait probablement celle-ci
la source
possiblyNull
n'est pas défini /null
?||=
(((a.b || {}).c || {}).d || {}).e
. Mais plus précis ce serait((((a || {}).b || {}).c || {}).d || {}).e
Non, il n'y a pas d'opérateur de propagation nul dans ES6. Vous devrez suivre l'un des modèles connus .
Vous pouvez cependant utiliser la déstructuration:Il y a beaucoup de discussions (par exemple ceci ) pour ajouter un tel opérateur dans ES7, mais aucune n'a vraiment décollé.
la source
aThing = possiblyNull.thing
null
. Vous devrez fournir une valeur par défaut, à peu près comme ce modèle mais avec une syntaxe plus déroutante.En parcourant la liste ici , il n'y a actuellement aucune proposition pour ajouter une traversée sûre à Ecmascript. Donc, non seulement il n'y a pas de bon moyen de le faire, mais cela ne sera pas ajouté dans un avenir prévisible.
la source
la source
Chaînage
?.
et coalescence nul en option??
Vous pouvez maintenant utiliser directement en
?.
ligne pour tester en toute sécurité l'existence. Tous les navigateurs modernes le prennent en charge.??
peut être utilisé pour définir une valeur par défaut si non définie ou nulle.Si une propriété existe,
?.
passe à la vérification suivante ou renvoie la valeur valide. Toute panne sera immédiatement court-circuitée et retournéeundefined
.Pour garantir une valeur définie par défaut, vous pouvez utiliser
??
. Si vous avez besoin de la première valeur de vérité, vous pouvez utiliser||
.Si vous ne cochez pas de cas, la propriété de gauche doit exister. Sinon, il lèvera une exception.
?.
Support du navigateur - 78%, juillet 2020??
Prise en charge du navigateur - 78%Documentation Mozilla
-
Affectation logique nulle, solution 2020+
De nouveaux opérateurs sont actuellement ajoutés aux navigateurs
??=
,||=
et&&=
. Ils ne font pas tout à fait ce que vous recherchez, mais pourraient conduire au même résultat en fonction de l'objectif de votre code.??=
vérifie si le côté gauche est indéfini ou nul, court-circuit s'il est déjà défini. Sinon, le côté gauche reçoit la valeur du côté droit.||=
et&&=
sont similaires, mais basés sur les opérateurs||
et&&
.Exemples de base
Exemples d'objets / de tableaux
Browser Support Juillet 2020 - .03%
Documentation Mozilla
la source
?.
et??
, et d'une solution à venir détaillée qui peut fonctionner pour votre situation. La meilleure solution actuelle est probablement de simplement faireaThing = possiblyNull?.thing ?? aThing
Une méthode sécurisée de deep get semble être un ajustement naturel pour underscore.js mais là, le problème est d'éviter la programmation de chaînes. Modifier la réponse de @ Felipe pour éviter la programmation de chaînes (ou au moins repousser les cas de bord vers l'appelant):
Exemple:
la source
_.get(obj, array_or_dotstring)
obj.a.b.c
vsobj['a']['b']['c']
keys
vient-il?Je sais que c'est une question JavaScript, mais je pense que Ruby gère cela de toutes les manières demandées, donc je pense que c'est un point de référence pertinent.
.&
,try
Et && ont leurs points forts et les pièges potentiels. Un bon aperçu de ces options ici: http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/TLDR; La conclusion des rubisistes
dig
est à la fois plus facile pour les yeux et une garantie plus forte qu'une valeur ounull
sera attribuée.Voici une implémentation simple dans TypeScript:
Cela peut être utilisé pour n'importe quelle profondeur d'imbrication et gère les fonctions.
L'
try
approche est également agréable à lire dans JS, comme indiqué dans les réponses précédentes. Il ne nécessite pas non plus de bouclage, ce qui est un inconvénient de cette implémentation.la source
Je pensais que cette question avait besoin d'un peu de rafraîchissement pour 2018. Cela peut être fait bien sans aucune bibliothèque
Object.defineProperty()
et peut être utilisé comme suit:Je considère cela comme sûr (et js-éthique) en raison des définitions
writeable
et desenumerable
définitions maintenant disponibles pour ladefineProperty
méthode deObject
, comme documenté dans MDNdéfinition de fonction ci-dessous:
J'ai mis en place un jsBin avec une sortie de console pour le démontrer. Notez que dans la version jsBin, j'ai également ajouté une exception personnalisée pour les valeurs vides. Ceci est facultatif, et je l'ai donc laissé en dehors de la définition minimale ci-dessus.
Les améliorations sont les bienvenues
la source