js如何实现一个深拷贝

假设想要得到两个一样的对象,我们会想到

let obj2=obj1

但这样我们会发现,在更改obj2的时候,obj1也被改变,这是因为对象是引用类型,那如何得到两个不相互影响,且初始值相同的对象?

在js中可以使用ES6的拓展运算符...来拷贝obj2,第一层可以正常修改,但遇到多层嵌套时,就会出现内层改变值会影响obj1

5c1f0da0116745afa7f2ec0b480b17c4.png

7fb4db3c44b3449fb2ab556e0befc529.png 

 第二种方式,是使用JSON方法

2818e6fe017543cd98f19bddfb1a82aa.png

 但遇到复杂对象时,比如内部有函数,则无法完成

所以从原理去思考,我们可以直接把一个对象的内容,去加入到一个空对象里,这样就可以解决很多问题

因为一个对象的内容是不确定的,或许是基本数据类型,我们直接赋值即可,但是遇到对象内部嵌套对象,或者数组等,那就要重新处理,因此可以用递归实现

7980b43f47434cde95bfff1e22731a05.png

 上述代码中,第一次判断毋庸赘言是对象,所以相当于创建一个新对象,之后是简单的对象遍历,如果是基本数据类型,就直接赋值给newobj,如果内部依然是引用数据类型,再调用该函数

c568077cec35497fb4c19f1b19fdb4d7.png

 对于这样一个对象,内部有一个数组,我们给obj2的对象内部数组上push进一个0,发现实现了深拷贝

22acb8604dd048bba03bc0cfc55e2a4d.png

 至此,深拷贝的实现方式就是这些了,工作中常用第二种,因为简洁,而且针对大多数对象可用。

 

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值