Operatory

Operatory to specjalne funkcje, które przyjmują jeden lub więcej operandów i zwracają wartość. Operand jest to wartość — zwykle literał, zmienna lub wyrażenie — na której operuje operator. Na przykład w poniższym kodzie zastosowano operatory dodawania ( + ) i mnożenia ( * ) wraz z trzema operandami literalnymi (2, 3 i 4 ) w celu zwrócenia wartości. Wartość ta, 14, jest następnie używana z operatorem przypisania ( = ) w celu przypisania jej do zmiennej sumNumber .

var sumNumber:uint = 2 + 3 * 4; // uint = 14

Wyróżnia się operatory jedno-, dwu- i trójargumentowe. Operator jednoargumentowy ma jeden operand. Przykładem operatora jednoargumentowego jest operator inkrementacji ( ++ ), który przyjmuje tylko jeden operand. Operator dwuargumentowy ma dwa operandy. Przykładem operatora dwuargumentowego jest operator dzielenia ( / ), który przyjmuje dwa operandy. Operator trójargumentowy ma trzy operandy. Przykładem operatora trójargumentowego jest operator warunkowy ( ?: ), który przyjmuje trzy operandy.

Niektóre operatory są przeciążone , co oznacza, że ich zachowanie zależy od typu lub liczby przekazanych do nich operandów. Przykładem operatora przeciążonego jest operator dodawania ( + ), który działa różnie w zależności od typu danych operandów. Jeśli oba operandy są liczbami, operator dodawania zwraca sumę wartości. Jeśli oba operandy są ciągami znaków, operator dodawania zwraca ciąg znaków będący konkatenacją obu operandów. Poniższy przykładowy kod ilustruje różne zachowanie operatora w zależności od typu operandów:

trace(5 + 5); // 10 
trace("5" + "5"); // 55

Działanie operatorów może być także uzależnione od liczby przekazanych operandów. Operator odejmowania ( - ) jest zarówno jedno-, jak i dwuargumentowy. Gdy jest używany z jednym operandem, zmienia znak tego operandu. Gdy jest używany z dwoma operandami, zwraca różnicę między operandami. Poniższy przykład ilustruje użycie operatora odejmowania najpierw jako operatora jednoargumentowego, a następnie jako operatora dwuargumentowego.

trace(-3); // -3 
trace(7 - 2); // 5

Priorytet i łączność operatorów

Priorytet i łączność operatorów decydują o kolejności ich przetwarzania. Mimo że dla każdego, kto uczył się arytmetyki, oczywistością jest, że kompilator powinien wykonywać operację mnożenia ( * ) przed operacją dodawania ( + ), to kompilator i tak musi otrzymać jednoznaczne instrukcje co do kolejności przetwarzania. Instrukcje takie nazywamy łącznie priorytetem operatorów . W języki ActionScript zdefiniowany jest domyślny priorytet operatorów, który programista może zmienić, korzystając z nawiasów ( () ). Na przykład poniższy kod modyfikuje domyślny priorytet (obowiązujący w poprzednim przykładzie), aby wymusić na kompilatorze przetworzenie operatora dodawania przed operatorem mnożenia:

var sumNumber:uint = (2 + 3) * 4; // uint == 20

Zdarza się, że w jednym wyrażeniu występują dwa lub większa liczba operatorów o tym samym priorytecie. W takich przypadkach kompilator stosuje zasady łączności w celu określenia kolejności przetwarzania operatorów. Wszystkie operatory dwuargumentowe, z wyjątkiem operatorów przypisania, są lewostronne , co oznacza, że operatory po lewej stronie są przetwarzane przed operatorami po prawej stronie. Operatory przypisania i operator warunkowy ( ?: ) są prawostronne , co oznacza, że operatory po prawej stronie są przetwarzane przed operatorami po lewej stronie.

Rozważmy na przykład operator mniejszości( < ) i większości ( > ), które mają ten sam priorytet. Jeśli oba operatory zostaną użyte w tym samym wyrażeniu, operator po lewej stronie zostanie przetworzony jako pierwszy, ponieważ oba operatory są lewostronne. Oznacza to, że następujące dwie instrukcje dadzą ten sam wynik:

trace(3 > 2 < 1); // false 
trace((3 > 2) < 1); // false

W pierwszej kolejności przetwarzany jest operator większości, co daje w wyniku wartość true , ponieważ operand 3 jest większy od operandu 2. Wartość true jest następnie przekazywana do operatora mniejszości wraz z operandem 1. Poniższy kod odzwierciedla ten stan pośredni:

