Перечисляемые и неперечисляемые свойства
В языке 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 |