web-dev-qa-db-fra.com

Pourquoi! == "" n'est pas égal à! == null

Récemment en JavaScript, j'ai pris l'habitude d'utiliser 

if(data !== "")

vérifier si les données sont nulles || non défini || chaîne vide. 

Quand j'essaie d'utiliser 

if(data !== null)
   //work here

Resharper jette une horrible erreur sur moi en disant que le 

"le qualificatif peut être nul ou non défini"

enter image description here

J'ai ajouté un jFiddle juste pour préciser: JsFiddle

Ma question est la suivante: S'agit-il d'une erreur ReSharper ou y a-t-il quelque chose derrière cela? 

6
Pogrindis

En bref, une var est null quand elle ne pointe pas nulle part. En revanche, une var égale à "" est une var définie pointant vers une variable contenant une chaîne vide. C'est essentiellement différent.

[EDIT] Comme @ jfriend00 l'indique correctement, null est une valeur spécifique en javascript. La différence serait alors que null est une valeur différente de "", qui est une chaîne vide et n'est donc pas nulle.

La valeur correcte pour un var qui n'est pas initialisé est undefined.

5
BenSorter

Tout d'abord, votre habitude est fausse. En utilisant:

if(data !== "")

Ne cherchera qu'une chaîne vide. Si data est undefined ou null, le bloc if est toujours exécuté car !== vérifie l'égalité sans effectuer de conversion de type.

Deuxièmement, ReSharper n'a pas de problème. Il essaie de vous dire que vous faites peut-être une erreur. if(data !== null) vérifiera uniquement avec null. undefined et une chaîne vide renverront toujours true et provoqueront l'exécution du bloc. ReSharper vous avertit que vous pouvez faites une erreur (car vous avez rarement besoin de vérifier simplement null).

Rappelez-vous simplement que undefined !== null !== "". Vous pouvez essayer plusieurs des raccourcis mentionnés, mais si vous voulez vraiment que votre code soit complet, vérifiez simplement les trois. Si vous craignez que le code soit trop long, déplacez le contrôle vers une méthode utilitaire:

function hasValue(var data) {
    return (data !== undefined) && (data !== null) && (data !== "");
}
11
Justin Niessner

Null et indéfini peuvent être traités de la même manière

if (typeof data === "undefined") retournera true si les données ne sont pas définies (ou nulles), donc 

if (typeof data !== "undefined")

retournera true si les données ont été définies (donc n'est pas null), alors vous pouvez vérifier si c'est une chaîne vide,

if (data.length == 0)

retournera true si la chaîne est vide.

1
theonlygusti

Est-ce une erreur ReSharper ou y a-t-il quelque chose derrière cela?

L'erreur peut être renvoyée à cause d'une linter dans resharper.

Pour vérifier si les données sont nulles || non défini || chaîne vide, vous pouvez mettre en cohérence la valeur des données avec un booléen (implicitement fait par js):

if(!data) //implicit coercion

ou le faire explicitement:

if(!Boolean(data)){ //same as above
//if data is a falsy value (false, 0, null , undefined, NaN, '' or ""), run
}

Vous pouvez consulter la liste des valeurs de vérité et de fausseté ici

Cela peut sembler évident, mais si vous n'avez pas compris certains des concepts ci-dessus, vous devriez les rechercher sur Google afin de mieux comprendre la langue, bravo.

0
Juan Pablo GM