Une propriété énumérable est une propriété qui peut être incluse et visitée pendant les for..in
boucles (ou une itération similaire de propriétés, comme 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 l'afficher dans le cadre du 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 }
Une for..in
boucle parcourt ensuite les noms de propriété de l'objet.
var foo = { bar: 1, baz: 2};
for (var prop in foo)
console.log(prop); // outputs 'bar' and 'baz'
Mais, n'évalue son instruction - console.log(prop);
dans ce cas - que pour les propriétés dont l' [[Enumerable]]
attribut est true
.
Cette condition est en place car les objets ont beaucoup plus de propriétés , en particulier d'héritage :
console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]
Chacune de ces propriétés existe toujours sur l'objet :
console.log('constructor' in foo); // true
console.log('toString' in foo); // true
// etc.
Mais, ils sont ignorés par la for..in
boucle car ils ne sont pas énumérables.
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(descriptor.enumerable); // false
for-in
fait?