Численні властивості - це ті, які можна включати і відвідувати під час for..in
циклів (або подібної ітерації властивостей, як Object.keys()
).
Якщо властивість не буде ідентифіковано як чисельне, цикл ігнорує, що він знаходиться в межах об'єкта.
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"
Властивість ідентифікується як чисельна чи ні за її власним [[Enumerable]]
атрибутом . Ви можете переглянути це як дескриптор властивості :
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
цикл повторюється через імена властивостей об'єкта.
var foo = { bar: 1, baz: 2};
for (var prop in foo)
console.log(prop); // outputs 'bar' and 'baz'
Але, лише оцінює його твердження - console.log(prop);
у цьому випадку - для тих властивостей, [[Enumerable]]
атрибут яких є true
.
Ця умова діє, тому що об'єкти мають набагато більше властивостей , особливо внаслідок спадкування :
console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]
Кожне з цих властивостей все ще існує на об'єкті :
console.log('constructor' in foo); // true
console.log('toString' in foo); // true
// etc.
Але вони пропущені for..in
циклом, тому що вони не перелічені.
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(descriptor.enumerable); // false
for-in
робить?