このページはECMAScript® 2020 Language Specification4 Overview章をJavaScriptの学習目的で私的に日本語訳したものであり、直訳と意訳および推測が混在しています。そのため内容については正確ではない可能性があります。正確な情報を知りたい場合は、原文をご覧ください。また一部訳者によるコメントが含まれていることがあります。※このサイトの内容で損害や不利益を受けたとしても当方は一切の責任を負いません。

このセクションには、ECMAScript言語の非規範的な概要が含まれています。

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

ECMAScriptはもともとスクリプト言語として設計されましたが、汎用プログラミング言語として広く使用されるようになりました。 スクリプト言語は、既存のシステムの機能を操作、カスタマイズ、および自動化するために使用されるプログラミング言語です。 このようなシステムでは、便利な機能がユーザーインターフェイスを介して既に利用可能であることを前提として、スクリプト言語はその機能をプログラム制御に公開するためのメカニズムです。 このように、既存のシステムはオブジェクトとファシリティのホスト環境を提供し、スクリプト言語の機能を提供すると言われています。 スクリプト言語は、プロのプログラマーと非プロのプログラマーの両方による使用を目的としています。

ECMAScriptはもともとWebスクリプト言語として設計されており、ブラウザーでWebページを活性化し、Webベースのクライアント/サーバーアーキテクチャの一部としてサーバー計算を実行するメカニズムを提供します。 ECMAScriptは現在、さまざまなホスト環境にコアスクリプト機能を提供するために使用されています。 したがって、このドキュメントでは、特定のホスト環境とは別に、コア言語を指定しています。

現在ではECMAScriptは単純なスクリプティングを超えて、多くの異なる環境とスケールでのプログラミングタスクの全範囲に使用されています。 ECMAScriptの使用が拡大するにつれて、ECMAScriptが提供する機能と機能も拡大しています。 ECMAScriptは現在、完全な機能を備えた汎用プログラミング言語です。

ECMAScriptの機能のいくつかは、他のプログラミング言語で使用されているものと似ています。 特に次に記載する、C、Java™、Self、およびSchemeです。

ISO/IEC 9899:1996, Programming Languages — C.

Gosling, James, Bill Joy and Guy Steele. The Java™ Language Specification. Addison Wesley Publishing Co., 1996.

Ungar, David, and Smith, Randall B. Self: The Power of Simplicity. OOPSLA '87 Conference Proceedings, pp. 227-241, Orlando, FL, October 1987.

IEEE Standard for the Scheme Programming Language. IEEE Std 1178-1990.

4.1 ウェブスクリプティング(Web Scripting)

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

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

ECMAScriptをサポートする各Webブラウザーとサーバーは独自のホスト環境を提供することで、ECMAScript実行環境を完成させます。

4.2 ECMAScript概要(ECMAScript Overview)

以下は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。
・配列を含むインデックス付きの値のコレクションであるオブジェクト、および要素がすべて特定の数値データ表現を持つ9種類の型付き配列。
・MapおよびSetオブジェクトを含むキー付きコレクション。
・JSONオブジェクト、ArrayBuffer、SharedArrayBuffer、DataViewなどの構造化データをサポートするオブジェクト。
・ジェネレータ関数やPromiseオブジェクトなどの制御抽象化をサポートするオブジェクト。
・ProxyとReflectを含むreflectionオブジェクト。

ECMAScriptでは、一連の組み込み演算子も定義されています。 ECMAScript演算子には、さまざまな単項演算、乗算演算子、加算演算子、ビット単位のシフト演算子、関係演算子、等値演算子、バイナリビット単位演算子、バイナリ論理演算子、代入演算子、およびカンマ演算子が含まれます。

大規模なECMAScriptプログラムのために、プログラムをステートメントと宣言の複数のシーケンスに分割できるようにするモジュール機能がサポートされています。

