深拷贝
方案一 :
var deepCopy = function(obj) {
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj == 'object'){
// 方案一
//const keys = Object.keys(obj );
//keys.map((key)=>{
// 相关操作
//});
//方案二
for( var i in obj){//所有可枚举的属性
if(obj.hasOwnProperty(key)){//存在于实例上
if(obj[key] && typeof obj[key] == 'object'){
objClone[key] = deepCopy(obj[key])
}else{
objClone[key] = obj[key];
}
}
}
}
}
方案二:
用JSON.stringify转为字符串 再用JSON.parse把字符串再转为新的对象
注: RegExp对象,无法通过此方式深拷贝
浅拷贝
Es6的object.assign() 扩展运算符都是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身
所以只能实现一层基本类型属性的拷贝
当obj1中属性是引用类型时,就会发现,修改其中一个属性值,另一个值也发生变化。
如下所示:
let obj1 = {a: 1, b: { c: 2}}
let obj2 = Object.assign({},obj1) // 或者 obj2 = {...obj1}
obj2.b.c = 4
console.log(obj1) //{ a: 1, b: { c: 4 } }