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()拷贝的那个属性而言其实是浅拷贝的。
相关文章推荐
- Object.assign 浅拷贝还是深拷贝
- Object的原型拷贝-create、assign、getPrototypeOf 方法的结合
- ES6:扩展运算符(...)与Object.assign()中的部分深拷贝
- JavaScript 对象拷贝与Object.assign
- ES6 能否使用Object.assign实现深浅拷贝
- js对象深度拷贝、Object.assign()、Object.assign()复制非对象、Object.assign()浅拷贝
- 小悟:Object.assign() “深拷贝”
- JavaScript对象拷贝与Object.assign用法实例分析
- javascript系列--Object.assign实现浅拷贝的原理以及实现
- 对Object.assign的拷贝分析
- 使用extend 解决Object.assign 浅拷贝问题
- Object.assign()对象拷贝
- Object的原型拷贝-create、assign、getPrototypeOf 方法的结合
- Object的clone()方法、深拷贝、浅拷贝
- es6 Object.assign
- es6 Object.assign()方法
- 13.5.1 面向对像的模块(Object-Oriented Module)_虽然很晚,但还是得更新
- Object.assign方法复制或合并对象
- Java中Object的clone()及浅拷贝、深拷贝分析
- jsonArray添加了有数据的JSONObject,但是还是为空.