我知道它适用于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
and Map
, 但不是Array
?
(如果是这种情况,那么除了简单的语法之外,我看不出使用它比for(;;)
。我的印象是这样的for..of
旨在防止错误,即使Array
,就像它一样Set
and 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
在阵列上。无论您对数组中的元素做了什么,它都会在同一位置继续。您可以阅读规格ArrayIterator objects http://www.ecma-international.org/ecma-262/#sec-array-iterator-objects,它们基本上就像for (var index=0; index<array.length; index++) yield array[index];
loop.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)