深拷贝与浅拷贝

博客介绍了深拷贝与浅拷贝的概念。浅拷贝只复制第一层简单数据类型,第二层对象仅复制地址,不重新开辟空间,修改原对象属性会影响复制对象。深拷贝则不管属性类型,都会重新开辟空间复制,遇到嵌套复杂类型会用递归遍历复制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深拷贝与浅拷贝

1.浅拷贝(值传递):只复制第一层简单数据类型,如果有第二层(对象)就只复制第二层的地址,不会重新开辟一个空间。

通过for in 循环遍历obj1中的元素,依次赋值给obj2,但是obj1的属性中有一个dog属性也是一个对象,这样复制给obj2的只是把dog这个对象的地址复制过去了,obj2中的dog对象并没有重新开辟一个空间,相当于obj1和obj2的dog属性是共享同一个地址的,所以当你改变obj1中 dog的属性值,obj2也会相应的改变,这就是浅拷贝。

    var obj1 = {
        usname: 'zs',
        age: '18',
        dog: {
            yoll: '11',
            name: '哈哈'
        }
    
    var obj2 = {}
     for (var k in obj1) {
         obj2[k] = obj1[k];
     }
       console.log(obj1, obj2);
2.深拷贝-递归(地址传递),不管属性是简单还是复杂类型,都复制一遍(会重新开辟新空间),当属性里面还嵌套复杂数据类型,这个时候用递归不断往下遍历复制。
 	 function deepCopy(ol1, ol2) {
        for (var k in ol1) {
            // 如果ol1里的属性是复杂数据类型,数组或者对象
            if (ol1[k] instanceof Array || ol1[k] instanceof Object) {
                // 如果是数组初始值为[],对象{} ,三元表达式                 
                ol2[k] = ol2[k] instanceof Array ? [] : {};
                // 如果属性里又存在复杂数据类型,嵌套很多层,这里就利用递归,不断往下找
                deepCopy(ol1[k], ol2[k])
            } else {
                ol2[k] = ol1[k]
            }
        }
    }
    deepCopy(obj1, obj2);
    obj1.usname = '修改后'
    obj1.dog.yoll = '修改后'
    console.log(obj1);
    console.log(obj2);   // 这时修改obj1里的属性后,obj2不会随之改变了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值