【问题标题】:Javascript improved native for loopJavascript 改进了原生 for 循环
【发布时间】:2013-07-03 06:46:06
【问题描述】:

我刚刚安装了 Aptana Studio 用于开发,其中一个可用的 Javascript 命令是像这样插入一个 for 循环:

for (var i=0; i < Things.length; i++) {
  Things[i]
};

另一种选择是插入改进的 for 循环,如下所示:

for (var i = Things.length - 1; i >= 0; i--){
  Things[i]
};

为什么最后一个比第一个好?

【问题讨论】:

  • 因为它不需要每次都访问长度属性。在后半部分,for 初始化只执行一次。顺便说一句,出于可读性考虑,大多数人仍然更喜欢第一个。
  • JavaScript - Are loops really faster in reverse...? 的完全相同的副本请先搜索自己 - 这个问题在“相关”侧边栏中排名第一
  • @c.P.u1 或者仅仅是因为他们不想向后迭代他们的数组......

标签: javascript performance for-loop


【解决方案1】:
//   (  A  )  (       B       )  (C)
for (var i=0; i < Things.length; i++) {
  Things[i]
};
  • A在循环开始之前执行一次
  • B 在每次迭代之前重新评估,如果不是真的,它会退出循环(因此它会在每次迭代时检查Things 的长度属性。)
  • C 在每次迭代后执行

也就是说,通过更改循环获得的性能是最小的,并且您可能会牺牲部分可读性,因此请坚持使用您认为最可读的内容 - 而不是性能方面最正确的内容。


这对你来说可能更有意义:

for (var i=0; i < Things.length; i++) {
    Things[i] = null;
};

可以改写如下:

var i = 0; //A
while (true) {
    if (!(i < Things.length)) { //B - We check the length all the time
        break;
    }
    Things[i] = null;
    i++; //C
}

for (var i = Things.length - 1; i >= 0; i--){
    Things[i] = null;
};

可以改写如下:

var i = Things.length - 1; //A - We only check the length once
while (true) {
    if (!(i >= 0)) { //B
        break;
    }
    Things[i] = null;
    i--; //C
}

【讨论】:

  • @Bergi 同意 - 在创建此示例代码的过程中考虑到了这一点,但这更多地展示了所发生的事情,我个人认为在这个确切的例子中(为了展示它确实),使用条件和break 语句来显示它更有意义。
  • 我喜欢演示编写相同循环的不同方法 :-)
【解决方案2】:

因为 Things.length 的结果不是每次都被评估(在每次迭代中)。它只是在开始时分配一次并从那时起使用。除此之外,迭代次数显然是相同的。

它确实是一个微优化。我想你会在你的代码中找到更多有趣的东西来优化。

【讨论】:

    【解决方案3】:

    怎么样?

    for (var i = 0, len = things.length; i < len; i += 1) {
      // something
    }
    

    更新:

    对不起,英语不是我的母语。所以我不知道如何与你们开始对话。不管怎样,这里是 Youtube URL,我从那个视频中学到了。我希望这对你有帮助。它解释了原因!

    https://www.youtube.com/watch?v=mHtdZgou0qU

    【讨论】:

    • 虽然您的回答可能会有所帮助,但您至少应该解释原因。事实上,您的答案已被传递到低质量帖子审核队列(我正在查看它)我建议您编辑您的答案以添加解释。
    【解决方案4】:

    我猜第二个你只能访问一次Things.length(在初始化i时),而第一个你每次都访问它来检查你是否在那里。

    【讨论】:

      猜你喜欢
      • 2020-08-28
      • 2016-03-30
      • 2015-09-29
      • 1970-01-01
      • 2018-11-20
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      相关资源
      最近更新 更多