【深拷贝和浅拷贝的区别】
深复制和浅复制最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用。
(深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的)
一、浅拷贝
——是拷贝基本类型的数据,而引用类型数据,复制后也会发生引用,我们把这种拷贝叫做“浅拷贝”。
浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。
- 复制基本类型的属性;
- 引用类型的属性复制,复制栈中的变量和变量指向堆内存中的对象的指针,不复制堆内
let a=[0,1,2,3,4],
b=a;
console.log(a===b); //true
a[0]=1;
console.log(a,b); 1,1,2,3,4
二、浅拷贝
——在计算机中开辟了一块新的内存地址用于存放复制的对象。
浅拷贝出来的数据并不独立,如果被复制的对象改变了,那么浅拷贝的对象也会改变,深拷贝之后就会完全独立,与浅拷贝断绝关系。
- 复制基本类型的属性;
- 引用类型的属性复制,复制栈中的变量和变量指向堆内存中的对象的指针和堆内存中的对象。
深拷贝的实现方式:
1.JSON.parse(JSON.stringify())
原理: 用JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。
这种方法虽然可以实现数组或对象深拷贝,但不能处理函数。
2.手写递归方法
递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝。
2.函数库lodash