JavaScript如何实现深拷贝

 值类型与引用类型的区别

在解决js如何实现深拷贝的问题之前,首先我们要了解什么是值类型,什么是引用类型,话不多说,赶紧上图!

图1

图1定义了number类的值类型,当改变了变量a的值,变量b的值并没有受到任何影响。


 图2.1

 图2.1定义了一个obj1的对象,然后把obj1赋值给了obj2,当obj2的属性name被改变之后,控制台打印结果如图2.2

 为什么会出现这种现象呢?这个我们要从它的底层讲起!

底层原理

栈内存
kyevalue
a10
b10

从底层逻辑来说,值类型的变量是存储在栈内存当中,所以变量b是变量a拷贝出来的一个副本,当变量a加2的时候,变量b是不会改变的,a和b相对于两个独立的个体。变量b加2的底层逻辑如下表格。

栈内存
kyevalue
a10
b12

 栈不仅存储基本类型的数据,而且还存储引用数据类型的地址指针,所以上述的图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.递归调用

代码检验

最后我们检验一下代码!

 控制台打印结果:

 作者寄语

深克隆是开发面试爱考的知识点,同学们也可以自己尝试去画一下底层逻辑图,这样会更好地去理解深克隆的原理,关注我,一起挑战互联网高薪工作!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值