本頁の目次 目次

8 型 (Types)

値は実体であり、9 つの型のうちの 1 つを取る。型は 9 つ (Undefined, Null, Boolean, String, Number, Object, Reference, List, Completion) ある。Reference 型, List 型, Completion 型の値は式評価の中間結果としてのみ使われ、オブジェクトのプロパティに蓄積はできない。

8.1 Undefined 型 (Undefined Type)

Undefined 型は、undefined と呼ばれる厳密には一つの値を持つ。値を代入されていない任意の変数は undefined 値を持つ。

8.2 Null 型 (Null Type)

Null 型は、null と呼ばれる厳密には一つの値を持つ。

8.3 Boolean 型 (Boolean Type)

Boolean 型は、true と false と呼ばれる二値を持つ論理的実体をあらわす。

8.4 String 型 (String Type)

String 型は、0 または 16 ビット符号なし整数値("要素")の、すべての有限な序列のあるシーケンスの組である。ECMAScript プログラムの実行時、String 型は一般にテキストデータの表現に使われる。その中で、文字列内の各要素はコードポイント値(セクション 6 参照) として扱われる。シーケンス内で各要素は位置の占有とみなされる。これらの位置は正の整数でインデックス付けられる。最初の要素が位置 0 で、次の要素は位置 1 であり、以下同様である。文字列の長さは、その中にある要素の数である。空文字列は要素を持たず、長さは 0 である。

文字列が実際のテキストデータを含むとき、各要素は1個の UTF-16 単位として考えられる。これが実際に蓄積された String の形式かどうかに関係なく、String 内部の文字は UTF-16 であらわされたかのように番号付けられる。String 上の全操作は、それらを区別しない 16 ビット符号無し整数の列として扱う; それらは結果の文字列が正規化形式であることを保証しないし、language-sensitive な結果であることも保証しない。

NOTE これらの決定の理論的解釈は単純さとしての文字列と可能性としての高パフォーマンス性の実装を保持することであった。外部から実行環境に入るテキストデータ (ユーザの入力、ファイルやネットワークからの受信などからのテキスト読み込み等) が、実行プログラムがそれを見る前に Unicode 正規化形式 C (Unicode Normarized Form C) に変換されることを意図する。通例これは、入ってくるテキストが元の文字エンコーディングから Unicode に変換されることを同時に発生させる。ECMAScript ソースコードが正規化形式 C であることが勧められるので、それらが Unicode エスケープシーケンスを含んでいない限り、文字列リテラルは正規化されていること(ソーステキストが正規化されることを保証される場合)を保証される。

8.5 Number 型 (Number Type)

Number 型は、ちょうど 18437736874454810627 (即ち 264-253+3) 個の値を持ち、二進法浮動小数点数点演算のための IEEE 標準に定められる倍精度64ビットのフォーマットIEEE 754 の値を表わす。ただし IEEE 標準の 9007199254740990 (すなわち 253-2) 個の区別される "Not-a-Number" 値は ECMAScript においては単独の特殊な NaN 値として表されることを除く。(プログラム実行によりグローバルに定義された変数 NaN が変更されていないと仮定して、NaN 値がプログラム式 NaN によって生成されることに注意。) 外部コードが様々な Non-a-Number 間の違いを判定できる実装もあるだろうが、その振舞いは実装依存である; ECMAScriptコードでは、NaN 値はすべて互いと判別不能である。

他に特別な値が 2 つある。それは正の無限 (positive Infinity) 、および負の無限 (negative Infinity) と呼ばれる。簡単に、解説ではシンボル +∞ と -∞ によってもこれらの値をそれぞれ参照する。(グローバルに定義された変数 Infinity がプログラム実行によって変更されてないと仮定して、これら 2 つの無限数値がプログラム式 +Infinity (あるいは単に Infinity) および -Infinity によって生成されることに注意しなさい。)

残りの 18437736874454810624 (すなわち 264-253) 個の値は有限数と呼ばれる。これらの半分は正の数、半分は負の数である; 有限の正の数のそれぞれについて、同じ大きさを持つ対応する負の数がある。

正の 0 と負の 0 の双方があることに注意。簡単に、解説ではシンボル +0 及び -0 によってもこれらの値をそれぞれ参照する。(これら 2 つの 0 数値はプログラム式 +0 (または単に 0) および -0 によって提示される。)

