ページ表示設定

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 をホスト環境に統合しやすくするため、この仕様は、特定の機能(たとえば、抽象操作)の定義の全部または一部を、この仕様の外部の情報源に委ねます。編集上、この仕様は、以下の種類の委譲を区別します。

実装とは、附属書 D に列挙されている機能、または実装定義もしくは実装近似と指定されている機能を、さらに定義する外部の情報源です。非形式的な用法では、実装は、特定の Web ブラウザーなどの具体的な成果物を指します。

実装定義の機能とは、追加の条件を付けずに、その定義を外部の情報源に委ねる機能です。この仕様は特定の動作を推奨せず、適合実装は、この仕様が定める制約の範囲内で任意の動作を自由に選択できます。

実装近似の機能とは、理想的な動作を推奨しながら、その定義を外部の情報源に委ねる機能です。適合実装は、この仕様が定める制約の範囲内で任意の動作を自由に選択できますが、理想に近づけるよう努めることが奨励されます。Math.exp など、一部の数学的操作は実装近似です。

ホストとは、附属書 D に列挙されている機能をさらに定義するものの、その他の実装定義または実装近似の機能はさらに定義しない、外部の情報源です。非形式的な用法では、ホストは、すべての Web ブラウザーの集合など、附属書 D を介して同じ方法でこの仕様と連携する、すべての実装の集合を指します。ホストは、WHATWG HTML(https://html.spec.whatwg.org/)などの外部仕様であることがよくあります。言い換えると、ホスト定義の機能は、外部仕様でさらに定義されることがよくあります。

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

  • 正常完了またはスロー完了のいずれかを返さなければなりません。

ホスト定義の機能とは、追加の条件を付けずにその定義を外部の情報源に委ね、附属書 D に列挙されている機能です。ホストではない実装も、ホスト定義の機能の定義を提供してもかまいません。

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

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

ホストと実装のどちらも、ここで定義されている言語型、仕様型、抽象操作、文法の生成規則、固有オブジェクト、および固有シンボルを介して、この仕様と連携してもかまいません。

4.3 ECMAScript の概要

以下は ECMAScript の非形式的な概要であり、言語のすべての部分を説明するものではありません。この概要は、標準の本体の一部ではありません。

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

ECMAScript は、ECMAScript の構成要素の定義を補完する組込みオブジェクトの集合を定義します。これらの組込みオブジェクトには、グローバルオブジェクト、Object、Function、Boolean、Symbol、および各種 Error オブジェクトなど、言語の実行時意味論の基礎となるオブジェクト、Math、Number、Date など、数値を表現および操作するオブジェクト、テキスト処理オブジェクト String と RegExp、Array および各要素が特定の数値データ表現を持つ9種類の型付き配列など、値のインデックス付きコレクションであるオブジェクト、Map と Set オブジェクトなどのキー付きコレクション、JSON オブジェクト、ArrayBuffer、SharedArrayBuffer、および DataView などの構造化データをサポートするオブジェクト、ジェネレーター関数と Promise オブジェクトなどの制御の抽象化をサポートするオブジェクト、ならびに Proxy と Reflect などのリフレクションオブジェクトが含まれます。

ECMAScript は、組込みの演算子の集合も定義します。ECMAScript の演算子には、各種単項演算、乗除演算子、加減演算子、ビットシフト演算子、関係演算子、等価演算子、二項ビット演算子、二項論理演算子、代入演算子、およびカンマ演算子が含まれます。

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

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

4.3.1 オブジェクト

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

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

図 1: オブジェクト/プロトタイプの関係
多数のボックスと矢印からなる画像。

クラスを基盤とするオブジェクト指向言語では、一般に、状態はインスタンスが保持し、メソッドはクラスが保持し、継承されるのは構造と動作のみです。ECMAScript では、状態とメソッドはオブジェクトが保持し、構造、動作、および状態のすべてが継承されます。

プロトタイプが持つ特定のプロパティを直接には持たないすべてのオブジェクトは、そのプロパティとその値を共有します。図1は、これを示しています。

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

クラスを基盤とする多くのオブジェクト言語とは異なり、プロパティに値を代入することで、オブジェクトにプロパティを動的に追加できます。つまり、コンストラクターは、構築するオブジェクトのすべてのプロパティ、あるいはいずれかのプロパティについてさえ、名前を指定したり値を代入したりする必要はありません。上の図では、cf1、cf2、cf3、cf4、および cf5 のための新しい共有プロパティを、CFp 内のプロパティに新しい値を代入することで追加できます。

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

4.3.2 ECMAScript の厳格版

ECMAScript 言語は、言語の利用者の一部が、その言語で利用可能な特定の機能の使用を制限したいと考える可能性を認めています。その理由としては、安全性のため、自分たちが誤りを招きやすいと考える機能を避けるため、エラーチェックを強化するため、またはその他の自ら選んだ理由が考えられます。この可能性に対応するため、ECMAScript は、言語の厳格版を定義します。言語の厳格版は、通常の ECMAScript 言語の特定の構文的および意味論的な機能を除外し、一部の機能の詳細な意味論を変更します。また、厳格版は、言語の非厳格な形式ではエラーと規定されていない状況に対して、エラー例外をスローすることで報告しなければならない追加のエラー条件を規定します。

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

この仕様に適合するためには、ECMAScript の実装は、この仕様で定義される、制限のない完全な ECMAScript 言語と ECMAScript 言語の厳格版の両方を実装しなければなりません。さらに、実装は、制限のないソーステキスト単位と厳格モードのソーステキスト単位を、一つの複合プログラムに組み合わせることをサポートしなければなりません。

4.4 用語および定義

この文書の目的のために、以下の用語および定義を適用します。

4.4.1 実装近似

実装近似の機能は、外部の情報源によって全部または一部が定義されるものの、この仕様において推奨される理想的な動作を持つ

4.4.2 実装定義

実装定義の機能は、この仕様の外部の情報源によって全部または一部が定義される

4.4.3 ホスト定義

実装定義と同じ

注

編集上の区別については、箇条 4.2 を参照してください。

4.4.4 型

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

4.4.5 プリミティブ値

箇条 6 で定義される Undefined、Null、Boolean、Number、BigInt、Symbol、または String 型のいずれかに属する値

注

プリミティブ値は、言語実装の最も低いレベルで直接表現されるデータです。

4.4.6 オブジェクト

Object 型に属する値

注

オブジェクトはプロパティの集合であり、単一のプロトタイプオブジェクトを持ちます。プロトタイプは null の場合があります。

4.4.7 コンストラクター

オブジェクトを作成および初期化する関数オブジェクト

注

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

4.4.8 プロトタイプ

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

注

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

4.4.9 通常オブジェクト

すべてのオブジェクトがサポートしなければならない基本内部メソッドについて、既定の動作を持つオブジェクト

4.4.10 特殊オブジェクト

一つ以上の基本内部メソッドについて、既定の動作を持たないオブジェクト

注

通常オブジェクトではないオブジェクトは、すべて特殊オブジェクトです。

4.4.11 標準オブジェクト

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

4.4.12 組込みオブジェクト

ECMAScript の実装によって規定および提供されるオブジェクト

注

標準の組込みオブジェクトは、この仕様で定義されます。ECMAScript の実装は、追加の種類の組込みオブジェクトを規定および提供してもかまいません。

4.4.13 undefined 値

変数に値が代入されていないときに使用されるプリミティブ値

4.4.14 Undefined 型

undefined 値を唯一の値とする型

4.4.15 null 値

オブジェクト値が意図的に存在しないことを表すプリミティブ値

4.4.16 Null 型

null 値を唯一の値とする型

4.4.17 Boolean 値

Boolean 型に属する値

注

Boolean 値は、true と false の2つだけです。

4.4.18 Boolean 型

プリミティブ値 true と false からなる型

4.4.19 Boolean オブジェクト

標準組込みコンストラクター Boolean のインスタンスである、Object 型に属する値

注

Boolean オブジェクトは、Boolean 値を引数として渡し、new 式で Boolean コンストラクターを使用することによって作成されます。生成されたオブジェクトは、その Boolean 値を値とする内部スロットを持ちます。Boolean オブジェクトは、Boolean 値に型変換できます。

4.4.20 String 値

0個以上の16ビット符号なし整数値からなる、有限の順序付きの列であるプリミティブ値

注

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

4.4.21 String 型

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

4.4.22 String オブジェクト

標準組込みコンストラクター String のインスタンスである、Object 型に属する値

注

String オブジェクトは、String 値を引数として渡し、new 式で String コンストラクターを使用することによって作成されます。生成されたオブジェクトは、その String 値を値とする内部スロットを持ちます。String オブジェクトは、String コンストラクターを関数として呼び出すことで、String 値に型変換できます(22.1.1.1)。

4.4.23 Number 値

IEEE 754-2019 の倍精度64ビットバイナリ形式の値に対応するプリミティブ値

注

Number 値は、Number 型に属する値であり、数の直接的な表現です。

4.4.24 Number 型

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

4.4.25 Number オブジェクト

標準組込みコンストラクター Number のインスタンスである、Object 型に属する値

注

Number オブジェクトは、Number 値を引数として渡し、new 式で Number コンストラクターを使用することによって作成されます。生成されたオブジェクトは、その Number 値を値とする内部スロットを持ちます。Number オブジェクトは、Number コンストラクターを関数として呼び出すことで、Number 値に型変換できます(21.1.1.1)。

4.4.26 Infinity

正の無限大の Number 値である Number 値

4.4.27 NaN

IEEE 754-2019 の NaN(“非数”)値である Number 値

4.4.28 BigInt 値

任意精度の整数値に対応するプリミティブ値

4.4.29 BigInt 型

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

4.4.30 BigInt オブジェクト

標準組込みコンストラクター BigInt のインスタンスである、Object 型に属する値

4.4.31 Symbol 値

一意で、String ではない Object のプロパティキーを表すプリミティブ値

4.4.32 Symbol 型

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

4.4.33 Symbol オブジェクト

標準組込みコンストラクター Symbol のインスタンスである、Object 型に属する値

4.4.34 関数

サブルーチンとして呼び出せる、Object 型に属する値

注

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

4.4.35 組込み関数

関数である組込みオブジェクト

注

組込み関数の例には、parseInt と Math.exp があります。ホストまたは実装は、この仕様に記述されていない追加の組込み関数を提供してもかまいません。

4.4.36 組込みコンストラクター

コンストラクターである組込み関数

注

組込みコンストラクターの例には、Object と Function があります。ホストまたは実装は、この仕様に記述されていない追加の組込みコンストラクターを提供してもかまいません。

4.4.37 プロパティ

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

注

プロパティの形式に応じて、その値は、データ値(プリミティブ値、オブジェクト、または関数オブジェクト)として直接表現される場合と、一対のアクセサー関数によって間接的に表現される場合があります。

4.4.38 メソッド

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

注

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

4.4.39 組込みメソッド

組込み関数であるメソッド

注

標準の組込みメソッドは、この仕様で定義されます。ホストまたは実装は、この仕様に記述されていない追加の組込みメソッドを提供してもかまいません。

4.4.40 属性

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

4.4.41 自身のプロパティ

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

4.4.42 継承されたプロパティ

オブジェクト自身のプロパティではなく、そのオブジェクトのプロトタイプのプロパティ(自身のもの、または継承されたもの)である、オブジェクトのプロパティ

4.5 この仕様の構成

この仕様の残りの部分は、以下のように構成されています。

箇条 5 は、この仕様全体で使用される表記規約を定義します。

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

箇条 11 から 17 は、構文の符号化とすべての言語機能の実行意味論を含む、ECMAScript プログラミング言語そのものを定義します。

箇条 18 から 28 は、ECMAScript の標準ライブラリを定義します。これらには、実行中の ECMAScript プログラムが使用できる、すべての標準オブジェクトの定義が含まれます。

箇条 29 は、SharedArrayBuffer によって裏付けられるメモリへのアクセスと Atomics オブジェクトのメソッドに関する、メモリ整合性モデルを説明します。