为什么 Json 的 Stringify 输出打印与 console.log 输出不同?
Why does Json's Stringify output print differently from console.log output?
对于下面的代码:
const testStringify = () => {
try{
console.log('Inside testStringify');
const a = "";
a.b.c;
} catch(err) {
console.log('Inside catch of testStringify');
console.log(`Error: ${JSON.stringify(err)}`);
console.log(err);
}
}
testStringify();
输出为:
Inside testStringify
Inside catch of testStringify
Error: {}
TypeError: Cannot read property 'c' of undefined
at testStringify
at Object.<anonymous>
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
at startup (bootstrap_node.js:188:16)
at bootstrap_node.js:609:3
为什么 Json.stringify(err)(错误:{})不以与 console.log(err) 相同的方式或某种有意义的方式打印输出?
JSON.stringify
仅迭代自己的和可枚举的属性。
const obj = Object.create({ onProto: 'onProto' });
Object.defineProperty(obj, 'notEnumerable', { value: 'notEnumerable' });
obj.ownAndEnumerable = 'ownAndEnumerable';
console.log(JSON.stringify(obj));
在某些浏览器中,Error 对象的 .message
属性 不是自己的可枚举 属性,因此不会被迭代。
例如,在Chrome中,属性是自己的但不可枚举:
const e = new Error('msg');
console.log(Object.getOwnPropertyDescriptor(e, 'message'));
另一方面,console.log(err)
将在交互式控制台中显示 完整对象 。
对于下面的代码:
const testStringify = () => {
try{
console.log('Inside testStringify');
const a = "";
a.b.c;
} catch(err) {
console.log('Inside catch of testStringify');
console.log(`Error: ${JSON.stringify(err)}`);
console.log(err);
}
}
testStringify();
输出为:
Inside testStringify
Inside catch of testStringify
Error: {}
TypeError: Cannot read property 'c' of undefined
at testStringify
at Object.<anonymous>
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
at startup (bootstrap_node.js:188:16)
at bootstrap_node.js:609:3
为什么 Json.stringify(err)(错误:{})不以与 console.log(err) 相同的方式或某种有意义的方式打印输出?
JSON.stringify
仅迭代自己的和可枚举的属性。
const obj = Object.create({ onProto: 'onProto' });
Object.defineProperty(obj, 'notEnumerable', { value: 'notEnumerable' });
obj.ownAndEnumerable = 'ownAndEnumerable';
console.log(JSON.stringify(obj));
在某些浏览器中,Error 对象的 .message
属性 不是自己的可枚举 属性,因此不会被迭代。
例如,在Chrome中,属性是自己的但不可枚举:
const e = new Error('msg');
console.log(Object.getOwnPropertyDescriptor(e, 'message'));
console.log(err)
将在交互式控制台中显示 完整对象 。