型変換

型変換は、値が別のデータ型の値に変換されることです。 型変換は、暗黙的または明示的に行うことができます。暗黙的な変換は、強制型変換とも呼ばれ、実行時に Flash Player または Adobe AIR によって行われることがあります。例えば、値 2 が Boolean データ型の変数に割り当てられると、Flash Player または Adobe AIR は値 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 型のいずれかにキャストできます。 何らかの理由で Flash Player または Adobe AIR で数値を変換できない場合、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

Flash Player または Adobe AIR でストリングを数値に変換できる場合は数値、それ以外の場合は 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]