3 回答
TA贡献1810条经验 获得超5个赞
它不仅将非数字转换为数字,还将它们转换为可以表示为32位无符号整数的数字。
虽然JavaScript的数字是双精度浮点数(*),但按位运算符(<<, >>, &, |和~)是以32位整数的运算来定义的.执行按位操作将数字转换为32位有符号int,在进行计算之前丢失任何分数和高于32的位置位,然后再转换回数字。
所以做一个没有实际效果的按位操作,就像一个0位的右移。>>0,这是一种快速的方法来舍入一个数字,并确保它在32位int范围内。另外,三重>>>运算符在执行其无符号操作后,将其计算结果转换为数字为无符号整数,而不是其他运算符所做的有符号整数,因此它可用于将负数转换为32位-2的补码版本为一个大数字。使用>>>0确保您有一个介于0到0xFFFFFF之间的整数。
在本例中,这很有用,因为ECMAScript根据32位无符号INT定义数组索引。所以如果你想实现array.filter以一种与ECMAScript第五版标准完全相同的方式,您可以像这样将数字转换为32位无符号int。
(在现实中,没有什么实际的需要,因为希望人们不会设置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引擎出于性能考虑,在可能的情况下实际使用INT,我不会感到惊讶。但是,这将是一个您无法利用的实现细节。)
添加回答
举报