为何console.log输出Error对象时显示错误信息而非键值对与方法?
当使用console.log输出普通对象时,控制台会展示它的所有键值对及方法,示例代码如下:
const obj = { name: "Mike", add : function (a, b){ return a + b } } console.log(obj)
但在try...catch块中用console.log输出Error对象时,控制台仅显示格式化的错误信息(比如ReferenceError: variable is not defined),示例代码如下:
try { variable } catch(err) { console.log(err) }
请问为何会出现这种差异,即Error对象输出的是错误信息而非其键值对与方法?
原因解析
1. Error原型的自定义toString()方法
Error对象的原型上重写了toString()方法,默认会返回${this.name}: ${this.message}格式的字符串。而console.log在输出对象时,如果该对象有自定义的toString()实现,会优先调用这个方法并输出结果,而非直接展示对象结构。
普通对象继承自Object.prototype,它的默认toString()只会返回[object Object],所以控制台会选择展示对象的完整键值对结构。
2. 控制台对Error类型的特殊优化
浏览器和Node.js的控制台都对Error对象做了专门处理:它们默认只展示开发者最关心的错误消息,同时会把完整的Error对象属性(比如stack、name、message以及其他自定义属性)折叠起来,点击错误条目就能展开查看全部内容。
3. Error属性的枚举特性差异
Error对象的部分核心属性(比如stack)是不可枚举的,而console.log默认只显示对象的可枚举属性。如果要查看Error的所有属性(包括不可枚举的),可以使用console.dir(err),它会强制展示对象的完整结构。
查看完整Error对象的方法
方法1:使用console.dir()
try { variable } catch(err) { console.dir(err); // 展示Error对象的完整键值对与属性 }
方法2:手动序列化所有属性
如果需要用console.log输出完整结构,可以通过Object.getOwnPropertyNames()获取所有属性(包括不可枚举的)再序列化:
try { variable } catch(err) { console.log(JSON.stringify(err, Object.getOwnPropertyNames(err), 2)); }
内容的提问来源于stack exchange,提问作者JethroT

