Javascript中的右移位操作符

在MDN上看到很多地方用到 >>> 操作符,很是不理解,通过stackoverflow获得了以下解释

它不仅是将非数字转换为Number,还将他们转换为可用32位无符号Int表达的Number。

Javascript 的Number 是双精度浮点型,而位操作符(<< , >> , & , | , ~) 是就32位整数型定义的。对number进行位操作会将它转换为32位有符号整数。丢失所有分数和超过32位的高位信息。先进行位运算然后转换为Number。

所以进行一个没有任何效果的位元算,比如右移0位 >>0,可以快速取整并保证它在32位Int范围内。同样的,>>> 操作在它的无符号运算后,将计算结果转换为无符号整数而不是带符号整数。所以它可以用来将负数转换为32位二进制补码版本。使用 >>>0可以保证你获得0到0xFFFFFFFF之间的整数。

在这个例子中,它更有用,是因为ECMAScript定义的Array键值为32位无符号整数。所以如果你想实现ECMAScript第五版中所说的 array.filter,你需要这样来保证32位无符号整数。

总结:

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
Written on February 23, 2016