用于javascript中的循环变体
For loop Variations in javascript
在这个网站上有一个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++)
,即使对于非常大的阵列也是如此。所以我只想知道我是否错过了什么。
人们普遍认为,反向while循环
var loop = arr.length;
while( loop-- ) {
}
是类C语言中可用的最快的循环类型(这在ECMAscript中也应用了很长一段时间,但我认为现在所有最新的引擎都相当于标准循环)。(jsperf)
你的"变体"实际上不是变体,只是for-loop
中conditional
语句的不同用法(这实际上使它成为变体..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--;)
它看起来很混乱,可读性较差,您还不如在循环时反向编写。
- 控制器不会进入for循环:javascript
- 使用来自不同循环Javascript的数据创建数组
- 在for循环-Javascript中创建新对象
- 日期循环 Javascript
- 在循环 javascript 内部创建一个数组
- 使用 for 循环 JavaScript 的打印范围
- 使用RegExp循环数组而不是for循环(Javascript)
- 如何避免循环Javascript
- 如何停止循环 - Javascript 100%
- 我想让我的程序重新运行开头,有点像循环 JavaScript
- css转换在for循环javascript中无法正常工作
- 在for循环javascript中创建对象
- do/while语句中的if-elseif语句无限循环javascript
- 在for循环Javascript中对数字进行分类和计数
- 如何一次运行一次循环javascript
- 请,需要帮助循环Javascript事件
- 在递归循环javascript之后,为JSON键变量使用自定义HTML元素
- 嵌套循环javascript棋盘
- 如何重新启动循环javascript循环
- 在循环 JavaScript 之后刷新页面