一个对象的可枚举属性会在for...in中被访问到 (或是类似的迭代方法, Object.keys()

 

如果一个属性不是可枚举的,循环会忽略这个属性

var obj = { key: 'val' };

console.log('toString' in obj); // true
console.log(typeof obj.toString); // "function"

for (var key in obj)
    console.log(key); // "key"

 

 

可枚举属性很重要,因为对象有很多属性,尤其是继承来的:

console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]

 

 

这些属性都存在于object上:

console.log('constructor' in foo); // true
console.log('toString' in foo);    // true
// etc.

 

 

但是他们会在for...in中被跳过 因为他们不是可枚举的

var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');

console.log(descriptor.enumerable); // false