如何理解深拷贝和浅拷贝

文章讲述了JavaScript中基本数据类型与复杂数据类型(如数组和对象)的赋值行为差异,介绍了浅拷贝和深拷贝的概念,以及如何使用JSON.parse和stringify实现深拷贝,同时提供了一个自定义深拷贝函数示例。
摘要由CSDN通过智能技术生成

普通的基本数据类型并不是拷贝

      // 基本数据类型
      // 赋值 并不是拷贝
      let a = 5;
      let b = a;
      b = 3;
      console.log(a, b);

数组与对象的赋值都是浅拷贝

      let arr = [1, 2, 3];
      let newArr = arr;
      newArr.push(4);
      console.log(arr, newArr);

结构赋值    

针对一维数组和对象可以看做是深拷贝

  let arr = [1, 2, 3];
  let newArr = [...arr];
  newArr.push(4);
  console.log(arr, newArr);

针对二维数组和对象是浅拷贝

      let arr2 = [
        [1, 2, 3],
        [4, 5, 6],
      ];
      let newArr2 = [...arr2];
      newArr2[0].push(888);
      console.log(arr2, newArr2);

深拷贝的用法

      let list = [
        { id: 1, stuName: '小明', class: '五年二班' },
        { id: 2, stuName: '小红', class: '五年三班' },
        { id: 3, stuName: '小蓝', class: '五年四班' },
      ];
      let newList = JSON.parse(JSON.stringify(list));
      newList.push({ id: 888 });
      console.log(list, newList);

注意使用 JSON.parse(JSON.stringify(list)) 有一个弊端,就是方法不能进行拷贝。

标准的深拷贝 => 引用数据类型(数组,对象)

      function deepClone(source) {
        // [] => Array(基类) {} => Object
        const targetObj = source.constructor === Array ? [] : {};
        for (let keys in source) {
          if (source.hasOwnProperty(keys)) {
            // 引用数据类型
            if (source[keys] && typeof source[keys] === 'object') {
              targetObj[keys] = source[keys].constructor === Array ? [] : {};
              // 递归
              targetObj[keys] = deepClone(source[keys]);
            } else {
              // 基本数据类型,直接赋值
              targetObj[keys] = source[keys];
            }
          }
        }
        return targetObj;
      }

      let Obj = {
        aa: '哈哈',
        Bb: 1,
        cc: { str: '111', age: 12 },
        dd: [1, 2, 3, 4],
      };

      let newobj = deepClone(Obj);
      newobj.aa = '有钱不买收音机';
      newobj.dd.push('就听你在吹牛逼');

      console.log(Obj, newobj);

我们下期再见,希望可以帮到大家。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值