5.5.4. Инструкция for/in
Инструкция цикла for/in использует ключевое слово for, но она в корне отличается от инструкции обычного цикла for. Цикл for/in имеет следующий синтаксис:
for (переменная in объект)
инструкция
В качестве переменной здесь обычно используется имя переменной, но точно так же можно использовать любое выражение, возвращающее левостороннее выражение (раздел 4.7.3), или инструкцию var, объявляющую единственную переменную, - практически все, что может находиться слева от оператора присваивания. Параметр объект - это выражение, возвращающее объект. И как обычно, инструкция - это инструкция или блок инструкций, образующих тело цикла.
Для обхода элементов массива естественно использовать обычный циклfor:
for(var і = 0; і < a.length; і++) // Присваивать индексы в массиве переменной і
console.log(a[і]); // Вывести значение каждого элемента массива
Инструкция for/in так же естественно позволяет выполнить обход свойств объекта.
for(var р in о) // Присваивать имена свойств объекта о переменной р
console.log(o[p]); // Вывести значение каждого свойства
Чтобы выполнить инструкцию for/in, интерпретатор JavaScript сначала вычисляет выражение объект. Если оно возвращает значение null или undfefined, интерпретатор пропускает цикл и переходит к следующей инструкции.[6] (Реализации, следующие стандарту ECMAScript 3, в этом случае могут возбуждать исключение ТуреЕггог.) Если выражение возвращает простое значение, оно преобразуется в эквивалентный объект-обертку (раздел 3.6). В противном случае выражение возвращает объект. Затем интерпретатор выполняет по одной итерации цикла для каждого перечислимого свойства объекта. Перед каждой итерацией интерпретатор вычисляет значение выражения переменная и присваивает ему имя свойства (строковое значение).
Обратите внимание, что переменная в цикле for/in может быть любым выражением, возвращающим значение, которое можно использовать слева от оператора присваивания. Это выражение вычисляется в каждой итерации цикла, т. е. каждый раз оно может возвращать разные значения. Например, чтобы скопировать имена всех свойств объекта в массив, можно использовать следующий цикл:
var о = {х:1. у:2. z:3};
var а = [];
var і = 0;
for(a[i++] in о) /* пустое тело цикла */;
Массивы в JavaScript - это просто специальный тип объектов, а индексы в массиве - свойства объекта, обход которых можно выполнить с помощью цикла for/in. Например, следующая инструкция перечислит индексы 0, 1 и 2 массива, объявленного выше:
fоr(і in a) console.log(i);
В действительности цикл for/in может совершать обход не по всем свойствам объекта, а только по перечислимым свойствам (раздел 6.7). Многочисленные встроенные методы, определяемые в базовом языке JavaScript, не являются перечислимыми. Например, все объекты имеют метод toString(), но цикл for/in не перечислит свойство toString. Кроме встроенных методов также не являются перечислимыми многие другие свойства встроенных объектов. При этом все свойства и методы, определяемые пользователем, являются перечислимыми. (Но в реализации, следующей стандарту ECMAScript 5, имеется возможность сделать их неперечислимыми, использовав прием, описанный в разделе 6.7.) Унаследованные свойства, которые были определены пользователем (раздел 6.2.2), также перечисляются циклом for/in.
Если в теле цикла for/in удалить свойство, которое еще не было перечислено, это свойство перечислено не будет. Если в теле цикла создать новые свойства, то обычно такие свойстве не будут перечислены. (Однако некоторые реализации могут перечислять унаследованные свойства, добавленные в ходе выполнения цикла.)
Больше книг — больше знаний!
Заберите 30% скидку новым пользователям на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