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

Javascript jQuery源代码中的奇怪代码:var!==变量?x:y;,javascript,jquery,Javascript,Jquery,最近我在jQuery源代码中发现了一行奇怪的代码(最新版本1.9.1,Sizzle包,第129行funsecasefunction): funescape=函数(u,已转义){ var high=“0x”+转义-0x10000; //NaN表示非代码点 返回高电平!==高电平?/>10 | 0xD800,高电平&0x3FF | 0xDC00); }; 使高的原因是什么!==高比较?看起来将永远不会执行返回转义的。还是我错过了什么 参考:事实上,它写在正上方的评论中: //NaN表示非代码点 因

最近我在jQuery源代码中发现了一行奇怪的代码(最新版本1.9.1,Sizzle包,第129行
funsecase
function):

funescape=函数(u,已转义){
var high=“0x”+转义-0x10000;
//NaN表示非代码点
返回高电平!==高电平?/>10 | 0xD800,高电平&0x3FF | 0xDC00);
};
使
高的原因是什么!==高
比较?看起来将永远不会执行
返回转义的
。还是我错过了什么


参考:

事实上,它写在正上方的评论中:

//NaN表示非代码点

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

NaN===NaN
返回
false

正如作者所指出的,了解开发人员为什么使用
high!==高
而不是
isNaN(高)
,后者会更清晰

这当然是基于性能。这表明
a!==a
比isNaN(a)快20倍

还指示可以使用
覆盖
isNaN()==也更便于携带

更多信息来自:


同样值得注意的是,NaN并不等于其他任何东西 嗯,而且它也不等同于任何其他非信息传播意义上的东西

和来自:


还要注意
{valueOf:function(){return{}}
本身等于


条件<代码>高!==high
返回true,当high是
NaN
时。我想知道为什么jQuery的家伙没有使用非常清晰的
isNaN(high)
函数,但这可能是由于koopajah指出的性能原因

NaN
N
ot-
a
-
N
Number)表示不能表示为
数字的结果。这是一个未定数


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

考虑

0/0          = NaN
Math.asin(2) = NaN

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

我在这里引用了一些评论,但我认为这是有价值的信息

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

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

所以不是

function Translated(val) {
    var x = parseFloat(val);
    if (!isNaN(x)) {
        alert("Not a number");
    }
}
我们可以

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

也许是虫子?哪个函数需要签名?我还看到一个未使用的
参数,…@redShadow好吧,
是可以理解的,因为出于某种原因(可能是为了保持兼容性),作者只需要获得第二个参数,除了我会使用
参数[1]
之外。我认为这是如评论所说的,
NaN!==NaN
将始终返回
true
@VisioN:使用
参数可能会带来相当高的性能成本。在sizzle这样的库中,每个ms都可以计数,不使用
参数可能是更明智的选择。同样值得注意的是,NaN也不等于其他任何东西,也不等于非精确意义上的任何东西。还要注意
{valueOf:function(){return{}}
等于它自己,但为什么?我的假设是
高!==high
比isNaN(high)快
还应注意,使用
可以覆盖
isNaN
==也更便于携带。
a==a
与isNaN(a)
不同。例如,
isNaN(“c”)
为真,但
“c”!=“c”
为假。原因是
isNaN(a)
尝试将其参数转换为数字并检查转换结果,但是
a==只有当参数为NaN时,
才会成功。
val-0
不是
parseFloat(val)
的合适替代品。例如,如果
val='0xFF'
Number(val)
相当于
val-0
,或者更简单地说是
+val
,则结果会非常不同。
NaN===NaN
返回false的另一个潜在原因是
NaN
具有多个位模式。
function WTF(val) {
    var x = val - 0;
    if (x !== x) {
        alert("Not a number");
    }
}