- 可枚举属性是指那些内部 “可枚举” 标志设置为 true 的属性,对于通过直接的赋值和属性初始化的属性,该标识值默认为即为 true
- 对于通过 Object.defineProperty 等定义的属性,该标识值默认为 false。
- 可枚举的属性可以通过 for...in 循环进行遍历(除非该属性名是一个 Symbol)。属性的所有权是通过判断该属性是否直接属于某个对象决定的,而不是通过原型链继承的。
- 继承属性如果是可枚举属性也能被迭代出来
- 原型属性原则上是不可枚举的
for...in
for...in语句以任意顺序遍历一个对象的可枚举属性。对于每个不同的属性,语句都会被执行。
如果一个对象的属性不是可枚举属性,那么这个属性就不会被for...in迭代出来,包括继承的可枚举属性
示例一
var obj = {a:1, b:2, c:3};
for (var prop in obj) {
console.log("obj." + prop + " = " + obj[prop]);
}
示例二
如果只迭代自身属性,可使用Object.prototype.hasOwnProperty()过滤,如下:
var triangle = {a: 1, b: 2, c: 3};
function ColoredTriangle() {
this.color = 'red';
}
ColoredTriangle.prototype = triangle;
var obj = new ColoredTriangle();
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
console.log(`obj.${prop} = ${obj[prop]}`);
}
}
// "obj.color = red"
其他
- hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性