主要缺点在这里:
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);
并且不打扰副本。