因此,我正在学习不同的数组迭代方法,并遇到了奇怪的事情:
[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]
尽管最后只是关闭了,我打印出3?这是因为arr回调发生在下一个项目的开头还是什么?既然它应该在数组AFTER上做shift()?我意识到这是一个不好的情况"使用这种方法,我只是好奇为什么会发生这种情况。
答案 0 :(得分:6)
数组的.length
已更改。索引0
处与元素相邻的元素在0
调用后变为索引.shift()
。
答案 1 :(得分:2)
您的问题的答案在移位方法的文档中有所描述。
根据here
的MDNshift方法删除零点索引处的元素并移位 连续索引处的值下降,然后返回已删除的值 值。如果length属性为0,则返回undefined。
因此,一旦完成移位操作,就会改变原始数组
[1,2,3]
到[2,3]
以及从0
到1
的索引增量值。接下来,迭代循环的第三次迭代是不需要,因为遍历了数组(2)的长度。