八股文不用背-深拷贝

87 阅读1分钟

主要需要解决的问题:

  • 输入:基本数据类型、对象、函数
  • 循环引用问题:a引用了b,b引用了c,c引用了a,那c.a还需要深拷贝吗
  • 缓存什么时候清空问题:缓存优化
var deepClone = function(obj,cache = []){
    // obj是各种类型的数据
    // 如果是基础数据类型/函数,就返回
    if(typeof obj !== 'object' && obj !== null) return obj
    // 如果obj是遍历过的引用,则返回引用
    if(cache.includes(obj)) return obj
    else cache.push(obj)
    // 如果是数组,就初始化为数组,否则为对象
    let cloneObj = Array.isArray(obj) ? [] : {}
    for (const key in obj) {
        if (Object.hasOwnProperty.call(obj, key)) {
            const el = obj[key];
            switch(Object.prototype.toString().call(obj)){
                case '[Object object]':
                    cloneObj[key] = deepClone(el,cache)
                    break;
                case '[Array array]':
                    cloneObj[key] = el.map(item=>deepClone(item,cache)) || []
                    break;
                default :
                    cloneObj[key] = el
            }
        }
    }
}