看起来这种迭代方法比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
我知道我通过克隆阵列来记忆,但如果我在循环播放后立即删除克隆,那么我还应该厌倦什么?
答案 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);
并且不打扰副本。