我刚刚浏览了jQuery的代码并遇到了函数merge。我查看了这个函数的代码:
merge: function( first, second ) {
var len = +second.length,
j = 0,
i = first.length;
while ( j < len ) {
first[ i++ ] = second[ j++ ];
}
// Support: IE<9
// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
if ( len !== len ) {
while ( second[j] !== undefined ) {
first[ i++ ] = second[ j++ ];
}
}
first.length = i;
return first;
},
现在,如果您浏览代码,则会遇到以下if
检查:
if ( len !== len )
这对我来说有点不合理,究竟是什么检查,以及它在做什么?
len
明确定义了几行,如下所示:
var len = +second.length;
那么为什么有人会检查len !== len
?这在某种程度上对我没有意义。有人可以解释一下吗?
答案 0 :(得分:15)
这是对NaN
的检查(正如@ Jonathan的评论中正确指出的那样)。从优秀的Mozilla documentation:
NaN
将不等(via ==,!=,===和!==)与任何其他值进行比较 - 包括另一个NaN
值。使用Number.isNaN()
或isNaN()
可以最清楚地确定值是否为NaN
。或者执行自我比较:NaN
,只有NaN
,将与自己进行比较。
答案 1 :(得分:4)
作业WebClient webClient = new WebClient(BrowserVersion.FIREFOX_38);
HtmlPage page = webClient.getPage("http://127.0.0.1:8080/fundtest/demo.html");
HtmlDivision div1=(HtmlDivision)page.getElementById("1");
HtmlDivision div2=(HtmlDivision)page.getElementById("2");
HtmlDivision div3=(HtmlDivision)page.getElementById("3");
HtmlDivision div4=(HtmlDivision)page.getElementById("4");
webClient.closeAllWindows();
System.out.println(div1.asText() + div2.asText() + div3.asText() + div4.asText());
中的+
运算符(unary plus)尝试通过内部调用var len = +second.length;
和{{1}将值second.length
转换为数字}}。如果转换为数字失败,则会将valueOf()
分配给变量toString()
。如前所述,NaN
是检查len
的方法。