Nous utilisons fréquemment le modèle de code suivant dans notre code JavaScript
if (typeof(some_variable) != 'undefined' && some_variable != null)
{
// Do something with some_variable
}
Existe-t-il une manière moins verbeuse de vérifier qui a le même effet?
Selon certains forums et la littérature, simplement ce qui suit devrait avoir le même effet.
if (some_variable)
{
// Do something with some_variable
}
Malheureusement, Firebug évalue une telle déclaration comme une erreur lors de l'exécution lorsqu'elle some_variable
n'est pas définie, tandis que la première est très bien pour cela. Est-ce seulement un comportement (indésirable) de Firebug ou y a-t-il vraiment une différence entre ces deux façons?
javascript
null
undefined
Tomas Vana
la source
la source
if(some_variable) { ... }
ne s'exécutera pas sisome_variable
estfalse
ou0
ou ...Réponses:
Vous devez différencier les cas:
undefined
ou non déclarées . Vous obtiendrez une erreur si vous accédez à une variable non déclarée dans un autre contexte quetypeof
.Une variable déclarée mais non initialisée est
undefined
.Propriétés non définies , comme
someExistingObj.someUndefProperty
. Une propriété non définie ne génère pas d'erreur et renvoie simplementundefined
, qui, lorsqu'elle est convertie en booléen, est évaluéefalse
. Donc, si vous ne vous souciez pas0
etfalse
, l'utilisationif(obj.undefProp)
est ok. Il existe un idiome commun basé sur ce fait:ce qui signifie "si
obj
possède la propriétéprop
, affectez-la àvalue
, sinon affectez la valeur par défautdefautValue
".Certaines personnes considèrent ce comportement déroutant, arguant qu'il conduit à des erreurs difficiles à trouver et recommandant d'utiliser l'
in
opérateur à la placela source
undefined
.typeof
renvoie une chaîne. Nevar myVar; typeof(myVar)==undefined
revient doncfalse
pastrue
.Je pense que le moyen le plus efficace de tester la "valeur est
null
ouundefined
" estCes deux lignes sont donc équivalentes:
Note 1
Comme mentionné dans la question, la variante courte nécessite d'
some_variable
avoir été déclarée, sinon une ReferenceError sera levée. Cependant, dans de nombreux cas d'utilisation, vous pouvez supposer que cela est sûr:vérifiez les arguments facultatifs:
vérifier les propriétés d'un objet existant
D'autre part,
typeof
peut traiter des variables globales non déclarées (renvoie simplementundefined
). Pourtant, ces cas devraient être réduits au minimum pour de bonnes raisons, comme l'a expliqué Alsciende.Note 2
Cette variante - encore plus courte - n'est pas équivalente:
donc
Note 3
En général, il est recommandé d'utiliser à la
===
place de==
. La solution proposée fait exception à cette règle. Le vérificateur de syntaxe JSHint fournit même l'eqnull
option pour cette raison.À partir du guide de style jQuery :
la source
== null
est à mon humble avis la plus efficace pour tester «nul ou non défini» (qui est le sujet des questions). Ce n'est pas rare (utilisé 43 fois dans jQuery 1.9.1), car très souvent vous savez que la variable a été déclarée - ou vous testez une propriété d'un objet existant commeif( o.foo == null)
.window.someProperty == null
. Pour les variables locales, vous pouvez facilement vous assurer qu'elles sont déclarées: au lieu d'écrireif (...) {var local = ""}
writevar local; if (...) { local = ""; }
La vérification de null avec une égalité normale renvoie également true pour undefined.
if (window.variable == null) alert('variable is null or undefined');
la source
NaN
de l'équation de différence ne peut jamais être égalDans les normes JavaScript plus récentes comme ES5 et ES6, vous pouvez simplement dire
tous renvoient false, ce qui est similaire à la vérification par Python des variables vides. Donc, si vous voulez écrire une logique conditionnelle autour d'une variable, dites simplement
ici "null" ou "chaîne vide" ou "non défini" seront gérés efficacement.
la source
null
etundefined
, d'autres valeurs de fausseté devraient retourner vrai!0
,NaN
. C'est pour quand vous voulez capturer la véracité d'un objet sans garder une référence à l'objet afin que vous puissiez stocker cela plutôt qu'un objet potentiellement grand. Pour info, cela équivaut également à!!value
ce que le premier!
nie la véracité et le second la nie à nouveau.if (var)
qui sera casté en booléen, donc fondamentalement complètement inutile ...Boolean(undefined)
ça marche, essayer cela avec une variable non définie ne fonctionne pas , et c'est tout l'intérêt de faire la vérification de null ou indéfini. Ceci:if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }
lance une ReferenceError disant "ReferenceError: undeclareVarName n'est pas défini"Si vous essayez de référencer une variable non déclarée, une erreur sera levée dans toutes les implémentations JavaScript.
Les propriétés des objets ne sont pas soumises aux mêmes conditions. Si une propriété d'objet n'a pas été définie, une erreur ne sera pas générée si vous essayez d'y accéder. Donc, dans cette situation, vous pouvez raccourcir:
à
Dans cet esprit, et du fait que les variables globales sont accessibles en tant que propriétés de l'objet global (
window
dans le cas d'un navigateur), vous pouvez utiliser ce qui suit pour les variables globales:Dans les étendues locales, il est toujours utile de s'assurer que les variables sont déclarées en haut de votre bloc de code, cela économisera sur les utilisations récurrentes de
typeof
.la source
if (myObj.some_property != null)
pour obtenir un comportement équivalent.Tout d'abord, vous devez être très clair sur ce que vous testez. JavaScript a toutes sortes de conversions implicites pour vous déclencher, et deux types différents de comparateur d'égalité:
==
et===
.Une fonction
test(val)
qui testenull
ouundefined
devrait avoir les caractéristiques suivantes:Voyons quelles idées ici passent réellement notre test.
Ces travaux:
Ceux-ci ne fonctionnent pas:
J'ai créé une entrée jsperf pour comparer l'exactitude et les performances de ces approches. Les résultats ne sont pas concluants pour le moment car il n'y a pas eu suffisamment d'exécutions sur différents navigateurs / plates-formes. Veuillez prendre une minute pour exécuter le test sur votre ordinateur!
À l'heure actuelle, il semble que le
val == null
test simple donne les meilleures performances. C'est aussi à peu près le plus court. Le test peut être annuléval != null
si vous voulez le complément.la source
c'est le seul cas dans lequel
==
il faut utiliser:la source
val != null
pour le contraire, juste un=
et puisque par @Yukulele c'est le SEUL à utiliser,==
vous saurez ce que fait quand vous le voyez.Puisqu'il n'y a pas de réponse unique complète et correcte, je vais essayer de résumer:
En général, l'expression:
ne peut pas être simplifié, car le
variable
pourrait être non déclaré, donc l'omissiontypeof(variable) != "undefined"
entraînerait ReferenceError. Mais, vous pouvez simplifier l'expression en fonction du contexte :Si le
variable
est global , vous pouvez simplifier pour:Si elle est locale , vous pouvez probablement éviter les situations où cette variable n'est pas déclarée, et simplifier également pour:
S'il s'agit d' une propriété d'objet , vous n'avez pas à vous soucier de ReferenceError:
la source
navigator
partie dewindow
? Lorsque nous obtenons une exception pournavigator is not defined
, pouvons-nous utiliser lewindow.navigator != null
test?Vous pouvez simplement vérifier si la variable a une valeur ou non. Sens,
Si vous ne savez pas si une variable existe (c'est-à-dire si elle a été déclarée), vous devriez vérifier avec l'opérateur typeof. par exemple
la source
Je l'ai fait en utilisant cette méthode
enregistrer l'identifiant dans une variable
puis utiliser si condition
la source
Ceci est un exemple d'une occasion très rare où il est recommandé d'utiliser à la
==
place de===
. L'expressionsomevar == null
renvoie true pourundefined
etnull
, mais false pour tout le reste (une erreur si la variable n'est pas déclarée).L'utilisation de la
!=
touche inversera le résultat, comme prévu.Les éditeurs modernes ne vous avertiront pas pour l'utilisation
==
ou l'!=
opérateurnull
, car c'est presque toujours le comportement souhaité.Comparaisons les plus courantes:
Essayez-le vous-même:
la source
Comme mentionné dans l'une des réponses, vous pouvez avoir de la chance si vous parlez d'une variable qui a une portée globale. Comme vous le savez peut-être, les variables que vous définissez globalement ont tendance à être ajoutées à l'objet Windows. Vous pouvez profiter de ce fait, alors disons que vous accédez à une variable appelée bleh, utilisez simplement l'opérateur double inversé (!!)
Cela retournerait un faux alors que bleh n'a pas été déclaré ET assigné une valeur.
la source
voici une autre façon d'utiliser la méthode Array includes () :
la source
quel que soit aaa est indéfini ou nul, il retournera vrai
Oui
non
la source
Ouvrez les outils de développement dans votre navigateur et essayez simplement le code affiché dans l'image ci-dessous.
la source
Afin de comprendre, analysons quelle sera la valeur renvoyée par le moteur Javascript lors de la conversion non définie, null et '' (une chaîne vide également). Vous pouvez directement vérifier la même chose sur votre console développeur.
Vous pouvez voir que tous se convertissent en faux, ce qui signifie que tous ces trois supposent le «manque d'existence» par javascript. Vous n'avez donc pas besoin de vérifier explicitement les trois dans votre code comme ci-dessous.
Je voudrais également souligner une dernière chose.
Quel sera le résultat de Boolean (0)?
Bien sûr, faux. Cela créera un bogue dans votre code lorsque 0 est une valeur valide dans votre résultat attendu. Assurez-vous donc de vérifier cela lorsque vous écrivez le code.
la source
Semblable à ce que vous avez, vous pourriez faire quelque chose comme
if (some_variable === undefined || some_variable === null) { do stuff }
la source
Le test de nullité (
if (value == null)
) ou de non-nullité (if (value != null)
) est moins détaillé que le test de l'état de définition d'une variable.De plus, le test
if (value)
(ouif( obj.property)
) pour garantir l'existence de votre variable (ou propriété d'objet) échoue s'il est défini avec unefalse
valeur booléenne . Caveat emptor :)la source
Les deux valeurs peuvent être facilement distinguées en utilisant l'opérateur de comparaison strict:
Exemple de travail à:
http://www.thesstech.com/tryme?filename=nullandundefined
Exemple de code:
la source
Si le but de l'instruction if est de rechercher des valeurs
null
ouundefined
avant d'attribuer une valeur à une variable, vous pouvez utiliser l' opérateur de coalescence nul , enfin disponible sur JavaScript, bien que la prise en charge du navigateur soit limitée. Selon les données de caniuse , seulement 48,34% des navigateurs sont pris en charge (en avril 2020).Cela garantira que la variable sera affectée à une chaîne vide (ou toute autre valeur par défaut) si
some_variable
estnull
ouundefined
.Cet opérateur est le plus adapté à votre cas d'utilisation, car il ne renvoie pas la valeur par défaut pour les autres types de valeur de falsification tels que
0
et''
.la source
Vous devez définir une fonction de ce formulaire:
la source
Dans ES5 ou ES6, si vous avez besoin de le vérifier plusieurs fois, vous pouvez le faire:
la source
Avec Ramda, vous pouvez simplement faire
R.isNil(yourValue)
Lodash et d'autres bibliothèques d'aide ont la même fonction.la source