データ型

データ型は値のセットを定義します。例えば、Boolean データ型は、厳密に 2 つの値 true false のセットです。ActionScript 3.0 では、Boolean データ型に加えて、String、Number、Array などのよく使用されるデータ型が定義されています。 独自のデータ型を定義するには、クラスまたはインターフェイスを使用して値のカスタムセットを定義します。 ActionScript 3.0 のすべての値は、プリミティブ値または複合値にかかわらず、オブジェクトです。

プリミティブ値とは、Boolean、int、Number、String、および uint のいずれかのデータ型に属する値を言います。ActionScript では、プリミティブ値はメモリとスピードを最適化できるように特別に格納されるので、通常プリミティブ値は複合値より速く操作できます。

注意: 技術的に説明すると、ActionScript ではプリミティブ値はイミュータブルオブジェクトとして内部的に格納されます。 イミュータブルオブジェクトとして格納されるということは、参照渡しが値渡しと同じように効果的であることを示しています。 参照は通常、値自体よりかなり小さいので、これによりメモリ使用量が削減し、実行速度が向上します。

複合値とはプリミティブ値ではない値です。複合値のセットを定義するデータ型には、Array、Date、Error、Function、RegExp、XML、XMLList などがあります。

多くのプログラム言語では、プリミティブ値とそのラッパーオブジェクトは区別されています。 例えば、Java には int プリミティブとそれをラップする java.lang.Integer クラスがあります。 Java のプリミティブはオブジェクトではありませんが、そのラッパーはオブジェクトです。このため、処理によってはプリミティブを使用する方が便利な場合とラッパーオブジェクトを使用する方が適切な場合とがあります。 ActionScript 3.0 では、プリミティブ値とそのラッパーオブジェクトは実際には区別できません。 プリミティブ値を含むすべての値はオブジェクトです。 ランタイムでは、これらのプリミティブ型は、オブジェクトのように動作しながら、オブジェクトを作成するための通常のオーバーヘッドが不要な特殊なケースとして扱われます。これは、次の 2 つのコード行が同等であることを意味します。

var someInt:int = 3; 
var someInt:int = new int(3);

上記に示したすべてのプリミティブデータ型と複合データ型は、ActionScript 3.0 コアクラスで定義されています。 コアクラスを使用すると、 new 演算子を使用する代わりにリテラル値を使用してオブジェクトを作成できます。例えば、次のようにリテラル値または Array クラスのコンストラクターを使用して、配列を作成することができます。

var someArray:Array = [1, 2, 3]; // literal value 
var someArray:Array = new Array(1,2,3); // Array constructor

型チェック

型チェックは、コンパイル時または実行時のいずれかの時点で行われます。 C++ や Java のような型指定を静的に行う言語では、コンパイル時に型チェックを行います。 Smalltalk や Python のような型指定を動的に行う言語では、実行時に型チェックを行います。 ActionScript 3.0 は型指定を動的に行う言語なので、実行時に型チェックが行われますが、strict モードと呼ばれる特別なコンパイラーモードでのコンパイル時型チェックもサポートされています。strict モードでは、型チェックはコンパイル時と実行時の両方で行われますが、standard モードでは、型チェックは実行時にのみ行われます。

型指定を動的に行う言語では、コードを非常に柔軟に構成できる反面、型指定エラーが実行時に明らかになるという難点があります。 型指定を静的に行う言語では、コンパイル時に型指定エラーが報告されますが、コンパイル時に型情報が分かっている必要があるという難点があります。

コンパイル時の型チェック

コンパイル時の型チェックは、大規模なプロジェクトでよく利用されます。プロジェクトの規模が拡大するにつれて、通常はデータ型の柔軟性よりできるだけ早い時点で型指定エラーを把握する方が重要になるためです。 これは、デフォルトで Flash Professional と Flash Builder の ActionScript コンパイラーが strict モードで実行するように設定されているからです。

Adobe Flash Builder

Flash Builder で strict モードを無効にするには、プロジェクトプロパティダイアログボックスの ActionScript コンパイラー設定を使用します。

