检查javascript中是否存在响应头,以及为什么string为“null”?

时间:2016-08-07 18:28:55

标签: javascript ajax

抱歉可能是一个非常愚蠢的javascript问题(我来自cpp / java背景),但我找不到答案。我正在写一个小js片段,需要检查响应头是否存在。我就是这样做的:

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

现在这部分为“null”我认为这是完全错误的。实际上,我的servlet没有设置这个头,因此它应该为null,但不是字符串类型的“null”。为什么我得到“null”而不是null?如何从ajax响应检查响应头是空的,还是检查字符串是否为空?

编辑:事情是,当我把

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

条件(!name)肯定不成立,因为名称是“null”,不是null。肯定没有这样的响应头,所以在引擎盖下有一些隐藏的类型转换。从getResponseHeader()返回结果时,它将null转换为“null”。

EDIT2:在控制台中进行一些调查之后:

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

现在这对我来说没有多大意义,虽然我给var赋予了诚实的null,但它使得sting值为“null”,并且条件不成立。

EDIT3:

看起来名为name的变量在js中有一些特殊含义!虽然我不知道哪个,如JavaScript变量名称验证器(https://mothereff.in/js-variables),但它说它是合法的。

这就是控制台中发生的事情:

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

正如你可以看到js解释somewhy与var名称的交易方式与其他名称(如test或其他)相比。原因还不清楚。

3 个答案:

答案 0 :(得分:0)

通常在JS中你只需:

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

这将测试name值是否为空(或空字符串,或者为false)。 JS有类型强制或推理“真理”。并且&#39; falsey&#39;值。所以空字符串松散地评估为false。 null也是如此。

答案 1 :(得分:0)

我认为你要找的是if (xhttp.status === 0) {...}。当状态为0时,表示响应为空。您可以在此处详细了解:XMLHttpRequest status 0 (responseText is empty)

答案 2 :(得分:0)

实际上,原因是

drawScreen()

属于全局范围,有效地调用了window.name属性; window.name属性有一个setter,可以将我传入的任何内容转换为字符串。

考虑:

var name = null;

解决方案不是触及全球范围,因为这被认为是一种不好的做法。代替:

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

这会产生 null 输出到控制台,因为我们这次处于自动调用的闭包中,因此不会触及全局窗口属性。