为啥 TypeError 上的 JSON.stringify 返回一个空对象 [重复]

Posted

技术标签:

【中文标题】为啥 TypeError 上的 JSON.stringify 返回一个空对象 [重复]【英文标题】:Why does JSON.stringify on TypeError return an empty object [duplicate]为什么 TypeError 上的 JSON.stringify 返回一个空对象 [重复] 【发布时间】:2016-03-21 18:22:09 【问题描述】:

我正在使用节点 4.2,我发现一个错误并在其上使用 JSON.stringify。对于大多数对象,这工作正常。但是当抛出 [TypeError: callback is not a function] 时,它会返回一个空对象。如果我直接 console.log 它,它工作正常。

Mozilla 的页面说:

Boolean、Number 和 String 对象在字符串化过程中被转换为相应的原始值,符合传统的转换语义。

try 
    ...
 catch (err) 
    console.log('error: ' + JSON.stringify(err)) // outputs 

【问题讨论】:

我认为字符串化一个空对象应该可以工作? 你为什么不直接登录,或者像console.log('error : ', err) console.log(JSON.stringify(TypeError, null, 2)) 给我未定义 你为什么要对错误进行字符串化?只需像@adeneo 建议的那样直接记录即可。 恕我直言,this is 最佳答案,如何对 Error 对象进行字符串化。 【参考方案1】:

当您在 TypeError 上使用 stringify 时,您正在对没有 enumerable 属性的对象进行字符串化。

如果你这样做了

var typeError = new TypeError("hey")
for(var prop in typeError) 
  console.log(prop) // this does not run

当您使用console.log 登录时,您使用的是valueOf,所以

var typeError = new TypeError("hey")
typeError.valueOf()  // TypeError: hey(…)

另外,错误知道如何将自己变成一个字符串,所以这也可以:

var typeError = new TypeError("hey")
typeError.toString() // "TypeError: hey"

如果您想记录使用普通日志看不到的对象的属性,您可以console.dir 该对象。

当您在typeError 上执行此操作时,您会看到它有一个message 属性:

【讨论】:

以上是关于为啥 TypeError 上的 JSON.stringify 返回一个空对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

我的网站上的 Discord 登录无效。为啥?

TypeError: this.props.sendKitchen 不是一个函数……为啥?

为啥我得到:TypeError:channel.updateOverwrite 不是函数

为啥我得到 TypeError('Router.use()

为啥我会收到这个 TypeError?

Django:“TypeError:[] 不是 JSON 可序列化的”为啥?