Uma propriedade enumerável é aquela que pode ser incluída e visitada durante for..in
loops (ou uma iteração semelhante de propriedades, como Object.keys()
).
Se uma propriedade não for identificada como enumerável, o loop ignorará que está dentro do 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"
Uma propriedade é identificada como enumerável ou não por seu próprio [[Enumerable]]
atributo . Você pode visualizar isso como parte do descritor da propriedade :
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 }
Um for..in
loop itera pelos nomes das propriedades do objeto.
var foo = { bar: 1, baz: 2};
for (var prop in foo)
console.log(prop); // outputs 'bar' and 'baz'
Mas, apenas avalia sua declaração - console.log(prop);
nesse caso - para aquelas propriedades cujo [[Enumerable]]
atributo é true
.
Essa condição está em vigor porque os objetos têm muito mais propriedades , especialmente de herança :
console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]
Cada uma dessas propriedades ainda existe no objeto :
console.log('constructor' in foo); // true
console.log('toString' in foo); // true
// etc.
Mas, eles são ignorados pelo for..in
loop porque não são enumeráveis.
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(descriptor.enumerable); // false
for-in
faz?