ActionScript 2.0 入門/基本資料型別
關鍵概念
- 包裝類
- 基本資料型別的字面量與包裝類的例項
- instanceof 和 typeof
- 字元索引
- 子字串
- 其他 String 方法
- 科學記數法和十六進位制數
- 無窮大、最大值和最小值以及 NaN
- 關於轉換的更多資訊
- 靜態屬性和方法
- 常量變數
在腦海中塞滿所有這些基本概念之後,你應該休息一下!本章將介紹基本資料型別。
一個包裝類,就是“包裝”了三種基本資料型別,並添加了屬性和方法的類。不出所料,共有三種包裝類,分別對應三種基本資料型別。
- Number
- String
- Boolean
每個類都有一個建構函式,可以用來初始化它。用建構函式初始化數字、字串或布林值,但沒有任何引數,將會返回一個空白值,即零、空字串和空布林值。
| 程式碼 | 結果 |
|---|---|
trace(new Number());
trace(new String());
trace(new Boolean());
|
|
雖然跟蹤結果為 true,但 new Boolean() 既不是 true 也不是 false。
你也可以將字面量放在第一個引數中
| 程式碼 | 結果 |
|---|---|
trace(new String("Hello world!"));
trace(new Number(123));
trace(new Boolean(true));
|
|
“字串”和“字串物件”之間存在細微差別。請看下面的例子
| 程式碼 | 結果 |
|---|---|
trace(123 instanceof Number);
trace(new Number(123) instanceof Number);
trace(typeof 123);
trace(typeof new Number(123));
|
|
instanceof 和 typeof 是特殊的運算子。instanceof 如果左運算元是右運算元的例項,則返回 true。在本例中,123 不是 Number 的例項,但 new Number(123) 是。typeof 返回右運算元的資料型別,可以是 string、number、boolean、function、movieclip 或 object(對於非 MovieClip 物件)。小寫字母是故意的,因為這是 typeof 返回的值。在本例中,123 是基本資料型別 number,但 new Number(123) 是 Number 包裝類的例項。
Flash 會在必要時將包裝類的例項轉換為基本資料,反之亦然。如果我們想手動將包裝類的例項轉換為基本資料型別,可以使用 valueOf() 函式
| 程式碼 | 結果 |
|---|---|
trace(new Number(123).valueOf() instanceof Number);
|
|
要進行反向轉換,只需呼叫建構函式即可。
你只需要瞭解的唯一字串屬性是 length 屬性,它顯示字串中的字元數。例如
| 程式碼 | 結果 |
|---|---|
trace("Hello world!".length);
|
|
請注意,空格也計入在內。
你需要了解的另一件事是,字串中字元的位置稱為其索引。如果索引是正數,則從第一個字元開始計數;如果索引是負數,則從最後一個字元開始計數。第一個字元定義為 0,最後一個字元定義為 -1。例如,'spot' 中 'p' 的索引為 1 或 -3,'o' 的索引為 2 或 -2。現在讓我們開始操作字串!
以下函式與 ActionScript 中的字元有關
- String.fromCharCode(程式碼點 1, 程式碼點 2...)
- string.charAt(字元的索引);
- string.charCodeAt(字元的索引);
fromCharCode 使用引數中指定的 Unicode 程式碼點返回一個字串。請注意,我們寫了 'String.fromCharCode'。這正是你應該鍵入的方式!這是因為 fromCharCode 是一個靜態方法,這意味著它屬於整個類,而不僅僅是特定字串。
charAt 返回指定位置的字元,而 charCodeAt 返回指定字元的 Unicode 程式碼點。
例如
| 程式碼 | 結果 |
|---|---|
trace(String.fromCharCode(62, 56, 123));
trace("Hello world!".charAt(4));
trace("Hello world!".charCodeAt(4));
|
|
請記住,ActionScript 使用 Unicode 程式碼點而不是 ASCII 程式碼點進行字串操作。ASCII 程式碼點將在後面派上用場。
一個子字串是另一個字串內的字串。當我們知道子字串在一個字串中的位置時,有三種方法可以找到它
- string.substr(第一個字元的索引, 長度);
- string.substring(第一個字元的索引[, 最後一個字元的索引]);
- string.slice(第一個字元的索引[, 最後一個字元的索引]);
如果你熟悉 SQL 或電子表格,你可能會注意到這兩個函式與 SQL 或電子表格中的 SUBSTRING()/SUBSTR()/MID() 等函式有很大不同,因為字串沒有在第一個引數中指定,因為它是包含方法的字串本身。
請注意,最後一個字元在 substring() 和 slice() 中被排除在子字串之外。如果沒有指定最後一個字元的索引,Flash 將返回所有內容到結尾。以下是所有三個函式的示例
| 程式碼 | 結果 |
|---|---|
trace("Hello world!".substr(4, 5));
trace("Hello world!".slice(4, 9));
trace("Hello world!".substring(4, 9));
trace("Hello world!".slice(4));
trace("Hello world!".substring(4));
|
|
有時,我們需要在字串中找到已知子字串的位置。然後我們需要這兩個函式
- string.indexOf(substring[, 第一個字元的索引]);
- string.lastIndexOf(substring[, 最後一個字元的索引]);
indexOf 非常類似於電子表格中的 FIND()。它從第二個引數中指定的字元開始,在字串中查詢子字串。如果第二個引數為空,則從開頭開始查詢。返回子字串第一次出現的第一個字元的位置。lastIndexOf 幾乎相同,只是它返回最後一次出現的位置,而不是第一次,並且你指定停止查詢的位置,而不是開始查詢的位置。搜尋區分大小寫。如果未找到任何匹配項,Flash 將返回 -1。例如
| 程式碼 | 結果 |
|---|---|
trace("Tralalalala".indexOf("la", 4));
trace("Tralalalala".indexOf("la"));
trace("Tralalalala".lastIndexOf("la", 8));
trace("Tralalalala".lastIndexOf("la"));
trace("Tralalalala".lastIndexOf("lah"));
|
|
- toString(轉換目標) 是將內容轉換為字串的另一種方法。它與 String(轉換目標) 幾乎相同,我們在第 1 章中已經遇到過。
- concat(string1, string2...) 也與文字連線運算子的作用幾乎相同。
- string.toUpperCase 和 string.toLowerCase 分別將指定的字串轉換為大寫和小寫。令人驚訝,對吧?
- string.split(分隔符, 元素數量) 將在下一章中介紹。
newline 是一個字串字面量,可以幫助你開始新行。它沒有用引號括起來;而是與其他字串連線在一起。
| 程式碼 | 結果 |
|---|---|
trace("Hello!" + newline + "World!");
|
|
ActionScript 以一種與計算器非常相似的方式以科學記數法表示數字。字母 'e' 新增在 10x 部分和數字之間。你不需要確保第一個數字在 1 到 10 之間,也不需要在指數前新增正號 (+),因為 Flash 會自動為你完成。Flash 也會在適當的時候將數字轉換為科學記數法和從科學記數法轉換。
| 程式碼 | 結果 |
|---|---|
trace(123e15);
trace(1.23e-2);
trace(10000000000000000000000000000000000);
|
|
要以十六進位制數表示數字,只需在十六進位制數之前鍵入 '0x'。Flash 會將其轉換為十進位制數。
| 程式碼 | 結果 |
|---|---|
trace(0x12A);
|
|
十六進位制數在以後處理顏色時會非常有用。
除了我們操作的常規浮點數和小數外,ActionScript 還有五個特殊數字,它們都是 Number 的**靜態屬性**。
- Number.NEGATIVE_INFINITY
- Number.POSITIVE_INFINITY
- Number.MAX_VALUE
- Number.MIN_VALUE
- Number.NaN
類似於靜態方法,靜態屬性屬於整個類,而不是單個例項。它們也透過類名而不是例項名訪問。請注意,這些數字全部大寫並用下劃線(_)分隔。這是因為它們是**常量**。雖然常量是變數,但它們不應更改;它們的存在是因為每次使用字面量都是不可行的。
Number.NEGATIVE_INFINITY、Number.POSITIVE_INFINITY 和 Number.NaN 的字面量分別是 -Infinity、Infinity 和 NaN。
Number.MAX_VALUE 和 Number.MIN_VALUE 分別是 Flash 中最大的整數值和最小的十進位制值。Number.NEGATIVE_INFINITY 和 Number.POSITIVE_INFINITY 分別表示負無窮大和正無窮大。Number.NaN 表示“非數字”。當你嘗試將非數字視為數字時,你可能已經得到過這個值,例如以下情況
| 程式碼 | 結果 |
|---|---|
trace(123 - "Hello world!");
|
|
請記住,無論你從無窮大中減去多少,或將它分成多少份,無窮大始終是無窮大。還要記住,除以零不會導致未定義或 NaN,而是無窮大。
| 程式碼 | 結果 |
|---|---|
trace(Number.POSITIVE_INFINITY / Number.MAX_VALUE);
trace(Number.POSITIVE_INFINITY - Number.MAX_VALUE);
trace(12 / 0);
|
|
兩個全域性函式 isFinite(number) 和 isNaN(number) 可以幫助你分別確定一個數字是否為無窮大和 NaN。isFinite 如果數字是有限的則返回 true,否則返回 false;isNaN 如果引數是有效數字則返回 false,否則返回 true。
| 程式碼 | 結果 |
|---|---|
trace(isFinite(Infinity));
trace(isFinite(-Infinity));
trace(isFinite(12/0));
trace(isFinite(Number.MAX_VALUE));
trace(isNaN(45 * "Hello world!"));
trace(isNaN("Hello world!"));
trace(isNaN(-12/0));
|
|
請注意,最後一個結果為真,因為“Hello world!”不是數字(而是字串)。我們將在 Math 類章節中更詳細地介紹。
在第一章中,我們學習瞭如何在基本資料型別之間進行轉換。讓我們再看一下每個轉換過程。
讓我們從 String(value) 開始。如果我們嘗試轉換 MovieClip 或 TextField,它將被轉換為 'leveln_instanceName' 的形式,例如 level0_someMovieClip 指的是主時間軸上的一個 MovieClip。如果我們嘗試轉換陣列,結果字串將包含用逗號分隔的所有元素。如果我們嘗試轉換任何其他物件,我們將得到 [object Object],如果我們嘗試轉換函式,我們將得到 [type Function]。
| 程式碼 | 結果 |
|---|---|
//Assume that someMovieClip is a MovieClip on the stage.
trace(String(new Array(12, 32, 34)));
trace(String(someMovieClip));
trace(String(new Sound));
trace(String(someFunction));
function someFunction():Void{
return;
}
|
|
如果我們在 Number(value) 中放入除 true、false 或僅包含數字的字串以外的任何東西,我們將得到 NaN。
如果我們在 Boolean(value) 中放入除 0 或 1 以外的任何東西,如果該東西為空或未定義,我們將得到 false,否則我們將得到 true。
將字串轉換為整數的另一種方法是使用 parseInt 全域性函式。第一個引數是字串,第二個可選引數是數字系統的基數。
| 程式碼 | 結果 |
|---|---|
trace(parseInt("13.6"));
trace(parseInt("0x14"));
trace(parseInt("1.23e-3"));
trace(parseInt("001101", 2));
|
|
請注意,我們不需要第二個引數用於第二個 trace,因為 0x 已經暗示基數為 16。
現在我們已經瞭解了所有基本資料型別,我們將學習如何運算元組。