function tail(о) { // Возвращает последний элемент в списке о
fоr(; о.next; о = о.next) /*пустое*/; // Выполнять обход, пока о.next
return о; // является истинным значением
}
Обратите внимание на отсутствие выражения инициализации в примере выше. Любое из трех выражений цикла for может быть опущено, но две точки с запятой являются обязательными. Если опустить выражение проверки, цикл будет повторяться вечно, и форма записи for(;;) является еще одним способом написать бесконечный цикл, подобно while(true).
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 массива, объявленного выше:
6
Реализации, следующие стандарту ECMAScript 3, в этом случае могут возбуждать исключение ТуреЕrror.