function isObject(value) {
  const valueType = typeof value
  return (value !== null) && (valueType === "object" || valueType === "function")
}

function deepClone(originValue) {
  // instanceof判断某个对象是否为真实的构造函数类型
  // 优化4,判断是否是一个Set类型
  if (originValue instanceof Set) {
    return new Set([...originValue]);
  }

  // 优化5,判断是否是一个Map类型
  if (originValue instanceof Map) {
    return new Map([...originValue]);
  }
  
  // 优化3,判断如果是Symbol的value, 那么创建一个新的Symbol
  if (typeof originValue === "symbol") {
    return Symbol(originValue.description)
  }
  
  // 优化2,判断如果是函数类型, 那么直接使用同一个函数
  if (typeof originValue === "function") {
    return originValue
  }
  
  // 判断传入的originValue是否是一个对象类型
  // 如果不是对象类型,则直接返回,做一个赋值操作,将旧的值赋值给新的对象
  if (!isObject(originValue)) {
    return originValue
  }

  // 优化1,判断传入的对象是数组, 还是对象
  const newObject = Array.isArray(originValue) ? []: {}
  for (const key in originValue) {
    newObject[key] = deepClone(originValue[key])
  }
  // symbol无法当作key被遍历,所以需要另外处理
  // 对Symbol的key进行特殊的处理
  const symbolKeys = Object.getOwnPropertySymbols(originValue);
  for (const sKey of symbolKeys) {
    newObject[sKey] = deepClone(originValue[sKey]);
  }
  return newObject
}

 

posted on 2023-05-15 16:02  皮五辣子  阅读(176)  评论(0编辑  收藏  举报