我知道它适用于 Set
,但我的印象是它也适用于 Array。所以我在 Chrome 中尝试了它,但很惊讶它不起作用:
const array = [1,2,3,4,5,6]
for (const item of array) {
if (item === 3 || item === 4) {
array.splice(array.indexOf(item), 1);
}
}
console.log(array) // [1,2,4,5,6]
它没有删除 4
。
所以我的问题是,迭代安全是否只适用于 Set
和 Map
,而不适用于 Array
?
(如果是这种情况,那么除了简单的语法之外,我看不到在 for(;;)
上使用它的好处。我的印象是这个 for..of
会防止错误,即使使用 Array
也是如此用 Set
和 Map
)
请注意,作为一个技巧,我可以通过克隆数组(或反向迭代)来做到这一点:
const array = [1,2,3,4,5,6]
for (const item of Array.from(array)) {
if (item === 3 || item === 4) {
array.splice(array.indexOf(item), 1);
}
}
console.log(array) // [1,2,5,6]
最佳答案
不,(如您的示例所示)在迭代数组时从数组中删除元素是不安全的。
默认的数组迭代器存储当前索引,当你调用splice
时它不会更新这个索引。在阵列上。无论您对数组中的元素做了什么,它都会在同一位置继续。您可以阅读 spec for ArrayIterator
objects , 它们基本上像 for (var index=0; index<array.length; index++) yield array[index];
一样工作循环。
关于javascript - 在 JavaScript 中使用 for..of 迭代时从数组中删除元素应该是安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56705737/