Javascript jQuery源代码中的奇怪代码:var!==变量?x:y;
最近我在jQuery源代码中发现了一行奇怪的代码(最新版本1.9.1,Sizzle包,第129行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表示非代码点 因
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");
}
}