什么是JavaScript >>>运算符,你如何使用它?
我正在查看Mozilla的代码,它为Array添加了一个过滤器方法,并且它有一行代码让我困惑。
var len = this.length >>> 0;
我从来没有见过>>>在JavaScript中使用过。
它是什么,它有什么作用?
它不仅将非数字转换为数字,还将它们转换为可以表示为32位无符号整数的数字。
虽然JavaScript的Numbers是双精度浮点数(*),但按位运算符( <<
, >>
, &
, |
和~
)是按照32位整数运算来定义的。 在进行计算之前,进行按位运算将该数字转换为32位带符号整数,丢失任何分数和高于32的位,然后转换回数字。
因此,在没有实际影响的情况下进行按位操作(如向右移位0位>>0
)是一种对数字进行四舍五入并确保其位于32位int范围内的快速方法。 此外,三联>>>
运营商,做它的无符号运算后,其转换计算数的结果为无符号整数,而不是有符号整数别人一样,因此它可以用来底片转换为32位宽作为一个大数字的补码版本。 使用>>>0
确保您获得了一个介于0和0xFFFFFFFF之间的整数。
在这种情况下,这很有用,因为ECMAScript根据32位无符号整数定义了数组索引。 因此,如果您想以与ECMAScript第五版标准所说的完全相同的方式实现array.filter
,那么您会将此数字转换为32位无符号整数。
(在现实中有此作为希望人们不会将设置什么实际需要array.length
到0.5
, -1
, 1e21
或'LEMONS'
。但是,这是我们正在谈论的JavaScript作家,所以你永远不知道。 ..)
概要:
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引擎在出现性能原因时实际上使用了整数,这并不会让我感到惊讶,但这是一个实现细节, )的优势。)
无符号右移运算符用于Mozilla的所有数组extra的方法实现中,以确保length
属性是无符号的32位整数。
规范中描述了数组对象的length
属性:
每个数组对象都有一个长度属性,其值始终是一个小于232的非负整数。
此运算符是实现它的最短途径,内部数组方法使用ToUint32
操作,但该方法不可访问并存在于规范中用于实现目的。
Mozilla数组extras实现尝试符合ECMAScript 5,查看Array.prototype.indexOf
方法的描述(第15.4.4.14节):
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). ....
正如你所看到的,他们只是想重现ToUint32
方法的行为,以符合ES3实现中的ES5规范,正如我之前所说的,无符号右移运算符是最简单的方法。
这是无符号的右移位运算符。 这与有符号位右移位运算符的区别在于, 无符号右位移位运算符( >>> )用左边的零填充,并且带符号的右位移位运算符( >> )填充了符号位,因此移位时保留数值的符号。
链接地址: http://www.djcxy.com/p/17685.html上一篇: What is the JavaScript >>> operator and how do you use it?