Опубликован: 23.12.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский физико-технический институт
Лекция 2:

Базовые понятия Action Script

Специфичные управляющие конструкции

На самом деле, специфичной для Флэш является всего одна управляющая конструкция: это оператор for...in . Служит он для перебора всех полей некоторого объекта. Далее (в лекции 4, посвященной контейнерам Флэш МХ) мы увидим, что любой объект во Флэше фактически является хэш-таблицей: по ключу (имени переменной) выдается записанная информация. Перебор всех ключей, по которым записано хоть что-нибудь, - это и есть задача оператора for...in . Под "чем-нибудь" - понимаются обычные переменные, функции, номера элементов массива, если мы применили оператор for...in к массиву, и даже скрытые встроенные поля и методы - если только мы сможем "раскрыть" их. Последнее нужно редко и делается только при помощи недокументированных функций (но об этом мы все же будем говорить в лекции, посвященной наследованию). А вот как делается перебор полей объектов и массивов:

a_array = [4,6,8, 1212];

b_obj = {x: 15, y: "some text"}
b_obj.a = 1;
b_obj.b = 2;

for (var name in a_array){
   trace("a_array[" + name + "] = " + a_array[name]);
}
for (var name in b_obj){
   trace("b_obj[" + name + "] = " + b_obj[name]);
}

Этот код выводит в консоль следующее:

a_array[3] = 1212
a_array[2] = 8
a_array[1] = 6
a_array[0] = 4
b_obj[b] = 2
b_obj[a] = 1
b_obj[x] = 15
b_obj[y] = some text

Мы видим, что цикл for...in похож на обычный цикл for - тоже надо задать переменную (и лучше всего объявить ее локальной, чтобы такой код можно было использовать внутри функции; напомним, что не внутри функций var игнорируется). Эта переменная при каждом следующем выполнении тела цикла принимает значение, равное имени следующей переменной (указывать переменная может на объекты, функции, примитивные типы ). Выход из цикла обычно заканчивается, когда перебраны все поля; однако вы можете применять операторы break и continue, которые и в этом цикле работают как обычно. В массивах именами полей являются номера ячеек. Поэтому логично обращаться к ячейкам, указывая name в квадратных скобках. Оказывается, такой же способ работает и для обычного объекта! (Имя при этом, разумеется, с цифры уже не начинается.) Хотя это свойство и не документировано для Флэш МХ, но используется оно повсеместно. В следующей лекции мы подробнее обсудим всевозможные способы обращения к полям объекта в том случае, когда имя поля записано в строковой переменной. А пока обратим внимание еще и на порядок, в котором в объекте записаны поля (по крайней мере, как мы их видим в операторе for...in ). Мы видим, что ячейки массива записаны в обратном порядке; поля, которые мы завели при создании объекта - в прямом; но поля, заведенные позже, попали в самое начало. (И чем позже поле заведено, тем раньше оно появляется при переборе в for...in ). Однако не стоит полагаться на этот порядок расположения полей. После сортировки массива (или других его преобразований) этот порядок может измениться (и изменяется). Еще раз подчеркнем: меняется не только расположение содержимого в ячейках массива, но и расположение самих ячеек, когда мы их рассматриваем как поля объекта "массив". Так что по массиву лучше итерироваться с помощью обычного оператора for, а не for...in .

алексеи федорович
алексеи федорович
Беларусь, рогачёв
Тамара Ионова
Тамара Ионова
Россия, Нижний Новгород, НГПУ, 2009