コンパイル時に型チェックを行うためには、コンパイラーがコード内の変数または式のデータ型情報を分かっている必要があります。 変数のデータ型を明示的に宣言するには、変数名の接尾辞としてコロン演算子( : )とその後ろにデータ型を追加します。データ型をパラメーターに関連付けるには、コロン演算子の後ろにデータ型を使用します。 例えば、次のコードは xParam パラメーターにデータ型の情報を追加し、変数 myParam を明示的なデータ型で宣言します。

function runtimeTest(xParam:String) 
{ 
    trace(xParam); 
} 
var myParam:String = "hello"; 
runtimeTest(myParam);

strict モードでは、ActionScript コンパイラーは、型の不一致をコンパイルエラーとしてレポートします。 例えば、次のコードは、Object 型の関数パラメーター xParam を宣言した後で、このパラメーターに String 型と Number 型の値を割り当てようとします。これは、strict モードでコンパイルエラーを発生します。

function dynamicTest(xParam:Object) 
{ 
    if (xParam is String) 
    { 
        var myStr:String = xParam; // compiler error in strict mode 
        trace("String: " + myStr); 
    } 
    else if (xParam is Number) 
    { 
        var myNum:Number = xParam; // compiler error in strict mode 
        trace("Number: " + myNum); 
    } 
}

ただし、strict モードの場合でも、型指定されていない代入ステートメントの右側をそのままにして、コンパイル時の型チェックを行わないように選択できます。 変数または式に型指定なしとマークするには、型注釈を省略するか、特別なアスタリスク( * )型注釈を使用します。例えば、上記の例で、型注釈を使用しないように xParam パラメーターを変更して、strict モードでコードをコンパイルします。

function dynamicTest(xParam) 
{ 
    if (xParam is String) 
    { 
        var myStr:String = xParam; 
        trace("String: " + myStr); 
    } 
    else if (xParam is Number) 
    { 
        var myNum:Number = xParam; 
        trace("Number: " + myNum); 
    } 
} 
dynamicTest(100) 
dynamicTest("one hundred");

実行時の型チェック

ActionScript 3.0 では、実行時の型チェックは、strict モードと standard モードのいずれでコンパイルされるかに関係なく行われます。 配列を必要とする関数に値 3 がパラメーターとして渡されるとします。 strict モードでは、値 3 は Array データ型と互換性がないため、コンパイラーはエラーを生成します。 strict モードを無効にし、standard モードで実行すると、コンパイラーは型の不一致について報告しませんが、実行時の型チェックではライタイムエラーになります。

次の例では、Array 引数を必要とするにもかかわらず、値 3 が渡される typeTest() という名前の関数を示します。この場合、値 3 はパラメーターで宣言されたデータ型(Array)のメンバーではないので、standard モードでランタイムエラーが発生します。

function typeTest(xParam:Array) 
{ 
    trace(xParam); 
} 
var myNum:Number = 3; 
typeTest(myNum);  
// run-time error in ActionScript 3.0 standard mode

strict モードで操作しているときでも、実行時の型指定エラーが発生する場合もあります。 これは strict モードを使用しているときに、型指定されていない変数を使用してコンパイル時の型チェックをしないようにしている場合に発生します。 型指定されていない変数を使用すると、型チェックは省略されるのではなく、実行時まで保留されます。 例えば、上記の例の myNum 変数に宣言したデータ型が存在しない場合、コンパイラーは型の不一致を検出できません。ただし、このコードは、代入ステートメントの結果として 3 に設定された実行時の値 myNum を Array データ型に設定された xParam の型と比較するので、ランタイムエラーを生成します。

function typeTest(xParam:Array) 
{ 
    trace(xParam); 
} 
var myNum = 3; 
typeTest(myNum);  
// run-time error in ActionScript 3.0

実行時に型チェックを行うと、コンパイル時に型チェックを行うより継承を柔軟に使用することができます。 standard モードでは、型チェックを実行時まで保留することで、アップキャストする場合でもサブクラスのプロパティを参照できます。アップキャストは、基本クラスを使用してクラスインスタンスの型を宣言し、クラスのインスタンス化にサブクラスを使用するときに行われます。 例えば、拡張可能な ClassBase という名前のクラスを作成することができます( final 属性を持つクラスは拡張できません)。

class ClassBase 
{ 
}

続いて、次のように someString という名前の 1 つのプロパティを持つ ClassExtender という名前の ClassBase のサブクラスを作成することができます。