trace((true) < 1); 

Operator mniejszości konwertuje wartość true na wartość liczbową 1 i porównuje tę wartość liczbową z drugim operandem 1, co w wyniku daje wartość false (ponieważ 1 nie jest mniejsze od 1).

trace(1 < 1); // false

Nawiasy umożliwiają domyślnej łączności lewostronnej. Można nakazać kompilatorowi, by przetwarzał operator mniejszości w pierwszej kolejności. W tym celu należy ująć ten operator i jego operandy w nawiasy. W poniższym przykładzie w wyniku zastosowania nawiasów generowany jest inny wynik na podstawie tych samych wartości liczbowych:

trace(3 > (2 < 1)); // true

W pierwszej kolejności przetwarzany jest operator mniejszości, co daje w wyniku wartość false , ponieważ operand 2 jest nie mniejszy od operandu 1. Wartość false jest następnie przekazywana do operatora większości wraz z operandem 3. Poniższy kod odzwierciedla ten stan pośredni:

trace(3 > (false)); 

Operator większości konwertuje wartość false na wartość liczbową 0 i porównuje tę wartość liczbową z drugim operandem, 3, zwracając w wyniku true (wartość 3 jest większa od 0).

trace(3 > 0); // true

W poniższej tabeli wymieniono operatory języka ActionScript 3.0 w kolejności malejących priorytetów. Każdy wiersz tabeli zawiera operatory o tym samym priorytecie. Operatory w danym wierszu mają wyższy priorytet niż operatory w niższym wierszu tabeli.

Grupa

Operatory

Podstawowe

[] {x:y} () f(x) new x.y x[y] <></> @ :: ..

Przyrostkowe

x++ x--

Jednoargumentowe

++x --x + - ~ ! delete typeof void

Multiplikatywne

* / %

Addytywne

+ -

Przesunięcia bitowego

<< >> >>>

Relacyjne

< > <= >= as in instanceof is

Równość

== != === !==

Bitowe AND

&

Bitowe XOR

^

Bitowe OR

|

Logiczne AND

&&

Logiczne OR

||

Warunkowe

?:

Przypisanie

= *= /= %= += -= <<= >>= >>>= &= ^= |=

Przecinek

,

Operatory podstawowe

Do operatorów podstawowych należą operatory używane do tworzenia literałów typu Array i Object, grupowania wyrażeń, wywoływania funkcji, tworzenia instancji klas i odwoływania się do właściwości.

Wszystkie operatory podstawowe wymienione w poniższej tabeli mają równy priorytet: Operatory należące do specyfikacji E4X oznaczono zapisem (E4X).

Operator

Wykonywana operacja

[]

Inicjuje tablicę

{x:y}

Inicjuje obiekt

()

Grupuje wyrażenia

f(x)

Wywołuje funkcję

new

Wywołuje konstruktor

x.y x[y]

Odwołuje się do właściwości

<></>

Inicjuje obiekt XMLList (E4X)

@

Odwołuje się do atrybutu (E4X)

::

Kwalifikuje nazwę (E4X)

..

Odwołuje się do potomnego elementu XML (E4X)

Operatory przyrostkowe

Operatory przyrostkowe mają jeden operand i inkrementują lub dekrementują jego wartość. Mimo że są to operatory jednoargumentowe, zostały sklasyfikowane inaczej niż pozostałe takie operatory, ponieważ mają wyższy priorytet i szczególne działanie. Gdy w większym wyrażeniu występuje operator przyrostkowy, wartość wyrażenia jest zwracana przed przetworzeniem operatora przyrostkowego. Na przykład poniższy kod demonstruje, że wartość wyrażenia xNum++ jest zwracana zanim dojdzie do inkrementacji:

var xNum:Number = 0; 
trace(xNum++); // 0 
trace(xNum); // 1

Wszystkie operatory przyrostkowe wymienione w poniższej tabeli mają równy priorytet:

Operator

Wykonywana operacja

++

Inkrementuje (przyrostkowo)

--

Dekrementuje (przyrostkowo)

Operatory jednoargumentowe

Operatory jednoargumentowe mają jeden operand. Należące do tej grupy operatory inkrementacji ( ++ ) i dekrementacji ( -- ) są operatorami przedrostkowymi , co oznacza, że występują przed swoim operandem w wyrażeniu. Operatory przedrostkowe tym różnią się od swoich odpowiedników przyrostkowych, że inkrementacja lub dekrementacja jest wykonywana przed zwróceniem wartości wyrażenia. Na przykład poniższy kod demonstruje, że wartość wyrażenia ++xNum jest zwracana po inkrementacji:

