「面试」-浅克隆、深克隆

386 阅读1分钟

PS:参考一些博客整理供自己面试复习使用~

浅克隆

浅克隆就是将栈内存中的引用复制一份,赋给一个新的变量,本质上两个指向堆内存中的同一地址,内容引入相同,其中一个变化,另一个也变化。

image.png

深克隆

深克隆就是创建一个新的空对象,开辟一块内存,然后将原对象中的数据全部复制过去,完全切断两个对象间的联系。

image.png

区别

浅克隆和深克隆最大的区别就是对引用值的处理,浅克隆之后「你」改「我」也改,深克隆之后「你」改「我」不改。

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