【问题标题】:For loop improved with ">>>" operator?使用“>>>”运算符改进了 for 循环?
【发布时间】:2011-11-24 10:20:41
【问题描述】:

我正在将 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++){

以这种方式使用的“>>>”运算符如何提高性能?你怎么看?

【问题讨论】:

  • WUT?!但是,(5 >>> 0 == 5)... xD

标签: javascript performance for-loop mootools


【解决方案1】:

&gt;&gt;&gt; 位运算符的界限在 0 和 2^32-1 (4,294,967,295) 之间,包括 0 和 2^32-1。通过使用&gt;&gt;&gt;,框架确保循环不会执行近乎无限的时间。

PS。 代码的上下文:

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;
    }

由于i 初始化为零,并以整数1 递增,并且length 属性始终为整数,因此没有负面影响。 &gt;&gt;&gt; 方法的另一个应用是四舍五入,将十进制数转换为整数。

【讨论】:

  • @Antonio 如果它解决了你的问题,请记得点击旁边的勾号来接受这个答案:)
【解决方案2】:

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

【讨论】:

  • @Cipi 不在这里。 ('5' &gt;&gt;&gt; 0) === 5true
  • 松散的打字意味着这无关紧要。 '.length' 只会在类似数组的项目上是非数字的 (object.length = "foo");
【解决方案3】:

来自 mootools 团队的 Keeto 阐明了他们“为什么”这样做,答案是泛型和类数组。

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

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

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

【讨论】:

  • “Keeto 来自 ... 和类似数组” [citation needed]。除此之外,-1 &gt;&gt;&gt; 0 等于 4,294,967,295,这不等于长度为 -1 的行为。表达式的(i in this)部分得到了想要的效果,但是循环4.3E9次来达到-1的效果是极其低效的。
  • 好的,不好的例子,这个,否定值是一回事,它不会起作用。字符串、null、甚至函数等 --> 大多数将返回 0
【解决方案4】:

我已经看到这种“零位移位”技术被用作快速'n'dirty truncate 方法。

例如:

42.8989 >>> 0 == 42

但是,如果您输入负数,这种对移位的盗用可能会出现严重错误:

(-42.8989) >>> 0 == 4294967254 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多