对象clone的方法

193 阅读1分钟

浅克隆

浅克隆:如果对象的第一级属性中又包含引 用类型,则只复制地址

  • 浅克隆的问题:如果对象中又包含引用类型的属性值,则导致克隆后,新旧对象依然共用同一个引用类型的对象属性值。
  • 结果: 任意一方修改了引用类型的对象内容,都会导致另一方同时受影响。 浅拷贝方法:Object.assign(target, source), 遍历赋值等

深克隆

深克隆:不但复制对象的第一级属性值,而且,即使对象中又包含引用类型的属性值,深克隆也会继续复制内嵌类型的属性值。

  • 结果: 克隆后,两个对象彻底再无瓜葛。

1, JSON.stringify()以及JSON.parse(),无法深克隆undefined值和内嵌函数

const source = {
    name: 'xhh',
    name: 16
  }
const target = JSON.parse(JSON.stringify(source))

2, 自定义递归克隆函数

function deepClone_ (source) {
    let target
    if (typeof source === 'object') {
      if (source === null) {
        target = source
        //数组的处理
      } else if (Array.isArray(source)) {
        target = []
        for (let i of source) {
          target[i] = source[i]
        }
        //正则表达式的处理
      } else if (Object.prototype.toString.call(source) === '[object RegExp]') {
        target = source
      } else {
      //普通对象的处理
        target = {}
        for (let i in source) {
          target[i] = source[i]
        }
      }
    } else {
    // 基本数据类型的处理
      target = source
    }
    return obj
  }