PS:参考一些博客整理供自己面试复习使用~
浅克隆
浅克隆就是将栈内存中的引用复制一份,赋给一个新的变量,本质上两个指向堆内存中的同一地址,内容引入相同,其中一个变化,另一个也变化。
深克隆
深克隆就是创建一个新的空对象,开辟一块内存,然后将原对象中的数据全部复制过去,完全切断两个对象间的联系。
区别
浅克隆和深克隆最大的区别就是对引用值的处理,浅克隆之后「你」改「我」也改,深克隆之后「你」改「我」不改。
PS:这里额外提一点,浅克隆和深克隆都是基于引用数据类型来说的,基本数据类型存储在栈中,引用数据类型存储在堆中。
铺垫了这么多,我们来说下如何深克隆、如何浅克隆吧~
浅克隆:
- slice浅拷贝
let arr = [1, 2, 3];
let newArr = arr.slice();
newArr[0] = 100;
console.log(arr);//[1, 2, 3]
- Object.assign
let obj = { name: 'sy', age: 18 };
const obj2 = Object.assign({}, obj, {name: 'sss'});
console.log(obj2);//{ name: 'sss', age: 18 }
- concat浅拷贝数组
let arr = [1, 2, 3];
let newArr = arr.concat();
newArr[1] = 100;
console.log(arr);//[ 1, 2, 3 ]
- 展开运算符
let arr = [1, 2, 3];
let newArr = [...arr];//跟arr.slice()是一样的效果
深克隆
简单版实现深克隆:
JSON.parse(JSON.stringify());
但是实际上,这个方法有很多问题:
- 无法拷贝一个特殊的对象,比如RegExp、Date、Set、Map等
- 无法拷贝函数 因此需要手动实现一个深拷贝:
更新ing