我正在查看Mozilla的代码,它为Array添加了一个过滤器方法,并且它有一行代码让我困惑。
var len = this.length >>> 0;
我从来没有见过>>>在JavaScript中使用过。 它是什么,它有什么作用?
发布于 2018-03-21 10:11:40
它不仅将非数字转换为数字,还将它们转换为可以表示为32位无符号整数的数字。
虽然JavaScript的数字是双精度浮点(*),位运算符(<<
,>>
,&
,|
和~
)在对32位整数运算的定义。在进行计算之前,进行按位运算将该数字转换为32位带符号整数,丢失任何分数和高于32的位,然后转换回数字。
所以做一个没有实际效果的按位操作,就像向右移位0位一样>>0
,这是一个快速的方法来四舍五入一个数字并确保它在32位int范围内。此外,>>>
在进行无符号操作后,三元运算符将其计算结果转换为Number作为无符号整数,而不是其他人的有符号整数,因此它可用于将负数转换为32位二进制补码版本为大数字。使用>>>0
确保你有一个介于0和0xFFFFFFFF之间的整数。
在这种情况下,这很有用,因为ECMAScript根据32位无符号整数定义了数组索引。因此,如果您尝试以array.filter
与ECMAScript第五版标准所述内容完全相同的方式实现,那么您会将此数字转换为32位无符号整数。
(在现实中几乎没有实际的需要这是希望的人是不会被设置array.length
到0.5
,-1
,1e21
或'LEMONS'
。但是,这是我们正在谈论的JavaScript作家,所以你永远不知道...)
概要:
1>>>0 === 1
-1>>>0 === 0xFFFFFFFF -1>>0 === -1
1.7>>>0 === 1
0x100000002>>>0 === 2
1e21>>>0 === 0xDEA00000 1e21>>0 === -0x21600000
Infinity>>>0 === 0
NaN>>>0 === 0
null>>>0 === 0
'1'>>>0 === 1
'x'>>>0 === 0
Object>>>0 === 0
(*:好吧,它们被定义为像浮动操作一样,如果某些JavaScript引擎在出现性能原因时实际上使用了整数,那么这并不会让我感到惊讶,但这将是一个实现细节, )的优势。)
https://stackoverflow.com/questions/-100003206
复制相似问题