为什么在控制台中记录的 forEach 循环中没有删除数组元素?



我想使用forEach方法删除数组的第一个和第三个元素。我能够做到这一点,但问题来了:为什么forEach中删除的元素在控制台中注册,而没有删除的元素却没有在控制台中登记?

forEach方法不适用于函数数组的所有元素吗?那么,为什么所有的数组元素都没有在控制台中注册呢?

const cartItems = ['Book1', 'Book2', 'Book3', 'Book4']
cartItems.forEach(function (item, index, array) {
// I mean console.log below 👇
console.log(item)
if (index == 0) {
array.shift()
}
if (index == 1) {
array.splice(1, 1)
}
})
console.log(cartItems)

简而言之,修改forEach(或任何其他迭代函数(遍历的数组不是一个好主意。以下是MDN文档中的一句名言:

forEach((处理的元素范围设置在第一个回调Fn的调用分配给索引的元素callbackFn将不会访问已经访问过的索引或超出范围的索引

在您的示例中,"Book2"项跳过了forEach的回调函数,因为array.shift本质上将其重新分配给索引0(已访问(。array.splice之后的"Book4"也会发生同样的情况。

您必须注意shiftsplice方法的定义。基于此,shift的定义为:

shift((方法删除数组的第一项。

注意:此方法会更改数组的长度

注意:shift方法的返回值是已删除的项。

注意:此方法将更改原始数组

splice方法相同的是:

splice((方法向数组添加项/从数组中删除项,并返回删除的项目。

注意:此方法会更改原始数组

您的问题why aren't all the array elements registered in the console?的答案是,这两种方法都会更改原始数组。

最新更新