浅复制与深复制

avatarplhDigital nomad

前言

为什么要写呢?因为今晚点了一杯美式咖啡,晚上肯定睡不着,先挖个坑,12点以后来填。

浅复制

下面代码是浅复制,非常简单,

const a = {
  i: {
    speak: {
      javascript: 'yes'
    }
  }
};
const b = {};
b = a;    // 浅复制,如此简单

深复制

一直对这个概念很困惑,这该不会是谁造出来的概念?运用递归函数思想,for...in...获取所有可枚举属性,那么不可枚举属性又如何? 所谓深复制连最后一层原型指向new Object()也要一起递归复制么?mmp,谁会没事去整一个属性如此复杂的对象。

引用类型和指针类型

正是因为有这两种不同的东西,所以我们才需要针对他们来区分是否直接复制,还是去递归他的子属性,进而复制它的子属性。 针对上述概念,直接写出深复制函数的核心代码。

if((typeof c === Object){
  // 继续去查找他的自属性,直到找到原始类型:Number,String,Boolean,undefined,null,NaN,Symbol
  deepClone(c[key], a[key])
}else{
  // 直接复制
  a = b
}

deepClone()函数 - 完整代码

简单实现深复制,暂时不考虑不可枚举对象以及数组对象

const a = [
  i: {
    am : {
      not: {
        good:'123'
      }
    }
  },
  but:{
    i: {
      do: {
        not: {
          know : {
            why:14
          }
        }
      }
    }
  }
]

const b={};
const deepClone = (a,b) =>{
  Object.keys(a).forEach((i) =>{
    if(typeof a[i] === 'object') {
      if(a[i].constructor === Array){
        b[i] = []
      }else{
        b[i] = {}
      }
      deepClone(a[i], b[i])
    } else {
      a[i] = b[i]
    }
  })
}
deepClone(a,b)