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.
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);
}
Vérification des composés:
if (thing.foo && thing.foo.bar) {
... thing.foor.bar exists;
}
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.
Vérifiez-le avant de passer à votre fonction. Vous passeriez donc:
thing.foo ? thing.foo.bar : undefined