Thuộc tính có thể đếm được là thuộc tính có thể được đưa vào và truy cập trong vòng for..in
vòng lặp (hoặc lặp lại các thuộc tính tương tự, như Object.keys()
).
Nếu thuộc tính không được xác định là đếm được, vòng lặp sẽ bỏ qua 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 tài sản được xác định là đếm được hay không bằng cách riêng [[Enumerable]]
attribute của nó. Bạn có thể xem đây như một phần của property's descriptor:
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 mình-console.log(prop);
trong trường hợp này - đối với những thuộc tính mà [[Enumerable]]
thuộc tính là true
.
Tình trạng này được đặt ra bởi vì đối tượng have many more properties, đặc biệt là from inheritance:
console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]
Mỗi thuộc tính vẫn exists on the object:
console.log('constructor' in foo); // true
console.log('toString' in foo); // true
// etc.
Tuy nhiên, họ đang bỏ qua (hoặc "không được tính ") bởi vòng lặp for..in
vì chúng không thể đếm được.
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(descriptor.enumerable); // false
Bạn có hiểu những gì 'cho-in' không? –
Từ các câu trả lời tôi nhận được for..in cho phép tất cả các thuộc tính enumerable của một đối tượng có sẵn để sử dụng với câu lệnh – Patrick
Ý nghĩa đơn giản nhất là: liệu thuộc tính sẽ được tạo bởi vòng lặp 'for in' hay không (cho những người không muốn biết chi tiết hoặc không quan tâm;)) –