class ClassExtender extends ClassBase 
{ 
    var someString:String; 
}

両方のクラスを使用して、ClassBase データ型を使用して宣言されているが、ClassExtender コンストラクターを使用してインスタンス化されているクラスインスタンスを作成することができます。 基本クラスにはサブクラスにないプロパティやメソッドは含まれないので、アップキャストは安全な操作と考えられています。

var myClass:ClassBase = new ClassExtender();

ただし、サブクラスには、その基本クラスに含まれないプロパティまたはメソッドが含まれます。 例えば、ClassExtender クラスには someString プロパティが含まれますが、このプロパティは ClassBase クラスには含まれません。ActionScript 3.0 の standard モードでは、次の例に示すように、 myClass インスタンスを使用してコンパイル時エラーを生成せずにこのプロパティを参照することができます。

var myClass:ClassBase = new ClassExtender(); 
myClass.someString = "hello"; 
// no error in ActionScript 3.0 standard mode

is 演算子

is 演算子を使用すると、変数または式が特定のデータ型のメンバーであるかどうかをテストすることができます。旧バージョンの ActionScript では instanceof 演算子に同じ機能がありましたが、ActionScript 3.0 では instanceof 演算子はデータ型のメンバーシップのテストに使用しません。手動による型チェックでは、 instanceof 演算子の代わりに is 演算子を使用する必要があります。これは、式 x instanceof y は、 x のプロトタイプチェーンに y があるかどうかをチェックするだけであるため、また ActionScript 3.0 では、プロトタイプチェーンで継承階層全体を確認できないためです。

is 演算子は、適切な継承階層を調べます。また、オブジェクトが特定のクラスのインスタンスであるかどうかだけではなく、特定のインターフェイスを実装するクラスのインスタンスであるかどうかも調べるために使用することができます。次の例では、Sprite クラスのインスタンス mySprite を作成し、 is 演算子を使用して mySprite が Sprite クラスおよび DisplayObject クラスのインスタンスであるかどうか、および IEventDispatcher インターフェイスを実装しているかどうかをテストします。

var mySprite:Sprite = new Sprite(); 
trace(mySprite is Sprite); // true 
trace(mySprite is DisplayObject);// true 
trace(mySprite is IEventDispatcher); // true

is 演算子は、継承階層を調べて、 mySprite が Sprite クラスおよび DisplayObject クラスと互換性があることを適切に報告します。ただし、Sprite クラスは DisplayObject クラスのサブクラスです。 is 演算子は、 mySprite が IEventDispatcher インターフェイスを実装するクラスを継承するかどうかも調べます。Sprite クラスは、IEventDispatcher インターフェイスを実装する EventDispatcher クラスを継承するため、 is 演算子は、 mySprite が同じインターフェイスを実装することを正しく報告します。

次の例は、前の例と同じテストを示していますが、 is 演算子の代わりに instanceof 演算子を使用しています。 instanceof 演算子は mySprite が Sprite または DisplayObject のインスタンスであることを正しく識別しますが、 mySprite が IEventDispatcher インターフェイスを実装しているかどうかをテストするのに使用すると false を返します。

trace(mySprite instanceof Sprite); // true 
trace(mySprite instanceof DisplayObject);// true 
trace(mySprite instanceof IEventDispatcher); // false

as 演算子

as 演算子を使用しても、式が指定されたデータ型のメンバーであるかどうかをチェックすることができます。しかし、 is 演算子とは異なり、 as 演算子はブール値を返しません。 as 演算子は、 true の代わりに式の値、 false の代わりに null を返します。次の例は、Sprite インスタンスが DisplayObject、IEventDispatcher、および Number データ型のメンバーであるかどうかをチェックする場合に、 is 演算子の代わりに as 演算子を使用した結果を示します。

var mySprite:Sprite = new Sprite(); 
trace(mySprite as Sprite);                 // [object Sprite] 
trace(mySprite as DisplayObject);                 // [object Sprite] 
trace(mySprite as IEventDispatcher);                 // [object Sprite] 
trace(mySprite as Number);                                       // null

as 演算子を使用する場合、右側のオペランドはデータ型である必要があります。右側のオペランドにデータ型ではなく式を使用しようとすると、エラーになります。

