Una proprietà enumerabile è una proprietà che può essere inclusa e visitata durante i for..in
cicli (o un'iterazione simile di proprietà, come Object.keys()
).
Se una proprietà non è identificata come enumerabile, il ciclo ignorerà che si trova all'interno dell'oggetto.
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 proprietà è identificata come enumerabile o meno dal proprio [[Enumerable]]
attributo . Puoi vederlo come parte del descrittore della proprietà :
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 }
Un for..in
ciclo quindi scorre i nomi delle proprietà dell'oggetto.
var foo = { bar: 1, baz: 2};
for (var prop in foo)
console.log(prop); // outputs 'bar' and 'baz'
Ma valuta solo la sua affermazione - console.log(prop);
in questo caso - per quelle proprietà il cui [[Enumerable]]
attributo è true
.
Questa condizione è presente perché gli oggetti hanno molte più proprietà , in particolare per eredità :
console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]
Ognuna di queste proprietà esiste ancora sull'oggetto :
console.log('constructor' in foo); // true
console.log('toString' in foo); // true
// etc.
Ma vengono ignorati dal for..in
loop perché non sono enumerabili.
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(descriptor.enumerable); // false
for-in
fa?