變數

變數可以讓您儲存在程式中使用的值。若要宣告變數,必須使用 var 陳述式加上變數名稱。而在 ActionScript 3.0 中,則需要一律必須使用 var 陳述式。例如,下列 ActionScript 程式碼行會宣告名為 i 的變數:

var i;

如果宣告變數時省略 var 陳述式,則在嚴謹模式會發生編譯器錯誤,而在標準模式則會發生執行階段錯誤。例如,如果未事先定義 i 變數,下列程式碼會產生錯誤:

i; // error if i was not previously defined

若要使變數與資料類型產生關聯時,您必須在宣告變數時就這麼做。在未指定變數的類型時宣告變數是合乎規定的作業,但在嚴謹模式中將產生編譯器警告。您可以在變數名稱後面加上冒號 (:) 接著加上變數的類型,以指定變數的類型。例如,下列程式碼會宣告類型為 int 的變數 i

var i:int;

您可以使用指定運算子 (=),將值指定給變數。例如,下列程式碼會宣告變數 i,並將此變數的值指定為 20:

var i:int; 
i = 20;

您可能會發現,在宣告變數時同時指定值會比較方便,如下列範例所示:

var i:int = 20;

在宣告變數時同時指定值的作法,不僅可運用於指定如整數或字串等基本值,也能運用於建立陣列或實體化類別實體。下列範例會示範使用一行程式碼,宣告陣列同時也指定其值。

var numArray:Array = ["zero", "one", "two"];

您可以使用 new 運算子,建立類別的實體。下列範例會建立名為 CustomClass 的實體,同時將新建立之類別實體的參考指派給名為 customItem 的變數:

var customItem:CustomClass = new CustomClass();

如果您要宣告多個變數,可以使用逗號運算子 (,) 分隔變數,在一行程式碼中宣告所有變數。例如,下列程式碼會在一行程式碼中宣告三個變數:

var a:int, b:int, c:int;

您可以在同一行程式碼中為每一個變數指定值。例如,下列程式碼會宣告三個變數 (abc),並為每個變數指定一個值:

var a:int = 10, b:int = 20, c:int = 30;

雖然您可以使用逗號運算子將變數宣告組成一個陳述式,但是這種作法可能會降低程式碼的可讀性。

瞭解變數範圍

變數的「範圍」是語彙參考可以在其中存取變數的程式碼區域。「全域」變數是定義於程式碼所有區域中的一種變數,而「區域」變數則是僅定義於程式碼一部分的一種變數。在 ActionScript 3.0 中,指定給變數的範圍僅限於在其中宣告這些變數的函數或類別。全域變數是您在任何函數或類別定義之外定義的變數。例如,下列程式碼會在任何函數之外宣告,建立全域變數 strGlobal。這個範例顯示,全域變數可以同時在函數定義之內和之外使用。

var strGlobal:String = "Global"; 
function scopeTest() 
{ 
    trace(strGlobal); // Global 
} 
scopeTest(); 
trace(strGlobal); // Global

您可以在函數定義之內宣告變數,藉以宣告區域變數。可供您定義區域變數的最小程式碼區域是函數定義。在函數之內宣告的區域變數,只存在於該函數之中。例如,如果您在名為 localScope() 的函數中宣告名為 str2 的變數,該變數無法在此函數之外使用。

function localScope() 
{ 
    var strLocal:String = "local"; 
} 
localScope(); 
trace(strLocal); // error because strLocal is not defined globally

如果您用於區域變數的變數名稱已宣告為全域變數,當區域變數位於範圍內時,區域定義會隱藏 (或遮蔽) 全域定義。全域變數仍會存在於函數之外。例如,下列程式碼會建立名為 str1 的全域字串變數,然後在 scopeTest() 函數內建立相同名稱的區域變數。函數之內的 trace 陳述式會輸出該變數的區域值,但函數之外的 trace 陳述式則會輸出該變數的全域值。

var str1:String = "Global"; 
function scopeTest () 
{ 
    var str1:String = "Local"; 
    trace(str1); // Local 
} 
scopeTest(); 
trace(str1); // Global

ActionScript 變數與 C++ 和 Java 中的變數不同,不會有區塊層級範圍。程式碼區塊是介於左大括號 ({) 與右大括號 (}) 之間的任何一組陳述式。在像是 C++ 和 Java 這類程式語言中,於程式碼區塊之內宣告的變數無法在該程式碼區塊之外使用。這項範圍限制稱為區塊層級範圍,但在 ActionScript 中並沒有這項限制。如果在程式碼區塊之內宣告變數,則該變數不僅可在該程式碼區塊中使用,也可以在程式碼所屬函數的任何其它部分使用。例如,下列函數包含在各種不同區塊範圍中定義的變數。所有變數都可以透過函數使用。

function blockTest (testArray:Array) 
{ 
    var numElements:int = testArray.length; 
    if (numElements > 0) 
    { 
        var elemStr:String = "Element #"; 
        for (var i:int = 0; i < numElements; i++) 
        { 
            var valueStr:String = i + ": " + testArray[i]; 
            trace(elemStr + valueStr); 
        } 
        trace(elemStr, valueStr, i); // all still defined 
    } 
    trace(elemStr, valueStr, i); // all defined if numElements > 0 
} 
 
blockTest(["Earth", "Moon", "Sun"]);

沒有區塊層級範圍代表一項有趣的含意:您可以在宣告變數之前讀取或寫入,只要在函數結束前宣告即可。這是因為有一個稱為「升舉」的技術,會讓編譯器將所有變數宣告移至函數的最上層。例如,下列程式碼即使在 num 變數的初始 trace() 函數於宣告 num 變數之前發生,也會進行編譯:

trace(num); // NaN 
var num:Number = 10; 
trace(num); // 10

但是,編譯器並不會升舉任何指定陳述式。這說明了 num 之初始 trace() 產生 NaN (非數字) 的原因,此為 Number 資料類型的變數預設值。這表示即使在宣告變數之前,您也可以指定變數的值,如下列範例所示:

num = 5; 
trace(num); // 5 
var num:Number = 10; 
trace(num); // 10

預設值

「預設值」是您設定變數值之前,變數所包含的值。首次設定變數值時,就是在對變數進行「初始化」。如果宣告變數但未設定變數值,該變數就是「未初始化」。未初始化的變數值是依其資料類型而定。下表說明變數的預設值,依資料類型組織整理:

資料類型

預設值

Boolean

false

int

0

Number

NaN

Object

null

String

null

uint

0

未宣告 (相當於類型註釋 *)

undefined

所有其它類別,包括使用者定義的類別。

null

若是 Number 類型的變數,預設值為 NaN (非數字),這是以 IEEE-754 標準定義的特殊值,表示不代表數字的值。

如果您宣告變數,但並未宣告其資料類型,則會套用預設資料類型 *,這其實是表示該變數不具類型。如果也不用值初始化不具類型的變數,其預設值即為 undefined

若是 Boolean、Number、int 和 uint 以外的資料類型,任何未初始化之變數的預設值都是 null。這適用於所有由 ActionScript 3.0 定義的類別,以及您所建立的任何自訂類別。

null 值並不是類型為 Boolean、Number、int 或 uint 等變數的有效值。若嘗試指定 null 的值給上述變數,該值即轉換為該資料類型的預設值。若是 Object 類型變數,您可以指派 null 的值。若嘗試指定 undefined 的值給 Object 類型變數,該值即轉換為 null

若是 Number 類型變數,會有名為 isNaN() 的特殊最上層函數,若變數不是數字,則會傳回 Boolean 值 true;否則會傳回 false