Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Web-дизайн 1 часть / Литература / ActionScript 2.0. Программирование во Flash MX 2004.pdf
Скачиваний:
354
Добавлен:
26.03.2015
Размер:
8.81 Mб
Скачать

Глава 7

Массивы (класс Array)

Массив (Array) — это объект особого типа данных, имеющегося во всех языках программирования высокого уровня. Он представляет собой упорядоченную совокупность объектов данных, рассматриваемую как единое целое. В ActionScript не существует массивов как объектов отдельного типа данных. Массивы в нем являются обычными объектами типа object, относящимися к классу Array. По целому ряду причин (которые мы обсудим в разделе 7.13) массивы ActionScript не являются полноценными массивами в принятом в программировании понимании. Однако все отличия между массивами ActionScript и, например, Java касаются особенностей реализации, по форме же использования и назначению они абсолютно идентичны. Поэтому во многих книгах по ActionScript объекты класса Array относят к отдельному типу данных.

Понятие «массив» в программировании идентично понятию «матрица» в математике. Так как массивы ActionScript одномерны, то им соответствуют векторы (матрицы-столбцы). Адресация элементов в матрице осуществляется при помощи целочисленных индексов. Аналогичным образом индексируются и элементы массива. Первый его элемент является свойством с именем «0», второй

— с именем «1» и т. д. Отсчет элементов от 0, а не от 1 может показаться странным людям, не знакомым с программированием. Однако именно с нуля начинается индексирование в большинстве языков, что связано с тем, что 0 — это наименьшее двоичное число.

Элементами массива ActionScript могут быть любые объекты данных: числа, строки, объекты или массивы. В принципе, элемент массива по своим особенностям практически полностью соответствует переменной. Поэтому массив можно, упрощая, считать совокупностью переменных.

Если вы новичок в программировании, то представьте массив в виде шкафа с определенным числом полок. Полки последовательно пронумерованы, и каждая изних может хранить некоторый предмет. Чтобы извлечь нужный предмет, совсем не обязательно помнить его название. Достаточно знать, на какой он полке лежит. Схема массива arr, хранящего в качестве элементов число 3, объект obj, строку «Привет» и клип mov, приведена на рис. 7.1.

 

Массивы незаменимы тогда, когда возникает потребность в хра-

 

нении и обработке нескольких (или большого числа) схожих

 

объектов данных. С массивами мы уже встречались в двух пре-

 

дыдущих проектах. В этой главе мы дополним имеющиеся прак-

 

тические навыки необходимыми теоретическими познаниями.

Рис. 7.1. Схема массива

7.1. Создание массивов

Массивы являются объектами класса Array. Поэтому создать их, как и объекты любых других классов, можно, используя функцию-конструктор и ключевое слово new:

var arr:Array=new Array[]; // Код создает пустой массив

Особенностью функции Аггау() является то, что она возвращает массив, даже если оператор new и не был задействован. По этой причине в словаре ActionScript она отнесена к функциями преобразования типа данных, хотя таковой реально не является.

var arr:Array=Array[);

// Ключевое слово new не используется

trace(arr instanceof Array};

//

Выводит: true (arr является объектом

 

//

класса Array)

Если элементы массива известны в момент его создания и число их невелико, то они могут быть

прописаны в качестве параметров конструктора Аггау(). Последовательность их задания будет сохранена. Например:

var arr:Array=new Array(1,2,3,4,5); trace(arr); // Выводит: 1, 2, 3, 4, 5

Так как оператор «,» обладает самым низким приоритетом среди операторов ActionScript, то параметром конструктора Аггау() может быть целое выражение: оно вычислится до того, как интерпретатор перейдет к рассмотрению следующего аргумента.

Число элементов массива практически не ограничено. Максимальное их количество составляет 4 294 967 296 (232). Вряд ли можно придумать задачу, в которой лимит на число элементов массива оказался бы превышен, Да и такие ограничители, как предельное время выполнения кода и объем отведенной оперативной памяти, не позволят вам достичь даже сотой части из возможных четырех миллиардов элементов.

Конструктор Аггау() имеет и альтернативный описанному выше синтаксис. Если в качестве параметра ему передано только одно целое положительное число N, то он создает массив из N пустых элементов (реально элементы созданы не будут — просто произойдет присваивание свойству length массива значения N):

var arr:Array=new Array(5);

trace (arr); // Выводит: undefined,undefined,undefined,undefined,undefined

To, что конструктор Аггау() имеет два варианта задания параметров, означает, что вы не можете создать массив с единственным элементом, если он является числом. Чтобы это сделать, нужно использовать литерал массива или же задать значение элемента отдельно от объявления массива.