var xNum:Number = 0; 
trace(++xNum); // 1 
trace(xNum); // 1

Wszystkie operatory jednoargumentowe wymienione w poniższej tabeli mają równy priorytet:

Operator

Wykonywana operacja

++

Inkrementuje (przedrostkowo)

--

Dekrementuje (przedrostkowo)

+

Jednoargumentowy +

-

Jednoargumentowy - (zmiana znaku)

!

Logiczne NOT

~

Bitowe NOT

delete

Usuwa właściwość

typeof

Zwraca informację o typie

void

Zwraca wartość undefined

Operatory multiplikatywne

Operatory multiplikatywne mają dwa operandy i wykonują mnożenie, dzielenie lub obliczają resztę z dzielenia (modulo).

Wszystkie operatory multiplikatywne wymienione w poniższej tabeli mają równy priorytet:

Operator

Wykonywana operacja

*

Mnożenie

/

Dzielenie

%

Modulo

Operatory addytywne

Operatory addytywne wykonują dodawanie lub odejmowanie na dwóch operandach. Wszystkie operatory addytywne wymienione w poniższej tabeli mają równy priorytet:

Operator

Wykonywana operacja

+

Dodawanie

-

Odejmowanie

Operatory przesunięcia bitowego

Operatory przesunięcia bitowego mają dwa operandy o przesuwają bity pierwszego operandu o liczbę pozycji określoną przez drugi operand. Wszystkie operatory przesunięcia bitowego wymienione w poniższej tabeli mają równy priorytet:

Operator

Wykonywana operacja

<<

Przesunięcie bitowe w lewo

>>

Przesunięcie bitowe w prawo

>>>

Przesunięcie bitowe w prawo bez znaku

Operatory relacyjne

Operatory relacyjne mają dwa operandy, porównują wartości tych operandów i zwracają wartość typy Boolean. Wszystkie operatory relacyjne wymienione w poniższej tabeli mają równy priorytet:

Operator

Wykonywana operacja

<

Mniejszy niż

>

Większy niż

<=

Mniejszy lub równy

>=

Większy lub równy

as

Sprawdza typ danych

in

Sprawdza właściwości obiektu

instanceof

Sprawdza łańcuch prototypów

is

Sprawdza typ danych

Operatory równości

Operatory równości mają dwa operandy, porównują wartości tych operandów i zwracają wartość typy Boolean. Wszystkie operatory równości wymienione w poniższej tabeli mają równy priorytet:

Operator

Wykonywana operacja

==

Równość

!=

Nierówność

===

Ścisła równość

!==

Ścisła nierówność

Bitowe operatory logiczne

Bitowe operatory logiczne mają dwa operandy i wykonują na nich operacje logiczne na poziomie bitów. Logiczne operatory bitowe mają różne priorytety i zostały wymienione w poniższej tabeli w kolejności malejących priorytetów:

Operator

Wykonywana operacja

&

Bitowe AND

^

Bitowe XOR

|

Bitowe OR

Operatory logiczne

Operatory logiczne mają dwa operandy i zwracają wynik typu Boolean. Operatory logiczne mają różne priorytety i zostały wymienione w poniższej tabeli w kolejności malejących priorytetów:

Operator

Wykonywana operacja

&&

Logiczne AND

||

Logiczne OR

Operator warunkowy

Operator warunkowy jest trójargumentowy, co oznacza, że ma trzy operandy. Operator ten jest skróconą formą instrukcji warunkowej if..else .

Operator

Wykonywana operacja

?:

Warunkowe

Operatory przypisania

Operatory przypisania mają dwa operandy i jednemu z tych operandów przypisują wartość drugiego operandu. Wszystkie operatory przypisania wymienione w poniższej tabeli mają równy priorytet:

Operator

Wykonywana operacja

=

Przypisanie

*=

Przypisanie z mnożeniem

/=

Przypisanie z dzieleniem

%=

Przypisanie z modułu

+=

Przypisanie z dodawaniem

-=

Przypisanie z odejmowaniem

<<=

Przypisanie z przesunięciem bitowym w lewo

>>=

Przypisanie z przesunięciem bitowym w prawo

>>>=

Przypisanie z przesunięciem bitowym w prawo bez znaku

&=

Przypisanie z bitowym AND

^=

Przypisanie z bitowym XOR

|=

Przypisanie z bitowym OR