Array.forEach当前元素的赋值问题

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的属性有效的现象。

原文地址:https://www.cnblogs.com/chh1995/p/15543807.html