4 概要

この節は ECMAScript 言語の非規範的な概要を含む。

ECMAScript は、ホスト環境内で計算を行い、計算オブジェクトを操作するためのオブジェクト指向プログラミング言語である。ここで定義される ECMAScript は、計算的に自己完結することを意図していない。実際、この仕様には外部データの入力や計算結果の出力に関する規定はない。代わりに、ECMAScript プログラムの計算環境は、この仕様に記述されたオブジェクトやその他の機能だけでなく、特定の環境固有のオブジェクトも提供することが想定されている。それらの説明および振る舞いは、この仕様の範囲外であるが、ECMAScript プログラムからアクセス可能な特定のプロパティや呼び出し可能な関数を提供してもよいことだけが示される。

ECMAScript は元来スクリプト言語として使用されるよう設計されたが、現在では汎用プログラミング言語として広く利用されている。スクリプト言語とは、既存システムの機能を操作、カスタマイズ、および自動化するために用いられるプログラミング言語である。そのようなシステムでは、有用な機能はすでにユーザーインターフェースを通じて利用可能であり、スクリプト言語はその機能をプログラム制御に公開する仕組みである。この意味で、既存システムはオブジェクトおよび機能からなるホスト環境を提供し、それがスクリプト言語の能力を補完する。スクリプト言語は、専門的プログラマと非専門的プログラマの双方による使用を意図している。

ECMAScript は当初、Web スクリプト言語として設計され、ブラウザ内で Web ページに動きを与え、さらに Web ベースのクライアント・サーバアーキテクチャの一部としてサーバ計算を行う仕組みを提供した。現在、ECMAScript は多様なホスト環境に対して中核的なスクリプト機能を提供するために用いられている。したがって、この文書では特定のホスト環境とは切り離して中核言語を規定する。

ECMAScript の利用は単純なスクリプティングを超え、今では多くの異なる環境と規模におけるプログラミング作業の全領域で使用されている。ECMAScript の利用が拡大するにつれて、それが提供する機能と設備も拡張されてきた。ECMAScript は現在、完全な機能を備えた汎用プログラミング言語である。

4.1 Web スクリプティング

ウェブブラウザは ECMAScript のクライアント側計算のためのホスト環境を提供する。これには、たとえばウィンドウ、メニュー、ポップアップ、ダイアログボックス、テキストエリア、アンカー、フレーム、履歴、クッキー、および入出力を表すオブジェクトが含まれる。さらに、ホスト環境は、フォーカスの変更、ページや画像の読み込み、アンロード、エラーや中断、選択、フォーム送信、およびマウス操作といったイベントにスクリプトコードを関連付ける手段を提供する。スクリプトコードは HTML 内に現れ、表示されるページはユーザーインターフェース要素と固定または計算によるテキストおよび画像の組合せとなる。スクリプトコードはユーザー操作に反応し、メインプログラムは不要である。

ウェブサーバは、リクエスト、クライアント、およびファイルを表すオブジェクト、ならびにデータをロックし共有する仕組みを含む、サーバ側計算のための別のホスト環境を提供する。ブラウザ側とサーバ側のスクリプティングを組み合わせることで、Web ベースのアプリケーション向けにカスタマイズされたユーザーインターフェースを提供しつつ、計算をクライアントとサーバの間で分散することが可能になる。

ECMAScript をサポートする各ウェブブラウザおよびサーバは、それぞれ独自のホスト環境を提供し、ECMAScript 実行環境を完成させる。

4.2 ホストと実装

ECMAScript をホスト環境へ統合することを助けるために、この仕様は、特定の機能(たとえば抽象操作)の定義を、この仕様の外部の情報源に、全体または一部について委ねている。編集上、この仕様では以下の種類の委譲を区別する。

implementation とは、付録 D に列挙された機能、または implementation-defined もしくは implementation-approximated とマークされた機能をさらに定義する外部情報源である。非形式的な用法では、implementation は特定のウェブブラウザのような具体的成果物を指す。

implementation-defined 機能とは、追加の限定なしにその定義を外部情報源に委ねる機能である。この仕様は特定の振る舞いを推奨せず、適合実装はこの仕様が課す制約の範囲内で自由に任意の振る舞いを選択できる。

