jQuery源代码中的奇怪代码:var!== var?x:y;

Vis*_*ioN 48 javascript jquery

最近我在jQuery源代码中找到了一个奇怪的行(最新版本1.9.1,Sizzle包,第129行funescape函数):

funescape = function( _, escaped ) {
    var high = "0x" + escaped - 0x10000;
    // NaN means non-codepoint
    return high !== high ?            // <--- LINE 129
        escaped :
        // BMP codepoint
        high < 0 ?
            String.fromCharCode( high + 0x10000 ) :
            // Supplemental Plane codepoint (surrogate pair)
            String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
};
Run Code Online (Sandbox Code Playgroud)

high !== high比较的原因是什么?它显然看起来return escaped永远不会被执行.或者我会错过什么?

参考: https ://github.com/jquery/sizzle/blob/master/sizzle.js#L129

koo*_*jah 58

实际上它写在上面的评论中:

// NaN表示非代码点

因此,必须首先执行此比较以处理NaNJavaScript中的情况:

NaN === NaN回报false.

正如James Wiseman所指出的那样,了解为什么开发人员使用high !== high而不是isNaN(high)更清晰的开发人员也很重要.

它肯定是基于性能.该试验表明,a !== a快20倍isNaN(a).

zzzzBov还表示isNaN()可以覆盖,使用!==也更便携.

更多信息Benjamin Gruenbaum:

同样值得注意的是,NaN也不等于其他任何东西,并且它也不等于非严格意义上的任何其他东西

来自Jan Dvorak:

另外注意{valueOf:function(){return{}}}确实相同

  • `a!== a`与`isNaN(a)`不同.例如`isNaN("c")`是真的,但是`"c"!=="c"`是假的.原因是`isNaN(a)`尝试将其参数转换为Number并检查转换结果,但只有当参数为NaN时,`a!== a`才会成功. (4认同)
  • 同样值得注意的是,NaN也不等于其他任何东西,并且它也不等于非严格意义上的任何其他东西. (3认同)
  • +1我认为相同,但我是新程序员:D (2认同)
  • 但为什么?我的假设是"高!==高"比"isNaN(高)"快 (2认同)
  • 还应该注意,`isNaN`可以被覆盖,使用`!==`也更便携. (2认同)

Jos*_*tos 13

当条件为high !== high高时,条件返回true NaN.我想知道为什么jQuery人员没有使用更清晰的isNaN(high)函数,但这可能是由于koopajah指出的性能原因.

NaN(Not- a- Number)表示不能表示为a的结果Number.这是一个未确定的数字.


为什么NaN === NaN返回false?

考虑

0/0          = NaN
Math.asin(2) = NaN
Run Code Online (Sandbox Code Playgroud)

你知道那0/0是不同的Math.asin(2),为什么NaN要等于NaN


Jam*_*man 6

我捎带这里的一些评论,但想想这个有价值的信息.

对原始问题的一些评论表明,这种检查NaN的方法实际上要快得多 isNaN()

当与以下替代方案结合使用时,parseInt parseFloat我们可以非常快速地转换为数字并检查其数字状态.

是否将某种JavaScript性能技巧归结为零?

而不是

function Translated(val) {
    var x = parseFloat(val);
    if (!isNaN(x)) {
        alert("Not a number");
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以有

function WTF(val) {
    var x = val - 0;
    if (x !== x) {
        alert("Not a number");
    }
}
Run Code Online (Sandbox Code Playgroud)