Служебные операторы

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

Инициализаторы литералов
Литералом в программировании называется буквальная константа. Это выражение, символьное отображение которого одновременно является источником информации о его значении. Например, последовательность символов 33 является числовым литералом. Прочитав его, интерпретатор «поймет», что некоторой переменной или свойству нужно присвоить значение 10001 (число 33 в двоичной форме — только с такими числами умеет работать компьютер).

Помимо чисел, в ActionScript в литеральной форме могут быть заданы объекты, функции, массивы и строки, булевы величины, NaN, undefined, null. Зачастую для этого используются специальные операторы, называемые инициализаторами литералов.

Литералом строки является любой текст, взятый в кавычки.


Кавычки могут быть как одинарные, так и двойные. Например:

var str:String="Привет"; // "Привет" – строковый литерал

Литералом массива является список разделенных запятыми элементов (литералов, переменных, объектов или клипов), взятый в квадратные скобки:

var arr:Arreay=[1,2,3]; // [1,2,3] – литерал массива

При интерпретации кода ActionScript-программы на основании литерала массива будет создан точно такой же объект класса Array, как если бы был использован соответствующий конструктор:

При помощи литеральной записи можно создать и объект класса Object. Для этого список разделенных запятыми пар свойство—значение должен быть прописан в фигурных скобках:

var obj:Object={a:1,b:1,c:1}; // {a:1,b:1,c:1} – литерал объекта

Литеральная запись позволяет создавать объекты, набирая куда меньше кола, чем с использованием конструктора Object():

var obj:Object=new Object();
obj.a=1, obj.b=2, obj.c=3;

Оператор группирования
Оператор группирования «()» предназначен для принудительного задания последовательности вычислений. По сути, он выполняет операцию смены приоритетов операторов в выражении.


Например:

trace((2+3)*5); // Выводит: 25 (сложение выполняется раньше
// умножения, хотя "*" имеет больший приоритет, чем "+")

Оператор группирования может оказаться чрезвычайно полезным, если вы не уверены в том, какой из операторов в выражении будет просчитан раньше. Расставив круглые скобки в том порядке, в котором должно быть вычислено выражение, вы гарантируете отсутствие ошибок.

Операторы доступа к свойствам
В ActionScript получить доступ к свойству объекта можно, используя или точечный, или скобочный синтаксис.

Оператор «.» требует задания свойства как идентификатора. Например:

var obj:Object={a:1, b:2, c:3};
trace(obj.a); // Выводит: 1

Оператор «[]» принимает имя необходимого свойства в виде строки:

trace(obj["a"]); // Выводит: 1

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

var obj:Object={};
obj["1+1"]="Привет!!!"; // Создаем свойство с именем 1+1
trace(obj ["1+1"]); // Выводит: Привет!!!

Особенностью операторов доступа к свойствам является то, что они преобразуют свой левый операнд к типу object.


Благодаря этому величины элементарных типов string, number, boolean могут обращаться к методам и свойствам классов String, Number, Boolean.

Очень часто оператор «[]» называют оператором доступа к элементам массива. Это не совсем верно, так как массивы ActionScript являются обычными объектами, единственной особенностью которых является то, что имена их свойств имеют вид чисел. Но такие свойства можно задать и в случае объектов класса Object и (можете это проверить) объектов всех остальных классов. Однако из этого не следует, что по своей структуре объекты являются массивами. Дело в том, что во внутреннем представлении объектов имена свойств сохраняются в строковом представлении. Поэтому, если мы введем arr[0]=1, не будет создан элемент массива arr с индексом 0. При этом произойдет создание свойства с именем «0», связанного со значением 1. То, что свойства объектов Action-Script сохраняются в виде строковых ключей, не позволяет их отнести к массивам, доступ к элементам которых должен осуществляться по целочисленным ключам. Более корректно их считать ассоциативными массивами. Таким образом, оператор «[]» не является оператором доступа к элементам массивов, так как такой структуры данных в Action-Script просто нет.

Оператор вызова функции
Для того чтобы вызвать некоторую функцию, нужно ввести после ее имени специальный оператор в виде круглых скобок. В том случае, если функция принимает параметры, их список должен быть добавлен в оператор «()». Никаких различий в том, как вызываются пользовательские и встроенные функции, не существует.

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

trace(1); // Выводит: 1 (происходит вызов функции trace())
trace(trace); // Выводит: [type Function] (обращение к функции как
// к объекту)

Оператор new
Оператор new в ActionScript предназначен для создания нового объекта класса. Соответственно в записи он должен предшествовать функции-конструктору класса. Например:

var arr:Array=new Array(); // Так создается пустой массив

Если вызвать функцию-конструктор без оператора new, то возможны два варианта. Если это конструктор встроенных классов Number, String, Object, Boolean, то будет осуществлено преобразование типа переданного параметра. В случае остальных классов результатом будет, скорее всего, undefined (исключение представляет использование конструкторов классов для определения того, относится ли к классу объект данных):

trace(Boolean(1)); // Выводит: true
trace(Sound()); // Выводит: undefined
trace(TextField(new TextFormat())) // Выводит: [object Object]

Оператор super
Оператор super позволяет получить доступ к методу надкласса из кода метода подкласса. Это бывает необходимо, если надклассу и подклассу присущи методы с одинаковыми именами. Кроме того, используя super, можно обратиться к конструктору надкласса из кода конструктора подкласса.

Оператор delete
Оператор delete предназначен для удаления значения переменной. Точнее, оно заменяется встроенной константой undefined:

var per:String="Привет!!!";
delete per;
trace(per); // Выводит: undefined

