js中的赋值、浅拷贝、深拷贝的区别

JSON.parse(JSON.stringify(obj))实现深拷贝的弊端

浅拷贝:当我们把一个对象赋值给一个新的变量时,赋的其实是该对象在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。

    var obj = {
      name: 'puxiaoruo',
      language: ['javascript', 'c', 'c#', 'php']
    }
    var obj1 = obj
    obj1.name = 'xiewenting'
    obj1.language[0] = 'java'
    console.log(obj)
    console.log(obj1)

输出为:

浅拷贝:重新在堆中创建内存,拷贝前后对象的基本数据类型互不影响,但拷贝前后对象的引用类型共享一块内存,会相互影响。

    var obj = {
      name: 'puxiaoruo',
      language: ['javascript', 'c', 'c#', 'php']
    }
    // var obj1 = obj
    // obj1.name = 'xiewenting'
    // obj1.language[0] = 'java'
    // console.log(obj)
    // console.log(obj1)

    function shallowCopy (object) {
      var target = {}
      for (const key in object) {
        if (object.hasOwnProperty(key)) {
          target[key] = object[key]
        }
      }
      return target
    }

    var shallowCopyObj = shallowCopy(obj)
    shallowCopyObj.name = '111'
    shallowCopyObj.language[0] = 'hello world'
    console.log(obj)
    console.log(shallowCopyObj)

输出为:

深拷贝:从堆内存中开辟出来一个新的区域存放新对象,对对象中的子对象进行递归拷贝,拷贝前后的两个对象互不影响。

    var obj = {
      name: 'puxiaoruo',
      language: ['javascript', 'c', 'c#', 'php']
    }
    function deepClone (object) {
      var cloneObj = new object.constructor()
      if (object === null) return object
      if (object instanceof Date) return new Date(object)
      if (object instanceof RegExp) return new RegExp(object)
      if (typeof object !== 'object') return object
      for (const key in object) {
        if (object.hasOwnProperty(key)) {
          cloneObj[key] = deepClone(object[key])
        }
      }
      return cloneObj
    }
    var deepCloneObj = deepClone(obj)
    deepCloneObj.name = '333'
    deepCloneObj.language[0] = 'hello vue'
    console.log(obj)
    console.log(deepCloneObj)

输出为:

三者总结

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值