浅拷贝, 深拷贝

本文介绍了JavaScript中浅拷贝和深拷贝的概念。浅拷贝只复制对象的第一层属性,而深拷贝会递归复制整个对象及其嵌套的引用数据类型。文中提到了使用for循环、扩展运算符和Object.assign()方法实现浅拷贝,以及通过递归函数实现深拷贝的方法。
摘要由CSDN通过智能技术生成

  1.浅拷贝 => 在引用数据类型当中,我们只拷贝一层:


        let studentInfo = {
            name:"张三",
            age:18,
            gender:"男",
            address:{
                addressInfo1:"江西",
                addressInfo2:"深圳"
            },
            hobby:["唱","跳","rap","篮球","music"]
        }

        let personInfo = {}
       // 将studentInfo赋值一份给personInfo => 这个不叫做拷贝,只是将studentInfo里面的地址复制一份,给personInfo//
        personInfo = studentInfo 


        浅拷贝:
        for(let key in studentInfo){
             personInfo[key] = studentInfo[key]
         }

        修改张三的姓名
         studentInfo.name = "李四"
         studentInfo.address.addressInfo1 = "湖南"

         console.log(personInfo,studentInfo);


        
            之前所学过的
                ... 扩展运算符
                Object.assign()
        
        //将后面的studentInfo浅拷贝一份给personInfo//
         Object.assign(personInfo,studentInfo)


        扩展运算符:
        personInfo = {...studentInfo}

        studentInfo.name = "王五"
        studentInfo.address.addressInfo1 = "四川"

        console.log(personInfo,studentInfo);

  2.深拷贝 => 需要递归:
     function deepCopy(newData,oldData){
             
        // 遍历老的对象的时候
            //如果是基本数据类型 => 直接拷贝
            //如果是引用数据类型 => 
              // 数组 => 创建一个新的数组 => 对数组里面的内容进行拷贝
              // 对象 => 创建一个新的对象 => 对对象里面的内容进行拷贝
            
         for(let key in oldData){
                   console.log(Object.prototype.toString.call(oldData[key]));
                if(Object.prototype.toString.call(oldData[key]) == '[object Object]'){
                    //创建一个新的数组
                    newData[key] = {}
                    //对复杂(引用)数据类型进行深层次的拷贝
                    deepCopy(newData[key],oldData[key])
                }else if(Object.prototype.toString.call(oldData[key]) == '[object Array]'){
                    newData[key] = []
                    deepCopy(newData[key],oldData[key])
                }else{
                    newData[key] = oldData[key]
                }
            }
        }
        deepCopy(personInfo,studentInfo);
        studentInfo.name = "王五"
        studentInfo.address.addressInfo1 = "四川"
        console.log(personInfo,studentInfo);
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值