型変換
更新 : 2007 年 11 月
値の型を変更する処理は型変換と呼ばれます。たとえば、文字列の "1234" は数値に変換できます。また、任意の型のデータを String 型に変換できます。成功しない型変換もあります。たとえば、Date オブジェクトは ActiveXObject オブジェクトに変換することはできません。
型変換は、"拡大変換" と "縮小変換" のいずれかです。拡大変換はオーバーフローせず、常に成功しますが、縮小変換は情報の損失を伴う可能性があり、変換に失敗する場合があります。
どちらの変換も、データ型の識別子を使用して明示的に行うか、データ型の識別子を使用せずに暗黙的に実行します。有効な明示的な変換は、情報の損失が生じる場合でも常に成功します。暗黙の型変換は、データが失われない場合にだけ成功します。失われる場合は失敗して、コンパイル エラーかランタイム エラーが生成されます。
変換による損失は、変換元のデータと変換先のデータ型に類似性がない場合に発生します。たとえば、文字列の "Fred" は数値には変換できません。この場合、型変換関数からは既定値が返されます。Number 型の場合、既定値は NaN です。int 型の場合、既定値は 0 です。
文字列から数値への変換など、変換に時間のかかる型もあります。プログラムでは、変換を使用しないほど効率的です。
暗黙の型変換
変数に値を代入する場合など、ほとんどの型変換は自動的に実行されます。変数のデータ型により、式の変換先のデータ型が決まります。
次の例は、暗黙の型変換において、int 値、String 値、および double 値のデータがどのように変換されるかを示しています。
var i : int;
var d : double;
var s : String;
i = 5;
s = i; // Widening: the int value 5 coverted to the String "5".
d = i; // Widening: the int value 5 coverted to the double 5.
s = d; // Widening: the double value 5 coverted to the String "5".
i = d; // Narrowing: the double value 5 coverted to the int 5.
i = s; // Narrowing: the String value "5" coverted to the int 5.
d = s; // Narrowing: the String value "5" coverted to the double 5.
このコードをコンパイルすると、縮小変換に失敗する可能性がある、または縮小変換は低速であることを示す、コンパイル時の警告が発生します。
変換によって情報の損失が生じる場合、暗黙の縮小変換は動作しません。たとえば、次の例は動作しません。
var i : int;
var f : float;
var s : String;
f = 3.14;
i = f; // Run-time error. The number 3.14 cannot be represented with an int.
s = "apple";
i = s; // Run-time error. The string "apple" cannot be converted to an int.
明示的な変換
式を明示的に特定のデータ型に変換するには、データ型の識別子の後に、変換する式をかっこで囲んで指定します。明示的な変換では、プログラマは暗黙の型変換を使用する場合よりも多くの入力が必要となりますが、より確実な結果が得られます。また、明示的な変換では損失を伴う変換も処理できます。
次の例は、明示的な型変換において、int 値、String 値、および double 値のデータがどのように変換されるかを示しています。
var i : int;
var d : double;
var s : String;
i = 5;
s = String(i); // Widening: the int value 5 coverted to the String "5".
d = double(i); // Widening: the int value 5 coverted to the double 5.
s = String(d); // Widening: the double value 5 coverted to the String "5".
i = int(d); // Narrowing: the double value 5 coverted to the int 5.
i = int(s); // Narrowing: the String value "5" coverted to the int 5.
d = double(s); // Narrowing: the String value "5" coverted to the double 5.
明示的な縮小変換は、変換によって情報の損失が生じる場合でも動作します。明示的な型変換を使用しても、互換性のないデータ型は変換できません。たとえば、Date データを RegExp データには変換できません。また、変換される実際的な値がない場合も変換はできません。たとえば、double 値の NaN を明示的に decimal に変換しようとした場合は、エラーがスローされます。NaN に対応する decimal 値がないためです。
次の例では、小数部を持つ数値を整数値に変換し、文字列を整数に変換しています。
var i : int;
var d : double;
var s : String;
d = 3.14;
i = int(d);
print(i);
s = "apple";
i = int(s);
print(i);
出力は次のようになります。
3
0
明示的な変換の動作は、変換元と変換先の両方のデータ型に依存します。