На практике массивы редко создаются при помоши конструктора Аггау(). Гораздо чаще для этого используются литералы массивов, формируемые при помощи специального инициализатора «[]». Список элементов в этом случае должен быть прописан внутри квадратных скобок точно так же, как и при создании массива с использованием конструктора Аrrау(). Например:

var arr:Array=[l,2,3,4,5]; //

Создаем литерал массива

tracetarr instanceof Array); //

Выводит: true (arr действительно является

//

объектом класса Array)

trace(arr); // Выводит: 1, 2, 3, 4, 5

В отличие от конструктора Аrrау(), если в литерале массива имеется только один элемент и он является числом, то массив из пустых элементов соответствующей ему длины создан не будет:

trace([5]); // Выводит: 5

В качестве элементов списка внутри литерала массива могут использоваться не только литералы и идентификаторы, но и любые выражения. При формировании массива они будут автоматически вычислены:

var arr:Array=[2*2, Math.random(), "При"+"вет"]; trace(arr); // Выводит: 4, 0.764446393121034, Привет

7.2. Извлечение и переопределение элементов массива

Прочитать значение объекта класса Array можно точно так же, как и величину свойства объекта любого другого класса: используя оператор доступа к свойствам. Так как индексы массивов являются числами, то применить для решения этой задачи оператор «.» нельзя (он требует задания имени свойства в виде идентификатора, а идентификатор не может начинаться с цифры). Прочитать значение элемента массива можно, применив оператор доступа к свойствам по строковым ключам «[]». Например:

var arr:Array=["Привет","Пока"];

trace(arr[0]); // Выводит: Привет (индекс задан в виде числа) trace(arr["1")); // Выводит: Пока (индекс задан в виде строки)

Как видно из приведенного примера, нет никакой разницы в том, в строковом или в численном виде представлен индекс элемента, Это связано с тем, что в любом случае алгоритмом оператора «[]» проводится преобразование типа переданного операнда к строковому типу. Немного позже мы покажем, что индексы массивов являются точно такими же свойствами объектов, как и любые другие — и все различие заключается в том, что их имена образованы символами цифр.

В качестве операнда оператора «[]» может быть использован не только литерал, но и некоторое выражение, результатом вычисления которого является целое число или строка из цифр:

var arr:Array=[l,2,3];

trace(arr[Math.sin(Math.PI/2)]); // Выводит: 2 (sin<90°) =0)

При обращении к несуществующему элементу массива результатом будет undefined.

Переопределить элемент массива, как и любое другое свойство объекта, можно, используя оператор «=» (или другой оператор присваивания):

var arr:Array=[l,2,3]; arr [1]="Привет";

trace(arr); // Выводит: 1, "Привет", 3

В отличие от большинства языков программирования, длина массива в ActionScript не фиксируется при его определении. Поэтому создать массив можно и поэлементно:

var arr:Array=[];

// Создаем пустой массив

агг[0]=1;

// в массиве 1

элемент

агг[1]=2;

// в массиве 2

элемента

trace (arr);

// Выводит: 1,

2

Так как массив является обычным объектом, то его свойства могут иметь вид не только целочисленных индексов, но и адресоваться совершенно любыми строками. Например:

var arr:Array=[l,2];

//

Присваиваем массиву arr свойство property

arr.property=3;

trace(arr);

//

Выводит: 1, 2 (трассируются только свойства-индексы)

trace(arr-property); //

Выводит: 3

Принципиальных отличий между свойствами-индексами и простыми свойствами не существует. Они проявляются только в том, что методы и свойства класса Array работают со свойствамииндексами, игнорируя остальные свойства массива.

7.3. Длина массива. Свойство length

Длина массива — это число его элементов. В ActionScript узнать, сколько элементов содержит массив, можно, используя свойство length класса Array:

var arr:Array=[l,2,3]; trace(arr.length); // Выводит: 3

Если массив не содержит элементов, то его длина равна 0.

Так как отсчет элементов массива ведется с 0, то его длина будет всегда на единицу больше индекса последнего элемента. Это нужно учитывать при использовании свойства length в расчетах.

В отличие от массивов таких языков, как С или Pascal, массивы ActionScript не требуют задания

длины при их создании. Длина массивов может динамически меняться в процессе работы сценария. Модифицироваться при этом будет и свойство length:

var arr :Array= [1, 2, 3]; //

Массив из трех элементов

