这是做什么的:
这是关于IT技术的内容。
这是关于IT技术的内容。
arr.length >>> 0
那么我为什么要使用它呢?
arr.length >>> 0
那么我为什么要使用它呢?
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
这只是为了确保使用正确的长度。
确保.length
是一个32位整数。
在大多数实现中,数组索引被限制在32位范围内(至少在使用Array.prototype
方法和.length
的魔法行为时)。
>>>
对它们有一些极端的影响。而且它限制了长度的大小,比内置的 array.length 可用的要少得多,因此它是确保或转换值为非负整数的不良方法。 - RobG-9 >>> 0 => 4294967287
和 4.9e9 >>> 0 => 605032704
感到满意吗?处理负值取决于上下文(也许它们应该是零),但是 4.9e9 应该是 490000000。位移运算的风险在于将位推出末端,一种替代方案是类似于 Math.abs(Math.floor(v))
的东西,尽管我承认在值相当小的情况下会使用 x | 0
进行截断。 - RobGArray.prototype
方法,那么您将获得相同的行为。例如... var obj = {length:4.9e9}; Array.prototype.forEach.call(obj, func...)
。它处理的最后一个索引将是(4.9e9 >>> 0) - 1
的值。 - user1106925