Руководство по actionscript. часть 2, стр. 019
Таблица 10.2. Операторы языка ActionScript
Оператор Приоритет Описание Пример
15 Многоцелевое использование. 1. Обращается к переменной или методу. 2. Отделяет имена пакетов от имен классов и других пакетов. 3. Обращается к дочерним элементам объекта XML или XMLList (спецификация Е4Х) 1. Обращение к переменной: product, price 2. Ссылка на класс: flash. d isplay. Sprite 3. Обращение к дочернему элементу объекта XML: novel. TITLE
Оператор Приоритет Описание Пример
[] 15 Многоцелевое использование. 1. Выполняет инициализацию массива. 2. Обращается к элементу массива. 3. Обращается к переменной или методу с использованием любого выражения, возвращающего строку. 4. Обращается к дочерним элементам или атрибутам объекта XML или XMLList (спецификация Е4Х) 1. Инициализация массива: ["apple", "orange", "pear"] 2. Обращение к четвертому элементу массива: list[3] 3. Обращение к переменной: product["price"] 4. Обращение к дочернему элементу объекта XML: novel["TITLE"]
О 15 Многоцелевое использование. 1. Задает особый порядок выполнения операций (приоритет). 2. Вызывает функцию или метод. 3. Содержит фильтрующий предикат спецификации Е4Х 1. Выполнение операции сложения до операции умножения: (5 + 4) * 2 2. Вызов функции: trace() 3. Фильтрация объекта XMLList: staff.*.(SALARY <= 35000)
@ 15 Обращается к атрибутам XML-элемента Получение всех атрибутов элемента novel: novel. @*
15 Отделяет уточняющее пространство имен от имени Уточнение имени orange в пространстве имен fruit: fruit:: orange
15 Обращается к потомкам XML-элемента Получение всех элементов-потомков элемента loan с именем DIRECTOR: loan..DIRECTOR
{х:у} 15 Создает новый объект и инициализирует его динамические переменные Создание объекта с динамическими переменными width и height: {width:30, height:5>
new 15 Создает экземпляр класса Создание экземпляра класса TextField: new TextField()
15 Описывает XML-элемент Создание XML-элемента с именем BOOK: Essential ActionScript 3.0 воок>
Х++ 14 Прибавляет единицу к значению переменной х и возвращает ее прежнее значение (постфиксный инкремент) Увеличение i на 1 и возврат прежнего значения i: i++
х— 14 Вычитает единицу из значения переменной х и возвращает ее прежнее значение (постфиксный декремент) Уменьшение i на 1 и возврат прежнего значения i:
++Х 14 Прибавляет единицу к значению переменной х и возвращает ее новое значение (префиксный инкремент) Увеличение i на 1 и возврат результата: ++i
Таблица 10.2 (продолжение)
Оператор Приоритет Описание Пример
—X 14 Вычитает единицу из значения переменной х и возвращает ее новое значение (префиксный декремент) Уменьшение i на 1 и возврат результата:
14 Изменяет знак операнда (положительное значение становится отрицательным, а отрицательное — положительным) var a:int = 10; Присвоение -10 переменной Ь: var b:int = — а;
14 Выполняет операцию побитового НЕ Сброс бита 2 значения переменной options: options &= ~4;
14 Возвращает логическое значение, противоположное его единственному операнду Если значением переменной underl8 не является true, то выполняется тело условного оператора: if (!underl8){ trace(«You can apply for a credit card») }
delete 14 Многоцелевое использование. 1. Удаляет значение элемента массива. 2. Удаляет динамическую переменную экземпляра объекта. 3. Удаляет XML-элемент или атрибут 1. Создание массива: var genders:Array = ["male","female"] 2. Удаление значения первого элемента: delete genders[0]; 3. Создание объекта: var о:Object = new Object(); o. a = 10; 4. Удаление динамической переменной экземпляра а: delete o. a; 5. Удаление элемента из объекта XML, на который ссылается переменная novel: delete novel. TITLE;
typeof 14 Возвращает простое строковое описание различных типов объектов. Используется только для обеспечения обратной совместимости с языками ActionScript 1.0 и ActionScript 2.0 Получение строкового описания типа значения 35: typeof 35
void 14 Возвращает значение undefined var о:Object = new Object(); o. a = 10; Сравнение значения undefined со значением o. a: if (o. a == void) { trace(«o. a does not exist, or has no value»); }
* 13 Перемножает два числа Умножение 4 на 6: 4*6
/ 13 Делит левый операнд на правый операнд Деление 30 на 5: 30/5
Оператор Приоритет Описание Пример
% 13 Возвращает остаток (то есть модуль) от деления левого операнда на правый операнд Остаток от деления 14 на 4: 14 % 4
+ 12 Многоцелевое использование. 1. Складывает два числа. 2. Объединяет (конкатенирует) две строки. 3. Объединяет (конкатенирует) два объекта XML или XMLList 1. Результат 25 плюс 10: 25 + 10 2. Объединение строк «Не» и «Но» в строку «Hello»: «Не» + «Но» 3. Объединение двух объектов XML: Programmer +
- 12 Вычитает правый операнд из левого операнда Вычитание 2 из 12: 12-2
<< 11 выполняет побитовый сдвиг влево сдвигает значение 9 на четыре бита влево: 9 << 4
>> 11 Выполняет побитовый знаковый сдвиг вправо Сдвигает значение 8 на один бит вправо: 8 » 1
>>> 11 Выполняет побитовый беззнаковый сдвиг вправо Сдвигает значение 8 на один бит вправо, заполняя освободившиеся биты нулями: 8 »> 1
< 10 проверяет справедливость условия, что левый операнд меньше правого. в зависимости от значений операндов возвращает true или false 1. проверяет справедливость условия, что 5 меньше 6: 5 < 6 2. проверяет, обладает ли символ "а" более низкой кодовой позицией, чем символ "z": "а" < "z"
<= 10 проверяет справедливость условия, что левый операнд меньше либо равен правому операнду. в зависимости от значений операндов возвращает true или false 1. проверяет справедливость условия, что 10 меньше либо равно 5: 10 <= 5 2. проверяет, обладает ли символ "с" более низкой или такой же кодовой позицией, что и символ "d": "с" <= "d"
> 10 Проверяет справедливость условия, что левый операнд больше правого. В зависимости от значений операндов возвращает true или false 1. Проверяет справедливость условия, что 5 больше 6: 5 > 6 2. Проверяет, обладает ли символ «а» более высокой кодовой позицией, чем символ «z»: «а» > «z»
>= 10 Проверяет справедливость условия, что левый операнд больше либо равен правому операнду. В зависимости от значений операндов возвращает true или false 1. Проверяет справедливость условия, что 10 больше либо равно 5: 10 >= 5 2. Проверяет, обладает ли символ «С» более высокой или такой же кодовой позицией, что и символ «D»: «С» >= «D»
Таблица 10.2 (продолжение)
Оператор Приоритет Описание Пример
as Проверяет, принадлежит ли левый операнд типу данных, указанному правым операндом. Если это так, возвращается объект; в противном случае возвращается значение null Var d:Date = new Date() Проверяет, принадлежит ли значение переменной d типу данных Date: d as Date
is Проверяет, принадлежит ли левый операнд типу данных, указанному правым операндом. Если это так, возвращается true; в противном случае возвращается false var a:Array = new Array() Проверяет, принадлежит ли значение переменной а типу данных Array: a is Array
in Проверяет, обладает ли объект указанной открытой переменной или методом экземпляра Var d:Date = new Date() Проверяет, обладает ли значение переменной d открытой переменной или открытым методом с именем getMonth: «getMonth» in d
instanceof 10 Проверяет, включает ли цепочка прототипов левого операнда правый операнд. В зависимости от значений операндов возвращает true или false var s:Sprite = new Sprite() Проверяет, включает ли цепочка прототипов значения переменной s объект DisplayObject: s instanceof DisplayObject
9 Проверяет, являются ли два выражения равными (условие равенства). В зависимости от значений операндов возвращает true или false Проверяет, равняется ли выражение «hi» выражению «hello»: «hi» == «hello»
9 Проверяет, являются ли два выражения неравными (условие неравенства). В зависимости от значений операндов возвращает true или false Проверяет, не равно ли выражение 3 выражению 3: 3 != 3
9 Проверяет, являются ли два выражения равными, не выполняя преобразование типов данных операндов к примитивным типам (условие строгого равенства). В зависимости от значений операндов возвращает true или false Проверяет, равняется ли выражение «3″ выражению 3. Этот код компилируется только в стандартном режиме: »3″ ===з
9 Проверяет, являются ли два выражения неравными, не выполняя преобразование типов данных операндов к примитивным типам (условие строгого неравенства). В зависимости от значений операндов возвращает true или false Проверяет, не равно ли выражение «3″ выражению 3. Этот код компилируется только в стандартном режиме: «3″ !== 3
& 8 Выполняет операцию побитового И Объединяет биты значений 15 и 4 с помощью операции побитового И: 15 & 4
Оператор Приоритет Описание Пример
л 7 Выполняет операцию побитового исключающего ИЛИ Объединяет биты значений 15 и 4 с помощью операции побитового исключающего ИЛИ: 15 А 4
1 6 Выполняет операцию побитового ИЛИ Объединяет биты значений 15 и 4 с помощью операции побитового ИЛИ: 15 | 4
&& 5 Сравнивает результаты двух выражений с помощью операции логического И. Если значение левого операнда равно false или преобразуется в false, оператор возвращает левый операнд; в противном случае оператор возвращает правый операнд var validUser: Boolean = true; var validPassword: Boolean = false; Проверяет, имеют ли обе переменные — validUser и validPassword — значение true: if (validUser && validPassword) { // Выполнить вход… }
II 4 Сравнивает результаты двух выражений с помощью операции логического ИЛИ. Если значение левого операнда равно true или преобразуется в true, оператор возвращает левый операнд; в противном случае оператор возвращает правый операнд var promotionalDay: Boolean = false; var registeredUser:Boolean = false; Проверяет, чтобы значение любой из переменных promotionalDay или registeredUser равнялось true if (promotionalDay 11 registeredUser) { // Отобразить дополнительное содержимое… }
?: 3 Выполняет простое условие. Если значение первого операнда равно true или преобразуется в true, вычисляется и возвращается значение второго операнда. В противном случае вычисляется и возвращается значение третьего операнда Вызывает один из двух методов в зависимости от того, хранит ли переменная soundMuted значение true: soundMuted? displayVisualAlarm() : playAudioAlarm()
2 Присваивает значение переменной или элементу массива 1. Присваивает 36 переменной age: var ageiint = 36; 2. Присваивает новый массив переменной seasons: var seasons:Array = new Array(); 3. Присваивает значение «winter» первому элементу массива seasons: seasons[0] = «winter»;
+= 2 Прибавляет (или конкатенирует) и присваивает результат 1. Прибавляет 10 к значению переменной п: п += 10; // то же самое, что и n = п + 10; 2. Добавляет восклицательный знак в конец строки msg: msg += «I» 3. Добавляет тег
Таблица 10.2 (иродо. мачте)
Оператор Приоритет Описание Пример
2 Вычитает и присваивает результат Вычитает 10 из значения переменной п: п -= 10; // то же, что и n = п — 10;
*- 2 Умножает и присваивает результат Умножает значение переменной п на 10: п *= 10; // то же, что и n = п * 10;
/= 2 Делит и присваивает результат Делит значение переменной п на 10: п /= 10; // то же, что и n = п / 10;
%= 2 Выполняет операцию деления по модулю и присваивает результат Присваивает переменной п результат операции п % 4: п %= 4; // то же, что и n = п % 4;
<<= 2 сдвигает биты влево и присваивает результат сдвигает биты значения переменной п влево на две позиции: п <<= 2; // то же, что и n = п << 2;
>>= 2 Сдвигает биты вправо и присваивает результат Сдвигает биты значения переменной п вправо на две позиции: п >>= 2; // то же, что и n = п >> 2;
>>>= 2 Сдвигает биты вправо (беззнаковый сдвиг)и присваивает результат Сдвигает биты значения переменной п вправо на две позиции, заполняя освободившиеся биты нулями: п »>= 2; // то же, что и n = п >>> 2;
&= 2 Выполняет операцию побитового И и присваивает результат Объединяет биты значения переменной п со значением 4, используя операцию побитового И: п &= 4 // то же, что и n = п & 4;
А — 2 Выполняет операцию побитового исключающего ИЛИ и присваивает результат Объединяет биты значения переменной п со значением 4, используя операцию побитового исключающего ИЛИ: п А= 4 // то же, что и n = n А 4;
1 = 2 Выполняет операцию побитового ИЛИ и присваивает результат Объединяет биты значения переменной п со значением 4, используя операцию побитового ИЛИ: п | = 4 // то же, что и n = п | 4;
1 Вычисляет сначала значение левого операнда, а затем правого Инициализация и увеличение двух итераторов цикла: for (var i:int = 0, j:int = 10; i < 5; j++h // i принимает значения от 0 до 4 // j принимает значения от 10 до 14 }
Далее: управление списками данных
В этой главе были рассмотрены некоторые основные встроенные инструменты программирования языка ActionScript. В следующей главе мы познакомимся с еще одним важным инструментом языка ActionScript: массивами. Массивы используются для управления списками данных.
Руководство по actionscript. часть 2, стр. 020
ГЛАВА 11
Массивы
Массивы хранят упорядоченные списки данных и управляют ими, являясь, таким образом, основным инструментом в последовательном, итерационном программировании. Мы используем массивы для решения различных надач, начиная с храпения данных, введенных пользователем, и заканчивая генерацией раскрывающихся меню или описанием траектории движения вражеского космического корабля в игре. Фактически массив — это просто список элементов, похожий па список продуктов или на записи в вашей книге расходов. Только элементами в данном случае являются значения языка ActionScript.
Что такое массив?
Массив — это структура данных, которая объединяет несколько отдельных значений данных в упорядоченный список. Рассмотрим простой пример, который демонстрирует две отдельные строки и массив, содержащий две строки:
«cherries» // Отдельная строка
«peaches» // Еще одна строка
["oranges", "apples"] // Массив, содержащий две строки
Массив может содержать любое количество элементов, причем различных типов. Массив даже может содержать другие массивы. Рассмотрим простой пример, демонстрирующий массив, который одновременно содержит и строки, и числа. Используя массив, можно представить список покупок, включающий названия покупаемых товаров и их необходимое количество: ["oranges". 6, "apples". 4, "bananas", 3];
Хотя массив может хранить большое количество значений, важно понимать, что сам по себе он является отдельным значением данных. Массивы представляются экземплярами класса Array. По существу, массив может быть присвоен переменной или использован как часть сложного выражения:
// Присвоить массив переменной var product:Array = ["ladies downhill skis", 475]; // Передать этот массив в функцию display(product);
Анатомия массива
Каждый отдельный объект, хранящийся в массиве, называется элементом массива, при этом каждый элемент обладает уникальной числовой позицией (индексом), которая может использоваться для обращения к конкретному элементу.
Руководство по actionscript. часть 2, стр. 021
Элементы массива
Каждому элементу массива, как и переменной, можно присвоить любое значение. Таким образом, весь массив похож на совокупность последовательно именованных переменных, но вместо уникального имени каждый элемент обладает номером (номером первого элемента является 0, а не 1). Для работы с соответствующими значениями мы обращаемся к элементам массива по их номеру.
Индексация элементов массива
Позиция элемента в массиве называется его индексом. Индекс элемента используется для присваивания или получения значения этого элемента, а также для выполнения различных действий над этим элементом. В некоторых методах обработки массивов индексы элементов используются для указания диапазона обрабатываемых элементов.
Кроме того, существует возможность добавлять и удалять элементы в начале, конце и даже в середине массива. Массив может иметь промежутки (то есть некоторые элементы могут быть незаполненными). Элементы могут размещаться в позициях 0 и 4, при этом совсем не обязательно, чтобы элементы присутствовали в позициях 1, 2 и 3. Массивы с промежутками называются разреженными массивами.
Размер массива
В любой момент времени своего существования каждый массив содержит определенное количество элементов (как незаполненных, так и заполненных). Количество элементов в массиве называется длиной массива. Это понятие будет рассмотрено чуть далее.
Создание массивов
Для создания нового массива применяется литерал массива или оператор new (то есть new Array ( ) ).
Массивы в других языках программирования. Практически каждый язык программирования высокого уровня поддерживает массивы или похожие на них конструкции. При этом в способах реализации массивов в разных языках есть различия. Например, многие языки не позволяют хранить в массиве данные разных типов. Во многих языках массив может содержать либо числа, либо строки, но хранить в одном массиве значения обоих типов не допускается. Интересно, что в языке С отсутствует примитивный тип данных string. Вместо этого поддерживается односимвольный тип данных char; строки считаются составным типом данных и реализуются в виде массива, состоящего из элементов типа char.
В языке ActionScript размер массива изменяется автоматически при добавлении или удалении элементов. Во многих языках размер массива должен быть указан при первом объявлении, или задании размерности, массива (то есть в тот момент, когда выделяется память для хранения данных массива).
Языки различаются и по тому, что происходит при попытке обращения к элементу, находящемуся за границами (пределами) массива. Если программа попытается присвоить значение элементу, находящемуся за пределами существующих границ массива, язык ActionScript добавит недостающие элементы. Если программа попытается обратиться к элементу, индекс которого лежит за пределами границ массива, то язык ActionScript вернет значение undefined, тогда как язык С, например, не обратит никакого внимания на допустимость указанного номера элемента. Язык программирования С позволяет программе получать и присваивать значения элементам, находящимся за пределами границ массива, что обычно приводит к получению бессмысленных данных, не являющихся частью массива, или к перезаписыванию других данных в памяти.
Создание массивов с помощью литералов
Литерал массива состоит из квадратных скобок, обозначающих начало и конец массива, и элементов, которые перечисляются через запятую внутри квадратных скобок. Вот его обобщенный синтаксис:
[выражение1, выражение2, выражениеЗ]
Сначала вычисляются результаты указанных выражений, а затем полученные результаты присваиваются элементам определяемого массива. В литерале массива могут использоваться любые допустимые выражения, включая вызовы функций, переменные, литералы и даже другие массивы (массив, содержащийся в другом массиве, называется вложенным или двумерным).
Руководство по actionscript. часть 2, стр. 022
Рассмотрим несколько примеров:
// Простые числовые элементы [4, 5. 63]:
// Простые строковые элементы ["apple", "orange", "pear"]
// Числовые выражения с операцией [1. 4, 6 + 10]
// В качестве элементов выступают значения переменных и строки [firstName, lastName, "tall", "skinny"]
// Вложенный литерал массива ["month end days", [31, 30, 28]]
Создание массивов с помощью оператора new
Для создания массива с помощью оператора new используется следующий обобщенный код:
new Array(аргументы)
Результат выполнения этого кода зависит от количества и типа аргументов, передаваемых в конструктор класса Array. Если в конструктор передается несколько
аргументов или один нечисловой, то каждый аргумент становится значением отдельного — момента в новом массиве. Например, следующий код создаст массив с тремя элемс-нтами:
new Array(«sun», «moon», «earth»)
Если в конструктор класса Array передается один числовой аргумент, то будет создан масс и в с указанным количеством незаполненных элементов, значения которым могут быть присвоены позднее (создание подобного массива с помощью литерала оказалось бы достаточно утомительным занятием). Например, следующий код создает массив, состоящий из 14 незаполненных элементов:
new Array(14)
Аргументами, передаваемыми в конструктор класса Array, могут быть любые допустимые выражения, включая составные выражения. Например, следующий код создает массив, первым элементом которого является число 11, а вторым элементом — число 50:
var х:int = 10: var y:int = 5:
var numbers:Array = new Array(x +1, x * y);
Для прямого сравнения следующий код создает массивы из предыдущего раздела, однако вместо литералов массива используется оператор new:
new Array(4. 5. 63)
new Array(«apple». «orange», «pear»)
new Arrayd. 4, 6 + 10)
new Array(firstName. lastName. «tall», «skinny») new Array(«month end days», new Array(31. 30. 28))
Обращение к элементам массива
После создания массива мы, разумеется, захотим получать или изменять значения его элементов. Для этих целей применяется оператор доступа к массиву — [ ].
Руководство по actionscript. часть 2, стр. 023
Получение значения элемента
Для обращения к отдельному элементу массиву используется переменная, ссылающаяся на этот массив, а за ней в квадратных скобках указывается индекс элемента, как показано в следующем коде:
массив[номерЭлемента]
В предыдущем коде массив обозначает ссылку на массив (обычно это переменная, значением которой является массив), а номерЭлемента — это целое число, определяющее индекс элемента. Номером первого элемента является 0, а номер последнего элемента на единицу меньше длины массива. Если указанный номер элемента превышает последний допустимый номер элемента, среда выполнения Flash вернет значение undefined (поскольку указанный индекс находится за пределами границ массива).
Попробуем получить несколько значений элементов. Следующий код создает массив с помощью литерала массива и присваивает его переменной trees:
var trees:Array = ["birch", "maple", "oak", "cedar"]:
Следующий код присваивает переменной firstTree значение первого элемента массива trees («birch»):
var firstTree-.String = trees[0];
Следующий код присваивает значение третьего элемента («oak») переменной f avoriteTree (не забывайте, что индексы начинаются с 0, поэтому элемент с индексом 2 является третьим элементом массива!):
var favoriteTree:String = trees[2]:
Теперь начинается самое интересное. Поскольку индекс элемента можно задавать с помощью любого выражения, возвращающего число, для указания индекса элемента мы можем запросто использовать переменные или сложные выражения вместо обычных чисел. Например, следующий код присваивает значение четвертого элемента («cedar») переменной lastTree:
var i = 3:
var lastTree:String = trees[i]:
В качестве индексов массива мы можем использовать даже выражения вызова, возвращающие числовые значения. Например, следующий код присваивает переменной randomTree случайно выбранный элемент массива trees, индексом которого является случайное число в диапазоне от 0 до 3: ‘
var randomTree:String = trees[Math. floor(Math. random( ) * 4)]:
Прекрасно. Вы можете использовать подобный подход для выбора произвольного вопроса из массива, в котором хранятся тривиальные вопросы, или для выбора случайной карты из массива, представляющего колоду игральных карт.
Руководство по actionscript. часть 2, стр. 024
Обратите внимание, что обращение к элементу массива очень похоже на обращение к значению переменной. Элементы массива могут являться частью любых составных выражений, как показано в следующем примере:
var ages:Array = [12, 4. 90]:
var totalAge:Number = ages[0] + ages[l] + ages[2]; // Сумма значений
// элементов массива
Суммирование значений элементов массива вручную никак нельзя назвать образцом оптимизированного кода. Позднее мы познакомимся с более удобным способом последовательного обращения к элементам массива.
Присваивание значения элементу массива
Чтобы присвоить значение элементу массива, мы используем выражение массив [ но-мерЭлемента ] в качестве левого операнда выражения присваивания. Это демонстрирует следующий код:
// Создание массива
var cities:Array = ["Toronto". "Montreal". "Vancouver". "Waterloo"]:
// массив cities в настоящий момент выглядит так: // ["Toronto". "Montreal". "Vancouver". "Waterloo"]
// Присваиваем значение первому элементу массива
citiesCO] = «London»:
// Массив cities теперь выглядит так:
// ["London". "Montreal". "Vancouver". "Waterloo"]
// Присваиваем значение четвертому элементу массива
cities[3] = «Hamburg»:
// Теперь массив cities выглядит так:
// ["London". "Montreal". "Vancouver". "Hamburg"]
// Присваиваем значение третьему элементу массива cities[2] = 293.3: // Обратите внимание, что изменение типа данных // значения элемента не вызывает никаких проблем // Массив cities теперь выглядит так: // ["London". "Montreal". 293.3. "Hamburg"]
Стоит отметить, что при присваивании значения элементу массива в качестве индекса мы можем использовать любое неотрицательное числовое выражение:
var i :int = 1:
// Присваиваем значение элементу с индексом i cities[i] = «Tokyo»;
// Массив cities теперь выглядит так: ["London". "Tokyo". 293.3. "Hamburg"]
Определение размера массива
У всех массивов есть переменная экземпляра length, обозначающая текущее значение элементов в массиве (включая незаполненные элементы). Для обращения к переменной массива length используется оператор «точка» (.), как показано в следующем коде:
массив.1ength
Рассмотрим несколько примеров:
var 1ist:Array = [34. 45. 57]:
tracedist. length): // Выводит: 3
var words:Array = ["this", "that", "the other"]; trace(words.1ength); // Выводит: 3
var cards:Array = new Array(24); // Обратите внимание, что в конструктор
// класса Array передается один числовой // аргумент
trace(cards. length); // Выводит: 24
Значение переменной массива length всегда на единицу больше индекса последнего элемента данного массива. Например, длина массива, элементы которого имеют индексы 0,1 и 2, равна 3. Длина массива, элементы которого имеют индексы 0,1,
2 и 50, равна 51. Именно 51. Несмотря на то что элементы с индексами в диапазоне от 3 до 49 являются незаполненными, они все равно учитываются при определении длины массива. Индекс последнего элемента массива всегда равен результату выражения массив. length — 1 (поскольку индексы начинаются с 0, а не с 1). Таким образом, для обращения к последнему элементу массива массив применяется следующий код:
массив[массив. length - 1]
При добавлении и удалении элементов значение переменной массива length обновляется автоматически, отражая внесенные изменения. На самом деле мы даже можем сами присвоить переменной length значение, чтобы добавить или удалить элементы в конце массива. Этим переменная length массива отличается от переменной length класса String, которая доступна только для чтения. Уменьшение значения переменной length массива приводит к удалению всех элементов, индексы которых превышают новое значение.
Руководство по actionscript. часть 2, стр. 025
С помощью переменной массива length можно создавать циклы для обхода всех элементов массива. Обход элементов массива в цикле является фундаментальной задачей программирования. Чтобы получить представление о возможностях, открывающихся при совместном использовании циклов и массивов, изучите листинг 11.1, в котором осуществляется обход элементов массива soundtracks с целью нахождения позиции элемента со значением «hip hop».
Листинг 11.1. Поиск значения в массиве
// Создание массива
var soundtracks:Array = ["electronic", "hip hop".
"pop", "alternative", "classical"];
// Проверять каждый элемент, чтобы узнать, содержит ли он значение «hip hop» for (var i:int = 0; i < soundtracks.length: i++) { tracecnow examining element: " + i); if (soundtracks[i] == "hip hop") { tracecthe location of 'hip hop' is index: " + i); break;
}
}
Улучшим код листинга 11.1, превратив его в универсальный метод для поиска, который позволит искать произвольный элемент в любом массиве. Если элемент найден, то данный метод вернет позицию найденного элемента в массиве. В противном случае будет возвращено значение -1. Листинг 11.2 демонстрирует этот код.
Листинг 11.2. Универсальная функция для поиска элемента в массиве
public function searchArray (theArray:Array. searchElement:0bject):int { // Проверять каждый элемент, чтобы определить, совпадает ли // его значение со значением параметра searchElement for (var i:int = 0: i < thearray.length: i++) { if (thearray[i] == searchelement) { return i;
return -1;
}
Чтобы проверить, есть ли имя «Dan» среди имен массива userNames, который представляет собой гипотетический массив с именами авторизованных пользователей, мы можем воспользоваться нашим новым методом для поиска в массиве:
if (searchArray(userNames, «Dan») == -1) {
traceCSorry, that username wasn’t found»); } else {
trace(«Wei come to the game, Dan.»);
}
~ I Метод searchArray() демонстрирует код, который необходим для выполнения обхода А элементов массива в цикле, однако этот код не предназначен для использования в ре-¦ ffo’ альной программе. Для определения индекса заданного элемента в реальной программе используйте методы indexOf() и Iastlndex0f() класса Array.
Руководство по actionscript. часть 2, стр. 026
В оставшейся части этой главы речь пойдет о механизмах работы с массивами, включая использование методов класса Array.
Добавление элементов в массив
Добавить элементы в массив можно одним из следующих способов.
? Присвоить значения новому элементу, индекс которого равен значению длины массива или больше его.
? Увеличить значение переменной массива length.
? Вызвать над массивом методы push( ), unshift ( ), splice ( ) или concat ( ).
Рассмотрим более подробно перечисленные способы.
Непосредственное добавление новых элементов
Чтобы добавить новый элемент к существующему массиву по указанному индексу, мы просто присваиваем значение этому элементу. Этот способ продемонстрирован в следующем коде:
// Создаем массив и добавляем в него три значения var fruits:Array = ["apples", "oranges", "pears"];
// Добавляем четвертое значение fruits[3] = «tangerines»;
Размещать новый элемент сразу за последним элементом массива не обязательно. Если между новым элементом и концом массива можно разместить несколько элементов, среда выполнения Flash автоматически создаст неопределенные элементы для промежуточных индексов:
// Оставить элементы с индексами от 4 до 38 незаполненными fruits[39] = «grapes»;
trace(frunts[12]); // Выводит: undefined
Если элемент уже существует, его значение будет заменено новым значением. Если указанный элемент не существует, то он будет добавлен в массив.
Руководство по actionscript. часть 2, стр. 027
Переменная length
Чтобы расширить массив, не присваивая значений новым элементам, можно просто увеличить значение переменной length, а среда выполнения Flash добавит необходимое количество элементов для достижения указанной длины:
// Создаем массив с тремя элементами var colors = ["green", "red", "blue"];
// Добавляем в массив 47 незаполненных элементов с индексами от 3 до 49 colors. length = 50;
Этот подход можно использовать для создания определенного количества незаполненных элементов, которые будут хранить собираемые данные, например результаты тестов, выполняемых студентами. Хотя элементы являются незаполненными, они позволяют определить, что ожидаемое значение еще не было присвоено. Например, цикл, отображающий результаты тестов на экране, может выводить стандартное сообщение No Score Available (Результат недоступен) для незаполненных элементов.
Методы класса Array
Для выполнения более сложных операций по добавлению элементов можно использовать методы класса Array.
Метод push()
Метод push ( ) добавляет один или более элементов в конец массива. Этот метод автоматически добавляет данные сразу за последним нумерованным элементом массива, поэтому вам не нужно беспокоиться о текущей длине массива. Кроме того, метод push ( ) позволяет добавлять в массив сразу несколько элементов. Метод имеет следующий обобщенный вид:
массив. риьМэлемент!, элемент2… элемент);
В предыдущем коде массив — это ссылка на объект класса Array, а элемент1, эле-мент2. . . элемент — это список элементов, разделенных запятыми, которые добавляются в конец массива и представляют новые элементы. Вот несколько примеров:
// Создаем массив с двумя переменными var menultems:Array = ["home", "quit"];
// Добавляем элемент menultems. push(«products»);
// Массив menultems теперь выглядит так: ["home", "quit", "products"]
// Добавляем два новых элемента
menultems. pushC’services». «contact»);
// Теперь массив menultems выглядит так:
// ["home", "quit", "products", "services", "contact"]
Метод push ( ) возвращает новую длину измененного массива (то есть значение переменной length):
var list:Array = [12. 23. 98]: trace(myList. push(28. 36)):
// Добавляет в массив list значения 28 и 36 и выводит 5
Обратите внимание, что элементы, добавляемые в список, могут быть представлены любым выражением. Выражение вычисляется до того, как элемент будет добавлен в список:
var temperature:int = 22: var sky:String = «sunny»; var weatherListing:Array = new Array( );
// Добавляем значения 22 и «sunny» в массив weatherListing. push(temperature, sky);
Проталкивание, выталкивание и стеки. Метод push ( ) берет свое название из концепции программирования, которая называется стеком. Стек может рассматриваться как вертикальный массив, аналогичный стопке тарелок. Если вы часто посещаете кафетерии или рестораны с буфетами, вам должны быть знакомы пружинные подставки, которые удерживают тарелки для клиентов. Когда появляются чистые тарелки, они буквально проталкиваются на вершину стека, при этом те тарелки, которые уже находились в подставке, опускаются ниже. Когда клиент выталкивает тарелку с вершины стека, он забирает тарелку, которая была добавлена в стек самой последней. Этот тип стека называется «последним пришел — первым вышел» (last-in-first-out — LIFO) и обычно применяется для реализации, например, списков предыстории. Например, если вы нажмете кнопку Назад в своем браузере, то откроется предыдущая просмотренная страница. Если снова нажать кнопку Назад, то откроется страница, которая просматривалась перед предыдущей, и т. д. Такое поведение достигается путем проталкивания URL-адреса каждой просматриваемой страницы в стек и последующего выталкивания адреса из стека при нажатии кнопки Назад.
Руководство по actionscript. часть 2, стр. 028
Примеры LIFO-стеков можно найти и в реальной жизни. Человек, последним сдавший багаж при посадке на самолет, после приземления самолета обычно получает свой багаж первым, поскольку разгрузка багажа осуществляется в порядке, обратном погрузке. Пассажир, сдавший свой багаж первым, после приземления самолета будет вынуждена простоять у ленты багажного транспортера дольше всех.
Стек типа «первым пришел — первым вышел» (first-in-first-out — FIFO) является более эгалитарным. В основе его функционирования лежит обслуживание в порядке поступления. Примером FIFO-стека является очередь в банке. FIFO-стек работает не с последним элементом массива, а с первым. После этого первый элемент массива удаляется, а все оставшиеся элементы «продвигаются» точно так же, как
продвигается очередь, когда человек, стоявший перед вами, «удаляется» (то есть либо он покинул очередь после того, как был обслужен, либо он решил покинуть очередь раньше времени, устав от ожидания). Таким образом, слово «проталкивать» обычно применяется в отношении LIFO-стека, тогда как слово «добавлять» применяется в отношении FIFO-стека. В любом случае элементы добавляются в «конец» стека. Разница заключается в том, какой конец массива хранит элемент для следующей операции.
Метод unshift()
Метод unshif t ( ) во многом похож на метод push ( ), однако он добавляет один или несколько элементов в начало массива, смещая существующие элементы для освобождения пространства (то есть увеличивает индексы существующих элементов, чтобы разместить новые элементы в начале массива). Метод unshi f t ( ) имеет следующий обобщенный вид:
массив. unshi ft(элемент1, элемент2… элемента):
В приведенном коде массив — это ссылка на объект класса Array, а элемент1, эле-мент2. . . элемента — список элементов, разделенных запятыми, которые добавляются в начало массива и представляют новые элементы. Обратите внимание, что элементы добавляются в том порядке, в котором они передаются в метод. Рассмотрим несколько примеров:
var versions:Array = new Array( ); versions[0] = 6:
versions. unshift(5): // Массив versions выглядит так: [5. 6] versions. unshift(2.3.4): // Массив versions выглядит так: [2. 3. 4. 5. 6]
Метод unshif t ( ), как и метод push ( ), возвращает длину увеличенного массива.
Метод splicef)
Метод splice ( ) позволяет добавлять в массив или удалять из него элементы. Этот метод обычно применяется для вставки элементов в середину массива (при этом элементы, находящиеся после точки вставки, перенумеровываются, чтобы освободить пространство для добавляемых элементов) или для удаления элементов из середины массива (при этом перенумеровываются элементы, находящиеся после удаляемых элементов, для ликвидации образовавшегося промежутка). Если обе задачи выполняются одновременно за один вызов метода splice ( ), некоторые элементы массива фактически заменяются новыми элементами (хотя количество добавляемых и удаляемых элементов может не совпадать). Метод sp 1 i се ( ) имеет следующий обобщенный вид:
массив.$рМсе(начальныйИндекс. количествоУдаляемыхЭлементов, элемент1, элемент2… элемента);
В предыдущем коде массив — это ссылка на объект класса Array; начальныйИн-декс — число, определяющее индекс, начиная с которого будут выполняться удаление и необязательное добавление элементов (помните, что индексом первого элемента является 0); количествоУдаляемыхЭлементов — необязательный аргумент, который определяет количество удаляемых элементов (включая элемент с индексом
начальныйИндекс). Если аргумент количествоУдаляемыхЭлементов опущен, все элементы, расположенные после элемента с индексом начальныйИндекс, включая сам элемент с данным индексом, будут удалены. Необязательные параметры элемент1, эле-мент2. . . элементп — объекты, добавляемые в массив в качестве элементов, начиная с индекса начальныйИндекс.