JavaScript. Подробное руководство, 6-е издание, стр. 67
<b>// то удвоить это значение. Если х имеет значение undefined, null, false, 0 или NaN, </b><b>// оставить его в исходном состоянии, </b><b>if (о.х) о.х *= 2;</b>6.5. Перечисление свойств
Вместо проверки наличия отдельных свойств иногда бывает необходимо обойти все имеющиеся свойства или получить список всех свойств объекта. Обычно для этого используется цикл
<b>for/in</b>Инструкция цикла
<b>for/in</b><b>var о = {х:1, у:2, z:3}; // Три собственных перечислимых свойства</b><b>о.propertyIsEnumerable("toString") // => false: неперечислимое </b><b>for(p in о) // Цикл по свойствам</b><b> console.log(p); // Выведет х, у и z, но не toString</b>Некоторые библиотеки добавляют новые методы (или другие свойства) в объект
<b>Object.prototype</b><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 о[р] === "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>