4 概要

この節は、ECMAScript言語の非規範的な概要を含みます。

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

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

ECMAScriptはもともと、ブラウザー内のWebページを活性化し、Webベースのクライアントサーバーアーキテクチャの一部としてサーバー計算を実行する仕組みを提供する、Webスクリプト言語として設計されました。ECMAScriptは現在、さまざまなホスト環境に中核的なスクリプト機能を提供するために使用されています。したがって、中核言語は、特定のホスト環境から切り離してこの文書で規定されます。

ECMAScriptの使用は単純なスクリプティングを超え、現在では多くの異なる環境と規模におけるプログラミング作業の全範囲に使用されています。ECMAScriptの使用が拡大するにつれて、それが提供する特徴や機能も拡大してきました。ECMAScriptは現在、十分な機能を備えた汎用プログラミング言語です。

4.1 Webスクリプティング

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

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

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

4.2 ホストと実装

ECMAScriptをホスト環境に統合することを助けるため、この仕様は特定の機能(例:抽象操作)の定義を、全体または一部において、この仕様の外部のソースに委ねます。編集上、この仕様は以下の種類の委譲を区別します。

実装とは、Annex Dに列挙される機能、またはimplementation-definedあるいはimplementation-approximatedとしてマークされる機能をさらに定義する外部ソースです。非公式な用法では、実装は特定のWebブラウザーなどの具体的な人工物を指します。

implementation-definedな機能とは、さらなる限定なしに、その定義を外部ソースに委ねるものです。この仕様は特定の振る舞いについていかなる推奨も行わず、適合実装はこの仕様によって課される制約の範囲内で任意の振る舞いを自由に選択できます。

implementation-approximatedな機能とは、理想的な振る舞いを推奨しつつ、その定義を外部ソースに委ねるものです。適合実装はこの仕様によって課される制約の範囲内で任意の振る舞いを自由に選択できますが、その理想に近づくよう努力することが推奨されます。Math.expなどの一部の数学演算は、implementation-approximatedです。

