JavaScript. Подробное руководство, 6-е издание, стр. 67

<b>// то удвоить это значение. Если х имеет значение undefined, null, false, 0 или NaN, </b>

<b>// оставить его в исходном состоянии, </b>

<b>if (о.х) о.х *= 2;</b>

6.5. Перечисление свойств

Вместо проверки наличия отдельных свойств иногда бывает необходимо обойти все имеющиеся свойства или получить список всех свойств объекта. Обычно для этого используется цикл

<b>for/in</b>
, однако стандарт ECMAScript 5 предоставляет две удобные альтернативы.

Инструкция цикла

<b>for/in</b>
рассматривалась в разделе 5.5.4. Она выполняет тело цикла для каждого перечислимого свойства (собственного или унаследованного) указанного объекта, присваивая имя свойства переменной цикла. Встроенные методы, наследуемые объектами, являются неперечислимыми, а свойства, добавляемые в объекты вашей программой, являются перечислимыми (если только не использовались функции, описываемые ниже, позволяющие сделать свойства неперечислимыми). Например:

<b>var о = {х:1, у:2, z:3}; // Три собственных перечислимых свойства</b>

<b>о.propertyIsEnumerable(&quot;toString&quot;) // =&gt; false: неперечислимое </b>

<b>for(p in о) // Цикл по свойствам</b>

<b>  console.log(p); // Выведет х, у и z, но не toString</b>

Некоторые библиотеки добавляют новые методы (или другие свойства) в объект

<b>Object.prototype</b>
, чтобы они могли быть унаследованы и быть доступны всем объектам. Однако до появления стандарта ECMAScript 5 отсутствовала возможность сделать эти дополнительные методы неперечислимыми, поэтому они оказывались доступными для перечисления в циклах
<b>for/in</b>
. Чтобы решить эту проблему, может потребоваться фильтровать свойства, возвращаемые циклом
<b>for/in</b>
. Ниже приводятся два примера реализации такой фильтрации:

<b>fог(р in о) {</b>

<b>  if (!о.hasOwnProperty(p)) continue; // Пропустить унаследованные свойства</b>

<b>}</b>

<b>for(p in о) {</b>

<b>  if (typeof о[р] === &quot;function”) continue; // Пропустить методы</b>

<b>}</b>

В примере 6.2 определяются вспомогательные функции, использующие цикл for/in для управления свойствами объектов. Функция extend(), в частности, часто используется в библиотеках JavaScript. [9]

Пример 6.2. Вспомогательные функции, используемые для перечисления свойств объектов

<b>/*</b>

<b>*       Копирует перечислимые свойства из объекта р в объект о и возвращает о.</b>

<b>*       Если о и р имеют свойства с одинаковыми именами, значение свойства</b>

<b>*       в объекте о затирается значением свойства из объекта р.</b>

<b>*       Эта функция не учитывает наличие методов доступа и не копирует атрибуты.</b>

<b>*/</b>

<b>function extend(o, р) {</b>

<b>  fоr(ргор in р) {            // Для всех свойств в р.</b>

<b>    о[ргор] = р[prop];        // Добавить свойство в о.</b>

<b>  }</b>

<b>  return о;</b>

<b>}</b>

<b>/*</b>

<b>*       Копирует перечислимые свойства из объекта р в объект о и возвращает о.</b>

<b>*       Если о и р имеют свойства с одинаковыми именами, значение свойства</b>

<b>*       в объекте о остается неизменным.</b>

<b>*       Эта функция не учитывает наличие методов доступа и не копирует атрибуты.</b>

<b>*/</b>

<b>function merge(o, р) {</b>

<b>  fоr(ргор in р) {                        // Для всех свойств в р.</b>

<b>    if (о.hasOwnProperty[prop]) continue; // Кроме имеющихся в о. </b>

<b>    о[prop] = р[prop];                    // Добавить свойство в о.</b>

<b>  }</b>

<b>  return о;</b>

<b>}</b>

<b>/*</b>

<b>*       Удаляет из объекта о свойства, отсутствующие в объекте р.</b>

<b>*       Возвращает о.</b>

<b>*/</b>

<b>function restricts, р) {</b>

<b>  fоr(prop in о) {                     // Для всех свойств в о</b>

<b>    if (!(prop in р)) delete о[prop]; // Удалить, если отсутствует в р</b>

<b>  }</b>

<b>  return о;</b>

<b>}</b>

<b>/*</b>

<b>*       Удаляет из объекта о свойства, присутствующие в объекте р. Возвращает о.</b>

<b>*/</b>

<b>function subtracts, р) {</b>

<b>  for(prop in р) {      // Для всех свойств в р</b>

<b>    delete о[ргор];     // Удалить из о (удаление несуществующих</b>

<b>                        // свойств можно выполнять без опаски)</b>

<b>  }</b>