JavaScript 2.0
ライブラリ
型 |
2003/06/04 (Wed)
JavaScript 2.0 では以下の型が定義済みである:
JavaScript 1.5 とは異なりオブジェクトとプリミティブ値 (単純値)
の区別は無く、全ての値がメソッドを持つことができる。クラスの中にはその値が封印されている (sealed)
ものもあり、これらには動的プロパティの追加は認められない。ユーザ定義クラスについては final
クラス修飾子を使うことでプリミティブ値のような振る舞いを持たせることが可能である。
上に挙げた型名は予約語ではない 。これらはローカル変数やクラスメンバの名前として使用することができる。しかしながらこれらはグローバルスコープで定数として定義されているため、パッケージ内でグローバル変数名として使用することはできない。
Object は全ての型の基底型であり、Never は全ての型の派生型である。Never
は、無限ループに落ち込むか常に例外を投げるために通常は値を返さない関数の戻り値の型を記述するのに有用である。Never
は変数や仮引数の型には使用できない。Void は、処理を返すことはできるが特に値を返さない関数の戻り値の型を記述するのに有用である。「根拠」も見よ。
数値リテラルは Number 型のメンバであり、整数値を保持する場合は Integer
型のメンバでもある。文字列リテラルは String 型のメンバである。char 型のリテラルは存在しない。char
値は明示的、もしくは暗黙の型変換によってのみ作成される。
式 new f (f は関数) で作成されたオブジェクトは Object 型になる。
class 宣言で定義されたあらゆるクラスもまた、そのクラスと子孫クラスのインスタンスの集合を表す型である。これには定義済みクラスも含まれ
Object や Date なども全て型である。null はユーザ定義クラスのインスタンスである。undefined
がユーザ定義クラスのインスタンスになることはない。
型は普通、変数に格納できるオブジェクトや関数の実引数として渡すことのできるオブジェクトの集合を制限するのに使用される。例えば次の宣言
var x:Integer;
は、変数 x に格納できる値を整数に制限している。
型宣言は変数の読み取りや、そのプロパティへのアクセスにおけるセマンティクスに影響を与えない。従って、例えば式 new MyType()
が MyType 型の値を返す限り、以下の2つのコード片は等価である。
var x:MyType = new MyType(); x.foo();
var x = new MyType(); x.foo();
これらのコード片が MyType クラス宣言内に書かれ、foo がそのクラスの非公開フィールドである場合でも、この等価性は常に成り立つ。当然、本当の型を注釈として追加してもプログラムの意味は変わらない。
JavaScript 2.0 では型式と値式を構文的に区別しない。そのため型式は型として評価されるコンパイル時定数であれば何でも良い。
型は値でもあり (その型は Type)、式中での使用、変数への代入、関数へ渡すことなどが可能である。例えば次のコードは、
const R:Type = Number;
function abs_val(x:R):R {
return x<0 ? -x : x;
}
以下と等価である:
function abs_val(x:Number):Number {
return x<0 ? -x : x;
}
暗黙の強制型変換は以下のような状況で起こり得る:
undefined が型 t に暗黙の型変換されるいずれの場合でも、v t であれば v の変換は起こらない。v t であれば、t が値 v について暗黙の型変換マッピングを定義している場合に限ってマップされた v が使用される。それ以外の場合はエラーになる。
明示的な強制型変換は暗黙のそれに比べてより積極的な型変換を行う。明示的な強制型変換を行うには、型を関数として使用し、変換する値を引数として渡す:
type(value)
例えば Integer(258.1) は整数 258 を返し、String(2+2==4) は文字列
"true" を返す。
value が既に type のメンバであれば、明示的な強制型変換は value を変換せずに返す。value が type に暗黙の強制型変換可能であれば、暗黙の強制型変換の結果を返す。それ以外の場合は type の明示的型変換マッピングが使用される。
| Waldemar Horwat 最終更新: 2003年6月4日 (水) |