18437736874454810622 (つまり 264-253-2) 個の 0 でない有限の値は 2 種類ある:

それらのうち 18428729675200069632 (つまり 264-254) 個は次の形式で正規化される。

s × m × 2e

s は +1 または -1 、 m は 252 以上 253 未満の正の整数、e は -1074 以上 971 以下の範囲の整数である。

残りの 9007199254740990 (つまり 253-2) 個の値は次の形式で非正規化 (denormalised) される。

s × m × 2e

s は +1 または -1 、 m は 252 未満の正の整数、e は -1074 である。

大きさが 253 以下の正負の整数全ては Number 型で表現できることに注意(実に、整数 0 は 2 つの表現 +0 と -0 を持つ)。

有限数はそれが 0 でなく (上の 2 つのどちらかの式で) 使われた整数 m が奇数のとき、有効数字は奇数である。そうでなければ、有効数字は偶数である。

本仕様において、正確な 0 以外の実際の数学的な量(それはさらに π のような無理数かもしれない) を x と表わすとき、句 " x の数値" は、次の方法で選ばれた数値を意味する。Number 型のすべての有限の値の集合を考える。 -0 を除外し、 Number 型では表現不能な 2 つの値、すなわち 21024(即ち +1 × 253 × 2971) 及び -21024(即ち -1 × 253 × 2971) を追加する。この集合から x の値に最も近いものを選ぶ。最も近いものが集合内の 2 個ある場合、有効数字が偶数であるもの選ばれる; この用途について、拡張した 2 つの値 21024、そして-21024 は有効数字が偶数とみなす。最後に、21024 が選ばれた場合、それを +∞ に置換する; -21024 が選ばれた場合、それを -∞ に置換する; +0 が選ばれた場合、 x が 0 未満である場合のみそれを -0 に置換する; 他の値が選ばれたら変更はない。この結果が x の数値である。(この過程は、 IEEE 754 "round to nearest" モードの振舞いに正確に該当する。)

-231 以上 231-1 以下、また 0 以上 232-1 以下の範囲の整数のみを扱う ECMAScript 演算子もある。これらの演算子は任意の Number 型の値を受け付けるが、まず最初に 232 個の整数値の一つに変換を行う。それぞれセクション 9.5, 9.6 にある ToInt32 及び ToUint32 演算子の解説を参照。

8.6 Object 型 (Object type)

Object とはプロパティの序列のない集合体である。各プロパティは名前と値、そして属性の組で構成される。

8.6.1 プロパティ属性

プロパティは次の組から0個以上の属性を持つことができる:

属性 説明
ReadOnly 属性 このプロパティは読出し専用のプロパティである。 ECMAScript コードによるこのプロパティの書きこみ試行は無視される。 (注意: 実装によって行われるアクションのために ReadOnly 属性のプロパティの値が変更されるケースもありうる; "ReadOnly" であることは "定数で変更されない" ということではない)
DontEnum 属性 このプロパティは for-in ループ (12.6.3) では列挙されない。
DontDelete 属性 このプロパティの削除を試行しても無視される。 delete 演算子の説明(11.4.1) を参照。
Internal 属性 内部プロパティは名前を持たず、プロパティアクセス演算子経由で直にアクセスできない。 これらのプロパティへのアクセス方法は実装依存である。 言語仕様毎に、使われ方やタイミングによって特定されるプロパティもある。

8.6.2 内部プロパティとメソッド

内部プロパティとメソッドは言語内には露出しない。この文書の目的のために、 ここでは二重角括弧 [[ ]] で囲ってその名前をあらわす。 アルゴリズムがオブジェクトの内部プロパティを使用していて、 指示された内部プロパティをオブジェクトが実装していないとき、ランタイムエラーが発生する。

露出するプロパティのアクセスには 2 種類ある: get と put、取得と設定に相当する。

Native ECMAScript オブジェクトは [[Prototype]] と呼ばれる内部プロパティを持つ。 このプロパティの値は null や オブジェクトであり、継承の実装に使用される。 [[Prototype]] オブジェクトのプロパティは、 子オブジェクトのプロパティの取得には露出するが、設定には露出しない。

