Object.assign的问题,为什么只改变了1个值?

let obj = { name: '程序猿', age:{child: 12} }
let copy = Object.assign({}, obj);
copy.name = '单身狗'
copy.age.child = 24
console.log(obj) // { name: '程序猿', age:{child: 24} }

为什么child改变了,但name没变,什么原理,网上查了一下也没得出什么有用的结论啊
阅读 3.2k
4 个回答

Object.assign() 拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用

简单来说,就是通过 Object.assign 拷贝的对象,如果对象的属性是简单数据类型,那么它与源对象之间是不相关的,如果是引用类型,那么改变拷贝对象的属性也会影响到源对象

Object.assign返回了一个新的对象给copy,所以copy.nameobj.name是两个对象的属性,因为它们是原始值,是不相关的。但是age属性是一个引用对象,所以改变了它,所有引用它的地方都会跟着改变,Object.assign只能保证使用了原始值对象的属性是新的,所以不能替代深拷贝。

MDN上有解释,Object.assign拷贝的是属性值,如果属性值是对对象的引用,那么自然拷贝了那个引用,也就是这里的age;反之name是字符串,也就是原始类型,直接拷贝值。

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