javascript forEach数组回调时间?

javascript forEach数组回调时间?,javascript,Javascript,所以我在学习不同的数组迭代方法时遇到了一些奇怪的事情: [1,2,3].forEach(function(element,index,arr){ console.log(element,index); console.log(arr); arr.shift(); }) 所以你会认为这会产生: 1,0 [1,2,3] 2,1 [2,3] 3,2 [3] 然而,你会发现: 1 0 [1, 2, 3] 3 1 [2, 3] 我正在打印第三张照片,你最后才换掉了吗?

所以我在学习不同的数组迭代方法时遇到了一些奇怪的事情:

[1,2,3].forEach(function(element,index,arr){
        console.log(element,index);
    console.log(arr);
    arr.shift();
})
所以你会认为这会产生:

1,0
[1,2,3]
2,1
[2,3]
3,2
[3]
然而,你会发现:

1 0
[1, 2, 3]
3 1
[2, 3]

我正在打印第三张照片,你最后才换掉了吗?这是因为arr回调发生在下一个项目的开头还是其他地方?因为它应该在之后对数组执行shift()?我意识到使用这种方法是一种“坏情况”,我只是好奇为什么会发生这种情况。

数组的
.length
发生了变化。索引
0
处与元素相邻的元素在
.shift()
调用之后变为索引
0

数组的
.length
已更改。与索引
0
处的元素相邻的元素在调用
.shift()
后变为索引
0

您的问题的答案在shift方法的文档中描述

根据来自的MDN

shift方法删除零索引处的元素并进行移位 连续索引处的值向下,然后返回删除的 价值如果length属性为0,则返回undefined

因此,一旦移位操作完成,原始数组将从
[1,2,3]
[2,3]
,索引值从
0
1
递增。接下来,迭代循环的第三次迭代是不需要的,因为数组(2)的长度已经被遍历。

您的问题的答案在shift方法的文档中描述

根据来自的MDN

shift方法删除零索引处的元素并进行移位 连续索引处的值向下,然后返回删除的 价值如果length属性为0,则返回undefined

因此,一旦移位操作完成,原始数组将从
[1,2,3]
[2,3]
,索引值从
0
1
递增。接下来,迭代循环的第三次迭代是不需要的,因为数组(2)的长度已被遍历。

不建议在迭代期间更改数组的长度…不建议在迭代期间更改数组的长度。。。