【问题标题】:Why console.log(window) works but JSON.stringify(window) doesn't work, and how can I beat that?为什么 console.log(window) 有效,但 JSON.stringify(window) 无效,我该如何解决?
【发布时间】:2014-02-28 15:22:31
【问题描述】:

如果我输入控制台:

 console.log(window)

我使用展开按钮获取window 中的所有对象。

但如果我尝试同样的方法:

JSON.stringify(window) 

我进入 Firefox:

Error: Permission denied to access property 'toJSON'

在 chrome 中:

TypeError: Converting circular structure to JSON

这是发生这种情况的唯一情况吗?鉴于console.log()JSON.stringify() 的工作方式不同,我是否可以访问并仍然对console.log() 设法显示的对象进行字符串化?

【问题讨论】:

  • 只有一部分可能的 JavaScript 对象可以序列化为 JSON。 DOM 节点不是原生 JavaScript 对象。
  • var x = {}; x.x = x; JSON.stringify(x)
  • @SLaks console.log(x) 有效,但您可以在 x 中多次扩展 x 以尝试查看它是否结束。

标签: javascript json console.log


【解决方案1】:

那是因为window有循环引用(比如window.self大部分情况下引用window)然后就不能转成JSON,否则会变成死循环。

这可能发生在任何对象上,不仅仅是window

var foo = {
    bar: 'bar'
};
JSON.stringify(foo);    // works fine

var foo = {
    bar: foo
};
JSON.stringify(foo);    // circular reference -> crashes

【讨论】:

  • var foo = { bar: foo }; JSON.stringify(foo); 在 Chrome 中不会崩溃。
  • 这是因为 Chrome 添加了一项功能,以避免 JSON 对象在字符串化过程中出现循环引用。
猜你喜欢
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 2018-06-15
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
相关资源
最近更新 更多