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 méthode de vérification moins verbeuse ayant le même effet?
Selon certains forums et publications disant 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 au moment de l'exécution lorsque some_variable
n'est pas défini, alors que le premier convient parfaitement. S'agit-il uniquement d'un comportement (indésirable) de Firebug ou existe-t-il vraiment une différence entre ces deux méthodes?
Vous devez différencier deux cas:
Undefined variables, comme foo
. Vous obtiendrez une erreur si vous accédez à une variable non définie dans un contexte autre que typeof
.
if(typeof someUndefVar == whatever) // works
if(someUndefVar) // throws error
Donc, pour les variables, la vérification typeof
est indispensable. De l’autre côté, cela n’est que rarement nécessaire - vous savez généralement savoir si vos variables sont définies ou non.
Undefined properties, comme someExistingObj.someUndefProperty
. Une propriété non définie ne génère pas d'erreur et renvoie simplement undefined
, qui, une fois convertie en un booléen, est évaluée à false
. Donc, si vous ne vous souciez pas de 0
et false
, utiliser if(obj.undefProp)
est correct. Il y a un langage commun basé sur ce fait:
value = obj.prop || defaultValue
ce qui signifie "si obj
a la propriété prop
, affectez-la à value
, sinon affectez la valeur par défaut defautValue
".
Certaines personnes considèrent que ce comportement est déroutant, arguant qu'il entraîne des erreurs difficiles à trouver et recommande d'utiliser plutôt l'opérateur in
value = ('prop' in obj) ? obj.prop : defaultValue
Je pense que le moyen le plus efficace de tester "la valeur est null
ou undefined
" est
if ( some_variable == null ){
// some_variable is either null or undefined
}
Donc, ces deux lignes sont équivalentes:
if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}
Note 1
Comme mentionné dans la question, la variante courte nécessite que some_variable
ait été déclaré, sinon une erreur ReferenceError sera émise. Cependant, dans de nombreux cas d'utilisation, vous pouvez supposer que cela est sans danger:
vérifier les arguments optionnels:
function(foo){
if( foo == null ) {...}
rechercher des propriétés sur un objet existant
if(my_obj.foo == null) {...}
D'autre part, typeof
peut traiter des variables globales non déclarées (renvoie simplement undefined
). Pourtant, ces cas devraient être réduits au minimum pour de bonnes raisons, comme l'explique Alsciende.
Note 2
Cette variante - encore plus courte - est pas équivalente:
if ( !some_variable ) {
// some_variable is either null, undefined, 0, NaN, false, or an empty string
}
alors
if ( some_variable ) {
// we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}
Note 3
En général, il est recommandé d'utiliser ===
au lieu de ==
..__ La solution proposée est une exception à cette règle. Le vérificateur de syntaxe JSHint fournit même l'option eqnull
pour cette raison.
À partir du guide de style jQuery :
Des contrôles d'égalité stricts (===) doivent être utilisés en faveur de ==. Le seul exception est lors de la vérification de indéfini et null au moyen de null.
// Check for both undefined and null values, for some important reason. undefOrNull == null;
Dans les nouvelles normes JavaScript telles que ES5 et ES6, vous pouvez simplement dire
> Boolean(0) //false
> Boolean(null) //false
> Boolean(undefined) //false
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
if (Boolean(myvar)){
// Do something
}
ici, "null" ou "chaîne vide" ou "indéfini" seront gérés efficacement.
Si vous essayez de référencer une variable non déclarée, une erreur sera généré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:
if (typeof(myObj.some_property) != "undefined" && myObj.some_property != null)
à
if (myObj.some_property != null)
Dans cet esprit et avec le 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 les éléments suivants pour les variables globales:
if (window.some_variable != null) {
// Do something with some_variable
}
Dans les portées locales, il est toujours utile de s'assurer que les variables sont déclarées en haut de votre bloc de code, cela vous évitera des utilisations récurrentes de typeof
.
Tout d'abord, vous devez être très clair sur ce que vous testez. JavaScript a toutes sortes de conversions implicites pour vous faire trébucher et deux types différents de comparateur d'égalité: ==
et ===
.
Une fonction, test(val)
, qui teste null
ou undefined
devrait avoir les caractéristiques suivantes:
test(null) => true
test(undefined) => true
test(0) => false
test(1) => false
test(true) => false
test(false) => false
test('s') => false
test([]) => false
Voyons quelles sont les idées ici qui passent réellement notre test.
Ceux-ci fonctionnent:
val == null
val === null || val === undefined
typeof(val) == 'undefined' || val == null
typeof(val) === 'undefined' || val === null
Ceux-ci ne fonctionnent pas:
typeof(val) === 'undefined'
!!val
J'ai créé une entrée jsperf pour comparer l'exactitude et la performance de ces approches. Les résultats ne sont pas concluants pour le moment car il n'y a pas eu suffisamment de sorties sur différents navigateurs/plates-formes. S'il vous plaît, prenez une minute pour exécuter le test sur votre ordinateur!
À l’heure actuelle, il semble que le simple test val == null
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.
Vous pouvez simplement vérifier si la variable a une valeur ou non. Sens,
if( myVariable ) {
//mayVariable is not :
//null
//undefined
//NaN
//empty string ("")
//0
//false
}
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.
if( typeof myVariable !== 'undefined' ) {
// myVariable will get resolved and it is defined
}
J'ai fait cela en utilisant cette méthode
enregistre l'identifiant dans une variable
var someVariable = document.getElementById("someId");
puis utiliser si condition
if(someVariable === ""){
//logic
} else if(someVariable !== ""){
//logic
}
Puisqu'il n'y a pas une seule réponse complète et correcte, je vais essayer de résumer:
En général, l'expression:
if (typeof(variable) != "undefined" && variable != null)
ne peut pas être simplifié, car la variable variable
pourrait ne pas être déclarée. Si vous omettez la typeof(variable) != "undefined"
, vous obtiendrez ReferenceError. Mais, vous pouvez simplifier l'expression en fonction du contexte :
Si la variable
est global , vous pouvez simplifier pour:
if (window.variable != null)
S'il s'agit de local , vous pouvez probablement éviter les situations où cette variable est non déclarée et simplifier également:
if (variable != null)
S'il s'agit de propriété d'objet , vous n'avez pas à vous soucier de ReferenceError:
if (obj.property != null)
Comme mentionné dans l'une des réponses, vous pouvez avoir de la chance si vous parlez d'une variable ayant 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 tirer parti de ce fait, disons que vous accédez à une variable appelée bleh, utilisez simplement l'opérateur double inversé (!!)
!!window['bleh'];
Cela renverrait un faux tant que bleh n'a pas été déclaré ET qu'une valeur lui a été attribuée.
Pour comprendre, analysons quelle sera la valeur renvoyée par le moteur Javascript lors de la conversion de indéfini, null et '' (une chaîne vide également). Vous pouvez directement vérifier la même chose sur votre console de développeur.
Vous pouvez voir que tous sont en train de convertir en false, ce qui signifie que tous les trois supposent un «manque d’existence» par javascript. Vous n'avez donc pas besoin de vérifier explicitement les trois dans votre code comme ci-dessous.
if (a === undefined || a === null || a==='') {
console.log("Nothing");
} else {
console.log("Something");
}
Aussi, je tiens à 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 de vérifier cela lorsque vous écrivez le code.
quel que soit yyy n'est pas défini ou est nul, il retournera vrai
if (typeof yyy == 'undefined' || !yyy) {
console.log('yes');
} else {
console.log('no');
}
oui
if (!(typeof yyy == 'undefined' || !yyy)) {
console.log('yes');
} else {
console.log('no');
}
non
c'est le seul cas dans lequel ==
devrait être utilisé:
if (val == null) console.log('val is null or undefined')
Les deux valeurs peuvent être facilement distinguées à l'aide de l'opérateur de comparaison strict:
Exemple de travail à:
http://www.thesstech.com/tryme?filename=nullandundefined
Exemple de code:
function compare(){
var a = null; //variable assigned null value
var b; // undefined
if (a === b){
document.write("a and b have same datatype.");
}
else{
document.write("a and b have different datatype.");
}
}
voici une autre manière en utilisant la méthode Array includes () :
[undefined, null].includes(value)
Tester la nullité (if (value == null)
) ou la non-nullité (if (value != null)
) est moins détaillé que de tester le statut de définition d'une variable.
De plus, tester if (value)
(ou if( obj.property)
) pour vérifier l'existence de votre variable (ou propriété d'objet) échoue s'il est défini avec une valeur booléenne false
. Caveat emptor :)
Semblable à ce que vous avez, vous pourriez faire quelque chose comme
if (some_variable === undefined || some_variable === null) { do stuff }