用于javascript中的循环变体

For loop Variations in javascript

本文关键字:循环 javascript 用于      更新时间:2023-09-26

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

  1. for (var i=arr.length; i--;)
  2. for (var i=0, each; each = arr[i]; i++)

当使用不同的for循环变化时,性能是否有任何明显的变化?我通常使用for(var i=0, len=arr.length; i<len ;i++),即使对于非常大的阵列也是如此。所以我只想知道我是否错过了什么。

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

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

是类C语言中可用的最快的循环类型(这在ECMAscript中也应用了很长一段时间,但我认为现在所有最新的引擎都相当于标准循环)。(jsperf)

你的"变体"实际上不是变体,只是for-loopconditional语句的不同用法(这实际上使它成为变体..doh!)

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

只需使用for-loop中的条件部分来同时执行这两项操作,迭代并检查i是否具有truthy值。一旦i变成0,循环将结束。

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

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

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

关键是,当您递减迭代器时,实际上是将其与0进行比较,而不是与长度进行比较,这更快,因为"<,<=,>,>="运算符需要对运算符的左侧和右侧进行类型检查,以确定应使用的比较行为。

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

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

如果你确实关心订单,那么你使用的方法是可以的。

根据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上。看来"默认"循环还是可以的!!!

这是对for each循环的错误使用,因为它会在错误值上失败,从而破坏循环。

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

我也不会使用这个循环(即使很难,它可能会更快…)

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

它看起来很混乱,可读性较差,您还不如在循环时反向编写。