578 votes

Comment vérifier la présence d'une variable indéfinie ou nulle en JavaScript ?

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 façon moins verbeuse de vérifier qui a le même effet ?

Selon certains forums et la littérature, dire 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 est indéfinie, alors que la première lui convient parfaitement. S'agit-il seulement d'un comportement (indésirable) de Firebug ou y a-t-il vraiment une différence entre ces deux méthodes ?

55 votes

if(some_variable) { ... } ne s'exécutera pas si some_variable est false o 0 ou ...

1 votes

Bon point ;) Mais disons que je sais qu'il ne peut pas être faux ou 0 et que je veux juste vérifier si je peux l'utiliser dans une certaine logique (comme une chaîne, un tableau, etc.).

0 votes

533voto

mar10 Points 2617

Je pense que la manière la plus efficace de tester la "valeur" est de null o undefined " est

if ( some_variable == null ){
  // some_variable is either null or undefined
}

Ces deux lignes sont donc équivalentes :

if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}

Note 1

Comme mentionné dans la question, la variante courte exige que some_variable a été déclarée, sinon une ReferenceError sera déclenchée. Cependant, dans de nombreux cas d'utilisation, vous pouvez supposer que cela est sûr :

vérifier les arguments optionnels :

function(foo){
    if( foo == null ) {...}

vérifier les propriétés d'un objet existant

if(my_obj.foo == null) {...}

D'autre part typeof peut traiter les variables globales non déclarées (il retourne 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 équivalent :

if ( !some_variable ) {
  // some_variable is either null, undefined, 0, NaN, false, or an empty string
}

donc

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 site Contrôleur de syntaxe JSHint fournit même le eqnull pour cette raison.

De la Guide de style jQuery :

Les contrôles d'égalité stricts (===) doivent être utilisés au profit de ==. exception est la vérification de la présence d'undefined et de null par le biais de null.

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;

EDIT 2021-03 :

De nos jours, la plupart des navigateurs soutenir le Opérateur de coalescence nul ( ?? ) et le Affectation logique de la nullité (??=) qui permet une manière plus concise d'attribuer une d'attribuer une valeur par défaut si une variable est nulle ou indéfinie, par exemple :

if (a.speed == null) {
  // Set default if null or undefined
  a.speed = 42;
}

peut être écrit sous l'une des formes suivantes

a.speed ??= 42;
a.speed ?? a.speed = 42;
a.speed = a.speed ?? 42;

1 votes

Différence très importante (qui a déjà été mentionnée dans la question d'ailleurs). C'est pourquoi tout le monde utilise typeof. Désolé mais je ne vois pas en quoi votre réponse est utile, vous ne faites qu'énoncer ce qui était dit dans la question et dans les premières lignes vous l'énoncez même de manière erronée.

41 votes

Désolé, mais je ne suis pas d'accord ;-) Utilisation de == null est, à mon avis, le moyen le plus efficace de tester la présence de "null ou undefined" (ce 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, par exemple if( o.foo == null) .

4 votes

@mar10 (aUndefinedVar == null) vous donne une erreur "aUndefinedVar n'est pas défini" pas vrai.

372voto

user187291 Points 28951

Il faut différencier les cas :

  1. Les variables peuvent être undefined o non déclaré . Vous obtiendrez une erreur si vous accédez à une variable non déclarée dans un contexte autre que typeof .

    if(typeof someUndeclaredVar == whatever) // works if(someUndeclaredVar) // throws error

Une variable qui a été déclarée mais non initialisée est undefined .

let foo;
if (foo) //evaluates to false because foo === undefined
  1. Indéfini propriétés comme someExistingObj.someUndefProperty . Une propriété indéfinie ne donne pas lieu à une erreur et renvoie simplement undefined qui, lorsqu'il est converti en booléen, est évalué à false . Donc, si vous ne vous souciez pas de 0 y false en utilisant if(obj.undefProp) c'est bon. Il y a un idiome commun basé sur ce fait :

    value = obj.prop || defaultValue

    ce qui signifie "si obj a la propriété prop et l'affecter à value sinon, attribuez la valeur par défaut defautValue ".

    Certaines personnes considèrent ce comportement comme déroutant, arguant qu'il conduit à des erreurs difficiles à trouver et recommandent d'utiliser la fonction in opérateur à la place

    value = ('prop' in obj) ? obj.prop : defaultValue

2 votes

Vous pourriez alors parler de hasOwnProperty et de prototypes. indexOf' dans [] !== [].hasOwnProperty('indexOf')

1 votes

Oui, j'ai pensé à ajouter ceci, mais j'ai décidé de sacrifier l'exhaustivité pour la brièveté ;)

73 votes

Vous n'abordez pas le problème du 0 et du faux

23voto

Andy E Points 132925

Si vous essayez de faire référence à 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 levée si vous essayez d'y accéder. Donc, dans cette situation, vous pourriez raccourcir :

 if (typeof(myObj.some_property) != "undefined" && myObj.some_property != null)

à

if (myObj.some_property != null)

Ceci étant, et compte tenu 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 :

if (window.some_variable != null) {
    // Do something with some_variable
}

Dans les scopes locaux, il est toujours utile de s'assurer que les variables sont déclarées en haut du bloc de code, ce qui permet d'éviter les utilisations récurrentes de la fonction typeof .

11 votes

Vous manquerez NaN, 0, "" et false car ils ne sont pas nuls ni indéfinis mais faux également.

0 votes

@Andreas Köberle a raison. Même l'opérateur d'égalité non stricte dit que null est différent de NaN, 0, "" et false. Vous devriez faire if (myObj.some_property != null) pour obtenir un comportement équivalent.

18voto

Drew Noakes Points 69288

Tout d'abord, vous devez être très clair sur ce que vous testez. JavaScript dispose de toutes sortes de conversions implicites qui peuvent vous faire trébucher, et de deux types différents de comparateurs d'égalité : == y === .

Une fonction, test(val) qui teste les null o undefined doit présenter 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 voir quelles sont les idées qui passent notre test.

Ils 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éé un entrée jsperf pour comparer l'exactitude et les performances de ces approches. Les résultats ne sont pas concluants pour l'instant car il n'y a pas eu assez d'essais sur différents navigateurs/plateformes. Veuillez prendre une minute pour effectuer le test sur votre ordinateur !

À l'heure actuelle, il semble que la simple val == null donne les meilleures performances. C'est aussi le plus court. Le test peut être annulé pour val != null si vous voulez le complément.

8voto

TMS Points 17522

Comme il n'existe pas de réponse unique, 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 le variable peut ne pas être déclarée, de sorte que l'omission de l'élément typeof(variable) != "undefined" entraînerait une ReferenceError. Mais, vous pouvez simplifier l'expression en fonction du contexte :

Si le variable est mondial vous pouvez simplifier :

if (window.variable != null)

Si c'est le cas local vous pouvez probablement éviter les situations où cette variable n'est pas déclarée, et aussi simplifier :

if (variable != null)

Si c'est le cas propriété de l'objet vous n'avez pas à vous soucier de ReferenceError :

if (obj.property != null)

0 votes

Est navigator partie de window ? Lorsque nous obtenons une exception pour navigator is not defined on peut utiliser le window.navigator != null test ?

0 votes

Re If it is local, you can probably avoid situations when this variable is undeclared, . En effet, si c'est local il ne peut pas n'est pas déclarée - donc ce n'est pas un problème. Votre extrait de code est toujours bon. [S'il n'y a pas de local déclaration de la variable, il s'agit alors - par définition - d'une référence à une mondial ce qui est probablement une erreur de programmation si vous pensiez qu'il s'agissait d'une variable locale, donc le fait que cela entraîne une erreur d'exécution est une bonne chose. Renforçant la valeur de l'utilisation de cet extrait de code plus court].

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X