運算子

運算子是特殊的函數,可以有一個或多個運算元,並傳回值。「運算元」是供運算子用來做為輸入的值,通常是常值、變數或運算式。例如,在下列程式碼中,加法 ( + ) 和乘法 ( * ) 運算子是搭配三個常值運算元 (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)。

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

傳回未定義的值

乘法運算子

乘法運算子可接受兩個運算元,並執行乘法、除法或模除計算。

如下表中列出所有的乘法運算子都有相等的優先順序:

運算子

執行的運算

*

乘法

/

除法

%

模除

加法運算子

加法運算子接受兩個運算元,並執行加法或減法計算。如下表中列出的所有加法運算子都有相等的優先順序:

運算子

執行的運算

+

加法

-

減法

位元位移運算子

位元位移運算子接受兩個運算元,並根據第二個運算元指定的位移數,對第一個運算元的位元進行對應的位移。如下表中列出的所有位元位移運算子都有相等的優先順序:

運算子

執行的運算

<<

位元左移

>>

位元右移

>>>

無正負號的位元右移

關係運算子

關係運算子接受兩個運算元,再比較其值,然後傳回 Boolean 值。如下表中列出的所有關係運算子都有相等的優先順序:

運算子

執行的運算

<

小於

>

大於

<=

小於或等於

>=

大於或等於

as

檢查資料類型

in

檢查物件屬性

instanceof

檢查原型鏈

is

檢查資料類型

相等運算子

相等運算子接受兩個運算元,再比較其值,然後傳回 Boolean 值。如下表中列出的所有相等運算子都有相等的優先順序:

運算子

執行的運算

==

相等

!=

不相等

===

嚴謹相等

!==

嚴謹不相等

位元邏輯運算子

位元邏輯運算子接受兩個運算元,並執行位元層級的邏輯運算。位元邏輯運算子在優先順序上有差異,下表即依遞減的優先順序列出這些運算子:

運算子

執行的運算

&

位元 AND

^

位元 XOR

|

位元 OR

邏輯運算子

邏輯運算子接受兩個運算元,並傳回 Boolean 結果。邏輯運算子在優先順序上有差異,下表即依遞減的優先順序列出這些運算子:

運算子

執行的運算

&&

邏輯 AND

||

邏輯 OR

條件運算子

條件運算子是三元運算子,這表示它會接受三個運算元。條件運算子是套用 if.. 的速記方法else 條件陳述式的速記方法。

運算子

執行的運算

?:

條件

指定運算子

指定運算子接受兩個運算元,並根據其它運算元的值,將值指定給一個運算元。如下表中列出的所有指定運算子都有相等的優先順序:

運算子

執行的運算

=

指定

*=

乘法指定

/=

除法指定

%=

模除指定

+=

加法指定

-=

減法指定

<<=

位元左移指定

>>=

位元右移指定

>>>=

無正負號的位元右移指定

&=

位元 AND 指定

^=

位元 XOR 指定

|=

位元 OR 指定