型変換は、値が別のデータ型の値に変換されることです。 型変換は、暗黙的または明示的に行うことができます。暗黙的な変換は、強制型変換とも呼ばれ、実行時に行われることがあります。例えば、値 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]
|