web-dev-qa-db-fra.com

JavaScript "ne peut pas lire la propriété" de la barre non définie

J'ai une fonction qui prend 3 paramètres. Le problème que j'ai est l'un des paramètres est une propriété d'une valeur parfois indéfinie d'un objet (c'est-à-dire qu'il prend thing.foo.bar, et parfois thing.foo n'est pas défini, il ne peut donc pas accéder à la barre ).

Comment contourner cela? Dans la déclaration de la fonction, j'ai une vérification conditionnelle: if (!parameterName), mais le navigateur (Chrome) génère toujours une erreur indiquant qu'il ne peut pas lire la propriété bar de undefined.

26
Connor

Si la propriété d'un objet peut faire référence à un autre objet, vous pouvez tester que pour indéfini avant d'essayer d'utiliser ses propriétés:

if (thing && thing.foo)
   alert(thing.foo.bar);

Je pourrais mettre à jour ma réponse pour mieux refléter votre situation si vous montrez du code réel, mais peut-être quelque chose comme ceci:

function someFunc(parameterName) {
   if (parameterName && parameterName.foo)
       alert(parameterName.foo.bar);
}
38
nnnnnn

Vérification des composés:

   if (thing.foo && thing.foo.bar) {
      ... thing.foor.bar exists;
   }
9
Marc B

Vous pouvez vous protéger de l'une ou l'autre de ces deux façons:

function myFunc(thing) {
    if (thing && thing.foo && thing.foo.bar) {
        // safe to use thing.foo.bar here
    }
}

function myFunc(thing) {
    try {
        var x = thing.foo.bar;
        // do something with x
    } catch(e) {
        // do whatever you want when thing.foo.bar didn't work
    }
}

Dans le premier exemple, vous vérifiez explicitement tous les éléments possibles de la variable à laquelle vous faites référence pour vous assurer qu'elle est sûre avant de l'utiliser afin de ne pas obtenir d'exceptions de référence imprévues.

Dans le deuxième exemple, vous venez de mettre un gestionnaire d'exceptions autour d'elle. Vous accédez simplement à thing.foo.bar en supposant qu'il existe. S'il existe, le code s'exécute normalement. S'il n'existe pas, il lèvera une exception que vous intercepterez et ignorerez. Le résultat est le même. Si thing.foo.bar existe, votre code l'utilisant s'exécute. S'il n'existe pas, ce code ne s'exécute pas. Dans tous les cas, la fonction s'exécute normalement.

L'instruction if est plus rapide à exécuter. L'exception peut être plus simple à coder et à utiliser dans des cas complexes où il peut y avoir de nombreuses choses contre lesquelles vous pouvez vous protéger et votre code est structuré de sorte que le fait de lever une exception et de la gérer est un moyen propre d'ignorer l'exécution lorsqu'aucune donnée n'existe. . Les exceptions sont un peu plus lentes lorsque l'exception est levée.

7
jfriend00

Vérifiez-le avant de passer à votre fonction. Vous passeriez donc:

thing.foo ? thing.foo.bar : undefined
6
Petar Ivanov