Перечисляемые и неперечисляемые свойства
В языке JavaScript свойства объектов могут быть перечисляемыми или неперечисляемыми (встречается вариант перевода: счётные или несчётные).
Если внутреннему флагу [[Enumerable]] свойства присвоить значение true, то данное свойство становится перечисляемым. Это происходит по умолчанию для свойств, созданных простым присваиванием или через инициализацию свойств (свойства, определённые через Object.defineProperty получают по умолчанию значение флага [[Enumerable]] равным false).
Встроенные методы, наследуемые объектами, являются неперечислимыми, а свойства, добавляемые в объекты вашей программой, являются перечислимыми.
Перечисляемые свойства участвуют в итерации в цикле for...in, если только имя свойства не Символ.
____________________
Таблица определяемости свойств:
| in | for/in | hasOwnProperty | |
|---|---|---|---|
| Перечисляемые | true | true | true |
| Неперчисляемые | true | false | true |
| Унаследованные / Перечисляемые | true | true | false |
| Унаследованные / Неперечисляемые | true | false | false |
| propertyIsEnumerable | in Object.keys | in Object.getOwnPropertyNames | |
|---|---|---|---|
| Перечисляемые | true | true | true |
| Неперечисляемые | false | false | true |
| Унаследованные / Перечисляемые | false | false | false |
| Унаследованные / Неперчисляемые | false | false | false |