4 概要
本節では、ECMAScript言語の非規範的な概要を示します。
ECMAScriptは、オブジェクト指向プログラミング言語であり、計算処理やホスト環境内での計算オブジェクトの操作を行うために使用されます。ここで定義されるECMAScriptは、計算自体を自給自足で行うことを意図していません。実際、本仕様では外部データの入力や計算結果の出力の手段は規定されていません。その代わりに、ECMAScriptプログラムの計算環境が本仕様で記述されるオブジェクトや機能に加え、環境固有のオブジェクトも提供することが期待されます。これらのオブジェクトの詳細な説明や挙動は本仕様の範囲外ですが、ECMAScriptプログラムからプロパティや関数としてアクセスや呼び出しが可能であることを示しています。
ECMAScriptは元々スクリプト言語として設計されましたが、現在では汎用プログラミング言語として広く利用されています。スクリプト言語とは、既存システムの機能を操作・カスタマイズ・自動化するためのプログラミング言語です。こうしたシステムでは、ユーザーインターフェースを通じて有用な機能がすでに利用可能で、スクリプト言語はその機能をプログラムで制御する手段となります。このように、既存システムはオブジェクトや機能からなるホスト環境を提供し、スクリプト言語の能力を補完します。スクリプト言語は、専門・非専門のプログラマー双方による利用を想定しています。
ECMAScriptは元々Webスクリプト言語として設計され、ブラウザ上でWebページを動的にしたり、Webベースのクライアント・サーバーアーキテクチャの一部としてサーバー計算を行う仕組みを提供していました。現在では様々なホスト環境のためのコアスクリプト機能を提供しており、コア言語は特定のホスト環境から切り離して本書で定義されています。
ECMAScriptの利用は単純なスクリプト用途を超えて拡大し、さまざまな環境や規模におけるあらゆるプログラミング課題に使われています。それに伴い、言語の機能や設備も拡充されてきました。ECMAScriptは現在、十分に機能を備えた汎用プログラミング言語です。
4.1 ウェブスクリプト
ウェブブラウザは、クライアントサイドの計算処理のためのECMAScriptホスト環境を提供します。例えば、ウィンドウ・メニュー・ポップアップ・ダイアログボックス・テキストエリア・アンカー・フレーム・履歴・クッキー・入出力などを表すオブジェクトがあります。さらに、ホスト環境は、フォーカスの変化、ページや画像の読み込み・アンロード・エラー・中断・選択・フォーム送信・マウス操作等のイベントにスクリプトコードを関連付ける手段を提供します。スクリプトコードはHTML内に記述され、表示ページはユーザーインターフェース要素と固定・計算済みのテキストや画像の組み合わせとなります。スクリプトコードはユーザー操作に反応し、メインプログラムは不要です。
ウェブサーバは、サーバサイドの計算処理のための別のホスト環境を提供し、リクエスト・クライアント・ファイルなどを表すオブジェクトや、データのロック・共有の仕組みを備えています。クライアント側とサーバ側のスクリプトを組み合わせることで、Webアプリケーションにおいて計算処理をクライアントとサーバ間で分散し、カスタマイズされたユーザーインターフェースを提供できます。
ECMAScriptをサポートする各ウェブブラウザやサーバは、それぞれ独自のホスト環境を提供し、ECMAScriptの実行環境を完結させます。
4.2 ホストと実装
ECMAScriptをホスト環境に統合しやすくするため、本仕様は一部の機能(例:抽象演算)について、その定義を外部に委譲しています。編集上、本仕様では以下の区分を区別します。
実装とは、付録Dで列挙される機能や、実装定義・実装近似と記載された機能をさらに定義する外部ソースです。非公式には、実装は特定のウェブブラウザなどの具体的な成果物を指します。
実装定義の機能とは、追加の条件なく外部ソースに定義を委ねるものです。本仕様は特定の挙動について推奨はせず、適合実装は本仕様の制約内で任意の挙動を選択できます。
実装近似の機能とは、外部ソースに定義を委ねつつ、理想的な挙動を推奨するものです。適合実装は本仕様の制約内で任意の挙動を選択できますが、理想的な挙動に近づくことが推奨されます。例えばMath.exp
などの数学演算が該当します。
ホストとは、付録Dで列挙される機能をさらに定義する外部ソースですが、他の実装定義や実装近似の機能は定義しません。非公式には、ホストは本仕様に同じ方法でインターフェースする全てのウェブブラウザ等の集合を指します。ホストは WHATWG HTML(https://html.spec.whatwg.org/)などの外部仕様であることが多いです。つまり、ホスト定義の機能は外部仕様でさらに定義されることが多いです。
ホストフックとは、外部ソースによって全体または一部が定義される抽象演算です。すべてのホストフックは付録Dに列挙される必要があります。ホストフックは少なくとも以下の要件を満たさなければなりません:
- 正常完了またはthrow完了を返す必要があります。
ホスト定義の機能とは、追加の条件なく外部ソースに定義を委ね、付録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種類のTyped Array(いずれも特定数値表現)、キー付きコレクションのMap
・Set
、構造化データのためのJSON
・ArrayBuffer
・SharedArrayBuffer
・DataView
、制御抽象のためのジェネレータ関数やPromise
オブジェクト、リフレクション用のProxy
・Reflect
などがあります。
ECMAScriptはまた、組み込み演算子の集合も定義しています。ECMAScriptの演算子には、各種単項演算、乗算演算子、加算演算子、ビットシフト演算子、関係演算子、等価演算子、2項ビット演算子、2項論理演算子、代入演算子、カンマ演算子などがあります。
大規模なECMAScriptプログラムはモジュールによってサポートされ、プログラムを複数の文・宣言列に分割できます。各モジュールは、他のモジュールから提供される必要がある宣言と、他のモジュールで利用可能な自身の宣言を明示します。
ECMAScriptの構文は意図的にJava構文に似せられています。ECMAScriptの構文は、使いやすいスクリプト言語として機能するように緩やかです。例えば、変数に型宣言は不要であり、プロパティにも型は関連付けられません。また、定義済み関数は宣言が呼び出しより前に現れなくてもかまいません。
4.3.1 オブジェクト
ECMAScriptにはクラス定義の構文が含まれていますが、ECMAScriptのオブジェクトはC++・Smalltalk・Javaのようなクラスベースではありません。代わりに、リテラル記法や、オブジェクトを生成しプロパティに初期値を割り当てるコンストラクターなど、様々な方法でオブジェクトが作成されます。各コンストラクターは"prototype"というプロパティを持ち、プロトタイプベースの継承や共有プロパティを実現します。オブジェクトはnew式でコンストラクターを使うことで作成されます。例えば、new Date(2009, 11)
は新しいDateオブジェクトを生成します。コンストラクターをnewなしで呼び出すと、その挙動はコンストラクターごとに異なります。例えば、Date()
は現在の日付と時刻の文字列表現を返し、オブジェクトは生成しません。
コンストラクターで作成されたすべてのオブジェクトは、コンストラクターの"prototype"プロパティ値への暗黙的な参照(そのオブジェクトのプロトタイプと呼ばれる)を持ちます。さらに、プロトタイプは非nullなプロトタイプへの暗黙参照を持つ場合があり、これをプロトタイプチェーンと呼びます。オブジェクトのプロパティ参照は、その名前のプロパティを持つプロトタイプチェーンの最初のオブジェクトのプロパティへの参照です。つまり、まず参照されるオブジェクト自身にそのプロパティがあるかを調べ、あればそのプロパティが参照されます。なければ、そのオブジェクトのプロトタイプを次に調べ、以降同様です。
Figure 1: オブジェクト/プロトタイプ関係
クラスベースのオブジェクト指向言語では、一般にインスタンスが状態を持ち、メソッドはクラスに属し、継承は構造と振る舞いのみです。ECMAScriptでは、状態とメソッドの両方がオブジェクトに属し、構造・振る舞い・状態すべてが継承されます。
プロトタイプが直接持つプロパティを持たないすべてのオブジェクトは、そのプロパティと値を共有します。図1はこれを示します:
CFはコンストラクター(同時にオブジェクトでもある)です。new
式で5つのオブジェクトcf1、cf2、cf3、cf4、cf5が生成されています。各オブジェクトは"q1"と"q2"プロパティを持ちます。破線は暗黙のプロトタイプ関係を示します。例えばcf3のプロトタイプはCFpです。コンストラクターCF自身は"P1"と"P2"プロパティを持っており、CFp、cf1、cf2、cf3、cf4、cf5からは見えません。CFpの"CFP1"プロパティはcf1、cf2、cf3、cf4、cf5で共有されます(CF自身は除く)。また、プロトタイプチェーン上で"q1"、"q2"、"CFP1"以外のプロパティも共有されます。CFとCFpの間に暗黙のプロトタイプリンクはありません。
多くのクラスベース言語と異なり、プロパティは値を代入することで動的に追加できます。つまり、コンストラクターは生成したオブジェクトのすべてのプロパティを命名・初期化する必要はありません。上述の図では、CFpに新しい値を割り当てることでcf1~cf5の共有プロパティを追加できます。
ECMAScriptオブジェクトは本来クラスベースではありませんが、共通パターンのコンストラクター関数・プロトタイプオブジェクト・メソッドを使ってクラスライクな抽象化を定義することが便利な場合が多いです。ECMAScriptの組み込みオブジェクト自身もそのようなクラスライクなパターンに従っています。ECMAScript 2015以降、組み込みオブジェクトと同様のクラスライク抽象に沿ったオブジェクトを簡潔に定義できる構文的なクラス定義が導入されました。
4.3.2 ECMAScriptの厳格バリアント
ECMAScript言語は、利用者が言語の一部機能の利用を制限したい場合があることを認識しています。これはセキュリティ向上、エラーを起こしやすい機能回避、エラー検出強化など様々な理由によるものです。そのため、ECMAScriptは言語の厳格バリアントを定義しています。厳格バリアントでは、通常のECMAScript言語の特定の構文的・意味的機能が除外され、いくつかの機能の詳細な意味論が変更されます。また、非厳格な言語形式ではエラーとされていない状況でも、追加のエラー条件を規定し、エラー例外のthrowが必須となります。
厳格バリアントは一般に言語のstrict mode(厳格モード)と呼ばれます。厳格モードの選択および構文・意味論の利用は、個々のECMAScriptソーステキスト単位ごとに明示的に行われます(11.2.2参照)。厳格モードは構文単位ごとに選択されるため、制限はその単位内でのみ局所的に作用します。厳格モードは、複数のソーステキスト単位にまたがって一貫して動作が求められるECMAScript意味論には影響しません。完全なECMAScriptプログラムは、厳格モードと非厳格モードのソーステキスト単位の混在から構成可能です。この場合、厳格モードは実際に厳格モードのソーステキスト単位内のコードが実行されるときのみ適用されます。
本仕様への適合には、ECMAScriptの制限なしの完全な言語と、本仕様で定義される厳格バリアントの両方を実装する必要があります。また、制限なしの単位と厳格モード単位を単一の複合プログラムとして組み合わせてサポートする必要があります。
4.4 用語と定義
本書の目的のため、以下の用語と定義が適用されます。
4.4.1 実装近似
実装近似機能は、外部ソースによって全部または一部が定義されますが、本仕様で推奨される理想的な挙動を持ちます
4.4.2 実装定義
実装定義機能は、本仕様外の外部ソースによって全部または一部が定義されます
4.4.3 ホスト定義
実装定義と同義
Note
4.4.4 型
6で定義されるデータ値の集合
4.4.5 プリミティブ値
6で定義される、Undefined・Null・Boolean・Number・BigInt・Symbol・Stringのいずれかの型のメンバー
Note
プリミティブ値は、言語実装の最下層で直接表現されるデータです。
4.4.6 オブジェクト
Object型のメンバー
Note
オブジェクトはプロパティの集合であり、1つのプロトタイプオブジェクトを持ちます。プロトタイプはnullの場合もあります。
4.4.7 コンストラクター
オブジェクトを生成・初期化する関数オブジェクト
Note
コンストラクターの"prototype"プロパティ値は、継承や共有プロパティの実現に用いられるプロトタイプオブジェクトです。
4.4.8 プロトタイプ
他のオブジェクトに共有プロパティを提供するオブジェクト
Note
コンストラクターがオブジェクトを生成すると、そのオブジェクトはプロパティ参照解決のためにコンストラクターの"prototype"プロパティを暗黙参照します。"prototype"プロパティはconstructor.prototype
式で参照でき、プロトタイプに追加したプロパティはすべての派生オブジェクトで継承して共有されます。Object.create
組み込み関数で明示的なプロトタイプを指定して新規作成することもできます。
4.4.9 通常オブジェクト
すべてのオブジェクトがサポートすべき基本的な内部メソッドについて、デフォルトの挙動を持つオブジェクト
4.4.10 特異オブジェクト
基本的な内部メソッドのうち1つ以上についてデフォルトの挙動を持たないオブジェクト
Note
通常オブジェクトでないものはすべて特異オブジェクトです。
4.4.11 標準オブジェクト
本仕様で意味論が定義されているオブジェクト
4.4.12 組み込みオブジェクト
ECMAScript実装によって指定・供給されるオブジェクト
Note
標準組み込みオブジェクトは本仕様で定義されます。実装は追加の組み込みオブジェクトを指定・供給することができます。
4.4.13 undefined値
変数に値が代入されていない場合に用いられるプリミティブ値
4.4.14 Undefined型
唯一の値がundefined値である型
4.4.15 null値
任意のオブジェクト値が存在しないことを明示的に表すプリミティブ値
4.4.16 Null型
唯一の値がnull値である型
4.4.17 Boolean値
Boolean型のメンバー
Note
Boolean値はtrueとfalseの2つのみです。
4.4.18 Boolean型
プリミティブ値trueとfalseからなる型
4.4.19 Booleanオブジェクト
標準組み込みBooleanコンストラクターのインスタンスであるObject型メンバー
Note
Booleanオブジェクトは、new
式でBooleanコンストラクターにBoolean値を渡して生成します。生成されたオブジェクトは内部スロットにBoolean値を保持します。BooleanオブジェクトはBoolean値に変換できます。
4.4.20 String値
有限個の16ビット符号なし整数値からなる順序付き列のプリミティブ値
Note
String値はString型のメンバーです。各整数値は通常UTF-16テキストの1単位を表しますが、ECMAScriptでは16ビット符号なし整数であること以外に制約はありません。
4.4.21 String型
すべてのString値の集合
4.4.22 Stringオブジェクト
標準組み込みStringコンストラクターのインスタンスであるObject型メンバー
Note
Stringオブジェクトは、new
式でStringコンストラクターにString値を渡して生成します。生成されたオブジェクトは内部スロットにString値を保持します。Stringオブジェクトは、Stringコンストラクター関数呼び出し(22.1.1.1)でString値に変換できます。
4.4.23 Number値
倍精度64ビット2進形式IEEE 754-2019値に対応するプリミティブ値
Note
Number値はNumber型のメンバーであり、数値を直接表現します。
4.4.24 Number型
NaN(非数)、+∞𝔽(正の無限大)、-∞𝔽(負の無限大)を含むすべてのNumber値の集合
4.4.25 Numberオブジェクト
標準組み込みNumberコンストラクターのインスタンスであるObject型メンバー
Note
Numberオブジェクトは、new
式でNumberコンストラクターにNumber値を渡して生成します。生成されたオブジェクトは内部スロットにNumber値を保持します。Numberオブジェクトは、Numberコンストラクター関数呼び出し(21.1.1.1)でNumber値に変換できます。
4.4.26 Infinity
正の無限大の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のオブジェクトプロパティキーを表すプリミティブ値
4.4.32 Symbol型
すべてのSymbol値の集合
4.4.33 Symbolオブジェクト
標準組み込みSymbolコンストラクターのインスタンスであるObject型メンバー
4.4.34 関数
サブルーチンとして呼び出し可能なObject型のメンバー
Note
関数はプロパティに加えて、呼び出し時の挙動を決定する実行コードと状態を持ちます。関数のコードはECMAScriptで書かれている場合もそうでない場合もあります。
4.4.35 組み込み関数
関数である組み込みオブジェクト
Note
組み込み関数の例としてparseInt
やMath.exp
があります。ホストや実装は、本仕様に記載されていない追加の組み込み関数を提供する場合があります。
4.4.36 組み込みコンストラクター
コンストラクターである組み込み関数
Note
組み込みコンストラクターの例としてObject
やFunction
があります。ホストや実装は、本仕様に記載されていない追加の組み込みコンストラクターを提供する場合があります。
4.4.37 プロパティ
キー(String値またはSymbol値)と値を関連付けるオブジェクトの一部
Note
プロパティの形式によって、値はデータ値(プリミティブ値・オブジェクト・関数オブジェクト)として直接、またはアクセサ関数のペアによって間接的に表現されます。
4.4.38 メソッド
プロパティの値である関数
Note
関数がオブジェクトのメソッドとして呼び出されると、そのオブジェクトがthis値として関数に渡されます。
4.4.39 組み込みメソッド
組み込み関数であるメソッド
Note
標準組み込みメソッドは本仕様で定義されます。ホストや実装は、本仕様に記載されていない追加の組み込みメソッドを提供する場合があります。
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オブジェクトのメソッドに関するメモリ整合性モデルを説明します。