背景

  • 不考虑内建类构造的对象
  • 解决循环应用问题

思路

  • 使用 Set 保存拷贝过程中遇到的对象
  • 进一步拷贝过程中如果再次出现该对象,则返回该对象(循环引用的特征)

代码实现

  1. function deepClone(source, set = new Set()){
  2. const isPrimitive = deepClone.isPrimitive = deepClone.isPrimitive || (value => Object(value) !== value)
  3. if (isPrimitive(source) || !source) return source
  4. if (set.has(source)) return {...source}
  5. set.add(source)
  6. const target = Array.isArray(source) ? [] : {}
  7. for (const [key, value] of Object.entries(source)) {
  8. if (isPrimitive(value)) target[key] = value
  9. else target[key] = deepClone(value, set)
  10. }
  11. return target
  12. }