forin的循环问题

let a = {a: 1}
for (let key in a) {
  console.log(key)
  a.b = 1
}

image.png
我在forin的循环中插入了b,为什么循环只循环一次呢,不应该是我插入了b要循环两次吗

阅读 1.7k
4 个回答

for ... in 可以理解成

const keys = Object.keys(a);
for (let i = 0; i < keys.length; i++) {
   // 这里改变了 a 并不会影响到 keys
}

一般 for...infor...of 循环都被认为是 foreach 循环,它和普通的 for (;;) 循环不同,是一种迭代模式。而迭代模式在迭代前需要固定当前状态,而且一般不应该在迭代过程中修改迭迭代源,尤其是增删操作。

key可能是在编译过程中直接取了a的指针值,是值拷贝而不是引用。设计如此而已

看看《编译原理》

for (let i = 0; i < Object.keys(a).length; i++) {
  console.log(Object.keys(a)[i])
  a.b = 1
}

在 for in 循环中新插入的属性不一定可以被循环到。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题