错误对象属性不能通过for循环迭代

Hai*_*jin 4 javascript

我经常使用for循环来迭代JavaScript对象,直到今天才发现问题.当我试图知道Error对象具有什么属性时,它让我感到惊讶.

var e= new Error("testing");

for(var key in e)
  console.log(e[key]);
Run Code Online (Sandbox Code Playgroud)

我什么都没有,没有输出.但当然,以下代码

console.log(e.name);
console.log(e.message);
Run Code Online (Sandbox Code Playgroud)

给出预期的输出:

"Error"
"testing"
Run Code Online (Sandbox Code Playgroud)

我不确定发生了什么.我试过谷歌,但还没有找到答案.有人可以给我一个解释吗?

T.J*_*der 8

JavaScript属性可以是可枚举的不可枚举的.不可枚举的属性不包含在for-in循环中以及从对象获取属性名称的大多数其他方法.

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

Object.getOwnPropertyNames(e).forEach(function(name) {
    console.log(e[name]);
});
Run Code Online (Sandbox Code Playgroud)

或者使用ES2015 +:

for (const name of Object.getOwnPropertyNames(e)) {
    console.log(e[name]);
}
Run Code Online (Sandbox Code Playgroud)

请注意,"own"表示它不包含继承的属性,这message可能会也可能不依赖于代码运行的JavaScript引擎.要获取对象的所有字符串命名属性(忽略符号命名的属性),您需要一个查看原型的循环.当你到达时,你可能想停下来Object.prototype.所以:

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