我的代码(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字符串表示形式?
答案 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对象不是纯对象,所以没有键值配对。因此它将返回{}