深拷贝与浅拷贝

一、深拷贝与浅拷贝
    深浅拷贝针对的都是引用类型
1.浅拷贝:拷贝基本数据类型时不会受到影响
        拷贝引用对象时,原对象也会被修改
        仅拷贝对象地址
    白话文:假如b赋值a,当修改a时,b也会跟着变化
       

 a1=[1,2,3]
        a2=a1
        console.log(a1,a2);
        a1.push(4)
        console.log(a1,a2);//a1=[1,2,3,4] a2=[1,2,3,4]


2.深拷贝:深拷贝是指拷贝一个对象的数据之前,先给拷贝的对象创建一个堆地址,这样当拷贝对象指向的堆中的数据改变时,
        被拷贝的对象,堆中的数据不会改变
    白话文:b赋值a,当修改a时b没变

实现深拷贝方法:
    (1).创建新数组,for循环赋值
   

 a1=[1,2,3]
        a2=[] //先创建一个新数组
        for(var i in a1){
            a2.push(a1[i])
        }
        a1.push(4)
        console.log(a1,a2);//a1=[1,2,3,4]  a2=[1,2,3]


    (2)数组方法 slice
        slice的深拷贝就是指使用内置的copy函数来拷贝两个slice。
       

var arr1 = ["1","2","3"];
        var arr2 = arr1.slice(0);
        arr2[1] = "9";
        console.log("数组的原始值:" + arr1 );//[1,2,3]
        console.log("数组的新值:" + arr2 );[1,9,3]


     (3)数组方法 concat
     使用concat合并数组,会返回一个新的数组。
    对象是一个引用数据类型 普通的复制是一个浅拷贝
       

var arr1 = ["1","2","3"];
        var arr2 = arr1.concat();
        arr2[1] = "9";
        console.log("数组的原始值:" + arr1 );//[1,2,3]
        console.log("数组的新值:" + arr2 );//[1,9,3]


    (4)Json.parse(JSON.stringify)
       1.
     

  var arr1 = ["1","2","3"];
        var arr2 = JSON.parse(JSON.stringify(arr1));
        arr1.push(4)
        console.log(arr1,arr2);
        var obj1 = {
        a: 1,
        b: 2,
        c: 3
        }


       2.
       

 var objString = JSON.stringify(obj1); //将对象转换为json字符串形式
        var obj2 = JSON.parse(objString);  //将转换而来的字符串转换为原生js对象
        obj2.a = 5;
        console.log(obj1.a);  // 1
        console.log(obj2.a); // 5

        3.
       

var test={
            name:"zs",
            age:23,
            friends:["dwz1","dwz2","dwz3"]
        };
        var test1 = JSON.stringify(test);
        test.friends[0]="dwz4"
        console.log(test);
        console.log(test1);


3.手动封装深浅拷贝
    如果为true,进行深拷贝,如果为false,进行浅拷贝
    return 返回的是copy后的对象
    copyfun(对象,true)  

    a1=[1,2,3]
    a2=copyfun([1,2,3],false) //a1变,a2变
    a2=copyfun(a1,true)  //a1变,a3不变

    typeof(obj)   --object
    a1 instanceof Array

   

Object.prototype.copyfun=function (a,b){
        if(typeof(a)=="object"){
            if(b==true){
                return a2=JSON.parse(JSON.stringify(this))
            }else{
                return a3=a
            }
        }else{
            return a1=a
        }
    }
    var f1=([1,2,3])
    f2=f1.copyfun(f1,false)
    f1.push(4)
    console.log(f1,f2)


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深拷贝浅拷贝是在对象拷贝过程中所使用的两种不同的方法。深拷贝会创建一个新的对象,并递归地复制所有嵌套的对象,包括对象的所有属性。这意味着,新对象与原始对象是完全独立的,对新对象的修改不会影响原始对象。 浅拷贝则是创建一个新的对象,但是只复制原始对象的引用,而不复制嵌套对象本身。这意味着,新对象与原始对象共享相同的嵌套对象,对新对象或原始对象的嵌套对象进行修改都会互相影响。 在Python中,可以使用copy模块中的copy()函数来进行浅拷贝,使用deepcopy()函数来进行深拷贝。例如,对于列表a,可以使用copy.copy(a)进行浅拷贝,使用copy.deepcopy(a)进行深拷贝。 总结起来,深拷贝会创建一个新的对象,并递归地复制所有嵌套对象,而浅拷贝只复制原始对象的引用。因此,深拷贝会产生独立的对象,而浅拷贝则会共享嵌套对象。这就是深拷贝浅拷贝的区别。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python的深拷贝浅拷贝](https://download.csdn.net/download/weixin_38644097/13749157)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [让你彻底理解浅拷贝深拷贝的区别](https://blog.csdn.net/weixin_43878906/article/details/108358240)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [浅拷贝深拷贝的区别](https://blog.csdn.net/m0_73770538/article/details/126898545)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值