数组遍历过程中改变数组长度而引起的错误

数组遍历过程中增删元素的后果

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()。

posted on 2020-12-30 15:50  断鸿_Hua  阅读(797)  评论(0)    收藏  举报