次の表はこの仕様で使われる内部プロパティの概要である。 説明は Native ECMAScript オブジェクトのためのそれらの挙動を示す。 Host オブジェクトはこれらの内部メソッドを任意の実装依存の挙動に実装してもよく、また Host オブジェクトは内部メソッドの一部のみを実装して他を実装しなくてもよい。

プロパティ パラメータ 説明
[[Prototype]] 無し このオブジェクトのプロトタイプ。
[[Class]] 無し このオブジェクトの種類。
[[Value]] 無し このオブジェクトに関する内部状態の情報。
[[Get]] (プロパティ名) プロパティの値を返す。
[[Put]] (プロパティ名, 値) 指定されたプロパティに値を設定する。
[[CanPut]] (プロパティ名) 指定されたプロパティ名の [[Put]] 操作が成功するかどうかを示す boolean 値を返す。
[[HasProperty]] (プロパティ名) オブジェクトがすでに与えられた名前のメンバを持っているかを示す boolean 値を返す。
[[Delete]] (プロパティ名) オブジェクトから指定されたプロパティを取り除く。
[[DefaultValue]] (ヒント) オブジェクトのデフォルト値を返すが それは primitive 値でなければならず、オブジェクトや参照であってはならない。
[[Construct]] 呼出側が提供する引数値のリスト オブジェクトを生成する。new 演算子によって呼出される。 この内部メソッドを実装するオブジェクトはコンストラクタ (constructor) と呼ばれる。
[[Call]] 呼出側が提供する引数値のリスト オブジェクトに関連するコードを実行する。 関数呼出の式 (expression) を経由して呼出される。 この内部メソッドを実装するオブジェクトは関数 (function) と呼ばれる。
[[HasInstance]] (値) 値がこのオブジェクトに振る舞いを委任しているかどうかを示す Boolean 値を返す。 Native ECMAScript オブジェクトでは、Function オブジェクトだけが [[Hasinstance]] を実装している。
[[Scope]] 無し その中で Function オブジェクトが実行される環境を定義するスコープ連鎖。
[[Match]] (文字列, インデックス) 正規表現マッチを試行し、 MatchResult 値を返す(15.10.2.1 参照)。

