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) {
javascript
variables
initialization
undefined
Samuel Liew
la source
la source
foo
est déclarée, que ce soittypeof foo === 'undefined'
outypeof foo === typeof undefined
undefined
. La bonne réponse est celle-ci: stackoverflow.com/a/36432729/772035hasOwnProperty('bar')
n'a pas les mêmes défauts que les autres, mais nécessiterait un ajustement pour Node (remplacerwindow
parglobal
).Réponses:
Vous voulez l'
typeof
opérateur . Plus précisément:la source
L'
typeof
opérateur vérifiera si la variable n'est pas vraiment définie.L'
typeof
opé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 null
cela 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: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?
la source
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.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.Dans de nombreux cas, en utilisant:
fera le travail pour vous! ... ceci vérifiera les cas ci-dessous:
undefined
''
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: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:
la source
if(elem)
vérifications ne sont pas définies (alors qu'elle renvoie une erreur non définie), n'est-ce pas?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: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):
Bien entendu, cela suppose que vous exécutez dans un navigateur (où
window
est 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 window
est stylistiquement cohérente avec l'utilisationwindow.name
pour faire référence aux globaux. L'accès aux globaux en tant que propriétéswindow
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 é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.la source
Dans la majorité des cas, vous utiliseriez:
Contrairement à simple
if (elem)
, il permet0
,false
,NaN
et''
, mais rejettenull
ouundefined
, 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é sielem
est garanti d'être un objet, ou sifalse
,0
etc. sont considérés comme des valeurs « par défaut » (donc équivalent àundefined
ounull
).typeof elem == 'undefined'
peut être utilisé dans les cas où un spécifiénull
a une signification distincte pour une variable ou une propriété non initialisée.elem
n'est pas déclarée (c'est-à-dire sansvar
instruction, pas une propriété dewindow
, 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
:Cependant, parce que le
undefined
peut être remplacé par une autre valeur, il est préférable de déclarer la variableundefined
dans la portée actuelle avant de l'utiliser:Ou:
Un avantage secondaire de cette méthode est que les minificateurs JS peuvent réduire la
undefined
variable à un seul caractère, ce qui vous fait économiser quelques octets à chaque fois.la source
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.window.
avant la variable si elle est utilisée dans le contexte global ... ce n'est pas la meilleure façon.void(0)
place deundefined
.false
,0
etc. comme valeurs non valides.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 globaleEn tant que telle, la
hasOwnProperty()
méthode, quia
var
de "varname" a été déclaré globalement, c'est -à- dire qu'il est une propriété dewindow
.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
var
pour définir une variable , par opposition àlet
laquelle: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:Étant donné que les
let
variables ou lesconst
constantes ne sont jamais les propriétés d'un objet qui a hérité de lahasOwnProperty()
méthode, il ne peut pas être utilisé pour vérifier leur existence.Concernant la disponibilité et l'utilisation de
hasOwnProperty()
:la source
true
(par exemplewindow.hasOwnProperty('console')
ouvar hop = "p";window.hasOwnProperty('hop')
).typeof
réponses ignorent tout simplement.let
lesquelles ces variables ne sont pas disponibles en tant que propriétés de l'objetwindow
[ou de tout autre objet disponible].hasOwnProperty
teste 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 parlet
.var
et n'est à cet égard pas dépassée. J'ai cependant ajouté une note expliquant en quoi l'utilisation delet
etconst
diffère de celle devar
. Merci pour votre inspiration; ensemble, nous nous levons :)hasOwnProperty
ne peut être utilisé que de la manière prescrite pour vérifier l'existence devar
variables. Ça me va bien.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:
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:
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:
Cependant, cela produira une erreur de référence si vous appelez par exemple.
isset(foo)
et la variablefoo
n'a pas été définie, car vous ne pouvez pas transmettre une variable non existante à une fonction:Tester si les paramètres de fonction ne sont pas définis
Bien que notre
isset
fonction 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:Même si aucune valeur
y
n'est transmise à la fonctiontest
, notreisset
fonction fonctionne parfaitement dans ce contexte, car elley
est connue dans la fonctiontest
comme uneundefined
valeur.la source
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).
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
undefined
ounull
. 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
undefined
etnull
vérifierait ensemble.la source
typeof(booooo)
est"undefined"
alorstypeof(typeof boooooo)
est"string"
ettypeof boooooo && true
est toujourstrue
. @ La réponse de John-Slegers est à peu près aussi abrégée que possible avec typeof.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.Un moyen court de tester une variable non déclarée (non indéfinie) est
Je l'ai trouvé utile pour détecter un script exécuté en dehors d'un navigateur (n'ayant pas déclaré de
window
variable).la source
window.bar=undefined
est 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.const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();
. La variablex
est définie mais false est renvoyé ...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.
=== null
ou!== null
vérifiera seulement si la valeur de la variable est exactementnull
.== null
ou!= null
vérifiera si la valeur estundefined
ounull
.if(value)
vérifiera si la variable estundefined
,null
,0
ou une chaîne vide.la source
La réponse la plus élevée est correcte, utilisez typeof.
Cependant, ce que je voulais souligner, c'est que dans JavaScript
undefined
est mutable (pour une raison impie). Donc, simplement faire une vérification pourvarName !== undefined
a 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 utilisertypeof
, 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'utilisertypeof
car il ignorera tout remplacement d'unundefined
autre code. Surtout si vous écrivez du code à utiliser dans la nature où qui sait quoi d'autre pourrait être exécuté sur la page ...la source
varName !== undefined
cela provoquera simplement une ReferenceError. La mutabilité deundefined
n'a pas d'importance.undefined
s'agit d'une propriété en lecture seule. Cependant, pour être à l'épreuve des balles, vous pouvez utilisertypeof mvVar === typeof void 0
.void 0
renvoieundefined
toujours.Ou mieux
Fonctionne dans tous les navigateurs
la source
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:.. pourrait être réduit à:
la source
''
votre solution, il serait considéré comme non défini, alors qu'il est en fait défini comme contenant une chaîne vide.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.
la source
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:
la source
La vérification la plus robuste «est-elle définie» est avec typeof
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:
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 :
la source
vous pouvez utiliser l'
typeof
opérateur.Par exemple,
L'extrait de code ci-dessus renverra la sortie comme
la source
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
.la source
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 uneundefined
valeur, et donc qu'elle a été déclarée d'une manière telle quevar 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 .:
À 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.
la source
in
opérateur teste uniquement l'existence des propriétés, et toutes les variables ne sont pas des propriétés -const
et leslet
déclarations ne le sont pas (etconst
ne sont même pas des variables ).const
etlet
ont é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 .in
opé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 aveclet
existe en utilisant l'in
opérateur - vous ne pouvez pas.window
objet, je ne sais pas comment vous le rendre plus clair.let
mot - clé. C'est tout ce que je soulignais.Dans la situation particulière décrite dans la question,
est identique à
Je préfère ce dernier car il est plus court.
Veuillez noter que nous recherchons
console
uniquement dans la portée globale (qui est unwindow
objet dans tous les navigateurs). Dans cette situation particulière, c'est souhaitable. Nous ne voulons pas deconsole
dé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.
la source
J'utilise deux façons différentes selon l'objet.
Parfois, je ne veux pas évaluer une chaîne vide comme falsey, alors j'utilise ce cas
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.
la source
Ma préférence est
typeof(elem) != 'undefined' && elem != null
.Quel que soit votre choix, pensez à placer le chèque dans une fonction comme
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
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:
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)
la source
typeof (x) != 'undefined' && x != null
est équivalent àx != null
quandx
est déclaré.Ç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:
(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.
la source
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 strict
mode)Afficher l'extrait de code
BONUS: (se référant à d'autres réponses) Pourquoi
===
est plus clair que==
( source )si (a == b)
si (a === b)
la source
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.
la source
window.bar=undefined
est 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.Vous pouvez utiliser un bloc try ... catch comme suit:
Afficher l'extrait de code
Un inconvénient est que vous ne pouvez pas le mettre dans une fonction car cela lancerait une ReferenceError
la source