首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么是JavaScript >>>运算符,你如何使用它?

什么是JavaScript >>>运算符,你如何使用它?
EN

Stack Overflow用户
提问于 2018-03-21 02:07:57
回答 2查看 0关注 0票数 0

我正在查看Mozilla的代码,它为Array添加了一个过滤器方法,并且它有一行代码让我困惑。

代码语言:javascript
复制
var len = this.length >>> 0;

我从来没有见过>>>在JavaScript中使用过。 它是什么,它有什么作用?

EN

回答 2

Stack Overflow用户

发布于 2018-03-21 10:11:40

它不仅将非数字转换为数字,还将它们转换为可以表示为32位无符号整数的数字。

虽然JavaScript的数字是双精度浮点(*),位运算符(<<>>&|~)在对32位整数运算的定义。在进行计算之前,进行按位运算将该数字转换为32位带符号整数,丢失任何分数和高于32的位,然后转换回数字。

所以做一个没有实际效果的按位操作,就像向右移位0位一样>>0,这是一个快速的方法来四舍五入一个数字并确保它在32位int范围内。此外,>>>在进行无符号操作后,三元运算符将其计算结果转换为Number作为无符号整数,而不是其他人的有符号整数,因此它可用于将负数转换为32位二进制补码版本为大数字。使用>>>0确保你有一个介于0和0xFFFFFFFF之间的整数。

在这种情况下,这很有用,因为ECMAScript根据32位无符号整数定义了数组索引。因此,如果您尝试以array.filter与ECMAScript第五版标准所述内容完全相同的方式实现,那么您会将此数字转换为32位无符号整数。

(在现实中几乎没有实际的需要这是希望的人是不会被设置array.length0.5-11e21'LEMONS'。但是,这是我们正在谈论的JavaScript作家,所以你永远不知道...)

概要:

代码语言: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引擎在出现性能原因时实际上使用了整数,那么这并不会让我感到惊讶,但这将是一个实现细节, )的优势。)

票数 0
EN

Stack Overflow用户

发布于 2018-03-21 12:01:20

无符号右移运算符用于Mozilla 的所有数组extra的方法实现中,以确保该length属性是无符号的32位整数

length数组对象的属性在规范中描述如下:

每个数组对象都有一个长度属性,其值始终是一个小于2 32的非负整数。

该操作符是实现它的最短途径,内部数组方法使用该ToUint32操作,但该方法不可访问并存在于规范中以用于实现目的。

Mozilla 数组额外的实现尝试符合ECMAScript 5,查看Array.prototype.indexOf方法的描述(第15.4.4.14节):

代码语言:javascript
复制
1.让O为调用ToObject传递此值的结果 
   作为论据。
2.让lenValue成为调用O的[[Get]]内部方法的结果 
   参数“长度”。
让

正如你所看到的,他们只是想重现ToUint32方法的行为,以符合ES3实现中的ES5规范,正如我之前所说的,无符号右移运算符是最简单的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档