说说对深浅拷贝的理解

说到深浅拷贝,那肯定要提到JavaScript的数据类型,先从数据类型说起。

JavaScript有两种数据类型:基础数据类型和引用数据类型。

基础数据类型又有以下几种: null 、undefined、number、string、Boolean;

引用数据类型包括:object、array、function;

基础数据类型都是按值访问的,我们可以直接操作保存在变量中的实际的值。而引用类型如Array,我们不能直接操作对象的堆内存空间,引用类型的值都是按引用访问的,即保存在变量对象中的一个地址,该地址与堆内存的实际值相关联。

下面要说正事啦!!

深拷贝与浅拷贝的区别:

浅拷贝只复制指向走个对象的指针,而不是复制对象本身,新旧对象共享一块内存;

深拷贝复制并创建一个一模一样的对象,不共享内存,修改新对象,旧对象保持不变。

基础数据类型的数据不存在浅拷贝,只有引用数据类型存在深浅拷贝的区别,深拷贝就是一直拷贝到基础数据类型为止;

下面再说几种常见的深拷贝的实现方式:

1、Object.assign()

Object.assign()是一种可以对非嵌套对象进行深拷贝的方法,如果对象中出现嵌套情况,那么其对被嵌套对象的行为就成了普通的浅拷贝。

2、转成JSON

用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象。

但这种方法的缺陷是会破坏原型链,并且无法拷贝属性值为function的属性。

3、递归

采用递归的方法去复制拷贝对象

4、使用Object.create()方法

直接使用var newObj = Object.create(oldObj),可以达到深拷贝的效果。

5、jquery有提供一个$.extend可以用来做深拷贝。

6、手动复制。

综述就是:在复制非基础类型数据的时候,一直拷贝到基础数据类型的复制就算深拷贝!