手写浅拷贝和深拷贝

16 篇文章 0 订阅
13 篇文章 1 订阅
本文探讨了JavaScript中的深拷贝和浅拷贝概念,通过实例展示了如何使用扩展运算符实现浅拷贝,以及如何通过递归方法实现深拷贝。for...in循环用于遍历对象属性,递归确保所有层级都被复制。测试结果显示,浅拷贝只复制第一层属性,而深拷贝能防止对象内部属性的修改影响原始数据。
摘要由CSDN通过智能技术生成

深拷贝 :

首先定义一个对象,如上所示。

  <script>
    const obj = {
      name: '李逍遥',
      age: 18,
      address: {
        name: '余杭镇'
      }
    }
    function deepClone(obj) {
      // 先判断obj是否为一个对象
      if (typeof obj != 'object') {
        return obj
      }
      // 根据obj的类型判断并定义一个新的变量用于接收数据,生成一个新的对象/数组
      // 实现拷贝的功能
      let result = Array.isArray(obj) ? [] : {}
      // 将对象中的属性值遍历出来
      for(let key in obj){
        result[key]=obj[key]
      }
      return result
    }
    const obj2=deepClone(obj)

  </script>

接下来我们来测试

 发现确实是实现了拷贝的功能,新生成的对象改变其中的第一层属性,并没有引起obj中的数据的变化,这是符合拷贝的。然而                ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

 当我仅仅想要改变obj2中address中name的时候发现,原来的obj中的数据也发生了变化,这并不是我们想要的深度拷贝,深度拷贝是即使是数组/对象中的改变也不应该影响原来数据的变化。所以发现上面的代码只能实现第一层的拷贝也就是浅拷贝,如果仅仅只是想实现浅拷贝,那干脆...扩展运算符不就好了吗(下方有浅拷贝的方法)?于是在之前的代码中加上递归的方法,就可以实现深拷贝了

 接下来我们进行测试

那上方的for  in 是什么?以及为什么使用递归就可以了呢?

for in的作用是遍历对象中的属性当然也可以获取对象属性的属性值,由于key是个变量,所以要使用  [ ]  ,如果deepClone的参数还是个对象它就会再来一遍,一层一层直至全部拷贝完成

浅拷贝:

        上文提到了扩展运算符,是不是可以实现浅拷贝(第一次数据的拷贝)呢?

测试一下:

 发现确实是实现了浅拷贝的功能

  const obj = {
      name: '李逍遥',
      age: 18,
      address: {
        name: '余杭镇'
      }
    }
    obj2={...obj}

如有问题请指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值