implementation-approximated 機能とは、理想的な振る舞いを推奨しつつ、その定義を外部情報源に委ねる機能である。適合実装はこの仕様が課す制約の範囲内で任意の振る舞いを選択できるが、理想に近づくよう努めることが推奨される。Math.exp のようないくつかの数学演算は implementation-approximated である。

host とは、付録 D に列挙された機能をさらに定義するが、他の implementation-defined または implementation-approximated 機能はさらに定義しない外部情報源である。非形式的な用法では、host は、付録 D を通じて同じ方法でこの仕様と接続する、すべてのウェブブラウザの集合のような、すべての実装の集合を指す。host はしばしば WHATWG HTML(https://html.spec.whatwg.org/)のような外部仕様である。言い換えれば、host-defined な機能はしばしば外部仕様でさらに定義される。

host hook とは、外部情報源によって全体または一部が定義される抽象操作である。すべての host hook は付録 D に列挙されなければならない。host hook は少なくとも次の要件に適合しなければならない。

host-defined 機能とは、追加の限定なしにその定義を外部情報源に委ね、かつ付録 D に列挙されている機能である。host でない実装も host-defined 機能に対する定義を提供してよい。

host environment とは、すべての host-defined 機能に対する定義の特定の選択である。host environment には通常、グローバルオブジェクトhost-defined プロパティとして入力取得および出力提供を可能にするオブジェクトまたは関数が含まれる。

この仕様は、常に最も具体的な用語を使うという編集上の慣例に従う。たとえば、ある機能が host-defined であるなら、それを implementation-defined と呼ぶべきではない。

host と implementation の双方は、ここで定義される言語型、仕様型、抽象操作、文法生成規則、intrinsic object、および intrinsic symbol を通じてこの仕様と接続してよい。

4.3 ECMAScript の概要

以下は ECMAScript の非形式的な概要であり、言語のすべての部分が記述されているわけではない。この概要は標準本文の一部ではない。

ECMAScript はオブジェクトベースである。すなわち、基本言語機能およびホスト機能はオブジェクトによって提供され、ECMAScript プログラムは相互に通信するオブジェクト群から成る。ECMAScript において、object は 0 個以上の property の集合であり、各 property はその利用方法を決定する attribute を持つ。たとえば、ある property の Writable attribute が false に設定されていると、その property に別の値を代入しようとする実行中の ECMAScript コードの試みは失敗する。property は、他のオブジェクト、primitive value、または function を保持するコンテナである。primitive value は以下の組込み型のいずれかのメンバである:Undefined, Null, Boolean, Number, BigInt, String, および Symbol; object は組込み型 Object のメンバであり、function は呼出し可能オブジェクトである。property を通じて object に関連付けられた function は method と呼ばれる。

ECMAScript は、ECMAScript 実体の定義を補完する built-in object の集合を定義する。これらの built-in object には、global object、ObjectFunctionBooleanSymbol、およびさまざまな Error object を含む言語の実行時意味論に不可欠な object、MathNumber、および Date を含む数値を表現および操作する object、テキスト処理 object である StringRegExpArray と、すべての要素が特定の数値データ表現を持つ 9 種類の Typed Array を含むインデックス付き値コレクションを表す object、Map および Set object を含むキー付きコレクション、JSON object、ArrayBufferSharedArrayBuffer、および DataView を含む構造化データを支援する object、generator function および Promise object を含む制御抽象を支援する object、ならびに ProxyReflect を含む reflection object がある。

ECMAScript はまた、組込み operator の集合も定義する。ECMAScript の operator には、さまざまな単項演算、乗法演算子、加法演算子、ビット単位シフト演算子、関係演算子、等値演算子、二項ビット演算子、二項論理演算子、代入演算子、およびコンマ演算子が含まれる。

大規模な ECMAScript プログラムは、プログラムを複数の文および宣言の列に分割できるようにする module によって支えられる。各 module は、他の module から提供される必要がある使用宣言と、自身の宣言のうち他の module から利用可能なものを明示的に識別する。

ECMAScript の構文は意図的に Java の構文に似せてある。ECMAScript の構文は、使いやすいスクリプト言語として機能できるように緩やかにされている。たとえば、変数には宣言は不要であり、型は property に関連付けられず、定義された function は、その呼出しより前にテキスト上で宣言が現れる必要もない。

4.3.1 オブジェクト

ECMAScript にはクラス定義のための構文が含まれているが、ECMAScript の object は、C++、Smalltalk、Java におけるそれらのように、本質的にクラスベースではない。代わりに object は、リテラル記法や、object を生成した後で property に初期値を代入してその全部または一部を初期化するコードを実行する constructor を介するなど、さまざまな方法で生成されうる。各 constructor"prototype" という名前の property を持つ function であり、これは prototype-based inheritanceshared properties を実装するために用いられる。object は new 式で constructor を用いて生成される。たとえば new Date(2009, 11) は新しい Date object を生成する。new を使わずに constructor を呼び出した場合の結果は、その constructor に依存する。たとえば Date() は object ではなく現在の日付と時刻の文字列表現を生成する。

constructor によって生成されたすべての object は、自身の constructor"prototype" property の値への暗黙参照(その object の prototype と呼ばれる)を持つ。さらに、prototype はその prototype への非 null の暗黙参照を持っていてもよく、以下同様に連鎖する。これを prototype chain と呼ぶ。object 内の property が参照されるとき、その参照は、その名前の property を含む prototype chain 上で最初の object にあるその名前の property を指す。言い換えれば、まず直接言及された object がそのような property を持つか調べられ、その object がその名前の property を持っていれば、その property が参照先となる。持っていなければ、その object の prototype が次に調べられ、以下同様である。

Figure 1: Object/Prototype Relationships
多数のボックスと矢印からなる画像。

クラスベースのオブジェクト指向言語では、一般に状態はインスタンスが保持し、メソッドはクラスが保持し、継承されるのは構造と振る舞いのみである。ECMAScript では、状態とメソッドは object が保持し、構造、振る舞い、および状態のすべてが継承される。

自身の prototype が持つ特定の property を直接含まないすべての object は、その property とその値を共有する。図 1 はこれを示している。

CFconstructor(であり、同時に object でもある)である。new 式を用いて 5 個の object が生成されている:cf1, cf2, cf3, cf4, および cf5。これらの各 object は "q1" および "q2" という名前の property を含む。破線は暗黙の prototype 関係を表す。したがって、たとえば cf3 の prototype は CFp である。constructor である CF 自身は "P1" および "P2" という 2 つの property を持つが、これらは CFp, cf1, cf2, cf3, cf4, または cf5 からは見えない。CFp 内の "CFP1" という名前の property は、cf1, cf2, cf3, cf4, および cf5 によって共有される(ただし CF には共有されない)。同様に、CFp の暗黙 prototype chain 内で "q1""q2"、または "CFP1" 以外の名前を持つ property は共有される。CFCFp の間には暗黙の prototype link が存在しないことに注意。

ほとんどのクラスベース object 言語とは異なり、property は値を代入することによって動的に object に追加できる。すなわち constructor は、生成される object の property のすべて、またはいずれかに名前を付けたり値を代入したりする必要はない。上図では、CFp の property に新しい値を代入することで、cf1, cf2, cf3, cf4, および cf5 のための新たな共有 property を追加できる。

ECMAScript の object は本質的にはクラスベースではないが、constructor function、prototype object、および method の共通パターンに基づくクラス様抽象を定義すると便利なことが多い。ECMAScript の built-in object 自身もそのようなクラス様パターンに従う。ECMAScript 2015 以降、ECMAScript 言語には、プログラマが built-in object に使われるのと同じクラス様抽象パターンに適合する object を簡潔に定義できる構文的クラス定義が含まれている。

4.3.2 ECMAScript の strict 変種

ECMAScript 言語は、この言語の利用者の中に、言語で利用可能な機能の一部の使用を制限したいと望む者がいる可能性を認識している。彼らは、安全性の観点から、エラーを起こしやすいとみなす機能を避けるため、強化されたエラーチェックを得るため、あるいはその他自身が選ぶ理由のためにそうするかもしれない。この可能性を支援するために、ECMAScript は言語の strict 変種を定義する。言語の strict 変種は、通常の ECMAScript 言語における特定の構文的・意味論的機能の一部を除外し、一部の機能の詳細な意味論を変更する。また strict 変種は、言語の非 strict 形式ではエラーと規定されていない状況においても、エラー例外を投げることで報告しなければならない追加のエラー条件を規定する。

ECMAScript の strict 変種は、一般にこの言語の strict mode と呼ばれる。ECMAScript の strict mode の選択および strict mode の構文と意味論の使用は、11.2.2 に記述されるように、個々の ECMAScript ソーステキスト単位のレベルで明示的に行われる。strict mode は構文的ソーステキスト単位のレベルで選択されるため、strict mode が課す制約は、そのようなソーステキスト単位内で局所的な効果を持つものに限られる。strict mode は、複数のソーステキスト単位にまたがって一貫して動作しなければならない ECMAScript 意味論のいかなる側面も制限または変更しない。完全な ECMAScript プログラムは、strict mode と non-strict mode の ECMAScript ソーステキスト単位の両方から構成されうる。この場合、strict mode は、strict mode ソーステキスト単位内で定義されたコードを実際に実行するときにのみ適用される。

この仕様に適合するためには、ECMAScript 実装は、この仕様で定義される完全な無制限 ECMAScript 言語と、ECMAScript 言語の strict 変種の両方を実装しなければならない。さらに、実装は、無制限および strict mode のソーステキスト単位を単一の複合プログラムに組み合わせることをサポートしなければならない。

4.4 用語及び定義

この文書の目的上、以下の用語及び定義を適用する。

4.4.1 implementation-approximated

implementation-approximated 機能とは、この仕様において推奨される理想的な振る舞いを持つが、その全体または一部が外部情報源によって定義される機能である

4.4.2 implementation-defined

implementation-defined 機能とは、その全体または一部がこの仕様の外部情報源によって定義される機能である

4.4.3 host-defined

implementation-defined と同じ

Note

編集上は、節 4.2 を参照。

4.4.4 type

6 で定義されるデータ値の集合

4.4.5 primitive value

6 で定義される Undefined, Null, Boolean, Number, BigInt, Symbol, または String のいずれかの型のメンバ

Note

primitive value は、言語実装の最下位レベルで直接表現されるデータである。

4.4.6 object

Object 型のメンバ

Note

object は property の集合であり、単一の prototype object を持つ。prototype は null であってよい。

4.4.7 constructor

object を生成し初期化する function object

Note

constructor"prototype" property の値は、継承および共有 property を実装するために用いられる prototype object である。

4.4.8 prototype

他の object のために共有 property を提供する object

Note

constructor が object を生成するとき、その object は property 参照を解決する目的で constructor"prototype" property を暗黙に参照する。constructor"prototype" property は、プログラム式 constructor.prototype によって参照でき、object の prototype に追加された property は、継承を通じて、その prototype を共有するすべての object によって共有される。あるいは、新しい object は、組込み関数 Object.create を用いて、明示的に指定された prototype を持つように生成してもよい。

4.4.9 ordinary object

すべての object がサポートしなければならない本質的内部メソッドについて、既定の振る舞いを持つ object

4.4.10 exotic object

1 つ以上の本質的内部メソッドについて既定の振る舞いを持たない object

Note

ordinary object でない object はすべて exotic object である。

4.4.11 standard object

意味論がこの仕様によって定義される object

4.4.12 built-in object

ECMAScript 実装によって規定され、提供される object

Note

標準 built-in object はこの仕様で定義される。ECMAScript 実装は、追加の種類の built-in object を規定し提供してもよい。

4.4.13 undefined value

変数に値が代入されていないときに使用される primitive value

4.4.14 Undefined type

唯一の値が undefined value である型

4.4.15 null value

いかなる object 値も意図的に存在しないことを表す primitive value

4.4.16 Null type

唯一の値が null value である型

4.4.17 Boolean value

Boolean 型のメンバ

Note

Boolean value は truefalse の 2 つだけである。

4.4.18 Boolean type

primitive value truefalse から成る型

4.4.19 Boolean object

標準 built-in Boolean constructor の instance である Object 型のメンバ

Note

Boolean object は new 式で Boolean constructor を用い、引数として Boolean value を与えることで生成される。結果の object は、その値が Boolean value である内部スロットを持つ。Boolean object は Boolean value に強制変換できる。

4.4.20 String value

0 個以上の 16 ビット符号なし整数値からなる有限順序列である primitive value

Note

String value は String 型のメンバである。列中の各整数値は通常、UTF-16 テキストの単一の 16 ビット単位を表す。しかし、ECMAScript は、それらが 16 ビット符号なし整数でなければならないことを除き、その値にいかなる制限または要件も課さない。

4.4.21 String type

可能なすべての String value の集合

4.4.22 String object

標準 built-in String constructor の instance である Object 型のメンバ

Note

String object は new 式で String constructor を用い、引数として String value を与えることで生成される。結果の object は、その値が String value である内部スロットを持つ。String object は、String constructor を function として呼び出すことで String value に強制変換できる(22.1.1.1)。

4.4.23 Number value

倍精度 64 ビット二進形式 IEEE 754-2019 値に対応する primitive value

Note

Number value は Number 型のメンバであり、数の直接表現である。

4.4.24 Number type

NaN(“not a number”)、+∞𝔽(正の無限大)、および -∞𝔽(負の無限大)を含む、可能なすべての Number value の集合

4.4.25 Number object

標準 built-in Number constructor の instance である Object 型のメンバ

Note

Number object は new 式で Number constructor を用い、引数として Number value を与えることで生成される。結果の object は、その値が Number value である内部スロットを持つ。Number object は、Number constructor を function として呼び出すことで Number value に強制変換できる(21.1.1.1)。

4.4.26 Infinity

正の無限 Number value である Number value

4.4.27 NaN

IEEE 754-2019 NaN(“not a number”)値である Number value

4.4.28 BigInt value

任意精度整数値に対応する primitive value

4.4.29 BigInt type

可能なすべての BigInt value の集合

4.4.30 BigInt object

標準 built-in BigInt constructor の instance である Object 型のメンバ

4.4.31 Symbol value

一意で、String ではない Object property key を表す primitive value

4.4.32 Symbol type

可能なすべての Symbol value の集合

4.4.33 Symbol object

標準 built-in Symbol constructor の instance である Object 型のメンバ

4.4.34 function

サブルーチンとして呼び出されうる Object 型のメンバ

Note

function は、その property に加えて、呼び出されたときの振る舞いを決定する実行可能コードおよび状態を含む。function のコードは ECMAScript で書かれていてもいなくてもよい。

4.4.35 built-in function

function である built-in object

Note

built-in function の例には parseIntMath.exp がある。host または implementation は、この仕様に記述されていない追加の built-in function を提供してもよい。

4.4.36 built-in constructor

constructor である built-in function

Note

built-in constructor の例には ObjectFunction がある。host または implementation は、この仕様に記述されていない追加の built-in constructor を提供してもよい。

4.4.37 property

key(String value または Symbol value のいずれか)と値を関連付ける object の一部

Note

property の形式に応じて、値はデータ値(primitive value、object、または function object)として直接表現される場合もあれば、アクセサ関数の対によって間接的に表現される場合もある。

4.4.38 method

property の値である function

Note

function が object の method として呼び出されるとき、その object はその function に this 値として渡される。

4.4.39 built-in method

built-in function である method

Note

標準 built-in method はこの仕様で定義される。host または implementation は、この仕様に記述されていない追加の built-in method を提供してもよい。

4.4.40 attribute

property の何らかの特性を定義する内部値

4.4.41 own property

その object に直接含まれる property

4.4.42 inherited property

own property ではないが、その object の prototype の property(own または inherited のいずれか)である object の property

4.5 この仕様の構成

この仕様の残りは以下のように構成される。

5 は、この仕様全体で用いられる記法規約を定義する。

6 から 10 までは、ECMAScript プログラムが動作する実行環境を定義する。

11 から 17 までは、その構文符号化およびすべての言語機能の実行意味論を含む、実際の ECMAScript プログラミング言語を定義する。

18 から 28 までは、ECMAScript 標準ライブラリを定義する。そこには、ECMAScript プログラムが実行中に利用できるすべての標準 object の定義が含まれる。

29 は、SharedArrayBuffer を基盤とするメモリへのアクセスおよび Atomics object のメソッドに関するメモリ一貫性モデルを記述する。