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,如果lenNaN,则评估为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 中的其他两个日期之间

Java中的逻辑运算顺序令人困惑

查询计划中的行列令人困惑

类定义中的变量范围令人困惑

Go 语言中的引用类型令人困惑

导航项中的搜索控制器令人困惑的行为