梗概

在遍历过程中,对迭代对象进行修改,导致遍历结构发生改变,就会导致缺漏或者重复遍历

实例:

错误案例:

let arr = ["a", "b", "c"]
let count = 0
for (const i of arr) {
    console.log(count, '----', i)
    if (i == "b") arr.splice(arr.indexOf(i), 1)//删除当前元素
    count++
}
//0 ---- a
//1 ---- b

少遍历了个3

说明

  • for of遍历数组的时候是基于最基础的for循环语法实现的,即通过索引访问数组元素
    • 当删除一个当前访问的元素时,索引指向下一个未访问的元素,导致误以为下一个元素也被访问的

解决方案

及时同步遍历结构

let arr = ["a", "b", "c"]
for (let i = 0; i < arr.length; i++) {
    console.log(i, '----', arr[i])
    if (arr[i] == "b") {
        arr.splice(i--, 1)//修改了迭代对象后,让索引与其同步
    }
}
// 0 ---- a
// 1 ---- b
// 1 ---- c