数组遍历过程中改变数组长度而引起的错误
数组遍历过程中增删元素的后果
1、先说结论:
在用for循环、对象方法(forEach()、map()等)对数组进行遍历操作时,尽量不要改变原数组的长度(增、删元素),否则非常容易出错。
2、例子:
// 目的:打印数组中每个元素,并删除数组中值为1的元素
let arr = [1,2,3];
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]);
if (arr[i] == 1) {
arr.splice(i, 1);
console.log(arr);
}
}
输出结果为:
1
[2,3]
3
容易误认为应该打印
1
2
[2,3]
3
这是因为在删除arr[0],即值为1的元素以后,
原来的第二个元素2,变成了第一个元素即arr[0];原来的第三个元素3,变成了第二个元素即arr[1],
数组的长度变为2,而此时i=0,则下一个arr[i]为为arr[1]即值为3的元素。
值为2的元素因为变成了arr[0],所以被直接跳过。
所以如果在遍历原数组的过程中删掉了一个元素,那么这个元素的下一个元素就不会被遍历到。
//第一个循环
{
i = 0;
console.log(arr[i]); // 打印arr[0] = 1
arr.splice(0,1); //arr[0],即值为1的元素被移除
console.log(arr); //arr = [2,3]
}
//第二个循环,此时原来的第二个元素2,变成了第一个元素arr[0];原来的第三个元素3,变成了第二个元素arr[1],数组的长度变为2
{
i = 1;
console.log(arr[i]); // 打印arr[1] = 3
}
//第三个循环
{
i = 2; // i < arr.length为false,不执行
}
3、数组中增删元素的正确做法:
正确的思路应该是深拷贝一个新数组,对新数组进行增删操作。
如在例子中,用slice()而不是splice()。
浙公网安备 33010602011771号