方法1: JSON暴力转换
可以看到,say方法和age没有了,birthday变成了字符串
该方法会忽略掉方法和undefined还有Symbol也会被忽略,只适用于不存在这些属性的对象
方法2:扩展运算符
方法,undefined,Symbol和日期没有问题,但是更深一层的对象没有被深拷贝,该方法只适用于只有一级属性的对象
方法3: Object.assign()
该方法注意事项及实用场景同上
方法3:老老实实遍历递归拷贝
function deepClone(obj) {
if (typeof obj !== 'object') return obj;
if (obj === null) return obj;
if (obj instanceof RegExp) return obj;
if (obj instanceof Date) return obj;
let newObj = new obj.constructor();
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepClone(obj[key]);
}
}
return newObj;
}
完美解决以上所有问题
这里为什么用 let newObj = new obj.constructor();obj.constructor()无论是数组还是对象都能复制出他的类型,省去做object和array的判断