深拷贝与浅拷贝的理解

  1. 浅拷贝的理解

浅拷贝的话只会拷贝基本数据类型,例如像string、Number等这些,类似:Object、Array 这类的话拷贝的就是对象的一个指针(通俗来讲就是拷贝一个引用地址,指向的是一个内存同一份数据),也就是说当拷贝的对象数据发生变化,原始数据也会跟着发生改变,是相互影响的。

补充:浅拷贝的话只会拷贝数据的第一层,更深层的是无法拷贝。

代码注解如下所示:常用的写浅拷贝方案:我这里用的是Object.assign() 方法

  let person={
            name:"zhang",
            age:18,
            arr:[1,2,3],
            abj:{
                a:1,
                b:2,
                c:3
            }
        }
    let copyObj=Object.assign({},person)
    console.log(copyObj)//name:'zhang',age: 18, arr:[2,2,2], abj: {a: 'hhahahha', b: 2, c: 3}
    copyObj.name=18
    copyObj.arr=[2,2,2] 
    copyObj.abj.a="hhahahha"
    console.log(copyObj.name,"copyObj") //18,"copyObj"
    console.log(person.name,"person") //zhang person
    console.log(copyObj.arr,"copyObj") // [2, 2, 2] 'copyObj'
    console.log(person.arr,"person") // [1, 2, 3] 'person'
    console.log(copyObj.abj.a,"copyObj")//hhahahha copyObj
    console.log(person.abj.a,"person")//hhahahha person

深拷贝的理解:

深拷贝不仅对指针进行了拷贝,还对指针指向的内容进行了拷贝,也就是说另外申请了一块内存空间,内容和原对象一致,但是两份独立的数据,更改原对象时拷贝的对象是不会发生变化的。

代码注解如下所示:我这里实现深拷贝的方法是JSON 对象的序列化和反序列化方法实现的.

注意这个方法function,undefine 会丢失

        let person={
            name:"zhang",
            age:18,
            arr:[1,2,3],
            abj:{
                a:1,
                b:2,
                c:3
            }
        }
   let copyobj=JSON.parse(JSON.stringify(person))
   console.log(copyobj)//{name: 'zhang', age: 18, arr: [1,2,3], abj: { a:1,b:2,c:3}}
   copyobj.arr[0]=3
   console.log(copyobj.arr) //[3, 2, 3] 
   console.log(person.arr)//[1, 2, 3]

深拷贝实现方式2: 使用递归调用的方式

1.首先我们先封装一个函数取名为 deepClone,里面传入一个参数,默认传的是一个对象
2.判断这个传入的参数是数组还是对象如果传入不是对象,直接返回
3.判断传入的传入的参数类型
4.开始循环,递归的进行拷贝
   const old={
        name:'zhang',
        age:17,
        colors:['pink','yellow','green'],
        friend:{
            name:'小白'
        }
    }
  //深拷贝的函数
    function deepClone(oldObj={}){ //这个函数会接收一个参数
        //判断这个拷贝的对象要么是一个对象要么是一个数组
        if(typeof oldObj !=='object' || oldObj ==null){ //这对象不是一个对象或者是一个null
           return oldObj; //返回这个传入的参数值
        } 
        //经过上一层检验的时候,发现是一个对象,会继续走下面拷贝的流程,拷贝的时候又会递归的调用clone
        //最终拷贝的是对象的完整结果,拷贝的过程
       let result;
        if(oldObj instanceof Array){ //判断参数是否传入的是一个数组
           result=[]  //如果是一个数组就把他复制成一个数组的格式

        }else{
            result={} //如果不是就把他复制成一个对象的格式
        }
      for(let key in oldObj){
        //将原来的属性拷贝到新的里面 key => 对象属性所对应的值
         result[key] =deepClone(oldObj[key] )  //递归调用拷贝
      }
       return result;
    }
   const obj=deepClone(old)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值