【问题标题】:What happens when array is deleted during a for-loop iteration?在 for 循环迭代期间删除数组时会发生什么?
【发布时间】:2018-03-20 14:02:52
【问题描述】:

例如,

for (i in Cow.array){...}

如果CowCow.array 被删除,会发生什么?

另外,如果出现错误,我该如何解决?

【问题讨论】:

  • 取决于语言。大多数情况下会抛出异常,或者以致命错误结束。有些会“工作”,因为在循环内字段是重复的,所以你不能修改它们,但它会导致奇怪的输出。在任何情况下都不要这样做
  • 谢谢,我该如何解决?
  • 不要那样做
  • 你说的removed是什么意思?您只关心for in 循环的行为吗?如果您delete 对象的某个键正在迭代哪些键,则迭代将不会通过该键。如果你从其父对象中删除该对象,那么一切都会照常运行,因为循环保持对对象的实时访问,并且不会在每次迭代时从父对象访问它。

标签: javascript loops for-loop


【解决方案1】:

即使这是大多数情况下也不会返回错误(到目前为止,您使用的是 JavaScript - 请注意 last 测试导致错误)这几乎总是会以奇怪的行为结束:

let myArr = [1,2,3,4]
let myArr2 = [1,2,3,4]
let myArr3 = [1,2,3,4]

for (let i = 0; i < myArr.length; i++) {
  console.log("test without reomving: " + myArr[i])
}

for (let i = 0; i < myArr.length; i++) {
  console.log("test with removing: " + myArr[i])
  myArr.splice(i, 1);
}

for (let i = 0; i < myArr2.length; i++) {
  console.log("last test: " + myArr[i])
  myArr2 = myArr2.splice(i, 1);
}

for (let i = 0; i < myArr3.length; i++) {
  console.log("very last test: " + myArr[i])
  myArr3 = null
}

我强烈建议不要这样做

【讨论】:

    【解决方案2】:

    如果您的目标是在循环时修改数组。尽量避免。

    如果必须,请使用数组的副本来迭代和修改原始数组。

    let myArray = [1, 2, 3, 4, 5]
    let copy = myArray
    for(let i=0; i<copy.length; i++) {
        //do stuff
        // for example remove number 3
        if(i == 3) {
            myArray.splice(i, 1);
        }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      相关资源
      最近更新 更多