I was directed to MDN's for... in page when it said, "For... In iterates over the enumerable properties of an object ."
Then I went to the enumerability and ownership of properties page where it said "enumerable properties are those which can be iterated by a for... in loop ."
The dictionary defines enumerable as countable, but I can't really visualize what that means. cocould I get an example of something being enumerable?
Well, whether a property is considered enumerable or not is based on its own[[Enumerable]]
Attribute. You can view this as part of the property's descriptor:
var descriptor = Object.getOwnPropertyDescriptor({ bar: 1 }, ‘bar‘);console.log(descriptor.enumerable); // trueconsole.log(descriptor.value); // 1console.log(descriptor);// { value: 1, writable: true, enumerable: true, configurable: true }
> var descriptor = Object.getOwnPropertyDescriptor({ bar: 1 }, ‘bar‘);undefined>undefined> console.log(descriptor.enumerable); // truetrueundefined> console.log(descriptor.value); // 11undefined>undefined> console.log(descriptor);{ value: 1, writable: true, enumerable: true, configurable: true }undefined> // { value: 1, writable: true, enumerable: true, configurable: true }undefined>
Afor..in
Loop then iterates through the object's property names.
var foo = { bar: 1, baz: 2};for (var prop in foo) console.log(prop); // outputs ‘bar‘ and ‘baz‘
> var foo = { bar: 1, baz: 2};undefined>undefined> for (var prop in foo)... console.log(prop); // outputs ‘bar‘ and ‘baz‘barbazundefined
But, it only evaluates itsStatement--console.log(prop);
In this case -- for those properties whose[[Enumerable]]
Attribute istrue
.
This condition is in place because objects actually have has more properties, especially those from inheritance:
> console.log(Object.getOwnPropertyNames(Object.prototype));[ ‘constructor‘, ‘toString‘, ‘toLocaleString‘, ‘valueOf‘, ‘hasOwnProperty‘, ‘isPrototypeOf‘, ‘propertyIsEnumerable‘, ‘__defineGetter__‘, ‘__lookupGetter__‘, ‘__defineSetter__‘, ‘__lookupSetter__‘ ]undefined> // ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty","isPrototypeOf", "propertyIsEnumerable", /* etc. */]
console.log(Object.getOwnPropertyNames(Object.prototype));// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]
Each of these properties still exists on the object:
console.log(‘constructor‘ in foo); // trueconsole.log(‘toString‘ in foo); // true// etc.
But, they're skipped (or"Not counted") Byfor..in
Loop because they're non-enumerable.
var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, ‘constructor‘);console.log(descriptor.enumerable); // false
What does enumerable mean?