javascript - 什么是 JavaScript >>> 运算符以及如何使用它?

标签 javascript operators bit-shift

我正在查看来自 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 位无符号整数。

实际上,这几乎没有实际需要,因为希望人们不会设置 array.length0.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/3348438/

相关文章:

c++ - 对位移位行为的质疑

javascript - 下拉菜单打不开

javascript - 从 Recharts 的另一个组件获取数据

coffeescript - Coffeescript中的现有条件赋值运算符

python - 变量克隆行为不明确

c - 使用 fread 在 C 中读取 ASCII 文件

javascript - 以多种形式监听 ng-dirty

javascript - 一个像幻灯片一样工作的单页网站

haskell - 我对幺半群的理解有效吗?

java - DNA 文件转换的位操作