这行代码在做什么?arr.length >>> 0。

5
这是做什么的:
这是关于IT技术的内容。
arr.length >>> 0

那么我为什么要使用它呢?


我还需要关于添加该运算符名称的标签的帮助,因为我不知道它的名称。 - mithril333221
上下文是王者...给我们一些。 - jondavidjohn
3
我通常不喜欢在问题中编辑代码,但我相当确定你的意思是“length”,而不是“lenght”。 - Michael Petrotta
你需要在你的问题中包含更多细节。你在哪里找到那行代码?有什么具体的任务需要帮助吗?你是否查看了 PHP 文档以获取答案? - itsmequinn
1
在JavaScript中,数组的长度永远不可能是非负整数以外的任何值。将整数强制转换为整数是完全没有意义的。 - RobG
显示剩余3条评论
2个回答

8
这是无符号右移运算符。在这种情况下(与0一起使用时),它确保arr.length是一个整数,或者更确切地说,将arr.length作为严格的无符号32位整数值进行评估。(这意味着它永远不会是NaN,永远不会是负数,也永远不会有小数部分。)
示例:
'1'       >>> 0: 1
1         >>> 0: 1
''        >>> 0: 0
undefined >>> 0: 0
null      >>> 0: 0
1.0∙∙∙01  >>> 0: 1

与之相比:

Number('1')      : 1
Number(1)        : 1
Number('')       : 0
Number(undefined): NaN
Number(null)     : 0
Number(1.0∙∙∙01) : 1.0∙∙∙01

这只是为了确保使用正确的长度。


4

确保.length是一个32位整数。

在大多数实现中,数组索引被限制在32位范围内(至少在使用Array.prototype方法和.length的魔法行为时)


2
你错过了“…为什么我要使用它?”只有在length可能被设置为非整数值的情况下才可能被考虑。但是,在遵循ECMA-262规范的实现中,这是不可能发生的。长度始终是非负整数。所以答案是:永远不会 - RobG
如果是这种情况,那么负值需要首先处理,因为 >>> 对它们有一些极端的影响。而且它限制了长度的大小,比内置的 array.length 可用的要少得多,因此它是确保或转换值为非负整数的不良方法。 - RobG
你会对 -9 >>> 0 => 42949672874.9e9 >>> 0 => 605032704 感到满意吗?处理负值取决于上下文(也许它们应该是零),但是 4.9e9 应该是 490000000。位移运算的风险在于将位推出末端,一种替代方案是类似于 Math.abs(Math.floor(v)) 的东西,尽管我承认在值相当小的情况下会使用 x | 0 进行截断。 - RobG
@RobG:如果您在类似数组的对象上设置了这样的长度值,并对其应用标准的Array.prototype方法,那么您将获得相同的行为。例如... var obj = {length:4.9e9}; Array.prototype.forEach.call(obj, func...)。它处理的最后一个索引将是(4.9e9 >>> 0) - 1的值。 - user1106925
@bob-the-destroyer,有各种各样的怪癖,大多数是次要的,比如IE认为数组字面量中的单个尾逗号是省略(实际上不是),还有命名函数表达式等问题。是的,上下文至关重要。如果不知道操作的目的是什么,很难说潜在问题是否有效。 - RobG
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接