浅克隆:只复制对象或数组的第一级内容
深克隆:克隆后数组的每一级都和原始数组没有关联
浅克隆
以下几种方式可以实现对象或数组的浅克隆
// 实现对象的浅克隆
Object.assign()
{...obj}
// 实现数组的浅克隆(数组内置大部分方法都是浅克隆)
slice/concat等
深克隆
手写深克隆:
function cloneDeep(obj){
const constructor = obj.constructor;
if(obj===null) return null;
if(typeof obj !== 'object') return obj;
if(/^(RegExp|Date)$/i.test(constructor.name)) return new constructor(obj);
let clone = new constructor();
for(let key in obj){
if(!obj.hasOwnProperty(key)) break;
clone[key] = cloneDeep(obj[key]);
}
return clone;
}
如果使用暴力法把原始数据直接变成字符串,再把字符串变成对象
let newArr = JSON.parse(JSON.stringify(arr));
会出现问题:
- 正则会变成空对象
- 函数直接消失
- 日期变成字符串
- Symbol直接消失
- BigInt报错
- undefined消失