ダイナミッククラス

ダイナミッククラスは、プロパティおよびメソッドを追加したり変更したりすることで実行時に変更可能なオブジェクトを定義します。String クラスなどの動的ではないクラスは、sealed クラスです。実行時に、sealed クラスにプロパティまたはメソッドを追加することはできません。

ダイナミッククラスを作成するには、クラスを宣言するときに dynamic 属性を使用します。例えば、次のコードは Protean という名前のダイナミッククラスを作成します。

dynamic class Protean 
{ 
    private var privateGreeting:String = "hi"; 
    public var publicGreeting:String = "hello"; 
    function Protean() 
    { 
        trace("Protean instance created"); 
    } 
}

後から Protean クラスのインスタンスをインスタンス化する場合、クラス定義外のインスタンスにプロパティまたはメソッドを追加することができます。例えば、次のコードは、 Protean クラスのインスタンスを作成し、プロパティ aString とプロパティ aNumber をそのインスタンスに追加します。

var myProtean:Protean = new Protean(); 
myProtean.aString = "testing"; 
myProtean.aNumber = 3; 
trace(myProtean.aString, myProtean.aNumber); // testing 3

ダイナミッククラスのインスタンスに追加したプロパティは、実行時エンティティです。したがって、型チェックは実行時に行われます。 この方法で追加されたプロパティに型注釈を追加することはできません。

また、 myProtean インスタンスにメソッドを追加するには、関数を定義し、その関数を myProtean インスタンスのプロパティに関連付けます。次のコードは、trace ステートメントを traceProtean() というメソッドに移動します。

var myProtean:Protean = new Protean(); 
myProtean.aString = "testing"; 
myProtean.aNumber = 3; 
myProtean.traceProtean = function () 
{ 
    trace(this.aString, this.aNumber); 
}; 
myProtean.traceProtean(); // testing 3

しかし、この方法で作成されたメソッドは、Protean クラスのプライベートプロパティまたはメソッドにアクセスできません。 また、 Protean クラスのパブリックプロパティまたはメソッドへの参照も、 this キーワードまたはクラス名のいずれかで修飾する必要があります。次の例は、 Protean クラスのプライベート変数およびパブリック変数にアクセスしようとする traceProtean() メソッドを示します。

myProtean.traceProtean = function () 
{ 
    trace(myProtean.privateGreeting); // undefined 
    trace(myProtean.publicGreeting); // hello 
}; 
myProtean.traceProtean();

データ型の詳細

プリミティブデータ型には、Boolean、int、Null、Number、String、uint、および void があります。 ActionScript コアクラスは、複合データ型 Object、Array、Date、Error、Function、RegExp、XML、および XMLList も定義します。

Boolean データ型

Boolean データ型は、 true false の 2 つの値で構成されます。Boolean 型の変数に有効な値は、この 2 つだけです。 宣言されているが、初期化されていない Boolean 変数のデフォルト値は false です。

int データ型

int データ型は、32 ビット整数として内部に保存され、

-2,147,483,648 (-2 31 )~ 2,147,483,647(2 31 - 1)(両端を含む)の整数のセットで構成されます。 旧バージョンの ActionScript には、整数と浮動小数点数の両方に使用する Number データ型しかありませんでした。 ActionScript 3.0 では、32 ビット符号付および符号なし整数の低レベルマシン型にアクセスすることができるようになりました。 変数が浮動小数点数を使用しない場合、Number データ型ではなく int データ型を使用する方が速く、効率的です。

最小 int 値と最大 int 値の範囲外の整数値の場合は、Number データ型を使用します。Number データ型では、-9,007,199,254,740,992 ~ +9,007,199,254,740,992 の値(53 ビット整数値)を処理できます。 int データ型である変数のデフォルト値は 0 です。

Null データ型

Null データ型は、1 つの値 null だけで構成されます。これは、String データ型および Object クラスを含む複合データ型を定義するすべてのクラスのデフォルト値です。 Boolean、Number、int、uint などの他のプリミティブデータ型には、値 null は含まれません。Boolean 型、Number 型、int 型、uint 型 のいずれかの変数に値 null を割り当てようとすると、実行時に null が適切なデフォルト値に変換されます。このデータ型を型注釈として使用することはできません。

Number データ型

