#深拷贝

深拷贝没有完美方案,每一种方案都有它的边界 case

function deepClone(obj) {
  // 如果是 值类型 或 null,则直接return
  if (typeof obj !== 'object' || obj === null) {
    return obj
  }

  // 定义结果对象
  let copy = {}

  // 如果对象是数组,则定义结果数组
  if (obj.constructor === Array) {
    copy = []
  }

  // 上方精简为一行
  let copy = new obj.constructor()

  // 遍历对象的key
  for (let key in obj) {
    // 如果key是对象的自有属性
    if (Object.hasOwn(obj, key)) {
      // 递归调用深拷贝方法
      copy[key] = deepClone(obj[key])
    }
  }

  return copy
}

#为什么使用 Object.hasOwn 替换 Object.prototype.hasOwnProperty.call()

  1. 因为 Object.create(null).hasOwnProperty() 会报错
  2. 对象内置属性 hasOwnProperty 可以改写该方法,被使用 JSON 对象恶意赋值会使网站崩溃