1

使用以下 2 个函数,addtoObj记录 'hello' 1 次,但addToArr记录 'hello' 4 次,我预计对象也是如此。为什么'hello'只记录一次addtoObj

let addToObj = () => {
  const obj = { 0: true };
  const add = [1, 2, 3];

  for (let key in obj) {
    console.log('hello');
    for (const j of add) {
      if (!obj[j]) {
        obj[j] = true;
      }
    }
  }
};
addToObj()

let addToArr = () => {
  const arr = [0];
  const add = [1, 2, 3];

  for (let i = 0; i < arr.length; i++) {
    console.log('hello');
    for (const j of add) {
      if (!arr[j]) {
        arr.push(j);
      }
    }
  }
};
addToArr();

4

1 回答 1

0

虽然“常规”for循环在每次迭代后检查其条件,但for in循环可能会在启动时调用Object.keys(obj),然后它不会重新评估该值(即使添加了新键)。

来自JS 文档

一般来说,除了当前正在访问的属性之外,最好不要在迭代期间从对象中添加、修改或删除属性。无法保证是否会访问添加的属性,是否会在修改之前或之后访问已修改的属性(当前属性除外),或者是否会在删除之前访问已删除的属性。

于 2020-04-09T21:41:24.823 回答