传值和传址

复杂数据类型–传址:
浅拷贝: 只拷贝数值,不拷贝地址。 节省内存。但相互影响

    let DadProto = {
            name :"张三",
            age:20
        }
        let SonProto = DadProto;
        SonProto.name = "李四";
        console.log(SonProto);//name: "李四" ,age: 20
        console.log(DadProto);//name: "李四" ,age: 20

简单数据类型–传值:

    let a = 10;
    let b = a;
    b = 20;
    console.log(b);  //20
    console.log(a);   //10

解决传址 相互影响的问题
深拷贝 : 数值和地址都拷贝。 内存独立,不相互影响

 let DadProto = {
            name :"张三",
            age:20,
            sex:"男",
            text:undefined,
            fn:function(){
                console.log("哈哈");
            }
        }
        let SonProto = JSON.parse(JSON.stringify(DadProto));
        SonProto.name = "李四";
        console.log(SonProto);//{name: "李四", age: 20, sex: "男"}
        console.log(DadProto);//{name: "张三", age: 20, sex: "男", text: undefined, fn}

这里会返回一个新的对象,达成深拷贝的效果
但是这种方式,会丢失function 和 undefined

封装深拷贝方法
思路:传入一个对象,循环遍历对象,
把对象中的每一个值,赋值给一个新的对象,并返回。
以此达成创建新地址的目的

       let obj = {
            name :"张三",
             age:20,
            sex:"男",
             text:undefined,
             fn:function(){
                console.log("哈哈");
            },
            arr:[],
            obj2:{}
         }
         function deepCopy(obj){
         let newObj = Array.isArray(obj)? []:{};
          for(let key in obj){
         // 判断是否是对象自身的内容,如果是,才去做深拷贝
               if(obj.hasOwnProperty(key)){
                  //判断 是否是对象(也就是复杂数据类型)
                    if(typeof obj[key] === "object"){
        //                 //如果内部依然有更深层次的对象
        //                 //那么这里还需要按照原有步骤,再循环检测一遍
                           newObj[key] = deepCopy(obj[key]);

                      }else{//如果不是,只是简单数据类型
                         newObj[key] = obj[key];
                      }

                 }
           }

            //最后,将我们检测赋值后的新对象返回,以此达成新内存的目的
             return newObj;
         }
          let obj2 = deepCopy(obj);
         obj2.name = "李四";
         console.log(obj);//{name: "张三",age: 20,sex: "男",text: undefined,fn,arr: [],obj2: {}}
         console.log(obj2);//{name: "李四",age: 20,sex: "男",text: undefined,fn,arr: [],obj2: {}}

fon-in 会遍历对象和原型上和原型链的属性和方法
但是我们做深拷贝的时候,是不需要原型或者原型链上的属性和方法的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值