手写深拷贝

JavaScript深拷贝实战:浅拷贝与深拷贝的区别与实现
本文详细介绍了JavaScript中浅拷贝和深拷贝的概念,通过JSON.stringify和递归函数的方式实现深拷贝,并展示了在对象和数组实例中的应用。通过实例演示了深拷贝的必要性和浅拷贝可能导致的问题。

    浅拷贝:只复制指针,没有复制实际数据
    深拷贝:连同数据一起复制
           实现方式:
            1. JSON.stringfy()  JSON.parse()
            2.递归函数实现

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>深拷贝</title>
    <style></style>
  </head>
  <body>
    <script>
      /* 浅拷贝:只复制指针,没有复制实际数据
       深拷贝:连同数据一起复制
      1. JSON.stringfy()  JSON.parse()
      2.递归函数实现*/
      var arr = [1, 2, 3]
      var arr2 = arr
      arr2[0] = 9
      console.log('arr-', arr) //arr数据被改动
      //运行结果: arr- [9, 2, 3]
      console.log('arr2-', arr2)
      //运行结果:arr2- [9, 2, 3]
      //——————————————————————————
      //——————————————————————————
      var obj = { name: '小蜜瓜', age: 20 }
      var obj2 = {
        name: '大猪头',
        hobby: ['听歌', '跳舞', '滑雪'],
        pet: {
          type: 'dog',
          price: 250,
          name: 'AA喵',
        },
      }
      function Student(name, age) {
        this.name = name
        this.age = age
      }
      Student.prototype.hello = 'beauty'
      var peo = new Student('美女', 18)

      //——————————————————————
      function deepClone(obj) {
        let objClone = obj instanceof Array ? [] : {}
        //if 判断 用以 防止用户不传数据,即值存在且是对象
        if (obj && typeof obj === 'object') {
          for (var k in obj) {
            //继承的属性排除,不复制
            if (obj.hasOwnProperty(k)) {
              // 方式1 objClone[k] = obj[k]
              // 方式2
              if (obj[k] && typeof obj[k] === 'object') {
                objClone[k] = deepClone(obj[k])
              } else {
                objClone[k] = obj[k]
              }
            }
          }
        }
        return objClone
      }
      /*
       //—————————————————— 检验 方式1
       var nobj1 = deepClone(obj)
       nobj1.name = '嗷嗷'
       console.log(obj)
       //运行结果:{name: '小蜜瓜', age: 20}
       🍋 objClone[k] = obj[k] 深复制成功
       var nobj2 = deepClone(obj2)
       nobj2.hobby[0] = '撩妹'
       console.log(obj2)
        //运行结果:{hobby: (3) ['撩妹', '跳舞', '滑雪'],name: "大猪头",pet: {type: 'dog', price: 250, name: 'AA喵'}}
        🍋 objClone[k] = obj[k] 深复制失败
        */
      //————————————————————检验 方式2
      var nobj2 = deepClone(obj2)
      nobj2.hobby[0] = '打球'
      console.log(obj2)
      //运行结果:{hobby: (3) ['听歌', '跳舞', '滑雪'],name: "大猪头",pet: {type: 'dog', price: 250, name: 'AA喵'}
      var peo2 = deepClone(peo)
      console.log(peo2) //{name: '美女', age: 18, hello: 'beauty'}age: 18hello: "beauty"name: "美女"} 把原型链的属性也拿到了 
      //解决方式:上述方法添加 if (obj.hasOwnProperty(k)) {}即可解决 ,修改后结果为{name: '美女', age: 18}
      
    </script>
  </body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记忆怪 bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值