手写一个深拷贝

// 可遍历对象
// 如果想处理其他的可遍历对象,比如函数的 arguments,可加入此数组,便于维护
const iterations = [
  '[object Object]',
  '[object Array]',
  '[object Map]',
  '[object Set]',
]

function deepClone(source, map = new WeakMap()) {
  // 处理 null
  if (source === null) return source

  // 获取对象类型
  const type = Object.prototype.toString.call(source)

  // 处理不可遍历对象
  if (!iterations.includes(type)) {
    // 处理日期
    if (type === '[object Date]') return new Date(source)

    // 处理正则
    if (type === '[object RegExp]') return new RegExp(source)

    // 处理 Symbol
    if (type === '[object Symbol]') return Symbol(source.description)

    // 其他未处理的类型,一般是原始类型或函数,直接返回
    return source
  }

  // 处理可遍历对象
  // 创建 target 实例
  let target = new source.constructor() // {} | [] | Map(0) | Set(0)

  // 处理循环引用,防止死循环
  if (map.get(source)) {
    return source // 如果已经处理过,则直接返回,不再遍历
  } else {
    map.set(source, target)
  }

  // 处理 Map
  if (type === '[object Map]') {
    source.forEach((value, key) => {
      target.set(key, deepClone(value))
    })
    return target
  }

  // 处理 Set
  if (type === '[object Set]') {
    source.forEach(value => {
      target.add(deepClone(value))
    })
    return target
  }

  // 处理对象和数组
  for (const key in source) {
    target[key] = deepClone(source[key])
  }
  return target
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值