话不多说先举个例子

let source = { a: 1 };
let target = Object.assign({}, source);
console.log(target)  // { a: 1 }

source.a = 2;
console.log(source)  // { a: 2 }
console.log(target)  // { a: 1 }

target的值并没有随着source的变化而变化,到这里有人会说,这一看就是深拷贝嘛,来再举个例子

let source = { a: { b : 1 }, c: 1 };
let target = Object.assign({}, source);
console.log(target)  // { a: { b: 1 }, c: 1 }

source.a.b = 2;
source.c = 3
console.log(source)  // { a: { b: 2 }, c: 3 }
console.log(target)  // { a: { b: 2 }, c: 1 }

神奇的事情发生了,target.a.b的值随着source变化而变化,但是target.c的值并没有随着source变化

看下阮一峰老师对Object.assign()的解释:

Object.assign()方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)

 

JS对象分为基础类型和引用类型,基础类型(Number, String, Boolean…)直接存储于栈中,引用类型(Object…)栈中存储指向存储在堆中的对象的指针。

Object.assign()拷贝的是属性值,如果源对象的属性值是一个指向对象的指针,那也只拷贝那个指针。所以如果对象的属性值为基础类型,对于通过Object.assign()拷贝的那个属性而言是深拷贝;如果对象的属性值为引用,对于通过通过Object.assign()拷贝的那个属性而言其实是浅拷贝的。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