You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Javascript中打印输出含自引用的递归对象?

解决方案

方法1:直接打印对象(最便捷)

现代浏览器、Node.js的控制台原生支持展示带循环引用的对象结构,不需要做额外处理,直接执行即可:
console.debug(myObject)
你可以直接在控制台展开查看对象的所有层级属性,循环引用的部分控制台会自动标注。

方法2:实现循环引用清理函数

如果你确实需要通过JSON序列化后打印,可以自己实现移除循环引用的工具函数,有两种实现方式:

直接封装到序列化逻辑中

function stringifyWithoutCircular(obj) {
  const visited = new WeakSet();
  return JSON.stringify(obj, (key, value) => {
    if (typeof value === 'object' && value !== null) {
      if (visited.has(value)) {
        return '[Circular Reference]'
      }
      visited.add(value)
    }
    return value
  })
}

// 调用示例
console.debug(stringifyWithoutCircular(myObject))

单独实现移除循环引用的工具函数(匹配你示例的调用方式)

function removeRecursion(obj, visited = new WeakMap()) {
  // 基础类型直接返回
  if (typeof obj !== 'object' || obj === null) return obj
  // 已访问过的对象说明是循环引用,返回标记
  if (visited.has(obj)) return '[Circular Reference]'
  visited.set(obj, true)
  // 区分数组和普通对象
  const result = Array.isArray(obj) ? [] : {}
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      result[key] = removeRecursion(obj[key], visited)
    }
  }
  return result
}

// 完全匹配你示例的调用写法
console.debug(JSON.stringify(removeRecursion(myObject)))

注:这里使用WeakSet、WeakMap存储已访问对象,不会持有对象的强引用,不会影响正常的垃圾回收。

方法3:Node.js环境可用内置工具

如果你是在Node.js环境下运行,可以直接用内置的util.inspect方法,原生支持处理循环引用:

const util = require('util')
console.debug(util.inspect(myObject))

内容的提问来源于stack exchange,提问作者lilHar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:57:03