07 JS 深浅拷贝

<!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>Document</title>
  </head>

  <body>
    <script>
      /*
            深浅拷贝
            - 将集合中的数据一模一样的复制到另一个集合中(两个集合数据类型一致)
            - 注意:一般我们说的数据 是不包含函数的 (拷贝一般拷贝数组或对象)

            1 赋值
            2 浅拷贝
            3 深拷贝
        */

      // 赋值
      // let o1 = { a: 1 }
      // let o2 = o1
      // // console.log(o2)
      // o2.a = 2
      // console.log(o1 === o2)
      // console.log(o2)

      // 浅拷贝
      // 1-使用for in 语法拷贝对象
      // 将对象(数组)的第一层数据复制一份给另一个对象
      // 注意 拷贝一层数据
      // let o1 = { name: 'zs', age: 17, classInfo: { score: 100 } }
      // let o2 = {}
      // for (const k in o1) {
      //     // 只拷贝了一层
      //     o2[k] = o1[k]
      //     // 如果第一层数据是对象或数组 则仅仅拷贝地址
      // }
      // o2.name = 'ls'
      // o2.classInfo.score = 99
      // console.log(o1)
      // console.log(o2)

      // 2-使用Object.assign()方法 实现浅拷贝
      // 语法 Object.assign(新对象,被拷贝对象)
      // 作用:将拷贝对象的数据进行浅拷贝到对象中
      // 返回值是 浅拷贝后得到的新对象
      // let o1 = { name: 'zs', age: 17, classInfo: { score: 100 } }
      // let o2 = Object.assign({}, o1)
      // o2.name = 'ls'
      // o2.classInfo.score = 99
      // console.log(o1)
      // console.log(o2)

      // 深拷贝
      //  - 无论数据有多少层,都要进行拷贝
      //  - 拷贝后的变量相互之间 不会影响
      // 缺陷 1 不支持函数 和 undefined 的深拷贝 JSON.stringify()会忽略对象中的函数和undefined值,
      // 因此通过这种方法深拷贝的对象将丢失这些数据
      // 无法转换的特殊数据类型 Date RegExp Map Set 等
      // 使用递归实现深拷贝
      function deepCopy(obj, origin) {
        // origin  源头
        for (const k in origin) {
          // console.log(Object.prototype.toString.call(origin[k]))
          if (Object.prototype.toString.call(origin[k]) === "[object Object]") {
            // console.log(origin[k])
            obj[k] = {};
            deepCopy(obj[k], origin[k]);
          } else if (
            Object.prototype.toString.call(origin[k]) === "[object Array]"
          ) {
            obj[k] = [];
            deepCopy(obj[k], origin[k]);
          } else {
            obj[k] = origin[k];
          }
        }
      }
      let o1 = {
        name: "zs",
        age: 17,
        classInfo: {
          score: 100,
          hobby: ["抽烟", "喝酒", "烫头", [1, 2, 3]],
        },
        fn: function () {
          console.log("fn");
        },
      };
      // // let e = o1[name]
      // // console.log(e)
      // let o2 = {}
      // deepCopy(o2, o1)
      // o2.name = 'ls'
      // o2.classInfo.hobby[0] = '说相声'
      // console.log('o1:', o1)
      // console.log('o2:', o2)

      // 使用JSON方法实现深拷贝
       // 缺陷 1 不支持函数 和 undefined 的深拷贝 JSON.stringify()会忽略对象中的函数和undefined值,
      // 因此通过这种方法深拷贝的对象将丢失这些数据
      // 无法转换的特殊数据类型 Date RegExp Map Set 等
    
      let str = JSON.stringify(o1);
      console.log(str);
      let o2 = JSON.parse(str);

      o2.name = "ls";
      o2.classInfo.hobby[0] = "说相声";
      // o1.fn()

      console.log(o1);
      console.log(o2);
      // o2.fn()

      let fn2 = fn.bind(null);
    </script>
  </body>
</html>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值