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-loop
中conditional
语句的不同用法(这实际上使它成为变体..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循环变体的主要内容,如果未能解决你的问题,请参考以下文章