- 局限性-会忽略如下情况
- undefined
- Function
- Symbol
- 不能解决循环引用的对象
// 深拷贝
function deepClone(obj){
// 判断是否为引用类型
function isObject(o){
return (typeof o === 'object' || typeof o === 'function' && o !=== null)
}
if(!isObject(obj)){
throw new Error('error arguments')
}
let isArray = Array.isArray(obj)
// 先浅复制一遍
let newObj = isArray ? [...obj] : {...obj}
// Reflect.ownKeys 获取对象所有key 包括 Symbol
Reflect.ownKeys(newObj).forEach(key => {
// 判断value 是否为引用类型 => 递归调用
newObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
})
return newObj
}