深浅拷贝 区别与用法

本文详细介绍了JavaScript中的浅拷贝和深拷贝概念,通过实例解析两者的区别。浅拷贝仅复制对象表面,改变其中一个会影响另一个。而深拷贝则在堆中创建全新对象,确保修改不会互相影响。文中还提供了深拷贝的实现方法,通过递归处理复杂对象,确保所有层级都被复制。
摘要由CSDN通过智能技术生成

 1.浅拷贝:浅拷贝是基于原对象实时映射的,新对象与原对象在堆中的同一个对象拿出来的,如果拷贝后的新对象或原对象发生改变,会把改变的内容传回堆中,进而影响到另一个对象

let obj1 = {
        uname: 'a',
        age: 34,
        cars: ['五菱宏光', '金杯'],
        parent: {
          fa: 'b',
          mo: 'c'
        }
      }
      let obj2 = {}

      for (let k in obj1) {
        obj2[k] = obj1[k]
      }

      console.log(obj1)

      console.log(obj2)

for (let k in obj1) 中的k,便是循环出来的key值,所以obj1[k]就是obj1的每一个value

数组的浅拷贝,从改变原数组影响到新数组

let arr1 = ['孙悟空', 18]
      let arr2 = arr1
      console.log(arr1)
      console.log(arr2)

      arr1[0] = '齐天大圣'
      console.log(arr2)

2.深拷贝: 深拷贝是将原对象在堆中对应的对象复制另一份到堆中,新对象与原对象是不会发生牵扯的,不会相互影响相互改变

let obj1 = {
        uname: 'a',
        age: 34,
        cars: ['五菱宏光', '金杯'],
        parent: {
          fa: 'b',
          mo: 'c'
        }
      }
   
      function deepCopy(newObj, oldObj) {
        // 遍历对象
        for (var k in oldObj) {
          let item = oldObj[k]
          // 判断item的类型 如果是数组的话 先创建一个空数组
          if (Array.isArray(item)) {
            // 创建空数组
            newObj[k] = []
            deepCopy(newObj[k], item) // 这里使用了递归结构,为防止子项里面还有数组
          } else if (item instanceof Object) {
            // 创建 空对象
            newObj[k] = {}
            deepCopy(newObj[k], item) // 这里使用了递归,防止子项里面有对象
          } else {
            // 复制拷贝
            newObj[k] = item
          }
        }
      }

      deepCopy(obj2, obj1)

      //   console.log(obj2)

      obj2.fa[0] = 'bb'
      console.log(obj2)
      console.log(obj1)

深拷贝是在递归结构中先创建一个空对象或空数组,将原对象的每一个key所对应的value逐个放入,在原对象的子项中发现还有对象或数组就会继续在新对象中的子项创建空对象或数组,然后再将内容逐一传入.这样一来便在堆中克隆出来了一个与原对象当前状态一模一样的新对象,此时对原对象或新对象的任何改动都不会改变对方的内容

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值