各モジュールは、他のモジュールを使用する宣言と、他のモジュールで使用できる宣言を明示的に識別します。

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

4.2.1 オブジェクト(Objects)

ECMAScriptにはクラス定義の構文がありますが、ECMAScriptオブジェクトは、C ++、Smalltalk、Javaなどの基本的なクラスベースではありません。

代わりに、リテラル表記法や、コンストラクター(オブジェクトを作成し、関数内でプロパティに初期値を割り当ててオブジェクトのすべてまたは一部を初期化する)など、さまざまな方法でオブジェクトを作成できます。

prototypeプロパティ

コンストラクターは、プロトタイプベースの継承と共有プロパティの実装に使用される「prototype」という名前のプロパティを持つ関数です。

オブジェクトは、new式でコンストラクターを呼び出してして作成されます。 たとえば、new Date(2009、11)は新しいDateオブジェクトを作成します。 newを使用せずにコンストラクターを呼び出すと、コンストラクターに依存する結果が生じます。 たとえば、Date()は、オブジェクトではなく現在の日付と時刻の文字列表現を生成します。

コンストラクターによって作成されたすべてのオブジェクトは、そのコンストラクターの「prototype」プロパティの値への暗黙的な参照(オブジェクトのプロトタイプと呼ばれます)があります。

コンストラクターAがprototypeプロパティを持っているとする。
A.prototype={ };
new式でオブジェクト作成。
B = new A();
とすると、
B.プロパティの値への暗黙的な参照 => A.prototypeへの参照となる。
B.prototype => A.prototypeではない
重要:「prototype」プロパティとプロトタイプは別物

プロトタイプチェーン

さらに、プロトタイプ(「prototype」プロパティではない)には、そのプロトタイプへのnull以外の暗黙的な参照が含まれる場合があります。 これはプロトタイプチェーンと呼ばれます。

プロトタイプチェーン

 B.プロトタイプ={
     メンバ1、メンバ2,メンバ3...
     プロトタイプへの暗黙的な参照={
          メンバ1、メンバ2,メンバ3...
          プロトタイプへの暗黙的な参照={ }
     }
  }

オブジェクトのプロパティへの参照が行われると、プロトタイプチェーンの最初のオブジェクトにあるプロパティを参照します。

言い換えると、最初にオブジェクトがプロパティを持っているか調べられます。
オブジェクトが指定した名前のプロパティを持っている場合、それが目的とするプロパティです。そのオブジェクトに目的のプロパティが含まれていない場合、そのオブジェクトのプロトタイプが次に検査されます。

Figure 1: Object/Prototype Relationships

クラスベースのオブジェクト指向言語では、一般に、状態はインスタンスによって運ばれ、メソッドはクラスによって運ばれ、継承は構造と動作のみです。 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」という名前のプロパティは、「q1」、「q2」というCFpの暗黙的なプロトタイプチェーンにあるプロパティと同様に、cf1、cf2、cf3、cf4、およびcf5(CFではない)によって共有されます または「CFP1」。 CFとCFpの間に暗黙的なプロトタイプリンクがないことに注意してください。

ほとんどのクラスベースのオブジェクト言語とは異なり、値を割り当てることにより、プロパティを動的にオブジェクトに追加できます。 つまり、コンストラクターは、構築されたオブジェクトのプロパティのすべてまたはいずれかに名前を付けたり、値を割り当てたりする必要はありません。 上記の図では、CFpのプロパティに新しい値を割り当てることにより、cf1、cf2、cf3、cf4、およびcf5の新しい共有プロパティを追加できます。

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

4.2.2 strictバリアント(The Strict Variant of ECMAScript)

ECMAScriptは、その言語の一部のユーザーが、その言語で利用可能ないくつかの機能の使用を制限したいと考える可能性を認識しています。
セキュリティ上の理由から、エラーが発生しやすい機能を回避するため、拡張されたエラーチェックを取得するため、またはその他の理由で制限する場合があります。

