Properti enumerable adalah properti yang dapat dimasukkan dan dikunjungi selama for..in
loop (atau iterasi properti yang serupa, misalnya Object.keys()
).
Jika properti tidak diidentifikasi sebagai enumerable, loop akan mengabaikan bahwa itu ada di dalam objek.
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"
Properti diidentifikasi sebagai enumerable atau bukan oleh [[Enumerable]]
atributnya sendiri . Anda dapat melihat ini sebagai bagian dari deskriptor properti :
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 }
Sebuah for..in
loop kemudian beralih melalui nama properti objek.
var foo = { bar: 1, baz: 2};
for (var prop in foo)
console.log(prop); // outputs 'bar' and 'baz'
Tetapi, hanya mengevaluasi pernyataannya - console.log(prop);
dalam hal ini - untuk properti yang [[Enumerable]]
atributnya adalahtrue
.
Kondisi ini terjadi karena objek memiliki lebih banyak properti , terutama dari warisan :
console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]
Masing-masing dari properti ini masih ada di objek :
console.log('constructor' in foo); // true
console.log('toString' in foo); // true
// etc.
Tapi, mereka dilewati oleh for..in
loop karena mereka tidak terhitung.
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(descriptor.enumerable); // false
for-in
?