Я был направлен в MDN для ... на странице, когда он сказал: "для ... итерации по перечисляемым свойствам объекта".
Затем я перешел на страницу « Перечислимость и владение свойствами», где говорилось: «Перечислимые свойства - это те, которые могут быть повторены циклом for..in».
Словарь определяет перечисляемое как исчисляемое, но я не могу реально представить, что это значит. Могу ли я получить пример чего-то перечисляемого?
javascript
enumerable
Патрик
источник
источник
for-in
значит?for in
циклом или нет (для тех, кто не хочет знать детали или просто не заботится;))Ответы:
Перечислимое свойство - это свойство, которое может быть включено и посещено во время
for..in
циклов (или подобной итерации свойств, напримерObject.keys()
).Если свойство не идентифицируется как перечисляемое, цикл игнорирует то, что оно находится внутри объекта.
Свойство идентифицируется как перечисляемое или нет по собственному
[[Enumerable]]
атрибуту . Вы можете просмотреть это как часть дескриптора свойства :Затем
for..in
цикл перебирает имена свойств объекта.Но, только оценивает его утверждение -
console.log(prop);
в этом случае - для тех свойств,[[Enumerable]]
атрибут которыхtrue
.Это условие выполняется, потому что у объектов гораздо больше свойств , особенно от наследования :
Каждое из этих свойств все еще существует в объекте :
Но они пропускаются
for..in
циклом, потому что они не перечислимы.источник
But, they are skipped (or not counted) by the for..in loop because they are not enumerable
. Свойства onObject.prototype
фактически игнорируются, потому что они находятся дальше по цепочке прототипов, а не потому, что они не перечисляются. НиgetOwnPropertyNames()
илиkeys()
не показывают свойства, которые не являются объектом собственными. В качестве примечания следует отметить, что многие встроенные свойства не перечисляются и, следовательно, не будут отображаться с помощьюkeys()
, но вам придется написать дополнительный код, если вы хотите обойти цепочку прототипов.Если вы создаете объект через
myObj = {foo: 'bar'}
или что-то около этого, все свойства перечисляются. Итак, более простой вопрос: что не перечислимо? Некоторые объекты имеют некоторые не перечисляемые свойства, например, если вы вызываетеObject.getOwnPropertyNames([])
(который возвращает массив всех свойств, перечислимых или нет, для []), он возвращает['length']
, который включает в себя не перечислимое свойство массива 'length' ,Вы можете создать свои собственные не перечисляемые свойства, вызвав
Object.defineProperty
:Этот пример в значительной степени заимствует из неперечислимых свойств в JavaScript , но показывает перечисляемый объект. Свойства могут быть или не быть записываемыми, настраиваемыми или перечисляемыми. Джон Резиг обсуждает это в рамках объектов и свойств ECMAScript 5 .
И есть вопрос переполнения стека о том, почему вы хотите сделать свойства не перечисляемыми .
источник
Это намного скучнее, чем то, что нужно визуализировать.
Во всех свойствах буквально есть атрибут, называемый перечислимым. Когда установлено значение false,
for..in
метод пропускает это свойство, делая вид, что его не существует.Существует множество свойств для объектов, для которых «enumerable» имеет значение false, например «valueOf» и «hasOwnProperty», поскольку предполагается, что вы не хотите, чтобы механизм JavaScript выполнял итерации по ним.
Вы можете создавать свои собственные не перечисляемые свойства, используя
Object.defineProperty
метод:Теперь о том, что есть даже секрет об автомобиле, скрыто. Конечно, они могут получить доступ к собственности напрямую и получить ответ:
Но они должны знать, что свойство существует в первую очередь, потому что, если они пытаются получить к нему доступ
for..in
илиObject.keys
оно останется полностью секретным:Они должны были просто назвать это «forInAble».
источник
Если у вас возникают трудности с визуализацией "что значит быть перечисляемым?" почему бы не спросить себя, что значит быть неисчисляемым ?
Я думаю об этом немного как это, неисчислимое свойство существует, но частично скрыто ; это означает, что неисчислимый странный. Теперь вы можете представить перечисляемое как то, что осталось - более естественное свойство, с которым мы привыкли сталкиваться с тех пор, как обнаружили Объекты . Рассматривать
Теперь представьте
for..in
, что это псевдокодгде тело цикла, который вы набрали в JavaScript, находится вместо
/* whatever */
источник
Я напишу одну строку определения ENUMERABLE
Enumerable
: Указывает, может ли свойство быть возвращено в цикле for / in.источник
методы не перечисляются; вернее, встроенные методы не выполняются после поиска того, что перечислимое означает для сценария Java; он просто ссылается на атрибут свойства ... все созданные объекты в ecma3 являются перечисляемыми, и теперь ecma5 вы можете определить его ... вот и все ...: D lol, мне понадобилось немного, чтобы найти ответ; но я верю, что об этом говорилось в книге Дэвида Фланагана ... поэтому я предполагаю, что это означает "скрытый" или не "скрытый" в том смысле, что методы не отображаются в цикле for in и, следовательно, "скрыты"
источник
Представьте себе тип данных enum, просто структуру объектов, которые соответствуют разным числам. Объявить что-либо как перечисляемое означает объявить, что оно соответствует определенному числу, что позволяет ему получить место в Словаре, который представляет счетные компоненты объекта. Проще говоря, сделать объект перечисляемым - это то же самое, что сказать компилятору: «Эй, это свойство имеет значение, я хочу увидеть это, когда проверю данные этого объекта».
источник
Встроенные методы, которые наследуют объекты, не перечисляются, но свойства, которые ваш код добавляет к объектам, перечислимы, если явно не указано
источник