什么是JavaScript>>>运算符,你如何使用它?
我正在查看Mozilla的代码,这些代码为Array添加了一个过滤方法,它有一行代码让我感到困惑。
var len = this.length >>> 0;
我以前从未见过>>>在JavaScript中使用过。
它是什么,它有什么作用?
我正在查看Mozilla的代码,这些代码为Array添加了一个过滤方法,它有一行代码让我感到困惑。
var len = this.length >>> 0;
我以前从未见过>>>在JavaScript中使用过。
它是什么,它有什么作用?
它不仅将非数字转换为数字,还将它们转换为可以表示为32位无符号整数的数字。
虽然 JavaScript 的数字是双精度浮点数 (*),但按位运算符 (、 、 和 ) 是根据对 32 位整数的运算来定义的。执行按位运算会将数字转换为 32 位有符号 int,丢失任何分数和高于 32 位的位,然后再执行计算,然后转换回 Number。<<
>>
&
|
~
因此,执行没有实际效果的按位运算(如 0 位的右移位)是将数字舍入并确保其在 32 位 int 范围内的快速方法。此外,三重运算符在执行其无符号运算后,将其计算结果转换为 Number 作为无符号整数,而不是其他运算符所做的有符号整数,因此它可用于将负数转换为 32 位二进制补码版本作为大数。使用可确保你有一个介于 0 和 0xFFFFFFFF 之间的整数。>>0
>>>
>>>0
在这种情况下,这很有用,因为 ECMAScript 根据 32 位无符号 ints 定义数组索引。因此,如果您尝试以完全复制 ECMAScript Fifth Edition 标准所说的方式实现,则会像这样将数字转换为 32 位无符号 int。array.filter
(实际上,这几乎没有实际需要,因为希望人们不会设置到,或。但这是我们正在谈论的JavaScript作者,所以你永远不会知道...)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
(*:嗯,它们被定义为像浮子一样的行为。如果出于性能原因,如果一些JavaScript引擎实际上尽可能地使用int,我也不会感到惊讶。但这将是一个实现细节,你不会利用任何好处。
Mozilla 的所有 extra 方法实现中使用了无符号的右移位运算符,以确保该属性是无符号的 32 位整数。length
数组对象的属性在规范中描述为:length
每个 Array 对象都有一个 length 属性,其值始终是小于 232 的非负整数。
此运算符是实现它的最短方法,内部数组方法使用 ToUint32
操作,但该方法不可访问,并且出于实现目的存在于规范中。
Mozilla 数组附加实现尝试符合 ECMAScript 5,请查看该方法的描述 (§ 15.4.4.14):Array.prototype.indexOf
1. Let O be the result of calling ToObject passing the this value as the argument. 2. Let lenValue be the result of calling the [[Get]] internal method of O with the argument "length". 3. Let len be ToUint32(lenValue). ....
如您所见,他们只想重现该方法的行为以符合ES3实现上的ES5规范,并且正如我之前所说,未签名的右移位运算符是最简单的方法。ToUint32