值类型与引用类型的区别
在解决js如何实现深拷贝的问题之前,首先我们要了解什么是值类型,什么是引用类型,话不多说,赶紧上图!
图1
图1定义了number类的值类型,当改变了变量a的值,变量b的值并没有受到任何影响。
图2.1
图2.1定义了一个obj1的对象,然后把obj1赋值给了obj2,当obj2的属性name被改变之后,控制台打印结果如图2.2
为什么会出现这种现象呢?这个我们要从它的底层讲起!
底层原理
栈内存 | |
kye | value |
a | 10 |
b | 10 |
从底层逻辑来说,值类型的变量是存储在栈内存当中,所以变量b是变量a拷贝出来的一个副本,当变量a加2的时候,变量b是不会改变的,a和b相对于两个独立的个体。变量b加2的底层逻辑如下表格。
栈内存 | |
kye | value |
a | 10 |
b | 12 |
栈不仅存储基本类型的数据,而且还存储引用数据类型的地址指针,所以上述的图2.1,实际上在栈内存中存储的是obj1对象的地址,并非obj1的数据,真正保存对象的地方是堆内存,放一张图给大家看应该会清晰一点。
上面的图片,可以说明,obj1这个对象实际上在栈内存中存储的是obj1的地址指针,而真正的属性和值,则储存在堆内存中。简单粗暴点说,就是obj1和obj2是夫妇,obj1买了一套房子,也写了obj2的名字,obj1的房子实际上也是obj2的房子, 所以修改obj2的值,实际上也是修改obj1的值,因为他们储存的地址是一样的!
深拷贝
入席以后汤喝完该上菜了!!!
假如obj1有一套房子,obj2也想拥有一套和obj1装修风格一样的房子,那他应该要怎么做呢?直接抢?nonono,酱紫是犯法滴!obj2可以通过复制obj1的装修风格来完成这个心愿,上到灯光下到橱窗,所以深拷贝(也叫深克隆)也是这样的道理,我们可以通过写一个deepClone()函数,让对象obj1来实现对obj2所有数据的拷贝。
上菜!哦不是,上源码!
具体步骤:
1.创建一个deepClone()的函数,创建一个接收对象的形参obj{}
2.判断是否是引用类型或者为空
3.判断是对象还是数组
4.使用(let key in obj)遍历对象或者数组
5.判断是否为原型的属性
6.递归调用
代码检验
最后我们检验一下代码!
控制台打印结果:
作者寄语
深克隆是开发面试爱考的知识点,同学们也可以自己尝试去画一下底层逻辑图,这样会更好地去理解深克隆的原理,关注我,一起挑战互联网高薪工作!