web-dev-qa-db-fra.com

JQuery / Javascript: vérifier si la var existe

Duplicate possible:
Comment puis-je vérifier si une variable est définie en JavaScript?
Existe-t-il une fonction standard permettant de rechercher des variables nulles, non définies ou vierges dans JavaScript?

J'ai un script qui se déroule en deux parties.

La première partie met en place une var:

var pagetype = "textpage";

La 2ème partie est une simple déclaration if:

if(pagetype == "textpage") {
//do something
};

Maintenant, la 2ème partie, la déclaration if, apparaît sur toutes les pages de mon site. Mais la première partie, où le var est déclaré, n'apparaît que sur certaines de mes pages.

Sur les pages sans le var, je reçois naturellement cette erreur:

Uncaught ReferenceError: pagetype is not defined

Ma question est donc la suivante: existe-t-il un moyen, avec JavaScript ou JQ, de détecter si une variable existe (et pas seulement si des données lui sont affectées)?

J'imagine que je voudrais simplement utiliser un autre si déclaration, par exemple:

if ("a var called pagetypes exists")....
63
MeltingDog

Je pense qu’il ya beaucoup de réponses comme celle-ci sur SO mais voilà:

if ( typeof pagetype !== 'undefined' && pagetype == 'textpage' ) {
  ...
}
116
elclanrs

Vous pouvez utiliser typeof:

if (typeof pagetype === 'undefined') {
    // pagetype doesn't exist
}
20
Blender

Pour votre cas, et 99,9% de tous les autres elclanrs réponse est correcte.

Mais parce que undefined est une valeur valide, si quelqu'un devait tester une variable non initialisée

var pagetype; //== undefined
if (typeof pagetype === 'undefined') //true

le seul moyen fiable à 100% de déterminer l'existence d'une variable consiste à intercepter l'exception;

var exists = false;
try { pagetype; exists = true;} catch(e) {}
if (exists && ...) {}

Mais je ne l'écrirais jamais de cette façon

9
jermel

Pour tester l'existence, il existe deux méthodes.

une. "property" in object

Cette méthode vérifie l'existence de la propriété dans la chaîne de prototypes.

b. object.hasOwnProperty( "property" )

Cette méthode ne monte pas dans la chaîne de prototypes pour vérifier l'existence de la propriété, elle doit exister dans l'objet sur lequel vous appelez la méthode.

var x; // variable declared in global scope and now exists

"x" in window; // true
window.hasOwnProperty( "x" ); //true

Si nous testions en utilisant l'expression suivante, elle renverrait false

typeof x !== 'undefined'; // false
4
Bruno

Avant chacune de vos déclarations conditionnelles, vous pouvez faire quelque chose comme ceci:

var pagetype = pagetype || false;
if (pagetype === 'something') {
    //do stuff
}
3
Jason

Il est impossible de déterminer si une variable a été déclarée ou pas autre que d'utiliser try..catch pour provoquer une erreur si elle n'a pas été déclarée. Testez comme:

if (typeof varName == 'undefined') 

ne vous dis pas si varName est une variable dans la portée, seulement les tests avec typeof retournent undefined. par exemple.

var foo;
typeof foo == 'undefined'; // true
typeof bar == 'undefined'; // true

Dans ce qui précède, vous ne pouvez pas dire que foo a été déclaré mais que bar ne l’était pas. Vous pouvez tester les variables globales en utilisant in:

var global = this;
...
'bar' in global;  // false

Mais l'objet global est le seul objet variable auquel vous pouvez accéder. Vous ne pouvez accéder à l'objet variable d'aucun autre contexte d'exécution.

La solution consiste à toujours déclarer les variables dans un contexte approprié.

  • L'objet global n'est pas vraiment un objet variable, il a simplement des propriétés qui correspondent aux variables globales et permettent d'y accéder, il semble donc en être une.
3
RobG