白月光在照耀,你才想起她的好 ------即将拥有八块腹肌的程序员
使用深拷贝必须要知道他的使用场景,一般在多人开发的时候对于一个公用的数据,再不确定改变它是否会对其他人或者后面的开发产生影响的时候,这个时候深拷贝就显得尤其重要了。
一般深拷贝都是对引用数据类型的使用,因为这跟数据存储有关系。
这里就要引入基本数据类型和引用数据类型的概念了。
基本数据类型:number,string,boolean,null,undefined,symbol还有BigInt(这个不太熟悉放在最后了)
引用数据类型:object,array,fuction,data等
基本数据类型名跟值都储存在栈中
比如 let A = 1;栈会开辟一个内存用来储存 A和它的值 如图:

当let B = A;时栈会从新开辟一个内存用来储存B的值如图:

因为这个原理,B 的赋值是重新开辟了内存进行保存,所以A跟B的值并不会有联系
引用数据类型名是储存在栈中的而值是储存在堆中的,栈里面还存储着这个数据的地址,可以根据这个地址去查询储存在堆中的数据。如图

A的值是储存在堆中的而B=A通过这种方式来赋值的话是跟基本数据类型不一样的,如图

B只会把A储存的地址赋值过去,并不会把堆中的数据赋值,这就导致了修改B的时候修改的是同一个地址指向的数据,就会出现B改变A也跟着改变。深拷贝的原理就是在复制数据的时候要在堆内单独开辟新的内存来存放新的值。
下面我们就实现一些简单的深拷贝:
1.可以通过JSON.stringify与JSON.parse来进行一些简单的深拷贝:
let newObj = JSON.parse(JSON.stringify(obj))
2.jQuery中extend( )
jQuery.extend([deep],target,object1,[objectN]);
3.使用递归的方法进行深拷贝

原理就是将数据单独分开判断,数组和对象区别开进行赋值的过程,当然还有很多好用的插件也可以达到深拷贝的目的,这里就不一一枚举了。