176 votes

Vérification des nullités en JavaScript

Je suis tombé sur le code suivant :

function test(data) {
    if (data != null && data !== undefined) {
        // some code here
    }
}

Je suis quelque peu novice en JavaScript, mais d'après les autres questions que j'ai lues ici, j'ai l'impression que ce code n'a pas beaucoup de sens.


En particulier, cette réponse déclare que

Vous obtiendrez une erreur si vous accédez à une variable non définie dans un contexte autre que typeof .

Mise à jour : La (citation de la) réponse ci-dessus peut être trompeuse. Elle devrait dire "une variable non déclarée" au lieu de "une variable indéfinie" .

Comme je l'ai découvert, dans les réponses de Ryan , maérique y nwellnhof Ainsi, même lorsqu'une fonction n'a pas d'arguments, les variables correspondant à ces arguments sont toujours déclarées. Ce fait prouve également que le premier élément de la liste ci-dessous est faux.


D'après ce que je comprends, les scénarios suivants peuvent se produire :

  • La fonction a été appelée sans arguments, ce qui fait que data une variable non définie, et en levant une erreur sur data != null .

  • La fonction a été appelée spécifiquement avec null (ou undefined ), comme argument, auquel cas data != null protège déjà le code interne, rendant && data !== undefined inutile.

  • La fonction a été appelée avec un argument non nul, dans ce cas elle passera trivialement les deux data != null y data !== undefined .

Q : Est-ce que je comprends bien ?


J'ai essayé ce qui suit, dans la console de Firefox :

--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true

Je n'arrive pas à trouver un cas où les data !== undefined après data != null pourrait être d'une quelconque utilité.

9 votes

Il suffit d'utiliser if (data) . C'est un moyen mnémotechnique Javascript pour vérifier si data évalue à true. undefined , null Les valeurs suivantes, false, 0, chaîne vide, tableau vide et objet ( ?) sans propriétés, sont évaluées à false, le reste est vrai.

21 votes

@J0HN - Utilisation if(data) signifierait qu'il ne peut pas passer false o 0 comme valeurs pour data .

0 votes

@J0HN De plus, la même réponse que je mentionne indique également que : if(typeof someUndefVar == whatever) -- works y if(someUnderVar) -- error .

109voto

minitech Points 87225

Une "variable indéfinie" est différente de la valeur undefined .

Une variable non définie :

var a;
alert(b); // ReferenceError: b is not defined

Une variable avec la valeur undefined :

var a;
alert(a); // Alerts “undefined”

Lorsqu'une fonction prend un argument, cet argument est toujours déclaré même si sa valeur est undefined et il n'y aura donc pas d'erreur. Vous avez raison sur != null suivi par !== undefined être inutile, cependant.

32 votes

data !== null && data !== undefined aurait un sens, cependant.

0 votes

@bfavaretto : Yep, donc ça pourrait être une erreur de frappe. Mais on ne sait jamais :D

1 votes

C'est ce que je pensais, merci pour la clarification. De plus, je ne pense pas qu'il s'agisse d'une faute de frappe. J'ai lancé un trouver et compter dans tout le script, et il a trouvé 10 occurrences, donc... Je suppose que l'auteur a également besoin d'une clarification à ce sujet.

92voto

maerics Points 47743

En JavaScript, null est un objet singleton spécial qui est utile pour signaler "aucune valeur". Vous pouvez le tester par comparaison et, comme d'habitude en JavaScript, c'est une bonne pratique d'utiliser la balise === pour éviter de confondre la coercition de type :

var a = null;
alert(a === null); // true

Comme @rynah le mentionne, "undefined" est un peu confus en JavaScript. Cependant, il est toujours prudent de tester si la fonction typeof(x) est la chaîne "undefined", même si "x" n'est pas une variable déclarée :

alert(typeof(x) === 'undefined'); // true

De même, les variables peuvent avoir la "valeur indéfinie" si elles ne sont pas initialisées :

var y;
alert(typeof(y) === 'undefined'); // true

En mettant tout cela ensemble, votre chèque devrait ressembler à ceci :

