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 位无符号 int,如下所示。

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

相关文章:

javascript - PHP根据php结果显示html字段

c# - '+='的含义

assembly - 如何在Y86-64(或其他具有ADD + AND但没有 native 右移的玩具ISA)中执行右移

c - 如何在C中实现算术右移

javascript - 上传 chrome 扩展程序到存储,包括 native 应用程序

javascript - 为什么一个 CSS 动画工作多次,另一个每次页面加载只工作一次

java - 为什么算术赋值运算符更有效?

C 编程 : Confusion between operator precedence

c++ - 如何在模板函数 C++ 中更改类型名的符号性

Javascript 不止一个 RegEx 反向引用