如何优化深度克隆 deepclone

普通克隆的方式 

1. 大部分会使用 序列化和反序列化的方式 , 缺点:这种方式不会对对象中的函数或者Map对象进行深度克隆。

const result = JSON.parse(JSON.stringify(value))

 

2. 手写一个deepclone函数 

//创建可回收map集合 来处理环形引用的情况 例如: obj.c = obj
const cache = new WeakMap() 

function deepclone(value){

  //如果不是对象或者null 直接返回
  if(typeof value !== "Object" || value === null){
    return value;
  }

  const cached = cache.get(value)
  if(cached){ 
    return cached 
  }

  //创建一个新的clone对象
  const result = Array.isArray(value) ? [] : {}

  //将原对象的原型设置给新对象
  Object.setPrototypeOf(result, Object.getPrototypeOf(value)); 

  for(const key in value){
    //只对对象下的可枚举属性进行克隆,原型下的属性不做clone
    if(value.hasOwnProperty(key)){
        //递归进行clone操作
        result[key] = deepclone(value[key]);
    }
  }
  
  cache.set(value, result)

  return result
}

 

posted @ 2023-06-15 15:49  10后程序员劝退师  阅读(126)  评论(0编辑  收藏  举报