Операторы

Операторы являются специальными функциями, принимающими один или несколько операндов и возвращающими значения. Операнд — это значение, обычно литерал, переменная или выражение, которые оператор использует в качестве входных данных. Например, в следующем программном коде операторы сложения ( + ) и умножения ( * ) используются с тремя литеральными операндами (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