ActionScript 3.0 では、Number データ型は、整数、符号なし整数、および浮動小数点数を表すことができます。 ただし、パフォーマンスを最大化するために、32 ビット int および uint 型より大きい整数値に対してのみ、Number データ型を使用する必要があります。また、Number データ型には、浮動小数点数を格納することができます。浮動小数点数を格納するには、数値に小数点を含めます。 小数点を省略すると、数値は整数として格納されます。

Number データ型では、2 進数浮動小数点計算のための IEEE 規格(IEEE-754)で指定されている 64 ビット倍精度フォーマットを使用します。この規格では、64 ビットを使用して浮動小数点数を格納する方法が指定されています。1 ビットを使用して数値が正か負かを指定します。指数には 11 ビットが使用され、2 を底として格納されます。残りの 52 ビットは、指数で指定される累乗した数値である仮数部(仮数とも呼ばれます)を格納するために使用されます。

Number データ型では、ビットの一部を使用して指数を格納することで、仮数のビットすべてを使用する場合より大きな浮動小数点数を格納できます。 例えば、Number データ型で 64 ビットすべてを使用して仮数を格納した場合は、2 65 - 1 の数値を格納できます。Number データ型では、11 ビットを使用して指数を格納することで、仮数を 2 1023 乗できます。

Number 型が表すことができる最大値と最小値は、 Number.MAX_VALUE および Number.MIN_VALUE と呼ばれる Number クラスの静的プロパティに格納されます。

Number.MAX_VALUE == 1.79769313486231e+308 
Number.MIN_VALUE == 4.940656458412467e-324

この数値の範囲が膨大である一方で、この範囲の精度が犠牲になっています。 Number データ型では、仮数の格納に 52 ビットを使用します。その結果、分数 1/3 など、正確に表すためには 53 ビット以上必要な数値は近似値にしかなりません。 アプリケーションで小数値を持つ絶対精度が必要な場合、2 進浮動小数点数計算ではなく、10 進浮動小数点計算を実装するソフトウェアを使用する必要があります。

Number データ型で整数値を格納する場合、仮数の 52 ビットだけが使用されます。 Number データ型は、これらの 52 ビットと特殊な非表示のビットを使用して、-9,007,199,254,740,992(-2 53 )~ 9,007,199,254,740,992(2 53 )の整数を表します。

NaN 値は、 Number 型の変数のデフォルト値としてだけではなく、数値を返す必要があるが返さない演算の結果としても使用します。例えば、負の数値の平方根を計算しようとすると、その結果は NaN になります。その他の特殊な Number の値には正の無限大と負の無限大があります。

注意: 0 による除算の結果は、除数も 0 の場合、 NaN だけです。 0 による除算の結果は、被除数が正の場合に 正の無限大 、被除数が負の場合に 負の無限大 となります。

String データ型

String データ型は、16 ビット文字のシーケンスを表します。 ストリングは、UTF-16 形式を使用して、Unicode 文字として内部的に格納されます。 ストリングは、Java プログラミング言語の場合と同様に不変値です。 String 値に対する操作は、そのストリングの新しいインスタンスを返します。 String データ型で宣言される変数のデフォルト値は null です。値 null は、空のストリング( "" )とは異なります。値 null は、変数に格納されている値がないということを意味するのに対して、空のストリングは、変数に格納されている値が文字を含まないストリングであることを意味します。

uint データ型

uint データ型は、32 ビット符号なし整数として内部に保存され、0 ~ 4,294,967,295(2 32 - 1)(両端を含む)の整数のセットで構成されます。負以外の整数が必要な特別な場合に、uint データ型を使用します。 例えば、ピクセルカラー値を表すためには uint データ型を使用する必要があります。これは、int データ型にはカラー値の処理には適していない内部符号ビットがあるためです。 最大 uint 値より大きな整数値には、53 ビット整数値を処理できる Number データ型を使用します。 uint データ型の変数のデフォルト値は 0 です。

void データ型

void データ型は、1 つの値 undefined だけで構成されます。旧バージョンの ActionScript では、 undefined は Object クラスのインスタンスのデフォルト値でした。ActionScript 3.0 では、Object インスタンスのデフォルト値は null です。値 undefined を Object クラスのインスタンスに割り当てようとすると、この値は null に変換されます。型指定されていない変数には、 undefined という値のみを割り当てることができます。型指定されていない変数は、型注釈がないか、型注釈にアスタリスク記号( * )が使用されている変数です。 void は、戻り値の型注釈としてのみ使用することができます。

