You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何console.log输出Error对象时显示错误信息而非键值对与方法?

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:00:07