Quelle est la bonne façon de vérifier si une variable globale existe?
JSLint ne passe pas de ce qu'un code valide:
/* global someVar: false */
if (typeof someVar === "undefined") {
var someVar = "hi!";
}
Quelle est la bonne façon?
- Notez que le
var
n'est pas portée à laif
bloc. C'est comme si vous aviez écritvar someVar
au-dessus de laif
. Ref: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Descendit un lapin énorme trou après avoir lu seulement le code dans les réponses ici, et non dans la question. Si vous voulez écrire du code qui fonctionne sur Nodejs et le navigateur, c'est la bonne façon de vérifier si une variable n'est pas définie, indépendamment de ce que JSLint peut penser.
Vous devez vous connecter pour publier un commentaire.
/*global window */
, vous pouvez utiliser/*jslint browser: true */
.if(!window.hasOwnProperty('someVar'))
undefined = 'some value'
?undefined
.undefined
constant..hasOwnProperty()
pour cela. Il peut échouer..hasOwnProperty()
est beaucoup plus lent.Object.prototype.hasOwnProperty.call(window, 'someVar')
window
est une variable globale, dont l'existence nous voulons vérifier ce qui, évidemment, est le problème que nous aimerions résoudre en premier lieu.Il n'a pas d'importance si vous avez créé une variable globale avec var foo ou d'une fenêtre.foo — variables créées avec la var en contexte mondial sont écrits dans la fenêtre.
"foo" in window
n'importe oùUnexpected 'in'. Compare with undefined, or use the hasOwnProperty method instead.
Alors, je suppose, de la bonne façon est:window.hasOwnProperty("nameOfVar")
.hasOwnProperty()
est défectueux car il peut y avoir un global qui est plus bas dans la chaîne de prototype dewindow
. C'est encore une variable globale, mais.hasOwnProperty()
de ne pas le voir. Lein
ouundefined
tests sont le moyen de le faire.window
est pas défini il.Si vous êtes désireux d'affecter une variable globale que si elle n'existe pas déjà, essayez de:
ou
someVar
contient une valeur comme0
ou''
, il va affecter'hi'
à elle au lieu d'utiliser la valeur existante.essayer
ou
ou
ou
"prop" in object
est tout à fait légal JavaScript. Rappelez-vous, JSLint est pour vous, pas pour vous JSLint, et JSLint n'est pas un script JavaScript. Pour moiif ('prop' in obj) { do_it(); }
est plus clair (c'est à dire lisible et maintenable), puisif (obj.prop !== undefined) { do_it(); }
. Je vous suggère d'ignorer JSLint dans ce cas. Voir aussi stackoverflow.com/questions/6824895/....Je pense que c'est effectivement un problème avec JSLint. Elle émet le message d'erreur suivant:
Je crois que c'est de mauvais conseils. En JavaScript,
undefined
est une variable globale qui est, en général, non défini. Mais certains navigateurs permettent de scripts pour le modifier, comme ceci:window.undefined = 'defined'
. Si c'est le cas, en comparant directement avecundefined
peut conduire à des résultats inattendus. Heureusement, les ECMA 5 compatible navigateurs ne permettent pas d'affectations àundefined
(et lève une exception en mode strict).Je préfère
typeof someVar === "undefined"
, comme vous l'avez posté, ousomeVar in window
comme Susei suggéré.va vérifier si
someVar
(local ou global) n'est pas défini.Si vous voulez vérifier une variable globale, vous pouvez utiliser
en supposant que cela soit dans un navigateur 🙂
bfavaretto est incorrect.
L'échelon mondial non définie à une valeur ne modifie pas les tests des objets contre l'indéfini. Essayez ceci dans vos navigateurs préférés console JavaScript:
C'est tout simplement en raison de JavaScript en ignorant tous et toutes les valeurs d'une tentative de définir la variable non définie.
undefined
peut encore être modifiée: cette fonction est parfaitement légal:function foo(undefined, x) { if (x === undefined) { alert('undefined!'); } }
. Il va pas alerte si vous appelez, par exemple,foo(3)
. La leçon est que l' 'undefined' est pas toujours une référence à la propriété globale.Ce serait un moyen simple pour effectuer la vérification .
Mais cette vérification serait un échec si
variableName
est déclaré et il est affecté à l'boolean value: false