この可能性をサポートするために、ECMAScriptは言語のstrict(厳密な)バリアントを定義しています。 strictバリアントは、特定の構文およびセマンティック機能を除外し、一部の機能の詳細なセマンティクスを変更します。通常はエラーではない状況でエラー例外をスローすることで、エラー条件を追加します。

ECMAScriptのstrictバリアントは、通常、言語のstrictモードと呼ばれます。
strictモードの選択と、strictモードの構文とセマンティクスの使用は、個々のECMAScriptソーステキスト単位レベルで明示的に行われます。

strictモードは構文ソーステキストユニットのレベルで選択されるため、ソーステキストユニット内でのみ影響します。
strictモードは複数のソーステキストユニットで、一貫して動作する必要があるECMAScriptセマンティクスの側面を制限または変更しません。

完全なECMAScriptプログラムは、strictモードと非strictモードの両方をECMAScriptソーステキストユニットで使用できます。
この場合、strictモードは、strictモードのソーステキストユニット内で定義されたコードを実行する場合にのみ適用されます。

ECMAScript実装は、この仕様に準拠するために、非strictモードと、strictモードの両方を実装する必要があります。さらに、非strictモードとstrictモードのソーステキストの組み合わせを1つの複合プログラムとしてサポートする必要があります。

4.3 用語と定義(Terms and Definitions)

このドキュメントでは、次の用語と定義が適用されます。

4.3.1 型(type)

この仕様の6章で定義されているデータ値のセット

4.3.2 プリミティブ値(primitive value)

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

プリミティブ値は、言語実装の最下位レベルで扱われる直接的な実データです。

4.3.3 オブジェクト(object)

タイプObjectのメンバー

オブジェクトはプロパティのコレクションであり、プロトタイプオブジェクトを一つ持っています。ただしプロトタイプはnull値である可能性があります。

4.3.4 コンストラクター(constructor)

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

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

4.3.5 プロトタイプ(prototype)

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

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

4.3.6 通常のオブジェクト(ordinary object)

オブジェクトとして必須な内部メソッドを持ち、かつデそれらがフォルトの動作をおこなうオブジェクト

4.3.7 エキゾチックなオブジェクト(exotic object)

1つ以上の重要な内部メソッドが、デフォルトの動作をおこなわないオブジェクト

通常のオブジェクトではないオブジェクトは、エキゾチックなオブジェクトです。

4.3.8 標準オブジェクト(standard object)

この仕様でセマンティクスが定義されているオブジェクト

4.3.9 組み込みオブジェクト(built-in object)

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

標準の組み込みオブジェクトは、この仕様で定義されています。 ECMAScript実装では、追加の種類の組み込みオブジェクトを指定および提供できます。 組み込みコンストラクターは、コンストラクターでもある組み込みオブジェクトです。

4.3.10 undefined値(undefined value)

変数に値が割り当てられていないときに使用されるプリミティブ値

4.3.11 Undefined型(Undefined type)

唯一の値がundefined値である型

4.3.12 null値(null value)

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

4.3.13 Null型(Null type)

唯一の値がnull値である型

4.3.14 ブール値(Boolean value)

ブール型のメンバー

ブール値は、trueとfalseの2つだけです。

4.3.15 ブール型(Boolean type)

プリミティブ値trueおよびfalseで構成される型

4.3.16 ブールオブジェクト(Boolean object)

標準の組み込みブールコンストラクターのインスタンス

ブールオブジェクトは、newでブール値を引数として渡したブールコンストラクターから作成されます。 結果のオブジェクトには、値がブール値である内部スロットがあります。 ブールオブジェクトはブール値に強制変換できます。

4.3.17 String値(String value)

0個以上の16ビット符号なし整数値の有限順序シーケンスであるプリミティブ値

