Numaralandırılabilir bir özellik, for..in
döngülere dahil edilebilen ve ziyaret edilebilen bir mülktür (veya benzer bir mülk yinelemesi gibi Object.keys()
).
Bir özellik numaralandırılabilir olarak tanımlanmazsa, döngü nesnenin içinde olduğunu yoksayar.
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"
Bir mülk, kendi [[Enumerable]]
özelliğiyle numaralandırılabilir veya tanımlanamaz olarak tanımlanır . Bunu mülkün tanımlayıcısının bir parçası olarak görebilirsiniz :
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 }
Bir for..in
döngü daha sonra nesnenin özellik adları üzerinden yinelenir.
var foo = { bar: 1, baz: 2};
for (var prop in foo)
console.log(prop); // outputs 'bar' and 'baz'
Ancak, ifadesini sadece - console.log(prop);
bu durumda - [[Enumerable]]
niteliği olan mülkler için değerlendirir true
.
Bu koşul, nesnelerin özellikle mirastan çok daha fazla özelliğe sahip olması nedeniyle mevcuttur :
console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]
Bu özelliklerin her biri hala nesnede bulunur :
console.log('constructor' in foo); // true
console.log('toString' in foo); // true
// etc.
Ancak, for..in
döngü tarafından atlanırlar çünkü numaralandırılamazlar.
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(descriptor.enumerable); // false
for-in
?