深度拷贝与浅拷贝

1、深度拷贝与浅拷贝

假设B复制了A,当修改A时,看是否B会跟着变换,如果B也跟着变了,就是浅拷贝,如果B没变,就是深拷贝。

let a=[0,1,2,3,4],
    b=a;
console.log(a===b);
a[0]=1;
console.log(a,b);

深度拷贝与浅拷贝

此时,b跟着a变化而变了,为浅拷贝

数据类型分为基本数据类型和引用数据类型,深拷贝是针对于引用行数据类型来说的。

深拷贝,是拷贝对象各个层级的属性

2、实现深拷贝的方法:

1)借用json对象的parse和stringify

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);

2)可以借用jquery的extend对象

语法:$.extend( [deep ], target, object1 [, objectN ] )

深度拷贝与浅拷贝

 

let a=[0,1,[2,3],4],
    b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);

3)递归复制所有层级属性(封装一个深度拷贝函数)

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);

4)需要说明的是:

let a=[0,1,[2,3],4],
b=a.slice();
a[0]=1;
a[2][0]=1;
console.log(a,b);
let a=[0,1,[2,3],4],
b=a.concat();
a[0]=1;
a[2][0]=1;
console.log(a,b);

slice和concat方法只能保证第一层不受影响,第二层开始就会受影响,所以并不是深度拷贝。