JavaScript vérifie si la variable existe (est définie / initialisée)


1767

Quelle méthode de vérification si une variable a été initialisée est meilleure / correcte? (En supposant que la variable peut contenir n'importe quoi (chaîne, int, objet, fonction, etc.))

if (elem) { // or !elem

ou

if (typeof(elem) !== 'undefined') {

ou

if (elem != null) {

5
si vous voulez savoir si fooest déclarée, que ce soit typeof foo === 'undefined'outypeof foo === typeof undefined

1
Les réponses très appréciées ne fonctionnent pas pour les variables déclarées mais qui ont la valeur undefined. La bonne réponse est celle-ci: stackoverflow.com/a/36432729/772035
Paul

@Paulpro, la version utilisant hasOwnProperty('bar')n'a pas les mêmes défauts que les autres, mais nécessiterait un ajustement pour Node (remplacer windowpar global).
oligofren le

@Paulpro En effet, mais en réfléchissant à cela avant de répondre, je suis arrivé à la conclusion que ce n'était pas vraiment un problème pratique. Lorsque vous traitez des variables de portée de bloc ou de fonction, il s'agit généralement du code que vous possédez ou auquel vous avez accès en écriture, de sorte que vous aurez une erreur d'exécution dans tous les cas qui peut être corrigée. Alors que le problème habituel avec les variables qui n'ont pas été définies (n'existe pas) réside généralement dans le code en dehors de votre contrôle, vous avez donc besoin d'un moyen de le détecter. C'est donc la solution 80/20.
oligofren le

Réponses:


3056

Vous voulez l' typeofopérateur . Plus précisément:

if (typeof variable !== 'undefined') {
    // the variable is defined
}

35
Cela semble une bonne solution, mais pouvez-vous expliquer pourquoi cela fonctionne?
Morgan Cheng

46
En fait, vous devez vérifier que l'objet est ce dont vous avez besoin. Ce serait donc si (typeof console == 'objet') {// la variable est ce dont j'ai besoin}
staticsan

59
@George IV: "faites juste` if (variable) "- euh, non, cela échoue pour false et 0.
Jason S

17
'if (variable)' échoue également pour tester l'existence de propriétés d'objet.
scotts

54
@ geowa4 En fait, cela générera une erreur si la variable n'est pas définie.
kevinji

857

L' typeofopérateur vérifiera si la variable n'est pas vraiment définie.

if (typeof variable === 'undefined') {
    // variable is undefined
}

L' typeofopérateur, contrairement aux autres opérateurs, ne lève pas d' exception ReferenceError lorsqu'il est utilisé avec une variable non déclarée.

Cependant, notez que typeof nullcela reviendra "object". Nous devons être prudents pour éviter l'erreur d'initialiser une variable à null. Pour être sûr, voici ce que nous pourrions utiliser à la place:

if (typeof variable === 'undefined' || variable === null) {
    // variable is undefined or null
}

Pour plus d'informations sur l'utilisation de la comparaison stricte ===au lieu de l'égalité simple ==, voir:
Quel opérateur égal (== vs ===) doit être utilisé dans les comparaisons JavaScript?


2
if (! variable_here) {// votre code ici. }; ne peut pas dire si la variable est fausse ou indéfinie
boh

5
if(! variable_here)se cassera dans de nombreux cas. Si la variable est 0 ou fausse, elle échouera. Ce n'est pas ce que tu veux.
Cory Danielson

2
ne peut pas décider de voter ou non. À strictement parler, la typeof foo === "undefined"réponse est correcte et meilleure que la réponse la plus votée, mais les notes supplémentaires rendent cette réponse confuse.
Alnitak

1
@StevenPenny Vérifiez la chronologie. La réponse du haut a été fusionnée à partir d' une autre question après la publication de cette réponse
Rob

1
Cette réponse ne fonctionne pas. C'est la seule réponse qui fonctionne ici: stackoverflow.com/a/36432729/772035
Paul

222

Dans de nombreux cas, en utilisant:

if (elem) { // or !elem

fera le travail pour vous! ... ceci vérifiera les cas ci-dessous:

  1. non défini : si la valeur n'est pas définie et qu'il estundefined
  2. null : s'il est nul, par exemple, si un élément DOM n'existe pas ...
  3. chaîne vide :''
  4. 0 : numéro zéro
  5. NaN : pas un nombre
  6. faux

Donc, cela couvrira tous les cas, mais il y a toujours des cas étranges que nous aimerions couvrir également, par exemple, une chaîne avec des espaces, comme celle- ' 'ci, cela sera défini en javascript car il y a des espaces à l'intérieur de la chaîne ... par exemple, dans ce cas, vous ajoutez une vérification supplémentaire en utilisant trim (), comme:

if(elem) {

if(typeof elem === 'string' && elem.trim()) {
///

En outre, ces vérifications concernent uniquement les valeurs , car les objets et les tableaux fonctionnent différemment en Javascript, les tableaux []et objets vides {}sont toujours vrais .

Je crée l'image ci-dessous pour montrer un bref résumé de la réponse:

indéfini, nul, etc.


2
@Alireza, chouette! Votre réponse aidera beaucoup de gens. J'ai déjà mémorisé ces valeurs de fausseté, la seule chose dont je n'étais pas sûr concernait [].
Thiago Yoithi

13
Je reçois un "ReferenceError: elem n'est pas défini"
ropo

3
@ropo, c'est parce que vous n'avez même pas défini l'elem pour vérifier ce que c'est, si c'est votre cas, vous devez le vérifier avec typeof (elem) === "chaîne" qui est déjà mentionné ...
Alireza

19
Ensuite, la réponse est trompeuse lorsqu'elle dit que les if(elem)vérifications ne sont pas définies (alors qu'elle renvoie une erreur non définie), n'est-ce pas?
Fanky

1
Donnez-moi un cas d'utilisation pour vérifier si une variable n'est pas définie et si elle est définie avec une valeur non définie? Certains d'entre vous saisissent les pailles et tentent de paraître brillants mais si vous définissez une valeur comme indéfinie et que vous vérifiez cette valeur, cela retournera évidemment faux ou vous devez changer votre code, smh .... cette réponse est correcte !! !!!
almcaffee

210

En JavaScript, une variable peut être définie, mais conservez la valeur undefined, donc la réponse la plus courante n'est pas techniquement correcte, et effectue à la place ce qui suit:

if (typeof v === "undefined") {
   // no variable "v" is defined in the current scope
   // *or* some variable v exists and has been assigned the value undefined
} else {
   // some variable (global or local) "v" is defined in the current scope
   // *and* it contains a value other than undefined
}

Cela peut suffire à vos fins. Le test suivant a une sémantique plus simple, ce qui facilite la description précise du comportement de votre code et sa compréhension vous-même (si vous vous souciez de telles choses):

if ("v" in window) {
   // global variable v is defined
} else {
   // global variable v is not defined
}

Bien entendu, cela suppose que vous exécutez dans un navigateur (où windowest le nom de l'objet global). Mais si vous fouinez avec des mondiaux comme celui-ci, vous êtes probablement dans un navigateur. Subjectivement, l'utilisation 'name' in windowest stylistiquement cohérente avec l'utilisation window.namepour faire référence aux globaux. L'accès aux globaux en tant que propriétés windowplutôt qu'en tant que variables vous permet de minimiser le nombre de variables non déclarées que vous référencez dans votre code (au profit du linting), et évite la possibilité que votre global soit masqué par une variable locale. De plus, si les globaux font ramper votre peau, vous pourriez vous sentir plus à l'aise de les toucher uniquement avec ce bâton relativement long.


7
Cela vérifie uniquement si la variable a été déclarée globalement. Si vous codez correctement, vous limitez vos variables globales. Il signalera faux pour les variables locales: (function () {var sdfsfs = 10; console.log ("sdfsfs" dans la fenêtre);}) () `
Eddie Monge Jr

2
C'est la meilleure réponse f $ # ^% ing. J'étais à bout de mots sur cela, essayant de comprendre comment rendre compte exactement de cette affaire de coin. Brillant. Je ne savais pas que tu pouvais faire ça.
temporaire_user_name


Pour les utilisateurs angulaires: Malheureusement, cela ne semble pas être autorisé dans une instruction ng-if.
qwertzguy

... plan parfait pour les contrôles le long de la portée. avez-vous une indication de performance, si "dans la fenêtre" ou "(typeof variable === 'undefined' || variable === null)". En fait, je suis intéressé par un test des faits et non par une justification potentielle argumentée (que je pourrais faire moi-même: la deuxième clause a plus d'opérations -> pire performance)
rapide

119

Dans la majorité des cas, vous utiliseriez:

elem != null

Contrairement à simple if (elem), il permet 0, false, NaNet '', mais rejette nullou undefined, ce qui en fait un bon test général pour la présence d'un argument, ou la propriété d'un objet.


Les autres vérifications ne sont pas incorrectes non plus, elles ont juste des usages différents:

  • if (elem): Peut être utilisé si elemest garanti d'être un objet, ou si false, 0etc. sont considérés comme des valeurs « par défaut » (donc équivalent à undefinedou null).

  • typeof elem == 'undefined'peut être utilisé dans les cas où un spécifié nulla une signification distincte pour une variable ou une propriété non initialisée.

    • C'est la seule vérification qui ne générera pas d'erreur si elle elemn'est pas déclarée (c'est-à-dire sans varinstruction, pas une propriété de window, ou pas un argument de fonction). C'est, à mon avis, plutôt dangereux car cela permet aux fautes de frappe de passer inaperçues. Pour éviter cela, consultez la méthode ci-dessous.

Une comparaison stricte avec undefined:

if (elem === undefined) ...

Cependant, parce que le undefined peut être remplacé par une autre valeur, il est préférable de déclarer la variable undefineddans la portée actuelle avant de l'utiliser:

var undefined; // really undefined
if (elem === undefined) ...

Ou:

(function (undefined) {
    if (elem === undefined) ...
})();

Un avantage secondaire de cette méthode est que les minificateurs JS peuvent réduire la undefinedvariable à un seul caractère, ce qui vous fait économiser quelques octets à chaque fois.


17
Je suis choqué que vous puissiez passer outre undefined. Je ne pense même pas que cela mérite d'être mentionné dans la réponse. Probablement le pire nom de variable acceptable dans tout Javascript.
Cory Danielson

2
Cela provoque une exception et vous oblige à utiliser window.avant la variable si elle est utilisée dans le contexte global ... ce n'est pas la meilleure façon.
Alex W

4
En raison de ce problème primordial, vous devriez TOUJOURS utiliser à la void(0)place de undefined.
Bartłomiej Zalewski

+1 depuis ce point de réponse que , parfois , vous pouvez effectivement vouloir identifier false, 0etc. comme valeurs non valides.
rinogo

77

Vérifiez si window. hasOwnProperty( " varname" )

Une alternative à la pléthore de typeof réponses;

Variables globales déclarées avec une var varname = value;instruction dans la portée globale

est accessible en tant que propriétés de l'objet fenêtre.

En tant que telle, la hasOwnProperty()méthode, qui

renvoie un booléen indiquant si l'objet a la propriété spécifiée comme sa propre propriété (par opposition à l'hériter)

peut être utilisé pour déterminer si

a varde "varname" a été déclaré globalement, c'est -à- dire qu'il est une propriété de window.

// Globally established, therefore, properties of window
var foo = "whatever", // string
    bar = false,      // bool
    baz;              // undefined
//  window.qux does not exist

console.log( [
    window.hasOwnProperty( "foo" ), // true
    window.hasOwnProperty( "bar" ), // true
    window.hasOwnProperty( "baz" ), // true
    window.hasOwnProperty( "qux" )  // false
] );

Ce qui est génial, hasOwnProperty()c'est qu'en l'appelant, nous n'utilisons pas une variable qui pourrait encore être non déclarée - ce qui bien sûr est la moitié du problème en premier lieu.

Bien que ce ne soit pas toujours la solution parfaite ou idéale , dans certaines circonstances, c'est juste le travail!

Remarques

Ce qui précède est vrai lors de l'utilisation varpour définir une variable , par opposition à letlaquelle:

déclare une variable locale de portée de bloc, l'initialisant éventuellement à une valeur.

est différent du var mot clé, qui définit une variable globalement ou localement à une fonction entière quelle que soit la portée du bloc.

Au niveau supérieur des programmes et des fonctions, letcontrairement à var, ne crée pas de propriété sur l'objet global.

Pour être complet: les const constantes ne sont, par définition, pas réellement variables (bien que leur contenu puisse l'être); de manière plus pertinente:

Les constantes globales ne deviennent pas des propriétés de l'objet fenêtre, contrairement aux varvariables. Un initialiseur pour une constante est requis; c'est-à-dire que vous devez spécifier sa valeur dans la même instruction dans laquelle il est déclaré.

La valeur d'une constante ne peut pas changer lors de la réaffectation et elle ne peut pas être redéclarée.

La déclaration const crée une référence en lecture seule à une valeur. Cela ne signifie pas que la valeur qu'il contient est immuable, mais simplement que l'identificateur de variable ne peut pas être réaffecté.

Étant donné que les letvariables ou les constconstantes ne sont jamais les propriétés d'un objet qui a hérité de la hasOwnProperty()méthode, il ne peut pas être utilisé pour vérifier leur existence.

Concernant la disponibilité et l'utilisation de hasOwnProperty():

Chaque objet issu d' Object hérite de la hasOwnProperty()méthode. [...] contrairement à l' inopérateur, cette méthode ne vérifie pas la chaîne prototype de l'objet.


1
C'est une alternative géniale et devrait être en haut de la page de cette question. Veuillez simplifier le titre de la réponse avec un exemple de travail qui renvoie true(par exemple window.hasOwnProperty('console')ouvar hop = "p";window.hasOwnProperty('hop') ).
CPHPython

2
Enfin quelque chose qui ne génère pas d'erreur en raison de l'accès à un membre qui n'existe pas… Quelque chose que toutes les typeofréponses ignorent tout simplement.
Zelphir Kaltstahl

1
Cette réponse est obsolète - selon ECMAScript standard, vous pouvez définir des variables avec letlesquelles ces variables ne sont pas disponibles en tant que propriétés de l'objet window[ou de tout autre objet disponible]. hasOwnPropertyteste la présence de propriétés et non de variables et ne peut donc pas être utilisé pour détecter des variables définies par let.
amn

1
@amn La réponse reste vraie concernant l'utilisation de varet n'est à cet égard pas dépassée. J'ai cependant ajouté une note expliquant en quoi l'utilisation de letet constdiffère de celle de var. Merci pour votre inspiration; ensemble, nous nous levons :)
Fred Gandt

1
@amn J'ai réécrit la réponse (si tout va bien pour la dernière fois) pour clarifier ce qui hasOwnPropertyne peut être utilisé que de la manière prescrite pour vérifier l'existence de varvariables. Ça me va bien.
Fred Gandt

68

Comment vérifier si une variable existe

Ceci est une solution assez à l'épreuve des balles pour tester si une variable existe et a été initialisée:

var setOrNot = typeof variable !== typeof undefined;

Il est le plus souvent utilisé en combinaison avec un opérateur ternaire pour définir une valeur par défaut dans le cas où une certaine variable n'a pas été initialisée:

var dark = typeof darkColor !== typeof undefined ? darkColor : "black";

Problèmes d'encapsulation

Malheureusement, vous ne pouvez pas simplement encapsuler votre chèque dans une fonction.

Vous pourriez penser à faire quelque chose comme ça:

function isset(variable) {
    return typeof variable !== typeof undefined;
}

Cependant, cela produira une erreur de référence si vous appelez par exemple. isset(foo)et la variable foon'a pas été définie, car vous ne pouvez pas transmettre une variable non existante à une fonction:

Uncaught ReferenceError: foo n'est pas défini


Tester si les paramètres de fonction ne sont pas définis

Bien que notre issetfonction ne puisse pas être utilisée pour tester si une variable existe ou non (pour les raisons expliquées ci-dessus), elle nous permet de tester si les paramètres d'une fonction ne sont pas définis:

var a = '5';

var test = function(x, y) {
    console.log(isset(x));
    console.log(isset(y));
};

test(a);

// OUTPUT :
// ------------
// TRUE
// FALSE

Même si aucune valeur yn'est transmise à la fonction test, notre issetfonction fonctionne parfaitement dans ce contexte, car elle yest connue dans la fonction testcomme une undefinedvaleur.


41

Il existe un autre moyen rapide de vérifier cela lorsque vous effectuez des affectations simples et des vérifications associées. Utilisez simplement l' opérateur conditionnel (ternaire).

var values = typeof variable !== 'undefined' ? variable : '';

Cela sera également utile lorsque vous essayez de déclarer la variable globale avec l'affectation d'instance de la variable de référence.

Si vous vouliez vérifier la variable ne devrait pas être undefinedou null. Effectuez ensuite la vérification ci-dessous.

Lorsque la variable est déclarée, et si vous voulez vérifier la valeur, c'est même simple: et elle fonctionnerait undefinedet nullvérifierait ensemble.

var values = variable ? variable : '';

la réponse car elle est carrément fausse. La variable typeof renvoie toujours une chaîne, elle n'est donc jamais fausse. Par exemple, si typeof(booooo)est "undefined"alors typeof(typeof boooooo)est "string"et typeof boooooo && trueest toujours true. @ La réponse de John-Slegers est à peu près aussi abrégée que possible avec typeof.
mpag

Sa réponse absolument correcte . Voici un violon qui fonctionne . Et je ne sais pas de quel scénario vous parlez. La question est de vérifier l'existence de variables.
RajeshKdev

@mpag Ne dites pas Flat Flat. Prouvez-le . Trouver une erreur est vraiment facile, au lieu de cela, vous pouvez fournir de bonnes réponses ici !!!. Si la réponse est totalement fausse, 28 programmeurs n'auraient pas voté sans vérifier ma réponse. Puisqu'il y a beaucoup de réponses réputées ici, ils auraient pu voter contre cela, pas cela.
RajeshKdev

En fait, le deuxième morceau de code n'est pas de vérifier la même condition que ci-dessus. Je pensais que les gens comprendraient par cette ligne If you wanted to check variable shouldn't be undefined or null., par ce commentaire, sa déclaration claire, son ne pas effectuer la vérification de déclaration de variable. c'est pour vérifier la valeur de la variable.
RajeshKdev

1
votre 2e chèque échouera avec une valeur de 0
Fareed Alnamrouti

31

Un moyen court de tester une variable non déclarée (non indéfinie) est

if (typeof variable === "undefined") {
  ...
}

Je l'ai trouvé utile pour détecter un script exécuté en dehors d'un navigateur (n'ayant pas déclaré de windowvariable).


est-ce la "voie canonique" qui est portable?
Jason

3
C'est faux. window.bar=undefinedest défini et défini sur une valeur. Votre réponse ne parvient pas à détecter la différence entre cela et si la variable n'existe pas. Si vous l'avez fait, this.hasOwnProperty('bar')cela aurait pu fonctionner.
oligofren le

ce code ne fonctionne pas et vous pouvez le vérifier en utilisant n'importe quelle console de navigateur
ha9u63ar

1
Considérez const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();. La variable xest définie mais false est renvoyé ...
user2878850

29

Cela dépend si vous vous souciez juste que la variable a été définie ou si vous voulez qu'elle ait une valeur significative.

Vérifier si le type n'est pas défini vérifiera si la variable a déjà été définie.

=== nullou !== nullvérifiera seulement si la valeur de la variable est exactementnull .

== nullou != nullvérifiera si la valeur est undefinedou null.

if(value)vérifiera si la variable est undefined, null, 0ou une chaîne vide.


12

La réponse la plus élevée est correcte, utilisez typeof.

Cependant, ce que je voulais souligner, c'est que dans JavaScript undefinedest mutable (pour une raison impie). Donc, simplement faire une vérification pour varName !== undefineda le potentiel de ne pas toujours revenir comme vous vous y attendez, car d'autres bibliothèques pourraient avoir changé non définies. Quelques réponses (@ skalee, pour une) semblent préférer ne pas utiliser typeof, et cela pourrait avoir des ennuis.

La "vieille" façon de gérer cela était de déclarer undefined comme var pour compenser tout muting / dépassement potentiel de undefined. Cependant, le meilleur moyen est toujours d'utiliser typeofcar il ignorera tout remplacement d'un undefinedautre code. Surtout si vous écrivez du code à utiliser dans la nature où qui sait quoi d'autre pourrait être exécuté sur la page ...


1
Le point est théorique, car si varName n'est pas défini, varName !== undefinedcela provoquera simplement une ReferenceError. La mutabilité de undefinedn'a pas d'importance.
Wutaz


1
Dans les versions Javascript plus récentes, il undefineds'agit d'une propriété en lecture seule. Cependant, pour être à l'épreuve des balles, vous pouvez utiliser typeof mvVar === typeof void 0. void 0renvoie undefinedtoujours.
kwarnke

11
if (typeof console != "undefined") {    
   ...
}

Ou mieux

if ((typeof console == "object") && (typeof console.profile == "function")) {    
   console.profile(f.constructor);    
}

Fonctionne dans tous les navigateurs


3
Pourquoi ce dernier est meilleur à votre avis?
skalee

3
@skalee Je suis d'accord que ce dernier est meilleur. Ceci pour la simple raison que vous vérifiez si les types sont ceux que vous souhaitez avant de les utiliser.
Broxzier


9

Pour contribuer au débat, si je sais que la variable doit être une chaîne ou un objet, je préfère toujours if (!variable), alors vérifiez si sa fausse. Cela peut apporter un code plus propre afin que, par exemple:

if (typeof data !== "undefined" && typeof data.url === "undefined") {
    var message = 'Error receiving response';
    if (typeof data.error !== "undefined") {
        message = data.error;
    } else if (typeof data.message !== "undefined") {
        message = data.message;
    }
    alert(message); 
}

.. pourrait être réduit à:

if (data && !data.url) {
  var message = data.error || data.message || 'Error receiving response';
  alert(message)
} 


Ce n'est pas ce que le PO a demandé. Si data.url est égal à ''votre solution, il serait considéré comme non défini, alors qu'il est en fait défini comme contenant une chaîne vide.
Demonblack

Je suis d'accord, ce n'est pas ce qui a été demandé, et vous avez raison: la chaîne vide '' serait considérée comme indéfinie. Mais j'ai posté cela parce que je pensais que cela pourrait être utile sur le débat qui s'est créé entre différentes réponses. Et dans l'exemple, ainsi que dans de nombreux autres cas, vous voulez simplement imprimer une chaîne s'il y a du contenu, il est donc normal de profiter du fait que le javascript considère la fausse chaîne vide et non définie
de3

8

Il est difficile de distinguer entre non défini et nul. Null est une valeur que vous pouvez affecter à une variable lorsque vous souhaitez indiquer que la variable n'a pas de valeur particulière. Undefined est une valeur spéciale qui sera la valeur par défaut des variables non affectées.


var _undefined;
var _null = null;

alert(_undefined); 
alert(_null); 
alert(_undefined == _null);
alert(_undefined === _null);


1
Serait utile de montrer en ligne la sortie de chaque alerte.
demisx

@demisx D'accord, mais au lieu de proposer la modification, pourquoi ne pas simplement la faire? L'option est là pour une raison. Certains peuvent le considérer comme impoli; Je le considère efficace - j'ai donc édité la réponse moi-même (en attente de révision).
Fred Gandt

1
@Fred - J'ai regardé l'historique des modifications et je peux deviner pourquoi vos modifications ont été rejetées ... plutôt que d'ajouter simplement des lignes pour montrer ce que serait la sortie, comme l'a suggéré Demisx, vous avez considérablement changé ce que Jith avait publié.
Stephen P

8

Null est une valeur en JavaScript et typeof null renvoie"object"

Par conséquent, la réponse acceptée ne fonctionnera pas si vous passez des valeurs nulles. Si vous transmettez des valeurs nulles, vous devez ajouter une vérification supplémentaire pour les valeurs nulles:

if ((typeof variable !== "undefined") && (variable !== null))  
{
   // the variable is defined and not null
}

7

La vérification la plus robuste «est-elle définie» est avec typeof

if (typeof elem === 'undefined')

Si vous recherchez simplement une variable définie pour attribuer une valeur par défaut, pour une lecture facile d'une ligne, vous pouvez souvent le faire:

elem = elem || defaultElem;

C'est souvent une bonne chose à utiliser, voir: Manière idiomatique de définir la valeur par défaut en javascript

Il y a aussi cette doublure en utilisant le mot-clé typeof :

elem = (typeof elem === 'undefined') ? defaultElem : elem;

7

vous pouvez utiliser l' typeofopérateur.

Par exemple,

var dataSet;

alert("Variable dataSet is : " + typeof dataSet);

L'extrait de code ci-dessus renverra la sortie comme

variable dataSet est: non défini.



7

Pour vérifier si une variable a été déclarée / définie, j'ai fait ce sale tour.

Je n'ai pas trouvé de moyen d'extraire le code d'une fonction, même avec eval.

"use strict";

// var someVar;

var declared;
try {
  someVar;
  declared = true;
} catch(e) {
  declared = false;
}

if (declared) {
  console.log("someVar is declared; now has the value: " + someVar);
} else {
  console.log("someVar is not declared");
}

Qu'entendez-vous par «extraire le code d'une fonction»?
Melab

7

Ces réponses (à l'exception de la solution Fred Gandt) sont toutes soit incorrectes soit incomplètes.

Supposons que j'ai besoin de mon variableName;pour porter une undefinedvaleur, et donc qu'elle a été déclarée d'une manière telle que var variableName;cela signifie qu'elle est déjà initialisée ; - Comment vérifier si c'est déjà déclaré?

Ou encore mieux - comment puis-je vérifier immédiatement si "Book1.chapter22. paragraph37" existe avec un seul appel, mais ne génère pas d'erreur de référence?

Nous le faisons en utilisant l'opérateur JasvaScript le plus puissant, l' opérateur in .:

"[variable||property]" in [context||root] 
>> true||false

À une époque de popularité croissante d'AJAX, j'ai écrit une méthode (nommée plus tard) isNS () qui est capable de déterminer si l'espace de noms existe, y compris des tests approfondis pour les noms de propriété tels que "Book1.chapter22.paragraph37" et bien plus encore.

Mais comme il a déjà été publié et en raison de sa grande importance, il mérite d'être publié dans un fil séparé, je ne le posterai pas ici mais je fournirai des mots clés ( javascript + isNS ) qui vous aideront à localiser le code source, soutenu par tous les explications nécessaires.


1
L' inopérateur teste uniquement l'existence des propriétés, et toutes les variables ne sont pas des propriétés - constet les letdéclarations ne le sont pas (et constne sont même pas des variables ).
amn

1
constet letont été normalisés avec ECMAScript 2015, qui a été publié il y a plus de 3 ans et a depuis été bien adopté par les suspects habituels et est utilisé de manière plutôt omniprésente aujourd'hui, oserais-je dire - il y a plus de 2 millions d'occurrences de "const" sur Github dans les fichiers JS .
amn

Oui, "variable" - exactement. C'est pourquoi j'ai commenté votre réponse, soulignant que vous ne pouvez pas utiliser l' inopérateur pour tester généralement si une variable existe, car "const et let ne sont pas des [propriétés]" - alors queconst fait on peut dire qu'il introduit une référence constante , comme par opposition à une référence de variablelet , d'autre part, introduit effectivement une référence de variable - c'est, en d'autres termes, par n'importe quelle mesure, une variable et votre réponse est incorrecte en impliquant que vous pouvez tester si une variable définie avec letexiste en utilisant l' inopérateur - vous ne pouvez pas.
amn

La spécification ECMAScript 6 définit le langage JavaScript, pas vous ni un navigateur Web. C'est pourquoi on l'appelle une spécification - elle spécifie sans ambiguïté la langue. Votre réponse est au mieux dépassée, au pire elle omet intentionnellement ce que vous considérez comme non pertinent, alors qu'elle est très pertinente. Citant la spécification liée, "les déclarations let et const définissent les variables". Ces constructions ne sont pas accessibles en tant que propriétés de l' windowobjet, je ne sais pas comment vous le rendre plus clair.
amn

La réponse ne couvre pas tous les cas de variables. Plus précisément, il ne couvre pas les variables définies avec le letmot - clé. C'est tout ce que je soulignais.
amn

6

Dans la situation particulière décrite dans la question,

typeof window.console === "undefined"

est identique à

window.console === undefined

Je préfère ce dernier car il est plus court.

Veuillez noter que nous recherchons consoleuniquement dans la portée globale (qui est un windowobjet dans tous les navigateurs). Dans cette situation particulière, c'est souhaitable. Nous ne voulons pas de consoledéfinition ailleurs.

@BrianKelley dans sa grande réponse explique les détails techniques. J'ai seulement ajouté des conclusions manquantes et les ai digérées en quelque chose de plus facile à lire.



2
Faux. ce dernier jette une exception dans ma console.
John Ktejik

6

J'utilise deux façons différentes selon l'objet.

if( !variable ){
  // variable is either
  // 1. '';
  // 2. 0;
  // 3. undefined;
  // 4. null;
  // 5. false;
}

Parfois, je ne veux pas évaluer une chaîne vide comme falsey, alors j'utilise ce cas

function invalid( item ){
  return (item === undefined || item === null);
}

if( invalid( variable )){
  // only here if null or undefined;
}

Si vous avez besoin de l'opposé, alors dans la première instance! Variable devient !! variable, et dans la fonction invalide === devenez! = Et le nom de la fonction devient notInvalid.


5

Ma préférence est typeof(elem) != 'undefined' && elem != null.

Quel que soit votre choix, pensez à placer le chèque dans une fonction comme

function existy (x) {
    return typeof (x) != 'undefined' && x != null;
}

Si vous ne savez pas que la variable est déclarée, continuez avec typeof (x) != 'undefined' && x != null;

Lorsque vous savez que la variable est déclarée mais peut ne pas exister, vous pouvez utiliser

existy(elem) && doSomething(elem);

La variable que vous vérifiez peut parfois être une propriété imbriquée. Vous pouvez utiliser prop || {} pour descendre la ligne en vérifiant l'existence de la propriété en question:

var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;

Après chaque propriété, utilisez (... '|| {}'). NextProp pour qu'une propriété manquante ne génère pas d'erreur.

Ou vous pouvez utiliser existy comme existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)


Si vous le mettez dans une fonction, c'est redondant. typeof (x) != 'undefined' && x != nullest équivalent àx != null quand xest déclaré.
Ry-

3

Ça dépend de la situation. Si vous recherchez quelque chose qui peut ou non avoir été défini globalement en dehors de votre code (comme jQuery peut-être), vous voulez:

if (typeof(jQuery) != "undefined")

(Pas besoin d'une égalité stricte, typeof renvoie toujours une chaîne.) Mais si vous avez des arguments à une fonction qui peuvent ou non avoir été passés, ils seront toujours définis, mais null s'ils sont omis.

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"

3

Try-catch

Si la variable n'a pas été définie du tout, vous pouvez vérifier cela sans interrompre l'exécution du code en utilisant le bloc try-catch comme suit (vous n'avez pas besoin de use strictmode)

BONUS: (se référant à d'autres réponses) Pourquoi ===est plus clair que ==( source )

si (a == b)

Entrez la description de l'image ici

si (a === b)

Entrez la description de l'image ici


1
Pour info, (a == b) placé sur la grille Game of Life n'était pas si excitant.
johnsnails

1

Je suis surpris que cela n'ait pas encore été mentionné ...

voici quelques variantes supplémentaires en utilisant this['var_name']

l'avantage d'utiliser cette méthode qui peut être utilisée avant la définition d'une variable.

if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part

// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!

C'est faux. window.bar=undefinedest défini et défini sur une valeur. Votre réponse ne parvient pas à détecter la différence entre cela et si la variable n'existe pas. Si vous l'avez fait, this.hasOwnProperty('bar')cela aurait pu fonctionner.
oligofren le

0

Vous pouvez utiliser un bloc try ... catch comme suit:

Un inconvénient est que vous ne pouvez pas le mettre dans une fonction car cela lancerait une ReferenceError

function variableExists(x) {
  var status = true
  try {
	  x
  } catch (ReferenceError) {
	  status = false
  }
  
  return status
}

console.log(variableExists(x))

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.