if ((typeof(data) !== 'undefined') && (data !== null)) {
  // ...

Cependant, comme la variable "data" est toujours définie puisqu'il s'agit d'un paramètre de fonction formel, l'utilisation de l'opérateur "typeof" est inutile et vous pouvez en toute sécurité comparer directement avec la "valeur indéfinie".

function(data) {
  if ((data !== undefined) && (data !== null)) {
    // ...

Ce bout de phrase revient à dire "si la fonction a été appelée avec un argument qui est défini et qui n'est pas nul...".

5 votes

Por qué debe ça ressemble à ça, pourtant ? != null sera vrai pour toutes les valeurs sauf null y undefined et nous sommes sûrs que cette variable est déclarée. typeof dans d'autres situations peut même être dangereux - que se passe-t-il si vous vous trompez dans le nom de la variable ? Cela peut passer inaperçu pendant longtemps car il n'y a pas d'erreur.

0 votes

@maerics Donc, si j'ai bien suivi votre réponse, dans une vérification de nullité comme le scénario ci-dessus, vous ne devriez pas utiliser != du tout, seulement une comparaison stricte, !== ?

0 votes

@rynah : Je ne prétends pas en savoir assez sur la solution globale du PO pour savoir si un test nul est approprié ou non mais j'ai édité pour mentionner le fait que l'utilisation de "typeof" est inutile.

8voto

nwellnhof Points 7740

Q : La fonction a été appelée sans arguments, faisant ainsi de data une variable indéfinie, et générant une erreur si data != null.

A : Oui, data sera défini comme indéfini. Voir section 10.5 Instanciation de liaison de déclaration de la spécification. Mais l'accès à une valeur non définie n'entraîne pas d'erreur. Vous confondez probablement cela avec l'accès à une variable non déclarée en mode strict, qui entraîne une erreur.

Q : La fonction a été appelée spécifiquement avec null (ou undefined), comme argument, auquel cas data != null protège déjà le code interne, rendant && data !== undefined inutile.

Q : La fonction a été appelée avec un argument non nul, dans ce cas elle passera trivialement à la fois data != null et data !== undefined.

A : Correct. Notez que les tests suivants sont équivalents :

data != null
data != undefined
data !== null && data !== undefined

Voir section 11.9.3 L'algorithme de comparaison d'égalité abstraite y section 11.9.6 L'algorithme de comparaison d'égalité stricte de la spécification.

0 votes

Je ne confondais pas avec les variables non déclarées, je ne savais vraiment pas comment cela fonctionnait lorsqu'aucun argument n'était fourni. J'étais convaincu que data n'existerait pas du tout, au lieu d'être fixé à undefined . J'apprécie cette clarification, et ces références m'ont aidé à comprendre plus en détail le fonctionnement des deux égalités.

3voto

Jitin Sameer Points 253

typeof foo === "undefined" est différent de foo === undefined ne les confondez jamais. typeof foo === "undefined" est ce dont vous avez vraiment besoin. De plus, utilisez !== à la place de !=

La déclaration peut donc être écrite comme suit

function (data) {
  if (typeof data !== "undefined" && data !== null) {
    // some code here
  }
}

Editar:

Vous ne pouvez pas utiliser foo === undefined pour les variables non déclarées.

var t1;

if(typeof t1 === "undefined")
{
  alert("cp1");
}

if(t1 === undefined)
{
  alert("cp2");
}

if(typeof t2 === "undefined")
{
  alert("cp3");
}

if(t2 === undefined) // fails as t2 is never declared
{
  alert("cp4");
}

1 votes

Ok, mais la variable est déclarée dans ce cas, alors quel est le problème ?

0 votes

Personnellement, je trouve foo === undefined dangereux à utiliser. Il fait échouer votre code pour la même condition que vous essayiez d'empêcher.

0 votes

Je parle de l'argument de la fonction en question. Voir aussi mon autre commentaire .

2voto

Kadiri Points 30

La façon la plus simple de faire votre test est :

function (data) {
    if (data) { // check if null, undefined, empty ...
        // some code here
    }
}

5 votes

Ce test ne dépend-il pas du contexte ? Je veux dire, si le type attendu pour data est une chaîne de caractères, ce test renvoie false sur les chaînes vides, ce qui peut, ou non, être approprié (la fonction peut vouloir traiter la chaîne vide d'une certaine manière).

6 votes

Sauf que si "data" a la valeur "" o 0 o NaN (ou d'autres) le bloc "if" sera sauté, ce qui peut être ou non l'intention de l'OP.

0 votes

Désolé @afsantos, je n'ai pas vu votre commentaire, si vous voulez obtenir false lorsque les données sont indéfinies, null ... sauf lorsque la date est un vide, vous devrez créer une autre var toTest = data ; avec un autre test après le premier comme : if(toTest=="") { // un peu de code ici }

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