为什么我看不到Error对象的键?

我很困惑的事实是,当我创build一个新的错误对象,我可以看到它的消息或名称,但我不能看到它的关键列表使用标准的方式。 这是为什么?

> err = new Error("an error") [Error: an error] > err.message 'an error' > err.name 'Error' > Object.keys(err) [] > JSON.stringify(err) '{}' 

JavaScript属性可能是不可枚举的 ,这意味着它们不会出现在for..in循环或Object.keys结果中。

您可以使用Object.getOwnPropertyNames直接在对象上获取所有属性(可枚举或不可枚举)。 我说“直接”,因为正常的枚举查找对象的原型链获得父原型可​​枚举的属性,而getOwnPropertyNames不。

因此, Object.getOwnPropertyNames(err)只显示

 ['stack', 'arguments', 'type', 'message'] 

name属性是Error.prototype一个不可枚举的属性,不会直接在Error实例上设置。 (原型回顾:当您尝试访问err.name ,查找err会变成什么都没有,所以解释器查看Error.prototype ,它具有name属性。)