Désolé pour ce qui est peut-être une question javascript très stupide (je suis de l'arrière-plan cpp / java) mais je ne trouve pas de réponse. J'écris un petit extrait js qui doit vérifier si l'en-tête de réponse est présent ou non. Voilà comment je le fais:

var xhttp = new XMLHttpRequest();
xhttp.open("GET", "NewServlet", false);
xhttp.send();
var name = xhttp.getResponseHeader("name");
if (name === "null") {...}

Maintenant, cette partie avec "null", je pense qu'elle est tout simplement fausse. Vraiment, mon servlet ne définit pas cet en-tête, il doit donc être nul, mais pas "null" de type chaîne. Pourquoi est-ce que j'obtiens "null" au lieu de null? Comment vérifier que l'en-tête de réponse est vide de la réponse ajax, ou vérifier si la chaîne est vide?

EDIT: Le truc c'est que quand je mets

var name = xhttp.getResponseHeader("rhrhrhrhers");
if (!name) {...}

La condition (! nom) ne tient sûrement pas, car le nom est "nul", pas nul. Il n'y a pas un tel en-tête de réponse à coup sûr, donc il y a une conversion de type cachée en cours sous le capot. Il convertit le null en "null" lors du retour du résultat de getResponseHeader ().

EDIT2: Après quelques recherches dans la console:

> var name = null;
< undefined
> name
< "null"
> if (!name) console.log("f");
< undefined
> if (name) console.log("f");
  f
< undefined

Maintenant, cela n'a pas beaucoup de sens pour moi, bien que j'assigne honnêtement null à var, cela rend la piqûre avec la valeur "null" et la condition ne tient pas.

EDIT3:

Il semble que la variable appelée nom ait une signification particulière dans js! Bien que je ne sache pas lequel, comme dans le validateur de nom de variable JavaScript (https://mothereff.in/js-variables) il dit que c'est légitime.

C'est ce qui se passe dans la console:

var name = null;
undefined
var test = null;
undefined
name
"null"
test
null

Comme vous pouvez le voir, l'interpréteur js traite quelque peu le nom var autrement que les autres noms (comme test ou autre). La raison n'est toujours pas claire pour moi.

1
southerton 7 août 2016 à 21:28

3 réponses

Meilleure réponse

En fait, la raison en était que

var name = null;

Était de portée globale, et qui s'appelait effectivement la propriété window.name; La propriété window.name a un setter qui convertit tout ce que je passe en chaîne.

Considérer:

> var name = 2;
< undefined
> name
< "2"

La solution est de ne pas toucher à la portée mondiale, car cela est considéré comme une mauvaise pratique. Au lieu:

   (function x() {
       var name = null;
       console.log(name);
    }());

Cela produira la sortie null sur la console car nous sommes cette fois-ci dans une fermeture automatique, donc ne touchez pas aux propriétés de la fenêtre globale.

0
southerton 10 août 2016 à 19:25

Je pense que ce que vous recherchez est if (xhttp.status === 0) {...}. Lorsque l'état est 0, cela signifie que la réponse est vide. Vous pouvez en savoir plus à ce sujet ici: XMLHttpRequest status 0 (responseText is empty)

0
Community 23 mai 2017 à 10:30

Habituellement, dans JS, vous faites simplement:

var xhttp = new XMLHttpRequest();
xhttp.open("GET", "NewServlet", false);
xhttp.send();
var name = xhttp.getResponseHeader("name");
if (!name) { 
   // no name header present
}

Cela testera si la valeur name est nulle (ou chaîne vide ou fausse). JS a une contrainte de type, ou une inférence pour les valeurs «véridiques» et «falsey». Ainsi, une chaîne vide est vaguement évaluée à false. Il en va de même pour null.

0
Alex 7 août 2016 à 18:40