js深浅拷贝

什么是浅拷贝?

浅拷贝只拷贝js的基本数据类型(String、Number、Boolean、Null、Undefined、Symbol、Bigint),也就是说它只拷贝栈里面的数据,通俗来解释就是是只拷贝对象的最外一层。

列举两种简单的浅拷贝方式:

1.使用es6 Object.assign()方法实现浅拷贝

 const obj = {
        name: '詹主文',
        age: 30,
        hobby: ['上五楼', '唱', '跳', '哈啤酒', '摆烂'],
        occupation: '前端讲师',
        data: {
          uname: '五楼金牌讲师',
        },
      }
      const o = {}
      //注意  使用Object.assign方法时新对象在前,要拷贝的对象在后,位置不能颠倒。
      Object.assign(o, obj)

2.使用es6展开运算符

     const obj = {
        name: '詹主文',
        age: 30,
        hobby: ['上五楼', '唱', '跳', '哈啤酒', '摆烂'],
        occupation: '前端讲师',
        data: {
          uname: '五楼金牌讲师',
        },
      }
      
      //... 完活
      const o = {
          ...obj
      }

什么是深拷贝?

深拷贝就是无限层级拷贝对象,拷贝的新对象与旧对象互不影响。

手写一个简单的深拷贝(原理:理解面试需要)

//定义对象
      const obj = {
        name: '詹主文',
        age: 30,
        hobby: ['上五楼', '唱', '跳', '哈啤酒', '摆烂'],
        occupation: '前端讲师',
        data: {
          uname: '五楼金牌讲师',
        },
      }
      //定义空对象 用来存放拷贝的值
      const o = {}
      //创建递归函数
      function DeepCopyObj(newObj, oldObj) {
        //遍历旧对象
        for (let k in oldObj) {
          //单纯遍历旧对象只能拷贝对象中的简单数据类型
          //所以我们应该在这里在调一次函数让函数递归
          //注意:在递归的时候一定要先判断数组 在判断对象
          // 因为在使用 instanceof 判断的时候 数组也可以是对象 先判断数组避免一些不必要的bug
          //console.log([] instanceof Array)  true
          //console.log([] instanceof Object)  true
          if (oldObj[k] instanceof Array) {
            //判断如果是数组首先要把对象清空否则将无法拷贝 对象同理
            newObj[k] = []
            DeepCopyObj(newObj[k], oldObj[k])
          } else if (oldObj[k] instanceof Object) {
            newObj[k] = {}
            DeepCopyObj(newObj[k], oldObj[k])
          } else {
            newObj[k] = oldObj[k]
          }
        }
        //返回拷贝的新对象
        return newObj
      }

      // 调用函数
      DeepCopyObj(o, obj)
      o.name = 'zzw'
      o.data.uname = '打辅助的'
      o.hobby[0] = '上五楼是认真的'
      console.log(obj)
      console.log(o)

第三方库lodash(掌握)

const obj = {
      uname: 'zzw',
      age: 18,
      hobby: ['乒乓球', '足球'],
      family: {
        baby: '小zzw'
      }
    }
    const o = _.cloneDeep(obj)
    console.log(o)
    o.family.baby = '老zzw'
    console.log(obj)

使用JSON.parse(JSON.stringify())强转

 const obj = {
      uname: 'zzw',
      age: 18,
      hobby: ['乒乓球', '足球'],
      family: {
        baby: 'zzw'
      }
    }
    const o = JSON.parse(JSON.stringify(obj))
    o.hobby[0]='跳'
    o.family.baby='老zzw'
    console.log(o)
    console.log(obj)

jquery深拷贝 $.extend()方法

   const obj = {
        name: '詹主文',
        age: 30,
        hobby: ['上五楼', '唱', '跳', '哈啤酒', '摆烂'],
        occupation: '前端讲师',
        data: {
          uname: '五楼金牌讲师',
        },
      }
      const o = {}
      //$.extend第一个参数为true表示拷贝为深拷贝,第二个参数为要拷贝的新对象,第三个参数为将要被拷贝的对象
      $.extend(true, o, obj)

      o.name = 'zzw'
      o.hobby[0] = 'rep'
      console.log(obj)
      console.log(o)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值