Object データ型

Object データ型は Object クラスによって定義されます。 Object クラスは、ActionScript のすべてのクラス定義の基本クラスです。 ActionScript 3.0 の Object データ型は、次の 3 つの点で旧バージョンとは異なります。 1 つ目は、Object データ型は、型注釈のない変数に割り当てられるデフォルトのデータ型ではなくなりました。 2 つ目は、Object データ型には、Object インスタンスのデフォルト値であった値 undefined が含まれなくなりました。3 つ目は、ActionScript 3.0 では、Object クラスのインスタンスのデフォルト値が null になった点です。

旧バージョンの ActionScript では、型注釈のない変数には自動的に Object データ型が割り当てられていました。 ActionScript 3.0 ではこれは行われず、真に型指定されていない変数の概念が導入されました。 型注釈のない変数は、型が指定されていないと見なされます。 コード内で変数の型を指定しないままにしておくことを明確に示す場合、型注釈にアスタリスク記号( * )を使用することができます。これは、型注釈を省略するのと同じことを示します。次の例は、いずれも型指定されていない変数 x を宣言する 2 つの同等のステートメントを示します。

var x 
var x:*

型指定されていない変数だけが値 undefined を保持することができます。値 undefined をデータ型が指定されている変数に割り当てようとすると、ランタイムは値 undefined をそのデータ型のデフォルト値に変換します。データ型のインスタンスでは、デフォルト値は null です。これは、Object インスタンスに undefined を割り当てようとすると、値が null に変換されることを意味します。

型変換

型変換は、値が別のデータ型の値に変換されることです。 型変換は、暗黙的または明示的に行うことができます。暗黙的な変換は、強制型変換とも呼ばれ、実行時に行われることがあります。例えば、値 2 を Boolean データ型の変数に割り当てると、値 2 はブール値 true に変換されかてら、変数に割り当てらます。明示的な変換は、キャストとも呼ばれ、コードであるデータ型の変数を別のデータ型に属している場合と同様に処理するようにコンパイラーに指示されると実行されます。プリミティブ値が使用されている場合、キャストによって実際にあるデータ型の値が別のデータ型に変換されます。 オブジェクトを異なる型にキャストするには、オブジェクト名を括弧で囲み、その前に新しい型の名前を置きます。 例えば、次のコードはブール値を取り、整数にキャストします。

var myBoolean:Boolean = true; 
var myINT:int = int(myBoolean); 
trace(myINT); // 1

暗黙的な変換

暗黙的な変換は、次のような状況で実行時に行われます。

  • 代入ステートメント内

  • 値が関数パラメーターとして渡されるとき

  • 関数から値が返されるとき

  • 加算( + )演算子などの特定の演算子を使用した式内

    ユーザー定義型の場合、変換される値が変換先のクラスまたは変換先のクラスから派生するクラスのインスタンスである場合に、暗黙的な変換は成功します。 暗黙的な変換が成功しなかった場合は、エラーが発生します。 例えば、次のコードには、成功する暗黙的な変換と失敗する暗黙的な変換が含まれています。

    class A {} 
    class B extends A {} 
     
    var objA:A = new A(); 
    var objB:B = new B(); 
    var arr:Array = new Array(); 
     
    objA = objB; // Conversion succeeds. 
    objB = arr; // Conversion fails.

    プリミティブ型の場合、暗黙的な変換は、明示的な変換関数によって呼び出される同じ内部変換アルゴリズムを呼び出して処理されます。

明示的な変換

strict モードでコンパイルする場合、明示的な変換、つまりキャストを使用すると便利です。型の不一致によるコンパイル時エラーを生成したくない場合があるためです。これは、実行時に強制的に値が適切に変換されることがわかっている場合などです。 例えば、フォームから受信したデータを操作するとき、強制的にストリング値を数値に変換することができます。 次のコードは、コードが standard モードで正しく実行されている場合であっても、コンパイル時エラーを発生します。

var quantityField:String = "3"; 
var quantity:int = quantityField; // compile time error in strict mode

