浅拷贝:只能拷贝一层 & 对于基本类型是值拷贝,对于引用类型是引用拷贝
深拷贝:可以拷贝多层 & 对于引用类型可以赋值值
浅拷贝方法:
1、
for(var attr in a ){
b[attr] = a[attr]
}
}
2、只用于对象
Object.assign()
也可以用于对象的合并,对于相同属性,会将原值覆盖
深拷贝方法:
1、通用,递归方法
function deepCopy(a,b){ //a:source b:target
for(var attr in a){
var item = a[attr]; //取出被拷贝对象的属性数据,进行判断是否是引用数据进行拷贝
if(item instanceof Array){
b[attr] = [];//这个空数组 就是我们暂存数据的地方,开辟新堆存数据,实现深拷贝
deepCopy(item,b[attr]);
}else if(item instanceof Obejct){
b[attr] = {};
deepCopy(item,b[attr])
}else{
b[attr] = item;
}
}
}
2、json.parse(json.stringify(obj))
缺点:对于以下情况会失效
(1)如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式。而不是时间对象
(2)如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象
(3)如果obj里有函数,undefined,则序列化的结果会把函数或 undefined丢失
(4)如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null
(5)如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor;
(6)如果对象中存在循环引用的情况也无法正确实现深拷贝;
参考:
1、深拷贝、浅拷贝方法:https://zhuanlan.zhihu.com/p/490911572
2、json.parse(json.stringify)缺点:https://blog.csdn.net/Amnesiac666/article/details/122412248