В том случае, если удаление оказывается успешным, оператор delete возвращает true. Если же объект данных не существует, защищен от удаления или расположен вне области видимости, то возвращаемый результат — false:

var per:String="Привет!!!";
trace(delete per); // Выводит: true (строковое значение удаляется
// без затруднений)
trace(delete _root); // Выводит: false (удалить объект типа movieclip
// невозможно)

При использовании оператора delete по отношению к переменной, хранящей составной объект данных, удаляется не он сам, а лишь ссылка на него. Вообще удалить напрямую объект типа object невозможно: это можно сделать лишь косвенно, уничтожив все ссылки на него. При этом система удалит его автоматически, как засоряющий память. Чтобы удалить клип, нужно использовать метод removeMovieClip().

Оператор typeof
Оператор typeof предназначен для определения типа объекта данных. Как вы помните, в Action-Script имеется 7 типов данных: null, undefined, string, number, boolean, object и movieclip. Первые пять из них являются элементарными, последние два — составными. Оператор typeof возвращает строку с названием типа, к которому относится переданный объект данных:

trace(typeof 1); // Выводит: number
trace(typeof _root); // Выводит: movieclip

Хотя функции формально относятся к типу object, они столь специфичны, что для них оператор typeof возвращает специальное значение:

trace(typeof trace); // Выводит: function

Очень частая ошибка связана с попыткой использования оператора typeof для определения класса объекта. Важно понимать, чем тип объекта данных отличается от его класса. Тип — это характеристика внутренней структуры объекта данных. Класс — это понятие, связанное с концепцией наследования. Все объекты данных имеют тип, но далеко не все относятся к какому-либо классу.

Чтобы определить не тип, а класс объекта, нужно использовать оператор instanceof.

Оператор instanceof
Оператор instanceof предназначен для проверки того, не входит ли неь класс в цепочку наследования объекта. Его синтаксис:

object instanceof class,

где:
• оbject — объект, принадлежность которого к некоторому классу должна быть установлена;

• class — идентификатор конструктора интересующего класса (ввиду особенностей используемого оператором instanceof алгоритма его нельзя представлять в виде строки).

Если объект object наследует методы и ев' возвращает true. Иначе результат — false:

class, оператор instanceof
trace(_root instanceof MovieClip); // Выводит: true (основная временная
// диаграмма является клипом)
trace(_root instanceof String); // Выводит: false

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

trace(_root instanceof Object); // Выводит: true (_root принадлежит
//классам MovieClip, надклассом которого является Object)

В ActionScript методы и свойства таких классов, как Number, String и Boolean, применимы к величинам соответствующих элементарных типов, а не только к относящимся к ним объектам (за счет того, что операторы доступа к свойствам автоматически проводят преобразование к типу object):

trace("Привет".length); // Выводит: 6 (литерал строки не является объектом
// класса String)

В противоположность им оператор instanceof может работать только с объектами:

trace("Привет!!!" instanceof String); // Выводит: false
trace(new String("Привет!!!") instanceof String); // Выводит: true

Оператор void
Пожалуй, оператор void — это самый странный и, в общем, маловостребованный оператор ActionScript.

Его функции сводятся к вычислению переданного выражения с возвращением undefined:

trace(void _root); // Выводит: undefined

Единственное применение, которое можно найти для оператора void, — это заменить им константу undefined при определении того, существует ли переменная или свойство:

if (per = void per) {
trace("Переменная не определена!"); )
} //

В Output отображается: Переменная не определена!

Впрочем, приведенный пример вряд ли можно считать реалистичным.

Вы можете спросить, зачем, если оператор void столь бесполезен, он был введен в язык? Дело в том, что ActionScript создан на основании спецификации ECMAScript, требующей наличия такого оператора (а о правильности выбора стандарта можно спорить до бесконечности). Абсолютно излишний в ActionScript оператор void чрезвычайно полезен в случае Web-скриптов (таких как JavaScript). Например, в справочнике по JavaScript так описывается оператор void: «Во всех броузерах, поддерживающих сценарии, можно использовать запись javascript: Псевдо-URL для определения параметра атрибутов HREF и SRC в тегах HTML (например, ссылок). В работе с данным выражением необходимо быть внимательным, так как функция и операторы, вызываемые в URL, не возвращают и не принимают любое значение. Если значение такого выражения возвращено, то им часто заменяется содержимое страницы. Для того чтобы этого не происходило, перед функцией или выражением используют оператор void».

Вы не все поняли из приведенного описания? Не огорчайтесь. Нам достаточно знать, что в Action-Script оператор void — это просто рудимент, доставшийся в наследство от ЕСМА-262. Не нужно путать оператор void с указателем на то, что функция не должна возвращать значений Void. Ничего общего, помимо названия, у них нет.

Оператор «запятая»
Оператор «,» предназначен для того, чтобы в одном предложении можно было выполнить несколько несвязанных выражений. Наиболее часто он используется, если необходимо задать или переопределить сразу несколько переменных:

var a:Number = 0, b:Number = 1, c:Nunber = 2;
trace(b); // Выводит: 1

Кроме того, запятая может быть полезна, если в одном цикле for необходимо задать два итератора с различающимся шагом:

for (var i=0, j=0; i<100; i++, j+=2) {
}

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

trace(("Привет", "Пока")); // Выводит: Пока

Также оператор «,» используется для задания списка аргументов при создании и вызове функции.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Арифметические операторы
Виды операторов
Логические операторы
Операторы равенства и сравнения
Поразрядные операторы

Вернуться в раздел: Action Script / 5. Операторы