javascript中的for循环变体

Posted

技术标签:

【中文标题】javascript中的for循环变体【英文标题】:For loop Variations in javascript 【发布时间】:2012-04-13 23:32:03 【问题描述】:

在this 网站上有一个 for 循环变体列表。我可以理解for(var i=0, len=arr.length; i<len ;i++) 循环的用法(其中arr 是一个数组),因为arr.length 不是在每一步都计算出来的,因此似乎有边际性能增益。但是,使用其他变体有什么优势?例如,像

这样的循环
    for (var i=arr.length; i--;) for (var i=0, each; each = arr[i]; i++)

使用不同的 for 循环变体时,性能是否有明显变化?我通常使用for(var i=0, len=arr.length; i<len ;i++),即使是非常大的数组。所以我只想知道我在这里是否遗漏了什么。

【问题讨论】:

“递减”循环在 js 中要快得多。至于最后一个我不会使用它,因为在 js false==0=="" . javascript - Are loops really faster in reverse...?的可能重复 @camus 第二个在循环时很有用,例如。 DOM 元素的集合。 这个jsperf 测试所有循环... @ManseUK +1 为 JSPerf。这是谷歌搜索“jsperf for loops”的第一个结果 【参考方案1】:

人们普遍认为,一个反向的while循环

var loop = arr.length;
while( loop-- ) 

是类 C 语言中最快的循环类型(这也适用于 ECMAscript 很长一段时间,但我认为所有最新的引擎即使在今天的标准循环上也相当不错)。 (jsperf)

您的“变体”实际上没有变体,只是for-loopconditional 语句的不同用法(这实际上使它成为变体..doh!)。喜欢

1)for (var i=arr.length; i--;)

只需使用for-loop 中的条件部分来完成这两项工作,迭代并检查i 是否具有真值。只要i 变为0,循环就会结束。

2) for (var i=0, each; each = arr[i]; i++)

这里我们从每次迭代中获取元素,所以我们可以直接在循环体中访问它。当您厌倦了总是重复arr[ n ] 时,这通常会使用。

您在循环之前缓存.length 属性方面做得很好。正如您正确提到的,它更快,因为我们不必在每次迭代中访问该属性。除此之外,在处理像htmlCollections 这样的“活动结构”时,有时在 DOM 脚本中也需要它。

【讨论】:

【参考方案2】:

关键是当你递减迭代器时,你实际上是在将它与 0 而不是长度进行比较,因为“、>= 运算符需要在左侧进行类型检查,所以速度更快和右侧的运算符来确定应该使用什么比较行为。

最快的循环是:(当然如果你不关心顺序)

var i = arr.length
while(i--)


如果您确实关心订单,那么您使用的方法就可以了。

【讨论】:

【参考方案3】:

根据jsperf,JavaScript 中最快的循环类型是

var arr = new Array(10);
var i = 0;
while (i < arr.length) 
 arr[i];
 i++;
;

就在(我的默认循环)之前

var arr = new Array(10);
for (var i = 0; i < arr.length; ++i) 
 arr[i];
;

这是最慢的:

var arr = new Array(10);
arr.forEach(function(x) 
 x;
);

至少在 OSX 10.7.3 上的 Chrome 17 上。所以看起来“默认”循环毕竟很好!!!

【讨论】:

这些 jsperf 测试非常有用。谢谢!【参考方案4】:

这是对每个循环的不好使用,因为它会在错误值上失败,从而打破循环。

for (var i=0, each; each = arr[i]; i++)

我也不会使用这个循环(即使它可能会更快......)

for (var i=arr.length; i--;)

它看起来很混乱,可读性较差,你不妨写成反向while循环。

【讨论】:

以上是关于javascript中的for循环变体的主要内容,如果未能解决你的问题,请参考以下文章

使用嵌套的 for 循环实现矩阵向量乘法的标量、行变体

JavaScript 中的 While 循环与 For 循环? [关闭]

前端 JavaScript 中的三种 for 循环语句总结

javascript中的for循环是如何执行的?

JavaScript 中的 for 循环

深入了解 JavaScript 中的 for 循环