深拷贝程序

深拷贝是针对引用类型而言的

  1. 我们开发中常用的是:
  2. 在这里插入代码片
JSON.parse(JSON.stringify());
这种能解决80%的问题,但是对于正则或者方法就不能深拷贝。

正确的方法如下:

function deepClone(source){
            // 先判断是数组还是对象
            //[]=>Array 基类  {}=>Object 
            const targetObj= source.constructor===Array?[]:{};
            for(let keys in source){

                if(source.hasOwnProperty(keys)){
                    if(source[keys]&& typeof source[keys]==='object')//keys是3种基础数据类型
                    {  //这句话实际上是可以省略的,相当于提示作用
                        targetObj[keys]= source.constructor===Array?[]:{};
                        //分为数组和对象
                        targetObj[keys] =deepClone(source[keys])
                    }
                    //基本数据类型,直接赋值
                    else{
                        targetObj[keys]=source[keys];
                    }
                }
            }
            return targetObj;
        }
        let obj={
            name:'周冬东',
            age:[1,2,4],
            hobby:{
                song:"像我这样的人"
            }


        }
        let targetObj = deepClone(obj);
         obj.grade=100;
        console.log(obj,targetObj);
   



结果
在这里插入图片描述

深拷贝和浅拷贝是在编程中常用的两种对象拷贝方式。 浅拷贝是指创建一个新对象,将原对象的值复制到新对象中,但是新对象中的引用类型属性仍然指向原对象中的相应属性。换句话说,浅拷贝只复制了对象的引用,而不是对象本身。因此,当修改新对象中的引用类型属性时,原对象中的相应属性也会被修改。 深拷贝是指创建一个新对象,并将原对象的值以及引用类型属性的值都复制到新对象中。深拷贝会递归地复制对象的所有属性,包括引用类型属性。因此,修改新对象中的引用类型属性不会影响原对象中的相应属性。 下面是一个示例程序来说明深拷贝和浅拷贝的区别: ```python import copy class Person: def __init__(self, name, age): self.name = name self.age = age class Company: def __init__(self, name, employees): self.name = name self.employees = employees # 创建一个Person对象 person = Person("Alice", 25) # 创建一个Company对象,其中employees属性引用了person对象 company1 = Company("ABC Company", [person]) # 浅拷贝company1得到company2 company2 = copy.copy(company1) # 修改company2中的employees列表 company2.employees.append(Person("Bob", 30)) # 打印company1和company2的employees列表 print(company1.employees) print(company2.employees) ``` 输出结果为: ``` [<__main__.Person object at 0x000001>, <__main__.Person object at 0x000002>] [<__main__.Person object at 0x000001>, <__main__.Person object at 0x000002>, <__main__.Person object at 0x000003>] ``` 可以看到,浅拷贝后的company2中的employees列表增加了一个新的Person对象,但是原来的person对象也被修改了。 如果我们使用深拷贝来创建company2,修改company2中的employees列表不会影响到原来的person对象。你可以尝试将`copy.copy`改为`copy.deepcopy`来进行深拷贝
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值