11

我刚刚安装了用于开发的 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]
};

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

4

4 回答 4

14
//   (  A  )  (       B       )  (C)
for (var i=0; i < Things.length; i++) {
  Things[i]
};
  • A在循环开始之前执行一次。
  • B在每次迭代之前重新评估,如果它不是真的,它会退出循环(因此它会Things在每次迭代时检查 length 属性。)
  • 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
}
于 2013-07-05T08:44:04.760 回答
5

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

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

于 2013-07-05T08:22:44.920 回答
4

那个怎么样?

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

更新:

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

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

于 2016-02-24T08:16:25.237 回答
1

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

于 2013-07-05T08:24:44.747 回答