javascript vérifie non nul


133

Vous trouverez ci-dessous un extrait de code, où nous récupérons une valeur de formulaire. Avant de poursuivre le traitement, vérifiez si la valeur n'est pas nulle.

var val = document.FileList.hiddenInfo.value;
alert("val is " + val);  // this prints null which is as expected
if (val != null)
{
   alert("value is "+val.length); // this returns 4
}
else
{
   alert("value* is null");
}

Des idées pourquoi cela arrive-t-il ainsi .. ??


2
CW s'est produit parce que plus de 6 utilisateurs ont modifié la question.
VOUS

! == au lieu de! =
GetBackerZ

Réponses:


78

C'est parce que val n'est pas null, mais contient 'null'comme une chaîne.

Essayez de vérifier avec «null»

if ('null' != val)

Pour savoir quand et pourquoi cela fonctionne, consultez les détails ci-dessous .


2
devrait être if (null! = val) d'une manière ou d'une autre, il ne fonctionnait pas avec les guillemets
Ananda

M.x dans la question, null était comme une chaîne ... votre cas est probablement différent
Arsen Mkrtchyan

145

cela fera l'affaire pour vous

if (!!val) {
    alert("this is not null")
} else {
    alert("this is null")
}

22
alors que techniquement cela fonctionne, un double not (!!) est un faux-pas de programmation. C'est vraiment l'équivalent de if(val), ce qui est beaucoup plus clair à lire. Je m'en tiendrai à cela (fyi Ujwal, !! val devrait techniquement fonctionner en C ou C ++ également) voir ici pour les valeurs de `` vérité '' javascript: janosch.woschitz.org/javascript-equality-comparison
Will Buck

2
et si (! Boolean (val))
thedjaney

1
!! est juste un double négatif, donc il dit littéralement if (val.exists). J'aime toujours son apparence!
Kurai Bankusu

12
cela échouera si val = 0puisque !!0évalue à false
punkrockpolly

3
Ce n'est pas un simple double négatif. C'est un double négatif transformant. Vous transformez essentiellement la variable en booléen. Il y a beaucoup à dire sur le sujet , mais il suffit de dire que dans les cas où la variable est 0, false, null, undefinedou une valeur telle que décide de truel'un!, Vous allez obtenir falsepour !!. Il doit être utilisé avec parcimonie, voire pas du tout.
Guy Passy

83

Il y a 3 façons de vérifier «non nul». Ma recommandation est d'utiliser la version Strict Not.

1. Version non stricte

if (val !== null) { ... }

La version Strict Not utilise «l'algorithme de comparaison d'égalité stricte» http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6 . Le !==a des performances plus rapides que l' !=opérateur car l'algorithme de comparaison d'égalité stricte ne transforme pas les valeurs.

2. Version non stricte

if (val != 'null') { ... }

La version non stricte utilise «l'algorithme de comparaison d'égalité abstraite» http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 . Le !=a des performances plus lentes que l' !==opérateur car l'algorithme de comparaison d'égalité abstraite diffuse des valeurs.

3. Version Double Not

if (!!val) { ... }

La version Double Not !!a des performances plus rapides que la version Strict Not !==et la version Non-Strict Not !=( https://jsperf.com/tfm-not-null/6 ). Cependant, il transtypera les valeurs "Falsey" comme undefinedet NaNdans False ( http://www.ecma-international.org/ecma-262/5.1/#sec-9.2 ), ce qui peut conduire à des résultats inattendus, et sa lisibilité est moins bonne car nulln'est pas explicitement indiqué.


C'est très étrange. !!valtravaillé pour moi mais val!==nullpas. Pourquoi ça?
TheLogicGuy

@TheLogicGuy - Quel est le type de données val? console.log(typeof val).
tfmontague

nombre. le code supprime les «mauvaises» valeurs du tableau (nul, 0, etc.). Voici le code: pastebin.com/L7Z1BtuL
TheLogicGuy

1
@TheLogicGuy - Votre problème réel n'a rien à voir avec null. NaN ne filtre pas correctement - cela retournera toujours vrai. Cela devrait fonctionner:! (IsNaN (val) && (typeof val! == "undefined")). En Javascript, il existe un concept connu sous le nom de "Truthy" et "Falsey". L'opérateur double-not !!supprimera plus que juste null. Il convertit NaNet undefineden faux aussi. Et c'est pourquoi votre tableau filtre correctement lors de l'utilisation de l'opérateur double non !!.
tfmontague

30

Utiliser !==comme vous !=fera entrer dans un monde de bizarreries de table de vérité JavaScript non transitive.


Sauf si vous souhaitez vérifier spécifiquement undefinedou null. Dans ce cas val != null, retournera truepour undefinedou nullmais pas pour d'autres valeurs fausses comme 0.
Eric H

8

Vous devriez utiliser l' not equalsopérateur de comparaison stricte !==pour que si l'utilisateur entre "null"alors vous n'obtiendrez pas le else.


1
Susan Null ne serait pas heureuse si son nom n'était pas accepté dans un formulaire de saisie de données lol
Andez

5

C'est peut-être parce que la valeur de valest en fait la chaîne "null"plutôt que la valeur null.


3

Cela devrait fonctionner correctement.

   if(val!= null)
    {
       alert("value is "+val.length); //-- this returns 4
    }
    else
    {
       alert("value* is null");
    }

2

Si vous souhaitez pouvoir inclure 0 comme valeur valide:

if (!!val || val === 0) { ... }

1

Cela fonctionnera:

if (val) {
    alert("Not null");
} else {
    alert("Null");
}

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.