2010-09-01 9 views
7

Je vois souvent du code JavaScript où une fonction peut prendre dans un objet « d'options » et l'utiliser comme:JavaScript chèque non défini

var name = typeof options.name !== 'undefined' ? options.name : "Bob"; 

Cela semble que ce serait équivalent à ce qui suit:

var name = options.name || "Bob"; 

Maintenant, je comprends que dans certaines situations, vous pouvez vous soucier que options.name est undefined vs null et cela me semble logique, mais je vois souvent cela dans des situations où cette distinction n'est pas nécessaire. Je crois que j'ai entendu dire que les gens écrivent du code comme ça à cause d'un bug dans Internet Explorer. Quelqu'un peut-il élaborer s'il vous plaît?

Répondre

6

Je ne suis pas au courant du bug dans IE, mais ces déclarations ne sont pas exactement équivalentes:

  • Le premier définit la variable name à la valeur par défaut "Bob" que lorsque options.name est undefined.

  • Le second paramètre la variable name à "Bob" chaque fois que options.name est falsifié. Cela peut être une chaîne vide, la valeur null, une valeur de 0, la valeur NaN, la valeur booléenne false et également undefined.

Par exemple, si options.name === 0, la première instruction sera la variable name-0, alors que la deuxième déclaration sera le mettre à "Bob".

2

J'espère que cela dépendra de ce que le développeur a l'intention de faire plutôt que de la convention à laquelle il souscrit. Dans de nombreux cas, le plus court name = options.name || "Bob"; pourrait vous donner des valeurs auxquelles vous ne vous attendez pas si vous n'êtes pas conscient de son comportement réel, car il contraint une valeur booléenne sur options.name. Dans d'autres cas, d'autres valeurs "falsifiées" seront impossibles (ou presque impossibles): si la valeur provient d'un élément de formulaire, par exemple, vous n'avez pas à vous soucier de undefined, null, false ou 0 - il devrait toujours être une chaîne tant que l'élément de formulaire existe - donc ce que ferait cette vérification est de s'assurer que le champ n'est pas une chaîne vide (bien que tout espace blanc puisse passer à travers). Un autre modèle similaire à options.name || "Bob" est if (options.name) {...}, qui présente les mêmes problèmes/avantages potentiels.