我经常使用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周围搜索,但尚未找到答案。有人可以给我一个解释吗?
答案 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的不可枚举的属性。