Javascript for loop效率

时间:2010-04-30 05:08:44

标签: javascript

for (var i=0, cols=columns.length; i<cols; i++) { ... }

更有效率
for (var i=0; i<columns.length; i++) { ... }

在第二个版本中,每次检查条件columns.length时都会计算i<columns.length吗?

5 个答案:

答案 0 :(得分:8)

每个循环将评估for的第二部分中的任何表达式。

所以,在这里,有了你的第二个命题,是的,每次检查条件时都会计算columns.length - 这会使第一个命题比第二个命题更快。


(对许多其他语言都是如此,顺便说一下)

答案 1 :(得分:5)

像这样的微优化在Javascript之类的语言中没有多大意义,除非你已经测试并发现循环性能是一个问题。

但是,必须在每次迭代时评估columns.length,因为在循环迭代期间列数可能会更改。因此,存储循环限制可能会略微提高性能(但请参阅我的第一点)。

答案 2 :(得分:4)

缓存版本更快,但第二版更安全。

如果您只是对最快哪种循环类型感到好奇,可能需要查看一下:http://blogs.oracle.com/greimer/resource/loop-test.html

答案 3 :(得分:1)

请注意,大多数这些循环在循环中需要一个额外的语句来实际从数组中检索第i个元素。您可以避免这种情况,并使用以下变量获得一个非常快速的循环,如果您访问带有越界索引的数组(而不是引发错误),则利用Javascript只返回undefined(其计算结果为false)这一事实):

  

for(var i = 0,col; col = columns [i]; ++ i){...}

显然,如果你在一个包含评估为false的元素的数组中进行迭代,那么这不起作用。

答案 4 :(得分:0)

是的,确实如此。访问length属性会浪费不需要的时间(除非在迭代期间数组的长度可以更改。)。

以下是我遍历数组的方式:http://gist.github.com/339735