Les directives de style de base de jQuery suggèrent deux façons différentes 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 utilise-t-il une approche pour les variables globales et une autre pour les variables locales et les propriétés?
javascript
jquery
undefined
Patrick McElhaney
la source
la source
foo === undefined
vérifie la copie locale d'undefined au lieu du global (window.undefined), qui peut avoir été modifiée par un code insensé. Le fait qu'un indéfini soit mutable mérite certainement d'être noté et je suis content que vous l'ayez fait. (+1)Réponses:
Pour les variables non déclarées,
typeof foo
retournera la chaîne littérale"undefined"
, tandis que le contrôle d'identitéfoo === undefined
déclencherait l'erreur "foo n'est pas défini" .Pour les variables locales (dont vous savez qu'elles sont déclarées quelque part), aucune erreur de ce type ne se produirait, d'où le contrôle d'identité.
la source
typeof foo; // -> "undefined"
) pour souligner qu'il s'agit d'une chaîne et non de la valeur primitiveundefined
.Je m'en tenir à utiliser
typeof foo === "undefined"
partout. Cela ne peut jamais se tromper.J'imagine que la raison pour laquelle jQuery recommande les deux méthodes différentes est qu'elles définissent leur propre
undefined
variable dans la fonction dans laquelle réside le code jQuery, donc dans cette fonctionundefined
est à l'abri de la falsification de l'extérieur. J'imagine également que quelqu'un quelque part a comparé les deux approches différentes et a découvert quefoo === undefined
c'était plus rapide et a donc décidé que c'était la voie à suivre. [MISE À JOUR: comme indiqué dans les commentaires, la comparaison avecundefined
est également légèrement plus courte, ce qui pourrait être une considération.] Cependant, le gain dans les situations pratiques sera tout à fait insignifiant: cette vérification ne sera jamais, jamais une sorte de goulot d'étranglement, et ce que vous perdez est important: l'évaluation d'une propriété d'un objet hôte pour comparaison peut générer une erreur alors qu'untypeof
vérifier ne le sera jamais.Par exemple, ce qui suit est utilisé dans IE pour analyser XML:
Pour vérifier s'il dispose d'une
loadXML
méthode en toute sécurité:D'autre part:
METTRE À JOUR
Un autre avantage du
typeof
contrôle que j'ai oublié de mentionner est qu'il fonctionne également avec des variables non déclarées, ce que lefoo === undefined
contrôle ne fait pas, et en fait, il génère unReferenceError
. Merci à @LinusKleen de me l'avoir rappelé. Par exemple:Conclusion: utilisez toujours le
typeof
chèque.la source
foo === undefined
, lorsqu'il est minimisé, ressemble probablement à quelque chosef===u
, alorstypeof foo === "undefined"
qu'il ne peut être réduit qu'àtypeof f==="undefined"
.var u = "undefined"
et le réduire àtypeof f==u
, ce qui améliore les choses mais est encore plus grand.typeof
contre les variables non déclarées soit un avantage. Si quoi que ce soit, cela permet aux fautes de frappe de passer plus facilement, et je ne vois pas quand vous voudriez réellement vérifier le type de variables non déclarées.Encore une autre raison d'utiliser la variante typeof:
undefined
peut être redéfinie.Le résultat de
typeof variable
ne peut pas.Mise à jour : notez que ce n'est pas le cas dans ES5 là où le global
undefined
est une propriété non configurable, non inscriptible:Mais il peut toujours être masqué par une variable locale:
ou paramètre:
la source
undefined
propriété globale ne peut pas être redéfinie dans ES5, mais peut toujours être masquée avec une variable locale.void 0
est plus court et plus sûr.Parce que
undefined
n'est pas toujours déclaré, mais jQuery déclareundefined
dans sa fonction principale. Ils utilisent donc laundefined
valeur de sécurité en interne, mais à l'extérieur, ils utilisent letypeof
style pour être en sécurité.la source
Les personnes intéressées par le gain de performances de
variable === undefined
, peuvent jeter un œil ici, mais il semble que ce soit une optimisation de chrome.la source
Pour les variables locales, la vérification avec
localVar === undefined
fonctionnera car elles doivent avoir été définies quelque part dans la portée locale ou elles ne seront pas considérées comme locales.Pour les variables qui ne sont pas locales et qui ne sont définies nulle part, la vérification lèvera une
someVar === undefined
exception: Uncaught ReferenceError: j n'est pas définiVoici un code qui clarifiera ce que je dis ci-dessus. Veuillez prêter attention aux commentaires intégrés pour plus de clarté .
Si nous appelons le code ci-dessus comme ceci:
La sortie serait la suivante:
Si nous appelons le code ci-dessus comme celui-ci (avec n'importe quelle valeur en fait):
La sortie sera:
Lorsque vous effectuez la vérification comme ceci:,
typeof x === 'undefined'
vous demandez essentiellement ceci: veuillez vérifier si la variablex
existe (a été définie) quelque part dans le code source. (plus ou moins). Si vous connaissez C # ou Java, ce type de vérification n'est jamais effectué car s'il n'existe pas, il ne se compilera pas.<== Fiddle Me ==>
la source
Résumé:
Quand à portée globale, nous voulons réellement retourner true si la variable n'est pas déclarée ou a la valeur
undefined
:Parce que dans la portée globale, nous ne sommes pas sûrs à 100% si une variable est déclarée, cela pourrait nous donner une référenceError. Lorsque nous utilisons l'
typeof
opérateur sur la variable inconnue, nous n'obtenons pas ce problème lorsque la variable n'est pas déclarée:Cela est dû au fait que l'
typeof
opérateur retourne la chaîneundefined
lorsqu'une variable n'est pas déclarée ou détient actuellement la valeurundefined
qui est exactement ce que nous voulons.undefined
la source
typeof a === 'undefined'
est plus rapide quea === 'undefined'
d'environ 2 fois sur le nœud v6.9.1.la source
undefined
à la deuxième partie, pas'undefined'