【发布时间】:2021-12-05 01:01:10
【问题描述】:
是否有人注意到循环构造 forEach 和 for/of 在“迭代期间添加”项上的行为? ForEach 忽略了数组中有新添加的项目这一事实,并且 for/of 动态地改变迭代器并继续运行,直到数组中没有元素为止。这种现象的原因是什么,使用智能词?在 stackoverflow 上的第一篇文章,所以不判断解释是否简单......谢谢
let my_array1 = [1,2,3]
let my_array2 = ["a", "b", "c"]
//extra iteration cycles were not dynamically added. Loop ends after pre-defined # of cycles.
my_array1.forEach((value, index, the_array) => {
if (value == 3){
// my_array1.push(3)
the_array.push(3) // works like so as well
}
})
console.log(`my_array1 after iteration ${my_array1}`)
//extra iteration cycles WERE dynamically added. Infinite loop!!!
for (let value of my_array2){
if (value == "c"){
my_array2.push("c")
}
}
console.log(`my_array2 after iteration ${my_array2}`)
【问题讨论】:
-
这就是它们的预期(指定)工作方式。不确定您的问题是什么?
-
在迭代时改变一个可迭代对象通常不是一个好主意,所以它是一种边缘情况。可能是因为
Array.prototype.forEach是 ES5 的旧特性,而for ... of和迭代器是 ES6 - 也许发生了改变,但为了向后兼容,旧特性不会改变。
标签: javascript loops foreach