对象的浅拷贝和深拷贝

浅拷贝:将对象循环遍历复制到另一个对象

弊端:修改一个对象的属性,另一个对象会跟着改变


        var p1 = {
            name:"张三",
            age:20,
            gender:"男",
            favs:["前端","Java","C语言"],
            wife:{
                name:"李四",
                age:20,
                gender:"女",
                favs:["香奈儿","爱马仕","古驰"]
            }
        }


        var p2 = {};

        // 浅拷贝----for in  循环  将p1的每一个键值对赋值给p2
        for(var k in p1){
            p2[k] = p1[k];
        }

        p2.name = "申五";
        p2.wife.age = 55;

        console.log(p2);
        console.log(p1);

        // 会发生一改全改的情况(数据安全的问题)

深拷贝:

1、实现原理:使用JSON.parse(JSON.stringify(obj))

弊端:对象的属性值是函数时,无法拷贝;原型链上的属性无法拷贝;不能正确的处理 Date类型的数据;会忽略 undefined

2.实现原理:判断+递归

弊端:对象属性多的时候消耗的性能较大

 // 深拷贝的实现原理: 保证拷贝的每一个键值对都是基本类型
        /*
            参数设计: 将p1拷贝到p2中   p1(当前对象cur)   p2(目标对象tar)
        */
        function deepCopy(cur,tar){
            // 1. 遍历 cur 对象 
            for(var k in cur){
                // 数组用for in 循环 k 是索引
                // 2. for in 循环 会遍历 原型成员 --- 实例成员判断
                if(cur.hasOwnProperty(k)){
                    // console.log(k);
                    // 3. 引用类型和基本类型的判断
                    if(typeof cur[k] ==="object"){
                        // 不是数组就是对象
                        // console.log(k);
                        // 4. 数组对象的判断
                        // tar[k] =Object.prototype.toString.call(cur[k])==="[object Array]"? []:{};
                        tar[k] =Array.isArray(cur[k]) ? []:{};

                        // 5. 递归调用-----入口
                        deepCopy(cur[k],tar[k]);
                        /*
                           过程: 
                            1. deepCopy(p1,p2)
                            2. deepCopy(p1.favs,p2.favs)
                            2. deepCopy(p1.wife,p2.wife)
                            3. deepCopy(p1.wife.favs,p2.wife.favs)
                        */
                    }else{ // 出口
                        // 基本数据类型---- 直接拷贝
                        tar[k] = cur[k];
                    }
                }
            }
        }

        deepCopy(p1,p2);

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值