Eine aufzählbare Eigenschaft kann in for..in
Schleifen (und einer ähnlichen Iteration von Eigenschaften wie Object.keys()
) aufgenommen und besucht werden .
Wenn eine Eigenschaft nicht als aufzählbar identifiziert wird, ignoriert die Schleife, dass sie sich innerhalb des Objekts befindet.
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"
Eine Eigenschaft wird durch ein eigenes [[Enumerable]]
Attribut als aufzählbar oder nicht aufzählbar identifiziert . Sie können dies als Teil des Deskriptors der Eigenschaft anzeigen :
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 }
Eine for..in
Schleife durchläuft dann die Eigenschaftsnamen des Objekts.
var foo = { bar: 1, baz: 2};
for (var prop in foo)
console.log(prop); // outputs 'bar' and 'baz'
Wertet jedoch nur die Anweisung aus - console.log(prop);
in diesem Fall - für die Eigenschaften, deren [[Enumerable]]
Attribut lautet true
.
Diese Bedingung ist gegeben, weil Objekte viel mehr Eigenschaften haben , insbesondere aufgrund der Vererbung :
console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]
Jede dieser Eigenschaften ist noch für das Objekt vorhanden :
console.log('constructor' in foo); // true
console.log('toString' in foo); // true
// etc.
Sie werden jedoch von der for..in
Schleife übersprungen , da sie nicht aufzählbar sind.
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(descriptor.enumerable); // false
for-in
macht?