JSON.stringify返回{},即使使用替换器也是如此

时间:2019-07-18 04:05:39

标签: javascript json

我的代码(fiddle)是:

let count = 0;
replacer = (k, v) => {
  console.log(`count: ${count++}`);
  if (v === undefined)
    return null;
  else
    return v;
}

try {
  const x = y;
} catch (err) {
  console.log(err);
  console.log("=====");
  console.log(`typeof err is ${typeof err}`);
  console.log(JSON.stringify(err));
  console.log("-----");
  console.log(JSON.stringify(err, replacer));
}

输出为:

ReferenceError: y is not defined
    at window.onload ((index):42)
=====
typeof err is object
{}
-----
count: 0
{}

err真的是{}吗?如果没有,如何获取它的JSON字符串表示形式?

3 个答案:

答案 0 :(得分:1)

error 实例的属性似乎是从 Error.prototype 继承的,而不是自己的属性,请参见ECMA-262 §19.5.4

Safari对实例本身具有附加属性( line sourceURL ),但是 name 消息在原型上。

您可以使用自己的函数将其转换为JSON,例如

// Create plain object, copy error name and message properties.
// Copy own properties of error instance, then JSON.stringify it
function errToJSON(err) {
  let props = Object.assign({name:err.name, message:err.message}, err);
  return JSON.stringify(props);
}

try {
  var x = y;
} catch (e) {
  console.log('JSON.stringify(e):\n' + JSON.stringify(e));
  console.log('errToJSON(e):\n' + errToJSON(e));
  console.log('e.toString():\n' + e.toString());
}

答案 1 :(得分:0)

在这种情况下,err没有任何自己的可枚举属性。仅其原型ReferenceError。您可以通过err的继承属性来检查err,如MDN

中所述

答案 2 :(得分:0)

  • 错误实例的属性似乎是从Error.prototype继承的,而不是自己的属性,请参阅ECMA-262§19.5.4。

  • JSON.stringify返回{},因为err对象不是纯对象,所以没有键值配对。因此它将返回{}