写一个深度克隆函数

502 阅读1分钟

const deepCopy=(obj)=>{
//如果被克隆的是简单数据对象,没必要进行深度克隆
  if(typeof obj!=='object'){
    return;
  }
//判断被克隆的是对象还是数组
  let newObj=obj instanceof Array?[]:{};
//对每一个属性进行判断
  for (let key in obj){
//只对自身的属性进行赋值
    if(obj.hasOwnProperty(key)){
//如果该属性值也是对象,递归调用深度克隆方法
      newObj[key]=typeof obj[key]==="object"?deepCopy(obj[key]):obj[key];
    }
  }
  return newObj;
}
let a={
  name:"123",
  value:123
};
let b=deepCopy(a)
console.log(b);

这种实现方式还存在很多问题:这种方式只能实现特定的object的深度复制(比如对象、数组和函数),不能实现null以及包装对象Number,String ,Boolean,以及Date对象,RegExp对象的复制。