5 个回答

对象是引用类型,赋值的时候只是赋值了地址,所以你数组里4个对象都是同一个地址,即同一个对象

你可以这样修改

const obj = {id: 0}
const arr = []
for (let i = 0; i < 4; i++) {
    obj.id++
    arr.push(JSON.parse(JSON.stringify(obj)))
}
console.log(arr)

另外 像提这种问题不要用图片 建议用markdown语法 这样别人就能直接复制使用你的代码来修改 而不用重新手输一遍

for循环中,操作的obj是同一个对象,arr中添加的obj也是同一个对象。for循环完后,obj.id为4,所以arr里的obj都是{id:4}

对象是引用类型。

是因为console.log()这个方法的原因,换成alert()就可以得到符合我们预期的结果

因为arr=[...arr,obj]仅仅是对obj的浅拷贝,归根结底还是使用的obj的应用,如果想要进行深拷贝可以考虑改成这样:

let obj = {id:0},arr=[]
for(let i = 0;i<4;i++){obj.id+=1;arr=[...arr,{...obj}]}
// arr [{id:1},{id:2},{id:3},{id:4}]

当然这里也只是简单的首层深拷贝,要是obj为更复杂的情况得另外考虑。

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