如何在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
相关产品推荐
相关产品推荐

