0

看起来这种迭代方法比 for 循环快得多:

var arr = window.arr.slice(0),
    fruit = arr.pop();
while (fruit) {
 fruit = list.pop();
}

正如这个 jsperf 测试所证明的那样:http: //jsperf.com/loop-iteration-length-comparison-variations/7

我知道克隆数组会造成内存损失,但是如果我在循环遍历它后立即删除克隆,我还应该厌倦什么?

4

1 回答 1

2

主要缺点在这里:

fruit = arr.pop();
while (fruit) {

如果fruit计算结果为假(即为空、未定义、0 等),则循环将停止。这对于稀疏数组来说是很讨厌的,例如

var arr = [0,,,,2];

只会循环最后一个成员,然后尝试评估arr[arr.length - 2],发现它返回 undefined (它不存在)所以循环结束。这在循环中是可以避免的,for因为您可以先测试该属性是否存在(如有必要):

for (var i=0, iLen=arr.length; i<iLen; i++) {

  if (i in arr) {
    // arr has a property i so do stuff with arr[i]
  }
}

因此pop方法可能很快,但只有在您确定没有任何值评估为 false 或通过保留计数器终止循环时才可靠:

var fruit, 
    i = arr.length;
do {
  fruit = arr.pop();
} while (--i)

所以你不妨这样做

do {
  fruit = arr[--i];
} while (i);

并且不打扰副本。

于 2012-09-27T02:18:25.887 回答