strict モードを引き続き使用して、ストリングを整数に変換する場合、次のように明示的な変換を使用することができます。

var quantityField:String = "3"; 
var quantity:int = int(quantityField); // Explicit conversion succeeds.

int、uint、および Number へのキャスト

任意のデータ型を 3 つの数値型 int、uint、および Number 型のいずれかにキャストできます。 何らかの理由で数値を変換できない場合、int および uint データ型ではデフォルト値 0 が割り当てられ、Number データ型ではデフォルト値 NaN が割り当てられます。ブール値を数値に変換すると、 true は値 1、 false は値 0 になります。

var myBoolean:Boolean = true; 
var myUINT:uint = uint(myBoolean); 
var myINT:int = int(myBoolean); 
var myNum:Number = Number(myBoolean); 
trace(myUINT, myINT, myNum); // 1 1 1 
myBoolean = false; 
myUINT = uint(myBoolean); 
myINT = int(myBoolean); 
myNum = Number(myBoolean); 
trace(myUINT, myINT, myNum); // 0 0 0

数字のみを含むストリング値は、数値型のいずれかに変換することができます。 数値型では、負の数のように見えるストリングまたは 16 進数値(例えば、 0x1A )を表すストリングも変換することができます。変換プロセスでは、ストリング値の先頭および末尾の空白は無視されます。 Number() を使用して浮動小数点数のように見えるストリングをキャストすることもできます。小数点が含まれていると、 uint() および int() は、小数点とその後の数字が切り捨てられた整数を返します。例えば、次のストリング値は数値にキャストすることができます。

trace(uint("5")); // 5 
trace(uint("-5")); // 4294967291. It wraps around from MAX_VALUE 
trace(uint(" 27 ")); // 27 
trace(uint("3.7")); // 3 
trace(int("3.7")); // 3 
trace(int("0x1A")); // 26 
trace(Number("3.7")); // 3.7

数値以外の文字を含むストリング値は、 int() または uint() でキャストすると 0 を返し、 Number() でキャストすると NaN を返します。変換プロセスでは、先頭および末尾の空白は無視されますが、ストリング値に 2 つの数値を区切る空白がある場合は、0 または NaN が返されます。

trace(uint("5a")); // 0 
trace(uint("ten")); // 0 
trace(uint("17 63")); // 0

ActionScript 3.0 では、 Number() 関数は 8 進数をサポートしていません。ActionScript 2.0 の Number() 関数に先頭が 0 のストリングを指定した場合、数値は 8 進数として解釈され、10 進数に変換されます。これは、ActionScript 3.0 の Number() 関数には当てはまりません。この関数では、先頭の 0 は無視されます。例えば、次のコードは、異なるバージョンの ActionScript を使用してコンパイルすると異なる出力を生成します。

trace(Number("044"));  
// ActionScript 3.0 44 
// ActionScript 2.0 36

数値型の値が別の数値型の変数に割り当てられる場合、キャストは必要ありません。 strict モードでも、数値型は別の数値型に暗黙的に変換されます。 これは、場合によっては、型の範囲を超えると予期しない値になることを示します。 次の例では、予期しない値が生成される場合もありますが、すべて strict モードでコンパイルされます。

var myUInt:uint = -3; // Assign int/Number value to uint variable 
trace(myUInt); // 4294967293 
 
var myNum:Number = sampleUINT; // Assign int/uint value to Number variable 
trace(myNum) // 4294967293 
 
var myInt:int = uint.MAX_VALUE + 1; // Assign Number value to uint variable 
trace(myInt); // 0 
 
myInt = int.MAX_VALUE + 1; // Assign uint/Number value to int variable 
trace(myInt); // -2147483648

次の表に、別のデータ型から Number、int、uint データ型にキャストした結果の概要を示します。

データ型または値

Number、int、uint 型への変換結果

Boolean

値が true の場合は 1、それ以外の場合は 0

Date

Date オブジェクトの内部表現で、1970 年 1 月 1 日午前 0 時(世界時)からのミリ秒

null

0

Object

インスタンスが null で Number 型に変換される場合は NaN 、それ以外の場合は 0

String

ストリングを数値に変換できる場合は数値、それ以外の場合は Number 型に変換されると NaN 、int 型または uint 型に変換されると 0

