使用克隆和放大器有什么缺点? pop来迭代数组而不是使用for循环?

时间:2012-09-27 00:22:26

标签: javascript performance

看起来这种迭代方法比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

我知道我通过克隆阵列来记忆,但如果我在循环播放后立即删除克隆,那么我还应该厌倦什么?

1 个答案:

答案 0 :(得分:2)

主要缺点在于:

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

如果fruit的计算结果为false(即为null,undefined,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);

并且不打扰副本。