跳轉至內容

ActionScript 2.0/運算子簡介

來自華夏公益教科書
ActionScript 2.0 簡介
變數和資料型別 運算子 函式

關鍵概念


  • 運算子
  • 運算子型別
    • 算術運算子
    • 文字串聯運算子
    • 比較運算子
      • 不同型別的比較
    • 邏輯運算子
    • 賦值運算子
      • 兩種型別的簡單賦值
      • 複合賦值運算子
    • 增量和減量運算子
  • 運算子優先順序
  • 運算子結合性
  • 註釋
  • 表示式與語句

一個運算子通常是一個符號,比如 + 或 -,用來操作不同的實體。被操作的實體被稱為運算元。如果你有程式設計、SQL 甚至簡單計算機語言(如電子表格公式)的經驗,你應該已經熟悉了很多運算子。在上一章,我們已經介紹了賦值運算子。在本章中,我們將詳細介紹最常用的運算子。(注意:點和陣列訪問運算子也很有用,但我們將在後面學習屬性和方法時再詳細介紹。)

哪些是很有用的運算子?

[編輯 | 編輯原始碼]

算術運算子

[編輯 | 編輯原始碼]

算術運算子是用來幫你進行數學計算的運算子。四種基本的算術運算子如下所示

  • + 代表加法。
  • - 代表減法。
  • * 代表乘法。
  • / 代表除法。

現在,你可能會想寫這樣的程式碼

程式碼 結果
1 + 1;

錯誤!

然而,這會給你一個錯誤。這是因為 1 + 1 只是一個表示式,它的值為 2;它不是語句。(回想一下:語句告訴計算機做什麼。)所以,我們應該這樣寫

程式碼 結果
trace(1 + 1);

2

再次強調,現在先不用理解 'trace' 的含義。將這段程式碼輸入到第一個幀的 ActionScript 中,然後預覽你的 Flash 檔案。'2' 應該會出現在輸出框中。

除了上述之外,還有一個不太常用的運算子 %,它可以計算除法運算的餘數。例如,10 % 3 返回 1。其他運算(如指數、平方根等)不能使用運算子進行計算,我們將在後面學習它們。

文字串聯運算子

[編輯 | 編輯原始碼]

Flash 的一個特點是 + 既充當加法運算子,也充當文字串聯運算子。文字串聯運算子將兩個字串合併成一個。例如,將 "This is" 和 " Sparta" (注意 Sparta 前面的空格)串聯起來,我們會得到 "This is Sparta"。然而,如果我們將 "This is" 和 "Sparta" 串聯起來,我們會得到 "This isSparta",這是不希望的結果。

如果 + 號兩側的實體都是數字,則 + 將充當加法運算子。否則,+ 將充當文字串聯運算子。以下是一個示例

程式碼 結果
trace(1 + 1);
trace("1" + 1);
trace(1 + "1");
trace("1" + "1");

2
11
11
11

比較運算子

[編輯 | 編輯原始碼]

比較運算子是用來比較兩個實體並返回一個布林值的運算子。

等式運算子

[編輯 | 編輯原始碼]

等式運算子 (==) 比較兩個實體,並確定它們是否完全相同。如果相同,它返回 true;否則,它返回 false。以下是一些示例程式碼

程式碼 結果
trace(1 == 2);
trace(1 == 1);
trace("Hello world" == "Hello world");
trace("This is sparta!" == "This is Sparta!");

false
true
true
false

請注意,最後一個是 false,因為等式運算子區分大小寫。

當我們處理複合資料型別時,我們需要更加小心。等式運算子只有在它們引用同一個實體時才會返回 true。即使我們有兩個不同的相同實體,等式運算子也會返回 false。在這個例子中,假設有兩條狗。一條叫 Spot,還有一個名字叫 Bandian(中文意思是“斑點”)。另一條叫 'Lucky',它們是雙胞胎,在生理上完全相同。

程式碼 結果
trace(spot == bandian);
trace(spot == lucky);

true
false

