Một thuộc tính vô số là một thuộc tính có thể được bao gồm trong và truy cập trong for..in
các vòng lặp (hoặc một lần lặp tương tự của các thuộc tính, như Object.keys()
).
Nếu một thuộc tính không được xác định là có thể đếm được, vòng lặp sẽ bỏ qua rằng nó nằm trong đối tượng.
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"
Một thuộc tính được xác định là vô số hoặc không [[Enumerable]]
thuộc tính của chính nó . Bạn có thể xem đây là một phần của mô tả của tài sản :
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 }
Một for..in
vòng lặp sau đó lặp qua tên thuộc tính của đối tượng.
var foo = { bar: 1, baz: 2};
for (var prop in foo)
console.log(prop); // outputs 'bar' and 'baz'
Nhưng, chỉ đánh giá tuyên bố của nó - console.log(prop);
trong trường hợp này - cho những thuộc tính có [[Enumerable]]
thuộc tính true
.
Điều kiện này được đặt ra vì các đối tượng có nhiều thuộc tính hơn , đặc biệt là từ thừa kế :
console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]
Mỗi thuộc tính này vẫn tồn tại trên đối tượng :
console.log('constructor' in foo); // true
console.log('toString' in foo); // true
// etc.
Nhưng, họ bị bỏ qua bởi for..in
vòng lặp bởi vì họ không thể đếm được.
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(descriptor.enumerable); // false
for-in
không?