【原创纯手打】JavaScript中的浅拷贝和深拷贝

由于引用数据类型的数据是存储在堆空间中,在栈空间中存储的是是数据的引用地址。对象的浅拷贝就是将栈空间中的地址复制一份,两个地址指向的同一个数据浅拷贝可以使用Object.assign()来实现  深拷贝可以使用JSON.stringify()先转换为json的串复制,然后再通过JSON.parse()转换回来

深拷贝实践

数组中包含对象

    var obj1 = {
      uname: "张三",
      age: 21,
      school: { name: "教育", address: "北京" },
      hobby: ["学习", "跑步", "吃饭"]
    }

    var obj2 = {}
    for (var k in obj1) {
      if (obj1[k] instanceof Object) {
        //复杂数据类型
        obj2[k] = {}              //先开辟一块新空间
        for (var m in obj1[k]) {    //把旧数据copy到新空间
          obj2[k][m] = obj1[k][m]
        }

      } else {
        //简单数据类型
        obj2[k] = obj1[k]
      }
    }

    // console.log(obj2)
    obj2.school.name = "清华大学"
    console.log("obj2", obj2)
    console.log("obj1", obj1)

数据中包含对象和数组

    var obj1 = {
      uname: "张三",
      age: 21,
      school: { name: "教育", address: "海淀", subSchool: { name: "分校", address: "顺义" } },
      hobby: ["学习", "跑步", "吃饭"]
    }
    var obj2 = {}
    for (k in obj1) {
      if (obj1[k] instanceof Array) {
        //数组 

        //1.创建新数组
        obj2[k] = []
        //2.拷贝数组里面的内容
        for (var m in obj1[k]) {
          obj2[k][m] = obj1[k][m]
        }
      } else if (obj1[k] instanceof Object) {
        //对象
        //1.创建一个新对象
        obj2[k] = {}
        //2.拷贝对象里面的内容
        for (var n in obj1[k]) {
          obj2[k][n] = obj1[k][n]
        }
      } else {
        //简单数据类型
        obj2[k] = obj1[k]
      }
    }

利用递归实现深拷贝

    var obj1 = {
      uname: "张三",
      age: 21,
      school: {
        name: "教育",
        address: "海淀",
        subSchool: { name: "分校", address: "顺义" }
      },
      hobby: ["学习", "跑步", "吃饭"]
    }

    var obj2 = {}
    deepCopy(obj2, obj1)

    //定义
    function deepCopy(obj2, obj1) {
      for (k in obj1) {
        if (obj1[k] instanceof Array) {

          obj2[k] = []

          deepCopy(obj2[k], obj1[k])
        } else if (obj1[k] instanceof Object) {

          obj2[k] = {}

          deepCopy(obj2[k], obj1[k])
        } else {
          //简单数据类型
          obj2[k] = obj1[k]
        }
      }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值