深浅拷贝

158 阅读1分钟

浅拷贝

方法一 Object.assign() let b = Object.assign({}, a)

方法二 扩展运算符 let b = {...a}

深拷贝

方法一 JSON.parse(JSON.stringify()) let b = JSON.parse(JSON.stringify(a))

优点:可以实现二级以上对象的拷贝;

缺点:函数、正则、undefined都无法拷贝;

方法二 递归

  let a = {
    name: "Jake",
    flag: {
        title: "better day by day",
        time: "2020-05-31"
    },
    fn () {
      console.log(2)
    },
    unde: undefined,
    reg: /\d/
  }
  
  function deepClone (origin) {
    if (typeof origin !== 'object' || origin == null) {
      return origin
    }
    if (origin instanceof Date) {
      return new Date(origin)
    }
    if (origin instanceof RegExp) {
      return new RegExp(origin)
    }
    // region
    // region-endRegion等同于 let result = new origin.constructor()
    let result;
    if (origin instanceof Array) { // 等同于Object.prototype.toString.call(origin) === '[object Array]'
      result = []
    } else {
      result = {}
    }
    // endRegion
    for (let key in origin) {
      if (origin.hasOwnProperty(key)) {
        result[key] = deepClone(origin[key])
      }
    }
    return result
  }
  let b = deepClone(a)
  b.name = 'gq'
  b.flag.title = 'title'
  console.log('b', b)
  console.log('a', a)