各オブジェクトは [[Class]] プロパティと、[[Get]], [[Put]], [[HasProperty]], [[Delete]], [[DefaultValue]] メソッドを実装しなければならない。Host オブジェクトであっても同様である。(注意: とはいえ、[[DefaultValue]] メソッドは、単にランタイムエラーを生成してもよい。

[[Prototype]] プロパティの値はオブジェクトか null でなければならず、 各 [[Prototype]] 連鎖の長さは有限でなければならない(つまり、任意のオブジェクトから始まる [[Prototype]] プロパティの再帰的アクセスは、結果的に null 値に導かれる)。 Native オブジェクトが Host オブジェクトを [[Prototype]] として持つかどうかは実装に依存する。

各種組込み オブジェクトの [[Class]] プロパティの値はこの仕様で定義される。 Host オブジェクトの [[Class]] プロパティの値は任意の値でよく、組込み オブジェクトからその [[Class]] プロパティのために使用される値でも例外ではない。 この仕様はプログラムに [[Class]] プロパティの値へのアクセスを意味するものは何も提供しないことに注意; これは組込み オブジェクトの種類の違いの区別に内部的に使用される。

各 Native オブジェクトは、セクション 8.6.2.1, 8.6.2.2, 8.6.2.3, 8.6.2.4, 8.6.2.5 で述べられる [[Get]], [[Put]], [[CanPut]], [[HasProperty]], [[Delete]] メソッドをそれぞれ実装する。但し Array オブジェクトの [[Put]] メソッドの実装はわずかに異なる(15.4.5.1)。 Host オブジェクトは任意の方法でこれらのメソッドを実装してよい; 例えば、特殊な Host オブジェクトの [[Get]] 及び [[Put]] が、プロパティに値を格納するが [[HasProperty]] は常に false を生成する可能性がある。

次のアルゴリズム説明において、 O を Native ECMAScript オブジェクト、P を文字列と仮定する。

8.6.2.1 [[Get]] (P)

O の [[Get]] メソッドがプロパティ名 P で呼出されると、次のステップがとられる:

  1. OP という名前のプロパティを持っていなければ、ステップ 4 へ進む。
  2. そのプロパティの値を取得する。
  3. Result(2) を返す。
  4. O の [[Prototype]] が null ならば、undefined を返す。
  5. [[Prototype]] の [[Get]] メソッドを、プロパティ名 P で呼び出す。
  6. Result(5) を返す。

8.6.2.2 [[Put]] (P, V)

O の [[Put]] メソッドがプロパティ P と値 V で呼び出された場合、次のステップがとられる:

  1. O の [[CanPut]] メソッドを、名前 P で呼び出す。
  2. Result(1) が false なら戻る。
  3. O が名前 P のプロパティを持っていなければ、ステップ 6 へ進む。
  4. そのプロパティの値に V を設定する。プロパティの属性は変更されない。
  5. 戻る。
  6. 名前 P のプロパティを生成し、その値に V を設定し、空の属性を与える。
  7. 戻る。

しかし、O が Array オブジェクトである場合、より入念な [[Put]] メソッド (セクション 15.4.5.1) を持つ。

8.6.2.3 [[CanPut]] (P)

[[CanPut]] メソッドは [[Put]] メソッドによってのみ使用される。O の [[CanPut]] メソッドがプロパティ P で呼出されると、次のステップが取られる:

  1. O が名前 P のプロパティを持っていなければ、ステップ 4 へ進む。
  2. プロパティが ReadOnly 属性を持っていれば、 false を返す。
  3. true を返す。
  4. O の [[Prototype]] が null ならば、true を返す。
  5. O の [[Prototype]] の [[Canput]] メソッドを、プロパティ名 P で呼出す。
  6. Result(5) を返す。

8.6.2.4 [[HasProperty]] (P)

O の [[HasProperty]] メソッド がプロパティ名 P で呼出されると、次のステップが取られる:

  1. O が名前 P のプロパティを持っていれば、 true を返す。
  2. O の [[Prototype]] が null ならば、 false を返す。
  3. [[Prototype]] の [[HasProperty]] メソッドをプロパティ名 P で呼出す。
  4. Result(3) を返す。

8.6.2.5 [[Delete]] (P)

O の [[Delete]] メソッドがプロパティ名 P で呼出されると、次のステップが取られる:

  1. O が名前 P のプロパティを持たなければ、 true を返す。
  2. そのプロパティが DontDelete 属性であれば、 false を返す。
  3. O から名前 P のプロパティを取り除く。
  4. true を返す。

8.6.2.6 [[DefaultValue]] (hint)

O の [[DefaultValue]] メソッドがヒント String で呼出されると、次のステップが取られる:

  1. O の [[Get]] メソッドを、引数 "toString" で呼出す。
  2. Result(1) がオブジェクトでなければ、ステップ 5 へ。
  3. Result(1) の [[Call]] メソッドを、this 値 O と空の引数のリストで呼出す。
  4. Result(3) がプリミティブ値であれば、Result(3) を返す。
  5. O の [[Get]] メソッドを、引数 "valueOf" で呼出す。
  6. Result(5) がオブジェクトでなければ、ステップ 9 へ。
  7. Result(5) の [[Call]] メソッドを、this 値 O と空の引数のリストで呼出す。
  8. Result(7) がプリミティブ値であれば、 Result(7) を返す。
  9. 例外 TypeError を投げる。

O の [[DefaultValue]] メソッドがヒント Number で呼出されると、次のステップが取られる:

  1. O の [[Get]] メソッドを、引数 "valueOf" で呼出す。
  2. Result(1) がオブジェクトでなければ、ステップ 5 へ。
  3. Result(1) の [[Call]] メソッドを、this 値 O と空の引数のリストで呼出す。
  4. Result(3) がプリミティブ値であれば、Result(3) を返す。
  5. O の [[Get]] メソッドを、引数 "toString" で呼出す。
  6. Result(5) がオブジェクトでなければ、ステップ 9 へ。
  7. Result(5) の [[Call]] メソッドを、this 値 O と空の引数のリストで呼出す。
  8. Result(7) がプリミティブ値であれば、 Result(7) を返す。
  9. 例外 TypeError を投げる。

O の [[DefaultValue]] メソッドがヒント無しで呼出されると、ヒントが Number であるかのように振舞う。O が Date オブジェクト (セクション 15.9) の場合は、ヒントが String であるかのように振舞う。

Native オブジェクトのための上記 [[DefaultValue]] 仕様はプリミティブな値のみを返す。Host オブジェクトがそれ自身の [[DefaultValue]] メソッドを実装するならば、その [[DefaultValue]] メソッドはプリミティブな値のみを返すことを保証しなければならない。

8.7 Reference 型 (Reference Type)

内部 Reference 型は言語のデータ型ではない。 純粋に解説上の目的で本仕様に定義される。 ECMAScript 実装は、ここに述べるように、リファレンス上にそれが生成し演算したかのように振舞わなければならない。しかしながら、Reference 型の値は、式評価の中間結果としてのみ用いられ、変数あるいはプロパティの値として格納することはできない。

Reference 型は、delete, typeof のような演算子、そして代入演算子の振舞いの説明に使用される。例えば、代入の左オペランドはリファレンスの生成が期待される。代入の振舞いは、代わりに、代入演算子の左オペランドの構文形式上のケース解析の点から完全に説明される、ある難点が無ければ: 関数呼び出しはリファレンスを返すことを許される。純粋に Host オブジェクトにこの可能性が認められる。本仕様で定義される組込み ECMAScript 関数はリファレンスを返さず、リファレンスを返すようなユーザ定義関数に提供するものは無い。(構文的ケース解析を使用しないもう一つの理由は、冗長で扱いにくく仕様の多くの部分に影響するだろうということだ。) Reference 型のもう一つの利用は、関数呼出しの this 値の決定の説明である。

Reference は、オブジェクトのプロパティへの参照である。Reference は基準オブジェクト(base object) とプロパティ名の 2 つの成分から構成される。

Reference の成分にアクセスするために、本仕様において次の抽象的演算が使用される:

  • GetBase(V). リファレンス V の基準オブジェクト成分を返す。
  • GetPropertyName(V). リファレンス V のプロパティ名成分を返す。

リファレンス上の演算において、本仕様では次の抽象的演算が使用される:

8.7.1 GetValue (V)

  1. Type(V) が Reference でなければ、 V を返す。
  2. GetBase(V) を呼出す。
  3. Result(2) が null ならば、例外 ReferenceError を投げる。
  4. Result(2) の [[Get]] メソッドを呼び、プロパティ名に GetPropertyName(V) を渡す。
  5. Result(4) を返す。

8.7.2 PutValue (V, W)

  1. Type(V) が Reference でなければ、例外 ReferenceError を投げる。
  2. GetBase(V) を呼出す。
  3. Result(2) が null ならば、ステップ 6 へ。
  4. Result(2) の [[Put]] メソッドを呼び、プロパティ名に GetPropertyValue(V)、値に W を渡す。
  5. 戻る。
  6. Global オブジェクトの [[Put]] メソッドを呼び、プロパティ名に GetPropertyValue(V)、値に W を渡す。
  7. 戻る。

8.8 List 型

内部 List 型は言語のデータ型ではない。純粋に解説上の目的で本仕様に定義される。ここに記述された方法で List 値上で提示し演算したかのように、ECMAScript 実装は振舞わなければならない。しかしながら、Reference 型の値は、式評価の中間結果としてのみ用いられ、変数あるいはプロパティの値として格納することはできない。

List 型は、new 式 (new expressions) および関数呼び出し (function call) において、引数リストの評価を説明するのに使用される。List 型の値は、単純な順序のある値のシーケンスである。シーケンスは任意の長さでよい。

8.9 Completion 型 (Completion Type)

内部 Completion 型は言語のデータ型ではない。純粋に説明を目的として本仕様に定義される。ここに記述された方法で Completion 値上で提示し演算したかのように、ECMAScript 実装は振舞わなければならない。とはいえ、Completion 型の値は、文(statment) 評価の中間結果として利用されるのみであり、変数やプロパティの値として蓄積することはできない。

Completion 型は制御の非ローカル転送を実行する文(statement; break, continue, return, throw) の挙動の説明に使用される。Completion 型の値は形式 (type, value, target) の 3 成分であり、type は normal, break, continue, return, throw のうちの一つ、value は任意の ECMAScript 値または empty、target は任意の ECMAScript 識別子または empty である。

用語 "中途完了 (abrupt completion)" は type が normal 以外である任意の completion を参照する。

Page Contents

Issued: / Revised: / All rights reserved. © 2002-2016 TAKI