我正在查看 Mozilla 中向 Array 添加过滤方法的代码,其中有一行代码让我感到困惑。
var len = this.length >>> 0;
我以前从未见过在 JavaScript 中使用 >>> 。
它是什么以及它有什么作用?
最佳答案
它不仅仅将非数字转换为数字,还将它们转换为可以表示为 32 位无符号整数的数字。
尽管 JavaScript 的数字是 double float (*),但按位运算符( <<
、 >>
、 &
、 |
和 ~
)是根据 32 位整数的运算来定义的。执行按位运算会将数字转换为 32 位有符号整型,丢失所有小数和高于 32 的位,然后再进行计算,然后转换回数字。
所以进行按位运算没有实际效果,比如右移0位>>0
,是对数字进行四舍五入并确保其位于 32 位 int 范围内的快速方法。此外,三元组>>>
运算符在执行无符号运算后,将其计算结果转换为 Number 作为无符号整数,而不是其他运算符转换为有符号整数,因此它可用于将负数转换为 32 位二进制补码版本作为大数数字。使用>>>0
确保您获得 0 到 0xFFFFFFFF 之间的整数。
在这种情况下,这很有用,因为 ECMAScript 按照 32 位无符号整数定义数组索引。因此,如果您尝试实现 array.filter
以完全重复 ECMAScript 第五版标准所述的方式,您可以将数字转换为 32 位无符号 int,如下所示。
实际上,这几乎没有实际需要,因为希望人们不会设置 array.length
至0.5
, -1
, 1e21
或'LEMONS'
.
摘要:
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
(*:好吧,它们被定义为像 float 一样。如果出于性能原因,某些 JavaScript 引擎实际上在可能的情况下使用了整数,我不会感到惊讶。但这将是您无法获得的实现细节来利用任何优势。)
关于javascript - 什么是 JavaScript >>> 运算符以及如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40976822/