我最近在文章
中看到了以下for循环var i, len, arr = [1, 2, 3];
for (i = 0, len = arr.length; i < len; i++) {
// do stuff here
}
但我不知道为什么应该使用上面的循环而不是以下
var i, arr = [1, 2, 3];
for (i = 0; i < arr.length; i++) {
// do stuff here
}
哪个更好,哪个更适合使用?
答案 0 :(得分:4)
唯一的区别似乎是缓存数组长度,这在某些情况下节省了一些时间,因为不必在每次迭代时查找length属性,但是对于具有三个索引的数组,它不会产生任何差异,如果数组也有一百万个索引,它可能不会产生太大的影响,所以无论你喜欢什么。
就个人而言,如果可能,我总是倾向于反向迭代,并避免缓存长度,活动节点列表和其他事情的问题。
for (var i=arr.length; i--;) {
}
答案 1 :(得分:1)
这可能是一种优化(或者像其他人已经提到的微优化)。
一个必须imo的情况是迭代 live DOM NodeList
。
var divs = document.getElementsByTagName( 'div' );
for (var i = 0; i < divs.length; i++ ) {
// Neverending loop
document.body.appendChild( document.createElement( 'div' ) );
}
使用 live 集合时,开发人员需要采取预防措施。通过缓存长度或拍摄集合的快照,然后迭代快照。
答案 2 :(得分:0)
在循环中使用函数length
时,每次调用该函数。最好声明一个新变量并保存数组长度:
for(var j=0, arrayLength=array.length; j < arrayLength ;j++){}