Операторы являются специальными функциями, принимающими один или несколько операндов и возвращающими значения.
Операнд
— это значение, обычно литерал, переменная или выражение, которые оператор использует в качестве входных данных. Например, в следующем программном коде операторы сложения (
+
) и умножения (
*
) используются с тремя литеральными операндами (2, 3
,
4
)
для получения значения. Это значение затем используется оператором присваивания (
=
), чтобы назначить возвращаемое значение, 14, переменной
sumNumber
.
var sumNumber:uint = 2 + 3 * 4; // uint = 14
Операторы могут быть унарными, бинарными или тернарными.
Унарный
оператор принимает один операнд. Например, оператор инкрементального увеличения (
++
) является унарным оператором, поскольку он принимает только один операнд.
Бинарный
оператор принимает два операнда. Например, оператор деления (
/
) принимает два операнда.
Тернарный
оператор принимает три операнда. Например, оператор условия (
?:
) принимает три операнда.
Некоторые операторы являются
перегруженными
; это означает, что они ведут себя по-разному в зависимости от типа или количества переданных ими операндов. Оператор сложения (
+
) является примером перегруженного оператора, который ведет себя по-разному в зависимости от типа операндов. Если оба операнда являются числами, оператор сложения возвращает сумму этих значений. Если оба операнда являются строками, оператор сложения возвращает последовательное соединение двух операндов. В следующем программном коде показано, как оператор по-разному ведет себя в зависимости от операндов.
trace(5 + 5); // 10
trace("5" + "5"); // 55
Поведение операторов также может отличаться в зависимости от числа передаваемых операндов. Оператор вычитания (
-
) является одновременно унарным и бинарным оператором. Если оператор вычитания используется только с одним операндом, оператор меняет его знак и возвращает результат. Если оператор вычитания используется с двумя операндами, он возвращает разность между ними. В следующем примере показан оператор вычитания, используемый вначале как унарный оператор, а затем как бинарный.
trace(-3); // -3
trace(7 - 2); // 5
Старшинство и ассоциативность операторов
Старшинство и ассоциативность операторов определяют порядок, в котором обрабатываются операторы. Хотя может показаться абсолютно естественным для всех, кто знаком с арифметическими операциями, что компилятор должен обрабатывать оператор умножения (
*
) перед оператором сложения (
+
), в действительности компилятору необходимо явное указание того, какие операторы обрабатывать в первую очередь. Такие инструкции обычно упоминаются как
старшинство операторов
. ActionScript определяет старшинство операторов по умолчанию, которое можно изменить с помощью оператора скобки (
()
). Например, в следующем программном коде изменяется заданное по умолчанию старшинство операторов из предыдущего примера, чтобы заставить компилятор обработать оператор сложения перед оператором умножения.
var sumNumber:uint = (2 + 3) * 4; // uint == 20
Могут возникнуть ситуации, в которых в одном выражении встретятся два или больше операторов одного старшинства. В таких случаях компилятор использует правила
ассоциативности
, чтобы определить, какой оператор обрабатывать в первую очередь. Все бинарные операторы, за исключением оператора присваивания, являются
ассоциируемыми слева
, а это значит, что операторы слева обрабатываются раньше, чем операторы справа. Операторы присваивания и оператор условия (
?:
) являются
ассоциируемыми справа
операторами, и это означает, что операторы справа обрабатываются раньше, чем операторы слева.
Например, рассмотрим операторы меньше (
<
) и больше (
>
), имеющие одинаковое старшинство. Если оба оператора используются в одном выражении, оператор слева обрабатывается раньше, поскольку оба оператора являются ассоциируемыми слева. Это означает, что результат выполнения следующих двух инструкций будет одинаков.
trace(3 > 2 < 1); // false
trace((3 > 2) < 1); // false
Оператор «больше» обрабатывается в первую очередь, что приводит к итоговому значению
true
, поскольку операнд 3 больше, чем операнд 2. Значение
true
затем передается оператору «меньше» вместе с операндом 1. В следующем программном коде показано промежуточное состояние.
trace((true) < 1);
Оператор «меньше» преобразует значение
true
в цифровое значение 1 и сравнивает это числовое значение со вторым операндом 1, возвращая значение
false
(значение 1 не меньше значения 1).
trace(1 < 1); // false
Заданную по умолчанию ассоциативность слева можно изменить с помощью оператора скобки. Можно заставить компилятор обрабатывать оператор «меньше» первым, если заключить этот оператор и его операнды в скобки. В следующем примере используется оператор скобки, чтобы получить другой результат, взяв в качестве операндов числа из предыдущего примера.
trace(3 > (2 < 1)); // true
Оператор «меньше» обрабатывается в первую очередь, что приводит к итоговому значению
false
, поскольку операнд 2 не меньше, чем операнд 1. Значение
false
затем передается оператору «больше» вместе с операндом 3. В следующем программном коде показано промежуточное состояние.
trace(3 > (false));
Оператор «больше» преобразует значение
false
в числовое значение 0 и сравнивает это числовое значение с операндом 3, возвращая значение
true
(значение 3 больше, чем 0).
trace(3 > 0); // true
В следующей таблице приведен список операторов ActionScript 3.0 в порядке уменьшения их старшинства. Каждая строка таблицы содержит операторы одинакового старшинства. Каждая строка операторов имеет более высокое старшинство, чем строка, отображающаяся ниже в таблице.
Группа
|
Операторы
|
Основные
|
[] {x:y} () f(x) new x.y x[y] <></> @ :: ..
|
Постфиксные
|
x++ x--
|
Унарные
|
++x --x + - ~ ! delete typeof void
|
Мультипликативные
|
* / %
|
Аддитивные
|
+ -
|
Побитовый сдвиг
|
<< >> >>>
|
Реляционные
|
< > <= >= as in instanceof is
|
Равенство
|
== != === !==
|
Побитовое AND
|
&
|
Побитовое XOR
|
^
|
Побитовое OR
|
|
|
Логическое AND
|
&&
|
Логическое OR
|
||
|
Условие
|
?:
|
Присваивание
|
= *= /= %= += -= <<= >>= >>>= &= ^= |=
|
Запятая
|
,
|
Основные операторы
В число основных операторов входят те операторы, которые используются для создания литералов Array и Object, выражений группирования, функций вызова, инициации экземпляров классов, а также доступа к свойствам.
Все основные операторы, как показано в следующей таблице, имеют одинаковое старшинство. Операторы, являющиеся частью спецификации E4X, показаны с условным знаком (E4X).
Оператор
|
Выполняемая операция
|
[]
|
Инициализируется массив
|
{x:y}
|
Инициализируется объект
|
()
|
Группируются выражения
|
f(x)
|
Выполняется вызов функции
|
new
|
Выполняется вызов конструктора
|
x.y x[y]
|
Выполняется доступ к свойству
|
<></>
|
Инициализируется объект XMLList (E4X)
|
@
|
Выполняется доступ к атрибуту (E4X)
|
::
|
Уточняется имя (E4X)
|
..
|
Выполняется доступ к производному XML-элементу (E4X)
|
Постфиксные операторы
Постфиксные операторы берут какой-либо оператор и либо инкрементально увеличивают, либо декрементально уменьшают его значение. Хотя эти операторы и являются унарными, они классифицируются отдельно от остальных унарных операторов из-за своего высокого старшинства и особого поведения. Если постфиксный оператор используется как часть более крупного выражения, значение выражения возвращается до обработки этого оператора. Например, в следующем программном коде показано, что значение выражение
xNum++
возвращается до того, как значение инкрементально увеличивается.
var xNum:Number = 0;
trace(xNum++); // 0
trace(xNum); // 1
Все постфиксные операторы, как показано в следующей таблице, имеют одинаковое старшинство.
Оператор
|
Выполняемая операция
|
++
|
Инкрементально увеличивает (постфиксный)
|
--
|
Декрементально уменьшает (постфиксный)
|
Унарные операторы
Унарные операторы получают один операнд. Операторы инкрементального увеличения (
++
) и декрементального уменьшения (
--
) в этой группе являются
префиксными
операторами
, и это означает, что они могут появляться перед операндами в выражении. Префиксные операторы отличаются от своих постфиксных эквивалентов тем, что операции инкрементального увеличения и декрементального уменьшения выполняются перед возвращением значения всего выражения. Например, в следующем программном коде показано, что значение выражение
++xNum
возвращается до того, как значение инкрементально увеличивается.
var xNum:Number = 0;
trace(++xNum); // 1
trace(xNum); // 1
Все унарные операторы, как показано в следующей таблице, имеют одинаковое старшинство.
Оператор
|
Выполняемая операция
|
++
|
Инкрементально увеличивает (префиксный)
|
--
|
Декрементально уменьшает (префиксный)
|
+
|
Унарный +
|
-
|
Унарный — (отрицание)
|
!
|
Логическое NOT
|
~
|
Побитовое NOT
|
delete
|
Свойство удаляется
|
typeof
|
Возвращается информация о типе
|
void
|
Возвращается значение undefined
|
Мультипликативные операторы
Мультипликативные операторы получают два операнда и выполняют умножение, деление или вычисление модуля.
Все мультипликативные операторы, как показано в следующей таблице, имеют одинаковое старшинство.
Оператор
|
Выполняемая операция
|
*
|
Умножение
|
/
|
Деление
|
%
|
Вычисление модуля
|
Аддитивные операторы
Аддитивные операторы получают два операнда и выполняют операции сложения или вычитания. Все аддитивные операторы, как показано в следующей таблице, имеют одинаковое старшинство.
Оператор
|
Выполняемая операция
|
+
|
Сложение
|
-
|
Вычитание
|
Операторы побитового сдвига
Операторы побитового сдвига получают два операнда и сдвигают биты первого операнда на величину, указанную во втором операнде. Все операторы побитового сдвига, как показано в следующей таблице, имеют одинаковое старшинство.
Оператор
|
Выполняемая операция
|
<<
|
Побитовый сдвиг влево
|
>>
|
Побитовый сдвиг вправо
|
>>>
|
Побитовый сдвиг вправо без знака
|
Реляционные операторы
Реляционные операторы получают два операнда, сравнивают их значения, а затем возвращают логическое значение (Boolean). Все реляционные операторы, как показано в следующей таблице, имеют одинаковое старшинство.
Оператор
|
Выполняемая операция
|
<
|
Меньше
|
>
|
Больше
|
<=
|
Меньше или равно
|
>=
|
Больше или равно
|
as
|
Проверяется тип данных
|
in
|
Проверяются свойства объекта
|
instanceof
|
Проверяется цепочка прототипа
|
is
|
Проверяется тип данных
|
Операторы равенства
Операторы равенства получают два операнда, сравнивают их значения, а затем возвращают логическое значение (Boolean). Все операторы равенства, как показано в следующей таблице, имеют одинаковое старшинство.
Оператор
|
Выполняемая операция
|
==
|
Равенство
|
!=
|
Неравенство
|
===
|
Строгое равенство
|
!==
|
Строгое неравенство
|
Побитовые логические операторы
Побитовые логические операторы получают два операнда и выполняют логические операции на битовом уровне. Побитовые логические операторы отличаются по старшинству и перечислены в следующей таблице в порядке убывания старшинства.
Оператор
|
Выполняемая операция
|
&
|
Побитовое AND
|
^
|
Побитовое XOR
|
|
|
Побитовое OR
|
Логические операторы
Логические операторы получают два операнда и возвращают логическое значение (Boolean). Логические операторы отличаются по старшинству и перечислены в следующей таблице в порядке убывания старшинства.
Оператор
|
Выполняемая операция
|
&&
|
Логическое AND
|
||
|
Логическое OR
|
Оператор условия
Оператор условия является тернарным оператором, и это значит, что ему передается три операнда. Оператор условия — это экспресс-метод применения инструкции условного выбора
if..else
.
Оператор
|
Выполняемая операция
|
?:
|
Условие
|
Операторы присваивания
Операторы присваивания получают два оператора и присваивают значение одному оператору на основе значения другого оператора. Все операторы присваивания, как показано в следующей таблице, имеют одинаковое старшинство.
Оператор
|
Выполняемая операция
|
=
|
Присваивание
|
*=
|
Присваивание умножения
|
/=
|
Присваивание удаление
|
%=
|
Присваивание модуля
|
+=
|
Присваивание сложения
|
-=
|
Присваивание вычитания
|
<<=
|
Присваивание побитового сдвига влево
|
>>=
|
Присваивание побитового сдвига вправо
|
>>>=
|
Присваивание побитового сдвига вправо без знака
|
&=
|
Присваивание побитового AND
|
^=
|
Присваивание побитового XOR
|
|=
|
Присваивание побитового OR
|
|
|
|