有時,我們會比較兩個不同資料型別的實體,例如 23 和 "23"。在這種情況下,等式運算子仍然會返回 true,因為它會自動將 "23" 轉換為 23。如果你不想要這種自動轉換,可以使用嚴格相等運算子 (===)。

程式碼 結果
trace(23 == "23");
trace(23 === "23");

true
false

不等式運算子

[編輯 | 編輯原始碼]

Flash 提供了多種不等式運算子,以滿足你的所有比較需求。

第一個運算子是 !=。!= 與 == 相反:如果兩個實體相等,它返回 false,如果兩個實體不相等,它返回 true。請考慮以下程式碼

程式碼 結果
trace(1 != 2);
trace("2" != 2);

true
false

你可能已經注意到 != 也會在必要時轉換資料型別。如果你不希望發生這種情況,請使用 !==。

程式碼 結果
trace("2" !== 2);

true

另外四個運算子是 <,>,<= 和 >=. 它們在數學中與 <,>,≤ 和 ≥ 相同。如果你需要快速複習,請看這裡

  • < 代表“小於”。
  • > 代表“大於”。
  • <= 代表“小於或等於”。
  • >= 代表“大於或等於”。

看下面的例子

程式碼 結果
trace(12 < 3);
trace(12 > 3);
trace(12 <= 3);
trace(12 >= 3);
trace(12 < 12);
trace(12 > 12);
trace(12 <= 12);
trace(12 >= 12);

false
true
true
true
false
false
true
true

我們也可以比較字串。真的!字串會被轉換成它們的 Unicode 程式碼點 進行比較。請參閱 Unicode/字元引用/0000-0FFF 獲取程式碼點資訊。

程式碼 結果
trace("Apple" > "Ball");
trace("Apple" < "Ball");
trace("apple" < "Ball");
trace("apple" != "apple");

false
true
false
false

對於相同大小寫的字母,後面的字母的值比前面的字母的值大,所以 a < b 以及 A < B。然而,大寫字母總是比小寫字母的值小,所以 a > B。

邏輯運算子

[編輯 | 編輯原始碼]

和大多數語言一樣,最重要的邏輯運算子是 AND、OR 和 NOT。

&& 是 ActionScript 的 AND 運算子。它的運算元必須是布林值。如果兩個運算元都是 true,它返回 true;否則,它返回 false

程式碼 結果
trace(true && false);
trace(false && false);
trace(true && true);
trace(1>0 && 1=1);
trace(1<0 && 1=1);

false
false
true
true
false

|| 是 ActionScript 的 OR 運算子。它的運算元必須是布林值。如果兩個運算元都不是 true,它返回 false;否則,它返回 true

程式碼 結果
trace(true || false);
trace(false || false);
trace(true || true);
trace(1>0 || 1=1);
trace(1<0 || 1=1);

true
false
true
true
true

請注意,AND 運算子必須使用兩個“&”,OR 運算子必須使用兩個“|”。[1]

! (發音為“bang”)是 ActionScript 的 NOT 運算子。它放在運算元之前。它會翻轉布林變數:false 變成 truetrue 變成 false

程式碼 結果
trace(!false);
trace(!true);
trace(!true && true);
trace(!false && true);

true
false
false
true

賦值運算子

[編輯 | 編輯原始碼]

簡單賦值運算子

[編輯 | 編輯原始碼]

我們已經在上一章中遇到了簡單賦值運算子,但我們還需要澄清一些內容。簡單賦值運算子實際上做了兩件不同的事情

  • 對於原始資料型別,賦值運算子只是將被賦值的值複製到變數中。
  • 對於其他資料型別,賦值運算子會在變數中放入被賦值實體的連結!

這意味著什麼?

程式碼 結果
var string_1:String = "Wikibooks";
var string_2:String = string_1;
string_2 = "Wikipedia";
trace(string_1);

華夏公益教科書

在這裡,Flash 將值 "華夏公益教科書" 複製到 string_2。在我們更改 string_2 為 "維基百科" 之後,原始 string_1 不會受到影響。考慮另一種情況,涉及非原始資料型別 Dog

