Почему toString и hasOwnProperty (и т. Д.) Не отображаются в циклах for-in в JavaScript? - PullRequest
7 голосов
/ 27 мая 2011

Я говорил о hasOwnProperty с другим разработчиком и о том, как вы должны использовать его в циклах for-in в javascript, и у него возник хороший вопрос. Когда вы выполняете цикл for-in, почему в цикле не отображаются toString, hasOwnProperty и другие встроенные методы?

Ответы [ 5 ]

5 голосов
/ 27 мая 2011

ECMAScript определяет несколько свойств для каждого свойства, найденного в объектах, таких как в прототипах. Одним из них является свойство enumerable, и если оно установлено на false, то это свойство будет пропущено.

На самом деле вы можете управлять этими свойствами, используя функцию defineProperty:

Этот метод позволяет точно добавлять или изменять свойство объекта. Нормальное добавление свойств посредством присваивания создает свойства, которые отображаются во время перечисления свойств (для цикла ... в), значения которых можно изменить, а какие можно удалить. Этот метод позволяет изменить эти дополнительные детали по умолчанию.

4 голосов
/ 27 мая 2011

Я почти уверен, что эти методы имеют внутренний атрибут [[Enumerable]] , установленный на false, но я не могу найти ничего там, где это явно указано.

Обновление: По-видимому, отсутствие перечисления является настройкой по умолчанию для свойств, определенных в спецификации (если не указано иное) (см. Таблицу 7 в ссылке ниже).

Вы можете найти больше информации об этих атрибутах в спецификации: Атрибуты свойства :

Если true, свойство будет перечислено путем перечисления for-in (см. 12.6.4 ). В противном случае свойство считается не перечисляемым.

4 голосов
/ 27 мая 2011

Это по спецификации

Цикл for ... in не выполняет итерацию по встроенным свойствам.К ним относятся все встроенные методы объектов, такие как метод indexOf String или метод toString объекта.Тем не менее, цикл будет перебирать все пользовательские свойства (включая любые, которые перезаписывают встроенные свойства).*

Он основан на перечислимом атрибуте этих свойств, как вы можете проверить в спецификации EcmaScript (поиск «for-in», атрибут «enumerable» описан на стр. 30)

1 голос
/ 27 мая 2011

Встроенные свойства не перечисляются, поэтому toString и hasOwnProperty не перечисляются.В ECMAScript 3 каждый определенный пользователем метод или свойство является перечисляемым.В ECMAScript 5 вы можете выбрать, будет ли перечисляться метод или свойство.

0 голосов
/ 27 мая 2011

Возможно, я неправильно понял ваш вопрос, но вот пример работы hasOwnProperty внутри цикла for-in:

var i,o={some:"thing"};for(i in o)alert(o.hasOwnProperty("some"));
...