変数

変数を使用すると、プログラムで使用する値を格納できます。 変数を宣言するには、変数名を使用した var ステートメントを使用する必要があります。ActionScript 3.0 では、常に var ステートメントを使用する必要があります。例えば、ActionScript の次の行は、 i という名前の変数を宣言します。

var i;

変数を宣言するときに var ステートメントを省略すると、strict モードではコンパイルエラーが発生し、standard モードではランタイムエラーが発生します。例えば、次のコード行は、変数 i があらかじめ定義されていない場合はエラーになります。

i; // error if i was not previously defined

変数をデータ型に関連付ける場合は、変数を宣言するときに行います。 変数の型を指定しないで変数を宣言することができますが、strict モードではコンパイラー警告が生成されます。変数の型は、変数名にコロン(:)を付け、その後に変数の型を追加することで指定します。例えば、次のコードは int 型の変数 i を宣言します。

var i:int;

代入演算子( = )を使用して、変数に値を割り当てることができます。例えば、次のコードは、変数 i を宣言し、その変数に値 20 を割り当てます。

var i:int; 
i = 20;

次の例に示すように、変数を宣言するときに同時に変数を割り当てる方が便利です。

var i:int = 20;

変数を宣言するときに変数に値を割り当てる手法は、整数やストリングなどのプリミティブな値を割り当てる場合だけではなく、配列を作成する場合やクラスのインスタンスをインスタンス化する場合にもよく使用されています。 次の例は、コードを 1 行使用して宣言され、値が割り当てられる配列を示します。

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

new 演算子を使用して、クラスのインスタンスを作成することができます。次の例では、 CustomClass というクラスのインスタンスを作成し、新しく作成されたクラスインスタンスへの参照を customItem という変数に割り当てます。

var customItem:CustomClass = new CustomClass();

複数の変数を宣言する場合は、カンマ演算子( , )を使用して変数を区切り、1 行のコードですべての変数を宣言することができます。例えば、次のコードは、コード 1 行で 3 つの変数を宣言します。

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

同じコード行で、各変数に値を割り当てることもできます。 例えば、次のコードは 3 つの変数( a b および c )を宣言し、各変数に値を割り当てます。

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

カンマ演算子を使用して変数宣言を 1 つのステートメントにグループ化できますが、コードの可読性が低下する可能性があります。

変数のスコープについて

変数のスコープとは、レキシカル参照によって変数にアクセスできるコードの範囲です。グローバル変数は、コードのすべての範囲で定義される変数で、ローカル変数は、コードの一部分でのみ定義される変数です。ActionScript 3.0 では、変数には、常にその変数が宣言された関数またはクラスのスコープが割り当てられます。 グローバル変数は、関数またはクラスの定義の外部で定義する変数です。 例えば、次のコードは、関数の外部で宣言して、グローバル変数 strGlobal を作成します。この例では、グローバル変数は関数定義の内部および外部の両方で利用できることを示します。

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

ローカル変数を宣言するには、関数定義内で変数を宣言します。 ローカル変数を定義できるコードの最小範囲が関数定義です。 関数内で宣言されたローカル変数は、その関数内でのみ存在します。例えば、変数 str2 を関数 localScope() の中で宣言すると、この変数は関数の外部では利用できません。

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

C++ や Java の変数とは異なり、ActionScript の変数にはブロックレベルのスコープはありません。 コードブロックは、左中括弧( { )と右中括弧( } )で囲まれたステートメントのグループです。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 変数が宣言される前に num 変数の初期 trace() 関数が実行される場合でも、次のコードはコンパイルされます。

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

しかし、コンパイラーは代入ステートメントをホイストしません。 このため、 num の初期の trace() は数値データ型の変数のデフォルト値である NaN (非数)になります。つまり、次の例に示すように、変数が宣言される前でも変数に値を割り当てることができます。

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 型の変数では、変数が数値でない場合にブール値 true を返し、そうでない場合に false を返す isNaN() という名前の特殊なトップレベル関数があります。