我发现了array.splice的一个奇怪副作用,并对代码进行了精简以重现该问题。 是的,用array.filter可以将其压缩至一行,但我想知道自己是否犯了错误或其他情况是否在发生。
var array = [];
for (var i = 0; i < 10; i++) {
array.push({
value: i
});
}
array.forEach(function(item, index, intArray) {
if (item.value % 2 == 1) {
item.odd = true;
} else {
item.odd = false;
}
if (item.odd) {
console.log("Removing " + item.value);
intArray.splice(index, 1);
}
});
console.log(array);
我已在Firefox和Chrome中进行了测试。即使仅将项传递到回调函数中,并通过array.indexOf计算索引并从循环外部引用数组,行为仍然存在。
index
值可能是原始数组中的索引而不是修改后新数组中的索引。 - gen_Eric