jQuery合并函数中的if条件令人困惑
Posted
技术标签:
【中文标题】jQuery合并函数中的if条件令人困惑【英文标题】:Perplexing if condition in jQuery merge function 【发布时间】:2015-09-07 05:20:02 【问题描述】:我只是在浏览 jQuery 的代码时遇到了函数合并。我检查了这个函数的代码:
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
呢?这对我来说毫无意义。有人可以解释一下吗?
【问题讨论】:
它看起来并不明智,但看起来很NaN !== NaN // true
。不要问我为什么……isNaN(len)
在我看来更合乎逻辑。
@Jonathan isNaN 检查not a Number
(string, boolean ...) , len !== len
检查NaN
值
感谢您指出不同之处。我开始认为NaN !== NaN
是我见过的 JS 中最 wtf 的。
【参考方案1】:
赋值var len = +second.length;
中的+
运算符(unary plus) 尝试通过内部调用valueOf()
和toString()
将值second.length
转换为数字。如果转换为数字失败,它会将NaN
分配给变量len
。如前所述,len !== len
是一种检查NaN
的方法。
【讨论】:
by internally calling valueOf() and toString()
你的意思是Unary plus (+)吗?
是的。我用一元加运算符文档的链接更新了我的答案。
但是你怎么判断是“调用valueOf()和toString()”呢?
@NathanWilson ,所以当你说 len !== len
时,你基本上会检查 NaN !== NaN
吗?
检查len
是否为数字。如果len
是一个数字,len !== len
将评估为false
,如果len
是NaN
,则评估为true
。 +second.length
中的一元加运算符在一元 +
运算符的代码中内部调用 valueOf()
。一元 +
运算符将确保将 len
设置为数字或 NaN
。【参考方案2】:
这是对NaN
的检查(正如@Jonathan 的评论中正确指出的那样)。来自优秀的Mozilla documentation:
NaN
将不相等(通过 ==、!=、=== 和 !==)与任何其他值进行比较 - 包括与另一个NaN
值进行比较。使用Number.isNaN()
或isNaN()
最清楚地确定一个值是否为NaN
。或者进行自我比较:NaN
,并且只有NaN
会与自身进行比较。
【讨论】:
不管怎样,这是编写更具可读性的代码的可怕方式。 这是一个相当常见的 js 习语,但你是对的 - 寻找非 js 开发人员很有趣。我认为 jQuery sn-p 行前面的注释也减轻了一些可读性问题。以上是关于jQuery合并函数中的if条件令人困惑的主要内容,如果未能解决你的问题,请参考以下文章
Pandas Dataframe 合并 2 列,包括条件 If 合并:如果 df_2 中的日期在 df_1 中的其他两个日期之间