抱歉可能是一个非常愚蠢的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或其他)相比。原因还不清楚。
答案 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 输出到控制台,因为我们这次处于自动调用的闭包中,因此不会触及全局窗口属性。