Una propiedad enumerable es aquella que se puede incluir y visitar durante los for..in
bucles (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..in
Luego, 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..in
ciclo porque no son enumerables.
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(descriptor.enumerable); // false
for-in
hace?