Quelle méthode pour vérifier si une variable a été initialisée est meilleure/correcte? (En supposant que la variable puisse contenir n'importe quoi (chaîne, int, objet, fonction, etc.))
if (elem) { // or !elem
ou
if (typeof(elem) !== 'undefined') {
ou
if (elem != null) {
L'opérateur typeof
vérifiera si la variable est vraiment non définie.
if (typeof variable === 'undefined') {
// variable is undefined
}
Contrairement aux autres opérateurs, l'opérateur typeof
ne génère pas d'exception ReferenceError lorsqu'il est utilisé avec une variable non déclarée.
Cependant, notez que typeof null
retournera "object"
. Nous devons faire attention à éviter l'erreur d'initialisation d'une variable sur 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 la simple égalité ==
, voir:
Quel opérateur égal (== vs ===) devrait être utilisé dans les comparaisons JavaScript?
Vous voulez l'opérateur typeof
. Plus précisément:
if (typeof variable !== 'undefined') {
// the variable is defined
}
En JavaScript, une variable peut être définie, mais conserve la valeur undefined
, de sorte que la réponse la plus commune n'est pas techniquement correcte et effectue plutôt les opérations suivantes:
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 par vous-même (si vous vous souciez de ce genre de choses):
if ("v" in window) {
// global variable v is defined
} else {
// global variable v is not defined
}
Ceci, bien sûr, suppose que vous utilisez un navigateur (où window
est le nom de l’objet global). Mais si vous bricolez avec de tels globaux, vous êtes probablement dans un navigateur. Subjectivement, utiliser 'name' in window
est stylistiquement cohérent avec l'utilisation de window.name
pour faire référence à des éléments globaux. Accéder aux éléments globaux en tant que propriétés de window
plutô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 vous évite que votre variable globale ne soit masquée par une variable locale. En outre, si les globaux font que votre peau se traîne, vous pourriez vous sentir plus à l'aise de les toucher uniquement avec ce bâton relativement long.
Dans de nombreux cas, en utilisant:
if (elem) { // or !elem
fera le travail pour vous! ... ceci vérifiera les cas suivants:
undefined
''
Donc, cela couvrira tous les cas, mais il y a toujours des cas étranges que nous voudrions couvrir, par exemple, une chaîne avec des espaces, comme celle-ci ' '
, elle sera définie en javascript car elle contient des espaces string ... par exemple, dans ce cas, vous ajoutez une vérification supplémentaire en utilisant trim (), comme:
if(elem) {
if(typeof elem === 'string' && elem.trim()) {
///
De plus, ces vérifications ne concernent que les valeurs , car les objets et les tableaux fonctionnent différemment en Javascript, les tableaux vides []
et les objets vides {}
sont toujours vrai .
Je crée l'image ci-dessous pour montrer un bref résumé de la réponse:
Dans la majorité des cas, vous utiliseriez:
elem != null
Contrairement à un simple if (elem)
, il autorise 0
, false
, NaN
et ''
, mais rejette null
ou undefined
, en faisant C’est un bon test général pour la présence d’un argument ou de la propriété d’un objet.
Les autres contrôles ne sont pas incorrects non plus, ils ont juste des utilisations différentes:
if (elem)
: peut être utilisé s'il est garanti que elem
est un objet ou si false
, 0
, etc., sont considérés comme des valeurs "par défaut" (donc équivalentes à undefined
ou null
).
typeof elem == 'undefined'
peut être utilisé dans les cas où un null
spécifié a une signification distincte pour une variable ou une propriété non initialisée.
elem
n’est pas déclarée (c’est-à-dire qu’aucune déclaration var
ne constitue pas une propriété de window
, ou pas un argument de fonction). Ceci est, à mon avis, plutôt dangereux car cela laisse passer des fautes de frappe inaperçues. Pour éviter cela, voir la méthode ci-dessous.Une comparaison stricte avec undefined
:
if (elem === undefined) ...
Cependant, étant donné que la variable globale undefined
peut être remplacée par une autre valeur, il est préférable de déclarer la variable undefined
dans la portée actuelle avant de l'utiliser:
var undefined; // really undefined
if (elem === undefined) ...
Ou:
(function (undefined) {
if (elem === undefined) ...
})();
Un autre avantage de cette méthode est que les minificateurs JS peuvent réduire la variable undefined
à un seul caractère, ce qui vous fait économiser quelques octets à chaque fois.
C'est une jolie solution à 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 au cas où une certaine variable n'aurait pas été initialisée:
var dark = typeof darkColor !== typeof undefined ? darkColor : "black";
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 foo
n'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
Bien que notre fonction isset
ne puisse pas être utilisée pour vérifier 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 sont indéfinis:
var a = '5';
var test = function(x, y) {
console.log(isset(x));
console.log(isset(y));
};
test(a);
// OUTPUT :
// ------------
// TRUE
// FALSE
Bien qu'aucune valeur pour y
ne soit transmise à la fonction test
, notre fonction isset
fonctionne parfaitement dans ce contexte, car y
est connu dans la fonction test
comme une valeur undefined
.
window
. hasOwnProperty
(" varname
")Une alternative à la pléthore de réponses typeof
;
Global variables déclarées avec une instruction var varname = value;
dans l'étendue globale
peut être consulté en tant que propriétés de l’objet window.
En tant que telle, la méthode hasOwnProperty()
, qui
renvoie un booléen indiquant si l'objet a la propriété spécifiée comme sa propre propriété (par opposition à son héritage)
peut être utilisé pour déterminer si
var
of "varname" a été déclaré globalement i.e. 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
] );
Le point positif de hasOwnProperty()
est qu’en l’appelant, nous n’utilisons pas de variable qui pourrait encore ne pas être déclarée - ce qui bien sûr est la moitié du problème.
Bien que ce ne soit pas toujours la solution parfaite ou idéale, dans certaines circonstances, il ne s'agit que du travail!
Ce qui précède est vrai lorsque vous utilisez var
pour définir une variable , par opposition à let
lequel:
déclare une variable locale de portée de bloc, en l'initialisant éventuellement à une valeur.
est différent du mot clé
var
, qui définit une variable globalement ou localement sur une fonction entière, quelle que soit la portée du bloc.Au niveau supérieur des programmes et des fonctions,
let
, contrairement àvar
, ne crée pas de propriété sur l'objet global.
Pour être complet: const
les constantes ne sont, par définition, pas variables (bien que leur contenu puisse l'être) ; plus pertinent:
Les constantes globales ne deviennent pas des propriétés de l'objet window, contrairement aux variables
var
. Un initialiseur pour une constante est requis; c'est-à-dire que vous devez spécifier sa valeur dans la même déclaration dans laquelle elle est déclarée.La valeur d'une constante ne peut pas changer par 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 détient est immuable, mais simplement que l'identificateur de variable ne peut pas être réaffecté.
Étant donné que les variables let
et les constantes const
ne sont jamais les propriétés d'un objet ayant hérité de la méthode hasOwnProperty()
, il ne peut pas être utilisé pour en vérifier l'existence.
Concernant la disponibilité et l'utilisation de hasOwnProperty()
:
Chaque objet issu de Object hérite de la méthode
hasOwnProperty()
. [...] contrairement à l'opérateurin
, cette méthode ne vérifie pas la chaîne de prototypes de l'objet.
Il existe un autre moyen simple de vérifier cela lorsque vous effectuez des tâches simples et des contrôles associés. Utilisez simplement opérateur conditionnel (ternaire).
var values = typeof variable !== 'undefined' ? variable : '';
Cela vous sera également utile lorsque vous tenterez de déclarer la variable globale avec une affectation d'instance de la variable de référence.
Si vous voulez vérifier la variable ne devrait pas être undefined
ou null
. Ensuite, effectuez une vérification ci-dessous.
Lorsque la variable est déclarée et que vous souhaitez vérifier la valeur, il s'agit même de Simple: et vous obtiendrez undefined
et null
vérifie ensemble.
var values = variable ? variable : '';
Cela dépend si vous voulez que la variable ait été définie ou si vous voulez qu'elle ait une valeur significative.
Vérifier si le type est indéfini vérifiera si la variable a déjà été définie.
=== null
ou !== null
vérifie uniquement si la valeur de la variable est exactement null
.
== null
ou != null
vérifiera si la valeur est undefined
ou null
.
if(value)
vérifie si la variable est undefined
, null
, 0
ou une chaîne vide.
indéfini, booléen, chaîne, nombre, fonction
if (typeof foo! == 'indéfini') { }
Objet, tableau
if( foo instanceof Array ) {
}
La réponse la plus élevée est correcte, utilisez typeof.
Cependant, ce que je voulais souligner, c’est que javascript undefined
est mutable (pour une raison impie). Donc, faire simplement une vérification de varName !== undefined
a le potentiel de ne pas toujours revenir comme prévu, car d'autres bibliothèques auraient pu être modifiées de manière indéfinie. Quelques réponses (celles de @ skalee, par exemple) semblent préférer ne pas utiliser typeof
, ce qui peut poser problème.
La "vieille" façon de gérer cela consistait à déclarer non défini en tant que var pour compenser tout éventuel muting/dépassement de undefined
. Cependant, le meilleur moyen consiste toujours à utiliser typeof
car il ignorera toute substitution de undefined
par un autre code. Surtout si vous écrivez du code pour une utilisation dans la nature où qui sait quoi d'autre pourrait être exécuté sur la page ...
if (typeof console != "undefined") {
...
}
Ou mieux
if ((typeof console == "object") && (typeof console.profile == "function")) {
console.profile(f.constructor);
}
Fonctionne dans tous les navigateurs
Le 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 (ne pas avoir déclaré la variable window
).
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)
, afin de vérifier si elle est falsifiée. Cela peut amener à un code plus propre de telle sorte 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);
}
..peut être réduit à:
if (data && !data.url) {
var message = data.error || data.message || 'Error receiving response';
alert(message)
}
Il est difficile de faire la distinction entre indé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. ndefined est une valeur spéciale qui sera la valeur par défaut des variables non attribuées.
var _undefined;
var _null = null;
alert(_undefined);
alert(_null);
alert(_undefined == _null);
alert(_undefined === _null);
Null est une valeur en JavaScript et typeof null
renvoie "object"
Par conséquent, la réponse acceptée ne fonctionnera pas si vous transmettez des valeurs nulles. Si vous transmettez des valeurs NULL, vous devez ajouter une vérification supplémentaire pour les valeurs NULL:
if ((typeof variable !== "undefined") && (variable !== null))
{
// the variable is defined and not null
}
Ces réponses (hormis la solution de Fred Gandt) sont toutes incorrectes ou incomplètes.
Supposons que j’ai besoin de mon variableName;
pour porter une valeur de undefined
, et qu’elle a donc été déclarée de la manière suivante: var variableName;
, ce qui signifie qu’elle est déjà initialisée; - Comment puis-je vérifier si c'est déjà déclaré?
Ou même mieux - comment puis-je vérifier immédiatement si "Book1.chapter22. paragraph37" existe avec un seul appel sans créer une erreur de référence?
Nous le faisons en utilisant le plus puissant opérateur JasvaScript, l'opérateur in:
"[variable||property]" in [context||root]
>> true||false
En période de AJAX popularité maximale 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és tels que "Book1.chapter22. paragraph37" et beaucoup plus.
Mais depuis qu'il a été publié précédemment 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 fournirai des mots clés (javascript + isNS) qui vous aideront à localiser le code source, accompagné de toutes les explications nécessaires.
La vérification la plus robuste est-elle définie avec typeof
if (typeof elem === 'undefined')
Si vous recherchez simplement une variable définie pour attribuer une valeur par défaut, vous pouvez souvent procéder comme suit:
elem = elem || defaultElem;
Il est souvent bon de l'utiliser, voir: moyen idiomatique de définir la valeur par défaut en javascript
Il y a aussi cette ligne qui utilise le mot-clé typeof :
elem = (typeof elem === 'undefined') ? defaultElem : elem;
vous pouvez utiliser l'opérateur typeof
.
Par exemple,
var dataSet;
alert("Variable dataSet is : " + typeof dataSet);
L'extrait de code ci-dessus renverra la sortie comme
dataSet variable est: undefined.
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 c'est plus court.
Veuillez noter que nous recherchons console
uniquement dans la portée globale (qui est un objet window
dans tous les navigateurs). Dans cette situation particulière, c'est souhaitable. Nous ne voulons pas que console
soit définie ailleurs.
@BrianKelley dans sa grande réponse explique les détails techniques. J'ai seulement ajouté une conclusion manquante et l'ai digérée en quelque chose de plus facile à lire.
J'utilise deux manières différentes en fonction de 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 en tant que 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 du contraire, alors dans un premier temps! Variable devient !! variable et dans la fonction non valide ===, devenez! = Et le nom de la fonction devient notInvalid.
Si vous voulez que le bloc défini fasse quelque chose, utilisez ceci
if (typeof variable !== 'undefined') {
// the variable is defined
}
Si vous voulez qu'un bloc non défini fasse quelque chose, ou affecte ou définisse la variable, utilisez cette commande.
if (typeof variable === 'undefined') {
// the variable is undefined
}
Ma préférence est typeof(elem) != 'undefined' && elem != null
.
Quel que soit votre choix, envisagez de placer la vérification dans une fonction comme celle-ci.
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;
Si vous savez que la variable est déclarée mais n’existe peut-être pas, 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 parcourir la ligne 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)
Ç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'égalité stricte là-bas, typeof renvoie toujours une chaîne.) Mais si vous avez des arguments pour une fonction qui peuvent avoir été passés ou non, ils seront toujours définis, mais ils seront nuls s'ils sont omis.
function sayHello(name) {
if (name) return "Hello, " + name;
else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"
Un peu plus fonctionnel et facile à utiliser:
function exist(obj)
{
return (typeof obj !== 'undefined');
}
La fonction retournera true s'il existe, sinon false si n'existe pas.
sachez que lorsque vous vérifiez! == ou! = Contre "undefined" cela ne fonctionnera pas
Testé sur Firfox Quantom 60.0.1
utilisez plutôt le test comme celui-ci pour éviter les conflits
if(!(typeof varibl['fl'] === 'undefined')) {
console.log(varibl['fl']);
console.log("Variable is Defined");
}else{
console.log(varibl['fl']);
console.log("Variable is Un-Defined");
}
Qu'en est-il d'un simple:
if(!!variable){
//the variable is defined
}
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");
}
Je suis surpris que cela n'ait pas encore été mentionné ...
voici quelques variantes supplémentaires utilisant this['var_name']
l’utilisation de cette méthode présente l’avantage de pouvoir ê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!