let list0 = [1, 2, 3]; list0.forEach((v, i) => { v = 0; // 赋值无效 list0[i] = 0; // 赋值有效 }); let list1 = [{ val: 1 }, { val: 2 }, { val: 3 }]; list1.forEach((v, i) => { v = {}; // 赋值无效 为什么 list1[i] = { val: 0 }; // 赋值有效 v.val = 0; // 赋值有效 })
通过打印输出发现v和list[i]确实是同一个对象,但直接修改v却没有效果,通过查阅mdn发现和forEach的内部实现有关,迭代的对象元素并非是原对象,而是一个副本,但这个副本却又拥有原对象属性的属性描述符,因此才会产生——直接修改v无效,修改v的属性有效的现象。