浅拷贝
浅拷贝只能拷贝一层对象
// 浅拷贝只能拷贝一层对象
function shallowCopy(params){
if(!params || typeof params !== 'object'){
return params;
}
let newObject = Array.isArray(params) ? [] : {};
for(let key in params){
if(params.hasOwnProperty(key)){
newObject[key] = params[key];
}
}
return newObject;
}
深拷贝
// 深拷贝解决循环引用爆栈的问题
function deepClone(source, map = new Map()){
// 为空
if(source == null) return source;
// 为日期类型
if(source instanceof Date) return new Date(source);
// 为Reg类型
if(source instanceof RegExp) return new RegExp(source);
// 如果是函数的话也不需要深拷贝
if(typeof source !== 'object') return source;
if(map.has(source)) return map.get(source);
let newObj = Array.isArray(source) ? []: {};
map.set(source, newObj);
for(let key in source){
if(source.hasOwnProperty(key)){
newObj[key] = deepClone(source[key], map);
}
}
return newObj;
}
const obj1 = {
name: 123,
num: 111,
arr: [1, 2, 3],
child: {
arr: [1,2,3,4]
},
next: 'obj1',
}
obj1.next = obj1;
const obj2 = deepClone(obj1);
console.log(obj1);
console.log(obj2);
console.log(obj1['child'] === obj2['child']);