未定義(undefined)

Number 型に変換される場合は NaN 、int 型または uint 型に変換される場合は 0

Boolean へのキャスト

任意の数値データ型(uint、int、および Number)から Boolean へキャストすると、数値が 0 の場合は false が、それ以外の場合は true が返されます。Number データ型では、値 NaN のときも false になります。次の例では、数値 -1、0、および 1 をキャストした場合の結果を示します。

var myNum:Number; 
for (myNum = -1; myNum<2; myNum++) 
{ 
    trace("Boolean(" + myNum +") is " + Boolean(myNum)); 
}

この例による出力では、3 つの数値の内 0 だけが値 false を返すことを示します。

Boolean(-1) is true 
Boolean(0) is false 
Boolean(1) is true

ストリングが null または空のストリング( "" )の場合、String 値から Boolean 値へキャストすると、 false が返されます。それ以外の場合は、 true を返します。

var str1:String; // Uninitialized string is null. 
trace(Boolean(str1)); // false 
 
var str2:String = ""; // empty string 
trace(Boolean(str2)); // false 
 
var str3:String = " "; // white space only 
trace(Boolean(str3)); // true

Object クラスのインスタンスから Boolean にキャストすると、インスタンスが null の場合は false が返され、それ以外の場合は true が返されます。

var myObj:Object; // Uninitialized object is null. 
trace(Boolean(myObj)); // false 
 
myObj = new Object(); // instantiate  
trace(Boolean(myObj)); // true

Boolean 型の変数は、strict モードで任意のデータ型の値をキャストしないで Boolean 型変数に割り当てることができます。 すべてのデータ型から Boolean データ型への暗黙的な強制型変換は、strict モードでも行われます。 つまり、ほとんどのデータ型とは異なり、strict モードのエラーを防ぐために Boolean 型へのキャストは必要ありません。 次の例では、すべて strict モードでコンパイルされ、実行時に意図したとおりに動作します。

var myObj:Object = new Object(); // instantiate  
var bool:Boolean = myObj; 
trace(bool); // true 
bool = "random string"; 
trace(bool); // true 
bool = new Array(); 
trace(bool); // true 
bool = NaN; 
trace(bool); // false

次の表に、他のデータ型から Boolean データ型へのキャストの結果を要約して示します。

データ型または値

Boolean 型への変換結果

String

値が null または空のストリング( "" )の場合は false 、それ以外の場合は true

null

false

Number、int、uint

値が NaN または 0 の場合は false 、それ以外の場合は true

Object

インスタンスが null の場合は false 、それ以外の場合は true

String へのキャスト

任意の数値データ型から String データ型へキャストすると、数値のストリング表現が返されます。 Boolean 型から String 型にキャストすると、値が true の場合はストリング「 true 」、値が false の場合はストリング「 false 」が返されます。

Object クラスのインスタンスから String データ型にキャストすると、インスタンスが null の場合はストリング「 null 」が返されます。それ以外の場合は、Object クラスから String 型にキャストすると、ストリング「 [object Object] 」が返されます。

Array クラスのインスタンスから String 型にキャストすると、すべての配列エレメントのカンマ区切りリストから構成されるストリングが返されます。例えば、次の String データ型へのキャストは、配列の 3 つのエレメントすべてから成るストリングを 1 つ返します。

var myArray:Array = ["primary", "secondary", "tertiary"]; 
trace(String(myArray)); // primary,secondary,tertiary

Date クラスのインスタンスから String 型にキャストすると、インスタンスに含まれる日付のストリング表現が返されます。 例えば、次の例は Date クラスインスタンスのストリング表現を返します。この出力は、太平洋標準時の場合の結果を示します。

var myDate:Date = new Date(2005,6,1); 
trace(String(myDate)); // Fri Jul 1 00:00:00 GMT-0700 2005

次の表に、別のデータ型から String データ型にキャストした結果の概要を示します。

データ型または値

String 型への変換結果

Array

すべての配列エレメントで構成されるストリング

Boolean

" true " または " false "

Date

Date オブジェクトのストリング表現

null

"null"

Number、int、uint

数値のストリング表現

Object

インスタンスが null の場合は null 、それ以外の場合は [object Object]