深拷贝/浅拷贝

63 阅读1分钟

遍历对象 for(const prop in obj) for in 也可遍历数组,那么它的arr[prop]就是他的索引 1.判断是不是原始值 typeof obj--》引用值 2.判断是数组还是对象 (1)instance of --》a的原型链上是否有b的原型 (2)toString--》推荐使用 (3)constructor 3.建立相应的数组 对象 递归

function deepClone(origin,target){
  let target = target || {} //有的话就用自己的,没有就用空对象
     toStr = Object.prototype.toString
     arrStr = "[object Array]"  //用来做比对
  for (const prop in origin){
     //for in 之前,加一层判断,判断是否是原型上的属性,是true再继续往下走hasOwnProperty避免拿它原型链上的属性。
     if(orgin.hasOwnProperty(prop)){
       //1.判断是否是原始值
       if(origin[prop]!=null && typeof(origin[prop]=='object')){
         //引用值
        //2.判断是数组还是对象
          if(toStr.call(origin[prop])==arrStr){
             target[prop] = []
          }else {
             target[prop] = {}
          }
        
          deepClone(origin[prop],target[prop]) //递归
          
        }else{
         //原始值--》直接复制
          target[prop] = origin[prop]
        }
     }
  }
  //如果没传target 就要把target return出去
  return target 
}

深拷贝 对原始值没有影响