您的位置:首页 > 移动开发 > Objective-C

Object.assign是浅拷贝还是深拷贝?

2020-08-01 13:12 1261 查看

话不多说先举个例子

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()拷贝的那个属性而言其实是浅拷贝的。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: