Javascript for循环无法迭代错误对象属性

Javascript for循环无法迭代错误对象属性,javascript,Javascript,我经常使用for循环来迭代JavaScript对象,直到今天才发现问题。 当我试图知道一个错误对象有什么属性时,我感到很惊讶 var e= new Error("testing"); for(var key in e) console.log(e[key]); 我什么都没有,没有输出。 当然,下面的代码 console.log(e.name); console.log(e.message); 给出预期输出: "Error" "testing" 我不知道发生了什么事。我试着四处搜索,但

我经常使用for循环来迭代JavaScript对象,直到今天才发现问题。 当我试图知道一个错误对象有什么属性时,我感到很惊讶

var e= new Error("testing");

for(var key in e)
  console.log(e[key]);
我什么都没有,没有输出。 当然,下面的代码

console.log(e.name);
console.log(e.message);
给出预期输出:

"Error"
"testing"

我不知道发生了什么事。我试着四处搜索,但还没有找到答案。有人能给我一个解释吗?

JavaScript属性可以是可枚举的,也可以是不可枚举的。对于in循环和大多数其他从对象获取属性名称的方法,不可枚举属性被排除在
之外

您可以通过获取对象自己的属性名,包括不可枚举的属性名。例如:

Object.getOwnPropertyNames(e).forEach(function(name) {
    console.log(e[name]);
});
或使用ES2015+:

for (const name of Object.getOwnPropertyNames(e)) {
    console.log(e[name]);
}
请注意,“own”表示它不包括继承的属性,这取决于代码运行在哪个JavaScript引擎上。要获取对象的所有字符串命名属性(忽略符号命名属性),您需要一个查看原型的循环。当您到达
Object.prototype
时,可能需要停止。因此:

var obj = e;
while (obj !== Object.prototype) {
    Object.getOwnPropertyNames(obj).forEach(name => console.log(obj[name]));
    obj = Object.getPrototypeOf(obj);
}

From MDN:for…in循环仅迭代可枚举的非符号属性。从内置构造函数(如Array和Object)创建的对象继承了Object.prototype和String.prototype的不可枚举属性