rr[5J=6;

//

Добавляем элемент с индексом 5

race(arr.length);

//

Выводит: 6 (промежуточные элементы были созданы

trace(arr);

//

автоматически)

//

выводит: 1, 2, 3, undefined, undefined, 6

Приведенный пример иллюстрирует интересную особенность, связанную с добавлением в массив нового элемента. Мало того, что при этом меняется длина массива, но и, если новый элемент не примыкает вплотную к последнему элементу массива, все промежуточные элементы создаются автоматически со значением undefined. Впрочем, стоит проверить, действительно ли все происходит именно так. Для этого перечислим все реально существующие элементы массива при по-моши

цикла for—in:

var arr:Array = [1, 2, 3]; arr[5] = 6;

for (var i in arr) {

trace(); // Выводит: 5, 2, 1, 0

}

Проведенная проверка показала, что наше предположение оказалось неверным. Промежуточные элементы не создаются автоматически. Они просто физически не существуют — поэтому при обращении к ним возвращается undefined. Полученный же при трассировке результат связан с тем, что алгоритм, переводящий массив в строку, опирается не на реально имеющиеся элементы, а на свойство length.

В отличие от свойства length класса String, свойство length класса Array может быть переопределено. При этом, если новое его значение превышает количество элементов в массиве, то в коней массива будут добавлены новые элементы со значением undefined (вернее, создастся иллюзия этого в результате изменения длины массива). Если же length присваивается значение, меньшее количества реально имеющихся в массиве элементов, то все лишние элементы будут удалены:

var arr:Array=[l,2,3);

arr.length=5; // Увеличиваем длину массива на два элемента

trace(arr);

//

Выводит: 1, 2, 3, undefined, undefined ("создано" два

 

//

элемента со значением undefined)

arr.length=l; //

Уменьшаем длину массива до одного элемента

trace(arr);

//

Выводит: 1

Как уже указывалось выше, массивы ActionScript являются обычными объектами их элементы — это просто свойства, имена которых образованы цифрами. Однако это не означает, что свойство length учитывает все свойства массива. Наоборот, элементом массива считается только свойство, имеющее вид целого числа:

var arr:Array=[1,2,3);

//

Создаем массив из грех элементов

arr.рrореrty="Привет!"; //

Добавляем к массиву свойство

trace(arr.length);

//

Выводит:

3 (наличие свойства никак не повлияло

 

//

на длину

массива)

На практике свойство length обычно используется, если в цикле необходимо просмотреть все элементы массива. Кроме того, оно может быть полезно, если элемент должен быть добавлен в конец массива или же если некоторое действие должно быть выполнено при определенной длине массива.

7.4. Добавление элементов в массив

Существует несколько типов задач, связанных с добавлением в массив элементов — и каждая из них имеет индивидуальные методы решения. Перечислим эти задачи:

элемент или группу элементов нужно добавить в начало массива;

элемент или группу элементов нужно добавить в конец массива;

элемент или группу элементов нужно вставить в середину массива.

Наиболее просто (ввиду отсутствия альтернатив) решается первая задача. Для того чтобы добавить в начало массива элемент или группу элементов, нужно использовать метод unshift(). Его синтаксис:

myArray.unshift (valuel, value2... valueN),

где:

myArray массив, в который должны быть добавлены элементы;

value1, value2, …, valueN Список элементов в том порядке, в котором их необходимо

присоединить к массиву.

Записав результат добавления элементов в массив в переменной myArray, метод unshiftO возвращает значение длины полученного массива.

Пример использования метода unshift():

var arr:Array=[l,2,3];

trace(arr.unshift(-2,-l,0)); // Выводи: 6 (длина массива arr

// после добавления трех элементов) trace(arr); // Выводит: -2, -1, 0, 1, 2, 3

Из трех рассматриваемых в этом разделе задач наиболее важна для практики та, которая связана с добавлением элемента или группы элементов в конец массива. Она имеет целых три способа решения.

Если к массиву должен быть присоединен только один элемент, то наиболее рационально сделать это, не обращаясь к специальным методам класса Array, а добавив его напрямую, по индексу. Например:

var arr:Array=[l,2,3]; arr[arr.length)=arr.length+1; trace(arr); // Выводит: 1, 2, 3, 4

Если в конец массива требуется добавить несколько элементов, то лучше всего применить метод push(). Его синтаксис и возвращаемое им значение точно такие же, как и у рассмотренного ранее метода unshift(). Пример:

var arr:Array=[l,2,3];

 

Выводит: 6 (длина массива

trace(arr.push(4,5,6)); //

trace(arr);

//

после добавления элементов)

//

Выводит: 1, 2, 3, 4, 5, 6

Чтобы добавить элемент или группу элементов в середину массива, нужно использовать метод splice(). Его синтаксис:

myArray.splice(start, deleteCcunt, valueO, value1...valueN),

где:

myArray модифицируемый массив;

start — индекс элемента, с которого должна начаться вставка элементов или же удаление уча-

стка массива;

deleteCount — число элементов массива, которые должны быть удалены, начиная от элемента

Соседние файлы в папке Литература