概念
浅拷贝 :只复制指向某个对象的指针,而不复制对象本身,相当于是新建了一个对象,该对象复制了原对象的指针,新旧对象还是共用一个内存块
深拷贝:是新建一个一模一样的对象,该对象与原对象不共享内存,修改新对象也不会影响原对象
手写浅拷贝、深拷贝
手写浅拷贝:
// 方法一: 循环
function shallowClone(o){
let obj = {};
for(let i in o){
if(o.hasOwnProperty(i)){
obj[i] = o[i];
}
}
return obj;
}
// 方法二: 解构...
var shallowObj2 = { ...o };
// 方法三: Object.assign()
var shallowObj3 = Object.assign({}, o);
手写深拷贝:
// 方法一:
// hash = new Map(): 碰到循环引用问题var a = {}; a.a = a; clone(a);会造成一个死循环
function deepClone(o, hash = new Map()){
if (hash.has(o)) return hash.get(o);
var newObj = null;
if(typeof o === 'object' && o !== null){
newObj = Array.isArray(o) ? []:{};
hash.set(o, newObj);
for(let i in o){
newObj[i] = deepClone(o[i], hash);
}
} else {
newObj = o;
}
return newObj;
}
// 方法二: JSON.stringify()、JSON.parse
function cloneJson(o) {
return JSON.parse(JSON.stringify(o))
}