跳转到内容

检查对象是否包含循环引用

ts
/**
 * 检查对象是否包含循环引用
 */
export function hasCircularReference(obj: object) {
  const seen = new WeakSet()

  function detect(obj: object) {
    if (typeof obj === 'object' && obj !== null) {
      if (seen.has(obj)) {
        return true
      }
      seen.add(obj)
      const values = Object.values(obj)
      for (let i = 0; i < values.length; i++) {
        if (detect(values[i])) return true
      }
    }
    return false
  }

  return detect(obj)
}