javascript - 在 JavaScript 中使用 for..of 迭代时从数组中删除元素应该是安全的吗?

标签 javascript arrays iteration for-of-loop

我知道它适用于 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

所以我的问题是,迭代安全是否只适用于 SetMap,而不适用于 Array

(如果是这种情况,那么除了简单的语法之外,我看不到在 for(;;) 上使用它的好处。我的印象是这个 for..of 会防止错误,即使使用 Array 也是如此用 SetMap )

请注意,作为一个技巧,我可以通过克隆数组(或反向迭代)来做到这一点:

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/

相关文章:

javascript - 进行测验并需要根据 Javascript 中的正确选择更改背景颜色

java - 如何处理页面关闭时的 'Are you sure you want to navigate away from this page'?

php - 关闭 colorbox 模式窗口时如何防止退出时出现 javascript 警报?

javascript - Google Earth Engine 如何返回每次迭代的图像

javascript - 如何从 Angularjs 内联模板脚本标记内打印到 console.log?

php - 两个数组匹配它们并显示不匹配

javascript - 查找对象键是否在数组中 javascript

java - 非静态方法不能被静态上下文引用

javascript - 检索从对象数组中获取的值的扁平数组,该对象数组存在于顶级对象中,我在该对象数组中获得了一个数组

c++ - C++ 中的递归与迭代阶乘