variable === undefined vs typeof variable === “undefined”
La jQuery Core lignes Directrices de Style proposons deux manières différentes afin de vérifier si une variable est définie.
- Variables Globales:
typeof variable === "undefined"
- Variables Locales:
variable === undefined
- Propriétés:
object.prop === undefined
Pourquoi jQuery utiliser une approche pour les variables globales et un autre pour les habitants et les propriétés?
- Je ne peux pas répondre à la question de savoir pourquoi JQuery serait d'utiliser les deux approches, mais Javascript intéressant bizarreries que veulent dire ces deux choses sont légèrement différentes. Il ne devrait pas la plupart du temps (c'est à dire si votre code est sain d'esprit), mais il existe des différences toutefois: Voir ici pour une écriture-up - wtfjs.com/2010/02/15/undefined-is-mutable
- Comme @Struppi souligné, jQuery ultrapériphériques de la fonction a un argument nommé indéfini. Dans jQuery,
foo === undefined
est de la vérification de la copie locale de l'indéfini au lieu de la global (de la fenêtre.undefined), qui peuvent avoir été modifiés par les fous de code. Le fait que l'indéfini est mutable est certainement intéressant de noter, et je suis heureux de l'avoir fait. (+1) - Lien actuel pour que l'article est wtfjs.com/wtfs/2010-02-15-undefined-is-mutable
Vous devez vous connecter pour publier un commentaire.
Pour les variables non déclarées,
typeof foo
sera de retour le littéral de chaîne"undefined"
, alors que le contrôle d'identitéfoo === undefined
déclencherait l'erreur "foo n'est pas défini".Pour les variables locales (qui vous savoir sont déclarées quelque part), une telle erreur se produit, d'où la vérification de l'identité.
typeof foo; // -> "undefined"
) à souligner c'est une chaîne et non pas la valeur primitiveundefined
.Je collerais à l'aide de
typeof foo === "undefined"
partout. Qui ne peut jamais se tromper.J'imagine que la raison pour laquelle jQuery recommande les deux différentes méthodes est qu'elles définissent leurs propres
undefined
variable dans la fonction jQuery code de vie, donc à l'intérieur de cette fonctionundefined
est à l'abri de la falsification de l'extérieur. J'imagine aussi que quelqu'un, quelque part, a comparé les deux approches différentes et découvert quefoo === undefined
est plus rapide et, par conséquent, décidé qu'il est le chemin à parcourir. [Mise à JOUR: comme mentionné dans les commentaires, la comparaison avecundefined
est également légèrement plus courte, ce qui pourrait être une considération.] Cependant, le gain en situations pratiques serez tout à fait négligeable: cette case ne sera jamais, jamais être une sorte de goulot d'étranglement, et ce que vous perdez est significatif: l'évaluation d'une propriété d'un objet hôte de comparaison peuvent jeter une erreur alors qu'unetypeof
vérifier le sera jamais.Par exemple, le texte suivant est utilisé dans IE pour l'analyse XML:
Vérifier si elle a un
loadXML
méthode de sécurité:D'autre part:
Mise à JOUR
Un autre avantage de la
typeof
vérifier que j'ai oublié de mentionner que ça fonctionne aussi avec des variables non déclarées, qui lefoo === undefined
contrôle n'est pas, et, en fait, jette unReferenceError
. Grâce à @LinusKleen de me le rappeler. Par exemple:Ligne du bas: utilisez toujours le
typeof
vérifier.foo === undefined
, lorsqu'elle est réduite, c'est probablement quelque chose commef===u
, alors quetypeof foo === "undefined"
ne peut être réduite àtypeof f==="undefined"
.var u = "undefined"
et de le réduire àtypeof f==u
, ce qui améliore les choses, mais est encore plus grande.typeof
contre les variables non déclarées est un avantage. Si quelque chose, il vous permet de fautes de frappe échapper plus facilement, et je ne peux pas le voir lorsque tu avais réellement envie de vérifier le type de variables non déclarées.window.library === undefined
peut être utilisé (et lawindow
devrait probablement être explicite de toute façon).BOOM
surx.loadXml === undefined
?loadXml
n'est pas un membre dex
, droit?loadXML
un exemple qui illustre ce.undef
et en les comparant avectypeof f == undef
, c'est en fait la plus lente possible de la méthode parmi tous les inscrits. Pas une bonne idée! voir jsperfundefined
ces jours, mais pas à cause de problèmes de performances.!foo
, qui doit retourner une valeur de type Boolean.Encore une autre raison pour l'utilisation de la typeof-variante:
undefined
peut être redéfini.Le résultat de
typeof variable
ne peut pas.Mise à jour: notez que ce n'est pas le cas dans l'ES5 il y a le mondial
undefined
est un non-configurable, non inscriptible propriété:Mais encore il peut être masqué par une variable locale:
ou d'un paramètre:
undefined
propriété ne peut pas être redéfinie dans l'ES5, mais encore peut être obscurci par une variable locale.void 0
est plus court et plus sûr.Parce que
undefined
n'est pas toujours déclarés, mais jQuery déclareundefined
dans sa fonction principale. Ils utilisent donc la sécuritéundefined
en interne, mais à l'extérieur, ils utilisent letypeof
de style pour être en sécurité.Qui est intéressé par le gain de performance de
variable === undefined
, peut prendre un coup d'oeil ici, mais il semble être un chrome de l'optimisation, seulement.Pour les variables locales, en contrôlant avec
localVar === undefined
va fonctionner, car ils doivent avoir été défini dans la portée locale ou ils ne seront pas considérés comme locaux.Pour les variables qui ne sont pas locaux et n'est défini nulle part, la vérification de
someVar === undefined
va jeter l'exception: Uncaught ReferenceError: j n'est pas définiVoici un code qui permettra de clarifier ce que je dis ci-dessus. S'il vous plaît prêter attention aux commentaires en ligne pour plus de clarté.
Si nous appelons le code ci-dessus comme ceci:
La sortie serait celui-ci:
Si nous appelons le code ci-dessus comme celui-ci (avec une valeur quelconque en fait):
La sortie sera:
Lorsque vous faites la case comme ceci:
typeof x === 'undefined'
, vous êtes à la demande, en substance, ceci: Veuillez vérifier si la variablex
existe (a été défini) quelque part dans le code source. (plus ou moins). Si vous connaissez le C# ou Java, ce type de vérification n'est jamais fait parce que, si elle n'existe pas, il ne compile pas.<== Tripoter Moi ==>
Résumé:
Quand à la portée globale en fait, nous voulons retourner true si la variable n'est pas déclarée ou a la valeur
undefined
:JS:
Parce que dans une portée mondiale, nous ne sommes pas sûr à 100% si une variable est déclarée, cela pourrait nous donner un referenceError. Lorsque nous utilisons le
typeof
de l'opérateur sur la variable inconnue que nous n'obtenons pas ce problème lorsque la variable n'est pas déclarée:JS:
Cela est dû au fait que la
typeof
opérateur retourne la chaîneundefined
lorsqu'une variable n'est pas déclarée ou occupent actuellement la valeurundefined
qui est exactement ce que nous voulons.undefined
JS:
typeof a === 'undefined'
est plus rapide que d'a === 'undefined'
par environ 2 fois sur le nœud v6.9.1.undefined
lors de la deuxième partie, pas'undefined'