Une propriété énumérable est une propriété qui peut être incluse dans et visitée pendant for..in
(ou une itération similaire de propriétés, comme les boucles Object.keys()
).
Si une propriété n'est pas identifiée comme énumérable, la boucle ignorera qu'elle se trouve dans l'objet.
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"
Une propriété est identifiée comme énumérable ou non par son propre [[Enumerable]]
attribut . Vous pouvez le consulter dans le cadre du le descripteur de la propriété :
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 }
A for..in
La boucle itère ensuite sur les noms des propriétés de l'objet.
var foo = { bar: 1, baz: 2};
for (var prop in foo)
console.log(prop); // outputs 'bar' and 'baz'
Mais, n'évalue que sa déclaration - console.log(prop);
dans ce cas - pour les propriétés dont [[Enumerable]]
L'attribut est true
.
Cette condition est en place parce que les objets ont beaucoup plus de propriétés notamment de l'héritage :
console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]
Chacune de ces propriétés est encore existe sur l'objet :
console.log('constructor' in foo); // true
console.log('toString' in foo); // true
// etc.
Mais, ils sont ignorés par le for..in
parce qu'ils ne sont pas énumérables.
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(descriptor.enumerable); // false