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方法只能保证第一层不受影响,第二层开始就会受影响,所以并不是深度拷贝。