fe-notes icon indicating copy to clipboard operation
fe-notes copied to clipboard

实现一个比较详细的深拷贝

Open Inchill opened this issue 3 years ago • 0 comments

function deepClone (origin = {}, target = {}, map = new WeakMap()) {
  if (typeof origin !== 'object') return origin
  if (origin === null) return null
  if (origin instanceof RegExp) return new RegExp(origin)
  if (origin instanceof Date) return new Date(origin)
  if (origin instanceof Set) {
    let _set = new Set()
    origin.forEach(item => _set.add(item))
    return _set
  }
  if (origin instanceof Map) {
    let _map = new Map()
    origin.forEach((val, key) => _map.set(key, val))
    return _map
  }

  if (map.has(origin)) return map.get(origin)
  map.set(origin, target)

  for (const key in origin) {
    if (origin.hasOwnProperty(key)) {
      if (typeof origin[key] !== 'object') {
        target[key] = origin[key]
      } else {
        target[key] = Array.isArray(origin[key]) ? [] : {}
        target[key] = deepClone(origin[key], target[key], map)
      }
    }
  }

  return target
}

let set = new Set()
set.add(4).add(5).add(6)

let map = new Map()
map.set('name', 'chuck').set('gender', 'male')

let obj = {
  a: 1,
  b: {
    c: '2',
    d: [1, 2, 3]
  },
  reg: new RegExp('reg'),
  date: new Date('2022/9/27'),
  set,
  map,
  getName: () => {
    return 'chuck'
  },
  undef: undefined,
  empty: null,
  symbol: Symbol('symbol')
}

let obj2 = {
  a: 2,
  next: obj
}

obj.next = obj2
let obj3 = Object.create(obj)
obj3.a = 1

console.log('deepClone', deepClone(obj))
Screen Shot 2022-09-27 at 20 22 59

Inchill avatar Sep 27 '22 12:09 Inchill