程式碼 結果
//Assume that spot is a chihuahua.
var nicestDog:Dog = spot;
nicestDog.species = "pekingese";

第一行是註釋;我們將在本章結束時討論它。您也不必理解第三行;只需假設它將nicestDog的物種更改為'北京犬'。現在,您是否認為將nicestDog的物種更改為'北京犬'會將一隻名叫Spot的吉娃娃犬遺傳地改變為北京犬?答案是肯定的。這是因為nicestDog只包含指向Spot的連結。

複合賦值運算子

[edit | edit source]

有兩種型別的複合賦值運算子。我們只討論將賦值和算術運算子結合起來的那一種。如果您感興趣,可以檢視官方的Flash文件來了解另一種型別。

複合賦值運算子始終與數字一起使用。它們有五個,每個對應一個算術運算子

  • +=,加法和重新賦值運算子
  • -=,減法和重新賦值運算子
  • *=,乘法和重新賦值運算子
  • /=,除法和重新賦值運算子
  • %=,模運算和重新賦值運算子

這些運算子的作用是對左運算元和右運算元執行運算,然後將值分配給左運算元。換句話說,

a += b;

等同於

a = a + b;

讓我們用一個例子更好地理解這個概念。

程式碼 結果
var number_1:Number = 5;
number_1 *= 2;
trace(number_1);

10

在這個例子中,Flash將number_1乘以5,然後將值分配給number_1。

賦值運算子返回什麼?

[edit | edit source]

到目前為止,我們已經看到算術運算子、邏輯運算子、比較運算子和文字連線運算子都返回一個值。既然賦值運算子本身可以是語句,那麼它們是否不返回值呢?

事實上,賦值運算子確實返回值。賦值運算子返回的值是分配給左運算元的值。例如,a = 2返回的值為2,而a /= 2返回a原始值的一半。

以下程式碼可能看起來不直觀,但它有效

程式碼 結果
var a = 6;
var some_number:Number = 3 + (a += 1);
trace(some_number);
trace(a);

10
7

這裡,a += 1返回7。圓括號是為了允許在它內部的操作首先執行;我們將在後面討論這一點。

增量運算子

[edit | edit source]

ActionScript提供四個增量/減量運算子

  • 字尾增量運算子,寫成variableName++
  • 字首增量運算子,寫成++variableName
  • 字尾減量運算子,寫成variableName--
  • 字首減量運算子,寫成--variableName

增量運算子都將1加到整型變數中,而減量運算子都將1從整型變數中減去。它們本身是語句。例如

程式碼 結果
var myFirstNumber:Number = 10;
myFirstNumber++;
trace(myFirstNumber);
myFirstNumber--;
trace(myFirstNumber);
++myFirstNumber;
trace(myFirstNumber);
--myFirstNumber;
trace(myFirstNumber);

11
10
11
10

如您所見,增量和減量運算子本身是語句。但是,我們有時希望將增量運算子放在另一個語句中。對於字尾增量/減量運算子,其他所有內容將在返回增量/減量之前進行評估。對於字首增量/減量運算子,增量/減量將在其他所有內容之前進行評估。

如果聽起來很混亂,請檢視以下示例

程式碼 結果
var myFirstNumber:Number = 10;
trace(myFirstNumber++);
trace(myFirstNumber);

10
11

程式碼 結果
var myFirstNumber:Number = 10;
trace(++myFirstNumber);
trace(myFirstNumber);

11
11

在第一個例子中,myFirstNumber在增量操作之前被跟蹤。這就是為什麼我們在第一個跟蹤語句中仍然看到10的原因。第二個跟蹤語句顯示計算後的值11。

在第二個例子中,myFirstNumber在增量操作之後被跟蹤,因此我們已經可以在第一個跟蹤中看到11。

運算順序是什麼?

[edit | edit source]

還記得你在數學課上學習的運算順序(PEMDAS或BOMDAS/BIMDAS)嗎?ActionScript也以固定的順序應用不同的運算子。

