คุณสมบัติที่นับได้คือคุณสมบัติที่สามารถรวมอยู่ในและเยี่ยมชมได้ในระหว่างการ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
ห่วงแล้ว iterates ผ่านชื่อคุณสมบัติของวัตถุ
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
ทำ?