浅拷贝与深拷贝

如何区分 简单来说  B复制了A  如果修改A,B也跟着变化, 这就是浅拷贝(拿人手短)。如果修改了A ,B没有变化 这是深拷贝(自食其力)

1、基本数据类型 number string boolean null undefined symbol

     基本数据类型 名值存储在栈内存中,当b=a   直接在栈内存中开辟内存

2、引用类型 名存储在栈内存,值存储在堆内存中,栈内存开辟个地址指向堆内存的值。

     当b=a  b和a的栈内存地址同时指向 堆内存的同一个值 

     如深拷贝b=a  b和a指向堆内存中不同的值 修改任何一个对另一个没有影响。

简单是实现一个深拷贝

function deepClone(obj){
    let objClone = Array.isArray(obj)?[]:{};
    if(obj && typeof obj==="object"){
        for(key in obj){
            if(obj.hasOwnProperty(key)){
                //判断ojb子元素是否为对象,如果是,递归复制
                if(obj[key]&&typeof obj[key] ==="object"){
                    objClone[key] = deepClone(obj[key]);
                }else{
                    //如果不是,简单复制
                    objClone[key] = obj[key];
                }
            }
        }
    }
    return objClone;
}    
let a=[1,2,3,4],
    b=deepClone(a);
a[0]=2;
console.log(a,b);

期中需要注意concat方法与slice 对于对象只有一级层级的 是深拷贝 但 如果对象多于一级层级 是浅拷贝

出了递归还可以借助 JSON.stringfy 和 JSON.parse  来实现深拷贝

function deepClone(obj){
    let _obj = JSON.stringify(obj),
        objClone = JSON.parse(_obj);
    return objClone
}    
let a=[0,1,[2,3],4],
    b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);

原理 先将对象转换成字符串 然后再转换回来

 

posted on 2020-12-01 10:51  小武爷  阅读(116)  评论(0编辑  收藏  举报