js 深拷贝

102 阅读1分钟
  • 局限性-会忽略如下情况
  • 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
}