通过for...in理解可枚举属性

  1. 可枚举属性是指那些内部 “可枚举” 标志设置为 true 的属性,对于通过直接的赋值和属性初始化的属性,该标识值默认为即为 true
  2. 对于通过 Object.defineProperty 等定义的属性,该标识值默认为 false。
  3. 可枚举的属性可以通过 for...in 循环进行遍历(除非该属性名是一个 Symbol)。属性的所有权是通过判断该属性是否直接属于某个对象决定的,而不是通过原型链继承的。
  4. 继承属性如果是可枚举属性也能被迭代出来
  5. 原型属性原则上是不可枚举的

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() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性

你可能感兴趣的:(通过for...in理解可枚举属性)