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表示非代码点
因此,必须首先执行此比较以处理NaN
JavaScript中的情况:
NaN === NaN
回报false
.
正如James Wiseman所指出的那样,了解为什么开发人员使用high !== high
而不是isNaN(high)
更清晰的开发人员也很重要.
它肯定是基于性能.该试验表明,a !== a
是快20倍比isNaN(a)
.
zzzzBov还表示isNaN()
可以覆盖,使用!==
也更便携.
更多信息Benjamin Gruenbaum:
同样值得注意的是,NaN也不等于其他任何东西,并且它也不等于非严格意义上的任何其他东西
来自Jan Dvorak:
另外注意
{valueOf:function(){return{}}}
确实相同
Jos*_*tos 13
当条件为high !== high
高时,条件返回true NaN
.我想知道为什么jQuery人员没有使用更清晰的isNaN(high)
函数,但这可能是由于koopajah指出的性能原因.
NaN
(N
ot- a
- N
umber)表示不能表示为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
?
我捎带这里的一些评论,但想想这个有价值的信息.
对原始问题的一些评论表明,这种检查NaN的方法实际上要快得多 isNaN()
当与以下替代方案结合使用时,parseInt
parseFloat
我们可以非常快速地转换为数字并检查其数字状态.
而不是
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)
归档时间: |
|
查看次数: |
5971 次 |
最近记录: |