ホストとは、Annex Dに列挙される機能をさらに定義する外部ソースですが、他のimplementation-definedまたはimplementation-approximatedな機能をさらに定義しないものです。非公式な用法では、ホストは、Annex Dを介して同じ方法でこの仕様とインターフェイスする、すべてのWebブラウザーの集合など、すべての実装の集合を指します。ホストは、WHATWG HTML(https://html.spec.whatwg.org/)などの外部仕様であることが多いです。言い換えれば、host-definedな機能は、多くの場合、外部仕様でさらに定義されます。

ホストフックとは、全体または一部が外部ソースによって定義される抽象操作です。すべてのホストフックはAnnex Dに列挙されなければなりません。ホストフックは少なくとも以下の要件に適合しなければなりません:

host-definedな機能とは、さらなる限定なしにその定義を外部ソースに委ね、Annex Dに列挙されるものです。ホストでない実装も、host-definedな機能の定義を提供しても構いません。

ホスト環境とは、すべてのhost-definedな機能についての定義の特定の選択です。ホスト環境は通常、グローバルオブジェクトのhost-definedなプロパティとして入力を取得し出力を提供できるオブジェクトまたは関数を含みます。

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

ホストと実装の双方は、この中で定義される言語型、仕様型、抽象操作、文法生成、組み込みオブジェクト、および組み込みシンボルを介して、この仕様とインターフェイスしても構いません。

4.3 ECMAScriptの概要

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

ECMAScriptはオブジェクトベースです。基本的な言語機能およびホスト機能はオブジェクトによって提供され、ECMAScriptプログラムは通信し合うオブジェクトの集合です。ECMAScriptにおいて、オブジェクトは0個以上のプロパティの集合であり、それぞれのプロパティは、そのプロパティがどのように使用できるかを決定する属性を持ちます。たとえば、あるプロパティのWritable属性がfalseに設定されている場合、実行されたECMAScriptコードがそのプロパティに異なる値を代入しようとすると失敗します。プロパティは、他のオブジェクト、プリミティブ値、または関数を保持するコンテナーです。プリミティブ値は、次の組み込み型のいずれかのメンバーです:UndefinedNullBooleanNumberBigIntString、およびSymbol; オブジェクトは組み込み型Objectのメンバーです。そして関数は呼び出し可能なオブジェクトです。プロパティを介してオブジェクトに関連付けられた関数は、メソッドと呼ばれます。

ECMAScriptは、ECMAScriptエンティティの定義を補完する組み込みオブジェクトの集合を定義します。これらの組み込みオブジェクトには、グローバルオブジェクト、ObjectFunctionBooleanSymbol、およびさまざまなErrorオブジェクトを含む、言語のruntime semanticsに基本的なオブジェクト、MathNumberDateを含む数値を表し操作するオブジェクト、テキスト処理オブジェクトであるStringRegExpArrayおよび要素がすべて特定の数値データ表現を持つ9種類のTyped Arraysを含む値のindexed collectionsであるオブジェクト、MapおよびSetオブジェクトを含むkeyed collections、JSONオブジェクト、ArrayBufferSharedArrayBufferDataViewを含む構造化データをサポートするオブジェクト、generator functionsおよびPromiseオブジェクトを含む制御抽象化をサポートするオブジェクト、ならびにProxyReflectを含むreflectionオブジェクトが含まれます。

ECMAScriptはまた、一連の組み込み演算子を定義します。ECMAScript演算子には、さまざまな単項演算、乗法演算子、加法演算子、ビットシフト演算子、関係演算子、等価演算子、二項ビット演算子、二項論理演算子、代入演算子、およびカンマ演算子が含まれます。

大規模なECMAScriptプログラムはモジュールによってサポートされます。モジュールにより、プログラムを複数の文および宣言の列へ分割できます。各モジュールは、自身が使用する宣言のうち他のモジュールによって提供される必要があるもの、および自身の宣言のうち他のモジュールから使用可能なものを明示的に識別します。

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

4.3.1 オブジェクト

ECMAScriptにはclass定義の構文が含まれているものの、ECMAScriptオブジェクトは、C++、Smalltalk、Javaにおけるもののように根本的にclassベースではありません。その代わり、オブジェクトは、リテラル記法やコンストラクターなど、さまざまな方法で作成できます。コンストラクターはオブジェクトを作成し、その後、それらのプロパティに初期値を代入することで、その全部または一部を初期化するコードを実行します。各コンストラクターは、"prototype"という名前のプロパティを持つ関数であり、これはプロトタイプベースの継承および共有プロパティを実装するために使用されます。オブジェクトは、new式でコンストラクターを使用して作成されます。たとえば、new Date(2009, 11)は新しいDateオブジェクトを作成します。newを使用せずにコンストラクターを呼び出すと、コンストラクターに応じた結果になります。たとえば、Date()はオブジェクトではなく現在の日付と時刻の文字列表現を生成します。

コンストラクターによって作成されたすべてのオブジェクトは、そのコンストラクターの"prototype"プロパティの値への暗黙の参照(オブジェクトのプロトタイプと呼ばれます)を持ちます。さらに、プロトタイプはそのプロトタイプへの非nullの暗黙の参照を持つ場合があり、以下同様です。これはプロトタイプチェーンと呼ばれます。オブジェクト内のプロパティへの参照が行われると、その参照は、プロトタイプチェーン内でその名前のプロパティを含む最初のオブジェクト内のその名前のプロパティを指します。言い換えれば、まず直接言及されたオブジェクトがそのようなプロパティを持つか調べられます。そのオブジェクトが名前付きプロパティを含む場合、それが参照の対象となるプロパティです。そのオブジェクトが名前付きプロパティを含まない場合、そのオブジェクトのプロトタイプが次に調べられ、以下同様に進みます。

Figure 1: Object/Prototype Relationships
An image of lots of boxes and arrows.

classベースのオブジェクト指向言語では、一般に、状態はインスタンスによって担われ、メソッドはクラスによって担われ、継承は構造と振る舞いのみのものです。ECMAScriptでは、状態とメソッドはオブジェクトによって担われ、一方で構造、振る舞い、および状態はすべて継承されます。

自分自身では、プロトタイプが含む特定のプロパティを直接含まないすべてのオブジェクトは、そのプロパティとその値を共有します。図1はこれを示しています:

CFはコンストラクター(かつオブジェクト)です。new式を使用して5つのオブジェクトが作成されています:cf1cf2cf3cf4、およびcf5です。これらの各オブジェクトは、"q1"および"q2"という名前のプロパティを含みます。破線は暗黙のプロトタイプ関係を表します。したがって、たとえば、cf3のプロトタイプはCFpです。コンストラクターCFは、それ自体に"P1"および"P2"という名前の2つのプロパティを持ちますが、これらはCFpcf1cf2cf3cf4、またはcf5からは見えません。CFp内の"CFP1"という名前のプロパティは、cf1cf2cf3cf4、およびcf5によって共有されます(ただしCFによっては共有されません)。同様に、CFpの暗黙のプロトタイプチェーン内に見つかる、"q1""q2"、または"CFP1"という名前でない任意のプロパティも共有されます。CFCFpの間には暗黙のプロトタイプリンクがないことに注意してください。

ほとんどのclassベースのオブジェクト言語とは異なり、プロパティは値を代入することによって動的にオブジェクトへ追加できます。つまり、コンストラクターは、構築されるオブジェクトのすべてまたはいずれかのプロパティを命名したり、それらに値を代入したりする必要はありません。上の図では、CFp内のプロパティに新しい値を代入することにより、cf1cf2cf3cf4、およびcf5のための新しい共有プロパティを追加できます。

ECMAScriptオブジェクトは本質的にclassベースではありませんが、コンストラクター関数、プロトタイプオブジェクト、およびメソッドの共通パターンに基づくclass風の抽象化を定義することが便利な場合がよくあります。ECMAScriptの組み込みオブジェクト自体も、そのようなclass風のパターンに従います。ECMAScript 2015以降、ECMAScript言語には構文上のclass定義が含まれ、プログラマーは組み込みオブジェクトで使用される同じclass風抽象化パターンに適合するオブジェクトを簡潔に定義できます。

4.3.2 ECMAScriptのStrictバリアント

ECMAScript言語は、この言語の一部のユーザーが、言語で利用可能な一部の機能の使用を制限したいと望む可能性を認識しています。彼らは、セキュリティの利益のため、自分たちがエラーを起こしやすいと考える機能を避けるため、強化されたエラーチェックを得るため、またはその他の自ら選ぶ理由のために、そうするかもしれません。この可能性をサポートするため、ECMAScriptは言語のstrictバリアントを定義します。言語のstrictバリアントは、通常のECMAScript言語の特定の構文的および意味的機能を除外し、一部の機能の詳細な意味論を変更します。strictバリアントはまた、非strict形式の言語ではエラーとして指定されていない状況で、エラー例外をthrowすることによって報告されなければならない追加のエラー条件を指定します。

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

この仕様に適合するため、ECMAScript実装は、この仕様で定義される完全で無制限なECMAScript言語とECMAScript言語のstrictバリアントの双方を実装しなければなりません。さらに、実装は、無制限およびstrict modeのsource text unitを単一の複合プログラムへ組み合わせることをサポートしなければなりません。

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

オブジェクトはプロパティの集合であり、単一のプロトタイプオブジェクトを持ちます。プロトタイプはnullであっても構いません。

4.4.7 constructor

オブジェクトを作成し初期化するfunction object

Note

コンストラクターの"prototype"プロパティの値は、継承および共有プロパティを実装するために使用されるプロトタイプオブジェクトです。

4.4.8 prototype

他のオブジェクトに共有プロパティを提供するオブジェクト

Note

コンストラクターがオブジェクトを作成すると、そのオブジェクトはプロパティ参照を解決する目的で、コンストラクターの"prototype"プロパティを暗黙に参照します。コンストラクターの"prototype"プロパティは、プログラム式constructor.prototypeによって参照でき、オブジェクトのプロトタイプに追加されたプロパティは、継承を通じて、そのプロトタイプを共有するすべてのオブジェクトによって共有されます。あるいは、Object.create組み込み関数を使用して、明示的に指定されたプロトタイプを持つ新しいオブジェクトを作成することもできます。

4.4.9 ordinary object

すべてのオブジェクトがサポートしなければならないessential internal methodsについて、デフォルトの振る舞いを持つオブジェクト

4.4.10 exotic object

essential internal methodsの1つ以上について、デフォルトの振る舞いを持たないオブジェクト

Note

ordinary objectでない任意のオブジェクトはexotic objectです。

4.4.11 standard object

その意味論がこの仕様によって定義されるオブジェクト

4.4.12 built-in object

ECMAScript実装によって指定され提供されるオブジェクト

Note

標準built-in objectsはこの仕様で定義されます。ECMAScript実装は、追加の種類のbuilt-in objectsを指定し提供しても構いません。

4.4.13 undefined value

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

4.4.14 Undefined type

その唯一の値がundefined値である型

4.4.15 null value

任意のオブジェクト値の意図的な不在を表すprimitive value

4.4.16 Null type

その唯一の値がnull値である型

4.4.17 Boolean value

Boolean型のメンバー

Note

Boolean値はtruefalseの2つだけです。

4.4.18 Boolean type

primitive valuesであるtrueおよびfalseからなる型

4.4.19 Boolean object

標準組み込みBooleanコンストラクターのインスタンスであるObject型のメンバー

Note

Boolean objectは、new式でBooleanコンストラクターを使用し、引数としてBoolean値を供給することで作成されます。結果のオブジェクトは、その値がBoolean値であるinternal slotを持ちます。Boolean objectはBoolean値へ強制変換できます。

4.4.20 String value

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

Note

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

4.4.21 String type

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

4.4.22 String object

標準組み込みStringコンストラクターのインスタンスであるObject型のメンバー

Note

String objectは、new式でStringコンストラクターを使用し、引数としてString値を供給することで作成されます。結果のオブジェクトは、その値がString値であるinternal slotを持ちます。String objectは、Stringコンストラクターを関数として呼び出すことでString値へ強制変換できます(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 valuesの集合

4.4.25 Number object

標準組み込みNumberコンストラクターのインスタンスであるObject型のメンバー

Note

Number objectは、new式でNumberコンストラクターを使用し、引数としてNumber値を供給することで作成されます。結果のオブジェクトは、その値がNumber値であるinternal slotを持ちます。Number objectは、Numberコンストラクターを関数として呼び出すことでNumber値へ強制変換できます(21.1.1.1)。

4.4.26 Infinity

正の無限Number値である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 valuesの集合

4.4.30 BigInt object

標準組み込みBigIntコンストラクターのインスタンスであるObject型のメンバー

4.4.31 Symbol value

一意で非StringのObject property keyを表すprimitive value

4.4.32 Symbol type

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

4.4.33 Symbol object

標準組み込みSymbolコンストラクターのインスタンスであるObject型のメンバー

4.4.34 function

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

Note

そのプロパティに加えて、関数は呼び出されたときにどのように振る舞うかを決定する実行可能コードと状態を含みます。関数のコードはECMAScriptで書かれている場合も、そうでない場合もあります。

4.4.35 built-in function

関数であるbuilt-in object

Note

built-in functionsの例には、parseIntおよびMath.expが含まれます。ホストまたは実装は、この仕様に記述されていない追加のbuilt-in functionsを提供しても構いません。

4.4.36 built-in constructor

コンストラクターであるbuilt-in function

Note

built-in constructorsの例には、ObjectおよびFunctionが含まれます。ホストまたは実装は、この仕様に記述されていない追加のbuilt-in constructorsを提供しても構いません。

4.4.37 property

key(String値またはSymbol値のいずれか)と値を関連付けるオブジェクトの一部

Note

プロパティの形式によって、値はデータ値(primitive value、オブジェクト、またはfunction object)として直接表現される場合も、accessor functionsの対によって間接的に表現される場合もあります。

4.4.38 method

プロパティの値である関数

Note

関数がオブジェクトのメソッドとして呼び出されると、そのオブジェクトは関数にそのthis値として渡されます。

4.4.39 built-in method

built-in functionであるメソッド

Note

標準built-in methodsはこの仕様で定義されます。ホストまたは実装は、この仕様に記述されていない追加のbuilt-in methodsを提供しても構いません。

4.4.40 attribute

プロパティの何らかの特性を定義する内部値

4.4.41 own property

そのオブジェクトによって直接含まれるプロパティ

4.4.42 inherited property

own propertyではないが、そのオブジェクトのプロトタイプのプロパティ(ownまたはinheritedのいずれか)であるオブジェクトのプロパティ

4.5 この仕様の構成

この仕様の残りは、以下のように構成されます:

Clause 5は、この仕様全体で使用される記法上の慣例を定義します。

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

Clauses 11から17までは、実際のECMAScriptプログラミング言語を、その構文的エンコーディングおよびすべての言語機能の実行意味論を含めて定義します。

Clauses 18から28までは、ECMAScript標準ライブラリを定義します。それらは、ECMAScriptプログラムが実行される際に利用可能なすべての標準オブジェクトの定義を含みます。

Clause 29は、SharedArrayBuffer-backed memory上のアクセスおよびAtomicsオブジェクトのメソッドのメモリ整合性モデルを記述します。