Operatori
Gli operatori sono funzioni speciali che accettano uno o più operandi e restituiscono un valore. Un operando è un valore (solitamente un valore letterale, una variabile o un'espressione) che svolge la funzione di input per un operatore. Ad esempio, nel seguente codice gli operatori di addizione (+) e moltiplicazione (*) sono utilizzati con tre operandi letterali (2, 3 e 4) per restituire un valore, il quale viene quindi utilizzato dall'operatore di assegnazione =() per assegnare il valore restituito, 14, alla variabile sumNumber.
var sumNumber:uint = 2 + 3 * 4; // uint = 14
Gli operatori possono essere unari, binari o ternari. Un operatore unario accetta un solo operando. Ad esempio, l'operatore di incremento (++) è di tipo unario perché accetta un unico operando. Un operatore binario accetta due operandi. È il caso, ad esempio, dell'operatore di divisione (/), che accetta due operandi. Un operatore ternario accetta tre operandi. Ad esempio, l'operatore condizionale (?:) accetta tre operandi.
Alcuni operatori, definiti overloaded, si comportano in modo diverso a seconda del tipo o del numero di operandi che vengono specificati. L'operatore di addizione (+) è un esempio di operatore overloaded che presenta un comportamento diverso a seconda del tipo di dati degli operandi. Se entrambi gli operandi sono numeri, l'operatore di addizione restituisce la somma dei valori. Se invece entrambi gli operandi sono stringhe, l'operatore restituisce la concatenazione dei due operandi. L'esempio di codice seguente mostra come l'operatore si comporta in modo diverso a seconda degli operandi specificati.
trace(5 + 5); // 10
trace("5" + "5"); // 55
Gli operatori possono presentare un comportamento diverso anche in base al numero di operandi specificati. L'operatore di sottrazione (-), ad esempio, è sia di tipo unario che binario. Se viene fornito un unico operando, l'operatore di sottrazione ne esegue la negazione e restituisce il risultato. Se gli operandi sono due, l'operatore ne restituisce la differenza. L'esempio seguente mostra l'operatore di sottrazione utilizzato prima nella versione unaria e poi in quella binaria.
trace(-3); // -3
trace(7 - 2); // 5
Priorità e associatività degli operatoriLa priorità e l'associatività degli operatori determina l'ordine in cui questi vengono elaborati. Se avete familiarità con le operazioni matematiche, può sembrarvi ovvio che il compilatore elabori l'operatore di moltiplicazione (*) prima di quello di addizione (+). Tuttavia, il compilatore necessita di istruzioni esplicite sull'ordine di elaborazione degli operatori. Queste istruzioni vengono dette globalmente priorità degli operatori. ActionScript definisce un ordine di priorità predefinito per gli operatori che è possibile modificare tramite l'operatore parentesi tonda (()). Ad esempio, il codice seguente modifica l'ordine di priorità predefinito dell'esempio precedente per forzare il compilatore a elaborare l'operatore di addizione prima di quello di moltiplicazione:
var sumNumber:uint = (2 + 3) * 4; // uint == 20
In alcune situazioni, nella stessa espressione possono essere presenti due o più operatori con la stessa priorità. In questi casi, il compilatore utilizza le regole di associatività per determinare l'operatore da elaborare per primo. Tutti gli operatori binari, ad eccezione degli operatori di assegnazione, hanno un'associatività da sinistra a destra, ovvero gli operatori a sinistra vengono elaborati prima di quelli a destra. Gli operatori binari di assegnazione e l'operatore condizionale (?:) hanno un'associatività da destra a sinistra, ovvero gli operatori a destra vengono elaborati prima di quelli a sinistra.
Considerate, ad esempio, gli operatori minore di (<) e maggiore di (>) che hanno la stessa priorità. Se entrambi gli operatori vengono utilizzati nella stessa espressione, l'operatore a sinistra viene elaborato per primo, perché l'associatività di entrambi è da sinistra a destra. Le due istruzioni seguenti producono pertanto lo stesso risultato:
trace(3 > 2 < 1); // false
trace((3 > 2) < 1); // false
L'operatore maggiore di viene elaborato per primo e restituisce true, perché l'operando 3 è maggiore dell'operando 2. Il valore true viene quindi passato all'operatore minore di insieme all'operando 1. Il codice seguente illustra questo stato intermedio:
trace((true) < 1);
L'operatore minore di converte il valore true nel valore numerico 1 e confronta quest'ultimo con il secondo operando 1, restituendo il valore false (perché il valore di 1 non è minore di 1).
trace(1 < 1); // false
L'associatività a sinistra predefinita può essere modificata mediante l'operatore parentesi. Potete istruire il compilatore a elaborare per primo l'operatore minore di racchiudendolo tra parentesi insieme ai relativi operandi. L'esempio seguente utilizza l'operatore parentesi per produrre un output diverso con gli stessi numeri dell'esempio precedente:
trace(3 > (2 < 1)); // true
L'operatore minore di viene elaborato per primo e restituisce il valore false perché l'operando 2 non è minore dell'operando 1. Il valore false viene quindi passato all'operatore maggiore di insieme all'operando 3. Il codice seguente illustra questo stato intermedio:
trace(3 > (false));
L'operatore maggiore di converte il valore false nel valore numerico 0 e confronta quest'ultimo con l'altro operando 3, restituendo il valore true (perché il valore di 3 è maggiore di 0).
trace(3 > 0); // true
La tabella seguente elenca gli operatori di ActionScript 3.0 in ordine di priorità decrescente. Ogni riga della tabella contiene operatori che hanno la stessa priorità. Ciascuna riga di operatori ha una priorità più alta della riga sottostante.
Gruppo
|
Operatori
|
Primari
|
[] {x:y} () f(x) new x.y x[y] <></> @ :: ..
|
Forma suffissa
|
x++ x--
|
Unari
|
++x --x + - ~ ! delete typeof void
|
Moltiplicativi
|
* / %
|
Additivi
|
+ -
|
Spostamento bit a bit
|
<< >> >>>
|
Relazionali
|
< > <= >= as in instanceof is
|
Uguaglianza
|
== != === !==
|
AND bit a bit
|
&
|
XOR bit a bit
|
^
|
OR bit a bit
|
|
|
AND logico
|
&&
|
OR logico
|
||
|
Condizionale
|
?:
|
Assegnazione
|
= *= /= %= += -= <<= >>= >>>= &= ^= |=
|
Virgola
|
,
|
Operatori primariGli operatori primari consentono di creare valori letterali Array e Object, raggruppare espressioni, chiamare funzioni, creare istanze di classe e accedere alle proprietà.
Tutti gli operatori primari, elencati nella tabella seguente, hanno priorità equivalente. Gli operatori inclusi nella specifica E4X sono contrassegnati con l'indicazione (E4X).
Operatore
|
Operazione eseguita
|
[]
|
Inizializza un array
|
{x:y}
|
Inizializza un oggetto
|
()
|
Raggruppa espressioni
|
f(x)
|
Chiama una funzione
|
new
|
Chiama una funzione di costruzione
|
x.y x[y]
|
Accede a una proprietà
|
<></>
|
Inizializza un oggetto XMLList (E4X)
|
@
|
Accede a un attributo (E4X)
|
::
|
Qualifica un nome (E4X)
|
..
|
Accede a un elemento XML discendente (E4X)
|
Operatori in forma suffissaGli operatori in forma suffissa accettano un operatore e ne incrementano o decrementano il valore. Sebbene si tratti di operatori unari, sono classificati separatamente dal resto degli operatori di questo tipo perché hanno una priorità maggiore e si comportano in modo particolare. Quando utilizzate un operatore in forma suffissa all'interno di un'espressione complessa, il valore dell'espressione viene restituito prima dell'elaborazione dell'operatore in forma suffissa. Nel codice seguente, ad esempio, il valore dell'espressione xNum++ viene restituito prima che il valore venga incrementato:
var xNum:Number = 0;
trace(xNum++); // 0
trace(xNum); // 1
Tutti gli operatori in forma suffissa, elencati nella tabella seguente, hanno priorità equivalente.
Operatore
|
Operazione eseguita
|
++
|
Incremento (in forma suffissa)
|
--
|
Decremento (in forma suffissa)
|
Operatori unariGli operatori unari accettano un unico operando. Gli operatori di incremento (++) e decremento (--) di questo gruppo sono operatori in forma prefissa, ovvero vengono utilizzati prima dell'operando in un'espressione. Gli operatori in forma prefissa sono diversi da quelli in forma suffissa perché l'operazione di incremento o decremento viene completata prima della restituzione del valore di tutta l'espressione. Nel codice seguente, ad esempio, il valore dell'espressione ++xNum viene restituito dopo l'incremento del valore.
var xNum:Number = 0;
trace(++xNum); // 1
trace(xNum); // 1
Tutti gli operatori unari, elencati nella tabella seguente, hanno priorità equivalente.
Operatore
|
Operazione eseguita
|
++
|
Incremento (in forma prefissa)
|
--
|
Decremento (in forma prefissa)
|
+
|
+ unario
|
-
|
- unario (negazione)
|
!
|
NOT logico
|
~
|
NOT bit a bit
|
delete
|
Elimina una proprietà
|
typeof
|
Restituisce informazioni sul tipo
|
void
|
Restituisce un valore indefinito
|
Operatori moltiplicativiGli operatori moltiplicativi accettano due operandi ed eseguono moltiplicazioni, divisioni e moduli.
Tutti gli operatori moltiplicativi, elencati nella tabella seguente, hanno priorità equivalente.
Operatore
|
Operazione eseguita
|
*
|
Moltiplicazione
|
/
|
Divisione
|
%
|
Modulo
|
Operatori additiviGli operatori additivi accettano due operandi ed eseguono addizioni o sottrazioni. Tutti gli operatori additivi, elencati nella tabella seguente, hanno priorità equivalente.
Operatore
|
Operazione eseguita
|
+
|
Addizione
|
-
|
Sottrazione
|
Operatori di spostamento bit a bitGli operatori di spostamento bit a bit accettano due operandi e spostano i bit del primo operando in base a quanto specificato dal secondo operando. Tutti gli operatori di spostamento bit a bit, elencati nella tabella seguente, hanno priorità equivalente.
Operatore
|
Operazione eseguita
|
<<
|
Spostamento a sinistra bit a bit
|
>>
|
Spostamento a destra bit a bit
|
>>>
|
Spostamento a destra bit a bit senza segno
|
Operatori relazionaliGli operatori relazionali accettano due operandi, ne confrontano il valore e restituiscono un valore booleano. Tutti gli operatori relazionali, elencati nella tabella seguente, hanno priorità equivalente.
Operatore
|
Operazione eseguita
|
<
|
Minore di
|
>
|
Maggiore di
|
<=
|
Minore o uguale a
|
>=
|
Maggiore o uguale a
|
as
|
Verifica il tipo di dati
|
in
|
Verifica le proprietà dell'oggetto
|
instanceof
|
Controlla la catena di prototipi
|
is
|
Verifica il tipo di dati
|
Operatori di uguaglianzaGli operatori di uguaglianza accettano due operandi, ne confrontano il valore e restituiscono un valore booleano. Tutti gli operatori di uguaglianza, elencati nella tabella seguente, hanno priorità equivalente.
Operatore
|
Operazione eseguita
|
==
|
Uguaglianza
|
!=
|
Diseguaglianza
|
===
|
Uguaglianza rigorosa
|
!==
|
Diseguaglianza rigorosa
|
Operatori logici bit a bitGli operatori logici bit a bit accettano due operandi ed eseguono operazioni logiche a livello di bit. Gli operatori logici bit a bit hanno priorità diversa. Nella tabella seguente, gli operatori sono elencati in ordine di priorità, da maggiore a minore:
Operatore
|
Operazione eseguita
|
&
|
AND bit a bit
|
^
|
XOR bit a bit
|
|
|
OR bit a bit
|
Operatori logiciGli operatori logici accettano due operandi e restituiscono un valore booleano. Gli operatori logici hanno priorità diversa. Nella tabella seguente, gli operatori sono elencati in ordine di priorità, da maggiore a minore:
Operatore
|
Operazione eseguita
|
&&
|
AND logico
|
||
|
OR logico
|
Operatore condizionaleL'operatore condizionale è un operatore ternario, ovvero accetta tre operandi. Può essere utilizzato come metodo rapido per applicare l'istruzione condizionale if..else.
Operatore
|
Operazione eseguita
|
?:
|
Condizionale
|
Operatori di assegnazioneGli operatori di assegnazione accettano due operandi e assegnano un valore a uno di essi in base al valore dell'altro operando. Tutti gli operatori di assegnazione, elencati nella tabella seguente, hanno priorità equivalente.
Operatore
|
Operazione eseguita
|
=
|
Assegnazione
|
*=
|
Assegnazione moltiplicazione
|
/=
|
Assegnazione divisione
|
%=
|
Assegnazione modulo
|
+=
|
Assegnazione addizione
|
-=
|
Assegnazione sottrazione
|
<<=
|
Assegnazione spostamento a sinistra bit a bit
|
>>=
|
Assegnazione spostamento a destra bit a bit
|
>>>=
|
Assegnazione spostamento a destra senza segno bit a bit
|
&=
|
Assegnazione AND bit a bit
|
^=
|
Assegnazione XOR bit a bit
|
|=
|
Assegnazione OR bit a bit
|
|
|