String値は、String型のメンバーです。シーケンスの各整数値は、通常、UTF-16テキストの単一の16ビット単位を表します。ただし、ECMAScriptは16ビットの符号なし整数でなければならないことを除いて、値に制限や要件を課しません。

4.3.18 String型(String type)

String値のセット

4.3.19 Stringオブジェクト(String object)

標準の組み込みStringコンストラクターのインスタンス

Stringオブジェクトは、newでString値を引数として渡したStringコンストラクタで作成されます。 結果のオブジェクトには、値がString値である内部スロットがあります。 Stringオブジェクトは、Stringコンストラクターを関数として呼び出すことにより、String値に強制変換できます(21.1.1.1)。

4.3.20 Number値(Number value)

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

Number値はNumber型のメンバーであり、数値の直接表現です。

4.3.21 Number型(Number type)

Not-a-Number(NaN)値、正の無限大、負の無限大を含むすべての数値のセット

4.3.22 Numberオブジェクト(Number object)

標準の組み込みNumberコンストラクターのインスタンス

Numberオブジェクトは、newで引数としてNumber値をNumberコンストラクターに渡して作成されます。結果のオブジェクトには、値がNumber値である内部スロットがあります。Numberオブジェクトは、Numberコンストラクターを関数として呼び出すことにより、Number値に強制変換できます(20.1.1.1)。

4.3.23 無限大(Infinity)

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

4.3.24 NaN

IEEE 754-2019の「Not-a-Number」値であるNumber値

4.3.25 BigInt値(BigInt value)

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

4.3.26 BigInt型(BigInt type)

BigInt値のセット

4.3.27 BigIntオブジェクト(BigInt object)

標準の組み込みBigIntコンストラクターのインスタンス

4.3.28 Symbol値(Symbol value)

一意の非文字列オブジェクトプロパティキーを表すプリミティブ値

4.3.29 Symbol型(Symbol type)

Symbol値のセット

4.3.30 Symbolオブジェクト(Symbol object)

標準の組み込みSymbolコンストラクターのインスタンス

4.3.31 関数(function)

サブルーチンとして呼び出すことができるObject型のメンバー

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

4.3.32 組み込み関数(built-in function)

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

組み込み関数の例には、parseIntやMath.expなどがあります。 実装は、この仕様で説明されていない実装依存の組み込み関数を提供する場合があります。

4.3.33 プロパティ(property)

キー(文字列値またはシンボル値)と値を関連付けるオブジェクトの一部

プロパティの形式に応じて、値はデータ値(プリミティブ値、オブジェクト、または関数オブジェクト)として直接、または1組のアクセサ関数によって間接的に表すことができます。

4.3.34 メソッド(method)

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

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

4.3.35 組み込みメソッド(built-in method)

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

標準の組み込みメソッドはこの仕様で定義されており、ECMAScript実装は他の追加の組み込みメソッドを指定および提供できます。

4.3.36 属性(attribute)

プロパティのいくつかの特性を定義する内部値

4.3.37 独自プロパティ(own property)

オブジェクトが直接所持しているプロパティ

4.3.38 継承プロパティ(inherited property)

独自プロパティではない、オブジェクトのプロトタイプのプロパティ。

※プロトタイプの独自プロパティだけでなく、プロトタイプ内の継承プロパティも含まれる。

4.4 この仕様の構成(Organization of This Specification)

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

5章は、仕様全体で使用される表記規則を定義しています。

6〜9章は、ECMAScriptプログラムが動作する実行環境を定義します。

10から16章は、構文エンコードとすべての言語機能の実行セマンティクスを含む実際のECMAScriptプログラミング言語を定義します。

17〜26章は、ECMAScript標準ライブラリを定義しています。 それらには、実行時にECMAScriptプログラムで使用できるすべての標準オブジェクトの定義が含まれています。

27章は、SharedArrayBuffer-backedメモリへのアクセスのメモリ一貫性モデルと、Atomicsオブジェクトのメソッドについて説明しています。