Una propiedad enumerable es aquella que se puede incluir y visitar durante los for..inbucles (o una iteración similar de propiedades, como Object.keys()).
Si una propiedad no se identifica como enumerable, el bucle ignorará que está dentro del objeto.
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"
Una propiedad se identifica como enumerable o no por su propio [[Enumerable]]atributo . Puede ver esto como parte del descriptor de la propiedad :
var descriptor = Object.getOwnPropertyDescriptor({ bar: 1 }, 'bar');
console.log(descriptor.enumerable); // true
console.log(descriptor.value); // 1
console.log(descriptor);
// { value: 1, writable: true, enumerable: true, configurable: true }
for..inLuego, un bucle itera a través de los nombres de propiedad del objeto.
var foo = { bar: 1, baz: 2};
for (var prop in foo)
console.log(prop); // outputs 'bar' and 'baz'
Pero, solo evalúa su declaración, console.log(prop);en este caso, para aquellas propiedades cuyo [[Enumerable]]atributo es true.
Esta condición está en su lugar porque los objetos tienen muchas más propiedades , especialmente de herencia :
console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]
Cada una de estas propiedades todavía existe en el objeto :
console.log('constructor' in foo); // true
console.log('toString' in foo); // true
// etc.
Pero, se saltan por el for..inciclo porque no son enumerables.
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(descriptor.enumerable); // false
for-inhace?