filter和splice 小坑记录

527 阅读1分钟

filter和splice 小坑记录

let arr = [1, 2, 3, 4];

arr.forEach(el => {
  console.log(el);
  
  if (el === 2) {
    arr.splice(el, 1); // remove element 2
  }
});

//output: 1 2 4
let arr = [1,2,3,4];

arr.forEach(el => {
  console.log(el);

  if (el === 2) {
    arr = arr.filter(el => el !== 2); // remove element 2
  }
});
//output: 1 2 3 4

原因:

splice方法改变了数组内存中的数据,把数组的第三个元素给删除了,遍历的元素自然少了一个。

而filter方法返回的是一个新的数组,并改变了arr变量的指向。可是,原来arr指向的原数组内存尚未回收,forEach方法遍历的是原来arr指向的那个数组,forEach的那份引用并没有发生改变。

注意

splice删除数组元素,通常搭配indexof方法

如果indexof返回 ( -1),即未找到该元素,则 splice将删除数组的最后一个元素(负索引有效)。

let arr=[1,2,3,4]
arr.splice(arr.indexOf(5), 1);
console.log(arr)
// output: 1 2 3