对于使用“>>>”改进的循环运营商?

时间:2011-11-24 10:20:42

标签: javascript performance for-loop mootools

我正在将mootools从1.3.2更新到1.4.1。 我看到了一个奇怪的变化。从这个

for (var i = 0, l = this.length; i < l; i++){....

到这个

for (var i = 0, l = this.length >>> 0; i < l; i++){

如何“&gt;&gt;&gt;”以这种方式使用的运算符可以提高性能吗?你觉得怎么样?

4 个答案:

答案 0 :(得分:8)

>>>位运算符在0和2^32-1(4,294,967,295)之间包含并包含0和>>>。通过使用Array.implement({every: function(fn, bind){ for (var i = 0, l = this.length >>> 0; i < l; i++){ if ((i in this) && !fn.call(bind, this[i], i, this)) return false; } ,框架可确保循环不会在近乎无限的时间内执行。

PS。 代码的上下文:

i

由于length初始化为零,并且增加了整数1,并且>>>属性始终为整数,因此没有负面的副作用。 {{1}}方法的另一个应用是舍入,将十进制数转换为整数。

答案 1 :(得分:2)

我想原因是某种转换以确保该值始终为数字(而不是例如字符串'2')。

答案 2 :(得分:1)

来自mootools团队的Keeto对于“为什么”他们这样做有了一些启示,答案是,仿制药和阵列喜欢。

所有数组方法都应该用作Array.every / Array.prototype.every调用。这意味着,您可以传递.length:-1或类似的对象。

这可以确保循环失败的长度不会无效,我想。

Array.prototype.forEach.call({0:1, length: -1});

答案 3 :(得分:0)

我已经看到这种“零位移”技术被用作一种快速的截断方法。

e.g:

42.8989 >>> 0 == 42
然而,如果你输入一个负数,这种对位移的误用可能会严重错误:

(-42.8989) >>> 0 == 4294967254