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

时间:2018-08-03 17:11:23

标签: javascript

我经常使用for循环来迭代JavaScript对象,直到今天才发现问题。 当我尝试了解Error对象具有哪些属性时,这真让我感到惊讶。

var e= new Error("testing");

for(var key in e)
  console.log(e[key]);

我什么也没有,不是输出。 但是,当然,以下代码

console.log(e.name);
console.log(e.message);

提供预期的输出:

"Error"
"testing"

我不确定发生了什么。我尝试在Google周围搜索,但尚未找到答案。有人可以给我一个解释吗?

2 个答案:

答案 0 :(得分:5)

JavaScript属性可以可枚举不可枚举。不可枚举的属性被排除在for-in循环和大多数其他从对象中获取属性名称的方式之外。

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

Object.getOwnPropertyNames(e).forEach(function(name) {
    console.log(e[name]);
});

或ES2015 +:

for (const name of Object.getOwnPropertyNames(e)) {
    console.log(e[name]);
}

请注意,“拥有”表示它不包含继承的属性,message可能取决于也可能不取决于代码运行的JavaScript引擎。要所有获取对象的字符串名称属性(忽略符号名称属性),需要循环查看原型。您可能想在到达Object.prototype时停下来。所以:

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

答案 1 :(得分:0)

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