web-dev-qa-db-fra.com

Comment vérifier si une propriété existe sur un objet potentiellement indéfini?

Il y a donc des questions sur S.O. qui répondent comment vérifier si une propriété sur un objet existe. Exemple La réponse est d'utiliser Object.prototype.hasOwnProperty().

Cependant, comment vérifieriez-vous la propriété d'un objet potentiellement indéfini?

Si l'on tentait de vérifier directement si une propriété existe sur un objet non défini, ce serait une erreur de référence.

Sémantiquement, il semble préférable de vérifier directement le code if (obj.prop) //dosomething - il montre une intention plus claire. Y'a-t-il une quelconque façon de réussir cela? De préférence, existe-t-il une méthode Javascript intégrée pour faire une telle chose ou par convention?

Motif: Un package ajoute la propriété user.session.email - mais je vérifie si l'e-mail existe, pas la session, bien que la session puisse être inexistant.

Mise à jour: Beaucoup de réponses disent d'utiliser l'opérateur && pour court-circuiter. Je suis conscient que c'est une solution possible, mais ce n'est pas exactement ce qui est souhaité car il semble que nous travaillons AUTOUR de la syntaxe de l'objet JS - c'est-à-dire, bien que vous vouliez vraiment vérifier une propriété sur un objet, vous êtes obligé de vérifier si l'objet existe pour le faire.

Remarque pour être marqué comme fermé Pourquoi a-t-il été marqué comme fermé? Le lien qui suppose qu'il s'agit d'un doublon peut ne pas donner les mêmes réponses. Nous recherchons une solution meilleure et plus sémantique et le marquage comme fermé fait l'hypothèse que "imbriqué" === "potentiellement indéfini".

Cette question est incontestablement close: Puisque je ne peux pas répondre à ma propre question maintenant. Récemment, une proposition a été mise à l'étape 1 ici qui résoudrait ce problème. Encore une fois, la question veut une solution plus sémantique comme le montre la proposition.

21
steviejay

Si vous êtes certain que l'objet parent existe, alors:

if(obj && obj.key) {
  console.log(obj.key);
}

Cependant, cet exemple échouera misérablement si obj n'existe pas.

if (obj && obj.key) {
  console.log(obj.key);
}

... c'est pourquoi vous voudrez peut-être vérifier si l'objet est défini lors de la vérification de la propriété. Cela garantit que vous n'obtiendrez pas d'erreurs d'exécution si la condition est remplie et que l'objet de la propriété n'a pas été défini.

if(typeof obj != "undefined" && obj.key) { 
  console.log('you will not see this logged')
}

Vous remarquerez que l'exemple ci-dessus ne lève pas d'exception.

var obj = {key: 1};

if(typeof obj != "undefined" && obj.key) {
  console.log('we have obj! and val is : ' + obj.key)
}

Il s'agit d'une approche beaucoup plus défensive mais elle permet la portabilité. Si vous vouliez extraire votre logique dans un module pour la réutiliser, vous voudrez peut-être vérifier si l'objet existe également ou risquer des erreurs indésirables dans une zone de l'application qui ne vous concerne pas nécessairement.

20
Seth

si vous voulez vérifier à la fois obj et prop existe (comme vous l'avez mentionné dans vos commentaires), vous devez faire:

if(obj && obj.hasOwnProperty('some')) ou if(obj && obj.some)

Comme mentionné dans les commentaires, cela générera une erreur si obj n'est pas défini. Une meilleure comparaison serait:

if(typeof obj != "undefined" && obj.hasOwnProperty('some'))
10
Nishanth Matha