js 中的深度克隆 clonedeep

450 阅读1分钟
const clonedeep=(val,hash=new WeakMap)=>{
    // 首先判断是不是 null undefined 如果是 直接返回
    val==null && return val;
    // 判断是不是object 如果不是 直接返回
    typeof val !=='object' && return val;
    // 判断是不是正则  如果是 new 一个正则返回去
    val instanceof RegExp && return new RegExp(val);
    // 判断是不是一个Date 如果是  返回一个Date
    val instanceof Date && return new Date(val);
   
    //  创建一个  对象 如果是 val 如果是数组 创建 数组  如果是对象创建对象
    let instance =new val.constructor;
    //先去hash中查看一下是否存在过 ,如果存在就把以前拷贝的返回去
     if(hash.has(val)){ 
        return hash.get(val);
    }
    // 如果没有的就存进去
    hash.set(value,instance);
    // 循环 拷贝
    for(let key in val){
      //判断是不是本身的属性 如果是才复制
        if(val.hasOwnPorperty(key)){
           // 拷贝   递归
            instance[key]=clonedeep(val[key],hash);
        }
    }
    return instance;
    
}