浅拷贝,深拷贝的理解

深拷贝和浅拷贝

浅拷贝:浅拷贝是将对象的每个属性进行依次复制,当对象的属性值是引用类型,实质复制的是其引用,指向的值改也会跟着变化,浅拷贝只拷贝一层
深拷贝:深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,在复制,深拷贝后的对象与原来的对象是完全隔离的,互不影响,深拷贝是层层拷贝
浅拷贝代码操作:
简单的Object.assign()拷贝方法:

//Object.assign()拷贝方法
    //拷贝{ }  
        a = {name:"张三"};
        b = Object.assign({ },a);
        b.name = "李四";    //拷贝完之后进行改变属性,测试拷贝的属性值改变原数据是否改变。
        console.log(a,b);
        //输出:{name:"张三"} 
               {name:"李四"} (拷贝成功)
    //拷贝[ ]
        a = ["1","2","3"];
        b = Object.assign([ ],a);
        b[1]="hello";
        console.log(a,b)
        //输出:["1","2","3"] 
               ["1","hello","3"] (拷贝成功)
//for in拷贝方法
    var copy = function(a){
        var res = a.constructor();
        for(var key in a){
            if(a.hasOwnProperty(key)){
                res[key] = a[key]
            }
        }
        return res;
    }   
    a = {name:"123",people:{name:"456"}};
    b = copy(a);
    b.people.name="hello"; 
    a = ["a","b","c"];b = copy(a);
    b[1] = 0;//拷贝完之后进行改变属性,测试拷贝的属性值改变原数据是否改变。
    console.log(a,b)  
    //输出:["a","b","c"] 
           ["a","0","c"] (拷贝成功)

深拷贝(完美拷贝):

① 如果是基本数据类型,直接返回;
② 如果是RegExp或者Data类型,返回对应类型;
③ 如果是复杂数据类型,递归;
④ 考虑循环引用的问题。

function deepClone(obj,hash = new WeakMap()){   //递归拷贝
     if(obj instanceof RegExp) return new RegExp(obj);
     if(obj instanceof Date) return new Date(obj);
     if(obj === null || typeof obj !== 'object'){
         //如果不是复杂数据类型,直接返回
        return obj;
     }
     if(hash.has(obj)){
        return hash.get(obj);
     }
     //如果obj是数组,那么 obj.constructor 是 [Function: Array]
     //如果obj是对象,那么 obj.constructor 是 [Function: Object]
    let t = new obj.constructor();
    hash.set(obj,t);
    for(let key in obj){
        //递归
        if(obj.hasOwnProperty(key)){    //是否是自身的属性
            t[key] = deepClone(obj[key],hash);
        } 
     }
     return t;
}   
var show = {
    name:"Bob",
    fun:function(){console.log(1)},
    age:null,
    pic:undefined,
}
var show2 = deepClone(show);
show2.name="Mary"
console.log(show,show2)   //拷贝成功,完美拷贝 

浅拷贝和深拷贝的区别:
浅拷贝只能复制对象或数组的第一层属性,而深拷贝是拷贝多层,每一级的数据都会被拷贝出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值