在ActionScript中,在確定運算順序時,我們需要考慮兩件事:運算子優先順序運算子結合性。

什麼是運算子優先順序?

[edit | edit source]

當一個運算子總是先於另一個運算子進行評估時,我們稱之為運算子優先順序。

以下是對運算子優先順序的一個簡要概述

  • 僅涉及一個運算元的運算子,例如NOT(!),是第一個被評估的。(如果您想知道,這些被稱為一元運算子。)
  • 接下來是*、/和 %。
  • 然後是+和-。
  • 然後是比較運算子。
  • 然後是邏輯運算子AND和OR。
  • 最後是賦值運算子。

如果我們希望某個運算具有更高的優先順序,我們應該使用分組運算子,它是一對圓括號:()。我們之前已經遇到過它,當時我們學習了賦值運算子。讓我們再看一下那個例子

程式碼 結果
var a = 6;
var someNumber:Number = 3 + (a += 1);
trace(someNumber);
trace(a);

10
7

這裡,a += 1優先順序更高,因為它被包含在圓括號中。

如果沒有括號,它會導致錯誤

程式碼 結果
var a = 6;
var someNumber:Number = 3 + a += 1;
trace(someNumber);
trace(a);

錯誤!

這是因為var someNumber:Number = 3 + a首先執行。var someNumber:Number = 3 + a返回的值為6。您不能將值分配給常量,否則世界將變得非常混亂!這就是為什麼Flash會返回錯誤的原因。

什麼是運算子結合性?

[edit | edit source]

考慮表示式someNumber = 3 * 2 + 5 * 6。3 * 2和5 * 6具有相同的優先順序,那麼哪一個應該先執行?運算子結合性回答了這個問題。在本例中,由於+的結合性為'從左到右',因此首先評估3 * 2,然後是5 * 6,最後是6 + 30。

+、-、*、/和 %運算子的結合性都是從左到右,而賦值運算子的結合性則是從右到左。

讓我們執行一個包含許多運算子的指令碼,以檢視運算子優先順序和結合性的影響。

程式碼 結果
var someNumber:Number;
someNumber = 13 + 5 * 4;
trace(someNumber);
trace(1 + 3 / 5 != 2 &&  4 - 3 >= 1);

33
true

在someNumber的賦值語句中,計算機首先評估5 * 4,然後是13 + 20。

第二個跟蹤要複雜得多。這裡優先順序最低的運算子是&&,它的優先順序甚至低於比較運算子。&&的結合性為從左到右,因此計算機需要首先評估&&左側的程式碼(1 + 3 / 5 != 2)。1 + 3 / 5 = 1.6,不等於2。因此,左側返回的值為true。現在到右側。在4 - 3 >= 1中,4 - 3 = 1,所以1 >= 1返回true。由於&&的兩側都為真,因此跟蹤語句返回true

如何添加註釋?

[edit | edit source]

現在我們已經學習了所有困難的運算子,讓我們用一個非常簡單的概念來結束本章。

註釋是新增到指令碼中以提供資訊的一些文字。它們將被編譯器忽略。以下示例顯示了兩種型別的註釋

程式碼 結果
/*This is just an example.
Don't actually copy-paste this into a Flash file.
There will be no visible results. */
var a = 6;
var someNumber:Number = 3 + (a += 1); //Assign the sum of 3 and a's new value to someNumber

第一個註釋,用/*和*/括起來,允許多行。/*標記註釋的開頭,*/標記註釋的結尾。這種型別的註釋也可以新增到一行中間。它們廣泛用於待辦事項列表和版權資訊等元素。

第二個註釋以//開頭,並新增到行尾。它不能跨越一行。這種型別的註釋通常用於解釋程式碼。

有時,我們可能希望'隱藏'一些程式碼用於測試或除錯。這個過程稱為註釋掉,也是透過註釋來實現的。

結論

[edit | edit source]

現在我們已經學習了所有的運算子,我們可以繼續下一章:函式。

  1. & 和 | 是有效的運算子(稱為位運算子,但它們超出了本書的範圍。
華夏公益教科書