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没变,什么原理,网上查了一下也没得出什么有用的结论啊
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没变,什么原理,网上查了一下也没得出什么有用的结论啊
Object.assign
返回了一个新的对象给copy
,所以copy.name
和obj.name
是两个对象的属性,因为它们是原始值,是不相关的。但是age
属性是一个引用对象,所以改变了它,所有引用它的地方都会跟着改变,Object.assign
只能保证使用了原始值对象的属性是新的,所以不能替代深拷贝。
MDN上有解释,Object.assign拷贝的是属性值,如果属性值是对对象的引用,那么自然拷贝了那个引用,也就是这里的age;反之name是字符串,也就是原始类型,直接拷贝值。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
Object.assign()
拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用简单来说,就是通过
Object.assign
拷贝的对象,如果对象的属性是简单数据类型,那么它与源对象之间是不相关的,如果是引用类型,那么改变拷贝对象的属性也会影响到源对象