一、什么是浅拷贝和深拷贝
1. 存储变量机制
- 内存分为栈内存和堆内存,简单数据类型存储在栈内存中,复杂数据类型引用存在栈内存中,实际的值存在堆内存中,示意图如下
2. 浅拷贝&深拷贝
- 浅拷贝:只拷贝引用,不在堆中开辟新的空间存储拷贝对象,导致两个引用指向一个内存空间,一个会受另一个的影响。
- 深拷贝:拷贝引用,在堆中开辟新的存储空间存储拷贝对象,原对象和拷贝对象不会互相影响。
二、具体实现
1. 浅拷贝
- 1️⃣for in、2️⃣Object.assign()、3️⃣=赋值、4️⃣解构赋值
(1)for in
(2)Object.assign()
- assign方法是ES6新增的对象方法。
- assign(target:目标对象, source:源对象),返回值为目标对象
- 只传一个参数时:相当于浅拷贝目标对象
- 传两个参数时:将目标对象上相同的属性通过源对象的属性覆盖,目标对象独有的属性保持原样
(3)=赋值
let obj = {a: '1', b: '2'};
let obj1 = obj;
(4)解构赋值
let o = {a: '1', b: '2'}
let obj = {...o}
2. 深拷贝
- 1️⃣JSON.parse&JSON.stringify、2️⃣递归、3️⃣_.cloneDeep(value)
(1)JSON.parse&JSON.stringify
- JSON.parse:从一个字符串中解析出json(键值对)
- JSON.stringify:从json对象中解析出字符串
- 存在问题:原对象的原型链丢失了,指向Object
(2)递归
(3)Lodash
_.cloneDeep(obj)