js循环引用问题

var b = {
    
}
var a = {
    b: b
}
b.a = a
JSON.stringify(b) // 当不执行这条的时候,能正常打印出b,但是stringify不行,请问为何?如何能够正常打印出该b值?

请教各位!

问题补充:
是同事出的考题,他在node开发时遇到的问题:
要打印一些 某个库的内置对象,但是展开太大了,然后 用 stringify,然后就报这些错。需要的是这种场景的处理方案。

阅读 6.3k
6 个回答

有一个方法是直接去除对象中涉及到循环引用的属性, 有一个json拓展包替我们做了这一步工作, 直接使用就可以了, 链接如下:
https://github.com/douglascro...
JSON.decycle 去除循环引用
JSON.retrocycle 还原

    var b = {
}
var a = {
    b: b
}
b.a = a
var c=JSON.decycle(b)
console.log(JSON.stringify(c))
console.log(JSON.retrocycle(c))

结果:

{"a":{"b":{"$ref":"$"}}}

肯定要报错,你一直在互相引用,对象无止境的赋值。你试着看看b是什么,就知道为何会报错了。

JSON.stringify 本身就不支持循环引用。

对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。

图片描述

看这个图能明白了么?

stringify 要输出整个对象的 JSON 字符串
因为循环引用,所以根本就结束不了

var b = {
    
}
var a = {
    b: b,
    toJSON() {
        // 自定义返回值
        return {}
    }
}
b.a = a
JSON.stringify(b) // => {"a":{}}

这个算吗

循环引用下来的字符串无限长,你怎么stringify,直接console.log

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题