我经常使用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)
我不确定发生了什么.我试过谷歌,但还没有找到答案.有人可以给我一个解释吗?
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)
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |