Draft ECMA-262 / September 16, 2025

ECMAScript® 2026 言語仕様

この仕様書について

https://tc39.es/ecma262/ にある文書は、最も正確かつ最新の ECMAScript 仕様です。ここには、最新の年次スナップショットの内容と、スナップショット以降に 完了した提案提案プロセスにて Stage 4 に到達し、複数の実装に導入され、次回の実用的な改訂に含まれる予定のもの)が含まれています。

本仕様書は 単一ページ、および 複数ページでご利用いただけます。

この仕様書への貢献について

この仕様は GitHub 上で ECMAScript コミュニティの協力によって開発されています。仕様書の開発に貢献する方法はいくつかあります:

この文書の作成方法については colophon を参照してください。

はじめに

このEcma標準は、ECMAScript 2026言語を定義します。これはECMAScript言語仕様の第17版です。1997年の第1版公開以来、ECMAScriptは世界で最も広く使われている汎用プログラミング言語の一つに成長しました。主にウェブブラウザに組み込まれている言語として知られていますが、サーバーや組み込み用途にも広く採用されています。

ECMAScriptはいくつかの技術をもとにしており、最もよく知られているのはJavaScript(Netscape)とJScript(Microsoft)です。この言語はNetscapeのBrendan Eichによって発明され、同社のNavigator 2.0ブラウザで初めて登場しました。その後、Netscapeの全てのブラウザと、Internet Explorer 3.0以降のMicrosoftの全てのブラウザに搭載されています。

ECMAScript言語仕様の開発は1996年11月に始まりました。このEcma標準の第1版は1997年6月のEcma総会で採択されました。

このEcma標準はISO/IEC JTC 1に高速トラック手続きで提出され、1998年4月に国際標準ISO/IEC 16262として承認されました。1998年6月のEcma総会では、ISO/IEC 16262との完全な整合性を保つため第2版(ECMA-262)が承認されました。第1版と第2版の間の変更は編集上のものです。

第3版の標準では、強力な正規表現、より良い文字列処理、新しい制御文、try/catch例外処理、エラー定義の強化、数値出力のフォーマット、将来の言語成長を見越した小さな変更などが導入されました。ECMAScript標準の第3版は1999年12月のEcma総会で採択され、2002年6月にISO/IEC 16262:2002として発行されました。

第3版発行後、ECMAScriptはWorld Wide Webとともに大量に普及し、事実上すべてのウェブブラウザでサポートされるプログラミング言語となりました。第4版の開発も大きく進みましたが、最終的には完了せず、第4版としては公開されませんでした。しかし、その一部は第6版の開発に取り込まれました。

第5版(ECMA-262第5版として発行)は、ブラウザ実装で一般的となった言語仕様の事実上の解釈を成文化し、第3版以降に登場した新機能への対応を追加しました。これにはアクセサプロパティ、オブジェクトの反射的な生成・検査、プロパティ属性の制御、配列操作関数の追加、JSONオブジェクトエンコーディング形式のサポート、エラー検出とプログラムの安全性を強化するstrict modeなどが含まれます。第5版は2009年12月のEcma総会で採択されました。

第5版はISO/IEC JTC 1に高速トラック手続きで提出され、国際標準ISO/IEC 16262:2011として承認されました。ECMAScript標準のEdition 5.1では小さな修正が加えられ、ISO/IEC 16262:2011と同一のテキストとなりました。5.1版は2011年6月のEcma総会で採択されました。

第6版の集中的な開発は2009年に始まりましたが、その前には1999年の第3版発行以降、言語拡張設計や実験が積み重ねられてきました。第6版の完成は、まさに15年にわたる取り組みの集大成です。本版の目標には、大規模アプリケーションやライブラリ作成、他言語のコンパイルターゲットとしてのECMAScriptのサポート強化などが含まれます。主な拡張点は、モジュール、クラス宣言、レキシカルブロックスコープ、イテレータとジェネレータ、非同期プログラミングのためのPromise、分割代入パターン、適切な末尾呼び出しです。組み込みライブラリも拡張され、マップ・セット・バイナリ数値配列のほか、文字列や正規表現でのUnicode補助文字サポートも強化されました。組み込みオブジェクトはサブクラス化によって拡張可能になりました。第6版は、定期的かつ漸進的な言語・ライブラリ拡張の基礎となります。第6版は2015年6月の総会で採択されました。

ECMAScript 2016は、Ecma TC39による新たな年次リリースおよびオープン開発プロセスのもとで初めて公開されたECMAScript版です。ECMAScript 2015のソース文書からプレーンテキスト文書を作成し、以降の開発は全てGitHub上で行われました。本標準の開発期間中、数百件のPull RequestやIssueが提出され、何千ものバグ修正や編集修正、その他の改善が行われました。また、Ecmarkup・Ecmarkdown・Grammarkdownなどの開発支援ツールも多数作られました。ES2016では新しいべき乗演算子や、Array.prototypeincludesメソッドが追加されました。

ECMAScript 2017ではAsync Function、Shared Memory、Atomicsが導入され、他にも小規模な言語・ライブラリ拡張やバグ修正、編集更新が行われました。Async FunctionはPromiseを返す関数のための構文を提供し、非同期プログラミング体験を向上させます。Shared MemoryとAtomicsは、複数エージェント間で原子的な操作による通信を可能にし、並列CPUでも明確な実行順序を保証する新しいメモリモデルを導入します。また、ObjectにはObject.valuesObject.entriesObject.getOwnPropertyDescriptorsなどの新しい静的メソッドが追加されました。

ECMAScript 2018では、非同期イテレーションを実現するasync iteratorプロトコルとasync generatorがサポートされました。さらに、4つの新しい正規表現機能(dotAllフラグ、名前付きキャプチャグループ、Unicodeプロパティエスケープ、後方参照)が追加されました。最後に、オブジェクトのrest/spreadプロパティも導入されました。

ECMAScript 2019では、Array.prototypeflatflatMapObject.fromEntriesによるObject.entriesの戻り値から新しいオブジェクトを直接作成する関数、String.prototypetrimStarttrimEnd(従来のtrimLefttrimRightよりも適切な名称)などのビルトイン関数が追加されました。また、構文と意味への小規模な更新も含まれています。構文の更新では、catchバインディングパラメータの省略や、文字列リテラルでU+2028(行区切り)・U+2029(段落区切り)をJSONに合わせて許可する変更がありました。その他、Array.prototype.sortの安定ソートの要求や、JSON.stringifyの入力に関わらずUTF-8の整形式な出力の要求、Function.prototype.toStringの仕様明確化(元のソースまたは標準プレースホルダーの返却)が行われました。

ECMAScript 2020(第11版)では、文字列の全マッチオブジェクトをイテレータで返すmatchAllメソッド、動的指定子でモジュールを非同期インポートするimport()構文、任意精度整数を扱う新しい数値型BigInt、短絡しないPromise合成のためのPromise.allSettled、グローバルなthis値への統一的アクセス手段globalThisexport * as ns from 'module'のモジュール構文、for-in列挙順序の標準化、モジュール文脈情報のためのimport.meta、nullish値(undefinednull)の扱いを改善するnullish合体演算子・オプショナルチェーン演算子などが導入されました。

ECMAScript 2021(第12版)では、文字列のreplaceAllメソッド、Promiseの短絡合成Promise.any、複数のエラーを同時に表現する新しいエラー型AggregateError、論理代入演算子(??=&&=||=)、ガベージコレクション抑止なしでターゲットオブジェクト参照を可能にするWeakRef、ガベージコレクション時のクリーンアップ操作管理のためのFinalizationRegistry、数値リテラルの区切り(1_000)、Array.prototype.sort実装定義順序を減らす仕様強化などが追加されました。

ECMAScript 2022(第13版)では、モジュールのトップレベルでawaitキーワードが使用できるようになり、クラスの新要素(public/privateインスタンスフィールド、public/private staticフィールド、privateインスタンスメソッド・アクセサ、private staticメソッド・アクセサ)、クラス内のstatic blockによる初期化、#x in obj構文によるオブジェクトのprivateフィールド存在判定、正規表現の/dフラグによるマッチ開始・終了インデックス取得、エラーの原因記録用causeプロパティ、文字列・配列・TypedArrayでの相対インデックス取得のatメソッド、Object.hasOwnによるObject.prototype.hasOwnPropertyの簡便な代替手段などが導入されました。

ECMAScript 2023(第14版)では、Array.prototypeTypedArray.prototypetoSortedtoReversedwithfindLastfindLastIndexメソッド、およびArray.prototypetoSplicedメソッドが追加されました。また、ファイル先頭の#!コメントによる実行可能ECMAScriptファイル対応や、弱コレクションのキーとしてほとんどのSymbolの使用が許可されました。

ECMAScript 2024(第15版)では、ArrayBufferとSharedArrayBufferのサイズ変更・転送機能、文字列集合操作に便利な新しいRegExp /vフラグ、Promise構築のためのPromise.withResolvers、データ集計のObject.groupByMap.groupBy、共有メモリ変更を非同期で待つAtomics.waitAsync、文字列のUnicode整形式判定・修正のString.prototype.isWellFormedString.prototype.toWellFormedなどが導入されました。

ECMAScript 2025(第16版)では、イテレータ操作のための新しいグローバルIterator(静的・プロトタイプメソッド付き)、Set.prototypeのセット操作メソッド、JSONモジュールのインポートとインポート属性宣言構文、正規表現用のRegExp.escapeメソッド、正規表現内での修飾子フラグのインライン変更構文、Promise返却有無を問わず常にPromiseを返すPromise.tryメソッド、新しいTypedArrayFloat16Arrayとそれに対応するDataView.prototype.getFloat16DataView.prototype.setFloat16Math.f16roundメソッドが導入されました。

本版および以前の版の開発において、Ecma TC39には多くの組織を代表する多数の個人が非常に重要な貢献をしています。さらに、TC39のECMAScript活動を支える活発なコミュニティも生まれました。このコミュニティは多数のドラフトのレビュー、数千件に及ぶバグ報告、実装実験、テストスイートの提供、世界中の開発者へのECMAScriptの教育などで貢献しています。残念ながら、この取り組みに貢献した全ての個人や組織を特定し、謝意を表することは不可能です。

Allen Wirfs-Brock
ECMA-262、第6版プロジェクトエディター

Brian Terlson
ECMA-262、第7~10版プロジェクトエディター

Jordan Harband
ECMA-262、第10~12版プロジェクトエディター

Shu-yu Guo
ECMA-262、第12~16版プロジェクトエディター

Michael Ficarra
ECMA-262、第12~16版プロジェクトエディター

Kevin Gibbons
ECMA-262、第12~16版プロジェクトエディター

1 適用範囲

本標準は、ECMAScript 2026汎用プログラミング言語を定義します。

2 適合性

ECMAScriptの適合する実装は、本仕様で記述されているすべての型、値、オブジェクト、プロパティ、関数、プログラムの構文および意味を提供し、サポートしなければなりません。

ECMAScriptの適合する実装は、Unicode標準およびISO/IEC 10646の最新バージョンに従って、ソーステキスト入力を解釈しなければなりません。

異なる言語や国の言語的・文化的慣習に適応する必要があるプログラムをサポートするアプリケーションプログラミングインターフェイス(API)を提供するECMAScriptの適合実装は、本仕様と互換性のある最新のECMA-402版で定義されたインターフェイスを実装しなければなりません。

ECMAScriptの適合する実装は、本仕様で記述されているもの以外にも追加の型、値、オブジェクト、プロパティ、関数を提供することができます。特に、適合する実装は本仕様で記述されていないプロパティやその値を、本仕様で記述されているオブジェクトに対して提供することができます。

ECMAScriptの適合する実装は、本仕様で記述されていないプログラムおよび正規表現の構文をサポートすることができます。特に、適合する実装は、本仕様の12.7.2の小項で示される「将来予約語」を使用するプログラム構文をサポートすることができます。

ECMAScriptの適合する実装は、17.1の小項で「禁止拡張」としてリストされているいかなる拡張も実装してはなりません。

ECMAScriptの適合する実装は、実装定義実装近似、またはホスト定義でないいかなる機能も再定義してはなりません。

ECMAScriptの適合する実装は、特に指示がない限り、規範的任意の小項を実装するかしないかを選択できます。ウェブブラウザは一般的にすべての規範的任意の小項を実装する必要があります。(付録Bを参照。)規範的任意の動作が実装される場合は、その規範的任意項内のすべての動作を実装しなければなりません。規範的任意の項は、本仕様書では「規範的任意」と書かれた色付きのボックスで示されます。下記はその例です。

Normative Optional

2.1 規範的任意項目の見出し例

項目内容の例。

ECMAScriptの適合する実装は、規範的任意としてもマークされていない限り、レガシーの小項を実装しなければなりません。レガシーの小項で規定された言語機能や動作は、いずれも何らかの望ましくない特性を有しています。しかし、既存アプリケーションでの継続的な利用により、本仕様からの削除ができません。これらの機能はECMAScript言語のコア部分とはみなされません。プログラマーは新しいECMAScriptコードを書く際、これらの機能や動作の利用や存在を前提とすべきではありません。

Legacy

2.2 レガシー項目の見出し例

項目内容の例。

Normative Optional, Legacy

2.3 レガシー規範的任意項目の見出し例

項目内容の例。

3 規範参照

以下に参照する文書は、本書の適用に不可欠です。日付付き参照については、記載された版のみが適用されます。日付なし参照については、参照文書の最新版(修正等を含む)が適用されます。

IEEE 754-2019, 浮動小数点算術のIEEE標準

Unicode標準。
https://unicode.org/versions/latest

ISO/IEC 10646, 情報技術 ― 多オクテット符号化文字集合(UCS) および Amendment 1:2005, Amendment 2:2006, Amendment 3:2008, Amendment 4:2008、追加の修正および後継。

ECMA-402, ECMAScript国際化API仕様、特に本仕様の版に対応する年次版。
https://www.ecma-international.org/publications-and-standards/standards/ecma-402/

ECMA-404, JSONデータ交換フォーマット
https://www.ecma-international.org/publications-and-standards/standards/ecma-404/

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コードでそのプロパティに値を代入しようとしても失敗します。プロパティは他のオブジェクトやプリミティブ値関数を格納するコンテナです。プリミティブ値は、UndefinedNullBooleanNumberBigIntStringSymbolのいずれかの組み込み型のメンバーです。オブジェクトは組み込み型Objectのメンバーであり、関数は呼び出し可能なオブジェクトです。オブジェクトのプロパティとして結び付けられた関数はメソッドと呼ばれます。

ECMAScriptは組み込みオブジェクトの集合を定義し、ECMAScriptの構成要素を補完します。これらの組み込みオブジェクトにはグローバルオブジェクト、言語のランタイム意味論に不可欠なObjectFunctionBooleanSymbol、各種Errorオブジェクト、数値値を表現・操作するMathNumberDate、テキスト処理用のStringRegExp、値のインデックス付きコレクションであるArrayと9種類のTyped Array(いずれも特定数値表現)、キー付きコレクションのMapSet、構造化データのためのJSONArrayBufferSharedArrayBufferDataView、制御抽象のためのジェネレータ関数やPromiseオブジェクト、リフレクション用のProxyReflectなどがあります。

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つのオブジェクトcf1cf2cf3cf4cf5が生成されています。各オブジェクトは"q1""q2"プロパティを持ちます。破線は暗黙のプロトタイプ関係を示します。例えばcf3のプロトタイプはCFpです。コンストラクタCF自身は"P1""P2"プロパティを持っており、CFpcf1cf2cf3cf4cf5からは見えません。CFp"CFP1"プロパティはcf1cf2cf3cf4cf5で共有されます(CF自身は除く)。また、プロトタイプチェーン上で"q1""q2""CFP1"以外のプロパティも共有されます。CFCFpの間に暗黙のプロトタイプリンクはありません。

多くのクラスベース言語と異なり、プロパティは値を代入することで動的に追加できます。つまり、コンストラクターは生成したオブジェクトのすべてのプロパティを命名・初期化する必要はありません。上述の図では、CFpに新しい値を割り当てることでcf1cf5の共有プロパティを追加できます。

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.2を参照。

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値はtruefalseの2つのみです。

4.4.18 Boolean型

プリミティブ値truefalseからなる型

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

組み込み関数の例としてparseIntMath.expがあります。ホストや実装は、本仕様に記載されていない追加の組み込み関数を提供する場合があります。

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

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

Note

組み込みコンストラクターの例としてObjectFunctionがあります。ホストや実装は、本仕様に記載されていない追加の組み込みコンストラクターを提供する場合があります。

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オブジェクトのメソッドに関するメモリ整合性モデルを説明します。

5 記法規則

5.1 構文・字句文法

5.1.1 文脈自由文法

文脈自由文法は、複数の生成式で構成されます。各生成式は、非終端記号と呼ばれる抽象的な記号を左辺に持ち、0個以上の非終端記号と終端記号の並びを右辺に持ちます。各文法ごとに、終端記号は指定されたアルファベットから選ばれます。

連鎖生成式は、右辺にまさに1個の非終端記号と0個以上の終端記号のみを持つ生成式です。

区別される単一の非終端記号(ゴール記号)から始めて、与えられた文脈自由文法は言語、すなわち、非終端記号をその左辺となる生成式の右辺で繰り返し置き換えることで得られる終端記号の並びの(おそらく無限の)集合を定義します。

5.1.2 字句・正規表現文法

ECMAScriptの字句文法12で示されています。この文法の終端記号は、11.1で定義されるSourceCharacterの規則に従うUnicodeコードポイントです。ゴール記号InputElementDivInputElementTemplateTailInputElementRegExpInputElementRegExpOrTemplateTailInputElementHashbangOrRegExpから始まる生成式集合が定義され、これらのコードポイントの並びを入力要素の並びへ変換する方法を表します。

空白やコメント以外の入力要素は、ECMAScriptの構文文法の終端記号となり、ECMAScriptのトークンと呼ばれます。これらのトークンは、予約語、識別子、リテラル、句読点です。さらに、行終端文字はトークンとはみなされませんが、入力要素のストリームの一部となり自動セミコロン挿入(12.10)を導きます。単純な空白や1行コメントは破棄され、構文文法の入力要素ストリームには現れません。MultiLineComment(つまり、/**/形式のコメントで、複数行にまたがるかどうかにかかわらず)は、行終端文字を含まなければ単に破棄されますが、行終端文字が1つ以上含まれていれば、1つの行終端文字に置き換えられ、構文文法の入力要素ストリームの一部となります。

ECMAScriptの正規表現文法22.2.1で示されています。この文法の終端記号もSourceCharacterで定義されるコードポイントです。ゴール記号Patternから始まる生成式集合が定義され、コードポイントの並びを正規表現パターンへ変換する方法を表します。

字句文法・正規表現文法の生成式は、「::」の2つのコロンで区切られていることで区別されます。字句文法と正規表現文法は一部の生成式を共有します。

5.1.3 数値文字列文法

数値文字列文法7.1.4.1に示されています。終端記号はSourceCharacterであり、ゴール記号StringNumericLiteralから文字列を数値値へ変換するために使われます(数値リテラルの字句文法とは似ていますが異なります)。

数値文字列文法の生成式は「:::」の3つのコロンで区切られており、ソーステキストの構文解析には使用されません。

5.1.4 構文文法

ECMAScriptの構文文法13から16までの節で示されています。この文法の終端記号は字句文法で定義されたECMAScriptトークンです(5.1.2)。ゴール記号ScriptModuleの2つから始まる生成式集合が定義され、トークンの並びがECMAScriptプログラムの構文的に正しい独立要素を形成する方法を表します。

コードポイントのストリームをECMAScriptのScriptModuleとして構文解析する場合、まず字句文法を繰り返し適用して入力要素のストリームに変換し、その後構文文法を1回適用して解析します。入力ストリームが、ゴール非終端記号(ScriptまたはModule)の単一インスタンスとして解析できず、トークンが余る場合は構文エラーとなります。

構文解析が成功すると、構文木という根付きの木構造が構築され、各ノードは構文ノードです。各構文ノードは文法記号のインスタンスであり、その記号から導出できるソーステキストの範囲を表します。構文木の根ノードは解析全体のゴール記号のインスタンスです。構文ノードが非終端記号のインスタンスである場合、その非終端記号を左辺に持つ生成式のインスタンスでもあります。また、右辺の各記号ごとに0個以上の子ノードを持ちます。各子は対応する記号のインスタンスである構文ノードです。

構文ノードはパーサーの呼び出しごとに新たに生成され、同じソーステキストでも解析間で使い回されることはありません。構文ノードは、同じソース範囲を表し、同じ文法記号のインスタンスであり、同じパーサー呼び出しから生成された場合のみ同じ構文ノードとみなされます。

Note 1

同じ文字列を複数回解析すると、異なる構文ノードが得られます。例えば:

let str = "1 + 1;";
eval(str);
eval(str);

それぞれのeval呼び出しは、strの値をECMAScriptソーステキストに変換し、独立した構文木を生成する個別の解析を行います。各木は、同じ文字列値から導出されたソーステキストであっても別物です。

Note 2
構文ノードは仕様上のアーティファクトであり、実装が同様のデータ構造を使う必要はありません。

構文文法の生成式は、区切りが1つのコロン「:」であることで区別されます。

構文文法は、13から16までで示されるものだけでは、どのトークン並びが正しいECMAScriptのScriptModuleとして受理されるかの完全な説明にはなりません。特定の追加トークン並び(たとえば行終端文字の前にセミコロンを追加した場合など)は、文法で記述されていれば受理されます。逆に、文法で記述されていても、行終端文字が「不自然」な場所に現れると受理されない場合もあります。

曖昧さ回避のため、構文文法では有効なECMAScriptのScriptModuleにならないトークン並びも許容する一般化生成式が使われる場合があります。例えば、オブジェクトリテラルや分割代入パターンでこの手法が使われます。その場合、より制約された補助文法が提供され、受理可能なトークン並びが制限されます。通常、早期エラー規則で「"PNカバーしなければならない"」と記されます。Pは一般化生成式の構文ノード、Nは補助文法の非終端記号です。これは次の意味です:

  1. Pがもともとマッチしたトークン並びを、Nゴール記号として再度解析します。Nが文法パラメータを持つ場合は、Pの解析時と同じ値で設定します。
  2. トークン並びが、余りなくNの単一インスタンスとして解析できれば:
    1. そのNのインスタンス(P固有の構文ノード)を「PによってカバーされたN」と呼びます。
    2. Nおよびその派生生成式の早期エラー規則は、PによってカバーされたNにも適用されます。
  3. そうでなければ(解析失敗時)、早期構文エラーとなります。

5.1.5 文法記法

5.1.5.1 終端記号

ECMAScriptの文法では、等幅フォントで示される終端記号があります。これらはソーステキストに正確に記述されたとおりに現れなければなりません。このように指定されたすべての終端記号コードポイントは、他のUnicode範囲ではなく、基本ラテンブロックの適切なUnicodeコードポイントであると理解されます。終端記号内のコードポイントは、\ UnicodeEscapeSequenceで表現することはできません。

終端記号が個々のUnicodeコードポイントで構成される文法(字句・正規表現・数値文字列文法)では、生成式内の複数の等幅コードポイントの連続は、同じコードポイントの並びを個別の終端記号として書く省略表記です。

例えば、次の生成式:

HexIntegerLiteral :: 0x HexDigits

は、次の省略表記です:

HexIntegerLiteral :: 0 x HexDigits

一方、構文文法では、等幅コードポイントの連続は1つの終端記号です。

終端記号には他にも2つの形式があります:

5.1.5.2 非終端記号と生成式

非終端記号は斜体で示されます。非終端記号(「生成式」とも呼ばれる)の定義は、定義される非終端記号の名前の後に1つ以上のコロンを続けて導入されます。(コロンの数はその生成式が属する文法を示します。)非終端記号の右辺の選択肢が続く形になります。例えば、構文定義:

WhileStatement : while ( Expression ) Statement

は、非終端記号WhileStatementが、whileトークン、左括弧トークン、Expression、右括弧トークン、Statementの並びを表すことを示します。ExpressionStatementはそれ自体非終端記号です。別の例として、構文定義:

ArgumentList : AssignmentExpression ArgumentList , AssignmentExpression

は、ArgumentListが、単一のAssignmentExpressionまたは、ArgumentListの後にカンマとAssignmentExpressionが続く場合のいずれかを表すことを示します。このArgumentListの定義は再帰的であり、自己参照によって任意個数の引数(各引数式はAssignmentExpression)をカンマ区切りで持つことができます。このような非終端記号の再帰定義はよく使われます。

5.1.5.3 省略可能記号

終端記号や非終端記号の後に「opt」という下付き文字が付く場合、省略可能記号を表します。省略可能記号を含む選択肢は、実際には省略要素なしとありの2つの右辺を指定します。つまり:

VariableDeclaration : BindingIdentifier Initializeropt

は、次の省略表記です:

VariableDeclaration : BindingIdentifier BindingIdentifier Initializer

また、次の:

ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement

は、次の省略表記です:

ForStatement : for ( LexicalDeclaration ; Expressionopt ) Statement for ( LexicalDeclaration Expression ; Expressionopt ) Statement

さらに、次の省略表記です:

ForStatement : for ( LexicalDeclaration ; ) Statement for ( LexicalDeclaration ; Expression ) Statement for ( LexicalDeclaration Expression ; ) Statement for ( LexicalDeclaration Expression ; Expression ) Statement

つまり、この例では非終端記号ForStatementは実際には4つの右辺選択肢を持ちます。

5.1.5.4 文法パラメータ

生成式は、下付きの「[parameters]」という注釈でパラメータ化できます。これは定義される非終端記号の後ろに付与されます。「parameters」は単一名またはカンマ区切りの複数名です。パラメータ化された生成式は、パラメータ名のすべての組合せに対して、パラメータ化非終端記号にアンダースコアで付加したものとして生成式を定義する省略表記です。つまり:

StatementList[Return] : ReturnStatement ExpressionStatement

は、次の省略表記です:

StatementList : ReturnStatement ExpressionStatement StatementList_Return : ReturnStatement ExpressionStatement

また、次の:

StatementList[Return, In] : ReturnStatement ExpressionStatement

は、次の省略表記です:

StatementList : ReturnStatement ExpressionStatement StatementList_Return : ReturnStatement ExpressionStatement StatementList_In : ReturnStatement ExpressionStatement StatementList_Return_In : ReturnStatement ExpressionStatement

複数パラメータは、完全な文法で参照されない生成式も含め、組合せ数だけ生成式を生みます。

生成式右辺の非終端記号への参照もパラメータ化できます。例えば:

StatementList : ReturnStatement ExpressionStatement[+In]

は、次の表現と同義です:

StatementList : ReturnStatement ExpressionStatement_In

また、次の:

StatementList : ReturnStatement ExpressionStatement[~In]

は、次の表現と同義です:

StatementList : ReturnStatement ExpressionStatement

非終端記号参照には、パラメータリストと「opt」を両方付けることもできます。例えば:

VariableDeclaration : BindingIdentifier Initializer[+In]opt

は、次の表現と同義です:

VariableDeclaration : BindingIdentifier BindingIdentifier Initializer_In

右辺の非終端記号参照に「?」付きパラメータ名を付けると、そのパラメータ値は現在の生成式左辺への参照時に使われたパラメータ名の有無に依存します。例えば:

VariableDeclaration[In] : BindingIdentifier Initializer[?In]

は、次の表現と同義です:

VariableDeclaration : BindingIdentifier Initializer VariableDeclaration_In : BindingIdentifier Initializer_In

右辺選択肢の先頭に「[+parameter]」が付く場合、その選択肢は参照時にパラメータ名が使われている場合のみ利用可能です。「[~parameter]」付きの場合は、参照時にパラメータ名が使われていない場合のみ利用可能です。つまり:

StatementList[Return] : [+Return] ReturnStatement ExpressionStatement

は、次の表現と同義です:

StatementList : ExpressionStatement StatementList_Return : ReturnStatement ExpressionStatement

また、次の:

StatementList[Return] : [~Return] ReturnStatement ExpressionStatement

は、次の表現と同義です:

StatementList : ReturnStatement ExpressionStatement StatementList_Return : ExpressionStatement

5.1.5.5 one of

文法定義のコロンの後に「one of」と記されている場合、続く行に示す各終端記号がそれぞれ代替定義であることを意味します。例えば、ECMAScriptの字句文法には次の生成式があります:

NonZeroDigit :: one of 1 2 3 4 5 6 7 8 9

これは、次の表現の省略形です:

NonZeroDigit :: 1 2 3 4 5 6 7 8 9

5.1.5.6 [empty]

生成式の右辺に「[empty]」と記されている場合、その生成式の右辺には終端記号も非終端記号も含まれないことを示します。

5.1.5.7 先読み制約

生成式の右辺に「[lookahead = seq]」と記されている場合、その生成式はトークン並びseqが直後の入力トークン並びの接頭辞である場合のみ利用できます。同様に「[lookahead ∈ set]」では、setのいずれかの要素が直後のトークン並びの接頭辞である場合のみ利用できます。簡便のため、setを非終端記号として書くこともでき、その場合はその非終端記号が展開できるすべてのトークン並びの集合を表します。非終端記号が無限個の異なるトークン並びに展開できる場合、編集上の誤りとされます。

これらの条件は否定できます。「[lookahead ≠ seq]」は、seqが直後の入力トークン並びの接頭辞でない場合のみ利用できることを意味し、「[lookahead ∉ set]」は、setのいずれの要素も直後のトークン並びの接頭辞でない場合のみ利用できます。

例として、次の定義を考えます:

DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9 DecimalDigits :: DecimalDigit DecimalDigits DecimalDigit

次の定義:

LookaheadExample :: n [lookahead ∉ { 1, 3, 5, 7, 9 }] DecimalDigits DecimalDigit [lookahead ∉ DecimalDigit]

は、アルファベットnの後に1つ以上の10進数字が続き、その最初が偶数である場合、または10進数字の後にさらに数字が続かない場合にマッチします。

これらの句が構文文法で使われる場合、直後のトークン並びを一意に特定できない可能性があることに注意してください。後続トークンの決定には後続位置で使う字句ゴール記号の選択が必要となるためです。したがって、構文文法でこれらを使う場合、seqのトークン並びが先読み制約(集合の一部としても)に現れ、字句ゴール記号の選択によって接頭辞となるかどうかが変わる場合、編集上の誤りとされます。

5.1.5.8 [no LineTerminator here]

構文文法の生成式の右辺に「[no LineTerminator here]」と記されている場合、その生成式は制限生成式であり、指定された位置にLineTerminatorが入力ストリームに現れると利用できません。例えば、次の生成式:

ThrowStatement : throw [no LineTerminator here] Expression ;

は、throwトークンとExpressionの間にLineTerminatorが現れる場合、生成式を利用できないことを示します。

制限生成式でLineTerminatorの存在が禁止されていない限り、入力要素ストリームの任意の2つの連続トークンの間にLineTerminatorがいくら現れても、スクリプトの構文的な正当性には影響しません。

5.1.5.9 but not

生成式の右辺は、「but not」という句を使って、特定の展開を許可しないことを指定できます。例えば、次の生成式:

Identifier :: IdentifierName but not ReservedWord

は、非終端記号IdentifierIdentifierNameで置換できるコードポイント並びのうち、同じ並びがReservedWordでも置換できる場合を除くことを意味します。

5.1.5.10 記述的句

最後に、非終端記号のうち、すべての選択肢を列挙するのが非現実的な場合、サンセリフ体の記述的句で説明されるものがあります:

SourceCharacter :: any Unicode code point

5.2 アルゴリズム規則

仕様書では、アルゴリズムの手順を指定するために番号付きリストをよく使用します。これらのアルゴリズムは、ECMAScript言語構成要素の必要な意味論を厳密に規定するために使われます。ただし、特定の実装技法の使用を示唆するものではありません。実際には、ある機能を実装するためにより効率的なアルゴリズムが存在する場合もあります。

アルゴリズムは、順序付きのカンマ区切りのエイリアス名の列で明示的にパラメータ化されることがあります。これらの名前は、アルゴリズムの手順内でその位置に渡された引数を参照するために使用できます。省略可能なパラメータは角括弧([ , name ])で囲まれて示され、アルゴリズム手順内では必須パラメータと違いはありません。パラメータリストの末尾には、先頭に省略記号(...name)を付けたrestパラメータを指定できます。restパラメータは、必須・省略可能パラメータの後に渡された全ての引数をListにまとめて受け取ります。追加の引数がない場合、そのListは空です。

アルゴリズムの手順は、順序付きのサブステップに分割できます。サブステップはインデントされ、さらにインデントされたサブステップに分割することもできます。アウトライン番号付け規則により、最初のサブステップは小文字アルファベット、次のレベルは小文字ローマ数字でラベル付けされます。3段階を超える場合は、4段階目で数字ラベルが使われ、以降繰り返します。例えば:

  1. 最上位の手順
    1. サブステップ
    2. サブステップ
      1. サブサブステップ
        1. サブサブサブステップ
          1. サブサブサブサブステップ
            1. サブサブサブサブサブステップ

手順やサブステップは、「if」条件で書かれており、サブステップは条件が真の時のみ適用されます。「else」で始まる場合は、同じ階層の直前の「if」手順の否定条件になります。

手順は、サブステップの反復適用を指定することがあります。

Assert:」で始まる手順やサブステップは、そのアルゴリズムの不変条件を主張します。これらのアサートは、暗黙的なアルゴリズム不変性を明示するために使われます。アサートは追加の意味的要件を持たず、実装がチェックする必要はありません。アルゴリズムの明確化のためだけに使用されます。

アルゴリズム手順では、「Let x be someValue」の形式で任意の値に名前付きエイリアスを宣言できます。これらのエイリアスは参照のようなもので、xsomeValueは同じデータを参照し、どちらかを変更すると両方に反映されます。参照的挙動を避けたい場合は、「Let x be a copy of someValue」と明示的にコピーを作成することもできます。

エイリアスは宣言後の任意の手順で参照できますが、宣言より前の手順では参照できません。エイリアスは「Set x to someOtherValue」の形式で変更できます。

5.2.1 抽象操作

この仕様の複数箇所で利用しやすくするために、あるアルゴリズム(抽象操作)は名前付き・パラメータ化された関数形式で記述され、他のアルゴリズムから名前で参照できるようになっています。抽象操作は通常、OperationName(arg1, arg2)のような関数呼び出し形式で参照されます。一部の抽象操作は、クラスライクな仕様抽象のメソッドとして多態的に呼び出されます。メソッドライク抽象操作は、someValue.OperationName(arg1, arg2)のようなメソッド呼び出し形式で参照されます。

5.2.2 構文指示操作

構文指示操作は、名前付き操作であり、その定義は複数のアルゴリズムからなり、それぞれがECMAScript文法の1つ以上の生成式に関連付けられています。生成式が複数の代替定義を持つ場合、各代替ごとに異なるアルゴリズムがあることが多いです。アルゴリズムが文法生成式に関連付けられている場合、生成式代替の終端記号や非終端記号をアルゴリズムのパラメータのように参照できます。この場合、非終端記号は、ソーステキストを構文解析したときにマッチした実際の代替定義を参照します。文法生成式やそこから導出されるParse Nodeがマッチしたソーステキストとは、最初にマッチした終端記号から最後にマッチした終端記号までのソーステキスト部分です。

アルゴリズムが生成式代替に関連付けられる場合、代替は通常「[ ]」文法注釈なしで示されます。これらの注釈は代替の構文的認識のみに影響し、代替に関連付けられた意味論には影響しません。

構文指示操作は、パースノードと(必要に応じて)他のパラメータを使って、以下のアルゴリズムの手順134で示される規則で呼び出します:

  1. Let status be SyntaxDirectedOperation of SomeNonTerminal.
  2. Let someParseNode be the parse of some source text.
  3. Perform SyntaxDirectedOperation of someParseNode.
  4. Perform SyntaxDirectedOperation of someParseNode with argument "value".

明示的な記載がない限り、すべての連鎖生成式には、その生成式の左辺非終端記号に適用される可能性のあるすべての操作の暗黙定義があります。暗黙定義は、同じ操作を同じパラメータ(あれば)で連鎖生成式の唯一の右辺非終端記号に再適用し、その結果を返すだけです。たとえば、あるアルゴリズムに「Return Evaluation of Block」という手順があり、次の生成式があるとします:

Block : { StatementList }

Evaluation操作がその生成式にアルゴリズムを関連付けていない場合、Evaluation操作には次のような暗黙の関連付けが含まれます:

実行時意味論: Evaluation

Block : { StatementList }
  1. Return Evaluation of StatementList.

5.2.3 実行時意味論

実行時に呼び出される必要がある意味論を規定するアルゴリズムは実行時意味論と呼ばれます。実行時意味論は抽象操作または構文指示操作によって定義されます。

5.2.3.1 Completion ( completionRecord )

The abstract operation Completion takes argument completionRecord (Completion Record) and returns Completion Record. It performs the following steps when called:

  1. Assert: completionRecordCompletion Recordである。
  2. completionRecordを返す。

5.2.3.2 例外を投げる

例外を投げるように記載されたアルゴリズム手順、例えば

  1. TypeError例外を投げる。

は、次の意味と同じです:

  1. ThrowCompletion(新しく生成されたTypeErrorオブジェクト)を返す。

5.2.3.3 ReturnIfAbrupt

次のような記載やそれに相当するアルゴリズム手順:

  1. ReturnIfAbrupt(argument)。

は、次の意味と同じです:

  1. Assert: argumentCompletion Recordである。
  2. argumentabrupt completionなら、Completion(argument)を返す。
  3. それ以外の場合、argumentargument.[[Value]]にセットする。

次のような記載やそれに相当するアルゴリズム手順:

  1. ReturnIfAbrupt(AbstractOperation())。

は、次の意味と同じです:

  1. Let hygienicTemp be AbstractOperation()。
  2. Assert: hygienicTempCompletion Recordである。
  3. hygienicTempabrupt completionなら、Completion(hygienicTemp)を返す。
  4. それ以外の場合、hygienicTemphygienicTemp.[[Value]]にセットする。

ここで、hygienicTempはReturnIfAbruptに関する手順でのみ一時的に可視です。

次のような記載やそれに相当するアルゴリズム手順:

  1. Let result be AbstractOperation(ReturnIfAbrupt(argument))。

は、次の意味と同じです:

  1. Assert: argumentCompletion Recordである。
  2. argumentabrupt completionなら、Completion(argument)を返す。
  3. それ以外の場合、argumentargument.[[Value]]にセットする。
  4. Let result be AbstractOperation(argument)。

5.2.3.4 ReturnIfAbruptの省略記法

抽象操作構文指示操作の呼び出しの前に?が付く場合、ReturnIfAbruptをそのCompletion Recordに適用することを示します。例えば、この手順:

  1. ? OperationName()。

は次の手順と同義です:

  1. ReturnIfAbrupt(OperationName())。

同様に、メソッド呼び出し形式の場合は:

  1. someValue.OperationName()。

は次の手順と同義です:

  1. ReturnIfAbrupt(someValue.OperationName())。

また、!のプレフィックスは、後続の抽象操作構文指示操作の呼び出しがabrupt completionを返さないことを示し、Completion Record[[Value]]フィールドを操作の戻り値として使うことを意味します。例えば、この手順:

  1. Let val be ! OperationName()。

は、次の手順と同義です:

  1. Let val be OperationName()。
  2. Assert: valnormal completionである。
  3. valval.[[Value]]にセットする。

実行時意味論構文指示操作では、操作呼び出しの前に!または?を付けてこの省略記法を利用します:

  1. ! SyntaxDirectedOperation of NonTerminalを実行する。

5.2.3.5 暗黙のnormal completion

Completion Recordを返すことが宣言された抽象操作内や、全ての組み込み関数内のアルゴリズムでは、返される値はまずNormalCompletionに渡され、その結果が代わりに使われます。この規則はCompletionアルゴリズム内や、その手順でCompletion Recordと明示されている場合には適用されません。具体的には次のケースです:

これら以外の方法でCompletion Recordを返すことは編集上の誤りです。例として、これらの抽象操作内では、

  1. trueを返す。

は次のいずれかと同義です:

  1. NormalCompletion(true)を返す。

あるいは

  1. Let completion be NormalCompletion(true)。
  2. Completion(completion)を返す。

あるいは

  1. Completion Record { [[Type]]: normal, [[Value]]: true, [[Target]]: empty }を返す。

ReturnIfAbrupt展開によって、次の例は許容されます。展開後の手順内でCompletionの適用結果がabruptの場合は直接返され、normalの場合はアンラップ後に暗黙のNormalCompletion適用が行われます。

  1. Return ? completion

次の例は、Completion Recordをその手順で注釈なしに返しているため編集上の誤りです。

  1. Let completion be NormalCompletion(true)。
  2. completionを返す。

5.2.4 静的意味論

文脈自由文法だけでは、入力要素のストリームが評価可能な有効なECMAScriptのScriptModuleになるかどうかを定義する全ての規則を表現することはできません。場合によっては、ECMAScriptアルゴリズム規則や記述的要件を使って追加の規則を記述する必要があります。これらの規則は常に文法生成式に関連付けられ、生成式の静的意味論と呼ばれます。

静的意味論規則には名前があり、通常アルゴリズムで定義されます。名前付き静的意味論規則は文法生成式に関連付けられ、生成式が複数の代替定義を持つ場合、各代替ごとに適用される名前付き静的意味論規則のアルゴリズムが異なることが多いです。

静的意味論規則の中には、早期エラー規則という特別なものがあります。早期エラー規則は、特定の文法生成式に関連付けられた早期エラー条件(17参照)を定義します。ほとんどの早期エラー規則の評価は、仕様のアルゴリズム内で明示的に呼び出されません。適合実装は、ScriptModuleを初めて評価する前に、パースに使われた生成式の全ての早期エラー規則を検証しなければなりません。早期エラー規則が違反している場合、そのScriptModuleは無効となり、評価できません。

5.2.5 数学演算

本仕様書では、以下の種類の数値値に言及します:

  • 数学値: 任意の実数。デフォルトの数値型として使われます。
  • 拡張数学値: 数学値に加えて+∞と-∞を含みます。
  • Numbers: IEEE 754-2019 binary64(倍精度浮動小数点)値。
  • BigInts: ECMAScript言語値であり、任意の整数を一対一で表現します。

仕様書の記述では、数値値は下付き添え字で種類が区別されます。添え字𝔽はNumber、添え字はBigIntを指します。添え字なしは数学値です。数値の表記はほとんど10進数ですが、0xに続く数字0-9やA-Fは16進数値として使われます。

一般に、本仕様が数値値(例えば「yの長さ」や「4桁の16進数が表す整数」など)に言及する場合、数値種類を明示しない限り数学値を指します。NumberやBigInt値に言及する場合は、明示的に注釈されます(例:「…のcode point数のNumber値」や「…のBigInt値」など)。

本仕様で整数という用語は、特に断りがない限り、整数集合に属する数学値を指します。整数値(Number)は、その数学値整数集合に属する有限のNumber値を指します。

数値演算子(+, ×, =, ≥など)は、オペランドの型に応じた演算を指します。数学値に適用すれば通常の数学演算、拡張数学値なら拡張実数上の演算(未定義形は定義しないので仕様に現れたら編集誤り)、NumberならIEEE 754-2019の演算、BigIntならBigIntの数学値への演算です。型の異なるオペランドへの数値演算子の適用(例: Numberと数学値)は未定義であり、仕様書に現れたら編集誤りです。

数学値とNumberやBigInt間の変換は常に明示的です。数学値または拡張数学値xからNumberへの変換は「xのNumber値」または𝔽(x)と記述され、6.1.6.1で定義されます。整数xからBigIntへの変換は「xBigInt値」またはℤ(x)と記述されます。NumberやBigInt_x_から数学値への変換は「x数学値」またはℝ(x)と記述されます。+0𝔽-0𝔽数学値数学値0です。非有限値の数学値は定義されません。拡張数学値有限値に対しては数学値+∞𝔽-∞𝔽に対してはそれぞれ+∞と-∞、NaNには定義されません。

数学関数abs(x)xの絶対値(x < 0なら- x、それ以外はx)を返します。

数学関数min(x1, x2, … , xN)x1からxNまでの最小値、max(x1, x2, ..., xN)は最大値を返します。これらの関数の定義域と値域は拡張数学値です。

記法「x modulo y」(y有限かつ非零)は、yと同じ符号(または0)で絶対値がy未満になる値kを計算し、abs(k) < abs(y) and x - k = q × yq整数)を満たします。

xlowerからupperの間でクランプする」という句(x拡張数学値lowerupperlowerupper数学値)は、x < lowerならlowerx > upperならupper、それ以外はxを返します。

数学関数floor(x)x以下で最大の整数(+∞に最も近いもの)を返します。

Note

floor(x) = x - (x modulo 1)です。

数学関数truncate(x)xの小数部をゼロ方向に切り捨て、x < 0なら-floor(-x)、それ以外はfloor(x)を返します。

数学関数min, max, abs, floor, truncateはNumberやBigIntには定義されません。非数学値引数でこれらの関数を使うのは仕様書の編集誤りです。

区間とは、下限aから上限bまでの同じ数値型の値(無限または空の場合もある)の集合です。各端点は包含か排他かどちらかのみ指定されます。区間には次の4種類があります:

  • a(包含)からb(包含)の区間: 包含区間とも呼ばれ、axbを満たす値xのみ含みます。
  • a(包含)からb(排他)の区間: ax < bを満たす値xのみ含みます。
  • a(排他)からb(包含)の区間: a < xbを満たす値xのみ含みます。
  • a(排他)からb(排他)の区間: a < x < bを満たす値xのみ含みます。

例えば、1(包含)から2(排他)の区間は1以上2未満の数学値全て(1は含み、2は含まない)です。区間定義の目的で、-0𝔽 < +0𝔽(比較対象が0の場合のエラー回避コメントあり)なので、例えば下端が+0𝔽包含区間+0𝔽のみ含み、-0𝔽は含みません。NaN区間に含まれません。

5.2.6 値の記法

本仕様書では、ECMAScript言語値太字で表示されます。例: null, true, "hello"など。これらは、Function.prototype.applylet n = 42;などのECMAScriptソーステキストとは区別されます。

5.2.7 同一性

本仕様書では、仕様値とECMAScript言語値の両方の等価性を比較します。等価性を比較する場合、値は2つのカテゴリのいずれかに属します。同一性のない値は、全ての本質的特徴が同じであれば他の同一性のない値と等価です(整数の大きさや配列の長さなど)。同一性のない値は、特徴を完全に記述することで事前参照なしに現すことができます。対照的に、同一性を持つ値は一意であり自分自身とだけ等価です。同一性を持つ値は、同一性のない値の特徴に加え、推測不可・不変・普遍的な同一性という特徴を持ちます。既存の同一性を持つ値への参照は、同一性自体が記述不可能なので記述によって現せず、明示的に他所から受け渡す必要があります。同一性を持つ値の一部は可変であり、特徴(同一性以外)はその場で変更可能で、値を保持する者全員が新しい特徴を観察することになります。同一性のない値は同一性を持つ値と等価になることはありません。

本仕様書の観点では、「is」は2つの値の等価性比較に使われます(例:「bool is trueなら…」)。「contains」はリスト内の値を等価性比較で探索する場合に使われます(例:「listRecord rr.[[Foo]] is true)を含むなら…」)。値の仕様同一性がこれらの比較結果を決定し、本仕様では公理的に扱います。

ECMAScript言語の観点では、言語値の等価性比較はSameValue抽象操作と、それが遡及的に呼び出す抽象操作で行われます。これらの比較抽象操作のアルゴリズムがECMAScript言語値言語同一性を定義します。

仕様値の例として、仕様同一性を持たない値には、数学値拡張数学値、ECMAScriptソーステキスト、サロゲートペア、Directive Prologue、UTF-16コード単位、Unicodeコードポイント、enum抽象操作構文指示操作ホストフック等)、順序対などが含まれます。仕様同一性を持つ値には、RecordProperty DescriptorPrivateElement等)、Parse Node、ListSetRelationAbstract ClosureData BlockPrivate Name、実行コンテキスト・スタック、agent signifierWaiterList Recordなどがあります。

仕様同一性は、Symbol.forで生成されたSymbol値を除き、全てのECMAScript言語値で言語同一性と一致します。仕様同一性も言語同一性も持たないECMAScript言語値は、undefinednullBooleanStringNumberBigIntです。仕様同一性も言語同一性も持つのはSymbolSymbol.for生成を除く)とObjectです。Symbol.forで生成されたSymbol値は仕様同一性のみ持ち、言語同一性は持ちません。

6 ECMAScriptデータ型と値

本仕様書のアルゴリズムは、それぞれ型が結び付けられた値を操作します。値の型の種類は本節で定義されるものだけです。型はさらにECMAScript言語型と仕様型に分類されます。

6.1 ECMAScript言語型

ECMAScript言語型は、ECMAScriptプログラマーがECMAScript言語で直接操作する値に対応します。ECMAScript言語型には、Undefined、Null、Boolean、String、Symbol、Number、BigInt、Objectがあります。ECMAScript言語値は、ECMAScript言語型によって特徴付けられる値です。

6.1.1 Undefined型

Undefined型は、undefinedという唯一の値だけを持ちます。値が代入されていない変数はundefined値を持ちます。

6.1.2 Null型

Null型は、nullという唯一の値だけを持ちます。

6.1.3 Boolean型

Boolean型は、truefalseという2つの値を持つ論理的な存在を表します。

6.1.4 String型

String型は、0個以上の16ビット符号なし整数値(「要素」)の順序付き列で、最大長は253 - 1個です。String型は、実行中のECMAScriptプログラムで主にテキストデータの表現に使われます。その場合、String内の各要素はUTF-16コード単位値として扱われます。各要素は列内の位置を持ち、その位置は非負整数でインデックスされます。最初の要素(存在する場合)はインデックス0、次はインデックス1、以降同様です。Stringの長さはその中の要素(16ビット値)の数です。空文字列は長さ0で要素を含みません。

String内容を解釈しないECMAScript操作は、追加の意味論を持ちません。String値を解釈する操作は、各要素を単一のUTF-16コード単位として扱います。ただし、ECMAScriptはこれらのコード単位の値や相互関係を制限しないため、String内容をUTF-16でエンコードされたUnicodeコードポイントの並びとしてさらに解釈する操作は、不正な部分列も考慮する必要があります。こうした操作では、数値が0xD800から0xDBFFまでの包含区間にあるコード単位(Unicode標準でリーディングサロゲート、または正式にはハイサロゲートコード単位)、および0xDC00から0xDFFFまでの包含区間にあるコード単位(トレーリングサロゲート、または正式にはローサロゲートコード単位)に対して以下の規則を適用します:

String.prototype.normalize関数(22.1.3.15参照)は、String値を明示的に正規化するために使えます。String.prototype.localeCompare22.1.3.12参照)は内部でString値を正規化しますが、他の操作は暗黙に正規化しません。操作結果は、特に記載がない限り言語・ロケールに依存しません。

Note

この設計の理由は、Stringの実装をできるだけ単純かつ高性能に保つことでした。ECMAScriptソーステキストがNormalized Form Cであれば、文字列リテラルもUnicodeエスケープシーケンスを含まない限り正規化が保証されます。

本仕様では、「AB...の文字列連結」(各引数がString値・コード単位・コード単位列)は、各引数(順番通り)のコード単位を連結した並びを持つString値を指します。

SinclusiveStartからexclusiveEndまでの部分文字列」(SはString値またはコード単位列、inclusiveStartexclusiveEnd整数)は、SinclusiveStartインデックスからexclusiveEndの直前までの連続コード単位からなるString値(inclusiveStart = exclusiveEndなら空文字列)を指します。「to」接尾語が省略された場合はexclusiveEndSの長さが使われます。

ASCIIワード文字」は、Unicode基本ラテンブロックの全ての英字・数字とU+005F(LOW LINE)のみからなる、次のString値を指します:
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"
歴史的事情により、様々なアルゴリズムで意味を持ちます。

6.1.4.1 StringIndexOf ( string, searchValue, fromIndex )

The abstract operation StringIndexOf takes arguments string (String), searchValue (String), and fromIndex (非負整数) and returns 非負整数またはnot-found. It performs the following steps when called:

  1. stringの長さをlenとする。
  2. searchValueが空文字列でかつfromIndexlenなら、fromIndexを返す。
  3. searchValueの長さをsearchLenとする。
  4. fromIndexilen - searchLenを満たす各整数iについて、昇順で:
    1. stringiからi + searchLenまでの部分文字列candidateとする。
    2. candidatesearchValueならiを返す。
  5. not-foundを返す。
Note 1

searchValueが空文字列でかつfromIndexstringの長さなら、このアルゴリズムはfromIndexを返します。空文字列は、文字列内のすべての位置(最後のコード単位の後も含む)で「見つかる」ものとみなされます。

Note 2

このアルゴリズムは、fromIndex + searchValueの長さがstringの長さを超える場合、必ずnot-foundを返します。

6.1.4.2 StringLastIndexOf ( string, searchValue, fromIndex )

The abstract operation StringLastIndexOf takes arguments string (String), searchValue (String), and fromIndex (非負整数) and returns 非負整数またはnot-found. It performs the following steps when called:

  1. stringの長さをlenとする。
  2. searchValueの長さをsearchLenとする。
  3. Assert: fromIndex + searchLenlen
  4. 0 ≤ ifromIndexを満たす各整数iについて、降順で:
    1. stringiからi + searchLenまでの部分文字列candidateとする。
    2. candidatesearchValueならiを返す。
  5. not-foundを返す。
Note

searchValueが空文字列の場合、このアルゴリズムはfromIndexを返します。空文字列は、文字列内のすべての位置(最後のコード単位の後も含む)で「見つかる」ものとみなされます。

6.1.5 Symbol型

Symbol型は、Objectプロパティのキーとして使える全ての非String値の集合です(6.1.7)。

各Symbolは一意で不変です。

各Symbolは、不変の[[Description]]内部スロットを持ち、その値はStringまたはundefinedです。

6.1.5.1 Well-known Symbol

Well-known Symbolは、本仕様のアルゴリズムから明示的に参照される組み込みのSymbol値です。これらは、値が仕様アルゴリズムの拡張ポイントとなるプロパティのキーとして使われることが一般的です。特に記載がない限り、Well-known Symbol値は全Realmで共有されます(9.3)。

本仕様では、Well-known Symbolは標準のintrinsic記法で参照されます。intrinsicはTable 1で挙げられた値のいずれかです。

Note
以前の版では@@name形式の記法が使われていましたが、現行版では%Symbol.name%形式を使います。具体的には、@@asyncIterator、@@hasInstance、@@isConcatSpreadable、@@iterator、@@match、@@matchAll、@@replace、@@search、@@species、@@split、@@toPrimitive、@@toStringTag、@@unscopablesなどの名称が使われていました。
Table 1: Well-known Symbol
仕様名 [[Description]] 値/目的
%Symbol.asyncIterator% "Symbol.asyncIterator" オブジェクトのデフォルト非同期イテレータを返すメソッド。for-await-of文の意味論から呼び出されます。
%Symbol.hasInstance% "Symbol.hasInstance" コンストラクターオブジェクトがあるオブジェクトを自分のインスタンスとして認識するかどうかを判定するメソッド。instanceof演算子の意味論から呼び出されます。
%Symbol.isConcatSpreadable% "Symbol.isConcatSpreadable" 真の場合、そのオブジェクトがArray.prototype.concatで配列要素として平坦化されるべきことを示すBoolean値のプロパティ。
%Symbol.iterator% "Symbol.iterator" オブジェクトのデフォルトイテレータを返すメソッド。for-of文の意味論から呼び出されます。
%Symbol.match% "Symbol.match" 正規表現で文字列とマッチさせるメソッド。String.prototype.matchメソッドから呼び出されます。
%Symbol.matchAll% "Symbol.matchAll" 正規表現に一致するすべてのマッチをイテレータで返すメソッド。String.prototype.matchAllメソッドから呼び出されます。
%Symbol.replace% "Symbol.replace" 文字列の一致部分を置換する正規表現メソッド。String.prototype.replaceメソッドから呼び出されます。
%Symbol.search% "Symbol.search" 正規表現と一致する文字列内のインデックスを返すメソッド。String.prototype.searchメソッドから呼び出されます。
%Symbol.species% "Symbol.species" 派生オブジェクトの作成に使われるコンストラクター関数の値を持つプロパティ。
%Symbol.split% "Symbol.split" 正規表現で一致するインデックスで文字列を分割するメソッド。String.prototype.splitメソッドから呼び出されます。
%Symbol.toPrimitive% "Symbol.toPrimitive" オブジェクトを対応するプリミティブ値に変換するメソッド。ToPrimitive抽象操作から呼び出されます。
%Symbol.toStringTag% "Symbol.toStringTag" オブジェクトのデフォルト文字列表現の生成に使われるString値のプロパティ。組み込みメソッドObject.prototype.toStringでアクセスされます。
%Symbol.unscopables% "Symbol.unscopables" 自身および継承したプロパティ名が、関連オブジェクトのwith環境バインディングから除外されるプロパティ名となるオブジェクト値のプロパティ。

6.1.6 数値型

ECMAScriptには組み込み数値型が2つあります:Number型BigInt型です。以下の抽象操作はこれらの数値型に対して定義されています。「結果」列には返却型、そしてある操作の一部の呼び出しがabrupt completion(例外的完了)を返す可能性がある場合はその旨も示されます。

Table 2: 数値型の操作
操作 ソース例 評価意味論で呼び出される箇所 結果
Number::unaryMinus -x 単項 - 演算子 (Unary - Operator) Number
BigInt::unaryMinus BigInt
Number::bitwiseNOT ~x ビット単位 NOT 演算子 ( ~ ) (Bitwise NOT Operator) Number
BigInt::bitwiseNOT BigInt
Number::exponentiate x ** y 累乗演算子 (Exponentiation Operator) および Math.pow ( base, exponent ) Number
BigInt::exponentiate 正常完了でBigIntを含む、またはthrow completion
Number::multiply x * y 乗算系演算子 (Multiplicative Operators) Number
BigInt::multiply BigInt
Number::divide x / y 乗算系演算子 (Multiplicative Operators) Number
BigInt::divide 正常完了でBigIntを含む、またはthrow completion
Number::remainder x % y 乗算系演算子 (Multiplicative Operators) Number
BigInt::remainder 正常完了でBigIntを含む、またはthrow completion
Number::add x ++
++ x
x + y
後置インクリメント演算子 (Postfix Increment Operator), 前置インクリメント演算子 (Prefix Increment Operator), および 加算演算子 ( + ) (The Addition Operator) Number
BigInt::add BigInt
Number::subtract x --
-- x
x - y
後置デクリメント演算子 (Postfix Decrement Operator), 前置デクリメント演算子 (Prefix Decrement Operator), および 減算演算子 ( - ) (The Subtraction Operator) Number
BigInt::subtract BigInt
Number::leftShift x << y 左シフト演算子 ( << ) (The Left Shift Operator) Number
BigInt::leftShift BigInt
Number::signedRightShift x >> y 算術(符号付き)右シフト演算子 ( >> ) (The Signed Right Shift Operator) Number
BigInt::signedRightShift BigInt
Number::unsignedRightShift x >>> y 論理(ゼロ埋め)右シフト演算子 ( >>> ) (The Unsigned Right Shift Operator) Number
BigInt::unsignedRightShift throw completion
Number::lessThan x < y
x > y
x <= y
x >= y
関係演算子 (Relational Operators), IsLessThan ( x, y, LeftFirst )経由 Boolean または undefined(順序付けできない入力の場合)
BigInt::lessThan Boolean
Number::equal x == y
x != y
x === y
x !== y
等価演算子 (Equality Operators), IsStrictlyEqual ( x, y )経由 Boolean
BigInt::equal
Number::sameValue Object.is(x, y) Object内部メソッド、 SameValue ( x, y )経由、 厳密な値の等価性検証 Boolean
Number::sameValueZero [x].includes(y) SameValueZero ( x, y )経由、 ArrayやMap、Setのメソッドなどで+0𝔽-0𝔽の違いを無視して値の等価性を検証 Boolean
Number::bitwiseAND x & y ビット単位二項演算子 (Binary Bitwise Operators) Number
BigInt::bitwiseAND BigInt
Number::bitwiseXOR x ^ y Number
BigInt::bitwiseXOR BigInt
Number::bitwiseOR x | y Number
BigInt::bitwiseOR BigInt
Number::toString String(x) 多くの式や組み込み関数、ToString ( argument )経由 String
BigInt::toString

数値型は一般的に精度の損失や切り捨てなしに変換できないため、ECMAScript言語ではこれらの型間の暗黙的な変換は提供されません。プログラマーは、別の型を必要とする関数を呼び出す際に、型間の変換を明示的にNumberBigInt関数で行う必要があります。

Note

ECMAScriptの第1版以降、特定の演算子では精度が失われたり切り捨てられる暗黙の数値変換が提供されてきました。これらの従来の暗黙変換は後方互換性のために維持されていますが、BigIntには提供されていません。これはプログラマーのミスの機会を最小限に抑えるためであり、将来版での一般化された値型の選択肢を残すためです。

6.1.6.1 Number型

Number型は18,437,736,874,454,810,627個(すなわち264 - 253 + 3)の値を持ち、IEEE 754-2019の倍精度浮動小数点binary64値を表します。ただし、IEEE標準の9,007,199,254,740,990個(すなわち253 - 2)の異なるNaN値は、ECMAScriptでは単一の特別なNaN値として表現されます。(NaN値はプログラム式NaNによって生成されます。)実装によっては外部コードが異なるNaN値を検出できる場合がありますが、その挙動は実装依存です。ECMAScriptコードからはすべてのNaN値は相互に区別できません。

Note

Number値をArrayBuffer(25.1)やSharedArrayBuffer(25.2)に格納した後に観察されるビットパターンは、ECMAScript実装が内部で使用するNumber値の表現と必ずしも同じではありません。

他に2つの特別な値があり、正の無限大負の無限大と呼ばれます。説明の簡略化のため、これらの値は記述上+∞𝔽-∞𝔽という記号で呼ばれることもあります。(これら2つの無限大Number値は、プログラム式+Infinity(または単にInfinity)と-Infinityで生成されます。)

残りの18,437,736,874,454,810,624個(すなわち264 - 253)の値は有限数と呼ばれます。これらの半分は正の数、半分は負の数です。すべての有限な正のNumber値には、同じ大きさの負の値が対応しています。

正のゼロ負のゼロが存在することに注意してください。説明の簡略化のため、これらの値は記述上+0𝔽-0𝔽という記号で呼ばれることもあります。(これら2つのゼロNumber値は、プログラム式+0(または単に0)と-0で生成されます。)

18,437,736,874,454,810,622個(すなわち264 - 253 - 2)の有限非ゼロ値は2種類あります:

18,428,729,675,200,069,632個(すなわち264 - 254)は正規化されており、次の形を持ちます:

s × m × 2e

ここで、sは1または-1、mは252(含む)から253(含まない)までの整数eは-1074から971までの整数(両端含む)です。

残りの9,007,199,254,740,990個(すなわち253 - 2)は非正規化値であり、次の形を持ちます:

s × m × 2e

ここで、sは1または-1、mは0(含まない)から252(含まない)までの整数eは-1074です。

絶対値が253以下のすべての正負の整数はNumber型で表現可能です。整数0はNumber型で+0𝔽-0𝔽の2つの表現を持ちます。

有限な数値は、それが非ゼロで上記いずれかの形で表される整数mが奇数である場合、奇数の仮数を持ちます。そうでなければ偶数の仮数となります。

この仕様では、「xのNumber値」という表現は、xが実数(πのような無理数も含む)であるとき、次の方法で選ばれたNumber値を意味します。Number型の有限値の集合から-0𝔽を除き、さらにNumber型で表現できない値21024+1 × 253 × 2971)と-21024-1 × 253 × 2971)を加えます。この集合のうちxに最も近い値を選びます。2つの値が同じだけ近い場合は偶数の仮数を持つ方を選びます(この場合、追加された2つの値も偶数の仮数とみなします)。最後に、21024が選ばれた場合は+∞𝔽に、-21024が選ばれた場合は-∞𝔽に、+0𝔽が選ばれた場合x < 0のときのみ-0𝔽に置き換え、その他はそのまま使います。結果がxのNumber値です。(この手順はIEEE 754-2019のroundTiesToEvenモードの挙動と一致します。)

+∞のNumber値は+∞𝔽、-∞のNumber値は-∞𝔽です。

一部のECMAScript演算子は、-231から231 - 1まで、または0から216 - 1までなど、特定の範囲の整数のみを扱います。これらの演算子はNumber型の任意の値を受け入れますが、まずその値を期待される範囲の整数値に変換します。数値変換操作の説明は7.1を参照してください。

6.1.6.1.1 Number::unaryMinus ( x )

The abstract operation Number::unaryMinus takes argument x (a Number) and returns a Number. It performs the following steps when called:

  1. xNaNであれば、NaNを返す。
  2. xの符号を反転した値(絶対値は同じで符号が逆のNumber)を返す。

6.1.6.1.2 Number::bitwiseNOT ( x )

The abstract operation Number::bitwiseNOT takes argument x (a Number) and returns an integral Number. It performs the following steps when called:

  1. oldValueを! ToInt32(x)とする。
  2. oldValueのビットごとの補数を返す。結果の数学的な値は32ビット2の補数ビット列として正確に表現可能である。

6.1.6.1.3 Number::exponentiate ( base, exponent )

The abstract operation Number::exponentiate takes arguments base (a Number) and exponent (a Number) and returns a Number. baseexponent乗した結果を表す実装依存の近似値を返す。 It performs the following steps when called:

  1. exponentNaNならNaNを返す。
  2. exponent+0𝔽または-0𝔽なら1𝔽を返す。
  3. baseNaNならNaNを返す。
  4. base+∞𝔽なら
    1. exponent > +0𝔽なら+∞𝔽、それ以外は+0𝔽を返す。
  5. base-∞𝔽なら
    1. exponent > +0𝔽なら
      1. exponentが奇数の整数Numberなら-∞𝔽、それ以外は+∞𝔽を返す。
    2. それ以外なら
      1. exponentが奇数の整数Numberなら-0𝔽、それ以外は+0𝔽を返す。
  6. base+0𝔽なら
    1. exponent > +0𝔽なら+0𝔽、それ以外は+∞𝔽を返す。
  7. base-0𝔽なら
    1. exponent > +0𝔽なら
      1. exponentが奇数の整数Numberなら-0𝔽、それ以外は+0𝔽を返す。
    2. それ以外なら
      1. exponentが奇数の整数Numberなら-∞𝔽、それ以外は+∞𝔽を返す。
  8. (アサート)base有限であり+0𝔽でも-0𝔽でもない。
  9. exponent+∞𝔽なら
    1. abs((base)) > 1なら+∞𝔽を返す。
    2. abs((base)) = 1ならNaNを返す。
    3. abs((base)) < 1なら+0𝔽を返す。
  10. exponent-∞𝔽なら
    1. abs((base)) > 1なら+0𝔽を返す。
    2. abs((base)) = 1ならNaNを返す。
    3. abs((base)) < 1なら+∞𝔽を返す。
  11. (アサート)exponent有限であり+0𝔽でも-0𝔽でもない。
  12. base < -0𝔽かつexponent整数Numberでない場合、NaNを返す。
  13. (base)の(exponent)乗の結果を表す実装依存の近似Number値を返す。
Note

base1𝔽-1𝔽exponent+∞𝔽または-∞𝔽の場合、またはbase1𝔽exponentNaNの場合の**演算の結果は、IEEE 754-2019とは異なります。ECMAScript第1版ではこの操作の結果をNaNと規定していましたが、後のIEEE 754改訂では1𝔽とされています。互換性のため、従来のECMAScriptの挙動を維持しています。

6.1.6.1.4 Number::multiply ( x, y )

The abstract operation Number::multiply takes arguments x (a Number) and y (a Number) and returns a Number. xyの積をIEEE 754-2019バイナリ倍精度演算規則に従って計算します。 It performs the following steps when called:

  1. xNaNまたはyNaNならNaNを返す。
  2. x+∞𝔽または-∞𝔽なら
    1. y+0𝔽または-0𝔽ならNaNを返す。
    2. y > +0𝔽ならxを返す。
    3. それ以外は-xを返す。
  3. y+∞𝔽または-∞𝔽なら
    1. x+0𝔽または-0𝔽ならNaNを返す。
    2. x > +0𝔽ならyを返す。
    3. それ以外は-yを返す。
  4. x-0𝔽なら
    1. y-0𝔽またはy < -0𝔽なら+0𝔽を返す。
    2. それ以外は-0𝔽を返す。
  5. y-0𝔽なら
    1. x < -0𝔽なら+0𝔽を返す。
    2. それ以外は-0𝔽を返す。
  6. 𝔽((x) × (y))を返す。
Note

有限精度の乗算は可換ですが、常に結合法則が成り立つわけではありません。

6.1.6.1.5 Number::divide ( x, y )

The abstract operation Number::divide takes arguments x (a Number) and y (a Number) and returns a Number. x(被除数)とy(除数)の商をIEEE 754-2019バイナリ倍精度演算規則に従って計算します。 It performs the following steps when called:

  1. xNaNまたはyNaNならNaNを返す。
  2. x+∞𝔽または-∞𝔽なら
    1. y+∞𝔽または-∞𝔽ならNaNを返す。
    2. y+0𝔽またはy > +0𝔽ならxを返す。
    3. それ以外は-xを返す。
  3. y+∞𝔽なら
    1. x+0𝔽またはx > +0𝔽なら+0𝔽、それ以外は-0𝔽を返す。
  4. y-∞𝔽なら
    1. x+0𝔽またはx > +0𝔽なら-0𝔽、それ以外は+0𝔽を返す。
  5. x+0𝔽または-0𝔽なら
    1. y+0𝔽または-0𝔽ならNaNを返す。
    2. y > +0𝔽ならxを返す。
    3. それ以外は-xを返す。
  6. y+0𝔽なら
    1. x > +0𝔽なら+∞𝔽、それ以外は-∞𝔽を返す。
  7. y-0𝔽なら
    1. x > +0𝔽なら-∞𝔽、それ以外は+∞𝔽を返す。
  8. 𝔽((x) / (y))を返す。

6.1.6.1.6 Number::remainder ( n, d )

The abstract operation Number::remainder takes arguments n (a Number) and d (a Number) and returns a Number. n(被除数)とd(除数)の暗黙的な割り算から余りを返します。 It performs the following steps when called:

  1. nNaNまたはdNaNならNaNを返す。
  2. n+∞𝔽または-∞𝔽ならNaNを返す。
  3. d+∞𝔽または-∞𝔽ならnを返す。
  4. d+0𝔽または-0𝔽ならNaNを返す。
  5. n+0𝔽または-0𝔽ならnを返す。
  6. (アサート)nd有限かつ非ゼロ。
  7. quotient(n) / (d)とする。
  8. qtruncate(quotient)とする。
  9. r(n) - ((d) × q)とする。
  10. r = 0かつn < -0𝔽なら-0𝔽を返す。
  11. 𝔽(r)を返す。
Note 1

CやC++の剰余演算子は整数のみを受け付けますが、ECMAScriptでは浮動小数点も受け付けます。

Note 2
浮動小数点の剰余演算(%演算子)はIEEE 754-2019で定義される「remainder」演算と同じではありません。IEEE 754-2019の「remainder」演算は丸め割り算に基づく余りを計算しますが、ECMAScript言語では浮動小数点演算の%はJavaの整数剰余演算に類似した切り捨て割り算の余りとなります。これはCライブラリのfmod関数と比較できます。

6.1.6.1.7 Number::add ( x, y )

The abstract operation Number::add takes arguments x (a Number) and y (a Number) and returns a Number. xyの和をIEEE 754-2019バイナリ倍精度演算規則に従って計算します。 It performs the following steps when called:

  1. xNaNまたはyNaNならNaNを返す。
  2. x+∞𝔽かつy-∞𝔽ならNaNを返す。
  3. x-∞𝔽かつy+∞𝔽ならNaNを返す。
  4. x+∞𝔽または-∞𝔽ならxを返す。
  5. y+∞𝔽または-∞𝔽ならyを返す。
  6. (アサート)xyはともに有限
  7. x-0𝔽かつy-0𝔽なら-0𝔽を返す。
  8. 𝔽((x) + (y))を返す。
Note

有限精度の加算は可換ですが、常に結合法則が成り立つわけではありません。

6.1.6.1.8 Number::subtract ( x, y )

The abstract operation Number::subtract takes arguments x (a Number) and y (a Number) and returns a Number. 減算を行い、x(被減数)とy(減数)の差を返します。 It performs the following steps when called:

  1. Number::add(x, Number::unaryMinus(y))を返す。
Note

x - yの結果は常にx + (-y)の結果と同じになります。

6.1.6.1.9 Number::leftShift ( x, y )

The abstract operation Number::leftShift takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. lNumを! ToInt32(x)とする。
  2. rNumを! ToUint32(y)とする。
  3. shiftCount(rNum) modulo 32とする。
  4. lNumshiftCountビット左シフトした結果を返す。結果の数学的な値は32ビット2の補数ビット列として正確に表現可能である。

6.1.6.1.10 Number::signedRightShift ( x, y )

The abstract operation Number::signedRightShift takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. lNumを! ToInt32(x)とする。
  2. rNumを! ToUint32(y)とする。
  3. shiftCount(rNum) modulo 32とする。
  4. lNumshiftCountビット符号拡張付き右シフトした結果を返す。最上位ビットは伝播されます。結果の数学的な値は32ビット2の補数ビット列として正確に表現可能である。

6.1.6.1.11 Number::unsignedRightShift ( x, y )

The abstract operation Number::unsignedRightShift takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. lNumを! ToUint32(x)とする。
  2. rNumを! ToUint32(y)とする。
  3. shiftCount(rNum) modulo 32とする。
  4. lNumshiftCountビットゼロ埋め右シフトした結果を返す。空いたビットはゼロで埋めます。結果の数学的な値は32ビット符号なしビット列として正確に表現可能である。

6.1.6.1.12 Number::lessThan ( x, y )

The abstract operation Number::lessThan takes arguments x (a Number) and y (a Number) and returns a Boolean or undefined. It performs the following steps when called:

  1. xNaNならundefinedを返す。
  2. yNaNならundefinedを返す。
  3. xyと等しいならfalseを返す。
  4. x+0𝔽かつy-0𝔽ならfalseを返す。
  5. x-0𝔽かつy+0𝔽ならfalseを返す。
  6. x+∞𝔽ならfalseを返す。
  7. y+∞𝔽ならtrueを返す。
  8. y-∞𝔽ならfalseを返す。
  9. x-∞𝔽ならtrueを返す。
  10. (アサート)xy有限
  11. (x) < (y)ならtrue、それ以外はfalseを返す。

6.1.6.1.13 Number::equal ( x, y )

The abstract operation Number::equal takes arguments x (a Number) and y (a Number) and returns a Boolean. It performs the following steps when called:

  1. xNaNならfalseを返す。
  2. yNaNならfalseを返す。
  3. xyと等しいならtrueを返す。
  4. x+0𝔽かつy-0𝔽ならtrueを返す。
  5. x-0𝔽かつy+0𝔽ならtrueを返す。
  6. falseを返す。

6.1.6.1.14 Number::sameValue ( x, y )

The abstract operation Number::sameValue takes arguments x (a Number) and y (a Number) and returns a Boolean. It performs the following steps when called:

  1. xyがともにNaNならtrueを返す。
  2. x+0𝔽かつy-0𝔽ならfalseを返す。
  3. x-0𝔽かつy+0𝔽ならfalseを返す。
  4. xyと等しいならtrueを返す。
  5. falseを返す。

6.1.6.1.15 Number::sameValueZero ( x, y )

The abstract operation Number::sameValueZero takes arguments x (a Number) and y (a Number) and returns a Boolean. It performs the following steps when called:

  1. xyがともにNaNならtrueを返す。
  2. x+0𝔽かつy-0𝔽ならtrueを返す。
  3. x-0𝔽かつy+0𝔽ならtrueを返す。
  4. xyと等しいならtrueを返す。
  5. falseを返す。

6.1.6.1.16 NumberBitwiseOp ( op, x, y )

The abstract operation NumberBitwiseOp takes arguments op (&, ^, or |), x (a Number), and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. lNumを! ToInt32(x)とする。
  2. rNumを! ToInt32(y)とする。
  3. lBits(lNum)の32ビット2の補数ビット列とする。
  4. rBits(rNum)の32ビット2の補数ビット列とする。
  5. op&なら
    1. resultlBitsrBitsのビットごとのAND演算結果とする。
  6. そうでなくop^なら
    1. resultlBitsrBitsのビットごとの排他的論理和(XOR)演算結果とする。
  7. それ以外(アサート:op|
    1. resultlBitsrBitsのビットごとの論理和(OR)演算結果とする。
  8. resultの32ビット2の補数ビット列が表す整数のNumber値を返す。

6.1.6.1.17 Number::bitwiseAND ( x, y )

The abstract operation Number::bitwiseAND takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. NumberBitwiseOp(&, x, y)を返す。

6.1.6.1.18 Number::bitwiseXOR ( x, y )

The abstract operation Number::bitwiseXOR takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. NumberBitwiseOp(^, x, y)を返す。

6.1.6.1.19 Number::bitwiseOR ( x, y )

The abstract operation Number::bitwiseOR takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:

  1. NumberBitwiseOp(|, x, y)を返す。

6.1.6.1.20 Number::toString ( x, radix )

The abstract operation Number::toString takes arguments x (a Number) and radix (an integer in the inclusive interval from 2 to 36) and returns a String. xradix進法の位置記数法でStringとして表現します。r進法での数字は"0123456789abcdefghijklmnopqrstuvwxyz"の最初のr個のコードユニットが順に用いられます。絶対値が1𝔽以上の数値の表現は先頭ゼロを含みません。 It performs the following steps when called:

  1. xNaNなら"NaN"を返す。
  2. x+0𝔽または-0𝔽なら"0"を返す。
  3. x < -0𝔽なら、文字列連結"-"Number::toString(-x, radix)を返す。
  4. x+∞𝔽なら"Infinity"を返す。
  5. nks整数として、k ≥ 1、radixk - 1s < radixk𝔽(s × radixn - k)がx、かつkが可能な限り最小となるようにする。kradix進法でのsの桁数で、sradixで割り切れない。最下位桁が一意に決まるとは限らない。
  6. radix ≠ 10またはnが-5から21の範囲なら
    1. nkなら
      1. 次の文字列連結で返す:
        • sradix進法表現のk
        • 0x0030(数字ゼロ)のコードユニットをn - k
    2. それ以外でn > 0なら
      1. 次の文字列連結で返す:
        • sradix進法表現の最上位n
        • 0x002E(ピリオド)
        • 残りk - n
    3. それ以外(n ≤ 0をアサート)
      1. 次の文字列連結で返す:
        • 0x0030(数字ゼロ)
        • 0x002E(ピリオド)
        • 0x0030(数字ゼロ)を-n
        • sradix進法表現のk
  7. 注:この場合、入力は科学的E表記(例:1.2e+3)で表現される。
  8. (アサート)radixは10。
  9. n < 0なら
    1. exponentSignを0x002D(ハイフンマイナス)とする。
  10. それ以外
    1. exponentSignを0x002B(プラス記号)とする。
  11. k = 1なら
    1. 次の文字列連結で返す:
      • sの1桁目
      • 0x0065(小文字e)
      • exponentSign
      • abs(n - 1)の10進表現
  12. 次の文字列連結で返す:
    • sの最上位桁(10進表現)
    • 0x002E(ピリオド)
    • 残りk - 1桁(10進表現)
    • 0x0065(小文字e)
    • exponentSign
    • abs(n - 1)の10進表現
Note 1

次の点は実装の指針となり得ますが、この規格の規範的要件の一部ではありません:

  • xが-0𝔽以外の任意のNumber値の場合、ToNumber(ToString(x))はxとなる。
  • sの最下位桁はstep 5の要件では一意に決まるとは限らない。
Note 2

規定よりも高精度の変換が可能な実装には、step 5の次の代替手順が指針となります:

  1. nks整数として、k ≥ 1、radixk - 1s < radixk𝔽(s × radixn - k)がxkが最小となるようにする。sの値が複数ある場合、s × radixn - k(x)に最も近いものを選ぶ。2つの可能な値がある場合は偶数の方を選ぶ。kradix進法でのsの桁数であり、sradixで割り切れない。
Note 3

ECMAScript実装者は、David M. Gayによる浮動小数点数の2進-10進変換に関する論文およびコードが参考になるかもしれません:

Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary Conversions. Numerical Analysis, Manuscript 90-10. AT&T Bell Laboratories (Murray Hill, New Jersey). 1990年11月30日。
https://ampl.com/_archive/first-website/REFS/rounding.pdf。関連コード:
http://netlib.sandia.gov/fp/dtoa.c および
http://netlib.sandia.gov/fp/g_fmt.c。また各netlibミラーサイトにもあります。

6.1.6.2 BigInt型

BigInt型整数値を表します。値のサイズは任意であり、特定のビット幅に制限されません。特に記載がない限り、演算は正確な数学的結果を返すよう設計されています。2項演算の場合、BigIntは2の補数のバイナリ文字列として扱われ、負の数は左側に無限にビットが立っているものとして扱われます。

6.1.6.2.1 BigInt::unaryMinus ( x )

The abstract operation BigInt::unaryMinus takes argument x (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. x = 0なら、0を返す。
  2. -xを返す。

6.1.6.2.2 BigInt::bitwiseNOT ( x )

The abstract operation BigInt::bitwiseNOT takes argument x (a BigInt) and returns a BigInt. xの1の補数を返します。 It performs the following steps when called:

  1. -x - 1を返す。

6.1.6.2.3 BigInt::exponentiate ( base, exponent )

The abstract operation BigInt::exponentiate takes arguments base (a BigInt) and exponent (a BigInt) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:

  1. exponent < 0なら、RangeError例外を投げる。
  2. base = 0かつexponent = 0なら、1を返す。
  3. baseexponent乗した値を返す。

6.1.6.2.4 BigInt::multiply ( x, y )

The abstract operation BigInt::multiply takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. x × yを返す。
Note
結果が入力よりもはるかに大きなビット幅となっても、正確な数学的答えが返されます。

6.1.6.2.5 BigInt::divide ( x, y )

The abstract operation BigInt::divide takes arguments x (a BigInt) and y (a BigInt) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:

  1. y = 0なら、RangeError例外を投げる。
  2. quotient(x) / (y)とする。
  3. (truncate(quotient))を返す。

6.1.6.2.6 BigInt::remainder ( n, d )

The abstract operation BigInt::remainder takes arguments n (a BigInt) and d (a BigInt) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:

  1. d = 0なら、RangeError例外を投げる。
  2. n = 0なら、0を返す。
  3. quotient(n) / (d)とする。
  4. q(truncate(quotient))とする。
  5. n - (d × q)を返す。
Note
結果の符号は被除数と同じです。

6.1.6.2.7 BigInt::add ( x, y )

The abstract operation BigInt::add takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. x + yを返す。

6.1.6.2.8 BigInt::subtract ( x, y )

The abstract operation BigInt::subtract takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. x - yを返す。

6.1.6.2.9 BigInt::leftShift ( x, y )

The abstract operation BigInt::leftShift takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. y < 0なら
    1. (floor((x) / 2-(y)))を返す。
  2. x × 2yを返す。
Note
ここでの意味論は、BigIntを無限長の2の補数バイナリ文字列として扱うビットシフトと同等です。

6.1.6.2.10 BigInt::signedRightShift ( x, y )

The abstract operation BigInt::signedRightShift takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. BigInt::leftShift(x, -y)を返す。

6.1.6.2.11 BigInt::unsignedRightShift ( x, y )

The abstract operation BigInt::unsignedRightShift takes arguments x (a BigInt) and y (a BigInt) and returns a throw completion. It performs the following steps when called:

  1. TypeError例外を投げる。

6.1.6.2.12 BigInt::lessThan ( x, y )

The abstract operation BigInt::lessThan takes arguments x (a BigInt) and y (a BigInt) and returns a Boolean. It performs the following steps when called:

  1. (x) < (y)ならtrue、それ以外はfalseを返す。

6.1.6.2.13 BigInt::equal ( x, y )

The abstract operation BigInt::equal takes arguments x (a BigInt) and y (a BigInt) and returns a Boolean. It performs the following steps when called:

  1. (x) = (y)ならtrue、それ以外はfalseを返す。

6.1.6.2.14 BinaryAnd ( x, y )

The abstract operation BinaryAnd takes arguments x (0 or 1) and y (0 or 1) and returns 0 or 1. It performs the following steps when called:

  1. x = 1かつy = 1なら1を返す。
  2. それ以外は0を返す。

6.1.6.2.15 BinaryOr ( x, y )

The abstract operation BinaryOr takes arguments x (0 or 1) and y (0 or 1) and returns 0 or 1. It performs the following steps when called:

  1. x = 1またはy = 1なら1を返す。
  2. それ以外は0を返す。

6.1.6.2.16 BinaryXor ( x, y )

The abstract operation BinaryXor takes arguments x (0 or 1) and y (0 or 1) and returns 0 or 1. It performs the following steps when called:

  1. x = 1かつy = 0なら1を返す。
  2. それ以外でx = 0かつy = 1なら1を返す。
  3. それ以外は0を返す。

6.1.6.2.17 BigIntBitwiseOp ( op, x, y )

The abstract operation BigIntBitwiseOp takes arguments op (&, ^, or |), x (a BigInt), and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. x(x)に設定する。
  2. y(y)に設定する。
  3. resultを0とする。
  4. shiftを0とする。
  5. (x = 0またはx = -1)かつ(y = 0またはy = -1)になるまで繰り返す:
    1. xDigitx modulo 2とする。
    2. yDigity modulo 2とする。
    3. op&なら
      1. resultresult + 2shift × BinaryAnd(xDigit, yDigit)に設定する。
    4. それ以外でop|なら
      1. resultresult + 2shift × BinaryOr(xDigit, yDigit)に設定する。
    5. それ以外
      1. アサート:op^である。
      2. resultresult + 2shift × BinaryXor(xDigit, yDigit)に設定する。
    6. shiftshift + 1に設定する。
    7. xを(x - xDigit) / 2に設定する。
    8. yを(y - yDigit) / 2に設定する。
  6. op&なら
    1. tmpBinaryAnd(x modulo 2, y modulo 2)とする。
  7. それ以外でop|なら
    1. tmpBinaryOr(x modulo 2, y modulo 2)とする。
  8. それ以外
    1. アサート:op^である。
    2. tmpBinaryXor(x modulo 2, y modulo 2)とする。
  9. tmp ≠ 0なら
    1. resultresult - 2shiftに設定する。
    2. 注:これは符号拡張となる。
  10. resultBigInt値を返す。

6.1.6.2.18 BigInt::bitwiseAND ( x, y )

The abstract operation BigInt::bitwiseAND takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. BigIntBitwiseOp(&, x, y)を返す。

6.1.6.2.19 BigInt::bitwiseXOR ( x, y )

The abstract operation BigInt::bitwiseXOR takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. BigIntBitwiseOp(^, x, y)を返す。

6.1.6.2.20 BigInt::bitwiseOR ( x, y )

The abstract operation BigInt::bitwiseOR takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:

  1. BigIntBitwiseOp(|, x, y)を返す。

6.1.6.2.21 BigInt::toString ( x, radix )

The abstract operation BigInt::toString takes arguments x (a BigInt) and radix (an integer in the inclusive interval from 2 to 36) and returns a String. xradix進法の位置記数法でStringとして表現します。r進法でのBigIntの表現に使われる数字は"0123456789abcdefghijklmnopqrstuvwxyz"の最初のr個のコードユニットが順番に使われます。0以外のBigIntの表現には先頭ゼロは含まれません。 It performs the following steps when called:

  1. x < 0なら、文字列連結"-"BigInt::toString(-x, radix)を返す。
  2. xradixで表現したString値を返す。

6.1.7 オブジェクト型

Object型(単に「オブジェクト」とも呼ばれる)の各インスタンスは、プロパティの集合を表します。各プロパティはデータプロパティまたはアクセサプロパティのいずれかです:

  • データプロパティは、キー値をECMAScript言語値と一連の真偽値属性に関連付けます。
  • アクセサプロパティは、キー値を1つまたは2つのアクセサ関数と一連の真偽値属性に関連付けます。アクセサ関数はそのプロパティに関連付けられたECMAScript言語値の保存または取得に使用されます。

オブジェクトのプロパティはプロパティキーによって一意に識別されます。プロパティキーはStringまたはSymbolです。空文字列を含むすべてのStringとSymbolはプロパティキーとして有効です。プロパティ名は、プロパティキーのうちStringであるものです。

整数インデックスは、CanonicalNumericIndexString(n)が+0𝔽から𝔽(253 - 1)までの範囲の整数Numberを返すプロパティ名nです。配列インデックスは、CanonicalNumericIndexString(n)が+0𝔽から𝔽(232 - 2)までの範囲の整数Numberを返す整数インデックスnです。

Note

全ての非負の安全な整数には対応する整数インデックスがあります。232 - 1を除く全ての32ビット符号なし整数には対応する配列インデックスがあります。"-0"整数インデックスでも配列インデックスでもありません。

プロパティキーはプロパティおよびその値へのアクセスに用いられます。プロパティへのアクセスには、値の取得(get)と値の代入(set)の2種類があります。get/setアクセスで利用できるプロパティには、オブジェクト自身が直接持つ自身のプロパティと、プロパティ継承関係によって関連する他のオブジェクトから提供される継承プロパティの両方が含まれます。継承プロパティも、その関連オブジェクトの自身プロパティまたは継承プロパティのいずれかである場合があります。オブジェクトの自身プロパティは、それぞれ他の自身プロパティとは異なるキー値を持たねばなりません。

全てのオブジェクトは論理的にはプロパティの集合ですが、プロパティへのアクセスや操作の意味論が異なる複数の形式のオブジェクトがあります。複数のオブジェクト形式の定義については6.1.7.2を参照してください。

さらに、一部のオブジェクトは呼び出し可能(callable)であり、これらは関数または関数オブジェクトと呼ばれ、後述します。ECMAScriptの全ての関数はObject型のメンバーです。

6.1.7.1 プロパティ属性

属性は、この仕様においてTable 3で説明されるオブジェクトプロパティの状態を定義・説明するために使用されます。明示的に指定されていない限り、各属性の初期値はそのデフォルト値です。

Table 3: オブジェクトプロパティの属性
属性名 存在するプロパティの種類 値のドメイン デフォルト値 説明
[[Value]] データプロパティ ECMAScript言語値 undefined プロパティへのgetアクセス時に取得される値。
[[Writable]] データプロパティ 真偽値 false falseの場合、ECMAScriptコードによる[[Set]]でプロパティの[[Value]]属性を変更しようとしても成功しない。
[[Get]] アクセサプロパティ オブジェクトまたはundefined undefined 値がオブジェクトの場合、関数オブジェクトでなければならない。プロパティのgetアクセスごとに、関数の[[Call]]内部メソッド(Table 5)が空の引数リストで呼び出され、値を取得する。
[[Set]] アクセサプロパティ オブジェクトまたはundefined undefined 値がオブジェクトの場合、関数オブジェクトでなければならない。プロパティのsetアクセスごとに、関数の[[Call]]内部メソッド(Table 5)が代入値のみを含む引数リストで呼び出される。プロパティの[[Set]]内部メソッドの効果は、後の[[Get]]内部メソッドの呼び出しで返される値に影響を与えても与えなくてもよい。
[[Enumerable]] データプロパティまたはアクセサプロパティ 真偽値 false trueの場合、プロパティはfor-in列挙(14.7.5参照)で列挙される。そうでなければ非列挙プロパティとされる。
[[Configurable]] データプロパティまたはアクセサプロパティ 真偽値 false falseの場合、プロパティの削除やデータ⇄アクセサプロパティの変更、その他の属性変更(既存の[[Value]]の置換や[[Writable]]falseにする以外)は成功しない。

6.1.7.2 オブジェクトの内部メソッドと内部スロット

ECMAScriptでは、オブジェクトの実際の意味論は内部メソッドと呼ばれるアルゴリズムによって定義されます。ECMAScriptエンジンの各オブジェクトには、そのランタイム動作を定義する内部メソッドの集合が関連付けられています。これらの内部メソッドはECMAScript言語の一部ではなく、説明目的で仕様に定義されています。ただし、実装内の各オブジェクトは、関連付けられた内部メソッドで指定された通りに振る舞わなければなりません。その実現方法は実装によって異なります。

内部メソッド名は多態的です。つまり、同じ内部メソッド名が呼び出されても、異なるオブジェクト値は異なるアルゴリズムを実行することがあります。内部メソッドが呼び出される実際のオブジェクトがその呼び出しの「ターゲット」です。実行時にアルゴリズムの実装がオブジェクトのサポートしていない内部メソッドを使おうとした場合、TypeError例外が投げられます。

内部スロットは、オブジェクト、Symbol、プライベート名に関連付けられた内部状態であり、様々なECMAScript仕様アルゴリズムで使われます。内部スロットはプロパティではなく、継承もされません。特定の内部スロット仕様によっては、状態が任意のECMAScript言語型または仕様型値になることがあります。明示的な記載がない限り、内部スロットはオブジェクト、Symbol、プライベート名の作成時に割り当てられ、動的に追加されることはありません。明示的な記載がない限り、内部スロットの初期値はundefinedです。本仕様内の様々なアルゴリズムは内部スロットを持つ値を生成しますが、ECMAScript言語は内部スロットを直接操作する方法を提供しません。

全てのオブジェクトは[[PrivateElements]]という名前の内部スロットを持ちます。これはPrivateElementsのリストであり、そのオブジェクトのプライベートフィールド、メソッド、アクセサの値を表します。初期状態では空のリストです。

内部メソッドと内部スロットは本仕様中では[[ ]]で囲まれた名前で識別されます。

Table 4は、ECMAScriptコードで生成・操作される全てのオブジェクトに適用される本質的な内部メソッドをまとめたものです。全てのオブジェクトは本質的な内部メソッドのアルゴリズムを持たねばなりませんが、必ずしも同じアルゴリズムを使うとは限りません。

通常オブジェクトは、次の全ての条件を満たすオブジェクトです:

  • Table 4に記載された内部メソッドについて、10.1で定義されたものを使用する。
  • オブジェクトが[[Call]]内部メソッドを持つ場合、10.2.1または10.3.1で定義されたものを使用する。
  • オブジェクトが[[Construct]]内部メソッドを持つ場合、10.2.2または10.3.2で定義されたものを使用する。

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

本仕様では、エキゾチックオブジェクトの種類はその内部メソッドによって認識されます。特定の種類のエキゾチックオブジェクト(配列エキゾチックオブジェクト束縛関数エキゾチックオブジェクトなど)と振る舞いが同等でも、その種類に指定された内部メソッド群を持たない場合は、その種類のエキゾチックオブジェクトとして認識されません。

Table 4などの表の「Signature」列は、各内部メソッドの呼び出しパターンを示します。呼び出しパターンには常に括弧付きの説明的パラメータ名リストが含まれます。パラメータ名がECMAScript型名と同じなら、その型の値が必要です。内部メソッドが値を明示的に返す場合、パラメータリストの後に「→」と返却値型名が続きます。Signatureで使われる型名は6で定義された型に、下記の追加型名を加えたものです。「any」は任意のECMAScript言語型の値を意味します。

パラメータに加え、内部メソッドは呼び出し対象オブジェクト(ターゲット)に常にアクセスできます。

内部メソッドは必ずCompletion Recordを返します。これは、正常完了で返却型値を包むものか、throw完了です。

Table 4: 本質的な内部メソッド
内部メソッド シグネチャ 説明
[[GetPrototypeOf]] ( ) Object | Null このオブジェクトに継承プロパティを提供するオブジェクトを決定する。null値は継承プロパティが無いことを示す。
[[SetPrototypeOf]] (Object | Null) Boolean このオブジェクトを継承プロパティを提供する他のオブジェクトと関連付ける。nullを渡すと継承プロパティが無いことを示す。操作が成功した場合はtrue、失敗した場合はfalseを返す。
[[IsExtensible]] ( ) Boolean このオブジェクトに追加プロパティの追加が許可されているかどうかを判定する。
[[PreventExtensions]] ( ) Boolean このオブジェクトに新しいプロパティ追加を制御する。操作が成功した場合はtrue、失敗した場合はfalseを返す。
[[GetOwnProperty]] (propertyKey) Undefined | Property Descriptor このオブジェクト自身のプロパティでキーがpropertyKeyであるもののプロパティ記述子を返す。なければundefinedを返す。
[[DefineOwnProperty]] (propertyKey, PropertyDescriptor) Boolean キーがpropertyKeyである自身のプロパティを、PropertyDescriptorで記述される状態に新規作成または変更する。そのプロパティが作成/更新できればtrue、できなければfalseを返す。
[[HasProperty]] (propertyKey) Boolean このオブジェクトがpropertyKeyをキーに持つ自身または継承プロパティを既に持っているかどうかを示す真偽値を返す。
[[Get]] (propertyKey, Receiver) any このオブジェクトからpropertyKeyのプロパティ値を返す。プロパティ値取得のためにECMAScriptコードの実行が必要な場合、Receiverthis値として使用される。
[[Set]] (propertyKey, value, Receiver) Boolean このオブジェクトのpropertyKeyプロパティ値をvalueに設定する。値の設定にECMAScriptコードの実行が必要な場合、Receiverthis値として使われる。値の設定ができればtrue、できなければfalseを返す。
[[Delete]] (propertyKey) Boolean このオブジェクト自身からpropertyKeyをキーに持つプロパティを削除する。削除できずまだ存在する場合はfalse、削除された場合や元々存在しない場合はtrueを返す。
[[OwnPropertyKeys]] ( ) プロパティキーのリスト オブジェクト自身の全てのプロパティキーのリストを返す。

Table 5は、関数として呼び出し可能なオブジェクトがサポートする追加の本質的な内部メソッドをまとめています。関数オブジェクト[[Call]]内部メソッドをサポートするオブジェクトです。コンストラクタ[[Construct]]内部メソッドをサポートするオブジェクトです。[[Construct]]をサポートするオブジェクトは[[Call]]もサポートしなければならず、全てのコンストラクタ関数オブジェクトとなります。したがって、コンストラクタコンストラクタ関数またはコンストラクタ関数オブジェクトとも呼ばれます。

Table 5: 関数オブジェクトの追加本質的内部メソッド
内部メソッド シグネチャ 説明
[[Call]] (any, anyのリスト) any このオブジェクトに関連付けられたコードを実行する。関数呼び出し式を通して呼び出される。引数はthis値と、呼び出し式で渡された引数のリスト。[[Call]]を実装するオブジェクトは呼び出し可能です。
[[Construct]] (anyのリスト, Object) Object オブジェクトを生成する。new演算子またはsuper呼び出しで起動される。最初の引数はコンストラクタ呼び出しまたはsuper呼び出しの引数のリスト。2番目の引数はnew演算子が最初に適用されたオブジェクト。[[Construct]]を実装するオブジェクトはコンストラクタと呼ばれる。関数オブジェクトが必ずしもコンストラクタとは限らず、非コンストラクタ関数オブジェクト[[Construct]]内部メソッドを持たない。

通常オブジェクトや標準エキゾチックオブジェクトの本質的内部メソッドの意味論は10で定義されています。エキゾチックオブジェクトの内部メソッドの指定された使用が実装でサポートされていない場合、その使用は試みられるとTypeError例外を投げなければなりません。

6.1.7.3 本質的内部メソッドの不変条件

ECMAScriptエンジンのオブジェクトの内部メソッドは、以下に示す不変条件リストに準拠しなければなりません。通常のECMAScriptオブジェクトおよび本仕様の全標準エキゾチックオブジェクトはこれらの不変条件を維持します。ECMAScriptのProxyオブジェクトは、[[ProxyHandler]]オブジェクトでtrapを呼び出した結果に対するランタイムチェックによってこれらの不変条件を維持します。

実装が提供するエキゾチックオブジェクトも、そのオブジェクトについてこれらの不変条件を維持しなければなりません。これらの不変条件に違反すると、ECMAScriptコードの挙動が予測不能になったり、セキュリティ問題が生じる場合があります。ただし、これらの不変条件への違反によって実装のメモリ安全性が損なわれてはなりません。

実装は、本質的内部メソッドの不変条件を強制しないまま、その機能を代替インターフェイスで提供するなどして、不変条件を回避できるようにしてはなりません。

定義:

  • 内部メソッドのターゲットは、その内部メソッドが呼び出されるオブジェクトです。
  • ターゲットが[[IsExtensible]]内部メソッドでfalseを返すこと、または[[PreventExtensions]]内部メソッドでtrueを返すことが観測された場合、ターゲットは非拡張とされます。
  • 非存在プロパティとは、非拡張ターゲットに自身プロパティとして存在しないプロパティです。
  • SameValueへの参照は、SameValueアルゴリズムの定義に従います。

戻り値:

いかなる内部メソッドも、以下いずれかのCompletion Record値を返さなければなりません:

  • [[Type]] = normal, [[Target]] = empty, [[Value]] = 下記内部メソッドごとの「正常返却型」の値、または
  • [[Type]] = throw, [[Target]] = empty, [[Value]] = 任意のECMAScript言語値
Note 1

内部メソッドはcontinue完了、break完了、return完了を返してはなりません。

[[GetPrototypeOf]] ( )

  • 正常返却型はObjectまたはNullです。
  • ターゲットが非拡張で、[[GetPrototypeOf]]が値Vを返した場合、以後の[[GetPrototypeOf]]呼び出しもVSameValueな値を返すべきです。
Note 2

オブジェクトのプロトタイプチェーンは有限長であるべきです(すなわち、任意のオブジェクトから[[GetPrototypeOf]]内部メソッドを再帰的に適用すると、最終的にnullになるべき)。ただし、プロトタイプチェーンに通常オブジェクト定義でない[[GetPrototypeOf]]を使うエキゾチックオブジェクトが含まれる場合、この条件はオブジェクトレベルの不変条件として強制できません。循環したプロトタイプチェーンは、プロパティアクセス時に無限ループとなる場合があります。

[[SetPrototypeOf]] ( V )

  • 正常返却型はBooleanです。
  • ターゲットが非拡張の場合、[[SetPrototypeOf]]falseを返さなければなりません。ただしVがターゲットの観測済み[[GetPrototypeOf]]値とSameValueの場合を除く。

[[IsExtensible]] ( )

  • 正常返却型はBooleanです。
  • [[IsExtensible]]falseを返した場合、以後の[[IsExtensible]]呼び出しもfalseを返さなければなりません。

[[PreventExtensions]] ( )

  • 正常返却型はBooleanです。
  • [[PreventExtensions]]trueを返した場合、以後の[[IsExtensible]]呼び出しはfalseを返し、ターゲットは非拡張とされます。

[[GetOwnProperty]] ( P )

  • 正常返却型はProperty DescriptorまたはUndefinedです。
  • 返却値がProperty Descriptorの場合、完全に埋められた記述子でなければなりません。
  • Pが非設定可能・非書き込み可能な自身データプロパティである場合、以後の[[GetOwnProperty]] ( P )呼び出しは、P[[Value]]属性がSameValueProperty Descriptorを返さなければなりません。
  • P[[Writable]][[Value]]以外の属性が変化する可能性がある、またはプロパティが削除され得る場合、P[[Configurable]]属性はtrueでなければなりません。
  • [[Writable]]属性がfalseからtrueに変化し得る場合、[[Configurable]]属性はtrueでなければなりません。
  • ターゲットが非拡張かつPが非存在自身プロパティの場合、以後の[[GetOwnProperty]] (P)呼び出しはPを非存在として記述しなければならない(つまりundefinedを返す)。
Note 3

3番目の不変条件の結果として、プロパティがデータプロパティで時間経過で値が変わる可能性がある場合、他の本質的内部メソッドで値の変更手段が公開されていなくても、[[Writable]]または[[Configurable]]属性のいずれかまたは両方をtrueにしなければなりません。

[[DefineOwnProperty]] ( P, Desc )

  • 正常返却型はBooleanです。
  • Pが過去に非設定可能自身プロパティと観測されていた場合、次のいずれかでない限り[[DefineOwnProperty]]falseを返さなければなりません:
    1. Pが書き込み可能データプロパティである。非設定可能な書き込み可能データプロパティは非設定可能な非書き込み可能データプロパティに変更できる。
    2. Descの全属性がPの属性とSameValueである。
  • ターゲットが非拡張かつPが非存在自身プロパティの場合、[[DefineOwnProperty]] (P, Desc)はfalseを返さなければならない。つまり非拡張ターゲットオブジェクトに新しいプロパティは追加できない。

[[HasProperty]] ( P )

  • 正常返却型はBooleanです。
  • Pが過去に非設定可能自身データまたはアクセサプロパティだった場合、[[HasProperty]]trueを返さなければなりません。

[[Get]] ( P, Receiver )

  • 正常返却型は任意のECMAScript言語型です。
  • Pが過去に非設定可能・非書き込み可能な自身データプロパティで値Vを持っていた場合、[[Get]]VSameValueな値を返さなければなりません。
  • Pが過去に非設定可能な自身アクセサプロパティ[[Get]]属性がundefinedだった場合、[[Get]]操作はundefinedを返さなければなりません。

[[Set]] ( P, V, Receiver )

  • 正常返却型はBooleanです。
  • Pが過去に非設定可能・非書き込み可能な自身データプロパティだった場合、VP[[Value]]属性とSameValueでない限り[[Set]]falseを返さなければなりません。
  • Pが過去に非設定可能な自身アクセサプロパティ[[Set]]属性がundefinedだった場合、[[Set]]操作はfalseを返さなければなりません。

[[Delete]] ( P )

  • 正常返却型はBooleanです。
  • Pが過去に非設定可能自身データまたはアクセサプロパティだった場合、[[Delete]]falseを返さなければなりません。

[[OwnPropertyKeys]] ( )

  • 正常返却型はリストです。
  • 返却されたリストに重複エントリがあってはなりません。
  • リストの各要素はプロパティキーでなければなりません。
  • リストには、これまで観測された非設定可能自身プロパティのキーが必ず含まれていなければなりません。
  • ターゲットが非拡張の場合、返却リストには[[GetOwnProperty]]で観測可能なターゲットの自身プロパティ全てのキーのみが含まれていなければなりません。

[[Call]] ( )

[[Construct]] ( )

  • 正常返却型はObjectです。
  • ターゲットは[[Call]]内部メソッドも持っていなければなりません。

6.1.7.4 著名な組み込みオブジェクト

著名な組み込みオブジェクト(well-known intrinsics)は、本仕様のアルゴリズムで明示的に参照され、通常はレルムごとに異なる同一性を持つ組み込みオブジェクトです。特に明示されていない限り、各組み込みオブジェクトはレルムごとに類似したオブジェクトの集合に対応します。

本仕様内では、%name%のような参照は、現在のレルムに関連付けられた対応する名前の組み込みオブジェクトを意味します。%name.a.b%のような参照は、組み込みオブジェクト%name%の"a"プロパティ値の"b"プロパティ値に、ECMAScriptコードが評価される前にアクセスしたかのような意味です。現在のレルムとその組み込みオブジェクトの決定については9.4で説明されています。著名な組み込みオブジェクトはTable 6に一覧化されています。

Table 6: 著名な組み込みオブジェクト
組み込み名 グローバル名 ECMAScript言語との関連
%AggregateError% AggregateError AggregateErrorコンストラクタ20.5.7.1
%Array% Array Arrayコンストラクタ23.1.1
%ArrayBuffer% ArrayBuffer ArrayBufferコンストラクタ25.1.4
%ArrayIteratorPrototype% Array Iteratorオブジェクトのプロトタイプ(23.1.5
%AsyncFromSyncIteratorPrototype% Async-from-Sync Iteratorオブジェクトのプロトタイプ(27.1.6
%AsyncFunction% 非同期関数オブジェクトコンストラクタ27.7.1
%AsyncGeneratorFunction% 非同期ジェネレーター関数オブジェクトコンストラクタ27.4.1
%AsyncGeneratorPrototype% 非同期ジェネレーターオブジェクトのプロトタイプ(27.6
%AsyncIteratorPrototype% 全ての標準組み込み非同期イテレータオブジェクトが間接的に継承するオブジェクト
%Atomics% Atomics Atomicsオブジェクト(25.4
%BigInt% BigInt BigIntコンストラクタ21.2.1
%BigInt64Array% BigInt64Array BigInt64Arrayコンストラクタ23.2
%BigUint64Array% BigUint64Array BigUint64Arrayコンストラクタ23.2
%Boolean% Boolean Booleanコンストラクタ20.3.1
%DataView% DataView DataViewコンストラクタ25.3.2
%Date% Date Dateコンストラクタ21.4.2
%decodeURI% decodeURI decodeURI関数(19.2.6.1
%decodeURIComponent% decodeURIComponent decodeURIComponent関数(19.2.6.2
%encodeURI% encodeURI encodeURI関数(19.2.6.3
%encodeURIComponent% encodeURIComponent encodeURIComponent関数(19.2.6.4
%Error% Error Errorコンストラクタ20.5.1
%eval% eval eval関数(19.2.1
%EvalError% EvalError EvalErrorコンストラクタ20.5.5.1
%FinalizationRegistry% FinalizationRegistry FinalizationRegistryコンストラクタ26.2.1
%Float16Array% Float16Array Float16Arrayコンストラクタ23.2
%Float32Array% Float32Array Float32Arrayコンストラクタ23.2
%Float64Array% Float64Array Float64Arrayコンストラクタ23.2
%ForInIteratorPrototype% For-In Iteratorオブジェクトのプロトタイプ(14.7.5.10
%Function% Function Functionコンストラクタ20.2.1
%GeneratorFunction% ジェネレーター関数オブジェクトコンストラクタ27.3.1
%GeneratorPrototype% ジェネレーターオブジェクトのプロトタイプ(27.5
%Int8Array% Int8Array Int8Arrayコンストラクタ23.2
%Int16Array% Int16Array Int16Arrayコンストラクタ23.2
%Int32Array% Int32Array Int32Arrayコンストラクタ23.2
%isFinite% isFinite isFinite関数(19.2.2
%isNaN% isNaN isNaN関数(19.2.3
%Iterator% Iterator Iteratorコンストラクタ27.1.3.1
%IteratorHelperPrototype% Iterator Helperオブジェクトのプロトタイプ(27.1.2.1
%JSON% JSON JSONオブジェクト(25.5
%Map% Map Mapコンストラクタ24.1.1
%MapIteratorPrototype% Map Iteratorオブジェクトのプロトタイプ(24.1.5
%Math% Math Mathオブジェクト(21.3
%Number% Number Numberコンストラクタ21.1.1
%Object% Object Objectコンストラクタ20.1.1
%parseFloat% parseFloat parseFloat関数(19.2.4
%parseInt% parseInt parseInt関数(19.2.5
%Promise% Promise Promiseコンストラクタ27.2.3
%Proxy% Proxy Proxyコンストラクタ28.2.1
%RangeError% RangeError RangeErrorコンストラクタ20.5.5.2
%ReferenceError% ReferenceError ReferenceErrorコンストラクタ20.5.5.3
%Reflect% Reflect Reflectオブジェクト(28.1
%RegExp% RegExp RegExpコンストラクタ22.2.4
%RegExpStringIteratorPrototype% RegExp String Iteratorオブジェクトのプロトタイプ(22.2.9
%Set% Set Setコンストラクタ24.2.2
%SetIteratorPrototype% Set Iteratorオブジェクトのプロトタイプ(24.2.6
%SharedArrayBuffer% SharedArrayBuffer SharedArrayBufferコンストラクタ25.2.3
%String% String Stringコンストラクタ22.1.1
%StringIteratorPrototype% String Iteratorオブジェクトのプロトタイプ(22.1.5
%Symbol% Symbol Symbolコンストラクタ20.4.1
%SyntaxError% SyntaxError SyntaxErrorコンストラクタ20.5.5.4
%ThrowTypeError% 必ず新しい%TypeError%インスタンスを投げる関数オブジェクト
%TypedArray% 全ての型付き配列コンストラクタのスーパークラス(23.2.1
%TypeError% TypeError TypeErrorコンストラクタ20.5.5.5
%Uint8Array% Uint8Array Uint8Arrayコンストラクタ23.2
%Uint8ClampedArray% Uint8ClampedArray Uint8ClampedArrayコンストラクタ23.2
%Uint16Array% Uint16Array Uint16Arrayコンストラクタ23.2
%Uint32Array% Uint32Array Uint32Arrayコンストラクタ23.2
%URIError% URIError URIErrorコンストラクタ20.5.5.6
%WeakMap% WeakMap WeakMapコンストラクタ24.3.1
%WeakRef% WeakRef WeakRefコンストラクタ26.1.1
%WeakSet% WeakSet WeakSetコンストラクタ24.4.1
%WrapForValidIteratorPrototype% Iterator.fromで返されるラップされたイテレータオブジェクトのプロトタイプ(27.1.3.2.1.1
Note

追加のエントリはTable 100にあります。

6.2 ECMAScript仕様型

仕様型は、ECMAScript言語構造やECMAScript言語型の意味論を記述するためにアルゴリズム内で使用されるメタ値を表します。仕様型にはReference RecordListCompletion RecordProperty DescriptorEnvironment RecordAbstract ClosureData Blockが含まれます。仕様型の値は仕様上のアーティファクトであり、ECMAScript実装内の特定の実体に必ずしも対応しません。仕様型の値はECMAScript式評価の中間結果の記述に使われることがありますが、オブジェクトのプロパティやECMAScript言語変数の値として保存することはできません。

6.2.1 Enum仕様型

Enumは仕様内部の値であり、ECMAScriptコードから直接観測することはできません。Enumはsans-serifフォントで表記されます。例えば、Completion Record[[Type]]フィールドはnormalreturnthrowなどの値を取ります。Enumは名前以外の特性を持ちません。Enumの名前は他のEnumと区別するためだけに存在し、コンテキストでの使い方や意味を暗示しません。

6.2.2 ListおよびRecord仕様型

List型は、new式や関数呼び出し、その他値の単純な順序付きリストが必要なアルゴリズムにおける引数リスト評価を説明するために使用されます。List型の値は個々の値を含むリスト要素の順序付き列です。これらの列の長さは任意です。リストの要素は0始まりのインデックスでランダムにアクセスできます。記法上の便宜として、List要素へのアクセスには配列風の構文が使えます。例えば、arguments[2]はList_arguments_の3番目の要素を表します。

アルゴリズムがListの要素を順序指定なしで反復する場合、使用される順序はList内の要素の順序です。

この仕様書内の記法上の便宜として、リテラル構文を用いて新しいList値を表現できます。例えば、« 1, 2 »は2つの要素を持ち、それぞれ特定の値で初期化されているList値を定義します。新しい空のListは« »で表現できます。

この仕様書では、「AB、...のリスト結合」という表現(各引数は空リストの場合もある)は、各引数の要素(順序通り)を連結した新しいList値を表します。

List of Stringsに対して「辞書式コードユニット順で並べ替える」とは、短い文字列の長さまで各コードユニットの数値で比較し、全てが等しければ短い方を先に並べることを意味します。これは抽象操作IsLessThanで説明されています。

Record型は、この仕様のアルゴリズム内でデータ集合を記述するために使われます。Record型の値は1つ以上の名前付きフィールドからなります。各フィールドの値はECMAScript言語値または仕様値です。フィールド名は常に二重角括弧で囲まれます(例:[[Value]])。

記法上の便宜として、Record値はオブジェクトリテラル風の構文で表現できます。例えば、{ [[Field1]]: 42, [[Field2]]: false, [[Field3]]: empty }は3つのフィールドを持ち、それぞれが特定の値で初期化されたRecord値を定義します。フィールド名の順序は重要ではありません。明示的に記載されていないフィールドは存在しないものとみなされます。

仕様本文やアルゴリズムでは、Record値の特定フィールドを参照するためにドット記法が使われます。例えば、Rが前述のRecordの場合、R.[[Field2]]は「Rの[[Field2]]という名前のフィールド」を意味します。

よく使われるRecordフィールド組み合わせのスキーマには名前が付けられ、その名前をリテラルRecord値の前に付けて、記述している特定の集合種別を識別することができます。例:PropertyDescriptor { [[Value]]: 42, [[Writable]]: false, [[Configurable]]: true }。

6.2.3 SetおよびRelation仕様型

Set型は、メモリモデルで使用するための順序なし要素の集合を説明するために使われます。これはECMAScriptの同名コレクション型とは異なります。区別のため、ECMAScriptコレクションのインスタンスは常に「Setオブジェクト」と呼ばれます。Set型の値は単純な要素集合であり、同じ要素が複数回現れることはありません。Setには要素の追加・削除ができます。Set同士の和集合、積集合、差集合も可能です。

Relation型は、Setに対する制約を説明するために使われます。Relation型の値は、その値域からの順序付きペアのSetです。例えば、イベントに対するRelationは、イベントの順序付きペアの集合です。Relation_R_と値域内の2つの値abについて、a R bは順序付きペア(a, b)がRに含まれることの略記です。Relationがある条件に関して最小Relationであるとは、その条件を満たす最小のRelationであることを意味します。

狭義半順序は、Relation値Rが以下を満たす場合です。

  • Rの値域内の全てのabcについて:

    • a R aであることはない
    • a R bかつb R cならa R c
Note 1

上記2つの性質は、それぞれ反射性の否定(非自反性)と推移性と呼ばれます。

狭義全順序は、Relation値Rが以下を満たす場合です。

  • Rの値域内の全てのabcについて:

    • abであるか、a R bか、b R aである
    • a R aであることはない
    • a R bかつb R cならa R c
Note 2

上記3つの性質は、それぞれ全域性、非自反性、推移性と呼ばれます。

6.2.4 Completion Record仕様型

Completion Record仕様型は、値や制御フロー(breakcontinuereturnthrowによる非局所的な制御移動)のランタイム伝播などを説明するために使われます。

Completion RecordはTable 7で定義されたフィールドを持ちます。

Table 7: Completion Recordフィールド
フィールド名 意味
[[Type]] normalbreakcontinuereturnthrow 発生したcompletionの種類。
[[Value]] Completion Record以外の任意の値 生成された値。
[[Target]] Stringまたはempty 指定制御移動のターゲットラベル。

Completion Recordを指すために次の略称が用いられることがあります。

  • normal completion[[Type]]値がnormalのCompletion Recordを指します。
  • break completion[[Type]]値がbreakのCompletion Recordを指します。
  • continue completion[[Type]]値がcontinueのCompletion Recordを指します。
  • return completion[[Type]]値がreturnのCompletion Recordを指します。
  • throw completion[[Type]]値がthrowのCompletion Recordを指します。
  • abrupt completion[[Type]]値がnormal以外のCompletion Recordを指します。
  • normal completion containing[[Value]]フィールドに指定された型の値を持つnormal completionを指します。

この仕様で定義される呼び出し可能オブジェクトは、normal completionまたはthrow completionのみを返します。それ以外のCompletion Recordを返す場合は編集上の誤りです。

実装定義の呼び出し可能オブジェクトもnormal completionまたはthrow completionのみを返さなければなりません。

6.2.4.1 NormalCompletion ( value )

The abstract operation NormalCompletion takes argument value (Completion Record以外の任意の値) and returns normal completion. It performs the following steps when called:

  1. Completion Record { [[Type]]: normal, [[Value]]: value, [[Target]]: empty }を返す。

6.2.4.2 ThrowCompletion ( value )

The abstract operation ThrowCompletion takes argument value (ECMAScript言語値) and returns throw completion. It performs the following steps when called:

  1. Completion Record { [[Type]]: throw, [[Value]]: value, [[Target]]: empty }を返す。

6.2.4.3 ReturnCompletion ( value )

The abstract operation ReturnCompletion takes argument value (ECMAScript言語値) and returns return completion. It performs the following steps when called:

  1. Completion Record { [[Type]]: return, [[Value]]: value, [[Target]]: empty }を返す。

6.2.4.4 UpdateEmpty ( completionRecord, value )

The abstract operation UpdateEmpty takes arguments completionRecord (Completion Record) and value (Completion Record以外の任意の値) and returns Completion Record. It performs the following steps when called:

  1. completionRecordreturn completionまたはthrow completionの場合、completionRecord.[[Value]]emptyでないことをアサートする。
  2. completionRecord.[[Value]]emptyでないなら、? completionRecordを返す。
  3. Completion Record { [[Type]]: completionRecord.[[Type]], [[Value]]: value, [[Target]]: completionRecord.[[Target]] }を返す。

6.2.5 Reference Record仕様型

Reference Record型は、deletetypeof、代入演算子、superキーワードやその他の言語機能の動作を説明するために使われます。例えば、代入の左辺オペランドはReference Recordを生成することが期待されます。

Reference Recordは解決済みの名前や(未解決の場合もある)プロパティバインディングであり、そのフィールドはTable 8で定義されます。

Table 8: Reference Recordフィールド
フィールド名 意味
[[Base]] ECMAScript言語値Environment Recordunresolvable バインディングを保持する値またはEnvironment Record[[Base]]unresolvableの場合、バインディングが解決できなかったことを示す。
[[ReferencedName]] ECMAScript言語値またはPrivate Name バインディング名。[[Base]]値がEnvironment Recordの場合は常にString。それ以外の場合、ToPropertyKeyが実行されるまではStringやSymbol以外のECMAScript言語値の場合もある。
[[Strict]] 真偽値 Reference Recordがstrict modeコードから生成された場合はtrue、それ以外はfalse
[[ThisValue]] ECMAScript言語値またはempty emptyでない場合、Reference Recordsuperキーワードで表現されたプロパティバインディングを表す(Super Reference Record)となり、[[Base]]値はEnvironment Recordにならない。その場合、[[ThisValue]]フィールドはReference Record生成時のthis値を保持する。

この仕様でReference Recordを操作するのに使われる抽象操作は以下の通りです:

6.2.5.1 IsPropertyReference ( V )

The abstract operation IsPropertyReference takes argument V (Reference Record) and returns 真偽値. It performs the following steps when called:

  1. V.[[Base]]unresolvableならfalseを返す。
  2. V.[[Base]]Environment Recordならfalseを返す、そうでなければtrueを返す。

6.2.5.2 IsUnresolvableReference ( V )

The abstract operation IsUnresolvableReference takes argument V (Reference Record) and returns 真偽値. It performs the following steps when called:

  1. V.[[Base]]unresolvableならtrue、そうでなければfalseを返す。

6.2.5.3 IsSuperReference ( V )

The abstract operation IsSuperReference takes argument V (Reference Record) and returns 真偽値. It performs the following steps when called:

  1. V.[[ThisValue]]emptyでないならtrue、それ以外はfalseを返す。

6.2.5.4 IsPrivateReference ( V )

The abstract operation IsPrivateReference takes argument V (Reference Record) and returns 真偽値. It performs the following steps when called:

  1. V.[[ReferencedName]]Private Nameならtrue、それ以外はfalseを返す。

6.2.5.5 GetValue ( V )

The abstract operation GetValue takes argument V (Reference RecordまたはECMAScript言語値) and returns normal completionECMAScript言語値含む)またはabrupt completion. It performs the following steps when called:

  1. VReference RecordでなければVを返す。
  2. IsUnresolvableReference(V)がtrueならReferenceError例外を投げる。
  3. IsPropertyReference(V)がtrueなら
    1. baseObjを? ToObject(V.[[Base]])とする。
    2. IsPrivateReference(V)がtrueなら
      1. PrivateGet(baseObj, V.[[ReferencedName]])を返す。
    3. V.[[ReferencedName]]プロパティキーでない場合
      1. V.[[ReferencedName]]を? ToPropertyKey(V.[[ReferencedName]])に設定する。
    4. baseObj.[[Get]](V.[[ReferencedName]], GetThisValue(V))を返す。
  4. それ以外の場合
    1. baseV.[[Base]]とする。
    2. アサート:baseEnvironment Record
    3. base.GetBindingValue(V.[[ReferencedName]], V.[[Strict]])(9.1参照)を返す。
Note

step 3.aで生成されるオブジェクトは、上記抽象操作および通常オブジェクト[[Get]]内部メソッド以外からはアクセスできません。実装によっては、実際のオブジェクト生成を省略する場合もあります。

6.2.5.6 PutValue ( V, W )

The abstract operation PutValue takes arguments V (Reference RecordまたはECMAScript言語値) and W (ECMAScript言語値) and returns normal completionunused含む)またはabrupt completion. It performs the following steps when called:

  1. VReference RecordでなければReferenceError例外を投げる。
  2. IsUnresolvableReference(V)がtrueなら
    1. V.[[Strict]]trueならReferenceError例外を投げる。
    2. globalObjGetGlobalObject()とする。
    3. Set(globalObj, V.[[ReferencedName]], W, false)を実行する。
    4. unusedを返す。
  3. IsPropertyReference(V)がtrueなら
    1. baseObjを? ToObject(V.[[Base]])とする。
    2. IsPrivateReference(V)がtrueなら
      1. PrivateSet(baseObj, V.[[ReferencedName]], W)を返す。
    3. V.[[ReferencedName]]プロパティキーでない場合
      1. V.[[ReferencedName]]を? ToPropertyKey(V.[[ReferencedName]])に設定する。
    4. succeededを? baseObj.[[Set]](V.[[ReferencedName]], W, GetThisValue(V))とする。
    5. succeededfalseかつV.[[Strict]]trueならTypeError例外を投げる。
    6. unusedを返す。
  4. それ以外の場合
    1. baseV.[[Base]]とする。
    2. アサート:baseEnvironment Record
    3. base.SetMutableBinding(V.[[ReferencedName]], W, V.[[Strict]])(9.1参照)を返す。
Note

step 3.aで生成されるオブジェクトは、上記抽象操作および通常オブジェクト[[Set]]内部メソッド以外からはアクセスできません。実装によっては、実際のオブジェクト生成を省略する場合もあります。

6.2.5.7 GetThisValue ( V )

The abstract operation GetThisValue takes argument V (Reference Record) and returns ECMAScript言語値. It performs the following steps when called:

  1. IsPropertyReference(V)がtrueであることをアサートする。
  2. IsSuperReference(V)がtrueならV.[[ThisValue]]を返し、そうでなければV.[[Base]]を返す。

6.2.5.8 InitializeReferencedBinding ( V, W )

The abstract operation InitializeReferencedBinding takes arguments V (Reference Record) and W (ECMAScript言語値) and returns normal completionunused含む)またはabrupt completion. It performs the following steps when called:

  1. IsUnresolvableReference(V)がfalseであることをアサートする。
  2. baseV.[[Base]]とする。
  3. アサート:baseEnvironment Record
  4. base.InitializeBinding(V.[[ReferencedName]], W)を返す。

6.2.5.9 MakePrivateReference ( baseValue, privateIdentifier )

The abstract operation MakePrivateReference takes arguments baseValue (ECMAScript言語値) and privateIdentifier (String) and returns Reference Record. It performs the following steps when called:

  1. privateEnvを実行中の実行コンテキストのPrivateEnvironmentとする。
  2. アサート:privateEnvnullではない。
  3. privateNameResolvePrivateIdentifier(privateEnv, privateIdentifier)とする。
  4. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: privateName, [[Strict]]: true, [[ThisValue]]: empty }を返す。

6.2.6 Property Descriptor仕様型

Property Descriptor型は、オブジェクトプロパティ属性の操作や具現化を説明するために使われます。Property Descriptorは0個以上のフィールドを持つRecordであり、各フィールド名は属性名、値は6.1.7.1で指定された属性値です。仕様内でProperty Descriptor Recordをリテラル記述する際のスキーマ名は「PropertyDescriptor」です。

Property Descriptor値は、特定のフィールドの存在や使用に基づきデータProperty DescriptorとアクセサProperty Descriptorに分類できます。[[Value]]または[[Writable]]フィールドがあるものはデータProperty Descriptor、[[Get]]または[[Set]]フィールドがあるものはアクセサProperty Descriptorです。全てのProperty Descriptorは[[Enumerable]][[Configurable]]フィールドを持てます。Property Descriptor値はデータProperty DescriptorとアクセサProperty Descriptorの両方になることはできませんが、どちらでもない場合もあり(その場合は汎用Property Descriptor)、完全なProperty DescriptorはアクセサまたはデータProperty Descriptorのいずれかで、かつ対応する全フィールドがTable 3で定義されているものです。

この仕様でProperty Descriptor値を操作するために使われる抽象操作は以下の通りです:

6.2.6.1 IsAccessorDescriptor ( Desc )

The abstract operation IsAccessorDescriptor takes argument Desc (Property Descriptor) and returns 真偽値. It performs the following steps when called:

  1. Desc[[Get]]フィールドを持つならtrueを返す。
  2. Desc[[Set]]フィールドを持つならtrueを返す。
  3. falseを返す。

6.2.6.2 IsDataDescriptor ( Desc )

The abstract operation IsDataDescriptor takes argument Desc (Property Descriptor) and returns 真偽値. It performs the following steps when called:

  1. Desc[[Value]]フィールドを持つならtrueを返す。
  2. Desc[[Writable]]フィールドを持つならtrueを返す。
  3. falseを返す。

6.2.6.3 IsGenericDescriptor ( Desc )

The abstract operation IsGenericDescriptor takes argument Desc (Property Descriptor) and returns 真偽値. It performs the following steps when called:

  1. IsAccessorDescriptor(Desc)がtrueならfalseを返す。
  2. IsDataDescriptor(Desc)がtrueならfalseを返す。
  3. trueを返す。

6.2.6.4 FromPropertyDescriptor ( Desc )

The abstract operation FromPropertyDescriptor takes argument Desc (Property Descriptorまたはundefined) and returns Objectまたはundefined. It performs the following steps when called:

  1. Descundefinedならundefinedを返す。
  2. objOrdinaryObjectCreate(%Object.prototype%)とする。
  3. アサート:objは自身プロパティを持たない拡張可能な通常オブジェクト
  4. Desc[[Value]]フィールドを持つなら
    1. CreateDataPropertyOrThrow(obj, "value", Desc.[[Value]])を実行する。
  5. Desc[[Writable]]フィールドを持つなら
    1. CreateDataPropertyOrThrow(obj, "writable", Desc.[[Writable]])を実行する。
  6. Desc[[Get]]フィールドを持つなら
    1. CreateDataPropertyOrThrow(obj, "get", Desc.[[Get]])を実行する。
  7. Desc[[Set]]フィールドを持つなら
    1. CreateDataPropertyOrThrow(obj, "set", Desc.[[Set]])を実行する。
  8. Desc[[Enumerable]]フィールドを持つなら
    1. CreateDataPropertyOrThrow(obj, "enumerable", Desc.[[Enumerable]])を実行する。
  9. Desc[[Configurable]]フィールドを持つなら
    1. CreateDataPropertyOrThrow(obj, "configurable", Desc.[[Configurable]])を実行する。
  10. objを返す。

6.2.6.5 ToPropertyDescriptor ( Obj )

The abstract operation ToPropertyDescriptor takes argument Obj (ECMAScript言語値) and returns normal completionProperty Descriptor含む)またはthrow completion. It performs the following steps when called:

  1. ObjがObjectでなければTypeError例外を投げる。
  2. descをフィールドなしの新しいProperty Descriptorとする。
  3. hasEnumerableを? HasProperty(Obj, "enumerable")とする。
  4. hasEnumerabletrueなら
    1. enumerableToBoolean(? Get(Obj, "enumerable"))とする。
    2. desc.[[Enumerable]]enumerableを設定する。
  5. hasConfigurableを? HasProperty(Obj, "configurable")とする。
  6. hasConfigurabletrueなら
    1. configurableToBoolean(? Get(Obj, "configurable"))とする。
    2. desc.[[Configurable]]configurableを設定する。
  7. hasValueを? HasProperty(Obj, "value")とする。
  8. hasValuetrueなら
    1. valueを? Get(Obj, "value")とする。
    2. desc.[[Value]]valueを設定する。
  9. hasWritableを? HasProperty(Obj, "writable")とする。
  10. hasWritabletrueなら
    1. writableToBoolean(? Get(Obj, "writable"))とする。
    2. desc.[[Writable]]writableを設定する。
  11. hasGetを? HasProperty(Obj, "get")とする。
  12. hasGettrueなら
    1. getterを? Get(Obj, "get")とする。
    2. IsCallable(getter)がfalseかつgetterundefinedでなければTypeError例外を投げる。
    3. desc.[[Get]]getterを設定する。
  13. hasSetを? HasProperty(Obj, "set")とする。
  14. hasSettrueなら
    1. setterを? Get(Obj, "set")とする。
    2. IsCallable(setter)がfalseかつsetterundefinedでなければTypeError例外を投げる。
    3. desc.[[Set]]setterを設定する。
  15. desc[[Get]]フィールドを持つ、または[[Set]]フィールドを持つなら
    1. desc[[Value]]フィールドを持つ、または[[Writable]]フィールドを持つならTypeError例外を投げる。
  16. descを返す。

6.2.6.6 CompletePropertyDescriptor ( Desc )

The abstract operation CompletePropertyDescriptor takes argument Desc (Property Descriptor) and returns unused. It performs the following steps when called:

  1. likeRecord { [[Value]]: undefined, [[Writable]]: false, [[Get]]: undefined, [[Set]]: undefined, [[Enumerable]]: false, [[Configurable]]: false }とする。
  2. IsGenericDescriptor(Desc)がtrueまたはIsDataDescriptor(Desc)がtrueなら
    1. Desc[[Value]]フィールドを持たなければDesc.[[Value]]like.[[Value]]を設定する。
    2. Desc[[Writable]]フィールドを持たなければDesc.[[Writable]]like.[[Writable]]を設定する。
  3. それ以外の場合
    1. Desc[[Get]]フィールドを持たなければDesc.[[Get]]like.[[Get]]を設定する。
    2. Desc[[Set]]フィールドを持たなければDesc.[[Set]]like.[[Set]]を設定する。
  4. Desc[[Enumerable]]フィールドを持たなければDesc.[[Enumerable]]like.[[Enumerable]]を設定する。
  5. Desc[[Configurable]]フィールドを持たなければDesc.[[Configurable]]like.[[Configurable]]を設定する。
  6. unusedを返す。

6.2.7 Environment Record仕様型

Environment Record型は、入れ子関数やブロックにおける名前解決の動作を説明するために使われます。この型および操作は9.1で定義されています。

6.2.8 Abstract Closure仕様型

Abstract Closure仕様型は、アルゴリズム手順と値の集合をまとめて参照するために使われます。Abstract Closureはメタ値であり、closure(arg1, arg2)のような関数適用スタイルで呼び出されます。抽象操作と同様、呼び出しではAbstract Closureで記述されたアルゴリズム手順を実行します。

Abstract Closureを生成するアルゴリズム手順では、"capture"という動詞とエイリアスのリストで値をキャプチャします。Abstract Closure生成時には各エイリアスに関連付けられた値をキャプチャします。Abstract Closureの呼び出しで実行されるアルゴリズム手順には、キャプチャした値をエイリアス名で参照します。

Abstract ClosureがCompletion Recordを返す場合、それはnormal completionまたはthrow completionでなければなりません。

Abstract Closureは他のアルゴリズムの一部としてインラインで生成され、次の例のように表されます。

  1. addendを41とする。
  2. closureをパラメータ(x)でaddendをキャプチャし、呼び出し時に次の手順を実行する新しいAbstract Closureとする:
    1. x + addendを返す。
  3. valclosure(1)とする。
  4. アサート:valは42である。

6.2.9 Data Block

Data Block仕様型は、個別かつ可変なバイトサイズ(8ビット)の数値値の列を説明するために使われます。バイト値は0から255までの整数です。Data Block値は、各バイトの初期値が0である固定サイズのバイト数で作成されます。

記法上の便宜として、Data Block値の個々のバイトへのアクセスには配列風の構文が使えます。この記法は、Data Block値を0ベースのinteger-indexedなバイトの列として表現します。例えば、dbが5バイトのData Block値の場合、db[2]で3番目のバイトにアクセスできます。

複数のエージェントが同時に参照可能なメモリ上のデータブロックはShared Data Blockと呼ばれます。Shared Data Blockは同一性(Shared Data Block値の等価性判定のため)はアドレス非依存です。つまり、ブロックがどの仮想アドレスにマップされているかではなく、そのブロックが表すメモリ位置集合に結びついています。2つのデータブロックは、含む位置集合が等しい場合のみ等価であり、そうでなければ等価ではなく、位置集合の共通部分は空です。Shared Data BlockはData Blockと区別されます。

Shared Data Blockの意味論は、メモリモデルによるShared Data Blockイベントを使って定義されます。以下の抽象操作はShared Data Blockイベントを導入し、評価意味論とメモリモデルのイベント意味論のインターフェースとなります。イベントは候補実行を形成し、メモリモデルがそれにフィルタをかけます。完全な意味論についてはメモリモデルを参照してください。

Shared Data BlockイベントはRecordでモデル化され、メモリモデルで定義されています。

この仕様でData Block値を操作するために使われる抽象操作は以下の通りです:

6.2.9.1 CreateByteDataBlock ( size )

The abstract operation CreateByteDataBlock takes argument size (非負整数) and returns normal completionData Block含む)またはthrow completion. It performs the following steps when called:

  1. size > 253 - 1ならRangeError例外を投げる。
  2. dbsizeバイトからなる新しいData Block値とする。作成不可能ならRangeError例外を投げる。
  3. dbの全バイトを0に設定する。
  4. dbを返す。

6.2.9.2 CreateSharedByteDataBlock ( size )

The abstract operation CreateSharedByteDataBlock takes argument size (非負整数) and returns normal completionShared Data Block含む)またはthrow completion. It performs the following steps when called:

  1. dbsizeバイトからなる新しいShared Data Block値とする。作成不可能ならRangeError例外を投げる。
  2. executionを周囲エージェントのAgent Record[[CandidateExecution]]フィールドとする。
  3. eventsRecordagentAgent Events Recordexecution.[[EventsRecords]]中で[[AgentSignifier]]AgentSignifier()となるもの)とする。
  4. zeroを« 0 »とする。
  5. dbの各インデックスiについて:
    1. WriteSharedMemory { [[Order]]: init, [[NoTear]]: true, [[Block]]: db, [[ByteIndex]]: i, [[ElementSize]]: 1, [[Payload]]: zero }をeventsRecord.[[EventList]]に追加する。
  6. dbを返す。

6.2.9.3 CopyDataBlockBytes ( toBlock, toIndex, fromBlock, fromIndex, count )

The abstract operation CopyDataBlockBytes takes arguments toBlock (Data BlockまたはShared Data Block), toIndex (非負整数), fromBlock (Data BlockまたはShared Data Block), fromIndex (非負整数), and count (非負整数) and returns unused. It performs the following steps when called:

  1. fromBlocktoBlockが異なる値であることをアサートする。
  2. fromSizefromBlockのバイト数とする。
  3. fromIndex + countfromSizeをアサートする。
  4. toSizetoBlockのバイト数とする。
  5. toIndex + counttoSizeをアサートする。
  6. count > 0の間、繰り返す:
    1. fromBlockShared Data Blockの場合
      1. executionを周囲エージェントのAgent Record[[CandidateExecution]]フィールドとする。
      2. eventsRecordagentAgent Events Recordexecution.[[EventsRecords]]中で[[AgentSignifier]]AgentSignifier()となるもの)とする。
      3. bytesを、非決定的に選ばれたバイト値を唯一の要素とするListとする。
      4. 注:実装では、bytesは基底ハードウェアで非アトミックな読込命令の結果。非決定性は、弱い一貫性ハードウェアの観測可能挙動を記述するメモリモデルの意味論的規定。
      5. readEventReadSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: fromBlock, [[ByteIndex]]: fromIndex, [[ElementSize]]: 1 }とする。
      6. readEventeventsRecord.[[EventList]]に追加する。
      7. Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: bytes }をexecution.[[ChosenValues]]に追加する。
      8. toBlockShared Data Blockなら
        1. WriteSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: toBlock, [[ByteIndex]]: toIndex, [[ElementSize]]: 1, [[Payload]]: bytes }をeventsRecord.[[EventList]]に追加する。
      9. それ以外の場合
        1. toBlock[toIndex]にbytes[0]を設定する。
    2. それ以外の場合
      1. toBlockShared Data Blockでないことをアサートする。
      2. toBlock[toIndex]にfromBlock[fromIndex]を設定する。
    3. toIndextoIndex + 1に設定する。
    4. fromIndexfromIndex + 1に設定する。
    5. countcount - 1に設定する。
  7. unusedを返す。

6.2.10 PrivateElement仕様型

PrivateElement型は、privateクラスフィールド・メソッド・アクセサの仕様で使用されるRecordです。Property Descriptorはprivate要素には使われませんが、privateフィールドは非設定可能・非列挙・書き込み可能なデータプロパティ、privateメソッドは非設定可能・非列挙・非書き込み可能なデータプロパティ、privateアクセサは非設定可能・非列挙なアクセサプロパティと同様に振る舞います。

PrivateElement型の値は、Table 9で定義されたフィールドを持つRecord値です。これらの値はPrivateElementと呼ばれます。

Table 9: PrivateElementフィールド
フィールド名 [[Kind]]フィールドが存在する場合の値 意味
[[Key]] 全て Private Name フィールド・メソッド・アクセサの名前。
[[Kind]] 全て fieldmethodaccessor 要素の種類。
[[Value]] fieldmethod ECMAScript言語値 フィールドの値。
[[Get]] accessor 関数オブジェクトまたはundefined privateアクセサのgetter。
[[Set]] accessor 関数オブジェクトまたはundefined privateアクセサのsetter。

6.2.11 ClassFieldDefinition Record仕様型

ClassFieldDefinition型はクラスフィールドの仕様で使用されるRecordです。

ClassFieldDefinition型の値は、Table 10で定義されたフィールドを持つRecord値です。これらの値はClassFieldDefinition Recordと呼ばれます。

Table 10: ClassFieldDefinition Recordフィールド
フィールド名 意味
[[Name]] Private Name、String、Symbol フィールドの名前。
[[Initializer]] ECMAScript関数オブジェクトまたはempty フィールドの初期化子(あれば)。

6.2.12 Private Name

Private Name仕様型は、他のPrivate Nameと区別される(たとえ他と区別できない場合でも)グローバルに一意な値を表し、privateクラス要素(フィールド・メソッド・アクセサ)のキーとなります。各Private Nameは不変な[[Description]]内部スロットを持ち、値はStringです。Private NameはECMAScriptオブジェクトにPrivateFieldAddまたはPrivateMethodOrAccessorAddでインストールでき、PrivateGetPrivateSetで読み書きできます。

6.2.13 ClassStaticBlockDefinition Record仕様型

ClassStaticBlockDefinition Recordは、クラスのstatic初期化ブロック用実行コードをカプセル化するRecord値です。

ClassStaticBlockDefinition RecordはTable 11で挙げられるフィールドを持ちます。

Table 11: ClassStaticBlockDefinition Recordフィールド
フィールド名 意味
[[BodyFunction]] ECMAScript関数オブジェクト クラスのstatic初期化時に呼び出される関数オブジェクト

7 抽象操作

これらの操作はECMAScript言語の一部ではなく、ECMAScript言語の意味論を仕様化する助けのためだけにここで定義される。その他、より専門的な抽象操作は本仕様全体で定義されている。

7.1 型変換

ECMAScript言語は必要に応じて暗黙的な自動型変換を行う。特定の構文要素の意味論を明確化するため、変換用の抽象操作集合を定義すると便利である。変換抽象操作は多態的であり、任意のECMAScript言語型の値を受け取ることができる。ただし他の仕様型はこれらの操作では使用しない。

BigInt型はECMAScript言語において暗黙の変換を持たない。プログラマは他の型から値を変換する際に明示的にBigIntを呼び出す必要がある。

7.1.1 ToPrimitive ( input: ECMAScript言語値, 省略可能 preferredType: string または number, ): ECMAScript言語値を含む normal completion あるいは throw completion

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. input 引数を非 Object 型へ変換する。オブジェクトが複数の基本型へ変換可能な場合、オプションのヒント preferredType を使ってその型を優先できる。 It performs the following steps when called:

  1. input が Object であるなら
    1. exoticToPrim を ? GetMethod(input, %Symbol.toPrimitive%) とする。
    2. exoticToPrimundefined でないなら
      1. preferredType が存在しないなら
        1. hint"default" とする。
      2. そうでなく preferredTypestring なら
        1. hint"string" とする。
      3. それ以外
        1. アサート: preferredTypenumber である。
        2. hint"number" とする。
      4. result を ? Call(exoticToPrim, input, « hint ») とする。
      5. result が Object でないなら result を返す。
      6. TypeError 例外を投げる。
    3. preferredType が存在しないなら preferredTypenumber とする。
    4. OrdinaryToPrimitive(input, preferredType) を返す。
  2. input を返す。
Note

ヒントなしで ToPrimitive が呼び出された場合、一般的にはヒントが number であったかのように振る舞う。しかし、オブジェクトは %Symbol.toPrimitive% メソッドを定義することでこの挙動を上書きできる。本仕様で定義されるオブジェクトのうち既定の ToPrimitive 挙動を上書きするのは Date(21.4.4.45 参照)と Symbol オブジェクト(20.4.3.5 参照)のみである。Date はヒント不在を string として扱う。

7.1.1.1 OrdinaryToPrimitive ( O, hint )

The abstract operation OrdinaryToPrimitive takes arguments O (Object) and hint (string または number) and returns ECMAScript言語値を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. hintstring なら
    1. methodNames を « "toString", "valueOf" » とする。
  2. それ以外
    1. methodNames を « "valueOf", "toString" » とする。
  3. methodNames の各要素 name について
    1. method を ? Get(O, name) とする。
    2. IsCallable(method) が true なら
      1. result を ? Call(method, O) とする。
      2. result が Object でないなら result を返す。
  4. TypeError 例外を投げる。

7.1.2 ToBoolean ( argument )

The abstract operation ToBoolean takes argument argument (ECMAScript言語値) and returns Boolean. argument を Boolean 型の値へ変換する。 It performs the following steps when called:

  1. argument が Boolean なら argument を返す。
  2. argumentundefined, null, +0𝔽, -0𝔽, NaN, 0, または空文字列のいずれかなら false を返す。
  3. Normative Optional
    ホストが Web ブラウザまたは [[IsHTMLDDA]] 内部スロット をサポートする場合
    1. argument が Object でかつ [[IsHTMLDDA]] 内部スロットを持つなら false を返す。
  4. true を返す。

7.1.3 ToNumeric ( value )

The abstract operation ToNumeric takes argument value (ECMAScript言語値) and returns Number または BigInt を含む normal completion あるいは throw completion. value を Number か BigInt に変換して返す。 It performs the following steps when called:

  1. primValue を ? ToPrimitive(value, number) とする。
  2. primValue が BigInt なら primValue を返す。
  3. ToNumber(primValue) を返す。

7.1.4 ToNumber ( argument )

The abstract operation ToNumber takes argument argument (ECMAScript言語値) and returns Number を含む normal completion あるいは throw completion. argument を Number 型の値へ変換する。 It performs the following steps when called:

  1. argument が Number なら argument を返す。
  2. argument が Symbol か BigInt のいずれかなら TypeError 例外を投げる。
  3. argumentundefined なら NaN を返す。
  4. argumentnull または false なら +0𝔽 を返す。
  5. argumenttrue なら 1𝔽 を返す。
  6. argument が String なら StringToNumber(argument) を返す。
  7. アサート: argument は Object である。
  8. primValue を ? ToPrimitive(argument, number) とする。
  9. アサート: primValue は Object でない。
  10. ToNumber(primValue) を返す。

7.1.4.1 文字列型への ToNumber の適用

抽象操作 StringToNumber は次の文法を用いて String 値を Number 値へ変換する方法を規定する。

構文

StringNumericLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt StrWhiteSpace ::: StrWhiteSpaceChar StrWhiteSpaceopt StrWhiteSpaceChar ::: WhiteSpace LineTerminator StrNumericLiteral ::: StrDecimalLiteral NonDecimalIntegerLiteral[~Sep] StrDecimalLiteral ::: StrUnsignedDecimalLiteral + StrUnsignedDecimalLiteral - StrUnsignedDecimalLiteral StrUnsignedDecimalLiteral ::: Infinity DecimalDigits[~Sep] . DecimalDigits[~Sep]opt ExponentPart[~Sep]opt . DecimalDigits[~Sep] ExponentPart[~Sep]opt DecimalDigits[~Sep] ExponentPart[~Sep]opt

上で明示的に定義されていない文法記号は数値リテラルの字句文法(12.9.3)で用いられる定義を持つ。

Note

StringNumericLiteral の構文と NumericLiteral の構文には次の差異がある:

7.1.4.1.1 StringToNumber ( str )

The abstract operation StringToNumber takes argument str (String) and returns Number. It performs the following steps when called:

  1. literal を ParseText(str, StringNumericLiteral) とする。
  2. literal がエラーの List なら NaN を返す。
  3. literal の StringNumericValue を返す。

7.1.4.1.2 実行時意味論: StringNumericValue : Number

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

StringNumericLiteral を Number 値へ変換することは、NumericLiteral の NumericValue の決定(12.9.3 参照)と全体として類似するが、いくつか詳細は異なる。

It is defined piecewise over the following productions:

StringNumericLiteral ::: StrWhiteSpaceopt
  1. +0𝔽 を返す。
StringNumericLiteral ::: StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt
  1. StrNumericLiteral の StringNumericValue を返す。
StrNumericLiteral ::: NonDecimalIntegerLiteral
  1. 𝔽(NonDecimalIntegerLiteral の MV) を返す。
StrDecimalLiteral ::: - StrUnsignedDecimalLiteral
  1. aStrUnsignedDecimalLiteral の StringNumericValue とする。
  2. a+0𝔽 なら -0𝔽 を返す。
  3. -a を返す。
StrUnsignedDecimalLiteral ::: Infinity
  1. +∞𝔽 を返す。
StrUnsignedDecimalLiteral ::: DecimalDigits . DecimalDigitsopt ExponentPartopt
  1. a を最初の DecimalDigits の MV とする。
  2. 2番目の DecimalDigits が存在するなら
    1. b を2番目の DecimalDigits の MV とする。
    2. n を2番目の DecimalDigits のコードポイント数とする。
  3. それ以外
    1. b を 0 とする。
    2. n を 0 とする。
  4. ExponentPart が存在するなら eExponentPart の MV とし、そうでなければ e を 0 とする。
  5. RoundMVResult((a + (b × 10-n)) × 10e) を返す。
StrUnsignedDecimalLiteral ::: . DecimalDigits ExponentPartopt
  1. bDecimalDigits の MV とする。
  2. ExponentPart が存在するなら eExponentPart の MV とし、そうでなければ e を 0 とする。
  3. nDecimalDigits のコードポイント数とする。
  4. RoundMVResult(b × 10e - n) を返す。
StrUnsignedDecimalLiteral ::: DecimalDigits ExponentPartopt
  1. aDecimalDigits の MV とする。
  2. ExponentPart が存在するなら eExponentPart の MV とし、そうでなければ e を 0 とする。
  3. RoundMVResult(a × 10e) を返す。

7.1.4.1.3 RoundMVResult ( n )

The abstract operation RoundMVResult takes argument n (数学的値) and returns Number. n を実装依存の方法で Number に変換する。この抽象操作において、桁は 0 でないか左側に 0 でない桁があり右側にも 0 でない桁がある場合に有効とみなされる。また「数学的値の表現が表す数学的値」とは「数学的値の10進表現」の逆写像とする。 It performs the following steps when called:

  1. n の10進表現が有効桁20桁以下なら 𝔽(n) を返す。
  2. option1n の10進表現において20桁目より後の各有効桁を 0 に置き換えた表現が表す数学的値とする。
  3. option2n の10進表現において20桁目より後の各有効桁を 0 に置き換え、20桁目を(必要なら桁上げしつつ)インクリメントした表現が表す数学的値とする。
  4. chosen を実装依存に option1 または option2 から選ぶ。
  5. 𝔽(chosen) を返す。

7.1.5 ToIntegerOrInfinity ( argument )

The abstract operation ToIntegerOrInfinity takes argument argument (ECMAScript言語値) and returns 整数, +∞, -∞ のいずれかを含む normal completion あるいは throw completion. argument を Number 値の小数部分切り捨て表現の整数、またはその Number 値が無限大の場合は +∞ / -∞ に変換する。 It performs the following steps when called:

  1. number を ? ToNumber(argument) とする。
  2. numberNaN, +0𝔽, -0𝔽 のいずれかなら 0 を返す。
  3. number+∞𝔽 なら +∞ を返す。
  4. number-∞𝔽 なら -∞ を返す。
  5. truncate((number)) を返す。
Note
𝔽(ToIntegerOrInfinity(x)) はいかなる x に対しても -0𝔽 を返さない。小数部の切り捨ては x を数学的値に変換した後に行われる。

7.1.6 ToInt32 ( argument )

The abstract operation ToInt32 takes argument argument (ECMAScript言語値) and returns 整数 Number を含む normal completion あるいは throw completion. argument𝔽(-231) から 𝔽(231 - 1) までの 232 個の整数 Number 値のいずれかに変換する。 It performs the following steps when called:

  1. number を ? ToNumber(argument) とする。
  2. number有限でない、または +0𝔽-0𝔽 のいずれかなら +0𝔽 を返す。
  3. inttruncate((number)) とする。
  4. int32bitint modulo 232 とする。
  5. int32bit ≥ 231 なら 𝔽(int32bit - 232) を返し、そうでなければ 𝔽(int32bit) を返す。
Note

上記 ToInt32 定義により:

  • ToInt32 抽象操作は冪等であり、その結果に再適用しても値は変わらない。
  • 全ての x について ToInt32(ToUint32(x)) は ToInt32(x) と同じ値。(この性質を保つため +∞𝔽-∞𝔽+0𝔽 に写る。)
  • ToInt32 は -0𝔽+0𝔽 に写す。

7.1.7 ToUint32 ( argument )

The abstract operation ToUint32 takes argument argument (ECMAScript言語値) and returns 整数 Number を含む normal completion あるいは throw completion. argument+0𝔽 から 𝔽(232 - 1) までの 232 個の整数 Number 値のいずれかに変換する。 It performs the following steps when called:

  1. number を ? ToNumber(argument) とする。
  2. number有限でない、または +0𝔽-0𝔽 のいずれかなら +0𝔽 を返す。
  3. inttruncate((number)) とする。
  4. int32bitint modulo 232 とする。
  5. 𝔽(int32bit) を返す。
Note

上記 ToUint32 定義により:

  • ステップ 5 が ToUint32 と ToInt32 の唯一の差異。
  • ToUint32 抽象操作は冪等である。
  • 全ての x について ToUint32(ToInt32(x)) は ToUint32(x) と同じ値。(この性質を保つため +∞𝔽-∞𝔽+0𝔽 に写る。)
  • ToUint32 は -0𝔽+0𝔽 に写す。

7.1.8 ToInt16 ( argument )

The abstract operation ToInt16 takes argument argument (ECMAScript言語値) and returns 整数 Number を含む normal completion あるいは throw completion. argument𝔽(-215) から 𝔽(215 - 1) までの 216 個の整数 Number 値のいずれかに変換する。 It performs the following steps when called:

  1. number を ? ToNumber(argument) とする。
  2. number有限でない、または +0𝔽-0𝔽 のいずれかなら +0𝔽 を返す。
  3. inttruncate((number)) とする。
  4. int16bitint modulo 216 とする。
  5. int16bit ≥ 215 なら 𝔽(int16bit - 216) を返し、そうでなければ 𝔽(int16bit) を返す。

7.1.9 ToUint16 ( argument )

The abstract operation ToUint16 takes argument argument (ECMAScript言語値) and returns 整数 Number を含む normal completion あるいは throw completion. argument+0𝔽 から 𝔽(216 - 1) までの 216 個の整数 Number 値のいずれかに変換する。 It performs the following steps when called:

  1. number を ? ToNumber(argument) とする。
  2. number有限でない、または +0𝔽-0𝔽 のいずれかなら +0𝔽 を返す。
  3. inttruncate((number)) とする。
  4. int16bitint modulo 216 とする。
  5. 𝔽(int16bit) を返す。
Note

上記 ToUint16 定義により:

  • ステップ 4 における 216 の代入が ToUint32 との唯一の差異。
  • ToUint16 は -0𝔽+0𝔽 に写す。

7.1.10 ToInt8 ( argument )

The abstract operation ToInt8 takes argument argument (ECMAScript言語値) and returns 整数 Number を含む normal completion あるいは throw completion. argument-128𝔽 から 127𝔽 までの 28 個の整数 Number 値のいずれかに変換する。 It performs the following steps when called:

  1. number を ? ToNumber(argument) とする。
  2. number有限でない、または +0𝔽-0𝔽 のいずれかなら +0𝔽 を返す。
  3. inttruncate((number)) とする。
  4. int8bitint modulo 28 とする。
  5. int8bit ≥ 27 なら 𝔽(int8bit - 28) を返し、そうでなければ 𝔽(int8bit) を返す。

7.1.11 ToUint8 ( argument )

The abstract operation ToUint8 takes argument argument (ECMAScript言語値) and returns 整数 Number を含む normal completion あるいは throw completion. argument+0𝔽 から 255𝔽 までの 28 個の整数 Number 値のいずれかに変換する。 It performs the following steps when called:

  1. number を ? ToNumber(argument) とする。
  2. number有限でない、または +0𝔽-0𝔽 のいずれかなら +0𝔽 を返す。
  3. inttruncate((number)) とする。
  4. int8bitint modulo 28 とする。
  5. 𝔽(int8bit) を返す。

7.1.12 ToUint8Clamp ( argument )

The abstract operation ToUint8Clamp takes argument argument (ECMAScript言語値) and returns 整数 Number を含む normal completion あるいは throw completion. argument+0𝔽 から 255𝔽 の範囲に丸め及びクランプし 28 個の整数 Number 値のいずれかにする。 It performs the following steps when called:

  1. number を ? ToNumber(argument) とする。
  2. numberNaN なら +0𝔽 を返す。
  3. mvnumber の拡張数学的値とする。
  4. clampedmv を 0 と 255 の間にクランプした結果とする。
  5. ffloor(clamped) とする。
  6. clamped < f + 0.5 なら 𝔽(f) を返す。
  7. clamped > f + 0.5 なら 𝔽(f + 1) を返す。
  8. f が偶数なら 𝔽(f) を返し、そうでなければ 𝔽(f + 1) を返す。
Note

他の多くの整数変換操作と異なり ToUint8Clamp は非整数値を切り捨てではなく丸める。また “round half to even” であり Math.round の “round half up” とは異なる。

7.1.13 ToBigInt ( argument )

The abstract operation ToBigInt takes argument argument (ECMAScript言語値) and returns BigInt を含む normal completion あるいは throw completion. argument を BigInt 値へ変換する。Number からの暗黙変換が必要となる場合は例外を投げる。 It performs the following steps when called:

  1. prim を ? ToPrimitive(argument, number) とする。
  2. Table 12 において prim が対応する値を返す。
Table 12: BigInt 変換
引数型 結果
Undefined TypeError 例外を投げる。
Null TypeError 例外を投げる。
Boolean primtrue なら 1n を、primfalse なら 0n を返す。
BigInt prim を返す。
Number TypeError 例外を投げる。
String
  1. nStringToBigInt(prim) とする。
  2. nundefined なら SyntaxError 例外を投げる。
  3. n を返す。
Symbol TypeError 例外を投げる。

7.1.14 StringToBigInt ( str )

The abstract operation StringToBigInt takes argument str (String) and returns BigInt または undefined. It performs the following steps when called:

  1. literal を ParseText(str, StringIntegerLiteral) とする。
  2. literal がエラーの List なら undefined を返す。
  3. mvliteral の MV とする。
  4. アサート: mv整数
  5. (mv) を返す。

7.1.14.1 StringIntegerLiteral 文法

StringToBigInt は以下の文法を用いる。

構文

StringIntegerLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrIntegerLiteral StrWhiteSpaceopt StrIntegerLiteral ::: SignedInteger[~Sep] NonDecimalIntegerLiteral[~Sep]

7.1.14.2 実行時意味論: MV

7.1.15 ToBigInt64 ( argument )

The abstract operation ToBigInt64 takes argument argument (ECMAScript言語値) and returns BigInt を含む normal completion あるいは throw completion. argument(-263) から (263 - 1) までの 264 個の BigInt 値のいずれかに変換する。 It performs the following steps when called:

  1. n を ? ToBigInt(argument) とする。
  2. int64bit(n) modulo 264 とする。
  3. int64bit ≥ 263 なら (int64bit - 264) を返し、そうでなければ (int64bit) を返す。

7.1.16 ToBigUint64 ( argument )

The abstract operation ToBigUint64 takes argument argument (ECMAScript言語値) and returns BigInt を含む normal completion あるいは throw completion. argument0 から (264 - 1) までの 264 個の BigInt 値のいずれかに変換する。 It performs the following steps when called:

  1. n を ? ToBigInt(argument) とする。
  2. int64bit(n) modulo 264 とする。
  3. (int64bit) を返す。

7.1.17 ToString ( argument )

The abstract operation ToString takes argument argument (ECMAScript言語値) and returns String を含む normal completion あるいは throw completion. argument を String 型の値へ変換する。 It performs the following steps when called:

  1. argument が String なら argument を返す。
  2. argument が Symbol なら TypeError 例外を投げる。
  3. argumentundefined なら "undefined" を返す。
  4. argumentnull なら "null" を返す。
  5. argumenttrue なら "true" を返す。
  6. argumentfalse なら "false" を返す。
  7. argument が Number なら Number::toString(argument, 10) を返す。
  8. argument が BigInt なら BigInt::toString(argument, 10) を返す。
  9. アサート: argument は Object である。
  10. primValue を ? ToPrimitive(argument, string) とする。
  11. アサート: primValue は Object でない。
  12. ToString(primValue) を返す。

7.1.18 ToObject ( argument )

The abstract operation ToObject takes argument argument (ECMAScript言語値) and returns Object を含む normal completion あるいは throw completion. argument を Object 型の値へ変換する。 It performs the following steps when called:

  1. argumentundefined または null のいずれかなら TypeError 例外を投げる。
  2. argument が Boolean なら [[BooleanData]] 内部スロットに argument を設定した新しい Boolean オブジェクトを返す。Boolean オブジェクトの説明は 20.3 を参照。
  3. argument が Number なら [[NumberData]] 内部スロットに argument を設定した新しい Number オブジェクトを返す。説明は 21.1 参照。
  4. argument が String なら [[StringData]] 内部スロットに argument を設定した新しい String オブジェクトを返す。説明は 22.1 参照。
  5. argument が Symbol なら [[SymbolData]] 内部スロットに argument を設定した新しい Symbol オブジェクトを返す。説明は 20.4 参照。
  6. argument が BigInt なら [[BigIntData]] 内部スロットに argument を設定した新しい BigInt オブジェクトを返す。説明は 21.2 参照。
  7. アサート: argument は Object である。
  8. argument を返す。

7.1.19 ToPropertyKey ( argument )

The abstract operation ToPropertyKey takes argument argument (ECMAScript言語値) and returns プロパティキーを含む normal completion あるいは throw completion. argumentプロパティキーとして使用可能な値へ変換する。 It performs the following steps when called:

  1. key を ? ToPrimitive(argument, string) とする。
  2. key が Symbol なら
    1. key を返す。
  3. ToString(key) を返す。

7.1.20 ToLength ( argument )

The abstract operation ToLength takes argument argument (ECMAScript言語値) and returns 非負整数 Number を含む normal completion あるいは throw completion. argument配列風オブジェクトの length として適した非負整数 Number にクランプし切り捨てる。 It performs the following steps when called:

  1. len を ? ToIntegerOrInfinity(argument) とする。
  2. len ≤ 0 なら +0𝔽 を返す。
  3. 𝔽(min(len, 253 - 1)) を返す。

7.1.21 CanonicalNumericIndexString ( argument )

The abstract operation CanonicalNumericIndexString takes argument argument (String) and returns Number または undefined. argument"-0" であるか、ある Number 値 n について ToString(n) と正確に一致するなら、対応する Number 値を返す。それ以外は undefined を返す。 It performs the following steps when called:

  1. argument"-0" なら -0𝔽 を返す。
  2. n を ! ToNumber(argument) とする。
  3. ToString(n) が argument と等しいなら n を返す。
  4. undefined を返す。

正規数値文字列とは CanonicalNumericIndexString 抽象操作undefined を返さない任意の String のこと。

7.1.22 ToIndex ( value )

The abstract operation ToIndex takes argument value (ECMAScript言語値) and returns 非負整数を含む normal completion あるいは throw completion. value整数に変換し、それが非負かつ整数インデックスに対応するならその整数を返す。そうでなければ例外を投げる。 It performs the following steps when called:

  1. integer を ? ToIntegerOrInfinity(value) とする。
  2. integer が 0 から 253 - 1 までの範囲にないなら RangeError 例外を投げる。
  3. integer を返す。

7.2 テストおよび比較操作

7.2.1 RequireObjectCoercible ( argument )

The abstract operation RequireObjectCoercible takes argument argument (ECMAScript言語値) and returns unused を含む normal completion あるいは throw completion. argumentToObject により Object へ変換できない値ならエラーを投げる。 It performs the following steps when called:

  1. argumentundefined または null のいずれかなら TypeError 例外を投げる。
  2. unused を返す。

7.2.2 IsArray ( argument )

The abstract operation IsArray takes argument argument (ECMAScript言語値) and returns Boolean を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. argument が Object でないなら false を返す。
  2. argumentArray エキゾチックオブジェクトなら true を返す。
  3. argumentProxy エキゾチックオブジェクトなら
    1. ValidateNonRevokedProxy(argument) を実行する。
    2. proxyTargetargument.[[ProxyTarget]] とする。
    3. IsArray(proxyTarget) を返す。
  4. false を返す。

7.2.3 IsCallable ( argument )

The abstract operation IsCallable takes argument argument (ECMAScript言語値) and returns Boolean. argument[[Call]] 内部メソッドを持つ呼び出し可能関数か判定する。 It performs the following steps when called:

  1. argument が Object でないなら false を返す。
  2. argument[[Call]] 内部メソッドを持つなら true を返す。
  3. false を返す。

7.2.4 IsConstructor ( argument )

The abstract operation IsConstructor takes argument argument (ECMAScript言語値) and returns Boolean. argument[[Construct]] 内部メソッドを持つ関数オブジェクトか判定する。 It performs the following steps when called:

  1. argument が Object でないなら false を返す。
  2. argument[[Construct]] 内部メソッドを持つなら true を返す。
  3. false を返す。

7.2.5 IsExtensible ( O )

The abstract operation IsExtensible takes argument O (Object) and returns Boolean を含む normal completion あるいは throw completion. O に追加のプロパティを加えられるか判定する。 It performs the following steps when called:

  1. O.[[IsExtensible]]() を返す。

7.2.6 IsRegExp ( argument )

The abstract operation IsRegExp takes argument argument (ECMAScript言語値) and returns Boolean を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. argument が Object でないなら false を返す。
  2. matcher を ? Get(argument, %Symbol.match%) とする。
  3. matcherundefined でないなら ToBoolean(matcher) を返す。
  4. argument[[RegExpMatcher]] 内部スロットを持つなら true を返す。
  5. false を返す。

7.2.7 静的意味論: IsStringWellFormedUnicode ( string: String, ): Boolean

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. string6.1.4 に記述される UTF-16 符号化コードポイント列として解釈し、それが well formed な UTF-16 シーケンスか判定する。 It performs the following steps when called:

  1. lenstring の長さとする。
  2. k を 0 とする。
  3. k < len の間繰り返す
    1. cp を CodePointAt(string, k) とする。
    2. cp.[[IsUnpairedSurrogate]]true なら false を返す。
    3. kk + cp.[[CodeUnitCount]] に設定する。
  4. true を返す。

7.2.8 SameType ( x, y )

The abstract operation SameType takes arguments x (ECMAScript言語値) and y (ECMAScript言語値) and returns Boolean. 2つの引数が同じ型かどうか判定する。 It performs the following steps when called:

  1. xundefined かつ yundefined なら true を返す。
  2. xnull かつ ynull なら true を返す。
  3. x が Boolean かつ y が Boolean なら true を返す。
  4. x が Number かつ y が Number なら true を返す。
  5. x が BigInt かつ y が BigInt なら true を返す。
  6. x が Symbol かつ y が Symbol なら true を返す。
  7. x が String かつ y が String なら true を返す。
  8. x が Object かつ y が Object なら true を返す。
  9. false を返す。

7.2.9 SameValue ( x, y )

The abstract operation SameValue takes arguments x (ECMAScript言語値) and y (ECMAScript言語値) and returns Boolean. 2つの引数が同じ値かどうか判定する。 It performs the following steps when called:

  1. SameType(x, y) が false なら false を返す。
  2. x が Number なら
    1. Number::sameValue(x, y) を返す。
  3. SameValueNonNumber(x, y) を返す。
Note

このアルゴリズムは NaN 値を同等とみなし +0𝔽-0𝔽 を区別する点で IsStrictlyEqual アルゴリズムと異なる。

7.2.10 SameValueZero ( x, y )

The abstract operation SameValueZero takes arguments x (ECMAScript言語値) and y (ECMAScript言語値) and returns Boolean. 2つの引数が同じ値か(+0𝔽-0𝔽 の差異を無視して)判定する。 It performs the following steps when called:

  1. SameType(x, y) が false なら false を返す。
  2. x が Number なら
    1. Number::sameValueZero(x, y) を返す。
  3. SameValueNonNumber(x, y) を返す。
Note

SameValueZero は +0𝔽-0𝔽 を同等と扱う点のみ SameValue と異なる。

7.2.11 SameValueNonNumber ( x, y )

The abstract operation SameValueNonNumber takes arguments x (Number でない ECMAScript言語値) and y (Number でない ECMAScript言語値) and returns Boolean. It performs the following steps when called:

  1. アサート: SameType(x, y) は true
  2. xundefined または null のいずれかなら true を返す。
  3. x が BigInt なら
    1. BigInt::equal(x, y) を返す。
  4. x が String なら
    1. xy が同じ長さで同じ位置に同じコードユニットを持つなら true を返し、そうでなければ false を返す。
  5. x が Boolean なら
    1. xy がともに true またはともに false なら true を返し、そうでなければ false を返す。
  6. 注: 他の全ての ECMAScript 言語値は同一性で比較される。
  7. xy なら true を返し、そうでなければ false を返す。
Note 1
説明のため、一部のケースは必要ではないが個別に扱っている。
Note 2
"xy" の詳細は 5.2.7 で述べる。

7.2.12 IsLessThan ( x, y, LeftFirst )

The abstract operation IsLessThan takes arguments x (ECMAScript言語値), y (ECMAScript言語値), and LeftFirst (Boolean) and returns Boolean または undefined を含む normal completion あるいは throw completion. 比較 x < y の意味論を提供し、true / false / undefined(少なくとも一方が NaN を示す)を返す。LeftFirst フラグは副作用の可視性を伴う操作の順序を制御するために使われ、ECMAScript が左から右への評価順を規定しているため必要。LeftFirsttrue のとき xy より左に現れる式に対応し、false のときは逆でその場合操作は y が先に行われる。 It performs the following steps when called:

  1. LeftFirsttrue なら
    1. px を ? ToPrimitive(x, number) とする。
    2. py を ? ToPrimitive(y, number) とする。
  2. それ以外
    1. 注: 評価順維持のため順序を反転する必要がある。
    2. py を ? ToPrimitive(y, number) とする。
    3. px を ? ToPrimitive(x, number) とする。
  3. px が String かつ py が String なら
    1. lxpx の長さとする。
    2. lypy の長さとする。
    3. 0 ≤ i < min(lx, ly) なる各整数 i について昇順で
      1. cxpx のインデックス i にあるコードユニットの数値とする。
      2. cypy のインデックス i にあるコードユニットの数値とする。
      3. cx < cy なら true を返す。
      4. cx > cy なら false を返す。
    4. lx < ly なら true を返し、そうでなければ false を返す。
  4. それ以外
    1. px が BigInt かつ py が String なら
      1. nyStringToBigInt(py) とする。
      2. nyundefined なら undefined を返す。
      3. BigInt::lessThan(px, ny) を返す。
    2. px が String かつ py が BigInt なら
      1. nxStringToBigInt(px) とする。
      2. nxundefined なら undefined を返す。
      3. BigInt::lessThan(nx, py) を返す。
    3. 注: px, py はプリミティブなので評価順は重要でない。
    4. nx を ? ToNumeric(px) とする。
    5. ny を ? ToNumeric(py) とする。
    6. SameType(nx, ny) が true なら
      1. nx が Number なら
        1. Number::lessThan(nx, ny) を返す。
      2. それ以外
        1. アサート: nx は BigInt。
        2. BigInt::lessThan(nx, ny) を返す。
    7. アサート: (nx が BigInt かつ ny が Number) または (nx が Number かつ ny が BigInt)。
    8. nx または nyNaN なら undefined を返す。
    9. nx-∞𝔽 または ny+∞𝔽 なら true を返す。
    10. nx+∞𝔽 または ny-∞𝔽 なら false を返す。
    11. (nx) < (ny) なら true を返し、そうでなければ false を返す。
Note 1

ステップ 3 は、加算演算子 + を扱うアルゴリズム(13.15.3)のステップ 1.c と、論理和ではなく論理積を用いる点で異なる。

Note 2

文字列の比較は UTF-16 コードユニット値列に対する単純な辞書式順序を使用する。Unicode 仕様で定義される文字や文字列の意味的な等価性や照合順序は考慮しない。そのため Unicode Standard 上正規等価だが正規化形式が異なる文字列は不等と判定され得る。またサロゲートペアを含む文字列ではコードユニット順序はコードポイント順序と異なる。

7.2.13 IsLooselyEqual ( x, y )

The abstract operation IsLooselyEqual takes arguments x (ECMAScript言語値) and y (ECMAScript言語値) and returns Boolean を含む normal completion あるいは throw completion. == 演算子の意味論を提供する。 It performs the following steps when called:

  1. SameType(x, y) が true なら
    1. IsStrictlyEqual(x, y) を返す。
  2. xnull かつ yundefined なら true を返す。
  3. xundefined かつ ynull なら true を返す。
  4. Normative Optional
    ホストが Web ブラウザまたは [[IsHTMLDDA]] 内部スロット をサポートする場合
    1. x が Object で [[IsHTMLDDA]] 内部スロットを持ち、yundefined または null なら true を返す。
    2. xundefined または nully が Object かつ [[IsHTMLDDA]] 内部スロットを持つなら true を返す。
  5. x が Number かつ y が String なら ! IsLooselyEqual(x, ! ToNumber(y)) を返す。
  6. x が String かつ y が Number なら ! IsLooselyEqual(! ToNumber(x), y) を返す。
  7. x が BigInt かつ y が String なら
    1. nStringToBigInt(y) とする。
    2. nundefined なら false を返す。
    3. IsLooselyEqual(x, n) を返す。
  8. x が String かつ y が BigInt なら ! IsLooselyEqual(y, x) を返す。
  9. x が Boolean なら ! IsLooselyEqual(! ToNumber(x), y) を返す。
  10. y が Boolean なら ! IsLooselyEqual(x, ! ToNumber(y)) を返す。
  11. x が String, Number, BigInt, Symbol のいずれかで y が Object なら ! IsLooselyEqual(x, ? ToPrimitive(y)) を返す。
  12. x が Object で y が String, Number, BigInt, Symbol のいずれかなら ! IsLooselyEqual(? ToPrimitive(x), y) を返す。
  13. x が BigInt かつ y が Number, または x が Number かつ y が BigInt なら
    1. x有限でないまたは y有限でないなら false を返す。
    2. (x) = (y) なら true を返し、そうでなければ false を返す。
  14. false を返す。

7.2.14 IsStrictlyEqual ( x, y )

The abstract operation IsStrictlyEqual takes arguments x (ECMAScript言語値) and y (ECMAScript言語値) and returns Boolean. === 演算子の意味論を提供する。 It performs the following steps when called:

  1. SameType(x, y) が false なら false を返す。
  2. x が Number なら
    1. Number::equal(x, y) を返す。
  3. SameValueNonNumber(x, y) を返す。
Note

このアルゴリズムは符号付きゼロと NaN の扱いにおいて SameValue アルゴリズムと異なる。

7.3 オブジェクトに対する操作

7.3.1 MakeBasicObject ( internalSlotsList )

The abstract operation MakeBasicObject takes argument internalSlotsList (内部スロット名の List) and returns Object. 通常オブジェクトエキゾチックオブジェクトを含む、アルゴリズム的に作られる全ての ECMAScript オブジェクトの起源である。全オブジェクト生成で共通する手順を切り出し、生成を集約する。 It performs the following steps when called:

  1. internalSlotsListinternalSlotsList と « [[PrivateElements]] » のリスト結合に設定する。
  2. internalSlotsList 内の各名前に対応する内部スロットを持つ新規オブジェクト obj を作成する。
  3. 注: オブジェクトの内部メソッドと内部スロット で述べるように特記ない限り各内部スロットの初期値は undefined
  4. obj.[[PrivateElements]] を空の新しい List に設定する。
  5. obj の本質的内部メソッドを 10.1 で規定される既定の通常オブジェクト定義に設定する。
  6. アサート: 呼び出し側が obj[[GetPrototypeOf]][[SetPrototypeOf]] の両方を上書きしない場合、internalSlotsList[[Prototype]] を含む。
  7. アサート: 呼び出し側が obj[[SetPrototypeOf]], [[IsExtensible]], [[PreventExtensions]] の全てを上書きしない場合、internalSlotsList[[Extensible]] を含む。
  8. internalSlotsList[[Extensible]] を含むなら obj.[[Extensible]]true に設定する。
  9. obj を返す。
Note

本仕様内でエキゾチックオブジェクトArrayCreateBoundFunctionCreate のような抽象操作で、まず MakeBasicObject を呼び基本オブジェクトを得てから内部メソッドの一部または全部を上書きして作成される。エキゾチックオブジェクト生成をカプセル化するため、本質的内部メソッドはそれら操作以外では変更されない。

7.3.2 Get ( O, P )

The abstract operation Get takes arguments O (Object) and P (プロパティキー) and returns ECMAScript言語値を含む normal completion あるいは throw completion. オブジェクトの特定プロパティの値を取得するために使用される。 It performs the following steps when called:

  1. O.[[Get]](P, O) を返す。

7.3.3 GetV ( V, P )

The abstract operation GetV takes arguments V (ECMAScript言語値) and P (プロパティキー) and returns ECMAScript言語値を含む normal completion あるいは throw completion. ECMAScript言語値の特定プロパティの値を取得するために使用される。値がオブジェクトでない場合、値の型に適切なラッパーオブジェクトを用いてプロパティ探索が行われる。 It performs the following steps when called:

  1. O を ? ToObject(V) とする。
  2. O.[[Get]](P, V) を返す。

7.3.4 Set ( O, P, V, Throw )

The abstract operation Set takes arguments O (Object), P (プロパティキー), V (ECMAScript言語値), and Throw (Boolean) and returns unused を含む normal completion あるいは throw completion. オブジェクトの特定プロパティの値を設定するために用いられる。V は新しい値。 It performs the following steps when called:

  1. success を ? O.[[Set]](P, V, O) とする。
  2. successfalse かつ Throwtrue なら TypeError 例外を投げる。
  3. unused を返す。

7.3.5 CreateDataProperty ( O, P, V )

The abstract operation CreateDataProperty takes arguments O (Object), P (プロパティキー), and V (ECMAScript言語値) and returns Boolean を含む normal completion あるいは throw completion. オブジェクトの新しい自身プロパティを生成するために使用される。 It performs the following steps when called:

  1. newDesc を PropertyDescriptor { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } とする。
  2. O.[[DefineOwnProperty]](P, newDesc) を返す。
Note

この抽象操作は ECMAScript の代入演算子で作られるプロパティと同じ既定属性を持つプロパティを生成する。通常プロパティは未存在であり、存在し非設定可能または O が拡張不可能なら [[DefineOwnProperty]]false を返す。

7.3.6 CreateDataPropertyOrThrow ( O, P, V )

The abstract operation CreateDataPropertyOrThrow takes arguments O (Object), P (プロパティキー), and V (ECMAScript言語値) and returns unused を含む normal completion あるいは throw completion. オブジェクトの新しい自身プロパティを生成する。要求された更新が行えない場合 TypeError を投げる。 It performs the following steps when called:

  1. success を ? CreateDataProperty(O, P, V) とする。
  2. successfalse なら TypeError 例外を投げる。
  3. unused を返す。
Note

属性は代入演算子によって生成されるプロパティの既定値と同じ。存在済みで非設定可能または O が拡張不可能なら [[DefineOwnProperty]]false を返し本操作は TypeError を投げる。

7.3.7 CreateNonEnumerableDataPropertyOrThrow ( O, P, V )

The abstract operation CreateNonEnumerableDataPropertyOrThrow takes arguments O (Object), P (プロパティキー), and V (ECMAScript言語値) and returns unused. 通常オブジェクトの列挙不可な新しい自身プロパティを生成する。 It performs the following steps when called:

  1. アサート: O は非設定可能プロパティを持たない通常で拡張可能なオブジェクト。
  2. newDesc を PropertyDescriptor { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true } とする。
  3. DefinePropertyOrThrow(O, P, newDesc) を実行する。
  4. unused を返す。
Note

代入演算子既定と同じだが列挙不可。通常存在しないが存在しても DefinePropertyOrThrow は正常完了する。

7.3.8 DefinePropertyOrThrow ( O, P, desc )

The abstract operation DefinePropertyOrThrow takes arguments O (Object), P (プロパティキー), and desc (Property Descriptor) and returns unused を含む normal completion あるいは throw completion. オブジェクトの [[DefineOwnProperty]] 内部メソッドを呼び、要求された更新が行えない場合 TypeError を投げる。 It performs the following steps when called:

  1. success を ? O.[[DefineOwnProperty]](P, desc) とする。
  2. successfalse なら TypeError 例外を投げる。
  3. unused を返す。

7.3.9 DeletePropertyOrThrow ( O, P )

The abstract operation DeletePropertyOrThrow takes arguments O (Object) and P (プロパティキー) and returns unused を含む normal completion あるいは throw completion. オブジェクトの特定自身プロパティを削除する。プロパティが設定可能でない場合例外を投げる。 It performs the following steps when called:

  1. success を ? O.[[Delete]](P) とする。
  2. successfalse なら TypeError 例外を投げる。
  3. unused を返す。

7.3.10 GetMethod ( V, P )

The abstract operation GetMethod takes arguments V (ECMAScript言語値) and P (プロパティキー) and returns 関数オブジェクトまたは undefined を含む normal completion あるいは throw completion. プロパティ値が関数であることが期待される場合に ECMAScript 言語値の特定プロパティ値を取得する。 It performs the following steps when called:

  1. func を ? GetV(V, P) とする。
  2. funcundefined または null のいずれかなら undefined を返す。
  3. IsCallable(func) が false なら TypeError 例外を投げる。
  4. func を返す。

7.3.11 HasProperty ( O, P )

The abstract operation HasProperty takes arguments O (Object) and P (プロパティキー) and returns Boolean を含む normal completion あるいは throw completion. オブジェクトが指定キーのプロパティ(自身または継承)を持つか判定する。 It performs the following steps when called:

  1. O.[[HasProperty]](P) を返す。

7.3.12 HasOwnProperty ( O, P )

The abstract operation HasOwnProperty takes arguments O (Object) and P (プロパティキー) and returns Boolean を含む normal completion あるいは throw completion. オブジェクトが指定キーの自身プロパティを持つか判定する。 It performs the following steps when called:

  1. desc を ? O.[[GetOwnProperty]](P) とする。
  2. descundefined なら false を返す。
  3. true を返す。

7.3.13 Call ( F: ECMAScript言語値, V: ECMAScript言語値, 省略可能 argumentsList: ECMAScript言語値の List, ): ECMAScript言語値を含む normal completion あるいは throw completion

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 関数オブジェクト[[Call]] 内部メソッドを呼ぶために用いる。F が関数、Vthis 値、argumentsList が内部メソッドに渡す引数列。argumentsList が無ければ空の新 List を用いる。 It performs the following steps when called:

  1. argumentsList が存在しないなら argumentsList を空の新 List に設定する。
  2. IsCallable(F) が false なら TypeError 例外を投げる。
  3. F.[[Call]](V, argumentsList) を返す。

7.3.14 Construct ( F: constructor, 省略可能 argumentsList: ECMAScript言語値の List, 省略可能 newTarget: constructor, ): Object を含む normal completion あるいは throw completion

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 関数オブジェクト[[Construct]] 内部メソッドを呼ぶために用いる。argumentsListnewTarget は内部メソッドに対応する引数として渡される。argumentsList が無い場合空の新 ListnewTarget が無い場合 F を用いる。 It performs the following steps when called:

  1. newTarget が存在しないなら newTargetF に設定する。
  2. argumentsList が存在しないなら argumentsList を空の新 List に設定する。
  3. F.[[Construct]](argumentsList, newTarget) を返す。
Note

newTarget が無い場合、この操作は new F(...argumentsList) と同等。

7.3.15 SetIntegrityLevel ( O, level )

The abstract operation SetIntegrityLevel takes arguments O (Object) and level (sealed または frozen) and returns Boolean を含む normal completion あるいは throw completion. オブジェクトの自身プロパティ集合を固定するために使用。 It performs the following steps when called:

  1. status を ? O.[[PreventExtensions]]() とする。
  2. statusfalse なら false を返す。
  3. keys を ? O.[[OwnPropertyKeys]]() とする。
  4. levelsealed なら
    1. keys の各要素 k について
      1. DefinePropertyOrThrow(O, k, PropertyDescriptor { [[Configurable]]: false }) を実行する。
  5. それ以外
    1. アサート: levelfrozen
    2. keys の各要素 k について
      1. currentDesc を ? O.[[GetOwnProperty]](k) とする。
      2. currentDescundefined でないなら
        1. IsAccessorDescriptor(currentDesc) が true なら
          1. desc を PropertyDescriptor { [[Configurable]]: false } とする。
        2. それ以外
          1. desc を PropertyDescriptor { [[Configurable]]: false, [[Writable]]: false } とする。
        3. DefinePropertyOrThrow(O, k, desc) を実行する。
  6. true を返す。

7.3.16 TestIntegrityLevel ( O, level )

The abstract operation TestIntegrityLevel takes arguments O (Object) and level (sealed または frozen) and returns Boolean を含む normal completion あるいは throw completion. オブジェクトの自身プロパティ集合が固定されているか判定する。 It performs the following steps when called:

  1. extensible を ? IsExtensible(O) とする。
  2. extensibletrue なら false を返す。
  3. 注: オブジェクトが拡張可能ならプロパティは調べない。
  4. keys を ? O.[[OwnPropertyKeys]]() とする。
  5. keys の各要素 k について
    1. currentDesc を ? O.[[GetOwnProperty]](k) とする。
    2. currentDescundefined でないなら
      1. currentDesc.[[Configurable]]true なら false を返す。
      2. levelfrozen かつ IsDataDescriptor(currentDesc) が true なら
        1. currentDesc.[[Writable]]true なら false を返す。
  6. true を返す。

7.3.17 CreateArrayFromList ( elements )

The abstract operation CreateArrayFromList takes argument elements (ECMAScript言語値List) and returns Array. 要素が elements によって与えられる Array を生成する。 It performs the following steps when called:

  1. array を ! ArrayCreate(0) とする。
  2. n を 0 とする。
  3. elements の各要素 e について
    1. CreateDataPropertyOrThrow(array, ! ToString(𝔽(n)), e) を実行する。
    2. nn + 1 に設定する。
  4. array を返す。

7.3.18 LengthOfArrayLike ( obj )

The abstract operation LengthOfArrayLike takes argument obj (Object) and returns 非負整数を含む normal completion あるいは throw completion. 配列風オブジェクトの "length" プロパティの値を返す。 It performs the following steps when called:

  1. (? ToLength(? Get(obj, "length"))) を返す。

配列風オブジェクトとはこの操作が normal completion を返す任意のオブジェクト。

Note 1
通常配列風オブジェクトは整数インデックス名プロパティを持つがこの定義の要件ではない。
Note 2
Array と String オブジェクトは配列風オブジェクトの例である。

7.3.19 CreateListFromArrayLike ( obj: ECMAScript言語値, 省略可能 validElementTypes: all または property-key, ): ECMAScript言語値の List を含む normal completion あるいは throw completion

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. obj のインデックス付きプロパティから要素を取得して List 値を生成する。validElementTypes は要素として許可される値の型を示す。 It performs the following steps when called:

  1. validElementTypes が存在しないなら validElementTypesall とする。
  2. obj が Object でないなら TypeError 例外を投げる。
  3. len を ? LengthOfArrayLike(obj) とする。
  4. list を空の新 List とする。
  5. index を 0 とする。
  6. index < len の間繰り返す
    1. indexName を ! ToString(𝔽(index)) とする。
    2. next を ? Get(obj, indexName) とする。
    3. validElementTypesproperty-key かつ nextプロパティキーでないなら TypeError 例外を投げる。
    4. nextlist に追加する。
    5. indexindex + 1 に設定する。
  7. list を返す。

7.3.20 Invoke ( V: ECMAScript言語値, P: プロパティキー, 省略可能 argumentsList: ECMAScript言語値の List, ): ECMAScript言語値を含む normal completion あるいは throw completion

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. ECMAScript言語値のメソッドプロパティを呼び出すために用いる。V はプロパティ探索点かつ呼び出しの this 値。argumentsList はメソッドに渡す引数列。省略時は空 List。 It performs the following steps when called:

  1. argumentsList が存在しないなら argumentsList を空の新 List に設定する。
  2. func を ? GetV(V, P) とする。
  3. ? Call(func, V, argumentsList) を返す。

7.3.21 OrdinaryHasInstance ( C, O )

The abstract operation OrdinaryHasInstance takes arguments C (ECMAScript言語値) and O (ECMAScript言語値) and returns Boolean を含む normal completion あるいは throw completion. OC により提供されるインスタンスオブジェクト継承パスから継承しているかの既定アルゴリズムを実装する。 It performs the following steps when called:

  1. IsCallable(C) が false なら false を返す。
  2. C[[BoundTargetFunction]] 内部スロットを持つなら
    1. BCC.[[BoundTargetFunction]] とする。
    2. InstanceofOperator(O, BC) を返す。
  3. O が Object でないなら false を返す。
  4. P を ? Get(C, "prototype") とする。
  5. P が Object でないなら TypeError 例外を投げる。
  6. 繰り返し
    1. O を ? O.[[GetPrototypeOf]]() に設定する。
    2. Onull なら false を返す。
    3. SameValue(P, O) が true なら true を返す。

7.3.22 SpeciesConstructor ( O, defaultConstructor )

The abstract operation SpeciesConstructor takes arguments O (Object) and defaultConstructor (constructor) and returns constructor を含む normal completion あるいは throw completion. O から派生する新オブジェクト生成に用いるべきコンストラクタを取得する。defaultConstructor%Symbol.species% プロパティが O から辿れない場合に使用するコンストラクタ。 It performs the following steps when called:

  1. C を ? Get(O, "constructor") とする。
  2. Cundefined なら defaultConstructor を返す。
  3. C が Object でないなら TypeError 例外を投げる。
  4. S を ? Get(C, %Symbol.species%) とする。
  5. Sundefined または null のいずれかなら defaultConstructor を返す。
  6. IsConstructor(S) が true なら S を返す。
  7. TypeError 例外を投げる。

7.3.23 EnumerableOwnProperties ( O, kind )

The abstract operation EnumerableOwnProperties takes arguments O (Object) and kind (key, value, key+value) and returns ECMAScript言語値List を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. ownKeys を ? O.[[OwnPropertyKeys]]() とする。
  2. results を空の新 List とする。
  3. ownKeys の各要素 key について
    1. key が String なら
      1. desc を ? O.[[GetOwnProperty]](key) とする。
      2. descundefined でなく desc.[[Enumerable]]true なら
        1. kindkey なら
          1. keyresults に追加する。
        2. それ以外
          1. value を ? Get(O, key) とする。
          2. kindvalue なら
            1. valueresults に追加する。
          3. それ以外
            1. アサート: kindkey+value
            2. entryCreateArrayFromListkey, value ») とする。
            3. entryresults に追加する。
  4. results を返す。

7.3.24 GetFunctionRealm ( obj )

The abstract operation GetFunctionRealm takes argument obj (関数オブジェクト) and returns Realm Record を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. obj[[Realm]] 内部スロットを持つなら
    1. obj.[[Realm]] を返す。
  2. obj が bound function エキゾチックオブジェクトなら
    1. boundTargetFunctionobj.[[BoundTargetFunction]] とする。
    2. GetFunctionRealm(boundTargetFunction) を返す。
  3. objProxy エキゾチックオブジェクトなら
    1. ValidateNonRevokedProxy(obj) を実行する。
    2. proxyTargetobj.[[ProxyTarget]] とする。
    3. アサート: proxyTarget関数オブジェクト
    4. GetFunctionRealm(proxyTarget) を返す。
  4. 現在の Realm Record を返す。
Note

ステップ 4 に到達するのは [[Realm]] 内部スロットを持たない非標準 function エキゾチックオブジェクトの場合のみ。

7.3.25 CopyDataProperties ( target, source, excludedItems )

The abstract operation CopyDataProperties takes arguments target (Object), source (ECMAScript言語値), and excludedItems (プロパティキーList) and returns unused を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. sourceundefined または null のいずれかなら unused を返す。
  2. from を ! ToObject(source) とする。
  3. keys を ? from.[[OwnPropertyKeys]]() とする。
  4. keys の各要素 nextKey について
    1. excludedfalse とする。
    2. excludedItems の各要素 e について
      1. SameValue(e, nextKey) が true なら
        1. excludedtrue に設定する。
    3. excludedfalse なら
      1. desc を ? from.[[GetOwnProperty]](nextKey) とする。
      2. descundefined でなく desc.[[Enumerable]]true なら
        1. propValue を ? Get(from, nextKey) とする。
        2. CreateDataPropertyOrThrow(target, nextKey, propValue) を実行する。
  5. unused を返す。
Note

ここに渡される target は常に新規作成オブジェクトで、エラー時に直接アクセスされない。

7.3.26 PrivateElementFind ( O, P )

The abstract operation PrivateElementFind takes arguments O (Object) and P (Private Name) and returns PrivateElement または empty. It performs the following steps when called:

  1. O.[[PrivateElements]]PrivateElement pe を含み pe.[[Key]]P であるなら
    1. pe を返す。
  2. empty を返す。

7.3.27 PrivateFieldAdd ( O, P, value )

The abstract operation PrivateFieldAdd takes arguments O (Object), P (Private Name), and value (ECMAScript言語値) and returns unused を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. ホストが Web ブラウザなら
    1. HostEnsureCanAddPrivateElement(O) を実行する。
  2. entryPrivateElementFind(O, P) とする。
  3. entryempty でないなら TypeError 例外を投げる。
  4. PrivateElement { [[Key]]: P, [[Kind]]: field, [[Value]]: value } を O.[[PrivateElements]] に追加する。
  5. unused を返す。

7.3.28 PrivateMethodOrAccessorAdd ( O, method )

The abstract operation PrivateMethodOrAccessorAdd takes arguments O (Object) and method (PrivateElement) and returns unused を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. アサート: method.[[Kind]]method または accessor のいずれか。
  2. ホストが Web ブラウザなら
    1. HostEnsureCanAddPrivateElement(O) を実行する。
  3. entryPrivateElementFind(O, method.[[Key]]) とする。
  4. entryempty でないなら TypeError 例外を投げる。
  5. methodO.[[PrivateElements]] に追加する。
  6. unused を返す。
Note

private メソッドとアクセサの値はインスタンス間で共有され、この操作は新しいコピーを作成しない。

7.3.29 HostEnsureCanAddPrivateElement ( O )

The host-defined abstract operation HostEnsureCanAddPrivateElement takes argument O (Object) and returns unused を含む normal completion あるいは throw completion. ホスト環境が特定のホスト定義エキゾチックオブジェクトへの private 要素追加を禁止できるようにする。

HostEnsureCanAddPrivateElement の実装は次の要件に従わなければならない:

既定実装は NormalCompletion(unused) を返す。

この抽象操作は Web ブラウザの ECMAScript ホストのみが呼び出す。

7.3.30 PrivateGet ( O, P )

The abstract operation PrivateGet takes arguments O (Object) and P (Private Name) and returns ECMAScript言語値を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. entryPrivateElementFind(O, P) とする。
  2. entryempty なら TypeError 例外を投げる。
  3. entry.[[Kind]]field または method のいずれかなら
    1. entry.[[Value]] を返す。
  4. アサート: entry.[[Kind]]accessor
  5. entry.[[Get]]undefined なら TypeError 例外を投げる。
  6. getterentry.[[Get]] とする。
  7. ? Call(getter, O) を返す。

7.3.31 PrivateSet ( O, P, value )

The abstract operation PrivateSet takes arguments O (Object), P (Private Name), and value (ECMAScript言語値) and returns unused を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. entryPrivateElementFind(O, P) とする。
  2. entryempty なら TypeError 例外を投げる。
  3. entry.[[Kind]]field なら
    1. entry.[[Value]]value に設定する。
  4. それ以外で entry.[[Kind]]method なら
    1. TypeError 例外を投げる。
  5. それ以外
    1. アサート: entry.[[Kind]]accessor
    2. entry.[[Set]]undefined なら TypeError 例外を投げる。
    3. setterentry.[[Set]] とする。
    4. ? Call(setter, O, « value ») を実行する。
  6. unused を返す。

7.3.32 DefineField ( receiver, fieldRecord )

The abstract operation DefineField takes arguments receiver (Object) and fieldRecord (ClassFieldDefinition Record) and returns unused を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. fieldNamefieldRecord.[[Name]] とする。
  2. initializerfieldRecord.[[Initializer]] とする。
  3. initializerempty でないなら
    1. initValue を ? Call(initializer, receiver) とする。
  4. それ以外
    1. initValueundefined とする。
  5. fieldNamePrivate Name なら
    1. PrivateFieldAdd(receiver, fieldName, initValue) を実行する。
  6. それ以外
    1. アサート: fieldNameプロパティキー
    2. CreateDataPropertyOrThrow(receiver, fieldName, initValue) を実行する。
  7. unused を返す。

7.3.33 InitializeInstanceElements ( O, constructor )

The abstract operation InitializeInstanceElements takes arguments O (Object) and constructor (ECMAScript 関数オブジェクト) and returns unused を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. methodsconstructor.[[PrivateMethods]] とする。
  2. methods の各 PrivateElement method について
    1. PrivateMethodOrAccessorAdd(O, method) を実行する。
  3. fieldsconstructor.[[Fields]] とする。
  4. fields の各要素 fieldRecord について
    1. DefineField(O, fieldRecord) を実行する。
  5. unused を返す。

7.3.34 AddValueToKeyedGroup ( groups, key, value )

The abstract operation AddValueToKeyedGroup takes arguments groups ([[Key]] (ECMAScript言語値) と [[Elements]] (ECMAScript言語値List) フィールドを持つ RecordList), key (ECMAScript言語値), and value (ECMAScript言語値) and returns unused. It performs the following steps when called:

  1. groups の各 Record { [[Key]], [[Elements]] } g について
    1. SameValue(g.[[Key]], key) が true なら
      1. アサート: groups のうちこの条件を満たす要素は正確に1つ。
      2. valueg.[[Elements]] に追加する。
      3. unused を返す。
  2. groupRecord { [[Key]]: key, [[Elements]]: « value » } とする。
  3. groupgroups に追加する。
  4. unused を返す。

7.3.35 GroupBy ( items, callback, keyCoercion )

The abstract operation GroupBy takes arguments items (ECMAScript言語値), callback (ECMAScript言語値), and keyCoercion (property または collection) and returns [[Key]][[Elements]] フィールドを持つ RecordList を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. RequireObjectCoercible(items) を実行する。
  2. IsCallable(callback) が false なら TypeError 例外を投げる。
  3. groups を空の新 List とする。
  4. iteratorRecord を ? GetIterator(items, sync) とする。
  5. k を 0 とする。
  6. 繰り返し
    1. k ≥ 253 - 1 なら
      1. errorThrowCompletion(新規 TypeError オブジェクト) とする。
      2. IteratorClose(iteratorRecord, error) を返す。
    2. next を ? IteratorStepValue(iteratorRecord) とする。
    3. nextdone なら
      1. groups を返す。
    4. valuenext とする。
    5. keyCompletion(Call(callback, undefined, « value, 𝔽(k) »)) とする。
    6. IfAbruptCloseIterator(key, iteratorRecord)。
    7. keyCoercionproperty なら
      1. keyCompletion(ToPropertyKey(key)) とする。
      2. IfAbruptCloseIterator(key, iteratorRecord)。
    8. それ以外
      1. アサート: keyCoercioncollection
      2. keyCanonicalizeKeyedCollectionKey(key) に設定する。
    9. AddValueToKeyedGroup(groups, key, value) を実行する。
    10. kk + 1 に設定する。

7.3.36 SetterThatIgnoresPrototypeProperties ( thisValue, home, p, v )

The abstract operation SetterThatIgnoresPrototypeProperties takes arguments thisValue (ECMAScript言語値), home (Object), p (プロパティキー), and v (ECMAScript言語値) and returns unused を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. thisValue が Object でないなら
    1. TypeError 例外を投げる。
  2. SameValue(thisValue, home) が true なら
    1. 注: ここで投げることは strict mode で home オブジェクト上の非書き込み可能データプロパティへの代入をエミュレートする。
    2. TypeError 例外を投げる。
  3. desc を ? thisValue.[[GetOwnProperty]](p) とする。
  4. descundefined なら
    1. CreateDataPropertyOrThrow(thisValue, p, v) を実行する。
  5. それ以外
    1. Set(thisValue, p, v, true) を実行する。
  6. unused を返す。

7.4 イテレータオブジェクトに対する操作

共通反復インターフェイス(27.1)を参照。

7.4.1 Iterator Record

Iterator Record はイテレータまたは非同期イテレータとその next メソッドをカプセル化するための Record 値。

Iterator Record は Table 13 に示すフィールドを持つ。

Table 13: Iterator Record フィールド
フィールド名 意味
[[Iterator]] Object イテレータまたは非同期イテレータインターフェイスに準拠するオブジェクト。
[[NextMethod]] ECMAScript言語値 [[Iterator]] オブジェクトの next メソッド。
[[Done]] Boolean イテレータが完了またはクローズされたか。

7.4.2 GetIteratorDirect ( obj )

The abstract operation GetIteratorDirect takes argument obj (Object) and returns Iterator Record を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. nextMethod を ? Get(obj, "next") とする。
  2. iteratorRecordIterator Record { [[Iterator]]: obj, [[NextMethod]]: nextMethod, [[Done]]: false } とする。
  3. iteratorRecord を返す。

7.4.3 GetIteratorFromMethod ( obj, method )

The abstract operation GetIteratorFromMethod takes arguments obj (ECMAScript言語値) and method (関数オブジェクト) and returns Iterator Record を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. iterator を ? Call(method, obj) とする。
  2. iterator が Object でないなら TypeError 例外を投げる。
  3. GetIteratorDirect(iterator) を返す。

7.4.4 GetIterator ( obj, kind )

The abstract operation GetIterator takes arguments obj (ECMAScript言語値) and kind (sync または async) and returns Iterator Record を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. kindasync なら
    1. method を ? GetMethod(obj, %Symbol.asyncIterator%) とする。
    2. methodundefined なら
      1. syncMethod を ? GetMethod(obj, %Symbol.iterator%) とする。
      2. syncMethodundefined なら TypeError 例外を投げる。
      3. syncIteratorRecord を ? GetIteratorFromMethod(obj, syncMethod) とする。
      4. CreateAsyncFromSyncIterator(syncIteratorRecord) を返す。
  2. それ以外
    1. method を ? GetMethod(obj, %Symbol.iterator%) とする。
  3. methodundefined なら TypeError 例外を投げる。
  4. GetIteratorFromMethod(obj, method) を返す。

7.4.5 GetIteratorFlattenable ( obj, primitiveHandling )

The abstract operation GetIteratorFlattenable takes arguments obj (ECMAScript言語値) and primitiveHandling (iterate-string-primitives または reject-primitives) and returns Iterator Record を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. obj が Object でないなら
    1. primitiveHandlingreject-primitives なら TypeError 例外を投げる。
    2. アサート: primitiveHandlingiterate-string-primitives
    3. obj が String でないなら TypeError 例外を投げる。
  2. method を ? GetMethod(obj, %Symbol.iterator%) とする。
  3. methodundefined なら
    1. iteratorobj とする。
  4. それ以外
    1. iterator を ? Call(method, obj) とする。
  5. iterator が Object でないなら TypeError 例外を投げる。
  6. GetIteratorDirect(iterator) を返す。

7.4.6 IteratorNext ( iteratorRecord: Iterator Record, 省略可能 value: ECMAScript言語値, ): Object を含む normal completion あるいは throw completion

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. value が存在しないなら
    1. resultCompletion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]])) とする。
  2. それ以外
    1. resultCompletion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « value »)) とする。
  3. resultthrow completion なら
    1. iteratorRecord.[[Done]]true に設定する。
    2. result を返す。
  4. result を ! result に設定する。
  5. result が Object でないなら
    1. iteratorRecord.[[Done]]true に設定する。
    2. TypeError 例外を投げる。
  6. result を返す。

7.4.7 IteratorComplete ( iteratorResult )

The abstract operation IteratorComplete takes argument iteratorResult (Object) and returns Boolean を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. ToBoolean(? Get(iteratorResult, "done")) を返す。

7.4.8 IteratorValue ( iteratorResult )

The abstract operation IteratorValue takes argument iteratorResult (Object) and returns ECMAScript言語値を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. Get(iteratorResult, "value") を返す。

7.4.9 IteratorStep ( iteratorRecord )

The abstract operation IteratorStep takes argument iteratorRecord (Iterator Record) and returns Object または done を含む normal completion あるいは throw completion. iteratorRecord.[[NextMethod]] を呼び次の値を要求し、イテレータが終端なら done を、そうでなければ次の値を含む IteratorResult オブジェクトを返す。 It performs the following steps when called:

  1. result を ? IteratorNext(iteratorRecord) とする。
  2. doneCompletion(IteratorComplete(result)) とする。
  3. donethrow completion なら
    1. iteratorRecord.[[Done]]true に設定する。
    2. done を返す。
  4. done を ! done に設定する。
  5. donetrue なら
    1. iteratorRecord.[[Done]]true に設定する。
    2. done を返す。
  6. result を返す。

7.4.10 IteratorStepValue ( iteratorRecord )

The abstract operation IteratorStepValue takes argument iteratorRecord (Iterator Record) and returns ECMAScript言語値 または done を含む normal completion あるいは throw completion. iteratorRecord.[[NextMethod]] を呼び次の値を要求し、イテレータ終端なら done、値があれば IteratorResult からその値を返す。 It performs the following steps when called:

  1. result を ? IteratorStep(iteratorRecord) とする。
  2. resultdone なら
    1. done を返す。
  3. valueCompletion(IteratorValue(result)) とする。
  4. valuethrow completion なら
    1. iteratorRecord.[[Done]]true に設定する。
  5. value を返す。

7.4.11 IteratorClose ( iteratorRecord, completion )

The abstract operation IteratorClose takes arguments iteratorRecord (Iterator Record) and completion (Completion Record) and returns Completion Record. イテレータが完了状態に達した際に通常行う処理を実行するよう通知する。 It performs the following steps when called:

  1. アサート: iteratorRecord.[[Iterator]] は Object。
  2. iteratoriteratorRecord.[[Iterator]] とする。
  3. innerResultCompletion(GetMethod(iterator, "return")) とする。
  4. innerResultnormal completion なら
    1. returninnerResult.[[Value]] とする。
    2. returnundefined なら ? completion を返す。
    3. innerResultCompletion(Call(return, iterator)) に設定する。
  5. completionthrow completion なら ? completion を返す。
  6. innerResultthrow completion なら ? innerResult を返す。
  7. innerResult.[[Value]] が Object でないなら TypeError 例外を投げる。
  8. completion を返す。

7.4.12 IfAbruptCloseIterator ( value, iteratorRecord )

IfAbruptCloseIterator は Iterator Record を用いるアルゴリズム手順列の省略記法。次の形式のステップ:

  1. IfAbruptCloseIterator(value, iteratorRecord)。

は次と同じ意味を持つ:

  1. アサート: valueCompletion Record
  2. valueabrupt completion なら ? IteratorClose(iteratorRecord, value) を返す。
  3. それ以外なら value を ! value に設定する。

7.4.13 AsyncIteratorClose ( iteratorRecord, completion )

The abstract operation AsyncIteratorClose takes arguments iteratorRecord (Iterator Record) and completion (Completion Record) and returns Completion Record. 非同期イテレータが完了状態に達した際に通常行う処理を実行するよう通知する。 It performs the following steps when called:

  1. アサート: iteratorRecord.[[Iterator]] は Object。
  2. iteratoriteratorRecord.[[Iterator]] とする。
  3. innerResultCompletion(GetMethod(iterator, "return")) とする。
  4. innerResultnormal completion なら
    1. returninnerResult.[[Value]] とする。
    2. returnundefined なら ? completion を返す。
    3. innerResultCompletion(Call(return, iterator)) に設定する。
    4. innerResultnormal completion なら innerResultCompletion(Await(innerResult.[[Value]])) に設定する。
  5. completionthrow completion なら ? completion を返す。
  6. innerResultthrow completion なら ? innerResult を返す。
  7. innerResult.[[Value]] が Object でないなら TypeError 例外を投げる。
  8. completion を返す。

7.4.14 CreateIteratorResultObject ( value, done )

The abstract operation CreateIteratorResultObject takes arguments value (ECMAScript言語値) and done (Boolean) and returns IteratorResult インターフェイスに準拠する Object. IteratorResult インターフェイスに準拠するオブジェクトを生成する。 It performs the following steps when called:

  1. objOrdinaryObjectCreate(%Object.prototype%) とする。
  2. CreateDataPropertyOrThrow(obj, "value", value) を実行する。
  3. CreateDataPropertyOrThrow(obj, "done", done) を実行する。
  4. obj を返す。

7.4.15 CreateListIteratorRecord ( list )

The abstract operation CreateListIteratorRecord takes argument list (ECMAScript言語値List) and returns Iterator Record. list の連続要素を返す [[NextMethod]] を持つ Iterator Record を生成する。 It performs the following steps when called:

  1. closure をパラメータ無しで list をキャプチャし呼び出し時に次を行う新しい Abstract Closure とする:
    1. list の各要素 E について
      1. GeneratorYield(CreateIteratorResultObject(E, false)) を実行する。
    2. NormalCompletion(undefined) を返す。
  2. iteratorCreateIteratorFromClosure(closure, empty, %Iterator.prototype%) とする。
  3. Iterator Record { [[Iterator]]: iterator, [[NextMethod]]: %GeneratorPrototype.next%, [[Done]]: false } を返す。
Note

List イテレータオブジェクトは ECMAScript コードから直接アクセスできない。

7.4.16 IteratorToList ( iteratorRecord )

The abstract operation IteratorToList takes argument iteratorRecord (Iterator Record) and returns ECMAScript言語値List を含む normal completion あるいは throw completion. It performs the following steps when called:

  1. values を空の新 List とする。
  2. 繰り返し
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone なら
      1. values を返す。
    3. nextvalues に追加する。

8 構文指向操作 (Syntax-Directed Operations)

本節で定義されるものに加えて、特化した構文指向操作が本仕様全体で定義されている。

8.1 実行時意味論: Evaluation : Completion Record

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note
この操作の定義は本仕様の「ECMAScript Language」各節に分散している。各定義は関連する生成規則 (production) が定義出現する直後に現れる。

8.2 スコープ解析 (Scope Analysis)

8.2.1 静的意味論: BoundNames : 文字列の List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

"*default*" は、モジュールの default export に別名が存在しない場合に、そのモジュールの default export を表すための合成(synthetic)名として本仕様内で用いられる。この名前でモジュールの [[Environment]] にエントリが作成され対応する値を保持し、当該モジュールについて ResolveExport ( exportName [ , resolveSet ] ) を呼び "default" という export を解決すると、[[BindingName]]"*default*"ResolvedBinding Record を返し、それがモジュールの [[Environment]] 内で前述の値へ解決される。これは仕様記述の簡便さのみを目的としており、無名の default export を他の export と同様に解決できるようにするためである。この "*default*" 文字列が ECMAScript コードやモジュールリンクアルゴリズムからアクセスされることは決してない。

It is defined piecewise over the following productions:

BindingIdentifier : Identifier
  1. Identifier の StringValue を唯一の要素とする List を返す。
BindingIdentifier : yield
  1. « "yield" » を返す。
BindingIdentifier : await
  1. « "await" » を返す。
LexicalDeclaration : LetOrConst BindingList ;
  1. BindingList の BoundNames を返す。
BindingList : BindingList , LexicalBinding
  1. names1BindingList の BoundNames とする。
  2. names2LexicalBinding の BoundNames とする。
  3. names1names2リスト結合を返す。
LexicalBinding : BindingIdentifier Initializeropt
  1. BindingIdentifier の BoundNames を返す。
LexicalBinding : BindingPattern Initializer
  1. BindingPattern の BoundNames を返す。
VariableDeclarationList : VariableDeclarationList , VariableDeclaration
  1. names1VariableDeclarationList の BoundNames とする。
  2. names2VariableDeclaration の BoundNames とする。
  3. names1names2リスト結合を返す。
VariableDeclaration : BindingIdentifier Initializeropt
  1. BindingIdentifier の BoundNames を返す。
VariableDeclaration : BindingPattern Initializer
  1. BindingPattern の BoundNames を返す。
ObjectBindingPattern : { }
  1. 新しい空の List を返す。
ObjectBindingPattern : { BindingPropertyList , BindingRestProperty }
  1. names1BindingPropertyList の BoundNames とする。
  2. names2BindingRestProperty の BoundNames とする。
  3. names1names2リスト結合を返す。
ArrayBindingPattern : [ Elisionopt ]
  1. 新しい空の List を返す。
ArrayBindingPattern : [ Elisionopt BindingRestElement ]
  1. BindingRestElement の BoundNames を返す。
ArrayBindingPattern : [ BindingElementList , Elisionopt ]
  1. BindingElementList の BoundNames を返す。
ArrayBindingPattern : [ BindingElementList , Elisionopt BindingRestElement ]
  1. names1BindingElementList の BoundNames とする。
  2. names2BindingRestElement の BoundNames とする。
  3. names1names2リスト結合を返す。
BindingPropertyList : BindingPropertyList , BindingProperty
  1. names1BindingPropertyList の BoundNames とする。
  2. names2BindingProperty の BoundNames とする。
  3. names1names2リスト結合を返す。
BindingElementList : BindingElementList , BindingElisionElement
  1. names1BindingElementList の BoundNames とする。
  2. names2BindingElisionElement の BoundNames とする。
  3. names1names2リスト結合を返す。
BindingElisionElement : Elisionopt BindingElement
  1. BindingElement の BoundNames を返す。
BindingProperty : PropertyName : BindingElement
  1. BindingElement の BoundNames を返す。
SingleNameBinding : BindingIdentifier Initializeropt
  1. BindingIdentifier の BoundNames を返す。
BindingElement : BindingPattern Initializeropt
  1. BindingPattern の BoundNames を返す。
ForDeclaration : LetOrConst ForBinding
  1. ForBinding の BoundNames を返す。
FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody }
  1. BindingIdentifier の BoundNames を返す。
FunctionDeclaration : function ( FormalParameters ) { FunctionBody }
  1. « "*default*" » を返す。
FormalParameters : [empty]
  1. 新しい空の List を返す。
FormalParameters : FormalParameterList , FunctionRestParameter
  1. names1FormalParameterList の BoundNames とする。
  2. names2FunctionRestParameter の BoundNames とする。
  3. names1names2リスト結合を返す。
FormalParameterList : FormalParameterList , FormalParameter
  1. names1FormalParameterList の BoundNames とする。
  2. names2FormalParameter の BoundNames とする。
  3. names1names2リスト結合を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsCoverParenthesizedExpressionAndArrowParameterList が被覆する ArrowFormalParameters とする。
  2. formals の BoundNames を返す。
GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody }
  1. BindingIdentifier の BoundNames を返す。
GeneratorDeclaration : function * ( FormalParameters ) { GeneratorBody }
  1. « "*default*" » を返す。
AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }
  1. BindingIdentifier の BoundNames を返す。
AsyncGeneratorDeclaration : async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. « "*default*" » を返す。
ClassDeclaration : class BindingIdentifier ClassTail
  1. BindingIdentifier の BoundNames を返す。
ClassDeclaration : class ClassTail
  1. « "*default*" » を返す。
AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
  1. BindingIdentifier の BoundNames を返す。
AsyncFunctionDeclaration : async function ( FormalParameters ) { AsyncFunctionBody }
  1. « "*default*" » を返す。
CoverCallExpressionAndAsyncArrowHead : MemberExpression Arguments
  1. headCoverCallExpressionAndAsyncArrowHead が被覆する AsyncArrowHead とする。
  2. head の BoundNames を返す。
ImportDeclaration : import ImportClause FromClause WithClauseopt ;
  1. ImportClause の BoundNames を返す。
ImportDeclaration : import ModuleSpecifier WithClauseopt ;
  1. 新しい空の List を返す。
ImportClause : ImportedDefaultBinding , NameSpaceImport
  1. names1ImportedDefaultBinding の BoundNames とする。
  2. names2NameSpaceImport の BoundNames とする。
  3. names1names2リスト結合を返す。
ImportClause : ImportedDefaultBinding , NamedImports
  1. names1ImportedDefaultBinding の BoundNames とする。
  2. names2NamedImports の BoundNames とする。
  3. names1names2リスト結合を返す。
NamedImports : { }
  1. 新しい空の List を返す。
ImportsList : ImportsList , ImportSpecifier
  1. names1ImportsList の BoundNames とする。
  2. names2ImportSpecifier の BoundNames とする。
  3. names1names2リスト結合を返す。
ImportSpecifier : ModuleExportName as ImportedBinding
  1. ImportedBinding の BoundNames を返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ;
  1. 新しい空の List を返す。
ExportDeclaration : export VariableStatement
  1. VariableStatement の BoundNames を返す。
ExportDeclaration : export Declaration
  1. Declaration の BoundNames を返す。
ExportDeclaration : export default HoistableDeclaration
  1. declarationNamesHoistableDeclaration の BoundNames とする。
  2. declarationNames"*default*" が含まれないなら "*default*"declarationNames に追加する。
  3. declarationNames を返す。
ExportDeclaration : export default ClassDeclaration
  1. declarationNamesClassDeclaration の BoundNames とする。
  2. declarationNames"*default*" が含まれないなら "*default*"declarationNames に追加する。
  3. declarationNames を返す。
ExportDeclaration : export default AssignmentExpression ;
  1. « "*default*" » を返す。

8.2.2 静的意味論: DeclarationPart : Parse Node

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

HoistableDeclaration : FunctionDeclaration
  1. FunctionDeclaration を返す。
HoistableDeclaration : GeneratorDeclaration
  1. GeneratorDeclaration を返す。
HoistableDeclaration : AsyncFunctionDeclaration
  1. AsyncFunctionDeclaration を返す。
HoistableDeclaration : AsyncGeneratorDeclaration
  1. AsyncGeneratorDeclaration を返す。
Declaration : ClassDeclaration
  1. ClassDeclaration を返す。
Declaration : LexicalDeclaration
  1. LexicalDeclaration を返す。

8.2.3 静的意味論: IsConstantDeclaration : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

LexicalDeclaration : LetOrConst BindingList ;
  1. LetOrConst の IsConstantDeclaration を返す。
LetOrConst : let
  1. false を返す。
LetOrConst : const
  1. true を返す。
FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody } function ( FormalParameters ) { FunctionBody } GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } function * ( FormalParameters ) { GeneratorBody } AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } async function * ( FormalParameters ) { AsyncGeneratorBody } AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } async function ( FormalParameters ) { AsyncFunctionBody }
  1. false を返す。
ClassDeclaration : class BindingIdentifier ClassTail class ClassTail
  1. false を返す。
ExportDeclaration : export ExportFromClause FromClause ; export NamedExports ; export default AssignmentExpression ;
  1. false を返す。
Note

export default AssignmentExpression を定数宣言として扱う必要はない。モジュールの default オブジェクトを参照する内部束縛名に代入できる構文は存在しないためである。

8.2.4 静的意味論: LexicallyDeclaredNames : 文字列の List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Block : { }
  1. 新しい空の List を返す。
StatementList : StatementList StatementListItem
  1. names1StatementList の LexicallyDeclaredNames とする。
  2. names2StatementListItem の LexicallyDeclaredNames とする。
  3. names1names2リスト結合を返す。
StatementListItem : Statement
  1. Statement Statement : LabelledStatement であれば、LabelledStatement の LexicallyDeclaredNames を返す。
  2. 新しい空の List を返す。
StatementListItem : Declaration
  1. Declaration の BoundNames を返す。
CaseBlock : { }
  1. 新しい空の List を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら names1 をその LexicallyDeclaredNames、存在しないなら新しい空の List とする。
  2. names2DefaultClause の LexicallyDeclaredNames とする。
  3. 2番目の CaseClauses が存在するなら names3 をその LexicallyDeclaredNames、存在しないなら新しい空の List とする。
  4. names1, names2, names3リスト結合を返す。
CaseClauses : CaseClauses CaseClause
  1. names1CaseClauses の LexicallyDeclaredNames とする。
  2. names2CaseClause の LexicallyDeclaredNames とする。
  3. names1names2リスト結合を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するならその LexicallyDeclaredNames を返す。
  2. 新しい空の List を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するならその LexicallyDeclaredNames を返す。
  2. 新しい空の List を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. LabelledItem の LexicallyDeclaredNames を返す。
LabelledItem : Statement
  1. 新しい空の List を返す。
LabelledItem : FunctionDeclaration
  1. FunctionDeclaration の BoundNames を返す。
FunctionStatementList : [empty]
  1. 新しい空の List を返す。
FunctionStatementList : StatementList
  1. StatementList の TopLevelLexicallyDeclaredNames を返す。
ClassStaticBlockStatementList : [empty]
  1. 新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
  1. StatementList の TopLevelLexicallyDeclaredNames を返す。
ConciseBody : ExpressionBody
  1. 新しい空の List を返す。
AsyncConciseBody : ExpressionBody
  1. 新しい空の List を返す。
Script : [empty]
  1. 新しい空の List を返す。
ScriptBody : StatementList
  1. StatementList の TopLevelLexicallyDeclaredNames を返す。
Note 1

Script の最上位では function 宣言は lexical 宣言ではなく var 宣言として扱われる。

Note 2

Module の LexicallyDeclaredNames にはその全ての import された束縛の名前が含まれる。

ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemList の LexicallyDeclaredNames とする。
  2. names2ModuleItem の LexicallyDeclaredNames とする。
  3. names1names2リスト結合を返す。
ModuleItem : ImportDeclaration
  1. ImportDeclaration の BoundNames を返す。
ModuleItem : ExportDeclaration
  1. ExportDeclarationexport VariableStatement であれば新しい空の List を返す。
  2. ExportDeclaration の BoundNames を返す。
ModuleItem : StatementListItem
  1. StatementListItem の LexicallyDeclaredNames を返す。
Note 3

Module の最上位では function 宣言は var 宣言ではなく lexical 宣言として扱われる。

8.2.5 静的意味論: LexicallyScopedDeclarations : Parse Node の List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

StatementList : StatementList StatementListItem
  1. declarations1StatementList の LexicallyScopedDeclarations とする。
  2. declarations2StatementListItem の LexicallyScopedDeclarations とする。
  3. declarations1declarations2リスト結合を返す。
StatementListItem : Statement
  1. Statement Statement : LabelledStatement なら LabelledStatement の LexicallyScopedDeclarations を返す。
  2. 新しい空の List を返す。
StatementListItem : Declaration
  1. Declaration の DeclarationPart を唯一の要素とする List を返す。
CaseBlock : { }
  1. 新しい空の List を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら declarations1 をその LexicallyScopedDeclarations、存在しないなら新しい空の List とする。
  2. declarations2DefaultClause の LexicallyScopedDeclarations とする。
  3. 2番目の CaseClauses が存在するなら declarations3 をその LexicallyScopedDeclarations、存在しないなら新しい空の List とする。
  4. declarations1, declarations2, declarations3リスト結合を返す。
CaseClauses : CaseClauses CaseClause
  1. declarations1CaseClauses の LexicallyScopedDeclarations とする。
  2. declarations2CaseClause の LexicallyScopedDeclarations とする。
  3. declarations1declarations2リスト結合を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するならその LexicallyScopedDeclarations を返す。
  2. 新しい空の List を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するならその LexicallyScopedDeclarations を返す。
  2. 新しい空の List を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. LabelledItem の LexicallyScopedDeclarations を返す。
LabelledItem : Statement
  1. 新しい空の List を返す。
LabelledItem : FunctionDeclaration
  1. « FunctionDeclaration » を返す。
FunctionStatementList : [empty]
  1. 新しい空の List を返す。
FunctionStatementList : StatementList
  1. StatementList の TopLevelLexicallyScopedDeclarations を返す。
ClassStaticBlockStatementList : [empty]
  1. 新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
  1. StatementList の TopLevelLexicallyScopedDeclarations を返す。
ConciseBody : ExpressionBody
  1. 新しい空の List を返す。
AsyncConciseBody : ExpressionBody
  1. 新しい空の List を返す。
Script : [empty]
  1. 新しい空の List を返す。
ScriptBody : StatementList
  1. StatementList の TopLevelLexicallyScopedDeclarations を返す。
Module : [empty]
  1. 新しい空の List を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. declarations1ModuleItemList の LexicallyScopedDeclarations とする。
  2. declarations2ModuleItem の LexicallyScopedDeclarations とする。
  3. declarations1declarations2リスト結合を返す。
ModuleItem : ImportDeclaration
  1. 新しい空の List を返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ; export VariableStatement
  1. 新しい空の List を返す。
ExportDeclaration : export Declaration
  1. DeclarationPart が Declaration である要素のみを持つ List を返す。
ExportDeclaration : export default HoistableDeclaration
  1. DeclarationPart が HoistableDeclaration である唯一の要素を持つ List を返す。
ExportDeclaration : export default ClassDeclaration
  1. 唯一の要素が ClassDeclaration である List を返す。
ExportDeclaration : export default AssignmentExpression ;
  1. 唯一の要素がこの ExportDeclaration である List を返す。

8.2.6 静的意味論: VarDeclaredNames : 文字列の List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Statement : EmptyStatement ExpressionStatement ContinueStatement BreakStatement ReturnStatement ThrowStatement DebuggerStatement
  1. 新しい空の List を返す。
Block : { }
  1. 新しい空の List を返す。
StatementList : StatementList StatementListItem
  1. names1StatementList の VarDeclaredNames とする。
  2. names2StatementListItem の VarDeclaredNames とする。
  3. names1names2リスト結合を返す。
StatementListItem : Declaration
  1. 新しい空の List を返す。
VariableStatement : var VariableDeclarationList ;
  1. VariableDeclarationList の BoundNames を返す。
IfStatement : if ( Expression ) Statement else Statement
  1. names1 を最初の Statement の VarDeclaredNames とする。
  2. names2 を2番目の Statement の VarDeclaredNames とする。
  3. names1names2リスト結合を返す。
IfStatement : if ( Expression ) Statement
  1. Statement の VarDeclaredNames を返す。
DoWhileStatement : do Statement while ( Expression ) ;
  1. Statement の VarDeclaredNames を返す。
WhileStatement : while ( Expression ) Statement
  1. Statement の VarDeclaredNames を返す。
ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
  1. Statement の VarDeclaredNames を返す。
ForStatement : for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
  1. names1VariableDeclarationList の BoundNames とする。
  2. names2Statement の VarDeclaredNames とする。
  3. names1names2リスト結合を返す。
ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. Statement の VarDeclaredNames を返す。
ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  1. Statement の VarDeclaredNames を返す。
ForInOfStatement : for ( var ForBinding in Expression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement
  1. names1 を « ForBinding » とする。
  2. names2Statement の VarDeclaredNames とする。
  3. names1names2リスト結合を返す。
Note

本節は付録 B.3.5 により拡張される。

WithStatement : with ( Expression ) Statement
  1. Statement の VarDeclaredNames を返す。
SwitchStatement : switch ( Expression ) CaseBlock
  1. CaseBlock の VarDeclaredNames を返す。
CaseBlock : { }
  1. 新しい空の List を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら names1 をその VarDeclaredNames、存在しないなら新しい空の List とする。
  2. names2DefaultClause の VarDeclaredNames とする。
  3. 2番目の CaseClauses が存在するなら names3 をその VarDeclaredNames、存在しないなら新しい空の List とする。
  4. names1, names2, names3リスト結合を返す。
CaseClauses : CaseClauses CaseClause
  1. names1CaseClauses の VarDeclaredNames とする。
  2. names2CaseClause の VarDeclaredNames とする。
  3. names1names2リスト結合を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するならその VarDeclaredNames を返す。
  2. 新しい空の List を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するならその VarDeclaredNames を返す。
  2. 新しい空の List を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. LabelledItem の VarDeclaredNames を返す。
LabelledItem : FunctionDeclaration
  1. 新しい空の List を返す。
TryStatement : try Block Catch
  1. names1Block の VarDeclaredNames とする。
  2. names2Catch の VarDeclaredNames とする。
  3. names1names2リスト結合を返す。
TryStatement : try Block Finally
  1. names1Block の VarDeclaredNames とする。
  2. names2Finally の VarDeclaredNames とする。
  3. names1names2リスト結合を返す。
TryStatement : try Block Catch Finally
  1. names1Block の VarDeclaredNames とする。
  2. names2Catch の VarDeclaredNames とする。
  3. names3Finally の VarDeclaredNames とする。
  4. names1, names2, names3リスト結合を返す。
Catch : catch ( CatchParameter ) Block
  1. Block の VarDeclaredNames を返す。
FunctionStatementList : [empty]
  1. 新しい空の List を返す。
FunctionStatementList : StatementList
  1. StatementList の TopLevelVarDeclaredNames を返す。
ClassStaticBlockStatementList : [empty]
  1. 新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
  1. StatementList の TopLevelVarDeclaredNames を返す。
ConciseBody : ExpressionBody
  1. 新しい空の List を返す。
AsyncConciseBody : ExpressionBody
  1. 新しい空の List を返す。
Script : [empty]
  1. 新しい空の List を返す。
ScriptBody : StatementList
  1. StatementList の TopLevelVarDeclaredNames を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemList の VarDeclaredNames とする。
  2. names2ModuleItem の VarDeclaredNames とする。
  3. names1names2リスト結合を返す。
ModuleItem : ImportDeclaration
  1. 新しい空の List を返す。
ModuleItem : ExportDeclaration
  1. ExportDeclarationexport VariableStatement であれば ExportDeclaration の BoundNames を返す。
  2. 新しい空の List を返す。

8.2.7 静的意味論: VarScopedDeclarations : Parse Node の List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Statement : EmptyStatement ExpressionStatement ContinueStatement BreakStatement ReturnStatement ThrowStatement DebuggerStatement
  1. 新しい空の List を返す。
Block : { }
  1. 新しい空の List を返す。
StatementList : StatementList StatementListItem
  1. declarations1StatementList の VarScopedDeclarations とする。
  2. declarations2StatementListItem の VarScopedDeclarations とする。
  3. declarations1declarations2リスト結合を返す。
StatementListItem : Declaration
  1. 新しい空の List を返す。
VariableDeclarationList : VariableDeclaration
  1. « VariableDeclaration » を返す。
VariableDeclarationList : VariableDeclarationList , VariableDeclaration
  1. declarations1VariableDeclarationList の VarScopedDeclarations とする。
  2. declarations1 と « VariableDeclaration » のリスト結合を返す。
IfStatement : if ( Expression ) Statement else Statement
  1. declarations1 を最初の Statement の VarScopedDeclarations とする。
  2. declarations2 を2番目の Statement の VarScopedDeclarations とする。
  3. declarations1declarations2リスト結合を返す。
IfStatement : if ( Expression ) Statement
  1. Statement の VarScopedDeclarations を返す。
DoWhileStatement : do Statement while ( Expression ) ;
  1. Statement の VarScopedDeclarations を返す。
WhileStatement : while ( Expression ) Statement
  1. Statement の VarScopedDeclarations を返す。
ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
  1. Statement の VarScopedDeclarations を返す。
ForStatement : for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
  1. declarations1VariableDeclarationList の VarScopedDeclarations とする。
  2. declarations2Statement の VarScopedDeclarations とする。
  3. declarations1declarations2リスト結合を返す。
ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. Statement の VarScopedDeclarations を返す。
ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  1. Statement の VarScopedDeclarations を返す。
ForInOfStatement : for ( var ForBinding in Expression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement
  1. declarations1 を « ForBinding » とする。
  2. declarations2Statement の VarScopedDeclarations とする。
  3. declarations1declarations2リスト結合を返す。
Note

本節は付録 B.3.5 により拡張される。

WithStatement : with ( Expression ) Statement
  1. Statement の VarScopedDeclarations を返す。
SwitchStatement : switch ( Expression ) CaseBlock
  1. CaseBlock の VarScopedDeclarations を返す。
CaseBlock : { }
  1. 新しい空の List を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら declarations1 をその VarScopedDeclarations、存在しないなら新しい空の List とする。
  2. declarations2DefaultClause の VarScopedDeclarations とする。
  3. 2番目の CaseClauses が存在するなら declarations3 をその VarScopedDeclarations、存在しないなら新しい空の List とする。
  4. declarations1, declarations2, declarations3リスト結合を返す。
CaseClauses : CaseClauses CaseClause
  1. declarations1CaseClauses の VarScopedDeclarations とする。
  2. declarations2CaseClause の VarScopedDeclarations とする。
  3. declarations1declarations2リスト結合を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するならその VarScopedDeclarations を返す。
  2. 新しい空の List を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するならその VarScopedDeclarations を返す。
  2. 新しい空の List を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. LabelledItem の VarScopedDeclarations を返す。
LabelledItem : Statement
  1. Statement Statement : LabelledStatement なら Statement の VarScopedDeclarations を返す。
  2. Statement の VarScopedDeclarations を返す。
LabelledItem : FunctionDeclaration
  1. « FunctionDeclaration » を返す。
FunctionStatementList : [empty]
  1. 新しい空の List を返す。
FunctionStatementList : StatementList
  1. StatementList の TopLevelVarScopedDeclarations を返す。
ClassStaticBlockStatementList : [empty]
  1. 新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
  1. StatementList の TopLevelVarScopedDeclarations を返す。
ConciseBody : ExpressionBody
  1. 新しい空の List を返す。
AsyncConciseBody : ExpressionBody
  1. 新しい空の List を返す。
Script : [empty]
  1. 新しい空の List を返す。
ScriptBody : StatementList
  1. StatementList の TopLevelVarScopedDeclarations を返す。
Module : [empty]
  1. 新しい空の List を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. declarations1ModuleItemList の VarScopedDeclarations とする。
  2. declarations2ModuleItem の VarScopedDeclarations とする。
  3. declarations1declarations2リスト結合を返す。
ModuleItem : ImportDeclaration
  1. 新しい空の List を返す。
ModuleItem : ExportDeclaration
  1. ExportDeclarationexport VariableStatement であれば VariableStatement の VarScopedDeclarations を返す。
  2. 新しい空の List を返す。

8.2.8 静的意味論: TopLevelLexicallyDeclaredNames : 文字列の List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

StatementList : StatementList StatementListItem
  1. names1StatementList の TopLevelLexicallyDeclaredNames とする。
  2. names2StatementListItem の TopLevelLexicallyDeclaredNames とする。
  3. names1names2リスト結合を返す。
StatementListItem : Statement
  1. 新しい空の List を返す。
StatementListItem : Declaration
  1. Declaration Declaration : HoistableDeclaration であれば
    1. 新しい空の List を返す。
  2. Declaration の BoundNames を返す。
Note

関数またはスクリプトの最上位では function 宣言は lexical 宣言ではなく var 宣言として扱われる。

8.2.9 静的意味論: TopLevelLexicallyScopedDeclarations : Parse Node の List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

StatementList : StatementList StatementListItem
  1. declarations1StatementList の TopLevelLexicallyScopedDeclarations とする。
  2. declarations2StatementListItem の TopLevelLexicallyScopedDeclarations とする。
  3. declarations1declarations2リスト結合を返す。
StatementListItem : Statement
  1. 新しい空の List を返す。
StatementListItem : Declaration
  1. Declaration Declaration : HoistableDeclaration であれば
    1. 新しい空の List を返す。
  2. « Declaration » を返す。

8.2.10 静的意味論: TopLevelVarDeclaredNames : 文字列の List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

StatementList : StatementList StatementListItem
  1. names1StatementList の TopLevelVarDeclaredNames とする。
  2. names2StatementListItem の TopLevelVarDeclaredNames とする。
  3. names1names2リスト結合を返す。
StatementListItem : Declaration
  1. Declaration Declaration : HoistableDeclaration であれば
    1. HoistableDeclaration の BoundNames を返す。
  2. 新しい空の List を返す。
StatementListItem : Statement
  1. Statement Statement : LabelledStatement なら Statement の TopLevelVarDeclaredNames を返す。
  2. Statement の VarDeclaredNames を返す。
Note

関数またはスクリプトの最上位では内部の function 宣言は var 宣言として扱われる。

LabelledStatement : LabelIdentifier : LabelledItem
  1. LabelledItem の TopLevelVarDeclaredNames を返す。
LabelledItem : Statement
  1. Statement Statement : LabelledStatement なら Statement の TopLevelVarDeclaredNames を返す。
  2. Statement の VarDeclaredNames を返す。
LabelledItem : FunctionDeclaration
  1. FunctionDeclaration の BoundNames を返す。

8.2.11 静的意味論: TopLevelVarScopedDeclarations : Parse Node の List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

StatementList : StatementList StatementListItem
  1. declarations1StatementList の TopLevelVarScopedDeclarations とする。
  2. declarations2StatementListItem の TopLevelVarScopedDeclarations とする。
  3. declarations1declarations2リスト結合を返す。
StatementListItem : Statement
  1. Statement Statement : LabelledStatement なら Statement の TopLevelVarScopedDeclarations を返す。
  2. Statement の VarScopedDeclarations を返す。
StatementListItem : Declaration
  1. Declaration Declaration : HoistableDeclaration であれば
    1. declarationHoistableDeclaration の DeclarationPart とする。
    2. « declaration » を返す。
  2. 新しい空の List を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. LabelledItem の TopLevelVarScopedDeclarations を返す。
LabelledItem : Statement
  1. Statement Statement : LabelledStatement なら Statement の TopLevelVarScopedDeclarations を返す。
  2. Statement の VarScopedDeclarations を返す。
LabelledItem : FunctionDeclaration
  1. « FunctionDeclaration » を返す。

8.3 ラベル (Labels)

8.3.1 静的意味論: ContainsDuplicateLabels : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Statement : VariableStatement EmptyStatement ExpressionStatement ContinueStatement BreakStatement ReturnStatement ThrowStatement DebuggerStatement Block : { } StatementListItem : Declaration
  1. false を返す。
StatementList : StatementList StatementListItem
  1. hasDuplicatesStatementList の ContainsDuplicateLabels (引数 labelSet) とする。
  2. hasDuplicatestrue なら true を返す。
  3. StatementListItem の ContainsDuplicateLabels (引数 labelSet) を返す。
IfStatement : if ( Expression ) Statement else Statement
  1. hasDuplicate を 最初の Statement の ContainsDuplicateLabels (引数 labelSet) とする。
  2. hasDuplicatetrue なら true を返す。
  3. 2番目の Statement の ContainsDuplicateLabels (引数 labelSet) を返す。
IfStatement : if ( Expression ) Statement
  1. Statement の ContainsDuplicateLabels (引数 labelSet) を返す。
DoWhileStatement : do Statement while ( Expression ) ;
  1. Statement の ContainsDuplicateLabels (引数 labelSet) を返す。
WhileStatement : while ( Expression ) Statement
  1. Statement の ContainsDuplicateLabels (引数 labelSet) を返す。
ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. Statement の ContainsDuplicateLabels (引数 labelSet) を返す。
ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( var ForBinding in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  1. Statement の ContainsDuplicateLabels (引数 labelSet) を返す。
Note

本節は付録 B.3.5 により拡張される。

WithStatement : with ( Expression ) Statement
  1. Statement の ContainsDuplicateLabels (引数 labelSet) を返す。
SwitchStatement : switch ( Expression ) CaseBlock
  1. CaseBlock の ContainsDuplicateLabels (引数 labelSet) を返す。
CaseBlock : { }
  1. false を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら
    1. 最初の CaseClauses の ContainsDuplicateLabels (引数 labelSet) が true なら true を返す。
  2. DefaultClause の ContainsDuplicateLabels (引数 labelSet) が true なら true を返す。
  3. 2番目の CaseClauses が存在しないなら false を返す。
  4. 2番目の CaseClauses の ContainsDuplicateLabels (引数 labelSet) を返す。
CaseClauses : CaseClauses CaseClause
  1. hasDuplicatesCaseClauses の ContainsDuplicateLabels (引数 labelSet) とする。
  2. hasDuplicatestrue なら true を返す。
  3. CaseClause の ContainsDuplicateLabels (引数 labelSet) を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するなら StatementList の ContainsDuplicateLabels (引数 labelSet) を返す。
  2. false を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するなら StatementList の ContainsDuplicateLabels (引数 labelSet) を返す。
  2. false を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. labelLabelIdentifier の StringValue とする。
  2. labelSetlabel を含むなら true を返す。
  3. newLabelSetlabelSet と « label » のリスト結合とする。
  4. LabelledItem の ContainsDuplicateLabels (引数 newLabelSet) を返す。
LabelledItem : FunctionDeclaration
  1. false を返す。
TryStatement : try Block Catch
  1. hasDuplicatesBlock の ContainsDuplicateLabels (引数 labelSet) とする。
  2. hasDuplicatestrue なら true を返す。
  3. Catch の ContainsDuplicateLabels (引数 labelSet) を返す。
TryStatement : try Block Finally
  1. hasDuplicatesBlock の ContainsDuplicateLabels (引数 labelSet) とする。
  2. hasDuplicatestrue なら true を返す。
  3. Finally の ContainsDuplicateLabels (引数 labelSet) を返す。
TryStatement : try Block Catch Finally
  1. Block の ContainsDuplicateLabels (引数 labelSet) が true なら true を返す。
  2. Catch の ContainsDuplicateLabels (引数 labelSet) が true なら true を返す。
  3. Finally の ContainsDuplicateLabels (引数 labelSet) を返す。
Catch : catch ( CatchParameter ) Block
  1. Block の ContainsDuplicateLabels (引数 labelSet) を返す。
FunctionStatementList : [empty]
  1. false を返す。
ClassStaticBlockStatementList : [empty]
  1. false を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. hasDuplicatesModuleItemList の ContainsDuplicateLabels (引数 labelSet) とする。
  2. hasDuplicatestrue なら true を返す。
  3. ModuleItem の ContainsDuplicateLabels (引数 labelSet) を返す。
ModuleItem : ImportDeclaration ExportDeclaration
  1. false を返す。

8.3.2 静的意味論: ContainsUndefinedBreakTarget : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Statement : VariableStatement EmptyStatement ExpressionStatement ContinueStatement ReturnStatement ThrowStatement DebuggerStatement Block : { } StatementListItem : Declaration
  1. false を返す。
StatementList : StatementList StatementListItem
  1. hasUndefinedLabelsStatementList の ContainsUndefinedBreakTarget (引数 labelSet) とする。
  2. hasUndefinedLabelstrue なら true を返す。
  3. StatementListItem の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
IfStatement : if ( Expression ) Statement else Statement
  1. hasUndefinedLabels を 最初の Statement の ContainsUndefinedBreakTarget (引数 labelSet) とする。
  2. hasUndefinedLabelstrue なら true を返す。
  3. 2番目の Statement の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
IfStatement : if ( Expression ) Statement
  1. Statement の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
DoWhileStatement : do Statement while ( Expression ) ;
  1. Statement の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
WhileStatement : while ( Expression ) Statement
  1. Statement の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. Statement の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( var ForBinding in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  1. Statement の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
Note

本節は付録 B.3.5 により拡張される。

BreakStatement : break ;
  1. false を返す。
BreakStatement : break LabelIdentifier ;
  1. labelSetLabelIdentifier の StringValue を含まないなら true を返す。
  2. false を返す。
WithStatement : with ( Expression ) Statement
  1. Statement の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
SwitchStatement : switch ( Expression ) CaseBlock
  1. CaseBlock の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
CaseBlock : { }
  1. false を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら
    1. 最初の CaseClauses の ContainsUndefinedBreakTarget (引数 labelSet) が true なら true を返す。
  2. DefaultClause の ContainsUndefinedBreakTarget (引数 labelSet) が true なら true を返す。
  3. 2番目の CaseClauses が存在しないなら false を返す。
  4. 2番目の CaseClauses の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
CaseClauses : CaseClauses CaseClause
  1. hasUndefinedLabelsCaseClauses の ContainsUndefinedBreakTarget (引数 labelSet) とする。
  2. hasUndefinedLabelstrue なら true を返す。
  3. CaseClause の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するなら StatementList の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
  2. false を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するなら StatementList の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
  2. false を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. labelLabelIdentifier の StringValue とする。
  2. newLabelSetlabelSet と « label » のリスト結合とする。
  3. LabelledItem の ContainsUndefinedBreakTarget (引数 newLabelSet) を返す。
LabelledItem : FunctionDeclaration
  1. false を返す。
TryStatement : try Block Catch
  1. hasUndefinedLabelsBlock の ContainsUndefinedBreakTarget (引数 labelSet) とする。
  2. hasUndefinedLabelstrue なら true を返す。
  3. Catch の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
TryStatement : try Block Finally
  1. hasUndefinedLabelsBlock の ContainsUndefinedBreakTarget (引数 labelSet) とする。
  2. hasUndefinedLabelstrue なら true を返す。
  3. Finally の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
TryStatement : try Block Catch Finally
  1. Block の ContainsUndefinedBreakTarget (引数 labelSet) が true なら true を返す。
  2. Catch の ContainsUndefinedBreakTarget (引数 labelSet) が true なら true を返す。
  3. Finally の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
Catch : catch ( CatchParameter ) Block
  1. Block の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
FunctionStatementList : [empty]
  1. false を返す。
ClassStaticBlockStatementList : [empty]
  1. false を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. hasUndefinedLabelsModuleItemList の ContainsUndefinedBreakTarget (引数 labelSet) とする。
  2. hasUndefinedLabelstrue なら true を返す。
  3. ModuleItem の ContainsUndefinedBreakTarget (引数 labelSet) を返す。
ModuleItem : ImportDeclaration ExportDeclaration
  1. false を返す。

8.3.3 静的意味論: ContainsUndefinedContinueTarget : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Statement : VariableStatement EmptyStatement ExpressionStatement BreakStatement ReturnStatement ThrowStatement DebuggerStatement Block : { } StatementListItem : Declaration
  1. false を返す。
Statement : BlockStatement
  1. BlockStatement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
BreakableStatement : IterationStatement
  1. newIterationSetiterationSetlabelSetリスト結合とする。
  2. IterationStatement の ContainsUndefinedContinueTarget (引数 newIterationSet と « ») を返す。
StatementList : StatementList StatementListItem
  1. hasUndefinedLabelsStatementList の ContainsUndefinedContinueTarget (引数 iterationSet と « ») とする。
  2. hasUndefinedLabelstrue なら true を返す。
  3. StatementListItem の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
IfStatement : if ( Expression ) Statement else Statement
  1. hasUndefinedLabels を 最初の Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») とする。
  2. hasUndefinedLabelstrue なら true を返す。
  3. 2番目の Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
IfStatement : if ( Expression ) Statement
  1. Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
DoWhileStatement : do Statement while ( Expression ) ;
  1. Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
WhileStatement : while ( Expression ) Statement
  1. Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( var ForBinding in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  1. Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
Note

本節は付録 B.3.5 により拡張される。

ContinueStatement : continue ;
  1. false を返す。
ContinueStatement : continue LabelIdentifier ;
  1. iterationSetLabelIdentifier の StringValue を含まないなら true を返す。
  2. false を返す。
WithStatement : with ( Expression ) Statement
  1. Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
SwitchStatement : switch ( Expression ) CaseBlock
  1. CaseBlock の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
CaseBlock : { }
  1. false を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら
    1. 最初の CaseClauses の ContainsUndefinedContinueTarget (引数 iterationSet と « ») が true なら true を返す。
  2. DefaultClause の ContainsUndefinedContinueTarget (引数 iterationSet と « ») が true なら true を返す。
  3. 2番目の CaseClauses が存在しないなら false を返す。
  4. 2番目の CaseClauses の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
CaseClauses : CaseClauses CaseClause
  1. hasUndefinedLabelsCaseClauses の ContainsUndefinedContinueTarget (引数 iterationSet と « ») とする。
  2. hasUndefinedLabelstrue なら true を返す。
  3. CaseClause の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するなら StatementList の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
  2. false を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するなら StatementList の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
  2. false を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. labelLabelIdentifier の StringValue とする。
  2. newLabelSetlabelSet と « label » のリスト結合とする。
  3. LabelledItem の ContainsUndefinedContinueTarget (引数 iterationSetnewLabelSet) を返す。
LabelledItem : FunctionDeclaration
  1. false を返す。
TryStatement : try Block Catch
  1. hasUndefinedLabelsBlock の ContainsUndefinedContinueTarget (引数 iterationSet と « ») とする。
  2. hasUndefinedLabelstrue なら true を返す。
  3. Catch の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
TryStatement : try Block Finally
  1. hasUndefinedLabelsBlock の ContainsUndefinedContinueTarget (引数 iterationSet と « ») とする。
  2. hasUndefinedLabelstrue なら true を返す。
  3. Finally の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
TryStatement : try Block Catch Finally
  1. Block の ContainsUndefinedContinueTarget (引数 iterationSet と « ») が true なら true を返す。
  2. Catch の ContainsUndefinedContinueTarget (引数 iterationSet と « ») が true なら true を返す。
  3. Finally の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
Catch : catch ( CatchParameter ) Block
  1. Block の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
FunctionStatementList : [empty]
  1. false を返す。
ClassStaticBlockStatementList : [empty]
  1. false を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. hasUndefinedLabelsModuleItemList の ContainsUndefinedContinueTarget (引数 iterationSet と « ») とする。
  2. hasUndefinedLabelstrue なら true を返す。
  3. ModuleItem の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
ModuleItem : ImportDeclaration ExportDeclaration
  1. false を返す。

8.4 関数名の推論 (Function Name Inference)

8.4.1 静的意味論: HasName : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprCoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。
  2. IsFunctionDefinition of exprfalse なら false を返す。
  3. expr の HasName を返す。
FunctionExpression : function ( FormalParameters ) { FunctionBody } GeneratorExpression : function * ( FormalParameters ) { GeneratorBody } AsyncGeneratorExpression : async function * ( FormalParameters ) { AsyncGeneratorBody } AsyncFunctionExpression : async function ( FormalParameters ) { AsyncFunctionBody } ArrowFunction : ArrowParameters => ConciseBody AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody ClassExpression : class ClassTail
  1. false を返す。
FunctionExpression : function BindingIdentifier ( FormalParameters ) { FunctionBody } GeneratorExpression : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } AsyncGeneratorExpression : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } AsyncFunctionExpression : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } ClassExpression : class BindingIdentifier ClassTail
  1. true を返す。

8.4.2 静的意味論: IsFunctionDefinition : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprCoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。
  2. expr の IsFunctionDefinition を返す。
PrimaryExpression : this IdentifierReference Literal ArrayLiteral ObjectLiteral RegularExpressionLiteral TemplateLiteral MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName MemberExpression TemplateLiteral SuperProperty MetaProperty new MemberExpression Arguments MemberExpression . PrivateIdentifier NewExpression : new NewExpression LeftHandSideExpression : CallExpression OptionalExpression UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- ++ UnaryExpression -- UnaryExpression UnaryExpression : delete UnaryExpression void UnaryExpression typeof UnaryExpression + UnaryExpression - UnaryExpression ~ UnaryExpression ! UnaryExpression AwaitExpression ExponentiationExpression : UpdateExpression ** ExponentiationExpression MultiplicativeExpression : MultiplicativeExpression MultiplicativeOperator ExponentiationExpression AdditiveExpression : AdditiveExpression + MultiplicativeExpression AdditiveExpression - MultiplicativeExpression ShiftExpression : ShiftExpression << AdditiveExpression ShiftExpression >> AdditiveExpression ShiftExpression >>> AdditiveExpression RelationalExpression : RelationalExpression < ShiftExpression RelationalExpression > ShiftExpression RelationalExpression <= ShiftExpression RelationalExpression >= ShiftExpression RelationalExpression instanceof ShiftExpression RelationalExpression in ShiftExpression PrivateIdentifier in ShiftExpression EqualityExpression : EqualityExpression == RelationalExpression EqualityExpression != RelationalExpression EqualityExpression === RelationalExpression EqualityExpression !== RelationalExpression BitwiseANDExpression : BitwiseANDExpression & EqualityExpression BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression LogicalANDExpression : LogicalANDExpression && BitwiseORExpression LogicalORExpression : LogicalORExpression || LogicalANDExpression CoalesceExpression : CoalesceExpressionHead ?? BitwiseORExpression ConditionalExpression : ShortCircuitExpression ? AssignmentExpression : AssignmentExpression AssignmentExpression : YieldExpression LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression LeftHandSideExpression &&= AssignmentExpression LeftHandSideExpression ||= AssignmentExpression LeftHandSideExpression ??= AssignmentExpression Expression : Expression , AssignmentExpression
  1. false を返す。
AssignmentExpression : ArrowFunction AsyncArrowFunction FunctionExpression : function BindingIdentifieropt ( FormalParameters ) { FunctionBody } GeneratorExpression : function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody } AsyncGeneratorExpression : async function * BindingIdentifieropt ( FormalParameters ) { AsyncGeneratorBody } AsyncFunctionExpression : async function BindingIdentifieropt ( FormalParameters ) { AsyncFunctionBody } ClassExpression : class BindingIdentifieropt ClassTail
  1. true を返す。

8.4.3 静的意味論: IsAnonymousFunctionDefinition ( expr: AssignmentExpression 生成句ノード, Initializer 生成句ノード, または Expression 生成句ノード, ): Boolean

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 引数が名前を束縛しない関数定義かどうかを判定する。 It performs the following steps when called:

  1. IsFunctionDefinition of exprfalse なら false を返す。
  2. hasName を HasName of expr とする。
  3. hasNametrue なら false を返す。
  4. true を返す。

8.4.4 静的意味論: IsIdentifierRef : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

PrimaryExpression : IdentifierReference
  1. true を返す。
PrimaryExpression : this Literal ArrayLiteral ObjectLiteral FunctionExpression ClassExpression GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral CoverParenthesizedExpressionAndArrowParameterList MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName MemberExpression TemplateLiteral SuperProperty MetaProperty new MemberExpression Arguments MemberExpression . PrivateIdentifier NewExpression : new NewExpression LeftHandSideExpression : CallExpression OptionalExpression
  1. false を返す。

8.4.5 実行時意味論: NamedEvaluation : 関数オブジェクトを含む正常完了または異常完了

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprCoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。
  2. 引数 nameexpr の NamedEvaluation を ? 付きで返す。
ParenthesizedExpression : ( Expression )
  1. アサート: IsAnonymousFunctionDefinition(Expression) は true
  2. 引数 nameExpression の NamedEvaluation を ? 付きで返す。
FunctionExpression : function ( FormalParameters ) { FunctionBody }
  1. 引数 nameFunctionExpression の InstantiateOrdinaryFunctionExpression を返す。
GeneratorExpression : function * ( FormalParameters ) { GeneratorBody }
  1. 引数 nameGeneratorExpression の InstantiateGeneratorFunctionExpression を返す。
AsyncGeneratorExpression : async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. 引数 nameAsyncGeneratorExpression の InstantiateAsyncGeneratorFunctionExpression を返す。
AsyncFunctionExpression : async function ( FormalParameters ) { AsyncFunctionBody }
  1. 引数 nameAsyncFunctionExpression の InstantiateAsyncFunctionExpression を返す。
ArrowFunction : ArrowParameters => ConciseBody
  1. 引数 nameArrowFunction の InstantiateArrowFunctionExpression を返す。
AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
  1. 引数 nameAsyncArrowFunction の InstantiateAsyncArrowFunctionExpression を返す。
ClassExpression : class ClassTail
  1. sourceTextClassExpression によりマッチしたソーステキストとする。
  2. 引数 undefined, name, sourceTextClassTail の ClassDefinitionEvaluation を ? 付きで返す。

8.5 Contains

8.5.1 静的意味論: Contains : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

以下に列挙されていない本仕様中のすべての文法生成規則の代替は、暗黙的に次の既定の Contains 定義を持つ:

  1. この生成句ノードの各子ノード child について:
    1. childsymbol のインスタンスであるなら true を返す。
    2. child が非終端記号のインスタンスなら
      1. containedchild Contains symbol の結果とする。
      2. containedtrue なら true を返す。
  2. false を返す。
FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody } function ( FormalParameters ) { FunctionBody } FunctionExpression : function BindingIdentifieropt ( FormalParameters ) { FunctionBody } GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } function * ( FormalParameters ) { GeneratorBody } GeneratorExpression : function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody } AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } async function * ( FormalParameters ) { AsyncGeneratorBody } AsyncGeneratorExpression : async function * BindingIdentifieropt ( FormalParameters ) { AsyncGeneratorBody } AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } async function ( FormalParameters ) { AsyncFunctionBody } AsyncFunctionExpression : async function BindingIdentifieropt ( FormalParameters ) { AsyncFunctionBody }
  1. false を返す。
Note 1

部分構造に依存する静的意味規則は一般に関数定義内部を調べない。

ClassTail : ClassHeritageopt { ClassBody }
  1. symbolClassBody なら true を返す。
  2. symbolClassHeritage なら
    1. ClassHeritage が存在するなら true、そうでなければ false を返す。
  3. ClassHeritage が存在するなら
    1. ClassHeritage Contains symboltrue なら true を返す。
  4. 引数 symbolClassBody の ComputedPropertyContains の結果を返す。
Note 2

部分構造に依存する静的意味規則は一般にクラス本体内部(PropertyName 以外)を調べない。

ClassStaticBlock : static { ClassStaticBlockBody }
  1. false を返す。
Note 3

部分構造に依存する静的意味規則は一般に static 初期化ブロック内部を調べない。

ArrowFunction : ArrowParameters => ConciseBody
  1. symbolNewTarget, SuperProperty, SuperCall, super, this のいずれでもないなら false を返す。
  2. ArrowParameters Contains symboltrue なら true を返す。
  3. ConciseBody Contains symbol を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsCoverParenthesizedExpressionAndArrowParameterList により被覆される ArrowFormalParameters とする。
  2. formals Contains symbol を返す。
AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody
  1. symbolNewTarget, SuperProperty, SuperCall, super, this のいずれでもないなら false を返す。
  2. AsyncConciseBody Contains symbol を返す。
AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
  1. symbolNewTarget, SuperProperty, SuperCall, super, this のいずれでもないなら false を返す。
  2. headCoverCallExpressionAndAsyncArrowHead により被覆される AsyncArrowHead とする。
  3. head Contains symboltrue なら true を返す。
  4. AsyncConciseBody Contains symbol を返す。
Note 4

Contains は ArrowFunctionAsyncArrowFunction 内での new.target, this, super 使用を検出するために用いられる。

PropertyDefinition : MethodDefinition
  1. symbolMethodDefinition なら true を返す。
  2. 引数 symbolMethodDefinition の ComputedPropertyContains の結果を返す。
LiteralPropertyName : IdentifierName
  1. false を返す。
MemberExpression : MemberExpression . IdentifierName
  1. MemberExpression Contains symboltrue なら true を返す。
  2. false を返す。
SuperProperty : super . IdentifierName
  1. symbol が 予約語 super であるなら true を返す。
  2. false を返す。
CallExpression : CallExpression . IdentifierName
  1. CallExpression Contains symboltrue なら true を返す。
  2. false を返す。
OptionalChain : ?. IdentifierName
  1. false を返す。
OptionalChain : OptionalChain . IdentifierName
  1. OptionalChain Contains symboltrue なら true を返す。
  2. false を返す。

8.5.2 静的意味論: ComputedPropertyContains : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ClassElementName : PrivateIdentifier PropertyName : LiteralPropertyName
  1. false を返す。
PropertyName : ComputedPropertyName
  1. ComputedPropertyName Contains symbol の結果を返す。
MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. 引数 symbolClassElementName の ComputedPropertyContains の結果を返す。
GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }
  1. 引数 symbolClassElementName の ComputedPropertyContains の結果を返す。
AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. 引数 symbolClassElementName の ComputedPropertyContains の結果を返す。
ClassElementList : ClassElementList ClassElement
  1. inList を 引数 symbolClassElementList の ComputedPropertyContains とする。
  2. inListtrue なら true を返す。
  3. 引数 symbolClassElement の ComputedPropertyContains の結果を返す。
ClassElement : ClassStaticBlock
  1. false を返す。
ClassElement : ;
  1. false を返す。
AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. 引数 symbolClassElementName の ComputedPropertyContains の結果を返す。
FieldDefinition : ClassElementName Initializeropt
  1. 引数 symbolClassElementName の ComputedPropertyContains の結果を返す。

8.6 その他 (Miscellaneous)

これらの操作は仕様全体の複数箇所で使用される。

8.6.1 実行時意味論: InstantiateFunctionObject : ECMAScript 関数オブジェクト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody } function ( FormalParameters ) { FunctionBody }
  1. 引数 env, privateEnvFunctionDeclaration の InstantiateOrdinaryFunctionObject を返す。
GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } function * ( FormalParameters ) { GeneratorBody }
  1. 引数 env, privateEnvGeneratorDeclaration の InstantiateGeneratorFunctionObject を返す。
AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. 引数 env, privateEnvAsyncGeneratorDeclaration の InstantiateAsyncGeneratorFunctionObject を返す。
AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } async function ( FormalParameters ) { AsyncFunctionBody }
  1. 引数 env, privateEnvAsyncFunctionDeclaration の InstantiateAsyncFunctionObject を返す。

8.6.2 実行時意味論: BindingInitialization : unused を含む正常完了または異常完了

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

environmentundefined が渡されるのは、初期化値の代入に PutValue 操作を用いることを示す。これは var 文と(いくつかの)非 strict 関数の仮引数リストの場合である(10.2.11 参照)。その場合、束縛は初期化子の評価前に巻き上げられ事前初期化される。

It is defined piecewise over the following productions:

BindingIdentifier : Identifier
  1. nameIdentifier の StringValue とする。
  2. InitializeBoundName(name, value, environment) を返す。
BindingIdentifier : yield
  1. InitializeBoundName("yield", value, environment) を返す。
BindingIdentifier : await
  1. InitializeBoundName("await", value, environment) を返す。
BindingPattern : ObjectBindingPattern
  1. RequireObjectCoercible(value) を実行する。
  2. 引数 value, environmentObjectBindingPattern の BindingInitialization を ? 付きで返す。
BindingPattern : ArrayBindingPattern
  1. iteratorRecord を ? GetIterator(value, sync) とする。
  2. resultCompletion( 引数 iteratorRecord, environmentArrayBindingPattern の IteratorBindingInitialization ) とする。
  3. iteratorRecord.[[Done]]false なら ? IteratorClose(iteratorRecord, result) を返す。
  4. result を返す。
ObjectBindingPattern : { }
  1. unused を返す。
ObjectBindingPattern : { BindingPropertyList } { BindingPropertyList , }
  1. 引数 value, environmentBindingPropertyList の PropertyBindingInitialization を ? 付きで実行する。
  2. unused を返す。
ObjectBindingPattern : { BindingRestProperty }
  1. excludedNames を空の新 List とする。
  2. 引数 value, environment, excludedNamesBindingRestProperty の RestBindingInitialization を ? 付きで返す。
ObjectBindingPattern : { BindingPropertyList , BindingRestProperty }
  1. excludedNames を 引数 value, environmentBindingPropertyList の PropertyBindingInitialization (結果は ? ) とする。
  2. 引数 value, environment, excludedNamesBindingRestProperty の RestBindingInitialization を ? 付きで返す。

8.6.2.1 InitializeBoundName ( name, value, environment )

The abstract operation InitializeBoundName takes arguments name (String), value (ECMAScript 言語値), and environment (Environment Record または undefined) and returns unused を含む正常完了または異常完了. It performs the following steps when called:

  1. environmentundefined でないなら
    1. environment.InitializeBinding(name, value) を実行する。
    2. unused を返す。
  2. それ以外
    1. lhs を ? ResolveBinding(name) とする。
    2. PutValue(lhs, value) を返す。

8.6.3 実行時意味論: IteratorBindingInitialization : unused を含む正常完了または異常完了

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

environmentundefined が渡される場合は初期化値の代入に PutValue を使うことを示し、これは非 strict 関数の仮引数リストで発生する。その場合、同名パラメータの複数存在可能性に対処するため事前初期化される。

It is defined piecewise over the following productions:

ArrayBindingPattern : [ ]
  1. unused を返す。
ArrayBindingPattern : [ Elision ]
  1. 引数 iteratorRecordElision の IteratorDestructuringAssignmentEvaluation を ? 付きで返す。
ArrayBindingPattern : [ Elisionopt BindingRestElement ]
  1. Elision が存在するなら
    1. 引数 iteratorRecordElision の IteratorDestructuringAssignmentEvaluation を ? 付きで実行する。
  2. 引数 iteratorRecord, environmentBindingRestElement の IteratorBindingInitialization を ? 付きで返す。
ArrayBindingPattern : [ BindingElementList , Elision ]
  1. 引数 iteratorRecord, environmentBindingElementList の IteratorBindingInitialization を ? 付きで実行する。
  2. 引数 iteratorRecordElision の IteratorDestructuringAssignmentEvaluation を ? 付きで返す。
ArrayBindingPattern : [ BindingElementList , Elisionopt BindingRestElement ]
  1. 引数 iteratorRecord, environmentBindingElementList の IteratorBindingInitialization を ? 付きで実行する。
  2. Elision が存在するなら
    1. 引数 iteratorRecordElision の IteratorDestructuringAssignmentEvaluation を ? 付きで実行する。
  3. 引数 iteratorRecord, environmentBindingRestElement の IteratorBindingInitialization を ? 付きで返す。
BindingElementList : BindingElementList , BindingElisionElement
  1. 引数 iteratorRecord, environmentBindingElementList の IteratorBindingInitialization を ? 付きで実行する。
  2. 引数 iteratorRecord, environmentBindingElisionElement の IteratorBindingInitialization を ? 付きで返す。
BindingElisionElement : Elision BindingElement
  1. 引数 iteratorRecordElision の IteratorDestructuringAssignmentEvaluation を ? 付きで実行する。
  2. 引数 iteratorRecord, environmentBindingElement の IteratorBindingInitialization を ? 付きで返す。
SingleNameBinding : BindingIdentifier Initializeropt
  1. bindingIdBindingIdentifier の StringValue とする。
  2. lhs を ? ResolveBinding(bindingId, environment) とする。
  3. vundefined とする。
  4. iteratorRecord.[[Done]]false なら
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone でないなら
      1. vnext に設定する。
  5. Initializer が存在し vundefined なら
    1. IsAnonymousFunctionDefinition(Initializer) が true なら
      1. v を ? NamedEvaluation(Initializer, 引数 bindingId) に設定する。
    2. それ以外
      1. defaultValue を ? Evaluation(Initializer) とする。
      2. v を ? GetValue(defaultValue) に設定する。
  6. environmentundefined なら ? PutValue(lhs, v) を返す。
  7. InitializeReferencedBinding(lhs, v) を返す。
BindingElement : BindingPattern Initializeropt
  1. vundefined とする。
  2. iteratorRecord.[[Done]]false なら
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone でないなら
      1. vnext に設定する。
  3. Initializer が存在し vundefined なら
    1. defaultValue を ? Evaluation(Initializer) とする。
    2. v を ? GetValue(defaultValue) に設定する。
  4. 引数 v, environmentBindingPattern の BindingInitialization を ? 付きで返す。
BindingRestElement : ... BindingIdentifier
  1. lhs を ? ResolveBinding(StringValue of BindingIdentifier, environment) とする。
  2. A を ! ArrayCreate(0) とする。
  3. n を 0 とする。
  4. 繰り返し
    1. nextdone とする。
    2. iteratorRecord.[[Done]]false なら
      1. next を ? IteratorStepValue(iteratorRecord) に設定する。
    3. nextdone なら
      1. environmentundefined なら ? PutValue(lhs, A) を返す。
      2. InitializeReferencedBinding(lhs, A) を返す。
    4. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), next) を実行する。
    5. nn + 1 に設定する。
BindingRestElement : ... BindingPattern
  1. A を ! ArrayCreate(0) とする。
  2. n を 0 とする。
  3. 繰り返し
    1. nextdone とする。
    2. iteratorRecord.[[Done]]false なら
      1. next を ? IteratorStepValue(iteratorRecord) に設定する。
    3. nextdone なら
      1. 引数 A, environmentBindingPattern の BindingInitialization を ? 付きで返す。
    4. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), next) を実行する。
    5. nn + 1 に設定する。
FormalParameters : [empty]
  1. unused を返す。
FormalParameters : FormalParameterList , FunctionRestParameter
  1. 引数 iteratorRecord, environmentFormalParameterList の IteratorBindingInitialization を ? 付きで実行する。
  2. 引数 iteratorRecord, environmentFunctionRestParameter の IteratorBindingInitialization を ? 付きで返す。
FormalParameterList : FormalParameterList , FormalParameter
  1. 引数 iteratorRecord, environmentFormalParameterList の IteratorBindingInitialization を ? 付きで実行する。
  2. 引数 iteratorRecord, environmentFormalParameter の IteratorBindingInitialization を ? 付きで返す。
ArrowParameters : BindingIdentifier
  1. vundefined とする。
  2. アサート: iteratorRecord.[[Done]]false
  3. next を ? IteratorStepValue(iteratorRecord) とする。
  4. nextdone でないなら
    1. vnext に設定する。
  5. 引数 v, environmentBindingIdentifier の BindingInitialization を ? 付きで返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsCoverParenthesizedExpressionAndArrowParameterList により被覆される ArrowFormalParameters とする。
  2. 引数 iteratorRecord, environmentformals の IteratorBindingInitialization を ? 付きで返す。
AsyncArrowBindingIdentifier : BindingIdentifier
  1. vundefined とする。
  2. アサート: iteratorRecord.[[Done]]false
  3. next を ? IteratorStepValue(iteratorRecord) とする。
  4. nextdone でないなら
    1. vnext に設定する。
  5. 引数 v, environmentBindingIdentifier の BindingInitialization を ? 付きで返す。

8.6.4 静的意味論: AssignmentTargetType : simple, web-compat, または invalid

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

IdentifierReference : Identifier
  1. IsStrict(this IdentifierReference) が true かつ Identifier の StringValue が "eval" または "arguments" のいずれかなら invalid を返す。
  2. simple を返す。
IdentifierReference : yield await CallExpression : CallExpression [ Expression ] CallExpression . IdentifierName CallExpression . PrivateIdentifier MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName SuperProperty MemberExpression . PrivateIdentifier
  1. simple を返す。
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprCoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。
  2. expr の AssignmentTargetType を返す。
CallExpression : CoverCallExpressionAndAsyncArrowHead CallExpression Arguments
  1. Normative Optional
    ホストが Web ブラウザ又は 関数呼び出し代入ターゲットの実行時エラー をサポートし、かつ IsStrict(this CallExpression) が false なら
    1. web-compat を返す。
  2. invalid を返す。
PrimaryExpression : this Literal ArrayLiteral ObjectLiteral FunctionExpression ClassExpression GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral CallExpression : SuperCall ImportCall CallExpression TemplateLiteral NewExpression : new NewExpression MemberExpression : MemberExpression TemplateLiteral new MemberExpression Arguments NewTarget : new . target ImportMeta : import . meta LeftHandSideExpression : OptionalExpression UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- ++ UnaryExpression -- UnaryExpression UnaryExpression : delete UnaryExpression void UnaryExpression typeof UnaryExpression + UnaryExpression - UnaryExpression ~ UnaryExpression ! UnaryExpression AwaitExpression ExponentiationExpression : UpdateExpression ** ExponentiationExpression MultiplicativeExpression : MultiplicativeExpression MultiplicativeOperator ExponentiationExpression AdditiveExpression : AdditiveExpression + MultiplicativeExpression AdditiveExpression - MultiplicativeExpression ShiftExpression : ShiftExpression << AdditiveExpression ShiftExpression >> AdditiveExpression ShiftExpression >>> AdditiveExpression RelationalExpression : RelationalExpression < ShiftExpression RelationalExpression > ShiftExpression RelationalExpression <= ShiftExpression RelationalExpression >= ShiftExpression RelationalExpression instanceof ShiftExpression RelationalExpression in ShiftExpression PrivateIdentifier in ShiftExpression EqualityExpression : EqualityExpression == RelationalExpression EqualityExpression != RelationalExpression EqualityExpression === RelationalExpression EqualityExpression !== RelationalExpression BitwiseANDExpression : BitwiseANDExpression & EqualityExpression BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression LogicalANDExpression : LogicalANDExpression && BitwiseORExpression LogicalORExpression : LogicalORExpression || LogicalANDExpression CoalesceExpression : CoalesceExpressionHead ?? BitwiseORExpression ConditionalExpression : ShortCircuitExpression ? AssignmentExpression : AssignmentExpression AssignmentExpression : YieldExpression ArrowFunction AsyncArrowFunction LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression LeftHandSideExpression &&= AssignmentExpression LeftHandSideExpression ||= AssignmentExpression LeftHandSideExpression ??= AssignmentExpression Expression : Expression , AssignmentExpression
  1. invalid を返す。

8.6.5 静的意味論: PropName : String または empty

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

PropertyDefinition : IdentifierReference
  1. IdentifierReference の StringValue を返す。
PropertyDefinition : ... AssignmentExpression
  1. empty を返す。
PropertyDefinition : PropertyName : AssignmentExpression
  1. PropertyName の PropName を返す。
LiteralPropertyName : IdentifierName AttributeKey : IdentifierName
  1. IdentifierName の StringValue を返す。
LiteralPropertyName : StringLiteral AttributeKey : StringLiteral
  1. StringLiteral の SV を返す。
LiteralPropertyName : NumericLiteral
  1. nbrNumericLiteral の NumericValue とする。
  2. ToString(nbr) を返す。
ComputedPropertyName : [ AssignmentExpression ]
  1. empty を返す。
MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. ClassElementName の PropName を返す。
GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }
  1. ClassElementName の PropName を返す。
AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. ClassElementName の PropName を返す。
ClassElement : ClassStaticBlock
  1. empty を返す。
ClassElement : ;
  1. empty を返す。
AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. ClassElementName の PropName を返す。
FieldDefinition : ClassElementName Initializeropt
  1. ClassElementName の PropName を返す。
ClassElementName : PrivateIdentifier
  1. empty を返す。

9 実行可能コードと実行コンテキスト (Executable Code and Execution Contexts)

9.1 環境レコード (Environment Records)

Environment Record は、ECMAScript コードの字句上の入れ子(レキシカル)構造に基づいて Identifier と特定の変数・関数との関連付けを定義するために用いられる仕様上の型である。通常、Environment Record は FunctionDeclarationBlockStatement、または TryStatementCatch 節といった ECMAScript コードの特定の構文構造に関連付けられる。そのようなコードが評価されるたびに、そのコードが生成する識別子束縛を記録する新しい Environment Record が作成される。

すべての Environment Record は [[OuterEnv]] フィールドを持ち、これは null か、外側の Environment Record への参照である。これは Environment Record 値の論理的な入れ子をモデル化するために使われる。ある(内側の)Environment Record の外側参照は、その内側 Environment Record を論理的に囲む Environment Record への参照である。外側の Environment Record もまた自身の外側 Environment Record を持ちうる。1 つの Environment Record は複数の内側 Environment Record の外側環境として機能することがある。例えば、ある FunctionDeclaration が 2 つのネストした FunctionDeclaration を含む場合、それぞれのネストした関数の Environment Record の外側 Environment Record は、その囲む関数の現在の評価の Environment Record になる。

Environment Record は純粋に仕様上のメカニズムであり、ECMAScript 実装の特定の成果物に対応する必要はない。ECMAScript プログラムがそれらの値に直接アクセスまたは操作することは不可能である。

9.1.1 Environment Record 型階層 (The Environment Record Type Hierarchy)

Environment Record は、Environment Record が抽象クラスであり 3 つの具象サブクラス(Declarative Environment RecordObject Environment RecordGlobal Environment Record)を持つ、単純なオブジェクト指向階層に存在するものと考えられる。Function Environment RecordModule Environment RecordDeclarative Environment Record のサブクラスである。

Environment Record 抽象クラスは、Table 14 に定義される抽象仕様メソッドを含む。これらの抽象メソッドは、各具象サブクラスに固有の具体的アルゴリズムを持つ。

Table 14: 環境レコードの抽象メソッド (Abstract Methods of Environment Records)
メソッド (Method) 目的 (Purpose)
HasBinding(N) Environment Record が文字列値 N の束縛を持つか判定する。持つなら true、持たないなら false を返す。
CreateMutableBinding(N, D) Environment Record に新しい未初期化の可変束縛を作成する。文字列値 N は束縛名のテキスト。Boolean 引数 Dtrue の場合、その束縛は後で削除可能。
CreateImmutableBinding(N, S) Environment Record に新しい未初期化の不変束縛を作成する。文字列値 N は束縛名のテキスト。Strue の場合、初期化後に設定しようとすると、参照する操作の strict モード設定に関わらず常に例外を投げる。
InitializeBinding(N, V) 既に存在し未初期化の束縛の値を設定する。文字列値 N は束縛名のテキスト。V は任意の ECMAScript 言語型の値。
SetMutableBinding(N, V, S) 既存の可変束縛の値を設定する。N は束縛名。V は任意の ECMAScript 言語型の値。Strue で束縛を設定できない場合 TypeError を投げる。
GetBindingValue(N, S) 既存束縛の値を返す。N は束縛名。S は strict モードコード(または strict セマンティクスが必要な参照)を識別する。Strue で束縛が存在しないなら ReferenceError。束縛が存在するが未初期化なら S に関係なく ReferenceError を投げる。
DeleteBinding(N) 束縛を削除する。存在し削除成功なら true、削除できなければ false。存在しないなら true
HasThisBinding() this 束縛を確立するか判定。確立するなら true、しないなら false
HasSuperBinding() super メソッド束縛を確立するか判定。確立するなら true、しないなら falsetrue の場合、その Environment RecordFunction Environment Record であることを含意する(逆は必ずしも成立しない)。
WithBaseObject() この Environment Recordwith 文に関連付くなら with オブジェクトを返し、それ以外は undefined を返す。

9.1.1.1 宣言的環境レコード (Declarative Environment Records)

Declarative Environment Record は、変数、定数、let、class、module、import、および / または function 宣言を含む ECMAScript プログラムスコープに関連付けられる。Declarative Environment Record は、そのスコープ内の宣言によって定義される識別子集合を束縛する。

9.1.1.1.1 HasBinding ( N )

The HasBinding concrete method of Declarative Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了. 引数の識別子がそのレコードで束縛される識別子の一つかどうかを判定する。 It performs the following steps when called:

  1. envRecN の束縛を持つなら true を返す。
  2. false を返す。

9.1.1.1.2 CreateMutableBinding ( N, D )

The CreateMutableBinding concrete method of Declarative Environment Record envRec takes arguments N (String) and D (Boolean) and returns unused を含む正常完了. 未初期化の新しい可変束縛 N を作成する。envRecN の既存束縛があってはならない。Dtrue の場合、その新しい束縛は削除対象としてマークされる。 It performs the following steps when called:

  1. アサート: envRec はまだ N の束縛を持たない。
  2. envRecN の未初期化可変束縛を作成する。Dtrue なら、後続の DeleteBinding 呼び出しで削除可能であることを記録する。
  3. unused を返す。

9.1.1.1.3 CreateImmutableBinding ( N, S )

The CreateImmutableBinding concrete method of Declarative Environment Record envRec takes arguments N (String) and S (Boolean) and returns unused を含む正常完了. 未初期化の新しい不変束縛 N を作成する。既存束縛は存在してはならない。Strue の場合、新しい束縛を strict 束縛としてマークする。 It performs the following steps when called:

  1. アサート: envRec はまだ N の束縛を持たない。
  2. envRecN の未初期化不変束縛を作成する。Strue なら strict 束縛であることを記録する。
  3. unused を返す。

9.1.1.1.4 InitializeBinding ( N, V )

The InitializeBinding concrete method of Declarative Environment Record envRec takes arguments N (String) and V (ECMAScript 言語値) and returns unused を含む正常完了. 名前 N を持つ識別子の現在の未初期化束縛に値 V を設定するために使用される。未初期化束縛が既に存在しなければならない。 It performs the following steps when called:

  1. アサート: envRecN の未初期化束縛を持つ。
  2. envRec における N の束縛値を V に設定する。
  3. Record その束縛が初期化されたことを記録する。
  4. unused を返す。

9.1.1.1.5 SetMutableBinding ( N, V, S )

The SetMutableBinding concrete method of Declarative Environment Record envRec takes arguments N (String), V (ECMAScript 言語値), and S (Boolean) and returns unused を含む正常完了または throw 完了. 名前 N の可変束縛値を V に変更しようとする。通常束縛は既存だが、まれに存在しない場合がある。束縛が不変束縛で Strue のとき TypeError を投げる。 It performs the following steps when called:

  1. envRecN の束縛を持たない場合、
    1. Strue なら ReferenceError 例外を投げる。
    2. envRec.CreateMutableBinding(N, true) を実行。
    3. envRec.InitializeBinding(N, V) を実行。
    4. unused を返す。
  2. envRec における N の束縛が strict 束縛なら Strue に設定。
  3. envRec における N の束縛が未初期化なら
    1. ReferenceError 例外を投げる。
  4. そうでなく envRec における N が可変束縛なら
    1. その束縛値を V に変更する。
  5. それ以外
    1. アサート: 不変束縛の値を変更しようとしている。
    2. Strue なら TypeError 例外を投げる。
  6. unused を返す。
Note

ステップ 1 で束縛が存在しない状況を生む ECMAScript コード例:

function f() { eval("var x; x = (delete x, 0);"); }

9.1.1.1.6 GetBindingValue ( N, S )

The GetBindingValue concrete method of Declarative Environment Record envRec takes arguments N (String) and S (Boolean) and returns ECMAScript 言語値を含む正常完了または throw 完了. 名前 N の束縛値を返す。束縛が存在し未初期化である場合は、S の値に関わらず ReferenceError を投げる。 It performs the following steps when called:

  1. アサート: envRecN の束縛を持つ。
  2. envRec における N の束縛が未初期化なら ReferenceError 例外を投げる。
  3. 現在 envRecN に束縛されている値を返す。

9.1.1.1.7 DeleteBinding ( N )

The DeleteBinding concrete method of Declarative Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了. 削除対象として明示的に指定された束縛のみ削除できる。 It performs the following steps when called:

  1. アサート: envRecN の束縛を持つ。
  2. envRec における N の束縛が削除不可なら false を返す。
  3. envRec から N の束縛を除去する。
  4. true を返す。

9.1.1.1.8 HasThisBinding ( )

The HasThisBinding concrete method of Declarative Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

通常の Declarative Environment RecordFunction Environment Record でも Module Environment Record でもないもの)は this 束縛を提供しない。

9.1.1.1.9 HasSuperBinding ( )

The HasSuperBinding concrete method of Declarative Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

通常の Declarative Environment Recordsuper 束縛を提供しない。

9.1.1.1.10 WithBaseObject ( )

The WithBaseObject concrete method of Declarative Environment Record envRec takes no arguments and returns undefined. It performs the following steps when called:

  1. undefined を返す。

9.1.1.2 オブジェクト環境レコード (Object Environment Records)

Object Environment Recordbinding object と呼ばれるオブジェクトに関連付けられる。Object Environment Record は、その binding object のプロパティ名と直接対応する文字列識別子名の集合を束縛する。IdentifierName 形式でない文字列でないプロパティキーは束縛された識別子集合に含まれない。自身のプロパティと継承されたプロパティは [[Enumerable]] 属性の設定に関わらず集合に含まれる。プロパティは動的に追加・削除されうるため、Object Environment Record によって束縛される識別子集合は、プロパティを追加または削除する任意の操作の副作用として変化し得る。そのような副作用によって作成された束縛は、対応するプロパティの Writable 属性が false であっても可変束縛とみなされる。Object Environment Record には不変束縛は存在しない。

with 文(14.11)のために作成される Object Environment Record は、関数呼び出しで使用する暗黙の this 値として binding object を提供できる。この能力は Boolean フィールド [[IsWithEnvironment]] によって制御される。

Object Environment Record は Table 15 に列挙される追加状態フィールドを持つ。

Table 15: Object Environment Record の追加フィールド (Additional Fields of Object Environment Records)
フィールド名 (Field Name) 値 (Value) 意味 (Meaning)
[[BindingObject]] Object この Environment Record の binding object。
[[IsWithEnvironment]] Boolean この Environment Recordwith 文のために作成されたかどうかを示す。

9.1.1.2.1 HasBinding ( N )

The HasBinding concrete method of Object Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了または throw 完了. 関連付けられた binding object が名前 N のプロパティを持つか判定する。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. foundBinding を ? HasProperty(bindingObject, N) とする。
  3. foundBindingfalse なら false を返す。
  4. envRec.[[IsWithEnvironment]]false なら true を返す。
  5. unscopables を ? Get(bindingObject, %Symbol.unscopables%) とする。
  6. unscopables が Object なら
    1. blockedToBoolean(? Get(unscopables, N)) とする。
    2. blockedtrue なら false を返す。
  7. true を返す。

9.1.1.2.2 CreateMutableBinding ( N, D )

The CreateMutableBinding concrete method of Object Environment Record envRec takes arguments N (String) and D (Boolean) and returns unused を含む正常完了または throw 完了. Environment Record の binding object に名前 N のプロパティを作成し、その値を undefined に初期化する。Dtrue なら新プロパティの [[Configurable]]true にし、そうでなければ false にする。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. DefinePropertyOrThrow(bindingObject, N, PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: D }) を実行。
  3. unused を返す。
Note

通常 envRecN の束縛を持たないが、持つ場合には DefinePropertyOrThrow のセマンティクスにより既存束縛が置換・シャドウされるか、または急な完了が返ることがある。

9.1.1.2.3 CreateImmutableBinding ( N, S )

Object Environment Record の CreateImmutableBinding 具体メソッドは本仕様では使用されない。

9.1.1.2.4 InitializeBinding ( N, V )

The InitializeBinding concrete method of Object Environment Record envRec takes arguments N (String) and V (ECMAScript 言語値) and returns unused を含む正常完了または throw 完了. 名前 N の現在の束縛値を V に設定する。 It performs the following steps when called:

  1. envRec.SetMutableBinding(N, V, false) を実行。
  2. unused を返す。
Note

本仕様では Object Environment Record に対する CreateMutableBinding の全使用は直後に同じ名前で InitializeBinding を呼び出す。したがって初期化状態は明示的に追跡しない。

9.1.1.2.5 SetMutableBinding ( N, V, S )

The SetMutableBinding concrete method of Object Environment Record envRec takes arguments N (String), V (ECMAScript 言語値), and S (Boolean) and returns unused を含む正常完了または throw 完了. 関連する binding object のプロパティ N の値を V に設定しようとする。通常 N のプロパティは既に存在するが、存在しないか書き込み不可の場合、エラー処理は S に依存する。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. stillExists を ? HasProperty(bindingObject, N) とする。
  3. stillExistsfalse かつ Strue なら ReferenceError 例外を投げる。
  4. Set(bindingObject, N, V, S) を実行。
  5. unused を返す。

9.1.1.2.6 GetBindingValue ( N, S )

The GetBindingValue concrete method of Object Environment Record envRec takes arguments N (String) and S (Boolean) and returns ECMAScript 言語値を含む正常完了または throw 完了. 関連 binding object のプロパティ N の値を返す。プロパティは存在するはずだが存在しない場合、結果は S に依存する。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. value を ? HasProperty(bindingObject, N) とする。
  3. valuefalse なら
    1. Sfalse なら undefined を返し、そうでなければ ReferenceError 例外を投げる。
  4. Get(bindingObject, N) を返す。

9.1.1.2.7 DeleteBinding ( N )

The DeleteBinding concrete method of Object Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了または throw 完了. [[Configurable]] 属性が true の環境オブジェクトプロパティに対応する束縛のみ削除できる。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. bindingObject.[[Delete]](N) を返す。

9.1.1.2.8 HasThisBinding ( )

The HasThisBinding concrete method of Object Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

Object Environment Recordthis 束縛を提供しない。

9.1.1.2.9 HasSuperBinding ( )

The HasSuperBinding concrete method of Object Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

Object Environment Recordsuper 束縛を提供しない。

9.1.1.2.10 WithBaseObject ( )

The WithBaseObject concrete method of Object Environment Record envRec takes no arguments and returns Object または undefined. It performs the following steps when called:

  1. envRec.[[IsWithEnvironment]]true なら envRec.[[BindingObject]] を返す。
  2. そうでなければ undefined を返す。

9.1.1.3 関数環境レコード (Function Environment Records)

Function Environment Record は、関数のトップレベルスコープを表し、かつその関数が ArrowFunction でない場合 this 束縛を提供する Declarative Environment Record である。関数が ArrowFunction でなく super を参照する場合、その Function Environment Record は関数内部からの super メソッド呼び出しを実行するために使用される状態も含む。

Function Environment Record は Table 16 に列挙される追加状態フィールドを持つ。

Table 16: Function Environment Record の追加フィールド (Additional Fields of Function Environment Records)
フィールド名 (Field Name) 値 (Value) 意味 (Meaning)
[[ThisValue]] ECMAScript 言語値 この関数呼び出しで使用される this 値。
[[ThisBindingStatus]] lexical, initialized, または uninitialized 値が lexical の場合、これは ArrowFunction でありローカルな this 値を持たない。
[[FunctionObject]] ECMAScript 関数オブジェクト この Environment Record を生成した呼び出し元の関数オブジェクト
[[NewTarget]] コンストラクタまたは undefined この Environment Record[[Construct]] 内部メソッドで作成された場合、[[NewTarget]] はその [[Construct]] newTarget パラメータの値。それ以外は undefined

Function Environment Record は Table 14 に挙げる Declarative Environment Record メソッドすべてをサポートし、HasThisBinding と HasSuperBinding を除き同一の仕様を共有する。さらに Table 17 に示すメソッドをサポートする:

Table 17: Function Environment Record の追加メソッド (Additional Methods of Function Environment Records)
メソッド (Method) 目的 (Purpose)
GetThisBinding() この Environment Recordthis 束縛の値を返す。未初期化なら ReferenceError を投げる。

9.1.1.3.1 BindThisValue ( envRec, V )

The abstract operation BindThisValue takes arguments envRec (Function Environment Record) and V (ECMAScript 言語値) and returns unused を含む正常完了または throw 完了. envRec.[[ThisValue]] を設定し初期化済みであることを記録する。 It performs the following steps when called:

  1. アサート: envRec.[[ThisBindingStatus]]lexical ではない。
  2. envRec.[[ThisBindingStatus]]initialized なら ReferenceError 例外を投げる。
  3. envRec.[[ThisValue]]V に設定する。
  4. envRec.[[ThisBindingStatus]]initialized に設定する。
  5. unused を返す。

9.1.1.3.2 HasThisBinding ( )

The HasThisBinding concrete method of Function Environment Record envRec takes no arguments and returns Boolean. It performs the following steps when called:

  1. envRec.[[ThisBindingStatus]]lexical なら false、そうでなければ true を返す。

9.1.1.3.3 HasSuperBinding ( )

The HasSuperBinding concrete method of Function Environment Record envRec takes no arguments and returns Boolean. It performs the following steps when called:

  1. envRec.[[ThisBindingStatus]]lexical なら false を返す。
  2. envRec.[[FunctionObject]].[[HomeObject]]undefined なら false、そうでなければ true を返す。

9.1.1.3.4 GetThisBinding ( )

The GetThisBinding concrete method of Function Environment Record envRec takes no arguments and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. アサート: envRec.[[ThisBindingStatus]]lexical ではない。
  2. envRec.[[ThisBindingStatus]]uninitialized なら ReferenceError 例外を投げる。
  3. envRec.[[ThisValue]] を返す。

9.1.1.3.5 GetSuperBase ( envRec )

The abstract operation GetSuperBase takes argument envRec (Function Environment Record) and returns Object, null, または undefined. envRec に束縛された super プロパティアクセスの基底オブジェクトを返す。値 undefined はそうしたアクセスが実行時エラーになることを示す。 It performs the following steps when called:

  1. homeenvRec.[[FunctionObject]].[[HomeObject]] とする。
  2. homeundefined なら undefined を返す。
  3. アサート: home は ordinary object。
  4. home.[[GetPrototypeOf]]() を返す。

9.1.1.4 グローバル環境レコード (Global Environment Records)

Global Environment Record は、共通の realm で処理されるすべての ECMAScript Script 要素に共有される最も外側のスコープを表す。Global Environment Record は組み込みグローバル(19)、グローバルオブジェクトのプロパティ、および Script 内に現れるすべてのトップレベル宣言(8.2.9, 8.2.11)に束縛を提供する。

Global Environment Record は論理的には単一のレコードだが、Object Environment RecordDeclarative Environment Record を包含する合成体として仕様化される。Object Environment Record の基底オブジェクトは関連する Realm Recordグローバルオブジェクトであり、これは Global Environment Record の GetThisBinding 具体メソッドが返す値である。Global Environment Record の Object Environment Record 部分は、すべての組み込みグローバル(19)およびグローバルコード内の FunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclarationVariableStatement によって導入される束縛を含む。それ以外のグローバルコード内の ECMAScript 宣言による束縛は Global Environment Record の Declarative Environment Record 部分に含まれる。

プロパティはグローバルオブジェクト上に直接作成され得る。したがって Global Environment Record の Object Environment Record 部分は、宣言(FunctionDeclaration 等)によって明示的に作成された束縛と、グローバルオブジェクトのプロパティとして暗黙に作成された束縛の両方を含み得る。どの束縛が宣言によって明示的に作成されたものか識別するため、Global Environment Record は CreateGlobalVarBindingCreateGlobalFunctionBinding 抽象操作で束縛された名前のリストを保持する。

Global Environment Record は Table 18 に挙げる追加フィールドおよび Table 19 に挙げる追加メソッドを持つ。

Table 18: Global Environment Record の追加フィールド (Additional Fields of Global Environment Records)
フィールド名 (Field Name) 値 (Value) 意味 (Meaning)
[[ObjectRecord]] Object Environment Record Binding object はグローバルオブジェクト。組み込みグローバルの束縛と、グローバルコード内の FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, VariableDeclaration 束縛を含む。
[[GlobalThisValue]] Object グローバルスコープで this が返す値。ホストは任意の ECMAScript Object を提供可能。
[[DeclarativeRecord]] Declarative Environment Record Contains グローバルコード内の全宣言(ただし FunctionDeclaration など一部を除く)の束縛。
Table 19: Global Environment Record の追加メソッド (Additional Methods of Global Environment Records)
メソッド (Method) 目的 (Purpose)
GetThisBinding() この Environment Recordthis 束縛値を返す。

9.1.1.4.1 HasBinding ( N )

The HasBinding concrete method of Global Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了または throw 完了. 引数の識別子がこのレコードで束縛される一つか判定する。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら true を返す。
  3. ObjRecenvRec.[[ObjectRecord]] とする。
  4. ObjRec.HasBinding(N) を返す。

9.1.1.4.2 CreateMutableBinding ( N, D )

The CreateMutableBinding concrete method of Global Environment Record envRec takes arguments N (String) and D (Boolean) and returns unused を含む正常完了または throw 完了. 未初期化の新しい可変束縛 N を作成する。束縛は関連 DeclarativeRecord に作成される。N の束縛は既に存在してはならない。Dtrue の場合、削除対象としてマークされる。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら TypeError 例外を投げる。
  3. DclRec.CreateMutableBinding(N, D) を返す。

9.1.1.4.3 CreateImmutableBinding ( N, S )

The CreateImmutableBinding concrete method of Global Environment Record envRec takes arguments N (String) and S (Boolean) and returns unused を含む正常完了または throw 完了. 未初期化の新しい不変束縛 N を作成する。N の既存束縛は存在してはならない。Strue なら strict 束縛としてマーク。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら TypeError 例外を投げる。
  3. DclRec.CreateImmutableBinding(N, S) を返す。

9.1.1.4.4 InitializeBinding ( N, V )

The InitializeBinding concrete method of Global Environment Record envRec takes arguments N (String) and V (ECMAScript 言語値) and returns unused を含む正常完了または throw 完了. 名前 N の未初期化束縛値を V に設定する。未初期化束縛が既に存在する必要がある。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら
    1. DclRec.InitializeBinding(N, V) を返す。
  3. アサート: 束縛が存在するなら Object Environment Record にある。
  4. ObjRecenvRec.[[ObjectRecord]] とする。
  5. ObjRec.InitializeBinding(N, V) を返す。

9.1.1.4.5 SetMutableBinding ( N, V, S )

The SetMutableBinding concrete method of Global Environment Record envRec takes arguments N (String), V (ECMAScript 言語値), and S (Boolean) and returns unused を含む正常完了または throw 完了. 名前 N の現在の束縛値を V に変更しようとする。不変束縛で Strue なら TypeError。プロパティ N が存在しないか書き込み不可の場合の処理は S に依存。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら
    1. DclRec.SetMutableBinding(N, V, S) を返す。
  3. ObjRecenvRec.[[ObjectRecord]] とする。
  4. ObjRec.SetMutableBinding(N, V, S) を返す。

9.1.1.4.6 GetBindingValue ( N, S )

The GetBindingValue concrete method of Global Environment Record envRec takes arguments N (String) and S (Boolean) and returns ECMAScript 言語値を含む正常完了または throw 完了. 名前 N の束縛値を返す。束縛が未初期化なら ReferenceError。プロパティ N の存在や書き込み可否に関連するエラー処理は S に依存。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら
    1. DclRec.GetBindingValue(N, S) を返す。
  3. ObjRecenvRec.[[ObjectRecord]] とする。
  4. ObjRec.GetBindingValue(N, S) を返す。

9.1.1.4.7 DeleteBinding ( N )

The DeleteBinding concrete method of Global Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了または throw 完了. 削除対象として明示的に指定された束縛のみ削除できる。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら
    1. DclRec.DeleteBinding(N) を返す。
  3. ObjRecenvRec.[[ObjectRecord]] とする。
  4. globalObjectObjRec.[[BindingObject]] とする。
  5. existingProp を ? HasOwnProperty(globalObject, N) とする。
  6. existingProptrue なら
    1. ObjRec.DeleteBinding(N) を返す。
  7. true を返す。

9.1.1.4.8 HasThisBinding ( )

The HasThisBinding concrete method of Global Environment Record envRec takes no arguments and returns true. It performs the following steps when called:

  1. true を返す。
Note

Global Environment Record は常に this 束縛を提供する。

9.1.1.4.9 HasSuperBinding ( )

The HasSuperBinding concrete method of Global Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

Global Environment Recordsuper 束縛を提供しない。

9.1.1.4.10 WithBaseObject ( )

The WithBaseObject concrete method of Global Environment Record envRec takes no arguments and returns undefined. It performs the following steps when called:

  1. undefined を返す。

9.1.1.4.11 GetThisBinding ( )

The GetThisBinding concrete method of Global Environment Record envRec takes no arguments and returns Object を含む正常完了. It performs the following steps when called:

  1. envRec.[[GlobalThisValue]] を返す。

9.1.1.4.12 HasLexicalDeclaration ( envRec, N )

The abstract operation HasLexicalDeclaration takes arguments envRec (Global Environment Record) and N (String) and returns Boolean. 引数の識別子が、LexicalDeclarationClassDeclaration のようなレキシカル宣言で envRec に作成された束縛を持つか判定する。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) を返す。

9.1.1.4.13 HasRestrictedGlobalProperty ( envRec, N )

The abstract operation HasRestrictedGlobalProperty takes arguments envRec (Global Environment Record) and N (String) and returns Boolean を含む正常完了または throw 完了. 引数の識別子が、グローバルレキシカル束縛によってシャドウされてはならないグローバルオブジェクトプロパティ名か判定する。 It performs the following steps when called:

  1. ObjRecenvRec.[[ObjectRecord]] とする。
  2. globalObjectObjRec.[[BindingObject]] とする。
  3. existingProp を ? globalObject.[[GetOwnProperty]](N) とする。
  4. existingPropundefined なら false を返す。
  5. existingProp.[[Configurable]]true なら false を返す。
  6. true を返す。
Note

グローバルオブジェクト上には var や function 宣言ではなく直接作成されたプロパティが存在し得る。非 configurable なグローバルオブジェクトのプロパティと同名のグローバルレキシカル束縛は作成できない。"undefined" はその例である。

9.1.1.4.14 CanDeclareGlobalVar ( envRec, N )

The abstract operation CanDeclareGlobalVar takes arguments envRec (Global Environment Record) and N (String) and returns Boolean を含む正常完了または throw 完了. 同じ引数 NCreateGlobalVarBinding 呼び出しが成功するか判定する。冗長な var 宣言や既存グローバルオブジェクトプロパティに対する var 宣言は許可される。 It performs the following steps when called:

  1. ObjRecenvRec.[[ObjectRecord]] とする。
  2. globalObjectObjRec.[[BindingObject]] とする。
  3. hasProperty を ? HasOwnProperty(globalObject, N) とする。
  4. hasPropertytrue なら true を返す。
  5. IsExtensible(globalObject) を返す。

9.1.1.4.15 CanDeclareGlobalFunction ( envRec, N )

The abstract operation CanDeclareGlobalFunction takes arguments envRec (Global Environment Record) and N (String) and returns Boolean を含む正常完了または throw 完了. 同じ引数 NCreateGlobalFunctionBinding 呼び出しが成功するか判定する。 It performs the following steps when called:

  1. ObjRecenvRec.[[ObjectRecord]] とする。
  2. globalObjectObjRec.[[BindingObject]] とする。
  3. existingProp を ? globalObject.[[GetOwnProperty]](N) とする。
  4. existingPropundefined なら ? IsExtensible(globalObject) を返す。
  5. existingProp.[[Configurable]]true なら true を返す。
  6. IsDataDescriptor(existingProp) が true かつ existingProp が属性 { [[Writable]]: true, [[Enumerable]]: true } を持つなら true を返す。
  7. false を返す。

9.1.1.4.16 CreateGlobalVarBinding ( envRec, N, D )

The abstract operation CreateGlobalVarBinding takes arguments envRec (Global Environment Record), N (String), and D (Boolean) and returns unused を含む正常完了または throw 完了. 関連する Object Environment Record に可変束縛を作成・初期化する。既存束縛があれば再利用され初期化済みとみなされる。 It performs the following steps when called:

  1. ObjRecenvRec.[[ObjectRecord]] とする。
  2. globalObjectObjRec.[[BindingObject]] とする。
  3. hasProperty を ? HasOwnProperty(globalObject, N) とする。
  4. extensible を ? IsExtensible(globalObject) とする。
  5. hasPropertyfalse かつ extensibletrue なら
    1. ObjRec.CreateMutableBinding(N, D) を実行。
    2. ObjRec.InitializeBinding(N, undefined) を実行。
  6. unused を返す。

9.1.1.4.17 CreateGlobalFunctionBinding ( envRec, N, V, D )

The abstract operation CreateGlobalFunctionBinding takes arguments envRec (Global Environment Record), N (String), V (ECMAScript 言語値), and D (Boolean) and returns unused を含む正常完了または throw 完了. 関連する Object Environment Record に可変束縛を作成・初期化する。既存束縛があれば置き換える。 It performs the following steps when called:

  1. ObjRecenvRec.[[ObjectRecord]] とする。
  2. globalObjectObjRec.[[BindingObject]] とする。
  3. existingProp を ? globalObject.[[GetOwnProperty]](N) とする。
  4. existingPropundefined または existingProp.[[Configurable]]true なら
    1. desc を PropertyDescriptor { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: D } とする。
  5. それ以外
    1. desc を PropertyDescriptor { [[Value]]: V } とする。
  6. DefinePropertyOrThrow(globalObject, N, desc) を実行。
  7. Set(globalObject, N, V, false) を実行。
  8. unused を返す。
Note

グローバル関数宣言は常にグローバルオブジェクトの自身プロパティとして表現される。可能であれば既存の自身プロパティは標準的な属性値集合に再設定される。ステップ 7 は InitializeBinding 具体メソッド呼び出しと等価であり、globalObject が Proxy の場合同じ Proxy トラップ呼び出し列を生成する。

9.1.1.5 モジュール環境レコード (Module Environment Records)

Module Environment Record は ECMAScript Module の外側スコープを表す Declarative Environment Record である。通常の可変・不変束縛に加え、他の Environment Record に存在する対象束縛への間接アクセスを提供する不変の import 束縛も提供する。

Module Environment Record は Table 14 に挙げる Declarative Environment Record メソッドのすべてをサポートし、GetBindingValue, DeleteBinding, HasThisBinding, GetThisBinding を除き同じ仕様を共有する。さらに Table 20 に示すメソッドをサポートする:

Table 20: Module Environment Record の追加メソッド (Additional Methods of Module Environment Records)
メソッド (Method) 目的 (Purpose)
GetThisBinding() この Environment Recordthis 束縛値を返す。

9.1.1.5.1 GetBindingValue ( N, S )

The GetBindingValue concrete method of Module Environment Record envRec takes arguments N (String) and S (Boolean) and returns ECMAScript 言語値を含む正常完了または throw 完了. 名前 N の束縛値を返す。ただし束縛が間接束縛なら対象束縛値を返す。束縛が未初期化なら ReferenceError を投げる。 It performs the following steps when called:

  1. アサート: Strue
  2. アサート: envRecN の束縛を持つ。
  3. N の束縛が間接束縛なら
    1. MN2 をこの束縛作成時に提供された間接化値とする。
    2. targetEnvM.[[Environment]] とする。
    3. targetEnvempty なら ReferenceError 例外を投げる。
    4. targetEnv.GetBindingValue(N2, true) を返す。
  4. envRec における N の束縛が未初期化なら ReferenceError 例外を投げる。
  5. 現在 envRecN に束縛されている値を返す。
Note

S は常に trueModule は常に strict モードコードだからである。

9.1.1.5.2 DeleteBinding ( N )

Module Environment Record の DeleteBinding 具体メソッドは本仕様では使用されない。

Note

Module Environment Record は strict コード内のみで使用され、strict コードでは delete 演算子が Module Environment Record 束縛へ解決される Reference Record に適用されることを早期エラー規則が防ぐ。13.5.1.1 参照。

9.1.1.5.3 HasThisBinding ( )

The HasThisBinding concrete method of Module Environment Record envRec takes no arguments and returns true. It performs the following steps when called:

  1. true を返す。
Note

Module Environment Record は常に this 束縛を提供する。

9.1.1.5.4 GetThisBinding ( )

The GetThisBinding concrete method of Module Environment Record envRec takes no arguments and returns undefined を含む正常完了. It performs the following steps when called:

  1. undefined を返す。

9.1.1.5.5 CreateImportBinding ( envRec, N, M, N2 )

The abstract operation CreateImportBinding takes arguments envRec (Module Environment Record), N (String), M (Module Record), and N2 (String) and returns unused. 名前 N の新しい初期化済み不変間接束縛を作成する。envRecN の束縛は存在してはならない。N2MModule Environment Record に存在する束縛名。新束縛の値へのアクセスは対象束縛値を間接的にアクセスする。 It performs the following steps when called:

  1. アサート: envRec はまだ N の束縛を持たない。
  2. アサート: M.[[Environment]] のインスタンス化時、N2 の直接束縛を持つ。
  3. envRecM, N2 を対象とする N の不変間接束縛を(初期化済みとして)作成する。
  4. unused を返す。

9.1.2 環境レコード操作 (Environment Record Operations)

以下の抽象操作は本仕様で Environment Record を操作するために使用される:

9.1.2.1 GetIdentifierReference ( env, name, strict )

The abstract operation GetIdentifierReference takes arguments env (Environment Record または null), name (String), and strict (Boolean) and returns Reference Record を含む正常完了または throw 完了. It performs the following steps when called:

  1. envnull なら
    1. Reference Record { [[Base]]: unresolvable, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty } を返す。
  2. exists を ? env.HasBinding(name) とする。
  3. existstrue なら
    1. Reference Record { [[Base]]: env, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty } を返す。
  4. それ以外
    1. outerenv.[[OuterEnv]] とする。
    2. GetIdentifierReference(outer, name, strict) を返す。

9.1.2.2 NewDeclarativeEnvironment ( E )

The abstract operation NewDeclarativeEnvironment takes argument E (Environment Record または null) and returns Declarative Environment Record. It performs the following steps when called:

  1. 绑定を含まない新しい Declarative Environment Record env を生成する。
  2. env.[[OuterEnv]]E に設定。
  3. env を返す。

9.1.2.3 NewObjectEnvironment ( O, W, E )

The abstract operation NewObjectEnvironment takes arguments O (Object), W (Boolean), and E (Environment Record または null) and returns Object Environment Record. It performs the following steps when called:

  1. 新しい Object Environment Record env を生成する。
  2. env.[[BindingObject]]O に設定。
  3. env.[[IsWithEnvironment]]W に設定。
  4. env.[[OuterEnv]]E に設定。
  5. env を返す。

9.1.2.4 NewFunctionEnvironment ( F, newTarget )

The abstract operation NewFunctionEnvironment takes arguments F (ECMAScript 関数オブジェクト) and newTarget (Object または undefined) and returns Function Environment Record. It performs the following steps when called:

  1. 束縛を含まない新しい Function Environment Record env を生成。
  2. env.[[FunctionObject]]F に設定。
  3. F.[[ThisMode]]lexical なら env.[[ThisBindingStatus]]lexical に設定。
  4. それ以外なら env.[[ThisBindingStatus]]uninitialized に設定。
  5. env.[[NewTarget]]newTarget に設定。
  6. env.[[OuterEnv]]F.[[Environment]] に設定。
  7. env を返す。

9.1.2.5 NewGlobalEnvironment ( G, thisValue )

The abstract operation NewGlobalEnvironment takes arguments G (Object) and thisValue (Object) and returns Global Environment Record. It performs the following steps when called:

  1. objRecNewObjectEnvironment(G, false, null) とする。
  2. dclRecNewDeclarativeEnvironment(null) とする。
  3. 新しい Global Environment Record env を生成。
  4. env.[[ObjectRecord]]objRec に設定。
  5. env.[[GlobalThisValue]]thisValue に設定。
  6. env.[[DeclarativeRecord]]dclRec に設定。
  7. env.[[OuterEnv]]null に設定。
  8. env を返す。

9.1.2.6 NewModuleEnvironment ( E )

The abstract operation NewModuleEnvironment takes argument E (Environment Record) and returns Module Environment Record. It performs the following steps when called:

  1. 束縛を含まない新しい Module Environment Record env を生成する。
  2. env.[[OuterEnv]]E に設定。
  3. env を返す。

9.2 PrivateEnvironment レコード

PrivateEnvironment Record は、ECMAScript コード内の ClassDeclaration および ClassExpression の字句上の入れ子構造に基づいて Private Name を追跡するための仕様上のメカニズムである。Environment Record に類似しているが別個のものである。各 PrivateEnvironment Record は 1 つの ClassDeclaration または ClassExpression に関連付けられる。そのようなクラスが評価されるたびに、そのクラスで宣言された Private Name を記録する新たな PrivateEnvironment Record が生成される。

PrivateEnvironment RecordTable 21 で定義されるフィールドを持つ。

Table 21: PrivateEnvironment Record のフィールド (PrivateEnvironment Record Fields)
フィールド名 値の型 意味
[[OuterPrivateEnvironment]] PrivateEnvironment Record または null 最も近い外側にあるクラスの PrivateEnvironment Record。関連付けられているクラスが他のいかなるクラスにも内包されていない場合は null
[[Names]] Private NameList このクラスによって宣言された Private Name 群。

9.2.1 PrivateEnvironment Record の操作

本仕様で PrivateEnvironment Record を操作するために以下の抽象操作を用いる:

9.2.1.1 NewPrivateEnvironment ( outerPrivateEnv )

The abstract operation NewPrivateEnvironment takes argument outerPrivateEnv (a PrivateEnvironment Record or null) and returns a PrivateEnvironment Record. It performs the following steps when called:

  1. names を新しい空の List とする。
  2. PrivateEnvironment Record { [[OuterPrivateEnvironment]]: outerPrivateEnv, [[Names]]: names } を返す。

9.2.1.2 ResolvePrivateIdentifier ( privateEnv, identifier )

The abstract operation ResolvePrivateIdentifier takes arguments privateEnv (a PrivateEnvironment Record) and identifier (a String) and returns a Private Name. It performs the following steps when called:

  1. namesprivateEnv.[[Names]] とする。
  2. names の各 Private Name pn について、
    1. pn.[[Description]]identifier であるなら
      1. pn を返す。
  3. outerPrivateEnvprivateEnv.[[OuterPrivateEnvironment]] とする。
  4. アサート: outerPrivateEnvnull ではない。
  5. ResolvePrivateIdentifier(outerPrivateEnv, identifier) を返す。

9.3 Realm

評価される前に、すべての ECMAScript コードは realm に関連付けられなければならない。概念的には realm は一連の組み込みオブジェクト、ECMAScript のグローバル環境、そのグローバル環境のスコープ内で読み込まれるすべての ECMAScript コード、及びその他関連する状態とリソースから構成される。

realm は本仕様では Table 22 に示すフィールドを持つ Realm Record として表現される:

Table 22: Realm Record のフィールド (Realm Record Fields)
フィールド名 意味
[[AgentSignifier]] agent signifier この realm を所有する agent
[[Intrinsics]] フィールド名が intrinsic key で値がオブジェクトである Record この realm に関連付けられたコードが使用する intrinsic 値
[[GlobalObject]] Object この realm の global object
[[GlobalEnv]] Global Environment Record この realm のグローバル環境
[[TemplateMap]] [[Site]] (TemplateLiteral Parse Node) と [[Array]] (Array) を持つ RecordList

テンプレートオブジェクトは各 realm ごとにその Realm Record[[TemplateMap]] を用いて正規化される。各 [[Site]]TemplateLiteral である Parse Node。対応する [[Array]] はタグ関数へ渡されるテンプレートオブジェクト。

Note 1
Parse Node が到達不能となった場合、対応する [[Array]] も到達不能となり、実装がその組を [[TemplateMap]] から除去しても観測不可能である。
[[LoadedModules]] LoadedModuleRequest RecordList

この realm が import した specifier 文字列から解決済み Module Record への写像。ModuleRequestsEqual(r1, r2) が true となる異なる Record r1r2 を 2 つ含まない。

Note 2
HostLoadImportedModule (16.2.1.10 Note 1) で述べられるように、Realm Record[[LoadedModules]] はアクティブな script や module が存在しない文脈で import() 式を実行する場合にのみ使用される。
[[HostDefined]] 任意 (既定値 undefined) Realm Record に追加情報を関連付ける必要があるホストが使用するために予約されたフィールド。

9.3.1 InitializeHostDefinedRealm ( )

The abstract operation InitializeHostDefinedRealm takes no arguments and returns unused を含む正常完了または throw 完了. It performs the following steps when called:

  1. realm を新しい Realm Record とする。
  2. CreateIntrinsics(realm) を実行。
  3. realm.[[AgentSignifier]]AgentSignifier() に設定。
  4. realm.[[TemplateMap]] を新しい空の List に設定。
  5. newContext を新しい実行コンテキストとする。
  6. newContext の Function を null に設定。
  7. newContextRealmrealm に設定。
  8. newContext の ScriptOrModule を null に設定。
  9. 実行コンテキストスタックに newContext を push する; newContext が現在の実行コンテキストとなる。
  10. ホストrealm の global object として奇異 (exotic) オブジェクトを要求する場合、
    1. globalホスト定義の方法で作成されたそのようなオブジェクトとする。
  11. それ以外、
    1. globalOrdinaryObjectCreate(realm.[[Intrinsics]].[[%Object.prototype%]]) とする。
  12. ホストrealm のグローバルスコープにおける this 束縛が global object とは異なるオブジェクトを返すことを要求する場合、
    1. thisValueホスト定義の方法で作成されたそのようなオブジェクトとする。
  13. それ以外、
    1. thisValueglobal とする。
  14. realm.[[GlobalObject]]global に設定。
  15. realm.[[GlobalEnv]]NewGlobalEnvironment(global, thisValue) に設定。
  16. SetDefaultGlobalBindings(realm) を実行。
  17. ホスト定義グローバルオブジェクトプロパティを global 上に作成する。
  18. unused を返す。

9.3.2 CreateIntrinsics ( realmRec )

The abstract operation CreateIntrinsics takes argument realmRec (a Realm Record) and returns unused. It performs the following steps when called:

  1. realmRec.[[Intrinsics]] を新しい Record に設定。
  2. realmRec.[[Intrinsics]] のフィールドを Table 6 に列挙される値で設定する。フィールド名は表の第 1 列の名前。各フィールドの値は、19 から 28 の各節で定義されたとおりのプロパティ値で完全かつ再帰的に埋められた新しいオブジェクト値。すべてのオブジェクトプロパティ値は新たに作成されるオブジェクト値。ビルトイン関数オブジェクトとなる値はすべて CreateBuiltinFunction(steps, length, name, slots, realmRec, prototype) を実行して作成される。ここで steps は本仕様で提供されるその関数の定義、name は関数の "name" プロパティの初期値、length"length" プロパティの初期値、slots はその関数に指定された内部スロット名(存在する場合)のリスト、prototype はその関数の [[Prototype]] 内部スロットの指定値。intrinsic とそのプロパティの生成順序は未生成のオブジェクトに依存しないよう配慮しなければならない。
  3. AddRestrictedFunctionProperties(realmRec.[[Intrinsics]].[[%Function.prototype%]], realmRec) を実行。
  4. unused を返す。

9.3.3 SetDefaultGlobalBindings ( realmRec )

The abstract operation SetDefaultGlobalBindings takes argument realmRec (a Realm Record) and returns unused を含む正常完了または throw 完了. It performs the following steps when called:

  1. globalrealmRec.[[GlobalObject]] とする。
  2. 19 で指定される Global Object の各プロパティについて、
    1. nameプロパティ名の String 値とする。
    2. desc をそのプロパティに対して指定された属性を含む、完全に埋められたデータ Property Descriptor とする。19.219.3、または 19.4 に列挙されたプロパティについては [[Value]] 属性の値は realmRec から対応する intrinsic オブジェクト。
    3. DefinePropertyOrThrow(global, name, desc) を実行。
  3. unused を返す。

9.4 実行コンテキスト (Execution Contexts)

execution context は、ECMAScript 実装によるコードの実行時評価を追跡するために用いられる仕様デバイスである。任意の時点で、実際にコードを実行している agent ごとに高々 1 つの実行コンテキストが存在する。これをその agent実行中実行コンテキスト (running execution context) と呼ぶ。本仕様中で実行中実行コンテキストへの参照は常に囲んでいる agent の実行中実行コンテキストを指す。

実行コンテキストスタック (execution context stack) は実行コンテキストを追跡するために使用される。実行中実行コンテキストは常にこのスタックの最上位要素である。現在の実行中実行コンテキストに関連付く実行可能コードから、関連付いていない別の実行可能コードへ制御が移るたびに新しい実行コンテキストが生成される。新たな実行コンテキストはスタックに push され、実行中実行コンテキストとなる。

実行コンテキストは、関連コードの実行進行状況を追跡するために必要な実装依存状態を保持する。各実行コンテキストは少なくとも Table 23 に列挙される状態コンポーネントを持つ。

Table 23: すべての実行コンテキストに共通の状態コンポーネント (State Components for All Execution Contexts)
コンポーネント 目的
code evaluation state この実行コンテキストに関連するコードの評価・一時停止・再開を行うために必要なあらゆる状態。
Function この実行コンテキストが関数オブジェクトのコードを評価しているなら、値はその関数オブジェクトScript または Module のコードを評価しているなら値は null
Realm 関連コードが ECMAScript リソースにアクセスする際の Realm Record
ScriptOrModule 関連コードの起源となる Module Record または Script Record。起源となる script / module が存在しない (InitializeHostDefinedRealm で生成された元の実行コンテキスト等) 場合は null

実行中実行コンテキストによるコード評価は本仕様で定義された様々な地点で一時停止され得る。一度一時停止されると別の実行コンテキストが実行中実行コンテキストとなり自身のコード評価を開始し得る。後で一時停止中の実行コンテキストが再び実行中となり、以前に一時停止された地点から評価を継続し得る。実行中実行コンテキストの状態移行は通常スタック的 (LIFO) に行われるが、いくつかの ECMAScript 機能では非 LIFO の遷移が必要である。

実行中実行コンテキストの Realm コンポーネントの値は current Realm Record とも呼ばれる。Function コンポーネントの値は active function object とも呼ばれる。

ECMAScript コード実行コンテキストTable 24 に列挙される追加状態コンポーネントを持つ。

Table 24: ECMAScript コード実行コンテキストの追加状態コンポーネント (Additional State Components for ECMAScript Code Execution Contexts)
コンポーネント 目的
LexicalEnvironment この実行コンテキスト内のコードが識別子参照を解決するために使用する Environment Record
VariableEnvironment この実行コンテキスト内の VariableStatement によって作成された束縛を保持する Environment Record
PrivateEnvironment 最も近い外側のクラス内で ClassElement により生成された Private Name を保持する PrivateEnvironment Record。内包するクラスが無ければ null

実行コンテキストの LexicalEnvironment および VariableEnvironment コンポーネントは常に Environment Record である。

Generator の評価を表す実行コンテキストは Table 25 に示す追加状態コンポーネントを持つ。

Table 25: Generator 実行コンテキストの追加状態コンポーネント (Additional State Components for Generator Execution Contexts)
コンポーネント 目的
Generator この実行コンテキストが評価している Generator。

ほとんどの場合、本仕様のアルゴリズムが直接操作するのは実行中実行コンテキスト(スタック頂上)のみである。したがって「LexicalEnvironment」や「VariableEnvironment」という語が修飾なしに使われるとき、それは実行中実行コンテキストのそれらを指す。

実行コンテキストは純粋に仕様上のメカニズムであり、ECMAScript 実装の特定成果物に対応する必要はない。ECMAScript コードから実行コンテキストへ直接アクセスや観測を行うことは不可能である。

9.4.1 GetActiveScriptOrModule ( )

The abstract operation GetActiveScriptOrModule takes no arguments and returns a Script Record, a Module Record, or null. 実行中実行コンテキストに基づき、実行中の script または module を決定するために用いられる。 It performs the following steps when called:

  1. 実行コンテキストスタックが空なら null を返す。
  2. ec を、実行コンテキストスタック上で最上位から見て ScriptOrModule コンポーネントが null でない最初の実行コンテキストとする。
  3. そのような実行コンテキストが存在しなければ null を返し、存在するなら ec の ScriptOrModule を返す。

9.4.2 ResolveBinding ( name [ , env ] )

The abstract operation ResolveBinding takes argument name (a String) and optional argument env (an Environment Record or undefined) and returns either a normal completion containing a Reference Record or a throw completion. name の束縛を決定するために用いられる。env は探索対象の Environment Record を明示的に与えるために使用できる。 It performs the following steps when called:

  1. env が与えられていない、または envundefined なら
    1. env を実行中実行コンテキストの LexicalEnvironment に設定する。
  2. アサート: envEnvironment Record である。
  3. strict を評価されつつある構文生成規則に対する IsStrict の結果とする。
  4. GetIdentifierReference(env, name, strict) を返す。
Note

ResolveBinding の結果は常に [[ReferencedName]] フィールドが name である Reference Record である。

9.4.3 GetThisEnvironment ( )

The abstract operation GetThisEnvironment takes no arguments and returns an Environment Record. 現在 this の束縛を提供している Environment Record を見つける。 It performs the following steps when called:

  1. env を実行中実行コンテキストの LexicalEnvironment とする。
  2. 繰り返し:
    1. existsenv.HasThisBinding() とする。
    2. existstrue なら env を返す。
    3. outerenv.[[OuterEnv]] とする。
    4. アサート: outernull ではない。
    5. envouter に設定する。
Note

ステップ 2 のループは、連鎖が常に this 束縛を持つグローバル環境で終わるため必ず停止する。

9.4.4 ResolveThisBinding ( )

The abstract operation ResolveThisBinding takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion. 実行中実行コンテキストの LexicalEnvironment を用いてキーワード this の束縛を決定する。 It performs the following steps when called:

  1. envRecGetThisEnvironment() とする。
  2. envRec.GetThisBinding() を返す。

9.4.5 GetNewTarget ( )

The abstract operation GetNewTarget takes no arguments and returns an Object or undefined. 実行中実行コンテキストの LexicalEnvironment を用いて NewTarget 値を決定する。 It performs the following steps when called:

  1. envRecGetThisEnvironment() とする。
  2. アサート: envRec[[NewTarget]] フィールドを持つ。
  3. envRec.[[NewTarget]] を返す。

9.4.6 GetGlobalObject ( )

The abstract operation GetGlobalObject takes no arguments and returns an Object. 現在実行中の実行コンテキストが使用するグローバルオブジェクトを返す。 It performs the following steps when called:

  1. currentRealmcurrent Realm Record とする。
  2. currentRealm.[[GlobalObject]] を返す。

9.5 Job と Job をキューに入れるためのホスト操作 (Jobs and Host Operations to Enqueue Jobs)

Job とは、他の ECMAScript 計算が現在進行中でないときに ECMAScript 計算を開始する、引数を持たない Abstract Closure である。

Job は特定の agent 内で ECMAScript ホスト環境によって実行がスケジュールされる。本仕様は、HostEnqueueGenericJobHostEnqueueFinalizationRegistryCleanupJobHostEnqueuePromiseJob、および HostEnqueueTimeoutJob というホストフックを記述し、Job をスケジュールする。これらのホストフックは、Job のスケジューリングに課される追加制約によって整理されている。ホストは追加で Job をスケジュールする抽象操作を定義してよい。そのような操作は Job Abstract ClosurerealmRealm Record または null)を引数に取る。Realm Record が与えられた場合、これらの操作は、その realm を所有する agent において、指定された将来時点でその realm において Job を実行するようスケジュールする。realmnull が与えられた場合、その Job は ECMAScript コードを評価しない。実装は以下の要件に従わなければならない:

  • 将来のある時点で、Job がスケジュールされた agent に実行中コンテキストが無く、その agent の実行コンテキストスタックが空であるとき、実装は以下を行わなければならない:
    1. ホスト定義の準備ステップを実行する。
    2. Invoke して Job Abstract Closure を呼び出す。
    3. ホスト定義の後片付けステップを実行し、その後で実行コンテキストスタックは空でなければならない。
  • 任意の時点で 1 つの agent では同時に評価進行中となれる Job は高々 1 つである。
  • ある Job の評価が開始したら、その agent で他のどの Job の評価が開始するよりも前に完了まで走り切らなければならない。
  • Abstract Closure は正常完了を返さなければならず、エラー処理は自身で実装する。
Note 1
ホスト環境はスケジューリングに関して Job を一様に扱う必要はない。例えば、Web ブラウザや Node.js は Promise 処理の Job を他の作業より高優先度で扱う。将来の機能追加により、必ずしも高優先度で扱われない新たな Job が追加されるかもしれない。

任意の時点で、scriptOrModuleScript RecordModule Record、または null)が次の条件をすべて満たすなら、その時点の active script or module である:

  • GetActiveScriptOrModule() が scriptOrModule である。
  • scriptOrModuleScript Record または Module Record の場合、ec を実行コンテキストスタック上で ScriptOrModule コンポーネントが scriptOrModule である最上位の実行コンテキストとする。ecRealm コンポーネントは scriptOrModule.[[Realm]] である。

任意の時点で、次の条件をすべて満たすとき、その実行は prepared to evaluate ECMAScript code である:

  • 実行コンテキストスタックは空ではない。
  • 実行コンテキストスタック上で最上位の実行コンテキストの Realm コンポーネントは Realm Record である。
Note 2

ホスト環境は実行コンテキストを実行コンテキストスタックに push することでコード評価の準備を行うことができる。具体的な手順は実装定義である。

Realm の具体的選択はホスト環境次第である。この初期実行コンテキストと Realm は、任意のコールバック関数が呼ばれる前にのみ使用される。Promise ハンドラのような Job 関連のコールバック関数が呼び出されると、その呼び出しは独自の実行コンテキストと Realm を push する。

特定種類の Job には追加の適合要件が存在する。

9.5.1 JobCallback Record

JobCallback Record関数オブジェクトホスト定義値を格納するための Record 値である。ホストによってキューに入れられた Job を通じて呼び出される関数オブジェクトは追加のホスト定義コンテキストを持ち得る。その状態を伝播するために、Job Abstract Closure関数オブジェクトを直接捕捉して呼び出すべきではない。代わりに HostMakeJobCallbackHostCallJobCallback を用いる。

Note

例えば WHATWG HTML 仕様 (https://html.spec.whatwg.org/) は、ホスト定義値を用いて Promise コールバック用の incumbent settings object を伝播する。

JobCallback Record は Table 26 に列挙するフィールドを持つ。

Table 26: JobCallback Record のフィールド (JobCallback Record Fields)
Field Name Value Meaning
[[Callback]] a function object Job が呼び出されたときに実行する関数。
[[HostDefined]] anything (default value is empty) ホストが使用するために予約されたフィールド。

9.5.2 HostMakeJobCallback ( callback )

The host-defined abstract operation HostMakeJobCallback takes argument callback (a function object) and returns a JobCallback Record.

HostMakeJobCallback の実装は次の要件に従わなければならない:

  • [[Callback]] フィールドが callback である JobCallback Record を返さなければならない。

HostMakeJobCallback のデフォルト実装は呼び出されたとき次を行う:

  1. JobCallback Record { [[Callback]]: callback, [[HostDefined]]: empty } を返す。

Web ブラウザではない ECMAScript ホストは HostMakeJobCallback のデフォルト実装を使用しなければならない。

Note

これは、コールバックが最終的にスケジュールされ実行される責任を持つ関数に渡される時点で呼ばれる。例えば promise.then(thenAction) はリアクション Job のスケジュール時ではなく Promise.prototype.then 呼び出し時に thenAction に対して MakeJobCallback を呼ぶ。

9.5.3 HostCallJobCallback ( jobCallback, V, argumentsList )

The host-defined abstract operation HostCallJobCallback takes arguments jobCallback (a JobCallback Record), V (an ECMAScript language value), and argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion.

HostCallJobCallback の実装は次の要件に従わなければならない:

  • Call(jobCallback.[[Callback]], V, argumentsList) を実行しその結果を返さなければならない。
Note

この要件は、ホストが本仕様で定義される関数オブジェクト[[Call]] の振る舞いを変更できないことを意味する。

HostCallJobCallback のデフォルト実装は呼び出されたとき次を行う:

  1. アサート: IsCallable(jobCallback.[[Callback]]) is true.
  2. ? Call(jobCallback.[[Callback]], V, argumentsList) を返す。

Web ブラウザではない ECMAScript ホストは HostCallJobCallback のデフォルト実装を使用しなければならない。

9.5.4 HostEnqueueGenericJob ( job, realm )

The host-defined abstract operation HostEnqueueGenericJob takes arguments job (a Job Abstract Closure) and realm (a Realm Record) and returns unused. realm.[[AgentSignifier]] で示される agent において realm realm で将来のある時点に job をスケジュールする。このアルゴリズムと共に用いられる Abstract Closure は、優先度や順序付けといった追加制約なくスケジュールされることを意図している。

HostEnqueueGenericJob の実装は 9.5 の要件に従わなければならない。

9.5.5 HostEnqueuePromiseJob ( job, realm )

The host-defined abstract operation HostEnqueuePromiseJob takes arguments job (a Job Abstract Closure) and realm (a Realm Record or null) and returns unused. 将来のある時点に job をスケジュールする。このアルゴリズムと共に用いられる Abstract Closure は、Promise の処理に関連するか、さもなくば Promise 処理操作と同等の優先度でスケジュールされることを意図している。

HostEnqueuePromiseJob の実装は 9.5 の要件に加えて以下に従わなければならない:

  • realmnull でないなら、job が呼び出されるたびに、その時点で ECMAScript コードを評価する準備が整うよう実装定義ステップを実行しなければならない。
  • scriptOrModule を HostEnqueuePromiseJob が呼び出された時点での GetActiveScriptOrModule() とする。realmnull でないなら、job が呼び出されるたびに、その呼び出しの時点で scriptOrModuleactive script or module であるよう実装定義ステップを実行しなければならない。
  • Job はそれらをスケジュールした HostEnqueuePromiseJob 呼び出しと同じ順序で実行されなければならない。
Note

NewPromiseResolveThenableJob が返す Jobrealm は通常 then 関数オブジェクトに対して GetFunctionRealm を呼び出した結果である。NewPromiseReactionJob が返す Jobrealm は、ハンドラが undefined でない場合そのハンドラに対して GetFunctionRealm を呼び出した結果が通常使われる。ハンドラが undefined の場合、realmnull。どちらの種類の Job でも、GetFunctionRealm が異常終了する(例: revoke 済み Proxy に対して呼び出された)とき、realm はその GetFunctionRealm 呼び出し時の現在の Realm Record となる。realmnull の場合、ユーザ ECMAScript コードは評価されず、新しい ECMAScript オブジェクト(例えば Error オブジェクト)は生成されない。例えば WHATWG HTML 仕様 (https://html.spec.whatwg.org/) はスクリプト実行可能性の確認および entry の概念のために realm を使用する。

9.5.6 HostEnqueueTimeoutJob ( timeoutJob, realm, milliseconds )

The host-defined abstract operation HostEnqueueTimeoutJob takes arguments timeoutJob (a Job Abstract Closure), realm (a Realm Record), and milliseconds (a non-negative finite Number) and returns unused. realm.[[AgentSignifier]] で示される agentrealm realm において、少なくとも milliseconds ミリ秒後に timeoutJob を実行するようスケジュールする。

HostEnqueueTimeoutJob の実装は 9.5 の要件に従わなければならない。

9.6 Agent

agent は一組の ECMAScript 実行コンテキスト、実行コンテキストスタック、実行中実行コンテキスト、Agent Record、および executing thread から構成される。executing thread を除き、agent の構成要素はその agent にのみ属する。

agentexecuting thread は他の agent と独立してその agent の実行コンテキスト上でアルゴリズムステップを実行する。ただし、[[CanBlock]] フィールドが true である Agent Record を持つ agent が共有していない限り、1 つの executing thread を複数の agent で共有してもよい。

Note 1

例えば一部の Web ブラウザでは、ブラウザウィンドウの複数の無関係なタブ間で単一の executing thread を共有する。

agentexecuting thread がアルゴリズムステップを実行している間、その agent はそれらのステップにとっての surrounding agent である。ステップは surrounding agent を用いて、agent 内に保持された仕様レベルの実行オブジェクト(実行中実行コンテキスト、実行コンテキストスタック、Agent Record のフィールド)へアクセスする。

agent signifierAgent を識別するために用いられるグローバル一意の不透明値である。

Table 27: Agent Record のフィールド (Agent Record Fields)
Field Name Value Meaning
[[LittleEndian]] a Boolean アルゴリズム GetValueFromBufferSetValueInBuffer で必要なときに isLittleEndian 引数の既定値として計算される値。選択は実装定義であり、実装にとって最も効率的な方を選ぶべき。この値が一度観測された後は変更できない。
[[CanBlock]] a Boolean その agent がブロック可能かどうかを決定する。
[[Signifier]] an agent signifier agent クラスタ内で agent を一意に識別する。
[[IsLockFree1]] a Boolean true の場合 1 byte 値 上のアトミック操作は lock-free、そうでなければ false
[[IsLockFree2]] a Boolean true の場合 2 byte 値 上のアトミック操作は lock-free、そうでなければ false
[[IsLockFree8]] a Boolean true の場合 8 byte 値 上のアトミック操作は lock-free、そうでなければ false
[[CandidateExecution]] a candidate execution Record メモリモデル参照。
[[KeptAlive]] a List of either Objects or Symbols 初期状態は空の新しい List。現在の Job の終了まで生存させるオブジェクトやシンボルのリスト。
[[ModuleAsyncEvaluationCount]] an integer 初期値 0。非同期または非同期依存を持つモジュールの [[AsyncEvaluationOrder]] フィールドに一意の増加値を割り当てるために用いられる。

[[Signifier]][[IsLockFree1]][[IsLockFree2]] の値は、一度クラスタ内のいずれかの agent により観測された後は変更できない。

Note 2

[[IsLockFree1]][[IsLockFree2]] の値は必ずしもハードウェアだけで決定されるわけではなく、時間経過や ECMAScript 実装間で異なりうる実装上の選択を反映することがある。

[[IsLockFree4]] フィールドは存在しない: 4 バイトのアトミック操作は常に lock-free である。

実際には、アトミック操作が何らかのロックを用いて実装されているなら、その操作は lock-free ではない。lock-free は wait-free を意味しない: lock-free なアトミック操作を完了するのに必要なマシンステップ数に上限はない。

サイズ n のアトミックアクセスが lock-free であることは、同サイズの非アトミックアクセスの(知覚される)アトミシティについて何も意味しない。具体的には、非アトミックアクセスは複数のメモリアクセス列として実行され得る。詳細は ReadSharedMemory および WriteSharedMemory を参照。

Note 3

agent は仕様上のメカニズムであり、ECMAScript 実装の特定成果物に対応する必要はない。

9.6.1 AgentSignifier ( )

The abstract operation AgentSignifier takes no arguments and returns an agent signifier. It performs the following steps when called:

  1. ARsurrounding agentAgent Record とする。
  2. AR.[[Signifier]] を返す。

9.6.2 AgentCanSuspend ( )

The abstract operation AgentCanSuspend takes no arguments and returns a Boolean. It performs the following steps when called:

  1. ARsurrounding agentAgent Record とする。
  2. AR.[[CanBlock]] を返す。
Note

環境によっては、特定の agent をサスペンドすることが妥当でない場合がある。例えば Web ブラウザ環境では、ドキュメントのメインイベントハンドリングスレッドのサスペンドを禁止しつつ、worker のイベントハンドリングスレッドはサスペンドを許容することが妥当かもしれない。

9.6.3 IncrementModuleAsyncEvaluationCount ( )

The abstract operation IncrementModuleAsyncEvaluationCount takes no arguments and returns an integer. It performs the following steps when called:

  1. ARsurrounding agentAgent Record とする。
  2. countAR.[[ModuleAsyncEvaluationCount]] とする。
  3. AR.[[ModuleAsyncEvaluationCount]]count + 1 に設定。
  4. count を返す。
Note

この値は保留中モジュール間の相対評価順を追跡するためだけに使用される。実装は、保留中モジュールが無いときは [[ModuleAsyncEvaluationCount]] を観測不能な形で 0 にリセットしてよい。

9.7 Agent Cluster

agent cluster とは、共有メモリ操作によって通信可能な agent の極大集合である。

Note 1

異なる agent 内のプログラムは未規定の手段によってメモリを共有しうる。最小でも SharedArrayBuffer の裏付けメモリはクラスタ内の agent 間で共有可能である。

メッセージパッシングで通信可能だがメモリを共有できない agent が存在するかもしれない。そのような agent は同じ agent cluster にはならない。

すべての agent は正確に 1 つの agent cluster に属する。

Note 2

クラスタ内の agent が特定時点で全て生存している必要はない。agent Aagent B を生成し、その後 A が終了し Bagent C を生成した場合、AB とメモリを共有し得て、BC とメモリを共有し得るなら、3 つの agent は同一クラスタである。

クラスタ内のすべての agent は、それぞれの Agent Record[[LittleEndian]] フィールドについて同じ値を持たなければならない。

Note 3

クラスタ内で異なる [[LittleEndian]] 値を持つ agent があると、マルチバイトデータに対し共有メモリを使うのが困難になる。

クラスタ内のすべての agent は、それぞれの Agent Record[[IsLockFree1]] フィールドについて同じ値を持たなければならない; [[IsLockFree2]] フィールドについても同様。

クラスタ内のすべての agent は、それぞれの Agent Record[[Signifier]] フィールドについて互いに異なる値を持たなければならない。

埋め込み環境 (embedding) は agent の知識や協力なしに agent を非アクティブ化(進行停止)またはアクティブ化(進行再開)してよい。埋め込み環境がそれを行う場合、クラスタ内で一部の agent を非アクティブ化したまま他を無期限にアクティブにしてはならない。

Note 4

上記制約の目的は、他の agent が非アクティブ化されたために agent がデッドロックまたはスターブする状況を避けることである。例えば、HTML shared worker がウィンドウ内ドキュメントと独立したライフタイムを持ち、その shared worker がそのような独立ドキュメントの dedicated worker とメモリ共有を許される場合、ドキュメントとその dedicated worker が dedicated worker がロックを保持した状態で非アクティブ化され(例えばドキュメントが履歴に保存される等)、shared worker がそのロック取得を試みた場合、shared worker は dedicated worker が再びアクティブ化されるまでブロックされる(場合によっては永久に)。その間、他ウィンドウから shared worker へアクセスしようとする他の worker はスターブする。

この制約の含意は、埋め込み環境内で同一のサスペンド/ウェイク集団に属さない agent 同士ではメモリ共有が不可能になるということである。

埋め込み環境は agent のクラスタ内の他の agent の事前の知識や協力なしに agent を終了させてもよい。agent が自身またはクラスタ内の他の agent のプログラム的作用によってではなくクラスタ外の要因によって終了させられる場合、埋め込み環境は 2 つの戦略のいずれかを選ばなければならない: すべての agent を終了させるか、またはクラスタ内の agent が協調できる信頼性のある API を提供し、クラスタの少なくとも 1 つの残存メンバが終了を検出できるようにし、終了データには終了した agent を識別する十分な情報を含める。

Note 5

その種の終了例: 別プロセスで動作する agent を OS またはユーザが終了させる; per-agent リソース計測が runaway と示したときに、他の agent と同一プロセスで動作する agent を埋め込み環境自身が終了させる、等。

以下の仕様値およびそれらから推移的に到達可能な値はそれぞれ正確に 1 つの agent cluster に属する。

クラスタ内の任意の agent が ECMAScript コードを評価する前に、クラスタ内すべての agentAgent Record[[CandidateExecution]] フィールドは初期 candidate execution に設定される。初期 candidate execution は空の candidate execution で、[[EventsRecords]] フィールドは各 agent について、その [[AgentSignifier]] フィールドがその agentagent signifier で、[[EventList]][[AgentSynchronizesWith]] フィールドが空の List である Agent Events Record を含む List である。

Note 6

agent cluster 内のすべての agentAgent Record[[CandidateExecution]] フィールド内で同じ candidate execution を共有する。candidate execution はメモリモデルで使用される仕様メカニズムである。

Note 7

agent cluster は仕様メカニズムであり、ECMAScript 実装の特定成果物に対応する必要はない。

9.8 Forward Progress

agentforward progress を行う (make forward progress) とは、本仕様に従って評価ステップを 1 つ実行することである。

agent の実行中実行コンテキストが外部イベントを同期的かつ無期限に待機すると、その agentblocked になる。この意味で blocked になり得るのは Agent Record[[CanBlock]] フィールドが trueagent のみである。unblocked agent とは blocked でない agent である。

実装は以下を保証しなければならない:

  • 専用 executing thread を持つ全ての unblocked agent は最終的に forward progress を行う
  • executing thread を共有する agent の集合では、いずれか 1 つの agent が最終的に forward progress を行う
  • agent はブロッキングを提供する明示的 API を通じて以外には、他の agent を blocked にしてはならない
Note

これは、メモリモデルの liveness 保証と共に、すべての seq-cst write が最終的に全 agent に観測されることを保証する。

9.9 WeakRef と FinalizationRegistry ターゲットの処理モデル (Processing Model of WeakRef and FinalizationRegistry Targets)

9.9.1 Objectives

本仕様は、任意のオブジェクトまたはシンボルがガーベジコレクトされることを保証しない。生存していないオブジェクトやシンボルは長時間後に解放されるか、全く解放されない可能性がある。このため、本仕様はガーベジコレクションによってトリガーされる挙動を記述する際に「may」という語を使用する。

WeakRef および FinalizationRegistry のセマンティクスは、特定の時点で発生する 2 つの操作に基づいている:

  • WeakRef.prototype.deref が呼び出されると、(undefined が返されないなら)参照対象は後続の同期的アクセスでも同じ値が返るよう生存保持される。このリストは ClearKeptObjects 抽象操作を用いて同期的作業が完了するとリセットされる。
  • FinalizationRegistry に登録されたオブジェクトまたはシンボルが到達不能になったとき、同期 ECMAScript 実行が完了した後に、その FinalizationRegistry のクリーンアップコールバックの呼び出しが最終的に行われるかもしれない。FinalizationRegistry クリーンアップは CleanupFinalizationRegistry 抽象操作で実行される。

これら(ClearKeptObjectsCleanupFinalizationRegistry)のいずれの動作も同期 ECMAScript 実行を割り込まない。ホストはより長い同期 ECMAScript 実行を組み立てる可能性があるため、本仕様は ClearKeptObjects および CleanupFinalizationRegistry のスケジューリングをホスト環境に委ねる。

一部 ECMAScript 実装は、ECMAScript がアイドルである間も含め、バックグラウンドでガーベジコレクタを走らせる。ホスト環境CleanupFinalizationRegistry のスケジューリングを任せることで、ホストは最終化作業を行うために ECMAScript 実行を再開し、保持された値を解放して全体的なメモリ使用量を削減し得る。

9.9.2 Liveness

オブジェクトやシンボルの集合 S に対し、S に関して hypothetical WeakRef-oblivious な実行とは、参照先が S の要素である WeakRef抽象操作 WeakRefDeref が常に undefined を返すような実行である。

Note 1
WeakRef-obliviousness と liveness は 2 つの概念を捉える。(1) WeakRef 自体は参照対象を生存させない。(2) liveness に循環が存在しても値が生存であることを意味しない。具体的には v の liveness 判定が WeakRef 参照先 r の liveness 判定に依存する場合、r の liveness は v の liveness を仮定できず、そうすると循環的推論になる。
Note 2
WeakRef-obliviousness が個々の値ではなく値の集合に対して定義されるのは循環を考慮するためである。個々の値に対して定義すると、循環内の WeakRef 参照先は、その同一性が循環内の他の WeakRef 参照先を介してのみ観測されるにもかかわらず、生存と考えられてしまう。
Note 3
口語的には、個々のオブジェクトまたはシンボルは、それを含むすべての集合が live であれば live であると言う。

評価中の任意の時点で、オブジェクトやシンボルの集合 S は以下の条件のいずれかを満たす場合 live と見なされる:

  • S の任意の要素が任意の agent[[KeptAlive]] List に含まれている。
  • S に関して WeakRef-oblivious である有効な将来の仮想実行が存在し、その実行が S 内の任意の値の同一性を観測する。
Note 4
上記 2 番目の条件は、値の同一性が非 WeakRef 手段で観測可能であれば値は live であるという直感を捉える。値の同一性は厳密等価比較の観測や、値が Map のキーとして使用されることの観測によって観測され得る。
Note 5

値がフィールド、内部スロット、またはプロパティに存在するという事実は、その値が live であることを意味しない。例えば、その値がプログラムに返されることが一度も無いなら観測できない。

これは WeakMap のキー、WeakSet のメンバ、そして FinalizationRegistry Cell record の [[WeakRefTarget]] および [[UnregisterToken]] フィールドについても同様である。

上記定義は、WeakMap のキーが live でないなら対応する value も必ずしも live とは限らないことを含意する。

Note 6
Liveness はエンジンが空にしてはならない WeakRef を保証するための下限である。ここで定義する Liveness は決定不能である。実際にはエンジンは到達可能性などの保守的近似を用いる。実装には大きな裁量が期待される。

9.9.3 Execution

任意の時点で、オブジェクトやシンボルの集合 Slive でない場合、ECMAScript 実装は以下のステップをアトミックに実行してもよい:

  1. S の各要素 value について
    1. ref.[[WeakRefTarget]]value である各 WeakRef ref について
      1. ref.[[WeakRefTarget]]empty に設定する。
    2. fg.[[Cells]]Record cell を含み、cell.[[WeakRefTarget]]value である各 FinalizationRegistry fg について
      1. cell.[[WeakRefTarget]]empty に設定する。
      2. 任意で HostEnqueueFinalizationRegistryCleanupJob(fg) を実行する。
    3. map.[[WeakMapData]]Record r を含み、r.[[Key]]value である各 WeakMap map について
      1. r.[[Key]]empty に設定する。
      2. r.[[Value]]empty に設定する。
    4. set.[[WeakSetData]]value を含む各 WeakSet set について
      1. 値が value の要素を、値が empty の要素に置き換える。
Note 1

Liveness の定義と合わせて、本節は実装が WeakRef に関して適用してよい最適化を規定する。

オブジェクトの同一性を観測せずにオブジェクトへアクセスすることは可能である。エスケープしないオブジェクトのプロパティに対するデッド変数除去やスカラ置換などの最適化が許可され、その同一性が観測されないオブジェクトを指す WeakRef を観測可能な形で空にすることが許される。

一方、オブジェクトの同一性が観測可能で、そのオブジェクトが WeakRef[[WeakRefTarget]] 内部スロットにある場合、WeakRef を観測可能に空にしてしまう再物質化 (rematerialization) などの最適化は禁じられる。

HostEnqueueFinalizationRegistryCleanupJob の呼び出しは任意であるため、FinalizationRegistry に登録されたオブジェクトがその FinalizationRegistry 自体を生存保持するとは限らない。実装は、FinalizationRegistry 自体が死んだ場合やアプリケーション終了中など、任意の理由で FinalizationRegistry コールバックを省略してよい。

Note 2

実装は、非 live オブジェクトやシンボルの極大集合に対して WeakRef を必ずしも空にする義務はない。

実装が WeakRef を空にするために非 live 集合 S を選ぶ場合、本定義は S 内のすべての値に対する WeakRef を同時に空にすることを要求する。言い換えると、値 v を指す WeakRef を空にしながら、v の値を観測しうる他の WeakRef を空にしないままにするのは非適合である。

9.9.4 ホストフック (Host Hooks)

9.9.4.1 HostEnqueueFinalizationRegistryCleanupJob ( finalizationRegistry )

The host-defined abstract operation HostEnqueueFinalizationRegistryCleanupJob takes argument finalizationRegistry (a FinalizationRegistry) and returns unused.

cleanupJob を、引数を持たず finalizationRegistry を捕捉し、呼び出されたとき次のステップを実行する新しい Job Abstract Closure とする:

  1. cleanupResultCompletion(CleanupFinalizationRegistry(finalizationRegistry)) とする。
  2. cleanupResultabrupt completion であるなら、エラー報告のためのホスト定義ステップを実行する。
  3. unused を返す。

HostEnqueueFinalizationRegistryCleanupJob の実装は、可能なら cleanupJob を将来時点で実行するようスケジュールする。また 9.5 の要件にも従わなければならない。

9.10 ClearKeptObjects ( )

The abstract operation ClearKeptObjects takes no arguments and returns unused. ECMAScript 実装は同期的な ECMAScript 実行列が完了した際に ClearKeptObjects を呼び出すことが期待される。 It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Record とする。
  2. agentRecord.[[KeptAlive]] を新しい空の List に設定する。
  3. unused を返す。

9.11 AddToKeptObjects ( value )

The abstract operation AddToKeptObjects takes argument value (an Object or a Symbol) and returns unused. It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Record とする。
  2. agentRecord.[[KeptAlive]]value を追加する。
  3. unused を返す。
Note
抽象操作 AddToKeptObjects が対象となるオブジェクトまたはシンボルを引数に呼び出されると、その対象は ClearKeptObjects が呼び出されるまで対象を強参照し続けるリストに追加される。

9.12 CleanupFinalizationRegistry ( finalizationRegistry )

The abstract operation CleanupFinalizationRegistry takes argument finalizationRegistry (a FinalizationRegistry) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. アサート: finalizationRegistry[[Cells]] および [[CleanupCallback]] 内部スロットを持つ。
  2. callbackfinalizationRegistry.[[CleanupCallback]] とする。
  3. finalizationRegistry.[[Cells]]Record cell を含み、かつ cell.[[WeakRefTarget]]empty であるものが存在する間、実装は以下のステップを(任意のタイミングで)実行してよい:
    1. そのような cell のいずれかを選ぶ。
    2. finalizationRegistry.[[Cells]] から cell を取り除く。
    3. HostCallJobCallback(callback, undefined, « cell.[[HeldValue]] ») を実行する。
  4. unused を返す。

9.13 CanBeHeldWeakly ( v )

The abstract operation CanBeHeldWeakly takes argument v (an ECMAScript language value) and returns a Boolean. v が弱参照として利用に適している場合に限り true を返す。弱参照として利用に適した値のみが WeakMap のキー、WeakSet の要素、WeakRef の target、あるいは FinalizationRegistry の targets の 1 つになれる。 It performs the following steps when called:

  1. v が Object であるなら true を返す。
  2. v が Symbol でかつ KeyForSymbol(v) が undefined であるなら true を返す。
  3. false を返す。
Note

言語同一性 (language identity) を持たない言語値は、事前の参照なしに生成し得るため弱参照としては不適切である。Symbol.for により生成された Symbol 値は他の Symbol と異なり言語同一性を持たず、弱参照として不適切である。Well-known symbols は収集されない可能性が高いが、数が限定され多様な実装手法で管理可能であるため、弱参照として利用に適したものとして扱われる。しかし、live な WeakMap 内で well-known symbol に関連付けられた任意の値は収集されにくく、実装においてメモリ資源を「リーク」させる可能性がある。

10 通常オブジェクトとエキゾチックオブジェクトの挙動 (Ordinary and Exotic Objects Behaviours)

10.1 通常オブジェクトの内部メソッドと内部スロット (Ordinary Object Internal Methods and Internal Slots)

すべての通常オブジェクト[[Prototype]] という内部スロットを持つ。この内部スロットの値は null かオブジェクトであり、継承を実装するために用いられる。通常オブジェクト O にプロパティ P が存在せず、しかしその [[Prototype]] オブジェクトには存在する状況を仮定する。P[[Prototype]] オブジェクト上のデータプロパティを参照する場合、O は取得アクセスにおいてそれを継承し、PO 自身のプロパティであるかのように振る舞う。P[[Prototype]] オブジェクト上の書き込み可能なデータプロパティを参照する場合、O 上で P に値を設定すると O 上に新しいデータプロパティ P が作成される。P[[Prototype]] オブジェクト上の書き込み不可のデータプロパティを参照する場合、O 上での P への設定は失敗する。P[[Prototype]] オブジェクト上のアクセサプロパティを参照する場合、そのアクセサは取得および設定アクセスの両方について O に継承される。

すべての通常オブジェクトは Boolean 値を取る [[Extensible]] 内部スロットを持ち、これは 6.1.7.3 で規定される拡張可能性に関する内部メソッドの不変条件を満たすために使用される。すなわち、一度オブジェクトの [[Extensible]] 内部スロットの値が false に設定されると、そのオブジェクトに新しいプロパティを追加したり、オブジェクトの [[Prototype]] 内部スロットの値を変更したり、後で [[Extensible]] の値を true に戻したりすることはできない。

以下のアルゴリズム記述では、O通常オブジェクトPプロパティキー値、V は任意の ECMAScript 言語値、DescProperty Descriptor レコードであると仮定する。

通常オブジェクト内部メソッドは同名の抽象操作に委譲する。そのような抽象操作が別の内部メソッドに依存する場合、同名の抽象操作を直接呼ぶ代わりに O 上で内部メソッドが呼び出される。これらのセマンティクスは、通常オブジェクト内部メソッドが適用された際に、エキゾチックオブジェクトではオーバーライドされた内部メソッドが呼ばれることを保証する。

10.1.1 [[GetPrototypeOf]] ( )

The [[GetPrototypeOf]] internal method of 通常オブジェクト O takes no arguments and returns Object か null を含む正常完了. It performs the following steps when called:

  1. OrdinaryGetPrototypeOf(O) を返す。

10.1.1.1 OrdinaryGetPrototypeOf ( O )

The abstract operation OrdinaryGetPrototypeOf takes argument O (an Object) and returns an Object or null. It performs the following steps when called:

  1. O.[[Prototype]] を返す。

10.1.2 [[SetPrototypeOf]] ( V )

The [[SetPrototypeOf]] internal method of 通常オブジェクト O takes argument V (an Object or null) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. OrdinarySetPrototypeOf(O, V) を返す。

10.1.2.1 OrdinarySetPrototypeOf ( O, V )

The abstract operation OrdinarySetPrototypeOf takes arguments O (an Object) and V (an Object or null) and returns a Boolean. It performs the following steps when called:

  1. currentO.[[Prototype]] とする。
  2. SameValue(V, current) が true なら true を返す。
  3. extensibleO.[[Extensible]] とする。
  4. extensiblefalse なら false を返す。
  5. pV とする。
  6. donefalse とする。
  7. donefalse の間、繰り返す:
    1. pnull なら
      1. donetrue に設定する。
    2. そうでなく SameValue(p, O) が true なら
      1. false を返す。
    3. それ以外なら
      1. p.[[GetPrototypeOf]]10.1.1 で定義された通常オブジェクト内部メソッドでないなら donetrue に設定する。
      2. そうでなければ pp.[[Prototype]] に設定する。
  8. O.[[Prototype]]V に設定する。
  9. true を返す。
Note

ステップ 7 のループは、[[GetPrototypeOf]][[SetPrototypeOf]]通常オブジェクト定義を用いるオブジェクトのみから成る任意のプロトタイプ連鎖に循環が存在しないことを保証する。

10.1.3 [[IsExtensible]] ( )

The [[IsExtensible]] internal method of 通常オブジェクト O takes no arguments and returns Boolean を含む正常完了. It performs the following steps when called:

  1. OrdinaryIsExtensible(O) を返す。

10.1.3.1 OrdinaryIsExtensible ( O )

The abstract operation OrdinaryIsExtensible takes argument O (an Object) and returns a Boolean. It performs the following steps when called:

  1. O.[[Extensible]] を返す。

10.1.4 [[PreventExtensions]] ( )

The [[PreventExtensions]] internal method of 通常オブジェクト O takes no arguments and returns true を含む正常完了. It performs the following steps when called:

  1. OrdinaryPreventExtensions(O) を返す。

10.1.4.1 OrdinaryPreventExtensions ( O )

The abstract operation OrdinaryPreventExtensions takes argument O (an Object) and returns true. It performs the following steps when called:

  1. O.[[Extensible]]false に設定する。
  2. true を返す。

10.1.5 [[GetOwnProperty]] ( P )

The [[GetOwnProperty]] internal method of 通常オブジェクト O takes argument P (a property key) and returns Property Descriptorundefined を含む正常完了. It performs the following steps when called:

  1. OrdinaryGetOwnProperty(O, P) を返す。

10.1.5.1 OrdinaryGetOwnProperty ( O, P )

The abstract operation OrdinaryGetOwnProperty takes arguments O (an Object) and P (a property key) and returns a Property Descriptor or undefined. It performs the following steps when called:

  1. O がキー P の自身のプロパティを持たないなら undefined を返す。
  2. フィールドを持たない新しい Property Descriptor D を生成する。
  3. X をキーが P である O の自身のプロパティとする。
  4. Xデータプロパティなら
    1. D.[[Value]]X.[[Value]] 属性の値に設定する。
    2. D.[[Writable]]X.[[Writable]] 属性の値に設定する。
  5. それ以外
    1. アサート: Xアクセサプロパティである。
    2. D.[[Get]]X.[[Get]] 属性の値に設定する。
    3. D.[[Set]]X.[[Set]] 属性の値に設定する。
  6. D.[[Enumerable]]X.[[Enumerable]] 属性の値に設定する。
  7. D.[[Configurable]]X.[[Configurable]] 属性の値に設定する。
  8. D を返す。

10.1.6 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of 通常オブジェクト O takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. OrdinaryDefineOwnProperty(O, P, Desc) を返す。

10.1.6.1 OrdinaryDefineOwnProperty ( O, P, Desc )

The abstract operation OrdinaryDefineOwnProperty takes arguments O (an Object), P (a property key), and Desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. current を ? O.[[GetOwnProperty]](P) とする。
  2. extensible を ? IsExtensible(O) とする。
  3. ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) を返す。

10.1.6.2 IsCompatiblePropertyDescriptor ( Extensible, Desc, Current )

The abstract operation IsCompatiblePropertyDescriptor takes arguments Extensible (a Boolean), Desc (a Property Descriptor), and Current (a Property Descriptor or undefined) and returns a Boolean. It performs the following steps when called:

  1. ValidateAndApplyPropertyDescriptor(undefined, "", Extensible, Desc, Current) を返す。

10.1.6.3 ValidateAndApplyPropertyDescriptor ( O, P, extensible, Desc, current )

The abstract operation ValidateAndApplyPropertyDescriptor takes arguments O (an Object or undefined), P (a property key), extensible (a Boolean), Desc (a Property Descriptor), and current (a Property Descriptor or undefined) and returns a Boolean. Desc が、指定された拡張可能性 extensible と現行プロパティ current を持つオブジェクトのプロパティとして 不変条件 を維持しつつ適用できる場合に限り true を返す。そのような適用が可能で Oundefined でない場合、名前 P のプロパティ(必要なら作成される)に対して実行される。 It performs the following steps when called:

  1. アサート: Pプロパティキーである。
  2. currentundefined なら
    1. extensiblefalse なら false を返す。
    2. Oundefined なら true を返す。
    3. IsAccessorDescriptor(Desc) が true なら
      1. オブジェクト O に、Desc に対応フィールドがあればその値、そうでなければその属性の 既定値[[Get]], [[Set]], [[Enumerable]], [[Configurable]] に設定した名前 P の自身のアクセサプロパティを作成する。
    4. それ以外
      1. オブジェクト O に、Desc に対応フィールドがあればその値、そうでなければその属性の 既定値[[Value]], [[Writable]], [[Enumerable]], [[Configurable]] に設定した名前 P の自身のデータプロパティを作成する。
    5. true を返す。
  3. アサート: current は完全に埋められた Property Descriptor である。
  4. Desc がいかなるフィールドも持たないなら true を返す。
  5. current.[[Configurable]]false なら
    1. Desc[[Configurable]] フィールドを持ちかつ Desc.[[Configurable]]true なら false を返す。
    2. Desc[[Enumerable]] フィールドを持ちかつ Desc.[[Enumerable]]current.[[Enumerable]] と異なるなら false を返す。
    3. IsGenericDescriptor(Desc) が false でかつ IsAccessorDescriptor(Desc) が IsAccessorDescriptor(current) と異なるなら false を返す。
    4. IsAccessorDescriptor(current) が true なら
      1. Desc[[Get]] フィールドを持ち SameValue(Desc.[[Get]], current.[[Get]]) が false なら false を返す。
      2. Desc[[Set]] フィールドを持ち SameValue(Desc.[[Set]], current.[[Set]]) が false なら false を返す。
    5. それ以外で current.[[Writable]]false なら
      1. Desc[[Writable]] フィールドを持ち Desc.[[Writable]]true なら false を返す。
      2. 注記: SameValue は他の手段で区別可能な NaN 値について true を返す。ここで返すことで O の既存プロパティが変更されないことを保証する。
      3. Desc[[Value]] フィールドを持つなら SameValue(Desc.[[Value]], current.[[Value]]) を返す。
  6. Oundefined でないなら
    1. IsDataDescriptor(current) が true かつ IsAccessorDescriptor(Desc) が true なら
      1. Desc[[Configurable]] フィールドを持つなら configurableDesc.[[Configurable]] とし、そうでなければ configurablecurrent.[[Configurable]] とする。
      2. Desc[[Enumerable]] フィールドを持つなら enumerableDesc.[[Enumerable]] とし、そうでなければ enumerablecurrent.[[Enumerable]] とする。
      3. オブジェクト O の名前 P のプロパティを、[[Configurable]][[Enumerable]] をそれぞれ configurableenumerable に、[[Get]][[Set]]Desc に対応フィールドがあればその値、なければその属性の 既定値 に設定したアクセサプロパティに置き換える。
    2. それ以外で IsAccessorDescriptor(current) が true かつ IsDataDescriptor(Desc) が true なら
      1. Desc[[Configurable]] フィールドを持つなら configurableDesc.[[Configurable]] とし、そうでなければ configurablecurrent.[[Configurable]] とする。
      2. Desc[[Enumerable]] フィールドを持つなら enumerableDesc.[[Enumerable]] とし、そうでなければ enumerablecurrent.[[Enumerable]] とする。
      3. オブジェクト O の名前 P のプロパティを、[[Configurable]][[Enumerable]] をそれぞれ configurableenumerable に、[[Value]][[Writable]]Desc に対応フィールドがあればその値、なければその属性の 既定値 に設定したデータプロパティに置き換える。
    3. それ以外の場合
      1. Desc の各フィールドについて、オブジェクト O の名前 P のプロパティの対応する属性をそのフィールドの値に設定する。
  7. true を返す。

10.1.7 [[HasProperty]] ( P )

The [[HasProperty]] internal method of 通常オブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. OrdinaryHasProperty(O, P) を返す。

10.1.7.1 OrdinaryHasProperty ( O, P )

The abstract operation OrdinaryHasProperty takes arguments O (an Object) and P (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. hasOwn を ? O.[[GetOwnProperty]](P) とする。
  2. hasOwnundefined でないなら true を返す。
  3. parent を ? O.[[GetPrototypeOf]]() とする。
  4. parentnull でないなら
    1. parent.[[HasProperty]](P) を返す。
  5. false を返す。

10.1.8 [[Get]] ( P, Receiver )

The [[Get]] internal method of 通常オブジェクト O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. OrdinaryGet(O, P, Receiver) を返す。

10.1.8.1 OrdinaryGet ( O, P, Receiver )

The abstract operation OrdinaryGet takes arguments O (an Object), P (a property key), and Receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. desc を ? O.[[GetOwnProperty]](P) とする。
  2. descundefined なら
    1. parent を ? O.[[GetPrototypeOf]]() とする。
    2. parentnull なら undefined を返す。
    3. parent.[[Get]](P, Receiver) を返す。
  3. IsDataDescriptor(desc) が true なら desc.[[Value]] を返す。
  4. アサート: IsAccessorDescriptor(desc) は true である。
  5. getterdesc.[[Get]] とする。
  6. getterundefined なら undefined を返す。
  7. ? Call(getter, Receiver) を返す。

10.1.9 [[Set]] ( P, V, Receiver )

The [[Set]] internal method of 通常オブジェクト O takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. OrdinarySet(O, P, V, Receiver) を返す。

10.1.9.1 OrdinarySet ( O, P, V, Receiver )

The abstract operation OrdinarySet takes arguments O (an Object), P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ownDesc を ? O.[[GetOwnProperty]](P) とする。
  2. OrdinarySetWithOwnDescriptor(O, P, V, Receiver, ownDesc) を返す。

10.1.9.2 OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc )

The abstract operation OrdinarySetWithOwnDescriptor takes arguments O (an Object), P (a property key), V (an ECMAScript language value), Receiver (an ECMAScript language value), and ownDesc (a Property Descriptor or undefined) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ownDescundefined なら
    1. parent を ? O.[[GetPrototypeOf]]() とする。
    2. parentnull でないなら
      1. parent.[[Set]](P, V, Receiver) を返す。
    3. それ以外なら
      1. ownDesc を PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } に設定する。
  2. IsDataDescriptor(ownDesc) が true なら
    1. ownDesc.[[Writable]]false なら false を返す。
    2. Receiver が Object でないなら false を返す。
    3. existingDescriptor を ? Receiver.[[GetOwnProperty]](P) とする。
    4. existingDescriptorundefined でないなら
      1. IsAccessorDescriptor(existingDescriptor) が true なら false を返す。
      2. existingDescriptor.[[Writable]]false なら false を返す。
      3. valueDesc を PropertyDescriptor { [[Value]]: V } とする。
      4. Receiver.[[DefineOwnProperty]](P, valueDesc) を返す。
    5. それ以外なら
      1. アサート: Receiver は現在プロパティ P を持たない。
      2. CreateDataProperty(Receiver, P, V) を返す。
  3. アサート: IsAccessorDescriptor(ownDesc) は true である。
  4. setterownDesc.[[Set]] とする。
  5. setterundefined なら false を返す。
  6. ? Call(setter, Receiver, « V ») を実行する。
  7. true を返す。

10.1.10 [[Delete]] ( P )

The [[Delete]] internal method of 通常オブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. OrdinaryDelete(O, P) を返す。

10.1.10.1 OrdinaryDelete ( O, P )

The abstract operation OrdinaryDelete takes arguments O (an Object) and P (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. desc を ? O.[[GetOwnProperty]](P) とする。
  2. descundefined なら true を返す。
  3. desc.[[Configurable]]true なら
    1. 名前 P の自身のプロパティを O から除去する。
    2. true を返す。
  4. false を返す。

10.1.11 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of 通常オブジェクト O takes no arguments and returns プロパティキーList を含む正常完了. It performs the following steps when called:

  1. OrdinaryOwnPropertyKeys(O) を返す。

10.1.11.1 OrdinaryOwnPropertyKeys ( O )

The abstract operation OrdinaryOwnPropertyKeys takes argument O (an Object) and returns a List of property keys. It performs the following steps when called:

  1. keys を新しい空の List とする。
  2. O の各自身のプロパティキー P で、P配列インデックスであるものについて、数値的インデックス昇順で:
    1. keysP を追加する。
  3. O の各自身のプロパティキー P で、P が String かつ配列インデックスでないものについて、作成順(時間順)昇順で:
    1. keysP を追加する。
  4. O の各自身のプロパティキー P で、P が Symbol であるものについて、作成順(時間順)昇順で:
    1. keysP を追加する。
  5. keys を返す。

10.1.12 OrdinaryObjectCreate ( proto [ , additionalInternalSlotsList ] )

The abstract operation OrdinaryObjectCreate takes argument proto (an Object or null) and optional argument additionalInternalSlotsList (a List of names of internal slots) and returns an Object. 新しい通常オブジェクトの実行時生成を規定するために使用される。additionalInternalSlotsList には [[Prototype]] および [[Extensible]] に加えてオブジェクトの一部として定義されるべき追加内部スロットの名前が含まれる。additionalInternalSlotsList が与えられない場合、新しい空の List が使用される。 It performs the following steps when called:

  1. internalSlotsList を « [[Prototype]], [[Extensible]] » とする。
  2. additionalInternalSlotsList が存在するなら internalSlotsListinternalSlotsListadditionalInternalSlotsListリスト結合結果に設定する。
  3. OMakeBasicObject(internalSlotsList) とする。
  4. O.[[Prototype]]proto に設定する。
  5. O を返す。
Note

OrdinaryObjectCreate は MakeBasicObject を呼ぶ以上の多くをしないが、エキゾチックではない通常オブジェクトを生成する意図を示す。そのため本仕様内では、結果を非通常にする形で後から内部メソッドを変更するアルゴリズムからは呼ばれない。エキゾチックオブジェクトを生成する操作は直接 MakeBasicObject を呼び出す。

10.1.13 OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] )

The abstract operation OrdinaryCreateFromConstructor takes arguments constructor (a function object) and intrinsicDefaultProto (a String) and optional argument internalSlotsList (a List of names of internal slots) and returns Object を含む正常完了または throw 完了. 存在するならコンストラクタ"prototype" プロパティから取得した [[Prototype]] 値を持つ通常オブジェクトを生成する。存在しない場合 intrinsicDefaultProto で名付けられた intrinsic が [[Prototype]] として使用される。internalSlotsList には追加内部スロット名が含まれる。未指定の場合は空の List が使用される。 It performs the following steps when called:

  1. アサート: intrinsicDefaultProto はこの仕様で定義された intrinsic オブジェクトの名前である。該当オブジェクトは [[Prototype]] 値として使用されることを意図した intrinsic でなければならない。
  2. proto を ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) とする。
  3. internalSlotsList が存在するなら slotsListinternalSlotsList とし、そうでなければ slotsList を新しい空の List とする。
  4. OrdinaryObjectCreate(proto, slotsList) を返す。

10.1.14 GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto )

The abstract operation GetPrototypeFromConstructor takes arguments constructor (a function object) and intrinsicDefaultProto (a String) and returns Object を含む正常完了または throw 完了. 特定のコンストラクタに対応するオブジェクトを作成する際に使用すべき [[Prototype]] 値を決定する。値はコンストラクタ"prototype" プロパティから取得され、存在しない場合 intrinsicDefaultProto で名付けられた intrinsic が [[Prototype]] に用いられる。 It performs the following steps when called:

  1. アサート: intrinsicDefaultProto はこの仕様で定義された intrinsic オブジェクトの名前である。該当オブジェクトはオブジェクトの [[Prototype]] として使われることを意図した intrinsic でなければならない。
  2. proto を ? Get(constructor, "prototype") とする。
  3. proto が Object でないなら
    1. realm を ? GetFunctionRealm(constructor) とする。
    2. protorealmintrinsicDefaultProto という名前の intrinsic オブジェクトに設定する。
  4. proto を返す。
Note

constructor[[Prototype]] 値を提供しない場合、使用される既定値は実行中実行コンテキストではなく constructor 関数の realm から取得される。

10.1.15 RequireInternalSlot ( O, internalSlot )

The abstract operation RequireInternalSlot takes arguments O (an ECMAScript language value) and internalSlot (an internal slot name) and returns unused を含む正常完了または throw 完了. O が Object であり、かつ指定された内部スロットを持つ場合を除いて例外を投げる。 It performs the following steps when called:

  1. O が Object でないなら TypeError 例外を投げる。
  2. OinternalSlot 内部スロットを持たないなら TypeError 例外を投げる。
  3. unused を返す。

10.2 ECMAScript 関数オブジェクト (ECMAScript Function Objects)

ECMAScript 関数オブジェクトは、レキシカル環境を閉じ込めたパラメータ化 ECMAScript コードをカプセル化し、そのコードの動的評価をサポートする。ECMAScript 関数オブジェクト通常オブジェクトであり、他の通常オブジェクトと同じ内部スロットおよび内部メソッドを持つ。ECMAScript 関数オブジェクトのコードは strict mode コード(11.2.2)か非 strict コードのいずれかである。コードが strict mode コードである ECMAScript 関数オブジェクトstrict function と呼ばれる。コードが strict mode コードでないものは non-strict function と呼ばれる。

[[Extensible]][[Prototype]] に加えて、ECMAScript 関数オブジェクトTable 28 に列挙される内部スロットも持つ。

Table 28: ECMAScript 関数オブジェクトの内部スロット (Internal Slots of ECMAScript Function Objects)
Internal Slot Type Description
[[Environment]] an Environment Record 関数がクロージャ化した Environment Record。関数のコードを評価する際の外側環境として使用される。
[[PrivateEnvironment]] a PrivateEnvironment Record or null 関数がクロージャ化した Private Name 用の PrivateEnvironment Record。関数が構文上クラス内に含まれない場合は null。関数のコードを評価するときに内部クラスの外側 PrivateEnvironment として使用される。
[[FormalParameters]] a Parse Node 関数の仮引数リストを定義するソーステキストのルートパースノード。
[[ECMAScriptCode]] a Parse Node 関数本体を定義するソーステキストのルートパースノード。
[[ConstructorKind]] base or derived 関数が派生クラスコンストラクタかどうか。
[[Realm]] a Realm Record 関数が生成された realm。関数評価時にアクセスされる intrinsic オブジェクトを提供する。
[[ScriptOrModule]] a Script Record or a Module Record 関数が生成された script または module。
[[ThisMode]] lexical, strict, or global 関数の仮引数およびコード本体内での this 参照の解釈方法を定義する。lexicalthis がレキシカルに内包する関数の this 値を指すことを意味する。strict は関数呼び出しで与えられた this 値をそのまま用いる。globalthis 値が undefined または null の場合グローバルオブジェクト参照と解釈し、その他の場合は ToObject に渡すことを意味する。
[[Strict]] a Boolean strict function なら truenon-strict function なら false
[[HomeObject]] an Object 関数が super を使用する場合、super プロパティ探索が開始されるオブジェクトを提供する [[GetPrototypeOf]] を持つオブジェクト。
[[SourceText]] a sequence of Unicode code points 関数を定義する source text
[[Fields]] a List of ClassFieldDefinition Records 関数がクラスである場合、その非 static field と対応する初期化子の Record のリスト。
[[PrivateMethods]] a List of PrivateElements 関数がクラスである場合、その非 static private method と accessor を表すリスト。
[[ClassFieldInitializerName]] a String, a Symbol, a Private Name, or empty 関数がクラスフィールドの初期化子として作成される場合、そのフィールドの NamedEvaluation で用いる名前。そうでなければ empty
[[IsClassConstructor]] a Boolean 関数が class constructor かどうか(true の場合、その [[Call]] 呼び出しは直ちに TypeError 例外を投げる)。

すべての ECMAScript 関数オブジェクトはここで定義される [[Call]] 内部メソッドを持つ。コンストラクタでもある ECMAScript 関数は加えて [[Construct]] 内部メソッドを持つ。

10.2.1 [[Call]] ( thisArgument, argumentsList )

The [[Call]] internal method of ECMAScript 関数オブジェクト F takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. callerContext を実行中実行コンテキストとする。
  2. calleeContextPrepareForOrdinaryCall(F, undefined) とする。
  3. アサート: calleeContext が現在の実行中実行コンテキストである。
  4. F.[[IsClassConstructor]]true なら
    1. error を新たに生成された TypeError オブジェクトとする。
    2. 注記: errorF の関連 Realm Record を持つ calleeContext 内で生成される。
    3. 実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。
    4. ThrowCompletion(error) を返す。
  5. OrdinaryCallBindThis(F, calleeContext, thisArgument) を実行する。
  6. resultCompletion(OrdinaryCallEvaluateBody(F, argumentsList)) とする。
  7. 実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。
  8. resultreturn completion なら result.[[Value]] を返す。
  9. アサート: resultthrow completion である。
  10. result を返す。
Note

ステップ 7calleeContext が実行コンテキストスタックから除去されるとき、到達可能な Generator により後で再開のためにサスペンド保持されている場合は破棄されてはならない。

10.2.1.1 PrepareForOrdinaryCall ( F, newTarget )

The abstract operation PrepareForOrdinaryCall takes arguments F (an ECMAScript function object) and newTarget (an Object or undefined) and returns an execution context. It performs the following steps when called:

  1. callerContext を実行中実行コンテキストとする。
  2. calleeContext を新しい ECMAScript コード実行コンテキストとする。
  3. calleeContext の Function を F に設定する。
  4. calleeRealmF.[[Realm]] とする。
  5. calleeContextRealmcalleeRealm に設定する。
  6. calleeContext の ScriptOrModule を F.[[ScriptOrModule]] に設定する。
  7. localEnvNewFunctionEnvironment(F, newTarget) とする。
  8. calleeContext の LexicalEnvironment を localEnv に設定する。
  9. calleeContext の VariableEnvironment を localEnv に設定する。
  10. calleeContext の PrivateEnvironment を F.[[PrivateEnvironment]] に設定する。
  11. callerContext がまだサスペンドされていないなら callerContext をサスペンドする。
  12. 実行コンテキストスタックに calleeContext を push する;calleeContext が実行中実行コンテキストとなる。
  13. 注記: この地点以降に生成される例外オブジェクトは calleeRealm に関連付けられる。
  14. calleeContext を返す。

10.2.1.2 OrdinaryCallBindThis ( F, calleeContext, thisArgument )

The abstract operation OrdinaryCallBindThis takes arguments F (an ECMAScript function object), calleeContext (an execution context), and thisArgument (an ECMAScript language value) and returns unused. It performs the following steps when called:

  1. thisModeF.[[ThisMode]] とする。
  2. thisModelexical なら unused を返す。
  3. calleeRealmF.[[Realm]] とする。
  4. localEnvcalleeContext の LexicalEnvironment とする。
  5. thisModestrict なら
    1. thisValuethisArgument とする。
  6. それ以外
    1. thisArgumentundefinednull のいずれかなら
      1. globalEnvcalleeRealm.[[GlobalEnv]] とする。
      2. アサート: globalEnvGlobal Environment Record である。
      3. thisValueglobalEnv.[[GlobalThisValue]] とする。
    2. それ以外
      1. thisValue を ! ToObject(thisArgument) とする。
      2. 注記: ToObjectcalleeRealm を用いてラッパーオブジェクトを生成する。
  7. アサート: localEnvFunction Environment Record である。
  8. アサート: 次のステップは localEnv.[[ThisBindingStatus]]initialized でないため決して abrupt completion を返さない。
  9. BindThisValue(localEnv, thisValue) を実行する。
  10. unused を返す。

10.2.1.3 Runtime Semantics: EvaluateBody

The syntax-directed operation EvaluateBody takes arguments functionObject (an ECMAScript function object) and argumentsList (a List of ECMAScript language values) and returns a return completion or a throw completion. It is defined piecewise over the following productions:

FunctionBody : FunctionStatementList
  1. FunctionBody の EvaluateFunctionBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
ConciseBody : ExpressionBody
  1. ConciseBody の EvaluateConciseBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
GeneratorBody : FunctionBody
  1. GeneratorBody の EvaluateGeneratorBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
AsyncGeneratorBody : FunctionBody
  1. AsyncGeneratorBody の EvaluateAsyncGeneratorBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
AsyncFunctionBody : FunctionBody
  1. AsyncFunctionBody の EvaluateAsyncFunctionBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
AsyncConciseBody : ExpressionBody
  1. AsyncConciseBody の EvaluateAsyncConciseBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
Initializer : = AssignmentExpression
  1. アサート: argumentsList は空である。
  2. アサート: functionObject.[[ClassFieldInitializerName]]empty ではない。
  3. IsAnonymousFunctionDefinition(AssignmentExpression) が true なら
    1. valueInitializer の NamedEvaluation を引数 functionObject.[[ClassFieldInitializerName]] で行い ? を付して得られる値とする。
  4. それ以外
    1. rhsAssignmentExpression の Evaluation を ? 付きで行った結果とする。
    2. value を ? GetValue(rhs) とする。
  5. ReturnCompletion(value) を返す。
Note

フィールド初期化子は関数境界を構成するが、FunctionDeclarationInstantiation を呼び出しても観測可能な効果はないため省略される。

ClassStaticBlockBody : ClassStaticBlockStatementList
  1. アサート: argumentsList は空である。
  2. ClassStaticBlockBody の EvaluateClassStaticBlockBody を引数 functionObject で評価し ? を付して結果を返す。

10.2.1.4 OrdinaryCallEvaluateBody ( F, argumentsList )

The abstract operation OrdinaryCallEvaluateBody takes arguments F (an ECMAScript function object) and argumentsList (a List of ECMAScript language values) and returns a return completion or a throw completion. It performs the following steps when called:

  1. F.[[ECMAScriptCode]]EvaluateBody を引数 F および argumentsList で評価し ? を付して結果を返す。

10.2.2 [[Construct]] ( argumentsList, newTarget )

The [[Construct]] internal method of ECMAScript 関数オブジェクト F takes arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns Object を含む正常完了または throw 完了. It performs the following steps when called:

  1. callerContext を実行中実行コンテキストとする。
  2. kindF.[[ConstructorKind]] とする。
  3. kindbase なら
    1. thisArgument を ? OrdinaryCreateFromConstructor(newTarget, "%Object.prototype%") とする。
  4. calleeContextPrepareForOrdinaryCall(F, newTarget) とする。
  5. アサート: calleeContext が現在の実行中実行コンテキストである。
  6. kindbase なら
    1. OrdinaryCallBindThis(F, calleeContext, thisArgument) を実行する。
    2. initializeResultCompletion(InitializeInstanceElements(thisArgument, F)) とする。
    3. initializeResultabrupt completion なら
      1. 実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。
      2. initializeResult を返す。
  7. constructorEnvcalleeContext の LexicalEnvironment とする。
  8. resultCompletion(OrdinaryCallEvaluateBody(F, argumentsList)) とする。
  9. 実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。
  10. resultthrow completion なら
    1. result を返す。
  11. アサート: resultreturn completion である。
  12. result.[[Value]] が Object なら result.[[Value]] を返す。
  13. kindbase なら thisArgument を返す。
  14. result.[[Value]]undefined でないなら TypeError 例外を投げる。
  15. thisBinding を ? constructorEnv.GetThisBinding() とする。
  16. アサート: thisBinding は Object である。
  17. thisBinding を返す。

10.2.3 OrdinaryFunctionCreate ( functionPrototype, sourceText, ParameterList, Body, thisMode, env, privateEnv )

The abstract operation OrdinaryFunctionCreate takes arguments functionPrototype (an Object), sourceText (a sequence of Unicode code points), ParameterList (a Parse Node), Body (a Parse Node), thisMode (lexical-this or non-lexical-this), env (an Environment Record), and privateEnv (a PrivateEnvironment Record or null) and returns an ECMAScript function object. 新しい関数を(既定の [[Call]] 内部メソッドと、後で MakeConstructor などの操作によって追加されうる場合を除き [[Construct]] 内部メソッドなしで)実行時生成することを規定する。sourceText は生成対象関数の構文定義のソーステキストである。 It performs the following steps when called:

  1. internalSlotsListTable 28 に列挙された内部スロットとする。
  2. FOrdinaryObjectCreate(functionPrototype, internalSlotsList) とする。
  3. F.[[Call]]10.2.1 で規定される定義に設定する。
  4. F.[[SourceText]]sourceText に設定する。
  5. F.[[FormalParameters]]ParameterList に設定する。
  6. F.[[ECMAScriptCode]]Body に設定する。
  7. Strict を IsStrict(Body) とする。
  8. F.[[Strict]]Strict に設定する。
  9. thisModelexical-this なら F.[[ThisMode]]lexical に設定する。
  10. それ以外で Stricttrue なら F.[[ThisMode]]strict に設定する。
  11. それ以外なら F.[[ThisMode]]global に設定する。
  12. F.[[IsClassConstructor]]false に設定する。
  13. F.[[Environment]]env に設定する。
  14. F.[[PrivateEnvironment]]privateEnv に設定する。
  15. F.[[ScriptOrModule]]GetActiveScriptOrModule() に設定する。
  16. F.[[Realm]]current Realm Record に設定する。
  17. F.[[HomeObject]]undefined に設定する。
  18. F.[[Fields]] を新しい空の List に設定する。
  19. F.[[PrivateMethods]] を新しい空の List に設定する。
  20. F.[[ClassFieldInitializerName]]empty に設定する。
  21. lenParameterList の ExpectedArgumentCount とする。
  22. SetFunctionLength(F, len) を実行する。
  23. F を返す。

10.2.4 AddRestrictedFunctionProperties ( F, realm )

The abstract operation AddRestrictedFunctionProperties takes arguments F (a function object) and realm (a Realm Record) and returns unused. It performs the following steps when called:

  1. アサート: realm.[[Intrinsics]].[[%ThrowTypeError%]] が存在し初期化済みである。
  2. throwerrealm.[[Intrinsics]].[[%ThrowTypeError%]] とする。
  3. DefinePropertyOrThrow(F, "caller", PropertyDescriptor { [[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  4. DefinePropertyOrThrow(F, "arguments", PropertyDescriptor { [[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  5. unused を返す。

10.2.4.1 %ThrowTypeError% ( )

この関数は %ThrowTypeError% intrinsic オブジェクトである。

realm ごとに一度定義される匿名の組み込み関数オブジェクトである。

呼び出されたとき次の手順を実行する:

  1. TypeError 例外を投げる。

この関数の [[Extensible]] 内部スロットの値は false である。

この関数の "length" プロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

この関数の "name" プロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

10.2.5 MakeConstructor ( F [ , writablePrototype [ , prototype ] ] )

The abstract operation MakeConstructor takes argument F (an ECMAScript function object or a built-in function object) and optional arguments writablePrototype (a Boolean) and prototype (an Object) and returns unused. Fコンストラクタに変換する。 It performs the following steps when called:

  1. F が ECMAScript 関数オブジェクトなら
    1. アサート: IsConstructor(F) は false
    2. アサート: F"prototype" 自身プロパティを持たない拡張可能オブジェクトである。
    3. F.[[Construct]]10.2.2 で規定される定義に設定する。
  2. それ以外
    1. F.[[Construct]]10.3.2 で規定される定義に設定する。
  3. F.[[ConstructorKind]]base に設定する。
  4. writablePrototype が与えられていなければ writablePrototypetrue に設定する。
  5. prototype が与えられていないなら
    1. prototypeOrdinaryObjectCreate(%Object.prototype%) に設定する。
    2. DefinePropertyOrThrow(prototype, "constructor", PropertyDescriptor { [[Value]]: F, [[Writable]]: writablePrototype, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  6. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: writablePrototype, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  7. unused を返す。

10.2.6 MakeClassConstructor ( F )

The abstract operation MakeClassConstructor takes argument F (an ECMAScript function object) and returns unused. It performs the following steps when called:

  1. アサート: F.[[IsClassConstructor]]false
  2. F.[[IsClassConstructor]]true に設定する。
  3. unused を返す。

10.2.7 MakeMethod ( F, homeObject )

The abstract operation MakeMethod takes arguments F (an ECMAScript function object) and homeObject (an Object) and returns unused. F を method として構成する。 It performs the following steps when called:

  1. アサート: homeObject通常オブジェクトである。
  2. F.[[HomeObject]]homeObject に設定する。
  3. unused を返す。

10.2.8 DefineMethodProperty ( homeObject, key, closure, enumerable )

The abstract operation DefineMethodProperty takes arguments homeObject (an Object), key (a property key or Private Name), closure (a function object), and enumerable (a Boolean) and returns PrivateElement または unused を含む正常完了、または abrupt completion. It performs the following steps when called:

  1. アサート: homeObject は通常で拡張可能なオブジェクトである。
  2. keyPrivate Name なら
    1. PrivateElement { [[Key]]: key, [[Kind]]: method, [[Value]]: closure } を返す。
  3. それ以外
    1. desc を PropertyDescriptor { [[Value]]: closure, [[Writable]]: true, [[Enumerable]]: enumerable, [[Configurable]]: true } とする。
    2. DefinePropertyOrThrow(homeObject, key, desc) を実行する。
    3. 注記: DefinePropertyOrThrowkey"prototype" であるクラス static method の定義を試みる場合のみ abrupt completion を返しうる。
    4. unused を返す。

10.2.9 SetFunctionName ( F, name [ , prefix ] )

The abstract operation SetFunctionName takes arguments F (a function object) and name (a property key or Private Name) and optional argument prefix (a String) and returns unused. F"name" プロパティを追加する。 It performs the following steps when called:

  1. アサート: F"name" 自身プロパティを持たない拡張可能オブジェクトである。
  2. name が Symbol なら
    1. descriptionname.[[Description]] とする。
    2. descriptionundefined なら name を空文字列に設定する。
    3. それ以外なら name"[", description, "]"文字列連結に設定する。
  3. それ以外で namePrivate Name なら
    1. namename.[[Description]] に設定する。
  4. F[[InitialName]] 内部スロットを持つなら
    1. F.[[InitialName]]name に設定する。
  5. prefix が与えられているなら
    1. nameprefix、コード単位 0x0020 (SPACE)、name の連結に設定する。
    2. F[[InitialName]] 内部スロットを持つなら
      1. 注記: 以下のステップでの選択は本抽象操作呼び出し毎に独立に行われる。
      2. 任意で F.[[InitialName]]name に設定してよい。
  6. DefinePropertyOrThrow(F, "name", PropertyDescriptor { [[Value]]: name, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  7. unused を返す。

10.2.10 SetFunctionLength ( F, length )

The abstract operation SetFunctionLength takes arguments F (a function object) and length (a non-negative integer or +∞) and returns unused. F"length" プロパティを追加する。 It performs the following steps when called:

  1. アサート: F"length" 自身プロパティを持たない拡張可能オブジェクトである。
  2. DefinePropertyOrThrow(F, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  3. unused を返す。

10.2.11 FunctionDeclarationInstantiation ( func, argumentsList )

The abstract operation FunctionDeclarationInstantiation takes arguments func (an ECMAScript function object) and argumentsList (a List of ECMAScript language values) and returns unused を含む正常完了または throw 完了. func は実行コンテキストが確立される関数オブジェクトである。

Note

ECMAScript 関数の評価のために実行コンテキストが確立されると、新しい Function Environment Record が作成され、各仮引数の束縛がその Environment Record にインスタンス化される。関数本体内の各宣言もインスタンス化される。関数の仮引数に既定値初期化子が含まれない場合、本体宣言は仮引数と同じ Environment Record 内にインスタンス化される。既定値パラメータ初期化子が存在する場合、本体宣言用に 2 つ目の Environment Record が作成される。仮引数および関数は FunctionDeclarationInstantiation の一部として初期化される。その他の束縛は関数本体の評価中に初期化される。

呼び出されたとき次の手順を実行する:

  1. calleeContext を実行中実行コンテキストとする。
  2. codefunc.[[ECMAScriptCode]] とする。
  3. strictfunc.[[Strict]] とする。
  4. formalsfunc.[[FormalParameters]] とする。
  5. parameterNamesformals の BoundNames とする。
  6. parameterNames が重複要素を持つなら hasDuplicatestrue、そうでなければ false とする。
  7. simpleParameterList を IsSimpleParameterList of formals とする。
  8. hasParameterExpressions を ContainsExpression of formals とする。
  9. varNamescode の VarDeclaredNames とする。
  10. varDeclarationscode の VarScopedDeclarations とする。
  11. lexicalNamescode の LexicallyDeclaredNames とする。
  12. functionNames を新しい空の List とする。
  13. functionsToInitialize を新しい空の List とする。
  14. varDeclarations の各要素 d について、List の逆順で:
    1. dVariableDeclaration でも ForBinding でも BindingIdentifier でもないなら
      1. アサート: dFunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration のいずれかである。
      2. fnd の BoundNames の唯一の要素とする。
      3. functionNamesfn を含まないなら
        1. fnfunctionNames の先頭に挿入する。
        2. 注記: 同名の複数の関数宣言がある場合、最後の宣言が使用される。
        3. dfunctionsToInitialize の先頭に挿入する。
  15. argumentsObjectNeededtrue とする。
  16. func.[[ThisMode]]lexical なら
    1. 注記: Arrow function は arguments オブジェクトを持たない。
    2. argumentsObjectNeededfalse に設定する。
  17. それ以外で parameterNames"arguments" を含むなら
    1. argumentsObjectNeededfalse に設定する。
  18. それ以外で hasParameterExpressionsfalse なら
    1. functionNames"arguments" を含むか lexicalNames"arguments" を含むなら
      1. argumentsObjectNeededfalse に設定する。
  19. stricttrue または hasParameterExpressionsfalse なら
    1. 注記: strict mode コードでの eval 呼び出しは外側に可視な新しい束縛を生成できないため、仮引数には単一の Environment Record だけが必要。
    2. envcalleeContext の LexicalEnvironment とする。
  20. それ以外
    1. 注記: 形式パラメータリスト内の direct eval 呼び出しで生成される束縛がパラメータ宣言環境外になるよう別の Environment Record が必要。
    2. calleeEnvcalleeContext の LexicalEnvironment とする。
    3. envNewDeclarativeEnvironment(calleeEnv) とする。
    4. アサート: calleeContext の VariableEnvironment と calleeEnv は同じ Environment Record
    5. calleeContext の LexicalEnvironment を env に設定する。
  21. parameterNames の各 String paramName について
    1. alreadyDeclared を ! env.HasBinding(paramName) とする。
    2. 注記: 早期エラーにより重複パラメータ名はデフォルト値または rest パラメータを持たない non-strict 関数でのみ許される。
    3. alreadyDeclaredfalse なら
      1. env.CreateMutableBinding(paramName, false) を実行する。
      2. hasDuplicatestrue なら
        1. env.InitializeBinding(paramName, undefined) を実行する。
  22. argumentsObjectNeededtrue なら
    1. stricttrue または simpleParameterListfalse なら
      1. aoCreateUnmappedArgumentsObject(argumentsList) とする。
    2. それ以外
      1. 注記: mapped arguments オブジェクトは rest パラメータ・デフォルト値初期化子・分割代入パラメータを持たない non-strict 関数にのみ提供される。
      2. aoCreateMappedArgumentsObject(func, formals, argumentsList, env) とする。
    3. stricttrue なら
      1. env.CreateImmutableBinding("arguments", false) を実行する。
      2. 注記: strict mode では早期エラーによりこの束縛への代入試行が防がれるため不変性は観測できない。
    4. それ以外
      1. env.CreateMutableBinding("arguments", false) を実行する。
    5. env.InitializeBinding("arguments", ao) を実行する。
    6. parameterBindingsparameterNames と « "arguments" » のリスト結合とする。
  23. それ以外
    1. parameterBindingsparameterNames とする。
  24. iteratorRecordCreateListIteratorRecord(argumentsList) とする。
  25. hasDuplicatestrue なら
    1. usedEnvundefined とする。
  26. それ以外
    1. usedEnvenv とする。
  27. 注記: 次のステップは ReturnCompletion を返しえない。expression 位置でそのような completion が生じる唯一の方法は YieldExpression の使用だが、これは 15.5.115.6.1 の Early Error 規則でパラメータリスト内で禁止される。
  28. ? IteratorBindingInitialization of formals with arguments iteratorRecord and usedEnv を実行する。
  29. hasParameterExpressionsfalse なら
    1. 注記: 仮引数とトップレベル var には単一 Environment Record でよい。
    2. instantiatedVarNamesList parameterBindings のコピーとする。
    3. varNames の各要素 n について
      1. instantiatedVarNamesn を含まないなら
        1. ninstantiatedVarNames に追加する。
        2. env.CreateMutableBinding(n, false) を実行する。
        3. env.InitializeBinding(n, undefined) を実行する。
    4. varEnvenv とする。
  30. それ以外
    1. 注記: 形式パラメータリスト内の式で生成されるクロージャが関数本体内の宣言を可視化しないよう別 Environment Record が必要。
    2. varEnvNewDeclarativeEnvironment(env) とする。
    3. calleeContext の VariableEnvironment を varEnv に設定する。
    4. instantiatedVarNames を新しい空の List とする。
    5. varNames の各要素 n について
      1. instantiatedVarNamesn を含まないなら
        1. ninstantiatedVarNames に追加する。
        2. varEnv.CreateMutableBinding(n, false) を実行する。
        3. parameterBindingsn を含まない、または functionNamesn を含むなら
          1. initialValueundefined とする。
        4. それ以外
          1. initialValue を ! env.GetBindingValue(n, false) とする。
        5. varEnv.InitializeBinding(n, initialValue) を実行する。
        6. 注記: 仮引数と同じ名前の var は初期的に対応する初期化済み仮引数と同じ値を持つ。
  31. stricttrue なら
    1. lexEnvvarEnv とする。
  32. それ以外
    1. Normative Optional
      ホストが web ブラウザであるか、または ブロックレベル Function 宣言 (Web レガシー互換意味論) をサポートするなら
      1. code Contains xtrue である任意の Block, CaseClause, DefaultClauseStatementList に直接含まれる各 FunctionDeclaration f について
        1. FfBindingIdentifier の StringValue とする。
        2. FunctionDeclaration fFBindingIdentifier とする VariableStatement に置き換えても func に Early Errors を生じさせず、かつ parameterNamesF を含まないなら
          1. 注記: F の var 束縛は VarDeclaredName、仮引数名、別の FunctionDeclaration のいずれでもない場合のみここでインスタンス化される。
          2. instantiatedVarNamesF を含まずかつ F"arguments" でないなら
            1. varEnv.CreateMutableBinding(F, false) を実行する。
            2. varEnv.InitializeBinding(F, undefined) を実行する。
            3. FinstantiatedVarNames に追加する。
          3. FunctionDeclaration f が評価されるとき、15.2.6 で提供される FunctionDeclaration Evaluation アルゴリズムの代わりに次を行う:
            1. fEnv を実行中実行コンテキストの VariableEnvironment とする。
            2. bEnv を実行中実行コンテキストの LexicalEnvironment とする。
            3. fObj を ! bEnv.GetBindingValue(F, false) とする。
            4. fEnv.SetMutableBinding(F, fObj, false) を実行する。
            5. unused を返す。
    2. lexEnvNewDeclarativeEnvironment(varEnv) とする。
    3. 注記: Non-strict 関数はトップレベル lexical 宣言用に別の Environment Record を使用し、direct eval が eval コードで導入される var スコープ宣言が既存のトップレベル lexical 宣言と衝突するか判別できるようにする。strict 関数では strict direct eval がすべての宣言を新しい Environment Record に置くため不要。
  33. calleeContext の LexicalEnvironment を lexEnv に設定する。
  34. lexDeclarationscode の LexicallyScopedDeclarations とする。
  35. lexDeclarations の各要素 d について
    1. 注記: lexical に宣言された名前は function/generator 宣言、仮引数、var 名と同一になりえない。lexical 宣言された名前はここでインスタンス化されるが初期化されない。
    2. d の BoundNames の各要素 dn について
      1. IsConstantDeclaration of dtrue なら
        1. lexEnv.CreateImmutableBinding(dn, true) を実行する。
      2. それ以外
        1. lexEnv.CreateMutableBinding(dn, false) を実行する。
  36. privateEnvcalleeContext の PrivateEnvironment とする。
  37. functionsToInitialize の各 Parse Node f について
    1. fnf の BoundNames の唯一の要素とする。
    2. fo を InstantiateFunctionObject of f with arguments lexEnv and privateEnv とする。
    3. varEnv.SetMutableBinding(fn, fo, false) を実行する。
  38. unused を返す。

10.3 組み込み関数オブジェクト (Built-in Function Objects)

組み込み関数オブジェクト通常オブジェクトであり、10.1 で定められる通常オブジェクトの要件を満たさなければならない。

すべての通常オブジェクトに要求される内部スロット(10.1 参照)に加えて、組み込み関数オブジェクトは次の内部スロットも持たなければならない:

  • [[Realm]]: その関数が生成された realm を表す Realm Record
  • [[InitialName]]: 関数の初期名である String。20.2.3.5 で使用される。

組み込み関数オブジェクト[[Prototype]] 内部スロットの初期値は、特に指定がない限り %Function.prototype% である。

組み込み関数オブジェクト10.3.1 の定義に適合する [[Call]] 内部メソッドを持たなければならない。

組み込み関数オブジェクトは “constructor” と記述される場合、または本仕様のあるアルゴリズムが明示的にその [[Construct]] 内部メソッドを設定する場合に限り [[Construct]] 内部メソッドを持つ。そうした [[Construct]] 内部メソッドは 10.3.2 の定義に適合しなければならない。

実装は本仕様で定義されない追加の組み込み関数オブジェクトを提供してもよい。

10.3.1 [[Call]] ( thisArgument, argumentsList )

The [[Call]] internal method of 組み込み関数オブジェクト F takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. BuiltinCallOrConstruct(F, thisArgument, argumentsList, undefined) を返す。

10.3.2 [[Construct]] ( argumentsList, newTarget )

The [[Construct]] internal method of (このメソッドを持つ場合の)組み込み関数オブジェクト F takes arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns Object を含む正常完了または throw 完了. It performs the following steps when called:

  1. result を ? BuiltinCallOrConstruct(F, uninitialized, argumentsList, newTarget) とする。
  2. アサート: result は Object である。
  3. result を返す。

10.3.3 BuiltinCallOrConstruct ( F, thisArgument, argumentsList, newTarget )

The abstract operation BuiltinCallOrConstruct takes arguments F (a built-in function object), thisArgument (an ECMAScript language value or uninitialized), argumentsList (a List of ECMAScript language values), and newTarget (a constructor or undefined) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. callerContext を実行中実行コンテキストとする。
  2. callerContext がまだサスペンドされていないなら callerContext をサスペンドする。
  3. calleeContext を新しい実行コンテキストとする。
  4. calleeContext の Function を F に設定する。
  5. calleeRealmF.[[Realm]] とする。
  6. calleeContextRealmcalleeRealm に設定する。
  7. calleeContext の ScriptOrModule を null に設定する。
  8. 必要な実装定義の初期化を calleeContext に対して行う。
  9. 実行コンテキストスタックに calleeContext を push する;calleeContext が実行中実行コンテキストとなる。
  10. result を、F の仕様に適合する形で F を評価した結果である Completion Record とする。thisArgumentuninitialized なら this 値は未初期化、それ以外の場合 thisArgumentthis 値を提供する。argumentsList は名前付き引数を提供し、newTarget は NewTarget 値を提供する。
  11. 注記: F がこの文書内で定義されている場合、「F の仕様」とはアルゴリズム手順や他の手段で指定されたその挙動である。
  12. 実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。
  13. result を返す。
Note

calleeContext が実行コンテキストスタックから除去されるとき、アクセス可能な Generator により後で再開するためサスペンド保持されている場合は破棄されてはならない。

10.3.4 CreateBuiltinFunction ( behaviour, length, name, additionalInternalSlotsList [ , realm [ , prototype [ , prefix ] ] ] )

The abstract operation CreateBuiltinFunction takes arguments behaviour (an Abstract Closure, a set of algorithm steps, or some other definition of a function's behaviour provided in this specification), length (a non-negative integer or +∞), name (a property key or a Private Name), and additionalInternalSlotsList (a List of names of internal slots) and optional arguments realm (a Realm Record), prototype (an Object or null), and prefix (a String) and returns a built-in function object. additionalInternalSlotsList にはオブジェクトの一部として定義されなければならない追加内部スロット名が含まれる。この操作は組み込み関数オブジェクトを生成する。 It performs the following steps when called:

  1. realm が与えられていなければ realmcurrent Realm Record に設定する。
  2. prototype が与えられていなければ prototyperealm.[[Intrinsics]].[[%Function.prototype%]] に設定する。
  3. internalSlotsList を、これから生成する組み込み関数オブジェクト10.3 が要求するすべての内部スロット名を含む List とする。
  4. additionalInternalSlotsList の要素を internalSlotsList に追加する。
  5. func を新しい組み込み関数オブジェクトとし、呼び出されたとき behaviour で指定された対応パラメータに与えられた引数を渡して behaviour に記述された動作を行うものとする。この新しい関数オブジェクトは名前が internalSlotsList の要素である内部スロット群と [[InitialName]] 内部スロットを持つ。
  6. func.[[Prototype]]prototype に設定する。
  7. func.[[Extensible]]true に設定する。
  8. func.[[Realm]]realm に設定する。
  9. func.[[InitialName]]null に設定する。
  10. SetFunctionLength(func, length) を実行する。
  11. prefix が与えられていないなら
    1. SetFunctionName(func, name) を実行する。
  12. それ以外
    1. SetFunctionName(func, name, prefix) を実行する。
  13. func を返す。

本仕様で定義される各組み込み関数は CreateBuiltinFunction 抽象操作を呼び出すことで生成される。

10.4 組み込みエキゾチックオブジェクトの内部メソッドとスロット (Built-in Exotic Object Internal Methods and Slots)

本仕様はいくつかの種類の組み込みエキゾチックオブジェクトを定義する。これらのオブジェクトは特定の状況を除いて一般に通常オブジェクトと同様に振る舞う。以下のエキゾチックオブジェクトは、下で明示的に別途指定される場合を除き通常オブジェクト内部メソッドを使用する:

10.4.1 束縛関数エキゾチックオブジェクト (Bound Function Exotic Objects)

束縛関数エキゾチックオブジェクトは別の関数オブジェクトを包むエキゾチックオブジェクトである。束縛関数エキゾチックオブジェクトは呼び出し可能([[Call]] 内部メソッドを持ち、[[Construct]] 内部メソッドを持つ場合がある)。束縛関数エキゾチックオブジェクトを呼び出すことは一般に包まれた関数の呼び出しをもたらす。

オブジェクトの [[Call]] および(該当する場合)[[Construct]] 内部メソッドが以下の実装を使用し、その他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは 束縛関数エキゾチックオブジェクト である。これらのメソッドは BoundFunctionCreate で設定される。

束縛関数エキゾチックオブジェクトTable 28 に列挙される ECMAScript 関数オブジェクトの内部スロットを持たない。代わりに [[Prototype]][[Extensible]] に加えて Table 29 に列挙される内部スロットを持つ。

Table 29: 束縛関数エキゾチックオブジェクトの内部スロット (Internal Slots of Bound Function Exotic Objects)
Internal Slot Type Description
[[BoundTargetFunction]] a callable Object 包まれている関数オブジェクト
[[BoundThis]] an ECMAScript language value 包まれた関数を呼ぶ際に常に this 値として渡される値。
[[BoundArguments]] a List of ECMAScript language values 包まれた関数へのあらゆる呼び出しで最初の引数として使用される要素のリスト。

10.4.1.1 [[Call]] ( thisArgument, argumentsList )

The [[Call]] internal method of 束縛関数エキゾチックオブジェクト F takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. targetF.[[BoundTargetFunction]] とする。
  2. boundThisF.[[BoundThis]] とする。
  3. boundArgsF.[[BoundArguments]] とする。
  4. argsboundArgsargumentsListリスト結合とする。
  5. ? Call(target, boundThis, args) を返す。

10.4.1.2 [[Construct]] ( argumentsList, newTarget )

The [[Construct]] internal method of 束縛関数エキゾチックオブジェクト F takes arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns Object を含む正常完了または throw 完了. It performs the following steps when called:

  1. targetF.[[BoundTargetFunction]] とする。
  2. アサート: IsConstructor(target) は true
  3. boundArgsF.[[BoundArguments]] とする。
  4. argsboundArgsargumentsListリスト結合とする。
  5. SameValue(F, newTarget) が true なら newTargettarget に設定する。
  6. ? Construct(target, args, newTarget) を返す。

10.4.1.3 BoundFunctionCreate ( targetFunction, boundThis, boundArgs )

The abstract operation BoundFunctionCreate takes arguments targetFunction (a function object), boundThis (an ECMAScript language value), and boundArgs (a List of ECMAScript language values) and returns function object を含む正常完了または throw 完了. 新しい束縛関数エキゾチックオブジェクトの生成を規定する。 It performs the following steps when called:

  1. proto を ? targetFunction.[[GetPrototypeOf]]() とする。
  2. internalSlotsList を « [[Prototype]], [[Extensible]] » と Table 29 に列挙される内部スロットのリスト結合とする。
  3. objMakeBasicObject(internalSlotsList) とする。
  4. obj.[[Prototype]]proto に設定する。
  5. obj.[[Call]]10.4.1.1 で述べるとおりに設定する。
  6. IsConstructor(targetFunction) が true なら
    1. obj.[[Construct]]10.4.1.2 で述べるとおりに設定する。
  7. obj.[[BoundTargetFunction]]targetFunction に設定する。
  8. obj.[[BoundThis]]boundThis に設定する。
  9. obj.[[BoundArguments]]boundArgs に設定する。
  10. obj を返す。

10.4.2 配列エキゾチックオブジェクト (Array Exotic Objects)

Array は配列インデックスプロパティキー6.1.7 参照)に特別な扱いを与えるエキゾチックオブジェクトである。プロパティ名配列インデックスであるプロパティは 要素 (element) とも呼ばれる。すべての Array は設定不可 ("length") プロパティを持ち、その値は常に 232 より厳密に小さい非負整数的 Number である。"length" プロパティの値は、自身の名前が配列インデックスであるすべての自身プロパティ名より数値的に大きい;Array の自身プロパティが生成または変更されたとき、この不変条件を維持するために他のプロパティが必要に応じ調整される。具体的には、名前が配列インデックスである自身プロパティが追加されるたび、必要なら "length" プロパティの値はその配列インデックスの数値値 + 1 に変更され;"length" プロパティの値が変更されるたび、新しい length 以上の値を持つ配列インデックス名の自身プロパティはすべて削除される。この制約は Array の自身プロパティにのみ適用され、そのプロトタイプから継承される "length"配列インデックスプロパティには影響されない。

オブジェクトの [[DefineOwnProperty]] 内部メソッドが以下の実装を使用し、他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは Array エキゾチックオブジェクト(単に Array)である。これらのメソッドは ArrayCreate で設定される。

10.4.2.1 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of Array エキゾチックオブジェクト A takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. P"length" なら
    1. ArraySetLength(A, Desc) を返す。
  2. それ以外で P配列インデックスなら
    1. lengthDescOrdinaryGetOwnProperty(A, "length") とする。
    2. アサート: lengthDescundefined ではない。
    3. アサート: IsDataDescriptor(lengthDesc) は true
    4. アサート: lengthDesc.[[Configurable]]false
    5. lengthlengthDesc.[[Value]] とする。
    6. アサート: length は非負整数的 Number である。
    7. index を ! ToUint32(P) とする。
    8. indexlength かつ lengthDesc.[[Writable]]false なら false を返す。
    9. succeeded を ! OrdinaryDefineOwnProperty(A, P, Desc) とする。
    10. succeededfalse なら false を返す。
    11. indexlength なら
      1. lengthDesc.[[Value]]index + 1𝔽 に設定する。
      2. succeeded を ! OrdinaryDefineOwnProperty(A, "length", lengthDesc) に設定する。
      3. アサート: succeededtrue
    12. true を返す。
  3. OrdinaryDefineOwnProperty(A, P, Desc) を返す。

10.4.2.2 ArrayCreate ( length [ , proto ] )

The abstract operation ArrayCreate takes argument length (a non-negative integer) and optional argument proto (an Object) and returns Array エキゾチックオブジェクトまたは throw 完了. 新しい Array の生成を規定する。 It performs the following steps when called:

  1. length > 232 - 1 なら RangeError 例外を投げる。
  2. proto が与えられていなければ proto%Array.prototype% に設定する。
  3. AMakeBasicObject[[Prototype]], [[Extensible]] ») とする。
  4. A.[[Prototype]]proto に設定する。
  5. A.[[DefineOwnProperty]]10.4.2.1 で規定されるとおりに設定する。
  6. OrdinaryDefineOwnProperty(A, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  7. A を返す。

10.4.2.3 ArraySpeciesCreate ( originalArray, length )

The abstract operation ArraySpeciesCreate takes arguments originalArray (an Object) and length (a non-negative integer) and returns Object を含む正常完了または throw 完了. originalArray から派生したコンストラクタ関数を用いて新しい Array または類似オブジェクトを生成することを規定する。コンストラクタが Array を返すことは強制されない。 It performs the following steps when called:

  1. isArray を ? IsArray(originalArray) とする。
  2. isArrayfalse なら ? ArrayCreate(length) を返す。
  3. C を ? Get(originalArray, "constructor") とする。
  4. IsConstructor(C) が true なら
    1. thisRealmcurrent Realm Record とする。
    2. realmC を ? GetFunctionRealm(C) とする。
    3. thisRealmrealmC が同じ Realm Record でないなら
      1. SameValue(C, realmC.[[Intrinsics]].[[%Array%]]) が true なら Cundefined に設定する。
  5. C が Object なら
    1. C を ? Get(C, %Symbol.species%) に設定する。
    2. Cnull なら Cundefined に設定する。
  6. Cundefined なら ? ArrayCreate(length) を返す。
  7. IsConstructor(C) が false なら TypeError 例外を投げる。
  8. ? Construct(C, « 𝔽(length) ») を返す。
Note

originalArray が実行中実行コンテキストの realm ではない realm の標準組み込み Array コンストラクタを用いて生成されていた場合、実行中実行コンテキストの realm を用いて新しい Array が生成される。これは歴史的に Array.prototype メソッドがそのような動作をしていた Web ブラウザとの互換性を維持する。

10.4.2.4 ArraySetLength ( A, Desc )

The abstract operation ArraySetLength takes arguments A (an Array) and Desc (a Property Descriptor) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. Desc[[Value]] フィールドを持たないなら
    1. OrdinaryDefineOwnProperty(A, "length", Desc) を返す。
  2. newLenDescDesc のコピーとする。
  3. newLen を ? ToUint32(Desc.[[Value]]) とする。
  4. numberLen を ? ToNumber(Desc.[[Value]]) とする。
  5. SameValueZero(newLen, numberLen) が false なら RangeError 例外を投げる。
  6. newLenDesc.[[Value]]newLen に設定する。
  7. oldLenDescOrdinaryGetOwnProperty(A, "length") とする。
  8. アサート: oldLenDescundefined ではない。
  9. アサート: IsDataDescriptor(oldLenDesc) は true
  10. アサート: oldLenDesc.[[Configurable]]false
  11. oldLenoldLenDesc.[[Value]] とする。
  12. newLenoldLen なら
    1. OrdinaryDefineOwnProperty(A, "length", newLenDesc) を返す。
  13. oldLenDesc.[[Writable]]false なら false を返す。
  14. newLenDesc[[Writable]] フィールドを持たないか newLenDesc.[[Writable]]true なら
    1. newWritabletrue とする。
  15. それ以外
    1. 注記: [[Writable]] 属性を false に設定するのは、要素が削除できない場合に備えて遅延される。
    2. newWritablefalse とする。
    3. newLenDesc.[[Writable]]true に設定する。
  16. succeeded を ! OrdinaryDefineOwnProperty(A, "length", newLenDesc) とする。
  17. succeededfalse なら false を返す。
  18. A の各自身プロパティキー PP配列インデックスかつ ! ToUint32(P) ≥ newLen であるものについて、数値インデックス降順で:
    1. deleteSucceeded を ! A.[[Delete]](P) とする。
    2. deleteSucceededfalse なら
      1. newLenDesc.[[Value]] を ! ToUint32(P) + 1𝔽 に設定する。
      2. newWritablefalse なら newLenDesc.[[Writable]]false に設定する。
      3. OrdinaryDefineOwnProperty(A, "length", newLenDesc) を実行する。
      4. false を返す。
  19. newWritablefalse なら
    1. succeeded を ! OrdinaryDefineOwnProperty(A, "length", PropertyDescriptor { [[Writable]]: false }) に設定する。
    2. アサート: succeededtrue
  20. true を返す。
Note

ステップ 3 および 4 では、Desc.[[Value]] がオブジェクトの場合その valueOf メソッドが 2 回呼び出される。これは本仕様第 2 版以降この効果を伴うよう規定されたレガシー動作である。

10.4.3 文字列エキゾチックオブジェクト (String Exotic Objects)

String オブジェクトは String 値をカプセル化し、その String 値の個々のコード単位要素に対応する仮想の整数インデックス付きデータプロパティを公開するエキゾチックオブジェクトである。String エキゾチックオブジェクトは常に "length" という名前のデータプロパティを持ち、その値はカプセル化された String 値の長さである。コード単位データプロパティ"length" プロパティはいずれも書き込み不可かつ設定不可である。

オブジェクトの [[GetOwnProperty]][[DefineOwnProperty]][[OwnPropertyKeys]] 内部メソッドが以下の実装を使用し、他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは String エキゾチックオブジェクト(単に String オブジェクト)である。これらのメソッドは StringCreate で設定される。

String エキゾチックオブジェクト通常オブジェクトと同じ内部スロットを持つ。また [[StringData]] 内部スロットを持つ。

10.4.3.1 [[GetOwnProperty]] ( P )

The [[GetOwnProperty]] internal method of String エキゾチックオブジェクト S takes argument P (a property key) and returns Property Descriptorundefined を含む正常完了. It performs the following steps when called:

  1. descOrdinaryGetOwnProperty(S, P) とする。
  2. descundefined でないなら desc を返す。
  3. StringGetOwnProperty(S, P) を返す。

10.4.3.2 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of String エキゾチックオブジェクト S takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. stringDescStringGetOwnProperty(S, P) とする。
  2. stringDescundefined でないなら
    1. extensibleS.[[Extensible]] とする。
    2. IsCompatiblePropertyDescriptor(extensible, Desc, stringDesc) を返す。
  3. OrdinaryDefineOwnProperty(S, P, Desc) を返す。

10.4.3.3 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of String エキゾチックオブジェクト O takes no arguments and returns プロパティキーList を含む正常完了. It performs the following steps when called:

  1. keys を新しい空の List とする。
  2. strO.[[StringData]] とする。
  3. アサート: str は String である。
  4. lenstr の長さとする。
  5. 0 ≤ i < len を満たす各整数 i について昇順で:
    1. ToString(𝔽(i)) を keys に追加する。
  6. O の各自身プロパティキー PP配列インデックスかつ ! ToIntegerOrInfinity(P) ≥ len であるものについて、数値インデックス昇順で:
    1. Pkeys に追加する。
  7. O の各自身プロパティキー PP が String かつ配列インデックスでないものについて、作成順昇順で:
    1. Pkeys に追加する。
  8. O の各自身プロパティキー PP が Symbol であるものについて、作成順昇順で:
    1. Pkeys に追加する。
  9. keys を返す。

10.4.3.4 StringCreate ( value, prototype )

The abstract operation StringCreate takes arguments value (a String) and prototype (an Object) and returns a String exotic object. 新しい String エキゾチックオブジェクトの生成を規定する。 It performs the following steps when called:

  1. SMakeBasicObject[[Prototype]], [[Extensible]], [[StringData]] ») とする。
  2. S.[[Prototype]]prototype に設定する。
  3. S.[[StringData]]value に設定する。
  4. S.[[GetOwnProperty]]10.4.3.1 で規定されるとおりに設定する。
  5. S.[[DefineOwnProperty]]10.4.3.2 で規定されるとおりに設定する。
  6. S.[[OwnPropertyKeys]]10.4.3.3 で規定されるとおりに設定する。
  7. lengthvalue の長さとする。
  8. DefinePropertyOrThrow(S, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  9. S を返す。

10.4.3.5 StringGetOwnProperty ( S, P )

The abstract operation StringGetOwnProperty takes arguments S (an Object that has a [[StringData]] internal slot) and P (a property key) and returns a Property Descriptor or undefined. It performs the following steps when called:

  1. P が String でなければ undefined を返す。
  2. indexCanonicalNumericIndexString(P) とする。
  3. index整数的 Number でなければ undefined を返す。
  4. index-0𝔽 または index < -0𝔽 なら undefined を返す。
  5. strS.[[StringData]] とする。
  6. アサート: str は String。
  7. lenstr の長さとする。
  8. (index) ≥ len なら undefined を返す。
  9. resultStrstr(index) から (index) + 1 までの部分文字列とする。
  10. PropertyDescriptor { [[Value]]: resultStr, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false } を返す。

10.4.4 arguments エキゾチックオブジェクト (Arguments Exotic Objects)

ほとんどの ECMAScript 関数はそのコードに arguments オブジェクトを利用可能にする。関数定義の特性に応じて、その arguments オブジェクトは通常オブジェクトarguments エキゾチックオブジェクトのいずれかである。arguments エキゾチックオブジェクトは、配列インデックスプロパティが関連 ECMAScript 関数の呼び出しでの仮引数束縛に対応付けられるエキゾチックオブジェクトである。

オブジェクトの内部メソッドが以下の実装を使用し、ここで指定されないものが 10.1 の定義を使用する場合、そのオブジェクトは arguments エキゾチックオブジェクト である。これらのメソッドは CreateMappedArgumentsObject で設定される。

Note 1

CreateUnmappedArgumentsObject はこの節にまとめられているが、通常オブジェクトを生成し arguments エキゾチックオブジェクトは生成しない。

arguments エキゾチックオブジェクト通常オブジェクトと同じ内部スロットを持つ。また [[ParameterMap]] 内部スロットを持つ。通常の arguments オブジェクトも常に undefined である [[ParameterMap]] 内部スロットを持つ。通常の arguments オブジェクトでは [[ParameterMap]] 内部スロットは Object.prototype.toString (20.1.3.6) によりその識別にのみ使われる。

Note 2

対応する関数オブジェクトの仮引数数より小さい数値名を持つ arguments エキゾチックオブジェクト整数インデックスデータプロパティは、初期状態で関数の実行コンテキスト内の対応する引数束縛の値を共有する。これはそのプロパティを変更すると対応する引数束縛の値も変わり、逆も同様であることを意味する。この対応はそのようなプロパティが削除され再定義された場合、またはアクセサプロパティに変換された場合に失われる。arguments オブジェクトが通常オブジェクトであれば、そのプロパティ値は単に関数に渡された引数のコピーであり、プロパティ値と仮引数値の動的リンクは存在しない。

Note 3

ParameterMap オブジェクトとそのプロパティ値は arguments オブジェクトと引数束縛間の対応を仕様化するための装置として使用される。ParameterMap オブジェクトやそのプロパティ値であるオブジェクトは ECMAScript コードから直接観測できない。実装は指定されたセマンティクスを実現するために実際にそれらを生成または使用する必要はない。

Note 4

通常の arguments オブジェクトはアクセス時に TypeError 例外を投げる設定不可のアクセサプロパティ "callee" を定義する。"callee" プロパティは non-strict 関数の一部にのみ生成される arguments エキゾチックオブジェクトではより特定の意味を持つ。通常バリアントでこのプロパティを定義するのは、適合実装が他のいかなる形でも定義しないことを保証するためである。

Note 5

arguments エキゾチックオブジェクトの実装は歴史的に "caller" というアクセサプロパティを含んでいた。ECMAScript 2017 以前、この仕様は通常 arguments オブジェクト上の投げる "caller" プロパティの定義を含んでいた。実装がもはやこの拡張を含まないため、ECMAScript 2017 は投げる "caller" アクセサの要件を削除した。

10.4.4.1 [[GetOwnProperty]] ( P )

The [[GetOwnProperty]] internal method of arguments エキゾチックオブジェクト args takes argument P (a property key) and returns Property Descriptorundefined を含む正常完了. It performs the following steps when called:

  1. descOrdinaryGetOwnProperty(args, P) とする。
  2. descundefined なら undefined を返す。
  3. mapargs.[[ParameterMap]] とする。
  4. isMapped を ! HasOwnProperty(map, P) とする。
  5. isMappedtrue なら
    1. desc.[[Value]] を ! Get(map, P) に設定する。
  6. desc を返す。

10.4.4.2 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of arguments エキゾチックオブジェクト args takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. mapargs.[[ParameterMap]] とする。
  2. isMapped を ! HasOwnProperty(map, P) とする。
  3. newArgDescDesc とする。
  4. isMappedtrue かつ IsDataDescriptor(Desc) が true の場合、
    1. Desc[[Value]] フィールドを持たず [[Writable]] フィールドを持ち Desc.[[Writable]]false なら
      1. newArgDescDesc のコピーとする。
      2. newArgDesc.[[Value]] を ! Get(map, P) に設定する。
  5. allowed を ! OrdinaryDefineOwnProperty(args, P, newArgDesc) とする。
  6. allowedfalse なら false を返す。
  7. isMappedtrue なら
    1. IsAccessorDescriptor(Desc) が true なら
      1. map.[[Delete]](P) を実行する。
    2. それ以外
      1. Desc[[Value]] フィールドを持つなら
        1. アサート: arguments オブジェクトによりマップされる仮引数は常に書き込み可能であるため以下の Set は成功する。
        2. Set(map, P, Desc.[[Value]], false) を実行する。
      2. Desc[[Writable]] フィールドを持ち Desc.[[Writable]]false なら
        1. map.[[Delete]](P) を実行する。
  8. true を返す。

10.4.4.3 [[Get]] ( P, Receiver )

The [[Get]] internal method of arguments エキゾチックオブジェクト args takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. mapargs.[[ParameterMap]] とする。
  2. isMapped を ! HasOwnProperty(map, P) とする。
  3. isMappedfalse なら
    1. OrdinaryGet(args, P, Receiver) を返す。
  4. それ以外
    1. アサート: mapP に対する仮引数マッピングを含む。
    2. Get(map, P) を返す。

10.4.4.4 [[Set]] ( P, V, Receiver )

The [[Set]] internal method of arguments エキゾチックオブジェクト args takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. SameValue(args, Receiver) が false なら
    1. isMappedfalse とする。
  2. それ以外
    1. mapargs.[[ParameterMap]] とする。
    2. isMapped を ! HasOwnProperty(map, P) とする。
  3. isMappedtrue なら
    1. アサート: 以下の Set は成功する。なぜなら arguments オブジェクトによりマップされる仮引数は常に書き込み可能だからである。
    2. Set(map, P, V, false) を実行する。
  4. OrdinarySet(args, P, V, Receiver) を返す。

10.4.4.5 [[Delete]] ( P )

The [[Delete]] internal method of arguments エキゾチックオブジェクト args takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. mapargs.[[ParameterMap]] とする。
  2. isMapped を ! HasOwnProperty(map, P) とする。
  3. result を ? OrdinaryDelete(args, P) とする。
  4. resulttrue かつ isMappedtrue なら
    1. map.[[Delete]](P) を実行する。
  5. result を返す。

10.4.4.6 CreateUnmappedArgumentsObject ( argumentsList )

The abstract operation CreateUnmappedArgumentsObject takes argument argumentsList (a List of ECMAScript language values) and returns an ordinary object. It performs the following steps when called:

  1. lenargumentsList の要素数とする。
  2. objOrdinaryObjectCreate(%Object.prototype%, « [[ParameterMap]] ») とする。
  3. obj.[[ParameterMap]]undefined に設定する。
  4. DefinePropertyOrThrow(obj, "length", PropertyDescriptor { [[Value]]: 𝔽(len), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  5. index を 0 とする。
  6. index < len の間繰り返す:
    1. valargumentsList[index] とする。
    2. CreateDataPropertyOrThrow(obj, ! ToString(𝔽(index)), val) を実行する。
    3. indexindex + 1 に設定する。
  7. DefinePropertyOrThrow(obj, %Symbol.iterator%, PropertyDescriptor { [[Value]]: %Array.prototype.values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  8. DefinePropertyOrThrow(obj, "callee", PropertyDescriptor { [[Get]]: %ThrowTypeError%, [[Set]]: %ThrowTypeError%, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  9. obj を返す。

10.4.4.7 CreateMappedArgumentsObject ( func, formals, argumentsList, env )

The abstract operation CreateMappedArgumentsObject takes arguments func (an Object), formals (a Parse Node), argumentsList (a List of ECMAScript language values), and env (an Environment Record) and returns an arguments exotic object. It performs the following steps when called:

  1. アサート: formals は rest パラメータ、任意の binding pattern、任意の initializer を含まず、重複識別子を含んでもよい。
  2. lenargumentsList の要素数とする。
  3. objMakeBasicObject[[Prototype]], [[Extensible]], [[ParameterMap]] ») とする。
  4. obj.[[GetOwnProperty]]10.4.4.1 で規定されるとおりに設定する。
  5. obj.[[DefineOwnProperty]]10.4.4.2 で規定されるとおりに設定する。
  6. obj.[[Get]]10.4.4.3 で規定されるとおりに設定する。
  7. obj.[[Set]]10.4.4.4 で規定されるとおりに設定する。
  8. obj.[[Delete]]10.4.4.5 で規定されるとおりに設定する。
  9. obj.[[Prototype]]%Object.prototype% に設定する。
  10. mapOrdinaryObjectCreate(null) とする。
  11. obj.[[ParameterMap]]map に設定する。
  12. parameterNamesformals の BoundNames とする。
  13. numberOfParametersparameterNames の要素数とする。
  14. index を 0 とする。
  15. index < len の間繰り返す:
    1. valargumentsList[index] とする。
    2. CreateDataPropertyOrThrow(obj, ! ToString(𝔽(index)), val) を実行する。
    3. indexindex + 1 に設定する。
  16. DefinePropertyOrThrow(obj, "length", PropertyDescriptor { [[Value]]: 𝔽(len), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  17. mappedNames を新しい空の List とする。
  18. indexnumberOfParameters - 1 に設定する。
  19. index ≥ 0 の間繰り返す:
    1. nameparameterNames[index] とする。
    2. mappedNamesname を含まないなら
      1. mappedNamesname を追加する。
      2. index < len なら
        1. gMakeArgGetter(name, env) とする。
        2. pMakeArgSetter(name, env) とする。
        3. map.[[DefineOwnProperty]](! ToString(𝔽(index)), PropertyDescriptor { [[Set]]: p, [[Get]]: g, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
    3. indexindex - 1 に設定する。
  20. DefinePropertyOrThrow(obj, %Symbol.iterator%, PropertyDescriptor { [[Value]]: %Array.prototype.values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  21. DefinePropertyOrThrow(obj, "callee", PropertyDescriptor { [[Value]]: func, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  22. obj を返す。

10.4.4.7.1 MakeArgGetter ( name, env )

The abstract operation MakeArgGetter takes arguments name (a String) and env (an Environment Record) and returns a function object. env において name に束縛された値を返す組み込み関数オブジェクトを生成する。 It performs the following steps when called:

  1. getterClosure を、新しい引数なし Abstract Closure とし、nameenv を捕捉し呼び出されたとき次を行うものとする:
    1. NormalCompletion(! env.GetBindingValue(name, false)) を返す。
  2. getterCreateBuiltinFunction(getterClosure, 0, "", « ») とする。
  3. 注記: getter は ECMAScript コードから直接アクセスされない。
  4. getter を返す。

10.4.4.7.2 MakeArgSetter ( name, env )

The abstract operation MakeArgSetter takes arguments name (a String) and env (an Environment Record) and returns a function object. env において name に束縛された値を設定する組み込み関数オブジェクトを生成する。 It performs the following steps when called:

  1. setterClosure を、パラメータ (value) を持ち nameenv を捕捉し呼び出されたとき次を行う新しい Abstract Closure とする:
    1. NormalCompletion(! env.SetMutableBinding(name, value, false)) を返す。
  2. setterCreateBuiltinFunction(setterClosure, 1, "", « ») とする。
  3. 注記: setter は ECMAScript コードから直接アクセスされない。
  4. setter を返す。

10.4.5 TypedArray エキゾチックオブジェクト (TypedArray Exotic Objects)

TypedArray は正準数値文字列であるプロパティキーを特別扱いし、そのうち境界内の整数インデックス集合を用いて均一型要素をインデックス付けし、残りがプロトタイプ連鎖走査を発生させずに欠落しているという不変条件を強制するエキゾチックオブジェクトである。

Note

任意の Number n に対する ToString(n) は正準数値文字列であるため、実装は実際に文字列変換を行わずに Number を TypedArrayプロパティキーとして扱ってもよい。

TypedArray通常オブジェクトと同じ内部スロットを持ち、さらに [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] 内部スロットを持つ。

オブジェクトの [[PreventExtensions]], [[GetOwnProperty]], [[HasProperty]], [[DefineOwnProperty]], [[Get]], [[Set]], [[Delete]], [[OwnPropertyKeys]] 内部メソッドが本節の定義を使用し、他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは TypedArray である。これらのメソッドは TypedArrayCreate により設定される。

10.4.5.1 [[PreventExtensions]] ( )

The [[PreventExtensions]] internal method of TypedArray O takes no arguments and returns Boolean を含む正常完了. It performs the following steps when called:

  1. 注記: 6.1.7.3 に規定される拡張可能性関連の不変条件は、基礎バッファがリサイズされ整数インデックス名のプロパティを獲得(または失い再獲得)し得る場合に true を返すことを許さない。
  2. IsTypedArrayFixedLength(O) が false なら false を返す。
  3. OrdinaryPreventExtensions(O) を返す。

10.4.5.2 [[GetOwnProperty]] ( P )

The [[GetOwnProperty]] internal method of TypedArray O takes argument P (a property key) and returns Property Descriptorundefined を含む正常完了. It performs the following steps when called:

  1. P が String なら
    1. numericIndexCanonicalNumericIndexString(P) とする。
    2. numericIndexundefined でないなら
      1. valueTypedArrayGetElement(O, numericIndex) とする。
      2. valueundefined なら undefined を返す。
      3. PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } を返す。
  2. OrdinaryGetOwnProperty(O, P) を返す。

10.4.5.3 [[HasProperty]] ( P )

The [[HasProperty]] internal method of TypedArray O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. P が String なら
    1. numericIndexCanonicalNumericIndexString(P) とする。
    2. numericIndexundefined でないなら IsValidIntegerIndex(O, numericIndex) を返す。
  2. OrdinaryHasProperty(O, P) を返す。

10.4.5.4 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of TypedArray O takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. P が String なら
    1. numericIndexCanonicalNumericIndexString(P) とする。
    2. numericIndexundefined でないなら
      1. IsValidIntegerIndex(O, numericIndex) が false なら false を返す。
      2. Desc[[Configurable]] フィールドを持ち Desc.[[Configurable]]false なら false を返す。
      3. Desc[[Enumerable]] フィールドを持ち Desc.[[Enumerable]]false なら false を返す。
      4. IsAccessorDescriptor(Desc) が true なら false を返す。
      5. Desc[[Writable]] フィールドを持ち Desc.[[Writable]]false なら false を返す。
      6. Desc[[Value]] フィールドを持つなら ? TypedArraySetElement(O, numericIndex, Desc.[[Value]]) を実行する。
      7. true を返す。
  2. OrdinaryDefineOwnProperty(O, P, Desc) を返す。

10.4.5.5 [[Get]] ( P, Receiver )

The [[Get]] internal method of TypedArray O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. P が String なら
    1. numericIndexCanonicalNumericIndexString(P) とする。
    2. numericIndexundefined でないなら
      1. TypedArrayGetElement(O, numericIndex) を返す。
  2. OrdinaryGet(O, P, Receiver) を返す。

10.4.5.6 [[Set]] ( P, V, Receiver )

The [[Set]] internal method of TypedArray O takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. P が String なら
    1. numericIndexCanonicalNumericIndexString(P) とする。
    2. numericIndexundefined でないなら
      1. SameValue(O, Receiver) が true なら
        1. TypedArraySetElement(O, numericIndex, V) を実行する。
        2. true を返す。
      2. IsValidIntegerIndex(O, numericIndex) が false なら true を返す。
  2. OrdinarySet(O, P, V, Receiver) を返す。

10.4.5.7 [[Delete]] ( P )

The [[Delete]] internal method of TypedArray O takes argument P (a property key) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. P が String なら
    1. numericIndexCanonicalNumericIndexString(P) とする。
    2. numericIndexundefined でないなら
      1. IsValidIntegerIndex(O, numericIndex) が false なら true を返す;そうでなければ false を返す。
  2. OrdinaryDelete(O, P) を返す。

10.4.5.8 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of TypedArray O takes no arguments and returns プロパティキーList を含む正常完了. It performs the following steps when called:

  1. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst) とする。
  2. keys を新しい空の List とする。
  3. IsTypedArrayOutOfBounds(taRecord) が false なら
    1. lengthTypedArrayLength(taRecord) とする。
    2. 0 ≤ i < length の各整数 i について昇順で:
      1. ToString(𝔽(i)) を keys に追加する。
  4. O の各自身プロパティキー PP が String かつ整数インデックスでないものについて、作成順昇順で:
    1. Pkeys に追加する。
  5. O の各自身プロパティキー PP が Symbol であるものについて、作成順昇順で:
    1. Pkeys に追加する。
  6. keys を返す。

10.4.5.9 バッファ監視付き TypedArray レコード (TypedArray With Buffer Witness Records)

TypedArray With Buffer Witness Record は、TypedArray と、ビュー対象バッファのキャッシュされたバイト長をカプセル化する Record 値である。Growable SharedArrayBuffer をビューしている場合に、そのバイト長データブロックの単一の共有メモリ読取イベントがあることを保証する助けとなる。

TypedArray With Buffer Witness Record は Table 30 に列挙されるフィールドを持つ。

Table 30: TypedArray With Buffer Witness Record Fields
Field Name Value Meaning
[[Object]] a TypedArray バッファのバイト長が読み出される TypedArray
[[CachedBufferByteLength]] a non-negative integer or detached Record 作成時点のオブジェクトの [[ViewedArrayBuffer]] のバイト長。

10.4.5.10 MakeTypedArrayWithBufferWitnessRecord ( obj, order )

The abstract operation MakeTypedArrayWithBufferWitnessRecord takes arguments obj (a TypedArray) and order (seq-cst or unordered) and returns a TypedArray With Buffer Witness Record. It performs the following steps when called:

  1. bufferobj.[[ViewedArrayBuffer]] とする。
  2. IsDetachedBuffer(buffer) が true なら
    1. byteLengthdetached とする。
  3. それ以外
    1. byteLengthArrayBufferByteLength(buffer, order) とする。
  4. TypedArray With Buffer Witness Record { [[Object]]: obj, [[CachedBufferByteLength]]: byteLength } を返す。

10.4.5.11 TypedArrayCreate ( prototype )

The abstract operation TypedArrayCreate takes argument prototype (an Object) and returns a TypedArray. 新しい TypedArray の生成を規定する。 It performs the following steps when called:

  1. internalSlotsList を « [[Prototype]], [[Extensible]], [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] » とする。
  2. AMakeBasicObject(internalSlotsList) とする。
  3. A.[[PreventExtensions]]10.4.5.1 で規定されるとおりに設定する。
  4. A.[[GetOwnProperty]]10.4.5.2 で規定されるとおりに設定する。
  5. A.[[HasProperty]]10.4.5.3 で規定されるとおりに設定する。
  6. A.[[DefineOwnProperty]]10.4.5.4 で規定されるとおりに設定する。
  7. A.[[Get]]10.4.5.5 で規定されるとおりに設定する。
  8. A.[[Set]]10.4.5.6 で規定されるとおりに設定する。
  9. A.[[Delete]]10.4.5.7 で規定されるとおりに設定する。
  10. A.[[OwnPropertyKeys]]10.4.5.8 で規定されるとおりに設定する。
  11. A.[[Prototype]]prototype に設定する。
  12. A を返す。

10.4.5.12 TypedArrayByteLength ( taRecord )

The abstract operation TypedArrayByteLength takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a non-negative integer. It performs the following steps when called:

  1. IsTypedArrayOutOfBounds(taRecord) が true なら 0 を返す。
  2. lengthTypedArrayLength(taRecord) とする。
  3. length = 0 なら 0 を返す。
  4. OtaRecord.[[Object]] とする。
  5. O.[[ByteLength]]auto でないなら O.[[ByteLength]] を返す。
  6. elementSizeTypedArrayElementSize(O) とする。
  7. length × elementSize を返す。

10.4.5.13 TypedArrayLength ( taRecord )

The abstract operation TypedArrayLength takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a non-negative integer. It performs the following steps when called:

  1. アサート: IsTypedArrayOutOfBounds(taRecord) は false
  2. OtaRecord.[[Object]] とする。
  3. O.[[ArrayLength]]auto でないなら O.[[ArrayLength]] を返す。
  4. アサート: IsFixedLengthArrayBuffer(O.[[ViewedArrayBuffer]]) は false
  5. byteOffsetO.[[ByteOffset]] とする。
  6. elementSizeTypedArrayElementSize(O) とする。
  7. byteLengthtaRecord.[[CachedBufferByteLength]] とする。
  8. アサート: byteLengthdetached ではない。
  9. floor((byteLength - byteOffset) / elementSize) を返す。

10.4.5.14 IsTypedArrayOutOfBounds ( taRecord )

The abstract operation IsTypedArrayOutOfBounds takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a Boolean. オブジェクトの数値プロパティのいずれかが基礎バッファの境界外のインデックスを参照するかを確認する。 It performs the following steps when called:

  1. OtaRecord.[[Object]] とする。
  2. bufferByteLengthtaRecord.[[CachedBufferByteLength]] とする。
  3. アサート: IsDetachedBuffer(O.[[ViewedArrayBuffer]]) は bufferByteLengthdetached の場合かつその場合に限り true
  4. bufferByteLengthdetached なら true を返す。
  5. byteOffsetStartO.[[ByteOffset]] とする。
  6. O.[[ArrayLength]]auto なら
    1. byteOffsetEndbufferByteLength とする。
  7. それ以外
    1. elementSizeTypedArrayElementSize(O) とする。
    2. byteOffsetEndbyteOffsetStart + O.[[ArrayLength]] × elementSize とする。
  8. byteOffsetStart > bufferByteLength または byteOffsetEnd > bufferByteLength なら true を返す。
  9. 注記: 長さ 0 の TypedArray は境界外とは見なされない。
  10. false を返す。

10.4.5.15 IsTypedArrayFixedLength ( O )

The abstract operation IsTypedArrayFixedLength takes argument O (a TypedArray) and returns a Boolean. It performs the following steps when called:

  1. O.[[ArrayLength]]auto なら false を返す。
  2. bufferO.[[ViewedArrayBuffer]] とする。
  3. IsFixedLengthArrayBuffer(buffer) が false かつ IsSharedArrayBuffer(buffer) が false なら false を返す。
  4. true を返す。

10.4.5.16 IsValidIntegerIndex ( O, index )

The abstract operation IsValidIntegerIndex takes arguments O (a TypedArray) and index (a Number) and returns a Boolean. It performs the following steps when called:

  1. IsDetachedBuffer(O.[[ViewedArrayBuffer]]) が true なら false を返す。
  2. index整数的 Number でなければ false を返す。
  3. index-0𝔽 または index < -0𝔽 なら false を返す。
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(O, unordered) とする。
  5. 注記: O の裏付けバッファが growable SharedArrayBuffer の場合、境界チェックは同期化操作ではない。
  6. IsTypedArrayOutOfBounds(taRecord) が true なら false を返す。
  7. lengthTypedArrayLength(taRecord) とする。
  8. (index) ≥ length なら false を返す。
  9. true を返す。

10.4.5.17 TypedArrayGetElement ( O, index )

The abstract operation TypedArrayGetElement takes arguments O (a TypedArray) and index (a Number) and returns a Number, a BigInt, or undefined. It performs the following steps when called:

  1. IsValidIntegerIndex(O, index) が false なら undefined を返す。
  2. offsetO.[[ByteOffset]] とする。
  3. elementSizeTypedArrayElementSize(O) とする。
  4. byteIndexInBuffer を ((index) × elementSize) + offset とする。
  5. elementTypeTypedArrayElementType(O) とする。
  6. GetValueFromBuffer(O.[[ViewedArrayBuffer]], byteIndexInBuffer, elementType, true, unordered) を返す。

10.4.5.18 TypedArraySetElement ( O, index, value )

The abstract operation TypedArraySetElement takes arguments O (a TypedArray), index (a Number), and value (an ECMAScript language value) and returns unused を含む正常完了または throw 完了. It performs the following steps when called:

  1. O.[[ContentType]]bigint なら numValue を ? ToBigInt(value) とする。
  2. それ以外は numValue を ? ToNumber(value) とする。
  3. IsValidIntegerIndex(O, index) が true なら
    1. offsetO.[[ByteOffset]] とする。
    2. elementSizeTypedArrayElementSize(O) とする。
    3. byteIndexInBuffer を ((index) × elementSize) + offset とする。
    4. elementTypeTypedArrayElementType(O) とする。
    5. SetValueInBuffer(O.[[ViewedArrayBuffer]], byteIndexInBuffer, elementType, numValue, true, unordered) を実行する。
  4. unused を返す。
Note

この操作は常に成功するように見えるが、TypedArray の末尾を超えて書こうとしたり、切り離された ArrayBuffer を裏付けとする TypedArray に書こうとした場合は何の効果もない。

10.4.5.19 IsArrayBufferViewOutOfBounds ( O )

The abstract operation IsArrayBufferViewOutOfBounds takes argument O (a TypedArray or a DataView) and returns a Boolean. TypedArray の数値プロパティまたは DataView オブジェクトのメソッドのいずれかが基礎データブロック境界外のインデックス値を参照し得るかを確認する。上位仕様向け利便性のために存在する抽象操作。 It performs the following steps when called:

  1. O[[DataView]] 内部スロットを持つなら
    1. viewRecordMakeDataViewWithBufferWitnessRecord(O, seq-cst) とする。
    2. IsViewOutOfBounds(viewRecord) を返す。
  2. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst) とする。
  3. IsTypedArrayOutOfBounds(taRecord) を返す。

10.4.6 モジュール名前空間エキゾチックオブジェクト (Module Namespace Exotic Objects)

モジュール名前空間エキゾチックオブジェクトは ECMAScript Module からエクスポートされた束縛を公開するエキゾチックオブジェクトである(16.2.3 参照)。モジュール名前空間エキゾチックオブジェクトの String キー自身プロパティと Module がエクスポートする束縛名には 1 対 1 の対応がある。エクスポートされた束縛には export * による間接エクスポートも含まれる。各 String 値自身プロパティキーは対応するエクスポート束縛名の StringValue である。これらはモジュール名前空間エキゾチックオブジェクトの唯一の String キー付きプロパティである。各プロパティは属性 { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false } を持つ。モジュール名前空間エキゾチックオブジェクトは拡張不可能である。

オブジェクトの [[GetPrototypeOf]], [[SetPrototypeOf]], [[IsExtensible]], [[PreventExtensions]], [[GetOwnProperty]], [[DefineOwnProperty]], [[HasProperty]], [[Get]], [[Set]], [[Delete]], [[OwnPropertyKeys]] 内部メソッドが本節の定義を使用し、他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは モジュール名前空間エキゾチックオブジェクト である。これらのメソッドは ModuleNamespaceCreate により設定される。

モジュール名前空間エキゾチックオブジェクトTable 31 に定義される内部スロットを持つ。

Table 31: モジュール名前空間エキゾチックオブジェクトの内部スロット (Internal Slots of Module Namespace Exotic Objects)
Internal Slot Type Description
[[Module]] a Module Record この名前空間が公開するエクスポートを持つ Module Record
[[Exports]] a List of Strings このオブジェクトの自身プロパティとして公開されるエクスポートされた名前の String 値のリスト。コードユニットの辞書式順にソートされる。

10.4.6.1 [[GetPrototypeOf]] ( )

The [[GetPrototypeOf]] internal method of モジュール名前空間エキゾチックオブジェクト takes no arguments and returns null を含む正常完了. It performs the following steps when called:

  1. null を返す。

10.4.6.2 [[SetPrototypeOf]] ( V )

The [[SetPrototypeOf]] internal method of モジュール名前空間エキゾチックオブジェクト O takes argument V (an Object or null) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. SetImmutablePrototype(O, V) を返す。

10.4.6.3 [[IsExtensible]] ( )

The [[IsExtensible]] internal method of モジュール名前空間エキゾチックオブジェクト takes no arguments and returns false を含む正常完了. It performs the following steps when called:

  1. false を返す。

10.4.6.4 [[PreventExtensions]] ( )

The [[PreventExtensions]] internal method of モジュール名前空間エキゾチックオブジェクト takes no arguments and returns true を含む正常完了. It performs the following steps when called:

  1. true を返す。

10.4.6.5 [[GetOwnProperty]] ( P )

The [[GetOwnProperty]] internal method of モジュール名前空間エキゾチックオブジェクト O takes argument P (a property key) and returns Property Descriptorundefined を含む正常完了、または throw 完了. It performs the following steps when called:

  1. P が Symbol なら OrdinaryGetOwnProperty(O, P) を返す。
  2. exportsO.[[Exports]] とする。
  3. exportsP を含まないなら undefined を返す。
  4. value を ? O.[[Get]](P, O) とする。
  5. PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false } を返す。

10.4.6.6 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of モジュール名前空間エキゾチックオブジェクト O takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. P が Symbol なら ! OrdinaryDefineOwnProperty(O, P, Desc) を返す。
  2. current を ? O.[[GetOwnProperty]](P) とする。
  3. currentundefined なら false を返す。
  4. Desc[[Configurable]] フィールドを持ち Desc.[[Configurable]]true なら false を返す。
  5. Desc[[Enumerable]] フィールドを持ち Desc.[[Enumerable]]false なら false を返す。
  6. IsAccessorDescriptor(Desc) が true なら false を返す。
  7. Desc[[Writable]] フィールドを持ち Desc.[[Writable]]false なら false を返す。
  8. Desc[[Value]] フィールドを持つなら SameValue(Desc.[[Value]], current.[[Value]]) を返す。
  9. true を返す。

10.4.6.7 [[HasProperty]] ( P )

The [[HasProperty]] internal method of モジュール名前空間エキゾチックオブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. P が Symbol なら ! OrdinaryHasProperty(O, P) を返す。
  2. exportsO.[[Exports]] とする。
  3. exportsP を含むなら true を返す。
  4. false を返す。

10.4.6.8 [[Get]] ( P, Receiver )

The [[Get]] internal method of モジュール名前空間エキゾチックオブジェクト O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. P が Symbol なら
    1. OrdinaryGet(O, P, Receiver) を返す。
  2. exportsO.[[Exports]] とする。
  3. exportsP を含まないなら undefined を返す。
  4. mO.[[Module]] とする。
  5. bindingm.ResolveExport(P) とする。
  6. アサート: bindingResolvedBinding Record
  7. targetModulebinding.[[Module]] とする。
  8. アサート: targetModuleundefined ではない。
  9. binding.[[BindingName]]namespace なら
    1. GetModuleNamespace(targetModule) を返す。
  10. targetEnvtargetModule.[[Environment]] とする。
  11. targetEnvempty なら ReferenceError 例外を投げる。
  12. targetEnv.GetBindingValue(binding.[[BindingName]], true) を返す。
Note

ResolveExport は副作用がない。同一の exportName, resolveSet 引数組で呼ばれるたびに同じ結果を返さなければならない。実装は各モジュール名前空間エキゾチックオブジェクト[[Exports]] について ResolveExport 結果を事前計算またはキャッシュしてもよい。

10.4.6.9 [[Set]] ( P, V, Receiver )

The [[Set]] internal method of モジュール名前空間エキゾチックオブジェクト takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns false を含む正常完了. It performs the following steps when called:

  1. false を返す。

10.4.6.10 [[Delete]] ( P )

The [[Delete]] internal method of モジュール名前空間エキゾチックオブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. P が Symbol なら
    1. OrdinaryDelete(O, P) を返す。
  2. exportsO.[[Exports]] とする。
  3. exportsP を含むなら false を返す。
  4. true を返す。

10.4.6.11 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of モジュール名前空間エキゾチックオブジェクト O takes no arguments and returns プロパティキーList を含む正常完了. It performs the following steps when called:

  1. exportsO.[[Exports]] とする。
  2. symbolKeysOrdinaryOwnPropertyKeys(O) とする。
  3. exportssymbolKeysリスト結合を返す。

10.4.6.12 ModuleNamespaceCreate ( module, exports )

The abstract operation ModuleNamespaceCreate takes arguments module (a Module Record) and exports (a List of Strings) and returns a module namespace exotic object. 新しいモジュール名前空間エキゾチックオブジェクトの生成を規定する。 It performs the following steps when called:

  1. アサート: module.[[Namespace]]empty
  2. internalSlotsListTable 31 に列挙される内部スロットとする。
  3. MMakeBasicObject(internalSlotsList) とする。
  4. M の必須内部メソッドを 10.4.6 で規定される定義に設定する。
  5. M.[[Module]]module に設定する。
  6. sortedExportsexports の要素をコードユニット辞書式順でソートした List とする。
  7. M.[[Exports]]sortedExports に設定する。
  8. 28.3 の定義に対応する M の自身プロパティを生成する。
  9. module.[[Namespace]]M に設定する。
  10. M を返す。

10.4.7 不変プロトタイプエキゾチックオブジェクト (Immutable Prototype Exotic Objects)

不変プロトタイプエキゾチックオブジェクトは、初期化後に変更されない [[Prototype]] 内部スロットを持つエキゾチックオブジェクトである。

オブジェクトの [[SetPrototypeOf]] 内部メソッドが以下の実装を使用する場合、そのオブジェクトは 不変プロトタイプエキゾチックオブジェクト である。(その他の必須内部メソッドは対象となる不変プロトタイプエキゾチックオブジェクトに応じて任意の実装を使用しうる。)

Note

他のエキゾチックオブジェクトと異なり、不変プロトタイプエキゾチックオブジェクト用の専用生成抽象操作は提供されない。これはそれらが %Object.prototype%ホスト環境でのみ使用され、ホスト環境では関連オブジェクトが他の点でもエキゾチックであり専用生成操作を必要とするためである。

10.4.7.1 [[SetPrototypeOf]] ( V )

The [[SetPrototypeOf]] internal method of 不変プロトタイプエキゾチックオブジェクト O takes argument V (an Object or null) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. SetImmutablePrototype(O, V) を返す。

10.4.7.2 SetImmutablePrototype ( O, V )

The abstract operation SetImmutablePrototype takes arguments O (an Object) and V (an Object or null) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. current を ? O.[[GetPrototypeOf]]() とする。
  2. SameValue(V, current) が true なら true を返す。
  3. false を返す。

10.5 Proxy オブジェクトの内部メソッドと内部スロット (Proxy Object Internal Methods and Internal Slots)

Proxy オブジェクトは、本質的内部メソッドの一部が ECMAScript コードで部分的に実装されるエキゾチックオブジェクトである。すべての Proxy オブジェクトは [[ProxyHandler]] という内部スロットを持つ。[[ProxyHandler]] の値はプロキシの ハンドラーオブジェクト (handler object) と呼ばれるオブジェクトか null である。ハンドラーオブジェクトのメソッド(Table 32 参照)は、1 つ以上の Proxy オブジェクト内部メソッドの実装を拡張するために用いられうる。すべての Proxy オブジェクトはまた [[ProxyTarget]] という内部スロットを持ち、その値はオブジェクトまたは null である。このオブジェクトはプロキシの ターゲットオブジェクト (target object) と呼ばれる。

オブジェクトの本質的内部メソッド(該当する場合は [[Call]][[Construct]] を含む)が本節の定義を使用する場合、そのオブジェクトは Proxy エキゾチックオブジェクト である。これらの内部メソッドは ProxyCreate により設定される。

Table 32: Proxy ハンドラーメソッド (Proxy Handler Methods)
Internal Method Handler Method
[[GetPrototypeOf]] getPrototypeOf
[[SetPrototypeOf]] setPrototypeOf
[[IsExtensible]] isExtensible
[[PreventExtensions]] preventExtensions
[[GetOwnProperty]] getOwnPropertyDescriptor
[[DefineOwnProperty]] defineProperty
[[HasProperty]] has
[[Get]] get
[[Set]] set
[[Delete]] deleteProperty
[[OwnPropertyKeys]] ownKeys
[[Call]] apply
[[Construct]] construct

ハンドラーメソッドが Proxy オブジェクト内部メソッドの実装提供のために呼び出されるとき、ハンドラーメソッドにはプロキシのターゲットオブジェクトがパラメータとして渡される。プロキシのハンドラーオブジェクトは必ずしもすべての本質的内部メソッドに対応するメソッドを持つとは限らない。ハンドラーオブジェクトが内部トラップに対応するメソッドを持たない場合、プロキシ上の内部メソッド呼び出しは対応する内部メソッドをターゲットオブジェクト上で呼び出すことになる。

Proxy オブジェクトの [[ProxyHandler]] および [[ProxyTarget]] 内部スロットはオブジェクト生成時に常に初期化され、通常は変更できない。いくつかの Proxy オブジェクトは後に revoked(無効化) できる形で生成される。プロキシが無効化されると、その [[ProxyHandler]][[ProxyTarget]] 内部スロットは null に設定され、その Proxy オブジェクトに対する後続の内部メソッド呼び出しは TypeError 例外を投げる。

Proxy オブジェクトは内部メソッド実装を任意の ECMAScript コードで提供できるため、6.1.7.3 で定義される不変条件に違反するハンドラーメソッドを持つ Proxy オブジェクトを定義することが可能である。6.1.7.3 で定義される内部メソッド不変条件の一部は本質的整合性不変条件である。これらの不変条件は本節で規定される Proxy オブジェクト内部メソッドによって明示的に強制される。ECMAScript 実装はあらゆる不変条件違反が存在しても堅牢でなければならない。

以下のアルゴリズム記述では、O は ECMAScript Proxy オブジェクト、Pプロパティキー値、V は任意の ECMAScript 言語値、DescProperty Descriptor レコードであると仮定する。

10.5.1 [[GetPrototypeOf]] ( )

The [[GetPrototypeOf]] internal method of Proxy エキゾチックオブジェクト O takes no arguments and returns Object か null を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "getPrototypeOf") とする。
  6. trapundefined なら
    1. target.[[GetPrototypeOf]]() を返す。
  7. handlerProto を ? Call(trap, handler, « target ») とする。
  8. handlerProto が Object でなく null でもないなら TypeError 例外を投げる。
  9. extensibleTarget を ? IsExtensible(target) とする。
  10. extensibleTargettrue なら handlerProto を返す。
  11. targetProto を ? target.[[GetPrototypeOf]]() とする。
  12. SameValue(handlerProto, targetProto) が false なら TypeError 例外を投げる。
  13. handlerProto を返す。
Note

Proxy オブジェクトの [[GetPrototypeOf]] は以下の不変条件を強制する:

  • [[GetPrototypeOf]] の結果は Object か null でなければならない。
  • ターゲットオブジェクトが拡張不可能な場合、Proxy オブジェクトに適用した [[GetPrototypeOf]] はターゲットオブジェクトに適用した [[GetPrototypeOf]] と同じ値を返さなければならない。

10.5.2 [[SetPrototypeOf]] ( V )

The [[SetPrototypeOf]] internal method of Proxy エキゾチックオブジェクト O takes argument V (an Object or null) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "setPrototypeOf") とする。
  6. trapundefined なら
    1. target.[[SetPrototypeOf]](V) を返す。
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target, V »)) とする。
  8. booleanTrapResultfalse なら false を返す。
  9. extensibleTarget を ? IsExtensible(target) とする。
  10. extensibleTargettrue なら true を返す。
  11. targetProto を ? target.[[GetPrototypeOf]]() とする。
  12. SameValue(V, targetProto) が false なら TypeError 例外を投げる。
  13. true を返す。
Note

Proxy オブジェクトの [[SetPrototypeOf]] は以下の不変条件を強制する:

  • [[SetPrototypeOf]] の結果は Boolean である。
  • ターゲットオブジェクトが拡張不可能である場合、引数値はターゲットオブジェクトに適用した [[GetPrototypeOf]] の結果と同じでなければならない。

10.5.3 [[IsExtensible]] ( )

The [[IsExtensible]] internal method of Proxy エキゾチックオブジェクト O takes no arguments and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "isExtensible") とする。
  6. trapundefined なら
    1. IsExtensible(target) を返す。
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target »)) とする。
  8. targetResult を ? IsExtensible(target) とする。
  9. booleanTrapResulttargetResult と異なるなら TypeError 例外を投げる。
  10. booleanTrapResult を返す。
Note

Proxy オブジェクトの [[IsExtensible]] は以下の不変条件を強制する:

  • [[IsExtensible]] の結果は Boolean である。
  • Proxy オブジェクトに適用した [[IsExtensible]] は、同じ引数でターゲットオブジェクトに適用した [[IsExtensible]] と同じ値を返さなければならない。

10.5.4 [[PreventExtensions]] ( )

The [[PreventExtensions]] internal method of Proxy エキゾチックオブジェクト O takes no arguments and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "preventExtensions") とする。
  6. trapundefined なら
    1. target.[[PreventExtensions]]() を返す。
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target »)) とする。
  8. booleanTrapResulttrue なら
    1. extensibleTarget を ? IsExtensible(target) とする。
    2. extensibleTargettrue なら TypeError 例外を投げる。
  9. booleanTrapResult を返す。
Note

Proxy オブジェクトの [[PreventExtensions]] は以下の不変条件を強制する:

  • [[PreventExtensions]] の結果は Boolean である。
  • Proxy オブジェクトに適用した [[PreventExtensions]]true を返すのは、ターゲットオブジェクトに適用した [[IsExtensible]]false の場合のみである。

10.5.5 [[GetOwnProperty]] ( P )

The [[GetOwnProperty]] internal method of Proxy エキゾチックオブジェクト O takes argument P (a property key) and returns Property Descriptorundefined を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "getOwnPropertyDescriptor") とする。
  6. trapundefined なら
    1. target.[[GetOwnProperty]](P) を返す。
  7. trapResultObj を ? Call(trap, handler, « target, P ») とする。
  8. trapResultObj が Object でなく undefined でもないなら TypeError 例外を投げる。
  9. targetDesc を ? target.[[GetOwnProperty]](P) とする。
  10. trapResultObjundefined なら
    1. targetDescundefined なら undefined を返す。
    2. targetDesc.[[Configurable]]false なら TypeError 例外を投げる。
    3. extensibleTarget を ? IsExtensible(target) とする。
    4. extensibleTargetfalse なら TypeError 例外を投げる。
    5. undefined を返す。
  11. extensibleTarget を ? IsExtensible(target) とする。
  12. resultDesc を ? ToPropertyDescriptor(trapResultObj) とする。
  13. CompletePropertyDescriptor(resultDesc) を実行する。
  14. validIsCompatiblePropertyDescriptor(extensibleTarget, resultDesc, targetDesc) とする。
  15. validfalse なら TypeError 例外を投げる。
  16. resultDesc.[[Configurable]]false なら
    1. targetDescundefined または targetDesc.[[Configurable]]true なら
      1. TypeError 例外を投げる。
    2. resultDesc[[Writable]] フィールドを持ちかつ resultDesc.[[Writable]]false なら
      1. アサート: targetDesc[[Writable]] フィールドを持つ。
      2. targetDesc.[[Writable]]true なら TypeError 例外を投げる。
  17. resultDesc を返す。
Note

Proxy オブジェクトの [[GetOwnProperty]] は以下の不変条件を強制する:

  • [[GetOwnProperty]] の結果は Object か undefined でなければならない。
  • ターゲットオブジェクトに設定不可な自身プロパティとして存在する場合、そのプロパティを不存在と報告してはならない。
  • ターゲットオブジェクトが拡張不可能であり、そのプロパティが自身プロパティとして存在する場合、そのプロパティを不存在と報告してはならない。
  • ターゲットオブジェクトが拡張不可能でなく、かつそのプロパティがターゲットの自身プロパティに存在しない場合、存在すると報告してはならない。
  • ターゲットオブジェクトに対応する設定不可な自身プロパティが存在しない限り、プロパティを設定不可と報告してはならない。
  • 対応するターゲットオブジェクトの設定不可・非書き込み自身プロパティが存在しない限り、プロパティを同時に設定不可かつ非書き込みと報告してはならない。

10.5.6 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of Proxy エキゾチックオブジェクト O takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "defineProperty") とする。
  6. trapundefined なら
    1. target.[[DefineOwnProperty]](P, Desc) を返す。
  7. descObjFromPropertyDescriptor(Desc) とする。
  8. booleanTrapResultToBoolean(? Call(trap, handler, « target, P, descObj »)) とする。
  9. booleanTrapResultfalse なら false を返す。
  10. targetDesc を ? target.[[GetOwnProperty]](P) とする。
  11. extensibleTarget を ? IsExtensible(target) とする。
  12. Desc[[Configurable]] フィールドを持ちかつ Desc.[[Configurable]]false なら
    1. settingConfigFalsetrue とする。
  13. それ以外
    1. settingConfigFalsefalse とする。
  14. targetDescundefined なら
    1. extensibleTargetfalse なら TypeError 例外を投げる。
    2. settingConfigFalsetrue なら TypeError 例外を投げる。
  15. それ以外
    1. IsCompatiblePropertyDescriptor(extensibleTarget, Desc, targetDesc) が false なら TypeError 例外を投げる。
    2. settingConfigFalsetrue かつ targetDesc.[[Configurable]]true なら TypeError 例外を投げる。
    3. IsDataDescriptor(targetDesc) が true かつ targetDesc.[[Configurable]]false かつ targetDesc.[[Writable]]true なら
      1. Desc[[Writable]] フィールドを持ちかつ Desc.[[Writable]]false なら TypeError 例外を投げる。
  16. true を返す。
Note

Proxy オブジェクトの [[DefineOwnProperty]] は以下の不変条件を強制する:

  • [[DefineOwnProperty]] の結果は Boolean である。
  • ターゲットオブジェクトが拡張不可能ならプロパティは追加できない。
  • 対応する設定不可な自身プロパティがターゲット上に存在しない限り、プロパティを設定不可にできない。
  • 対応する設定不可かつ非書き込みな自身プロパティがターゲット上に存在しない限り、プロパティを設定不可かつ非書き込みにできない。
  • 対応するターゲットプロパティが存在する場合、その Property Descriptor[[DefineOwnProperty]] でターゲットに適用しても例外は投げられない。

10.5.7 [[HasProperty]] ( P )

The [[HasProperty]] internal method of Proxy エキゾチックオブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "has") とする。
  6. trapundefined なら
    1. target.[[HasProperty]](P) を返す。
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target, P »)) とする。
  8. booleanTrapResultfalse なら
    1. targetDesc を ? target.[[GetOwnProperty]](P) とする。
    2. targetDescundefined でないなら
      1. targetDesc.[[Configurable]]false なら TypeError 例外を投げる。
      2. extensibleTarget を ? IsExtensible(target) とする。
      3. extensibleTargetfalse なら TypeError 例外を投げる。
  9. booleanTrapResult を返す。
Note

Proxy オブジェクトの [[HasProperty]] は以下の不変条件を強制する:

  • [[HasProperty]] の結果は Boolean である。
  • ターゲットオブジェクトに設定不可な自身プロパティとして存在する場合、プロパティを不存在と報告してはならない。
  • ターゲットオブジェクトが拡張不可能で、そのプロパティが自身プロパティとして存在する場合、プロパティを不存在と報告してはならない。

10.5.8 [[Get]] ( P, Receiver )

The [[Get]] internal method of Proxy エキゾチックオブジェクト O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "get") とする。
  6. trapundefined なら
    1. target.[[Get]](P, Receiver) を返す。
  7. trapResult を ? Call(trap, handler, « target, P, Receiver ») とする。
  8. targetDesc を ? target.[[GetOwnProperty]](P) とする。
  9. targetDescundefined でなくかつ targetDesc.[[Configurable]]false なら
    1. IsDataDescriptor(targetDesc) が true かつ targetDesc.[[Writable]]false なら
      1. SameValue(trapResult, targetDesc.[[Value]]) が false なら TypeError 例外を投げる。
    2. IsAccessorDescriptor(targetDesc) が true かつ targetDesc.[[Get]]undefined なら
      1. trapResultundefined でないなら TypeError 例外を投げる。
  10. trapResult を返す。
Note

Proxy オブジェクトの [[Get]] は以下の不変条件を強制する:

  • 対応するターゲットオブジェクトプロパティが非書き込み・設定不可な自身データプロパティである場合、報告される値はターゲットプロパティの値と同じでなければならない。
  • 対応するターゲットオブジェクトプロパティが設定不可な自身 accessor プロパティでその [[Get]] 属性が undefined の場合、報告される値は undefined でなければならない。

10.5.9 [[Set]] ( P, V, Receiver )

The [[Set]] internal method of Proxy エキゾチックオブジェクト O takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "set") とする。
  6. trapundefined なら
    1. target.[[Set]](P, V, Receiver) を返す。
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target, P, V, Receiver »)) とする。
  8. booleanTrapResultfalse なら false を返す。
  9. targetDesc を ? target.[[GetOwnProperty]](P) とする。
  10. targetDescundefined でなくかつ targetDesc.[[Configurable]]false なら
    1. IsDataDescriptor(targetDesc) が true かつ targetDesc.[[Writable]]false なら
      1. SameValue(V, targetDesc.[[Value]]) が false なら TypeError 例外を投げる。
    2. IsAccessorDescriptor(targetDesc) が true なら
      1. targetDesc.[[Set]]undefined なら TypeError 例外を投げる。
  11. true を返す。
Note

Proxy オブジェクトの [[Set]] は以下の不変条件を強制する:

  • [[Set]] の結果は Boolean である。
  • 対応するターゲットオブジェクトプロパティが非書き込み・設定不可な自身データプロパティである場合、その値と異なる値に変更することはできない。
  • 対応するターゲットオブジェクトプロパティが設定不可な自身 accessor プロパティでその [[Set]] 属性が undefined の場合、値を設定できない。

10.5.10 [[Delete]] ( P )

The [[Delete]] internal method of Proxy エキゾチックオブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "deleteProperty") とする。
  6. trapundefined なら
    1. target.[[Delete]](P) を返す。
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target, P »)) とする。
  8. booleanTrapResultfalse なら false を返す。
  9. targetDesc を ? target.[[GetOwnProperty]](P) とする。
  10. targetDescundefined なら true を返す。
  11. targetDesc.[[Configurable]]false なら TypeError 例外を投げる。
  12. extensibleTarget を ? IsExtensible(target) とする。
  13. extensibleTargetfalse なら TypeError 例外を投げる。
  14. true を返す。
Note

Proxy オブジェクトの [[Delete]] は以下の不変条件を強制する:

  • [[Delete]] の結果は Boolean である。
  • ターゲットオブジェクトに設定不可な自身プロパティとして存在する場合、そのプロパティを削除済みと報告してはならない。
  • ターゲットオブジェクトが拡張不可能でそのプロパティが自身プロパティとして存在する場合、そのプロパティを削除済みと報告してはならない。

10.5.11 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of Proxy エキゾチックオブジェクト O takes no arguments and returns プロパティキーList を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "ownKeys") とする。
  6. trapundefined なら
    1. target.[[OwnPropertyKeys]]() を返す。
  7. trapResultArray を ? Call(trap, handler, « target ») とする。
  8. trapResult を ? CreateListFromArrayLike(trapResultArray, property-key) とする。
  9. trapResult が重複要素を含むなら TypeError 例外を投げる。
  10. extensibleTarget を ? IsExtensible(target) とする。
  11. targetKeys を ? target.[[OwnPropertyKeys]]() とする。
  12. アサート: targetKeysプロパティキーList である。
  13. アサート: targetKeys は重複要素を含まない。
  14. targetConfigurableKeys を新しい空の List とする。
  15. targetNonconfigurableKeys を新しい空の List とする。
  16. targetKeys の各要素 key について
    1. desc を ? target.[[GetOwnProperty]](key) とする。
    2. descundefined でなくかつ desc.[[Configurable]]false なら
      1. keytargetNonconfigurableKeys に追加する。
    3. それ以外
      1. keytargetConfigurableKeys に追加する。
  17. extensibleTargettrue かつ targetNonconfigurableKeys が空なら
    1. trapResult を返す。
  18. uncheckedResultKeystrapResult の要素からなる List とする。
  19. targetNonconfigurableKeys の各要素 key について
    1. uncheckedResultKeyskey を含まないなら TypeError 例外を投げる。
    2. uncheckedResultKeys から key を除去する。
  20. extensibleTargettrue なら trapResult を返す。
  21. targetConfigurableKeys の各要素 key について
    1. uncheckedResultKeyskey を含まないなら TypeError 例外を投げる。
    2. uncheckedResultKeys から key を除去する。
  22. uncheckedResultKeys が空でないなら TypeError 例外を投げる。
  23. trapResult を返す。
Note

Proxy オブジェクトの [[OwnPropertyKeys]] は以下の不変条件を強制する:

  • [[OwnPropertyKeys]] の結果は List である。
  • 返される List は重複要素を含まない。
  • 返される List の各要素はプロパティキーである。
  • 結果の List はターゲットオブジェクトのすべての設定不可な自身プロパティのキーを含まなければならない。
  • ターゲットオブジェクトが拡張不可能である場合、結果の List はターゲットオブジェクトの自身プロパティすべてのキーのみを含まなければならない。

10.5.12 [[Call]] ( thisArgument, argumentsList )

The [[Call]] internal method of Proxy エキゾチックオブジェクト O takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "apply") とする。
  6. trapundefined なら
    1. ? Call(target, thisArgument, argumentsList) を返す。
  7. argArrayCreateArrayFromList(argumentsList) とする。
  8. ? Call(trap, handler, « target, thisArgument, argArray ») を返す。
Note

Proxy エキゾチックオブジェクトは、その [[ProxyTarget]] 内部スロットの初期値が [[Call]] 内部メソッドを持つオブジェクトである場合にのみ [[Call]] 内部メソッドを持つ。

10.5.13 [[Construct]] ( argumentsList, newTarget )

The [[Construct]] internal method of Proxy エキゾチックオブジェクト O takes arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns Object を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. アサート: IsConstructor(target) は true
  4. handlerO.[[ProxyHandler]] とする。
  5. アサート: handler は Object である。
  6. trap を ? GetMethod(handler, "construct") とする。
  7. trapundefined なら
    1. ? Construct(target, argumentsList, newTarget) を返す。
  8. argArrayCreateArrayFromList(argumentsList) とする。
  9. newObj を ? Call(trap, handler, « target, argArray, newTarget ») とする。
  10. newObj が Object でないなら TypeError 例外を投げる。
  11. newObj を返す。
Note 1

Proxy エキゾチックオブジェクトは、その [[ProxyTarget]] 内部スロットの初期値が [[Construct]] 内部メソッドを持つオブジェクトである場合にのみ [[Construct]] 内部メソッドを持つ。

Note 2

Proxy オブジェクトの [[Construct]] は以下の不変条件を強制する:

  • [[Construct]] の結果は Object でなければならない。

10.5.14 ValidateNonRevokedProxy ( proxy )

The abstract operation ValidateNonRevokedProxy takes argument proxy (a Proxy exotic object) and returns unused を含む正常完了または throw 完了. proxy が無効化されている場合 TypeError 例外を投げる。 It performs the following steps when called:

  1. proxy.[[ProxyTarget]]null なら TypeError 例外を投げる。
  2. アサート: proxy.[[ProxyHandler]]null ではない。
  3. unused を返す。

10.5.15 ProxyCreate ( target, handler )

The abstract operation ProxyCreate takes arguments target (an ECMAScript language value) and handler (an ECMAScript language value) and returns Proxy エキゾチックオブジェクトを含む正常完了または throw 完了. 新しい Proxy オブジェクトの生成を規定する。 It performs the following steps when called:

  1. target が Object でないなら TypeError 例外を投げる。
  2. handler が Object でないなら TypeError 例外を投げる。
  3. PMakeBasicObject[[ProxyHandler]], [[ProxyTarget]] ») とする。
  4. P の本質的内部メソッド([[Call]][[Construct]] を除く)を 10.5 で規定される定義に設定する。
  5. IsCallable(target) が true なら
    1. P.[[Call]]10.5.12 で規定されるとおりに設定する。
    2. IsConstructor(target) が true なら
      1. P.[[Construct]]10.5.13 で規定されるとおりに設定する。
  6. P.[[ProxyTarget]]target に設定する。
  7. P.[[ProxyHandler]]handler に設定する。
  8. P を返す。

11 ECMAScript 言語: ソーステキスト (ECMAScript Language: Source Text)

11.1 ソーステキスト (Source Text)

構文 (Syntax)

SourceCharacter :: any Unicode code point

ECMAScript ソーステキスト は Unicode 符号位置の列である。ECMAScript 文法で許容される箇所であれば、U+0000 から U+10FFFF までのすべての Unicode 符号位置(サロゲートコードポイントを含む)が ECMAScript ソーステキスト中に現れうる。ECMAScript ソーステキストを格納または交換するために実際に用いられるエンコーディングは本仕様にとって本質的ではない。外部的なソーステキストのエンコーディングに関わらず、適合する ECMAScript 実装はソーステキストを、各 SourceCharacter が 1 つの Unicode 符号位置であるような同値の SourceCharacter 値列として処理する。適合実装はソーステキストの正規化を行うこと、または正規化を行っているかのように振る舞うことを要求されない。

結合文字シーケンスの構成要素は、利用者がその全体を 1 文字と捉える可能性があっても、個々の独立した Unicode 符号位置として扱われる。

Note

文字列リテラル、正規表現リテラル、テンプレートリテラル、および識別子においては、任意の Unicode 符号位置をその数値値を明示的に表す Unicode エスケープシーケンスで表現することもできる。コメント内では、そのようなエスケープシーケンスはコメントの一部として実質的に無視される。

ECMAScript は Unicode エスケープシーケンスの挙動において Java プログラミング言語と異なる。例えば Java プログラムにおいて Unicode エスケープ \u000A が単一行コメント内に現れた場合、それは行終端子(Unicode 符号位置 U+000A は LINE FEED (LF))として解釈され、次の符号位置はそのコメントの一部ではなくなる。同様に Java の文字列リテラル内で \u000A が現れると、それは文字列リテラル内に許可されない行終端子として解釈される——文字列リテラルの値に LF を含めるには \u000A ではなく \n と書かなければならない。ECMAScript プログラムでは、コメント中の Unicode エスケープシーケンスが解釈されることは決してなく、従ってコメント終端に寄与しない。同様に、ECMAScript プログラム内の文字列リテラル中に現れる Unicode エスケープシーケンスは常にリテラル内容に寄与し、行終端子として、あるいは文字列リテラルを終端させうる符号位置として解釈されることはない。

11.1.1 静的セマンティクス: UTF16EncodeCodePoint ( cp: a Unicode code point, ): a String

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. Assert: 0 ≤ cp ≤ 0x10FFFF.
  2. If cp ≤ 0xFFFF, return the String value consisting of the code unit whose numeric value is cp.
  3. Let cu1 be the code unit whose numeric value is floor((cp - 0x10000) / 0x400) + 0xD800.
  4. Let cu2 be the code unit whose numeric value is ((cp - 0x10000) modulo 0x400) + 0xDC00.
  5. Return the string-concatenation of cu1 and cu2.

11.1.2 静的セマンティクス: CodePointsToString ( text: a sequence of Unicode code points, ): a String

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. text6.1.4 で述べるように String 値へ変換する。 It performs the following steps when called:

  1. Let result be the empty String.
  2. For each code point cp of text, do
    1. Set result to the string-concatenation of result and UTF16EncodeCodePoint(cp).
  3. Return result.

11.1.3 静的セマンティクス: UTF16SurrogatePairToCodePoint ( lead: a code unit, trail: a code unit, ): a code point

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. UTF-16 サロゲートペアを形成する 2 つのコードユニットを 1 つのコードポイントへ変換する。 It performs the following steps when called:

  1. Assert: lead is a leading surrogate and trail is a trailing surrogate.
  2. Let cp be (lead - 0xD800) × 0x400 + (trail - 0xDC00) + 0x10000.
  3. Return the code point cp.

11.1.4 静的セマンティクス: CodePointAt ( string: a String, position: a non-negative integer, ): a Record with fields [[CodePoint]] (a code point), [[CodeUnitCount]] (a positive integer), and [[IsUnpairedSurrogate]] (a Boolean)

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. string6.1.4 に記述される UTF-16 エンコードされたコードポイント列として解釈し、インデックス position のコードユニットから始まる 1 つのコードポイントを読み取る。 It performs the following steps when called:

  1. Let size be the length of string.
  2. Assert: position ≥ 0 and position < size.
  3. Let first be the code unit at index position within string.
  4. Let cp be the code point whose numeric value is the numeric value of first.
  5. If first is neither a leading surrogate nor a trailing surrogate, then
    1. Return the Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false }.
  6. If first is a trailing surrogate or position + 1 = size, then
    1. Return the Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }.
  7. Let second be the code unit at index position + 1 within string.
  8. If second is not a trailing surrogate, then
    1. Return the Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }.
  9. Set cp to UTF16SurrogatePairToCodePoint(first, second).
  10. Return the Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false }.

11.1.5 静的セマンティクス: StringToCodePoints ( string: a String, ): a List of code points

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. string6.1.4 に記述される UTF-16 エンコードされた Unicode テキストとして解釈した結果得られる Unicode 符号位置列を返す。 It performs the following steps when called:

  1. Let codePoints be a new empty List.
  2. Let size be the length of string.
  3. Let position be 0.
  4. Repeat, while position < size,
    1. Let cp be CodePointAt(string, position).
    2. Append cp.[[CodePoint]] to codePoints.
    3. Set position to position + cp.[[CodeUnitCount]].
  5. Return codePoints.

11.1.6 静的セマンティクス: ParseText ( sourceText: a String or a sequence of Unicode code points, goalSymbol: a nonterminal in one of the ECMAScript grammars, ): a Parse Node or a non-empty List of SyntaxError objects

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. If sourceText is a String, set sourceText to StringToCodePoints(sourceText).
  2. Attempt to parse sourceText using goalSymbol as the goal symbol, and analyse the parse result for any early error conditions. Parsing and early error detection may be interleaved in an implementation-defined manner.
  3. If the parse succeeded and no early errors were found, return the Parse Node (an instance of goalSymbol) at the root of the parse tree resulting from the parse.
  4. Otherwise, return a List of one or more SyntaxError objects representing the parsing errors and/or early errors. If more than one parsing error or early error is present, the number and ordering of error objects in the list is implementation-defined, but at least one must be present.
Note 1

ある箇所に早期エラーが存在し、後続位置に構文エラーが存在するテキストを考える。パース後に早期エラー検査を行う実装は構文エラーを報告し、早期エラー検査へ進まないかもしれない。両者をインターリーブする実装は早期エラーを報告し構文エラー検出を行わないかもしれない。第三の実装は両方のエラーを報告するかもしれない。これらの挙動はいずれも適合である。

Note 2

17 も参照のこと。

11.2 ソースコードの種類 (Types of Source Code)

ECMAScript コードには 4 種類がある:

Note 1

関数コードは一般に Function 定義(15.2)、Arrow Function 定義(15.3)、Method 定義(15.4)、Generator Function 定義(15.5)、Async Function 定義(15.8)、Async Generator Function 定義(15.6)、および Async Arrow Function(15.9)の本体として提供される。関数コードはまた Function コンストラクタ20.2.1.1)、GeneratorFunction コンストラクタ27.3.1.1)、AsyncFunction コンストラクタ27.7.1.1)、AsyncGeneratorFunction コンストラクタ27.4.1.1)への引数から導出される。

Note 2

BindingIdentifier を関数コードに含める実際上の効果は、その関数本体が "use strict" ディレクティブを含む関数の名前である BindingIdentifier に対して、周囲のコードが strict でない場合でも strict mode の Early Error が適用されることである。

11.2.1 ディレクティブプロローグと Use Strict ディレクティブ (Directive Prologues and the Use Strict Directive)

ディレクティブプロローグ (Directive Prologue) とは、FunctionBody, ScriptBody, または ModuleBody の先頭に現れる StatementListItem もしくは ModuleItem のうち、連続して並ぶ最長の ExpressionStatement 列であって、その列中の各 ExpressionStatement がセミコロンにより終端される(明示または自動セミコロン挿入 (12.10) により)純粋な StringLiteral トークンのみから構成されるものである。ディレクティブプロローグは空列であってもよい。

Use Strict ディレクティブ (Use Strict Directive) は、その StringLiteral が正確に "use strict" または 'use strict' のいずれかの符号位置列であるディレクティブプロローグ中の ExpressionStatement である。Use Strict ディレクティブは EscapeSequenceLineContinuation を含んではならない。

ディレクティブプロローグは複数の Use Strict ディレクティブを含んでもよい。ただし実装はこれが発生した場合に警告を出してよい。

Note

ディレクティブプロローグの ExpressionStatement は包含している生成規則の評価中に通常どおり評価される。実装は、Use Strict ディレクティブではないがディレクティブプロローグ中に現れる ExpressionStatement に対し実装独自の意味を定義してよい。適切な通知手段が存在する場合、実装はディレクティブプロローグ内で Use Strict ディレクティブではなく、かつ実装により意味が定義されていない ExpressionStatement に遭遇した際、警告を発するべきである。

11.2.2 Strict Mode コード (Strict Mode Code)

ECMAScript の構文単位は制限のない(非 strict)または strict モードの構文とセマンティクス(4.3.2)で処理されうる。コードは次の状況で strict mode code として解釈される:

strict mode code でない ECMAScript コードは non-strict code と呼ばれる。

11.2.2.1 静的セマンティクス: IsStrict ( node: a Parse Node, ): a Boolean

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. If the source text matched by node is strict mode code, return true; else return false.

11.2.3 非 ECMAScript 関数 (Non-ECMAScript Functions)

ECMAScript 実装は、評価挙動が ECMAScript ソーステキスト以外のホスト定義実行可能コード形式で記述される関数エキゾチックオブジェクトの評価をサポートしてよい。ある関数オブジェクトが ECMAScript コード内で定義されたか、組み込み関数であるかは、その関数オブジェクトが呼び出す/呼び出される ECMAScript コードの観点からは観測できない。

12 ECMAScript 言語: 字句文法 (ECMAScript Language: Lexical Grammar)

ECMAScript の Script または Module のソーステキストはまず入力要素(トークン、行終端子、コメント、または空白)から成る列へと変換される。ソーステキストは左から右へ走査され、可能な限り最長の符号位置列が次の入力要素として逐次選択される。

入力要素の識別がそれを消費する構文文法コンテキストに依存する状況がいくつか存在する。これは字句文法に複数の目標(goal)記号を必要とする。InputElementHashbangOrRegExp 目標は Script または Module の開始時に用いられる。InputElementRegExpOrTemplateTail 目標は RegularExpressionLiteral, TemplateMiddle, または TemplateTail が許可される構文文法コンテキストで用いられる。InputElementRegExp 目標記号は RegularExpressionLiteral が許可され、かつ TemplateMiddleTemplateTail が許可されないすべての構文文法コンテキストで用いられる。InputElementTemplateTail 目標は TemplateMiddle または TemplateTail が許可され、 RegularExpressionLiteral が許可されないすべての構文文法コンテキストで用いられる。その他すべてのコンテキストでは InputElementDiv が字句目標記号として用いられる。

Note

複数の字句目標を用いることで自動セミコロン挿入に影響する字句的曖昧さが存在しないことを保証する。例えば、先頭に除算または除算代入、かつ先頭に RegularExpressionLiteral の両方が許容される構文文法コンテキストは存在しない。これはセミコロン挿入(12.10 参照)によって影響を受けない。以下の例のように:

a = b
/hi/g.exec(c).map(d);

LineTerminator の後の最初の非空白・非コメント符号位置が U+002F (SOLIDUS) であり、構文コンテキストが除算または除算代入を許可する場合、LineTerminator の位置にセミコロンは挿入されない。すなわち上の例は次と同じように解釈される:

a = b / hi / g.exec(c).map(d);

構文 (Syntax)

InputElementDiv :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator RightBracePunctuator InputElementRegExp :: WhiteSpace LineTerminator Comment CommonToken RightBracePunctuator RegularExpressionLiteral InputElementRegExpOrTemplateTail :: WhiteSpace LineTerminator Comment CommonToken RegularExpressionLiteral TemplateSubstitutionTail InputElementTemplateTail :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator TemplateSubstitutionTail InputElementHashbangOrRegExp :: WhiteSpace LineTerminator Comment CommonToken HashbangComment RegularExpressionLiteral

12.1 Unicode 形式制御文字 (Unicode Format-Control Characters)

Unicode 形式制御文字(すなわち Unicode 文字データベースにおける “Cf” カテゴリ、例えば LEFT-TO-RIGHT MARK や RIGHT-TO-LEFT MARK)は、上位プロトコル(マークアップ言語など)が存在しない場合にテキスト範囲の整形を制御するために使用される制御コードである。

編集および表示を容易にするため、ソーステキスト内で形式制御文字を許可することは有用である。すべての形式制御文字はコメント内、ならびに文字列リテラル、テンプレートリテラル、正規表現リテラル内で使用できる。

U+FEFF (ZERO WIDTH NO-BREAK SPACE) は主としてテキストの冒頭で Unicode であることを示し、テキストのエンコーディングとバイト順を検出するために用いられる形式制御文字である。この目的で用いられる <ZWNBSP> 文字は、ファイル連結の結果などとしてテキスト開始後にも現れることがある。ECMAScript ソーステキストでは、コメント、文字列リテラル、テンプレートリテラル、正規表現リテラルの外側で <ZWNBSP> 符号位置は空白文字として扱われる(12.2 参照)。

12.2 空白 (White Space)

空白符号位置はソーステキストの可読性を高め、トークン(分割不可能な字句単位)を相互に分離するために使用されるが、それ以外の点では意味を持たない。空白符号位置は任意の 2 つのトークンの間および入力の開始・末尾に現れうる。空白符号位置は StringLiteral, RegularExpressionLiteral, Template, TemplateSubstitutionTail の内部に現れ、その場合リテラル値を構成する有意味な符号位置として扱われる。また Comment 内に現れうるが、他の種類のトークン内部には現れない。

ECMAScript の空白符号位置は Table 33 に列挙される。

Table 33: White Space Code Points
Code Points Name Abbreviation
U+0009 CHARACTER TABULATION <TAB>
U+000B LINE TABULATION <VT>
U+000C FORM FEED (FF) <FF>
U+FEFF ZERO WIDTH NO-BREAK SPACE <ZWNBSP>
一般カテゴリ “Space_Separator” のいかなる符号位置 <USP>
Note 1

U+0020 (SPACE) と U+00A0 (NO-BREAK SPACE) は <USP> の一部である。

Note 2

Table 33 に列挙される符号位置を除き、ECMAScript WhiteSpace は Unicode “White_Space” プロパティを持つが一般カテゴリ “Space_Separator” (“Zs”) に分類されないすべての符号位置を意図的に除外する。

構文 (Syntax)

WhiteSpace :: <TAB> <VT> <FF> <ZWNBSP> <USP>

12.3 行終端子 (Line Terminators)

空白符号位置と同様に、行終端子符号位置はソーステキストの可読性を高め、トークンを相互に分離するために使用される。しかし空白符号位置と異なり、行終端子は構文文法の振る舞いに影響を及ぼす。一般に、行終端子は任意の 2 つのトークン間に現れうるが、構文文法により禁止される箇所がいくつか存在する。行終端子は自動セミコロン挿入(12.10)の過程にも影響する。行終端子は StringLiteral, Template, TemplateSubstitutionTail 以外のいかなるトークン内部にも現れない。<LF> および <CR> 行終端子は LineContinuation の一部である場合を除き StringLiteral トークン内部に現れない。

行終端子は MultiLineComment 内には現れることができるが、SingleLineComment 内には現れない。

行終端子は正規表現において \s クラスによりマッチされる空白符号位置集合に含まれる。

ECMAScript の行終端子符号位置は Table 34 に列挙される。

Table 34: Line Terminator Code Points
Code Point Unicode Name Abbreviation
U+000A LINE FEED (LF) <LF>
U+000D CARRIAGE RETURN (CR) <CR>
U+2028 LINE SEPARATOR <LS>
U+2029 PARAGRAPH SEPARATOR <PS>

Table 34 に示す Unicode 符号位置のみが行終端子として扱われる。その他の改行または行分割の Unicode 符号位置は行終端子とは扱われないが、Table 33 に記述された要件を満たす場合は空白として扱われる。シーケンス <CR><LF> は行終端子として一般的に使用される。行番号の報告目的においては一つの SourceCharacter と見なされるべきである。

構文 (Syntax)

LineTerminator :: <LF> <CR> <LS> <PS> LineTerminatorSequence :: <LF> <CR> [lookahead ≠ <LF>] <LS> <PS> <CR> <LF>

12.4 コメント (Comments)

コメントは単一行または複数行のいずれかである。複数行コメントは入れ子にできない。

単一行コメントは LineTerminator 符号位置以外の任意の Unicode 符号位置を含むことができ、また一般規則としてトークンは常に可能な限り長くなるため、単一行コメントは // マーカーから行末までのすべての符号位置で構成される。ただし行末の LineTerminator は単一行コメントの一部とは見なされず、字句文法により別途認識され構文文法用の入力要素列の一部となる。これは重要な点であり、単一行コメントの有無が自動セミコロン挿入(12.10 参照)に影響しないことを意味する。

コメントは空白のように振る舞い破棄されるが、MultiLineComment に行終端子符号位置が含まれる場合、構文文法によるパース目的ではそのコメント全体が一つの LineTerminator と見なされる。

構文 (Syntax)

Comment :: MultiLineComment SingleLineComment MultiLineComment :: /* MultiLineCommentCharsopt */ MultiLineCommentChars :: MultiLineNotAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt PostAsteriskCommentChars :: MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt MultiLineNotAsteriskChar :: SourceCharacter but not * MultiLineNotForwardSlashOrAsteriskChar :: SourceCharacter but not one of / or * SingleLineComment :: // SingleLineCommentCharsopt SingleLineCommentChars :: SingleLineCommentChar SingleLineCommentCharsopt SingleLineCommentChar :: SourceCharacter but not LineTerminator

この節のいくつかの生成規則は B.1.1 節で代替定義が与えられる。

12.5 ハッシュバンコメント (Hashbang Comments)

ハッシュバンコメントは位置依存であり、他の種類のコメントと同様に構文文法への入力要素列からは破棄される。

構文 (Syntax)

HashbangComment :: #! SingleLineCommentCharsopt

12.6 トークン (Tokens)

構文 (Syntax)

CommonToken :: IdentifierName PrivateIdentifier Punctuator NumericLiteral StringLiteral Template Note

DivPunctuator, RegularExpressionLiteral, RightBracePunctuator, TemplateSubstitutionTail の生成規則は CommonToken 生成規則に含まれない追加トークンを導出する。

12.7 名前とキーワード (Names and Keywords)

IdentifierName および ReservedWord は Unicode Standard Annex #31「Identifier and Pattern Syntax」で与えられる既定の識別子構文(わずかな修正付き)に従って解釈されるトークンである。ReservedWordIdentifierName の列挙された部分集合である。構文文法は IdentifierReservedWord ではない IdentifierName として定義する。Unicode 識別子文法は Unicode Standard が定義する文字プロパティに基づく。Unicode 標準の最新バージョンで指定カテゴリに属する Unicode 符号位置は、すべての適合 ECMAScript 実装によりそのカテゴリとして扱われなければならない。実装は Unicode 標準の後続版で定義された識別子用符号位置を認識してもよい。

Note 1

この規格は追加の特定符号位置を許可する: U+0024 (DOLLAR SIGN) および U+005F (LOW LINE) は IdentifierName 内の任意の位置で許可される。

構文 (Syntax)

PrivateIdentifier :: # IdentifierName IdentifierName :: IdentifierStart IdentifierName IdentifierPart IdentifierStart :: IdentifierStartChar \ UnicodeEscapeSequence IdentifierPart :: IdentifierPartChar \ UnicodeEscapeSequence IdentifierStartChar :: UnicodeIDStart $ _ IdentifierPartChar :: UnicodeIDContinue $ AsciiLetter :: one of a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z UnicodeIDStart :: any Unicode code point with the Unicode property “ID_Start” UnicodeIDContinue :: any Unicode code point with the Unicode property “ID_Continue”

非終端記号 UnicodeEscapeSequence の定義は 12.9.4 に示される。

Note 2

非終端記号 IdentifierPartUnicodeIDContinue を通じて _ を導出する。

Note 3

Unicode プロパティ “ID_Start” および “ID_Continue” の集合には、それぞれ “Other_ID_Start” および “Other_ID_Continue” プロパティを持つ符号位置が含まれる。

12.7.1 識別子名 (Identifier Names)

Unicode エスケープシーケンスは IdentifierName 内で許可され、その場合 UnicodeEscapeSequence の IdentifierCodePoint に等しい一つの Unicode 符号位置として寄与する。UnicodeEscapeSequence に先行する ` はいかなる符号位置も寄与しない。|UnicodeEscapeSequence| は、それが寄与する符号位置をエスケープ無しで書いた場合に無効となるような符号位置を |IdentifierName| に寄与するためには使用できない。言い換えると、 ` UnicodeEscapeSequence の並びをそれが寄与する SourceCharacter に置換した場合、結果は元の IdentifierName と同一の SourceCharacter 列を持つ有効な IdentifierName でなければならない。本仕様内の IdentifierName の解釈は、特定符号位置がエスケープシーケンスで与えられたかどうかに関わらず実際のコードポイントに基づく。

Unicode 標準に従い正規等価な 2 つの IdentifierName は、各 UnicodeEscapeSequence を置換した後に完全に同じコードポイント列で表されない限り等しくない

12.7.1.1 静的セマンティクス: 早期エラー (Early Errors)

IdentifierStart :: \ UnicodeEscapeSequence IdentifierPart :: \ UnicodeEscapeSequence

12.7.1.2 静的セマンティクス: IdentifierCodePoints : 符号位置の List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

IdentifierName :: IdentifierStart
  1. cpIdentifierStart の IdentifierCodePoint とする。
  2. « cp » を返す。
IdentifierName :: IdentifierName IdentifierPart
  1. cps を導出された IdentifierName の IdentifierCodePoints とする。
  2. cpIdentifierPart の IdentifierCodePoint とする。
  3. cps と « cp » のリスト結合を返す。

12.7.1.3 静的セマンティクス: IdentifierCodePoint : 符号位置

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

IdentifierStart :: IdentifierStartChar
  1. IdentifierStartChar によりマッチされた符号位置を返す。
IdentifierPart :: IdentifierPartChar
  1. IdentifierPartChar によりマッチされた符号位置を返す。
UnicodeEscapeSequence :: u Hex4Digits
  1. Hex4Digits の MV の数値値を持つ符号位置を返す。
UnicodeEscapeSequence :: u{ CodePoint }
  1. CodePoint の MV の数値値を持つ符号位置を返す。

12.7.2 キーワードと予約語 (Keywords and Reserved Words)

キーワード (keyword) とは IdentifierName にマッチしかつ構文上の用途(生成規則中に等幅フォントで文字通り出現する)を持つトークンである。ECMAScript のキーワードには if, while, async, await など多数が含まれる。

予約語 (reserved word) とは識別子として使用できない IdentifierName である。多くのキーワードは予約語であるが、そうでないものもあり、また特定の文脈でのみ予約されるものもある。ifwhile は予約語である。await は async 関数およびモジュール内でのみ予約される。async は予約されていないため、変数名やラベルとして制限なく使用できる。

この仕様は文法生成規則および早期エラールールの組み合わせを用いて、どの名前が有効な識別子でどれが予約語かを指定する。下記 ReservedWord 一覧内の awaityield を除くすべてのトークンは無条件に予約される。awaityield の例外は 13.1 でパラメータ化された構文生成規則を用いて指定される。最後に、いくつかの早期エラールールが有効な識別子集合を制限する。13.1.1, 14.3.1.1, 14.7.5.1, 15.7.1 を参照。まとめると識別子名には 5 つの分類がある:

  • 常に識別子として許可されキーワードではないもの(Math, window, toString, _ など);

  • 決して識別子として許可されないもの(awaityield を除く ReservedWord);

  • 文脈的に識別子として許可されるもの(awaityield);

  • strict mode code で文脈的に識別子として不許可となるもの: let, static, implements, interface, package, private, protected, public;

  • 常に識別子として許可されるが、特定の構文生成規則中で Identifier が許可されない位置にキーワードとして現れるもの: as, async, from, get, meta, of, set, target

条件付きキーワード (conditional keyword) または 文脈的キーワード (contextual keyword) という語がしばしば最後の 3 つのカテゴリに属するキーワードを指し、これらは文脈によって識別子またはキーワードとして使用できる。

構文 (Syntax)

ReservedWord :: one of await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield Note 1

5.1.5 に従い、文法内のキーワードは特定の SourceCharacter 列をリテラルにマッチする。キーワード中の符号位置は `` |UnicodeEscapeSequence| で表現できない。

IdentifierName` |UnicodeEscapeSequence| を含み得るが、els\u{65}` のように書いて “else” という名前の変数を宣言することはできない。13.1.1 にある早期エラールールが、予約語と同じ StringValue を持つ識別子を除外する。

Note 2

enum は現時点で本仕様においてキーワードとして使用されていない。これは将来の言語拡張でキーワードとして使用するために予約された future reserved word である。

同様に、implements, interface, package, private, protected, publicstrict mode code における future reserved words である。

Note 3

arguments および eval はキーワードではないが strict mode code でいくつかの制限を受ける。13.1.1, 8.6.4, 15.2.1, 15.5.1, 15.6.1, 15.8.1 を参照。

12.8 句読点 (Punctuators)

構文 (Syntax)

Punctuator :: OptionalChainingPunctuator OtherPunctuator OptionalChainingPunctuator :: ?. [lookahead ∉ DecimalDigit] OtherPunctuator :: one of { ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ?? ? : = += -= *= %= **= <<= >>= >>>= &= |= ^= &&= ||= ??= => DivPunctuator :: / /= RightBracePunctuator :: }

12.9 リテラル (Literals)

12.9.1 null リテラル (Null Literals)

構文 (Syntax)

NullLiteral :: null

12.9.2 真偽値リテラル (Boolean Literals)

構文 (Syntax)

BooleanLiteral :: true false

12.9.3 数値リテラル (Numeric Literals)

構文 (Syntax)

NumericLiteralSeparator :: _ NumericLiteral :: DecimalLiteral DecimalBigIntegerLiteral NonDecimalIntegerLiteral[+Sep] NonDecimalIntegerLiteral[+Sep] BigIntLiteralSuffix LegacyOctalIntegerLiteral DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix NonZeroDigit DecimalDigits[+Sep]opt BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits[+Sep] BigIntLiteralSuffix NonDecimalIntegerLiteral[Sep] :: BinaryIntegerLiteral[?Sep] OctalIntegerLiteral[?Sep] HexIntegerLiteral[?Sep] BigIntLiteralSuffix :: n DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits[+Sep]opt ExponentPart[+Sep]opt . DecimalDigits[+Sep] ExponentPart[+Sep]opt DecimalIntegerLiteral ExponentPart[+Sep]opt DecimalIntegerLiteral :: 0 NonZeroDigit NonZeroDigit NumericLiteralSeparatoropt DecimalDigits[+Sep] NonOctalDecimalIntegerLiteral DecimalDigits[Sep] :: DecimalDigit DecimalDigits[?Sep] DecimalDigit [+Sep] DecimalDigits[+Sep] NumericLiteralSeparator DecimalDigit DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9 NonZeroDigit :: one of 1 2 3 4 5 6 7 8 9 ExponentPart[Sep] :: ExponentIndicator SignedInteger[?Sep] ExponentIndicator :: one of e E SignedInteger[Sep] :: DecimalDigits[?Sep] + DecimalDigits[?Sep] - DecimalDigits[?Sep] BinaryIntegerLiteral[Sep] :: 0b BinaryDigits[?Sep] 0B BinaryDigits[?Sep] BinaryDigits[Sep] :: BinaryDigit BinaryDigits[?Sep] BinaryDigit [+Sep] BinaryDigits[+Sep] NumericLiteralSeparator BinaryDigit BinaryDigit :: one of 0 1 OctalIntegerLiteral[Sep] :: 0o OctalDigits[?Sep] 0O OctalDigits[?Sep] OctalDigits[Sep] :: OctalDigit OctalDigits[?Sep] OctalDigit [+Sep] OctalDigits[+Sep] NumericLiteralSeparator OctalDigit LegacyOctalIntegerLiteral :: 0 OctalDigit LegacyOctalIntegerLiteral OctalDigit NonOctalDecimalIntegerLiteral :: 0 NonOctalDigit LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit NonOctalDecimalIntegerLiteral DecimalDigit LegacyOctalLikeDecimalIntegerLiteral :: 0 OctalDigit LegacyOctalLikeDecimalIntegerLiteral OctalDigit OctalDigit :: one of 0 1 2 3 4 5 6 7 NonOctalDigit :: one of 8 9 HexIntegerLiteral[Sep] :: 0x HexDigits[?Sep] 0X HexDigits[?Sep] HexDigits[Sep] :: HexDigit HexDigits[?Sep] HexDigit [+Sep] HexDigits[+Sep] NumericLiteralSeparator HexDigit HexDigit :: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

NumericLiteral に直続する SourceCharacterIdentifierStart でも DecimalDigit でもあってはならない。

Note

例えば: 3in はエラーであり、3in の 2 つの入力要素ではない。

12.9.3.1 静的セマンティクス: 早期エラー (Early Errors)

NumericLiteral :: LegacyOctalIntegerLiteral DecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral
  • IsStrict(this production) が true なら構文エラー。
Note
非 strict コードではこの構文は Legacy である。

12.9.3.2 静的セマンティクス: MV

数値リテラルは Number 型または BigInt 型の値を表す。

12.9.3.3 静的セマンティクス: NumericValue : Number または BigInt

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

NumericLiteral :: DecimalLiteral
  1. RoundMVResult(DecimalLiteral の MV) を返す。
NumericLiteral :: NonDecimalIntegerLiteral
  1. 𝔽(NonDecimalIntegerLiteral の MV) を返す。
NumericLiteral :: LegacyOctalIntegerLiteral
  1. 𝔽(LegacyOctalIntegerLiteral の MV) を返す。
NumericLiteral :: NonDecimalIntegerLiteral BigIntLiteralSuffix
  1. NonDecimalIntegerLiteral の MV に対応する BigInt 値を返す。
DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix
  1. 0 を返す。
DecimalBigIntegerLiteral :: NonZeroDigit BigIntLiteralSuffix
  1. NonZeroDigit の MV に対応する BigInt 値を返す。
DecimalBigIntegerLiteral :: NonZeroDigit DecimalDigits BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits BigIntLiteralSuffix
  1. nNumericLiteralSeparator の出現を除いた DecimalDigits の符号位置数とする。
  2. mv を (NonZeroDigit の MV × 10n) + DecimalDigits の MV とする。
  3. (mv) を返す。

12.9.4 文字列リテラル (String Literals)

Note 1

文字列リテラルは単一または二重引用符で囲まれた 0 個以上の Unicode 符号位置である。Unicode 符号位置はエスケープシーケンスで表すこともできる。閉じ引用符、U+005C (REVERSE SOLIDUS), U+000D (CARRIAGE RETURN), U+000A (LINE FEED) 以外のすべての符号位置は文字列リテラル内にリテラルに記述可能である。任意の符号位置はエスケープシーケンスの形で出現可能である。文字列リテラルは ECMAScript String 値へと評価される。これらの String 値を生成する際、Unicode 符号位置は 11.1.1 で定義されるように UTF-16 エンコードされる。基本多言語面に属するコードポイントは文字列の 1 つのコードユニット要素としてエンコードされ、それ以外は 2 つのコードユニット要素としてエンコードされる。

構文 (Syntax)

StringLiteral :: " DoubleStringCharactersopt " ' SingleStringCharactersopt ' DoubleStringCharacters :: DoubleStringCharacter DoubleStringCharactersopt SingleStringCharacters :: SingleStringCharacter SingleStringCharactersopt DoubleStringCharacter :: SourceCharacter but not one of " or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation SingleStringCharacter :: SourceCharacter but not one of ' or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation LineContinuation :: \ LineTerminatorSequence EscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence HexEscapeSequence UnicodeEscapeSequence CharacterEscapeSequence :: SingleEscapeCharacter NonEscapeCharacter SingleEscapeCharacter :: one of ' " \ b f n r t v NonEscapeCharacter :: SourceCharacter but not one of EscapeCharacter or LineTerminator EscapeCharacter :: SingleEscapeCharacter DecimalDigit x u LegacyOctalEscapeSequence :: 0 [lookahead ∈ { 8, 9 }] NonZeroOctalDigit [lookahead ∉ OctalDigit] ZeroToThree OctalDigit [lookahead ∉ OctalDigit] FourToSeven OctalDigit ZeroToThree OctalDigit OctalDigit NonZeroOctalDigit :: OctalDigit but not 0 ZeroToThree :: one of 0 1 2 3 FourToSeven :: one of 4 5 6 7 NonOctalDecimalEscapeSequence :: one of 8 9 HexEscapeSequence :: x HexDigit HexDigit UnicodeEscapeSequence :: u Hex4Digits u{ CodePoint } Hex4Digits :: HexDigit HexDigit HexDigit HexDigit

非終端 HexDigit の定義は 12.9.3 に、SourceCharacter11.1 にある。

Note 2

<LF> と <CR> は LineContinuation の一部として空の符号位置列を生成する場合を除き文字列リテラル内に現れない。文字列リテラルの String 値にこれらを含める正しい方法は \n\u000A などのエスケープシーケンスを用いることである。

12.9.4.1 静的セマンティクス: 早期エラー (Early Errors)

EscapeSequence :: LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence
  • IsStrict(this production) が true なら構文エラー。
Note 1
非 strict コードではこの構文は Legacy。
Note 2

文字列リテラルは囲むコードを strict mode にする Use Strict ディレクティブより前に現れる可能性があるため、実装はそのようなリテラルに対して上記規則を適用する際注意しなければならない。例えば次のソーステキストは構文エラーを含む:

function invalid() { "\7"; "use strict"; }

12.9.4.2 静的セマンティクス: SV : String

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

文字列リテラルは String 型の値を表す。SV は文字列リテラルの各部分に再帰的に適用され String 値を生成する。この過程で、文字列リテラル内の一部の Unicode 符号位置は下記または 12.9.3 に述べるように数学的値を持つものとして解釈される。

Table 35: String Single Character Escape Sequences
Escape Sequence Code Unit Value Unicode Character Name Symbol
\\b 0x0008 BACKSPACE <BS>
\\t 0x0009 CHARACTER TABULATION <HT>
\\n 0x000A LINE FEED (LF) <LF>
\\v 0x000B LINE TABULATION <VT>
\\f 0x000C FORM FEED (FF) <FF>
\\r 0x000D CARRIAGE RETURN (CR) <CR>
\\" 0x0022 QUOTATION MARK "
\\' 0x0027 APOSTROPHE '
\\\\ 0x005C REVERSE SOLIDUS \\

12.9.4.3 静的セマンティクス: MV

12.9.5 正規表現リテラル (Regular Expression Literals)

Note 1

正規表現リテラルは評価のたびに RegExp オブジェクト(22.2 参照)へ変換される入力要素である。プログラム中の 2 つの正規表現リテラルは内容が同一でも === で等しくならない。RegExp オブジェクトは new RegExp またはコンストラクタ呼び出し(22.2.4)で実行時に生成することもできる。

以下の生成規則は正規表現リテラルの構文を記述し、入力要素スキャナが正規表現リテラルの終端を見つけるために用いられる。RegularExpressionBodyRegularExpressionFlags を成すソーステキストは、その後より厳密な ECMAScript 正規表現文法(22.2.1)を用いて再度パースされる。

実装は 22.2.1 で定義される ECMAScript 正規表現文法を拡張してもよいが、下に定義される RegularExpressionBody および RegularExpressionFlags 生成規則、またそれらが使用する生成規則を拡張してはならない。

構文 (Syntax)

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags RegularExpressionBody :: RegularExpressionFirstChar RegularExpressionChars RegularExpressionChars :: [empty] RegularExpressionChars RegularExpressionChar RegularExpressionFirstChar :: RegularExpressionNonTerminator but not one of * or \ or / or [ RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionChar :: RegularExpressionNonTerminator but not one of \ or / or [ RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionBackslashSequence :: \ RegularExpressionNonTerminator RegularExpressionNonTerminator :: SourceCharacter but not LineTerminator RegularExpressionClass :: [ RegularExpressionClassChars ] RegularExpressionClassChars :: [empty] RegularExpressionClassChars RegularExpressionClassChar RegularExpressionClassChar :: RegularExpressionNonTerminator but not one of ] or \ RegularExpressionBackslashSequence RegularExpressionFlags :: [empty] RegularExpressionFlags IdentifierPartChar Note 2

正規表現リテラルは空にできない。空の正規表現リテラルを表す代わりに // は単一行コメントを開始する。空の正規表現を指定するには /(?:)/ を用いる。

12.9.5.1 静的セマンティクス: BodyText : ソーステキスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags
  1. RegularExpressionBody として認識されたソーステキストを返す。

12.9.5.2 静的セマンティクス: FlagText : ソーステキスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags
  1. RegularExpressionFlags として認識されたソーステキストを返す。

12.9.6 テンプレートリテラルの字句要素 (Template Literal Lexical Components)

構文 (Syntax)

Template :: NoSubstitutionTemplate TemplateHead NoSubstitutionTemplate :: ` TemplateCharactersopt ` TemplateHead :: ` TemplateCharactersopt ${ TemplateSubstitutionTail :: TemplateMiddle TemplateTail TemplateMiddle :: } TemplateCharactersopt ${ TemplateTail :: } TemplateCharactersopt ` TemplateCharacters :: TemplateCharacter TemplateCharactersopt TemplateCharacter :: $ [lookahead ≠ {] \ TemplateEscapeSequence \ NotEscapeSequence LineContinuation LineTerminatorSequence SourceCharacter but not one of ` or \ or $ or LineTerminator TemplateEscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] HexEscapeSequence UnicodeEscapeSequence NotEscapeSequence :: 0 DecimalDigit DecimalDigit but not 0 x [lookahead ∉ HexDigit] x HexDigit [lookahead ∉ HexDigit] u [lookahead ∉ HexDigit] [lookahead ≠ {] u HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit HexDigit [lookahead ∉ HexDigit] u { [lookahead ∉ HexDigit] u { NotCodePoint [lookahead ∉ HexDigit] u { CodePoint [lookahead ∉ HexDigit] [lookahead ≠ }] NotCodePoint :: HexDigits[~Sep] but only if the MV of HexDigits > 0x10FFFF CodePoint :: HexDigits[~Sep] but only if the MV of HexDigits ≤ 0x10FFFF Note

TemplateSubstitutionTailInputElementTemplateTail の代替字句目標で用いられる。

12.9.6.1 静的セマンティクス: TV : String または undefined

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. テンプレートリテラル構成要素は TV により String 型の値として解釈される。TV はテンプレートオブジェクトのインデックス付き構成要素(テンプレート値)を構成する。TV ではエスケープシーケンスはその Unicode 符号位置を UTF-16 のコードユニットに置換される。

12.9.6.2 静的セマンティクス: TRV : String

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. テンプレートリテラル構成要素は TRV により String 型の値として解釈される。TRV はテンプレートオブジェクトの raw 構成要素(テンプレート raw 値)を構築する。TRV は TV と似ているが、TRV ではエスケープシーケンスは字面通りのコード単位として扱われる点が異なる。

Note

TV は LineContinuation のコードユニットを除外するが TRV は含む。<CR><LF> と <CR> の LineTerminatorSequence は TV と TRV の両方で <LF> に正規化される。<CR> または <CR><LF> を含めるには明示的な TemplateEscapeSequence が必要。

12.10 自動セミコロン挿入 (Automatic Semicolon Insertion)

ほとんどの ECMAScript 文および宣言はセミコロンで終端されなければならない。これらのセミコロンは常に明示的に記述できる。利便性のため、特定の状況ではそれらを省略できる。これらの状況ではソースコードトークン列へ自動的にセミコロンが挿入されると記述される。

12.10.1 自動セミコロン挿入の規則 (Rules of Automatic Semicolon Insertion)

以下の規則において “token” は 12 に述べる現在の字句目標記号を用いて決定される実際に認識された字句トークンを意味する。

セミコロン挿入には 3 つの基本規則がある:

  1. ソーステキストを左から右へパースする際、いかなる文法生成規則でも許可されないトークン(違反トークン)に遭遇したとき、以下のいずれかが真ならその違反トークンの前にセミコロンが自動挿入される:

    • 違反トークンが直前のトークンと 1 つ以上の LineTerminator で分離されている。
    • 違反トークンが } である。
    • 直前のトークンが ) であり、挿入されたセミコロンが do-while 文 (14.7.2) の終端セミコロンとしてパースされる。
  2. ソーステキストを左から右へパースする際、トークン入力列の終端に到達し、構文解析器が入力トークン列を目標非終端の単一インスタンスとしてパースできないなら、入力列末尾にセミコロンが自動挿入される。
  3. ソーステキストを左から右へパースする際、文法生成規則により許可されるトークンだがその生成規則が制限付き生成規則であり、トークンが制限付き生成規則内の “[no LineTerminator here]” 注釈直後に位置する終端または非終端の先頭トークン(= 制限トークン)であり、その制限トークンが直前トークンと 1 つ以上の LineTerminator で分離されているなら、制限トークンの前にセミコロンが自動挿入される。

ただし上記規則には更に支配的な条件がある: セミコロンが自動挿入された結果それが空文としてパースされる場合、またはそのセミコロンが for 文ヘッダ内の 2 つのセミコロンの一つになる場合(14.7.4 参照)、セミコロンは決して自動挿入されない。

Note

以下は文法中の唯一の制限付き生成規則である:

UpdateExpression[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++ LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] -- ContinueStatement[Yield, Await] : continue ; continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; BreakStatement[Yield, Await] : break ; break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; ReturnStatement[Yield, Await] : return ; return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; ThrowStatement[Yield, Await] : throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; YieldExpression[In, Await] : yield yield [no LineTerminator here] AssignmentExpression[?In, +Yield, ?Await] yield [no LineTerminator here] * AssignmentExpression[?In, +Yield, ?Await] ArrowFunction[In, Yield, Await] : ArrowParameters[?Yield, ?Await] [no LineTerminator here] => ConciseBody[?In] AsyncFunctionDeclaration[Yield, Await, Default] : async [no LineTerminator here] function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } [+Default] async [no LineTerminator here] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionExpression : async [no LineTerminator here] function BindingIdentifier[~Yield, +Await]opt ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncMethod[Yield, Await] : async [no LineTerminator here] ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncGeneratorDeclaration[Yield, Await, Default] : async [no LineTerminator here] function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } [+Default] async [no LineTerminator here] function * ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorExpression : async [no LineTerminator here] function * BindingIdentifier[+Yield, +Await]opt ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorMethod[Yield, Await] : async [no LineTerminator here] * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncArrowFunction[In, Yield, Await] : async [no LineTerminator here] AsyncArrowBindingIdentifier[?Yield] [no LineTerminator here] => AsyncConciseBody[?In] CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In] AsyncArrowHead : async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]

これら制限付き生成規則の実際的効果は次の通り:

  • 後置 ++ または -- が出現し、直前トークンとの間に 1 つ以上の LineTerminator がある場合、その前にセミコロンが自動挿入される。
  • continue, break, return, throw, yield トークンに続いて LineTerminator が現れた場合、それらトークンの直後にセミコロンが自動挿入される。
  • アロー関数パラメータの終わりと => の間に LineTerminator がある場合、セミコロンが挿入され => は構文エラーとなる。
  • async の後に LineTerminator があり、その後に functionIdentifierName( が続く前に改行がある場合、セミコロンが挿入され async は後続と同じ式/クラス要素と扱われない。
  • async の後に LineTerminator があり、その後に * が来る場合、セミコロンが挿入され * は構文エラーとなる。

実務上の指針:

  • 後置 ++ / -- はオペランドと同じ行に置く。
  • return / throw / yield の後に続く式は同じ行で開始する。
  • break / continueLabelIdentifier は同じ行に置く。
  • アロー関数のパラメータ終端と => は同じ行に置く。
  • 非同期関数やメソッドの直前の async は直後のトークンと同じ行に置く。

12.10.2 自動セミコロン挿入の例 (Examples of Automatic Semicolon Insertion)

この節は規範的でない (non-normative)。

次のソース

{ 1 2 } 3

は自動セミコロン挿入規則を考慮しても ECMAScript 文法の妥当な文ではない。対照的に次のソース

{ 1
2 } 3

も妥当ではないが、自動セミコロン挿入により以下に変換される:

{ 1
;2 ;} 3;

これは妥当な ECMAScript 文である。

次のソース

for (a; b
)

は妥当ではなく、自動セミコロン挿入で変更されない。これは for 文ヘッダのセミコロンが必要であり、自動挿入は for ヘッダ内 2 つのセミコロンのいずれも挿入しないためである。

次のソース

return
a + b

は次に変換される:

return;
a + b;
Note 1

a + breturn 文で返される値として扱われない。LineTerminatorreturn トークンとそれに続く式を分離するためである。

次のソース

a = b
++c

は以下に変換される:

a = b;
++c;
Note 2

++ トークンは変数 b への後置演算子として扱われない。b++ の間に LineTerminator があるため。

次のソース

if (a > b)
else c = d

は妥当ではなく、else トークンの前には自動セミコロン挿入による変化は起こらない。文法生成規則が適用できない地点ではあるが、挿入された場合空文になるため。

次のソース

a = b + c
(d + e).print()

は自動セミコロン挿入で変換されない。2 行目冒頭の括弧付き式は関数呼び出しの引数リストと解釈できるためである:

a = b + c(d + e).print()

代入文が左括弧で始まらなければならない状況では、自動セミコロン挿入に頼らず前の文末に明示的なセミコロンを置くべきである。

12.10.3 自動セミコロン挿入の興味深いケース (Interesting Cases of Automatic Semicolon Insertion)

この節は規範的でない。

ECMAScript プログラムは自動セミコロン挿入に依存することで非常に少ないセミコロンで書くことができる。上述のようにセミコロンはすべての改行で挿入されるわけではなく、挿入は複数トークンにまたがる。

ECMAScript に新しい構文機能が追加されると、追加の構文生成規則が導入され、自動セミコロン挿入に依存する行がパース時に使用する生成規則を変化させる可能性がある。

本節では、前に現れるソーステキストによってセミコロンが挿入されるか否かが変わりうる箇所を興味深いケースとみなす。本バージョンでの自動セミコロン挿入のいくつかの興味深いケースを以下で説明する。

12.10.3.1 文リストにおける自動セミコロン挿入の興味深いケース

StatementList では多くの StatementListItem がセミコロンで終わり、自動セミコロン挿入により省略できる。上記規則の結果、式で終わる行の末尾で、次の行が以下のいずれかで始まる場合セミコロンが必要になる:

  • 開き丸括弧 (()。セミコロンがなければ 2 行は CallExpression とみなされる。
  • 開き角括弧 ([)。セミコロンがなければ 2 行は ArrayLiteral / ArrayAssignmentPattern ではなくプロパティアクセスと解釈される。
  • テンプレートリテラル (`)。セミコロンがなければ 2 行は前の式を MemberExpression とするタグ付きテンプレート (13.3.11) と解釈される。
  • 単項 + または -。セミコロンがなければ 2 行は対応する二項演算子の使用と解釈され得る。
  • RegExp リテラル。セミコロンがなければ 2 行は / MultiplicativeOperator として(正規表現にフラグがある場合など)パースされ得る。

12.10.3.2 “[no LineTerminator here]” を伴う自動セミコロン挿入のケース

この節は規範的でない。

ECMAScript には “[no LineTerminator here]” を含む生成規則があり、これらはしばしば文法における省略可能オペランドを実現する手段である。これら位置に LineTerminator を導入すると省略可能オペランドを持たない別生成規則の使用へ切り替わる。

以下では本バージョンの “[no LineTerminator here]” を使用するいくつかの生成規則を列挙する。

12.10.3.2.1 省略可能オペランドと “[no LineTerminator here]” を持つ生成規則一覧

13 ECMAScript 言語: 表現式 (Expressions)

13.1 識別子 (Identifiers)

構文 (Syntax)

IdentifierReference[Yield, Await] : Identifier [~Yield] yield [~Await] await BindingIdentifier[Yield, Await] : Identifier yield await LabelIdentifier[Yield, Await] : Identifier [~Yield] yield [~Await] await Identifier : IdentifierName but not ReservedWord Note

yieldawait は文法上は BindingIdentifier として許可されるが、以下の静的セマンティクスにより禁止され、次のようなケースで自動セミコロン挿入を許さないためである:

let
await 0;

13.1.1 静的セマンティクス: 早期エラー (Early Errors)

BindingIdentifier : Identifier
  • IsStrict(this production) が true であり、Identifier の StringValue が "arguments""eval" のいずれかであるなら構文エラー。
IdentifierReference : yield BindingIdentifier : yield LabelIdentifier : yield
  • IsStrict(this production) が true なら構文エラー。
IdentifierReference : await BindingIdentifier : await LabelIdentifier : await BindingIdentifier[Yield, Await] : yield
  • この生成規則が [Yield] パラメータを持つなら構文エラー。
BindingIdentifier[Yield, Await] : await
  • この生成規則が [Await] パラメータを持つなら構文エラー。
IdentifierReference[Yield, Await] : Identifier BindingIdentifier[Yield, Await] : Identifier LabelIdentifier[Yield, Await] : Identifier
  • この生成規則が [Yield] パラメータを持ち、Identifier の StringValue が "yield" なら構文エラー。
  • この生成規則が [Await] パラメータを持ち、Identifier の StringValue が "await" なら構文エラー。
Identifier : IdentifierName but not ReservedWord
  • IsStrict(this phrase) が true で、IdentifierName の StringValue が "implements", "interface", "let", "package", "private", "protected", "public", "static", "yield" のいずれかなら構文エラー。
  • 構文文法のゴール記号Module で、IdentifierName の StringValue が "await" なら構文エラー。
  • IdentifierName の StringValue が yield および await を除くいずれかの ReservedWord の StringValue と同じなら構文エラー。
Note

IdentifierName の StringValue は IdentifierName 内の Unicode エスケープシーケンスを正規化するため、エスケープによって ReservedWord と同じコードポイント列の Identifier を作ることはできない。

13.1.2 静的セマンティクス: StringValue : String

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

IdentifierName :: IdentifierStart IdentifierName IdentifierPart
  1. idTextUnescapedIdentifierName の IdentifierCodePoints とする。
  2. CodePointsToString(idTextUnescaped) を返す。
IdentifierReference : yield BindingIdentifier : yield LabelIdentifier : yield
  1. "yield" を返す。
IdentifierReference : await BindingIdentifier : await LabelIdentifier : await
  1. "await" を返す。
Identifier : IdentifierName but not ReservedWord
  1. IdentifierName の StringValue を返す。
PrivateIdentifier :: # IdentifierName
  1. 0x0023 (NUMBER SIGN) と IdentifierName の StringValue の文字列連結を返す。
ModuleExportName : StringLiteral
  1. StringLiteral の SV を返す。

13.1.3 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

IdentifierReference : Identifier
  1. ResolveBinding(StringValue of Identifier) を返す。
IdentifierReference : yield
  1. ResolveBinding("yield") を返す。
IdentifierReference : await
  1. ResolveBinding("await") を返す。
Note 1

IdentifierReference の評価結果は常に Reference 型の値である。

Note 2

非 strict コードではキーワード yield を識別子として使用できる。IdentifierReference の評価は yield の束縛を Identifier であるかのように解決する。Early Error によりこの評価は非 strict コードでのみ発生し得ることが保証される。

13.2 一次式 (Primary Expression)

構文 (Syntax)

PrimaryExpression[Yield, Await] : this IdentifierReference[?Yield, ?Await] Literal ArrayLiteral[?Yield, ?Await] ObjectLiteral[?Yield, ?Await] FunctionExpression ClassExpression[?Yield, ?Await] GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral[?Yield, ?Await, ~Tagged] CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] : ( Expression[+In, ?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ) ( ) ( ... BindingIdentifier[?Yield, ?Await] ) ( ... BindingPattern[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingIdentifier[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingPattern[?Yield, ?Await] )

補助構文 (Supplemental Syntax)

次の生成規則インスタンスを処理する際
PrimaryExpression[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList の解釈は次の文法で精緻化される:

ParenthesizedExpression[Yield, Await] : ( Expression[+In, ?Yield, ?Await] )

13.2.1 this キーワード

13.2.1.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

PrimaryExpression : this
  1. ResolveThisBinding() を返す。

13.2.2 識別子参照 (Identifier Reference)

IdentifierReference については 13.1 を参照。

13.2.3 リテラル (Literals)

構文 (Syntax)

Literal : NullLiteral BooleanLiteral NumericLiteral StringLiteral

13.2.3.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

Literal : NullLiteral
  1. null を返す。
Literal : BooleanLiteral
  1. BooleanLiteral がトークン false なら false を返す。
  2. BooleanLiteral がトークン true なら true を返す。
Literal : NumericLiteral
  1. 12.9.3 で定義される NumericLiteral の NumericValue を返す。
Literal : StringLiteral
  1. 12.9.4.2 で定義される StringLiteral の SV を返す。

13.2.4 配列初期化子 (Array Initializer)

Note

ArrayLiteral は 0 個以上の式(各々が要素を表す)のリストを角括弧で囲んで配列の初期化を記述する式である。要素はリテラルである必要はなく、配列初期化子の評価ごとに評価される。

配列要素は先頭・中間・末尾で省略(elide)できる。要素リスト中のカンマが直前に AssignmentExpression を伴わないとき(先頭、または別のカンマの後)、欠落した要素は配列の length に寄与し、後続要素のインデックスを増やす。省略された配列要素は定義されない。末尾で要素が省略された場合、その要素は length に寄与しない。

構文 (Syntax)

ArrayLiteral[Yield, Await] : [ Elisionopt ] [ ElementList[?Yield, ?Await] ] [ ElementList[?Yield, ?Await] , Elisionopt ] ElementList[Yield, Await] : Elisionopt AssignmentExpression[+In, ?Yield, ?Await] Elisionopt SpreadElement[?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt AssignmentExpression[+In, ?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt SpreadElement[?Yield, ?Await] Elision : , Elision , SpreadElement[Yield, Await] : ... AssignmentExpression[+In, ?Yield, ?Await]

13.2.4.1 実行時セマンティクス: ArrayAccumulation : 正常完了で整数を含むか、または突然の完了

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Elision : ,
  1. lennextIndex + 1 とする。
  2. Set(array, "length", 𝔽(len), true) を実行する。
  3. 注: 上の手順は len が 232-1 を超えると投げる。
  4. len を返す。
Elision : Elision ,
  1. 引数 array, (nextIndex + 1) で Elision の ArrayAccumulation を実行した結果を返す。
ElementList : Elisionopt AssignmentExpression
  1. Elision が存在するなら
    1. nextIndex を 引数 array, nextIndexElision の ArrayAccumulation を実行した結果に設定。
  2. initResultAssignmentExpression の Evaluation。
  3. initValue を ? GetValue(initResult)。
  4. CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), initValue) を実行。
  5. nextIndex + 1 を返す。
ElementList : Elisionopt SpreadElement
  1. Elision が存在するなら
    1. nextIndex を 引数 array, nextIndexElision の ArrayAccumulation を実行した結果に設定。
  2. 引数 array, nextIndexSpreadElement の ArrayAccumulation を実行した結果を返す。
ElementList : ElementList , Elisionopt AssignmentExpression
  1. nextIndex を 引数 array, nextIndexElementList の ArrayAccumulation を実行した結果に設定。
  2. Elision が存在するなら
    1. nextIndex を 引数 array, nextIndexElision の ArrayAccumulation を実行した結果に設定。
  3. initResultAssignmentExpression の Evaluation。
  4. initValue を ? GetValue(initResult)。
  5. CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), initValue) を実行。
  6. nextIndex + 1 を返す。
ElementList : ElementList , Elisionopt SpreadElement
  1. nextIndex を 引数 array, nextIndexElementList の ArrayAccumulation を実行した結果に設定。
  2. Elision が存在するなら
    1. nextIndex を 引数 array, nextIndexElision の ArrayAccumulation を実行した結果に設定。
  3. 引数 array, nextIndexSpreadElement の ArrayAccumulation を実行した結果を返す。
SpreadElement : ... AssignmentExpression
  1. spreadRefAssignmentExpression の Evaluation。
  2. spreadObj を ? GetValue(spreadRef)。
  3. iteratorRecord を ? GetIterator(spreadObj, sync)。
  4. 反復:
    1. next を ? IteratorStepValue(iteratorRecord)。
    2. nextdone なら nextIndex を返す。
    3. CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), next) を実行。
    4. nextIndexnextIndex + 1 に設定。
Note

標準組込み Array prototype が [[Set]] による新たな自身プロパティ生成を妨げるよう改変されていても、自身プロパティ確立を保証するため CreateDataPropertyOrThrow が使用される。

13.2.4.2 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

ArrayLiteral : [ Elisionopt ]
  1. array を ! ArrayCreate(0) とする。
  2. Elision が存在するなら
    1. 引数 array, 0 で Elision の ArrayAccumulation を実行。
  3. array を返す。
ArrayLiteral : [ ElementList ]
  1. array を ! ArrayCreate(0)。
  2. 引数 array, 0 で ElementList の ArrayAccumulation を実行。
  3. array を返す。
ArrayLiteral : [ ElementList , Elisionopt ]
  1. array を ! ArrayCreate(0)。
  2. nextIndex を 引数 array, 0 で ElementList の ArrayAccumulation を実行した結果とする。
  3. Elision が存在するなら
    1. 引数 array, nextIndexElision の ArrayAccumulation を実行。
  4. array を返す。

13.2.5 オブジェクト初期化子 (Object Initializer)

Note 1

オブジェクト初期化子はオブジェクトの初期化をリテラル風の書式で表す式であり、波括弧で囲まれた 0 個以上のプロパティキーと対応値の組のリストである。値はリテラルである必要はなく、オブジェクト初期化子の評価ごとに評価される。

構文 (Syntax)

ObjectLiteral[Yield, Await] : { } { PropertyDefinitionList[?Yield, ?Await] } { PropertyDefinitionList[?Yield, ?Await] , } PropertyDefinitionList[Yield, Await] : PropertyDefinition[?Yield, ?Await] PropertyDefinitionList[?Yield, ?Await] , PropertyDefinition[?Yield, ?Await] PropertyDefinition[Yield, Await] : IdentifierReference[?Yield, ?Await] CoverInitializedName[?Yield, ?Await] PropertyName[?Yield, ?Await] : AssignmentExpression[+In, ?Yield, ?Await] MethodDefinition[?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] PropertyName[Yield, Await] : LiteralPropertyName ComputedPropertyName[?Yield, ?Await] LiteralPropertyName : IdentifierName StringLiteral NumericLiteral ComputedPropertyName[Yield, Await] : [ AssignmentExpression[+In, ?Yield, ?Await] ] CoverInitializedName[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await] Initializer[In, Yield, Await] : = AssignmentExpression[?In, ?Yield, ?Await] Note 2

MethodDefinition15.4 で定義される。

Note 3

特定の文脈では ObjectLiteral はより制限された二次文法を覆うカバー文法として使われる。CoverInitializedName 生成規則はこれら二次文法を完全に覆うために必要である。しかし通常の実際の ObjectLiteral が期待される場面でこの生成規則が使用されると Early Syntax Error になる。

13.2.5.1 静的セマンティクス: 早期エラー (Early Errors)

PropertyDefinition : MethodDefinition

ObjectLiteral 生成規則は実際のオブジェクト初期化子を記述するだけでなく ObjectAssignmentPattern を覆うカバー文法として、また CoverParenthesizedExpressionAndArrowParameterList の一部として認識され得る。ObjectAssignmentPattern が要求される文脈で ObjectLiteral が現れるとき、以下の Early Error 規則は適用されない。さらに、CoverParenthesizedExpressionAndArrowParameterListCoverCallExpressionAndAsyncArrowHead の初期パース時にも適用されない。

PropertyDefinition : CoverInitializedName
  • この生成規則にマッチするソーステキストが存在するなら構文エラー。
Note 1

この生成規則は ObjectLiteralObjectAssignmentPattern のカバー文法として機能させるために存在し、実際のオブジェクト初期化子には現れない。

ObjectLiteral : { PropertyDefinitionList } { PropertyDefinitionList , } Note 2

PropertyNameList が返すリストには ComputedPropertyName を用いて定義された名前は含まれない。

13.2.5.2 静的セマンティクス: IsComputedPropertyKey : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

PropertyName : LiteralPropertyName
  1. false を返す。
PropertyName : ComputedPropertyName
  1. true を返す。

13.2.5.3 静的セマンティクス: PropertyNameList : String の List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

PropertyDefinitionList : PropertyDefinition
  1. propNamePropertyDefinition の PropName とする。
  2. propNameempty なら新しい空 List を返す。
  3. « propName » を返す。
PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition
  1. listPropertyDefinitionList の PropertyNameList。
  2. propNamePropertyDefinition の PropName。
  3. propNameempty なら list を返す。
  4. list と « propName » のリスト結合を返す。

13.2.5.4 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

ObjectLiteral : { }
  1. OrdinaryObjectCreate(%Object.prototype%) を返す。
ObjectLiteral : { PropertyDefinitionList } { PropertyDefinitionList , }
  1. objOrdinaryObjectCreate(%Object.prototype%)。
  2. 引数 objPropertyDefinitionList の PropertyDefinitionEvaluation を実行。
  3. obj を返す。
LiteralPropertyName : IdentifierName
  1. IdentifierName の StringValue を返す。
LiteralPropertyName : StringLiteral
  1. StringLiteral の SV を返す。
LiteralPropertyName : NumericLiteral
  1. nbrNumericLiteral の NumericValue。
  2. ToString(nbr) を返す。
ComputedPropertyName : [ AssignmentExpression ]
  1. exprValueAssignmentExpression の Evaluation。
  2. propName を ? GetValue(exprValue)。
  3. ToPropertyKey(propName) を返す。

13.2.5.5 実行時セマンティクス: PropertyDefinitionEvaluation : 正常完了で unused を含むか、または突然の完了

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition
  1. 引数 objectPropertyDefinitionList の PropertyDefinitionEvaluation を実行。
  2. 引数 objectPropertyDefinition の PropertyDefinitionEvaluation を実行。
  3. unused を返す。
PropertyDefinition : ... AssignmentExpression
  1. exprValueAssignmentExpression の Evaluation。
  2. fromValue を ? GetValue(exprValue)。
  3. excludedNames を新しい空 List
  4. CopyDataProperties(object, fromValue, excludedNames) を実行。
  5. unused を返す。
PropertyDefinition : IdentifierReference
  1. propNameIdentifierReference の StringValue。
  2. exprValueIdentifierReference の Evaluation。
  3. propValue を ? GetValue(exprValue)。
  4. 事前条件: object は通常 (ordinary) で拡張可能で非 configurable プロパティを持たない。
  5. CreateDataPropertyOrThrow(object, propName, propValue) を実行。
  6. unused を返す。
PropertyDefinition : PropertyName : AssignmentExpression
  1. propKeyPropertyName の Evaluation。
  2. この PropertyDefinitionParseJSON のため評価中の Script 内に含まれるなら(ParseJSON の step 6 参照)
    1. isProtoSetterfalse
  3. それ以外で propKey"__proto__" かつ PropertyName の IsComputedPropertyKey が false なら
    1. isProtoSettertrue
  4. それ以外
    1. isProtoSetterfalse
  5. IsAnonymousFunctionDefinition(AssignmentExpression) が true かつ isProtoSetterfalse なら
    1. propValue を 引数 propKeyAssignmentExpression の NamedEvaluation。
  6. それ以外
    1. exprValueRefAssignmentExpression の Evaluation。
    2. propValue を ? GetValue(exprValueRef)。
  7. isProtoSettertrue なら
    1. propValue が Object か null なら
      1. object.[[SetPrototypeOf]](propValue) を実行。
    2. unused を返す。
  8. 事前条件: object は通常で拡張可能、非 configurable プロパティなし。
  9. CreateDataPropertyOrThrow(object, propKey, propValue) を実行。
  10. unused を返す。
PropertyDefinition : MethodDefinition
  1. 引数 object, trueMethodDefinition の MethodDefinitionEvaluation を実行。
  2. unused を返す。

13.2.6 関数定義式 (Function Defining Expressions)

15.2 PrimaryExpression : FunctionExpression を参照。

15.5 PrimaryExpression : GeneratorExpression を参照。

15.7 PrimaryExpression : ClassExpression を参照。

15.8 PrimaryExpression : AsyncFunctionExpression を参照。

15.6 PrimaryExpression : AsyncGeneratorExpression を参照。

13.2.7 正規表現リテラル (Regular Expression Literals)

構文 (Syntax)

12.9.5 を参照。

13.2.7.1 静的セマンティクス: 早期エラー (Early Errors)

PrimaryExpression : RegularExpressionLiteral

13.2.7.2 静的セマンティクス: IsValidRegularExpressionLiteral ( literal: RegularExpressionLiteral Parse Node, ): Boolean

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. flagsliteral の FlagText とする。
  2. flagsd, g, i, m, s, u, v, y 以外のコードポイントが含まれるか、同一コードポイントが複数回含まれるなら false を返す。
  3. flagsu を含むなら u = true、そうでなければ false
  4. flagsv を含むなら v = true、そうでなければ false
  5. patternTextliteral の BodyText とする。
  6. ufalse かつ vfalse なら
    1. stringValue を CodePointsToString(patternText)。
    2. patternTextstringValue の 16-bit 要素を Unicode BMP コードポイントとして逐次解釈した結果のコードポイント列に設定(UTF-16 デコードは行わない)。
  7. parseResult を ParsePattern(patternText, u, v)。
  8. parseResult が Parse Node なら true、そうでなければ false を返す。

13.2.7.3 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

PrimaryExpression : RegularExpressionLiteral
  1. pattern を CodePointsToString(BodyText of RegularExpressionLiteral)。
  2. flags を CodePointsToString(FlagText of RegularExpressionLiteral)。
  3. RegExpCreate(pattern, flags) を返す。

13.2.8 テンプレートリテラル (Template Literals)

構文 (Syntax)

TemplateLiteral[Yield, Await, Tagged] : NoSubstitutionTemplate SubstitutionTemplate[?Yield, ?Await, ?Tagged] SubstitutionTemplate[Yield, Await, Tagged] : TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged] TemplateSpans[Yield, Await, Tagged] : TemplateTail TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateTail TemplateMiddleList[Yield, Await, Tagged] : TemplateMiddle Expression[+In, ?Yield, ?Await] TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await]

13.2.8.1 静的セマンティクス: 早期エラー (Early Errors)

TemplateLiteral[Yield, Await, Tagged] : NoSubstitutionTemplate TemplateLiteral[Yield, Await, Tagged] : SubstitutionTemplate[?Yield, ?Await, ?Tagged]
  • 引数 false での TemplateLiteral の TemplateStrings の要素数が 232 以上なら構文エラー。
SubstitutionTemplate[Yield, Await, Tagged] : TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged] TemplateSpans[Yield, Await, Tagged] : TemplateTail TemplateMiddleList[Yield, Await, Tagged] : TemplateMiddle Expression[+In, ?Yield, ?Await] TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await]

13.2.8.2 静的セマンティクス: TemplateStrings : String または undefined を含む List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

TemplateLiteral : NoSubstitutionTemplate
  1. « TemplateString(NoSubstitutionTemplate, raw) » を返す。
SubstitutionTemplate : TemplateHead Expression TemplateSpans
  1. head を « TemplateString(TemplateHead, raw) »。
  2. tail を 引数 rawTemplateSpans の TemplateStrings。
  3. headtailリスト結合を返す。
TemplateSpans : TemplateTail
  1. « TemplateString(TemplateTail, raw) » を返す。
TemplateSpans : TemplateMiddleList TemplateTail
  1. middle を 引数 rawTemplateMiddleList の TemplateStrings。
  2. tail を « TemplateString(TemplateTail, raw) »。
  3. middletailリスト結合を返す。
TemplateMiddleList : TemplateMiddle Expression
  1. « TemplateString(TemplateMiddle, raw) » を返す。
TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression
  1. front を 引数 rawTemplateMiddleList の TemplateStrings。
  2. last を « TemplateString(TemplateMiddle, raw) »。
  3. frontlastリスト結合を返す。

13.2.8.3 静的セマンティクス: TemplateString ( templateToken: NoSubstitutionTemplate / TemplateHead / TemplateMiddle / TemplateTail Parse Node, raw: Boolean, ): String または undefined

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. rawtrue なら
    1. stringtemplateToken の TRV。
  2. それ以外
    1. stringtemplateToken の TV。
  3. string を返す。
Note

rawfalse かつ templateTokenNotEscapeSequence を含む場合、この操作は undefined を返す。それ以外は String を返す。

13.2.8.4 GetTemplateObject ( templateLiteral )

The abstract operation GetTemplateObject takes argument templateLiteral (Parse Node) and returns Array. It performs the following steps when called:

  1. realm を現在の Realm Record
  2. templateRegistryrealm.[[TemplateMap]]
  3. templateRegistry の各要素 e について
    1. e.[[Site]]templateLiteral と同じ Parse Node なら
      1. e.[[Array]] を返す。
  4. rawStrings を 引数 truetemplateLiteral の TemplateStrings。
  5. 事前条件: rawStrings は String の List
  6. cookedStrings を 引数 falsetemplateLiteral の TemplateStrings。
  7. countcookedStrings の要素数。
  8. 事前条件: count ≤ 232-1。
  9. template を ! ArrayCreate(count)。
  10. rawObj を ! ArrayCreate(count)。
  11. index を 0。
  12. index < count の間繰り返す:
    1. prop を ! ToString(𝔽(index))。
    2. cookedValuecookedStrings[index]。
    3. DefinePropertyOrThrow(template, prop, PropertyDescriptor { [[Value]]: cookedValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false })。
    4. rawValue を String 値 rawStrings[index]。
    5. DefinePropertyOrThrow(rawObj, prop, PropertyDescriptor { [[Value]]: rawValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false })。
    6. indexindex + 1。
  13. SetIntegrityLevel(rawObj, frozen)。
  14. DefinePropertyOrThrow(template, "raw", PropertyDescriptor { [[Value]]: rawObj, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false })。
  15. SetIntegrityLevel(template, frozen)。
  16. Record { [[Site]]: templateLiteral, [[Array]]: template } を realm.[[TemplateMap]] に追加。
  17. template を返す。
Note 1

テンプレートオブジェクトの生成は突然の完了を引き起こさない。

Note 2

ある realm のプログラムコード内の各 TemplateLiteral はタグ付きテンプレート評価 (13.2.8.6) に用いられる一意のテンプレートオブジェクトと関連付けられる。テンプレートオブジェクトは凍結され、同一タグ付きテンプレート評価では同じオブジェクトが再利用される。テンプレートオブジェクトが最初の評価時に遅延生成されるか、事前に eager に生成されるかは ECMAScript コードからは観測不能で実装依存。

Note 3

将来の版ではテンプレートオブジェクトに追加の列挙不可プロパティを定義する可能性がある。

13.2.8.5 実行時セマンティクス: SubstitutionEvaluation

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

TemplateSpans : TemplateTail
  1. 新しい空 List を返す。
TemplateSpans : TemplateMiddleList TemplateTail
  1. TemplateMiddleList の SubstitutionEvaluation を返す。
TemplateMiddleList : TemplateMiddle Expression
  1. subRefExpression の Evaluation。
  2. sub を ? GetValue(subRef)。
  3. « sub » を返す。
TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression
  1. precedingTemplateMiddleList の SubstitutionEvaluation。
  2. nextRefExpression の Evaluation。
  3. next を ? GetValue(nextRef)。
  4. preceding と « next » のリスト結合を返す。

13.2.8.6 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

TemplateLiteral : NoSubstitutionTemplate
  1. 12.9.6 で定義される NoSubstitutionTemplate の TV を返す。
SubstitutionTemplate : TemplateHead Expression TemplateSpans
  1. head12.9.6 で定義される TemplateHead の TV。
  2. subRefExpression の Evaluation。
  3. sub を ? GetValue(subRef)。
  4. middle を ? ToString(sub)。
  5. tailTemplateSpans の Evaluation。
  6. head, middle, tail文字列連結を返す。
Note 1

Expression 値への文字列変換は + 演算子ではなく String.prototype.concat と同様のセマンティクス。

TemplateSpans : TemplateTail
  1. 12.9.6 で定義される TemplateTail の TV を返す。
TemplateSpans : TemplateMiddleList TemplateTail
  1. headTemplateMiddleList の Evaluation。
  2. tail12.9.6 で定義される TemplateTail の TV。
  3. headtail文字列連結を返す。
TemplateMiddleList : TemplateMiddle Expression
  1. head12.9.6 で定義される TemplateMiddle の TV。
  2. subRefExpression の Evaluation。
  3. sub を ? GetValue(subRef)。
    1. middle を ? ToString(sub)。
  4. headmiddle文字列連結を返す。
Note 2

Expression 値への文字列変換は + 演算子ではなく String.prototype.concat と同様。

TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression
  1. restTemplateMiddleList の Evaluation。
  2. middle12.9.6 で定義される TemplateMiddle の TV。
  3. subRefExpression の Evaluation。
  4. sub を ? GetValue(subRef)。
  5. last を ? ToString(sub)。
  6. rest, middle, last文字列連結を返す。
Note 3

Expression 値への文字列変換は String.prototype.concat と同様で + 演算子とは異なる。

13.2.9 グルーピング演算子 (The Grouping Operator)

13.2.9.1 静的セマンティクス: 早期エラー (Early Errors)

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList

13.2.9.2 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprCoverParenthesizedExpressionAndArrowParameterList により覆われる ParenthesizedExpression とする。
  2. expr の Evaluation を返す (必要なら ? を付す)。
ParenthesizedExpression : ( Expression )
  1. Expression の Evaluation を返す(Reference 型であり得る)。
Note

このアルゴリズムは Expression の Evaluation に GetValue を適用しない。主な動機は deletetypeof などの演算子をかっこ付き式に適用可能とするためである。

13.3 左辺式 (Left-Hand-Side Expressions)

構文 (Syntax)

MemberExpression[Yield, Await] : PrimaryExpression[?Yield, ?Await] MemberExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] MemberExpression[?Yield, ?Await] . IdentifierName MemberExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] SuperProperty[?Yield, ?Await] MetaProperty new MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await] MemberExpression[?Yield, ?Await] . PrivateIdentifier SuperProperty[Yield, Await] : super [ Expression[+In, ?Yield, ?Await] ] super . IdentifierName MetaProperty : NewTarget ImportMeta NewTarget : new . target ImportMeta : import . meta NewExpression[Yield, Await] : MemberExpression[?Yield, ?Await] new NewExpression[?Yield, ?Await] CallExpression[Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] SuperCall[?Yield, ?Await] ImportCall[?Yield, ?Await] CallExpression[?Yield, ?Await] Arguments[?Yield, ?Await] CallExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] CallExpression[?Yield, ?Await] . IdentifierName CallExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] CallExpression[?Yield, ?Await] . PrivateIdentifier SuperCall[Yield, Await] : super Arguments[?Yield, ?Await] ImportCall[Yield, Await] : import ( AssignmentExpression[+In, ?Yield, ?Await] ,opt ) import ( AssignmentExpression[+In, ?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ,opt ) Arguments[Yield, Await] : ( ) ( ArgumentList[?Yield, ?Await] ) ( ArgumentList[?Yield, ?Await] , ) ArgumentList[Yield, Await] : AssignmentExpression[+In, ?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , ... AssignmentExpression[+In, ?Yield, ?Await] OptionalExpression[Yield, Await] : MemberExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalChain[Yield, Await] : ?. Arguments[?Yield, ?Await] ?. [ Expression[+In, ?Yield, ?Await] ] ?. IdentifierName ?. TemplateLiteral[?Yield, ?Await, +Tagged] ?. PrivateIdentifier OptionalChain[?Yield, ?Await] Arguments[?Yield, ?Await] OptionalChain[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] OptionalChain[?Yield, ?Await] . IdentifierName OptionalChain[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] OptionalChain[?Yield, ?Await] . PrivateIdentifier LeftHandSideExpression[Yield, Await] : NewExpression[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalExpression[?Yield, ?Await]

補助構文 (Supplemental Syntax)

次の生成規則インスタンスを処理する際
CallExpression : CoverCallExpressionAndAsyncArrowHead
CoverCallExpressionAndAsyncArrowHead の解釈は以下の文法で精緻化される:

CallMemberExpression[Yield, Await] : MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]

13.3.1 静的セマンティクス (Static Semantics)

13.3.1.1 静的セマンティクス: 早期エラー (Early Errors)

OptionalChain : ?. TemplateLiteral OptionalChain TemplateLiteral
  • この生成規則にソーステキストがマッチした場合は構文エラー。
Note

この生成規則は次のコードに自動セミコロン挿入規則(12.10)が適用されて 2 つの有効な文として解釈されることを防ぐために存在する:

a?.b
`c`

これはオプショナルチェイニングを用いない類似コードとの一貫性を保つ目的である:

a.b
`c`

後者は自動セミコロン挿入が適用されず有効な文である。

ImportMeta : import . meta

13.3.2 プロパティアクセッサ (Property Accessors)

Note

プロパティは名前でアクセスされ、ドット記法:

またはブラケット記法を用いる:

ドット記法は次の構文変換で説明される:

これは動作上次と同一である:

MemberExpression [ <identifier-name-string> ]

同様に

は次と同一である:

CallExpression [ <identifier-name-string> ]

ここで <identifier-name-string> は IdentifierName の StringValue である。

13.3.2.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

MemberExpression : MemberExpression [ Expression ]
  1. baseReference を ? MemberExpression の Evaluation。
  2. baseValue を ? GetValue(baseReference)。
  3. strict を IsStrict(this MemberExpression) とする。
  4. EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict) を返す。
MemberExpression : MemberExpression . IdentifierName
  1. baseReference を ? MemberExpression の Evaluation。
  2. baseValue を ? GetValue(baseReference)。
  3. strict を IsStrict(this MemberExpression)。
  4. EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName, strict) を返す。
MemberExpression : MemberExpression . PrivateIdentifier
  1. baseReference を ? MemberExpression の Evaluation。
  2. baseValue を ? GetValue(baseReference)。
  3. fieldNameStringPrivateIdentifier の StringValue とする。
  4. MakePrivateReference(baseValue, fieldNameString) を返す。
CallExpression : CallExpression [ Expression ]
  1. baseReference を ? CallExpression の Evaluation。
  2. baseValue を ? GetValue(baseReference)。
  3. strict を IsStrict(this CallExpression)。
  4. EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict) を返す。
CallExpression : CallExpression . IdentifierName
  1. baseReference を ? CallExpression の Evaluation。
  2. baseValue を ? GetValue(baseReference)。
  3. strict を IsStrict(this CallExpression)。
  4. EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName, strict) を返す。
CallExpression : CallExpression . PrivateIdentifier
  1. baseReference を ? CallExpression の Evaluation。
  2. baseValue を ? GetValue(baseReference)。
  3. fieldNameStringPrivateIdentifier の StringValue。
  4. MakePrivateReference(baseValue, fieldNameString) を返す。

13.3.3 EvaluatePropertyAccessWithExpressionKey ( baseValue, expression, strict )

The abstract operation EvaluatePropertyAccessWithExpressionKey takes arguments baseValue (ECMAScript 言語値), expression (Expression Parse Node), and strict (Boolean) and returns 正常完了で Reference Record を含むか、または突然の完了. It performs the following steps when called:

  1. propertyNameReference を ? expression の Evaluation。
  2. propertyNameValue を ? GetValue(propertyNameReference)。
  3. 注: 多くの場合この直後に ToPropertyKeypropertyNameValue に対して行われるが、a[b] = c の場合は c の評価後まで行われない。
  4. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyNameValue, [[Strict]]: strict, [[ThisValue]]: empty } を返す。

13.3.4 EvaluatePropertyAccessWithIdentifierKey ( baseValue, identifierName, strict )

The abstract operation EvaluatePropertyAccessWithIdentifierKey takes arguments baseValue (ECMAScript 言語値), identifierName (IdentifierName Parse Node), and strict (Boolean) and returns Reference Record. It performs the following steps when called:

  1. propertyNameStringidentifierName の StringValue。
  2. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyNameString, [[Strict]]: strict, [[ThisValue]]: empty } を返す。

13.3.5 new 演算子 (The new Operator)

13.3.5.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

NewExpression : new NewExpression
  1. EvaluateNew(NewExpression, empty) を返す。
MemberExpression : new MemberExpression Arguments
  1. EvaluateNew(MemberExpression, Arguments) を返す。

13.3.5.1.1 EvaluateNew ( constructExpr, arguments )

The abstract operation EvaluateNew takes arguments constructExpr (NewExpression Parse Node または MemberExpression Parse Node) and arguments (empty 又は Arguments Parse Node) and returns 正常完了で ECMAScript 言語値を含むか、または突然の完了. It performs the following steps when called:

  1. ref を ? constructExpr の Evaluation。
  2. constructor を ? GetValue(ref)。
  3. argumentsempty なら
    1. argList を新しい空 List
  4. それ以外
    1. argList を ? ArgumentListEvaluation(arguments)。
  5. IsConstructor(constructor) が false なら TypeError 例外を投げる。
  6. ? Construct(constructor, argList) を返す。

13.3.6 関数呼び出し (Function Calls)

13.3.6.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

CallExpression : CoverCallExpressionAndAsyncArrowHead
  1. exprCoverCallExpressionAndAsyncArrowHead により覆われる CallMemberExpression とする。
  2. memberExprexprMemberExpression
  3. argumentsexprArguments
  4. ref を ? memberExpr の Evaluation。
  5. func を ? GetValue(ref)。
  6. もし refReference RecordIsPropertyReference(ref) が false かつ ref.[[ReferencedName]]"eval" なら
    1. SameValue(func, %eval%) が true なら
      1. argList を ? ArgumentListEvaluation(arguments)。
      2. argList が要素を持たないなら undefined を返す。
      3. evalArgargList の最初の要素。
      4. IsStrict(this CallExpression) が true なら strictCaller = true、そうでなければ false
      5. PerformEval(evalArg, strictCaller, true) を返す。
  7. thisCall を this CallExpression
  8. tailCall を IsInTailPosition(thisCall)。
  9. EvaluateCall(func, ref, arguments, tailCall) を返す。

ステップ 6.a.v を実行する CallExpression の評価は direct eval である。

CallExpression : CallExpression Arguments
  1. ref を ? CallExpression の Evaluation。
  2. func を ? GetValue(ref)。
  3. thisCall を this CallExpression
  4. tailCall を IsInTailPosition(thisCall)。
  5. EvaluateCall(func, ref, Arguments, tailCall) を返す。

13.3.6.2 EvaluateCall ( func, ref, arguments, tailPosition )

The abstract operation EvaluateCall takes arguments func (ECMAScript 言語値), ref (ECMAScript 言語値または Reference Record), arguments (Parse Node), and tailPosition (Boolean) and returns 正常完了で ECMAScript 言語値を含むか、または突然の完了. It performs the following steps when called:

  1. もし refReference Record なら
    1. IsPropertyReference(ref) が true なら
      1. thisValueGetThisValue(ref)。
    2. それ以外
      1. refEnvref.[[Base]]
      2. 事前条件: refEnvEnvironment Record
      3. thisValuerefEnv.WithBaseObject()。
  2. それ以外
    1. thisValueundefined
  3. argList を ? ArgumentListEvaluation(arguments)。
  4. func が Object でなければ TypeError 例外。
  5. IsCallable(func) が false なら TypeError 例外。
  6. tailPositiontrue なら PrepareForTailCall() を実行。
  7. ? Call(func, thisValue, argList) を返す。

13.3.7 super キーワード (The super Keyword)

13.3.7.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

SuperProperty : super [ Expression ]
  1. envGetThisEnvironment()。
  2. actualThis を ? env.GetThisBinding()。
  3. propertyNameReference を ? Expression の Evaluation。
  4. propertyNameValue を ? GetValue(propertyNameReference)。
  5. strict を IsStrict(this SuperProperty)。
  6. 注: 多くの場合ここですぐ ToPropertyKey が行われるが、super[b] = c のケースでは c 評価後。
  7. MakeSuperPropertyReference(actualThis, propertyNameValue, strict) を返す。
SuperProperty : super . IdentifierName
  1. envGetThisEnvironment()。
  2. actualThis を ? env.GetThisBinding()。
  3. propertyKeyIdentifierName の StringValue。
  4. strict を IsStrict(this SuperProperty)。
  5. MakeSuperPropertyReference(actualThis, propertyKey, strict) を返す。
SuperCall : super Arguments
  1. newTargetGetNewTarget()。
  2. 事前条件: newTarget は constructor。
  3. funcGetSuperConstructor()。
  4. argList を ? ArgumentListEvaluation(Arguments)。
  5. IsConstructor(func) が false なら TypeError 例外。
  6. result を ? Construct(func, argList, newTarget)。
  7. thisERGetThisEnvironment()。
  8. 事前条件: thisERFunction Environment Record
  9. BindThisValue(thisER, result)。
  10. FthisER.[[FunctionObject]]
  11. 事前条件: F は ECMAScript function object。
  12. InitializeInstanceElements(result, F)。
  13. result を返す。

13.3.7.2 GetSuperConstructor ( )

The abstract operation GetSuperConstructor takes no arguments and returns ECMAScript 言語値. It performs the following steps when called:

  1. envRecGetThisEnvironment()。
  2. 事前条件: envRecFunction Environment Record
  3. activeFunctionenvRec.[[FunctionObject]]
  4. 事前条件: activeFunction は ECMAScript function object。
  5. superConstructor を ! activeFunction.[[GetPrototypeOf]]()。
  6. superConstructor を返す。

13.3.7.3 MakeSuperPropertyReference ( actualThis, propertyKey, strict )

The abstract operation MakeSuperPropertyReference takes arguments actualThis (ECMAScript 言語値), propertyKey (ECMAScript 言語値), and strict (Boolean) and returns Super Reference Record. It performs the following steps when called:

  1. envGetThisEnvironment()。
  2. 事前条件: env.HasSuperBinding() は true
  3. 事前条件: envFunction Environment Record
  4. baseValueGetSuperBase(env)。
  5. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyKey, [[Strict]]: strict, [[ThisValue]]: actualThis } を返す。

13.3.8 引数リスト (Argument Lists)

Note

引数リストの評価は値の List を生成する。

13.3.8.1 実行時セマンティクス: ArgumentListEvaluation — 正常完了で ECMAScript 言語値の List または突然の完了

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Arguments : ( )
  1. 新しい空 List を返す。
ArgumentList : AssignmentExpression
  1. ref を ? AssignmentExpression の Evaluation。
  2. arg を ? GetValue(ref)。
  3. « arg » を返す。
ArgumentList : ... AssignmentExpression
  1. list を新しい空 List
  2. spreadRef を ? AssignmentExpression の Evaluation。
  3. spreadObj を ? GetValue(spreadRef)。
  4. iteratorRecord を ? GetIterator(spreadObj, sync)。
  5. 反復:
    1. next を ? IteratorStepValue(iteratorRecord)。
    2. nextdone なら list を返す。
    3. nextlist に追加。
ArgumentList : ArgumentList , AssignmentExpression
  1. precedingArgs を ? ArgumentListEvaluation(ArgumentList)。
  2. ref を ? AssignmentExpression の Evaluation。
  3. arg を ? GetValue(ref)。
  4. precedingArgs と « arg » のリスト結合を返す。
ArgumentList : ArgumentList , ... AssignmentExpression
  1. precedingArgs を ? ArgumentListEvaluation(ArgumentList)。
  2. spreadRef を ? AssignmentExpression の Evaluation。
  3. iteratorRecord を ? GetIterator(? GetValue(spreadRef), sync)。
  4. 反復:
    1. next を ? IteratorStepValue(iteratorRecord)。
    2. nextdone なら precedingArgs を返す。
    3. nextprecedingArgs に追加。
TemplateLiteral : NoSubstitutionTemplate
  1. templateLiteral を this TemplateLiteral
  2. siteObjGetTemplateObject(templateLiteral)。
  3. « siteObj » を返す。
TemplateLiteral : SubstitutionTemplate
  1. templateLiteral を this TemplateLiteral
  2. siteObjGetTemplateObject(templateLiteral)。
  3. remaining を ? ArgumentListEvaluation(SubstitutionTemplate)。
  4. « siteObj » と remainingリスト結合を返す。
SubstitutionTemplate : TemplateHead Expression TemplateSpans
  1. firstSubRef を ? Expression の Evaluation。
  2. firstSub を ? GetValue(firstSubRef)。
  3. restSub を ? SubstitutionEvaluation(TemplateSpans)。
  4. 事前条件: restSub は(空かもしれない)List
  5. « firstSub » と restSubリスト結合を返す。

13.3.9 オプショナルチェイン (Optional Chains)

Note
オプショナルチェインは 1 つ以上のプロパティアクセスおよび関数呼び出しの連鎖で、最初のものが ?. トークンで始まる。

13.3.9.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

OptionalExpression : MemberExpression OptionalChain
  1. baseReference を ? MemberExpression の Evaluation。
  2. baseValue を ? GetValue(baseReference)。
  3. baseValueundefined または null なら
    1. undefined を返す。
  4. ? ChainEvaluation(OptionalChain, 引数 baseValue, baseReference) を返す。
OptionalExpression : CallExpression OptionalChain
  1. baseReference を ? CallExpression の Evaluation。
  2. baseValue を ? GetValue(baseReference)。
  3. baseValueundefined または null なら
    1. undefined を返す。
  4. ? ChainEvaluation(OptionalChain, 引数 baseValue, baseReference) を返す。
OptionalExpression : OptionalExpression OptionalChain
  1. baseReference を ? OptionalExpression の Evaluation。
  2. baseValue を ? GetValue(baseReference)。
  3. baseValueundefined または null なら
    1. undefined を返す。
  4. ? ChainEvaluation(OptionalChain, 引数 baseValue, baseReference) を返す。

13.3.9.2 実行時セマンティクス: ChainEvaluation : 正常完了で ECMAScript 言語値または Reference Record を含むか、または突然の完了

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

OptionalChain : ?. Arguments
  1. thisChain を this OptionalChain
  2. tailCall を IsInTailPosition(thisChain)。
  3. EvaluateCall(baseValue, baseReference, Arguments, tailCall) を返す。
OptionalChain : ?. [ Expression ]
  1. strict を IsStrict(this OptionalChain)。
  2. EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict) を返す。
OptionalChain : ?. IdentifierName
  1. strict を IsStrict(this OptionalChain)。
  2. EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName, strict) を返す。
OptionalChain : ?. PrivateIdentifier
  1. fieldNameStringPrivateIdentifier の StringValue。
  2. MakePrivateReference(baseValue, fieldNameString) を返す。
OptionalChain : OptionalChain Arguments
  1. optionalChainOptionalChain
  2. newReference を ? ChainEvaluation(optionalChain, 引数 baseValue, baseReference)。
  3. newValue を ? GetValue(newReference)。
  4. thisChain を this OptionalChain
  5. tailCall を IsInTailPosition(thisChain)。
  6. EvaluateCall(newValue, newReference, Arguments, tailCall) を返す。
OptionalChain : OptionalChain [ Expression ]
  1. optionalChainOptionalChain
  2. newReference を ? ChainEvaluation(optionalChain, 引数 baseValue, baseReference)。
  3. newValue を ? GetValue(newReference)。
  4. strict を IsStrict(this OptionalChain)。
  5. EvaluatePropertyAccessWithExpressionKey(newValue, Expression, strict) を返す。
OptionalChain : OptionalChain . IdentifierName
  1. optionalChainOptionalChain
  2. newReference を ? ChainEvaluation(optionalChain, 引数 baseValue, baseReference)。
  3. newValue を ? GetValue(newReference)。
  4. strict を IsStrict(this OptionalChain)。
  5. EvaluatePropertyAccessWithIdentifierKey(newValue, IdentifierName, strict) を返す。
OptionalChain : OptionalChain . PrivateIdentifier
  1. optionalChainOptionalChain
  2. newReference を ? ChainEvaluation(optionalChain, 引数 baseValue, baseReference)。
  3. newValue を ? GetValue(newReference)。
  4. fieldNameStringPrivateIdentifier の StringValue。
  5. MakePrivateReference(newValue, fieldNameString) を返す。

13.3.10 Import 呼び出し (Import Calls)

13.3.10.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

ImportCall : import ( AssignmentExpression ,opt )
  1. EvaluateImportCall(AssignmentExpression) を返す。
ImportCall : import ( AssignmentExpression , AssignmentExpression ,opt )
  1. EvaluateImportCall(the first AssignmentExpression, the second AssignmentExpression) を返す。

13.3.10.2 EvaluateImportCall ( specifierExpression [ , optionsExpression ] )

The abstract operation EvaluateImportCall takes argument specifierExpression (Parse Node) and optional argument optionsExpression (Parse Node) and returns 正常完了で Promise を含むか、または突然の完了. It performs the following steps when called:

  1. referrerGetActiveScriptOrModule() とする。
  2. もし referrernull であれば、referrer を現在の Realm Record に設定する。
  3. specifierRef を ? specifierExpression の評価結果とする。
  4. specifier を ? GetValue(specifierRef) とする。
  5. もし optionsExpression が存在するなら、
    1. optionsRef を ? optionsExpression の評価結果とする。
    2. options を ? GetValue(optionsRef) とする。
  6. そうでなければ、
    1. optionsundefined とする。
  7. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  8. specifierStringCompletion(ToString(specifier)) とする。
  9. IfAbruptRejectPromise(specifierString, promiseCapability)。
  10. attributes を新しい空の List とする。
  11. もし optionsundefined でないなら、
    1. もし options が Object でないなら、
      1. ! Call(promiseCapability.[[Reject]], undefined, « 新たに生成された TypeError オブジェクト ») を実行する。
      2. promiseCapability.[[Promise]] を返す。
    2. attributesObjCompletion(Get(options, "with" )) とする。
    3. IfAbruptRejectPromise(attributesObj, promiseCapability)。
    4. もし attributesObjundefined でないなら、
      1. もし attributesObj が Object でないなら、
        1. ! Call(promiseCapability.[[Reject]], undefined, « 新たに生成された TypeError オブジェクト ») を実行する。
        2. promiseCapability.[[Promise]] を返す。
      2. entriesCompletion(EnumerableOwnProperties(attributesObj, key+value)) とする。
      3. IfAbruptRejectPromise(entries, promiseCapability)。
      4. entries の各要素 entry について、次を行う
        1. key を ! Get(entry, "0") とする。
        2. value を ! Get(entry, "1") とする。
        3. もし key が String なら、
          1. もし value が String でないなら、
            1. ! Call(promiseCapability.[[Reject]], undefined, « 新たに生成された TypeError オブジェクト ») を実行する。
            2. promiseCapability.[[Promise]] を返す。
          2. ImportAttribute Record { [[Key]]: key, [[Value]]: value } を attributes に追加する。
    5. もし AllImportAttributesSupported(attributes) が false なら、
      1. ! Call(promiseCapability.[[Reject]], undefined, « 新たに生成された TypeError オブジェクト ») を実行する。
      2. promiseCapability.[[Promise]] を返す。
    6. attributes をその各要素の [[Key]] フィールドの文字順 (各値を UTF-16 のコード単位列として扱う) に従ってソートする。注: このソートは、ホストが属性の列挙順序に基づいて挙動を変更することを禁じられているという点でのみ観測可能である。
  12. moduleRequest を新しい ModuleRequest Record { [[Specifier]]: specifierString, [[Attributes]]: attributes } とする。
  13. HostLoadImportedModule(referrer, moduleRequest, empty, promiseCapability) を実行する。
  14. promiseCapability.[[Promise]] を返す。

13.3.10.3 ContinueDynamicImport ( promiseCapability, moduleCompletion )

The abstract operation ContinueDynamicImport takes arguments promiseCapability (PromiseCapability Record) and moduleCompletion (Module Record を含む正常完了または throw 完了) and returns unused. It performs the following steps when called:

  1. moduleCompletionabrupt completion なら
    1. ! Call(promiseCapability.[[Reject]], undefined, « moduleCompletion.[[Value]] »)。
    2. unused を返す。
  2. modulemoduleCompletion.[[Value]]
  3. loadPromisemodule.LoadRequestedModules()。
  4. rejectedClosure を (reason) をパラメータとし promiseCapability を捕捉する Abstract Closure とし、呼ばれたら:
    1. ! Call(promiseCapability.[[Reject]], undefined, « reason »)。
    2. Return NormalCompletion(undefined)。
  5. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « »)。
  6. linkAndEvaluateClosure をパラメータなしで module, promiseCapability, onRejected を捕捉する Abstract Closure とし、呼ばれたら:
    1. linkCompletion(module.Link())。
    2. link が abrupt なら
      1. ! Call(promiseCapability.[[Reject]], undefined, « link.[[Value]] »)。
      2. Return NormalCompletion(undefined)。
    3. evaluatePromisemodule.Evaluate()。
    4. fulfilledClosure をパラメータなしで module, promiseCapability を捕捉する Abstract Closure とし、呼ばれたら:
      1. namespaceGetModuleNamespace(module)。
      2. Call(promiseCapability.[[Resolve]], undefined, « namespace »)。
      3. Return NormalCompletion(undefined)。
    5. onFulfilledCreateBuiltinFunction(fulfilledClosure, 0, "", « »)。
    6. PerformPromiseThen(evaluatePromise, onFulfilled, onRejected) を実行。
    7. unused を返す。
  7. linkAndEvaluateCreateBuiltinFunction(linkAndEvaluateClosure, 0, "", « »)。
  8. PerformPromiseThen(loadPromise, linkAndEvaluate, onRejected) を実行。
  9. unused を返す。

13.3.11 タグ付きテンプレート (Tagged Templates)

Note

タグ付きテンプレートは TemplateLiteral (13.2.8) から導出される引数を持つ関数呼び出しである。実際の引数はテンプレートオブジェクト (13.2.8.4) と TemplateLiteral 内に埋め込まれた式の評価結果を含む。

13.3.11.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

MemberExpression : MemberExpression TemplateLiteral
  1. tagRef を ? MemberExpression の Evaluation。
  2. tagFunc を ? GetValue(tagRef)。
  3. thisCall を this MemberExpression
  4. tailCall を IsInTailPosition(thisCall)。
  5. EvaluateCall(tagFunc, tagRef, TemplateLiteral, tailCall) を返す。
CallExpression : CallExpression TemplateLiteral
  1. tagRef を ? CallExpression の Evaluation。
  2. tagFunc を ? GetValue(tagRef)。
  3. thisCall を this CallExpression
  4. tailCall を IsInTailPosition(thisCall)。
  5. EvaluateCall(tagFunc, tagRef, TemplateLiteral, tailCall) を返す。

13.3.12 メタプロパティ (Meta Properties)

13.3.12.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

NewTarget : new . target
  1. GetNewTarget() を返す。
ImportMeta : import . meta
  1. moduleGetActiveScriptOrModule()。
  2. 事前条件: moduleSource Text Module Record
  3. importMetamodule.[[ImportMeta]]
  4. importMetaempty なら
    1. importMetaOrdinaryObjectCreate(null)。
    2. importMetaValuesHostGetImportMetaProperties(module)。
    3. Record { [[Key]], [[Value]] } p について
      1. CreateDataPropertyOrThrow(importMeta, p.[[Key]], p.[[Value]])。
    4. HostFinalizeImportMeta(importMeta, module) を実行。
    5. module.[[ImportMeta]]importMeta を設定。
    6. importMeta を返す。
  5. それ以外
    1. 事前条件: importMeta は Object。
    2. importMeta を返す。

13.3.12.1.1 HostGetImportMetaProperties ( moduleRecord )

The host-defined abstract operation HostGetImportMetaProperties takes argument moduleRecord (Module Record) and returns 各 [[Key]] (property key), [[Value]] (ECMAScript 言語値) を持つ RecordList.

デフォルト実装は新しい空 List を返す。

13.3.12.1.2 HostFinalizeImportMeta ( importMeta, moduleRecord )

The host-defined abstract operation HostFinalizeImportMeta takes arguments importMeta (Object) and moduleRecord (Module Record) and returns unused.

多くのホストHostGetImportMetaProperties を定義するだけで済み、HostFinalizeImportMeta のデフォルト動作をそのまま利用できる。HostFinalizeImportMeta は公開前に直接オブジェクトを操作する必要があるホスト向けの「エスケープハッチ」を提供する。

デフォルト実装は unused を返す。

13.4 更新式 (Update Expressions)

構文 (Syntax)

UpdateExpression[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++ LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] -- ++ UnaryExpression[?Yield, ?Await] -- UnaryExpression[?Yield, ?Await]

13.4.1 静的セマンティクス: 早期エラー (Static Semantics: Early Errors)

UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- UpdateExpression : ++ UnaryExpression -- UnaryExpression
  • UnaryExpression の AssignmentTargetType が invalid なら早期 Syntax Error とする。

13.4.2 後置インクリメント演算子 (Postfix Increment Operator)

13.4.2.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

UpdateExpression : LeftHandSideExpression ++
  1. lhs を ? LeftHandSideExpression の Evaluation とする。
  2. LeftHandSideExpression の AssignmentTargetType が web-compat なら ReferenceError 例外を投げる。
  3. oldValue を ? ToNumeric(? GetValue(lhs)) とする。
  4. oldValue が Number なら
    1. newValueNumber::add(oldValue, 1𝔽) とする。
  5. そうでなければ
    1. Assert: oldValue は BigInt である。
    2. newValueBigInt::add(oldValue, 1) とする。
  6. PutValue(lhs, newValue) を実行する。
  7. oldValue を返す。

13.4.3 後置デクリメント演算子 (Postfix Decrement Operator)

13.4.3.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

UpdateExpression : LeftHandSideExpression --
  1. lhs を ? LeftHandSideExpression の Evaluation とする。
  2. LeftHandSideExpression の AssignmentTargetType が web-compat なら ReferenceError 例外を投げる。
  3. oldValue を ? ToNumeric(? GetValue(lhs)) とする。
  4. oldValue が Number なら
    1. newValueNumber::subtract(oldValue, 1𝔽) とする。
  5. そうでなければ
    1. Assert: oldValue は BigInt。
    2. newValueBigInt::subtract(oldValue, 1) とする。
  6. PutValue(lhs, newValue) を実行。
  7. oldValue を返す。

13.4.4 前置インクリメント演算子 (Prefix Increment Operator)

13.4.4.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

UpdateExpression : ++ UnaryExpression
  1. expr を ? UnaryExpression の Evaluation とする。
  2. UnaryExpression の AssignmentTargetType が web-compat なら ReferenceError 例外を投げる。
  3. oldValue を ? ToNumeric(? GetValue(expr)) とする。
  4. oldValue が Number なら
    1. newValueNumber::add(oldValue, 1𝔽) とする。
  5. そうでなければ
    1. Assert: oldValue は BigInt。
    2. newValueBigInt::add(oldValue, 1) とする。
  6. PutValue(expr, newValue) を実行。
  7. newValue を返す。

13.4.5 前置デクリメント演算子 (Prefix Decrement Operator)

13.4.5.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

UpdateExpression : -- UnaryExpression
  1. expr を ? UnaryExpression の Evaluation とする。
  2. UnaryExpression の AssignmentTargetType が web-compat なら ReferenceError 例外を投げる。
  3. oldValue を ? ToNumeric(? GetValue(expr)) とする。
  4. oldValue が Number なら
    1. newValueNumber::subtract(oldValue, 1𝔽) とする。
  5. そうでなければ
    1. Assert: oldValue は BigInt。
    2. newValueBigInt::subtract(oldValue, 1) とする。
  6. PutValue(expr, newValue) を実行。
  7. newValue を返す。

13.5 単項演算子 (Unary Operators)

構文 (Syntax)

UnaryExpression[Yield, Await] : UpdateExpression[?Yield, ?Await] delete UnaryExpression[?Yield, ?Await] void UnaryExpression[?Yield, ?Await] typeof UnaryExpression[?Yield, ?Await] + UnaryExpression[?Yield, ?Await] - UnaryExpression[?Yield, ?Await] ~ UnaryExpression[?Yield, ?Await] ! UnaryExpression[?Yield, ?Await] [+Await] AwaitExpression[?Yield]

13.5.1 delete 演算子 (The delete Operator)

13.5.1.1 静的セマンティクス: 早期エラー (Static Semantics: Early Errors)

UnaryExpression : delete UnaryExpression Note

最後の規則により delete (((foo))) のような式は最初の規則が再帰適用されるため早期エラーになる。

13.5.1.2 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

UnaryExpression : delete UnaryExpression
  1. ref を ? UnaryExpression の Evaluation とする。
  2. refReference Record でなければ true を返す。
  3. IsUnresolvableReference(ref) が true なら
    1. Assert: ref.[[Strict]]false
    2. true を返す。
  4. IsPropertyReference(ref) が true なら
    1. Assert: IsPrivateReference(ref) は false
    2. IsSuperReference(ref) が true なら ReferenceError 例外を投げる。
    3. baseObj を ? ToObject(ref.[[Base]]) とする。
    4. ref.[[ReferencedName]] が property key でなければ
      1. ref.[[ReferencedName]] を ? ToPropertyKey(ref.[[ReferencedName]]) に設定。
    5. deleteStatus を ? baseObj.[[Delete]](ref.[[ReferencedName]]) とする。
    6. deleteStatusfalse かつ ref.[[Strict]]true なら TypeError 例外。
    7. deleteStatus を返す。
  5. そうでなければ
    1. baseref.[[Base]] とする。
    2. Assert: baseEnvironment Record
    3. base.DeleteBinding(ref.[[ReferencedName]]) を返す。
Note 1

strict mode コード内で delete 演算子が出現し、その UnaryExpression が変数・引数・関数名への直接参照であると SyntaxError 例外となる。さらに strict mode で delete の対象プロパティが { [[Configurable]]: false }(または削除不能)である場合 TypeError 例外となる。

Note 2

手順 4.c で生成されうるオブジェクトは上記抽象操作および通常オブジェクト[[Delete]] 内部メソッドの外からはアクセスできない。実装はそのオブジェクトの実際の生成を省略してもよい。

13.5.2 void 演算子 (The void Operator)

13.5.2.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

UnaryExpression : void UnaryExpression
  1. expr を ? UnaryExpression の Evaluation とする。
  2. GetValue(expr) を実行。
  3. undefined を返す。
Note

値を使用しない場合でも副作用が観測され得るため GetValue を呼び出す必要がある。

13.5.3 typeof 演算子 (The typeof Operator)

13.5.3.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

UnaryExpression : typeof UnaryExpression
  1. val を ? UnaryExpression の Evaluation とする。
  2. valReference Record なら
    1. IsUnresolvableReference(val) が true なら "undefined" を返す。
  3. val を ? GetValue(val) に設定。
  4. valundefined なら "undefined" を返す。
  5. valnull なら "object" を返す。
  6. val が String なら "string" を返す。
  7. val が Symbol なら "symbol" を返す。
  8. val が Boolean なら "boolean" を返す。
  9. val が Number なら "number" を返す。
  10. val が BigInt なら "bigint" を返す。
  11. Assert: val は Object。
  12. Normative Optional
    ホストがウェブブラウザ又は [[IsHTMLDDA]] 内部スロット をサポートするなら
    1. val[[IsHTMLDDA]] 内部スロットを持つ場合 "undefined" を返す。
  13. val[[Call]] 内部メソッドを持つなら "function" を返す。
  14. "object" を返す。

13.5.4 単項 + 演算子 (Unary + Operator)

Note

単項 + 演算子は被演算子を Number 型に変換する。

13.5.4.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

UnaryExpression : + UnaryExpression
  1. expr を ? UnaryExpression の Evaluation とする。
  2. ToNumber(? GetValue(expr)) を返す。

13.5.5 単項 - 演算子 (Unary - Operator)

Note

単項 - は被演算子を数値へ変換し符号を反転する。+0𝔽 の反転は -0𝔽-0𝔽 の反転は +0𝔽 を生成する。

13.5.5.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

UnaryExpression : - UnaryExpression
  1. expr を ? UnaryExpression の Evaluation とする。
  2. oldValue を ? ToNumeric(? GetValue(expr)) とする。
  3. oldValue が Number なら
    1. Number::unaryMinus(oldValue) を返す。
  4. そうでなければ
    1. Assert: oldValue は BigInt。
    2. BigInt::unaryMinus(oldValue) を返す。

13.5.6 ビット単位 NOT 演算子 ( ~ ) (Bitwise NOT Operator)

13.5.6.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

UnaryExpression : ~ UnaryExpression
  1. expr を ? UnaryExpression の Evaluation とする。
  2. oldValue を ? ToNumeric(? GetValue(expr)) とする。
  3. oldValue が Number なら
    1. Number::bitwiseNOT(oldValue) を返す。
  4. そうでなければ
    1. Assert: oldValue は BigInt。
    2. BigInt::bitwiseNOT(oldValue) を返す。

13.5.7 論理 NOT 演算子 ( ! ) (Logical NOT Operator)

13.5.7.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

UnaryExpression : ! UnaryExpression
  1. expr を ? UnaryExpression の Evaluation とする。
  2. oldValueToBoolean(? GetValue(expr)) とする。
  3. oldValuetrue なら false を返す。
  4. true を返す。

13.6 累乗演算子 (Exponentiation Operator)

構文 (Syntax)

ExponentiationExpression[Yield, Await] : UnaryExpression[?Yield, ?Await] UpdateExpression[?Yield, ?Await] ** ExponentiationExpression[?Yield, ?Await]

13.6.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

ExponentiationExpression : UpdateExpression ** ExponentiationExpression
  1. EvaluateStringOrNumericBinaryExpression(UpdateExpression, **, ExponentiationExpression) を返す。

13.7 乗算系演算子 (Multiplicative Operators)

構文 (Syntax)

MultiplicativeExpression[Yield, Await] : ExponentiationExpression[?Yield, ?Await] MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?Yield, ?Await] MultiplicativeOperator : one of * / % Note
  • * は乗算で被演算子の積を生成する。
  • / は除算で被演算子の商を生成する。
  • % は暗黙の除算に基づく剰余を生成する。

13.7.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

MultiplicativeExpression : MultiplicativeExpression MultiplicativeOperator ExponentiationExpression
  1. opTextMultiplicativeOperator にマッチしたソーステキストとする。
  2. EvaluateStringOrNumericBinaryExpression(MultiplicativeExpression, opText, ExponentiationExpression) を返す。

13.8 加算系演算子 (Additive Operators)

構文 (Syntax)

AdditiveExpression[Yield, Await] : MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] + MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] - MultiplicativeExpression[?Yield, ?Await]

13.8.1 加算演算子 ( + ) (The Addition Operator)

Note

加算演算子は文字列連結または数値加算を行う。

13.8.1.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

AdditiveExpression : AdditiveExpression + MultiplicativeExpression
  1. EvaluateStringOrNumericBinaryExpression(AdditiveExpression, +, MultiplicativeExpression) を返す。

13.8.2 減算演算子 ( - ) (The Subtraction Operator)

Note

- 演算子は減算を行い被演算子の差を生成する。

13.8.2.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

AdditiveExpression : AdditiveExpression - MultiplicativeExpression
  1. EvaluateStringOrNumericBinaryExpression(AdditiveExpression, -, MultiplicativeExpression) を返す。

13.9 ビットシフト演算子 (Bitwise Shift Operators)

構文 (Syntax)

ShiftExpression[Yield, Await] : AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] << AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] >> AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] >>> AdditiveExpression[?Yield, ?Await]

13.9.1 左シフト演算子 ( << ) (The Left Shift Operator)

Note

左オペランドを右オペランドで指定された回数だけビット左シフトする。

13.9.1.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

ShiftExpression : ShiftExpression << AdditiveExpression
  1. EvaluateStringOrNumericBinaryExpression(ShiftExpression, <<, AdditiveExpression) を返す。

13.9.2 算術(符号付き)右シフト演算子 ( >> ) (The Signed Right Shift Operator)

Note

左オペランドを右オペランドで指定された回数だけ符号拡張しつつビット右シフトする。

13.9.2.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

ShiftExpression : ShiftExpression >> AdditiveExpression
  1. EvaluateStringOrNumericBinaryExpression(ShiftExpression, >>, AdditiveExpression) を返す。

13.9.3 論理(ゼロ埋め)右シフト演算子 ( >>> ) (The Unsigned Right Shift Operator)

Note

左オペランドを右オペランドで指定回数だけゼロ埋めしつつビット右シフトする。

13.9.3.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

ShiftExpression : ShiftExpression >>> AdditiveExpression
  1. EvaluateStringOrNumericBinaryExpression(ShiftExpression, >>>, AdditiveExpression) を返す。

13.10 関係演算子 (Relational Operators)

Note 1

関係演算子の評価結果は常に Boolean 型で、被演算子間にその関係が成り立つかを示す。

構文 (Syntax)

RelationalExpression[In, Yield, Await] : ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] < ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] > ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] <= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] >= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] instanceof ShiftExpression[?Yield, ?Await] [+In] RelationalExpression[+In, ?Yield, ?Await] in ShiftExpression[?Yield, ?Await] [+In] PrivateIdentifier in ShiftExpression[?Yield, ?Await] Note 2

[In] 文法パラメータは関係式内の in 演算子と for 文の in を混同しないために必要。

13.10.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

RelationalExpression : RelationalExpression < ShiftExpression
  1. lRef を ? RelationalExpression の Evaluation。
  2. lVal を ? GetValue(lRef)。
  3. rRef を ? ShiftExpression の Evaluation。
  4. rVal を ? GetValue(rRef)。
  5. r を ? IsLessThan(lVal, rVal, true) とする。
  6. rundefined なら false、そうでなければ r を返す。
RelationalExpression : RelationalExpression > ShiftExpression
  1. lRef, lVal, rRef, rVal を上と同様に求める(ただし比較順を反転)。
  2. r を ? IsLessThan(rVal, lVal, false) とする。
  3. rundefined なら false、そうでなければ r
RelationalExpression : RelationalExpression <= ShiftExpression
  1. 左右を評価し r を ? IsLessThan(rVal, lVal, false)。
  2. rtrue または undefined なら false、そうでなければ true
RelationalExpression : RelationalExpression >= ShiftExpression
  1. 左右を評価し r を ? IsLessThan(lVal, rVal, true)。
  2. rtrue または undefined なら false、そうでなければ true
RelationalExpression : RelationalExpression instanceof ShiftExpression
  1. 左右を評価し lVal, rVal を得る。
  2. InstanceofOperator(lVal, rVal) を返す。
RelationalExpression : RelationalExpression in ShiftExpression
  1. 左右を評価し lVal, rVal を得る。
  2. rVal が Object でなければ TypeError
  3. HasProperty(rVal, ? ToPropertyKey(lVal)) を返す。
RelationalExpression : PrivateIdentifier in ShiftExpression
  1. privateIdentifierPrivateIdentifier の StringValue とする。
  2. rRef, rVal を評価して得る。
  3. rVal が Object でなければ TypeError
  4. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  5. Assert: privateEnvnull でない。
  6. privateNameResolvePrivateIdentifier(privateEnv, privateIdentifier)。
  7. PrivateElementFind(rVal, privateName) が empty でなければ true
  8. false を返す。

13.10.2 InstanceofOperator ( V, target )

The abstract operation InstanceofOperator takes arguments V (ECMAScript 言語値) and target (ECMAScript 言語値) and returns 正常完了で Boolean を含むか throw 完了. It performs the following steps when called:

  1. target が Object でなければ TypeError 例外。
  2. instOfHandler を ? GetMethod(target, %Symbol.hasInstance%) とする。
  3. instOfHandlerundefined でなければ
    1. ToBoolean(? Call(instOfHandler, target, « V »)) を返す。
  4. IsCallable(target) が false なら TypeError
  5. OrdinaryHasInstance(target, V) を返す。
Note

45%Symbol.hasInstance% が存在しなかった以前の版との互換性を提供する。オブジェクトが %Symbol.hasInstance% を定義・継承しない場合は従来の instanceof 既定セマンティクスを用いる。

13.11 等価演算子 (Equality Operators)

Note

等価演算子の評価結果は常に Boolean 型で、演算子が命名する関係が両被演算子間で成り立つかを表す。

構文 (Syntax)

EqualityExpression[In, Yield, Await] : RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] == RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] != RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] === RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] !== RelationalExpression[?In, ?Yield, ?Await]

13.11.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

EqualityExpression : EqualityExpression == RelationalExpression
  1. 左右を評価し lVal, rVal を得る。
  2. IsLooselyEqual(rVal, lVal) を返す。
EqualityExpression : EqualityExpression != RelationalExpression
  1. 左右を評価し lVal, rVal を得る。
  2. r を ? IsLooselyEqual(rVal, lVal)。
  3. rtrue なら false、それ以外 true
EqualityExpression : EqualityExpression === RelationalExpression
  1. 左右を評価し lVal, rVal を得る。
  2. IsStrictlyEqual(rVal, lVal) を返す。
EqualityExpression : EqualityExpression !== RelationalExpression
  1. 左右を評価し lVal, rVal を得る。
  2. rIsStrictlyEqual(rVal, lVal)。
  3. rtrue なら false、それ以外 true
Note 1

上記定義に関して:

  • 文字列比較は: \`${a}\` == \`${b}\` により強制できる。
  • 数値比較は: +a == +b により強制できる。
  • Boolean 比較は: !a == !b により強制できる。
Note 2

等価演算子は次の不変条件を保持する:

  • A != B!(A == B) と同値。
  • A == B は評価順序を除き B == A と同値。
Note 3

等価演算子は常に推移的とは限らない。例えば同じ String 値を表す異なる 2 つの String オブジェクトは、それぞれがリテラル文字列とは == で等しいが、互いには等しくない:

  • new String("a") == "a" および "a" == new String("a")true
  • new String("a") == new String("a")false
Note 4

文字列比較はコードユニット列の単純な同値判定であり、Unicode 仕様の正規等価や照合順序は考慮されない。Unicode の正規等価な String が不等と判定され得る。両 String は既に正規化されているものとみなす。

13.12 ビット単位二項演算子 (Binary Bitwise Operators)

構文 (Syntax)

BitwiseANDExpression[In, Yield, Await] : EqualityExpression[?In, ?Yield, ?Await] BitwiseANDExpression[?In, ?Yield, ?Await] & EqualityExpression[?In, ?Yield, ?Await] BitwiseXORExpression[In, Yield, Await] : BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseXORExpression[?In, ?Yield, ?Await] ^ BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseORExpression[In, Yield, Await] : BitwiseXORExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] | BitwiseXORExpression[?In, ?Yield, ?Await]

13.12.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

BitwiseANDExpression : BitwiseANDExpression & EqualityExpression
  1. EvaluateStringOrNumericBinaryExpression(BitwiseANDExpression, &, EqualityExpression) を返す。
BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression
  1. EvaluateStringOrNumericBinaryExpression(BitwiseXORExpression, ^, BitwiseANDExpression) を返す。
BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression
  1. EvaluateStringOrNumericBinaryExpression(BitwiseORExpression, |, BitwiseXORExpression) を返す。

13.13 論理二項演算子 (Binary Logical Operators)

構文 (Syntax)

LogicalANDExpression[In, Yield, Await] : BitwiseORExpression[?In, ?Yield, ?Await] LogicalANDExpression[?In, ?Yield, ?Await] && BitwiseORExpression[?In, ?Yield, ?Await] LogicalORExpression[In, Yield, Await] : LogicalANDExpression[?In, ?Yield, ?Await] LogicalORExpression[?In, ?Yield, ?Await] || LogicalANDExpression[?In, ?Yield, ?Await] CoalesceExpression[In, Yield, Await] : CoalesceExpressionHead[?In, ?Yield, ?Await] ?? BitwiseORExpression[?In, ?Yield, ?Await] CoalesceExpressionHead[In, Yield, Await] : CoalesceExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] ShortCircuitExpression[In, Yield, Await] : LogicalORExpression[?In, ?Yield, ?Await] CoalesceExpression[?In, ?Yield, ?Await] Note

&& および || 演算子の結果値は必ずしも Boolean 型ではなく、常に 2 つの被演算子のいずれかの値そのものである。

13.13.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

LogicalANDExpression : LogicalANDExpression && BitwiseORExpression
  1. lRef を ? LogicalANDExpression の Evaluation。
  2. lVal を ? GetValue(lRef)。
  3. ToBoolean(lVal) が false なら lVal を返す。
  4. rRef を ? BitwiseORExpression の Evaluation。
  5. GetValue(rRef) を返す。
LogicalORExpression : LogicalORExpression || LogicalANDExpression
  1. lRef を ? LogicalORExpression の Evaluation。
  2. lVal を ? GetValue(lRef)。
  3. ToBoolean(lVal) が true なら lVal を返す。
  4. rRef を ? LogicalANDExpression の Evaluation。
  5. GetValue(rRef) を返す。
CoalesceExpression : CoalesceExpressionHead ?? BitwiseORExpression
  1. lRef を ? CoalesceExpressionHead の Evaluation。
  2. lVal を ? GetValue(lRef)。
  3. lValundefined または null なら
    1. rRef を ? BitwiseORExpression の Evaluation。
    2. GetValue(rRef) を返す。
  4. そうでなければ
    1. lVal を返す。

13.14 条件演算子 ( ? : ) (Conditional Operator)

構文 (Syntax)

ConditionalExpression[In, Yield, Await] : ShortCircuitExpression[?In, ?Yield, ?Await] ShortCircuitExpression[?In, ?Yield, ?Await] ? AssignmentExpression[+In, ?Yield, ?Await] : AssignmentExpression[?In, ?Yield, ?Await] Note

ECMAScript の ConditionalExpression の文法は C や Java とわずかに異なる。C / Java では第 2 部分式を Expression とできる一方で第 3 部分式を ConditionalExpression に制限する。ECMAScript が異なるのは、条件のどちらの腕でも代入式を許可し、かつ中央の式として(紛らわしくほとんど有用でない)カンマ式となるケースを排除するためである。

13.14.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

ConditionalExpression : ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
  1. lRef を ? ShortCircuitExpression の Evaluation とする。
  2. lValToBoolean(? GetValue(lRef)) とする。
  3. lValtrue なら
    1. trueRef を 1 番目の AssignmentExpression の Evaluation。
    2. GetValue(trueRef) を返す。
  4. そうでなければ
    1. falseRef を 2 番目の AssignmentExpression の Evaluation。
    2. GetValue(falseRef) を返す。

13.15 代入演算子 (Assignment Operators)

構文 (Syntax)

AssignmentExpression[In, Yield, Await] : ConditionalExpression[?In, ?Yield, ?Await] [+Yield] YieldExpression[?In, ?Await] ArrowFunction[?In, ?Yield, ?Await] AsyncArrowFunction[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] AssignmentOperator AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] &&= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ||= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ??= AssignmentExpression[?In, ?Yield, ?Await] AssignmentOperator : one of *= /= %= += -= <<= >>= >>>= &= ^= |= **=

13.15.1 静的セマンティクス: 早期エラー (Static Semantics: Early Errors)

AssignmentExpression : LeftHandSideExpression = AssignmentExpression AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression LeftHandSideExpression ||= AssignmentExpression LeftHandSideExpression ??= AssignmentExpression

13.15.2 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

AssignmentExpression : LeftHandSideExpression = AssignmentExpression
  1. LeftHandSideExpressionObjectLiteral でも ArrayLiteral でもないなら
    1. lRef を ? LeftHandSideExpression の Evaluation。
    2. LeftHandSideExpression の AssignmentTargetType が web-compat なら ReferenceError 例外。
    3. IsAnonymousFunctionDefinition(AssignmentExpression) が true かつ IsIdentifierRef(LeftHandSideExpression) が true なら
      1. lhsLeftHandSideExpression の StringValue。
      2. rVal を 引数 lhsAssignmentExpression の NamedEvaluation。
    4. そうでなければ
      1. rRef を ? AssignmentExpression の Evaluation。
      2. rVal を ? GetValue(rRef)。
    5. PutValue(lRef, rVal) を実行。
    6. rVal を返す。
  2. assignmentPatternLeftHandSideExpression が覆う AssignmentPattern とする。
  3. rRef を ? AssignmentExpression の Evaluation。
  4. rVal を ? GetValue(rRef)。
  5. assignmentPattern の DestructuringAssignmentEvaluation を引数 rVal で実行。
  6. rVal を返す。
AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression
  1. lRef を ? LeftHandSideExpression の Evaluation。
  2. LeftHandSideExpression の AssignmentTargetType が web-compat なら ReferenceError
  3. lVal を ? GetValue(lRef)。
  4. rRef を ? AssignmentExpression の Evaluation。
  5. rVal を ? GetValue(rRef)。
  6. assignmentOpTextAssignmentOperator にマッチしたソーステキスト。
  7. opText を次の表で assignmentOpText に対応する Unicode コードポイント列。
    assignmentOpText opText
    **= **
    *= *
    /= /
    %= %
    += +
    -= -
    <<= <<
    >>= >>
    >>>= >>>
    &= &
    ^= ^
    |= |
  8. r を ? ApplyStringOrNumericBinaryOperator(lVal, opText, rVal) とする。
  9. PutValue(lRef, r) を実行。
  10. r を返す。
AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression
  1. lRef を ? LeftHandSideExpression の Evaluation。
  2. lVal を ? GetValue(lRef)。
  3. ToBoolean(lVal) が false なら lVal を返す。
  4. IsAnonymousFunctionDefinition(AssignmentExpression) が true かつ IsIdentifierRef(LeftHandSideExpression) が true なら
    1. lhsLeftHandSideExpression の StringValue。
    2. rVal を 引数 lhsAssignmentExpression の NamedEvaluation。
  5. そうでなければ
    1. rRef を ? AssignmentExpression の Evaluation。
    2. rVal を ? GetValue(rRef)。
  6. PutValue(lRef, rVal) を実行。
  7. rVal を返す。
AssignmentExpression : LeftHandSideExpression ||= AssignmentExpression
  1. lRef を ? LeftHandSideExpression の Evaluation。
  2. lVal を ? GetValue(lRef)。
  3. ToBoolean(lVal) が true なら lVal を返す。
  4. IsAnonymousFunctionDefinition(AssignmentExpression) が true かつ IsIdentifierRef(LeftHandSideExpression) が true なら
    1. lhsLeftHandSideExpression の StringValue。
    2. rVal を 引数 lhsAssignmentExpression の NamedEvaluation。
  5. そうでなければ
    1. rRef を ? AssignmentExpression の Evaluation。
    2. rVal を ? GetValue(rRef)。
  6. PutValue(lRef, rVal) を実行。
  7. rVal を返す。
AssignmentExpression : LeftHandSideExpression ??= AssignmentExpression
  1. lRef を ? LeftHandSideExpression の Evaluation。
  2. lVal を ? GetValue(lRef)。
  3. lValundefined でも null でもないなら lVal を返す。
  4. IsAnonymousFunctionDefinition(AssignmentExpression) が true かつ IsIdentifierRef(LeftHandSideExpression) が true なら
    1. lhsLeftHandSideExpression の StringValue。
    2. rVal を 引数 lhsAssignmentExpression の NamedEvaluation。
  5. そうでなければ
    1. rRef を ? AssignmentExpression の Evaluation。
    2. rVal を ? GetValue(rRef)。
  6. PutValue(lRef, rVal) を実行。
  7. rVal を返す。
Note

strict mode コード内でこの式が現れる場合、手順 1.e, 3, 2, 2, 2lRef が解決不能参照なら実行時エラー(ReferenceError 例外)。さらに手順 9, 6, 6, 6lRef[[Writable]]:falseデータプロパティ[[Set]]:undefinedアクセサプロパティ、あるいは IsExtensiblefalse を返すオブジェクト上の存在しないプロパティを参照しているなら TypeError 例外を投げる。

13.15.3 ApplyStringOrNumericBinaryOperator ( lVal, opText, rVal )

The abstract operation ApplyStringOrNumericBinaryOperator takes arguments lVal (ECMAScript 言語値), opText (**, *, /, %, +, -, <<, >>, >>>, &, ^, |), and rVal (ECMAScript 言語値) and returns 正常完了で String / BigInt / Number のいずれか、または throw 完了. It performs the following steps when called:

  1. opText+ なら
    1. lPrim を ? ToPrimitive(lVal)。
    2. rPrim を ? ToPrimitive(rVal)。
    3. lPrim が String であるか rPrim が String なら
      1. lStr を ? ToString(lPrim)。
      2. rStr を ? ToString(rPrim)。
      3. lStrrStr文字列連結を返す。
    4. lVallPrim に設定。
    5. rValrPrim に設定。
  2. 注: ここからは数値演算である。
  3. lNum を ? ToNumeric(lVal)。
  4. rNum を ? ToNumeric(rVal)。
  5. SameType(lNum, rNum) が false なら TypeError 例外。
  6. lNum が BigInt なら
    1. opText** なら ? BigInt::exponentiate(lNum, rNum) を返す。
    2. opText/ なら ? BigInt::divide(lNum, rNum)。
    3. opText% なら ? BigInt::remainder(lNum, rNum)。
    4. opText>>> なら ? BigInt::unsignedRightShift(lNum, rNum)。
    5. operation を次の表で opText に対応する抽象操作とする:
      opText operation
      * BigInt::multiply
      + BigInt::add
      - BigInt::subtract
      << BigInt::leftShift
      >> BigInt::signedRightShift
      & BigInt::bitwiseAND
      ^ BigInt::bitwiseXOR
      | BigInt::bitwiseOR
  7. そうでなければ
    1. Assert: lNum は Number。
    2. operation を次の表で opText に対応する抽象操作とする:
      opText operation
      ** Number::exponentiate
      * Number::multiply
      / Number::divide
      % Number::remainder
      + Number::add
      - Number::subtract
      << Number::leftShift
      >> Number::signedRightShift
      >>> Number::unsignedRightShift
      & Number::bitwiseAND
      ^ Number::bitwiseXOR
      | Number::bitwiseOR
  8. operation(lNum, rNum) を返す。
Note 1

手順 1.a, 1.b の ToPrimitive 呼出しでは hint を与えない。標準オブジェクト(Date を除く)は hint 省略時 number と同等に扱い、Date は string と同等に扱う。エキゾチックオブジェクトは別の扱いをするかもしれない。

Note 2

手順 1.cIsLessThan アルゴリズムの手順 3 と異なり、論理積ではなく論理和を用いる。

13.15.4 EvaluateStringOrNumericBinaryExpression ( leftOperand, opText, rightOperand )

The abstract operation EvaluateStringOrNumericBinaryExpression takes arguments leftOperand (Parse Node), opText (Unicode コードポイント列), and rightOperand (Parse Node) and returns 正常完了で String / BigInt / Number のいずれか、または突然の完了. It performs the following steps when called:

  1. lRef を ? leftOperand の Evaluation。
  2. lVal を ? GetValue(lRef)。
  3. rRef を ? rightOperand の Evaluation。
  4. rVal を ? GetValue(rRef)。
  5. ApplyStringOrNumericBinaryOperator(lVal, opText, rVal) を返す。

13.15.5 分割代入 (Destructuring Assignment)

補助構文 (Supplemental Syntax)

次の生成規則インスタンスを処理する特定状況で
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression の解釈は以下の文法で精緻化される:

AssignmentPattern[Yield, Await] : ObjectAssignmentPattern[?Yield, ?Await] ArrayAssignmentPattern[?Yield, ?Await] ObjectAssignmentPattern[Yield, Await] : { } { AssignmentRestProperty[?Yield, ?Await] } { AssignmentPropertyList[?Yield, ?Await] } { AssignmentPropertyList[?Yield, ?Await] , AssignmentRestProperty[?Yield, ?Await]opt } ArrayAssignmentPattern[Yield, Await] : [ Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] [ AssignmentElementList[?Yield, ?Await] ] [ AssignmentElementList[?Yield, ?Await] , Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] AssignmentRestProperty[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] AssignmentPropertyList[Yield, Await] : AssignmentProperty[?Yield, ?Await] AssignmentPropertyList[?Yield, ?Await] , AssignmentProperty[?Yield, ?Await] AssignmentElementList[Yield, Await] : AssignmentElisionElement[?Yield, ?Await] AssignmentElementList[?Yield, ?Await] , AssignmentElisionElement[?Yield, ?Await] AssignmentElisionElement[Yield, Await] : Elisionopt AssignmentElement[?Yield, ?Await] AssignmentProperty[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt PropertyName[?Yield, ?Await] : AssignmentElement[?Yield, ?Await] AssignmentElement[Yield, Await] : DestructuringAssignmentTarget[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt AssignmentRestElement[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] DestructuringAssignmentTarget[Yield, Await] : LeftHandSideExpression[?Yield, ?Await]

13.15.5.1 静的セマンティクス: 早期エラー (Static Semantics: Early Errors)

AssignmentProperty : IdentifierReference Initializeropt AssignmentRestProperty : ... DestructuringAssignmentTarget DestructuringAssignmentTarget : LeftHandSideExpression

13.15.5.2 実行時セマンティクス: DestructuringAssignmentEvaluation : 正常完了で unused または突然の完了

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ObjectAssignmentPattern : { }
  1. RequireObjectCoercible(value)。
  2. unused を返す。
ObjectAssignmentPattern : { AssignmentPropertyList } { AssignmentPropertyList , }
  1. RequireObjectCoercible(value)。
  2. AssignmentPropertyList の PropertyDestructuringAssignmentEvaluation を引数 value で実行。
  3. unused を返す。
ObjectAssignmentPattern : { AssignmentRestProperty }
  1. RequireObjectCoercible(value)。
  2. excludedNames を空 List
  3. AssignmentRestProperty の RestDestructuringAssignmentEvaluation を引数 value, excludedNames で返す。
ObjectAssignmentPattern : { AssignmentPropertyList , AssignmentRestProperty }
  1. RequireObjectCoercible(value)。
  2. excludedNamesAssignmentPropertyList の PropertyDestructuringAssignmentEvaluation(引数 value)。
  3. AssignmentRestProperty の RestDestructuringAssignmentEvaluation(value, excludedNames) を返す。
ArrayAssignmentPattern : [ ]
  1. iteratorRecord を ? GetIterator(value, sync)。
  2. IteratorClose(iteratorRecord, NormalCompletion(unused)) を返す。
ArrayAssignmentPattern : [ Elision ]
  1. iteratorRecord を ? GetIterator(value, sync)。
  2. resultCompletion(Elision の IteratorDestructuringAssignmentEvaluation(iteratorRecord))。
  3. iteratorRecord.[[Done]]false なら ? IteratorClose(iteratorRecord, result) を返す。
  4. result を返す。
ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ]
  1. iteratorRecord を ? GetIterator(value, sync)。
  2. Elision が存在するなら
    1. statusCompletion(Elision の IteratorDestructuringAssignmentEvaluation(iteratorRecord))。
    2. status が abrupt なら
      1. Assert: iteratorRecord.[[Done]]true
      2. status を返す。
  3. resultCompletion(AssignmentRestElement の IteratorDestructuringAssignmentEvaluation(iteratorRecord))。
  4. iteratorRecord.[[Done]]false なら ? IteratorClose(iteratorRecord, result)。
  5. result を返す。
ArrayAssignmentPattern : [ AssignmentElementList ]
  1. iteratorRecord を ? GetIterator(value, sync)。
  2. resultCompletion(AssignmentElementList の IteratorDestructuringAssignmentEvaluation(iteratorRecord))。
  3. iteratorRecord.[[Done]]false なら ? IteratorClose(iteratorRecord, result)。
  4. result を返す。
ArrayAssignmentPattern : [ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
  1. iteratorRecord を ? GetIterator(value, sync)。
  2. statusCompletion(AssignmentElementList の IteratorDestructuringAssignmentEvaluation(iteratorRecord))。
  3. status が abrupt なら
    1. iteratorRecord.[[Done]]false なら ? IteratorClose(iteratorRecord, status) を返す。
    2. status を返す。
  4. Elision が存在するなら
    1. statusCompletion(Elision の IteratorDestructuringAssignmentEvaluation(iteratorRecord)) に設定。
    2. status が abrupt なら
      1. Assert: iteratorRecord.[[Done]]true
      2. status を返す。
  5. AssignmentRestElement が存在するなら
    1. statusCompletion(AssignmentRestElement の IteratorDestructuringAssignmentEvaluation(iteratorRecord)) に設定。
  6. iteratorRecord.[[Done]]false なら ? IteratorClose(iteratorRecord, status)。
  7. status を返す。

13.15.5.3 実行時セマンティクス: PropertyDestructuringAssignmentEvaluation : 正常完了でプロパティキーの List または突然の完了

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

AssignmentPropertyList : AssignmentPropertyList , AssignmentProperty
  1. propertyNames を ? PropertyDestructuringAssignmentEvaluation(AssignmentPropertyList, value)。
  2. nextNames を ? PropertyDestructuringAssignmentEvaluation(AssignmentProperty, value)。
  3. propertyNamesnextNamesリスト結合を返す。
AssignmentProperty : IdentifierReference Initializeropt
  1. PIdentifierReference の StringValue。
  2. lRef を ? ResolveBinding(P)。
  3. v を ? GetV(value, P)。
  4. Initializer が存在し vundefined なら
    1. IsAnonymousFunctionDefinition(Initializer) が true なら
      1. v を 引数 PInitializer の NamedEvaluation。
    2. そうでなければ
      1. defaultValue を ? Initializer の Evaluation。
      2. v を ? GetValue(defaultValue)。
  5. PutValue(lRef, v) を実行。
  6. « P » を返す。
AssignmentProperty : PropertyName : AssignmentElement
  1. name を ? PropertyName の Evaluation。
  2. AssignmentElement の KeyedDestructuringAssignmentEvaluation(value, name) を実行。
  3. « name » を返す。

13.15.5.4 実行時セマンティクス: RestDestructuringAssignmentEvaluation : 正常完了で unused または突然の完了

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

AssignmentRestProperty : ... DestructuringAssignmentTarget
  1. lRef を ? DestructuringAssignmentTarget の Evaluation。
  2. restObjOrdinaryObjectCreate(%Object.prototype%)。
  3. CopyDataProperties(restObj, value, excludedNames)。
  4. PutValue(lRef, restObj) を返す。

13.15.5.5 実行時セマンティクス: IteratorDestructuringAssignmentEvaluation : 正常完了で unused または突然の完了

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

AssignmentElementList : AssignmentElisionElement
  1. AssignmentElisionElement の IteratorDestructuringAssignmentEvaluation(iteratorRecord) を返す。
AssignmentElementList : AssignmentElementList , AssignmentElisionElement
  1. AssignmentElementList の IteratorDestructuringAssignmentEvaluation(iteratorRecord) を実行。
  2. AssignmentElisionElement の IteratorDestructuringAssignmentEvaluation(iteratorRecord) を返す。
AssignmentElisionElement : AssignmentElement
  1. AssignmentElement の IteratorDestructuringAssignmentEvaluation(iteratorRecord) を返す。
AssignmentElisionElement : Elision AssignmentElement
  1. Elision の IteratorDestructuringAssignmentEvaluation(iteratorRecord) を実行。
  2. AssignmentElement の IteratorDestructuringAssignmentEvaluation(iteratorRecord) を返す。
Elision : ,
  1. iteratorRecord.[[Done]]false なら
    1. IteratorStep(iteratorRecord)。
  2. unused を返す。
Elision : Elision ,
  1. Elision の IteratorDestructuringAssignmentEvaluation(iteratorRecord) を実行。
  2. iteratorRecord.[[Done]]false なら
    1. IteratorStep(iteratorRecord)。
  3. unused を返す。
AssignmentElement : DestructuringAssignmentTarget Initializeropt
  1. DestructuringAssignmentTargetObjectLiteral / ArrayLiteral のいずれでもないなら
    1. lRef を ? DestructuringAssignmentTarget の Evaluation。
  2. valueundefined
  3. iteratorRecord.[[Done]]false なら
    1. next を ? IteratorStepValue(iteratorRecord)。
    2. nextdone でなければ valuenext に設定。
  4. Initializer が存在し valueundefined なら
    1. IsAnonymousFunctionDefinition(Initializer) かつ IsIdentifierRef(DestructuringAssignmentTarget) が true なら
      1. targetDestructuringAssignmentTarget の StringValue。
      2. v を 引数 targetInitializer の NamedEvaluation。
    2. そうでなければ
      1. defaultValue を ? Initializer の Evaluation。
      2. v を ? GetValue(defaultValue)。
  5. そうでなければ
    1. vvalue
  6. DestructuringAssignmentTargetObjectLiteral または ArrayLiteral なら
    1. nestedAssignmentPatternDestructuringAssignmentTarget が覆う AssignmentPattern
    2. ? DestructuringAssignmentEvaluation(nestedAssignmentPattern, 引数 v) を返す。
  7. PutValue(lRef, v) を返す。
Note

DestructuringAssignmentTarget がパターンでない場合にそれを先に評価してからイテレータアクセスや Initializer の評価を行うことで、左から右への評価順序を維持する。

AssignmentRestElement : ... DestructuringAssignmentTarget
  1. DestructuringAssignmentTargetObjectLiteral / ArrayLiteral でないなら
    1. lRef を ? DestructuringAssignmentTarget の Evaluation。
  2. A を ! ArrayCreate(0)。
  3. n を 0。
  4. iteratorRecord.[[Done]]false の間繰り返す
    1. next を ? IteratorStepValue(iteratorRecord)。
    2. nextdone でなければ
      1. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), next)。
      2. nn + 1 に。
  5. DestructuringAssignmentTargetObjectLiteral / ArrayLiteral でないなら
    1. PutValue(lRef, A) を返す。
  6. nestedAssignmentPatternDestructuringAssignmentTarget が覆う AssignmentPattern
  7. ? DestructuringAssignmentEvaluation(nestedAssignmentPattern, 引数 A) を返す。

13.15.5.6 実行時セマンティクス: KeyedDestructuringAssignmentEvaluation : 正常完了で unused または突然の完了

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

AssignmentElement : DestructuringAssignmentTarget Initializeropt
  1. DestructuringAssignmentTargetObjectLiteral / ArrayLiteral でないなら
    1. lRef を ? DestructuringAssignmentTarget の Evaluation。
  2. v を ? GetV(value, propertyName)。
  3. Initializer が存在し vundefined なら
    1. IsAnonymousFunctionDefinition(Initializer) かつ IsIdentifierRef(DestructuringAssignmentTarget) が true なら
      1. targetDestructuringAssignmentTarget の StringValue。
      2. rhsValue を 引数 targetInitializer の NamedEvaluation。
    2. そうでなければ
      1. defaultValue を ? Initializer の Evaluation。
      2. rhsValue を ? GetValue(defaultValue)。
  4. そうでなければ
    1. rhsValuev
  5. DestructuringAssignmentTargetObjectLiteral または ArrayLiteral なら
    1. assignmentPatternDestructuringAssignmentTarget が覆う AssignmentPattern
    2. ? DestructuringAssignmentEvaluation(assignmentPattern, 引数 rhsValue) を返す。
  6. PutValue(lRef, rhsValue) を返す。

13.16 カンマ演算子 ( , ) (Comma Operator)

構文 (Syntax)

Expression[In, Yield, Await] : AssignmentExpression[?In, ?Yield, ?Await] Expression[?In, ?Yield, ?Await] , AssignmentExpression[?In, ?Yield, ?Await]

13.16.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)

Expression : Expression , AssignmentExpression
  1. lRef を ? Expression の Evaluation とする。
  2. GetValue(lRef) を実行する。
  3. rRef を ? AssignmentExpression の Evaluation とする。
  4. GetValue(rRef) を返す。
Note

値は使用されないが、副作用が観測可能であるため GetValue を呼び出す必要がある。

14 ECMAScript 言語: 文 (Statement) と 宣言 (Declaration)

構文 (Syntax)

Statement[Yield, Await, Return] : BlockStatement[?Yield, ?Await, ?Return] VariableStatement[?Yield, ?Await] EmptyStatement ExpressionStatement[?Yield, ?Await] IfStatement[?Yield, ?Await, ?Return] BreakableStatement[?Yield, ?Await, ?Return] ContinueStatement[?Yield, ?Await] BreakStatement[?Yield, ?Await] [+Return] ReturnStatement[?Yield, ?Await] WithStatement[?Yield, ?Await, ?Return] LabelledStatement[?Yield, ?Await, ?Return] ThrowStatement[?Yield, ?Await] TryStatement[?Yield, ?Await, ?Return] DebuggerStatement Declaration[Yield, Await] : HoistableDeclaration[?Yield, ?Await, ~Default] ClassDeclaration[?Yield, ?Await, ~Default] LexicalDeclaration[+In, ?Yield, ?Await] HoistableDeclaration[Yield, Await, Default] : FunctionDeclaration[?Yield, ?Await, ?Default] GeneratorDeclaration[?Yield, ?Await, ?Default] AsyncFunctionDeclaration[?Yield, ?Await, ?Default] AsyncGeneratorDeclaration[?Yield, ?Await, ?Default] BreakableStatement[Yield, Await, Return] : IterationStatement[?Yield, ?Await, ?Return] SwitchStatement[?Yield, ?Await, ?Return]

14.1 Statement の意味論 (Semantics)

14.1.1 実行時意味論: 評価 (Runtime Semantics: Evaluation)

HoistableDeclaration : GeneratorDeclaration AsyncFunctionDeclaration AsyncGeneratorDeclaration
  1. empty を返す。
HoistableDeclaration : FunctionDeclaration
  1. FunctionDeclaration の Evaluation の結果を ? 付きで返す。
BreakableStatement : IterationStatement SwitchStatement
  1. newLabelSet を新しい空の List とする。
  2. この BreakableStatement の LabelledEvaluation (引数 newLabelSet) の結果を ? 付きで返す。

14.2 Block

構文 (Syntax)

BlockStatement[Yield, Await, Return] : Block[?Yield, ?Await, ?Return] Block[Yield, Await, Return] : { StatementList[?Yield, ?Await, ?Return]opt } StatementList[Yield, Await, Return] : StatementListItem[?Yield, ?Await, ?Return] StatementList[?Yield, ?Await, ?Return] StatementListItem[?Yield, ?Await, ?Return] StatementListItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] Declaration[?Yield, ?Await]

14.2.1 静的意味論: 早期エラー (Static Semantics: Early Errors)

Block : { StatementList }
  • StatementList の LexicallyDeclaredNames に重複する要素が含まれるなら構文エラーである。ただしホストが Web ブラウザであるか又は ブロックレベル Function 宣言 (Web レガシー互換意味論) をサポートし、以下の両条件を満たす場合は除く:

    • IsStrict(this production) が false である。
    • 重複している要素はいずれも FunctionDeclarations によってのみ束縛される。
  • StatementList の LexicallyDeclaredNames の任意の要素が StatementList の VarDeclaredNames にも含まれているなら構文エラーである。

14.2.2 実行時意味論: 評価

Block : { }
  1. empty を返す。
Block : { StatementList }
  1. oldEnv を現在実行中コンテキストの LexicalEnvironment とする。
  2. blockEnvNewDeclarativeEnvironment(oldEnv) とする。
  3. BlockDeclarationInstantiation(StatementList, blockEnv) を実行する。
  4. 実行中コンテキストの LexicalEnvironment を blockEnv に設定する。
  5. blockValueStatementList の Evaluation の Completion とする。
  6. 実行中コンテキストの LexicalEnvironment を oldEnv に戻す。
  7. blockValue を返す。
Note 1

どのように Block を抜けても LexicalEnvironment は常に元に復元される。

StatementList : StatementList StatementListItem
  1. slStatementList の Evaluation を ? 付きで行った結果とする。
  2. sStatementListItem の Evaluation の Completion とする。
  3. UpdateEmpty(s, sl) を ? 付きで返す。
Note 2

StatementList の値はその中で最後に値を生成する項目の値である。例えば以下の eval 呼び出しはいずれも 1 を返す:

eval("1;;;;;")
eval("1;{}")
eval("1;var a;")

14.2.3 BlockDeclarationInstantiation ( code, env )

The abstract operation BlockDeclarationInstantiation takes arguments code (a Parse Node) and env (a Declarative Environment Record) and returns unused. code はブロック本体に対応する Parse Node。env は束縛を生成する Environment Record

Note

Block または CaseBlock が評価される際、新しい Declarative Environment Record が生成され、そのブロック内で宣言された block スコープの変数・定数・関数・クラスの束縛がそこにインスタンス化される。

呼び出されたとき以下の手順を行う:

  1. declarationscode の LexicallyScopedDeclarations とする。
  2. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  3. declarations の各要素 d について:
    1. d の BoundNames の各要素 dn について:
      1. IsConstantDeclaration of dtrue なら:
        1. env.CreateImmutableBinding(dn, true) を実行。
      2. それ以外:
        1. Normative Optional
          ホストが Web ブラウザまたは ブロックレベル Function 宣言 (Web レガシー互換意味論) をサポートするなら:
          1. env.HasBinding(dn) が false なら:
            1. env.CreateMutableBinding(dn, false) を実行。
        2. それ以外:
          1. env.CreateMutableBinding(dn, false) を実行。
    2. dFunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration のいずれかであれば:
      1. fnd の BoundNames の唯一の要素とする。
      2. fo を 引数 env, privateEnvd の InstantiateFunctionObject とする。
      3. Normative Optional
        ホストが Web ブラウザまたは ブロックレベル Function 宣言 (Web レガシー互換意味論) をサポートするなら:
        1. env 内の fn の束縛が未初期化なら:
          1. env.InitializeBinding(fn, fo) を実行。
        2. それ以外:
          1. Assert: dFunctionDeclaration である。
          2. env.SetMutableBinding(fn, fo, false) を実行。
      4. それ以外:
        1. env.InitializeBinding(fn, fo) を実行。
  4. unused を返す。

14.3 Declarations と Variable 文

14.3.1 Let および Const 宣言

Note

letconst 宣言は、現在実行中コンテキストの LexicalEnvironment にスコープを持つ変数を定義する。変数はその包含 Environment Record がインスタンス化された時に生成されるが、その LexicalBinding が評価されるまでいかなる方法でもアクセスできない。Initializer を伴う LexicalBinding により定義された変数は、その InitializerAssignmentExpression が評価されたときに値が割り当てられ、生成時ではない。let 宣言内で Initializer を持たない LexicalBinding によって定義された変数は、その LexicalBinding が評価されたとき undefined が割り当てられる。

構文 (Syntax)

LexicalDeclaration[In, Yield, Await] : LetOrConst BindingList[?In, ?Yield, ?Await] ; LetOrConst : let const BindingList[In, Yield, Await] : LexicalBinding[?In, ?Yield, ?Await] BindingList[?In, ?Yield, ?Await] , LexicalBinding[?In, ?Yield, ?Await] LexicalBinding[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]

14.3.1.1 静的意味論: 早期エラー

LexicalDeclaration : LetOrConst BindingList ;
  • BindingList の BoundNames に "let" が含まれるなら構文エラー。
  • BindingList の BoundNames に重複があるなら構文エラー。
LexicalBinding : BindingIdentifier Initializeropt

14.3.1.2 実行時意味論: 評価

LexicalDeclaration : LetOrConst BindingList ;
  1. BindingList の Evaluation を ? 付きで実行する。
  2. empty を返す。
BindingList : BindingList , LexicalBinding
  1. BindingList の Evaluation を ? 付きで実行。
  2. LexicalBinding の Evaluation を ? 付きで返す。
LexicalBinding : BindingIdentifier
  1. lhs を ! ResolveBinding(StringValue of BindingIdentifier) とする。
  2. InitializeReferencedBinding(lhs, undefined) を実行。
  3. empty を返す。
Note

静的意味論により、この形の LexicalBindingconst 宣言で現れないことが保証されている。

LexicalBinding : BindingIdentifier Initializer
  1. bindingIdBindingIdentifier の StringValue とする。
  2. lhs を ! ResolveBinding(bindingId) とする。
  3. IsAnonymousFunctionDefinition(Initializer) が true なら:
    1. valueInitializer の NamedEvaluation (引数 bindingId) を ? 付きで行った結果とする。
  4. それ以外:
    1. rhsInitializer の Evaluation を ? 付きで行った結果とする。
    2. value を ? GetValue(rhs) とする。
  5. InitializeReferencedBinding(lhs, value) を実行。
  6. empty を返す。
LexicalBinding : BindingPattern Initializer
  1. rhsInitializer の Evaluation を ? 付きで行った結果とする。
  2. value を ? GetValue(rhs) とする。
  3. env を実行中コンテキストの LexicalEnvironment とする。
  4. BindingPattern の BindingInitialization (引数 value, env) を ? 付きで返す。

14.3.2 Variable 文 (var 文)

Note

var 文は現在実行中コンテキストの VariableEnvironment にスコープを持つ変数を宣言する。Var 変数は包含 Environment Record のインスタンス化時に生成され、生成時に undefined へ初期化される。同一 VariableEnvironment のスコープ内で同じ BindingIdentifier が複数の VariableDeclaration に現れても、それらは単一の変数のみを定義する。Initializer を持つ VariableDeclaration により定義された変数は、生成時ではなくその VariableDeclaration が実行される際に InitializerAssignmentExpression の値が割り当てられる。

構文 (Syntax)

VariableStatement[Yield, Await] : var VariableDeclarationList[+In, ?Yield, ?Await] ; VariableDeclarationList[In, Yield, Await] : VariableDeclaration[?In, ?Yield, ?Await] VariableDeclarationList[?In, ?Yield, ?Await] , VariableDeclaration[?In, ?Yield, ?Await] VariableDeclaration[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]

14.3.2.1 実行時意味論: 評価

VariableStatement : var VariableDeclarationList ;
  1. VariableDeclarationList の Evaluation を ? 付きで実行。
  2. empty を返す。
VariableDeclarationList : VariableDeclarationList , VariableDeclaration
  1. VariableDeclarationList の Evaluation を ? 付きで実行。
  2. VariableDeclaration の Evaluation を ? 付きで返す。
VariableDeclaration : BindingIdentifier
  1. empty を返す。
VariableDeclaration : BindingIdentifier Initializer
  1. bindingIdBindingIdentifier の StringValue とする。
  2. lhs を ? ResolveBinding(bindingId) とする。
  3. IsAnonymousFunctionDefinition(Initializer) が true なら:
    1. valueInitializer の NamedEvaluation (引数 bindingId) を ? 付きで行った結果とする。
  4. それ以外:
    1. rhsInitializer の Evaluation を ? 付きで行った結果とする。
    2. value を ? GetValue(rhs) とする。
  5. PutValue(lhs, value) を実行。
  6. empty を返す。
Note

VariableDeclaration が with 文内にネストしており、その BindingIdentifier がその with 文の Object Environment Record のバインディングオブジェクトのプロパティ名と同一である場合、5 のステップは Identifier の VariableEnvironment の束縛ではなくそのプロパティに value を代入する。

VariableDeclaration : BindingPattern Initializer
  1. rhsInitializer の Evaluation を ? 付きで行った結果とする。
  2. rVal を ? GetValue(rhs) とする。
  3. BindingPattern の BindingInitialization (引数 rVal, undefined) を ? 付きで返す。

14.3.3 分割代入用束縛パターン (Destructuring Binding Patterns)

構文 (Syntax)

BindingPattern[Yield, Await] : ObjectBindingPattern[?Yield, ?Await] ArrayBindingPattern[?Yield, ?Await] ObjectBindingPattern[Yield, Await] : { } { BindingRestProperty[?Yield, ?Await] } { BindingPropertyList[?Yield, ?Await] } { BindingPropertyList[?Yield, ?Await] , BindingRestProperty[?Yield, ?Await]opt } ArrayBindingPattern[Yield, Await] : [ Elisionopt BindingRestElement[?Yield, ?Await]opt ] [ BindingElementList[?Yield, ?Await] ] [ BindingElementList[?Yield, ?Await] , Elisionopt BindingRestElement[?Yield, ?Await]opt ] BindingRestProperty[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] BindingPropertyList[Yield, Await] : BindingProperty[?Yield, ?Await] BindingPropertyList[?Yield, ?Await] , BindingProperty[?Yield, ?Await] BindingElementList[Yield, Await] : BindingElisionElement[?Yield, ?Await] BindingElementList[?Yield, ?Await] , BindingElisionElement[?Yield, ?Await] BindingElisionElement[Yield, Await] : Elisionopt BindingElement[?Yield, ?Await] BindingProperty[Yield, Await] : SingleNameBinding[?Yield, ?Await] PropertyName[?Yield, ?Await] : BindingElement[?Yield, ?Await] BindingElement[Yield, Await] : SingleNameBinding[?Yield, ?Await] BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt SingleNameBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt BindingRestElement[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] ... BindingPattern[?Yield, ?Await]

14.3.3.1 実行時意味論: PropertyBindingInitialization : プロパティキーの List を含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 束縛される全プロパティ名のリストを収集する。 It is defined piecewise over the following productions:

BindingPropertyList : BindingPropertyList , BindingProperty
  1. boundNamesBindingPropertyList の PropertyBindingInitialization(value, environment) を ? 付きで行った結果とする。
  2. nextNamesBindingProperty の PropertyBindingInitialization(value, environment) を ? 付きで行った結果とする。
  3. boundNamesnextNames のリスト連結を返す。
BindingProperty : SingleNameBinding
  1. nameSingleNameBinding の BoundNames の唯一の要素とする。
  2. SingleNameBinding の KeyedBindingInitialization(value, environment, name) を ? 付きで実行。
  3. « name » を返す。
BindingProperty : PropertyName : BindingElement
  1. PPropertyName の Evaluation を ? 付きで行った結果とする。
  2. BindingElement の KeyedBindingInitialization(value, environment, P) を ? 付きで実行。
  3. « P » を返す。

14.3.3.2 実行時意味論: RestBindingInitialization : unused を含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

BindingRestProperty : ... BindingIdentifier
  1. lhs を ? ResolveBinding(StringValue of BindingIdentifier, environment) とする。
  2. restObjOrdinaryObjectCreate(%Object.prototype%) とする。
  3. CopyDataProperties(restObj, value, excludedNames) を実行。
  4. environmentundefined なら ? PutValue(lhs, restObj) を返す。
  5. InitializeReferencedBinding(lhs, restObj) を返す。

14.3.3.3 実行時意味論: KeyedBindingInitialization : unused を含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

environmentundefined を渡すのは PutValue を用いて初期化値を代入すべきであることを示す。その例は非 strict 関数の仮引数リストなど。そこでは複数同名パラメータの可能性に対応するため事前初期化が行われる。

It is defined piecewise over the following productions:

BindingElement : BindingPattern Initializeropt
  1. v を ? GetV(value, propertyName) とする。
  2. Initializer が存在し vundefined なら:
    1. defaultValueInitializer の Evaluation を ? 付きで行った結果とする。
    2. v を ? GetValue(defaultValue) に設定。
  3. BindingPattern の BindingInitialization(v, environment) を ? 付きで返す。
SingleNameBinding : BindingIdentifier Initializeropt
  1. bindingIdBindingIdentifier の StringValue とする。
  2. lhs を ? ResolveBinding(bindingId, environment) とする。
  3. v を ? GetV(value, propertyName) とする。
  4. Initializer が存在し vundefined なら:
    1. IsAnonymousFunctionDefinition(Initializer) が true なら:
      1. vInitializer の NamedEvaluation (引数 bindingId) を ? 付きで行った結果とする。
    2. それ以外:
      1. defaultValueInitializer の Evaluation を ? 付きで行った結果とする。
      2. v を ? GetValue(defaultValue) に設定。
  5. environmentundefined なら ? PutValue(lhs, v) を返す。
  6. InitializeReferencedBinding(lhs, v) を返す。

14.4 Empty 文 (Empty Statement)

構文 (Syntax)

EmptyStatement : ;

14.4.1 実行時意味論: 評価

EmptyStatement : ;
  1. empty を返す。

14.5 Expression 文 (Expression Statement)

構文 (Syntax)

ExpressionStatement[Yield, Await] : [lookahead ∉ { {, function, async [no LineTerminator here] function, class, let [ }] Expression[+In, ?Yield, ?Await] ; Note

ExpressionStatement は U+007B LEFT CURLY BRACKET で始まれない。これは Block との曖昧さを避けるためである。function または class で始めることもできない。これは FunctionDeclaration, GeneratorDeclaration, ClassDeclaration との曖昧さを避けるためである。async function で始めることは AsyncFunctionDeclaration または AsyncGeneratorDeclaration との曖昧さを避けるため禁止される。let [ の 2 トークン列で始めることは、最初の LexicalBindingArrayBindingPattern である let LexicalDeclaration との曖昧さを避けるため禁止される。

14.5.1 実行時意味論: 評価

ExpressionStatement : Expression ;
  1. exprRefExpression の Evaluation を ? 付きで行った結果とする。
  2. GetValue(exprRef) を返す。

14.6 if

構文 (Syntax)

IfStatement[Yield, Await, Return] : if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] else Statement[?Yield, ?Await, ?Return] if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [lookahead ≠ else] Note
[lookahead ≠ else] 制約は古典的な「dangling else」問題を通常の方法で解決する。すなわち曖昧な場合、else は最も内側の if に関連付けられる。

14.6.1 静的意味論: 早期エラー

IfStatement : if ( Expression ) Statement else Statement
  • 最初の Statement について IsLabelledFunction が true なら構文エラー。
  • 二番目の Statement について IsLabelledFunction が true なら構文エラー。
IfStatement : if ( Expression ) Statement
  • Statement について IsLabelledFunction が true なら構文エラー。
Note

B.3.1 で規定される拡張が実装されている場合にのみこの規則を適用する必要がある。

14.6.2 実行時意味論: 評価

IfStatement : if ( Expression ) Statement else Statement
  1. exprRefExpression の Evaluation を ? 付きで行った結果とする。
  2. exprValueToBoolean(? GetValue(exprRef)) とする。
  3. exprValuetrue なら:
    1. stmtCompletion を 最初の Statement の Evaluation の Completion とする。
  4. それ以外:
    1. stmtCompletion を 二番目の Statement の Evaluation の Completion とする。
  5. UpdateEmpty(stmtCompletion, undefined) を返す。
IfStatement : if ( Expression ) Statement
  1. exprRefExpression の Evaluation を ? 付きで行った結果とする。
  2. exprValueToBoolean(? GetValue(exprRef)) とする。
  3. exprValuefalse なら:
    1. undefined を返す。
  4. それ以外:
    1. stmtCompletionStatement の Evaluation の Completion とする。
    2. UpdateEmpty(stmtCompletion, undefined) を返す。

14.7 反復文 (Iteration Statements)

構文 (Syntax)

IterationStatement[Yield, Await, Return] : DoWhileStatement[?Yield, ?Await, ?Return] WhileStatement[?Yield, ?Await, ?Return] ForStatement[?Yield, ?Await, ?Return] ForInOfStatement[?Yield, ?Await, ?Return]

14.7.1 意味論 (Semantics)

14.7.1.1 LoopContinues ( completion, labelSet )

The abstract operation LoopContinues takes arguments completion (a Completion Record) and labelSet (a List of Strings) and returns a Boolean. It performs the following steps when called:

  1. completionnormal completion なら true を返す。
  2. completioncontinue completion でないなら false を返す。
  3. completion.[[Target]]empty なら true を返す。
  4. labelSetcompletion.[[Target]] を含むなら true を返す。
  5. false を返す。
Note

IterationStatementStatement 部内では ContinueStatement により新しい反復を開始できる。

14.7.1.2 実行時意味論: LoopEvaluation : ECMAScript 言語値を含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

IterationStatement : DoWhileStatement
  1. DoWhileStatement の DoWhileLoopEvaluation(labelSet) を ? 付きで返す。
IterationStatement : WhileStatement
  1. WhileStatement の WhileLoopEvaluation(labelSet) を ? 付きで返す。
IterationStatement : ForStatement
  1. ForStatement の ForLoopEvaluation(labelSet) を ? 付きで返す。
IterationStatement : ForInOfStatement
  1. ForInOfStatement の ForIn/OfLoopEvaluation(labelSet) を ? 付きで返す。

14.7.2 do-while

構文 (Syntax)

DoWhileStatement[Yield, Await, Return] : do Statement[?Yield, ?Await, ?Return] while ( Expression[+In, ?Yield, ?Await] ) ;

14.7.2.1 静的意味論: 早期エラー

DoWhileStatement : do Statement while ( Expression ) ;
  • Statement について IsLabelledFunction が true なら構文エラー。
Note

B.3.1 で規定される拡張が実装されている場合にのみこの規則を適用する。

14.7.2.2 実行時意味論: DoWhileLoopEvaluation : ECMAScript 言語値を含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

DoWhileStatement : do Statement while ( Expression ) ;
  1. Vundefined とする。
  2. 繰り返し:
    1. stmtResultStatement の Evaluation の Completion とする。
    2. LoopContinues(stmtResult, labelSet) が false なら ? UpdateEmpty(stmtResult, V) を返す。
    3. stmtResult.[[Value]]empty でなければ VstmtResult.[[Value]] に設定。
    4. exprRefExpression の Evaluation を ? 付きで行った結果とする。
    5. exprValue を ? GetValue(exprRef) とする。
    6. ToBoolean(exprValue) が false なら V を返す。

14.7.3 while

構文 (Syntax)

WhileStatement[Yield, Await, Return] : while ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return]

14.7.3.1 静的意味論: 早期エラー

WhileStatement : while ( Expression ) Statement
  • Statement について IsLabelledFunction が true なら構文エラー。
Note

B.3.1 の拡張が実装されている場合のみ適用。

14.7.3.2 実行時意味論: WhileLoopEvaluation : ECMAScript 言語値を含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

WhileStatement : while ( Expression ) Statement
  1. Vundefined とする。
  2. 繰り返し:
    1. exprRefExpression の Evaluation を ? 付きで行った結果とする。
    2. exprValue を ? GetValue(exprRef) とする。
    3. ToBoolean(exprValue) が false なら V を返す。
    4. stmtResultStatement の Evaluation の Completion とする。
    5. LoopContinues(stmtResult, labelSet) が false なら ? UpdateEmpty(stmtResult, V) を返す。
    6. stmtResult.[[Value]]empty でなければ VstmtResult.[[Value]] に設定。

14.7.4 for

構文 (Syntax)

ForStatement[Yield, Await, Return] : for ( [lookahead ≠ let [] Expression[~In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] for ( var VariableDeclarationList[~In, ?Yield, ?Await] ; Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] for ( LexicalDeclaration[~In, ?Yield, ?Await] Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return]

14.7.4.1 静的意味論: 早期エラー

ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  • Statement について IsLabelledFunction が true なら構文エラー。
Note

B.3.1 の拡張が実装されている場合のみ適用。

ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement

14.7.4.2 実行時意味論: ForLoopEvaluation : ECMAScript 言語値を含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
  1. 最初の Expression が存在するなら:
    1. exprRef をその Evaluation を ? 付きで行った結果とする。
    2. GetValue(exprRef) を実行。
  2. 二番目の Expression が存在するなら test をそれに、存在しなければ empty とする。
  3. 三番目の Expression が存在するなら increment をそれに、存在しなければ empty とする。
  4. ForBodyEvaluation(test, increment, Statement, « », labelSet) を ? 付きで返す。
ForStatement : for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
  1. VariableDeclarationList の Evaluation を ? 付きで実行。
  2. 最初の Expression が存在するなら test をそれに、存在しなければ empty
  3. 二番目の Expression が存在するなら increment をそれに、存在しなければ empty
  4. ForBodyEvaluation(test, increment, Statement, « », labelSet) を ? 付きで返す。
ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. oldEnv を現在実行中コンテキストの LexicalEnvironment とする。
  2. loopEnvNewDeclarativeEnvironment(oldEnv) とする。
  3. isConstLexicalDeclaration の IsConstantDeclaration とする。
  4. boundNamesLexicalDeclaration の BoundNames とする。
  5. boundNames の各 dn について:
    1. isConsttrue なら:
      1. loopEnv.CreateImmutableBinding(dn, true) を実行。
    2. それ以外:
      1. loopEnv.CreateMutableBinding(dn, false) を実行。
  6. 実行中コンテキストの LexicalEnvironment を loopEnv に設定。
  7. forDclLexicalDeclaration の Evaluation の Completion とする。
  8. forDclabrupt completion なら:
    1. 実行中コンテキストの LexicalEnvironment を oldEnv に戻す。
    2. forDcl を返す。
  9. isConstfalse なら perIterationLetsboundNames、そうでなければ新しい空 List とする。
  10. 最初の Expression が存在するなら test をそれに、存在しなければ empty
  11. 二番目の Expression が存在するなら increment をそれに、存在しなければ empty
  12. bodyResultForBodyEvaluation(test, increment, Statement, perIterationLets, labelSet) の Completion とする。
  13. 実行中コンテキストの LexicalEnvironment を oldEnv に戻す。
  14. bodyResult を返す。

14.7.4.3 ForBodyEvaluation ( test, increment, stmt, perIterationBindings, labelSet )

The abstract operation ForBodyEvaluation takes arguments test (an Expression Parse Node or empty), increment (an Expression Parse Node or empty), stmt (a Statement Parse Node), perIterationBindings (a List of Strings), and labelSet (a List of Strings) and returns ECMAScript 言語値を含む normal completion または abrupt completion. It performs the following steps when called:

  1. Vundefined とする。
  2. CreatePerIterationEnvironment(perIterationBindings) を実行。
  3. 繰り返し:
    1. testempty でないなら:
      1. testReftest の Evaluation を ? 付きで行った結果とする。
      2. testValue を ? GetValue(testRef) とする。
      3. ToBoolean(testValue) が false なら V を返す。
    2. resultstmt の Evaluation の Completion とする。
    3. LoopContinues(result, labelSet) が false なら ? UpdateEmpty(result, V) を返す。
    4. result.[[Value]]empty でなければ Vresult.[[Value]] に設定。
    5. CreatePerIterationEnvironment(perIterationBindings) を実行。
    6. incrementempty でないなら:
      1. incRefincrement の Evaluation を ? 付きで行った結果とする。
      2. GetValue(incRef) を実行。

14.7.4.4 CreatePerIterationEnvironment ( perIterationBindings )

The abstract operation CreatePerIterationEnvironment takes argument perIterationBindings (a List of Strings) and returns unused を含む normal completion または throw completion. It performs the following steps when called:

  1. perIterationBindings が要素を持つなら:
    1. lastIterationEnv を現在実行中コンテキストの LexicalEnvironment とする。
    2. outerlastIterationEnv.[[OuterEnv]] とする。
    3. Assert: outernull ではない。
    4. thisIterationEnvNewDeclarativeEnvironment(outer) とする。
    5. perIterationBindings の各 bn について:
      1. thisIterationEnv.CreateMutableBinding(bn, false) を実行。
      2. lastValue を ? lastIterationEnv.GetBindingValue(bn, true) とする。
      3. thisIterationEnv.InitializeBinding(bn, lastValue) を実行。
    6. 実行中コンテキストの LexicalEnvironment を thisIterationEnv に設定。
  2. unused を返す。

14.7.5 for-in, for-of, for-await-of

構文 (Syntax)

ForInOfStatement[Yield, Await, Return] : for ( [lookahead ≠ let [] LeftHandSideExpression[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( ForDeclaration[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( [lookahead ∉ { let, async of }] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( ForDeclaration[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( [lookahead ≠ let] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( var ForBinding[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( ForDeclaration[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] ForDeclaration[Yield, Await] : LetOrConst ForBinding[?Yield, ?Await] ForBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] BindingPattern[?Yield, ?Await] Note

この節は 付録 B.3.5 により拡張される。

14.7.5.1 静的意味論: 早期エラー

ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( var ForBinding in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  • Statement について IsLabelledFunction が true なら構文エラー。
Note

B.3.1 の拡張が実装されている場合のみ適用。

ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement ForInOfStatement : for ( ForDeclaration in Expression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  • ForDeclaration の BoundNames に "let" が含まれるなら構文エラー。
  • ForDeclaration の BoundNames の任意要素が Statement の VarDeclaredNames にも現れるなら構文エラー。
  • ForDeclaration の BoundNames に重複があるなら構文エラー。

14.7.5.2 静的意味論: IsDestructuring : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

MemberExpression : PrimaryExpression
  1. PrimaryExpressionObjectLiteral または ArrayLiteral なら true を返す。
  2. false を返す。
MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName MemberExpression TemplateLiteral SuperProperty MetaProperty new MemberExpression Arguments MemberExpression . PrivateIdentifier NewExpression : new NewExpression LeftHandSideExpression : CallExpression OptionalExpression
  1. false を返す。
ForDeclaration : LetOrConst ForBinding
  1. ForBinding の IsDestructuring を返す。
ForBinding : BindingIdentifier
  1. false を返す。
ForBinding : BindingPattern
  1. true を返す。
Note

この節は 付録 B.3.5 により拡張される。

14.7.5.3 実行時意味論: ForDeclarationBindingInitialization : unused を含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

environmentundefined を渡すのは PutValue による代入を用いるべきことを示す。これは var 文や一部非 strict 関数(10.2.11 参照)の仮引数リストの場合で、これらでは初期化子評価前にレキシカル束縛がホイストされ事前初期化される。

It is defined piecewise over the following productions:

ForDeclaration : LetOrConst ForBinding
  1. ForBinding の BindingInitialization(value, environment) を ? 付きで返す。

14.7.5.4 実行時意味論: ForDeclarationBindingInstantiation : unused

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ForDeclaration : LetOrConst ForBinding
  1. ForBinding の BoundNames の各 name について:
    1. LetOrConst の IsConstantDeclaration が true なら:
      1. environment.CreateImmutableBinding(name, true) を実行。
    2. それ以外:
      1. environment.CreateMutableBinding(name, false) を実行。
  2. unused を返す。

14.7.5.5 実行時意味論: ForInOfLoopEvaluation : ECMAScript 言語値を含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(« », Expression, enumerate) とする。
  2. ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, keyResult, enumerate, assignment, labelSet) を返す。
ForInOfStatement : for ( var ForBinding in Expression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(« », Expression, enumerate) とする。
  2. ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult, enumerate, var-binding, labelSet) を返す。
ForInOfStatement : for ( ForDeclaration in Expression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(BoundNames of ForDeclaration, Expression, enumerate) とする。
  2. ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, enumerate, lexical-binding, labelSet) を返す。
ForInOfStatement : for ( LeftHandSideExpression of AssignmentExpression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(« », AssignmentExpression, iterate) とする。
  2. ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, keyResult, iterate, assignment, labelSet) を返す。
ForInOfStatement : for ( var ForBinding of AssignmentExpression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(« », AssignmentExpression, iterate) とする。
  2. ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult, iterate, var-binding, labelSet) を返す。
ForInOfStatement : for ( ForDeclaration of AssignmentExpression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(BoundNames of ForDeclaration, AssignmentExpression, iterate) とする。
  2. ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, iterate, lexical-binding, labelSet) を返す。
ForInOfStatement : for await ( LeftHandSideExpression of AssignmentExpression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(« », AssignmentExpression, async-iterate) とする。
  2. ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, keyResult, iterate, assignment, labelSet, async) を返す。
ForInOfStatement : for await ( var ForBinding of AssignmentExpression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(« », AssignmentExpression, async-iterate) とする。
  2. ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult, iterate, var-binding, labelSet, async) を返す。
ForInOfStatement : for await ( ForDeclaration of AssignmentExpression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(BoundNames of ForDeclaration, AssignmentExpression, async-iterate) とする。
  2. ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, iterate, lexical-binding, labelSet, async) を返す。
Note

この節は 付録 B.3.5 により拡張される。

14.7.5.6 ForIn/OfHeadEvaluation ( uninitializedBoundNames, expr, iterationKind )

The abstract operation ForIn/OfHeadEvaluation takes arguments uninitializedBoundNames (a List of Strings), expr (an Expression Parse Node or an AssignmentExpression Parse Node), and iterationKind (enumerate, iterate, or async-iterate) and returns Iterator Record を含む normal completion または abrupt completion. It performs the following steps when called:

  1. oldEnv を現在実行中コンテキストの LexicalEnvironment とする。
  2. uninitializedBoundNames が空でないなら:
    1. Assert: 重複はない。
    2. newEnvNewDeclarativeEnvironment(oldEnv) とする。
    3. uninitializedBoundNames の各 String name について:
      1. newEnv.CreateMutableBinding(name, false) を実行。
    4. 実行中コンテキストの LexicalEnvironment を newEnv に設定。
  3. exprRefexpr の Evaluation の Completion とする。
  4. 実行中コンテキストの LexicalEnvironment を oldEnv に戻す。
  5. exprValue を ? GetValue(? exprRef) とする。
  6. iterationKindenumerate なら:
    1. exprValueundefined または null なら:
      1. Completion Record { [[Type]]: break, [[Value]]: empty, [[Target]]: empty } を返す。
    2. obj を ! ToObject(exprValue) とする。
    3. iteratorEnumerateObjectProperties(obj) とする。
    4. nextMethod を ! GetV(iterator, "next") とする。
    5. Iterator Record { [[Iterator]]: iterator, [[NextMethod]]: nextMethod, [[Done]]: false } を返す。
  7. それ以外:
    1. Assert: iterationKinditerate 又は async-iterate
    2. iterationKindasync-iterate なら iteratorKindasync とする。そうでなければ sync
    3. GetIterator(exprValue, iteratorKind) を返す。

14.7.5.7 ForIn/OfBodyEvaluation ( lhs, stmt, iteratorRecord, iterationKind, lhsKind, labelSet [ , iteratorKind ] )

The abstract operation ForIn/OfBodyEvaluation takes arguments lhs (a Parse Node), stmt (a Statement Parse Node), iteratorRecord (an Iterator Record), iterationKind (enumerate or iterate), lhsKind (assignment, var-binding, or lexical-binding), and labelSet (a List of Strings) and optional argument iteratorKind (sync or async) and returns ECMAScript 言語値を含む normal completion または abrupt completion. It performs the following steps when called:

  1. iteratorKind が与えられていなければ sync とする。
  2. oldEnv を現在実行中コンテキストの LexicalEnvironment とする。
  3. Vundefined とする。
  4. destructuring を IsDestructuring of lhs とする。
  5. destructuringtrue かつ lhsKindassignment なら:
    1. Assert: lhsLeftHandSideExpression
    2. assignmentPatternlhs が覆う AssignmentPattern とする。
  6. 繰り返し:
    1. nextResult を ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]) とする。
    2. iteratorKindasync なら nextResult を ? Await(nextResult) とする。
    3. nextResult が Object でなければ TypeError を throw。
    4. done を ? IteratorComplete(nextResult) とする。
    5. donetrue なら V を返す。
    6. nextValue を ? IteratorValue(nextResult) とする。
    7. lhsKindassignment または var-binding の場合:
      1. destructuringtrue なら:
        1. lhsKindassignment なら:
          1. status を DestructuringAssignmentEvaluation of assignmentPattern (nextValue 引数) の Completion
        2. それ以外:
          1. Assert: lhsKindvar-binding
          2. Assert: lhsForBinding
          3. statusForBinding の BindingInitialization(nextValue, undefined) の Completion
      2. それ以外:
        1. lhsReflhs の Evaluation の Completion(繰り返し行われ得る)とする。
        2. lhsKindassignment かつ lhs の AssignmentTargetType が web-compat なら ReferenceError を throw。
        3. lhsRefabrupt completion なら:
          1. statuslhsRef とする。
        4. それ以外:
          1. statusCompletion(PutValue(lhsRef.[[Value]], nextValue)) とする。
    8. それ以外:
      1. Assert: lhsKindlexical-binding
      2. Assert: lhsForDeclaration
      3. iterationEnvNewDeclarativeEnvironment(oldEnv) とする。
      4. ForDeclarationBindingInstantiation of lhs (iterationEnv) を実行。
      5. 実行中コンテキストの LexicalEnvironment を iterationEnv に設定。
      6. destructuringtrue なら:
        1. status を ForDeclarationBindingInitialization of lhs (nextValue, iterationEnv) の Completion
      7. それ以外:
        1. Assert: lhs は単一名を束縛する。
        2. lhsNamelhs の BoundNames の唯一の要素とする。
        3. lhsRef を ! ResolveBinding(lhsName) とする。
        4. statusCompletion(InitializeReferencedBinding(lhsRef, nextValue)) とする。
    9. statusabrupt completion なら:
      1. 実行中コンテキストの LexicalEnvironment を oldEnv に戻す。
      2. iteratorKindasync なら ? AsyncIteratorClose(iteratorRecord, status) を返す。
      3. iterationKindenumerate なら:
        1. status を返す。
      4. それ以外:
        1. Assert: iterationKinditerate
        2. IteratorClose(iteratorRecord, status) を返す。
    10. resultStatement の Evaluation の Completion とする。
    11. 実行中コンテキストの LexicalEnvironment を oldEnv に戻す。
    12. LoopContinues(result, labelSet) が false なら:
      1. iterationKindenumerate なら:
        1. UpdateEmpty(result, V) を返す。
      2. それ以外:
        1. Assert: iterationKinditerate
        2. statusCompletion(UpdateEmpty(result, V)) とする。
        3. iteratorKindasync なら ? AsyncIteratorClose(iteratorRecord, status) を返す。
        4. IteratorClose(iteratorRecord, status) を返す。
    13. result.[[Value]]empty でなければ Vresult.[[Value]] に設定。

14.7.5.8 実行時意味論: 評価

BindingIdentifier : Identifier yield await
  1. bindingIdBindingIdentifier の StringValue とする。
  2. ResolveBinding(bindingId) を返す。

14.7.5.9 EnumerateObjectProperties ( O )

The abstract operation EnumerateObjectProperties takes argument O (an Object) and returns 反復子 (iterator object). It performs the following steps when called:

  1. O の列挙可能なプロパティの String キーを反復する next メソッドを持つ反復子オブジェクトを返す。この反復子は ECMAScript コードから直接アクセスできない。列挙の機構と順序は下記規則に従う限り規定されない。

反復子の throw および return メソッドは null で呼ばれない。next メソッドはプロパティキーを返すべきか判定する。返されるキーは Symbol を含まない。列挙中にターゲットオブジェクトのプロパティが削除されることがある。削除されたプロパティは無視される。列挙中に新規プロパティが追加されても処理される保証はない。いかなる列挙でも同じプロパティ名は高々一度だけ返される。

ターゲットオブジェクトの列挙はそのプロトタイプ、さらにそのプロトタイプ…と再帰的に行う。ただし既に next により処理済みの名前と同名のプロトタイプ上のプロパティは処理しない。処理済み判定に [[Enumerable]] 属性値は考慮しない。プロトタイプオブジェクトの列挙可能プロパティ名取得には EnumerateObjectProperties をそのプロトタイプに対し呼び出す。ターゲットオブジェクトの own プロパティキー[[OwnPropertyKeys]] 内部メソッド呼出しで取得し、属性は [[GetOwnProperty]] 内部メソッド呼出しで取得する。

加えて O およびそのプロトタイプ連鎖上のいずれも Proxy, TypedArray, module namespace, 実装提供の exotic object でないなら、以下のいずれかが起こるまで反復子は CreateForInIterator(O) によるものと同様に振る舞わねばならない:

  • O またはプロトタイプ連鎖上のオブジェクトの [[Prototype]] 値が変化
  • O または連鎖上オブジェクトからプロパティが削除
  • O のプロトタイプ連鎖上のオブジェクトにプロパティが追加
  • O または連鎖上オブジェクトのプロパティの [[Enumerable]] が変化
Note 1

実装は 14.7.5.10.2.1 のアルゴリズムを直接実装する必要はない。上記制約が破られない限り挙動が一致する任意実装を選べる。

以下はこれら規則に従う ECMAScript generator function の参考定義である:

function* EnumerateObjectProperties(obj) {
  const visited = new Set();
  for (const key of Reflect.ownKeys(obj)) {
    if (typeof key === "symbol") continue;
    const desc = Reflect.getOwnPropertyDescriptor(obj, key);
    if (desc) {
      visited.add(key);
      if (desc.enumerable) yield key;
    }
  }
  const proto = Reflect.getPrototypeOf(obj);
  if (proto === null) return;
  for (const protoKey of EnumerateObjectProperties(proto)) {
    if (!visited.has(protoKey)) yield protoKey;
  }
}
Note 2
CreateForInIterator との一致が不要な exotic object のリストは、歴史的に挙動差異があり他については一致していたため選択された。

14.7.5.10 For-In 反復子オブジェクト

For-In Iterator は特定オブジェクト上の特定の列挙を表すオブジェクトである。ECMAScript コードから直接アクセスされず、EnumerateObjectProperties の挙動説明のためのみ存在する。

14.7.5.10.1 CreateForInIterator ( object )

The abstract operation CreateForInIterator takes argument object (an Object) and returns For-In Iterator. object の own および継承された列挙可能な文字列プロパティを特定順序で反復する For-In Iterator オブジェクトを生成する。 It performs the following steps when called:

  1. iteratorOrdinaryObjectCreate(%ForInIteratorPrototype%, « [[Object]], [[ObjectWasVisited]], [[VisitedKeys]], [[RemainingKeys]] ») とする。
  2. iterator.[[Object]]object に設定。
  3. iterator.[[ObjectWasVisited]]false に設定。
  4. iterator.[[VisitedKeys]] を空 List に設定。
  5. iterator.[[RemainingKeys]] を空 List に設定。
  6. iterator を返す。

14.7.5.10.2 %ForInIteratorPrototype% オブジェクト

%ForInIteratorPrototype% オブジェクト:

  • For-In Iterator オブジェクトが継承するプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]] 内部スロットの値は %Iterator.prototype%
  • ECMAScript コードから直接アクセスされない。
  • 以下のプロパティを持つ。

14.7.5.10.2.1 %ForInIteratorPrototype%.next ( )

  1. Othis 値とする。
  2. Assert: O は Object。
  3. Assert: OFor-In Iterator インスタンスの内部スロットを全て持つ (14.7.5.10.3)。
  4. objectO.[[Object]] とする。
  5. 繰り返し:
    1. O.[[ObjectWasVisited]]false なら:
      1. keys を ? object.[[OwnPropertyKeys]]() とする。
      2. keys の各 key について:
        1. key が String なら:
          1. O.[[RemainingKeys]]key を追加。
      3. O.[[ObjectWasVisited]]true に設定。
    2. O.[[RemainingKeys]] が空でない間の繰り返し:
      1. rO.[[RemainingKeys]] の先頭要素とする。
      2. 先頭要素を削除。
      3. O.[[VisitedKeys]]r を含まないなら:
        1. desc を ? object.[[GetOwnProperty]](r) とする。
        2. descundefined でなければ:
          1. O.[[VisitedKeys]]r を追加。
          2. desc.[[Enumerable]]true なら CreateIteratorResultObject(r, false) を返す。
    3. object を ? object.[[GetPrototypeOf]]() とする。
    4. O.[[Object]]object に設定。
    5. O.[[ObjectWasVisited]]false に設定。
    6. objectnull なら CreateIteratorResultObject(undefined, true) を返す。

14.7.5.10.3 For-In Iterator インスタンスのプロパティ

For-In Iterator インスタンスは %ForInIteratorPrototype% からプロパティを継承する通常オブジェクトであり、Table 36 に列挙する内部スロットで初期化される。

Table 36: For-In Iterator インスタンスの内部スロット
Internal Slot Type 説明 (Description)
[[Object]] an Object プロパティを列挙中のオブジェクト値。
[[ObjectWasVisited]] a Boolean 既に [[OwnPropertyKeys]] を呼び出したなら true、そうでなければ false
[[VisitedKeys]] a List of Strings これまでにこの反復子が出力した値。
[[RemainingKeys]] a List of Strings 現在のオブジェクトで未出力の値(プロトタイプ列挙前。プロトタイプが null でなければ)。

14.8 continue

構文 (Syntax)

ContinueStatement[Yield, Await] : continue ; continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ;

14.8.1 静的意味論: 早期エラー

ContinueStatement : continue ; continue LabelIdentifier ;
  • この ContinueStatement が(関数や static 初期化ブロック境界を越えずに)直接または間接的に IterationStatement 内にネストしていないなら構文エラー。

14.8.2 実行時意味論: 評価

ContinueStatement : continue ;
  1. Completion Record { [[Type]]: continue, [[Value]]: empty, [[Target]]: empty } を返す。
ContinueStatement : continue LabelIdentifier ;
  1. labelLabelIdentifier の StringValue とする。
  2. Completion Record { [[Type]]: continue, [[Value]]: empty, [[Target]]: label } を返す。

14.9 break

構文 (Syntax)

BreakStatement[Yield, Await] : break ; break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ;

14.9.1 静的意味論: 早期エラー

BreakStatement : break ;

14.9.2 実行時意味論: 評価

BreakStatement : break ;
  1. Completion Record { [[Type]]: break, [[Value]]: empty, [[Target]]: empty } を返す。
BreakStatement : break LabelIdentifier ;
  1. labelLabelIdentifier の StringValue とする。
  2. Completion Record { [[Type]]: break, [[Value]]: empty, [[Target]]: label } を返す。

14.10 return

構文 (Syntax)

ReturnStatement[Yield, Await] : return ; return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; Note

return 文は関数の実行を停止し、通常は呼出し元に値を返す。Expression が省略された場合戻り値は undefined。存在する場合その値を返す。try ブロック内など文脈によっては必ずしも呼出し元に値を返さない(finally で上書きされる等)。

14.10.1 実行時意味論: 評価

ReturnStatement : return ;
  1. ReturnCompletion(undefined) を返す。
ReturnStatement : return Expression ;
  1. exprRefExpression の Evaluation を ? 付きで行った結果とする。
  2. exprValue を ? GetValue(exprRef) とする。
  3. GetGeneratorKind() が async なら exprValue を ? Await(exprValue) に設定。
  4. ReturnCompletion(exprValue) を返す。
Legacy

14.11 with

Note 1

レガシー with 文の使用は新しい ECMAScript コードでは推奨されない。分割代入 など strict / 非 strict 両方で許容される代替を検討せよ。

構文 (Syntax)

WithStatement[Yield, Await, Return] : with ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] Note 2

with 文は計算されたオブジェクトの Object Environment Record を実行中コンテキストのレキシカル環境に追加し、この拡張環境で Statement を実行し、その後元の環境を復元する。

14.11.1 静的意味論: 早期エラー

WithStatement : with ( Expression ) Statement
  • IsStrict(this production) が true なら構文エラー。
  • Statement について IsLabelledFunction が true なら構文エラー。
Note

2 番目の規則は B.3.1 の拡張が実装される場合のみ適用。

14.11.2 実行時意味論: 評価

WithStatement : with ( Expression ) Statement
  1. valExpression の Evaluation を ? 付きで行った結果とする。
  2. obj を ? ToObject(? GetValue(val)) とする。
  3. oldEnv を実行中コンテキストの LexicalEnvironment とする。
  4. newEnvNewObjectEnvironment(obj, true, oldEnv) とする。
  5. 実行中コンテキストの LexicalEnvironment を newEnv に設定。
  6. CStatement の Evaluation の Completion とする。
  7. 実行中コンテキストの LexicalEnvironment を oldEnv に戻す。
  8. UpdateEmpty(C, undefined) を返す。
Note

埋め込まれた Statement をどのように抜けても(通常終了・abrupt completion・例外)LexicalEnvironment は常に元に戻る。

14.12 switch

構文 (Syntax)

SwitchStatement[Yield, Await, Return] : switch ( Expression[+In, ?Yield, ?Await] ) CaseBlock[?Yield, ?Await, ?Return] CaseBlock[Yield, Await, Return] : { CaseClauses[?Yield, ?Await, ?Return]opt } { CaseClauses[?Yield, ?Await, ?Return]opt DefaultClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return]opt } CaseClauses[Yield, Await, Return] : CaseClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return] CaseClause[?Yield, ?Await, ?Return] CaseClause[Yield, Await, Return] : case Expression[+In, ?Yield, ?Await] : StatementList[?Yield, ?Await, ?Return]opt DefaultClause[Yield, Await, Return] : default : StatementList[?Yield, ?Await, ?Return]opt

14.12.1 静的意味論: 早期エラー

SwitchStatement : switch ( Expression ) CaseBlock

14.12.2 実行時意味論: CaseBlockEvaluation : ECMAScript 言語値を含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

CaseBlock : { }
  1. undefined を返す。
CaseBlock : { CaseClauses }
  1. Vundefined とする。
  2. ACaseClauses 内の CaseClause 項目(ソース順)の List とする。
  3. foundfalse とする。
  4. CaseClause C について:
    1. foundfalse なら:
      1. found を ? CaseClauseIsSelected(C, input) に設定。
    2. foundtrue なら:
      1. RC の Evaluation の Completion とする。
      2. R.[[Value]]empty でなければ VR.[[Value]] に設定。
      3. Rabrupt completion なら ? UpdateEmpty(R, V) を返す。
  5. V を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. Vundefined とする。
  2. 最初の CaseClauses が存在するなら:
    1. A をその CaseClause 項目(ソース順)List とする。
  3. それ以外:
    1. A を空 List とする。
  4. foundfalse とする。
  5. A の各 CaseClause C について:
    1. foundfalse なら:
      1. found を ? CaseClauseIsSelected(C, input) に設定。
    2. foundtrue なら:
      1. RC の Evaluation の Completion とする。
      2. R.[[Value]]empty でなければ VR.[[Value]] に設定。
      3. Rabrupt completion なら ? UpdateEmpty(R, V) を返す。
  6. foundInBfalse とする。
  7. 二番目の CaseClauses が存在するなら:
    1. B をその CaseClause 項目(ソース順)List とする。
  8. それ以外:
    1. B を空 List とする。
  9. foundfalse なら:
    1. B の各 CaseClause C について:
      1. foundInBfalse なら:
        1. foundInB を ? CaseClauseIsSelected(C, input) に設定。
      2. foundInBtrue なら:
        1. RCaseClause C の Evaluation の Completion とする。
        2. R.[[Value]]empty でなければ VR.[[Value]] に設定。
        3. Rabrupt completion なら ? UpdateEmpty(R, V) を返す。
  10. foundInBtrue なら V を返す。
  11. defaultRDefaultClause の Evaluation の Completion とする。
  12. defaultR.[[Value]]empty でなければ VdefaultR.[[Value]] に設定。
  13. defaultRabrupt completion なら ? UpdateEmpty(defaultR, V) を返す。
  14. 注: ここから二番目の CaseClauses を再度全走査する。
  15. B の各 CaseClause C について:
    1. RCaseClause C の Evaluation の Completion とする。
    2. R.[[Value]]empty でなければ VR.[[Value]] に設定。
    3. Rabrupt completion なら ? UpdateEmpty(R, V) を返す。
  16. V を返す。

14.12.3 CaseClauseIsSelected ( C, input )

The abstract operation CaseClauseIsSelected takes arguments C (a CaseClause Parse Node) and input (an ECMAScript language value) and returns Boolean を含む normal completion または abrupt completion. Cinput にマッチするか判定する。 It performs the following steps when called:

  1. Assert: C CaseClause : case Expression : StatementListopt のインスタンス。
  2. exprRefCExpression の Evaluation を ? 付きで行った結果とする。
  3. clauseSelector を ? GetValue(exprRef) とする。
  4. IsStrictlyEqual(input, clauseSelector) を返す。
Note

この操作は CStatementList を実行しない。CaseBlock アルゴリズムは戻り値によりどの StatementList から実行開始するかを決定する。

14.12.4 実行時意味論: 評価

SwitchStatement : switch ( Expression ) CaseBlock
  1. exprRefExpression の Evaluation を ? 付きで行った結果とする。
  2. switchValue を ? GetValue(exprRef) とする。
  3. oldEnv を現在実行中コンテキストの LexicalEnvironment とする。
  4. blockEnvNewDeclarativeEnvironment(oldEnv) とする。
  5. BlockDeclarationInstantiation(CaseBlock, blockEnv) を実行。
  6. 実行中コンテキストの LexicalEnvironment を blockEnv に設定。
  7. R を CaseBlockEvaluation of CaseBlock (引数 switchValue) の Completion とする。
  8. 実行中コンテキストの LexicalEnvironment を oldEnv に戻す。
  9. R を返す。
Note

SwitchStatement をどのように抜けても LexicalEnvironment は常に元に戻る。

CaseClause : case Expression :
  1. empty を返す。
CaseClause : case Expression : StatementList
  1. StatementList の Evaluation を ? 付きで返す。
DefaultClause : default :
  1. empty を返す。
DefaultClause : default : StatementList
  1. StatementList の Evaluation を ? 付きで返す。

14.13 ラベル付き文 (Labelled Statements)

構文 (Syntax)

LabelledStatement[Yield, Await, Return] : LabelIdentifier[?Yield, ?Await] : LabelledItem[?Yield, ?Await, ?Return] LabelledItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] FunctionDeclaration[?Yield, ?Await, ~Default] Note

Statement はラベルで前置できる。ラベル付き文はラベル付き break / continue と組み合わせてのみ利用され、ECMAScript には goto はない。StatementLabelledStatement の一部となり再帰的にネスト可能。その導入されたラベル集合を「current label set」と呼ぶ。

14.13.1 静的意味論: 早期エラー

LabelledItem : FunctionDeclaration
  • この生成規則にマッチするソーステキストが存在する場合、そのソーステキストが非 strict コードでありホストラベル付き Function 宣言 をサポートする場合を除き構文エラー。

14.13.2 静的意味論: IsLabelledFunction ( stmt: a Statement Parse Node, ): Boolean

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. stmtLabelledStatement でなければ false を返す。
  2. itemstmtLabelledItem とする。
  3. item LabelledItem : FunctionDeclaration なら true を返す。
  4. subStmtitemStatement とする。
  5. IsLabelledFunction(subStmt) を返す。

14.13.3 実行時意味論: 評価

LabelledStatement : LabelIdentifier : LabelledItem
  1. この LabelledStatement の LabelledEvaluation (引数 « ») を ? 付きで返す。

14.13.4 実行時意味論: LabelledEvaluation : ECMAScript 言語値または empty を含む normal completion あるいは abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

BreakableStatement : IterationStatement
  1. stmtResult を LoopEvaluation of IterationStatement (labelSet) の Completion とする。
  2. stmtResultbreak completion なら:
    1. stmtResult.[[Target]]empty なら:
      1. stmtResult.[[Value]]empty なら stmtResultNormalCompletion(undefined) に設定。
      2. それ以外は NormalCompletion(stmtResult.[[Value]]) に設定。
  3. stmtResult を返す。
BreakableStatement : SwitchStatement
  1. stmtResultSwitchStatement の Evaluation の Completion とする。
  2. stmtResultbreak completion なら:
    1. stmtResult.[[Target]]empty なら:
      1. stmtResult.[[Value]]empty なら stmtResultNormalCompletion(undefined) に、そうでなければ NormalCompletion(stmtResult.[[Value]]) に設定。
  3. stmtResult を返す。
Note 1

BreakableStatement は無ラベル BreakStatement により脱出可能な文である。

LabelledStatement : LabelIdentifier : LabelledItem
  1. labelLabelIdentifier の StringValue とする。
  2. newLabelSetlabelSet と « label » のリスト連結とする。
  3. stmtResultLabelledItem の LabelledEvaluation(newLabelSet) の Completion とする。
  4. stmtResultbreak completion かつ stmtResult.[[Target]]label なら:
    1. stmtResultNormalCompletion(stmtResult.[[Value]]) に設定。
  5. stmtResult を返す。
LabelledItem : FunctionDeclaration
  1. FunctionDeclaration の Evaluation を ? 付きで返す。
Statement : BlockStatement VariableStatement EmptyStatement ExpressionStatement IfStatement ContinueStatement BreakStatement ReturnStatement WithStatement ThrowStatement TryStatement DebuggerStatement
  1. Statement の Evaluation を ? 付きで返す。
Note 2

Statement のうち LabelledEvaluation に特別な意味論を持つのは BreakableStatementLabelledStatement のみ。

14.14 throw

構文 (Syntax)

ThrowStatement[Yield, Await] : throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ;

14.14.1 実行時意味論: 評価

ThrowStatement : throw Expression ;
  1. exprRefExpression の Evaluation を ? 付きで行った結果とする。
  2. exprValue を ? GetValue(exprRef) とする。
  3. ThrowCompletion(exprValue) を返す。

14.15 try

構文 (Syntax)

TryStatement[Yield, Await, Return] : try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] Catch[Yield, Await, Return] : catch ( CatchParameter[?Yield, ?Await] ) Block[?Yield, ?Await, ?Return] catch Block[?Yield, ?Await, ?Return] Finally[Yield, Await, Return] : finally Block[?Yield, ?Await, ?Return] CatchParameter[Yield, Await] : BindingIdentifier[?Yield, ?Await] BindingPattern[?Yield, ?Await] Note

try 文は例外(実行時エラーや throw)が発生し得るコードブロックを囲む。catch 節は例外処理コードを提供し、捕捉時その CatchParameter に例外が束縛される。

14.15.1 静的意味論: 早期エラー

Catch : catch ( CatchParameter ) Block

14.15.2 実行時意味論: CatchClauseEvaluation : ECMAScript 言語値または empty を含む normal completion あるいは abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Catch : catch ( CatchParameter ) Block
  1. oldEnv を実行中コンテキストの LexicalEnvironment とする。
  2. catchEnvNewDeclarativeEnvironment(oldEnv) とする。
  3. CatchParameter の BoundNames の各 argName について:
    1. catchEnv.CreateMutableBinding(argName, false) を実行。
  4. 実行中コンテキストの LexicalEnvironment を catchEnv に設定。
  5. statusCatchParameter の BindingInitialization(thrownValue, catchEnv) の Completion とする。
  6. statusabrupt completion なら:
    1. LexicalEnvironment を oldEnv に戻す。
    2. status を返す。
  7. BBlock の Evaluation の Completion とする。
  8. LexicalEnvironment を oldEnv に戻す。
  9. B を返す。
Catch : catch Block
  1. Block の Evaluation を ? 付きで返す。
Note

Block をどのように抜けても LexicalEnvironment は常に元に復元される。

14.15.3 実行時意味論: 評価

TryStatement : try Block Catch
  1. BBlock の Evaluation の Completion とする。
  2. Bthrow completion なら C を CatchClauseEvaluation of Catch (B.[[Value]] 引数) の Completion、そうでなければ CB とする。
  3. UpdateEmpty(C, undefined) を返す。
TryStatement : try Block Finally
  1. BBlock の Evaluation の Completion とする。
  2. FFinally の Evaluation の Completion とする。
  3. Fnormal completion なら FB に設定。
  4. UpdateEmpty(F, undefined) を返す。
TryStatement : try Block Catch Finally
  1. BBlock の Evaluation の Completion とする。
  2. Bthrow completion なら C を CatchClauseEvaluation of Catch (B.[[Value]] 引数) の Completion、そうでなければ CB とする。
  3. FFinally の Evaluation の Completion とする。
  4. Fnormal completion なら FC に設定。
  5. UpdateEmpty(F, undefined) を返す。

14.16 debugger

構文 (Syntax)

DebuggerStatement : debugger ;

14.16.1 実行時意味論: 評価

Note

DebuggerStatement の評価は、デバッガ下で実行時にブレークポイントを発生させることを実装に許す。デバッガ非存在または非活性なら可視効果はない。

DebuggerStatement : debugger ;
  1. 実装定義のデバッグ機能が利用可能かつ有効なら:
    1. 実装定義のデバッグ動作を実行。
    2. 新しい実装定義 Completion Record を返す。
  2. それ以外:
    1. empty を返す。

15 ECMAScript 言語: 関数とクラス

Note

様々な ECMAScript 言語要素は ECMAScript 関数オブジェクト (10.2) を生成する。これらの関数の評価は、その [[Call]] 内部メソッド (10.2.1) の実行から開始される。

15.1 仮引数リスト (Parameter Lists)

構文 (Syntax)

UniqueFormalParameters[Yield, Await] : FormalParameters[?Yield, ?Await] FormalParameters[Yield, Await] : [empty] FunctionRestParameter[?Yield, ?Await] FormalParameterList[?Yield, ?Await] FormalParameterList[?Yield, ?Await] , FormalParameterList[?Yield, ?Await] , FunctionRestParameter[?Yield, ?Await] FormalParameterList[Yield, Await] : FormalParameter[?Yield, ?Await] FormalParameterList[?Yield, ?Await] , FormalParameter[?Yield, ?Await] FunctionRestParameter[Yield, Await] : BindingRestElement[?Yield, ?Await] FormalParameter[Yield, Await] : BindingElement[?Yield, ?Await]

15.1.1 静的意味論: 早期エラー (Early Errors)

UniqueFormalParameters : FormalParameters
  • FormalParameters の BoundNames に重複要素が含まれる場合は構文エラーである。
FormalParameters : FormalParameterList Note

同一の BindingIdentifierFormalParameterList 内に複数回出現することが許されるのは、パラメータリストが「単純 (simple)」であり、かつ strict mode コード内で定義されていない関数の場合に限られる。

15.1.2 静的意味論: ContainsExpression : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ObjectBindingPattern : { } { BindingRestProperty }
  1. false を返す。
ObjectBindingPattern : { BindingPropertyList , BindingRestProperty }
  1. BindingPropertyList の ContainsExpression を返す。
ArrayBindingPattern : [ Elisionopt ]
  1. false を返す。
ArrayBindingPattern : [ Elisionopt BindingRestElement ]
  1. BindingRestElement の ContainsExpression を返す。
ArrayBindingPattern : [ BindingElementList , Elisionopt ]
  1. BindingElementList の ContainsExpression を返す。
ArrayBindingPattern : [ BindingElementList , Elisionopt BindingRestElement ]
  1. hasBindingElementList の ContainsExpression とする。
  2. hastrue なら true を返す。
  3. BindingRestElement の ContainsExpression を返す。
BindingPropertyList : BindingPropertyList , BindingProperty
  1. hasBindingPropertyList の ContainsExpression とする。
  2. hastrue なら true を返す。
  3. BindingProperty の ContainsExpression を返す。
BindingElementList : BindingElementList , BindingElisionElement
  1. hasBindingElementList の ContainsExpression とする。
  2. hastrue なら true を返す。
  3. BindingElisionElement の ContainsExpression を返す。
BindingElisionElement : Elisionopt BindingElement
  1. BindingElement の ContainsExpression を返す。
BindingProperty : PropertyName : BindingElement
  1. hasPropertyName の IsComputedPropertyKey とする。
  2. hastrue なら true を返す。
  3. BindingElement の ContainsExpression を返す。
BindingElement : BindingPattern Initializer
  1. true を返す。
SingleNameBinding : BindingIdentifier
  1. false を返す。
SingleNameBinding : BindingIdentifier Initializer
  1. true を返す。
BindingRestElement : ... BindingIdentifier
  1. false を返す。
BindingRestElement : ... BindingPattern
  1. BindingPattern の ContainsExpression を返す。
FormalParameters : [empty]
  1. false を返す。
FormalParameters : FormalParameterList , FunctionRestParameter
  1. FormalParameterList の ContainsExpression が true なら true を返す。
  2. FunctionRestParameter の ContainsExpression を返す。
FormalParameterList : FormalParameterList , FormalParameter
  1. FormalParameterList の ContainsExpression が true なら true を返す。
  2. FormalParameter の ContainsExpression を返す。
ArrowParameters : BindingIdentifier
  1. false を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsCoverParenthesizedExpressionAndArrowParameterList が覆う ArrowFormalParameters とする。
  2. formals の ContainsExpression を返す。
AsyncArrowBindingIdentifier : BindingIdentifier
  1. false を返す。

15.1.3 静的意味論: IsSimpleParameterList : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

BindingElement : BindingPattern
  1. false を返す。
BindingElement : BindingPattern Initializer
  1. false を返す。
SingleNameBinding : BindingIdentifier
  1. true を返す。
SingleNameBinding : BindingIdentifier Initializer
  1. false を返す。
FormalParameters : [empty]
  1. true を返す。
FormalParameters : FunctionRestParameter
  1. false を返す。
FormalParameters : FormalParameterList , FunctionRestParameter
  1. false を返す。
FormalParameterList : FormalParameterList , FormalParameter
  1. FormalParameterList の IsSimpleParameterList が false なら false を返す。
  2. FormalParameter の IsSimpleParameterList を返す。
FormalParameter : BindingElement
  1. BindingElement の IsSimpleParameterList を返す。
ArrowParameters : BindingIdentifier
  1. true を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsCoverParenthesizedExpressionAndArrowParameterList が覆う ArrowFormalParameters とする。
  2. formals の IsSimpleParameterList を返す。
AsyncArrowBindingIdentifier : BindingIdentifier
  1. true を返す。
CoverCallExpressionAndAsyncArrowHead : MemberExpression Arguments
  1. headCoverCallExpressionAndAsyncArrowHead が覆う AsyncArrowHead とする。
  2. head の IsSimpleParameterList を返す。

15.1.4 静的意味論: HasInitializer : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

BindingElement : BindingPattern
  1. false を返す。
BindingElement : BindingPattern Initializer
  1. true を返す。
SingleNameBinding : BindingIdentifier
  1. false を返す。
SingleNameBinding : BindingIdentifier Initializer
  1. true を返す。
FormalParameterList : FormalParameterList , FormalParameter
  1. FormalParameterList の HasInitializer が true なら true を返す。
  2. FormalParameter の HasInitializer を返す。

15.1.5 静的意味論: ExpectedArgumentCount

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

FormalParameters : [empty] FunctionRestParameter
  1. 0 を返す。
FormalParameters : FormalParameterList , FunctionRestParameter
  1. FormalParameterList の ExpectedArgumentCount を返す。
Note

FormalParameterList の ExpectedArgumentCount は、rest parameter または初期化子を持つ最初の FormalParameter の左側にある FormalParameters の個数である。初期化子を持つ最初のパラメータの後に初期化子を持たないパラメータを置くことは許されるが、そのようなパラメータはデフォルト値 undefined の任意 (optional) パラメータと見なされる。

FormalParameterList : FormalParameter
  1. FormalParameter の HasInitializer が true なら 0 を返す。
  2. 1 を返す。
FormalParameterList : FormalParameterList , FormalParameter
  1. countFormalParameterList の ExpectedArgumentCount とする。
  2. FormalParameterList の HasInitializer が true または FormalParameter の HasInitializer が true なら count を返す。
  3. count + 1 を返す。
ArrowParameters : BindingIdentifier
  1. 1 を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsCoverParenthesizedExpressionAndArrowParameterList が覆う ArrowFormalParameters とする。
  2. formals の ExpectedArgumentCount を返す。
PropertySetParameterList : FormalParameter
  1. FormalParameter の HasInitializer が true なら 0 を返す。
  2. 1 を返す。
AsyncArrowBindingIdentifier : BindingIdentifier
  1. 1 を返す。

15.2 関数定義 (Function Definitions)

構文 (Syntax)

FunctionDeclaration[Yield, Await, Default] : function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } [+Default] function ( FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } FunctionExpression : function BindingIdentifier[~Yield, ~Await]opt ( FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } FunctionBody[Yield, Await] : FunctionStatementList[?Yield, ?Await] FunctionStatementList[Yield, Await] : StatementList[?Yield, ?Await, +Return]opt

15.2.1 静的意味論: 早期エラー (Early Errors)

FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody } function ( FormalParameters ) { FunctionBody } FunctionExpression : function BindingIdentifieropt ( FormalParameters ) { FunctionBody } Note

FunctionBody の LexicallyDeclaredNames には var 宣言や function 宣言で束縛された識別子は含まれない。

FunctionBody : FunctionStatementList
  • FunctionStatementList の LexicallyDeclaredNames に重複があれば構文エラー。
  • FunctionStatementList の LexicallyDeclaredNames の任意の要素が VarDeclaredNames にも現れるなら構文エラー。
  • ContainsDuplicateLabels of FunctionStatementList (引数 « ») が true なら構文エラー。
  • ContainsUndefinedBreakTarget of FunctionStatementList (引数 « ») が true なら構文エラー。
  • ContainsUndefinedContinueTarget of FunctionStatementList (引数 « » および « ») が true なら構文エラー。

15.2.2 静的意味論: FunctionBodyContainsUseStrict : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

FunctionBody : FunctionStatementList
  1. FunctionBody の Directive Prologue が Use Strict Directive を含むなら true、そうでなければ false を返す。

15.2.3 実行時意味論: EvaluateFunctionBody : return completion または throw completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

FunctionBody : FunctionStatementList
  1. FunctionDeclarationInstantiation(functionObject, argumentsList) を実行する。
  2. FunctionStatementList の Evaluation を実行する。
  3. 注: 前の手順が normal completion なら評価は FunctionStatementList 終端まで進み終了している。
  4. ReturnCompletion(undefined) を返す。

15.2.4 実行時意味論: InstantiateOrdinaryFunctionObject : ECMAScript 関数オブジェクト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody }
  1. nameBindingIdentifier の StringValue とする。
  2. sourceTextFunctionDeclaration にマッチしたソーステキストとする。
  3. FOrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, env, privateEnv) とする。
  4. SetFunctionName(F, name) を実行。
  5. MakeConstructor(F) を実行。
  6. F を返す。
FunctionDeclaration : function ( FormalParameters ) { FunctionBody }
  1. sourceTextFunctionDeclaration にマッチしたソーステキストとする。
  2. FOrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, env, privateEnv) とする。
  3. SetFunctionName(F, "default") を実行。
  4. MakeConstructor(F) を実行。
  5. F を返す。
Note

匿名の FunctionDeclarationexport default 宣言の一部としてのみ出現でき、その関数コードは常に strict mode である。

15.2.5 実行時意味論: InstantiateOrdinaryFunctionExpression : ECMAScript 関数オブジェクト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

FunctionExpression : function ( FormalParameters ) { FunctionBody }
  1. name が存在しなければ "" を代入。
  2. env を実行中コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  4. sourceTextFunctionExpression にマッチしたソーステキストとする。
  5. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, env, privateEnv) とする。
  6. SetFunctionName(closure, name) を実行。
  7. MakeConstructor(closure) を実行。
  8. closure を返す。
FunctionExpression : function BindingIdentifier ( FormalParameters ) { FunctionBody }
  1. Assert: name は存在しない。
  2. nameBindingIdentifier の StringValue に設定。
  3. outerEnv を実行中コンテキストの LexicalEnvironment とする。
  4. funcEnvNewDeclarativeEnvironment(outerEnv) とする。
  5. funcEnv.CreateImmutableBinding(name, false) を実行。
  6. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  7. sourceTextFunctionExpression にマッチしたソーステキストとする。
  8. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, funcEnv, privateEnv) とする。
  9. SetFunctionName(closure, name) を実行。
  10. MakeConstructor(closure) を実行。
  11. funcEnv.InitializeBinding(name, closure) を実行。
  12. closure を返す。
Note

FunctionExpression 内の BindingIdentifier はその FunctionBody 内から参照でき、再帰呼び出しを可能にする。しかし FunctionDeclaration と異なり、FunctionExpressionBindingIdentifier は外側のスコープから参照できず、外側スコープに影響を与えない。

15.2.6 実行時意味論: 評価 (Evaluation)

FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody }
  1. empty を返す。
Note 1 FunctionDeclaration : function ( FormalParameters ) { FunctionBody }
  1. empty を返す。
FunctionExpression : function BindingIdentifieropt ( FormalParameters ) { FunctionBody }
  1. InstantiateOrdinaryFunctionExpression of FunctionExpression を返す。
Note 2

FunctionDeclaration または FunctionExpression により定義された全ての関数には自動的に "prototype" プロパティが作成され、その関数がコンストラクタとして利用される可能性を持たせる。

FunctionStatementList : [empty]
  1. undefined を返す。

15.3 アロー関数定義 (Arrow Function Definitions)

構文 (Syntax)

ArrowFunction[In, Yield, Await] : ArrowParameters[?Yield, ?Await] [no LineTerminator here] => ConciseBody[?In] ArrowParameters[Yield, Await] : BindingIdentifier[?Yield, ?Await] CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] ConciseBody[In] : [lookahead ≠ {] ExpressionBody[?In, ~Await] { FunctionBody[~Yield, ~Await] } ExpressionBody[In, Await] : AssignmentExpression[?In, ~Yield, ?Await]

補助構文 (Supplemental Syntax)

生成規則
ArrowParameters[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
のインスタンスを処理するとき、CoverParenthesizedExpressionAndArrowParameterList の解釈は以下の文法で精密化される:

ArrowFormalParameters[Yield, Await] : ( UniqueFormalParameters[?Yield, ?Await] )

15.3.1 静的意味論: 早期エラー (Early Errors)

ArrowFunction : ArrowParameters => ConciseBody ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList

15.3.2 静的意味論: ConciseBodyContainsUseStrict : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ConciseBody : ExpressionBody
  1. false を返す。
ConciseBody : { FunctionBody }
  1. FunctionBodyContainsUseStrict of FunctionBody を返す。

15.3.3 実行時意味論: EvaluateConciseBody : return completion または throw completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ConciseBody : ExpressionBody
  1. FunctionDeclarationInstantiation(functionObject, argumentsList) を実行。
  2. ExpressionBody の Evaluation を ? 付きで返す。

15.3.4 実行時意味論: InstantiateArrowFunctionExpression : ECMAScript 関数オブジェクト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ArrowFunction : ArrowParameters => ConciseBody
  1. name が存在しなければ "" を代入。
  2. env を実行中コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  4. sourceTextArrowFunction にマッチしたソーステキストとする。
  5. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, ArrowParameters, ConciseBody, lexical-this, env, privateEnv) とする。
  6. SetFunctionName(closure, name) を実行。
  7. closure を返す。
Note

ArrowFunctionarguments, super, this, new.target の局所束縛を定義しない。これらへの参照はレキシカルに囲む環境の束縛へ解決される。典型的には直近の(非アロー)関数の Function Environment となる。ArrowFunctionsuper を参照し得ても、ステップ 5 で生成される関数オブジェクトMakeMethod によりメソッド化されない。super を参照する ArrowFunction は常に非 ArrowFunction 内に含まれ、super 実装に必要な状態はその ArrowFunction関数オブジェクトが捕捉する env から得られる。

15.3.5 実行時意味論: 評価 (Evaluation)

ArrowFunction : ArrowParameters => ConciseBody
  1. InstantiateArrowFunctionExpression of ArrowFunction を返す。
ExpressionBody : AssignmentExpression
  1. exprRefAssignmentExpression の Evaluation を ? 付きで行った結果とする。
  2. exprValue を ? GetValue(exprRef) とする。
  3. ReturnCompletion(exprValue) を返す。

15.4 メソッド定義 (Method Definitions)

構文 (Syntax)

MethodDefinition[Yield, Await] : ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } GeneratorMethod[?Yield, ?Await] AsyncMethod[?Yield, ?Await] AsyncGeneratorMethod[?Yield, ?Await] get ClassElementName[?Yield, ?Await] ( ) { FunctionBody[~Yield, ~Await] } set ClassElementName[?Yield, ?Await] ( PropertySetParameterList ) { FunctionBody[~Yield, ~Await] } PropertySetParameterList : FormalParameter[~Yield, ~Await]

15.4.1 静的意味論: 早期エラー (Early Errors)

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } MethodDefinition : set ClassElementName ( PropertySetParameterList ) { FunctionBody }

15.4.2 静的意味論: HasDirectSuper : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
  1. UniqueFormalParameters Contains SuperCalltrue なら true を返す。
  2. FunctionBody Contains SuperCall を返す。
MethodDefinition : get ClassElementName ( ) { FunctionBody }
  1. FunctionBody Contains SuperCall を返す。
MethodDefinition : set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. PropertySetParameterList Contains SuperCalltrue なら true を返す。
  2. FunctionBody Contains SuperCall を返す。
GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }
  1. UniqueFormalParameters Contains SuperCalltrue なら true を返す。
  2. GeneratorBody Contains SuperCall を返す。
AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. UniqueFormalParameters Contains SuperCalltrue なら true を返す。
  2. AsyncGeneratorBody Contains SuperCall を返す。
AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. UniqueFormalParameters Contains SuperCalltrue なら true を返す。
  2. AsyncFunctionBody Contains SuperCall を返す。

15.4.3 静的意味論: SpecialMethod : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
  1. false を返す。
MethodDefinition : GeneratorMethod AsyncMethod AsyncGeneratorMethod get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. true を返す。

15.4.4 実行時意味論: DefineMethod を含むか、または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
  1. propKeyClassElementName の Evaluation を ? 付きで行った結果とする。
  2. env を実行中コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  4. functionPrototype が存在するなら:
    1. prototypefunctionPrototype とする。
  5. そうでなければ:
    1. prototype%Function.prototype% とする。
  6. sourceTextMethodDefinition にマッチしたソーステキストとする。
  7. closureOrdinaryFunctionCreate(prototype, sourceText, UniqueFormalParameters, FunctionBody, non-lexical-this, env, privateEnv) とする。
  8. MakeMethod(closure, object) を実行。
  9. Record { [[Key]]: propKey, [[Closure]]: closure } を返す。

15.4.5 実行時意味論: MethodDefinitionEvaluation : 正常完了なら PrivateElement か unused のいずれか、または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
  1. methodDef を ? DefineMethod of MethodDefinition (引数 object) とする。
  2. SetFunctionName(methodDef.[[Closure]], methodDef.[[Key]]) を実行。
  3. DefineMethodProperty(object, methodDef.[[Key]], methodDef.[[Closure]], enumerable) を返す。
MethodDefinition : get ClassElementName ( ) { FunctionBody }
  1. propKey を ? Evaluation of ClassElementName とする。
  2. env を実行中コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  4. sourceTextMethodDefinition にマッチしたソーステキストとする。
  5. formalParameterList FormalParameters : [empty] の生成規則インスタンスとする。
  6. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, formalParameterList, FunctionBody, non-lexical-this, env, privateEnv) とする。
  7. MakeMethod(closure, object) を実行。
  8. SetFunctionName(closure, propKey, "get") を実行。
  9. propKeyPrivate Name なら:
    1. PrivateElement { [[Key]]: propKey, [[Kind]]: accessor, [[Get]]: closure, [[Set]]: undefined } を返す。
  10. そうでなければ:
    1. desc を PropertyDescriptor { [[Get]]: closure, [[Enumerable]]: enumerable, [[Configurable]]: true } とする。
    2. DefinePropertyOrThrow(object, propKey, desc) を実行。
    3. unused を返す。
MethodDefinition : set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. propKey を ? Evaluation of ClassElementName とする。
  2. env を実行中コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  4. sourceTextMethodDefinition にマッチしたソーステキストとする。
  5. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, PropertySetParameterList, FunctionBody, non-lexical-this, env, privateEnv) とする。
  6. MakeMethod(closure, object) を実行。
  7. SetFunctionName(closure, propKey, "set") を実行。
  8. propKeyPrivate Name なら:
    1. PrivateElement { [[Key]]: propKey, [[Kind]]: accessor, [[Get]]: undefined, [[Set]]: closure } を返す。
  9. そうでなければ:
    1. desc を PropertyDescriptor { [[Set]]: closure, [[Enumerable]]: enumerable, [[Configurable]]: true } とする。
    2. DefinePropertyOrThrow(object, propKey, desc) を実行。
    3. unused を返す。
GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }
  1. propKey を ? Evaluation of ClassElementName とする。
  2. env を実行中コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  4. sourceTextGeneratorMethod にマッチしたソーステキストとする。
  5. closureOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, UniqueFormalParameters, GeneratorBody, non-lexical-this, env, privateEnv) とする。
  6. MakeMethod(closure, object) を実行。
  7. SetFunctionName(closure, propKey) を実行。
  8. prototypeOrdinaryObjectCreate(%GeneratorPrototype%) とする。
  9. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行。
  10. DefineMethodProperty(object, propKey, closure, enumerable) を返す。
AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. propKey を ? Evaluation of ClassElementName とする。
  2. env を実行中コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  4. sourceTextAsyncGeneratorMethod にマッチしたソーステキストとする。
  5. closureOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, UniqueFormalParameters, AsyncGeneratorBody, non-lexical-this, env, privateEnv) とする。
  6. MakeMethod(closure, object) を実行。
  7. SetFunctionName(closure, propKey) を実行。
  8. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%) とする。
  9. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行。
  10. DefineMethodProperty(object, propKey, closure, enumerable) を返す。
AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. propKey を ? Evaluation of ClassElementName とする。
  2. env を実行中コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  4. sourceTextAsyncMethod にマッチしたソーステキストとする。
  5. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, UniqueFormalParameters, AsyncFunctionBody, non-lexical-this, env, privateEnv) とする。
  6. MakeMethod(closure, object) を実行。
  7. SetFunctionName(closure, propKey) を実行。
  8. DefineMethodProperty(object, propKey, closure, enumerable) を返す。

15.5 ジェネレーター関数定義 (Generator Function Definitions)

構文 (Syntax)

GeneratorDeclaration[Yield, Await, Default] : function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, ~Await] ) { GeneratorBody } [+Default] function * ( FormalParameters[+Yield, ~Await] ) { GeneratorBody } GeneratorExpression : function * BindingIdentifier[+Yield, ~Await]opt ( FormalParameters[+Yield, ~Await] ) { GeneratorBody } GeneratorMethod[Yield, Await] : * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, ~Await] ) { GeneratorBody } GeneratorBody : FunctionBody[+Yield, ~Await] YieldExpression[In, Await] : yield yield [no LineTerminator here] AssignmentExpression[?In, +Yield, ?Await] yield [no LineTerminator here] * AssignmentExpression[?In, +Yield, ?Await] Note 1

yield 直後の構文文脈では字句目標 InputElementRegExpOrTemplateTail を用いる必要がある。

Note 2

YieldExpression はジェネレーター関数の FormalParameters 内では使用できない。これは FormalParameters に含まれる式が、生成される Generator が再開可能状態になる前に評価されるためである。

Note 3

Generator に関する抽象操作27.5.3 で定義される。

15.5.1 静的意味論: 早期エラー (Early Errors)

GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody } GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } function * ( FormalParameters ) { GeneratorBody } GeneratorExpression : function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody }

15.5.2 実行時意味論: EvaluateGeneratorBody : throw completion または return completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

GeneratorBody : FunctionBody
  1. FunctionDeclarationInstantiation(functionObject, argumentsList) を実行する。
  2. G を ? OrdinaryCreateFromConstructor(functionObject, "%GeneratorPrototype%", « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] ») とする。
  3. G.[[GeneratorBrand]]empty を設定。
  4. G.[[GeneratorState]]suspended-start を設定。
  5. GeneratorStart(G, FunctionBody) を実行。
  6. ReturnCompletion(G) を返す。

15.5.3 実行時意味論: InstantiateGeneratorFunctionObject : ECMAScript 関数オブジェクト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody }
  1. nameBindingIdentifier の StringValue とする。
  2. sourceTextGeneratorDeclaration にマッチしたソーステキストとする。
  3. FOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, FormalParameters, GeneratorBody, non-lexical-this, env, privateEnv) とする。
  4. SetFunctionName(F, name) を実行。
  5. prototypeOrdinaryObjectCreate(%GeneratorPrototype%) とする。
  6. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行。
  7. F を返す。
GeneratorDeclaration : function * ( FormalParameters ) { GeneratorBody }
  1. sourceTextGeneratorDeclaration にマッチしたソーステキストとする。
  2. FOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, FormalParameters, GeneratorBody, non-lexical-this, env, privateEnv) とする。
  3. SetFunctionName(F, "default") を実行。
  4. prototypeOrdinaryObjectCreate(%GeneratorPrototype%) とする。
  5. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行。
  6. F を返す。
Note

匿名の GeneratorDeclarationexport default 宣言の一部でのみ出現し、その関数コードは常に strict mode である。

15.5.4 実行時意味論: InstantiateGeneratorFunctionExpression : ECMAScript 関数オブジェクト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

GeneratorExpression : function * ( FormalParameters ) { GeneratorBody }
  1. name が存在しなければ name"" を設定。
  2. env を実行中コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  4. sourceTextGeneratorExpression にマッチしたソーステキストとする。
  5. closureOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, FormalParameters, GeneratorBody, non-lexical-this, env, privateEnv) とする。
  6. SetFunctionName(closure, name) を実行。
  7. prototypeOrdinaryObjectCreate(%GeneratorPrototype%) とする。
  8. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行。
  9. closure を返す。
GeneratorExpression : function * BindingIdentifier ( FormalParameters ) { GeneratorBody }
  1. Assert: name は存在しない。
  2. nameBindingIdentifier の StringValue に設定。
  3. outerEnv を実行中コンテキストの LexicalEnvironment とする。
  4. funcEnvNewDeclarativeEnvironment(outerEnv) とする。
  5. funcEnv.CreateImmutableBinding(name, false) を実行。
  6. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  7. sourceTextGeneratorExpression にマッチしたソーステキストとする。
  8. closureOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, FormalParameters, GeneratorBody, non-lexical-this, funcEnv, privateEnv) とする。
  9. SetFunctionName(closure, name) を実行。
  10. prototypeOrdinaryObjectCreate(%GeneratorPrototype%) とする。
  11. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行。
  12. funcEnv.InitializeBinding(name, closure) を実行。
  13. closure を返す。
Note

GeneratorExpressionBindingIdentifier はその FunctionBody 内から参照でき再帰呼び出しを可能にするが、GeneratorDeclaration と異なり外側のスコープには現れず影響しない。

15.5.5 実行時意味論: 評価 (Evaluation)

GeneratorExpression : function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody }
  1. InstantiateGeneratorFunctionExpression of GeneratorExpression を返す。
YieldExpression : yield
  1. Yield(undefined) を返す。
YieldExpression : yield AssignmentExpression
  1. exprRefAssignmentExpression の Evaluation を ? 付きで行った結果とする。
  2. value を ? GetValue(exprRef) とする。
  3. Yield(value) を返す。
YieldExpression : yield * AssignmentExpression
  1. generatorKindGetGeneratorKind() とする。
  2. Assert: generatorKindsyncasync のいずれか。
  3. exprRefAssignmentExpression の Evaluation を ? 付きで行った結果とする。
  4. value を ? GetValue(exprRef) とする。
  5. iteratorRecord を ? GetIterator(value, generatorKind) とする。
  6. iteratoriteratorRecord.[[Iterator]] とする。
  7. receivedNormalCompletion(undefined) とする。
  8. 繰り返し:
    1. receivednormal completion なら
      1. innerResult を ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « received.[[Value]] ») とする。
      2. generatorKindasync なら innerResult を ? Await(innerResult) に設定。
      3. innerResult が Object でなければ TypeError を throw。
      4. done を ? IteratorComplete(innerResult) とする。
      5. donetrue なら
        1. IteratorValue(innerResult) を返す。
      6. generatorKindasync なら receivedCompletion(AsyncGeneratorYield(? IteratorValue(innerResult))) に設定。
      7. それ以外は receivedCompletion(GeneratorYield(innerResult)) に設定。
    2. それ以外で receivedthrow completion なら
      1. throw を ? GetMethod(iterator, "throw") とする。
      2. throwundefined でなければ
        1. innerResult を ? Call(throw, iterator, « received.[[Value]] ») とする。
        2. generatorKindasync なら innerResult を ? Await(innerResult) に設定。
        3. 注: 内部イテレータ throw メソッドの例外は伝播し、正常完了は内部 next と同様に処理される。
        4. innerResult が Object でなければ TypeError を throw。
        5. done を ? IteratorComplete(innerResult) とする。
        6. donetrue なら
          1. IteratorValue(innerResult) を返す。
        7. generatorKindasync なら receivedCompletion(AsyncGeneratorYield(? IteratorValue(innerResult))) に設定。
        8. それ以外は receivedCompletion(GeneratorYield(innerResult)) に設定。
      3. それ以外:
        1. 注: iteratorthrow メソッドがない場合、この throw は yield* ループを終了させる。まずクリーンアップを与える。
        2. closeCompletionNormalCompletion(empty) とする。
        3. generatorKindasync なら ? AsyncIteratorClose(iteratorRecord, closeCompletion) を実行。
        4. それ以外は ? IteratorClose(iteratorRecord, closeCompletion) を実行。
        5. 注: 次のステップで throw メソッド欠如による yield* プロトコル違反として TypeError を投げる。
        6. TypeError を throw。
    3. それ以外:
      1. Assert: receivedreturn completion
      2. return を ? GetMethod(iterator, "return") とする。
      3. returnundefined なら
        1. valuereceived.[[Value]] に設定。
        2. generatorKindasync なら
          1. value を ? Await(value) に設定。
        3. ReturnCompletion(value) を返す。
      4. innerReturnResult を ? Call(return, iterator, « received.[[Value]] ») とする。
      5. generatorKindasync なら innerReturnResult を ? Await(innerReturnResult) に設定。
      6. innerReturnResult が Object でなければ TypeError を throw。
      7. done を ? IteratorComplete(innerReturnResult) とする。
      8. donetrue なら
        1. value を ? IteratorValue(innerReturnResult) に設定。
        2. ReturnCompletion(value) を返す。
      9. generatorKindasync なら receivedCompletion(AsyncGeneratorYield(? IteratorValue(innerReturnResult))) に設定。
      10. それ以外は receivedCompletion(GeneratorYield(innerReturnResult)) に設定。

15.6 非同期ジェネレーター関数定義 (Async Generator Function Definitions)

構文 (Syntax)

AsyncGeneratorDeclaration[Yield, Await, Default] : async [no LineTerminator here] function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } [+Default] async [no LineTerminator here] function * ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorExpression : async [no LineTerminator here] function * BindingIdentifier[+Yield, +Await]opt ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorMethod[Yield, Await] : async [no LineTerminator here] * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorBody : FunctionBody[+Yield, +Await] Note 1

非同期ジェネレーター関数の FormalParameters 内では YieldExpressionAwaitExpression は使用できない。FormalParameters 内の式は結果の AsyncGenerator が再開可能となる前に評価されるためである。

Note 2

AsyncGenerator に関する抽象操作27.6.3 で定義される。

15.6.1 静的意味論: 早期エラー (Early Errors)

AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody } AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } async function * ( FormalParameters ) { AsyncGeneratorBody } AsyncGeneratorExpression : async function * BindingIdentifieropt ( FormalParameters ) { AsyncGeneratorBody }

15.6.2 実行時意味論: EvaluateAsyncGeneratorBody : throw completion または return completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

AsyncGeneratorBody : FunctionBody
  1. FunctionDeclarationInstantiation(functionObject, argumentsList) を実行。
  2. generator を ? OrdinaryCreateFromConstructor(functionObject, "%AsyncGeneratorPrototype%", « [[AsyncGeneratorState]], [[AsyncGeneratorContext]], [[AsyncGeneratorQueue]], [[GeneratorBrand]] ») とする。
  3. generator.[[GeneratorBrand]]empty を設定。
  4. generator.[[AsyncGeneratorState]]suspended-start を設定।
  5. AsyncGeneratorStart(generator, FunctionBody) を実行。
  6. ReturnCompletion(generator) を返す。

15.6.3 実行時意味論: InstantiateAsyncGeneratorFunctionObject : ECMAScript 関数オブジェクト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }
  1. nameBindingIdentifier の StringValue とする。
  2. sourceTextAsyncGeneratorDeclaration にマッチしたソーステキストとする。
  3. FOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, env, privateEnv) とする。
  4. SetFunctionName(F, name) を実行。
  5. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%) とする。
  6. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行。
  7. F を返す。
AsyncGeneratorDeclaration : async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. sourceTextAsyncGeneratorDeclaration にマッチしたソーステキストとする。
  2. FOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, env, privateEnv) とする。
  3. SetFunctionName(F, "default") を実行。
  4. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%) とする。
  5. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行。
  6. F を返す。
Note

匿名の AsyncGeneratorDeclarationexport default 宣言の一部でのみ出現する。

15.6.4 実行時意味論: InstantiateAsyncGeneratorFunctionExpression : ECMAScript 関数オブジェクト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

AsyncGeneratorExpression : async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. name が存在しなければ name"" を設定。
  2. env を実行中コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  4. sourceTextAsyncGeneratorExpression にマッチしたソーステキストとする。
  5. closureOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, env, privateEnv) とする。
  6. SetFunctionName(closure, name) を実行。
  7. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%) とする。
  8. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行。
  9. closure を返す。
AsyncGeneratorExpression : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }
  1. Assert: name は存在しない。
  2. nameBindingIdentifier の StringValue に設定。
  3. outerEnv を実行中コンテキストの LexicalEnvironment とする。
  4. funcEnvNewDeclarativeEnvironment(outerEnv) とする。
  5. funcEnv.CreateImmutableBinding(name, false) を実行。
  6. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  7. sourceTextAsyncGeneratorExpression にマッチしたソーステキストとする。
  8. closureOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, funcEnv, privateEnv) とする。
  9. SetFunctionName(closure, name) を実行。
  10. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%) とする。
  11. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行。
  12. funcEnv.InitializeBinding(name, closure) を実行。
  13. closure を返す。
Note

AsyncGeneratorExpressionBindingIdentifier はその AsyncGeneratorBody 内から参照でき再帰呼び出しを可能にするが、AsyncGeneratorDeclaration と異なり外側スコープには現れず影響しない。

15.6.5 実行時意味論: 評価 (Evaluation)

AsyncGeneratorExpression : async function * BindingIdentifieropt ( FormalParameters ) { AsyncGeneratorBody }
  1. InstantiateAsyncGeneratorFunctionExpression of AsyncGeneratorExpression を返す。

15.7 クラス定義 (Class Definitions)

構文 (Syntax)

ClassDeclaration[Yield, Await, Default] : class BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await] [+Default] class ClassTail[?Yield, ?Await] ClassExpression[Yield, Await] : class BindingIdentifier[?Yield, ?Await]opt ClassTail[?Yield, ?Await] ClassTail[Yield, Await] : ClassHeritage[?Yield, ?Await]opt { ClassBody[?Yield, ?Await]opt } ClassHeritage[Yield, Await] : extends LeftHandSideExpression[?Yield, ?Await] ClassBody[Yield, Await] : ClassElementList[?Yield, ?Await] ClassElementList[Yield, Await] : ClassElement[?Yield, ?Await] ClassElementList[?Yield, ?Await] ClassElement[?Yield, ?Await] ClassElement[Yield, Await] : MethodDefinition[?Yield, ?Await] static MethodDefinition[?Yield, ?Await] FieldDefinition[?Yield, ?Await] ; static FieldDefinition[?Yield, ?Await] ; ClassStaticBlock ; FieldDefinition[Yield, Await] : ClassElementName[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt ClassElementName[Yield, Await] : PropertyName[?Yield, ?Await] PrivateIdentifier ClassStaticBlock : static { ClassStaticBlockBody } ClassStaticBlockBody : ClassStaticBlockStatementList ClassStaticBlockStatementList : StatementList[~Yield, +Await, ~Return]opt Note

クラス定義は常に strict mode コードである。

15.7.1 静的意味論: 早期エラー (Early Errors)

ClassTail : ClassHeritageopt { ClassBody }
  • ClassHeritage が存在しない場合、次のアルゴリズムが true を返すなら構文エラー:

    1. constructorClassBody の ConstructorMethod とする。
    2. constructorempty なら false を返す。
    3. HasDirectSuper of constructor を返す。
ClassBody : ClassElementList
  • ClassElementList の PrototypePropertyNameList に "constructor" が 2 回以上含まれる場合は構文エラー。
  • ClassElementList の PrivateBoundIdentifiers に重複があり、その名前がゲッターとセッターの 1 回ずつ(他で未使用)かつ両方 static か両方非 static である場合を除いて構文エラー。
ClassElement : MethodDefinition ClassElement : static MethodDefinition ClassElement : FieldDefinition ; ClassElement : static FieldDefinition ;
  • FieldDefinition の PropName が "prototype" または "constructor" なら構文エラー。
FieldDefinition : ClassElementName Initializeropt ClassElementName : PrivateIdentifier ClassStaticBlockBody : ClassStaticBlockStatementList

15.7.2 静的意味論: ClassElementKind : constructor-method, non-constructor-method, または empty

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ClassElement : MethodDefinition
  1. MethodDefinition の PropName が "constructor" であれば constructor-method を返す。
  2. non-constructor-method を返す。
ClassElement : static MethodDefinition FieldDefinition ; static FieldDefinition ;
  1. non-constructor-method を返す。
ClassElement : ClassStaticBlock
  1. non-constructor-method を返す。
ClassElement : ;
  1. empty を返す。

15.7.3 静的意味論: ConstructorMethod : ClassElement Parse Node または empty

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ClassElementList : ClassElement
  1. ClassElement の ClassElementKind が constructor-method なら ClassElement を返す。
  2. empty を返す。
ClassElementList : ClassElementList ClassElement
  1. headClassElementList の ConstructorMethod とする。
  2. headempty でなければ head を返す。
  3. ClassElement の ClassElementKind が constructor-method なら ClassElement を返す。
  4. empty を返す。
Note

早期エラー規則により "constructor" という名前のメソッドは 1 つであり、 accessor や generator ではないことが保証される。

15.7.4 静的意味論: IsStatic : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ClassElement : MethodDefinition
  1. false を返す。
ClassElement : static MethodDefinition
  1. true を返す。
ClassElement : FieldDefinition ;
  1. false を返す。
ClassElement : static FieldDefinition ;
  1. true を返す。
ClassElement : ClassStaticBlock
  1. true を返す。
ClassElement : ;
  1. false を返す。

15.7.5 静的意味論: NonConstructorElements : ClassElement Parse Nodes の List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ClassElementList : ClassElement
  1. ClassElement の ClassElementKind が non-constructor-method なら
    1. « ClassElement » を返す。
  2. 新しい空 List を返す。
ClassElementList : ClassElementList ClassElement
  1. listClassElementList の NonConstructorElements とする。
  2. ClassElement の ClassElementKind が non-constructor-method なら
    1. list の末尾に ClassElement を追加。
  3. list を返す。

15.7.6 静的意味論: PrototypePropertyNameList : プロパティキーの List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ClassElementList : ClassElement
  1. propNameClassElement の PropName とする。
  2. propNameempty なら空の新しい List を返す。
  3. IsStatic(ClassElement) が true なら空の新しい List を返す。
  4. « propName » を返す。
ClassElementList : ClassElementList ClassElement
  1. listClassElementList の PrototypePropertyNameList とする。
  2. propNameClassElement の PropName とする。
  3. propNameempty なら list を返す。
  4. IsStatic(ClassElement) が true なら list を返す。
  5. list と « propName » のリスト連結を返す。

15.7.7 静的意味論: AllPrivateIdentifiersValid : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

以下に列挙されない仕様中のすべての生成規則選択肢は、暗黙に次の既定定義を持つ:

  1. この Parse Node の各子ノード child について:
    1. child が非終端記号インスタンスなら
      1. AllPrivateIdentifiersValid(child, names) が false なら false を返す。
  2. true を返す。
MemberExpression : MemberExpression . PrivateIdentifier
  1. namesPrivateIdentifier の StringValue を含むなら
    1. AllPrivateIdentifiersValid(MemberExpression, names) を返す。
  2. false を返す。
CallExpression : CallExpression . PrivateIdentifier
  1. namesPrivateIdentifier の StringValue を含むなら
    1. AllPrivateIdentifiersValid(CallExpression, names) を返す。
  2. false を返す。
OptionalChain : ?. PrivateIdentifier
  1. namesPrivateIdentifier の StringValue を含むなら true を返す。
  2. false を返す。
OptionalChain : OptionalChain . PrivateIdentifier
  1. namesPrivateIdentifier の StringValue を含むなら
    1. AllPrivateIdentifiersValid(OptionalChain, names) を返す。
  2. false を返す。
ClassBody : ClassElementList
  1. newNamesnamesClassBody の PrivateBoundIdentifiers のリスト連結とする。
  2. AllPrivateIdentifiersValid(ClassElementList, newNames) を返す。
RelationalExpression : PrivateIdentifier in ShiftExpression
  1. namesPrivateIdentifier の StringValue を含むなら
    1. AllPrivateIdentifiersValid(ShiftExpression, names) を返す。
  2. false を返す。

15.7.8 静的意味論: PrivateBoundIdentifiers : 文字列 List

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

FieldDefinition : ClassElementName Initializeropt
  1. ClassElementName の PrivateBoundIdentifiers を返す。
ClassElementName : PrivateIdentifier
  1. PrivateIdentifier の StringValue 1 要素のみを含む List を返す。
ClassElementName : PropertyName ClassElement : ClassStaticBlock ;
  1. 新しい空 List を返す。
ClassElementList : ClassElementList ClassElement
  1. names1ClassElementList の PrivateBoundIdentifiers とする。
  2. names2ClassElement の PrivateBoundIdentifiers とする。
  3. names1names2 のリスト連結を返す。
MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody } GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody } AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody } AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. ClassElementName の PrivateBoundIdentifiers を返す。

15.7.9 静的意味論: ContainsArguments : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

以下に列挙されないすべての生成規則選択肢は暗黙に次の既定定義を持つ:

  1. この Parse Node の各子 child について:
    1. child が非終端であれば
      1. ContainsArguments(child) が true なら true を返す。
  2. false を返す。
IdentifierReference : Identifier
  1. Identifier の StringValue が "arguments" なら true を返す。
  2. false を返す。
FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody } function ( FormalParameters ) { FunctionBody } FunctionExpression : function BindingIdentifieropt ( FormalParameters ) { FunctionBody } GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } function * ( FormalParameters ) { GeneratorBody } GeneratorExpression : function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody } AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } async function * ( FormalParameters ) { AsyncGeneratorBody } AsyncGeneratorExpression : async function * BindingIdentifieropt ( FormalParameters ) { AsyncGeneratorBody } AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } async function ( FormalParameters ) { AsyncFunctionBody } AsyncFunctionExpression : async function BindingIdentifieropt ( FormalParameters ) { AsyncFunctionBody }
  1. false を返す。
MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody } GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody } AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody } AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. ContainsArguments(ClassElementName) を返す。

15.7.10 実行時意味論: ClassFieldDefinitionEvaluation : ClassFieldDefinition Record を含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

FieldDefinition : ClassElementName Initializeropt
  1. name を ? Evaluation of ClassElementName とする。
  2. Initializer が存在するなら:
    1. formalParameterList FormalParameters : [empty] のインスタンスとする。
    2. env を実行中コンテキストの LexicalEnvironment とする。
    3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
    4. sourceText を空の Unicode コードポイント列とする。
    5. initializerOrdinaryFunctionCreate(%Function.prototype%, sourceText, formalParameterList, Initializer, non-lexical-this, env, privateEnv) とする。
    6. MakeMethod(initializer, homeObject) を実行。
    7. initializer.[[ClassFieldInitializerName]]name を設定。
  3. それ以外:
    1. initializerempty とする。
  4. ClassFieldDefinition Record { [[Name]]: name, [[Initializer]]: initializer } を返す。
Note
initializer のために生成された関数は ECMAScript コードから直接参照できない。

15.7.11 実行時意味論: ClassStaticBlockDefinitionEvaluation : ClassStaticBlockDefinition Record

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ClassStaticBlock : static { ClassStaticBlockBody }
  1. lex を実行中コンテキストの LexicalEnvironment とする。
  2. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  3. sourceText を空の Unicode コードポイント列とする。
  4. formalParameters FormalParameters : [empty] のインスタンスとする。
  5. bodyFunctionOrdinaryFunctionCreate(%Function.prototype%, sourceText, formalParameters, ClassStaticBlockBody, non-lexical-this, lex, privateEnv) とする。
  6. MakeMethod(bodyFunction, homeObject) を実行。
  7. ClassStaticBlockDefinition Record { [[BodyFunction]]: bodyFunction } を返す。
Note
bodyFunction は ECMAScript コードから直接アクセスできない。

15.7.12 実行時意味論: EvaluateClassStaticBlockBody : return completion または throw completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ClassStaticBlockBody : ClassStaticBlockStatementList
  1. Assert: functionObject は ClassStaticBlockDefinitionEvaluation ステップ 5 により生成された合成関数である。
  2. FunctionDeclarationInstantiation(functionObject, « ») を実行。
  3. ClassStaticBlockStatementList の Evaluation を実行。
  4. ReturnCompletion(undefined) を返す。

15.7.13 実行時意味論: ClassElementEvaluation : ClassFieldDefinition Record / ClassStaticBlockDefinition Record / PrivateElement / unused のいずれかを含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ClassElement : FieldDefinition ; static FieldDefinition ;
  1. ? ClassFieldDefinitionEvaluation of FieldDefinition (引数 object) を返す。
ClassElement : MethodDefinition static MethodDefinition
  1. ? MethodDefinitionEvaluation of MethodDefinition (引数 object, false) を返す。
ClassElement : ClassStaticBlock
  1. ClassStaticBlockDefinitionEvaluation of ClassStaticBlock (引数 object) を返す。
ClassElement : ;
  1. unused を返す。

15.7.14 実行時意味論: ClassDefinitionEvaluation : 関数オブジェクトを含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

仕様を簡潔にするため、private method と accessor はクラスインスタンスの [[PrivateElements]] スロットで private field と並列に扱われる。ただし任意のオブジェクトは、そのクラスで定義された private method / accessor を全部持つか全く持たないかのどちらかである。この設計により実装は各メソッドやアクセサを個別に追跡しない戦略を選択できる。

例として、実装はインスタンスの private method を対応する Private Name と直接関連付け、各オブジェクトに対しどのクラスコンストラクタthis として走ったかを追跡できる。オブジェクト上の private method 参照は、そのメソッドを定義するクラスコンストラクタで初期化されたかを確認し、Private Name に結び付くメソッドを返す手順になる。

これは private field と異なる。field 初期化子はクラスインスタンス化中に例外を投げ得るため、個々のオブジェクトがクラスの private field の真部分集合だけを持つ状況があり、private field は一般に個別追跡する必要がある。

It is defined piecewise over the following productions:

ClassTail : ClassHeritageopt { ClassBodyopt }
  1. env を実行中の実行コンテキストの LexicalEnvironment とする。
  2. classEnvNewDeclarativeEnvironment(env) とする。
  3. classBindingundefined でない場合、
    1. classEnv.CreateImmutableBinding(classBinding, true) を実行する。
  4. outerPrivateEnvironment を実行中の実行コンテキストの PrivateEnvironment とする。
  5. classPrivateEnvironmentNewPrivateEnvironment(outerPrivateEnvironment) とする。
  6. ClassBody が存在する場合、
    1. ClassBody の PrivateBoundIdentifiers の各文字列 dn について、次を行う:
      1. classPrivateEnvironment.[[Names]] に、[[Description]]dn である Private Name pn が含まれているなら、
        1. Assert: これは getter/setter ペアの場合にのみ起こり得る。
      2. そうでなければ、
        1. dn[[Description]] とする新しい Private Name name を生成する。
        2. nameclassPrivateEnvironment.[[Names]] に追加する。
  7. ClassHeritage が存在しない場合、
    1. protoParent%Object.prototype% とする。
    2. constructorParent%Function.prototype% とする。
  8. そうでなければ、
    1. 実行中の実行コンテキストの LexicalEnvironment を classEnv に設定する。
    2. 注: ClassHeritage の評価中、実行中の実行コンテキストの PrivateEnvironment は outerPrivateEnvironment である。
    3. superclassRefCompletion(Evaluation of ClassHeritage) とする。
    4. 実行中の実行コンテキストの LexicalEnvironment を env に戻す。
    5. superclass を ? GetValue(? superclassRef) とする。
    6. もし superclassnull であるなら、
      1. protoParentnull とする。
      2. constructorParent%Function.prototype% とする。
    7. そうでなく、かつ IsConstructor(superclass) が false であるなら、
      1. TypeError 例外を投げる。
    8. そうでなければ、
      1. protoParent を ? Get(superclass, "prototype") とする。
      2. もし protoParent がオブジェクトでも null でもないなら、TypeError 例外を投げる。
      3. constructorParentsuperclass とする。
  9. protoOrdinaryObjectCreate(protoParent) とする。
  10. ClassBody が存在しない場合、constructorempty とする。
  11. そうでなければ、constructorClassBody の ConstructorMethod とする。
  12. 実行中の実行コンテキストの LexicalEnvironment を classEnv に設定する。
  13. 実行中の実行コンテキストの PrivateEnvironment を classPrivateEnvironment に設定する。
  14. もし constructorempty であるなら、
    1. 引数を持たず、何もキャプチャしない新しい Abstract Closure defaultConstructor を生成し、呼び出された時に次を実行する:
      1. args を、この関数に [[Call]] または [[Construct]] で渡された引数のリストとする。
      2. もし NewTarget が undefined であるなら、TypeError 例外を投げる。
      3. F をアクティブな関数オブジェクトとする。
      4. もし F.[[ConstructorKind]]derived であるなら、
        1. 注: この分岐は constructor(...args) { super(...args); } に類似しているが、前述の ECMAScript ソーステキストが観測可能に %Array.prototype%%Symbol.iterator% メソッドを呼び出す一方で、この関数はそれを呼び出さない。
        2. func を ! F.[[GetPrototypeOf]]() とする。
        3. もし IsConstructor(func) が false であるなら、TypeError 例外を投げる。
        4. result を ? Construct(func, args, NewTarget) とする。
      5. そうでなければ、
        1. 注: この分岐は constructor() {} に類似している。
        2. result を ? OrdinaryCreateFromConstructor(NewTarget, "%Object.prototype%") とする。
      6. InitializeInstanceElements(result, F) を実行する。
      7. NormalCompletion(result) を返す。
    2. FCreateBuiltinFunction(defaultConstructor, 0, className, « [[ConstructorKind]], [[SourceText]] », the current Realm Record, constructorParent) とする。
  15. そうでなければ、
    1. constructorInfo を ! DefineMethod of constructor (引数 protoconstructorParent) とする。
    2. FconstructorInfo.[[Closure]] とする。
    3. MakeClassConstructor(F) を実行する。
    4. SetFunctionName(F, className) を実行する。
  16. F.[[SourceText]]sourceText に設定する。
  17. MakeConstructor(F, false, proto) を実行する。
  18. もし ClassHeritage が存在するなら、F.[[ConstructorKind]]derived に設定する。
  19. DefineMethodProperty(proto, "constructor", F, false) を実行する。
  20. もし ClassBody が存在しないなら、elements を新しい空の List とする。
  21. そうでなければ、elementsClassBody の NonConstructorElements とする。
  22. instancePrivateMethods を新しい空の List とする。
  23. staticPrivateMethods を新しい空の List とする。
  24. instanceFields を新しい空の List とする。
  25. staticElements を新しい空の List とする。
  26. elements の各 ClassElement e について、次を行う:
    1. もし IsStatic(e) が false なら、
      1. elementCompletion(ClassElementEvaluation of e with argument proto) とする。
    2. そうでなければ、
      1. elementCompletion(ClassElementEvaluation of e with argument F) とする。
    3. もし elementabrupt completion なら、
      1. 実行中の実行コンテキストの LexicalEnvironment を env に戻す。
      2. 実行中の実行コンテキストの PrivateEnvironment を outerPrivateEnvironment に戻す。
      3. element を返す。
    4. element を ! element に設定する。
    5. もし elementPrivateElement であるなら、
      1. Assert: element.[[Kind]]method または accessor のいずれかである。
      2. もし IsStatic(e) が false なら、containerinstancePrivateMethods とし、そうでなければ staticPrivateMethods とする。
      3. もし container に、element.[[Key]] と同じ [[Key]] を持つ PrivateElement pe が含まれているなら、
        1. Assert: element.[[Kind]]pe.[[Kind]] は共に accessor である。
        2. もし element.[[Get]]undefined であるなら、
          1. combinedPrivateElement { [[Key]]: element.[[Key]], [[Kind]]: accessor, [[Get]]: pe.[[Get]], [[Set]]: element.[[Set]] } とする。
        3. そうでなければ、
          1. combinedPrivateElement { [[Key]]: element.[[Key]], [[Kind]]: accessor, [[Get]]: element.[[Get]], [[Set]]: pe.[[Set]] } とする。
        4. container 内の pecombined で置き換える。
      4. そうでなければ、
        1. elementcontainer に追加する。
    6. そうでなく、もし elementClassFieldDefinition Record であるなら、
      1. もし IsStatic(e) が false なら、elementinstanceFields に追加し、そうでなければ staticElements に追加する。
    7. そうでなく、もし elementClassStaticBlockDefinition Record であるなら、
      1. elementstaticElements に追加する。
  27. 実行中の実行コンテキストの LexicalEnvironment を env に戻す。
  28. もし classBindingundefined でないなら、
    1. classEnv.InitializeBinding(classBinding, F) を実行する。
  29. F.[[PrivateMethods]]instancePrivateMethods に設定する。
  30. F.[[Fields]]instanceFields に設定する。
  31. staticPrivateMethods の各 PrivateElement method について、次を行う:
    1. PrivateMethodOrAccessorAdd(F, method) を実行する。
  32. staticElements の各要素 elementRecord について、次を行う:
    1. もし elementRecordClassFieldDefinition Record であるなら、
      1. resultCompletion(DefineField(F, elementRecord)) とする。
    2. そうでなければ、
      1. Assert: elementRecordClassStaticBlockDefinition Record である。
      2. resultCompletion(Call(elementRecord.[[BodyFunction]], F)) とする。
    3. もし resultabrupt completion であるなら、
      1. 実行中の実行コンテキストの PrivateEnvironment を outerPrivateEnvironment に戻す。
      2. result を返す。
  33. 実行中の実行コンテキストの PrivateEnvironment を outerPrivateEnvironment に戻す。
  34. F を返す。

15.7.15 実行時意味論: BindingClassDeclarationEvaluation : 関数オブジェクトを含む normal completion または abrupt completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ClassDeclaration : class BindingIdentifier ClassTail
  1. classNameBindingIdentifier の StringValue とする。
  2. sourceTextClassDeclaration にマッチしたソースとする。
  3. value を ? ClassDefinitionEvaluation(ClassTail, className, className, sourceText) とする。
  4. env を実行中コンテキストの LexicalEnvironment とする。
  5. InitializeBoundName(className, value, env) を実行。
  6. value を返す。
ClassDeclaration : class ClassTail
  1. sourceTextClassDeclaration にマッチしたソースとする。
  2. ? ClassDefinitionEvaluation(ClassTail, undefined, "default", sourceText) を返す。
Note

ClassDeclaration : class ClassTail ExportDeclaration の一部としてのみ出現し、その束縛確立は該当生成規則の評価で処理される。16.2.3.7 参照。

15.7.16 実行時意味論: 評価 (Evaluation)

ClassDeclaration : class BindingIdentifier ClassTail
  1. この ClassDeclaration の BindingClassDeclarationEvaluation を ? 付きで実行。
  2. empty を返す。
Note

ClassDeclaration : class ClassTail ExportDeclaration の一部でのみ出現し直接評価されない。

ClassExpression : class ClassTail
  1. sourceTextClassExpression にマッチしたソースとする。
  2. ? ClassDefinitionEvaluation(ClassTail, undefined, "", sourceText) を返す。
ClassExpression : class BindingIdentifier ClassTail
  1. classNameBindingIdentifier の StringValue とする。
  2. sourceTextClassExpression にマッチしたソースとする。
  3. ? ClassDefinitionEvaluation(ClassTail, className, className, sourceText) を返す。
ClassElementName : PrivateIdentifier
  1. privateIdentifierPrivateIdentifier の StringValue とする。
  2. privateEnvRec を実行中コンテキストの PrivateEnvironment とする。
  3. namesprivateEnvRec.[[Names]] とする。
  4. Assert: names[[Description]] = privateIdentifierPrivate Name が正確に 1 つ存在。
  5. privateName をその Private Name とする。
  6. privateName を返す。
ClassStaticBlockStatementList : [empty]
  1. undefined を返す。

15.8 非同期関数定義 (Async Function Definitions)

構文 (Syntax)

AsyncFunctionDeclaration[Yield, Await, Default] : async [no LineTerminator here] function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } [+Default] async [no LineTerminator here] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionExpression : async [no LineTerminator here] function BindingIdentifier[~Yield, +Await]opt ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncMethod[Yield, Await] : async [no LineTerminator here] ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionBody : FunctionBody[~Yield, +Await] AwaitExpression[Yield] : await UnaryExpression[?Yield, +Await] Note 1

await[Await] パラメータが存在する場合に AwaitExpression のキーワードとして構文解析される。[Await] パラメータは次の文脈のトップレベルで存在し得る(FunctionBody など非終端により欠如し得る):

構文目標記号が Script の場合、[Await] パラメータが無い文脈では await は識別子として解析され得る。例:

Note 2

YieldExpression と異なり、AwaitExpression のオペランド省略は Syntax Error である。必ず何かを await しなければならない。

15.8.1 静的意味論: 早期エラー (Early Errors)

AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody } AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } async function ( FormalParameters ) { AsyncFunctionBody } AsyncFunctionExpression : async function BindingIdentifieropt ( FormalParameters ) { AsyncFunctionBody }

15.8.2 実行時意味論: InstantiateAsyncFunctionObject : ECMAScript 関数オブジェクト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
  1. nameBindingIdentifier の StringValue とする。
  2. sourceTextAsyncFunctionDeclaration にマッチしたソースとする。
  3. FOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, env, privateEnv) とする。
  4. SetFunctionName(F, name) を実行。
  5. F を返す。
AsyncFunctionDeclaration : async function ( FormalParameters ) { AsyncFunctionBody }
  1. sourceTextAsyncFunctionDeclaration にマッチしたソースとする。
  2. FOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, env, privateEnv) とする。
  3. SetFunctionName(F, "default") を実行。
  4. F を返す。

15.8.3 実行時意味論: InstantiateAsyncFunctionExpression : ECMAScript 関数オブジェクト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

AsyncFunctionExpression : async function ( FormalParameters ) { AsyncFunctionBody }
  1. name が存在しなければ "" を設定。
  2. env を実行中コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  4. sourceTextAsyncFunctionExpression にマッチしたソースとする。
  5. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, env, privateEnv) とする。
  6. SetFunctionName(closure, name) を実行。
  7. closure を返す。
AsyncFunctionExpression : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
  1. Assert: name は存在しない。
  2. nameBindingIdentifier の StringValue に設定。
  3. outerEnv を実行中コンテキストの LexicalEnvironment とする。
  4. funcEnvNewDeclarativeEnvironment(outerEnv) とする。
  5. funcEnv.CreateImmutableBinding(name, false) を実行。
  6. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  7. sourceTextAsyncFunctionExpression にマッチしたソースとする。
  8. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, funcEnv, privateEnv) とする。
  9. SetFunctionName(closure, name) を実行。
  10. funcEnv.InitializeBinding(name, closure) を実行。
  11. closure を返す。
Note

AsyncFunctionExpressionBindingIdentifier はその AsyncFunctionBody 内から参照でき再帰呼び出しを可能にするが、FunctionDeclaration と異なり外側スコープには影響しない。

15.8.4 実行時意味論: EvaluateAsyncFunctionBody : return completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

AsyncFunctionBody : FunctionBody
  1. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  2. completionCompletion(FunctionDeclarationInstantiation(functionObject, argumentsList)) とする。
  3. completion が abrupt なら
    1. ! Call(promiseCapability.[[Reject]], undefined, « completion.[[Value]] ») を実行。
  4. それ以外
    1. AsyncFunctionStart(promiseCapability, FunctionBody) を実行。
  5. ReturnCompletion(promiseCapability.[[Promise]]) を返す。

15.8.5 実行時意味論: 評価 (Evaluation)

AsyncFunctionExpression : async function BindingIdentifieropt ( FormalParameters ) { AsyncFunctionBody }
  1. InstantiateAsyncFunctionExpression of AsyncFunctionExpression を返す。
AwaitExpression : await UnaryExpression
  1. exprRef を ? Evaluation of UnaryExpression とする。
  2. value を ? GetValue(exprRef) とする。
  3. Await(value) を返す。

15.9 非同期アロー関数定義 (Async Arrow Function Definitions)

構文 (Syntax)

AsyncArrowFunction[In, Yield, Await] : async [no LineTerminator here] AsyncArrowBindingIdentifier[?Yield] [no LineTerminator here] => AsyncConciseBody[?In] CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In] AsyncConciseBody[In] : [lookahead ≠ {] ExpressionBody[?In, +Await] { AsyncFunctionBody } AsyncArrowBindingIdentifier[Yield] : BindingIdentifier[?Yield, +Await] CoverCallExpressionAndAsyncArrowHead[Yield, Await] : MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]

補助構文 (Supplemental Syntax)

生成規則
AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
のインスタンス処理時、CoverCallExpressionAndAsyncArrowHead の解釈は以下の文法で精密化される:

AsyncArrowHead : async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]

15.9.1 静的意味論: 早期エラー (Early Errors)

AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody

15.9.2 静的意味論: AsyncConciseBodyContainsUseStrict : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

AsyncConciseBody : ExpressionBody
  1. false を返す。
AsyncConciseBody : { AsyncFunctionBody }
  1. FunctionBodyContainsUseStrict of AsyncFunctionBody を返す。

15.9.3 実行時意味論: EvaluateAsyncConciseBody : return completion

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

AsyncConciseBody : ExpressionBody
  1. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  2. completionCompletion(FunctionDeclarationInstantiation(functionObject, argumentsList)) とする。
  3. completion が abrupt なら
    1. ! Call(promiseCapability.[[Reject]], undefined, « completion.[[Value]] ») を実行。
  4. それ以外
    1. AsyncFunctionStart(promiseCapability, ExpressionBody) を実行。
  5. ReturnCompletion(promiseCapability.[[Promise]]) を返す。

15.9.4 実行時意味論: InstantiateAsyncArrowFunctionExpression : ECMAScript 関数オブジェクト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody
  1. name が存在しなければ "" を設定。
  2. env を実行中コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  4. sourceTextAsyncArrowFunction にマッチしたソースとする。
  5. parametersAsyncArrowBindingIdentifier とする。
  6. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, parameters, AsyncConciseBody, lexical-this, env, privateEnv) とする。
  7. SetFunctionName(closure, name) を実行。
  8. closure を返す。
AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
  1. name が存在しなければ "" を設定。
  2. env を実行中コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中コンテキストの PrivateEnvironment とする。
  4. sourceTextAsyncArrowFunction にマッチしたソースとする。
  5. headCoverCallExpressionAndAsyncArrowHead が覆う AsyncArrowHead とする。
  6. parametersheadArrowFormalParameters とする。
  7. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, parameters, AsyncConciseBody, lexical-this, env, privateEnv) とする。
  8. SetFunctionName(closure, name) を実行。
  9. closure を返す。

15.9.5 実行時意味論: 評価 (Evaluation)

AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
  1. InstantiateAsyncArrowFunctionExpression of AsyncArrowFunction を返す。

15.10 末尾位置呼び出し (Tail Position Calls)

15.10.1 静的意味論: IsInTailPosition ( call: CallExpression / MemberExpression / OptionalChain Parse Node, ): Boolean

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. IsStrict(call) が false なら false を返す。
  2. callFunctionBody, ConciseBody, AsyncConciseBody の内部に含まれていなければ false を返す。
  3. bodycall を最も近く包含する FunctionBody / ConciseBody / AsyncConciseBody とする。
  4. bodyGeneratorBodyFunctionBody なら false を返す。
  5. bodyAsyncFunctionBodyFunctionBody なら false を返す。
  6. bodyAsyncGeneratorBodyFunctionBody なら false を返す。
  7. bodyAsyncConciseBody なら false を返す。
  8. HasCallInTailPosition(body, call) の結果を返す。
Note

末尾位置呼び出しは strict mode コードでのみ定義される。これは caller chain を観測可能にする一般的な非標準拡張(10.2.4 参照)との整合のためである。

15.10.2 静的意味論: HasCallInTailPosition : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note 1

call は特定のソース範囲を表す Parse Node である。以下のアルゴリズムで他の Parse Node と比較する場合、それらが同一ソース範囲を表すかを判定する。

Note 2

潜在的な末尾位置呼び出しの直後が return でその呼び出し結果の GetValue を返している場合も末尾位置呼び出しと見なされる。関数呼び出しは Reference Record を返さないため、その GetValue は呼び出し結果と同じ値を返す。

It is defined piecewise over the following productions:

StatementList : StatementList StatementListItem
  1. has を HasCallInTailPosition(StatementList, call) とする。
  2. hastrue なら true を返す。
  3. HasCallInTailPosition(StatementListItem, call) を返す。
FunctionStatementList : [empty] StatementListItem : Declaration Statement : VariableStatement EmptyStatement ExpressionStatement ContinueStatement BreakStatement ThrowStatement DebuggerStatement Block : { } ReturnStatement : return ; LabelledItem : FunctionDeclaration ForInOfStatement : for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement CaseBlock : { }
  1. false を返す。
IfStatement : if ( Expression ) Statement else Statement
  1. has を最初の Statement の HasCallInTailPosition(…, call) とする。
  2. hastrue なら true を返す。
  3. 2 番目の Statement の HasCallInTailPosition(…, call) を返す。
IfStatement : if ( Expression ) Statement DoWhileStatement : do Statement while ( Expression ) ; WhileStatement : while ( Expression ) Statement ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( var ForBinding in Expression ) Statement for ( ForDeclaration in Expression ) Statement WithStatement : with ( Expression ) Statement
  1. HasCallInTailPosition(Statement, call) を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. HasCallInTailPosition(LabelledItem, call) を返す。
ReturnStatement : return Expression ;
  1. HasCallInTailPosition(Expression, call) を返す。
SwitchStatement : switch ( Expression ) CaseBlock
  1. HasCallInTailPosition(CaseBlock, call) を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. hasfalse とする。
  2. 最初の CaseClauses があれば has = HasCallInTailPosition(その CaseClauses, call)。
  3. hastrue なら true を返す。
  4. has = HasCallInTailPosition(DefaultClause, call)。
  5. hastrue なら true を返す。
  6. 2 番目の CaseClauses があれば has = HasCallInTailPosition(その CaseClauses, call)。
  7. has を返す。
CaseClauses : CaseClauses CaseClause
  1. has を HasCallInTailPosition(CaseClauses, call) とする。
  2. hastrue なら true を返す。
  3. HasCallInTailPosition(CaseClause, call) を返す。
CaseClause : case Expression : StatementListopt DefaultClause : default : StatementListopt
  1. StatementList があれば HasCallInTailPosition(StatementList, call) を返す。
  2. false を返す。
TryStatement : try Block Catch
  1. HasCallInTailPosition(Catch, call) を返す。
TryStatement : try Block Finally try Block Catch Finally
  1. HasCallInTailPosition(Finally, call) を返す。
Catch : catch ( CatchParameter ) Block
  1. HasCallInTailPosition(Block, call) を返す。
AssignmentExpression : YieldExpression ArrowFunction AsyncArrowFunction LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression LeftHandSideExpression &&= AssignmentExpression LeftHandSideExpression ||= AssignmentExpression LeftHandSideExpression ??= AssignmentExpression BitwiseANDExpression : BitwiseANDExpression & EqualityExpression BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression EqualityExpression : EqualityExpression == RelationalExpression EqualityExpression != RelationalExpression EqualityExpression === RelationalExpression EqualityExpression !== RelationalExpression RelationalExpression : RelationalExpression < ShiftExpression RelationalExpression > ShiftExpression RelationalExpression <= ShiftExpression RelationalExpression >= ShiftExpression RelationalExpression instanceof ShiftExpression RelationalExpression in ShiftExpression PrivateIdentifier in ShiftExpression ShiftExpression : ShiftExpression << AdditiveExpression ShiftExpression >> AdditiveExpression ShiftExpression >>> AdditiveExpression AdditiveExpression : AdditiveExpression + MultiplicativeExpression AdditiveExpression - MultiplicativeExpression MultiplicativeExpression : MultiplicativeExpression MultiplicativeOperator ExponentiationExpression ExponentiationExpression : UpdateExpression ** ExponentiationExpression UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- ++ UnaryExpression -- UnaryExpression UnaryExpression : delete UnaryExpression void UnaryExpression typeof UnaryExpression + UnaryExpression - UnaryExpression ~ UnaryExpression ! UnaryExpression AwaitExpression CallExpression : SuperCall ImportCall CallExpression [ Expression ] CallExpression . IdentifierName CallExpression . PrivateIdentifier NewExpression : new NewExpression MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName SuperProperty MetaProperty new MemberExpression Arguments MemberExpression . PrivateIdentifier PrimaryExpression : this IdentifierReference Literal ArrayLiteral ObjectLiteral FunctionExpression ClassExpression GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral
  1. false を返す。
Expression : AssignmentExpression Expression , AssignmentExpression
  1. HasCallInTailPosition(AssignmentExpression, call) を返す。
ConditionalExpression : ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
  1. has を最初の AssignmentExpression の HasCallInTailPosition(…, call) とする。
  2. hastrue なら true を返す。
  3. 2 番目の AssignmentExpression の HasCallInTailPosition(…, call) を返す。
LogicalANDExpression : LogicalANDExpression && BitwiseORExpression
  1. HasCallInTailPosition(BitwiseORExpression, call) を返す。
LogicalORExpression : LogicalORExpression || LogicalANDExpression
  1. HasCallInTailPosition(LogicalANDExpression, call) を返す。
CoalesceExpression : CoalesceExpressionHead ?? BitwiseORExpression
  1. HasCallInTailPosition(BitwiseORExpression, call) を返す。
CallExpression : CoverCallExpressionAndAsyncArrowHead CallExpression Arguments CallExpression TemplateLiteral
  1. この CallExpressioncall なら true を返す。
  2. false を返す。
OptionalExpression : MemberExpression OptionalChain CallExpression OptionalChain OptionalExpression OptionalChain
  1. HasCallInTailPosition(OptionalChain, call) を返す。
OptionalChain : ?. [ Expression ] ?. IdentifierName ?. PrivateIdentifier OptionalChain [ Expression ] OptionalChain . IdentifierName OptionalChain . PrivateIdentifier
  1. false を返す。
OptionalChain : ?. Arguments OptionalChain Arguments
  1. この OptionalChaincall なら true を返す。
  2. false を返す。
MemberExpression : MemberExpression TemplateLiteral
  1. この MemberExpressioncall なら true を返す。
  2. false を返す。
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprCoverParenthesizedExpressionAndArrowParameterList が覆う ParenthesizedExpression とする。
  2. HasCallInTailPosition(expr, call) を返す。
ParenthesizedExpression : ( Expression )
  1. HasCallInTailPosition(Expression, call) を返す。

15.10.3 PrepareForTailCall ( )

The abstract operation PrepareForTailCall takes no arguments and returns unused. It performs the following steps when called:

  1. Assert: 現在の実行コンテキストは以後 ECMAScript コードや組込み関数の評価に再利用されない。続いて呼び出される Call はその評価前に新しい実行コンテキストを生成し push する。
  2. 現在の実行コンテキストに関連する全リソースを破棄する。
  3. unused を返す。

末尾位置呼び出しは、現在実行中の関数実行コンテキストに結び付く一時的内部リソースをターゲット関数の呼び出し前に解放するか、その関数のために再利用しなければならない。

Note

例えば末尾位置呼び出しは、ターゲット関数のアクティベーションレコードが呼出元より大きい差分のみスタックを増加させるべきである。ターゲットの方が小さいなら総スタックサイズは減少すべきである。

16 ECMAScript 言語: スクリプトとモジュール

16.1 スクリプト

構文

Script : ScriptBodyopt ScriptBody : StatementList[~Yield, ~Await, ~Return]

16.1.1 静的意味論: 早期エラー

Script : ScriptBody
  • ScriptBody の LexicallyDeclaredNames に重複するエントリが含まれている場合、構文エラーである。
  • ScriptBody の LexicallyDeclaredNames の任意の要素が ScriptBody の VarDeclaredNames にも出現する場合、構文エラーである。
ScriptBody : StatementList
  • super を含むソーステキストが直接 eval によって処理される eval コードでない限り、StatementListsuper を含む場合は構文エラーである。直接 eval 内での super に関する追加の早期エラー規則19.2.1.1 で定義されている。
  • NewTarget を含むソーステキストが直接 eval によって処理される eval コードでない限り、StatementListNewTarget を含む場合は構文エラーである。直接 eval での NewTarget に関する追加の早期エラー規則19.2.1.1 で定義されている。
  • 引数 « » での StatementList の ContainsDuplicateLabels が true の場合、構文エラーである。
  • 引数 « » での StatementList の ContainsUndefinedBreakTarget が true の場合、構文エラーである。
  • 引数 « » と « » での StatementList の ContainsUndefinedContinueTarget が true の場合、構文エラーである。
  • ScriptBody を含むソーステキストが直接 eval によって処理される eval コードでない限り、引数 « » での StatementList の AllPrivateIdentifiersValid が false の場合は構文エラーである。

16.1.2 静的意味論: ScriptIsStrict : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Script : ScriptBodyopt
  1. ScriptBody が存在し、ScriptBody の Directive Prologue に Use Strict Directive が含まれている場合は true を返し、そうでなければ false を返す。

16.1.3 実行時意味論: 評価

Script : [empty]
  1. undefined を返す。

16.1.4 Script Record

Script Record は、評価されるスクリプトに関する情報をカプセル化する。各 Script RecordTable 37 にリストされたフィールドを含む。

Table 37: Script Record フィールド
フィールド名 値の型 意味
[[Realm]] Realm Record このスクリプトが作成されたレルム。
[[ECMAScriptCode]] Script Parse Node このスクリプトのソーステキストを解析した結果。
[[LoadedModules]] LoadedModuleRequest Record のリスト このスクリプトによってインポートされた指定子文字列から解決された Module Record へのマップ。リストには ModuleRequestsEqual(r1, r2) が true となる異なる Record r1r2 は含まれない。
[[HostDefined]] 任意(デフォルト値は empty スクリプトに追加情報を関連付ける必要があるホスト環境による使用のために予約されたフィールド。

16.1.5 ParseScript ( sourceText, realm, hostDefined )

The abstract operation ParseScript takes arguments sourceText (ECMAScript ソーステキスト), realm (Realm Record), and hostDefined (任意) and returns Script Record または SyntaxError オブジェクトの空でないリスト. sourceTextScript として解析した結果に基づいて Script Record を作成する。 It performs the following steps when called:

  1. script を ParseText(sourceText, Script) とする。
  2. script がエラーのリストである場合、script を返す。
  3. Script Record { [[Realm]]: realm, [[ECMAScriptCode]]: script, [[LoadedModules]]: « », [[HostDefined]]: hostDefined } を返す。
Note

実装は、そのスクリプトソーステキストに対する ParseScript の評価より前に、スクリプトソーステキストを解析し早期エラー条件を分析してもよい。ただし、エラーの報告は、この仕様が実際にそのソーステキストに対して ParseScript を実行する時点まで延期されなければならない。

16.1.6 ScriptEvaluation ( scriptRecord )

The abstract operation ScriptEvaluation takes argument scriptRecord (Script Record) and returns ECMAScript 言語値を含む通常完了か異常完了. It performs the following steps when called:

  1. globalEnvscriptRecord.[[Realm]].[[GlobalEnv]] とする。
  2. scriptContext を新しい ECMAScript コード実行コンテキストとする。
  3. scriptContext の Function を null に設定する。
  4. scriptContextRealmscriptRecord.[[Realm]] に設定する。
  5. scriptContext の ScriptOrModule を scriptRecord に設定する。
  6. scriptContext の VariableEnvironment を globalEnv に設定する。
  7. scriptContext の LexicalEnvironment を globalEnv に設定する。
  8. scriptContext の PrivateEnvironment を null に設定する。
  9. 実行中の実行コンテキストを中断する。
  10. scriptContext を実行コンテキストスタックにプッシュする;scriptContext が実行中の実行コンテキストとなる。
  11. scriptscriptRecord.[[ECMAScriptCode]] とする。
  12. resultCompletion(GlobalDeclarationInstantiation(script, globalEnv)) とする。
  13. result が通常完了の場合、
    1. resultCompletion(Evaluation of script) に設定する。
    2. result が通常完了で result.[[Value]]empty の場合、
      1. resultNormalCompletion(undefined) に設定する。
  14. scriptContext を中断し、実行コンテキストスタックから除去する。
  15. Assert: 実行コンテキストスタックは空でない。
  16. 実行コンテキストスタックの最上位にあるコンテキストを実行中の実行コンテキストとして再開する。
  17. result を返す。

16.1.7 GlobalDeclarationInstantiation ( script, env )

The abstract operation GlobalDeclarationInstantiation takes arguments script (Script Parse Node) and env (Global Environment Record) and returns unused を含む通常完了か投げ完了. script は実行コンテキストが確立される Script である。env は束縛が作成されるグローバル環境である。

Note 1

スクリプトを評価するために実行コンテキストが確立されるとき、宣言は現在のグローバル環境でインスタンス化される。コードで宣言された各グローバル束縛がインスタンス化される。

呼び出されたとき、次の手順を実行する:

  1. lexNamesscript の LexicallyDeclaredNames とする。
  2. varNamesscript の VarDeclaredNames とする。
  3. lexNames の各要素 name について、
    1. HasLexicalDeclaration(env, name) が true の場合、SyntaxError 例外を投げる。
    2. hasRestrictedGlobal を ? HasRestrictedGlobalProperty(env, name) とする。
    3. 注: グローバル var および function 束縛(非 strict 直接 eval によって導入されるものを除く)は非設定可能であり、したがって制限されたグローバルプロパティである。
    4. hasRestrictedGlobaltrue の場合、SyntaxError 例外を投げる。
  4. varNames の各要素 name について、
    1. HasLexicalDeclaration(env, name) が true の場合、SyntaxError 例外を投げる。
  5. varDeclarationsscript の VarScopedDeclarations とする。
  6. functionsToInitialize を新しい空のリストとする。
  7. declaredFunctionNames を新しい空のリストとする。
  8. varDeclarations の各要素 d について、逆順で、
    1. dVariableDeclarationForBinding、または BindingIdentifier のいずれでもない場合、
      1. Assert: dFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclaration、または AsyncGeneratorDeclaration のいずれかである。
      2. 注: 同じ名前に対して複数の関数宣言がある場合、最後の宣言が使用される。
      3. fnd の BoundNames の唯一の要素とする。
      4. declaredFunctionNamesfn を含まない場合、
        1. fnDefinable を ? CanDeclareGlobalFunction(env, fn) とする。
        2. fnDefinablefalse の場合、TypeError 例外を投げる。
        3. fndeclaredFunctionNames に追加する。
        4. dfunctionsToInitialize の最初の要素として挿入する。
  9. declaredVarNames を新しい空のリストとする。
  10. varDeclarations の各要素 d について、
    1. dVariableDeclarationForBinding、または BindingIdentifier のいずれかの場合、
      1. d の BoundNames の各文字列 vn について、
        1. declaredFunctionNamesvn を含まない場合、
          1. vnDefinable を ? CanDeclareGlobalVar(env, vn) とする。
          2. vnDefinablefalse の場合、TypeError 例外を投げる。
          3. declaredVarNamesvn を含まない場合、
            1. vndeclaredVarNames に追加する。
  11. 注: グローバルオブジェクトが通常のオブジェクトの場合、このアルゴリズムステップ以降に異常終了は発生しない。ただし、グローバルオブジェクトが Proxy exotic オブジェクトの場合、以下のステップの一部で異常終了を引き起こす動作を示すことがある。
  12. Normative Optional
    ホストが Web ブラウザであるか、または ブロックレベル Function 宣言 (Web レガシー互換意味論) をサポートする場合、
    1. strictscript の ScriptIsStrict とする。
    2. strictfalse の場合、
      1. declaredFunctionOrVarNamesdeclaredFunctionNamesdeclaredVarNames のリスト連結とする。
      2. script Contains xtrue となる任意の BlockCaseClause、または DefaultClause xStatementList に直接含まれる各 FunctionDeclaration f について、
        1. FfBindingIdentifier の StringValue とする。
        2. FunctionDeclaration fFBindingIdentifier として持つ VariableStatement で置き換えても script に早期エラーが発生しない場合、
          1. HasLexicalDeclaration(env, F) が false の場合、
            1. fnDefinable を ? CanDeclareGlobalVar(env, F) とする。
            2. fnDefinabletrue の場合、
              1. 注: F の var 束縛は、VarDeclaredName でも他の FunctionDeclaration の名前でもない場合にのみここでインスタンス化される。
              2. declaredFunctionOrVarNamesF を含まない場合、
                1. CreateGlobalVarBinding(env, F, false) を実行する。
                2. FdeclaredFunctionOrVarNames に追加する。
              3. FunctionDeclaration f が評価されるとき、15.2.6 で提供される FunctionDeclaration 評価アルゴリズムの代わりに次の手順を実行する:
                1. gEnv を実行中の実行コンテキストの VariableEnvironment とする。
                2. bEnv を実行中の実行コンテキストの LexicalEnvironment とする。
                3. fObj を ! bEnv.GetBindingValue(F, false) とする。
                4. gEnv.SetMutableBinding(F, fObj, false) を実行する。
                5. unused を返す。
  13. lexDeclarationsscript の LexicallyScopedDeclarations とする。
  14. privateEnvnull とする。
  15. lexDeclarations の各要素 d について、
    1. 注: 字句的に宣言された名前はここでインスタンス化されるが初期化されない。
    2. d の BoundNames の各要素 dn について、
      1. d の IsConstantDeclaration が true の場合、
        1. env.CreateImmutableBinding(dn, true) を実行する。
      2. そうでなければ、
        1. env.CreateMutableBinding(dn, false) を実行する。
  16. functionsToInitialize の各 Parse Node f について、
    1. fnf の BoundNames の唯一の要素とする。
    2. fo を引数 envprivateEnv での f の InstantiateFunctionObject とする。
    3. CreateGlobalFunctionBinding(env, fn, fo, false) を実行する。
  17. declaredVarNames の各文字列 vn について、
    1. CreateGlobalVarBinding(env, vn, false) を実行する。
  18. unused を返す。
Note 2

16.1.1 で指定された早期エラーは、単一の Script に含まれる宣言について、function/var 宣言と let/const/class 宣言の間の名前の競合、および let/const/class 束縛の再宣言を防ぐ。ただし、複数の Script にまたがるそのような競合と再宣言は、GlobalDeclarationInstantiation 中に実行時エラーとして検出される。そのようなエラーが検出された場合、スクリプトの束縛はインスタンス化されない。ただし、グローバルオブジェクトが Proxy exotic オブジェクトを使用して定義されている場合、競合する宣言の実行時テストが信頼できない場合があり、異常完了となり一部のグローバル宣言がインスタンス化されない可能性がある。これが発生した場合、Script のコードは評価されない。

明示的な var または function 宣言とは異なり、グローバルオブジェクトに直接作成されるプロパティは、let/const/class 宣言によってシャドウされる可能性があるグローバル束縛をもたらす。

16.2 モジュール

構文

Module : ModuleBodyopt ModuleBody : ModuleItemList ModuleItemList : ModuleItem ModuleItemList ModuleItem ModuleItem : ImportDeclaration ExportDeclaration StatementListItem[~Yield, +Await, ~Return] ModuleExportName : IdentifierName StringLiteral

16.2.1 モジュール意味論

16.2.1.1 静的意味論: 早期エラー

ModuleBody : ModuleItemList
  • ModuleItemList の LexicallyDeclaredNames に重複するエントリが含まれている場合、構文エラーである。
  • ModuleItemList の LexicallyDeclaredNames の任意の要素が ModuleItemList の VarDeclaredNames にも出現する場合、構文エラーである。
  • ModuleItemList の ExportedNames に重複するエントリが含まれている場合、構文エラーである。
  • ModuleItemList の ExportedBindings の任意の要素が ModuleItemList の VarDeclaredNames または LexicallyDeclaredNames のいずれにも出現しない場合、構文エラーである。
  • ModuleItemListsuper を含む場合、構文エラーである。
  • ModuleItemListNewTarget を含む場合、構文エラーである。
  • 引数 « » での ModuleItemList の ContainsDuplicateLabels が true の場合、構文エラーである。
  • 引数 « » での ModuleItemList の ContainsUndefinedBreakTarget が true の場合、構文エラーである。
  • 引数 « » と « » での ModuleItemList の ContainsUndefinedContinueTarget が true の場合、構文エラーである。
  • 引数 « » での ModuleItemList の AllPrivateIdentifiersValid が false の場合、構文エラーである。
Note

重複する ExportedNames ルールは、ModuleBody 内で複数の export default ExportDeclaration 項目が構文エラーであることを意味する。競合または重複する宣言に関する追加のエラー条件は、Module の評価に先立つモジュールリンキング中にチェックされる。そのようなエラーが検出された場合、Module は評価されない。

ModuleExportName : StringLiteral
  • IsStringWellFormedUnicode(SV of StringLiteral) が false の場合、構文エラーである。

16.2.1.2 静的意味論: ImportedLocalNames ( importEntries: ImportEntry Record のリスト, ): 文字列のリスト

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. importEntries によって定義されるすべてのローカル名束縛のリストを作成する。 It performs the following steps when called:

  1. localNames を新しい空のリストとする。
  2. importEntries の各 ImportEntry Record i について、
    1. i.[[LocalName]]localNames に追加する。
  3. localNames を返す。

16.2.1.3 ModuleRequest Record

ModuleRequest Record は、指定されたインポート属性でモジュールをインポートするリクエストを表す。次のフィールドで構成される:

Table 38: ModuleRequest Record フィールド
フィールド名 値の型 意味
[[Specifier]] 文字列 モジュール指定子
[[Attributes]] ImportAttribute Record のリスト インポート属性

LoadedModuleRequest Record は、モジュールをインポートするリクエストと結果として得られる Module Record を一緒に表す。表 Table 38 で定義された同じフィールドに加えて、[[Module]] が追加される:

Table 39: LoadedModuleRequest Record フィールド
フィールド名 値の型 意味
[[Specifier]] 文字列 モジュール指定子
[[Attributes]] ImportAttribute Record のリスト インポート属性
[[Module]] Module Record このモジュールリクエストに対応するロードされたモジュール

ImportAttribute Record は次のフィールドで構成される:

Table 40: ImportAttribute Record フィールド
フィールド名 値の型 意味
[[Key]] 文字列 属性キー
[[Value]] 文字列 属性値

16.2.1.3.1 ModuleRequestsEqual ( left, right )

The abstract operation ModuleRequestsEqual takes arguments left (ModuleRequest Record または LoadedModuleRequest Record) and right (ModuleRequest Record または LoadedModuleRequest Record) and returns Boolean. It performs the following steps when called:

  1. left.[[Specifier]]right.[[Specifier]] でない場合、false を返す。
  2. leftAttrsleft.[[Attributes]] とする。
  3. rightAttrsright.[[Attributes]] とする。
  4. leftAttrsCountleftAttrs の要素数とする。
  5. rightAttrsCountrightAttrs の要素数とする。
  6. leftAttrsCountrightAttrsCount の場合、false を返す。
  7. leftAttrs の各 ImportAttribute Record l について、
    1. rightAttrsl.[[Key]]r.[[Key]]l.[[Value]]r.[[Value]] である ImportAttribute Record r が含まれていない場合、false を返す。
  8. true を返す。

16.2.1.4 静的意味論: ModuleRequests : ModuleRequest Record のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空のリストを返す。
ModuleItemList : ModuleItem
  1. ModuleItem の ModuleRequests を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. requestsModuleItemList の ModuleRequests とする。
  2. additionalRequestsModuleItem の ModuleRequests とする。
  3. additionalRequests の各 ModuleRequest Record mr について、
    1. requestsModuleRequestsEqual(mr, mr2) が true である ModuleRequest Record mr2 が含まれていない場合、
      1. mrrequests に追加する。
  4. requests を返す。
ModuleItem : StatementListItem
  1. 新しい空のリストを返す。
ImportDeclaration : import ImportClause FromClause ;
  1. specifierFromClause の SV とする。
  2. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » } であるリストを返す。
ImportDeclaration : import ImportClause FromClause WithClause ;
  1. specifierFromClause の SV とする。
  2. attributesWithClause の WithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attributes } であるリストを返す。
ImportDeclaration : import ModuleSpecifier ;
  1. specifierModuleSpecifier の SV とする。
  2. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » } であるリストを返す。
ImportDeclaration : import ModuleSpecifier WithClause ;
  1. specifierModuleSpecifier の SV とする。
  2. attributesWithClause の WithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attributes } であるリストを返す。
ExportDeclaration : export ExportFromClause FromClause ;
  1. specifierFromClause の SV とする。
  2. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » } であるリストを返す。
ExportDeclaration : export ExportFromClause FromClause WithClause ;
  1. specifierFromClause の SV とする。
  2. attributesWithClause の WithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attributes } であるリストを返す。
ExportDeclaration : export NamedExports ; export VariableStatement export Declaration export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. 新しい空のリストを返す。

16.2.1.5 抽象モジュールレコード

Module Record は、単一のモジュールのインポートとエクスポートの構造情報をカプセル化する。この情報は、接続されたモジュール群のインポートとエクスポートをリンクするために使用される。Module Record には、モジュールを評価するときにのみ使用される4つのフィールドが含まれている。

仕様の目的上、Module Record 値は Record 仕様型の値であり、Module Record が抽象クラスであり、抽象および具象サブクラスの両方を持つ単純なオブジェクト指向階層に存在するものと考えることができる。この仕様では、Cyclic Module Record という名前の抽象サブクラスと、その具象サブクラスである Source Text Module Record を定義している。他の仕様や実装では、それらが定義する代替モジュール定義機能に対応する追加の Module Record サブクラスを定義してもよい。

Module Record は Table 41 にリストされたフィールドを定義する。すべての Module Definition サブクラスには、少なくともこれらのフィールドが含まれる。Module Record はまた、Table 42 の抽象メソッドリストも定義する。すべての Module definition サブクラスは、これらの抽象メソッドの具象実装を提供しなければならない。

Table 41: Module Record フィールド
フィールド名 値の型 意味
[[Realm]] Realm Record このモジュールが作成されたレルム。
[[Environment]] Module Environment Record または empty このモジュールのトップレベル束縛を含む Environment Record。このフィールドはモジュールがリンクされるときに設定される。
[[Namespace]] Object または empty このモジュールに対して作成されている場合の Module Namespace Object(28.3)。
[[HostDefined]] 任意(デフォルト値は undefined モジュールに追加情報を関連付ける必要があるホスト環境による使用のために予約されたフィールド。
Table 42: Module Record の抽象メソッド
メソッド 目的
LoadRequestedModules([hostDefined])

すべての依存関係を再帰的にロードしてモジュールをリンキング用に準備し、プロミスを返す。

GetExportedNames([exportStarSet])

このモジュールから直接または間接的にエクスポートされるすべての名前のリストを返す。

このメソッドを呼び出す前に LoadRequestedModules が正常に完了している必要がある。

ResolveExport(exportName [, resolveSet])

このモジュールによってエクスポートされる名前の束縛を返す。束縛は { [[Module]]: Module Record, [[BindingName]]: String | namespace } の形式の ResolvedBinding Record で表される。エクスポートが任意のモジュールに直接束縛を持たない Module Namespace Object の場合、[[BindingName]]namespace に設定される。名前を解決できない場合は null を返し、複数の束縛が見つかった場合は ambiguous を返す。

この操作が特定の exportName, resolveSet ペアを引数として呼び出されるたびに、同じ結果を返さなければならない。

このメソッドを呼び出す前に LoadRequestedModules が正常に完了している必要がある。

Link()

すべてのモジュール依存関係を遷移的に解決し、Module Environment Record を作成してモジュールを評価用に準備する。

このメソッドを呼び出す前に LoadRequestedModules が正常に完了している必要がある。

Evaluate()

このモジュールとその依存関係の評価のプロミスを返す。評価が成功した場合または既に正常に評価されている場合は解決し、評価エラーまたは既に評価に失敗している場合は拒否する。プロミスが拒否された場合、ホストはプロミス拒否を処理し、評価エラーを再スローすることが期待される。

このメソッドを呼び出す前に Link が正常に完了している必要がある。

16.2.1.5.1 EvaluateModuleSync ( module )

The abstract operation EvaluateModuleSync takes argument module (Module Record) and returns unused を含む通常完了か投げ完了. 呼び出し元が module の評価が既に決定されたプロミスを返すことを保証する場合に、module を同期的に評価する。 It performs the following steps when called:

  1. Assert: moduleCyclic Module Record ではない。
  2. promisemodule.Evaluate() とする。
  3. Assert: promise.[[PromiseState]]fulfilled または rejected のいずれかである。
  4. promise.[[PromiseState]]rejected の場合、
    1. promise.[[PromiseIsHandled]]false の場合、HostPromiseRejectionTracker(promise, "handle") を実行する。
    2. promise.[[PromiseIsHandled]]true に設定する。
    3. ThrowCompletion(promise.[[PromiseResult]]) を返す。
  5. unused を返す。

16.2.1.6 循環モジュールレコード (Cyclic Module Records)

Cyclic Module Record は、Cyclic Module Record 型のサブクラスである他のモジュールと依存サイクルを形成し得るモジュールに関する情報を表現するために用いられる。Cyclic Module Record 型のサブクラスではない Module Record は、Source Text Module Record との依存サイクルに参加してはならない。

Table 41 で定義されたフィールドに加えて、Cyclic Module RecordTable 43 に列挙される追加フィールドを持つ。

Table 43: Cyclic Module Record の追加フィールド
フィールド名 値の型 意味
[[Status]] new, unlinked, linking, linked, evaluating, evaluating-async, または evaluated 初期値は new。モジュールのライフサイクル進行に伴って unlinked, linking, linked, evaluating, (必要に応じて)evaluating-async, evaluated と順に遷移する。evaluating-async は、このモジュールが非同期依存の完了後に実行キューへ入ったか、[[HasTLA]] フィールドが true で実行済みでトップレベル完了待ちであることを示す。
[[EvaluationError]] throw completion または empty 評価中に発生した例外を表す throw completion。例外が発生していない、または [[Status]]evaluated でない場合は undefined
[[DFSAncestorIndex]] 整数または empty Link と Evaluate 中のみ使用される補助フィールド。[[Status]]linking または evaluating のとき、モジュール自身の深さ優先走査インデックス、または同じ強連結成分内の「より早い」モジュールのそれ。
[[RequestedModules]] ModuleRequest Record のリスト そのモジュール内の import に対応する ModuleRequest Record のリスト。ソーステキスト出現順で並ぶ。
[[LoadedModules]] LoadedModuleRequest Record のリスト このレコードが表すモジュールが使用した指定子文字列と解決済み Module Record との(相対的インポート属性を含む)対応。ModuleRequestsEqual(r1, r2) が true となる異なる Record r1r2 を同時に含まない。
[[CycleRoot]] Cyclic Module Record または empty サイクル内で最初に訪れたモジュール(強連結成分の DFS ルート)。サイクル外ならモジュール自身。Evaluate 完了後、モジュールの [[DFSAncestorIndex]] はその [[CycleRoot]] の深さ優先インデックスとなる。
[[HasTLA]] Boolean このモジュール自体が個別に非同期かどうか(例: top-level await を含む Source Text Module Record)。非同期依存があるだけでは true にはならない。パース後に変更されてはならない。
[[AsyncEvaluationOrder]] unset, 整数, または done 初期値 unset。完全同期モジュールでは unset のまま。自身が非同期または非同期依存を持つ場合、16.2.1.6.1.3.4 により保留モジュール実行をキューする順序を決める整数を設定。保留モジュールが実行されたら done
[[TopLevelCapability]] PromiseCapability Record または empty あるサイクルの [[CycleRoot]] で、かつそのサイクル内のモジュールに Evaluate() が呼ばれた場合、その全評価の PromiseCapability Record を保持。Evaluate() 抽象メソッドが返す Promise を解決・拒否するために用いる。サイクル内依存でもトップレベル Evaluate() が開始されていなければ empty
[[AsyncParentModules]] Cyclic Module Record のリスト このモジュールまたは依存に [[HasTLA]] true があり実行進行中の場合、トップレベル実行ジョブにおける親インポーターを追跡。親モジュールはこのモジュールが成功完了するまで実行を開始しない。
[[PendingAsyncDependencies]] 整数または empty 非同期依存がある場合、残り非同期依存モジュールの数。これが 0 になり実行エラーがなければモジュールは実行される。

Table 42 で定義されたメソッドに加えて、Cyclic Module RecordTable 44 に列挙される追加抽象メソッドを持つ。

Table 44: Cyclic Module Record の追加抽象メソッド
メソッド 目的
InitializeEnvironment() すべてのインポート束縛解決を含めモジュールの Environment Record を初期化し、実行コンテキストを作成する。
ExecuteModule([promiseCapability]) モジュールのコードをその実行コンテキスト内で評価。[[HasTLA]]true の場合は PromiseCapability Record が引数で渡され、その capability を resolve / reject する責務を持つ。この場合メソッドは例外を throw せず、必要なら PromiseCapability Record を reject しなければならない。

GraphLoadingState Record はモジュールグラフの読み込み過程に関する情報を保持し、HostLoadImportedModule 呼び出し後の読み込み継続に用いる。各 GraphLoadingState RecordTable 45 で定義されるフィールドを持つ:

Table 45: GraphLoadingState Record フィールド
フィールド名 値の型 意味
[[PromiseCapability]] PromiseCapability Record 読み込み処理完了時に解決する Promise。
[[IsLoading]] Boolean 成功またはエラーでまだ終了していなければ true
[[PendingModulesCount]] 非負整数 保留中の HostLoadImportedModule 呼び出し数を追跡。
[[Visited]] Cyclic Module Record のリスト 現在の読み込み過程ですでにロードされた Cyclic Module Record のリスト。循環依存による無限ループ防止。
[[HostDefined]] 任意(初期値 empty LoadRequestedModules 呼び出し元から HostLoadImportedModule へ渡すホスト定義データ。

16.2.1.6.1 Module Record 抽象メソッドの実装

以下は Table 42 で定義された Module Record 抽象メソッドを実装する Cyclic Module Record の具象メソッドである。

16.2.1.6.1.1 LoadRequestedModules ( [ hostDefined ] )

The LoadRequestedModules concrete method of Cyclic Module Record module takes optional argument hostDefined (anything) and returns Promise. module の依存グラフ内すべての Module Record[[LoadedModules]] を埋める(実作業の大半は補助関数 InnerModuleLoading が行う)。オプションの hostDefinedHostLoadImportedModule フックに渡される。 It performs the following steps when called:

  1. hostDefined が与えられないなら hostDefinedempty とする。
  2. pc を ! NewPromiseCapability(%Promise%) とする。
  3. stateGraphLoadingState Record { [[IsLoading]]: true, [[PendingModulesCount]]: 1, [[Visited]]: « », [[PromiseCapability]]: pc, [[HostDefined]]: hostDefined } とする。
  4. InnerModuleLoading(state, module) を実行する。
  5. pc.[[Promise]] を返す。
Note
hostDefined パラメータはインポートモジュール取得に必要な追加情報を渡すために利用できる。例えば HTML では <link rel="preload" as="..."> の適切な fetch destination 設定に使う。import() 式は hostDefined を設定しない。

16.2.1.6.1.1.1 InnerModuleLoading ( state, module )

The abstract operation InnerModuleLoading takes arguments state (GraphLoadingState Record) and module (Module Record) and returns unused. LoadRequestedModules により再帰的に module 依存グラフの実際の読み込みを行うために使用される。 It performs the following steps when called:

  1. Assert: state.[[IsLoading]]true
  2. もし moduleCyclic Module Record で、module.[[Status]]new、かつ state.[[Visited]]module を含まないなら
    1. modulestate.[[Visited]] に追加する。
    2. requestedModulesCountmodule.[[RequestedModules]] の要素数とする。
    3. state.[[PendingModulesCount]]state.[[PendingModulesCount]] + requestedModulesCount に設定。
    4. module.[[RequestedModules]] の各 ModuleRequest Record request について
      1. AllImportAttributesSupported(request.[[Attributes]]) が false なら
        1. errorThrowCompletion(新たに生成した SyntaxError オブジェクト) とする。
        2. ContinueModuleLoading(state, error) を実行。
      2. そうでなく module.[[LoadedModules]]ModuleRequestsEqual(record, request) が true となる LoadedModuleRequest Record record が含まれるなら
        1. InnerModuleLoading(state, record.[[Module]]) を実行。
      3. それ以外
        1. HostLoadImportedModule(module, request, state.[[HostDefined]], state) を実行。
        2. 注: HostLoadImportedModuleFinishLoadingImportedModule を呼び、ContinueModuleLoading を通じてグラフ読み込みに再突入する。
      4. state.[[IsLoading]]false なら unused を返す。
  3. Assert: state.[[PendingModulesCount]] ≥ 1。
  4. state.[[PendingModulesCount]] を 1 減らす。
  5. もし state.[[PendingModulesCount]] = 0 なら
    1. state.[[IsLoading]]false に設定。
    2. state.[[Visited]] の各 Cyclic Module Record loaded について
      1. もし loaded.[[Status]]new なら unlinked に設定。
    3. ! Call(state.[[PromiseCapability]].[[Resolve]], undefined, « undefined ») を実行。
  6. unused を返す。

16.2.1.6.1.1.2 ContinueModuleLoading ( state, moduleCompletion )

The abstract operation ContinueModuleLoading takes arguments state (GraphLoadingState Record) and moduleCompletion (モジュール Record を含む通常完了または throw completion) and returns unused. HostLoadImportedModule 呼び出し後に読み込み処理へ再突入するために用いる。 It performs the following steps when called:

  1. state.[[IsLoading]]false なら unused を返す。
  2. moduleCompletion が通常完了なら
    1. InnerModuleLoading(state, moduleCompletion.[[Value]]) を実行。
  3. そうでなければ
    1. state.[[IsLoading]]false に設定。
    2. ! Call(state.[[PromiseCapability]].[[Reject]], undefined, « moduleCompletion.[[Value]] ») を実行。
  4. unused を返す。

16.2.1.6.1.2 Link ( )

The Link concrete method of Cyclic Module Record module takes no arguments and returns unused を含む通常完了または throw completion. 成功時、Link はこのモジュールの [[Status]]unlinked から linked に遷移させる。失敗時は例外を投げ、[[Status]]unlinked のまま。(実作業の大半は補助関数 InnerModuleLinking が行う。) It performs the following steps when called:

  1. Assert: module.[[Status]]unlinked, linked, evaluating-async, evaluated のいずれか。
  2. stack を新しい空リストとする。
  3. resultCompletion(InnerModuleLinking(module, stack, 0)) とする。
  4. もし resultabrupt completion なら
    1. stack の各 Cyclic Module Record m について
      1. Assert: m.[[Status]]linking
      2. m.[[Status]]unlinked に設定。
    2. Assert: module.[[Status]]unlinked
    3. result を返す。
  5. Assert: module.[[Status]]linked, evaluating-async, evaluated のいずれか。
  6. Assert: stack は空。
  7. unused を返す。

16.2.1.6.1.2.1 InnerModuleLinking ( module, stack, index )

The abstract operation InnerModuleLinking takes arguments module (Module Record), stack (Cyclic Module Record のリスト), and index (非負整数) and returns 非負整数を含む通常完了または throw completion. Link により module および依存グラフの他モジュールを再帰的にリンクする。stackindex、および各モジュールの [[DFSAncestorIndex]] は DFS 走査管理に用いられる。特に [[DFSAncestorIndex]] は強連結成分 (SCC) を発見し、その全モジュールを一括で linked に遷移させるために使われる。 It performs the following steps when called:

  1. moduleCyclic Module Record でないなら
    1. module.Link() を実行。
    2. index を返す。
  2. もし module.[[Status]]linking, linked, evaluating-async, evaluated のいずれかなら
    1. index を返す。
  3. Assert: module.[[Status]]unlinked
  4. module.[[Status]]linking に設定。
  5. moduleIndexindex とする。
  6. module.[[DFSAncestorIndex]]index に設定。
  7. indexindex + 1 に更新。
  8. modulestack に追加。
  9. module.[[RequestedModules]] の各 ModuleRequest Record request について
    1. requiredModuleGetImportedModule(module, request) とする。
    2. index を ? InnerModuleLinking(requiredModule, stack, index) に設定。
    3. もし requiredModuleCyclic Module Record なら
      1. Assert: requiredModule.[[Status]]linking, linked, evaluating-async, evaluated のいずれか。
      2. Assert: requiredModule.[[Status]]linking であることと stackrequiredModule を含むことは同値。
      3. もし requiredModule.[[Status]]linking なら
        1. module.[[DFSAncestorIndex]]min(module.[[DFSAncestorIndex]], requiredModule.[[DFSAncestorIndex]]) に設定。
  10. module.InitializeEnvironment() を実行。
  11. Assert: modulestack にちょうど 1 回出現。
  12. Assert: module.[[DFSAncestorIndex]]moduleIndex
  13. もし module.[[DFSAncestorIndex]] = moduleIndex なら
    1. donefalse とする。
    2. donefalse の間繰り返す
      1. requiredModulestack の最後の要素とする。
      2. 最後の要素を stack から除去。
      3. Assert: requiredModuleCyclic Module Record
      4. requiredModule.[[Status]]linked に設定。
      5. もし requiredModulemodule が同一なら donetrue に。
  14. index を返す。

16.2.1.6.1.3 Evaluate ( )

The Evaluate concrete method of Cyclic Module Record module takes no arguments and returns Promise. Evaluate は [[Status]]linked から evaluating-async または evaluated に遷移させる。与えられた強連結成分で最初に呼ばれたモジュールについては Promise を作成し、評価完了時に解決する。その Promise は成分の [[CycleRoot]][[TopLevelCapability]] に保持され、成分内の他モジュールでの後続呼び出しも同じ Promise を返す。(実作業の大半は補助関数 InnerModuleEvaluation が行う。) It performs the following steps when called:

  1. Assert: この Evaluate 呼び出しと同時並行で同エージェント内の別の Evaluate 呼び出しは起こっていない。
  2. Assert: module.[[Status]]linked, evaluating-async, evaluated のいずれか。
  3. もし module.[[Status]]evaluating-async または evaluated なら modulemodule.[[CycleRoot]] に置き換える。
  4. もし module.[[TopLevelCapability]]empty でないなら
    1. module.[[TopLevelCapability]].[[Promise]] を返す。
  5. stack を新しい空リストとする。
  6. capability を ! NewPromiseCapability(%Promise%) とする。
  7. module.[[TopLevelCapability]]capability に設定。
  8. resultCompletion(InnerModuleEvaluation(module, stack, 0)) とする。
  9. もし resultabrupt completion なら
    1. stack の各 Cyclic Module Record m について
      1. Assert: m.[[Status]]evaluating
      2. Assert: m.[[AsyncEvaluationOrder]]unset
      3. m.[[Status]]evaluated に設定。
      4. m.[[EvaluationError]]result に設定。
    2. Assert: module.[[Status]]evaluated
    3. Assert: module.[[EvaluationError]]result は同じ Completion Record
    4. ! Call(capability.[[Reject]], undefined, « result.[[Value]] ») を実行。
  10. それ以外
    1. Assert: module.[[Status]]evaluating-async または evaluated
    2. Assert: module.[[EvaluationError]]empty
    3. もし module.[[Status]]evaluated なら
      1. 注: 評価が同期的に完了したことを意味する。
      2. Assert: module.[[AsyncEvaluationOrder]]unset
      3. ! Call(capability.[[Resolve]], undefined, « undefined ») を実行。
    4. Assert: stack は空。
  11. capability.[[Promise]] を返す。

16.2.1.6.1.3.1 InnerModuleEvaluation ( module, stack, index )

The abstract operation InnerModuleEvaluation takes arguments module (Module Record), stack (Cyclic Module Record のリスト), and index (非負整数) and returns 非負整数を含む通常完了または throw completion. Evaluate が実際の評価処理を module および依存グラフ上の他モジュールへ再帰的に行う。stack, index および module.[[DFSAncestorIndex]] の用途は InnerModuleLinking と同様。 It performs the following steps when called:

  1. moduleCyclic Module Record でないなら
    1. EvaluateModuleSync(module) を実行。
    2. index を返す。
  2. もし module.[[Status]]evaluating-async または evaluated なら
    1. もし module.[[EvaluationError]]empty なら index を返す。
    2. それ以外なら ? module.[[EvaluationError]] を返す。
  3. もし module.[[Status]]evaluating なら index を返す。
  4. Assert: module.[[Status]]linked
  5. module.[[Status]]evaluating に設定。
  6. moduleIndexindex とする。
  7. module.[[DFSAncestorIndex]]index に設定。
  8. module.[[PendingAsyncDependencies]] を 0 に設定。
  9. indexindex + 1 に。
  10. modulestack に追加。
  11. module.[[RequestedModules]] の各 ModuleRequest Record request について
    1. requiredModuleGetImportedModule(module, request) とする。
    2. index を ? InnerModuleEvaluation(requiredModule, stack, index) に設定。
    3. もし requiredModuleCyclic Module Record なら
      1. Assert: requiredModule.[[Status]]evaluating, evaluating-async, evaluated のいずれか。
      2. Assert: requiredModule.[[Status]]evaluating であることと stack に含まれることは同値。
      3. もし requiredModule.[[Status]]evaluating なら
        1. module.[[DFSAncestorIndex]]min(module.[[DFSAncestorIndex]], requiredModule.[[DFSAncestorIndex]]) に設定。
      4. それ以外
        1. requiredModulerequiredModule.[[CycleRoot]] に設定。
        2. Assert: requiredModule.[[Status]]evaluating-async または evaluated
        3. もし requiredModule.[[EvaluationError]]empty でないなら ? requiredModule.[[EvaluationError]] を返す。
      5. もし requiredModule.[[AsyncEvaluationOrder]]整数なら
        1. module.[[PendingAsyncDependencies]] を 1 増やす。
        2. requiredModule.[[AsyncParentModules]]module を追加。
  12. もし module.[[PendingAsyncDependencies]] > 0 または module.[[HasTLA]]true なら
    1. Assert: module.[[AsyncEvaluationOrder]]unset
    2. module.[[AsyncEvaluationOrder]]IncrementModuleAsyncEvaluationCount() に設定。
    3. もし module.[[PendingAsyncDependencies]] = 0 なら ExecuteAsyncModule(module) を実行。
  13. それ以外
    1. module.ExecuteModule() を実行。
  14. Assert: modulestack にちょうど 1 回。
  15. Assert: module.[[DFSAncestorIndex]]moduleIndex
  16. もし module.[[DFSAncestorIndex]] = moduleIndex なら
    1. donefalse とする。
    2. donefalse の間
      1. requiredModulestack の最後の要素とする。
      2. 最後の要素を stack から除去。
      3. Assert: requiredModuleCyclic Module Record
      4. Assert: requiredModule.[[AsyncEvaluationOrder]]整数 または unset
      5. もし requiredModule.[[AsyncEvaluationOrder]]unset なら requiredModule.[[Status]]evaluated に。
      6. それ以外は evaluating-async に。
      7. もし requiredModulemodule が同一なら donetrue に。
      8. requiredModule.[[CycleRoot]]module に設定。
  17. index を返す。
Note 1

モジュールは InnerModuleEvaluation に走査されている間 evaluating[[HasTLA]]true か非同期依存がある場合、実行中は evaluating-async、完了後 evaluated

Note 2

非同期サイクルに属するモジュールに依存するモジュールは、サイクルが evaluating でない間、そのサイクルのルート ([[CycleRoot]]) の実行に依存する。これによりサイクル全体をルート状態を介した単一の強連結成分として扱える。

16.2.1.6.1.3.2 ExecuteAsyncModule ( module )

The abstract operation ExecuteAsyncModule takes argument module (Cyclic Module Record) and returns unused. It performs the following steps when called:

  1. Assert: module.[[Status]]evaluating または evaluating-async
  2. Assert: module.[[HasTLA]]true
  3. capability を ! NewPromiseCapability(%Promise%) とする。
  4. fulfilledClosure を、引数なしで module を捕捉し呼び出し時に以下を行う新しい Abstract Closure とする:
    1. AsyncModuleExecutionFulfilled(module) を実行。
    2. NormalCompletion(undefined) を返す。
  5. onFulfilledCreateBuiltinFunction(fulfilledClosure, 0, "", « ») とする。
  6. rejectedClosure を、引数 (error) を取り module を捕捉し以下を行う Abstract Closure とする:
    1. AsyncModuleExecutionRejected(module, error) を実行。
    2. NormalCompletion(undefined) を返す。
  7. onRejectedCreateBuiltinFunction(rejectedClosure, 0, "", « ») とする。
  8. PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected) を実行。
  9. module.ExecuteModule(capability) を実行。
  10. unused を返す。

16.2.1.6.1.3.3 GatherAvailableAncestors ( module, execList )

The abstract operation GatherAvailableAncestors takes arguments module (Cyclic Module Record) and execList (Cyclic Module Record のリスト) and returns unused. It performs the following steps when called:

  1. module.[[AsyncParentModules]] の各 Cyclic Module Record m について
    1. もし execListm を含まず、かつ m.[[CycleRoot]].[[EvaluationError]]empty なら
      1. Assert: m.[[Status]]evaluating-async
      2. Assert: m.[[EvaluationError]]empty
      3. Assert: m.[[AsyncEvaluationOrder]]整数
      4. Assert: m.[[PendingAsyncDependencies]] > 0。
      5. m.[[PendingAsyncDependencies]] を 1 減らす。
      6. もし 0 なら
        1. execListm を追加。
        2. もし m.[[HasTLA]]false なら GatherAvailableAncestors(m, execList) を実行。
  2. unused を返す。
Note

非同期実行が root module で充足された際、この関数は同期的に一括実行可能なモジュール集合を決定し execList を構築する。

16.2.1.6.1.3.4 AsyncModuleExecutionFulfilled ( module )

The abstract operation AsyncModuleExecutionFulfilled takes argument module (Cyclic Module Record) and returns unused. It performs the following steps when called:

  1. もし module.[[Status]]evaluated なら
    1. Assert: module.[[EvaluationError]]empty ではない。
    2. unused を返す。
  2. Assert: module.[[Status]]evaluating-async
  3. Assert: module.[[AsyncEvaluationOrder]]整数
  4. Assert: module.[[EvaluationError]]empty
  5. module.[[AsyncEvaluationOrder]]done に設定。
  6. module.[[Status]]evaluated に設定。
  7. もし module.[[TopLevelCapability]]empty でないなら
    1. Assert: module.[[CycleRoot]]module は同一 Module Record
    2. ! Call(module.[[TopLevelCapability]].[[Resolve]], undefined, « undefined ») を実行。
  8. execList を空リストとする。
  9. GatherAvailableAncestors(module, execList) を実行。
  10. Assert: execList の全要素は [[AsyncEvaluationOrder]]整数[[PendingAsyncDependencies]] が 0、[[EvaluationError]]empty
  11. sortedExecListexecList[[AsyncEvaluationOrder]] 昇順で並べたリストとする。
  12. sortedExecList の各 Cyclic Module Record m について
    1. もし m.[[Status]]evaluated なら
      1. Assert: m.[[EvaluationError]]empty ではない。
    2. Else if m.[[HasTLA]]true なら
      1. ExecuteAsyncModule(m) を実行。
    3. Else
      1. resultm.ExecuteModule() とする。
      2. もし resultabrupt completion なら
        1. AsyncModuleExecutionRejected(m, result.[[Value]]) を実行。
      3. それ以外
        1. m.[[AsyncEvaluationOrder]]done に。
        2. m.[[Status]]evaluated に。
        3. もし m.[[TopLevelCapability]]empty でないなら
          1. Assert: m.[[CycleRoot]]m は同一。
          2. ! Call(m.[[TopLevelCapability]].[[Resolve]], undefined, « undefined ») を実行。
  13. unused を返す。

16.2.1.6.1.3.5 AsyncModuleExecutionRejected ( module, error )

The abstract operation AsyncModuleExecutionRejected takes arguments module (Cyclic Module Record) and error (ECMAScript 言語値) and returns unused. It performs the following steps when called:

  1. もし module.[[Status]]evaluated なら
    1. Assert: module.[[EvaluationError]]empty ではない。
    2. unused を返す。
  2. Assert: module.[[Status]]evaluating-async
  3. Assert: module.[[AsyncEvaluationOrder]]整数
  4. Assert: module.[[EvaluationError]]empty
  5. module.[[EvaluationError]]ThrowCompletion(error) に設定。
  6. module.[[Status]]evaluated に設定。
  7. module.[[AsyncEvaluationOrder]]done に設定。
  8. 注: 対称性のため doneInnerModuleEvaluation では [[EvaluationError]]empty でない場合 [[AsyncEvaluationOrder]] は利用されない。
  9. module.[[AsyncParentModules]] の各 Cyclic Module Record m について
    1. AsyncModuleExecutionRejected(m, error) を実行。
  10. もし module.[[TopLevelCapability]]empty でないなら
    1. Assert: module.[[CycleRoot]]module は同一。
    2. ! Call(module.[[TopLevelCapability]].[[Reject]], undefined, « error ») を実行。
  11. unused を返す。

16.2.1.6.2 循環モジュールレコードグラフの例

この非規範節では、よくあるモジュールグラフのリンクおよび評価例と、エラー発生の様態に焦点を当てた事例を示す。

まず次の単純なモジュールグラフを考える:

Figure 2: 単純なモジュールグラフ
モジュール A が B に依存し、B が C に依存するモジュールグラフ

先にエラー条件が無いと仮定する。ホストが最初に A.LoadRequestedModules() を呼ぶと、仮定により成功裏に完了し、再帰的に BC の依存(それぞれ C となし)をロードし、その後 A.[[Status]] = B.[[Status]] = C.[[Status]] = unlinked に設定する。続いてホストA.Link() を呼ぶと、再度成功し、A.[[Status]] = B.[[Status]] = C.[[Status]] = linked となる。これら準備ステップは任意の時点で行える。その後、モジュール副作用を許容するタイミングで A.Evaluate() を呼ぶと、仮定により成功し undefined に解決される Promise を返し、内部的には C、次に B を評価する。各モジュールの [[Status]]evaluated

次にリンクエラーを含むケースを考える(A.LoadRequestedModules() が成功後)。もし CInnerModuleLinking が成功した後 B で失敗(例: BC に存在しないものを import)すれば、当初の A.Link() は失敗し、AB[[Status]]unlinked のまま。C[[Status]]linked に達している。

最後に、Link() 成功後の評価エラーを含むケース。CInnerModuleEvaluation が成功後、B で失敗(例: B のコードが例外を投げる)すると、A.Evaluate() は拒否された Promise を返す。例外は AB 双方の [[EvaluationError]] に記録され、それらの [[Status]]evaluated。一方 Cevaluated になるが、例外はなく [[EvaluationError]] は空。例外を保存することで後続の Evaluate() 呼び出しでも同一例外に遭遇する。(ホストCyclic Module Record を再利用する義務も、例外オブジェクトを外部に露出する義務もないが、仕様として可能にしている。)

次に別種のエラー条件を考える:

Figure 3: 解決不能モジュールを含むモジュールグラフ
モジュール A が ??? という未解決モジュールに依存するモジュールグラフ

このシナリオではモジュール A が他モジュールへの依存を宣言するが、その Module Record が存在しない(HostLoadImportedModuleFinishLoadingImportedModule へ例外で返す)。リソース不存在や ParseModule がエラーを返した場合などが要因。ホストFinishLoadingImportedModule へ渡す completion を通じて失敗原因を公開できる。いずれにせよ例外は読み込み失敗を引き起こし、A[[Status]]new のまま。

読み込み・リンク・評価エラーの差異は以下の特徴による:

  • 評価は副作用をもたらすため一度だけ行うべきで、成功/失敗を記録しておく必要がある(失敗時も同じ例外を保持しないと後続 Evaluate() が新規例外を合成する必要が出る)。
  • リンクは副作用がなく、失敗しても後から再試行できる。
  • 読み込みはホストとの緊密な相互作用があり、一時的ネットワーク不調などで失敗したロードをユーザが再試行できることが望まれる場合がある。

次にサイクルを持つモジュールグラフ:

Figure 4: 循環モジュールグラフ
モジュール A が B と C に依存し、B が A に依存するグラフ

エントリポイントを A と仮定し、ホストA.LoadRequestedModules() を呼ぶ。これは A 上で InnerModuleLoading を行い、さらに B, C 上でも呼ぶ。サイクルにより再び A に対する InnerModuleLoading がトリガーされるが、その依存読み込みは既に開始済みなので無操作。グラフ中すべてが正常にロードされると、全ての [[Status]] が同時に new から unlinked に。

続いて A.Link() により AInnerModuleLinking を行い、B に再帰。サイクルで再度 A に来るが既に linking なので無操作。Blinking のまま制御が A に戻り CInnerModuleLinkingClinked になると AB は同時に linking から linked へ(強連結成分単位で同時遷移できるよう DFS)。

成功ケースでは評価段階も同様の物語。

次に A がリンクエラー(例: C に存在しない束縛 import)を持つケース。上述のステップは(二度目の InnerModuleLinking(A) 早期リターン含め)進むが、最初の InnerModuleLinking(A) に戻って InitializeEnvironment(C.ResolveExport() 後)で失敗。SyntaxErrorA.Link へ伝播し、stack 上の linking モジュール(A, B)を unlinked へ戻す。Clinked のまま。

別に A が評価エラー(ソースが例外 throw)ケース。評価版のステップが進み、二度目の InnerModuleEvaluation(A) から早期戻り後、最初へ戻って失敗。例外は A.Evaluate() へ伝播し、stack 上の evaluating モジュールと [[AsyncParentModules]] 経由(top-level await 連鎖)にエラーを記録。A, Bevaluated となり両 [[EvaluationError]] に記録、C は例外なく evaluated

最後に、全モジュールが非同期に完了するサイクル付きグラフ:

Figure 5: 非同期循環モジュールグラフ
モジュール A が B と C に依存、B が D に、C が D と E に、D が A に依存

読み込みとリンクは同様で全て [[Status]] linked

A.Evaluate() は A, B, DInnerModuleEvaluation を呼び evaluating に。再度 A に当たるが evaluating のため無操作。ここで D.[[PendingAsyncDependencies]] = 0 なので ExecuteAsyncModule(D) を呼び PromiseCapability 付きで D.ExecuteModule。戻って BInnerModuleEvaluationB.[[PendingAsyncDependencies]] = 1, [[AsyncEvaluationOrder]] = 1。さらに A の元へ戻り A.[[PendingAsyncDependencies]] = 1。次に C へ遷移し D(無操作)と E を訪れる。E は依存もサイクル参加もないため ExecuteAsyncModule(E) を呼び直ちにスタックから除去。戻って C.[[AsyncEvaluationOrder]] = 3。A の依存ループ完了後 A.[[AsyncEvaluationOrder]] = 4 を設定し、強連結成分全体をスタックから除去、全モジュールを一度に evaluating-async。状態は Table 46 の通り。

Table 46: 初回 Evaluate() 呼び出し後のフィールド
Field
Module
A B C D E
[[DFSAncestorIndex]] 0 0 0 0 4
[[Status]] evaluating-async evaluating-async evaluating-async evaluating-async evaluating-async
[[AsyncEvaluationOrder]] 4 1 3 0 2
[[AsyncParentModules]] « » « A » « A » « B, C » « C »
[[PendingAsyncDependencies]] 2 (BC) 1 (D) 2 (DE) 0 0

最初に E が終了すると仮定。終了で AsyncModuleExecutionFulfilled が呼ばれ E.[[Status]] = evaluatedC.[[PendingAsyncDependencies]] が 1 に減少。状態は Table 47

Table 47: モジュール E 実行完了後フィールド
Field
Module
C E
[[DFSAncestorIndex]] 0 4
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 3 done
[[AsyncParentModules]] « A » « C »
[[PendingAsyncDependencies]] 1 (D) 0

次に D が終了(唯一の実行中だった)。AsyncModuleExecutionFulfilled が再度呼ばれ D.[[Status]] = evaluated。実行可能祖先は B ([[AsyncEvaluationOrder]] 1) と C (3) で B を先に処理: B.[[PendingAsyncDependencies]] が 0、ExecuteAsyncModule(B) で実行開始。C.[[PendingAsyncDependencies]] も 0 になり C も実行(B が await を含めば並列)。状態は Table 48

Table 48: モジュール D 実行完了後フィールド
Field
Module
B C D
[[DFSAncestorIndex]] 0 0 0
[[Status]] evaluating-async evaluating-async evaluated
[[AsyncEvaluationOrder]] 1 3 done
[[AsyncParentModules]] « A » « A » « B, C »
[[PendingAsyncDependencies]] 0 0 0

次に C が終了。AsyncModuleExecutionFulfilled が呼ばれ C.[[Status]] = evaluatedA.[[PendingAsyncDependencies]] が 1 に。状態は Table 49

Table 49: モジュール C 実行完了後フィールド
Field
Module
A C
[[DFSAncestorIndex]] 0 0
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 4 done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 1 (B) 0

次いで B が終了。AsyncModuleExecutionFulfilled が呼ばれ B.[[Status]] = evaluatedA.[[PendingAsyncDependencies]] が 0 となり ExecuteAsyncModule が呼ばれ実行開始。状態は Table 50

Table 50: モジュール B 実行完了後フィールド
Field
Module
A B
[[DFSAncestorIndex]] 0 0
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 4 done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 0 0

最後に A が終了し AsyncModuleExecutionFulfilled を再度呼び A.[[Status]] = evaluatedA.[[TopLevelCapability]] の Promise(A.Evaluate() が返したもの)が解決され終了。状態は Table 51

Table 51: モジュール A 実行完了後フィールド
Field
Module
A
[[DFSAncestorIndex]] 0
[[Status]] evaluated
[[AsyncEvaluationOrder]] done
[[AsyncParentModules]] « »
[[PendingAsyncDependencies]] 0

別の失敗例として B 完了前に C がエラーで失敗。AsyncModuleExecutionRejected が呼ばれ C.[[Status]] = evaluated, C.[[EvaluationError]] にエラーを設定し、AsyncParentModules へ伝播。状態は Table 52

Table 52: モジュール C がエラー終了後フィールド
Field
Module
A C
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] done done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 1 (B) 0
[[EvaluationError]] empty C の評価エラー

CA に対しそのエラーで AsyncModuleExecutionRejected を呼ぶため A も同じエラーで拒否され、A.[[Status]] = evaluatedA.[[TopLevelCapability]] の Promise は拒否。状態は Table 53

Table 53: モジュール A が拒否された後フィールド
Field
Module
A
[[DFSAncestorIndex]] 0
[[Status]] evaluated
[[AsyncEvaluationOrder]] done
[[AsyncParentModules]] « »
[[PendingAsyncDependencies]] 0
[[EvaluationError]] C の Evaluation Error

その後 B がエラーなく完了。AsyncModuleExecutionFulfilled が呼ばれ B.[[Status]] = evaluatedGatherAvailableAncestors(B) が呼ばれるが A.[[CycleRoot]] = A が評価エラーを持つため sortedExecList に追加されず処理終了。後続で B を import する者はサイクルルート A に設定された C の評価エラーを参照して拒否を見る。状態は Table 54

Table 54: エラーグラフで B 実行完了後フィールド
Field
Module
A B
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] 4 1
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 0 0
[[EvaluationError]] C の Evaluation Error empty

16.2.1.7 ソーステキストモジュールレコード (Source Text Module Records)

Source Text Module Record は、ゴール記号 Module でパースされた ECMAScript ソーステキスト (11) から定義されたモジュールに関する情報を表す。フィールドにはモジュールが import / export する名前の要約が格納され、具象メソッドはこれを利用してリンクと評価を行う。

Source Text Module Record は抽象 Module Record 型の他サブクラスと同一グラフに存在でき、Cyclic Module Record 型の他サブクラスとのサイクルにも参加できる。

Table 43 で定義されたフィールドに加え、Source Text Module RecordTable 55 に列挙される追加フィールドを持つ。各フィールドは ParseModule で初期設定される。

Table 55: Source Text Module Record の追加フィールド
フィールド名 値の型 意味
[[ECMAScriptCode]] Parse Node ゴール記号 Module でソーステキストをパースした結果。
[[Context]] ECMAScript 実行コンテキストまたは empty このモジュールに関連付けられる実行コンテキスト。環境初期化まで empty
[[ImportMeta]] Object または empty import.meta メタプロパティを通じて公開されるオブジェクト。アクセスされるまで empty
[[ImportEntries]] ImportEntry Record のリスト モジュールコードから導出された ImportEntry レコードのリスト。
[[LocalExportEntries]] ExportEntry Record のリスト モジュール内部宣言に対応する ExportEntry のリスト。
[[IndirectExportEntries]] ExportEntry Record のリスト モジュール内の再エクスポート import または export * as namespace 宣言に対応する ExportEntry のリスト。
[[StarExportEntries]] ExportEntry Record のリスト export * 宣言(export * as namespace を除く)に対応する ExportEntry のリスト。

ImportEntry Record は単一の宣言的 import を要約する Record。各 ImportEntry RecordTable 56 のフィールドを持つ:

Table 56: ImportEntry Record フィールド
フィールド名 値の型 意味
[[ModuleRequest]] ModuleRequest Record ImportDeclarationModuleSpecifier と import 属性を表す ModuleRequest Record
[[ImportName]] 文字列または namespace-object [[ModuleRequest]] が指すモジュールで束縛がエクスポートされる名前。namespace-object は対象モジュールの namespace オブジェクトを要求することを示す。
[[LocalName]] 文字列 インポート値へローカルアクセスするための名前。
Note 1

Table 57 は構文 import 形と ImportEntry フィールドの対応例を示す:

Table 57 (Informative): Import 構文と ImportEntry Record の対応
Import 文形式 [[ModuleRequest]] [[ImportName]] [[LocalName]]
import v from "mod"; "mod" "default" "v"
import * as ns from "mod"; "mod" namespace-object "ns"
import {x} from "mod"; "mod" "x" "x"
import {x as v} from "mod"; "mod" "x" "v"
import "mod"; ImportEntry Record は作成されない。

ExportEntry Record は単一の宣言的 export を要約する Record。各 ExportEntry RecordTable 58 のフィールドを持つ:

Table 58: ExportEntry Record フィールド
フィールド名 値の型 意味
[[ExportName]] 文字列または null このモジュールがこの束縛をエクスポートする際の名前。
[[ModuleRequest]] ModuleRequest Record または null ExportDeclarationModuleSpecifier と import 属性を表す ModuleRequest RecordModuleSpecifier が無い場合 null
[[ImportName]] 文字列, null, all, all-but-default [[ModuleRequest]] が指すモジュールがこの束縛をエクスポートする名前。ModuleSpecifier が無い場合 nullallexport * as ns from "mod"all-but-defaultexport * from "mod" に使用。
[[LocalName]] 文字列または null モジュール内部からエクスポート値へアクセスするためのローカル名。内部で直接アクセスできない場合 null
Note 2

Table 59 は構文 export 形と ExportEntry フィールドの対応例:

Table 59 (Informative): Export 構文と ExportEntry Record の対応
Export 文形式 [[ExportName]] [[ModuleRequest]] [[ImportName]] [[LocalName]]
export var v; "v" null null "v"
export default function f() {} "default" null null "f"
export default function () {} "default" null null "*default*"
export default 42; "default" null null "*default*"
export {x}; "x" null null "x"
export {v as x}; "x" null null "v"
export {x} from "mod"; "x" "mod" "x" null
export {v as x} from "mod"; "x" "mod" "v" null
export * from "mod"; null "mod" all-but-default null
export * as ns from "mod"; "ns" "mod" all null

以下の定義は Source Text Module Record に必要な具象メソッドおよび抽象操作を規定する。

16.2.1.7.1 ParseModule ( sourceText, realm, hostDefined )

The abstract operation ParseModule takes arguments sourceText (ECMAScript ソーステキスト), realm (Realm Record), and hostDefined (任意) and returns Source Text Module Record または SyntaxError オブジェクトの空でないリスト. sourceTextModule としてパースした結果に基づき Source Text Module Record を生成。 It performs the following steps when called:

  1. body を ParseText(sourceText, Module) とする。
  2. body がエラーのリストなら body を返す。
  3. requestedModulesbody の ModuleRequests とする。
  4. importEntriesbody の ImportEntries とする。
  5. importedBoundNames を ImportedLocalNames(importEntries) とする。
  6. indirectExportEntries を空リスト。
  7. localExportEntries を空リスト。
  8. starExportEntries を空リスト。
  9. exportEntriesbody の ExportEntries とする。
  10. ExportEntry Record ee について
    1. もし ee.[[ModuleRequest]]null なら
      1. もし importedBoundNamesee.[[LocalName]] を含まないなら
        1. eelocalExportEntries に追加。
      2. それ以外
        1. ie[[LocalName]] = ee.[[LocalName]]importEntries 要素とする。
        2. もし ie.[[ImportName]]namespace-object なら
          1. 注: インポートされたモジュール namespace オブジェクトの再エクスポート。
          2. eelocalExportEntries に追加。
        3. それ以外
          1. 注: 単一名の再エクスポート。
          2. ExportEntry Record { [[ModuleRequest]]: ie.[[ModuleRequest]], [[ImportName]]: ie.[[ImportName]], [[LocalName]]: null, [[ExportName]]: ee.[[ExportName]] } を indirectExportEntries に追加。
    2. それ以外で ee.[[ImportName]]all-but-default なら
      1. Assert: ee.[[ExportName]]null
      2. eestarExportEntries に追加。
    3. それ以外
      1. eeindirectExportEntries に追加。
  11. asyncbody Contains await とする。
  12. Source Text Module Record { [[Realm]]: realm, [[Environment]]: empty, [[Namespace]]: empty, [[CycleRoot]]: empty, [[HasTLA]]: async, [[AsyncEvaluationOrder]]: unset, [[TopLevelCapability]]: empty, [[AsyncParentModules]]: « », [[PendingAsyncDependencies]]: empty, [[Status]]: new, [[EvaluationError]]: empty, [[HostDefined]]: hostDefined, [[ECMAScriptCode]]: body, [[Context]]: empty, [[ImportMeta]]: empty, [[RequestedModules]]: requestedModules, [[LoadedModules]]: « », [[ImportEntries]]: importEntries, [[LocalExportEntries]]: localExportEntries, [[IndirectExportEntries]]: indirectExportEntries, [[StarExportEntries]]: starExportEntries, [[DFSAncestorIndex]]: empty } を返す。
Note

実装は ParseModule 評価前にモジュールソースをパースし早期エラー解析を行ってもよいが、エラー報告は仕様が実際に ParseModule を行う時点まで遅延しなければならない。

16.2.1.7.2 Module Record 抽象メソッドの実装 (Source Text)

以下は Table 42 に対応する Source Text Module Record の具象メソッド。

16.2.1.7.2.1 GetExportedNames ( [ exportStarSet ] )

The GetExportedNames concrete method of Source Text Module Record module takes optional argument exportStarSet (Source Text Module Record のリスト) and returns 文字列リスト. It performs the following steps when called:

  1. Assert: module.[[Status]]new でない。
  2. exportStarSet が無ければ空リストに設定。
  3. もし exportStarSetmodule を含むなら
    1. Assert: export * 循環の開始点に到達。
    2. 空リストを返す。
  4. moduleexportStarSet に追加。
  5. exportedNames を空リスト。
  6. module.[[LocalExportEntries]] の各 ExportEntry Record e について
    1. Assert: 直接束縛を提供。
    2. Assert: e.[[ExportName]]null でない。
    3. e.[[ExportName]]exportedNames に追加。
  7. module.[[IndirectExportEntries]] の各 e について
    1. Assert: 特定束縛 import の再エクスポート。
    2. Assert: e.[[ExportName]]null でない。
    3. e.[[ExportName]] を追加。
  8. module.[[StarExportEntries]] の各 e について
    1. Assert: e.[[ModuleRequest]]null でない。
    2. requestedModuleGetImportedModule(module, e.[[ModuleRequest]])。
    3. starNamesrequestedModule.GetExportedNames(exportStarSet)。
    4. n について
      1. もし n"default" なら
        1. かつ exportedNames に含まれないなら追加。
  9. exportedNames を返す。
Note

GetExportedNames は曖昧な star export の名前を除去も例外化もしない。

16.2.1.7.2.2 ResolveExport ( exportName [ , resolveSet ] )

The ResolveExport concrete method of Source Text Module Record module takes argument exportName (文字列) and optional argument resolveSet ([[Module]](Module Record), [[ExportName]](文字列) を持つ Record のリスト) and returns ResolvedBinding Record, null, または ambiguous.

ResolveExport は要求されたエクスポート名を最終的な定義モジュールとローカル束縛名へ解決する。定義モジュールは自身または import 先モジュール。resolveSet は循環 import/export 経路検出に使われ、既に同一 (module, exportName) ペアが存在すれば循環で null を返す。再帰前に (module, exportName) を追加。

定義が見つかれば ResolvedBinding Record { [[Module]], [[BindingName]] } を返す。namespace のみでローカル束縛が無い場合 [[BindingName]]namespace。定義が見つからない/循環なら null、曖昧なら ambiguous を返す。

It performs the following steps when called:

  1. Assert: module.[[Status]]new でない。
  2. resolveSet がなければ空リスト。
  3. resolveSet の各 Record r について
    1. もし moduler.[[Module]] が同一で exportName = r.[[ExportName]] なら
      1. Assert: 循環 import 要求。
      2. null を返す。
  4. Record { [[Module]]: module, [[ExportName]]: exportName } を resolveSet に追加。
  5. module.[[LocalExportEntries]] の各 e について
    1. もし e.[[ExportName]] = exportName なら
      1. Assert: 直接束縛。
      2. ResolvedBinding Record { [[Module]]: module, [[BindingName]]: e.[[LocalName]] } を返す。
  6. module.[[IndirectExportEntries]] の各 e について
    1. もし e.[[ExportName]] = exportName なら
      1. Assert: e.[[ModuleRequest]]null でない。
      2. importedModuleGetImportedModule(module, e.[[ModuleRequest]])。
      3. もし e.[[ImportName]]all なら
        1. ResolvedBinding Record { [[Module]]: importedModule, [[BindingName]]: namespace } を返す。
      4. それ以外
        1. Assert: 具体的束縛 import。
        2. Assert: e.[[ImportName]] は文字列。
        3. importedModule.ResolveExport(e.[[ImportName]], resolveSet) を返す。
  7. もし exportName = "default" なら
    1. Assert: 明示的な default export 非定義。
    2. null を返す。
    3. 注: export * from "mod"default は供給されない。
  8. starResolutionnull とする。
  9. module.[[StarExportEntries]] の各 e について
    1. Assert: e.[[ModuleRequest]]null でない。
    2. importedModuleGetImportedModule(module, e.[[ModuleRequest]])。
    3. resolutionimportedModule.ResolveExport(exportName, resolveSet)。
    4. resolutionambiguous なら ambiguous を返す。
    5. resolutionnull でないなら
      1. Assert: resolution は ResolvedBinding。
      2. もし starResolutionnull なら starResolution = resolution
      3. それ以外
        1. Assert: 複数の * import が同名を含む。
        2. もし resolution.[[Module]]starResolution.[[Module]] なら ambiguous
        3. もし [[BindingName]] が異なり、いずれかが namespace なら ambiguous
        4. 両方文字列かつ異なれば ambiguous
  10. starResolution を返す。

16.2.1.7.3 Cyclic Module Record 抽象メソッドの実装 (Source Text)

Table 44 で定義された Cyclic Module Record 抽象メソッドに対応する Source Text Module Record の具象メソッド。

16.2.1.7.3.1 InitializeEnvironment ( )

The InitializeEnvironment concrete method of Source Text Module Record module takes no arguments and returns unused を含む通常完了または throw completion. It performs the following steps when called:

  1. module.[[IndirectExportEntries]] の各 ExportEntry Record e について
    1. Assert: e.[[ExportName]]null でない。
    2. resolutionmodule.ResolveExport(e.[[ExportName]]) とする。
    3. もし resolutionnull または ambiguous なら SyntaxError を投げる。
    4. Assert: resolution は ResolvedBinding。
  2. Assert: すべての名前付き export は解決可能。
  3. realmmodule.[[Realm]]
  4. Assert: realmundefined でない。
  5. envNewModuleEnvironment(realm.[[GlobalEnv]])。
  6. module.[[Environment]]env に設定。
  7. module.[[ImportEntries]] の各 ImportEntry Record in について
    1. importedModuleGetImportedModule(module, in.[[ModuleRequest]])。
    2. もし in.[[ImportName]]namespace-object なら
      1. namespaceGetModuleNamespace(importedModule)。
      2. env.CreateImmutableBinding(in.[[LocalName]], true)。
      3. env.InitializeBinding(in.[[LocalName]], namespace)。
    3. それ以外
      1. resolutionimportedModule.ResolveExport(in.[[ImportName]])。
      2. もし resolutionnull または ambiguous なら SyntaxError
      3. もし resolution.[[BindingName]]namespace なら
        1. namespaceGetModuleNamespace(resolution.[[Module]])。
        2. env.CreateImmutableBinding(in.[[LocalName]], true)。
        3. env.InitializeBinding(in.[[LocalName]], namespace)。
      4. それ以外
        1. CreateImportBinding(env, in.[[LocalName]], resolution.[[Module]], resolution.[[BindingName]])。
  8. moduleContext を新 ECMAScript 実行コンテキスト。
  9. Function を null
  10. Assert: module.[[Realm]]undefined でない。
  11. Realmmodule.[[Realm]]
  12. ScriptOrModule を module
  13. VariableEnvironment / LexicalEnvironment を module.[[Environment]]
  14. PrivateEnvironment を null
  15. module.[[Context]]moduleContext に。
  16. moduleContext を実行コンテキストスタックに push。
  17. codemodule.[[ECMAScriptCode]]
  18. varDeclarationscode の VarScopedDeclarations。
  19. declaredVarNames を空リスト。
  20. dvarDeclarations について
    1. d の BoundNames 各 dn について
      1. declaredVarNames に含まれなければ
        1. env.CreateMutableBinding(dn, false)。
        2. env.InitializeBinding(dn, undefined)。
        3. declaredVarNames に追加。
  21. lexDeclarationscode の LexicallyScopedDeclarations。
  22. privateEnvnull
  23. dlexDeclarations について
    1. d の BoundNames 各 dn について
      1. もし IsConstantDeclaration(d) が true なら
        1. env.CreateImmutableBinding(dn, true)。
      2. それ以外
        1. env.CreateMutableBinding(dn, false)。
      3. もし dFunctionDeclaration / GeneratorDeclaration / AsyncFunctionDeclaration / AsyncGeneratorDeclaration のいずれかなら
        1. fo を InstantiateFunctionObject(d, env, privateEnv)。
        2. env.InitializeBinding(dn, fo)。
  24. 実行コンテキストスタックから moduleContext を除去。
  25. unused を返す。

16.2.1.7.3.2 ExecuteModule ( [ capability ] )

The ExecuteModule concrete method of Source Text Module Record module takes optional argument capability (PromiseCapability Record) and returns unused を含む通常完了または throw completion. It performs the following steps when called:

  1. moduleContext を新 ECMAScript 実行コンテキスト。
  2. Function を null
  3. Realmmodule.[[Realm]]
  4. ScriptOrModule を module
  5. Assert: モジュールはリンク済みで環境宣言インスタンス化済み。
  6. VariableEnvironment / LexicalEnvironment を module.[[Environment]]
  7. 実行中コンテキストを中断。
  8. もし module.[[HasTLA]]false なら
    1. Assert: capability は存在しない。
    2. moduleContext をスタックへ push。
    3. resultCompletion(Evaluation of module.[[ECMAScriptCode]])。
    4. moduleContext を中断しスタックから除去。
    5. 上位コンテキストを再開。
    6. もし resultabrupt completion なら ? result を返す。
  9. それ以外
    1. Assert: capabilityPromiseCapability Record
    2. AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleContext) を実行。
  10. unused を返す。

16.2.1.8 シンセティックモジュールレコード (Synthetic Module Records)

Synthetic Module Record は仕様によって定義されるモジュール情報を表す。エクスポート名は作成時に静的定義され、対応値は SetSyntheticModuleExport で変化し得る。インポートや依存は持たない。

Note
Synthetic Module Record は JSON モジュールや CSS モジュールなど多様なモジュール形式を定義するために利用できる。

Table 41 で定義されたフィールドに加え、Synthetic Module Record は Table 60 の追加フィールドを持つ。

Table 60: Synthetic Module Record の追加フィールド
フィールド名 値の型 意味
[[ExportNames]] 文字列のリスト モジュールのエクスポート名(重複なし)。
[[EvaluationSteps]] Abstract Closure 評価時に実行する初期化ロジック。Synthetic Module Record を唯一の引数とし [[ExportNames]] を変更してはならない。abrupt completion を返し得る。

16.2.1.8.1 CreateDefaultExportSyntheticModule ( defaultExport )

The abstract operation CreateDefaultExportSyntheticModule takes argument defaultExport (ECMAScript 言語値) and returns Synthetic Module Record. defaultExport を default export とする Synthetic Module Record を生成。 It performs the following steps when called:

  1. realm を現在の Realm Record
  2. setDefaultExport を引数 (module) を取り defaultExport を捕捉し以下を行う Abstract Closure:
    1. SetSyntheticModuleExport(module, "default", defaultExport)。
    2. NormalCompletion(unused) を返す。
  3. Synthetic Module Record { [[Realm]]: realm, [[Environment]]: empty, [[Namespace]]: empty, [[HostDefined]]: undefined, [[ExportNames]]: « "default" », [[EvaluationSteps]]: setDefaultExport } を返す。

16.2.1.8.2 ParseJSONModule ( source )

The abstract operation ParseJSONModule takes argument source (文字列) and returns Synthetic Module Record を含む通常完了または throw completion. It performs the following steps when called:

  1. json を ? ParseJSON(source) とする。
  2. CreateDefaultExportSyntheticModule(json) を返す。

16.2.1.8.3 SetSyntheticModuleExport ( module, exportName, exportValue )

The abstract operation SetSyntheticModuleExport takes arguments module (Synthetic Module Record), exportName (文字列), and exportValue (ECMAScript 言語値) and returns unused. Synthetic Module Record の既存エクスポート値を設定または変更する。 It performs the following steps when called:

  1. Assert: module.[[ExportNames]]exportName を含む。
  2. envRecmodule.[[Environment]]
  3. Assert: envRecempty でない。
  4. envRec.SetMutableBinding(exportName, exportValue, true) を実行。
  5. unused を返す。

16.2.1.8.4 Module Record 抽象メソッドの実装 (Synthetic)

以下は Synthetic Module RecordModule Record 抽象メソッド具象実装。

16.2.1.8.4.1 LoadRequestedModules ( )

The LoadRequestedModules concrete method of Synthetic Module Record module takes no arguments and returns Promise. It performs the following steps when called:

  1. PromiseResolve(%Promise%, undefined) を返す。
Note
Synthetic Module Record に依存はない。

16.2.1.8.4.2 GetExportedNames ( )

The GetExportedNames concrete method of Synthetic Module Record module takes no arguments and returns 文字列リスト. It performs the following steps when called:

  1. module.[[ExportNames]] を返す。

16.2.1.8.4.3 ResolveExport ( exportName )

The ResolveExport concrete method of Synthetic Module Record module takes argument exportName (文字列) and returns ResolvedBinding Record または null. It performs the following steps when called:

  1. もし module.[[ExportNames]]exportName を含まなければ null
  2. ResolvedBinding Record { [[Module]]: module, [[BindingName]]: exportName } を返す。

16.2.1.8.4.4 Link ( )

The Link concrete method of Synthetic Module Record module takes no arguments and returns unused を含む通常完了. It performs the following steps when called:

  1. realmmodule.[[Realm]]
  2. envNewModuleEnvironment(realm.[[GlobalEnv]])。
  3. module.[[Environment]]env に。
  4. module.[[ExportNames]] の各文字列 exportName について
    1. env.CreateMutableBinding(exportName, false)。
    2. env.InitializeBinding(exportName, undefined)。
  5. NormalCompletion(unused) を返す。

16.2.1.8.4.5 Evaluate ( )

The Evaluate concrete method of Synthetic Module Record module takes no arguments and returns Promise. It performs the following steps when called:

  1. moduleContext を新 ECMAScript 実行コンテキスト。
  2. Function を null
  3. Realmmodule.[[Realm]]
  4. ScriptOrModule を module
  5. VariableEnvironment / LexicalEnvironment を module.[[Environment]]
  6. 実行中コンテキストを中断。
  7. moduleContext をスタックに push。
  8. stepsmodule.[[EvaluationSteps]]
  9. resultCompletion(steps(module))。
  10. moduleContext を中断・除去。
  11. 上位コンテキストを再開。
  12. pc を ! NewPromiseCapability(%Promise%)。
  13. IfAbruptRejectPromise(result, pc)。
  14. ! Call(pc.[[Resolve]], undefined, « undefined »)。
  15. pc.[[Promise]] を返す。

16.2.1.9 GetImportedModule ( referrer, request )

The abstract operation GetImportedModule takes arguments referrer (Cyclic Module Record) and request (ModuleRequest Record) and returns Module Record. It performs the following steps when called:

  1. recordsreferrer.[[LoadedModules]] のうち ModuleRequestsEqual(r, request) が true となる各 LoadedModuleRequest Record r からなるリストとする。
  2. Assert: LoadRequestedModules が referrer に正常完了しているため records は正確に 1 要素。
  3. record をその唯一要素。
  4. record.[[Module]] を返す。

16.2.1.10 HostLoadImportedModule ( referrer, moduleRequest, hostDefined, payload )

The host-defined abstract operation HostLoadImportedModule takes arguments referrer (Script Record, Cyclic Module Record, または Realm Record), moduleRequest (ModuleRequest Record), hostDefined (任意), and payload (GraphLoadingState Record または PromiseCapability Record) and returns unused.

Note 1

referrerRealm Record になり得る例は Web ブラウザホスト。例えばユーザが

<button type="button" onclick="import('./foo.mjs')">Click me</button>

をクリックすると、import() 式実行時点でアクティブなスクリプトやモジュールが存在しない。ホストが ScriptOrModule null の実行コンテキストをスタックに積む状況全般で起こり得る。

HostLoadImportedModule の実装は以下要件に従う:

実際の処理はホスト定義だが、通常は適切な Module Record をロードするための各種 I/O を行う。異なる複数の (referrer, moduleRequest.[[Specifier]], moduleRequest.[[Attributes]]) 組が同一 Module Record インスタンスにマップされることがある。マッピングは通常 specifier の正規化(相対・短縮パス展開など)を含む。

Note 2

上記は type: "json" でインポートされた JSON モジュールをホストがサポートすることを要求するが、type: "json" なしでの JSON モジュールサポートを禁止しない。

16.2.1.11 FinishLoadingImportedModule ( referrer, moduleRequest, payload, result )

The abstract operation FinishLoadingImportedModule takes arguments referrer (Script RecordCyclic Module Record、または Realm Record), moduleRequest (ModuleRequest Record), payload (GraphLoadingState Record または PromiseCapability Record), and result (Module Record を含む通常完了または throw completion のいずれか) and returns unused. It performs the following steps when called:

  1. result が通常完了なら、
    1. もし referrer.[[LoadedModules]]ModuleRequestsEqual(record, moduleRequest) が true となる LoadedModuleRequest Record record を含むなら、
      1. Assert: record.[[Module]]result.[[Value]] は同じ Module Record である。
    2. それ以外なら、
      1. LoadedModuleRequest Record { [[Specifier]]: moduleRequest.[[Specifier]], [[Attributes]]: moduleRequest.[[Attributes]], [[Module]]: result.[[Value]] } を referrer.[[LoadedModules]] に追加する。
  2. payloadGraphLoadingState Record であれば、
    1. ContinueModuleLoading(payload, result) を実行する。
  3. それ以外なら、
    1. ContinueDynamicImport(payload, result) を実行する。
  4. unused を返す。

16.2.1.12 AllImportAttributesSupported ( attributes )

The abstract operation AllImportAttributesSupported takes argument attributes (ImportAttribute Record のリスト) and returns Boolean. It performs the following steps when called:

  1. supportedHostGetSupportedImportAttributes() とする。
  2. attributes の各 ImportAttribute Record attribute について、
    1. もし supportedattribute.[[Key]] を含まなければ false を返す。
  3. true を返す。

16.2.1.12.1 HostGetSupportedImportAttributes ( )

The host-defined abstract operation HostGetSupportedImportAttributes takes no arguments and returns 文字列リスト. ホスト環境がサポートする import 属性を指定できる。サポートされるキーを持つ属性のみがホストへ提供される。

HostGetSupportedImportAttributes の実装は次の要件に従わなければならない:

  • 各要素がサポートされる属性を示す文字列であるリストを返さなければならない。
  • この操作が呼び出されるたびに、同一内容・同一順序の同一リストを返さなければならない。

HostGetSupportedImportAttributes のデフォルト実装は、新しい空リストを返すことである。

Note
ホストに全ての属性を渡して選別させるのではなく、サポートしている属性キーをホストが明示することを要求する目的は、サポートされない属性の扱いを異なるホスト間で一貫させるためである。

16.2.1.13 GetModuleNamespace ( module )

The abstract operation GetModuleNamespace takes argument module (Module Record の具象サブクラスのインスタンス) and returns Module Namespace Object. module のエクスポートを表す Module Namespace Object を取得する。初回要求時に遅延生成し、以後の取得のために module.[[Namespace]] に格納する。 It performs the following steps when called:

  1. Assert: moduleCyclic Module Record なら module.[[Status]]new でも unlinked でもない。
  2. namespacemodule.[[Namespace]] とする。
  3. もし namespaceempty なら
    1. exportedNamesmodule.GetExportedNames() とする。
    2. unambiguousNames を新しい空リストとする。
    3. exportedNames の各要素 name について
      1. resolutionmodule.ResolveExport(name) とする。
      2. resolutionResolvedBinding Record なら nameunambiguousNames に追加する。
    4. namespaceModuleNamespaceCreate(module, unambiguousNames) とする。
  4. namespace を返す。
Note

GetModuleNamespace は例外を投げない。解決不能な名前はこの時点では単に namespace から除外される。それらがすべてどこからも明示的に要求されない曖昧な star export でない限り、後で実際のリンクエラーにつながる。

16.2.1.14 Runtime Semantics: Evaluation

Module : [empty]
  1. undefined を返す。
ModuleBody : ModuleItemList
  1. resultCompletion(Evaluation of ModuleItemList) とする。
  2. result が通常完了で result.[[Value]]empty なら
    1. undefined を返す。
  3. result を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. sl を ? Evaluation of ModuleItemList とする。
  2. sCompletion(Evaluation of ModuleItem) とする。
  3. UpdateEmpty(s, sl) を返す。
Note

ModuleItemList の値は、その中で最後に値を生成した項目の値である。

ModuleItem : ImportDeclaration
  1. empty を返す。

16.2.2 インポート

構文

ImportDeclaration : import ImportClause FromClause WithClauseopt ; import ModuleSpecifier WithClauseopt ; ImportClause : ImportedDefaultBinding NameSpaceImport NamedImports ImportedDefaultBinding , NameSpaceImport ImportedDefaultBinding , NamedImports ImportedDefaultBinding : ImportedBinding NameSpaceImport : * as ImportedBinding NamedImports : { } { ImportsList } { ImportsList , } FromClause : from ModuleSpecifier ImportsList : ImportSpecifier ImportsList , ImportSpecifier ImportSpecifier : ImportedBinding ModuleExportName as ImportedBinding ModuleSpecifier : StringLiteral ImportedBinding : BindingIdentifier[~Yield, +Await] WithClause : with { } with { WithEntries ,opt } WithEntries : AttributeKey : StringLiteral AttributeKey : StringLiteral , WithEntries AttributeKey : IdentifierName StringLiteral

16.2.2.1 静的意味論: 早期エラー

ModuleItem : ImportDeclaration
  • ImportDeclaration の BoundNames に重複するエントリが含まれている場合は構文エラー。
WithClause : with { WithEntries ,opt }
  • WithClause の WithClauseToAttributes に、a.[[Key]]b.[[Key]] と同じになる 2 つの異なるエントリ ab がある場合、構文エラー。

16.2.2.2 静的意味論: ImportEntries : ImportEntry Record のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空リストを返す。
ModuleItemList : ModuleItemList ModuleItem
  1. entries1ModuleItemList の ImportEntries とする。
  2. entries2ModuleItem の ImportEntries とする。
  3. entries1entries2 のリスト連結を返す。
ModuleItem : ExportDeclaration StatementListItem
  1. 新しい空リストを返す。
ImportDeclaration : import ImportClause FromClause WithClauseopt ;
  1. moduleImportDeclaration の ModuleRequests の唯一の要素とする。
  2. 引数 moduleImportClause の ImportEntriesForModule を返す。
ImportDeclaration : import ModuleSpecifier WithClauseopt ;
  1. 新しい空リストを返す。

16.2.2.3 静的意味論: ImportEntriesForModule : ImportEntry Record のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ImportClause : ImportedDefaultBinding , NameSpaceImport
  1. entries1 を 引数 moduleImportedDefaultBinding の ImportEntriesForModule とする。
  2. entries2 を 引数 moduleNameSpaceImport の ImportEntriesForModule とする。
  3. entries1entries2 のリスト連結を返す。
ImportClause : ImportedDefaultBinding , NamedImports
  1. entries1 を 引数 moduleImportedDefaultBinding の ImportEntriesForModule とする。
  2. entries2 を 引数 moduleNamedImports の ImportEntriesForModule とする。
  3. entries1entries2 のリスト連結を返す。
ImportedDefaultBinding : ImportedBinding
  1. localNameImportedBinding の BoundNames の唯一の要素とする。
  2. defaultEntryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: "default", [[LocalName]]: localName } とする。
  3. « defaultEntry » を返す。
NameSpaceImport : * as ImportedBinding
  1. localNameImportedBinding の StringValue とする。
  2. entryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: namespace-object, [[LocalName]]: localName } とする。
  3. « entry » を返す。
NamedImports : { }
  1. 新しい空リストを返す。
ImportsList : ImportsList , ImportSpecifier
  1. specs1 を 引数 moduleImportsList の ImportEntriesForModule とする。
  2. specs2 を 引数 moduleImportSpecifier の ImportEntriesForModule とする。
  3. specs1specs2 のリスト連結を返す。
ImportSpecifier : ImportedBinding
  1. localNameImportedBinding の BoundNames の唯一の要素とする。
  2. entryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: localName, [[LocalName]]: localName } とする。
  3. « entry » を返す。
ImportSpecifier : ModuleExportName as ImportedBinding
  1. importNameModuleExportName の StringValue とする。
  2. localNameImportedBinding の StringValue とする。
  3. entryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName } とする。
  4. « entry » を返す。

16.2.2.4 静的意味論: WithClauseToAttributes : ImportAttribute Record のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

WithClause : with { }
  1. 新しい空リストを返す。
WithClause : with { WithEntries ,opt }
  1. attributesWithEntries の WithClauseToAttributes とする。
  2. attributes を各 [[Key]] フィールド値を UTF-16 符号単位列として扱い、辞書順でソートする。注: このソートが観測可能なのは、ホストが列挙順序によって挙動を変えることが禁止されている点のみである。
  3. attributes を返す。
WithEntries : AttributeKey : StringLiteral
  1. keyAttributeKey の PropName とする。
  2. entryImportAttribute Record { [[Key]]: key, [[Value]]: StringLiteral の SV } とする。
  3. « entry » を返す。
WithEntries : AttributeKey : StringLiteral , WithEntries
  1. keyAttributeKey の PropName とする。
  2. entryImportAttribute Record { [[Key]]: key, [[Value]]: StringLiteral の SV } とする。
  3. restWithEntries の WithClauseToAttributes とする。
  4. « entry » と rest のリスト連結を返す。

16.2.3 エクスポート

構文

ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ; export VariableStatement[~Yield, +Await] export Declaration[~Yield, +Await] export default HoistableDeclaration[~Yield, +Await, +Default] export default ClassDeclaration[~Yield, +Await, +Default] export default [lookahead ∉ { function, async [no LineTerminator here] function, class }] AssignmentExpression[+In, ~Yield, +Await] ; ExportFromClause : * * as ModuleExportName NamedExports NamedExports : { } { ExportsList } { ExportsList , } ExportsList : ExportSpecifier ExportsList , ExportSpecifier ExportSpecifier : ModuleExportName ModuleExportName as ModuleExportName

16.2.3.1 静的意味論: 早期エラー

ExportDeclaration : export NamedExports ;
  • NamedExports の ReferencedBindings に StringLiteral が含まれている場合は構文エラー。
  • NamedExports の ReferencedBindings 内の各 IdentifierName n について: n の StringValue が ReservedWord であるか、または "implements", "interface", "let", "package", "private", "protected", "public", "static" のいずれかである場合は構文エラー。
Note

上記規則により NamedExports の各 ReferencedBindings は IdentifierReference として扱われる。

16.2.3.2 静的意味論: ExportedBindings : 文字列リスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

ExportedBindings は Module の ExportedNames に明示的に関連付けられるローカル束縛名である。

It is defined piecewise over the following productions:

ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemList の ExportedBindings とする。
  2. names2ModuleItem の ExportedBindings とする。
  3. names1names2 のリスト連結を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空リストを返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. 新しい空リストを返す。
ExportDeclaration : export NamedExports ;
  1. NamedExports の ExportedBindings を返す。
ExportDeclaration : export VariableStatement
  1. VariableStatement の BoundNames を返す。
ExportDeclaration : export Declaration
  1. Declaration の BoundNames を返す。
ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. この ExportDeclaration の BoundNames を返す。
NamedExports : { }
  1. 新しい空リストを返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsList の ExportedBindings とする。
  2. names2ExportSpecifier の ExportedBindings とする。
  3. names1names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. 唯一の要素が ModuleExportName の StringValue であるリストを返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 唯一の要素が最初の ModuleExportName の StringValue であるリストを返す。

16.2.3.3 静的意味論: ExportedNames : 文字列リスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

ExportedNames は Module がローカル束縛名の一つに明示的に対応付ける外部可視名である。

It is defined piecewise over the following productions:

ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemList の ExportedNames とする。
  2. names2ModuleItem の ExportedNames とする。
  3. names1names2 のリスト連結を返す。
ModuleItem : ExportDeclaration
  1. ExportDeclaration の ExportedNames を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空リストを返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. ExportFromClause の ExportedNames を返す。
ExportFromClause : *
  1. 新しい空リストを返す。
ExportFromClause : * as ModuleExportName
  1. 唯一の要素が ModuleExportName の StringValue であるリストを返す。
ExportFromClause : NamedExports
  1. NamedExports の ExportedNames を返す。
ExportDeclaration : export VariableStatement
  1. VariableStatement の BoundNames を返す。
ExportDeclaration : export Declaration
  1. Declaration の BoundNames を返す。
ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. « "default" » を返す。
NamedExports : { }
  1. 新しい空リストを返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsList の ExportedNames とする。
  2. names2ExportSpecifier の ExportedNames とする。
  3. names1names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. 唯一の要素が ModuleExportName の StringValue であるリストを返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 唯一の要素が 2つ目の ModuleExportName の StringValue であるリストを返す。

16.2.3.4 静的意味論: ExportEntries : ExportEntry Record のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空リストを返す。
ModuleItemList : ModuleItemList ModuleItem
  1. entries1ModuleItemList の ExportEntries とする。
  2. entries2ModuleItem の ExportEntries とする。
  3. entries1entries2 のリスト連結を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空リストを返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. moduleExportDeclaration の ModuleRequests の唯一の要素とする。
  2. 引数 moduleExportFromClause の ExportEntriesForModule を返す。
ExportDeclaration : export NamedExports ;
  1. 引数 nullNamedExports の ExportEntriesForModule を返す。
ExportDeclaration : export VariableStatement
  1. entries を新しい空リストとする。
  2. namesVariableStatement の BoundNames とする。
  3. names の各要素 name について
    1. ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name } を entries に追加。
  4. entries を返す。
ExportDeclaration : export Declaration
  1. entries を新しい空リストとする。
  2. namesDeclaration の BoundNames とする。
  3. names の各要素 name について
    1. ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name } を entries に追加。
  4. entries を返す。
ExportDeclaration : export default HoistableDeclaration
  1. namesHoistableDeclaration の BoundNames とする。
  2. localNamenames の唯一の要素とする。
  3. 唯一の要素が新しい ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" } であるリストを返す。
ExportDeclaration : export default ClassDeclaration
  1. namesClassDeclaration の BoundNames とする。
  2. localNamenames の唯一の要素とする。
  3. 唯一の要素が新しい ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" } であるリストを返す。
ExportDeclaration : export default AssignmentExpression ;
  1. entryExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: "*default*", [[ExportName]]: "default" } とする。
  2. « entry » を返す。
Note

"*default*" は無名の default export 値のための合成名として仕様内で使用される。詳細は このノート を参照。

16.2.3.5 静的意味論: ExportEntriesForModule : ExportEntry Record のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ExportFromClause : *
  1. entryExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: all-but-default, [[LocalName]]: null, [[ExportName]]: null } とする。
  2. « entry » を返す。
ExportFromClause : * as ModuleExportName
  1. exportNameModuleExportName の StringValue とする。
  2. entryExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: all, [[LocalName]]: null, [[ExportName]]: exportName } とする。
  3. « entry » を返す。
NamedExports : { }
  1. 新しい空リストを返す。
ExportsList : ExportsList , ExportSpecifier
  1. specs1 を 引数 moduleExportsList の ExportEntriesForModule とする。
  2. specs2 を 引数 moduleExportSpecifier の ExportEntriesForModule とする。
  3. specs1specs2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. sourceNameModuleExportName の StringValue とする。
  2. もし modulenull なら
    1. localNamesourceName とする。
    2. importNamenull とする。
  3. それ以外
    1. localNamenull とする。
    2. importNamesourceName とする。
  4. 唯一の要素が ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: sourceName } であるリストを返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. sourceName を 最初の ModuleExportName の StringValue とする。
  2. exportName を 2つ目の ModuleExportName の StringValue とする。
  3. もし modulenull なら
    1. localNamesourceName とする。
    2. importNamenull とする。
  4. それ以外
    1. localNamenull とする。
    2. importNamesourceName とする。
  5. 唯一の要素が ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: exportName } であるリストを返す。

16.2.3.6 静的意味論: ReferencedBindings : Parse Node のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

NamedExports : { }
  1. 新しい空リストを返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsList の ReferencedBindings とする。
  2. names2ExportSpecifier の ReferencedBindings とする。
  3. names1names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 最初の ModuleExportName の ReferencedBindings を返す。
ModuleExportName : IdentifierName
  1. 唯一の要素が IdentifierName であるリストを返す。
ModuleExportName : StringLiteral
  1. 唯一の要素が StringLiteral であるリストを返す。

16.2.3.7 実行時意味論: 評価

ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ;
  1. empty を返す。
ExportDeclaration : export VariableStatement
  1. ? Evaluation of VariableStatement を返す。
ExportDeclaration : export Declaration
  1. ? Evaluation of Declaration を返す。
ExportDeclaration : export default HoistableDeclaration
  1. ? Evaluation of HoistableDeclaration を返す。
ExportDeclaration : export default ClassDeclaration
  1. value を ? BindingClassDeclarationEvaluation of ClassDeclaration とする。
  2. classNameClassDeclaration の BoundNames の唯一の要素とする。
  3. もし className"*default*" なら
    1. env を実行中実行コンテキストの LexicalEnvironment とする。
    2. InitializeBoundName("*default*", value, env) を実行。
  4. empty を返す。
ExportDeclaration : export default AssignmentExpression ;
  1. IsAnonymousFunctionDefinition(AssignmentExpression) が true なら
    1. value を 引数 "default" で ? NamedEvaluation of AssignmentExpression とする。
  2. それ以外
    1. rhs を ? Evaluation of AssignmentExpression とする。
    2. value を ? GetValue(rhs) とする。
  3. env を実行中実行コンテキストの LexicalEnvironment とする。
  4. InitializeBoundName("*default*", value, env) を実行。
  5. empty を返す。

17 エラー処理と言語拡張

実装は、関連する ECMAScript 言語構成要素が評価される時点でほとんどのエラーを報告しなければならない。早期エラー (early error) とは、そのエラーを含む Script 内のいかなる構成要素の評価よりも前に検出・報告できるエラーである。早期エラーが存在する場合、その構成要素の評価は行われない。実装は ParseScript における Script の構文解析の一部として Script 内の早期エラーを報告しなければならない。Module 内の早期エラーは、その Module が評価される時点で報告され、その Module は決して初期化されない。eval コード内の早期エラーは eval が呼び出された時点で報告され、eval コードの評価を阻止する。早期エラーでないすべてのエラーは実行時エラーである。

実装は、本仕様の「静的意味論: 早期エラー」小節に列挙されている条件が発生したあらゆる箇所を早期エラーとして報告しなければならない。

実装は、たとえコンパイラがある構成要素がいかなる状況でもエラーなく実行されないと証明できる場合であっても、他種のエラーを早期エラーとして扱ってはならない。そのような場合、実装は早期警告を発することは許されるが、関連する構成要素が実際に実行されるまでエラーを報告すべきではない。

実装は、以下を除き、規定どおりにすべてのエラーを報告しなければならない:

17.1 禁止される拡張

実装は以下の方法で本仕様を拡張してはならない:

18 ECMAScript 標準組み込みオブジェクト

ECMAScript の Script または Module が実行を開始するとき、特定の組み込みオブジェクトが利用可能である。1 つはグローバルオブジェクトで、実行中プログラムのグローバル環境の一部である。その他はグローバルオブジェクトの初期プロパティ、またはアクセス可能な組み込みオブジェクトのプロパティとして間接的にアクセスできる。

特に規定がない限り、関数として呼び出し可能な組み込みオブジェクトは 10.3 に記述される特性を持つ組み込み関数オブジェクトである。特に規定がない限り、組み込みオブジェクトの [[Extensible]] 内部スロットは初期値 true を持つ。すべての組み込み関数オブジェクトは、そのオブジェクトが最初に生成されたレルムの Realm Record を値とする [[Realm]] 内部スロットを持つ。

多くの組み込みオブジェクトは関数であり、引数付きで呼び出すことができる。そのうちいくつかはコンストラクタでもあり、new 演算子とともに使用されることを意図した関数である。各組み込み関数について、本仕様はその関数が要求する引数およびその関数オブジェクトのプロパティを記述する。各組み込みコンストラクタについては、さらにそのコンストラクタのプロトタイプオブジェクトのプロパティと、そのコンストラクタを呼び出す new 式が返す特定オブジェクトインスタンスのプロパティを記述する。

特に規定がない限り、ある関数またはコンストラクタが規定されたより少ない個数の引数を与えられた場合、その関数またはコンストラクタは不足引数(各々 undefined 値)を与えられたかのように正確に動作しなければならない。これら不足引数は「存在しない (not present)」ものと見なされ、仕様アルゴリズムによってそのように識別され得る。個別の関数の記述において、用語 “this value” および “NewTarget” は 10.3 に示される意味を持つ。

特に規定がない限り、記述された組み込み関数またはコンストラクタが許容されるより多い引数を与えられた場合、余剰引数は呼び出しにより評価された後その関数によって無視される。ただし、実装は単に余剰引数が存在することだけを条件として TypeError 例外を投げるのでない範囲で、そうした引数に関連する実装固有の挙動を定義してよい。

Note 1

組み込み関数集合に追加能力を加える実装は、既存関数へ新しいパラメータを追加するよりも、新しい関数を追加することで行うことが推奨される。

特に規定がない限り、すべての組み込み関数および組み込みコンストラクタは、その [[Prototype]] 内部スロットの値として Function プロトタイプオブジェクト(式 Function.prototype の初期値 (20.2.3)) を持つ。

特に規定がない限り、すべての組み込みプロトタイプオブジェクトは、その [[Prototype]] 内部スロットの値として Object プロトタイプオブジェクト(式 Object.prototype の初期値 (20.1.3))を持つ。ただし Object プロトタイプオブジェクト自身は除く。

本仕様が組み込みコンストラクタの挙動をアルゴリズム手順で定義する場合、[[Call]][[Construct]] の双方の目的における挙動はそれである。アルゴリズムが両者を区別する必要がある場合、NewTarget が undefined であるかを確認する(これは [[Call]] 呼び出しを示す)。

コンストラクタでない組み込み関数オブジェクトは、特別な規定がない限り [[Construct]] 内部メソッドを実装しない。

コンストラクタでない組み込み関数オブジェクトは、特別な規定がない限り "prototype" プロパティを持たない。

本仕様で定義される各組み込み関数は CreateBuiltinFunction 抽象操作 (10.3.4) を呼び出すことで生成される。パラメータ length および name の値は、それぞれ下記で述べられる "length" および "name" プロパティの初期値である。prefix パラメータの値も同様に下記で述べられる。

コンストラクタを含むすべての組み込み関数オブジェクトは、値が非負整数 Number である "length" プロパティを持つ。特に規定がない限り、この値は関数説明小節見出しに示される必須パラメータ数である。オプションパラメータおよび rest パラメータはカウントに含まれない。

Note 2

例えば、Array プロトタイプオブジェクト"map" プロパティの初期値である関数オブジェクトは、小節見出し «Array.prototype.map (callback [ , thisArg])» で記述され、ふたつの名前付き引数 callback と thisArg を示し、後者はオプションである;したがってその関数オブジェクト"length" プロパティ値は 1𝔽 である。

特に規定がない限り、組み込み関数オブジェクト"length" プロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

コンストラクタを含むすべての組み込み関数オブジェクトは、値が String である "name" プロパティを持つ。特に規定がない限り、この値は本仕様でその関数に与えられる名前である。匿名関数として指定される関数は、"name" プロパティ値として空文字列を使用する。オブジェクトのプロパティとして指定される関数については、その関数へアクセスする際に使用されるプロパティ名文字列が name 値となる。組み込みプロパティの get または set アクセサ関数として指定される関数は、CreateBuiltinFunction を呼ぶ際 prefix パラメータに "get" または "set"(それぞれ)を渡す。

プロパティキーが Symbol 値である各組み込み関数については、"name" プロパティの値が明示的に規定される。明示値が接頭辞 "get " または "set " で始まり、その関数が組み込みプロパティの get / set アクセサ関数である場合、接頭辞を除いた値が name パラメータへ、"get" または "set"(それぞれ)が prefix パラメータへ渡される。

特に規定がない限り、組み込み関数オブジェクト"name" プロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

19 から 28、および付録 B.2 に記述されるその他のすべてのデータプロパティは、特に規定がない限り属性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

19 から 28、および付録 B.2 に記述されるその他のすべてのアクセサプロパティは、特に規定がない限り属性 { [[Enumerable]]: false, [[Configurable]]: true } を持つ。get アクセサ関数のみが記述される場合、set アクセサ関数はデフォルト値 undefined である。set アクセサのみが記述される場合、get アクセサはデフォルト値 undefined である。

19 グローバルオブジェクト

グローバルオブジェクト:

19.1 グローバルオブジェクトの値プロパティ

19.1.1 globalThis

Realm Record realm におけるグローバルオブジェクト"globalThis" プロパティの初期値は realm.[[GlobalEnv]].[[GlobalThisValue]] である。

このプロパティは属性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

19.1.2 Infinity

Infinity の値は +∞𝔽 である (6.1.6.1 参照)。このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

19.1.3 NaN

NaN の値は NaN である (6.1.6.1 参照)。このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

19.1.4 undefined

undefined の値は undefined である (6.1.1 参照)。このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

19.2 グローバルオブジェクトの関数プロパティ

19.2.1 eval ( x )

この関数は %eval% 組み込みオブジェクトである。

呼び出されたとき、次の手順を実行する:

  1. PerformEval(x, false, false) を返す。

19.2.1.1 PerformEval ( x, strictCaller, direct )

The abstract operation PerformEval takes arguments x (ECMAScript 言語値), strictCaller (Boolean), and direct (Boolean) and returns ECMAScript 言語値を含む通常完了または throw completion. It performs the following steps when called:

  1. Assert: directfalse なら strictCallerfalse
  2. もし x が String でなければ x を返す。
  3. evalRealm を現在の Realm Record とする。
  4. 注: 直接 eval の場合、evalRealmeval 呼出元と eval 関数自身の双方のレルムである。
  5. HostEnsureCanCompileStrings(evalRealm, « », x, direct) を実行。
  6. inFunctionfalse とする。
  7. inMethodfalse とする。
  8. inDerivedConstructorfalse とする。
  9. inClassFieldInitializerfalse とする。
  10. もし directtrue なら
    1. thisEnvRecGetThisEnvironment() とする。
    2. もし thisEnvRecFunction Environment Record なら
      1. FthisEnvRec.[[FunctionObject]] とする。
      2. inFunctiontrue に設定。
      3. inMethodthisEnvRec.HasSuperBinding() に設定。
      4. もし F.[[ConstructorKind]]derived なら inDerivedConstructortrue に設定。
      5. classFieldInitializerNameF.[[ClassFieldInitializerName]] とする。
      6. もし classFieldInitializerNameempty でなければ inClassFieldInitializertrue に設定。
  11. 以下のサブステップを実装定義の順序(構文解析とエラー検出をインタリーブしてもよい)で実行:
    1. script を ParseText(x, Script) とする。
    2. もし script がエラーのリストなら SyntaxError 例外を投げる。
    3. もし script Contains ScriptBodyfalse なら undefined を返す。
    4. bodyscriptScriptBody とする。
    5. もし inFunctionfalse かつ bodyNewTarget を含むなら SyntaxError を投げる。
    6. もし inMethodfalse かつ bodySuperProperty を含むなら SyntaxError を投げる。
    7. もし inDerivedConstructorfalse かつ bodySuperCall を含むなら SyntaxError を投げる。
    8. もし inClassFieldInitializertrue かつ body の ContainsArguments が true なら SyntaxError を投げる。
  12. もし strictCallertrue なら strictEvaltrue とする。
  13. それ以外は strictEval を ScriptIsStrict of script とする。
  14. runningContext を実行中実行コンテキストとする。
  15. 注: directtrue の場合 runningContext は直接 eval を実行した実行コンテキストである。directfalse の場合 runningContexteval 呼出の実行コンテキストである。
  16. もし directtrue なら
    1. lexEnvNewDeclarativeEnvironment(runningContext の LexicalEnvironment) とする。
    2. varEnvrunningContext の VariableEnvironment とする。
    3. privateEnvrunningContext の PrivateEnvironment とする。
  17. それ以外
    1. lexEnvNewDeclarativeEnvironment(evalRealm.[[GlobalEnv]]) とする。
    2. varEnvevalRealm.[[GlobalEnv]] とする。
    3. privateEnvnull とする。
  18. もし strictEvaltrue なら varEnvlexEnv に設定。
  19. もし runningContext がまだサスペンドされていなければ runningContext をサスペンド。
  20. evalContext を新 ECMAScript コード実行コンテキストとする。
  21. evalContext.Function を null に設定。
  22. evalContext.RealmevalRealm に設定。
  23. evalContext.ScriptOrModule を runningContext.ScriptOrModule に設定。
  24. evalContext.VariableEnvironment を varEnv に設定。
  25. evalContext.LexicalEnvironment を lexEnv に設定。
  26. evalContext.PrivateEnvironment を privateEnv に設定。
  27. evalContext を実行コンテキストスタックにプッシュ;evalContext が実行中実行コンテキストとなる。
  28. resultCompletion(EvalDeclarationInstantiation(body, varEnv, lexEnv, privateEnv, strictEval)) とする。
  29. もし result が通常完了なら
    1. resultCompletion(Evaluation of body) に設定。
  30. もし result が通常完了かつ result.[[Value]]empty なら
    1. resultNormalCompletion(undefined) に設定。
  31. evalContext をサスペンドし実行コンテキストスタックから除去。
  32. スタック最上位のコンテキストを再開。
  33. result を返す。
Note

eval コードは、呼び出し側コンテキストまたは eval コードのどちらか一方でも厳格モードコードである場合、呼び出し側の変数環境に変数や関数束縛をインスタンス化できない。代わりに、それら束縛は eval コードからのみアクセス可能な新しい VariableEnvironment にインスタンス化される。letconstclass 宣言によって導入される束縛は常に新しい LexicalEnvironment にインスタンス化される。

19.2.1.2 HostEnsureCanCompileStrings ( calleeRealm, parameterStrings, bodyString, direct )

The host-defined abstract operation HostEnsureCanCompileStrings takes arguments calleeRealm (Realm Record), parameterStrings (文字列リスト), bodyString (文字列), and direct (Boolean) and returns unused を含む通常完了または throw completion. 開発者が文字列を ECMAScript コードとして解釈・評価できる特定の ECMAScript 関数をホスト環境がブロックすることを可能にする。

parameterStrings は(関数コンストラクタの一つを使用する際)連結されてパラメータリストを組み立てる文字列群を表す。bodyString は関数本体または eval 呼び出しに渡される文字列を表す。 direct は評価が直接 eval かどうかを示す。

HostEnsureCanCompileStrings のデフォルト実装は NormalCompletion(unused) を返す。

19.2.1.3 EvalDeclarationInstantiation ( body, varEnv, lexEnv, privateEnv, strict )

The abstract operation EvalDeclarationInstantiation takes arguments body (ScriptBody Parse Node), varEnv (Environment Record), lexEnv (Declarative Environment Record), privateEnv (PrivateEnvironment Record または null), and strict (Boolean) and returns unused を含む通常完了または throw completion. It performs the following steps when called:

  1. varNamesbody の VarDeclaredNames とする。
  2. varDeclarationsbody の VarScopedDeclarations とする。
  3. もし strictfalse なら
    1. もし varEnvGlobal Environment Record なら
      1. namevarNames について
        1. もし HasLexicalDeclaration(varEnv, name) が true なら SyntaxError 例外を投げる。
        2. 注: eval はグローバル lexical 宣言にシャドーされるグローバル var 宣言を作らない。
    2. thisEnvlexEnv とする。
    3. Assert: 以下のループは終了する。
    4. thisEnvvarEnv が同一 Environment Record でない間繰り返す
      1. もし thisEnvObject Environment Record でなければ
        1. 注: with 文の環境は lexical 宣言を含まないため var/let 衝突検査不要。
        2. namevarNames について
          1. もし ! thisEnv.HasBinding(name) が true なら
            1. Normative Optional
              ホストが Web ブラウザまたは Catch ブロック内の VariableStatements をサポートする場合、
              1. もし thisEnvCatch 節の Environment Record でなければ SyntaxError 例外を投げる。
            2. それ以外
              1. SyntaxError 例外を投げる。
          2. 注: 直接 eval は同名 lexical 宣言を越えて var を巻き上げない。
      2. thisEnvthisEnv.[[OuterEnv]] に設定。
  4. privateIdentifiers を空リストとする。
  5. pointerprivateEnv とする。
  6. pointernull でない間繰り返す
    1. Private Name bindingpointer.[[Names]] について
      1. もし privateIdentifiersbinding.[[Description]] を含まなければ追加。
    2. pointerpointer.[[OuterPrivateEnvironment]] に設定。
  7. AllPrivateIdentifiersValid of body (引数 privateIdentifiers) が false なら SyntaxError 例外。
  8. functionsToInitialize を空リストとする。
  9. declaredFunctionNames を空リストとする。
  10. varDeclarations の各 d を逆順で
    1. もし dVariableDeclaration, ForBinding, BindingIdentifier いずれでもなければ
      1. Assert: dFunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration のいずれか。
      2. 注: 同名関数宣言が複数ある場合、最後が使用される。
      3. fnd の BoundNames の唯一要素とする。
      4. もし declaredFunctionNamesfn を含まなければ
        1. もし varEnvGlobal Environment Record なら
          1. fnDefinable を ? CanDeclareGlobalFunction(varEnv, fn) とする。
          2. もし fnDefinablefalse なら TypeError
        2. fndeclaredFunctionNames に追加。
        3. dfunctionsToInitialize の先頭に挿入。
  11. declaredVarNames を空リストとする。
  12. varDeclarations の各 d について
    1. もし dVariableDeclaration, ForBinding, BindingIdentifier のいずれかなら
      1. 各文字列 vn ∈ BoundNames(d) について
        1. もし declaredFunctionNamesvn を含まなければ
          1. もし varEnvGlobal Environment Record なら
            1. vnDefinable を ? CanDeclareGlobalVar(varEnv, vn) とする。
            2. もし vnDefinablefalse なら TypeError
          2. もし declaredVarNamesvn を含まなければ追加。
  13. Normative Optional
    もし strictfalse かつホストが Web ブラウザまたは ブロックレベル Function 宣言 (Web レガシー互換意味論) をサポートするなら
    1. declaredFunctionOrVarNamesdeclaredFunctionNamesdeclaredVarNames の連結とする。
    2. body Contains xtrue となる任意の Block, CaseClause, DefaultClause xStatementList に直接含まれる各 FunctionDeclaration f について
      1. FfBindingIdentifier の StringValue とする。
      2. FunctionDeclaration fBindingIdentifierFVariableStatement に置換しても body に早期エラーが生じないなら
        1. bindingExistsfalse とする。
        2. thisEnvlexEnv とする。
        3. Assert: 以下のループは終了。
        4. thisEnvvarEnv の間繰り返す
          1. もし thisEnvObject Environment Record でなければ
            1. もし ! thisEnv.HasBinding(F) が true なら
              1. Normative Optional
                ホストが Web ブラウザまたは Catch ブロック内の VariableStatements をサポートするなら
                1. もし thisEnvCatch 節の Environment Record でなければ bindingExiststrue に設定。
              2. それ以外
                1. bindingExiststrue に設定。
          2. thisEnvthisEnv.[[OuterEnv]] に設定。
        5. もし bindingExistsfalse かつ varEnvGlobal Environment Record なら
          1. もし HasLexicalDeclaration(varEnv, F) が false なら
            1. fnDefinable を ? CanDeclareGlobalVar(varEnv, F) とする。
          2. それ以外
            1. fnDefinablefalse とする。
        6. それ以外
          1. fnDefinabletrue とする。
        7. もし bindingExistsfalse かつ fnDefinabletrue なら
          1. もし declaredFunctionOrVarNamesF を含まなければ
            1. もし varEnvGlobal Environment Record なら
              1. CreateGlobalVarBinding(varEnv, F, true) を実行。
            2. それ以外
              1. bindingExists を ! varEnv.HasBinding(F) とする。
              2. もし bindingExistsfalse なら
                1. varEnv.CreateMutableBinding(F, true)。
                2. varEnv.InitializeBinding(F, undefined)。
            3. FdeclaredFunctionOrVarNames に追加。
          2. FunctionDeclaration f を評価する際、15.2.6 で規定される FunctionDeclaration 評価アルゴリズムの代わりに次を行う:
            1. gEnv を実行中実行コンテキストの VariableEnvironment とする。
            2. bEnv を実行中実行コンテキストの LexicalEnvironment とする。
            3. fObj を ! bEnv.GetBindingValue(F, false) とする。
            4. gEnv.SetMutableBinding(F, fObj, false) を実行。
            5. unused を返す。
  14. 注: このアルゴリズムステップ以降は、varEnvGlobal Environment Record かつグローバルオブジェクトが Proxy exotic でない限り異常終了しない。
  15. lexDeclarationsbody の LexicallyScopedDeclarations とする。
  16. dlexDeclarations について
    1. 注: 字句的宣言名はここでインスタンス化されるが初期化されない。
    2. dn ∈ BoundNames(d) について
      1. もし IsConstantDeclaration(d) が true なら
        1. lexEnv.CreateImmutableBinding(dn, true) を実行。
      2. それ以外
        1. lexEnv.CreateMutableBinding(dn, false) を実行。
  17. 各 Parse Node ffunctionsToInitialize について
    1. fn を BoundNames(f) の唯一要素とする。
    2. fo を InstantiateFunctionObject(f, lexEnv, privateEnv) とする。
    3. もし varEnvGlobal Environment Record なら
      1. CreateGlobalFunctionBinding(varEnv, fn, fo, true) を実行。
    4. それ以外
      1. bindingExists を ! varEnv.HasBinding(fn) とする。
      2. もし bindingExistsfalse なら
        1. 注: 前段階の検証により以下は異常終了を返さない。
        2. varEnv.CreateMutableBinding(fn, true)。
        3. varEnv.InitializeBinding(fn, fo)。
      3. それ以外
        1. varEnv.SetMutableBinding(fn, fo, false)。
  18. 各文字列 vndeclaredVarNames について
    1. もし varEnvGlobal Environment Record なら
      1. CreateGlobalVarBinding(varEnv, vn, true) を実行。
    2. それ以外
      1. bindingExists を ! varEnv.HasBinding(vn) とする。
      2. もし bindingExistsfalse なら
        1. 注: 前段階の検証により以下は異常終了しない。
        2. varEnv.CreateMutableBinding(vn, true)。
        3. varEnv.InitializeBinding(vn, undefined)。
  19. unused を返す。

19.2.2 isFinite ( number )

この関数は %isFinite% 組み込みオブジェクトである。

呼び出されたとき次を実行:

  1. num を ? ToNumber(number) とする。
  2. もし num有限でなければ false を返す。
  3. それ以外 true を返す。

19.2.3 isNaN ( number )

この関数は %isNaN% 組み込みオブジェクトである。

呼び出されたとき次を実行:

  1. num を ? ToNumber(number) とする。
  2. もし numNaN なら true を返す。
  3. それ以外 false を返す。
Note

XNaN かどうかを ECMAScript コードで信頼性高く判定する方法は、X !== X という形式の式である。結果は XNaN のときかつそのときのみ true となる。

19.2.4 parseFloat ( string )

この関数は string 引数の内容を 10 進リテラルとして解釈した結果により Number 値を生成する。

これは %parseFloat% 組み込みオブジェクトである。

呼び出されたとき次を実行:

  1. inputString を ? ToString(string) とする。
  2. trimmedString を ! TrimString(inputString, start) とする。
  3. trimmed を StringToCodePoints(trimmedString) とする。
  4. trimmedPrefixStrDecimalLiteral の構文を満たす最長接頭辞(trimmed 自身の場合もある)とする。存在しなければ NaN を返す。
  5. parsedNumber を ParseText(trimmedPrefix, StrDecimalLiteral) とする。
  6. Assert: parsedNumber は Parse Node。
  7. parsedNumber の StringNumericValue を返す。
Note

この関数は string の先頭部分のみを Number 値として解釈する場合がある;10 進リテラル記法の一部として解釈できないコード単位は無視され、それらが無視されたことは通知されない。

19.2.5 parseInt ( string, radix )

この関数は指定された radix に従って string の内容を解釈した結果により整数 Number を生成する。string 先頭の空白は無視される。radix が 0 に強制変換される(undefined など)場合、数表現が "0x" または "0X" で始まる場合を除き 10 とみなす。その場合は 16 とみなす。radix が 16 の場合、数表現は任意で "0x" または "0X" で始まり得る。

これは %parseInt% 組み込みオブジェクトである。

呼び出されたとき次を実行:

  1. inputString を ? ToString(string) とする。
  2. S を ! TrimString(inputString, start) とする。
  3. sign を 1 とする。
  4. もし S が空でなく先頭コード単位が 0x002D (HYPHEN-MINUS) なら sign を -1 に設定。
  5. もし S が空でなく先頭コード単位が 0x002B (PLUS SIGN) または 0x002D (HYPHEN-MINUS) なら S を先頭 1 文字除去後の部分文字列に設定。
  6. R(? ToInt32(radix)) とする。
  7. stripPrefixtrue とする。
  8. もし R ≠ 0 なら
    1. もし R < 2 または R > 36 なら NaN を返す。
    2. もし R ≠ 16 なら stripPrefixfalse に設定。
  9. それ以外
    1. R を 10 に設定。
  10. もし stripPrefixtrue なら
    1. もし S の長さが少なくとも 2 で先頭 2 コード単位が "0x" または "0X" なら
      1. S をインデックス 2 以降の部分文字列に設定。
      2. R を 16 に設定。
  11. もし S が radix-R の数字でないコード単位を含むなら end をその最初の位置、そうでなければ endS の長さとする。
  12. ZS の 0 から end までの部分文字列とする。
  13. もし Z が空なら NaN を返す。
  14. mathIntZ が radix-R 表記で表す整数値とする(10〜35 に値を持つ数字には大文字 AZ および小文字 az を使用)。(ただし R=10 で Z が 20 を超える有効桁を含む場合、20 桁目以降の各有効桁は実装選択で 0 に置き換えてよく、かつ R が 2,4,8,10,16,32 のいずれでもない場合、mathIntZ の値を表す実装近似整数でよい。)
  15. もし mathInt = 0 なら
    1. もし sign = -1 なら -0𝔽 を返す。
    2. +0𝔽 を返す。
  16. 𝔽(sign × mathInt) を返す。
Note

この関数は string の先頭部分のみを整数値として解釈する場合がある;整数表記の一部と解釈できないコード単位は無視され、それらが無視されたことは通知されない。

19.2.6 URI 取扱関数

Uniform Resource Identifier (URI) は(ウェブページやファイル等の)リソースや、それへアクセスするための転送プロトコル(HTTP や FTP など)をインターネット上で識別する文字列である。ECMAScript 言語自体は、本節で説明されるように URI をエンコードおよびデコードする関数を除き URI 使用のためのサポートを提供しない。encodeURIdecodeURI は完全な URI を扱うことを意図し、予約文字は特別な意味(区切りなど)を持つことを前提としてエンコードしない。encodeURIComponentdecodeURIComponent は URI の個々の構成要素を扱うことを意図し、予約文字がテキストを表し完全な URI の一部となるときに特別な意味を持たないようエンコードされるべきであると仮定する。

Note 1

予約文字集合は RFC 2396 に基づき、より新しい RFC 3986 による変更を反映していない。

Note 2

ECMAScript の多くの実装はウェブページを操作する追加関数やメソッドを提供する;それらは本標準の範囲外である。

19.2.6.1 decodeURI ( encodedURI )

この関数は、encodeURI 関数によって導入された可能性がある種類の各エスケープシーケンスおよび UTF-8 エンコーディングを、その表すコードポイントの UTF-16 エンコーディングへ置換した新しいバージョンの URI を計算する。encodeURI によって導入され得なかったエスケープシーケンスは置換されない。

これは %decodeURI% 組み込みオブジェクトである。

呼び出されたとき次を実行:

  1. uriString を ? ToString(encodedURI) とする。
  2. preserveEscapeSet";/?:@&=+$,#" とする。
  3. Decode(uriString, preserveEscapeSet) を返す。

19.2.6.2 decodeURIComponent ( encodedURIComponent )

この関数は、encodeURIComponent によって導入された可能性がある各エスケープシーケンスおよび UTF-8 エンコーディングを、その表すコードポイントの UTF-16 エンコーディングへ置換した新しいバージョンの URI を計算する。

これは %decodeURIComponent% 組み込みオブジェクトである。

呼び出されたとき次を実行:

  1. componentString を ? ToString(encodedURIComponent) とする。
  2. preserveEscapeSet を空文字列とする。
  3. Decode(componentString, preserveEscapeSet) を返す。

19.2.6.3 encodeURI ( uri )

この関数は、UTF-16 エンコード (6.1.4) された URI の新しいバージョンを計算し、特定コードポイントの各出現を、そのコードポイントの UTF-8 エンコーディングを表す 1〜4 個のエスケープシーケンスへ置換する。

これは %encodeURI% 組み込みオブジェクトである。

呼び出されたとき次を実行:

  1. uriString を ? ToString(uri) とする。
  2. extraUnescaped";/?:@&=+$,#" とする。
  3. Encode(uriString, extraUnescaped) を返す。

19.2.6.4 encodeURIComponent ( uriComponent )

この関数は、UTF-16 エンコード (6.1.4) された URI 構成要素の新しいバージョンを計算し、特定コードポイントの各出現を、そのコードポイントの UTF-8 エンコーディングを表す 1〜4 個のエスケープシーケンスへ置換する。

これは %encodeURIComponent% 組み込みオブジェクトである。

呼び出されたとき次を実行:

  1. componentString を ? ToString(uriComponent) とする。
  2. extraUnescaped を空文字列とする。
  3. Encode(componentString, extraUnescaped) を返す。

19.2.6.5 Encode ( string, extraUnescaped )

The abstract operation Encode takes arguments string (文字列) and extraUnescaped (文字列) and returns 文字列を含む通常完了または throw completion. string6.1.4 に記述される UTF-16 エンコードされたコードポイント列とみなし URI エンコードとエスケープを行う。文字が RFC 2396 で非予約 (unreserved) と識別されるか extraUnescaped に現れる場合はエスケープされない。 It performs the following steps when called:

  1. lenstring の長さとする。
  2. R を空文字列とする。
  3. alwaysUnescaped を ASCII 単語文字列と "-.!~*'()" の連結とする。
  4. unescapedSetalwaysUnescapedextraUnescaped の連結とする。
  5. k を 0 とする。
  6. k < len の間繰り返す
    1. Cstring のインデックス k のコード単位とする。
    2. もし unescapedSetC を含むなら
      1. kk + 1 に。
      2. RRC の連結に。
    3. それ以外
      1. cp を CodePointAt(string, k) とする。
      2. もし cp.[[IsUnpairedSurrogate]]true なら URIError 例外。
      3. kk + cp.[[CodeUnitCount]] に。
      4. Octetscp.[[CodePoint]] に UTF-8 変換を適用して得るオクテット列とする。
      5. octetOctets について
        1. hexoctet の 16 進大文字表現文字列とする。
        2. RR"%"StringPad(hex, 2, "0", start) の連結に。
  7. R を返す。
Note

パーセントエンコーディングは個々のオクテットを表すため、単一のコードポイントが複数連続エスケープシーケンス(その UTF-8 コードユニット毎に 1 つ)で表現され得る。

19.2.6.6 Decode ( string, preserveEscapeSet )

The abstract operation Decode takes arguments string (文字列) and preserveEscapeSet (文字列) and returns 文字列を含む通常完了または throw completion. preserveEscapeSet 内の Basic Latin 文字に対応するエスケープシーケンスを保持しつつ URI のアンエスケープとデコードを行う。 It performs the following steps when called:

  1. lenstring の長さとする。
  2. R を空文字列とする。
  3. k を 0 とする。
  4. k < len の間繰り返す
    1. Cstring のインデックス k のコード単位とする。
    2. SC とする。
    3. もし C がコード単位 0x0025 (PERCENT SIGN) なら
      1. もし k + 3 > len なら URIError 例外。
      2. escapestringk から k + 3 までの部分文字列とする。
      3. BParseHexOctet(string, k + 1) とする。
      4. もし B整数でなければ URIError 例外。
      5. kk + 2 に。
      6. nB の先頭連続 1 ビット数とする。
      7. もし n = 0 なら
        1. asciiChar を数値が B のコード単位とする。
        2. もし preserveEscapeSetasciiChar を含むなら Sescape に、そうでなければ SasciiChar に設定。
      8. それ以外
        1. もし n = 1 または n > 4 なら URIError 例外。
        2. Octets を « B » とする。
        3. j を 1 とする。
        4. j < n の間繰り返す
          1. kk + 1 に。
          2. もし k + 3 > len なら URIError 例外。
          3. もし string のインデックス k のコード単位が 0x0025 でなければ URIError 例外。
          4. continuationByteParseHexOctet(string, k + 1) とする。
          5. もし continuationByte整数でなければ URIError 例外。
          6. continuationByteOctets に追加。
          7. kk + 2 に。
          8. jj + 1 に。
        5. Assert: Octets の長さは n
        6. もし Octets が Unicode コードポイントの有効な UTF-8 エンコーディングを含まなければ URIError 例外。
        7. VOctets に UTF-8 変換を適用して得るコードポイント(オクテット列から 21 ビット値)とする。
        8. S を UTF16EncodeCodePoint(V) に設定。
    4. RRS の連結に。
    5. kk + 1 に。
  5. R を返す。
Note

RFC 3629 は無効な UTF-8 オクテットシーケンスのデコードを禁止する。例えば無効なシーケンス 0xC0 0x80 はコード単位 0x0000 にデコードされてはならない。Decode アルゴリズムの実装は、そのような無効シーケンスに遭遇した際 URIError を投げる必要がある。

19.2.6.7 ParseHexOctet ( string, position )

The abstract operation ParseHexOctet takes arguments string (文字列) and position (非負整数) and returns 非負整数または SyntaxError オブジェクトの空でないリスト. string の指定 position にある 2 つの 16 進文字を符号なし 8 ビット整数にパースする。 It performs the following steps when called:

  1. lenstring の長さとする。
  2. Assert: position + 2 ≤ len
  3. hexDigitsstringposition から position + 2 までの部分文字列とする。
  4. parseResult を ParseText(hexDigits, HexDigits[~Sep]) とする。
  5. もし parseResult が Parse Node でなければ parseResult を返す。
  6. nparseResult の MV とする。
  7. Assert: n は 0 から 255 の閉区間内。
  8. n を返す。

19.3 グローバルオブジェクトのコンストラクタプロパティ

19.3.1 AggregateError ( . . . )

20.5.7.1 を参照。

19.3.2 Array ( . . . )

23.1.1 を参照。

19.3.3 ArrayBuffer ( . . . )

25.1.4 を参照。

19.3.4 BigInt ( . . . )

21.2.1 を参照。

19.3.5 BigInt64Array ( . . . )

23.2.5 を参照。

19.3.6 BigUint64Array ( . . . )

23.2.5 を参照。

19.3.7 Boolean ( . . . )

20.3.1 を参照。

19.3.8 DataView ( . . . )

25.3.2 を参照。

19.3.9 Date ( . . . )

21.4.2 を参照。

19.3.10 Error ( . . . )

20.5.1 を参照。

19.3.11 EvalError ( . . . )

20.5.5.1 を参照。

19.3.12 FinalizationRegistry ( . . . )

26.2.1 を参照。

19.3.13 Float16Array ( . . . )

23.2.5 を参照。

19.3.14 Float32Array ( . . . )

23.2.5 を参照。

19.3.15 Float64Array ( . . . )

23.2.5 を参照。

19.3.16 Function ( . . . )

20.2.1 を参照。

19.3.17 Int8Array ( . . . )

23.2.5 を参照。

19.3.18 Int16Array ( . . . )

23.2.5 を参照。

19.3.19 Int32Array ( . . . )

23.2.5 を参照。

19.3.20 Iterator ( . . . )

27.1.3.1 を参照。

19.3.21 Map ( . . . )

24.1.1 を参照。

19.3.22 Number ( . . . )

21.1.1 を参照。

19.3.23 Object ( . . . )

20.1.1 を参照。

19.3.24 Promise ( . . . )

27.2.3 を参照。

19.3.25 Proxy ( . . . )

28.2.1 を参照。

19.3.26 RangeError ( . . . )

20.5.5.2 を参照。

19.3.27 ReferenceError ( . . . )

20.5.5.3 を参照。

19.3.28 RegExp ( . . . )

22.2.4 を参照。

19.3.29 Set ( . . . )

24.2.2 を参照。

19.3.30 SharedArrayBuffer ( . . . )

25.2.3 を参照。

19.3.31 String ( . . . )

22.1.1 を参照。

19.3.32 Symbol ( . . . )

20.4.1 を参照。

19.3.33 SyntaxError ( . . . )

20.5.5.4 を参照。

19.3.34 TypeError ( . . . )

20.5.5.5 を参照。

19.3.35 Uint8Array ( . . . )

23.2.5 を参照。

19.3.36 Uint8ClampedArray ( . . . )

23.2.5 を参照。

19.3.37 Uint16Array ( . . . )

23.2.5 を参照。

19.3.38 Uint32Array ( . . . )

23.2.5 を参照。

19.3.39 URIError ( . . . )

20.5.5.6 を参照。

19.3.40 WeakMap ( . . . )

24.3.1 を参照。

19.3.41 WeakRef ( . . . )

26.1.1 を参照。

19.3.42 WeakSet ( . . . )

24.4 を参照。

19.4 グローバルオブジェクトのその他のプロパティ

19.4.1 Atomics

25.4 を参照。

19.4.2 JSON

25.5 を参照。

19.4.3 Math

21.3 を参照。

19.4.4 Reflect

28.1 を参照。

20 基礎オブジェクト (Fundamental Objects)

20.1 Object オブジェクト

20.1.1 Object コンストラクタ

Object コンストラクタ:

20.1.1.1 Object ( [ value ] )

この関数は呼び出されたとき次の手順を行う:

  1. NewTarget が undefined でもアクティブな関数オブジェクトでもないなら
    1. OrdinaryCreateFromConstructor(NewTarget, "%Object.prototype%") を返す。
  2. valueundefined または null なら OrdinaryObjectCreate(%Object.prototype%) を返す。
  3. ToObject(value) を返す。

20.1.2 Object コンストラクタのプロパティ

Object コンストラクタ:

  • %Function.prototype% を持つ [[Prototype]] 内部スロットを有する。
  • 1𝔽"length" プロパティを持つ。
  • 以下の追加プロパティを持つ:

20.1.2.1 Object.assign ( target, ...sources )

この関数は 1 つ以上のソースオブジェクトの列挙可能な自身のプロパティ(値)を target オブジェクトへコピーする。

呼び出されたとき次を行う:

  1. to を ? ToObject(target) とする。
  2. 引数が 1 個だけなら to を返す。
  3. sources の各要素 nextSource について
    1. nextSourceundefined でも null でもなければ
      1. from を ! ToObject(nextSource) とする。
      2. keys を ? from.[[OwnPropertyKeys]]() とする。
      3. keys の各 nextKey について
        1. desc を ? from.[[GetOwnProperty]](nextKey) とする。
        2. descundefined でなく desc.[[Enumerable]]true なら
          1. propValue を ? Get(from, nextKey) とする。
          2. Set(to, nextKey, propValue, true) を実行。
  4. to を返す。

この関数の "length" プロパティは 2𝔽

20.1.2.2 Object.create ( O, Properties )

この関数は指定されたプロトタイプを持つ新しいオブジェクトを生成する。

呼び出されたとき次を行う:

  1. O が Object でなく かつ null でもないなら TypeError 例外を投げる。
  2. objOrdinaryObjectCreate(O) とする。
  3. Propertiesundefined でなければ
    1. ObjectDefineProperties(obj, Properties) を返す。
  4. obj を返す。

20.1.2.3 Object.defineProperties ( O, Properties )

この関数はオブジェクトに自身のプロパティを追加し/または既存自身プロパティの属性を更新する。

呼び出されたとき次を行う:

  1. O が Object でなければ TypeError 例外。
  2. ObjectDefineProperties(O, Properties) を返す。

20.1.2.3.1 ObjectDefineProperties ( O, Properties )

The abstract operation ObjectDefineProperties takes arguments O (Object) and Properties (ECMAScript 言語値) and returns オブジェクトを含む通常完了または throw completion. It performs the following steps when called:

  1. props を ? ToObject(Properties) とする。
  2. keys を ? props.[[OwnPropertyKeys]]() とする。
  3. descriptors を空リストとする。
  4. keys の各 nextKey について
    1. propDesc を ? props.[[GetOwnProperty]](nextKey) とする。
    2. propDescundefined でなく propDesc.[[Enumerable]]true なら
      1. descObj を ? Get(props, nextKey) とする。
      2. desc を ? ToPropertyDescriptor(descObj) とする。
      3. Record { [[Key]]: nextKey, [[Descriptor]]: desc } を descriptors に追加。
  5. descriptors の各 property について
    1. DefinePropertyOrThrow(O, property.[[Key]], property.[[Descriptor]]) を実行。
  6. O を返す。

20.1.2.4 Object.defineProperty ( O, P, Attributes )

この関数は自身のプロパティを追加し/または既存自身プロパティの属性を更新する。

呼び出されたとき次を行う:

  1. O が Object でなければ TypeError
  2. key を ? ToPropertyKey(P) とする。
  3. desc を ? ToPropertyDescriptor(Attributes) とする。
  4. DefinePropertyOrThrow(O, key, desc)。
  5. O を返す。

20.1.2.5 Object.entries ( O )

この関数は呼び出されたとき次を行う:

  1. obj を ? ToObject(O) とする。
  2. entryList を ? EnumerableOwnProperties(obj, key+value) とする。
  3. CreateArrayFromList(entryList) を返す。

20.1.2.6 Object.freeze ( O )

この関数は呼び出されたとき次を行う:

  1. O が Object でなければ O を返す。
  2. status を ? SetIntegrityLevel(O, frozen) とする。
  3. statusfalse なら TypeError
  4. O を返す。

20.1.2.7 Object.fromEntries ( iterable )

この関数は呼び出されたとき次を行う:

  1. RequireObjectCoercible(iterable) を実行。
  2. objOrdinaryObjectCreate(%Object.prototype%) とする。
  3. Assert: obj は拡張可能な通常オブジェクトで自身プロパティを持たない。
  4. closure を引数 (key, value) を取り obj を捕捉し次を行う新しい Abstract Closure とする:
    1. propertyKey を ? ToPropertyKey(key) とする。
    2. CreateDataPropertyOrThrow(obj, propertyKey, value)。
    3. NormalCompletion(undefined) を返す。
  5. adderCreateBuiltinFunction(closure, 2, "", « ») とする。
  6. AddEntriesFromIterable(obj, iterable, adder) を返す。
Note
adder 向けに生成された関数は ECMAScript コードから直接はアクセスできない。

20.1.2.8 Object.getOwnPropertyDescriptor ( O, P )

この関数は呼び出されたとき次を行う:

  1. obj を ? ToObject(O) とする。
  2. key を ? ToPropertyKey(P) とする。
  3. desc を ? obj.[[GetOwnProperty]](key) とする。
  4. FromPropertyDescriptor(desc) を返す。

20.1.2.9 Object.getOwnPropertyDescriptors ( O )

この関数は呼び出されたとき次を行う:

  1. obj を ? ToObject(O) とする。
  2. ownKeys を ? obj.[[OwnPropertyKeys]]() とする。
  3. descriptorsOrdinaryObjectCreate(%Object.prototype%) とする。
  4. ownKeys の各 key について
    1. desc を ? obj.[[GetOwnProperty]](key) とする。
    2. descriptorFromPropertyDescriptor(desc) とする。
    3. descriptorundefined でなければ ! CreateDataPropertyOrThrow(descriptors, key, descriptor)。
  5. descriptors を返す。

20.1.2.10 Object.getOwnPropertyNames ( O )

この関数は呼び出されたとき次を行う:

  1. CreateArrayFromList(? GetOwnPropertyKeys(O, string)) を返す。

20.1.2.11 Object.getOwnPropertySymbols ( O )

この関数は呼び出されたとき次を行う:

  1. CreateArrayFromList(? GetOwnPropertyKeys(O, symbol)) を返す。

20.1.2.11.1 GetOwnPropertyKeys ( O, type )

The abstract operation GetOwnPropertyKeys takes arguments O (ECMAScript 言語値) and type (string または symbol) and returns プロパティキーリストを含む通常完了または throw completion. It performs the following steps when called:

  1. obj を ? ToObject(O) とする。
  2. keys を ? obj.[[OwnPropertyKeys]]() とする。
  3. nameList を空リストとする。
  4. keys の各 nextKey について
    1. nextKey が Symbol で typesymbol の場合、または nextKey が String で typestring の場合
      1. nextKeynameList に追加。
  5. nameList を返す。

20.1.2.12 Object.getPrototypeOf ( O )

この関数は呼び出されたとき次を行う:

  1. obj を ? ToObject(O) とする。
  2. obj.[[GetPrototypeOf]]() を返す。

20.1.2.13 Object.groupBy ( items, callback )

Note

callback は 2 引数を受け取る関数であるべき。groupByitems の各要素に昇順で 1 回ずつ callback を呼び出し新しいオブジェクトを構築する。callback から返された各値はプロパティキーに変換され、そのキーごとに結果オブジェクトはキーをそのキーに変換された値を持つ要素すべての配列に対応付ける。

callback は (要素の値, そのインデックス) の 2 引数で呼ばれる。

groupBy の返す値は %Object.prototype% を継承しないオブジェクト。

呼び出されたとき次を行う:

  1. groups を ? GroupBy(items, callback, property) とする。
  2. objOrdinaryObjectCreate(null) とする。
  3. Record { [[Key]], [[Elements]] } ggroups について
    1. elementsCreateArrayFromList(g.[[Elements]]) とする。
    2. CreateDataPropertyOrThrow(obj, g.[[Key]], elements)。
  4. obj を返す。

20.1.2.14 Object.hasOwn ( O, P )

この関数は呼び出されたとき次を行う:

  1. obj を ? ToObject(O) とする。
  2. key を ? ToPropertyKey(P) とする。
  3. HasOwnProperty(obj, key) を返す。

20.1.2.15 Object.is ( value1, value2 )

この関数は呼び出されたとき次を行う:

  1. SameValue(value1, value2) を返す。

20.1.2.16 Object.isExtensible ( O )

この関数は呼び出されたとき次を行う:

  1. O が Object でなければ false を返す。
  2. IsExtensible(O) を返す。

20.1.2.17 Object.isFrozen ( O )

この関数は呼び出されたとき次を行う:

  1. O が Object でなければ true を返す。
  2. TestIntegrityLevel(O, frozen) を返す。

20.1.2.18 Object.isSealed ( O )

この関数は呼び出されたとき次を行う:

  1. O が Object でなければ true を返す。
  2. TestIntegrityLevel(O, sealed) を返す。

20.1.2.19 Object.keys ( O )

この関数は呼び出されたとき次を行う:

  1. obj を ? ToObject(O) とする。
  2. keyList を ? EnumerableOwnProperties(obj, key) とする。
  3. CreateArrayFromList(keyList) を返す。

20.1.2.20 Object.preventExtensions ( O )

この関数は呼び出されたとき次を行う:

  1. O が Object でなければ O を返す。
  2. status を ? O.[[PreventExtensions]]() とする。
  3. statusfalse なら TypeError
  4. O を返す。

20.1.2.21 Object.prototype

Object.prototype の初期値は Object プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

20.1.2.22 Object.seal ( O )

この関数は呼び出されたとき次を行う:

  1. O が Object でなければ O を返す。
  2. status を ? SetIntegrityLevel(O, sealed) とする。
  3. statusfalse なら TypeError
  4. O を返す。

20.1.2.23 Object.setPrototypeOf ( O, proto )

この関数は呼び出されたとき次を行う:

  1. RequireObjectCoercible(O) を実行。
  2. proto が Object でなく かつ null でもないなら TypeError
  3. O が Object でなければ O を返す。
  4. status を ? O.[[SetPrototypeOf]](proto) とする。
  5. statusfalse なら TypeError
  6. O を返す。

20.1.2.24 Object.values ( O )

この関数は呼び出されたとき次を行う:

  1. obj を ? ToObject(O) とする。
  2. valueList を ? EnumerableOwnProperties(obj, value) とする。
  3. CreateArrayFromList(valueList) を返す。

20.1.3 Object プロトタイプオブジェクトのプロパティ

Object プロトタイプオブジェクト は次を満たす:

20.1.3.1 Object.prototype.constructor

Object.prototype.constructor の初期値は %Object% である。

20.1.3.2 Object.prototype.hasOwnProperty ( V )

このメソッドは呼び出されたとき次を行う:

  1. P を ? ToPropertyKey(V) とする。
  2. O を ? ToObject(this value) とする。
  3. HasOwnProperty(O, P) を返す。
Note

手順 12 の順序は、以前の版で最初の手順が投げていた可能性のある例外を thisundefined / null の場合でも維持するために選ばれている。

20.1.3.3 Object.prototype.isPrototypeOf ( V )

このメソッドは呼び出されたとき次を行う:

  1. V が Object でなければ false を返す。
  2. O を ? ToObject(this value) とする。
  3. 繰り返し:
    1. V を ? V.[[GetPrototypeOf]]() に設定。
    2. Vnull なら false を返す。
    3. SameValue(O, V) が true なら true を返す。
Note

手順順序は前版との互換性(V がオブジェクトでない場合の挙動)を保つ。

20.1.3.4 Object.prototype.propertyIsEnumerable ( V )

このメソッドは呼び出されたとき次を行う:

  1. P を ? ToPropertyKey(V) とする。
  2. O を ? ToObject(this value) とする。
  3. desc を ? O.[[GetOwnProperty]](P) とする。
  4. descundefined なら false
  5. desc.[[Enumerable]] を返す。
Note 1

このメソッドはプロトタイプチェーン上のオブジェクトを考慮しない。

Note 2

手順順序は過去との互換性保持のため。

20.1.3.5 Object.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

このメソッドは呼び出されたとき次を行う:

  1. Othis 値とする。
  2. ? Invoke(O, "toString") を返す。

オプション引数は使用されないが ECMA-402 の toLocaleString 形式と整合させるために予約される。ECMA-402 を実装しない実装は他目的に使ってはならない。

Note 1

ロケール依存の toString を持たないオブジェクト用の汎用実装。Array, Number, Date, %TypedArray% は固有実装を持つ。

Note 2

ECMA-402 はこのデフォルト実装の代替を意図的に提供しない。

20.1.3.6 Object.prototype.toString ( )

このメソッドは呼び出されたとき次を行う:

  1. this 値が undefined なら "[object Undefined]" を返す。
  2. this 値が null なら "[object Null]" を返す。
  3. O を ! ToObject(this value) とする。
  4. isArray を ? IsArray(O) とする。
  5. isArraytrue なら builtinTag"Array"
  6. Else O[[ParameterMap]] 内部スロットを持つなら builtinTag = "Arguments"
  7. Else O[[Call]] 内部メソッドを持つなら builtinTag = "Function"
  8. Else O[[ErrorData]] 内部スロットを持つなら builtinTag = "Error"
  9. Else O[[BooleanData]] 内部スロットを持つなら "Boolean"
  10. Else O[[NumberData]] 内部スロットを持つなら "Number"
  11. Else O[[StringData]] 内部スロットを持つなら "String"
  12. Else O[[DateValue]] 内部スロットを持つなら "Date"
  13. Else O[[RegExpMatcher]] 内部スロットを持つなら "RegExp"
  14. Else builtinTag = "Object"
  15. tag を ? Get(O, %Symbol.toStringTag%) とする。
  16. tag が String でなければ tag = builtinTag
  17. "[object "tag"]" の連結を返す。
Note

歴史的にこのメソッドは [[Class]] 内部スロットの文字列表現取得に使われた。定義は互換性保持のためであり汎用型判定手段ではない。%Symbol.toStringTag% の利用で信頼性が損なわれ得る。

20.1.3.7 Object.prototype.valueOf ( )

このメソッドは呼び出されたとき次を行う:

  1. ToObject(this value) を返す。
Normative Optional, Legacy

20.1.3.8 Object.prototype.__proto__

Object.prototype.__proto__ は属性 { [[Enumerable]]: false, [[Configurable]]: true } のアクセサプロパティで、[[Get]] / [[Set]] は以下:

20.1.3.8.1 get Object.prototype.__proto__

引数不要の組み込み関数。呼び出し時:

  1. O を ? ToObject(this value) とする。
  2. O.[[GetPrototypeOf]]() を返す。

20.1.3.8.2 set Object.prototype.__proto__

引数 proto を取る組み込み関数。呼び出し時:

  1. Othis 値とする。
  2. RequireObjectCoercible(O)。
  3. proto が Object でなく null でもなければ undefined を返す。
  4. O が Object でなければ undefined を返す。
  5. status を ? O.[[SetPrototypeOf]](proto) とする。
  6. statusfalse なら TypeError
  7. undefined を返す。
Normative Optional, Legacy

20.1.3.9 レガシー Object.prototype アクセサメソッド

20.1.3.9.1 Object.prototype.__defineGetter__ ( P, getter )

呼び出し手順:

  1. O を ? ToObject(this value) とする。
  2. IsCallable(getter) が false なら TypeError
  3. desc を PropertyDescriptor { [[Get]]: getter, [[Enumerable]]: true, [[Configurable]]: true } とする。
  4. key を ? ToPropertyKey(P) とする。
  5. DefinePropertyOrThrow(O, key, desc)。
  6. undefined を返す。

20.1.3.9.2 Object.prototype.__defineSetter__ ( P, setter )

呼び出し手順:

  1. O を ? ToObject(this value) とする。
  2. IsCallable(setter) が false なら TypeError
  3. desc を PropertyDescriptor { [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: true } とする。
  4. key を ? ToPropertyKey(P) とする。
  5. DefinePropertyOrThrow(O, key, desc)。
  6. undefined を返す。

20.1.3.9.3 Object.prototype.__lookupGetter__ ( P )

呼び出し手順:

  1. O を ? ToObject(this value) とする。
  2. key を ? ToPropertyKey(P) とする。
  3. 繰り返し:
    1. desc を ? O.[[GetOwnProperty]](key) とする。
    2. descundefined でなければ
      1. IsAccessorDescriptor(desc) が true なら desc.[[Get]] を返す。
      2. undefined を返す。
    3. O を ? O.[[GetPrototypeOf]]() とする。
    4. Onull なら undefined を返す。

20.1.3.9.4 Object.prototype.__lookupSetter__ ( P )

呼び出し手順:

  1. O を ? ToObject(this value)。
  2. key を ? ToPropertyKey(P)。
  3. 繰り返し:
    1. desc を ? O.[[GetOwnProperty]](key)。
    2. descundefined でなければ
      1. IsAccessorDescriptor(desc) が true なら desc.[[Set]] を返す。
      2. undefined を返す。
    3. O を ? O.[[GetPrototypeOf]]()
    4. Onull なら undefined を返す。

20.1.4 Object インスタンスのプロパティ

Object インスタンスは Object プロトタイプオブジェクトから継承するもの以外の特別なプロパティを持たない。

20.2 Function オブジェクト

20.2.1 Function コンストラクタ

Function コンストラクタ:

  • %Function% である。
  • グローバルオブジェクト"Function" プロパティの初期値である。
  • コンストラクタでなく関数として呼び出されたとき新しい関数オブジェクトを生成し初期化する。すなわち Function(…) は同じ引数での new Function(…) と等価。
  • クラス定義の extends 節値として使用できる。指定の Function 挙動を継承するサブクラスコンストラクタは内部スロットを持つインスタンス生成と初期化のため super 呼び出しが必要。ECMAScript の全ての構文的関数定義形式は Function のインスタンスを生成し、組み込み GeneratorFunction / AsyncFunction / AsyncGeneratorFunction のサブクラス以外にサブクラスインスタンスを生成する構文はない。

20.2.1.1 Function ( ...parameterArgs, bodyArg )

最後の引数(存在すれば)が関数本体(実行コード)を指定し、それ以前は仮引数を指定する。

呼び出し手順:

  1. C をアクティブな関数オブジェクトとする。
  2. bodyArg が与えられなければ空文字列に設定。
  3. CreateDynamicFunction(C, NewTarget, normal, parameterArgs, bodyArg) を返す。
Note

各仮引数に個別の引数を与える必要はない。以下 3 例は同じ結果:

new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")

20.2.1.1.1 CreateDynamicFunction ( constructor, newTarget, kind, parameterArgs, bodyArg )

The abstract operation CreateDynamicFunction takes arguments constructor (コンストラクタ), newTarget (コンストラクタまたは undefined), kind (normal, generator, async, async-generator), parameterArgs (ECMAScript 言語値リスト), and bodyArg (ECMAScript 言語値) and returns 関数オブジェクトを含む通常完了または throw completion. constructor はこの操作を実行中のコンストラクタnewTarget は最初に new が適用されたコンストラクタparameterArgs, bodyArgconstructor に渡された引数値。 It performs the following steps when called:

  1. newTargetundefined なら newTarget = constructor
  2. kindnormal なら
    1. prefix = "function"
    2. exprSym = FunctionExpression
    3. bodySym = FunctionBody[~Yield, ~Await]
    4. parameterSym = FormalParameters[~Yield, ~Await]
    5. fallbackProto = "%Function.prototype%"
  3. Else if kind = generator
    1. prefix = "function*"
    2. exprSym = GeneratorExpression
    3. bodySym = GeneratorBody
    4. parameterSym = FormalParameters[+Yield, ~Await]
    5. fallbackProto = "%GeneratorFunction.prototype%"
  4. Else if kind = async
    1. prefix = "async function"
    2. exprSym = AsyncFunctionExpression
    3. bodySym = AsyncFunctionBody
    4. parameterSym = FormalParameters[~Yield, +Await]
    5. fallbackProto = "%AsyncFunction.prototype%"
  5. Else
    1. Assert: kind = async-generator
    2. prefix = "async function*"
    3. exprSym = AsyncGeneratorExpression
    4. bodySym = AsyncGeneratorBody
    5. parameterSym = FormalParameters[+Yield, +Await]
    6. fallbackProto = "%AsyncGeneratorFunction.prototype%"
  6. argCountparameterArgs の要素数とする。
  7. parameterStrings を空リストとする。
  8. parameterArgs の各 arg について
    1. ToString(arg) を parameterStrings に追加。
  9. bodyString を ? ToString(bodyArg) とする。
  10. currentRealm を現在の Realm Record とする。
  11. HostEnsureCanCompileStrings(currentRealm, parameterStrings, bodyString, false)。
  12. P を空文字列とする。
  13. argCount > 0 なら
    1. P = parameterStrings[0]。
    2. k = 1。
    3. k < argCount の間
      1. nextArgString = parameterStrings[k]。
      2. P を (P + "," + nextArgString) に。
      3. k = k + 1。
  14. bodyParseString を LF, bodyString, LF の連結とする。
  15. sourceStringprefix, " anonymous(", P, LF, ") {", bodyParseString, "}" の連結とする。
  16. sourceText = StringToCodePoints(sourceString)。
  17. parameters = ParseText(P, parameterSym)。
  18. parameters がエラーリストなら SyntaxError
  19. body = ParseText(bodyParseString, bodySym)。
  20. body がエラーリストなら SyntaxError
  21. (注)パラメータと本体を個別にパースすることでそれぞれ単独でも妥当性を保証。
  22. (注)ここに到達したら sourceTextexprSym の構文を満たすはず。次の 2 手順で Early Error を適用。
  23. expr = ParseText(sourceText, exprSym)。
  24. expr がエラーリストなら SyntaxError
  25. proto を ? GetPrototypeFromConstructor(newTarget, fallbackProto) とする。
  26. envcurrentRealm.[[GlobalEnv]]
  27. privateEnv = null
  28. F = OrdinaryFunctionCreate(proto, sourceText, parameters, body, non-lexical-this, env, privateEnv)。
  29. SetFunctionName(F, "anonymous")。
  30. kind = generator なら
    1. prototype = OrdinaryObjectCreate(%GeneratorPrototype%)。
    2. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })。
  31. Else if kind = async-generator
    1. prototype = OrdinaryObjectCreate(%AsyncGeneratorPrototype%)。
    2. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })。
  32. Else if kind = normal
    1. MakeConstructor(F) を実行。
  33. (注)kind = async の関数は構築不能で "prototype" を持たない。
  34. F を返す。
Note

CreateDynamicFunction は kindasync でない関数に "prototype" プロパティを付与しコンストラクタとして利用され得るようにする。

20.2.2 Function コンストラクタのプロパティ

Function コンストラクタ:

20.2.2.1 Function.prototype

Function.prototype の値は Function プロトタイプオブジェクト

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.2.3 Function プロトタイプオブジェクトのプロパティ

Function プロトタイプオブジェクト:

  • %Function.prototype% である。
  • 自身が組み込み関数オブジェクト
  • 任意の引数を受け取り undefined を返す。
  • [[Construct]] 内部メソッドを持たず newコンストラクタ使用不可。
  • [[Prototype]] 内部スロットは %Object.prototype%
  • "prototype" プロパティを持たない。
  • "length" プロパティ値は +0𝔽
  • "name" プロパティ値は空文字列。
Note

互換性のため関数オブジェクトと規定される。

20.2.3.1 Function.prototype.apply ( thisArg, argArray )

呼び出し手順:

  1. functhis 値とする。
  2. IsCallable(func) が false なら TypeError
  3. argArrayundefined または null なら
    1. PrepareForTailCall() を実行。
    2. ? Call(func, thisArg) を返す。
  4. argList を ? CreateListFromArrayLike(argArray) とする。
  5. PrepareForTailCall()。
  6. ? Call(func, thisArg, argList) を返す。
Note 1

thisArg は変換なしに渡される(Edition 3 との違い)。非厳格関数は入口で再度変換を行う。

Note 2

func がアローまたはバウンド関数なら thisArg は手順 6[[Call]] に無視される。

20.2.3.2 Function.prototype.bind ( thisArg, ...args )

呼び出し手順:

  1. Targetthis 値とする。
  2. IsCallable(Target) が false なら TypeError
  3. F を ? BoundFunctionCreate(Target, thisArg, args) とする。
  4. L = 0。
  5. targetHasLength = ? HasOwnProperty(Target, "length")。
  6. targetHasLengthtrue なら
    1. targetLen = ? Get(Target, "length")。
    2. targetLen が Number なら
      1. targetLen+∞𝔽 なら L = +∞。
      2. Else if targetLen-∞𝔽 なら L = 0。
      3. Else
        1. targetLenAsInt = ! ToIntegerOrInfinity(targetLen)。
        2. Assert: 有限
        3. argCount = args の要素数。
        4. L = max(targetLenAsInt - argCount, 0)。
  7. SetFunctionLength(F, L)。
  8. targetName = ? Get(Target, "name")。
  9. targetName が String でなければ空文字列。
  10. SetFunctionName(F, targetName, "bound")。
  11. F を返す。
Note 1

bind で生成される関数はエキゾチックオブジェクト"prototype" を持たない。

Note 2

Target がアローまたはバウンド関数なら thisArg は後続呼出で使用されない。

20.2.3.3 Function.prototype.call ( thisArg, ...args )

呼び出し手順:

  1. functhis 値とする。
  2. IsCallable(func) が false なら TypeError
  3. PrepareForTailCall()。
  4. ? Call(func, thisArg, args) を返す。
Note 1

thisArg は変換されないが非厳格関数は入口で変換。

Note 2

func がアロー/バウンド関数なら thisArg は手順 4 で無視。

20.2.3.4 Function.prototype.constructor

Function.prototype.constructor の初期値は %Function%

20.2.3.5 Function.prototype.toString ( )

呼び出し手順:

  1. functhis 値とする。
  2. func が Object で [[SourceText]] 内部スロットを持ち Unicode コードポイント列で HostHasSourceTextAvailable(func) が true なら
    1. CodePointsToString(func.[[SourceText]]) を返す。
  3. func組み込み関数オブジェクト なら実装定義の文字列(構文は NativeFunction)を返す。さらに [[InitialName]] があれば PropertyName 部にそれを用いる。
  4. func が Object かつ IsCallable(func) が true なら実装定義文字列(NativeFunction 構文)を返す。
  5. TypeError 例外。
NativeFunction : function NativeFunctionAccessoropt PropertyName[~Yield, ~Await]opt ( FormalParameters[~Yield, ~Await] ) { [ native code ] } NativeFunctionAccessor : get set

20.2.3.6 Function.prototype [ %Symbol.hasInstance% ] ( V )

呼び出し手順:

  1. Fthis 値とする。
  2. OrdinaryHasInstance(F, V) を返す。

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Note

多くの関数が継承するデフォルト実装。instanceof はこれを用いる。例

v instanceof F

F[%Symbol.hasInstance%](v)

と評価される。コンストラクタは別実装を公開することで判定を制御可能。

改ざん防止のため非書換・非再構成。

このメソッドの "name" プロパティ値は "[Symbol.hasInstance]"

20.2.4 Function インスタンス

全 Function インスタンスは ECMAScript 関数オブジェクトであり Table 28 の内部スロットを持つ。Function.prototype.bind により生成されたものは Table 29 の内部スロットを持つ。

Function インスタンスは以下のプロパティを持つ:

20.2.4.1 length

"length" プロパティ値は典型的に期待される引数個数(整数)。他個数で呼び出し可能でその挙動は関数次第。このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

20.2.4.2 name

"name" プロパティ値は説明的な String。意味的影響はなく定義位置で参照に使われる識別的名称。属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

文脈名を持たない匿名関数は空文字列を用いる。

20.2.4.3 prototype

コンストラクタとして使用可能な関数インスタンスは "prototype" プロパティを持ち、生成時に別の通常オブジェクトが作られ初期値となる。特に規定がない限りこの値はコンストラクタとして呼び出されたとき生成オブジェクトの [[Prototype]] 初期化に用いられる。

属性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。

Note

Function.prototype.bindMethodDefinitionGeneratorMethod / AsyncGeneratorMethod 以外)評価、ArrowFunction によるものは "prototype" を持たない。

20.2.5 HostHasSourceTextAvailable ( func )

The host-defined abstract operation HostHasSourceTextAvailable takes argument func (関数オブジェクト) and returns Boolean. ホストfunc のソーステキスト提供を防止するために用いる。

HostHasSourceTextAvailable の実装要件:

  • 引数に対して決定的であること。同一 func への各呼出で同じ結果を返す。

デフォルト実装は true を返す。

20.3 Boolean オブジェクト

20.3.1 Boolean コンストラクタ

Boolean コンストラクタ:

  • %Boolean% である。
  • グローバルオブジェクト"Boolean" プロパティ初期値。
  • コンストラクタとして呼ぶと新 Boolean オブジェクト生成初期化。
  • 関数呼出時は型変換を行う。
  • extends 節で利用可能。継承意図のサブクラスは super 呼び出しで [[BooleanData]] 内部スロットを持つインスタンスを生成初期化する必要。

20.3.1.1 Boolean ( value )

呼び出し手順:

  1. bToBoolean(value) とする。
  2. NewTarget が undefined なら b を返す。
  3. O を ? OrdinaryCreateFromConstructor(NewTarget, "%Boolean.prototype%", « [[BooleanData]] »)。
  4. O.[[BooleanData]] = b
  5. O を返す。

20.3.2 Boolean コンストラクタのプロパティ

Boolean コンストラクタ:

20.3.2.1 Boolean.prototype

Boolean.prototype の初期値は Boolean プロトタイプオブジェクト

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.3.3 Boolean プロトタイプオブジェクトのプロパティ

Boolean プロトタイプオブジェクト:

  • %Boolean.prototype% である。
  • 通常オブジェクト
  • 自身が Boolean オブジェクトで [[BooleanData]] 内部スロット値 false
  • [[Prototype]] 内部スロット値は %Object.prototype%

20.3.3.1 Boolean.prototype.constructor

Boolean.prototype.constructor の初期値は %Boolean%

20.3.3.2 Boolean.prototype.toString ( )

呼び出し手順:

  1. b を ? ThisBooleanValue(this value) とする。
  2. btrue なら "true" それ以外 "false" を返す。

20.3.3.3 Boolean.prototype.valueOf ( )

呼び出し手順:

  1. ThisBooleanValue(this value) を返す。

20.3.3.3.1 ThisBooleanValue ( value )

The abstract operation ThisBooleanValue takes argument value (ECMAScript 言語値) and returns Boolean を含む通常完了または throw completion. It performs the following steps when called:

  1. value が Boolean なら返す。
  2. value が Object かつ [[BooleanData]] 内部スロットを持つなら
    1. b = value.[[BooleanData]]
    2. Assert: b は Boolean。
    3. b を返す。
  3. TypeError 例外。

20.3.4 Boolean インスタンスのプロパティ

Boolean インスタンスは Boolean プロトタイプオブジェクトを継承する通常オブジェクト[[BooleanData]] 内部スロットを持つ。これは当該 Boolean オブジェクトが表す値。

20.4 Symbol オブジェクト

20.4.1 Symbol コンストラクタ

Symbol コンストラクタ:

  • %Symbol% である。
  • グローバルオブジェクト"Symbol" プロパティ初期値。
  • 関数呼出で新しい Symbol 値を返す。
  • new 演算子と共に使うことを意図しない。
  • サブクラス化を意図しない。
  • extends 節に使用可能だが super 呼出しは例外を投げる。

20.4.1.1 Symbol ( [ description ] )

呼び出し手順:

  1. NewTarget が undefined でない場合、TypeError 例外を投げる。
  2. descriptionundefined の場合、descStringundefined とする。
  3. それ以外の場合、descString を ? ToString(description) とする。
  4. [[Description]]descString である新しい Symbol を返す。

20.4.2 Symbol コンストラクタのプロパティ

Symbol コンストラクタ:

20.4.2.1 Symbol.asyncIterator

Symbol.asyncIterator の初期値は well-known symbol %Symbol.asyncIterator% (Table 1)。

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.2.2 Symbol.for ( key )

呼び出し手順:

  1. stringKey を ? ToString(key) とする。
  2. GlobalSymbolRegistry List の各 e について
    1. e.[[Key]]stringKey なら e.[[Symbol]] を返す。
  3. Assert: 現時点で stringKey のエントリはない。
  4. newSymbol[[Description]]=stringKey の新しい Symbol とする。
  5. Record { [[Key]]: stringKey, [[Symbol]]: newSymbol } を GlobalSymbolRegistry List に追加。
  6. newSymbol を返す。

GlobalSymbolRegistry List は全レルム共有の追記専用リスト。ECMAScript コード評価前に空リストで初期化。要素は Table 61 の構造。

Table 61: GlobalSymbolRegistry Record Fields
Field Name Value Usage
[[Key]] a String シンボルをグローバル識別する文字列キー。
[[Symbol]] a Symbol どのレルムからも取得可能なシンボル。

20.4.2.3 Symbol.hasInstance

Symbol.hasInstance の初期値は well-known symbol %Symbol.hasInstance%

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.2.4 Symbol.isConcatSpreadable

Symbol.isConcatSpreadable の初期値は well-known symbol %Symbol.isConcatSpreadable%

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.2.5 Symbol.iterator

Symbol.iterator の初期値は well-known symbol %Symbol.iterator%

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.2.6 Symbol.keyFor ( sym )

呼び出し手順:

  1. sym が Symbol でなければ TypeError
  2. KeyForSymbol(sym) を返す。

20.4.2.7 Symbol.match

Symbol.match 初期値は %Symbol.match%

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.2.8 Symbol.matchAll

Symbol.matchAll 初期値は %Symbol.matchAll%

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.2.9 Symbol.prototype

Symbol.prototype の初期値は Symbol プロトタイプオブジェクト

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.2.10 Symbol.replace

Symbol.replace 初期値は %Symbol.replace%

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.2.11 Symbol.search

Symbol.search 初期値は %Symbol.search%

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.2.12 Symbol.species

Symbol.species 初期値は %Symbol.species%

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.2.13 Symbol.split

Symbol.split 初期値は %Symbol.split%

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.2.14 Symbol.toPrimitive

Symbol.toPrimitive 初期値は %Symbol.toPrimitive%

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.2.15 Symbol.toStringTag

Symbol.toStringTag 初期値は %Symbol.toStringTag%

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.2.16 Symbol.unscopables

Symbol.unscopables 初期値は %Symbol.unscopables%

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.4.3 Symbol プロトタイプオブジェクトのプロパティ

Symbol プロトタイプオブジェクト:

20.4.3.1 Symbol.prototype.constructor

Symbol.prototype.constructor 初期値は %Symbol%

20.4.3.2 get Symbol.prototype.description

Symbol.prototype.description は set アクセサ undefinedアクセサプロパティで get は次:

  1. s = this 値。
  2. sym = ? ThisSymbolValue(s)。
  3. sym.[[Description]] を返す。

20.4.3.3 Symbol.prototype.toString ( )

呼び出し手順:

  1. sym = ? ThisSymbolValue(this value)。
  2. SymbolDescriptiveString(sym) を返す。

20.4.3.3.1 SymbolDescriptiveString ( sym )

The abstract operation SymbolDescriptiveString takes argument sym (Symbol) and returns String. It performs the following steps when called:

  1. desc = sym.[[Description]]
  2. descundefined なら空文字列に。
  3. Assert: desc は String。
  4. "Symbol(" + desc + ")" を返す。

20.4.3.4 Symbol.prototype.valueOf ( )

呼び出し手順:

  1. ThisSymbolValue(this value) を返す。

20.4.3.4.1 ThisSymbolValue ( value )

The abstract operation ThisSymbolValue takes argument value (ECMAScript 言語値) and returns Symbol を含む通常完了または throw completion. It performs the following steps when called:

  1. value が Symbol なら返す。
  2. value が Object かつ [[SymbolData]] 内部スロットを持つなら
    1. s = value.[[SymbolData]]
    2. Assert: s は Symbol。
    3. s を返す。
  3. TypeError 例外。

20.4.3.5 Symbol.prototype [ %Symbol.toPrimitive% ] ( hint )

このメソッドは Symbol オブジェクトをプリミティブに変換する際に呼ばれる。

呼び出し手順:

  1. ThisSymbolValue(this value) を返す。
Note

引数は無視される。

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

"name" プロパティ値は "[Symbol.toPrimitive]"

20.4.3.6 Symbol.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティ初期値は "Symbol"

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

20.4.4 Symbol インスタンスのプロパティ

Symbol インスタンスは Symbol プロトタイプオブジェクトを継承する通常オブジェクト[[SymbolData]] 内部スロットを持ち、その値が表現する Symbol 値である。

20.4.5 Symbol 用抽象操作

20.4.5.1 KeyForSymbol ( sym )

The abstract operation KeyForSymbol takes argument sym (Symbol) and returns String または undefined. symGlobalSymbolRegistry List にあるなら登録時の文字列を返す。 It performs the following steps when called:

  1. GlobalSymbolRegistry List の各 e について
    1. SameValue(e.[[Symbol]], sym) が true なら e.[[Key]] を返す。
  2. Assert: sym のエントリは存在しない。
  3. undefined を返す。

20.5 Error オブジェクト

実行時エラー発生時に例外として投げられる。ユーザー定義例外クラスの基底にも利用可能。

実行時エラー検出時、20.5.5NativeError20.5.7 の AggregateError の新インスタンスが投げられる。

20.5.1 Error コンストラクタ

Error コンストラクタ:

  • %Error% である。
  • グローバルオブジェクト"Error" プロパティ初期値。
  • 関数呼出しでもコンストラクタと同様に新 Error オブジェクトを生成初期化(Error(…)new Error(…) と等価)。
  • extends 節で使用可。継承意図のサブクラスは [[ErrorData]] 内部スロット付きで初期化するため super 呼出しが必要。

20.5.1.1 Error ( message [ , options ] )

呼び出し手順:

  1. NewTarget が undefined なら newTarget = アクティブ関数オブジェクト; Else newTarget = NewTarget。
  2. O を ? OrdinaryCreateFromConstructor(newTarget, "%Error.prototype%", « [[ErrorData]] ») とする。
  3. messageundefined でなければ
    1. msg = ? ToString(message)。
    2. CreateNonEnumerableDataPropertyOrThrow(O, "message", msg)。
  4. InstallErrorCause(O, options)。
  5. O を返す。

20.5.2 Error コンストラクタのプロパティ

Error コンストラクタ:

20.5.2.1 Error.isError ( arg )

呼び出し手順:

  1. arg が Object でなければ false
  2. arg[[ErrorData]] 内部スロットを持たなければ false
  3. true を返す。

20.5.2.2 Error.prototype

Error.prototype 初期値は Error プロトタイプオブジェクト

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.5.3 Error プロトタイプオブジェクトのプロパティ

Error プロトタイプオブジェクト:

20.5.3.1 Error.prototype.constructor

Error.prototype.constructor 初期値は %Error%

20.5.3.2 Error.prototype.message

Error.prototype.message 初期値は空文字列。

20.5.3.3 Error.prototype.name

Error.prototype.name 初期値は "Error"

20.5.3.4 Error.prototype.toString ( )

呼び出し手順:

  1. O = this 値。
  2. O が Object でなければ TypeError
  3. name = ? Get(O, "name")。
  4. nameundefined なら "Error" に; それ以外は ? ToString(name)。
  5. msg = ? Get(O, "message")。
  6. msgundefined なら空文字列; Else ? ToString(msg)。
  7. name が空なら msg を返す。
  8. msg が空なら name を返す。
  9. name, 0x003A, 0x0020, msg の連結を返す。

20.5.4 Error インスタンスのプロパティ

Error インスタンスは Error プロトタイプオブジェクトを継承する通常オブジェクト[[ErrorData]] 内部スロット値 undefined。このスロットの唯一の用途は Object.prototype.toStringError.isError による識別。

20.5.5 本仕様で使用されるネイティブエラー型

以下の NativeError 又は AggregateError の新インスタンスがランタイムエラーで投げられる。全 NativeError20.5.6 の構造。

20.5.5.1 EvalError

EvalError コンストラクタ%EvalError%

現在仕様内で使用されない。互換性目的で残る。

20.5.5.2 RangeError

RangeError コンストラクタ%RangeError%

許容範囲外値を示す。

20.5.5.3 ReferenceError

ReferenceError コンストラクタ%ReferenceError%

不正な参照検出を示す。

20.5.5.4 SyntaxError

SyntaxError コンストラクタ%SyntaxError%

構文解析エラー発生を示す。

20.5.5.5 TypeError

TypeError コンストラクタ%TypeError%

他の NativeError が適切でない失敗原因を示す失敗時に使用。

20.5.5.6 URIError

URIError コンストラクタ%URIError%

グローバル URI 処理関数の不適切利用を示す。

20.5.6 NativeError オブジェクト構造

以下の各オブジェクトは記述に従う構造を持ち、コンストラクタ名とプロトタイプオブジェクトの "name" のみ異なる。

各エラーオブジェクトの定義内の NativeError 参照は該当エラー名に置換される。

20.5.6.1 NativeError コンストラクタ

NativeError コンストラクタ:

  • 関数呼出でコンストラクタ呼出と同等に新 NativeError オブジェクトを生成初期化(NativeError(…)new NativeError(…) と等価)。
  • extends 節で利用可。継承意図のサブクラスは [[ErrorData]] 付きインスタンス生成のため super 呼出しが必要。

20.5.6.1.1 NativeError ( message [ , options ] )

NativeError 関数は呼び出し時次を行う:

  1. NewTarget が undefined なら newTarget = アクティブ関数オブジェクト; Else newTarget = NewTarget。
  2. O を ? OrdinaryCreateFromConstructor(newTarget, "%NativeError.prototype%", « [[ErrorData]] »)。
  3. messageundefined でなければ
    1. msg = ? ToString(message)。
    2. CreateNonEnumerableDataPropertyOrThrow(O, "message", msg)。
  4. InstallErrorCause(O, options)。
  5. O を返す。

手順 2 の文字列は定義対象に応じ "%EvalError.prototype%", "%RangeError.prototype%", "%ReferenceError.prototype%", "%SyntaxError.prototype%", "%TypeError.prototype%", "%URIError.prototype%" のいずれか。

20.5.6.2 NativeError コンストラクタのプロパティ

NativeError コンストラクタ:

  • [[Prototype]] 内部スロット値は %Error%
  • "name" プロパティ値は "NativeError"
  • 以下のプロパティを持つ:

20.5.6.2.1 NativeError.prototype

NativeError.prototype 初期値は NativeError プロトタイプオブジェクト (20.5.6.3)。各コンストラクタは固有プロトタイプを持つ。

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.5.6.3 NativeError プロトタイプオブジェクトのプロパティ

NativeError プロトタイプオブジェクト:

20.5.6.3.1 NativeError.prototype.constructor

該当 NativeError コンストラクタのプロトタイプ "constructor" 初期値はそのコンストラクタ自身。

20.5.6.3.2 NativeError.prototype.message

"message" 初期値は空文字列。

20.5.6.3.3 NativeError.prototype.name

"name" 初期値はコンストラクタ名(NativeError の代わりに用いる名称)。

20.5.6.4 NativeError インスタンスのプロパティ

NativeError インスタンスは独自プロトタイプを継承する通常オブジェクト[[ErrorData]] 内部スロット値 undefined。用途は Object.prototype.toStringError.isError による識別。

20.5.7 AggregateError オブジェクト

20.5.7.1 AggregateError コンストラクタ

AggregateError コンストラクタ:

  • %AggregateError% である。
  • グローバルオブジェクト"AggregateError" プロパティ初期値。
  • 関数呼出しでも new と同等。
  • extends 節に使用可能。継承意図サブクラスは [[ErrorData]] 用に super 呼出しが必要。

20.5.7.1.1 AggregateError ( errors, message [ , options ] )

呼び出し手順:

  1. NewTarget が undefined なら newTarget = アクティブ関数; Else newTarget = NewTarget。
  2. O = ? OrdinaryCreateFromConstructor(newTarget, "%AggregateError.prototype%", « [[ErrorData]] »)。
  3. messageundefined でなければ
    1. msg = ? ToString(message)。
    2. CreateNonEnumerableDataPropertyOrThrow(O, "message", msg)。
  4. InstallErrorCause(O, options)。
  5. errorsList = ? IteratorToList(? GetIterator(errors, sync))。
  6. DefinePropertyOrThrow(O, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errorsList) })。
  7. O を返す。

20.5.7.2 AggregateError コンストラクタのプロパティ

AggregateError コンストラクタ:

  • [[Prototype]] 内部スロット値は %Error%
  • 以下のプロパティを持つ:

20.5.7.2.1 AggregateError.prototype

AggregateError.prototype 初期値は %AggregateError.prototype%

属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

20.5.7.3 AggregateError プロトタイプオブジェクトのプロパティ

AggregateError プロトタイプオブジェクト:

  • %AggregateError.prototype%
  • 通常オブジェクト
  • Error でも AggregateError インスタンスでもなく [[ErrorData]] を持たない。
  • [[Prototype]] 内部スロット値は %Error.prototype%

20.5.7.3.1 AggregateError.prototype.constructor

AggregateError.prototype.constructor 初期値は %AggregateError%

20.5.7.3.2 AggregateError.prototype.message

AggregateError.prototype.message 初期値は空文字列。

20.5.7.3.3 AggregateError.prototype.name

AggregateError.prototype.name 初期値は "AggregateError"

20.5.7.4 AggregateError インスタンスのプロパティ

AggregateError インスタンスは AggregateError プロトタイプを継承し [[ErrorData]] 内部スロット値 undefined。用途は Object.prototype.toStringError.isError での識別。

20.5.8 Error オブジェクト用抽象操作

20.5.8.1 InstallErrorCause ( O, options )

The abstract operation InstallErrorCause takes arguments O (Object) and options (ECMAScript 言語値) and returns unused を含む通常完了または throw completion. options"cause" プロパティがある場合 O"cause" プロパティを作成する。 It performs the following steps when called:

  1. options が Object かつ ? HasProperty(options, "cause") が true なら
    1. cause = ? Get(options, "cause")。
    2. CreateNonEnumerableDataPropertyOrThrow(O, "cause", cause)。
  2. unused を返す。

21 数値と日付 (Numbers and Dates)

21.1 Number オブジェクト

21.1.1 Number コンストラクタ

Number コンストラクタ:

  • %Number% である。
  • グローバルオブジェクト"Number" プロパティの初期値である。
  • コンストラクタとして呼び出されたとき新しい Number オブジェクトを生成し初期化する。
  • コンストラクタではなく関数として呼び出されたとき型変換を行う。
  • クラス定義の extends 節の値として使用できる。指定の Number 挙動を継承する意図を持つサブクラスコンストラクタは、[[NumberData]] 内部スロットを持つサブクラスインスタンスを生成および初期化するために Number コンストラクタへの super 呼び出しを含めなければならない。

21.1.1.1 Number ( value )

この関数は呼び出されたとき次の手順を実行する:

  1. value が存在するなら、
    1. prim を ? ToNumeric(value) とする。
    2. prim が BigInt なら n𝔽((prim)) とする。
    3. それ以外は nprim とする。
  2. それ以外なら、
    1. n+0𝔽 とする。
  3. NewTarget が undefined なら n を返す。
  4. O を ? OrdinaryCreateFromConstructor(NewTarget, "%Number.prototype%", « [[NumberData]] ») とする。
  5. O.[[NumberData]]n に設定する。
  6. O を返す。

21.1.2 Number コンストラクタのプロパティ

Number コンストラクタ:

  • %Function.prototype% を持つ [[Prototype]] 内部スロットを有する。
  • 以下のプロパティを持つ:

21.1.2.1 Number.EPSILON

Number.EPSILON の値は、1 と、Number 値として表現可能な 1 より大きい最小の値との差の大きさに相当する Number 値であり、これはおよそ 2.2204460492503130808472633361816 × 10-16 である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.1.2.2 Number.isFinite ( number )

この関数は呼び出されたとき次を実行する:

  1. number が Number でなければ false を返す。
  2. number有限でなければ false を返す。
  3. それ以外なら true を返す。

21.1.2.3 Number.isInteger ( number )

この関数は呼び出されたとき次を実行する:

  1. number整数の Number なら true を返す。
  2. false を返す。

21.1.2.4 Number.isNaN ( number )

この関数は呼び出されたとき次を実行する:

  1. number が Number でなければ false を返す。
  2. numberNaN なら true を返す。
  3. それ以外は false を返す。
Note

この関数は、引数を NaN かどうか判定する前に Number へ変換しない点で、グローバルの isNaN 関数 (19.2.3) と異なる。

21.1.2.5 Number.isSafeInteger ( number )

Note

整数 n は、その Number 値が他のいかなる整数の Number 値とも一致しない場合に限り「安全な整数 (safe integer)」である。

この関数は呼び出されたとき次を実行する:

  1. number整数の Number なら、
    1. abs((number)) ≤ 253 - 1 なら true を返す。
  2. false を返す。

21.1.2.6 Number.MAX_SAFE_INTEGER

Note

IEEE 754-2019 の精度制限に起因する丸め挙動のため、Number.MAX_SAFE_INTEGER より大きいすべての整数の Number 値は少なくとも 1 つ別の整数と共有される。そのような大きな整数安全 ではなく、Number 値として正確に表現できる保証も、互いに区別できる保証もない。例えば 90071992547409929007199254740993 はどちらも Number 値 9007199254740992𝔽 になる。

Number.MAX_SAFE_INTEGER の値は 9007199254740991𝔽 (𝔽(253 - 1)) である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.1.2.7 Number.MAX_VALUE

Number.MAX_VALUE の値は Number 型の正の有限値で最大のものであり、およそ 1.7976931348623157 × 10308 である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.1.2.8 Number.MIN_SAFE_INTEGER

Note

IEEE 754-2019 の精度制限に起因する丸め挙動のため、Number.MIN_SAFE_INTEGER より小さいすべての整数の Number 値は少なくとも 1 つ別の整数と共有される。そのような大きな(絶対値が大きい)整数安全 ではなく、Number 値として正確に表現・相互識別できる保証はない。例えば -9007199254740992-9007199254740993 はどちらも Number 値 -9007199254740992𝔽 になる。

Number.MIN_SAFE_INTEGER の値は -9007199254740991𝔽 (𝔽(-(253 - 1))) である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.1.2.9 Number.MIN_VALUE

Number.MIN_VALUE の値は Number 型の最小の正の値であり、およそ 5 × 10-324 である。

IEEE 754-2019 倍精度の 2 進表現において最小値は非正規化数である。実装が非正規化数をサポートしない場合、Number.MIN_VALUE の値はその実装で実際に表現可能な最小の非ゼロ正値でなければならない。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.1.2.10 Number.NaN

Number.NaN の値は NaN である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.1.2.11 Number.NEGATIVE_INFINITY

Number.NEGATIVE_INFINITY の値は -∞𝔽 である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.1.2.12 Number.parseFloat ( string )

"parseFloat" プロパティの初期値は %parseFloat% である。

21.1.2.13 Number.parseInt ( string, radix )

"parseInt" プロパティの初期値は %parseInt% である。

21.1.2.14 Number.POSITIVE_INFINITY

Number.POSITIVE_INFINITY の値は +∞𝔽 である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.1.2.15 Number.prototype

Number.prototype の初期値は Number プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.1.3 Number プロトタイプオブジェクトのプロパティ

Number プロトタイプオブジェクト:

  • %Number.prototype% である。
  • 通常オブジェクトである。
  • それ自体が Number オブジェクトであり、値 +0𝔽 を持つ [[NumberData]] 内部スロットを持つ。
  • %Object.prototype% を持つ [[Prototype]] 内部スロットを有する。

明示的に別段の記述がない限り、以下で定義される Number プロトタイプオブジェクトのメソッドはジェネリックではなく、それらに渡される this 値は Number 値か、Number 値で初期化された [[NumberData]] 内部スロットを持つオブジェクトでなければならない。

メソッド仕様内の語句 “this Number value” は、メソッド呼び出しの this 値を引数として抽象操作 ThisNumberValue を呼び出した結果を指す。

21.1.3.1 Number.prototype.constructor

Number.prototype.constructor の初期値は %Number% である。

21.1.3.2 Number.prototype.toExponential ( fractionDigits )

このメソッドは、この Number 値を 10 進指数表記で仮数部の小数点前 1 桁およびその後に fractionDigits 桁の仮数部桁を伴う形で表現した文字列を返す。fractionDigitsundefined の場合、Number を一意に特定するために必要な仮数桁数(常に指数表記)を含める(ToString と同様だが常に指数表記で出力される点が異なる)。

呼び出されたとき次を実行する:

  1. x を ? ThisNumberValue(this value) とする。
  2. f を ? ToIntegerOrInfinity(fractionDigits) とする。
  3. Assert: fractionDigitsundefined なら f は 0。
  4. x有限でなければ Number::toString(x, 10) を返す。
  5. f < 0 または f > 100 なら RangeError 例外。
  6. x(x) に設定。
  7. s を空文字列とする。
  8. x < 0 なら
    1. s"-" に設定。
    2. x を -x に設定。
  9. x = 0 なら
    1. mf + 1 個のコード単位 0x0030 (DIGIT ZERO) からなる文字列とする。
    2. e を 0 とする。
  10. それ以外
    1. fractionDigitsundefined でなければ
      1. 10fn < 10f + 1 かつ n × 10e - f - x がゼロに最も近くなるような整数 e, n をとる。複数あるなら n × 10e - f が大きい方。
    2. それ以外
      1. ff ≥ 0, 10ffn < 10ff + 1, 𝔽(n × 10e - ff) が 𝔽(x) に等しく、ff が最小となる整数 e, n, ff をとる。n の 10 進表記は ff + 1 桁で 0 で割り切れない(最下位桁は一意とは限らない)。
      2. fff に設定。
    3. mn の 10 進表記の桁(先頭 0 なし)からなる文字列とする。
  11. f ≠ 0 なら
    1. am の最初のコード単位。
    2. b を残りの f 個のコード単位。
    3. ma, ".", b の連結に設定。
  12. e = 0 なら
    1. c"+" とする。
    2. d"0" とする。
  13. それ以外
    1. e > 0 なら
      1. c"+" とする。
    2. それ以外
      1. Assert: e < 0。
      2. c"-" とする。
      3. e を -e に設定。
    3. de の 10 進表記(先頭 0 なし)からなる文字列とする。
  14. mm, "e", c, d の連結に設定。
  15. sm の連結を返す。
Note

上記規則より高精度な変換を提供する実装では、手順 10.b.i の代替指針として以下を推奨する:

  1. f ≥ 0, 10fn < 10f + 1, 𝔽(n × 10e - f) が 𝔽(x) に等しく、f が最小となる整数 e, n, f をとる。n の候補が複数ある場合、𝔽(n × 10e - f) が 𝔽(x) に最も近いものを選び、2 つあるなら偶数を選ぶ。

21.1.3.3 Number.prototype.toFixed ( fractionDigits )

Note 1

このメソッドは、この Number 値を 10 進固定小数点表記で小数点以下に fractionDigits 桁を含む文字列を返す。fractionDigitsundefined の場合 0 を仮定する。

呼び出されたとき次を実行する:

  1. x を ? ThisNumberValue(this value) とする。
  2. f を ? ToIntegerOrInfinity(fractionDigits) とする。
  3. Assert: fractionDigitsundefined なら f は 0。
  4. f有限でなければ RangeError
  5. f < 0 または f > 100 なら RangeError
  6. x有限でなければ Number::toString(x, 10) を返す。
  7. x(x) に設定。
  8. s を空文字列とする。
  9. x < 0 なら
    1. s"-" に設定。
    2. x を -x に設定。
  10. x ≥ 1021 なら
    1. m を ! ToString(𝔽(x)) とする。
  11. それ以外
    1. nn / 10f - x が 0 に最も近くなる整数とする(2 つあれば大きい方)。
    2. n = 0 なら m = "0"、そうでなければ mn の 10 進表記(先頭 0 なし)の桁列とする。
    3. f ≠ 0 なら
      1. km の長さとする。
      2. kf なら
        1. zf + 1 - k 個の 0x0030 からなる文字列とする。
        2. mz + m に設定。
        3. kf + 1 に設定。
      3. am の先頭 k - f 文字。
      4. b を残りの f 文字。
      5. ma, ".", b の連結に設定。
  12. s + m を返す。
Note 2

toFixed の出力は、ある値について toString より精密になる場合がある。toString は隣接する Number 値と区別するのに十分な有効桁のみを出力するためである。例:

(1000000000000000128).toString()"1000000000000000100" を返す一方、
(1000000000000000128).toFixed(0)"1000000000000000128" を返す。

21.1.3.4 Number.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 国際化 API を含む ECMAScript 実装は ECMA-402 仕様に従ってこのメソッドを実装しなければならない。ECMA-402 API を含まない実装では以下の仕様が用いられる:

このメソッドは、この Number 値をホスト環境の現在のロケール規約に従って書式化した文字列を生成する。このメソッドは実装定義であり、toString と同じものを返すことは許容されるが推奨はされない。

このメソッドのオプション引数の意味は ECMA-402 仕様で定義される; ECMA-402 をサポートしない実装はこれらの位置を他目的に使用してはならない。

21.1.3.5 Number.prototype.toPrecision ( precision )

このメソッドは、この Number 値を、仮数部の小数点前 1 桁および precision - 1 桁を小数点後に持つ 10 進指数表記、または precision 個の有効桁を持つ 10 進固定表記で表現した文字列を返す。precisionundefined の場合は代わりに ToString を呼び出す。

呼び出されたとき次を実行する:

  1. x を ? ThisNumberValue(this value) とする。
  2. precisionundefined なら ! ToString(x) を返す。
  3. p を ? ToIntegerOrInfinity(precision) とする。
  4. x有限でなければ Number::toString(x, 10) を返す。
  5. p < 1 または p > 100 なら RangeError
  6. x(x) に設定。
  7. s を空文字列とする。
  8. x < 0 なら
    1. s をコード単位 0x002D (HYPHEN-MINUS) に設定。
    2. x を -x に設定。
  9. x = 0 なら
    1. mp 個の 0x0030 (DIGIT ZERO) からなる文字列とする。
    2. e を 0 とする。
  10. それ以外
    1. 10p - 1n < 10p かつ n × 10e - p + 1 - x が 0 に最も近い整数 e, n をとる(複数あるなら積が大きい方)。
    2. mn の 10 進表記桁列(先頭 0 なし)とする。
    3. e < -6 または ep なら
      1. Assert: e ≠ 0。
      2. p ≠ 1 なら
        1. am の最初のコード単位。
        2. b を残りの p - 1 文字。
        3. ma, ".", b の連結に設定。
      3. e > 0 なら
        1. c をコード単位 0x002B (PLUS SIGN) とする。
      4. それ以外
        1. Assert: e < 0。
        2. c をコード単位 0x002D (HYPHEN-MINUS) とする。
        3. e を -e に設定。
      5. de の 10 進表記(先頭 0 なし)文字列とする。
      6. s, m, コード単位 0x0065 ('e'), c, d の連結を返す。
  11. e = p - 1 なら s + m を返す。
  12. e ≥ 0 なら
    1. m を 先頭 e + 1 文字, コード単位 0x002E (FULL STOP), 残り p - (e + 1) 文字 の連結に設定。
  13. それ以外
    1. m を コード単位 0x0030, コード単位 0x002E, -(e + 1) 個の 0x0030, 文字列 m の連結に設定。
  14. s + m を返す。

21.1.3.6 Number.prototype.toString ( [ radix ] )

Note

オプションの radix2𝔽 から 36𝔽 までの整数 Number 値であるべきである。radixundefined の場合 radix の値として 10𝔽 が用いられる。

このメソッドは呼び出されたとき次を実行する:

  1. x を ? ThisNumberValue(this value) とする。
  2. radixundefined なら radixMV = 10。
  3. それ以外は radixMV = ? ToIntegerOrInfinity(radix)。
  4. radixMV が 2 から 36 の範囲外なら RangeError
  5. Number::toString(x, radixMV) を返す。

このメソッドはジェネリックではなく、this 値が Number または Number オブジェクトでない場合 TypeError を投げる。したがって他種オブジェクトに転用できない。

このメソッドの "length" プロパティは 1𝔽 である。

21.1.3.7 Number.prototype.valueOf ( )

  1. ThisNumberValue(this value) を返す。

21.1.3.7.1 ThisNumberValue ( value )

The abstract operation ThisNumberValue takes argument value (ECMAScript 言語値) and returns Number を含む通常完了または throw completion. It performs the following steps when called:

  1. value が Number なら value を返す。
  2. value が Object で [[NumberData]] 内部スロットを持つなら
    1. nvalue.[[NumberData]] とする。
    2. Assert: n は Number。
    3. n を返す。
  3. TypeError 例外を投げる。

21.1.4 Number インスタンスのプロパティ

Number インスタンスは Number プロトタイプオブジェクトからプロパティを継承する通常オブジェクトである。Number インスタンスは [[NumberData]] 内部スロットも持つ。[[NumberData]] 内部スロットはこの Number オブジェクトが表す Number 値である。

21.2 BigInt オブジェクト

21.2.1 BigInt コンストラクタ

BigInt コンストラクタ:

  • %BigInt% である。
  • グローバルオブジェクト"BigInt" プロパティの初期値である。
  • コンストラクタではなく関数として呼び出されたとき型変換を行う。
  • new 演算子で使用することやサブクラス化することを意図しない。クラス定義の extends 節の値として使用することはできるが、BigInt コンストラクタへの super 呼び出しは例外を引き起こす。

21.2.1.1 BigInt ( value )

この関数は呼び出されたとき次の手順を実行する:

  1. NewTarget が undefined でなければ TypeError 例外を投げる。
  2. prim を ? ToPrimitive(value, number) とする。
  3. prim が Number なら ? NumberToBigInt(prim) を返す。
  4. それ以外なら ? ToBigInt(prim) を返す。

21.2.1.1.1 NumberToBigInt ( number )

The abstract operation NumberToBigInt takes argument number (a Number) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:

  1. number整数の Number でなければ RangeError 例外を投げる。
  2. ((number)) を返す。

21.2.2 BigInt コンストラクタのプロパティ

BigInt コンストラクタ:

  • [[Prototype]] 内部スロットの値が %Function.prototype% である。
  • 次のプロパティを持つ:

21.2.2.1 BigInt.asIntN ( bits, bigint )

この関数は呼び出されたとき次を実行する:

  1. bits を ? ToIndex(bits) に設定する。
  2. bigint を ? ToBigInt(bigint) に設定する。
  3. mod(bigint) modulo 2bits とする。
  4. もし mod ≥ 2bits - 1 なら (mod - 2bits) を返す; そうでなければ (mod) を返す。

21.2.2.2 BigInt.asUintN ( bits, bigint )

この関数は呼び出されたとき次を実行する:

  1. bits を ? ToIndex(bits) に設定する。
  2. bigint を ? ToBigInt(bigint) に設定する。
  3. ((bigint) modulo 2bits) を返す。

21.2.2.3 BigInt.prototype

BigInt.prototype の初期値は BigInt プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.2.3 BigInt プロトタイプオブジェクトのプロパティ

BigInt プロトタイプオブジェクト:

  • %BigInt.prototype% である。
  • 通常オブジェクトである。
  • BigInt オブジェクトではない([[BigIntData]] 内部スロットを持たない)。
  • [[Prototype]] 内部スロットの値は %Object.prototype% である。

メソッド仕様内の語句 “this BigInt value” は、そのメソッド呼び出しの this 値を引数として抽象操作 ThisBigIntValue を呼び出した結果を指す。

21.2.3.1 BigInt.prototype.constructor

BigInt.prototype.constructor の初期値は %BigInt% である。

21.2.3.2 BigInt.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 国際化 API を含む ECMAScript 実装は、このメソッドを ECMA-402 仕様に従って実装しなければならない。ECMA-402 API を含まない実装では以下の仕様が用いられる:

このメソッドは、この BigInt 値をホスト環境の現在のロケール規約に従って書式化した文字列値を生成する。実装定義であり、toString と同じものを返すことも許容されるが推奨されない。

このメソッドのオプション引数の意味は ECMA-402 仕様で定義される;ECMA-402 をサポートしない実装はこれらの位置を他用途に用いてはならない。

21.2.3.3 BigInt.prototype.toString ( [ radix ] )

Note

オプションの radix2𝔽 から 36𝔽 までの整数 Number 値であるべきである。radixundefined なら 10𝔽 が用いられる。

このメソッドは呼び出されたとき次を実行する:

  1. x を ? ThisBigIntValue(this value) とする。
  2. radixundefined なら radixMV を 10 とする。
  3. それ以外なら radixMV を ? ToIntegerOrInfinity(radix) とする。
  4. radixMV が 2 から 36 の包含区間にないなら RangeError 例外を投げる。
  5. BigInt::toString(x, radixMV) を返す。

このメソッドはジェネリックではなく、this 値が BigInt でも BigInt オブジェクトでもない場合 TypeError 例外を投げる。したがって他種類のオブジェクトへ移してメソッドとして使用できない。

21.2.3.4 BigInt.prototype.valueOf ( )

  1. ThisBigIntValue(this value) を返す。

21.2.3.4.1 ThisBigIntValue ( value )

The abstract operation ThisBigIntValue takes argument value (an ECMAScript language value) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:

  1. value が BigInt なら value を返す。
  2. value が Object で [[BigIntData]] 内部スロットを持つなら
    1. Assert: value.[[BigIntData]] は BigInt である。
    2. value.[[BigIntData]] を返す。
  3. TypeError 例外を投げる。

21.2.3.5 BigInt.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "BigInt" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

21.2.4 BigInt インスタンスのプロパティ

BigInt インスタンスは BigInt プロトタイプオブジェクトからプロパティを継承する通常オブジェクトである。BigInt インスタンスは [[BigIntData]] 内部スロットも持つ。[[BigIntData]] 内部スロットはその BigInt オブジェクトが表す BigInt 値である。

21.3 Math オブジェクト

Math オブジェクト:

Note

本仕様において語句 “the Number value for x” は 6.1.6.1 で定義される技術的意味を持つ。

21.3.1 Math オブジェクトの値プロパティ

21.3.1.1 Math.E

自然対数の底 e の Number 値(およそ 2.7182818284590452354)。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.3.1.2 Math.LN10

10 の自然対数の Number 値(およそ 2.302585092994046)。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.3.1.3 Math.LN2

2 の自然対数の Number 値(およそ 0.6931471805599453)。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.3.1.4 Math.LOG10E

自然対数の底 e の常用対数(底10)の Number 値(およそ 0.4342944819032518)。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

Note

Math.LOG10E の値はおよそ Math.LN10 の逆数である。

21.3.1.5 Math.LOG2E

自然対数の底 e の底2対数の Number 値(およそ 1.4426950408889634)。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

Note

Math.LOG2E の値はおよそ Math.LN2 の逆数である。

21.3.1.6 Math.PI

円周率 π(円の周長と直径の比)の Number 値(およそ 3.1415926535897932)。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.3.1.7 Math.SQRT1_2

1/2 の平方根の Number 値(およそ 0.7071067811865476)。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

Note

Math.SQRT1_2 の値はおよそ Math.SQRT2 の逆数である。

21.3.1.8 Math.SQRT2

2 の平方根の Number 値(およそ 1.4142135623730951)。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

21.3.1.9 Math [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "Math" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

21.3.2 Math オブジェクトの関数プロパティ

Note

acos, acosh, asin, asinh, atan, atanh, atan2, cbrt, cos, cosh, exp, expm1, hypot, log, log1p, log2, log10, pow, random, sin, sinh, tan, tanh の各関数の動作は、特定の境界的引数値に対する結果を要求する点を除きここでは厳密には規定されない。他の引数値に対しては、これらの関数は周知の数学関数の結果を近似することを意図するが、近似アルゴリズムの選択には一定の裁量が許される。目的は、実装者があるハードウェアプラットフォームにおいて C 言語プログラマが利用できる数学ライブラリを ECMAScript でも利用できるようにすることである。

アルゴリズム選択は実装に委ねられるが(規格では規定しない)、Sun Microsystems の自由配布数学ライブラリ fdlibmhttp://www.netlib.org/fdlibm)に含まれる IEEE 754-2019 演算用近似アルゴリズムを用いることが推奨される。

21.3.2.1 Math.abs ( x )

この関数は x の絶対値を返す。結果は x と同じ大きさで正の符号を持つ。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN なら NaN を返す。
  3. n-0𝔽 なら +0𝔽 を返す。
  4. n-∞𝔽 なら +∞𝔽 を返す。
  5. n < -0𝔽 なら -n を返す。
  6. n を返す。

21.3.2.2 Math.acos ( x )

この関数は x の逆余弦を返す。結果はラジアンで +0𝔽 から 𝔽(π) の包含区間内にある。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN または n > 1𝔽 または n < -1𝔽 なら NaN を返す。
  3. n1𝔽 なら +0𝔽 を返す。
  4. (n) の逆余弦を表す実装近似 Number 値を返す。

21.3.2.3 Math.acosh ( x )

この関数は x の逆双曲線余弦を返す。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN または +∞𝔽 なら n を返す。
  3. n1𝔽 なら +0𝔽 を返す。
  4. n < 1𝔽 なら NaN を返す。
  5. (n) の逆双曲線余弦を表す実装近似 Number 値を返す。

21.3.2.4 Math.asin ( x )

この関数は x の逆正弦を返す。結果はラジアンで 𝔽(-π / 2) から 𝔽(π / 2) の包含区間内。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN, +0𝔽, -0𝔽 のいずれかなら n を返す。
  3. n > 1𝔽 または n < -1𝔽 なら NaN を返す。
  4. (n) の逆正弦を表す実装近似 Number 値を返す。

21.3.2.5 Math.asinh ( x )

この関数は x の逆双曲線正弦を返す。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. n有限でないか、_n_+0𝔽 または -0𝔽 の場合 n を返す。
  3. (n) の逆双曲線正弦を表す実装近似 Number 値を返す。

21.3.2.6 Math.atan ( x )

この関数は x の逆正接を返す。結果はラジアンで 𝔽(-π / 2) から 𝔽(π / 2) の包含区間内。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN, +0𝔽, -0𝔽 のいずれかなら n を返す。
  3. n+∞𝔽 なら π / 2 を表す実装近似 Number 値を返す。
  4. n-∞𝔽 なら -π / 2 を表す実装近似 Number 値を返す。
  5. (n) の逆正接を表す実装近似 Number 値を返す。

21.3.2.7 Math.atanh ( x )

この関数は x の逆双曲線正接を返す。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN, +0𝔽, -0𝔽 のいずれかなら n を返す。
  3. n > 1𝔽 または n < -1𝔽 なら NaN を返す。
  4. n1𝔽 なら +∞𝔽 を返す。
  5. n-1𝔽 なら -∞𝔽 を返す。
  6. (n) の逆双曲線正接を表す実装近似 Number 値を返す。

21.3.2.8 Math.atan2 ( y, x )

この関数は引数 yx の商 y / x の逆正接を返し、yx の符号で象限を決定する。2 引数逆正接関数において第 1 引数名が y、第 2 引数名が x であるのは慣習的意図的仕様である。結果はラジアンで -π から +π の包含区間内。

呼び出されたとき次を実行する:

  1. ny を ? ToNumber(y) とする。
  2. nx を ? ToNumber(x) とする。
  3. nyNaNnxNaN なら NaN を返す。
  4. ny+∞𝔽 のとき
    1. nx+∞𝔽 なら π / 4 を表す実装近似 Number 値を返す。
    2. nx-∞𝔽 なら 3π / 4 を表す実装近似 Number 値を返す。
    3. π / 2 を表す実装近似 Number 値を返す。
  5. ny-∞𝔽 のとき
    1. nx+∞𝔽 なら -π / 4 を表す実装近似 Number 値を返す。
    2. nx-∞𝔽 なら -3π / 4 を表す実装近似 Number 値を返す。
    3. -π / 2 を表す実装近似 Number 値を返す。
  6. ny+0𝔽 のとき
    1. nx > +0𝔽 または nx+0𝔽 なら +0𝔽 を返す。
    2. π を表す実装近似 Number 値を返す。
  7. ny-0𝔽 のとき
    1. nx > +0𝔽 または nx+0𝔽 なら -0𝔽 を返す。
    2. -π を表す実装近似 Number 値を返す。
  8. Assert: ny有限+0𝔽 でも -0𝔽 でもない。
  9. ny > +0𝔽 のとき
    1. nx+∞𝔽 なら +0𝔽 を返す。
    2. nx-∞𝔽 なら π を表す実装近似 Number 値を返す。
    3. nx+0𝔽 または -0𝔽 なら π / 2 を表す実装近似 Number 値を返す。
  10. ny < -0𝔽 のとき
    1. nx+∞𝔽 なら -0𝔽 を返す。
    2. nx-∞𝔽 なら -π を表す実装近似 Number 値を返す。
    3. nx+0𝔽 または -0𝔽 なら -π / 2 を表す実装近似 Number 値を返す。
  11. Assert: nx有限+0𝔽 でも -0𝔽 でもない。
  12. rabs((ny) / (nx)) の逆正接とする。
  13. nx < -0𝔽 のとき
    1. ny > +0𝔽 なら r を π - r に設定。
    2. それ以外は r を -π + r に設定。
  14. それ以外 (nx-0𝔽) のとき
    1. ny < -0𝔽 なら r を -r に設定。
  15. r を表す実装近似 Number 値を返す。

21.3.2.9 Math.cbrt ( x )

この関数は x の立方根を返す。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. n有限でないか _n_+0𝔽 または -0𝔽 なら n を返す。
  3. (n) の立方根を表す実装近似 Number 値を返す。

21.3.2.10 Math.ceil ( x )

この関数は x 以上で最も小さい(-∞ に最も近い)整数 Number 値を返す。x が既に整数なら結果は x である。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. n有限でないか _n_+0𝔽 または -0𝔽 なら n を返す。
  3. n < -0𝔽 かつ n > -1𝔽 なら -0𝔽 を返す。
  4. n整数の Number なら n を返す。
  5. n 以上で最小の整数 Number 値(-∞ に最も近い)を返す。
Note

Math.ceil(x) の値は -Math.floor(-x) の値と同じである。

21.3.2.11 Math.clz32 ( x )

この関数は呼び出されたとき次を実行する:

  1. n を ? ToUint32(x) とする。
  2. pn の 32 ビット符号なし 2 進表現における先頭の 0 ビット数とする。
  3. 𝔽(p) を返す。
Note

n+0𝔽 または -0𝔽 の場合このメソッドは 32𝔽 を返す。n の 32 ビット表現の最上位ビットが 1 の場合、このメソッドは +0𝔽 を返す。

21.3.2.12 Math.cos ( x )

この関数は x の余弦を返す。引数はラジアン。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. n有限でないなら NaN を返す。
  3. n+0𝔽 または -0𝔽 なら 1𝔽 を返す。
  4. (n) の余弦を表す実装近似 Number 値を返す。

21.3.2.13 Math.cosh ( x )

この関数は x の双曲線余弦を返す。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN なら NaN を返す。
  3. n+∞𝔽 または -∞𝔽 なら +∞𝔽 を返す。
  4. n+0𝔽 または -0𝔽 なら 1𝔽 を返す。
  5. (n) の双曲線余弦を表す実装近似 Number 値を返す。
Note

Math.cosh(x) の値は (Math.exp(x) + Math.exp(-x)) / 2 と同じである。

21.3.2.14 Math.exp ( x )

この関数は x の指数関数(自然対数の底 ex 乗)を返す。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN または +∞𝔽 なら n を返す。
  3. n+0𝔽 または -0𝔽 なら 1𝔽 を返す。
  4. n-∞𝔽 なら +0𝔽 を返す。
  5. (n) の指数関数を表す実装近似 Number 値を返す。

21.3.2.15 Math.expm1 ( x )

この関数は x の指数関数から 1 を引いた結果を返す。x が 0 に近い場合でも精度を保つ方法で計算される。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN, +0𝔽, -0𝔽, +∞𝔽 のいずれかなら n を返す。
  3. n-∞𝔽 なら -1𝔽 を返す。
  4. exp(n) の指数関数とする。
  5. exp - 1 を表す実装近似 Number 値を返す。

21.3.2.16 Math.floor ( x )

この関数は x 以下で最大(+∞ に最も近い)の整数 Number 値を返す。x が既に整数なら結果は x

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. n有限でないか _n_+0𝔽 または -0𝔽 なら n を返す。
  3. n < 1𝔽 かつ n > +0𝔽 なら +0𝔽 を返す。
  4. n整数 Number なら n を返す。
  5. n 以下で最大の整数 Number 値(+∞ に最も近い)を返す。
Note

Math.floor(x) の値は -Math.ceil(-x) の値と同じである。

21.3.2.17 Math.fround ( x )

この関数は呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN なら NaN を返す。
  3. n+0𝔽, -0𝔽, +∞𝔽, -∞𝔽 のいずれかなら n を返す。
  4. n32n を丸めモード roundTiesToEven で IEEE 754-2019 binary32 形式に変換した結果とする。
  5. n64n32IEEE 754-2019 binary64 形式に変換した結果とする。
  6. n64 に対応する ECMAScript Number 値を返す。

21.3.2.18 Math.f16round ( x )

この関数は呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN なら NaN を返す。
  3. n+0𝔽, -0𝔽, +∞𝔽, -∞𝔽 のいずれかなら n を返す。
  4. n16n を丸めモード roundTiesToEven で IEEE 754-2019 binary16 形式に変換した結果とする。
  5. n64n16IEEE 754-2019 binary64 形式に変換した結果とする。
  6. n64 に対応する ECMAScript Number 値を返す。
Note

この操作は double-rounding の可能性があるため binary32 へ変換後 binary16 へ変換するのと同じではない。例として k = 1.00048828125000022204𝔽 では Math.f16round(k) は 1.0009765625𝔽 だが Math.f16round(Math.fround(k)) は 1𝔽 となる。

全てのプラットフォームが binary64 から binary16 へのネイティブ変換を提供するわけではない。MIT ライセンスの half ライブラリ等で可能である。別案として、まず roundTiesToEven で binary64 から binary32 に変換し、結果が誤った二重丸めを生む可能性があるか検査できる。該当する場合 binary32 値の仮数を roundTiesToOdd で初期変換した場合に得られる値に調整し、その調整値を binary16 に roundTiesToEven で変換することで正しい値を得られる。

21.3.2.19 Math.hypot ( ...args )

0 個以上の引数について、それらの二乗和の平方根を返す。

呼び出されたとき次を実行する:

  1. coerced を新しい空リストとする。
  2. args の各要素 arg について
    1. n を ? ToNumber(arg) とする。
    2. ncoerced に追加。
  3. coerced の各要素 number について
    1. number+∞𝔽 または -∞𝔽 なら +∞𝔽 を返す。
  4. onlyZerotrue とする。
  5. coerced の各要素 number について
    1. numberNaN なら NaN を返す。
    2. number+0𝔽 でも -0𝔽 でもなければ onlyZerofalse に設定。
  6. onlyZerotrue なら +0𝔽 を返す。
  7. coerced の要素の数学的値の二乗和の平方根を表す実装近似 Number 値を返す。

この関数の "length" プロパティは 2𝔽 である。

Note

複数引数で呼ばれる際のオーバーフローやアンダーフローによる精度損失を避けるよう配慮すべきである。

21.3.2.20 Math.imul ( x, y )

この関数は呼び出されたとき次を実行する:

  1. a(? ToUint32(x)) とする。
  2. b(? ToUint32(y)) とする。
  3. product を (a × b) modulo 232 とする。
  4. product ≥ 231 なら 𝔽(product - 232) を返す; そうでなければ 𝔽(product) を返す。

21.3.2.21 Math.log ( x )

この関数は x の自然対数を返す。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN または +∞𝔽 なら n を返す。
  3. n1𝔽 なら +0𝔽 を返す。
  4. n+0𝔽 または -0𝔽 なら -∞𝔽 を返す。
  5. n < -0𝔽 なら NaN を返す。
  6. (n) の自然対数を表す実装近似 Number 値を返す。

21.3.2.22 Math.log1p ( x )

この関数は 1 + x の自然対数を返す。x が 0 に近い場合も精度良く計算される。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN, +0𝔽, -0𝔽, +∞𝔽 のいずれかなら n を返す。
  3. n-1𝔽 なら -∞𝔽 を返す。
  4. n < -1𝔽 なら NaN を返す。
  5. 1 + (n) の自然対数を表す実装近似 Number 値を返す。

21.3.2.23 Math.log10 ( x )

この関数は x の常用対数(底 10)を返す。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN または +∞𝔽 なら n を返す。
  3. n1𝔽 なら +0𝔽 を返す。
  4. n+0𝔽 または -0𝔽 なら -∞𝔽 を返す。
  5. n < -0𝔽 なら NaN を返す。
  6. (n) の常用対数を表す実装近似 Number 値を返す。

21.3.2.24 Math.log2 ( x )

この関数は x の底 2 対数を返す。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN または +∞𝔽 なら n を返す。
  3. n1𝔽 なら +0𝔽 を返す。
  4. n+0𝔽 または -0𝔽 なら -∞𝔽 を返す。
  5. n < -0𝔽 なら NaN を返す。
  6. (n) の底 2 対数を表す実装近似 Number 値を返す。

21.3.2.25 Math.max ( ...args )

0 個以上の引数について、各引数に ToNumber を適用し最大の値を返す。

呼び出されたとき次を実行する:

  1. coerced を新しい空リストとする。
  2. args の各要素 arg について
    1. n を ? ToNumber(arg) とする。
    2. ncoerced に追加。
  3. highest-∞𝔽 とする。
  4. coerced の各要素 number について
    1. numberNaN なら NaN を返す。
    2. number+0𝔽 かつ highest-0𝔽 なら highest+0𝔽 に設定。
    3. number > highest なら highestnumber に設定。
  5. highest を返す。
Note

最大値判定の比較は IsLessThan アルゴリズムを用いるが、+0𝔽-0𝔽 より大きいと見なす点が異なる。

この関数の "length" プロパティは 2𝔽 である。

21.3.2.26 Math.min ( ...args )

0 個以上の引数について、各引数に ToNumber を適用し最小の値を返す。

呼び出されたとき次を実行する:

  1. coerced を新しい空リストとする。
  2. args の各要素 arg について
    1. n を ? ToNumber(arg) とする。
    2. ncoerced に追加。
  3. lowest+∞𝔽 とする。
  4. coerced の各要素 number について
    1. numberNaN なら NaN を返す。
    2. number-0𝔽 かつ lowest+0𝔽 なら lowest-0𝔽 に設定。
    3. number < lowest なら lowestnumber に設定。
  5. lowest を返す。
Note

最大値判定と同様、比較は IsLessThan に準じるが +0𝔽-0𝔽 より大きいと見なす。

この関数の "length" プロパティは 2𝔽 である。

21.3.2.27 Math.pow ( base, exponent )

この関数は呼び出されたとき次を実行する:

  1. base を ? ToNumber(base) に設定。
  2. exponent を ? ToNumber(exponent) に設定。
  3. Number::exponentiate(base, exponent) を返す。

21.3.2.28 Math.random ( )

この関数は符号正で +0𝔽 以上 1𝔽 未満の Number 値を、その範囲にほぼ一様な分布で(実装定義のアルゴリズムまたは戦略を用いて)ランダムまたは疑似ランダムに返す。

異なるレルムで生成された各 Math.random 関数は、連続呼び出しで異なる値列を生成しなければならない。

21.3.2.29 Math.round ( x )

この関数は x に最も近い整数の Number 値を返す。2 つの整数が同じ距離の場合 +∞ に近い方を返す。x が既に整数なら結果は x

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. n有限でないか n整数 Number なら n を返す。
  3. n < 0.5𝔽 かつ n > +0𝔽 なら +0𝔽 を返す。
  4. n < -0𝔽 かつ n-0.5𝔽 なら -0𝔽 を返す。
  5. n に最も近い整数 Number を返す(距離が同じ場合は +∞ に近い方)。
Note 1

Math.round(3.5) は 4 を返すが Math.round(-3.5) は -3 を返す。

Note 2

Math.round(x) の値は常に Math.floor(x + 0.5) の値と同じではない。x-0𝔽 または -0𝔽 より小さく -0.5𝔽 以上のとき Math.round(x)-0𝔽 を返すが Math.floor(x + 0.5)+0𝔽 を返す。また x + 0.5 の内部丸めにより差異が生じる場合がある。

21.3.2.30 Math.sign ( x )

この関数は x の符号(正/負/ゼロ)を返す。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN, +0𝔽, -0𝔽 のいずれかなら n を返す。
  3. n < -0𝔽 なら -1𝔽 を返す。
  4. 1𝔽 を返す。

21.3.2.31 Math.sin ( x )

この関数は x の正弦を返す。引数はラジアン。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN, +0𝔽, -0𝔽 のいずれかなら n を返す。
  3. n+∞𝔽 または -∞𝔽 なら NaN を返す。
  4. (n) の正弦を表す実装近似 Number 値を返す。

21.3.2.32 Math.sinh ( x )

この関数は x の双曲線正弦を返す。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. n有限でないか _n_+0𝔽 または -0𝔽 なら n を返す。
  3. (n) の双曲線正弦を表す実装近似 Number 値を返す。
Note

Math.sinh(x) の値は (Math.exp(x) - Math.exp(-x)) / 2 と同じである。

21.3.2.33 Math.sqrt ( x )

この関数は x の平方根を返す。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN, +0𝔽, -0𝔽, +∞𝔽 のいずれかなら n を返す。
  3. n < -0𝔽 なら NaN を返す。
  4. 𝔽((n) の平方根) を返す。

21.3.2.34 Math.sumPrecise ( items )

Number の iterable が与えられたとき、その各値を加算し合計を返す。任意の値が Number でなければ TypeError 例外を投げる。

呼び出されたとき次を実行する:

  1. RequireObjectCoercible(items) を実行。
  2. iteratorRecord を ? GetIterator(items, sync) とする。
  3. stateminus-zero とする。
  4. sum を 0 とする。
  5. count を 0 とする。
  6. nextnot-started とする。
  7. nextdone でない間繰り返す
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone でなければ
      1. count ≥ 253 - 1 なら
        1. 注: この段階に到達することは実用上想定されず、実装が「合理的なサイズ」の入力を仮定できるようにするためのみ存在する。
        2. errorThrowCompletion(新たに生成した RangeError オブジェクト) とする。
        3. IteratorClose(iteratorRecord, error) を返す。
      2. next が Number でなければ
        1. errorThrowCompletion(新たに生成した TypeError オブジェクト) とする。
        2. IteratorClose(iteratorRecord, error) を返す。
      3. nnext とする。
      4. statenot-a-number でないなら
        1. nNaN なら
          1. statenot-a-number に設定。
        2. Else if n+∞𝔽 なら
          1. stateminus-infinity なら statenot-a-number に設定。
          2. Else stateplus-infinity に設定。
        3. Else if n-∞𝔽 なら
          1. stateplus-infinity なら statenot-a-number に設定。
          2. Else stateminus-infinity に設定。
        4. Else if n-0𝔽 でなく、stateminus-zero または finite なら
          1. statefinite に設定。
          2. sumsum + (n) に設定。
      5. countcount + 1 に設定。
  8. statenot-a-number なら NaN を返す。
  9. stateplus-infinity なら +∞𝔽 を返す。
  10. stateminus-infinity なら -∞𝔽 を返す。
  11. stateminus-zero なら -0𝔽 を返す。
  12. 𝔽(sum) を返す。
Note

sum の値は任意精度演算なしに多様なアルゴリズムで計算可能である。例として Jonathan Richard Shewchuk による “Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates” の "Grow-Expansion" アルゴリズムがある。より新しい手法は "Fast exact summation using small and large superaccumulators" に示され、コードは https://gitlab.com/radfordneal/xsum で利用可能。

21.3.2.35 Math.tan ( x )

この関数は x の正接を返す。引数はラジアン。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN, +0𝔽, -0𝔽 のいずれかなら n を返す。
  3. n+∞𝔽 または -∞𝔽 なら NaN を返す。
  4. (n) の正接を表す実装近似 Number 値を返す。

21.3.2.36 Math.tanh ( x )

この関数は x の双曲線正接を返す。

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. nNaN, +0𝔽, -0𝔽 のいずれかなら n を返す。
  3. n+∞𝔽 なら 1𝔽 を返す。
  4. n-∞𝔽 なら -1𝔽 を返す。
  5. (n) の双曲線正接を表す実装近似 Number 値を返す。
Note

Math.tanh(x) の値は (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x)) と同じである。

21.3.2.37 Math.trunc ( x )

この関数は数 x の小数部分を取り除いた整数部分を返す。x が既に整数なら結果は x

呼び出されたとき次を実行する:

  1. n を ? ToNumber(x) とする。
  2. n有限でないか _n_+0𝔽 または -0𝔽 なら n を返す。
  3. n < 1𝔽 かつ n > +0𝔽 なら +0𝔽 を返す。
  4. n < -0𝔽 かつ n > -1𝔽 なら -0𝔽 を返す。
  5. +0𝔽 方向で n に最も近い整数 Number を返す。

21.4 Date オブジェクト

21.4.1 Date オブジェクトの概要と抽象操作の定義

以下の抽象操作は(21.4.1.1 で定義される)時間値に対して動作する。いずれの場合も、これらの関数への引数のいずれかが NaN であれば、結果は NaN になることに注意。

21.4.1.1 時間値と時間範囲

ECMAScript における時間計測は POSIX における時間計測に類似し、とくに先発グレゴリオ暦(proleptic Gregorian calendar)、1970 年 1 月 1 日 UTC の開始時刻(真夜中)を エポック として定義し、1 日を正確に 86,400 秒(各秒は 1000 ミリ秒)とする会計的扱いを共有する。

ECMAScript の 時間値 は Number であり、ミリ秒精度での時点を表す有限整数の Number か、特定の時点を表さない NaN のいずれかである。24 × 60 × 60 × 1000 = 86,400,000 の倍数(すなわちある整数 d について 86,400,000 × d)である時間値は、エポックから d 個の完全な UTC 日を経過した UTC 日の開始時点(d が負であればエポックより前)を表す。それ以外の有限時間値 t は、その値以下で最大のかつ前述の倍数である時間値 s を基準とし、同一の UTC 日内で s の後に (t - s) ミリ秒経過した時点を表す。

時間値は UTC のうるう秒を考慮しない—正のうるう秒内の瞬間を表す時間値は存在せず、負のうるう秒によって UTC タイムラインから除去された瞬間を表す時間値は存在する。それでもなお、時間値の定義は区分的に UTC と整合し、うるう秒境界のみ不連続で、それ以外では差はゼロである。

Number は -9,007,199,254,740,992 から 9,007,199,254,740,992 までのすべての整数を正確に表現できる(21.1.2.8 および 21.1.2.6)。時間値は -8,640,000,000,000,000 から 8,640,000,000,000,000 ミリ秒というやや小さい範囲をサポートする。これは 1970 年 1 月 1 日 UTC の真夜中を基準に正確に -100,000,000 日から 100,000,000 日の範囲を与える。

1970 年 1 月 1 日 UTC の開始時刻の正確な瞬間は時間値 +0𝔽 で表される。

Note

先発グレゴリオ暦においてうるう年は、4 で割り切れ、かつ 400 で割り切れるか 100 で割り切れない年である。

先発グレゴリオ暦の 400 年周期には 97 のうるう年が含まれる。これは平均 365.2425 日/年(31,556,952,000 ミリ秒)となる。したがって Number がミリ秒精度で正確に表現できる最大範囲は 1970 年を基準に概ね -285,426 年から 285,426 年である。本節で規定される時間値がサポートするより小さい範囲はおよそ -273,790 年から 273,790 年である。

21.4.1.2 時間関連の定数

これらの定数は以下の節のアルゴリズムで参照される。

HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
msPerSecond = 1000𝔽
msPerMinute = 60000𝔽 = msPerSecond × 𝔽(SecondsPerMinute)
msPerHour = 3600000𝔽 = msPerMinute × 𝔽(MinutesPerHour)
msPerDay = 86400000𝔽 = msPerHour × 𝔽(HoursPerDay)

21.4.1.3 Day ( t )

The abstract operation Day takes argument t (有限時間値) and returns 整数の Number. t が属する日の通し日数(day number)を返す。 It performs the following steps when called:

  1. 𝔽(floor((t / msPerDay))) を返す。

21.4.1.4 TimeWithinDay ( t )

The abstract operation TimeWithinDay takes argument t (有限時間値) and returns +0𝔽(含む)から msPerDay(含まない)までの整数の Number. t が属する日の開始からの経過ミリ秒数を返す。 It performs the following steps when called:

  1. 𝔽((t) modulo (msPerDay)) を返す。

21.4.1.5 DaysInYear ( y )

The abstract operation DaysInYear takes argument y (整数の Number) and returns 365𝔽 または 366𝔽. 年 y の日数を返す。うるう年は 366 日、それ以外は 365 日。 It performs the following steps when called:

  1. ry(y) とする。
  2. (ry modulo 400) = 0 なら 366𝔽 を返す。
  3. (ry modulo 100) = 0 なら 365𝔽 を返す。
  4. (ry modulo 4) = 0 なら 366𝔽 を返す。
  5. 365𝔽 を返す。

21.4.1.6 DayFromYear ( y )

The abstract operation DayFromYear takes argument y (整数の Number) and returns 整数の Number. 年 y の初日(1 月 1 日)の day number を返す。 It performs the following steps when called:

  1. ry(y) とする。
  2. 注: 以降の手順で numYears1, numYears4, numYears100, numYears400エポックから年 y の開始までに含まれる、それぞれ 1, 4, 100, 400 で割り切れる年数を表す。yエポックより前なら負の数。
  3. numYears1 を (ry - 1970) とする。
  4. numYears4floor((ry - 1969) / 4) とする。
  5. numYears100floor((ry - 1901) / 100) とする。
  6. numYears400floor((ry - 1601) / 400) とする。
  7. 𝔽(365 × numYears1 + numYears4 - numYears100 + numYears400) を返す。

21.4.1.7 TimeFromYear ( y )

The abstract operation TimeFromYear takes argument y (整数の Number) and returns 時間値. 年 y の開始の時間値を返す。 It performs the following steps when called:

  1. msPerDay × DayFromYear(y) を返す。

21.4.1.8 YearFromTime ( t )

The abstract operation YearFromTime takes argument t (有限時間値) and returns 整数の Number. t が属する年を返す。 It performs the following steps when called:

  1. TimeFromYear(y) ≤ t を満たす最大の整数 Number y(+∞ に最も近い)を返す。

21.4.1.9 DayWithinYear ( t )

The abstract operation DayWithinYear takes argument t (有限時間値) and returns +0𝔽 から 365𝔽 まで(両端含む)の整数の Number. It performs the following steps when called:

  1. Day(t) - DayFromYear(YearFromTime(t)) を返す。

21.4.1.10 InLeapYear ( t )

The abstract operation InLeapYear takes argument t (有限時間値) and returns +0𝔽 または 1𝔽. t がうるう年内なら 1𝔽、そうでなければ +0𝔽 を返す。 It performs the following steps when called:

  1. DaysInYear(YearFromTime(t)) が 366𝔽 なら 1𝔽 を返し、そうでなければ +0𝔽 を返す。

21.4.1.11 MonthFromTime ( t )

The abstract operation MonthFromTime takes argument t (有限時間値) and returns +0𝔽 から 11𝔽 まで(両端含む)の整数の Number. t が属する月を識別する Number を返す。+0𝔽 は 1 月、1𝔽 は 2 月、2𝔽 は 3 月、3𝔽 は 4 月、4𝔽 は 5 月、5𝔽 は 6 月、6𝔽 は 7 月、7𝔽 は 8 月、8𝔽 は 9 月、9𝔽 は 10 月、10𝔽 は 11 月、11𝔽 は 12 月を表す。MonthFromTime(+0𝔽) = +0𝔽 は 1970 年 1 月 1 日(木曜日)に対応する。 It performs the following steps when called:

  1. inLeapYearInLeapYear(t) とする。
  2. dayWithinYearDayWithinYear(t) とする。
  3. dayWithinYear < 31𝔽 なら +0𝔽 を返す。
  4. dayWithinYear < 59𝔽 + inLeapYear なら 1𝔽 を返す。
  5. dayWithinYear < 90𝔽 + inLeapYear なら 2𝔽 を返す。
  6. dayWithinYear < 120𝔽 + inLeapYear なら 3𝔽 を返す。
  7. dayWithinYear < 151𝔽 + inLeapYear なら 4𝔽 を返す。
  8. dayWithinYear < 181𝔽 + inLeapYear なら 5𝔽 を返す。
  9. dayWithinYear < 212𝔽 + inLeapYear なら 6𝔽 を返す。
  10. dayWithinYear < 243𝔽 + inLeapYear なら 7𝔽 を返す。
  11. dayWithinYear < 273𝔽 + inLeapYear なら 8𝔽 を返す。
  12. dayWithinYear < 304𝔽 + inLeapYear なら 9𝔽 を返す。
  13. dayWithinYear < 334𝔽 + inLeapYear なら 10𝔽 を返す。
  14. 事前条件: dayWithinYear < 365𝔽 + inLeapYear
  15. 11𝔽 を返す。

21.4.1.12 DateFromTime ( t )

The abstract operation DateFromTime takes argument t (有限時間値) and returns 1𝔽 から 31𝔽 まで(両端含む)の整数の Number. t が属する月の日(day of month)を返す。 It performs the following steps when called:

  1. inLeapYearInLeapYear(t) とする。
  2. dayWithinYearDayWithinYear(t) とする。
  3. monthMonthFromTime(t) とする。
  4. month+0𝔽 なら dayWithinYear + 1𝔽 を返す。
  5. month1𝔽 なら dayWithinYear - 30𝔽 を返す。
  6. month2𝔽 なら dayWithinYear - 58𝔽 - inLeapYear を返す。
  7. month3𝔽 なら dayWithinYear - 89𝔽 - inLeapYear を返す。
  8. month4𝔽 なら dayWithinYear - 119𝔽 - inLeapYear を返す。
  9. month5𝔽 なら dayWithinYear - 150𝔽 - inLeapYear を返す。
  10. month6𝔽 なら dayWithinYear - 180𝔽 - inLeapYear を返す。
  11. month7𝔽 なら dayWithinYear - 211𝔽 - inLeapYear を返す。
  12. month8𝔽 なら dayWithinYear - 242𝔽 - inLeapYear を返す。
  13. month9𝔽 なら dayWithinYear - 272𝔽 - inLeapYear を返す。
  14. month10𝔽 なら dayWithinYear - 303𝔽 - inLeapYear を返す。
  15. 事前条件: month11𝔽
  16. dayWithinYear - 333𝔽 - inLeapYear を返す。

21.4.1.13 WeekDay ( t )

The abstract operation WeekDay takes argument t (有限時間値) and returns +0𝔽 から 6𝔽 まで(両端含む)の整数の Number. t が属する曜日を識別する Number を返す。+0𝔽 は日曜日、1𝔽 は月曜日、2𝔽 は火曜日、3𝔽 は水曜日、4𝔽 は木曜日、5𝔽 は金曜日、6𝔽 は土曜日。WeekDay(+0𝔽) = 4𝔽 は 1970 年 1 月 1 日(木曜日)に対応する。 It performs the following steps when called:

  1. 𝔽((Day(t) + 4𝔽) modulo 7) を返す。

21.4.1.14 HourFromTime ( t )

The abstract operation HourFromTime takes argument t (有限時間値) and returns +0𝔽 から 23𝔽 まで(両端含む)の整数の Number. t が属する日の時(hour)を返す。 It performs the following steps when called:

  1. 𝔽(floor((t / msPerHour)) modulo HoursPerDay) を返す。

21.4.1.15 MinFromTime ( t )

The abstract operation MinFromTime takes argument t (有限時間値) and returns +0𝔽 から 59𝔽 まで(両端含む)の整数の Number. t が属する時間の分(minute)を返す。 It performs the following steps when called:

  1. 𝔽(floor((t / msPerMinute)) modulo MinutesPerHour) を返す。

21.4.1.16 SecFromTime ( t )

The abstract operation SecFromTime takes argument t (有限時間値) and returns +0𝔽 から 59𝔽 まで(両端含む)の整数の Number. t が属する分の秒(second)を返す。 It performs the following steps when called:

  1. 𝔽(floor((t / msPerSecond)) modulo SecondsPerMinute) を返す。

21.4.1.17 msFromTime ( t )

The abstract operation msFromTime takes argument t (有限時間値) and returns +0𝔽 から 999𝔽 まで(両端含む)の整数の Number. t が属する秒のミリ秒(millisecond)を返す。 It performs the following steps when called:

  1. 𝔽((t) modulo (msPerSecond)) を返す。

21.4.1.18 GetUTCEpochNanoseconds ( year, month, day, hour, minute, second, millisecond, microsecond, nanosecond )

The abstract operation GetUTCEpochNanoseconds takes arguments year (整数), month (1 から 12(両端含む)の整数), day (1 から 31(両端含む)の整数), hour (0 から 23(両端含む)の整数), minute (0 から 59(両端含む)の整数), second (0 から 59(両端含む)の整数), millisecond (0 から 999(両端含む)の整数), microsecond (0 から 999(両端含む)の整数), and nanosecond (0 から 999(両端含む)の整数) and returns BigInt. 返される値は、与えられた ISO 8601 暦日と UTC の壁時計時刻に対応する、エポックからのナノ秒数を表す。 It performs the following steps when called:

  1. dateMakeDay(𝔽(year), 𝔽(month - 1), 𝔽(day)) とする。
  2. timeMakeTime(𝔽(hour), 𝔽(minute), 𝔽(second), 𝔽(millisecond)) とする。
  3. msMakeDate(date, time) とする。
  4. 事前条件: ms整数の Number。
  5. ((ms) × 106 + microsecond × 103 + nanosecond) を返す。

21.4.1.19 タイムゾーン識別子

ECMAScript におけるタイムゾーンは タイムゾーン識別子 により表され、これは 0x0000 から 0x007F(両端含む)のコードユニットのみから構成される文字列である。 ECMAScript 実装がサポートするタイムゾーンは、AvailableNamedTimeZoneIdentifiers が返す Time Zone Identifier Record[[Identifier]] フィールドで表される 利用可能な名前付きタイムゾーン、または IsTimeZoneOffsetStringtrue を返す文字列で表される オフセットタイムゾーン のいずれかであり得る。

一次タイムゾーン識別子 は、ある利用可能な名前付きタイムゾーンの推奨識別子である。 非一次タイムゾーン識別子 は、一次タイムゾーン識別子ではない利用可能な名前付きタイムゾーンの識別子である。 利用可能な名前付きタイムゾーン識別子 は一次または非一次のいずれかである。 各利用可能な名前付きタイムゾーン識別子は厳密に 1 つの名前付きタイムゾーンに対応し、 各利用可能な名前付きタイムゾーンは厳密に 1 つの一次タイムゾーン識別子と 0 個以上の非一次タイムゾーン識別子に対応する。

ECMAScript 実装は識別子 "UTC" を持つ利用可能な名前付きタイムゾーンをサポートしなければならず、これは UTC タイムゾーンの一次タイムゾーン識別子でなければならない。 さらに実装は他の任意個数の利用可能な名前付きタイムゾーンをサポートしてもよい。

ECMA-402 Internationalization API 仕様で記述されるタイムゾーン要件に従う実装は タイムゾーン対応 (time zone aware) と呼ばれる。 タイムゾーン対応実装は IANA Time Zone Database の Zone 名および Link 名に対応する利用可能な名前付きタイムゾーンをサポートし、かつそれらのみをサポートしなければならない。 タイムゾーン対応実装では、一次タイムゾーン識別子は Zone 名であり、非一次タイムゾーン識別子は Link 名である(ただし ECMA-402 仕様で規定される AvailableNamedTimeZoneIdentifiers により特に上書きされる場合を除く)。 IANA Time Zone Database 全体をサポートしない実装であっても、タイムゾーンを表す識別子として IANA Time Zone Database の名前を用いることが推奨される。

21.4.1.20 GetNamedTimeZoneEpochNanoseconds ( timeZoneIdentifier, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond )

The implementation-defined abstract operation GetNamedTimeZoneEpochNanoseconds takes arguments timeZoneIdentifier (String), year (整数), month (1 から 12(両端含む)の整数), day (1 から 31(両端含む)の整数), hour (0 から 23(両端含む)の整数), minute (0 から 59(両端含む)の整数), second (0 から 59(両端含む)の整数), millisecond (0 から 999(両端含む)の整数), microsecond (0 から 999(両端含む)の整数), and nanosecond (0 から 999(両端含む)の整数) and returns BigInt の List. 返される List の各要素は、timeZoneIdentifier で識別される名前付きタイムゾーン内で、与えられた ISO 8601 暦日と壁時計時刻に対応する、エポックからのナノ秒数を表す。

入力が負のタイムゾーン遷移(例: 夏時間終了やルール変更によるオフセット減少)により複数回出現するローカル時刻を表す場合、返される List は複数要素を持ち、数値昇順で並ぶ。 入力が正のタイムゾーン遷移(例: 夏時間開始やルール変更によるオフセット増加)でスキップされるローカル時刻を表す場合、返される List は空となる。 それ以外の場合、返される List は 1 要素を持つ。

ローカルの政治的ルールをいかなるタイムゾーンについても含まない ECMAScript 実装で利用される GetNamedTimeZoneEpochNanoseconds のデフォルト実装は、呼び出されたとき次を行う:

  1. 事前条件: timeZoneIdentifier"UTC"
  2. epochNanosecondsGetUTCEpochNanoseconds(year, month, day, hour, minute, second, millisecond, microsecond, nanosecond) とする。
  3. « epochNanoseconds » を返す。
Note

タイムゾーン対応実装(および他のすべての実装にも推奨)は IANA Time Zone Database https://www.iana.org/time-zones/ のタイムゾーン情報を使用することが要求される。

2017 年 11 月 5 日の America/New_York における午前 1:30 は 2 回繰り返されるため、GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 11, 5, 1, 30, 0, 0, 0, 0) は長さ 2 の List を返し、最初の要素は 05:30 UTC(UTC-04:00 の米国東部夏時間の 01:30)を、第二の要素は 06:30 UTC(UTC-05:00 の米国東部標準時の 01:30)を表す。

2017 年 3 月 12 日の America/New_York における午前 2:30 は存在しないので、GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 3, 12, 2, 30, 0, 0, 0, 0) は空の List を返す。

21.4.1.21 GetNamedTimeZoneOffsetNanoseconds ( timeZoneIdentifier, epochNanoseconds )

The implementation-defined abstract operation GetNamedTimeZoneOffsetNanoseconds takes arguments timeZoneIdentifier (String) and epochNanoseconds (BigInt) and returns 整数.

返される整数は、timeZoneIdentifier で識別される名前付きタイムゾーンの、エポックからの epochNanoseconds が表す瞬間における UTC からのオフセット(いずれもナノ秒)を表す。

ローカルの政治的ルールをいかなるタイムゾーンについても含まない ECMAScript 実装で利用される GetNamedTimeZoneOffsetNanoseconds のデフォルト実装は、呼び出されたとき次を行う:

  1. 事前条件: timeZoneIdentifier"UTC"
  2. 0 を返す。
Note

タイムゾーンオフセット値は正または負になり得る。

21.4.1.22 タイムゾーン識別子レコード

タイムゾーン識別子レコード利用可能な名前付きタイムゾーン識別子とその対応する一次タイムゾーン識別子を記述するための Record である。

タイムゾーン識別子レコードは Table 62 に掲げるフィールドを持つ。

Table 62: タイムゾーン識別子レコードのフィールド
フィールド名 意味
[[Identifier]] String 実装がサポートする利用可能な名前付きタイムゾーン識別子
[[PrimaryIdentifier]] String [[Identifier]] が解決される一次タイムゾーン識別子
Note

[[Identifier]]一次タイムゾーン識別子である場合、[[Identifier]][[PrimaryIdentifier]] と等しい。

21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )

The implementation-defined abstract operation AvailableNamedTimeZoneIdentifiers takes no arguments and returns Time Zone Identifier RecordList. 戻り値はこの実装内のすべての利用可能な名前付きタイムゾーン識別子と、それぞれに対応する一次タイムゾーン識別子を記述する。 List は各 Time Zone Identifier Record[[Identifier]] フィールド順に並ぶ。

タイムゾーン対応実装(ECMA-402 Internationalization API を実装するすべての実装を含む)は AvailableNamedTimeZoneIdentifiers 抽象操作を ECMA-402 仕様に従って実装しなければならない。 タイムゾーン対応でない実装では、AvailableNamedTimeZoneIdentifiers は呼び出されたとき以下を行う:

  1. 実装がいかなるタイムゾーンについてもローカルの政治的ルールを含まないなら
    1. « Time Zone Identifier Record { [[Identifier]]: "UTC", [[PrimaryIdentifier]]: "UTC" } » を返す。
  2. identifiers を、重複しない利用可能な名前付きタイムゾーン識別子List辞書式コードユニット順にソート)とする。
  3. result を新しい空の List とする。
  4. identifiers の各要素 identifier について、
    1. primaryidentifier とする。
    2. identifier がこの実装における非一次タイムゾーン識別子でありかつ identifier"UTC" でないなら
      1. primaryidentifier に関連付けられた一次タイムゾーン識別子に設定する。
      2. 注: 実装は一次タイムゾーン識別子を得るために identifier を反復的に解決する必要があるかもしれない。
    3. record を Time Zone Identifier Record { [[Identifier]]: identifier, [[PrimaryIdentifier]]: primary } とする。
    4. recordresult に追加する。
  5. 事前条件: result[[Identifier]]"UTC"[[PrimaryIdentifier]]"UTC" である Time Zone Identifier Record r を含む。
  6. result を返す。

21.4.1.24 SystemTimeZoneIdentifier ( )

The implementation-defined abstract operation SystemTimeZoneIdentifier takes no arguments and returns String. ホスト環境の現在のタイムゾーンを表す文字列を返す。それは IsTimeZoneOffsetStringtrue を返す UTC オフセットを表す文字列、または一次タイムゾーン識別子のいずれかである。 It performs the following steps when called:

  1. 実装が UTC タイムゾーンのみをサポートするなら "UTC" を返す。
  2. systemTimeZoneStringホスト環境の現在のタイムゾーンを表す文字列(一次タイムゾーン識別子またはオフセットタイムゾーン識別子)とする。
  3. systemTimeZoneString を返す。
Note

Date オブジェクトのメソッドで一般的に提供される機能レベルを確実にするため、SystemTimeZoneIdentifier はホスト環境のタイムゾーン設定に対応する IANA タイムゾーン名(存在するなら)を返すことが推奨される。 GetNamedTimeZoneEpochNanosecondsGetNamedTimeZoneOffsetNanoseconds はそのタイムゾーンの標準時および夏時間のローカル政治的ルールを反映しなければならない(存在する場合)。

例えば、ホスト環境がユーザが US Eastern Time を選択したシステム上のブラウザである場合、SystemTimeZoneIdentifier は "America/New_York" を返す。

21.4.1.25 LocalTime ( t )

The abstract operation LocalTime takes argument t (有限時間値) and returns 整数の Number. t を UTC からローカル時刻に変換する。 t に有効な標準時と夏時間のローカル政治的ルールを、この節で規定される方法で用いて結果を決定するべきである。 It performs the following steps when called:

  1. systemTimeZoneIdentifierSystemTimeZoneIdentifier() とする。
  2. IsTimeZoneOffsetString(systemTimeZoneIdentifier) が true なら
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier) とする。
  3. そうでなければ、
    1. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, ((t) × 106)) とする。
  4. offsetMstruncate(offsetNs / 106) とする。
  5. t + 𝔽(offsetMs) を返す。
Note 1

実装内にローカル時刻 t の政治的ルールが利用可能でない場合、SystemTimeZoneIdentifier"UTC" を返し GetNamedTimeZoneOffsetNanoseconds が 0 を返すため、結果は t と同じになる。

Note 2

タイムゾーン対応実装(および他のすべての実装にも推奨)は IANA Time Zone Database https://www.iana.org/time-zones/ のタイムゾーン情報を使用することが要求される。

Note 3

負のタイムゾーン遷移で時刻が繰り返されるとき(例: 夏時間終了やオフセット減少)、2 つの異なる入力時間値 tUTC が同じローカル時刻 tlocal に変換される。

LocalTime(UTC(tlocal)) は常に tlocal と等しいとは限らない。同様に UTC(LocalTime(tUTC)) も常に tUTC と等しいとは限らない。

21.4.1.26 UTC ( t )

The abstract operation UTC takes argument t (Number) and returns 時間値. t をローカル時刻から UTC の時間値に変換する。 t に有効な標準時と夏時間のローカル政治的ルールを、この節で規定される方法で用いて結果を決定するべきである。 It performs the following steps when called:

  1. t有限でなければ NaN を返す。
  2. systemTimeZoneIdentifierSystemTimeZoneIdentifier() とする。
  3. IsTimeZoneOffsetString(systemTimeZoneIdentifier) が true なら
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier) とする。
  4. そうでなければ、
    1. possibleInstantsGetNamedTimeZoneEpochNanoseconds(systemTimeZoneIdentifier, (YearFromTime(t)), (MonthFromTime(t)) + 1, (DateFromTime(t)), (HourFromTime(t)), (MinFromTime(t)), (SecFromTime(t)), (msFromTime(t)), 0, 0) とする。
    2. 注: 以下の手順は t が負のタイムゾーン遷移(例: 夏時間終了やオフセット減少)で複数回繰り返されるローカル時刻、または正のタイムゾーン遷移(例: 夏時間開始やオフセット増加)でスキップされるローカル時刻を表すとき、t が遷移前のタイムゾーンオフセットを用いて解釈されることを保証する。
    3. possibleInstants が空でなければ
      1. disambiguatedInstantpossibleInstants[0] とする。
    4. そうでなければ、
      1. 注: t は正のタイムゾーン遷移(例: 夏時間開始やオフセット増加)でスキップされたローカル時刻を表す。
      2. possibleInstantsBeforeGetNamedTimeZoneEpochNanoseconds(systemTimeZoneIdentifier, (YearFromTime(tBefore)), (MonthFromTime(tBefore)) + 1, (DateFromTime(tBefore)), (HourFromTime(tBefore)), (MinFromTime(tBefore)), (SecFromTime(tBefore)), (msFromTime(tBefore)), 0, 0) とし、ここで tBeforepossibleInstantsBefore が空でない最大の整数 Number かつ t より小さいもの(すなわち遷移直前の最後のローカル時刻)である。
      3. disambiguatedInstantpossibleInstantsBefore の最後の要素とする。
    5. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, disambiguatedInstant) とする。
  5. offsetMstruncate(offsetNs / 106) とする。
  6. t - 𝔽(offsetMs) を返す。

入力 t は名目上時間値だが、任意の Number 値でよい。 アルゴリズムは t時間値範囲に制限してはならず、これにより時間値範囲の境界に対応する入力がローカル UTC オフセットに関わらずサポート可能となる。 例えば最大時間値は 8.64 × 1015"+275760-09-13T00:00:00Z" に対応する。 その瞬間にローカルタイムゾーンオフセットが UTC より 1 時間進んでいる環境では、より大きい入力 8.64 × 1015 + 3.6 × 106 で表され、"+275760-09-13T01:00:00+01:00" に対応する。

実装内にローカル時刻 t の政治的ルールが利用可能でない場合、SystemTimeZoneIdentifier"UTC" を返し GetNamedTimeZoneOffsetNanoseconds が 0 を返すため、結果は t と同じになる。

Note 1

タイムゾーン対応実装(および他のすべての実装にも推奨)は IANA Time Zone Database https://www.iana.org/time-zones/ のタイムゾーン情報を使用することが要求される。

2017 年 11 月 5 日の America/New_York の午前 1:30 は 2 回繰り返される(秋の戻し)が、UTC(TimeClip(MakeDate(MakeDay(2017, 10, 5), MakeTime(1, 30, 0, 0)))) では offsetMs の値は -4 × msPerHour となり、1:30 AM UTC-04 として解釈されなければならない。

2017 年 3 月 12 日の America/New_York の午前 2:30 は存在しないが、2:30 AM UTC-05(3:30 AM UTC-04 と同等)として解釈されなければならない。 UTC(TimeClip(MakeDate(MakeDay(2017, 2, 12), MakeTime(2, 30, 0, 0)))) において offsetMs の値は -5 × msPerHour である。

Note 2

UTC(LocalTime(tUTC)) は常に tUTC と等しいとは限らない。同様に LocalTime(UTC(tlocal)) も常に tlocal と等しいとは限らない。

21.4.1.27 MakeTime ( hour, min, sec, ms )

The abstract operation MakeTime takes arguments hour (Number), min (Number), sec (Number), and ms (Number) and returns Number. ミリ秒数を計算する。 It performs the following steps when called:

  1. hour有限でない、min有限でない、sec有限でない、または ms有限でないなら NaN を返す。
  2. h𝔽(! ToIntegerOrInfinity(hour)) とする。
  3. m𝔽(! ToIntegerOrInfinity(min)) とする。
  4. s𝔽(! ToIntegerOrInfinity(sec)) とする。
  5. milli𝔽(! ToIntegerOrInfinity(ms)) とする。
  6. ((h × msPerHour + m × msPerMinute) + s × msPerSecond) + milli を返す。
Note

MakeTime の算術は浮動小数点算術であり結合的でないため、演算は正しい順序で行われなければならない。

21.4.1.28 MakeDay ( year, month, date )

The abstract operation MakeDay takes arguments year (Number), month (Number), and date (Number) and returns Number. 日数を計算する。 It performs the following steps when called:

  1. year有限でない、month有限でない、または date有限でないなら NaN を返す。
  2. y𝔽(! ToIntegerOrInfinity(year)) とする。
  3. m𝔽(! ToIntegerOrInfinity(month)) とする。
  4. dt𝔽(! ToIntegerOrInfinity(date)) とする。
  5. ymy + 𝔽(floor((m) / 12)) とする。
  6. ym有限でなければ NaN を返す。
  7. mn𝔽((m) modulo 12) とする。
  8. YearFromTime(t) が ymMonthFromTime(t) が mnDateFromTime(t) が 1𝔽 である有限時間値 t を見つける。ただし(引数が範囲外であるなどにより)不可能なら NaN を返す。
  9. Day(t) + dt - 1𝔽 を返す。

21.4.1.29 MakeDate ( day, time )

The abstract operation MakeDate takes arguments day (Number) and time (Number) and returns Number. ミリ秒数を計算する。 It performs the following steps when called:

  1. day有限でないまたは time有限でないなら NaN を返す。
  2. tvday × msPerDay + time とする。
  3. tv有限でないなら NaN を返す。
  4. tv を返す。

21.4.1.30 MakeFullYear ( year )

The abstract operation MakeFullYear takes argument year (Number) and returns 整数の Number または NaN. year整数部分に関連付けられた完全な年(full year)を返す。0 から 99(両端含む)の値は 1900 年の開始からの年数として解釈する。先発グレゴリオ暦との整合のため、「full year」は年 0(紀元前 1 年)の開始からの完了した年の符号付き個数と定義される。 It performs the following steps when called:

  1. yearNaN なら NaN を返す。
  2. truncated を ! ToIntegerOrInfinity(year) とする。
  3. truncated が 0 から 99(両端含む)なら 1900𝔽 + 𝔽(truncated) を返す。
  4. 𝔽(truncated) を返す。

21.4.1.31 TimeClip ( time )

The abstract operation TimeClip takes argument time (Number) and returns Number. ミリ秒数を計算する。 It performs the following steps when called:

  1. time有限でなければ NaN を返す。
  2. abs((time)) > 8.64 × 1015 なら NaN を返す。
  3. 𝔽(! ToIntegerOrInfinity(time)) を返す。

21.4.1.32 日時文字列フォーマット

ECMAScript は ISO 8601 暦日の拡張形式を単純化した日時の文字列交換フォーマットを定義する。形式は次のとおり: YYYY-MM-DDTHH:mm:ss.sssZ

要素の意味は以下のとおり:

YYYY 0000 から 9999 までの 4 桁の 10 進数、または "+" または "-" に続く 6 桁の 10 進数による 拡張年 としての先発グレゴリオ暦の年。
- "-"(ハイフン)が文字列中に 2 回字義通りに現れる。
MM 01(1 月)から 12(12 月)までの 2 桁の 10 進数としての月。
DD 01 から 31 までの 2 桁の 10 進数としての月の日。
T 時刻要素の開始を示すために "T" が文字列中に字義通りに現れる。
HH 深夜から経過した完全な時数を 00 から 24 までの 2 桁の 10 進数で表したもの。
: ":"(コロン)が文字列中に 2 回字義通りに現れる。
mm 時の開始から経過した完全な分数を 00 から 59 までの 2 桁の 10 進数で表したもの。
ss 分の開始から経過した完全な秒数を 00 から 59 までの 2 桁の 10 進数で表したもの。
. "."(ドット)が文字列中に字義通りに現れる。
sss 秒の開始から経過した完全なミリ秒数を 3 桁の 10 進数で表したもの。
Z UTC オフセット表現。"Z"(UTC でオフセットなし)または "+" もしくは "-" に続く時刻表現 HH:mmタイムゾーンオフセット文字列形式 の部分集合で、UTC より進んでいる/遅れているローカル時刻を示す)

この形式には日付のみの形式も含まれる:

YYYY
YYYY-MM
YYYY-MM-DD
        

また、上記の日付のみの形式に続けて以下のいずれかの時刻形式(オプションの UTC オフセット表現付き)を直後に置いた “日時 (date-time)” 形式も含まれる:

THH:mm
THH:mm:ss
THH:mm:ss.sss
        

範囲外または不適合な要素を含む文字列はこの形式の有効なインスタンスではない。

Note 1

各日が深夜で始まり終わるため、2 つの深夜を区別するために 00:0024:00 の 2 つの表記が利用可能である。これは 1995-02-04T24:001995-02-05T00:00 の 2 つの表記が正確に同一の時点を指すことを意味する。この後者形式を「暦日終端」と解釈することは ISO 8601 と整合している(同仕様では時間間隔の記述に予約され、単一時点の表現には許容されないが)。

Note 2

CET や EST などの市民タイムゾーン略称を規定する国際標準は存在せず、同じ略称が別の非常に異なるタイムゾーンに使われることもある。このため ISO 8601 と本形式はいずれもタイムゾーンオフセットの数値表現を規定する。

21.4.1.32.1 拡張年 (Expanded Years)

1 January 1970(21.4.1.1)から約 273,790 年前後の時間値範囲全体をカバーするには 0 より前または 9999 より後の年を表現する必要がある。ISO 8601 は年表現の拡張を許容するが、情報交換の当事者間の合意が必要である。単純化された ECMAScript 形式では、そのような拡張年表現は 6 桁であり、常に + または - の符号を前置する。年 0 は正とみなされ + 符号を前置しなければならない。年 0 を -000000 と表すことは無効である。拡張年が時間値の範囲外の時点を表す 日時文字列形式 にマッチする文字列は Date.parse によって認識不能として扱われ、実装依存の挙動やヒューリスティクスにフォールバックせず NaN を返す。

Note

拡張年を用いた日時(time values)の例:

-271821-04-20T00:00:00Z 271822 B.C.
-000001-01-01T00:00:00Z 2 B.C.
+000000-01-01T00:00:00Z 1 B.C.
+000001-01-01T00:00:00Z 1 A.D.
+001970-01-01T00:00:00Z 1970 A.D.
+002009-12-15T00:00:00Z 2009 A.D.
+275760-09-13T00:00:00Z 275760 A.D.

21.4.1.33 タイムゾーンオフセット文字列形式

ECMAScript は ISO 8601 に由来する UTC オフセットの文字列交換形式を定義する。 形式は以下の文法で記述される。

構文

UTCOffset ::: ASCIISign Hour ASCIISign Hour HourSubcomponents[+Extended] ASCIISign Hour HourSubcomponents[~Extended] ASCIISign ::: one of + - Hour ::: 0 DecimalDigit 1 DecimalDigit 20 21 22 23 HourSubcomponents[Extended] ::: TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TemporalDecimalFractionopt TimeSeparator[Extended] ::: [+Extended] : [~Extended] [empty] MinuteSecond ::: 0 DecimalDigit 1 DecimalDigit 2 DecimalDigit 3 DecimalDigit 4 DecimalDigit 5 DecimalDigit TemporalDecimalFraction ::: TemporalDecimalSeparator DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator ::: one of . ,

21.4.1.33.1 IsTimeZoneOffsetString ( offsetString )

The abstract operation IsTimeZoneOffsetString takes argument offsetString (String) and returns Boolean. 戻り値は offsetStringUTCOffset の文法に適合するかどうかを示す。 It performs the following steps when called:

  1. parseResult を ParseText(offsetString, UTCOffset) とする。
  2. parseResult がエラーの List なら false を返す。
  3. true を返す。

21.4.1.33.2 ParseTimeZoneOffsetString ( offsetString )

The abstract operation ParseTimeZoneOffsetString takes argument offsetString (String) and returns 整数. 戻り値は offsetString に対応する UTC オフセット(ナノ秒数)である。 It performs the following steps when called:

  1. parseResult を ParseText(offsetString, UTCOffset) とする。
  2. 事前条件: parseResult はエラーの List ではない。
  3. 事前条件: parseResultASCIISign構文ノードを含む。
  4. parsedSignparseResult に含まれる ASCIISign 構文ノードがマッチしたソーステキストとする。
  5. parsedSign が単一コードポイント U+002D (HYPHEN-MINUS) なら
    1. sign を -1 とする。
  6. そうでなければ
    1. sign を 1 とする。
  7. 注: 以下の StringToNumber の適用は、各解析値が十分に短い 10 進数字列であることが保証されるため精度を失わない。
  8. 事前条件: parseResultHour 構文ノードを含む。
  9. parsedHoursparseResult に含まれる Hour 構文ノードがマッチしたソーステキストとする。
  10. hours(StringToNumber(CodePointsToString(parsedHours))) とする。
  11. parseResultMinuteSecond 構文ノードを含まないなら
    1. minutes を 0 とする。
  12. そうでなければ
    1. parsedMinutesparseResult に含まれる最初の MinuteSecond 構文ノードがマッチしたソーステキストとする。
    2. minutes(StringToNumber(CodePointsToString(parsedMinutes))) とする。
  13. parseResult が 2 つの MinuteSecond 構文ノードを含まないなら
    1. seconds を 0 とする。
  14. そうでなければ
    1. parsedSecondsparseResult に含まれる 2 番目の MinuteSecond 構文ノードがマッチしたソーステキストとする。
    2. seconds(StringToNumber(CodePointsToString(parsedSeconds))) とする。
  15. parseResultTemporalDecimalFraction 構文ノードを含まないなら
    1. nanoseconds を 0 とする。
  16. そうでなければ
    1. parsedFractionparseResult に含まれる TemporalDecimalFraction 構文ノードがマッチしたソーステキストとする。
    2. fraction を CodePointsToString(parsedFraction) と "000000000"文字列連結とする。
    3. nanosecondsStringfraction の先頭から 10 文字の部分文字列とする。
    4. nanoseconds(StringToNumber(nanosecondsString)) とする。
  17. sign × (((hours × 60 + minutes) × 60 + seconds) × 109 + nanoseconds) を返す。

21.4.2 Date コンストラクター

Date コンストラクター:

  • %Date% である。
  • グローバルオブジェクト"Date" プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しい Date を作成し初期化する。
  • コンストラクターではなく関数として呼び出された場合、現在の時刻(UTC)を表す文字列を返す。
  • 引数の数や型によって動作が異なる関数である。
  • クラス定義の extends 節の値として利用できる。指定された Date の動作を継承したいサブクラスのコンストラクターは、サブクラスインスタンスを [[DateValue]] 内部スロット付きで生成・初期化するために Date コンストラクターへの super 呼び出しを含める必要がある。

21.4.2.1 Date ( ...values )

この関数は呼び出されたとき、以下の手順を実行する:

  1. NewTarget が undefined なら
    1. now を現在時刻(UTC)を示す時刻値とする。
    2. ToDateString(now) を返す。
  2. numberOfArgsvalues の要素数とする。
  3. numberOfArgs = 0 の場合
    1. dv を現在時刻(UTC)を示す時刻値とする。
  4. numberOfArgs = 1 の場合
    1. valuevalues[0] とする。
    2. value がオブジェクトで [[DateValue]] 内部スロットを持つなら
      1. tvvalue.[[DateValue]] とする。
    3. それ以外の場合
      1. v を ? ToPrimitive(value) とする。
      2. v が文字列ならば
        1. アサート: 次のステップで突然の完了になることはない(v は文字列)。
        2. tvparse メソッド (21.4.3.2) と全く同じ方法で v を日付としてパースした結果とする。
      3. それ以外の場合
        1. tv を ? ToNumber(v) とする。
    4. dvTimeClip(tv) とする。
  5. それ以外の場合
    1. アサート: numberOfArgs ≥ 2。
    2. y を ? ToNumber(values[0]) とする。
    3. m を ? ToNumber(values[1]) とする。
    4. numberOfArgs > 2 なら dt を ? ToNumber(values[2]); そうでなければ dt1𝔽 とする。
    5. numberOfArgs > 3 なら h を ? ToNumber(values[3]); そうでなければ h+0𝔽 とする。
    6. numberOfArgs > 4 なら min を ? ToNumber(values[4]); そうでなければ min+0𝔽 とする。
    7. numberOfArgs > 5 なら s を ? ToNumber(values[5]); そうでなければ s+0𝔽 とする。
    8. numberOfArgs > 6 なら milli を ? ToNumber(values[6]); そうでなければ milli+0𝔽 とする。
    9. yrMakeFullYear(y) とする。
    10. finalDateMakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli)) とする。
    11. dvTimeClip(UTC(finalDate)) とする。
  6. O を ? OrdinaryCreateFromConstructor(NewTarget, "%Date.prototype%", « [[DateValue]] ») とする。
  7. O.[[DateValue]]dv を設定する。
  8. O を返す。

21.4.3 Date コンストラクターのプロパティ

Date コンストラクター:

  • [[Prototype]] 内部スロットの値は %Function.prototype% である。
  • "length" プロパティの値は 7𝔽 である。
  • 以下のプロパティを持つ:

21.4.3.1 Date.now ( )

この関数は、呼び出し時点の UTC 日付と時刻を示す時刻値を返す。

21.4.3.2 Date.parse ( string )

この関数は引数に ToString 演算子を適用する。ToString の結果が突然の完了となった場合、その完了レコードを直ちに返す。それ以外の場合、この関数は得られた文字列を日付と時刻として解釈し、その日付と時刻に対応する UTC 時刻値(数値)を返す。文字列は内容に応じてローカル時刻、UTC、その他のタイムゾーンとして解釈されることがある。関数はまず Date Time String Format (21.4.1.32) および拡張年の形式に従ってパースを試みる。文字列がその形式に合致しない場合、実装依存のヒューリスティックや日付形式にフォールバックすることがある。判別できない、または範囲外の値を含む文字列は NaN を返す。

文字列が Date Time String Format に適合する場合、代替値が欠落した書式要素の代わりに用いられる。MMDD 要素が欠落している場合は "01"HH, mm, ss 要素が欠落している場合は "00"sss 要素がない場合は "000"、UTC オフセット表現がない場合は日付のみの形式は UTC として、日付時刻形式はローカル時刻として解釈される。

ECMAScript の特定の実装において、任意の Date のミリ秒部分がゼロの場合、以下すべての式はその実装で同じ数値を生成するはずである(すべての参照プロパティが初期値ならば):

x.valueOf()
Date.parse(x.toString())
Date.parse(x.toUTCString())
Date.parse(x.toISOString())

ただし、次の式

Date.parse(x.toLocaleString())

は前の3つの式と同じ数値を生成することは要求されず、一般にこの関数が Date Time String Format (21.4.1.32) に適合せず、その実装で toStringtoUTCString メソッドによって生成できない任意の文字列を与えたときの値は実装依存である。

21.4.3.3 Date.prototype

Date.prototype の初期値は Date プロトタイプオブジェクトである。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

21.4.3.4 Date.UTC ( year [ , month [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] ] )

この関数は呼び出されたとき、以下の手順を実行する:

  1. y を ? ToNumber(year) とする。
  2. month が与えられていれば m を ? ToNumber(month) とし、なければ m+0𝔽 とする。
  3. date が与えられていれば dt を ? ToNumber(date) とし、なければ dt1𝔽 とする。
  4. hours が与えられていれば h を ? ToNumber(hours) とし、なければ h+0𝔽 とする。
  5. minutes が与えられていれば min を ? ToNumber(minutes) とし、なければ min+0𝔽 とする。
  6. seconds が与えられていれば s を ? ToNumber(seconds) とし、なければ s+0𝔽 とする。
  7. ms が与えられていれば milli を ? ToNumber(ms) とし、なければ milli+0𝔽 とする。
  8. yrMakeFullYear(y) とする。
  9. TimeClip(MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))) を返す。

この関数の "length" プロパティは 7𝔽 である。

Note

この関数は Date コンストラクターと2つの点で異なる。数値として時刻値を返し、引数をローカル時刻ではなく UTC として解釈する。

21.4.4 Date プロトタイプオブジェクトのプロパティ

Date プロトタイプオブジェクトは:

  • %Date.prototype% である。
  • それ自体が通常のオブジェクトである。
  • Date インスタンスではなく [[DateValue]] 内部スロットを持たない。
  • [[Prototype]] 内部スロットの値は %Object.prototype% である。

特別に定義されていない限り、以下で定義される Date プロトタイプオブジェクトのメソッドはジェネリックではなく、this に渡される値は初期化済みの [[DateValue]] 内部スロットを持つオブジェクトでなければならない。

21.4.4.1 Date.prototype.constructor

Date.prototype.constructor の初期値は %Date% である。

21.4.4.2 Date.prototype.getDate ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. DateFromTime(LocalTime(t)) を返す。

21.4.4.3 Date.prototype.getDay ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. WeekDay(LocalTime(t)) を返す。

21.4.4.4 Date.prototype.getFullYear ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. YearFromTime(LocalTime(t)) を返す。

21.4.4.5 Date.prototype.getHours ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. HourFromTime(LocalTime(t)) を返す。

21.4.4.6 Date.prototype.getMilliseconds ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. msFromTime(LocalTime(t)) を返す。

21.4.4.7 Date.prototype.getMinutes ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. MinFromTime(LocalTime(t)) を返す。

21.4.4.8 Date.prototype.getMonth ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. MonthFromTime(LocalTime(t)) を返す。

21.4.4.9 Date.prototype.getSeconds ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. SecFromTime(LocalTime(t)) を返す。

21.4.4.10 Date.prototype.getTime ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. dateObject.[[DateValue]] を返す。

21.4.4.11 Date.prototype.getTimezoneOffset ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. (t - LocalTime(t)) / msPerMinute を返す。

21.4.4.12 Date.prototype.getUTCDate ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. DateFromTime(t) を返す。

21.4.4.13 Date.prototype.getUTCDay ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. WeekDay(t) を返す。

21.4.4.14 Date.prototype.getUTCFullYear ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. YearFromTime(t) を返す。

21.4.4.15 Date.prototype.getUTCHours ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. HourFromTime(t) を返す。

21.4.4.16 Date.prototype.getUTCMilliseconds ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. msFromTime(t) を返す。

21.4.4.17 Date.prototype.getUTCMinutes ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. MinFromTime(t) を返す。

21.4.4.18 Date.prototype.getUTCMonth ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. MonthFromTime(t) を返す。

21.4.4.19 Date.prototype.getUTCSeconds ( )

このメソッドは呼び出されると、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら NaN を返す。
  5. SecFromTime(t) を返す。

21.4.4.20 Date.prototype.setDate ( date )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. dt を ? ToNumber(date) とする。
  5. tNaN なら、NaN を返す。
  6. tLocalTime(t) に設定する。
  7. newDateMakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t)) とする。
  8. uTimeClip(UTC(newDate)) とする。
  9. dateObject.[[DateValue]]u を設定する。
  10. u を返す。

21.4.4.21 Date.prototype.setFullYear ( year [ , month [ , date ] ] )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. y を ? ToNumber(year) とする。
  5. tNaN なら t+0𝔽 に設定し、そうでなければ LocalTime(t) に設定する。
  6. month が存在しない場合、mMonthFromTime(t) とし、そうでなければ ? ToNumber(month) とする。
  7. date が存在しない場合、dtDateFromTime(t) とし、そうでなければ ? ToNumber(date) とする。
  8. newDateMakeDate(MakeDay(y, m, dt), TimeWithinDay(t)) とする。
  9. uTimeClip(UTC(newDate)) とする。
  10. dateObject.[[DateValue]]u を設定する。
  11. u を返す。

このメソッドの "length" プロパティは 3𝔽 である。

Note

month が存在しない場合、このメソッドは getMonth() の値が指定されたかのように振る舞う。date が存在しない場合は getDate() の値が指定されたかのように振る舞う。

21.4.4.22 Date.prototype.setHours ( hour [ , min [ , sec [ , ms ] ] ] )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. h を ? ToNumber(hour) とする。
  5. min が存在するなら m を ? ToNumber(min) とする。
  6. sec が存在するなら s を ? ToNumber(sec) とする。
  7. ms が存在するなら milli を ? ToNumber(ms) とする。
  8. tNaN なら NaN を返す。
  9. tLocalTime(t) に設定する。
  10. min が存在しない場合、mMinFromTime(t) とする。
  11. sec が存在しない場合、sSecFromTime(t) とする。
  12. ms が存在しない場合、millimsFromTime(t) とする。
  13. dateMakeDate(Day(t), MakeTime(h, m, s, milli)) とする。
  14. uTimeClip(UTC(date)) とする。
  15. dateObject.[[DateValue]]u を設定する。
  16. u を返す。

このメソッドの "length" プロパティは 4𝔽 である。

Note

min が存在しない場合、このメソッドは getMinutes() の値が指定されたかのように振る舞う。sec が存在しない場合は getSeconds() の値が指定されたかのように振る舞う。ms が存在しない場合は getMilliseconds() の値が指定されたかのように振る舞う。

21.4.4.23 Date.prototype.setMilliseconds ( ms )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. ms を ? ToNumber(ms) に設定する。
  5. tNaN なら NaN を返す。
  6. tLocalTime(t) に設定する。
  7. timeMakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms) とする。
  8. uTimeClip(UTC(MakeDate(Day(t), time))) とする。
  9. dateObject.[[DateValue]]u を設定する。
  10. u を返す。

21.4.4.24 Date.prototype.setMinutes ( min [ , sec [ , ms ] ] )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. m を ? ToNumber(min) とする。
  5. sec が存在するなら s を ? ToNumber(sec) とする。
  6. ms が存在するなら milli を ? ToNumber(ms) とする。
  7. tNaN なら NaN を返す。
  8. tLocalTime(t) に設定する。
  9. sec が存在しない場合、sSecFromTime(t) とする。
  10. ms が存在しない場合、millimsFromTime(t) とする。
  11. dateMakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli)) とする。
  12. uTimeClip(UTC(date)) とする。
  13. dateObject.[[DateValue]]u を設定する。
  14. u を返す。

このメソッドの "length" プロパティは 3𝔽 である。

Note

sec が存在しない場合、このメソッドは getSeconds() の値が指定されたかのように振る舞う。ms が存在しない場合は getMilliseconds() の値が指定されたかのように振る舞う。

21.4.4.25 Date.prototype.setMonth ( month [ , date ] )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. m を ? ToNumber(month) とする。
  5. date が存在するなら dt を ? ToNumber(date) とする。
  6. tNaN なら NaN を返す。
  7. tLocalTime(t) に設定する。
  8. date が存在しない場合、dtDateFromTime(t) とする。
  9. newDateMakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t)) とする。
  10. uTimeClip(UTC(newDate)) とする。
  11. dateObject.[[DateValue]]u を設定する。
  12. u を返す。

このメソッドの "length" プロパティは 2𝔽 である。

Note

date が存在しない場合、このメソッドは getDate() の値が指定されたかのように振る舞う。

21.4.4.26 Date.prototype.setSeconds ( sec [ , ms ] )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. s を ? ToNumber(sec) とする。
  5. ms が存在するなら milli を ? ToNumber(ms) とする。
  6. tNaN なら NaN を返す。
  7. tLocalTime(t) に設定する。
  8. ms が存在しない場合、millimsFromTime(t) とする。
  9. dateMakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli)) とする。
  10. uTimeClip(UTC(date)) とする。
  11. dateObject.[[DateValue]]u を設定する。
  12. u を返す。

このメソッドの "length" プロパティは 2𝔽 である。

Note

ms が存在しない場合、このメソッドは getMilliseconds() の値が指定されたかのように振る舞う。

21.4.4.27 Date.prototype.setTime ( time )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. t を ? ToNumber(time) とする。
  4. vTimeClip(t) とする。
  5. dateObject.[[DateValue]]v を設定する。
  6. v を返す。

21.4.4.28 Date.prototype.setUTCDate ( date )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. dt を ? ToNumber(date) とする。
  5. tNaN なら NaN を返す。
  6. newDateMakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t)) とする。
  7. vTimeClip(newDate) とする。
  8. dateObject.[[DateValue]]v を設定する。
  9. v を返す。

21.4.4.29 Date.prototype.setUTCFullYear ( year [ , month [ , date ] ] )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN なら t+0𝔽 に設定する。
  5. y を ? ToNumber(year) とする。
  6. month が存在しない場合、mMonthFromTime(t) とし、そうでなければ ? ToNumber(month) とする。
  7. date が存在しない場合、dtDateFromTime(t) とし、そうでなければ ? ToNumber(date) とする。
  8. newDateMakeDate(MakeDay(y, m, dt), TimeWithinDay(t)) とする。
  9. vTimeClip(newDate) とする。
  10. dateObject.[[DateValue]]v を設定する。
  11. v を返す。

このメソッドの "length" プロパティは 3𝔽 である。

Note

month が存在しない場合、このメソッドは getUTCMonth() の値が指定されたかのように振る舞う。date が存在しない場合は getUTCDate() の値が指定されたかのように振る舞う。

21.4.4.30 Date.prototype.setUTCHours ( hour [ , min [ , sec [ , ms ] ] ] )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. h を ? ToNumber(hour) とする。
  5. min が存在するなら m を ? ToNumber(min) とする。
  6. sec が存在するなら s を ? ToNumber(sec) とする。
  7. ms が存在するなら milli を ? ToNumber(ms) とする。
  8. tNaN なら NaN を返す。
  9. min が存在しない場合、mMinFromTime(t) とする。
  10. sec が存在しない場合、sSecFromTime(t) とする。
  11. ms が存在しない場合、millimsFromTime(t) とする。
  12. dateMakeDate(Day(t), MakeTime(h, m, s, milli)) とする。
  13. vTimeClip(date) とする。
  14. dateObject.[[DateValue]]v を設定する。
  15. v を返す。

このメソッドの "length" プロパティは 4𝔽 である。

Note

min が存在しない場合、このメソッドは getUTCMinutes() の値が指定されたかのように振る舞う。sec が存在しない場合は getUTCSeconds() の値が指定されたかのように振る舞う。ms が存在しない場合は getUTCMilliseconds() の値が指定されたかのように振る舞う。

21.4.4.31 Date.prototype.setUTCMilliseconds ( ms )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. ms を ? ToNumber(ms) に設定する。
  5. tNaN なら NaN を返す。
  6. timeMakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms) とする。
  7. vTimeClip(MakeDate(Day(t), time)) とする。
  8. dateObject.[[DateValue]]v を設定する。
  9. v を返す。

21.4.4.32 Date.prototype.setUTCMinutes ( min [ , sec [ , ms ] ] )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. m を ? ToNumber(min) とする。
  5. sec が存在するなら s を ? ToNumber(sec) とする。
  6. ms が存在するなら milli を ? ToNumber(ms) とする。
  7. tNaN なら NaN を返す。
  8. sec が存在しない場合、sSecFromTime(t) とする。
  9. ms が存在しない場合、millimsFromTime(t) とする。
  10. dateMakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli)) とする。
  11. vTimeClip(date) とする。
  12. dateObject.[[DateValue]]v を設定する。
  13. v を返す。

このメソッドの "length" プロパティは 3𝔽 である。

Note

sec が存在しない場合、このメソッドは getUTCSeconds() の値が指定されたかのように振る舞う。ms が存在しない場合は getUTCMilliseconds() の値が指定されたかのように振る舞う。

21.4.4.33 Date.prototype.setUTCMonth ( month [ , date ] )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. m を ? ToNumber(month) とする。
  5. date が存在するなら dt を ? ToNumber(date) とする。
  6. tNaN なら NaN を返す。
  7. date が存在しない場合、dtDateFromTime(t) とする。
  8. newDateMakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t)) とする。
  9. vTimeClip(newDate) とする。
  10. dateObject.[[DateValue]]v を設定する。
  11. v を返す。

このメソッドの "length" プロパティは 2𝔽 である。

Note

date が存在しない場合、このメソッドは getUTCDate() の値が指定されたかのように振る舞う。

21.4.4.34 Date.prototype.setUTCSeconds ( sec [ , ms ] )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. s を ? ToNumber(sec) とする。
  5. ms が存在するなら milli を ? ToNumber(ms) とする。
  6. tNaN なら NaN を返す。
  7. ms が存在しない場合、millimsFromTime(t) とする。
  8. dateMakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli)) とする。
  9. vTimeClip(date) とする。
  10. dateObject.[[DateValue]]v を設定する。
  11. v を返す。

このメソッドの "length" プロパティは 2𝔽 である。

Note

ms が存在しない場合、このメソッドは getUTCMilliseconds() の値が指定されたかのように振る舞う。

21.4.4.35 Date.prototype.toDateString ( )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tvdateObject.[[DateValue]] とする。
  4. tvNaN なら "Invalid Date" を返す。
  5. tLocalTime(tv) とする。
  6. DateString(t) を返す。

21.4.4.36 Date.prototype.toISOString ( )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tvdateObject.[[DateValue]] とする。
  4. tvNaN なら RangeError 例外をスローする。
  5. アサート: tv整数値である。
  6. tvDate Time String Format で表現できない年に該当するなら RangeError 例外をスローする。
  7. tvDate Time String Format に従ったUTC時刻表現(全ての書式要素およびUTCオフセット "Z" を含む)を返す。

21.4.4.37 Date.prototype.toJSON ( key )

このメソッドは JSON.stringify (25.5.2) で利用するための Date の文字列表現を提供する。

呼び出されると以下の手順を実行する:

  1. O を ? ToObject(this の値) とする。
  2. tv を ? ToPrimitive(O, number) とする。
  3. tv が数値かつ有限でなければ null を返す。
  4. ? Invoke(O, "toISOString") を返す。
Note 1

この引数は無視される。

Note 2

このメソッドは意図的にジェネリックであり、this の値が Date であることを要求しない。そのため他のオブジェクトに転送してメソッドとして利用できる。ただしその場合、toISOString メソッドが必要である。

21.4.4.38 Date.prototype.toLocaleDateString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 Internationalization API を含む ECMAScript 実装はこのメソッドを ECMA-402 仕様に従って実装しなければならない。ECMA-402 API を含まない実装の場合、以下の仕様が用いられる:

このメソッドは文字列値を返す。その内容は実装定義だが、現在のタイムゾーンにおける Date の「日付」部分をホスト環境の現在のロケールの慣習に従った便利で人間に読みやすい形で表現することを意図している。

このメソッドのオプションパラメータの意味は ECMA-402 仕様で定義されている。ECMA-402 を含まない実装ではこれらのパラメータ位置を他の用途に使ってはならない。

21.4.4.39 Date.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 Internationalization API を含む ECMAScript 実装はこのメソッドを ECMA-402 仕様に従って実装しなければならない。ECMA-402 API を含まない実装の場合、以下の仕様が用いられる:

このメソッドは文字列値を返す。その内容は実装定義だが、現在のタイムゾーンにおける Date をホスト環境の現在のロケールの慣習に従った便利で人間に読みやすい形で表現することを意図している。

このメソッドのオプションパラメータの意味は ECMA-402 仕様で定義されている。ECMA-402 を含まない実装ではこれらのパラメータ位置を他の用途に使ってはならない。

21.4.4.40 Date.prototype.toLocaleTimeString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 Internationalization API を含む ECMAScript 実装はこのメソッドを ECMA-402 仕様に従って実装しなければならない。ECMA-402 API を含まない実装の場合、以下の仕様が用いられる:

このメソッドは文字列値を返す。その内容は実装定義だが、現在のタイムゾーンにおける Date の「時刻」部分をホスト環境の現在のロケールの慣習に従った便利で人間に読みやすい形で表現することを意図している。

このメソッドのオプションパラメータの意味は ECMA-402 仕様で定義されている。ECMA-402 を含まない実装ではこれらのパラメータ位置を他の用途に使ってはならない。

21.4.4.41 Date.prototype.toString ( )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tvdateObject.[[DateValue]] とする。
  4. ToDateString(tv) を返す。
Note 1

d.[[DateValue]] が 1000 で割り切れる任意の Date d について、Date.parse(d.toString()) の結果は d.valueOf() と等しい。21.4.3.2 を参照。

Note 2

このメソッドはジェネリックではなく、this の値が Date でない場合は TypeError 例外をスローする。そのため他のオブジェクトに転送してメソッドとして利用することはできない。

21.4.4.41.1 TimeString ( tv )

The abstract operation TimeString takes argument tv (a Number, but not NaN) and returns a String. It performs the following steps when called:

  1. hourToZeroPaddedDecimalString((HourFromTime(tv)), 2) とする。
  2. minuteToZeroPaddedDecimalString((MinFromTime(tv)), 2) とする。
  3. secondToZeroPaddedDecimalString((SecFromTime(tv)), 2) とする。
  4. hour, ":", minute, ":", second, コードユニット 0x0020 (スペース), "GMT" を連結した文字列を返す。

21.4.4.41.2 DateString ( tv )

The abstract operation DateString takes argument tv (a Number, but not NaN) and returns a String. It performs the following steps when called:

  1. weekdayTable 63WeekDay(tv) の番号に対応する名前とする。
  2. monthTable 64MonthFromTime(tv) の番号に対応する名前とする。
  3. dayToZeroPaddedDecimalString((DateFromTime(tv)), 2) とする。
  4. yvYearFromTime(tv) とする。
  5. yv+0𝔽 または yv > +0𝔽 なら yearSign を空文字列に、そうでなければ "-" にする。
  6. paddedYearToZeroPaddedDecimalString(abs((yv)), 4) とする。
  7. weekday, コードユニット 0x0020 (スペース), month, コードユニット 0x0020 (スペース), day, コードユニット 0x0020 (スペース), yearSign, paddedYear を連結した文字列を返す。
Table 63: 曜日名
Number Name
+0𝔽 "Sun"
1𝔽 "Mon"
2𝔽 "Tue"
3𝔽 "Wed"
4𝔽 "Thu"
5𝔽 "Fri"
6𝔽 "Sat"
Table 64: 月名
Number Name
+0𝔽 "Jan"
1𝔽 "Feb"
2𝔽 "Mar"
3𝔽 "Apr"
4𝔽 "May"
5𝔽 "Jun"
6𝔽 "Jul"
7𝔽 "Aug"
8𝔽 "Sep"
9𝔽 "Oct"
10𝔽 "Nov"
11𝔽 "Dec"

21.4.4.41.3 TimeZoneString ( tv )

The abstract operation TimeZoneString takes argument tv (an integral Number) and returns a String. It performs the following steps when called:

  1. systemTimeZoneIdentifierSystemTimeZoneIdentifier() とする。
  2. IsTimeZoneOffsetString(systemTimeZoneIdentifier) が true なら
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier) とする。
  3. それ以外の場合
    1. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, ((tv) × 106)) とする。
  4. offset𝔽(truncate(offsetNs / 106)) とする。
  5. offset+0𝔽 または offset > +0𝔽 なら
    1. offsetSign"+" とする。
    2. absOffsetoffset とする。
  6. それ以外の場合
    1. offsetSign"-" とする。
    2. absOffset を -offset とする。
  7. offsetMinToZeroPaddedDecimalString((MinFromTime(absOffset)), 2) とする。
  8. offsetHourToZeroPaddedDecimalString((HourFromTime(absOffset)), 2) とする。
  9. tzName を空文字列またはコードユニット 0x0020 (スペース)、0x0028 (左括弧)、実装定義のタイムゾーン名、0x0029 (右括弧) を連結した文字列のいずれかとする。
  10. offsetSign, offsetHour, offsetMin, tzName を連結した文字列を返す。

21.4.4.41.4 ToDateString ( tv )

The abstract operation ToDateString takes argument tv (an integral Number or NaN) and returns a String. It performs the following steps when called:

  1. tvNaN なら "Invalid Date" を返す。
  2. tLocalTime(tv) とする。
  3. DateString(t)、コードユニット 0x0020 (スペース)、TimeString(t)、TimeZoneString(tv) を連結した文字列を返す。

21.4.4.42 Date.prototype.toTimeString ( )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tvdateObject.[[DateValue]] とする。
  4. tvNaN なら "Invalid Date" を返す。
  5. tLocalTime(tv) とする。
  6. TimeString(t) と TimeZoneString(tv) を連結した文字列を返す。

21.4.4.43 Date.prototype.toUTCString ( )

このメソッドは this 値に対応する時点を表す文字列値を返す。文字列の形式は RFC 7231 の "HTTP-date" をベースとし、ECMAScript Dates でサポートされる全範囲の時刻を一般化している。

呼び出されると以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tvdateObject.[[DateValue]] とする。
  4. tvNaN なら "Invalid Date" を返す。
  5. weekdayTable 63WeekDay(tv) の番号に対応する名前とする。
  6. monthTable 64MonthFromTime(tv) の番号に対応する名前とする。
  7. dayToZeroPaddedDecimalString((DateFromTime(tv)), 2) とする。
  8. yvYearFromTime(tv) とする。
  9. yv+0𝔽 または yv > +0𝔽 なら yearSign を空文字列に、そうでなければ "-" にする。
  10. paddedYearToZeroPaddedDecimalString(abs((yv)), 4) とする。
  11. weekday, ",", コードユニット 0x0020 (スペース), day, コードユニット 0x0020 (スペース), month, コードユニット 0x0020 (スペース), yearSign, paddedYear, コードユニット 0x0020 (スペース), TimeString(tv) を連結した文字列を返す。

21.4.4.44 Date.prototype.valueOf ( )

このメソッドは呼び出された時、以下の手順を実行する:

  1. dateObjectthis の値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. dateObject.[[DateValue]] を返す。

21.4.4.45 Date.prototype [ %Symbol.toPrimitive% ] ( hint )

このメソッドは ECMAScript の演算子によって Date をプリミティブ値へ変換するために呼び出される。hint の許可される値は "default""number""string" である。Date は組み込み ECMAScript オブジェクトの中で唯一 "default""string" と同等に扱う。他の組み込みオブジェクトは "default""number" と同等に扱う。

呼び出されると以下の手順を実行する:

  1. Othis の値とする。
  2. O がオブジェクトでなければ TypeError 例外をスローする。
  3. hint"string" または "default" なら
    1. tryFirststring とする。
  4. それ以外で hint"number" なら
    1. tryFirstnumber とする。
  5. それ以外の場合
    1. TypeError 例外をスローする。
  6. OrdinaryToPrimitive(O, tryFirst) を返す。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

このメソッドの "name" プロパティの値は "[Symbol.toPrimitive]" である。

21.4.5 Date インスタンスのプロパティ

Date インスタンスは Date プロトタイプオブジェクトからプロパティを継承する通常のオブジェクトである。Date インスタンスは [[DateValue]] 内部スロットも持ち、[[DateValue]] 内部スロットはこの Date が表す時刻値である。

22 テキスト処理

22.1 String オブジェクト

22.1.1 String コンストラクター

String コンストラクター:

  • %String% である。
  • グローバルオブジェクト"String" プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しい String オブジェクトを生成し初期化する。
  • コンストラクターではなく関数として呼び出されたとき、型変換を行う。
  • クラス定義の extends 句の値として利用できる。指定された String の挙動を継承したいサブクラスのコンストラクターは、サブクラスインスタンスを [[StringData]] 内部スロット付きで生成・初期化するために String コンストラクターへの super 呼び出しを含めなければならない。

22.1.1.1 String ( value )

この関数は呼び出されたとき以下の手順を実行する:

  1. value が存在しないなら
    1. s を空文字列とする。
  2. それ以外の場合、
    1. NewTarget が undefined で かつ value が Symbol なら、SymbolDescriptiveString(value) を返す。
    2. s を ? ToString(value) とする。
  3. NewTarget が undefined なら s を返す。
  4. StringCreate(s, ? GetPrototypeFromConstructor(NewTarget, "%String.prototype%")) を返す。

22.1.2 String コンストラクターのプロパティ

String コンストラクター:

  • %Function.prototype%[[Prototype]] 内部スロットを持つ。
  • 以下のプロパティを持つ:

22.1.2.1 String.fromCharCode ( ...codeUnits )

この関数は残余引数 codeUnits を構成する任意個の引数で呼び出すことができる。

呼び出されたとき以下を行う:

  1. result を空文字列とする。
  2. codeUnits の各要素 next について
    1. nextCU(? ToUint16(next)) の数値を持つコードユニットとする。
    2. resultresultnextCU文字列連結とする。
  3. result を返す。

この関数の "length" プロパティは 1𝔽 である。

22.1.2.2 String.fromCodePoint ( ...codePoints )

この関数は残余引数 codePoints を構成する任意個の引数で呼び出すことができる。

呼び出されたとき以下を行う:

  1. result を空文字列とする。
  2. codePoints の各要素 next について
    1. nextCP を ? ToNumber(next) とする。
    2. nextCP整数 Number でなければ RangeError 例外を投げる。
    3. (nextCP) < 0 または (nextCP) > 0x10FFFF なら RangeError 例外を投げる。
    4. resultresult と UTF16EncodeCodePoint((nextCP)) の文字列連結とする。
  3. アサート: codePoints が空なら result は空文字列。
  4. result を返す。

この関数の "length" プロパティは 1𝔽 である。

22.1.2.3 String.prototype

String.prototype の初期値は String プロトタイプオブジェクトである。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

22.1.2.4 String.raw ( template, ...substitutions )

この関数は可変個の引数で呼び出される。最初の引数が template、残りがリスト substitutions を構成する。

呼び出されたとき以下を行う:

  1. substitutionCountsubstitutions の要素数とする。
  2. cooked を ? ToObject(template) とする。
  3. literals を ? ToObject(? Get(cooked, "raw" )) とする。
  4. literalCount を ? LengthOfArrayLike(literals) とする。
  5. literalCount ≤ 0 なら空文字列を返す。
  6. R を空文字列とする。
  7. nextIndex を 0 とする。
  8. 繰り返し、
    1. nextLiteralVal を ? Get(literals, ! ToString(𝔽(nextIndex))) とする。
    2. nextLiteral を ? ToString(nextLiteralVal) とする。
    3. RRnextLiteral文字列連結とする。
    4. nextIndex + 1 = literalCount なら R を返す。
    5. nextIndex < substitutionCount なら
      1. nextSubValsubstitutions[nextIndex] とする。
      2. nextSub を ? ToString(nextSubVal) とする。
      3. RRnextSub文字列連結とする。
    6. nextIndexnextIndex + 1 とする。
Note

この関数はタグ付きテンプレート (13.3.11) のタグ関数として使用することを意図している。その場合最初の引数は正しく整形されたテンプレートオブジェクトであり、残りが置換値となる。

22.1.3 String プロトタイプオブジェクトのプロパティ

String プロトタイプオブジェクトは以下を満たす:

  • %String.prototype% である。
  • String エキゾチックオブジェクトであり、そのようなオブジェクトに規定された内部メソッドを持つ。
  • 値が空文字列の [[StringData]] 内部スロットを持つ。
  • 初期値 +0𝔽"length" プロパティを持ち、その属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。
  • [[Prototype]] 内部スロットの値は %Object.prototype% である。

特に明記されない限り、以下で定義される String プロトタイプオブジェクトのメソッドはジェネリックではなく、渡される this 値は String 値か、String 値に初期化された [[StringData]] 内部スロットを持つオブジェクトでなければならない。

22.1.3.1 String.prototype.at ( index )

  1. Othis の値とする。
  2. RequireObjectCoercible(O) を実行する。
  3. S を ? ToString(O) とする。
  4. lenS の長さとする。
  5. relativeIndex を ? ToIntegerOrInfinity(index) とする。
  6. relativeIndex ≥ 0 なら
    1. krelativeIndex とする。
  7. それ以外なら
    1. klen + relativeIndex とする。
  8. k < 0 または klen なら undefined を返す。
  9. Sk から k + 1 までの部分文字列を返す。

22.1.3.2 String.prototype.charAt ( pos )

Note 1

このメソッドは、このオブジェクトを String に変換した値のインデックス pos にあるコードユニットを含む 1 文字の String を返す。その位置に要素がなければ結果は空文字列となる。結果は String オブジェクトではなく String 値である。

pos整数 Number なら x.charAt(pos) の結果は x.substring(pos, pos + 1) の結果と等価である。

呼び出し時に以下を行う:

  1. Othis の値とする。
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O) とする。
  4. position を ? ToIntegerOrInfinity(pos) とする。
  5. sizeS の長さとする。
  6. position < 0 または positionsize なら空文字列を返す。
  7. Sposition から position + 1 までの部分文字列を返す。
Note 2

このメソッドは意図的にジェネリックであり、this が String オブジェクトであることを要求しない。そのため他のオブジェクトへ転用できる。

22.1.3.3 String.prototype.charCodeAt ( pos )

Note 1

このメソッドは、このオブジェクトを String に変換した結果内のインデックス pos のコードユニットの数値 (0 以上 216 未満の整数 Number) を返す。その位置に要素がなければ NaN を返す。

呼び出し時に以下を行う:

  1. Othis の値とする。
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O) とする。
  4. position を ? ToIntegerOrInfinity(pos) とする。
  5. sizeS の長さとする。
  6. position < 0 または positionsize なら NaN を返す。
  7. S のインデックス position のコードユニットの数値を表す Number を返す。
Note 2

このメソッドは意図的にジェネリックであり、this が String オブジェクトであることを要求しない。

22.1.3.4 String.prototype.codePointAt ( pos )

Note 1

このメソッドは 0x10FFFF𝔽 以下の非負整数 Number を返し、これはこのオブジェクトを String に変換した結果のインデックス pos で始まる UTF-16 エンコードされたコードポイント (6.1.4) の数値である。その位置に要素がなければ undefined を返す。pos で有効なサロゲートペアが開始しなければ、その位置のコードユニットを返す。

呼び出し時の手順:

  1. Othis の値とする。
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O) とする。
  4. position を ? ToIntegerOrInfinity(pos) とする。
  5. sizeS の長さとする。
  6. position < 0 または positionsize なら undefined を返す。
  7. cp を CodePointAt(S, position) とする。
  8. 𝔽(cp.[[CodePoint]]) を返す。
Note 2

このメソッドはジェネリックであり他オブジェクトに転用可能。

22.1.3.5 String.prototype.concat ( ...args )

Note 1

このメソッドは this の値 (String に変換) のコードユニットに、各引数を String に変換した結果のコードユニットを順に連結した String 値を返す。結果は String オブジェクトではなく String 値。

呼び出し時:

  1. Othis の値とする。
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O) とする。
  4. RS とする。
  5. args の各要素 next について
    1. nextString を ? ToString(next) とする。
    2. RRnextString文字列連結とする。
  6. R を返す。

このメソッドの "length"1𝔽

Note 2

ジェネリックであり他オブジェクトに転用可能。

22.1.3.6 String.prototype.constructor

String.prototype.constructor の初期値は %String% である。

22.1.3.7 String.prototype.endsWith ( searchString [ , endPosition ] )

呼び出し時の手順:

  1. Othis の値とする。
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O) とする。
  4. isRegExp を ? IsRegExp(searchString) とする。
  5. isRegExptrue なら TypeError を投げる。
  6. searchStr を ? ToString(searchString) とする。
  7. lenS の長さとする。
  8. endPositionundefined なら poslen とし、そうでなければ pos を ? ToIntegerOrInfinity(endPosition) とする。
  9. endpos を 0 と len の間にクランプした結果とする。
  10. searchLengthsearchStr の長さとする。
  11. searchLength = 0 なら true を返す。
  12. startend - searchLength とする。
  13. start < 0 なら false を返す。
  14. substringSstart から end部分文字列とする。
  15. substringsearchStr なら true を返す。
  16. false を返す。
Note 1

endPosition - length(this) から始まる対応するコードユニット列が一致すれば true

Note 2

最初の引数が RegExp の場合に例外を投げるのは将来の拡張余地のため。

Note 3

ジェネリックであり転用可能。

22.1.3.8 String.prototype.includes ( searchString [ , position ] )

呼び出し時:

  1. Othis の値。
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. isRegExp を ? IsRegExp(searchString)。
  5. isRegExptrue なら TypeError
  6. searchStr を ? ToString(searchString)。
  7. pos を ? ToIntegerOrInfinity(position)。
  8. アサート: positionundefined なら pos は 0。
  9. lenS の長さ。
  10. startpos を 0 と len の間にクランプした結果。
  11. indexStringIndexOf(S, searchStr, start)。
  12. indexnot-found なら false
  13. true を返す。
Note 1

position 以上の位置で searchString部分文字列として現れれば true

Note 2

RegExp の場合例外を投げる理由は将来拡張のため。

Note 3

ジェネリック。

22.1.3.9 String.prototype.indexOf ( searchString [ , position ] )

Note 1

position 以上で最初に現れるインデックスを返し、存在しなければ -1𝔽positionundefined なら +0𝔽

手順:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. searchStr を ? ToString(searchString)。
  5. pos を ? ToIntegerOrInfinity(position)。
  6. アサート: positionundefined なら pos は 0。
  7. lenS の長さ。
  8. startpos を 0 と len の間にクランプした結果。
  9. resultStringIndexOf(S, searchStr, start)。
  10. resultnot-found なら -1𝔽 を返す。
  11. 𝔽(result) を返す。
Note 2

ジェネリック。

22.1.3.10 String.prototype.isWellFormed ( )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. IsStringWellFormedUnicode(S) を返す。

22.1.3.11 String.prototype.lastIndexOf ( searchString [ , position ] )

Note 1

position 以下で最後に現れるインデックスを返し、存在しなければ -1𝔽positionundefined なら文字列長を仮定。

手順:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. searchStr を ? ToString(searchString)。
  5. numPos を ? ToNumber(position)。
  6. アサート: positionundefined なら numPosNaN
  7. numPosNaN なら pos を +∞ とし、そうでなければ pos を ! ToIntegerOrInfinity(numPos)。
  8. lenS の長さ。
  9. searchLensearchStr の長さ。
  10. startpos を 0 と len - searchLen の間にクランプ。
  11. resultStringLastIndexOf(S, searchStr, start)。
  12. resultnot-found なら -1𝔽
  13. 𝔽(result) を返す。
Note 2

ジェネリック。

22.1.3.12 String.prototype.localeCompare ( that [ , reserved1 [ , reserved2 ] ] )

ECMA-402 国際化 API を含む実装は ECMA-402 の規定に従う。含まない実装では次を用いる:

このメソッドは this 値 (String に変換した S) と that (String に変換した thatValue) のロケール依存比較の結果を NaN 以外の Number で返す。結果はホスト環境の現在のロケールの慣習に従うソート順を表し、SthatValue の前なら負、後なら正、その他は 0(順序なし)となる。

比較の前に以下を行う:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. thatValue を ? ToString(that)。

第2・第3引数の意味は ECMA-402 仕様に定義され、未実装の場合他用途に用いてはならない。

実際の戻り値は追加情報符号化のため実装定義だが、このメソッドは全 String 上の全順序を与える一貫した比較子でなければならず、Unicode 標準の正規等価性を尊重し、正規等価な区別可能文字列の比較で +0𝔽 を返さねばならない。

Note 1

2 引数関数を要求する Array.prototype.sort の引数に直接適切ではない。

Note 2

このメソッドはホスト環境の言語・ロケール機能を利用し得るが、常に Unicode の正規等価性を尊重する必要がある。以下はすべて +0𝔽 を返さねばならない例である:

// Å ANGSTROM SIGN vs.
// Å LATIN CAPITAL LETTER A + COMBINING RING ABOVE
"\u212B".localeCompare("A\u030A")

// Ω OHM SIGN vs.
// Ω GREEK CAPITAL LETTER OMEGA
"\u2126".localeCompare("\u03A9")

// ṩ LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE vs.
// ṩ LATIN SMALL LETTER S + COMBINING DOT ABOVE + COMBINING DOT BELOW
"\u1E69".localeCompare("s\u0307\u0323")

// ḍ̇ LATIN SMALL LETTER D WITH DOT ABOVE + COMBINING DOT BELOW vs.
// ḍ̇ LATIN SMALL LETTER D WITH DOT BELOW + COMBINING DOT ABOVE
"\u1E0B\u0323".localeCompare("\u1E0D\u0307")

// 가 HANGUL CHOSEONG KIYEOK + HANGUL JUNGSEONG A vs.
// 가 HANGUL SYLLABLE GA
"\u1100\u1161".localeCompare("\uAC00")

正規等価性の定義と議論は Unicode Standard 2章・3章、UAX #15UTN #5、および UTS #10 を参照。

Unicode 互換等価や互換分解は尊重しないことが推奨される。

Note 3

ジェネリックであり転用可能。

22.1.3.13 String.prototype.match ( regexp )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. regexpundefined でも null でもないなら
    1. matcher を ? GetMethod(regexp, %Symbol.match%)。
    2. matcherundefined でなければ
      1. ? Call(matcher, regexp, « O ») を返す。
  4. S を ? ToString(O)。
  5. rx を ? RegExpCreate(regexp, undefined)。
  6. ? Invoke(rx, %Symbol.match%, « S ») を返す。
Note

ジェネリック。

22.1.3.14 String.prototype.matchAll ( regexp )

このメソッドは this を表す String に対して regexp で正規表現マッチを行い、マッチ結果を生成するイテレータを返す。各結果は最初の要素にマッチ全体、その後にキャプチャグループを含む配列。マッチしなければ結果を生成しない。

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. regexpundefined でも null でもないなら
    1. isRegExp を ? IsRegExp(regexp)。
    2. isRegExptrue なら
      1. flags を ? Get(regexp, "flags")。
      2. RequireObjectCoercible(flags)。
      3. ToString(flags) が "g" を含まなければ TypeError
    3. matcher を ? GetMethod(regexp, %Symbol.matchAll%)。
    4. matcherundefined でなければ
      1. ? Call(matcher, regexp, « O ») を返す。
  4. S を ? ToString(O)。
  5. rx を ? RegExpCreate(regexp, "g")。
  6. ? Invoke(rx, %Symbol.matchAll%, « S ») を返す。
Note 1
このメソッドはジェネリックで、this が String オブジェクトである必要はない。
Note 2
String.prototype.split と同様に通常入力を破壊しないよう設計されている。

22.1.3.15 String.prototype.normalize ( [ form ] )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. formundefined なら f"NFC" とする。
  5. それ以外なら f を ? ToString(form)。
  6. f"NFC", "NFD", "NFKC", "NFKD" のいずれでもなければ RangeError
  7. ns を最新の Unicode Standard の正規化 (Normalization Forms) に従い Sf 指定の正規形に変換した String 値とする。
  8. ns を返す。
Note

ジェネリック。

22.1.3.16 String.prototype.padEnd ( maxLength [ , fillString ] )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. StringPaddingBuiltinsImpl(O, maxLength, fillString, end) を返す。

22.1.3.17 String.prototype.padStart ( maxLength [ , fillString ] )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. StringPaddingBuiltinsImpl(O, maxLength, fillString, start) を返す。

22.1.3.17.1 StringPaddingBuiltinsImpl ( O, maxLength, fillString, placement )

The abstract operation StringPaddingBuiltinsImpl takes arguments O (an ECMAScript language value), maxLength (an ECMAScript language value), fillString (an ECMAScript language value), and placement (start or end) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:

  1. S を ? ToString(O)。
  2. intMaxLength(? ToLength(maxLength))。
  3. stringLengthS の長さ。
  4. intMaxLengthstringLength なら S を返す。
  5. fillStringundefined なら fillString をコードユニット 0x0020 (SPACE) のみからなる String とする。
  6. それ以外なら fillString を ? ToString(fillString)。
  7. StringPad(S, intMaxLength, fillString, placement) を返す。

22.1.3.17.2 StringPad ( S, maxLength, fillString, placement )

The abstract operation StringPad takes arguments S (a String), maxLength (a non-negative integer), fillString (a String), and placement (start or end) and returns a String. It performs the following steps when called:

  1. stringLengthS の長さ。
  2. maxLengthstringLength なら S
  3. fillString が空文字列なら S
  4. fillLenmaxLength - stringLength
  5. truncatedStringFillerfillString を繰り返し連結し長さ fillLen に切り詰めた String。
  6. placementstart なら truncatedStringFillerS の連結を返す。
  7. それ以外は StruncatedStringFiller の連結を返す。
Note 1

maxLengthS の長さ未満にならないようクランプされる。

Note 2

fillString の既定は " " (0x0020 SPACE)。

22.1.3.17.3 ToZeroPaddedDecimalString ( n, minLength )

The abstract operation ToZeroPaddedDecimalString takes arguments n (a non-negative integer) and minLength (a non-negative integer) and returns a String. It performs the following steps when called:

  1. Sn を 10 進数表記した文字列表現。
  2. StringPad(S, minLength, "0", start) を返す。

22.1.3.18 String.prototype.repeat ( count )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. n を ? ToIntegerOrInfinity(count)。
  5. n < 0 または n = +∞ なら RangeError
  6. n = 0 なら空文字列。
  7. Sn 回連結した String を返す。
Note 1

this の値を繰り返したコードユニット列を生成。

Note 2

ジェネリック。

22.1.3.19 String.prototype.replace ( searchValue, replaceValue )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. searchValueundefined でも null でもないなら
    1. replacer を ? GetMethod(searchValue, %Symbol.replace%)。
    2. replacerundefined でなければ
      1. ? Call(replacer, searchValue, « O, replaceValue ») を返す。
  4. string を ? ToString(O)。
  5. searchString を ? ToString(searchValue)。
  6. functionalReplaceIsCallable(replaceValue)。
  7. functionalReplacefalse なら
    1. replaceValue を ? ToString(replaceValue) に設定。
  8. searchLengthsearchString の長さ。
  9. positionStringIndexOf(string, searchString, 0)。
  10. positionnot-found なら string を返す。
  11. precedingstring の 0 から position まで。
  12. followingstringposition + searchLength 以降。
  13. functionalReplacetrue なら
    1. replacement を ? ToString(? Call(replaceValue, undefined, « searchString, 𝔽(position), string »))。
  14. それ以外
    1. アサート: replaceValue は String。
    2. captures を空リスト。
    3. replacement を ! GetSubstitution(searchString, string, position, captures, undefined, replaceValue)。
  15. preceding, replacement, following を連結して返す。
Note

ジェネリック。

22.1.3.19.1 GetSubstitution ( matched, str, position, captures, namedCaptures, replacementTemplate )

The abstract operation GetSubstitution takes arguments matched (a String), str (a String), position (a non-negative integer), captures (a List of either Strings or undefined), namedCaptures (an Object or undefined), and replacementTemplate (a String) and returns either a normal completion containing a String or a throw completion. この抽象操作において decimal digit は 0x0030 (DIGIT ZERO) から 0x0039 (DIGIT NINE) までのコードユニット。 It performs the following steps when called:

  1. stringLengthstr の長さ。
  2. アサート: positionstringLength
  3. result を空文字列。
  4. templateRemainderreplacementTemplate
  5. templateRemainder が空文字列でない間繰り返し、
    1. 注記: 以下の手順で接頭辞 ref を分離し、その置換 refReplacement を決定し result に追加する。
    2. templateRemainder"$$" で始まるなら
      1. ref"$$"
      2. refReplacement"$"
    3. それ以外で "$`" で始まるなら
      1. ref"$`"
      2. refReplacementstr の 0 から position まで。
    4. それ以外で "$&" で始まるなら
      1. ref"$&"
      2. refReplacementmatched
    5. それ以外で "$'" (0x0024 + 0x0027) で始まるなら
      1. ref"$'"
      2. matchLengthmatched の長さ。
      3. tailPosposition + matchLength
      4. refReplacementstrmin(tailPos, stringLength) から末尾まで。
      5. 注: tailPosstringLength を超えるのは %RegExp.prototype% でない "exec" を持つオブジェクトにより呼ばれた場合のみ。
    6. それ以外で "$" に 1 個以上の 10 進数字が続くなら
      1. 2 つ以上の数字が続くなら digitCount を 2、そうでなければ 1。
      2. digits を 1 から 1 + digitCount部分文字列
      3. index(StringToNumber(digits))。
      4. アサート: 0 ≤ index ≤ 99。
      5. captureLencaptures の要素数。
      6. index > captureLen かつ digitCount = 2 なら
        1. 注: 2 桁が範囲外なら 1 桁とリテラル数字に扱い直す。
        2. digitCount を 1。
        3. digits をその先頭 1 桁に。
        4. index(StringToNumber(digits))。
      7. ref を 0 から 1 + digitCount部分文字列
      8. 1 ≤ indexcaptureLen なら
        1. capturecaptures[index - 1]。
        2. captureundefined なら
          1. refReplacement を空文字列。
        3. それ以外
          1. refReplacementcapture
      9. それ以外
        1. refReplacementref
    7. それ以外で "$<" で始まるなら
      1. gtPosStringIndexOf(templateRemainder, ">", 0)。
      2. gtPosnot-found または namedCapturesundefined なら
        1. ref"$<"
        2. refReplacementref
      3. それ以外
        1. ref を 0 から gtPos + 1 の部分。
        2. groupName を 2 から gtPos の部分。
        3. アサート: namedCaptures はオブジェクト。
        4. capture を ? Get(namedCaptures, groupName)。
        5. captureundefined なら
          1. refReplacement を空文字列。
        6. それ以外
          1. refReplacement を ? ToString(capture)。
    8. それ以外
      1. ref を 0 から 1 の部分。
      2. refReplacementref
    9. refLengthref の長さ。
    10. templateRemainderrefLength 以降の部分へ。
    11. resultresultrefReplacement の連結。
  6. result を返す。

22.1.3.20 String.prototype.replaceAll ( searchValue, replaceValue )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. searchValueundefined でも null でもないなら
    1. isRegExp を ? IsRegExp(searchValue)。
    2. isRegExptrue なら
      1. flags を ? Get(searchValue, "flags")。
      2. RequireObjectCoercible(flags)。
      3. ToString(flags) に "g" が含まれなければ TypeError
    3. replacer を ? GetMethod(searchValue, %Symbol.replace%)。
    4. replacerundefined でなければ
      1. ? Call(replacer, searchValue, « O, replaceValue ») を返す。
  4. string を ? ToString(O)。
  5. searchString を ? ToString(searchValue)。
  6. functionalReplaceIsCallable(replaceValue)。
  7. functionalReplacefalse なら
    1. replaceValue を ? ToString(replaceValue)。
  8. searchLengthsearchString の長さ。
  9. advanceBymax(1, searchLength)。
  10. matchPositions を空リスト。
  11. positionStringIndexOf(string, searchString, 0)。
  12. positionnot-found でない間繰り返し、
    1. matchPositionsposition を追加。
    2. positionStringIndexOf(string, searchString, position + advanceBy) に設定。
  13. endOfLastMatch を 0。
  14. result を空文字列。
  15. matchPositions の各 p について
    1. preservedstringendOfLastMatch から p まで。
    2. functionalReplacetrue なら
      1. replacement を ? ToString(? Call(replaceValue, undefined, « searchString, 𝔽(p), string »))。
    3. それ以外
      1. アサート: replaceValue は String。
      2. captures を空リスト。
      3. replacement を ! GetSubstitution(searchString, string, p, captures, undefined, replaceValue)。
    4. resultresult, preserved, replacement の連結に。
    5. endOfLastMatchp + searchLength に。
  16. endOfLastMatch < string の長さ なら
    1. resultresultstringendOfLastMatch 以降の部分の連結に。
  17. result を返す。

22.1.3.21 String.prototype.search ( regexp )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. regexpundefined でも null でもないなら
    1. searcher を ? GetMethod(regexp, %Symbol.search%)。
    2. searcherundefined でなければ
      1. ? Call(searcher, regexp, « O ») を返す。
  4. string を ? ToString(O)。
  5. rx を ? RegExpCreate(regexp, undefined)。
  6. ? Invoke(rx, %Symbol.search%, « string ») を返す。
Note

ジェネリック。

22.1.3.22 String.prototype.slice ( start, end )

このメソッドは、このオブジェクトを String に変換した結果の start から (含まない)end まで(endundefined なら末尾まで)の substring を返す。start が負なら sourceLength + start とみなし、end が負なら sourceLength + end とみなす。結果は String 値。

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. lenS の長さ。
  5. intStart を ? ToIntegerOrInfinity(start)。
  6. intStart = -∞ なら from を 0。
  7. それ以外で intStart < 0 なら frommax(len + intStart, 0)。
  8. それ以外は frommin(intStart, len)。
  9. endundefined なら intEndlen、そうでなければ ? ToIntegerOrInfinity(end)。
  10. intEnd = -∞ なら to を 0。
  11. それ以外で intEnd < 0 なら tomax(len + intEnd, 0)。
  12. それ以外は tomin(intEnd, len)。
  13. fromto なら空文字列。
  14. Sfrom から to部分文字列を返す。
Note

ジェネリック。

22.1.3.23 String.prototype.split ( separator, limit )

このメソッドは、このオブジェクトを String に変換した結果を左から separator の出現で分割した部分文字列を配列に格納し返す。separator は任意長の String または %Symbol.split% メソッドを持つオブジェクト (例: RegExp)。

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. separatorundefined でも null でもないなら
    1. splitter を ? GetMethod(separator, %Symbol.split%)。
    2. splitterundefined でなければ
      1. ? Call(splitter, separator, « O, limit ») を返す。
  4. S を ? ToString(O)。
  5. limitundefined なら lim を 232 - 1、そうでなければ (? ToUint32(limit))。
  6. R を ? ToString(separator)。
  7. lim = 0 なら CreateArrayFromList(« »)。
  8. separatorundefined なら CreateArrayFromListS »)。
  9. separatorLengthR の長さ。
  10. separatorLength = 0 なら
    1. strLenS の長さ。
    2. outLenlim を 0 と strLen の間にクランプした結果。
    3. headS の 0 から outLen
    4. codeUnitshead のコードユニット列リスト。
    5. CreateArrayFromList(codeUnits) を返す。
  11. S が空文字列なら CreateArrayFromListS »)。
  12. substrings を空リスト。
  13. i を 0。
  14. jStringIndexOf(S, R, 0)。
  15. jnot-found でない間
    1. TSi から j
    2. substringsT を追加。
    3. substrings の要素数が lim なら CreateArrayFromList(substrings)。
    4. ij + separatorLength
    5. jStringIndexOf(S, R, i)。
  16. TSi から末尾。
  17. substringsT を追加。
  18. CreateArrayFromList(substrings) を返す。
Note 1

separator が空文字列なら先頭末尾や直前マッチ末尾の空部分文字列はマッチしない。結果配列長は文字列長で各要素は1コードユニット。

this が空文字列の場合、separator が空文字列にマッチするなら結果は空、そうでなければ 1 要素(空文字列)。

separatorundefined なら結果は 1 要素で this の文字列表現。limit が指定されればサイズ制限。

Note 2

ジェネリック。

22.1.3.24 String.prototype.startsWith ( searchString [ , position ] )

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. isRegExp を ? IsRegExp(searchString)。
  5. isRegExptrue なら TypeError
  6. searchStr を ? ToString(searchString)。
  7. lenS の長さ。
  8. positionundefined なら pos を 0、そうでなければ ? ToIntegerOrInfinity(position)。
  9. startpos を 0 と len の間にクランプした結果。
  10. searchLengthsearchStr の長さ。
  11. searchLength = 0 なら true
  12. endstart + searchLength
  13. end > len なら false
  14. substringSstart から end
  15. substring = searchStr なら true
  16. false を返す。
Note 1

指定位置からの一致で true

Note 2

RegExp の場合例外を投げる理由は将来拡張のため。

Note 3

ジェネリック。

22.1.3.25 String.prototype.substring ( start, end )

このメソッドは、このオブジェクトを String に変換した結果のインデックス start から (含まない)end まで(endundefined なら末尾まで)の substring を返す。結果は String 値。

どちらかの引数が NaN または負なら 0 に置換。長さを超えるなら長さに置換。

start > end の場合は入れ替える。

手順:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. lenS の長さ。
  5. intStart を ? ToIntegerOrInfinity(start)。
  6. endundefined なら intEndlen、そうでなければ ? ToIntegerOrInfinity(end)。
  7. finalStartintStart を 0 と len の間にクランプした結果。
  8. finalEndintEnd を 0 と len の間にクランプした結果。
  9. frommin(finalStart, finalEnd)。
  10. tomax(finalStart, finalEnd)。
  11. Sfrom から to部分文字列を返す。
Note

ジェネリック。

22.1.3.26 String.prototype.toLocaleLowerCase ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 実装時はそちらに従う。未実装時は以下。

このメソッドは 6.1.4 に記載の UTF-16 コードポイント列として String を解釈する。

toLowerCase と同様だがロケール依存(例: トルコ語など特別な場合)。

オプション引数の意味は ECMA-402 に定義され、未実装時は他用途禁止。

Note

ジェネリック。

22.1.3.27 String.prototype.toLocaleUpperCase ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 実装時はその仕様に従う。未実装時は以下。

String を UTF-16 コードポイント列として解釈。

toUpperCase と同様だがロケール依存結果を意図。

オプション引数の意味は ECMA-402 にのみ定義。

Note

ジェネリック。

22.1.3.28 String.prototype.toLowerCase ( )

String を UTF-16 コードポイント列として解釈する (6.1.4)。

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. sText を StringToCodePoints(S)。
  5. lowerText を Unicode 既定のケース変換アルゴリズムに従い toLowercase(sText)。
  6. L を CodePointsToString(lowerText)。
  7. L を返す。

結果は Unicode Character Database のロケール非依存マッピング(UnicodeData.txtSpecialCasing.txt のロケール非依存部分)に従う。

Note 1

一部コードポイントは複数コードポイントへ写像され長さが変わり得る。toUpperCasetoLowerCase は文脈依存で対称ではない。

Note 2

ジェネリック。

22.1.3.29 String.prototype.toString ( )

呼び出し時:

  1. ThisStringValue(this value) を返す。
Note

String オブジェクトにおいては valueOf と同じ結果。

22.1.3.30 String.prototype.toUpperCase ( )

String を UTF-16 コードポイント列として解釈する。

String.prototype.toLowerCase と同様に動作するが Unicode 既定ケース変換の大文字化アルゴリズムを用いる。

Note

ジェネリック。

22.1.3.31 String.prototype.toWellFormed ( )

このオブジェクトの文字列表現から、サロゲートペアを構成しない孤立した先行・後続サロゲートを U+FFFD (REPLACEMENT CHARACTER) に置換した String を返す。

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. S を ? ToString(O)。
  4. strLenS の長さ。
  5. k を 0。
  6. result を空文字列。
  7. k < strLen の間繰り返し
    1. cp を CodePointAt(S, k)。
    2. cp.[[IsUnpairedSurrogate]]true なら
      1. resultresult と 0xFFFD の連結。
    3. それ以外
      1. resultresult と UTF16EncodeCodePoint(cp.[[CodePoint]]) の連結。
    4. kk + cp.[[CodeUnitCount]]
  8. result を返す。

22.1.3.32 String.prototype.trim ( )

String を UTF-16 コードポイント列として解釈する。

呼び出し時:

  1. Sthis の値。
  2. TrimString(S, start+end) を返す。
Note

ジェネリック。

22.1.3.32.1 TrimString ( string, where )

The abstract operation TrimString takes arguments string (an ECMAScript language value) and where (start, end, or start+end) and returns either a normal completion containing a String or a throw completion. string を UTF-16 コードポイント列として解釈する。 It performs the following steps when called:

  1. RequireObjectCoercible(string)。
  2. S を ? ToString(string)。
  3. wherestart なら
    1. TS から前方空白を除去した String。
  4. それ以外で whereend なら
    1. TS から後方空白を除去した String。
  5. それ以外
    1. アサート: wherestart+end
    2. TS の前後空白を除去した String。
  6. T を返す。

空白の定義は WhiteSpaceLineTerminator の和集合。Unicode 一般カテゴリ Space_Separator (“Zs”) の判定は UTF-16 として解釈する。

22.1.3.33 String.prototype.trimEnd ( )

String を UTF-16 コードポイント列として解釈する。

呼び出し時:

  1. Sthis の値。
  2. TrimString(S, end) を返す。
Note

ジェネリック。

22.1.3.34 String.prototype.trimStart ( )

String を UTF-16 コードポイント列として解釈する。

呼び出し時:

  1. Sthis の値。
  2. TrimString(S, start) を返す。
Note

ジェネリック。

22.1.3.35 String.prototype.valueOf ( )

呼び出し時:

  1. ThisStringValue(this value) を返す。

22.1.3.35.1 ThisStringValue ( value )

The abstract operation ThisStringValue takes argument value (an ECMAScript language value) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:

  1. value が String なら value を返す。
  2. value がオブジェクトで [[StringData]] 内部スロットを持つなら
    1. svalue.[[StringData]]
    2. アサート: s は String。
    3. s を返す。
  3. TypeError 例外を投げる。

22.1.3.36 String.prototype [ %Symbol.iterator% ] ( )

このメソッドは String 値のコードポイントを順次 (各コードポイントを String として) 返すイテレータオブジェクトを返す。

呼び出し時:

  1. Othis
  2. RequireObjectCoercible(O)。
  3. s を ? ToString(O)。
  4. closures を捕捉し、呼び出し時に以下を行う抽象クロージャとする:
    1. lens の長さ。
    2. position を 0。
    3. position < len の間繰り返し
      1. cp を CodePointAt(s, position)。
      2. nextIndexposition + cp.[[CodeUnitCount]]
      3. resultStringsposition から nextIndex
      4. positionnextIndex
      5. GeneratorYield(CreateIteratorResultObject(resultString, false))。
    4. NormalCompletion(unused) を返す。
  5. CreateIteratorFromClosure(closure, "%StringIteratorPrototype%", %StringIteratorPrototype%) を返す。

このメソッドの "name" プロパティの値は "[Symbol.iterator]" である。

22.1.4 String インスタンスのプロパティ

String インスタンスは String エキゾチックオブジェクトであり、その内部メソッドを持つ。String インスタンスは String プロトタイプオブジェクトからプロパティを継承し、[[StringData]] 内部スロットを持つ。この内部スロットはその String オブジェクトが表す String 値である。

String インスタンスは "length" プロパティと整数インデックス名を持つ列挙可能プロパティ集合を持つ。

22.1.4.1 length

この String オブジェクトが表す String 値の要素数。

一度初期化されると不変。このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

22.1.5 String 反復子オブジェクト

String Iterator は特定の String インスタンス上の特定の反復を表すオブジェクト。名前付きコンストラクターは存在せず、String インスタンスの特定メソッド呼び出しで生成される。

22.1.5.1 %StringIteratorPrototype% オブジェクト

%StringIteratorPrototype% オブジェクト:

  • 全ての String Iterator オブジェクトが継承するプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]] 内部スロットの値は %Iterator.prototype% である。
  • 次のプロパティを持つ:

22.1.5.1.1 %StringIteratorPrototype%.next ( )

  1. GeneratorResume(this value, empty, "%StringIteratorPrototype%") を返す。

22.1.5.1.2 %StringIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "String Iterator" である。

属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

22.2 RegExp (正規表現) オブジェクト

RegExp オブジェクトは正規表現パターンと関連するフラグを保持する。

Note

正規表現の形式と機能は Perl 5 の正規表現機能を手本としている。

22.2.1 パターン

RegExp コンストラクターは入力のパターン文字列に対して以下の文法を適用する。文字列が Pattern の展開として解釈できない場合、エラーが発生する。

構文

Pattern[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Disjunction[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] | Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Alternative[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: [empty] Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Term[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Term[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Assertion[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Quantifier Assertion[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: ^ $ \b \B (?= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) Quantifier :: QuantifierPrefix QuantifierPrefix ? QuantifierPrefix :: * + ? { DecimalDigits[~Sep] } { DecimalDigits[~Sep] ,} { DecimalDigits[~Sep] , DecimalDigits[~Sep] } Atom[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: PatternCharacter . \ AtomEscape[?UnicodeMode, ?NamedCaptureGroups] CharacterClass[?UnicodeMode, ?UnicodeSetsMode] ( GroupSpecifier[?UnicodeMode]opt Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers : Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) RegularExpressionModifiers :: [empty] RegularExpressionModifiers RegularExpressionModifier RegularExpressionModifier :: one of i m s SyntaxCharacter :: one of ^ $ \ . * + ? ( ) [ ] { } | PatternCharacter :: SourceCharacter but not SyntaxCharacter AtomEscape[UnicodeMode, NamedCaptureGroups] :: DecimalEscape CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode] [+NamedCaptureGroups] k GroupName[?UnicodeMode] CharacterEscape[UnicodeMode] :: ControlEscape c AsciiLetter 0 [lookahead ∉ DecimalDigit] HexEscapeSequence RegExpUnicodeEscapeSequence[?UnicodeMode] IdentityEscape[?UnicodeMode] ControlEscape :: one of f n r t v GroupSpecifier[UnicodeMode] :: ? GroupName[?UnicodeMode] GroupName[UnicodeMode] :: < RegExpIdentifierName[?UnicodeMode] > RegExpIdentifierName[UnicodeMode] :: RegExpIdentifierStart[?UnicodeMode] RegExpIdentifierName[?UnicodeMode] RegExpIdentifierPart[?UnicodeMode] RegExpIdentifierStart[UnicodeMode] :: IdentifierStartChar \ RegExpUnicodeEscapeSequence[+UnicodeMode] [~UnicodeMode] UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart[UnicodeMode] :: IdentifierPartChar \ RegExpUnicodeEscapeSequence[+UnicodeMode] [~UnicodeMode] UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpUnicodeEscapeSequence[UnicodeMode] :: [+UnicodeMode] u HexLeadSurrogate \u HexTrailSurrogate [+UnicodeMode] u HexLeadSurrogate [+UnicodeMode] u HexTrailSurrogate [+UnicodeMode] u HexNonSurrogate [~UnicodeMode] u Hex4Digits [+UnicodeMode] u{ CodePoint } UnicodeLeadSurrogate :: any Unicode code point in the inclusive interval from U+D800 to U+DBFF UnicodeTrailSurrogate :: any Unicode code point in the inclusive interval from U+DC00 to U+DFFF

関連付ける \u HexLeadSurrogate の選択が曖昧である各 \u HexTrailSurrogate は、他に対応する \u HexTrailSurrogate を持たない最も近い u HexLeadSurrogate に関連付けられなければならない。

HexLeadSurrogate :: Hex4Digits but only if the MV of Hex4Digits is in the inclusive interval from 0xD800 to 0xDBFF HexTrailSurrogate :: Hex4Digits but only if the MV of Hex4Digits is in the inclusive interval from 0xDC00 to 0xDFFF HexNonSurrogate :: Hex4Digits but only if the MV of Hex4Digits is not in the inclusive interval from 0xD800 to 0xDFFF IdentityEscape[UnicodeMode] :: [+UnicodeMode] SyntaxCharacter [+UnicodeMode] / [~UnicodeMode] SourceCharacter but not UnicodeIDContinue DecimalEscape :: NonZeroDigit DecimalDigits[~Sep]opt [lookahead ∉ DecimalDigit] CharacterClassEscape[UnicodeMode] :: d D s S w W [+UnicodeMode] p{ UnicodePropertyValueExpression } [+UnicodeMode] P{ UnicodePropertyValueExpression } UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue LoneUnicodePropertyNameOrValue UnicodePropertyName :: UnicodePropertyNameCharacters UnicodePropertyNameCharacters :: UnicodePropertyNameCharacter UnicodePropertyNameCharactersopt UnicodePropertyValue :: UnicodePropertyValueCharacters LoneUnicodePropertyNameOrValue :: UnicodePropertyValueCharacters UnicodePropertyValueCharacters :: UnicodePropertyValueCharacter UnicodePropertyValueCharactersopt UnicodePropertyValueCharacter :: UnicodePropertyNameCharacter DecimalDigit UnicodePropertyNameCharacter :: AsciiLetter _ CharacterClass[UnicodeMode, UnicodeSetsMode] :: [ [lookahead ≠ ^] ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] [^ ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] ClassContents[UnicodeMode, UnicodeSetsMode] :: [empty] [~UnicodeSetsMode] NonemptyClassRanges[?UnicodeMode] [+UnicodeSetsMode] ClassSetExpression NonemptyClassRanges[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtom[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtom[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] NonemptyClassRangesNoDash[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] ClassAtom[UnicodeMode] :: - ClassAtomNoDash[?UnicodeMode] ClassAtomNoDash[UnicodeMode] :: SourceCharacter but not one of \ or ] or - \ ClassEscape[?UnicodeMode] ClassEscape[UnicodeMode] :: b [+UnicodeMode] - CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode] ClassSetExpression :: ClassUnion ClassIntersection ClassSubtraction ClassUnion :: ClassSetRange ClassUnionopt ClassSetOperand ClassUnionopt ClassIntersection :: ClassSetOperand && [lookahead ≠ &] ClassSetOperand ClassIntersection && [lookahead ≠ &] ClassSetOperand ClassSubtraction :: ClassSetOperand -- ClassSetOperand ClassSubtraction -- ClassSetOperand ClassSetRange :: ClassSetCharacter - ClassSetCharacter ClassSetOperand :: NestedClass ClassStringDisjunction ClassSetCharacter NestedClass :: [ [lookahead ≠ ^] ClassContents[+UnicodeMode, +UnicodeSetsMode] ] [^ ClassContents[+UnicodeMode, +UnicodeSetsMode] ] \ CharacterClassEscape[+UnicodeMode] Note 1

最初の二つの行は CharacterClass と同等である。

ClassStringDisjunction :: \q{ ClassStringDisjunctionContents } ClassStringDisjunctionContents :: ClassString ClassString | ClassStringDisjunctionContents ClassString :: [empty] NonEmptyClassString NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt ClassSetCharacter :: [lookahead ∉ ClassSetReservedDoublePunctuator] SourceCharacter but not ClassSetSyntaxCharacter \ CharacterEscape[+UnicodeMode] \ ClassSetReservedPunctuator \b ClassSetReservedDoublePunctuator :: one of && !! ## $$ %% ** ++ ,, .. :: ;; << == >> ?? @@ ^^ `` ~~ ClassSetSyntaxCharacter :: one of ( ) [ ] { } / - \ | ClassSetReservedPunctuator :: one of & - ! # % , : ; < = > @ ` ~ Note 2

この節の複数の生成規則は B.1.2 で別定義が与えられる。

22.2.1.1 静的セマンティクス: 早期エラー

Note

この節は B.1.2.1 で修正される。

Pattern :: Disjunction
  • CountLeftCapturingParensWithin(Pattern) ≥ 232 - 1 の場合、構文エラー。
  • Pattern が互いに異なる二つの GroupSpecifier xy を含み、それらの CapturingGroupName が等しく、かつ MightBothParticipate(x, y) が true の場合、構文エラー。
QuantifierPrefix :: { DecimalDigits , DecimalDigits } Atom :: (? RegularExpressionModifiers : Disjunction ) Atom :: (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction ) AtomEscape :: k GroupName
  • GroupSpecifiersThatMatch(GroupName) が空なら構文エラー。
AtomEscape :: DecimalEscape
  • DecimalEscape の CapturingGroupNumber が AtomEscape を含む Pattern 内の CountLeftCapturingParensWithin より大きい場合、構文エラー。
NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents
  • 最初または二番目の ClassAtom の IsCharacterClass が true なら構文エラー。
  • 両方の IsCharacterClass が false で、かつ最初の CharacterValue > 二番目の CharacterValue の場合構文エラー。
NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents RegExpIdentifierStart :: \ RegExpUnicodeEscapeSequence RegExpIdentifierStart :: UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart :: \ RegExpUnicodeEscapeSequence RegExpIdentifierPart :: UnicodeLeadSurrogate UnicodeTrailSurrogate UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  • LoneUnicodePropertyNameOrValue が General_Category (gc) の値あるいは値エイリアス(PropertyValueAliases.txt)にも、「Property name and aliases」欄(Table 68)に列挙されるバイナリプロパティ/エイリアスにも、文字列のバイナリプロパティ(Table 69 の「Property name」列)にも該当しない場合構文エラー。
  • 外側の Pattern[UnicodeSetsMode] パラメータがなく、かつ LoneUnicodePropertyNameOrValue が文字列のバイナリプロパティ(同表)である場合構文エラー。
CharacterClassEscape :: P{ UnicodePropertyValueExpression } CharacterClass :: [^ ClassContents ]
  • ClassContents の MayContainStrings が true なら構文エラー。
NestedClass :: [^ ClassContents ]
  • ClassContents の MayContainStrings が true なら構文エラー。
ClassSetRange :: ClassSetCharacter - ClassSetCharacter
  • 最初の ClassSetCharacter の CharacterValue が 2 番目より大きい場合構文エラー。

22.2.1.2 静的セマンティクス: CountLeftCapturingParensWithin ( node: a Parse Node, ): 非負整数

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. node 内の左捕捉括弧の個数を返す。左捕捉括弧とは Atom :: ( GroupSpecifieropt Disjunction ) 生成規則の ( 終端にマッチする任意の ( パターン文字である。

Note

この節は B.1.2.2 で修正される。

It performs the following steps when called:

  1. アサート: nodeRegExp パターン文法 の生成規則インスタンスである。
  2. node に含まれる Atom :: ( GroupSpecifieropt Disjunction ) の構文木ノード数を返す。

22.2.1.3 静的セマンティクス: CountLeftCapturingParensBefore ( node: a Parse Node, ): 非負整数

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 外側のパターン内で node の左側に現れる左捕捉括弧の数を返す。

Note

この節は B.1.2.2 で修正される。

It performs the following steps when called:

  1. アサート: nodeRegExp パターン文法 の生成規則インスタンスである。
  2. patternnode を含む Pattern とする。
  3. pattern 内で node より前に出現するか、node を包含する Atom :: ( GroupSpecifieropt Disjunction ) ノードの数を返す。

22.2.1.4 静的セマンティクス: MightBothParticipate ( x: a Parse Node, y: a Parse Node, ): Boolean

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. アサート: xy は同じ外側の Pattern を持つ。
  2. 外側の Pattern Disjunction :: Alternative | Disjunction ノードを含み、xAlternative 内に、y が派生した Disjunction 内(または逆)に含まれる場合 false を返す。
  3. true を返す。

22.2.1.5 静的セマンティクス: CapturingGroupNumber : 正の整数

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

この節は B.1.2.1 で修正される。

It is defined piecewise over the following productions:

DecimalEscape :: NonZeroDigit
  1. NonZeroDigit の MV を返す。
DecimalEscape :: NonZeroDigit DecimalDigits
  1. nDecimalDigits のコードポイント数とする。
  2. (NonZeroDigit の MV × 10n + DecimalDigits の MV) を返す。

NonZeroDigit の MV” と “DecimalDigits の MV” の定義は 12.9.3 にある。

22.2.1.6 静的セマンティクス: IsCharacterClass : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

この節は B.1.2.3 で修正される。

It is defined piecewise over the following productions:

ClassAtom :: - ClassAtomNoDash :: SourceCharacter but not one of \ or ] or - ClassEscape :: b - CharacterEscape
  1. false を返す。
ClassEscape :: CharacterClassEscape
  1. true を返す。

22.2.1.7 静的セマンティクス: CharacterValue : 非負整数

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note 1

この節は B.1.2.4 で修正される。

It is defined piecewise over the following productions:

ClassAtom :: -
  1. U+002D (HYPHEN-MINUS) の数値を返す。
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
  1. chSourceCharacter にマッチしたコードポイントとする。
  2. ch の数値を返す。
ClassEscape :: b
  1. U+0008 (BACKSPACE) の数値を返す。
ClassEscape :: -
  1. U+002D (HYPHEN-MINUS) の数値を返す。
CharacterEscape :: ControlEscape
  1. Table 65 に従う数値を返す。
Table 65: ControlEscape コードポイント値
ControlEscape 数値 Code Point Unicode 名 記号
t 9 U+0009 CHARACTER TABULATION <HT>
n 10 U+000A LINE FEED (LF) <LF>
v 11 U+000B LINE TABULATION <VT>
f 12 U+000C FORM FEED (FF) <FF>
r 13 U+000D CARRIAGE RETURN (CR) <CR>
CharacterEscape :: c AsciiLetter
  1. chAsciiLetter にマッチしたコードポイントとする。
  2. ich の数値とする。
  3. i を 32 で割った余りを返す。
CharacterEscape :: 0 [lookahead ∉ DecimalDigit]
  1. U+0000 (NULL) の数値を返す。
Note 2

\0 は <NUL> 文字を表し、その後に 10 進数字を続けることはできない。

CharacterEscape :: HexEscapeSequence
  1. HexEscapeSequence の MV を返す。
RegExpUnicodeEscapeSequence :: u HexLeadSurrogate \u HexTrailSurrogate
  1. leadHexLeadSurrogate の CharacterValue とする。
  2. trailHexTrailSurrogate の CharacterValue とする。
  3. cp を UTF16SurrogatePairToCodePoint(lead, trail) とする。
  4. cp の数値を返す。
RegExpUnicodeEscapeSequence :: u Hex4Digits
  1. Hex4Digits の MV を返す。
RegExpUnicodeEscapeSequence :: u{ CodePoint }
  1. CodePoint の MV を返す。
HexLeadSurrogate :: Hex4Digits HexTrailSurrogate :: Hex4Digits HexNonSurrogate :: Hex4Digits
  1. Hex4Digits の MV を返す。
CharacterEscape :: IdentityEscape
  1. chIdentityEscape にマッチしたコードポイントとする。
  2. ch の数値を返す。
ClassSetCharacter :: SourceCharacter but not ClassSetSyntaxCharacter
  1. chSourceCharacter にマッチしたコードポイントとする。
  2. ch の数値を返す。
ClassSetCharacter :: \ ClassSetReservedPunctuator
  1. chClassSetReservedPunctuator にマッチしたコードポイントとする。
  2. ch の数値を返す。
ClassSetCharacter :: \b
  1. U+0008 (BACKSPACE) の数値を返す。

22.2.1.8 静的セマンティクス: MayContainStrings : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

CharacterClassEscape :: d D s S w W P{ UnicodePropertyValueExpression } UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue NestedClass :: [^ ClassContents ] ClassContents :: [empty] NonemptyClassRanges ClassSetOperand :: ClassSetCharacter
  1. false を返す。
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  1. LoneUnicodePropertyNameOrValueTable 69 の「Property name」欄にある文字列のバイナリプロパティであれば true を返す。
  2. false を返す。
ClassUnion :: ClassSetRange ClassUnionopt
  1. ClassUnion が存在するならその MayContainStrings を返す。
  2. false を返す。
ClassUnion :: ClassSetOperand ClassUnionopt
  1. ClassSetOperand の MayContainStrings が true なら true を返す。
  2. ClassUnion が存在するならその MayContainStrings を返す。
  3. false を返す。
ClassIntersection :: ClassSetOperand && ClassSetOperand
  1. 最初の ClassSetOperand の MayContainStrings が false なら false
  2. 二番目の ClassSetOperand の MayContainStrings が false なら false
  3. true を返す。
ClassIntersection :: ClassIntersection && ClassSetOperand
  1. ClassIntersection の MayContainStrings が false なら false
  2. ClassSetOperand の MayContainStrings が false なら false
  3. true を返す。
ClassSubtraction :: ClassSetOperand -- ClassSetOperand
  1. 最初の ClassSetOperand の MayContainStrings を返す。
ClassSubtraction :: ClassSubtraction -- ClassSetOperand
  1. ClassSubtraction の MayContainStrings を返す。
ClassStringDisjunctionContents :: ClassString | ClassStringDisjunctionContents
  1. ClassString の MayContainStrings が true なら true
  2. ClassStringDisjunctionContents の MayContainStrings を返す。
ClassString :: [empty]
  1. true を返す。
ClassString :: NonEmptyClassString
  1. NonEmptyClassString の MayContainStrings を返す。
NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt
  1. NonEmptyClassString が存在するなら true
  2. false を返す。

22.2.1.9 静的セマンティクス: GroupSpecifiersThatMatch ( thisGroupName: a GroupName Parse Node, ): GroupSpecifier 構文ノードのリスト

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. namethisGroupName の CapturingGroupName とする。
  2. patternthisGroupName を含む Pattern とする。
  3. result を新しい空リストとする。
  4. pattern が含む各 GroupSpecifier gs について
    1. gs の CapturingGroupName が name なら
      1. gsresult に追加。
  5. result を返す。

22.2.1.10 静的セマンティクス: CapturingGroupName : String

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

GroupName :: < RegExpIdentifierName >
  1. idTextUnescapedRegExpIdentifierName の RegExpIdentifierCodePoints とする。
  2. CodePointsToString(idTextUnescaped) を返す。

22.2.1.11 静的セマンティクス: RegExpIdentifierCodePoints : コードポイントのリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

RegExpIdentifierName :: RegExpIdentifierStart
  1. cpRegExpIdentifierStart の RegExpIdentifierCodePoint とする。
  2. « cp » を返す。
RegExpIdentifierName :: RegExpIdentifierName RegExpIdentifierPart
  1. cps を派生した RegExpIdentifierName の RegExpIdentifierCodePoints とする。
  2. cpRegExpIdentifierPart の RegExpIdentifierCodePoint とする。
  3. cps に « cp » を連結したリストを返す。

22.2.1.12 静的セマンティクス: RegExpIdentifierCodePoint : コードポイント

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

RegExpIdentifierStart :: IdentifierStartChar
  1. IdentifierStartChar にマッチしたコードポイントを返す。
RegExpIdentifierPart :: IdentifierPartChar
  1. IdentifierPartChar にマッチしたコードポイントを返す。
RegExpIdentifierStart :: \ RegExpUnicodeEscapeSequence RegExpIdentifierPart :: \ RegExpUnicodeEscapeSequence
  1. RegExpUnicodeEscapeSequence の CharacterValue を数値とするコードポイントを返す。
RegExpIdentifierStart :: UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart :: UnicodeLeadSurrogate UnicodeTrailSurrogate
  1. leadUnicodeLeadSurrogate にマッチしたコードポイントの数値値を数値とするコードユニットとする。
  2. trailUnicodeTrailSurrogate にマッチしたコードポイントの数値値を数値とするコードユニットとする。
  3. UTF16SurrogatePairToCodePoint(lead, trail) を返す。

22.2.2 パターンのセマンティクス

正規表現パターンは以下で記述される手順を用いて抽象クロージャ (Abstract Closure) に変換される。実装は、結果が同一である限り、以下に挙げるものより効率的なアルゴリズムを用いることが推奨される。この抽象クロージャは RegExp オブジェクトの [[RegExpMatcher]] 内部スロットの値として使われる。

Pattern は、その関連フラグに uv も含まない場合 BMP パターンである。そうでなければ Unicode パターンである。BMP パターンは、基本多言語面 (BMP) の範囲内の Unicode コードポイントから成る 16 ビット値列として解釈される String に対してマッチを行う。Unicode パターンは UTF-16 でエンコードされた Unicode コードポイント列として解釈される String に対してマッチを行う。BMP パターンの挙動を記述する文脈では「文字」は単一の 16 ビット Unicode BMP コードポイントを意味する。Unicode パターンの挙動を記述する文脈では「文字」は UTF-16 でエンコードされたコードポイント (6.1.4) を意味する。いずれの文脈でも「character value」は対応する非エンコードなコードポイントの数値を意味する。

Pattern の構文とセマンティクスは、そのソーステキストが SourceCharacter 値の List であり、各 SourceCharacter が Unicode コードポイントに対応するとして定義される。BMP パターンが非 BMP の SourceCharacter を含む場合、パターン全体は UTF-16 でエンコードされ、そのエンコーディングの個々のコードユニットが List の要素として用いられる。

Note

例えば、ソーステキスト中で単一の非 BMP 文字 U+1D11E (MUSICAL SYMBOL G CLEF) で表されたパターンを考える。Unicode パターンとして解釈されると、それは単一コードポイント U+1D11E を要素とする 1 要素 (1 文字) の List となる。しかし BMP パターンとして解釈される場合、まず UTF-16 にエンコードされ、コードユニット 0xD834 と 0xDD1E から成る 2 要素の List となる。

パターンは非 BMP 文字が UTF-16 エンコードされた ECMAScript の String 値として RegExp コンストラクターに渡される。例えば単一文字 MUSICAL SYMBOL G CLEF のパターンは、長さ 2 の String であり、その要素はコードユニット 0xD834 と 0xDD1E であった。したがって、2 つのパターン文字から成る BMP パターンとして処理するためにこれ以上の変換は不要である。しかし Unicode パターンとして処理するには UTF16SurrogatePairToCodePoint を用いて、その唯一の要素が単一パターン文字 (コードポイント U+1D11E) である List を生成しなければならない。

実装は実際に UTF-16 との間のこのような変換を行わないかもしれないが、本仕様のセマンティクスは、パターンマッチングの結果があたかもそのような変換が行われたかのようであることを要求する。

22.2.2.1 表記

以下の記述では次の内部データ構造を用いる:

  • CharSetElement は次の 2 種類のいずれかである:
    • rer.[[UnicodeSets]]false の場合、CharSetElement は上記「パターンのセマンティクス」における意味での文字。
    • rer.[[UnicodeSets]]true の場合、CharSetElement は上記「パターンのセマンティクス」における意味での文字列(要素がそのような文字である列)。これには空列、1 文字列、複数文字列が含まれる。利便性のため、この種の CharSetElement を扱う際、単一文字は 1 文字列と同一視して扱う。
  • CharSet は CharSetElement の数学的集合。
  • CaptureRange は { [[StartIndex]], [[EndIndex]] } という Record で、キャプチャに含まれる文字の範囲を表す。[[StartIndex]]Input 内での開始インデックス (含む) を表す整数[[EndIndex]]Input 内での終了インデックス (含まない) を表す整数である。任意の CaptureRange について、これらのインデックスは [[StartIndex]][[EndIndex]] という不変条件を満たさなければならない。
  • MatchState は { [[Input]], [[EndIndex]], [[Captures]] } という Record で、[[Input]] はマッチ対象の String を表す文字の List[[EndIndex]]整数[[Captures]] はパターン中の各左捕捉括弧に対応する値の List である。MatchState は正規表現マッチングアルゴリズム中の部分的なマッチ状態を表す。[[EndIndex]] はこれまでにパターンがマッチした最後の入力文字のインデックス + 1 を表し、[[Captures]] は捕捉括弧の結果を保持する。[[Captures]]nth 要素は n 番目の捕捉括弧が捕捉した文字範囲を表す CaptureRange か、まだ到達していない場合 undefined である。バックトラッキングのため、マッチング過程の任意時点で多数の MatchState が使用され得る。
  • MatcherContinuation は 1 つの MatchState 引数を取り、MatchState または failure を返す抽象クロージャ。MatcherContinuation はパターンの残り部分(クロージャが捕捉した値で特定される)を、引数の MatchState が示す中間状態から Input に対してマッチさせようとする。成功すれば最終的な MatchState を返し、失敗すれば failure を返す。
  • Matcher は 2 つの引数(MatchStateMatcherContinuation)を取り、MatchState または failure を返す抽象クロージャ。Matcher はパターンの中間サブパターン(クロージャが捕捉した値で特定される)をその MatchState[[Input]] に対し、引数の MatchState が示す中間状態からマッチさせる。MatcherContinuation 引数は残りのパターンをマッチさせるクロージャであるべき。サブパターンをマッチさせて新しい MatchState を得た後、Matcher はその新しい MatchState に対して MatcherContinuation を呼び、残りのパターンがマッチできるか確認する。できれば MatcherMatcherContinuation が返した MatchState を返し、できなければ選択点での別の選択を試み、成功するか全可能性が尽きるまで MatcherContinuation を繰り返し呼ぶ。

22.2.2.1.1 RegExp レコード

RegExp Record は、コンパイル中および必要に応じてマッチング中に RegExp について必要となる情報を保持するために用いられる Record 値である。

次のフィールドを持つ:

Table 66: RegExp Record Fields
Field Name Value Meaning
[[IgnoreCase]] Boolean フラグに "i" が現れるか
[[Multiline]] Boolean フラグに "m" が現れるか
[[DotAll]] Boolean フラグに "s" が現れるか
[[Unicode]] Boolean フラグに "u" が現れるか
[[UnicodeSets]] Boolean フラグに "v" が現れるか
[[CapturingGroupsCount]] 非負整数 パターン内の左捕捉括弧の数

22.2.2.2 実行時セマンティクス: CompilePattern : 文字の List と非負整数を取り MatchState か failure を返す抽象クロージャ

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Pattern :: Disjunction
  1. mDisjunction の CompileSubpattern (引数 rer, forward) とする。
  2. rerm を捕捉し、(Input, index) を引数に取り呼び出し時に以下を行う新しい抽象クロージャを返す:
    1. アサート: Input は文字の List
    2. アサート: 0 ≤ indexInput の要素数。
    3. c を (y) を引数に取り以下を行う新しい MatcherContinuation(何も捕捉しない)とする:
      1. アサート: yMatchState
      2. y を返す。
    4. caprer.[[CapturingGroupsCount]] 個の undefined を 1 から rer.[[CapturingGroupsCount]] で索引付けした List とする。
    5. xMatchState { [[Input]]: Input, [[EndIndex]]: index, [[Captures]]: cap } とする。
    6. m(x, c) を返す。
Note

Pattern は抽象クロージャ値へコンパイルされる。RegExpBuiltinExec はその後、この手続を文字 List とその List 内のオフセットへ適用し、そのパターンがそのオフセットで正確にマッチするか、マッチするなら捕捉括弧の値が何であるかを決定できる。22.2.2 のアルゴリズムは、パターンのコンパイル時に SyntaxError 例外を投げ得るよう設計されている。一方で、一度成功裏にコンパイルされた後、得られる抽象クロージャを用いて文字 List 内でマッチを探索する際には(メモリ不足など実装定義の例外を除き)例外は投げられない。

22.2.2.3 実行時セマンティクス: CompileSubpattern : Matcher

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note 1

この節は B.1.2.5 で修正される。

It is defined piecewise over the following productions:

Disjunction :: Alternative | Disjunction
  1. m1Alternative の CompileSubpattern (引数 rer, direction) とする。
  2. m2Disjunction の CompileSubpattern (引数 rer, direction) とする。
  3. MatchTwoAlternatives(m1, m2) を返す。
Note 2

| 演算子は 2 つの選択肢を分離する。まず左側の Alternative(および正規表現の後続)へのマッチを試み、失敗したら右側の Disjunction(および後続)を試みる。左 Alternative、右 Disjunction、後続がいずれも選択点を持つ場合、左 Alternative の次の選択へ進む前に後続内の全ての選択が試される。左 Alternative の選択が尽きたら、左 Alternative の代わりに右 Disjunction が試される。| によりスキップされたパターン部分内の捕捉括弧は undefined を生成する。例:

/a|ab/.exec("abc")

は結果 "a" を返し "ab" ではない。また

/((a)|(ab))((c)|(bc))/.exec("abc")

は配列

["abc", "a", "a", undefined, "bc", undefined, "bc"]

を返し、

["abc", "ab", undefined, "ab", "c", "c", undefined]

ではない。2 つの選択肢を試す順序は direction の値と無関係。

Alternative :: [empty]
  1. EmptyMatcher() を返す。
Alternative :: Alternative Term
  1. m1Alternative の CompileSubpattern (引数 rer, direction) とする。
  2. m2Term の CompileSubpattern (引数 rer, direction) とする。
  3. MatchSequence(m1, m2, direction) を返す。
Note 3

連続する TermInput の連続部分に同時にマッチを試みる。directionforward のとき、左 Alternative、右 Term、後続がいずれも選択点を持つ場合、右 Term の次の選択へ進む前に後続内の全選択が試され、左 Alternative の次の選択へ進む前に右 Term の全選択が試される。directionbackward のとき、AlternativeTerm の評価順序は逆転する。

Term :: Assertion
  1. Assertion の CompileAssertion (引数 rer) を返す。
Note 4

得られる Matcherdirection に依存しない。

Term :: Atom
  1. Atom の CompileAtom (引数 rer, direction) を返す。
Term :: Atom Quantifier
  1. mAtom の CompileAtom (引数 rer, direction) とする。
  2. qQuantifier の CompileQuantifier とする。
  3. アサート: q.[[Min]]q.[[Max]].
  4. parenIndex を CountLeftCapturingParensBefore(Term) とする。
  5. parenCount を CountLeftCapturingParensWithin(Atom) とする。
  6. (x, c) を引数に取り m, q, parenIndex, parenCount を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. RepeatMatcher(m, q.[[Min]], q.[[Max]], q.[[Greedy]], x, c, parenIndex, parenCount) を返す。

22.2.2.3.1 RepeatMatcher ( m, min, max, greedy, x, c, parenIndex, parenCount )

The abstract operation RepeatMatcher takes arguments m (a Matcher), min (非負整数), max (非負整数 または +∞), greedy (Boolean), x (MatchState), c (MatcherContinuation), parenIndex (非負整数), and parenCount (非負整数) and returns MatchState または failure. It performs the following steps when called:

  1. max = 0 なら c(x) を返す。
  2. (y) を引数に取り m, min, max, greedy, x, c, parenIndex, parenCount を捕捉し以下を行う新しい MatcherContinuation d を作る:
    1. アサート: yMatchState
    2. min = 0 かつ y.[[EndIndex]] = x.[[EndIndex]] なら failure を返す。
    3. min = 0 なら min2 を 0、そうでなければ min - 1。
    4. max = +∞ なら max2 を +∞、そうでなければ max - 1。
    5. RepeatMatcher(m, min2, max2, greedy, y, c, parenIndex, parenCount) を返す。
  3. capx.[[Captures]] のコピーとする。
  4. parenIndex + 1 から parenIndex + parenCount までの各整数 k について cap[k] に undefined を設定する。
  5. Inputx.[[Input]] とする。
  6. ex.[[EndIndex]] とする。
  7. xrMatchState { [[Input]]: Input, [[EndIndex]]: e, [[Captures]]: cap } とする。
  8. min ≠ 0 なら m(xr, d) を返す。
  9. greedyfalse なら
    1. zc(x) とする。
    2. zfailure でなければ z を返す。
    3. m(xr, d) を返す。
  10. zm(xr, d) とする。
  11. zfailure でなければ z を返す。
  12. c(x) を返す。
Note 1

AtomQuantifier が続く場合、Quantifier に指定された回数だけ繰り返される。Quantifier は非貪欲 (non-greedy) の場合、後続にマッチしつつ可能な限り少ない回数繰り返され、貪欲 (greedy) の場合、後続にマッチしつつ可能な限り多く繰り返される。繰り返されるのは入力文字列ではなく Atom パターンであるため、各反復で異なる入力部分文字列にマッチし得る。

Note 2

Atom と後続の正規表現がいずれも選択点を持つ場合、まず Atom は可能な限り多く (非貪欲なら少なく) マッチする。後続内の全選択が試されてから、Atom の最後の反復で次の選択へ進む。最後 (n 回目) の反復の全選択が試されてから (n - 1) 回目の反復で次の選択へ進む。その時点で Atom の反復回数を増減できる可能性があり(再度、少ないか多いかから開始)、それらが尽きてから (n - 1) 回目の反復で次の選択へ進む……。

比較:

/a[a-z]{2,4}/.exec("abcdefghi")

"abcde" を返し、

/a[a-z]{2,4}?/.exec("abcdefghi")

"abc" を返す。

さらに:

/(aa|aabaac|ba|b|c)*/.exec("aabaac")

は選択点の順序により配列

["aaba", "ba"]

を返し、以下ではない:

["aabaac", "aabaac"]
["aabaac", "c"]

この選択点の順序は、単項表記の 2 つの数の最大公約数 (GCD) を計算する正規表現を書くのに利用できる。以下は 10 と 15 の gcd を計算する例:

"aaaaaaaaaa,aaaaaaaaaaaaaaa".replace(/^(a+)\1*,\1+$/, "$1")

結果は単項表記の "aaaaa"

Note 3

RepeatMatcher のステップ Atom が繰り返されるたびにその捕捉をクリアする。次の正規表現で挙動が分かる:

/(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")

これは配列

["zaacbbbcac", "z", "ac", "a", undefined, "c"]

を返し、

["zaacbbbcac", "z", "ac", "a", "bbb", "c"]

ではない。これは外側の * の各反復が量指定された Atom に含まれる全捕捉文字列(ここでは 2, 3, 4, 5 番)をクリアするためである。

Note 4

RepeatMatcher のステップ は、最小反復回数が満たされた後、空文字列にマッチする Atom のさらなる展開は追加反復として考慮しないと述べる。これは以下のようなパターンで無限ループに陥るのを防ぐ:

/(a*)*/.exec("b")

またはやや複雑な:

/(a*)b\1+/.exec("baaaac")

これは配列

["b", ""]

を返す。

22.2.2.3.2 EmptyMatcher ( )

The abstract operation EmptyMatcher takes no arguments and returns Matcher. It performs the following steps when called:

  1. (x, c) を引数に取り何も捕捉せず以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. c(x) を返す。

22.2.2.3.3 MatchTwoAlternatives ( m1, m2 )

The abstract operation MatchTwoAlternatives takes arguments m1 (Matcher) and m2 (Matcher) and returns Matcher. It performs the following steps when called:

  1. (x, c) を引数に取り m1, m2 を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. rm1(x, c) とする。
    4. rfailure でなければ r を返す。
    5. m2(x, c) を返す。

22.2.2.3.4 MatchSequence ( m1, m2, direction )

The abstract operation MatchSequence takes arguments m1 (Matcher), m2 (Matcher), and direction (forward または backward) and returns Matcher. It performs the following steps when called:

  1. directionforward なら
    1. (x, c) を引数に取り m1, m2 を捕捉し以下を行う新しい Matcher を返す:
      1. アサート: xMatchState
      2. アサート: cMatcherContinuation
      3. (y) を引数に取り c, m2 を捕捉し以下を行う新しい MatcherContinuation d を作る:
        1. アサート: yMatchState
        2. m2(y, c) を返す。
      4. m1(x, d) を返す。
  2. それ以外
    1. アサート: directionbackward
    2. (x, c) を引数に取り m1, m2 を捕捉し以下を行う新しい Matcher を返す:
      1. アサート: xMatchState
      2. アサート: cMatcherContinuation
      3. (y) を引数に取り c, m1 を捕捉し以下を行う新しい MatcherContinuation d を作る:
        1. アサート: yMatchState
        2. m1(y, c) を返す。
      4. m2(x, d) を返す。

22.2.2.4 実行時セマンティクス: CompileAssertion : Matcher

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note 1

この節は B.1.2.6 で修正される。

It is defined piecewise over the following productions:

Assertion :: ^
  1. (x, c) を引数に取り rer を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. Inputx.[[Input]] とする。
    4. ex.[[EndIndex]] とする。
    5. e = 0 または rer.[[Multiline]]true かつ 文字 Input[e - 1] が LineTerminator にマッチするなら
      1. c(x) を返す。
    6. failure を返す。
Note 2

y フラグがパターンに使われている場合でも、^ は常に Input の先頭、または (rer.[[Multiline]]true の場合) 行頭にのみマッチする。

Assertion :: $
  1. (x, c) を引数に取り rer を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. Inputx.[[Input]] とする。
    4. ex.[[EndIndex]] とする。
    5. InputLengthInput の要素数とする。
    6. e = InputLength または rer.[[Multiline]]true かつ 文字 Input[e] が LineTerminator にマッチするなら
      1. c(x) を返す。
    7. failure を返す。
Assertion :: \b
  1. (x, c) を引数に取り rer を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. Inputx.[[Input]] とする。
    4. ex.[[EndIndex]] とする。
    5. aIsWordChar(rer, Input, e - 1) とする。
    6. bIsWordChar(rer, Input, e) とする。
    7. (atrue かつ bfalse) または (afalse かつ btrue) なら c(x) を返す。
    8. failure を返す。
Assertion :: \B
  1. (x, c) を引数に取り rer を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. Inputx.[[Input]] とする。
    4. ex.[[EndIndex]] とする。
    5. aIsWordChar(rer, Input, e - 1) とする。
    6. bIsWordChar(rer, Input, e) とする。
    7. (atrue かつ btrue) または (afalse かつ bfalse) なら c(x) を返す。
    8. failure を返す。
Assertion :: (?= Disjunction )
  1. mDisjunction の CompileSubpattern (引数 rer, forward) とする。
  2. (x, c) を引数に取り m を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. (y) を引数に取り何も捕捉しない新しい MatcherContinuation d を作る:
      1. アサート: yMatchState
      2. y を返す。
    4. rm(x, d) とする。
    5. rfailure なら failure を返す。
    6. アサート: rMatchState
    7. capr.[[Captures]] とする。
    8. Inputx.[[Input]] とする。
    9. xex.[[EndIndex]] とする。
    10. zMatchState { [[Input]]: Input, [[EndIndex]]: xe, [[Captures]]: cap } とする。
    11. c(z) を返す。
Note 3

(?= Disjunction ) 形式はゼロ幅正の先読み。成功するには Disjunction 内のパターンが現在位置でマッチしなければならないが、後続をマッチする前に現在位置は進まない。Disjunction が現在位置で複数のマッチ方法を持つ場合、最初の 1 つのみ試す。他の演算子と異なり、(?= 形式内へのバックトラッキングは行われない (Perl 由来)。これは Disjunction が捕捉括弧を含み、パターン後続がそれらへの後方参照を含む場合のみ影響する。

例:

/(?=(a+))/.exec("baaabac")

は最初の b の直後で空文字列にマッチし、配列:

["", "aaa"]

を返す。先読み内へのバックトラッキング欠如を示すため:

/(?=(a+))a*b\1/.exec("baaabac")

["aba", "a"]

を返し、

["aaaba", "a"]

ではない。

Assertion :: (?! Disjunction )
  1. mDisjunction の CompileSubpattern (引数 rer, forward) とする。
  2. (x, c) を引数に取り m を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. (y) を引数に取り何も捕捉しない MatcherContinuation d を作る:
      1. アサート: yMatchState
      2. y を返す。
    4. rm(x, d) とする。
    5. rfailure でなければ failure を返す。
    6. c(x) を返す。
Note 4

(?! Disjunction ) 形式はゼロ幅負の先読み。成功には Disjunction 内のパターンが現在位置でマッチに失敗する必要がある。現在位置は後続をマッチする前に進まない。Disjunction は捕捉括弧を含み得るが、それらへの後方参照は Disjunction 内部でのみ意味を持つ。この負の先読みが成功するには失敗が必要であり、負の先読み外からのその捕捉への後方参照は常に undefined を返す。例:

/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")

は「a の直後に n (>0) 個の a、b、さらに n 個の a (\2)、c」が続かない a を探す。2 つ目の \2 は負の先読みの外なので undefined にマッチし常に成功する。式は配列:

["baaabaac", "ba", undefined, "abaac"]

を返す。

Assertion :: (?<= Disjunction )
  1. mDisjunction の CompileSubpattern (引数 rer, backward) とする。
  2. (x, c) を引数に取り m を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. (y) を引数に取り何も捕捉しない MatcherContinuation d を作る:
      1. アサート: yMatchState
      2. y を返す。
    4. rm(x, d) とする。
    5. rfailure なら failure を返す。
    6. アサート: rMatchState
    7. capr.[[Captures]] とする。
    8. Inputx.[[Input]] とする。
    9. xex.[[EndIndex]] とする。
    10. zMatchState { [[Input]]: Input, [[EndIndex]]: xe, [[Captures]]: cap } とする。
    11. c(z) を返す。
Assertion :: (?<! Disjunction )
  1. mDisjunction の CompileSubpattern (引数 rer, backward) とする。
  2. (x, c) を引数に取り m を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. (y) を引数に取り何も捕捉しない MatcherContinuation d を作る:
      1. アサート: yMatchState
      2. y を返す。
    4. rm(x, d) とする。
    5. rfailure でなければ failure を返す。
    6. c(x) を返す。

22.2.2.4.1 IsWordChar ( rer, Input, e )

The abstract operation IsWordChar takes arguments rer (a RegExp Record), Input (文字の List), and e (整数) and returns Boolean. It performs the following steps when called:

  1. InputLengthInput の要素数とする。
  2. e = -1 または e = InputLength なら false を返す。
  3. cInput[e] の文字とする。
  4. WordCharacters(rer) に c が含まれるなら true を返す。
  5. false を返す。

22.2.2.5 実行時セマンティクス: CompileQuantifier を持つ Record

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Quantifier :: QuantifierPrefix
  1. qpQuantifierPrefix の CompileQuantifierPrefix とする。
  2. Record { [[Min]]: qp.[[Min]], [[Max]]: qp.[[Max]], [[Greedy]]: true } を返す。
Quantifier :: QuantifierPrefix ?
  1. qpQuantifierPrefix の CompileQuantifierPrefix とする。
  2. Record { [[Min]]: qp.[[Min]], [[Max]]: qp.[[Max]], [[Greedy]]: false } を返す。

22.2.2.6 実行時セマンティクス: CompileQuantifierPrefix を持つ Record

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

QuantifierPrefix :: *
  1. Record { [[Min]]: 0, [[Max]]: +∞ } を返す。
QuantifierPrefix :: +
  1. Record { [[Min]]: 1, [[Max]]: +∞ } を返す。
QuantifierPrefix :: ?
  1. Record { [[Min]]: 0, [[Max]]: 1 } を返す。
QuantifierPrefix :: { DecimalDigits }
  1. iDecimalDigits の MV (12.9.3 参照) とする。
  2. Record { [[Min]]: i, [[Max]]: i } を返す。
QuantifierPrefix :: { DecimalDigits ,}
  1. iDecimalDigits の MV とする。
  2. Record { [[Min]]: i, [[Max]]: +∞ } を返す。
QuantifierPrefix :: { DecimalDigits , DecimalDigits }
  1. i を最初の DecimalDigits の MV とする。
  2. j を 2 番目の DecimalDigits の MV とする。
  3. Record { [[Min]]: i, [[Max]]: j } を返す。

22.2.2.7 実行時セマンティクス: CompileAtom : Matcher

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note 1

この節は B.1.2.7 で修正される。

It is defined piecewise over the following productions:

Atom :: PatternCharacter
  1. chPatternCharacter にマッチした文字とする。
  2. A を文字 ch を含む 1 要素 CharSet とする。
  3. CharacterSetMatcher(rer, A, false, direction) を返す。
Atom :: .
  1. AAllCharacters(rer) とする。
  2. rer.[[DotAll]]true でなければ
    1. LineTerminator 生成規則右辺のコードポイントに対応する全ての文字を A から除去する。
  3. CharacterSetMatcher(rer, A, false, direction) を返す。
Atom :: CharacterClass
  1. ccCharacterClass の CompileCharacterClass (引数 rer) とする。
  2. cscc.[[CharSet]] とする。
  3. rer.[[UnicodeSets]]false または cs の全 CharSetElement が単一文字(cs が空の場合を含む)から成るなら CharacterSetMatcher(rer, cs, cc.[[Invert]], direction) を返す。
  4. アサート: cc.[[Invert]]false
  5. lm を空の MatcherList とする。
  6. cs 内で 1 文字を超える文字列を含む各 CharSetElement s について長さ降順で:
    1. cs2s の最後のコードポイントを含む 1 要素 CharSet とする。
    2. m2CharacterSetMatcher(rer, cs2, false, direction)。
    3. s の 2 番目から最後の 1 つ前までの各コードポイント c1 を逆順で:
      1. cs1c1 を含む 1 要素 CharSet とする。
      2. m1CharacterSetMatcher(rer, cs1, false, direction)。
      3. m2MatchSequence(m1, m2, direction) に更新。
    4. m2lm に追加。
  7. singlescs のうち単一文字から成る全 CharSetElement を含む CharSet とする。
  8. CharacterSetMatcher(rer, singles, false, direction) を lm に追加。
  9. cs が空文字列を含むなら EmptyMatcher() を lm に追加。
  10. m2lm の最後の Matcher とする。
  11. lm の 2 番目から最後の要素を逆順に各 Matcher m1 について
    1. m2MatchTwoAlternatives(m1, m2) に更新。
  12. m2 を返す。
Atom :: ( GroupSpecifieropt Disjunction )
  1. mDisjunction の CompileSubpattern (引数 rer, direction) とする。
  2. parenIndex を CountLeftCapturingParensBefore(Atom) とする。
  3. (x, c) を引数に取り direction, m, parenIndex を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. (y) を引数に取り x, c, direction, parenIndex を捕捉し以下を行う新しい MatcherContinuation d を作る:
      1. アサート: yMatchState
      2. capy.[[Captures]] のコピーとする。
      3. Inputx.[[Input]] とする。
      4. xex.[[EndIndex]] とする。
      5. yey.[[EndIndex]] とする。
      6. directionforward なら
        1. アサート: xeye
        2. rCaptureRange { [[StartIndex]]: xe, [[EndIndex]]: ye } とする。
      7. それ以外
        1. アサート: directionbackward
        2. アサート: yexe
        3. rCaptureRange { [[StartIndex]]: ye, [[EndIndex]]: xe } とする。
      8. cap[parenIndex + 1] に r を設定。
      9. zMatchState { [[Input]]: Input, [[EndIndex]]: ye, [[Captures]]: cap } とする。
      10. c(z) を返す。
    4. m(x, d) を返す。
Note 2

( Disjunction ) 形式の括弧は Disjunction パターンの構成要素をグループ化し、マッチ結果を保存する。結果は後方参照(\ + 非ゼロ 10 進数)、置換文字列で参照、または正規表現マッチ抽象クロージャが返す配列の一部として利用できる。捕捉挙動を抑止するには (?: Disjunction ) を用いる。

Atom :: (? RegularExpressionModifiers : Disjunction )
  1. addModifiersRegularExpressionModifiers にマッチしたソーステキストとする。
  2. removeModifiers を空文字列とする。
  3. modifiedRerUpdateModifiers(rer, CodePointsToString(addModifiers), removeModifiers) とする。
  4. Disjunction の CompileSubpattern (引数 modifiedRer, direction) を返す。
Atom :: (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction )
  1. addModifiers を最初の RegularExpressionModifiers にマッチしたソーステキストとする。
  2. removeModifiers を 2 番目の RegularExpressionModifiers にマッチしたソーステキストとする。
  3. modifiedRerUpdateModifiers(rer, CodePointsToString(addModifiers), CodePointsToString(removeModifiers)) とする。
  4. Disjunction の CompileSubpattern (引数 modifiedRer, direction) を返す。
AtomEscape :: DecimalEscape
  1. nDecimalEscape の CapturingGroupNumber とする。
  2. アサート: nrer.[[CapturingGroupsCount]]
  3. BackreferenceMatcher(rer, « n », direction) を返す。
Note 3

\ に非ゼロ 10 進数 n が続くエスケープは n 番目の捕捉括弧集合の結果にマッチする (22.2.2.1)。正規表現内の捕捉括弧数が n 未満ならエラー。n 以上あるが n 番目が何も捕捉せず undefined なら後方参照は常に成功する。

AtomEscape :: CharacterEscape
  1. cvCharacterEscape の CharacterValue とする。
  2. ch を character value が cv の文字とする。
  3. A を文字 ch を含む 1 要素 CharSet とする。
  4. CharacterSetMatcher(rer, A, false, direction) を返す。
AtomEscape :: CharacterClassEscape
  1. csCharacterClassEscape の CompileToCharSet (引数 rer) とする。
  2. rer.[[UnicodeSets]]false または cs の全 CharSetElement が単一文字(cs が空の場合含む)から成るなら CharacterSetMatcher(rer, cs, false, direction) を返す。
  3. lm を空の MatcherList とする。
  4. cs 内で 1 文字を超える文字列を含む各 CharSetElement s について長さ降順で:
    1. cs2s の最後のコードポイントを含む 1 要素 CharSet とする。
    2. m2CharacterSetMatcher(rer, cs2, false, direction)。
    3. s の 2 番目から最後の 1 つ前までの各コードポイント c1 を逆順で:
      1. cs1c1 を含む 1 要素 CharSet
      2. m1CharacterSetMatcher(rer, cs1, false, direction)。
      3. m2MatchSequence(m1, m2, direction) に更新。
    4. m2lm に追加。
  5. singlescs のうち単一文字から成る全 CharSetElement を含む CharSet とする。
  6. CharacterSetMatcher(rer, singles, false, direction) を lm に追加。
  7. cs が空文字列を含むなら EmptyMatcher() を lm に追加。
  8. m2lm の最後の Matcher に。
  9. lm の 2 番目から最後の要素を逆順に各 m1 について
    1. m2MatchTwoAlternatives(m1, m2) に更新。
  10. m2 を返す。
AtomEscape :: k GroupName
  1. matchingGroupSpecifiers を GroupSpecifiersThatMatch(GroupName) とする。
  2. parenIndices を新しい空 List とする。
  3. matchingGroupSpecifiers の各 GroupSpecifier groupSpecifier について
    1. parenIndex を CountLeftCapturingParensBefore(groupSpecifier) とする。
    2. parenIndexparenIndices に追加。
  4. BackreferenceMatcher(rer, parenIndices, direction) を返す。

22.2.2.7.1 CharacterSetMatcher ( rer, A, invert, direction )

The abstract operation CharacterSetMatcher takes arguments rer (a RegExp Record), A (CharSet), invert (Boolean), and direction (forward または backward) and returns Matcher. It performs the following steps when called:

  1. rer.[[UnicodeSets]]true なら
    1. アサート: invertfalse
    2. アサート: A の全 CharSetElement は単一文字。
  2. (x, c) を引数に取り rer, A, invert, direction を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. Inputx.[[Input]] とする。
    4. ex.[[EndIndex]] とする。
    5. directionforward なら fe + 1 とし、そうでなければ fe - 1。
    6. InputLengthInput の要素数とする。
    7. f < 0 または f > InputLength なら failure
    8. indexmin(e, f) とする。
    9. chInput[index] の文字とする。
    10. ccCanonicalize(rer, ch) とする。
    11. A 内に正確に 1 文字 a を含む CharSetElement が存在し、Canonicalize(rer, a) が cc なら foundtrue、そうでなければ false
    12. invertfalse かつ foundfalse なら failure
    13. inverttrue かつ foundtrue なら failure
    14. capx.[[Captures]] とする。
    15. yMatchState { [[Input]]: Input, [[EndIndex]]: f, [[Captures]]: cap } とする。
    16. c(y) を返す。

22.2.2.7.2 BackreferenceMatcher ( rer, ns, direction )

The abstract operation BackreferenceMatcher takes arguments rer (a RegExp Record), ns (正の整数List), and direction (forward または backward) and returns Matcher. It performs the following steps when called:

  1. (x, c) を引数に取り rer, ns, direction を捕捉し以下を行う新しい Matcher を返す:
    1. アサート: xMatchState
    2. アサート: cMatcherContinuation
    3. Inputx.[[Input]] とする。
    4. capx.[[Captures]] とする。
    5. rundefined とする。
    6. 整数 nns について
      1. cap[n] が undefined でなければ
        1. アサート: rundefined
        2. rcap[n] に設定。
    7. rundefined なら c(x) を返す。
    8. ex.[[EndIndex]] とする。
    9. rsr.[[StartIndex]] とする。
    10. rer.[[EndIndex]] とする。
    11. lenre - rs とする。
    12. directionforward なら fe + len、そうでなければ fe - len
    13. InputLengthInput の要素数とする。
    14. f < 0 または f > InputLength なら failure
    15. gmin(e, f) とする。
    16. 0 ≤ i < len整数 iCanonicalize(rer, Input[rs + i]) ≠ Canonicalize(rer, Input[g + i]) となるものが存在するなら failure
    17. yMatchState { [[Input]]: Input, [[EndIndex]]: f, [[Captures]]: cap } とする。
    18. c(y) を返す。

22.2.2.7.3 Canonicalize ( rer, ch )

The abstract operation Canonicalize takes arguments rer (a RegExp Record) and ch (文字) and returns 文字. It performs the following steps when called:

  1. HasEitherUnicodeFlag(rer) が true かつ rer.[[IgnoreCase]]true なら
    1. Unicode Character Database の CaseFolding.txtch に単純または共通のケースフォールディングを提供するなら、その写像結果を返す。
    2. ch を返す。
  2. rer.[[IgnoreCase]]false なら ch を返す。
  3. アサート: ch は UTF-16 コードユニット。
  4. cp を数値が ch の数値と等しいコードポイントとする。
  5. u を Unicode 既定ケース変換アルゴリズムに従い toUppercase(« cp ») とする。
  6. uStr を CodePointsToString(u) とする。
  7. uStr の長さ ≠ 1 なら ch を返す。
  8. cuuStr の単一コードユニット要素とする。
  9. ch の数値 ≥ 128 かつ cu の数値 < 128 なら ch を返す。
  10. cu を返す。
Note

HasEitherUnicodeFlag(rer) が true の大文字小文字無視マッチでは、比較直前に全ての文字が Unicode 標準の simple case folding により暗黙にフォールディングされる。simple mapping は常に単一コードポイントへ写像するため ßssSS には写らない。基本ラテンブロック外から内へ写像する場合がある (例: ſs, k)。これらを含む文字列は /[a-z]/ui などでマッチする。

HasEitherUnicodeFlag(rer) が false の大文字小文字無視マッチでは toCasefold ではなく toUppercase に基づくため差異がある。例: は toUppercase では自身、toCasefold では ω に写るため "\u2126"/[ω]/ui/[\u03A9]/ui にマッチするが /[ω]/i/[\u03A9]/i にはマッチしない。また基本ラテン外から内への写像は行われないので "\u017F ſ", "\u212A K"/[a-z]/i にマッチしない。

22.2.2.7.4 UpdateModifiers ( rer, add, remove )

The abstract operation UpdateModifiers takes arguments rer (a RegExp Record), add (String), and remove (String) and returns RegExp Record. It performs the following steps when called:

  1. アサート: addremove は共通要素を持たない。
  2. ignoreCaserer.[[IgnoreCase]]
  3. multilinerer.[[Multiline]]
  4. dotAllrer.[[DotAll]]
  5. unicoderer.[[Unicode]]
  6. unicodeSetsrer.[[UnicodeSets]]
  7. capturingGroupsCountrer.[[CapturingGroupsCount]]
  8. remove"i" が含まれるなら ignoreCasefalse に。
  9. そうでなく add"i" が含まれるなら ignoreCasetrue に。
  10. remove"m" が含まれるなら multilinefalse に。
  11. そうでなく add"m" が含まれるなら multilinetrue に。
  12. remove"s" が含まれるなら dotAllfalse に。
  13. そうでなく add"s" が含まれるなら dotAlltrue に。
  14. RegExp Record { [[IgnoreCase]]: ignoreCase, [[Multiline]]: multiline, [[DotAll]]: dotAll, [[Unicode]]: unicode, [[UnicodeSets]]: unicodeSets, [[CapturingGroupsCount]]: capturingGroupsCount } を返す。

22.2.2.8 実行時セマンティクス: CompileCharacterClass を持つ Record

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

CharacterClass :: [ ClassContents ]
  1. AClassContents の CompileToCharSet (引数 rer) とする。
  2. Record { [[CharSet]]: A, [[Invert]]: false } を返す。
CharacterClass :: [^ ClassContents ]
  1. AClassContents の CompileToCharSet (引数 rer) とする。
  2. rer.[[UnicodeSets]]true なら
    1. Record { [[CharSet]]: CharacterComplement(rer, A), [[Invert]]: false } を返す。
  3. Record { [[CharSet]]: A, [[Invert]]: true } を返す。

22.2.2.9 実行時セマンティクス: CompileToCharSet : CharSet

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note 1

この節は B.1.2.8 で修正される。

It is defined piecewise over the following productions:

ClassContents :: [empty]
  1. 空の CharSet を返す。
NonemptyClassRanges :: ClassAtom NonemptyClassRangesNoDash
  1. AClassAtom の CompileToCharSet (引数 rer)。
  2. BNonemptyClassRangesNoDash の CompileToCharSet (引数 rer)。
  3. CharSet AB の和集合を返す。
NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents
  1. A を最初の ClassAtom の CompileToCharSet (引数 rer)。
  2. B を 2 番目の ClassAtom の CompileToCharSet (引数 rer)。
  3. CClassContents の CompileToCharSet (引数 rer)。
  4. DCharacterRange(A, B)。
  5. DC の和集合を返す。
NonemptyClassRangesNoDash :: ClassAtomNoDash NonemptyClassRangesNoDash
  1. AClassAtomNoDash の CompileToCharSet (引数 rer)。
  2. BNonemptyClassRangesNoDash の CompileToCharSet (引数 rer)。
  3. CharSet AB の和集合を返す。
NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents
  1. AClassAtomNoDash の CompileToCharSet (引数 rer)。
  2. BClassAtom の CompileToCharSet (引数 rer)。
  3. CClassContents の CompileToCharSet (引数 rer)。
  4. DCharacterRange(A, B)。
  5. DC の和集合を返す。
Note 2

ClassContents は単一の ClassAtom、およびダッシュで区切られた 2 つの ClassAtom の範囲になり得る。後者の場合、ClassContents には第 1 と第 2 の ClassAtom 間(含む)の全ての文字が含まれる。どちらかの ClassAtom が単一文字を表さない (例: \w) 場合、または第 1 の ClassAtom の character value が第 2 のそれより大きい場合はエラー。

Note 3

パターンが大文字小文字を無視する場合でも、範囲両端の大文字小文字は範囲に含まれる文字を決定する上で重要。例: /[E-F]/iE, F, e, f のみ、/[E-f]/i は Unicode Basic Latin ブロックの全大文字小文字および [, \, ], ^, _, ` にマッチ。

Note 4

- は文字通りにも範囲指定にも使える。ClassContents の先頭または末尾、範囲指定の開始/終了端、または範囲指定直後に現れる場合はリテラルとして扱われる。

ClassAtom :: -
  1. 単一文字 - U+002D (HYPHEN-MINUS) を含む CharSet を返す。
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
  1. SourceCharacter にマッチした文字を含む CharSet を返す。
ClassEscape :: b - CharacterEscape
  1. cv をこの ClassEscape の CharacterValue。
  2. c を character value が cv の文字。
  3. c を含む 1 要素 CharSet を返す。
Note 5

ClassAtom 内では、\b, \B, 後方参照を除く正規表現中で許されるエスケープを利用できる。CharacterClass 内では \b はバックスペース文字、\B と後方参照はエラー。ClassAtom 内で後方参照を用いるとエラー。

CharacterClassEscape :: d
  1. 文字 09 を含む 10 要素 CharSet を返す。
CharacterClassEscape :: D
  1. S CharacterClassEscape :: d の返す CharSet とする。
  2. CharacterComplement(rer, S) を返す。
CharacterClassEscape :: s
  1. WhiteSpace または LineTerminator 生成規則右辺のコードポイントに対応する全ての文字を含む CharSet を返す。
CharacterClassEscape :: S
  1. S CharacterClassEscape :: s の返す CharSet とする。
  2. CharacterComplement(rer, S) を返す。
CharacterClassEscape :: w
  1. MaybeSimpleCaseFolding(rer, WordCharacters(rer)) を返す。
CharacterClassEscape :: W
  1. S CharacterClassEscape :: w の返す CharSet とする。
  2. CharacterComplement(rer, S) を返す。
CharacterClassEscape :: p{ UnicodePropertyValueExpression }
  1. UnicodePropertyValueExpression の CompileToCharSet (引数 rer) を返す。
CharacterClassEscape :: P{ UnicodePropertyValueExpression }
  1. SUnicodePropertyValueExpression の CompileToCharSet (引数 rer) とする。
  2. アサート: S は単一コードポイントのみ含む。
  3. CharacterComplement(rer, S) を返す。
UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue
  1. psUnicodePropertyName にマッチしたソーステキスト。
  2. pUnicodeMatchProperty(rer, ps)。
  3. アサート: pTable 67 の「Property name and aliases」に列挙される Unicode プロパティ名またはエイリアス。
  4. vsUnicodePropertyValue にマッチしたソーステキスト。
  5. vUnicodeMatchPropertyValue(p, vs)。
  6. A をプロパティ p が値 v を持つ全 Unicode コードポイントを含む CharSet
  7. MaybeSimpleCaseFolding(rer, A) を返す。
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  1. sLoneUnicodePropertyNameOrValue にマッチしたソーステキスト。
  2. UnicodeMatchPropertyValue(General_Category, s) が General_Category (gc) のプロパティ値または値エイリアス(PropertyValueAliases.txt)なら
    1. プロパティ “General_Category” が値 s を持つ全 Unicode コードポイントを含む CharSet を返す。
  3. pUnicodeMatchProperty(rer, s)。
  4. アサート: pTable 68 の「Property name and aliases」列、または Table 69 の「Property name」列に列挙されるバイナリ Unicode プロパティ / そのエイリアス / 文字列のバイナリプロパティ。
  5. A をプロパティ p が値 “True” を持つ全 CharSetElement を含む CharSet
  6. MaybeSimpleCaseFolding(rer, A) を返す。
ClassUnion :: ClassSetRange ClassUnionopt
  1. AClassSetRange の CompileToCharSet (引数 rer)。
  2. ClassUnion が存在するなら
    1. BClassUnion の CompileToCharSet (引数 rer)。
    2. CharSet AB の和集合を返す。
  3. A を返す。
ClassUnion :: ClassSetOperand ClassUnionopt
  1. AClassSetOperand の CompileToCharSet (引数 rer)。
  2. ClassUnion が存在するなら
    1. BClassUnion の CompileToCharSet (引数 rer)。
    2. CharSet AB の和集合を返す。
  3. A を返す。
ClassIntersection :: ClassSetOperand && ClassSetOperand
  1. A を最初の ClassSetOperand の CompileToCharSet (引数 rer)。
  2. B を 2 番目の ClassSetOperand の CompileToCharSet (引数 rer)。
  3. CharSet AB の共通部分を返す。
ClassIntersection :: ClassIntersection && ClassSetOperand
  1. AClassIntersection の CompileToCharSet (引数 rer)。
  2. BClassSetOperand の CompileToCharSet (引数 rer)。
  3. CharSet AB の共通部分を返す。
ClassSubtraction :: ClassSetOperand -- ClassSetOperand
  1. 最初の ClassSetOperand の CompileToCharSet (引数 rer) を A
  2. 2 番目の ClassSetOperand の CompileToCharSet (引数 rer) を B
  3. A のうち B でない CharSetElement を含む CharSet を返す。
ClassSubtraction :: ClassSubtraction -- ClassSetOperand
  1. AClassSubtraction の CompileToCharSet (引数 rer)。
  2. BClassSetOperand の CompileToCharSet (引数 rer)。
  3. A のうち B でない CharSetElement を含む CharSet を返す。
ClassSetRange :: ClassSetCharacter - ClassSetCharacter
  1. A を最初の ClassSetCharacter の CompileToCharSet (引数 rer)。
  2. B を 2 番目の ClassSetCharacter の CompileToCharSet (引数 rer)。
  3. MaybeSimpleCaseFolding(rer, CharacterRange(A, B)) を返す。
Note 6

結果はしばしば 2 個以上の範囲で構成される。UnicodeSets が true かつ IgnoreCase が true のとき、MaybeSimpleCaseFolding(rer, [Ā-č]) はその範囲の奇数番コードポイントのみを含む。

ClassSetOperand :: ClassSetCharacter
  1. AClassSetCharacter の CompileToCharSet (引数 rer)。
  2. MaybeSimpleCaseFolding(rer, A) を返す。
ClassSetOperand :: ClassStringDisjunction
  1. AClassStringDisjunction の CompileToCharSet (引数 rer)。
  2. MaybeSimpleCaseFolding(rer, A) を返す。
ClassSetOperand :: NestedClass
  1. NestedClass の CompileToCharSet (引数 rer) を返す。
NestedClass :: [ ClassContents ]
  1. ClassContents の CompileToCharSet (引数 rer) を返す。
NestedClass :: [^ ClassContents ]
  1. AClassContents の CompileToCharSet (引数 rer)。
  2. CharacterComplement(rer, A) を返す。
NestedClass :: \ CharacterClassEscape
  1. CharacterClassEscape の CompileToCharSet (引数 rer) を返す。
ClassStringDisjunction :: \q{ ClassStringDisjunctionContents }
  1. ClassStringDisjunctionContents の CompileToCharSet (引数 rer) を返す。
ClassStringDisjunctionContents :: ClassString
  1. sClassString の CompileClassSetString (引数 rer)。
  2. 文字列 s を 1 つだけ含む CharSet を返す。
ClassStringDisjunctionContents :: ClassString | ClassStringDisjunctionContents
  1. sClassString の CompileClassSetString (引数 rer)。
  2. A を文字列 s を 1 つ含む CharSet
  3. BClassStringDisjunctionContents の CompileToCharSet (引数 rer)。
  4. CharSet AB の和集合を返す。
ClassSetCharacter :: SourceCharacter but not ClassSetSyntaxCharacter \ CharacterEscape \ ClassSetReservedPunctuator
  1. cv をこの ClassSetCharacter の CharacterValue。
  2. c を character value が cv の文字。
  3. c を含む 1 要素 CharSet を返す。
ClassSetCharacter :: \b
  1. U+0008 (BACKSPACE) を含む 1 要素 CharSet を返す。

22.2.2.9.1 CharacterRange ( A, B )

The abstract operation CharacterRange takes arguments A (CharSet) and B (CharSet) and returns CharSet. It performs the following steps when called:

  1. アサート: A, B はそれぞれ正確に 1 文字を含む。
  2. aCharSet A の唯一の文字。
  3. bCharSet B の唯一の文字。
  4. i を文字 a の character value。
  5. j を文字 b の character value。
  6. アサート: ij
  7. i から j まで(含む)の character value を持つ全ての文字を含む CharSet を返す。

22.2.2.9.2 HasEitherUnicodeFlag ( rer )

The abstract operation HasEitherUnicodeFlag takes argument rer (a RegExp Record) and returns Boolean. It performs the following steps when called:

  1. rer.[[Unicode]]true または rer.[[UnicodeSets]]true なら
    1. true を返す。
  2. false を返す。

22.2.2.9.3 WordCharacters ( rer )

The abstract operation WordCharacters takes argument rer (a RegExp Record) and returns CharSet. \b, \B, \w, \W のために「word characters」と見なされる文字を含む CharSet を返す。 It performs the following steps when called:

  1. basicWordChars を ASCII の word characters 全てを含む CharSet
  2. extraWordChars を、basicWordChars には含まれないが Canonicalize(rer, c) が basicWordChars に含まれる全ての文字 c を含む CharSet
  3. アサート: HasEitherUnicodeFlag(rer) が true かつ rer.[[IgnoreCase]]true でない限り extraWordChars は空。
  4. basicWordCharsextraWordChars の和集合を返す。

22.2.2.9.4 AllCharacters ( rer )

The abstract operation AllCharacters takes argument rer (a RegExp Record) and returns CharSet. 正規表現フラグに従う「全ての文字」の集合を返す。 It performs the following steps when called:

  1. rer.[[UnicodeSets]]true かつ rer.[[IgnoreCase]]true なら
    1. Simple Case Folding を持たない (scf(c) = c) 全 Unicode コードポイント c を含む CharSet を返す。
  2. それ以外で HasEitherUnicodeFlag(rer) が true なら
    1. 全コードポイント値を含む CharSet を返す。
  3. それ以外
    1. 全コードユニット値を含む CharSet を返す。

22.2.2.9.5 MaybeSimpleCaseFolding ( rer, A )

The abstract operation MaybeSimpleCaseFolding takes arguments rer (a RegExp Record) and A (CharSet) and returns CharSet. rer.[[UnicodeSets]]false または rer.[[IgnoreCase]]false なら A を返す。そうでなければ Simple Case Folding (scf(cp)) の定義 (CaseFolding.txt) を用い、A の各 CharSetElement を文字ごとに正規化して得られる CharSet を返す。 It performs the following steps when called:

  1. rer.[[UnicodeSets]]false または rer.[[IgnoreCase]]false なら A を返す。
  2. B を新しい空の CharSet
  3. A の各 CharSetElement s について
    1. t を空の文字列シーケンス。
    2. s 内の各単一コードポイント cp について
      1. scf(cp) を t に追加。
    3. tB に追加。
  4. B を返す。

22.2.2.9.6 CharacterComplement ( rer, S )

The abstract operation CharacterComplement takes arguments rer (a RegExp Record) and S (CharSet) and returns CharSet. It performs the following steps when called:

  1. AAllCharacters(rer)。
  2. A のうち S に含まれない CharSetElement を含む CharSet を返す。

22.2.2.9.7 UnicodeMatchProperty ( rer, p )

The abstract operation UnicodeMatchProperty takes arguments rer (a RegExp Record) and p (ECMAScript source text) and returns Unicode プロパティ名. It performs the following steps when called:

  1. rer.[[UnicodeSets]]true かつ pTable 69 の「Property name」列にある Unicode property name なら
    1. Unicode コードポイント列 pList を返す。
  2. アサート: pTable 67 または Table 68 の「Property name and aliases」列に列挙される Unicode property name またはエイリアス。
  3. c を対応行の “Canonical property name” 列にある正規 property name
  4. Unicode コードポイント列 cList を返す。

実装は Table 67Table 68Table 69 に列挙される Unicode プロパティ名とエイリアスをサポートしなければならない。相互運用性確保のため、それ以外をサポートしてはならない。

Note 1

例: Script_Extensions (プロパティ名) と scx (エイリアス) は有効だが script_extensionsScx は無効。

Note 2

列挙プロパティは UTS18 RL1.2 要求のスーパーセット。

Note 3

表中の綴り (大小含む) は Unicode Character Database の PropertyAliases.txt の綴りと一致し、その正確な綴りは 安定性が保証 されている。

Table 67: Non-binary Unicode property aliases and their canonical property names
Property name and aliases Canonical property name
General_Category General_Category
gc
Script Script
sc
Script_Extensions Script_Extensions
scx
Table 68: Binary Unicode property aliases and their canonical property names
Property name and aliases Canonical property name
ASCII ASCII
ASCII_Hex_Digit ASCII_Hex_Digit
AHex
Alphabetic Alphabetic
Alpha
Any Any
Assigned Assigned
Bidi_Control Bidi_Control
Bidi_C
Bidi_Mirrored Bidi_Mirrored
Bidi_M
Case_Ignorable Case_Ignorable
CI
Cased Cased
Changes_When_Casefolded Changes_When_Casefolded
CWCF
Changes_When_Casemapped Changes_When_Casemapped
CWCM
Changes_When_Lowercased Changes_When_Lowercased
CWL
Changes_When_NFKC_Casefolded Changes_When_NFKC_Casefolded
CWKCF
Changes_When_Titlecased Changes_When_Titlecased
CWT
Changes_When_Uppercased Changes_When_Uppercased
CWU
Dash Dash
Default_Ignorable_Code_Point Default_Ignorable_Code_Point
DI
Deprecated Deprecated
Dep
Diacritic Diacritic
Dia
Emoji Emoji
Emoji_Component Emoji_Component
EComp
Emoji_Modifier Emoji_Modifier
EMod
Emoji_Modifier_Base Emoji_Modifier_Base
EBase
Emoji_Presentation Emoji_Presentation
EPres
Extended_Pictographic Extended_Pictographic
ExtPict
Extender Extender
Ext
Grapheme_Base Grapheme_Base
Gr_Base
Grapheme_Extend Grapheme_Extend
Gr_Ext
Hex_Digit Hex_Digit
Hex
IDS_Binary_Operator IDS_Binary_Operator
IDSB
IDS_Trinary_Operator IDS_Trinary_Operator
IDST
ID_Continue ID_Continue
IDC
ID_Start ID_Start
IDS
Ideographic Ideographic
Ideo
Join_Control Join_Control
Join_C
Logical_Order_Exception Logical_Order_Exception
LOE
Lowercase Lowercase
Lower
Math Math
Noncharacter_Code_Point Noncharacter_Code_Point
NChar
Pattern_Syntax Pattern_Syntax
Pat_Syn
Pattern_White_Space Pattern_White_Space
Pat_WS
Quotation_Mark Quotation_Mark
QMark
Radical Radical
Regional_Indicator Regional_Indicator
RI
Sentence_Terminal Sentence_Terminal
STerm
Soft_Dotted Soft_Dotted
SD
Terminal_Punctuation Terminal_Punctuation
Term
Unified_Ideograph Unified_Ideograph
UIdeo
Uppercase Uppercase
Upper
Variation_Selector Variation_Selector
VS
White_Space White_Space
space
XID_Continue XID_Continue
XIDC
XID_Start XID_Start
XIDS
Table 69: Binary Unicode properties of strings
Property name
Basic_Emoji
Emoji_Keycap_Sequence
RGI_Emoji_Modifier_Sequence
RGI_Emoji_Flag_Sequence
RGI_Emoji_Tag_Sequence
RGI_Emoji_ZWJ_Sequence
RGI_Emoji

22.2.2.9.8 UnicodeMatchPropertyValue ( p, v )

The abstract operation UnicodeMatchPropertyValue takes arguments p (ECMAScript source text) and v (ECMAScript source text) and returns Unicode プロパティ値. It performs the following steps when called:

  1. アサート: pTable 67 の “Canonical property name” 列に列挙される正規・非エイリアス Unicode プロパティ名
  2. アサート: vPropertyValueAliases.txt に列挙される Unicode プロパティ p のプロパティ値または値エイリアス。
  3. value を対応行の “Canonical property value” 列にある正規プロパティ値。
  4. Unicode コードポイント列 valueList を返す。

実装は Table 67 に列挙されるプロパティについて、PropertyValueAliases.txt に列挙される Unicode プロパティ値および値エイリアスをサポートしなければならない。相互運用性確保のため、それ以外の値・エイリアスをサポートしてはならない。

Note 1

例: XpeoOld_Persian は有効な Script_Extensions 値だが xpeoOld Persian は無効。

Note 2

このアルゴリズムは UAX44 の symbolic 値マッチ規則 と異なり、大小・空白・U+002D (HYPHEN-MINUS)・U+005F (LOW LINE) を無視せず、Is 接頭辞をサポートしない。

22.2.2.10 実行時セマンティクス: CompileClassSetString : 文字列シーケンス

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ClassString :: [empty]
  1. 空の文字列シーケンスを返す。
ClassString :: NonEmptyClassString
  1. NonEmptyClassString の CompileClassSetString (引数 rer) を返す。
NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt
  1. csClassSetCharacter の CompileToCharSet (引数 rer) とする。
  2. s1cs の単一 CharSetElement である文字列シーケンスとする。
  3. NonEmptyClassString が存在するなら
    1. s2NonEmptyClassString の CompileClassSetString (引数 rer)。
    2. s1s2 の連結を返す。
  4. s1 を返す。

22.2.3 RegExp 生成のための抽象操作

22.2.3.1 RegExpCreate ( P, F )

The abstract operation RegExpCreate takes arguments P (ECMAScript 言語値) and F (String または undefined) and returns オブジェクトを含む通常完了または throw 完了. It performs the following steps when called:

  1. obj を ! RegExpAlloc(%RegExp%) とする。
  2. RegExpInitialize(obj, P, F) を返す。

22.2.3.2 RegExpAlloc ( newTarget )

The abstract operation RegExpAlloc takes argument newTarget (constructor) and returns オブジェクトを含む通常完了または throw 完了. It performs the following steps when called:

  1. obj を ? OrdinaryCreateFromConstructor(newTarget, "%RegExp.prototype%", « [[OriginalSource]], [[OriginalFlags]], [[RegExpRecord]], [[RegExpMatcher]] ») とする。
  2. DefinePropertyOrThrow(obj, "lastIndex", PropertyDescriptor { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  3. obj を返す。

22.2.3.3 RegExpInitialize ( obj, pattern, flags )

The abstract operation RegExpInitialize takes arguments obj (オブジェクト), pattern (ECMAScript 言語値), and flags (ECMAScript 言語値) and returns オブジェクトを含む通常完了または throw 完了. It performs the following steps when called:

  1. patternundefined なら P を空文字列とする。
  2. そうでなければ P を ? ToString(pattern) とする。
  3. flagsundefined なら F を空文字列とする。
  4. そうでなければ F を ? ToString(flags) とする。
  5. F"d", "g", "i", "m", "s", "u", "v", "y" 以外のコードユニットを含むか、あるいは同じコードユニットを複数回含むなら SyntaxError 例外を投げる。
  6. F"i" を含むなら itrue、そうでなければ false とする。
  7. F"m" を含むなら mtrue、そうでなければ false とする。
  8. F"s" を含むなら strue、そうでなければ false とする。
  9. F"u" を含むなら utrue、そうでなければ false とする。
  10. F"v" を含むなら vtrue、そうでなければ false とする。
  11. utrue もしくは vtrue の場合
    1. patternText を StringToCodePoints(P) とする。
  12. そうでなければ
    1. patternTextP の各 16-bit 要素を Unicode BMP コードポイントとして解釈した結果とする (UTF-16 デコードは行わない)。
  13. parseResult を ParsePattern(patternText, u, v) とする。
  14. parseResult が空でない SyntaxError オブジェクトの List なら SyntaxError 例外を投げる。
  15. アサート: parseResultPattern パースノードである。
  16. obj.[[OriginalSource]]P を設定する。
  17. obj.[[OriginalFlags]]F を設定する。
  18. capturingGroupsCount を CountLeftCapturingParensWithin(parseResult) とする。
  19. rerRegExp Record { [[IgnoreCase]]: i, [[Multiline]]: m, [[DotAll]]: s, [[Unicode]]: u, [[UnicodeSets]]: v, [[CapturingGroupsCount]]: capturingGroupsCount } とする。
  20. obj.[[RegExpRecord]]rer を設定する。
  21. obj.[[RegExpMatcher]] に 引数 rerparseResult の CompilePattern を設定する。
  22. Set(obj, "lastIndex", +0𝔽, true) を実行する。
  23. obj を返す。

22.2.3.4 静的セマンティクス: ParsePattern ( patternText: Unicode コードポイント列, u: Boolean, v: Boolean, ): パースノードまたは空でない SyntaxError オブジェクト List

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

この節は B.1.2.9 で修正される。

It performs the following steps when called:

  1. vtrue かつ utrue なら
    1. parseResult を 1 個以上の SyntaxError オブジェクトを含む List とする。
  2. そうでなく vtrue なら
    1. parseResult を ParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups]) とする。
  3. そうでなく utrue なら
    1. parseResult を ParseText(patternText, Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups]) とする。
  4. それ以外
    1. parseResult を ParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups]) とする。
  5. parseResult を返す。

22.2.4 RegExp コンストラクター

RegExp コンストラクター:

  • %RegExp% である。
  • グローバルオブジェクト"RegExp" プロパティの初期値である。
  • コンストラクターとして呼び出されたとき新しい RegExp オブジェクトを生成し初期化する。
  • 関数として呼び出された場合、新しい RegExp オブジェクトを返すか、引数が RegExp オブジェクト 1 つのみならその引数自体を返す。
  • クラス定義の extends 句の値として使用できる。指定された RegExp の挙動を継承するサブクラスのコンストラクターは、必要な内部スロットを持つサブクラスインスタンスを生成・初期化するため RegExp コンストラクターへの super 呼び出しを含めなければならない。

22.2.4.1 RegExp ( pattern, flags )

この関数は呼び出し時に以下を行う:

  1. patternIsRegExp を ? IsRegExp(pattern) とする。
  2. NewTarget が undefined なら
    1. newTarget をアクティブな関数オブジェクトとする。
    2. patternIsRegExptrue かつ flagsundefined なら
      1. patternConstructor を ? Get(pattern, "constructor") とする。
      2. SameValue(newTarget, patternConstructor) が true なら pattern を返す。
  3. そうでなければ
    1. newTarget を NewTarget とする。
  4. pattern がオブジェクトで [[RegExpMatcher]] 内部スロットを持つなら
    1. Ppattern.[[OriginalSource]] とする。
    2. flagsundefined なら Fpattern.[[OriginalFlags]] とし、そうでなければ Fflags とする。
  5. そうでなく patternIsRegExptrue なら
    1. P を ? Get(pattern, "source") とする。
    2. flagsundefined なら
      1. F を ? Get(pattern, "flags") とする。
    3. そうでなければ
      1. Fflags とする。
  6. それ以外
    1. Ppattern とする。
    2. Fflags とする。
  7. O を ? RegExpAlloc(newTarget) とする。
  8. RegExpInitialize(O, P, F) を返す。
Note

pattern が StringLiteral で与えられる場合、通常のエスケープシーケンス置換が本関数で処理される前に適用される。pattern がこの関数に認識させるためにエスケープシーケンスを含む必要があるなら、StringLiteral 内で U+005C (REVERSE SOLIDUS) は削除されないようエスケープされなければならない。

22.2.5 RegExp コンストラクターのプロパティ

RegExp コンストラクター:

  • %Function.prototype%[[Prototype]] 内部スロットを持つ。
  • 以下のプロパティを持つ:

22.2.5.1 RegExp.escape ( S )

この関数は、正規表現 Pattern 内で特別な意味を持ち得る文字が等価なエスケープシーケンスに置換された S のコピーを返す。

呼び出し時に以下を行う:

  1. S が String でなければ TypeError 例外を投げる。
  2. escaped を空文字列とする。
  3. cpList を StringToCodePoints(S) とする。
  4. cpList の各コードポイント cp について
    1. escaped が空文字列でかつ cpDecimalDigit または AsciiLetter のいずれかにマッチするなら
      1. 注記: 先頭の数字をエスケープすることで、\0\1 などの DecimalEscape の後で文字列 S をマッチさせる際、前のエスケープシーケンス拡張と解釈されるのを防ぐ。先頭の ASCII 文字も \c の後の文脈で同様。
      2. numericValuecp の数値とする。
      3. hexNumber::toString(𝔽(numericValue), 16) とする。
      4. アサート: hex の長さは 2。
      5. escaped を 0x005C (REVERSE SOLIDUS), "x", hex の連結に設定する。
    2. そうでなければ
      1. escapedescapedEncodeForRegExpEscape(cp) の連結に設定する。
  5. escaped を返す。
Note

名前が類似していても EscapeRegExpPatternRegExp.escape は異なる働きをする。前者はパターンを文字列表現へエスケープし、後者は文字列をパターン内表現のためにエスケープする。

22.2.5.1.1 EncodeForRegExpEscape ( cp )

The abstract operation EncodeForRegExpEscape takes argument cp (コードポイント) and returns String. cp をマッチする Pattern 表現用 String を返す。cp が空白または ASCII 句読文字なら返値はエスケープシーケンス、それ以外は cp 自身の String 表現。 It performs the following steps when called:

  1. cpSyntaxCharacter にマッチするか、cp が U+002F (SOLIDUS) なら
    1. 0x005C (REVERSE SOLIDUS) と UTF16EncodeCodePoint(cp) の連結を返す。
  2. そうでなく cpTable 65 の “Code Point” 列に列挙されるコードポイントなら
    1. 0x005C (REVERSE SOLIDUS) と対応行の “ControlEscape” 列の文字列との連結を返す。
  3. otherPunctuators",-=<>#&!%:;@~'`" とコードユニット 0x0022 (QUOTATION MARK) の連結とする。
  4. toEscape を StringToCodePoints(otherPunctuators) とする。
  5. toEscapecp を含む、または cpWhiteSpace もしくは LineTerminator にマッチする、または cp が先行サロゲートまたは後続サロゲートと同じ数値を持つなら
    1. cpNumcp の数値とする。
    2. cpNum ≤ 0xFF なら
      1. hexNumber::toString(𝔽(cpNum), 16) とする。
      2. 0x005C (REVERSE SOLIDUS), "x", StringPad(hex, 2, "0", start) の連結を返す。
    3. escaped を空文字列とする。
    4. codeUnits を UTF16EncodeCodePoint(cp) とする。
    5. 各コードユニット cu について
      1. escapedescapedUnicodeEscape(cu) の連結にする。
    6. escaped を返す。
  6. UTF16EncodeCodePoint(cp) を返す。

22.2.5.2 RegExp.prototype

RegExp.prototype の初期値は RegExp プロトタイプオブジェクトである。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である。

22.2.5.3 get RegExp [ %Symbol.species% ]

RegExp[%Symbol.species%] は set アクセサが undefinedアクセサプロパティであり、get アクセサは呼び出し時以下を行う:

  1. this 値を返す。

この関数の "name" プロパティ値は "get [Symbol.species]" である。

Note

RegExp プロトタイプメソッドは通常 this 値の constructor を用いて派生オブジェクトを生成する。サブクラスの constructor は %Symbol.species% プロパティを再定義することで既定挙動を上書きできる。

22.2.6 RegExp プロトタイプオブジェクトのプロパティ

RegExp プロトタイプオブジェクト:

  • %RegExp.prototype% である。
  • 通常のオブジェクトである。
  • RegExp インスタンスではなく [[RegExpMatcher]] 内部スロットや他の RegExp インスタンス内部スロットを持たない。
  • [[Prototype]] 内部スロットの値は %Object.prototype% である。
Note

RegExp プロトタイプオブジェクトは自身の "valueOf" プロパティを持たないが、Object プロトタイプオブジェクトから継承する。

22.2.6.1 RegExp.prototype.constructor

RegExp.prototype.constructor の初期値は %RegExp% である。

22.2.6.2 RegExp.prototype.exec ( string )

このメソッドは string 内で正規表現パターンの出現を検索し、マッチ結果を含む Array を返す。マッチしなければ null を返す。

呼び出し時に以下を行う:

  1. Rthis 値とする。
  2. RequireInternalSlot(R, [[RegExpMatcher]]) を実行する。
  3. S を ? ToString(string) とする。
  4. RegExpBuiltinExec(R, S) を返す。

22.2.6.3 get RegExp.prototype.dotAll

RegExp.prototype.dotAll は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値とする。
  2. cu をコードユニット 0x0073 (LATIN SMALL LETTER S) とする。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.4 get RegExp.prototype.flags

RegExp.prototype.flags は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値とする。
  2. R がオブジェクトでなければ TypeError 例外を投げる。
  3. codeUnits を空 List とする。
  4. hasIndicesToBoolean(? Get(R, "hasIndices")) とする。
  5. hasIndicestrue ならコードユニット 0x0064 (LATIN SMALL LETTER D) を codeUnits に追加。
  6. globalToBoolean(? Get(R, "global")) とする。
  7. globaltrue なら 0x0067 (LATIN SMALL LETTER G) を追加。
  8. ignoreCaseToBoolean(? Get(R, "ignoreCase")) とする。
  9. ignoreCasetrue なら 0x0069 (LATIN SMALL LETTER I) を追加。
  10. multilineToBoolean(? Get(R, "multiline")) とする。
  11. multilinetrue なら 0x006D (LATIN SMALL LETTER M) を追加。
  12. dotAllToBoolean(? Get(R, "dotAll")) とする。
  13. dotAlltrue なら 0x0073 (LATIN SMALL LETTER S) を追加。
  14. unicodeToBoolean(? Get(R, "unicode")) とする。
  15. unicodetrue なら 0x0075 (LATIN SMALL LETTER U) を追加。
  16. unicodeSetsToBoolean(? Get(R, "unicodeSets")) とする。
  17. unicodeSetstrue なら 0x0076 (LATIN SMALL LETTER V) を追加。
  18. stickyToBoolean(? Get(R, "sticky")) とする。
  19. stickytrue なら 0x0079 (LATIN SMALL LETTER Y) を追加。
  20. codeUnits の要素をコードユニットとする String 値を返す。要素が無ければ空文字列を返す。

22.2.6.4.1 RegExpHasFlag ( R, codeUnit )

The abstract operation RegExpHasFlag takes arguments R (ECMAScript 言語値) and codeUnit (コードユニット) and returns Boolean または undefined を含む通常完了または throw 完了. It performs the following steps when called:

  1. R がオブジェクトでなければ TypeError 例外。
  2. R[[OriginalFlags]] 内部スロットを持たないなら
    1. SameValue(R, %RegExp.prototype%) が true なら undefined を返す。
    2. そうでなければ TypeError 例外。
  3. flagsR.[[OriginalFlags]] とする。
  4. flagscodeUnit を含むなら true を返す。
  5. false を返す。

22.2.6.5 get RegExp.prototype.global

RegExp.prototype.global は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x0067 (LATIN SMALL LETTER G)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.6 get RegExp.prototype.hasIndices

RegExp.prototype.hasIndices は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x0064 (LATIN SMALL LETTER D)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.7 get RegExp.prototype.ignoreCase

RegExp.prototype.ignoreCase は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x0069 (LATIN SMALL LETTER I)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.8 RegExp.prototype [ %Symbol.match% ] ( string )

このメソッドは呼び出し時以下を行う:

  1. rxthis 値とする。
  2. rx がオブジェクトでなければ TypeError 例外。
  3. S を ? ToString(string) とする。
  4. flags を ? ToString(? Get(rx, "flags" )) とする。
  5. flags"g" を含まなければ
    1. RegExpExec(rx, S) を返す。
  6. そうでなければ
    1. flags"u" または "v" を含むなら fullUnicodetrue、そうでなければ false とする。
    2. Set(rx, "lastIndex", +0𝔽, true) を実行する。
    3. A を ! ArrayCreate(0) とする。
    4. n を 0 とする。
    5. 繰り返し、
      1. result を ? RegExpExec(rx, S) とする。
      2. resultnull なら
        1. n = 0 なら null を返す。
        2. A を返す。
      3. そうでなければ
        1. matchStr を ? ToString(? Get(result, "0" )) とする。
        2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), matchStr) を実行。
        3. matchStr が空文字列なら
          1. thisIndex(? ToLength(? Get(rx, "lastIndex"))) とする。
          2. nextIndexAdvanceStringIndex(S, thisIndex, fullUnicode) とする。
          3. Set(rx, "lastIndex", 𝔽(nextIndex), true) を実行。
        4. nn + 1 にする。

このメソッドの "name" プロパティ値は "[Symbol.match]" である。

Note

%Symbol.match% プロパティは IsRegExp 抽象操作が正規表現基本挙動を持つオブジェクトを識別するのに用いられる。%Symbol.match% が存在しないか、その値が真へ強制されない場合、そのオブジェクトは正規表現オブジェクトとして意図されない。

22.2.6.9 RegExp.prototype [ %Symbol.matchAll% ] ( string )

このメソッドは呼び出し時以下を行う:

  1. Rthis 値とする。
  2. R がオブジェクトでなければ TypeError 例外。
  3. S を ? ToString(string) とする。
  4. C を ? SpeciesConstructor(R, %RegExp%) とする。
  5. flags を ? ToString(? Get(R, "flags" )) とする。
  6. matcher を ? Construct(C, « R, flags ») とする。
  7. lastIndex を ? ToLength(? Get(R, "lastIndex" )) とする。
  8. Set(matcher, "lastIndex", lastIndex, true) を実行。
  9. flags"g" を含むなら globaltrue、そうでなければ false
  10. flags"u" または "v" を含むなら fullUnicodetrue、そうでなければ false
  11. CreateRegExpStringIterator(matcher, S, global, fullUnicode) を返す。

このメソッドの "name" プロパティ値は "[Symbol.matchAll]" である。

22.2.6.10 get RegExp.prototype.multiline

RegExp.prototype.multiline は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x006D (LATIN SMALL LETTER M)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.11 RegExp.prototype [ %Symbol.replace% ] ( string, replaceValue )

このメソッドは呼び出し時以下を行う:

  1. rxthis 値とする。
  2. rx がオブジェクトでなければ TypeError 例外。
  3. S を ? ToString(string) とする。
  4. lengthSS の長さとする。
  5. functionalReplaceIsCallable(replaceValue) とする。
  6. functionalReplacefalse なら
    1. replaceValue を ? ToString(replaceValue) とする。
  7. flags を ? ToString(? Get(rx, "flags" )) とする。
  8. flags"g" を含むなら globaltrue、そうでなければ false
  9. globaltrue なら
    1. Set(rx, "lastIndex", +0𝔽, true) を実行。
  10. results を空 List とする。
  11. donefalse とする。
  12. donefalse の間繰り返し、
    1. result を ? RegExpExec(rx, S) とする。
    2. resultnull なら
      1. donetrue にする。
    3. そうでなければ
      1. resultresults に追加。
      2. globalfalse なら
        1. donetrue にする。
      3. そうでなければ
        1. matchStr を ? ToString(? Get(result, "0" )) とする。
        2. matchStr が空文字列なら
          1. thisIndex(? ToLength(? Get(rx, "lastIndex"))) とする。
          2. flags"u" または "v" を含むなら fullUnicodetrue、そうでなければ false
          3. nextIndexAdvanceStringIndex(S, thisIndex, fullUnicode) とする。
          4. Set(rx, "lastIndex", 𝔽(nextIndex), true) を実行。
  13. accumulatedResult を空文字列。
  14. nextSourcePosition を 0。
  15. resultresults について
    1. resultLength を ? LengthOfArrayLike(result)。
    2. nCapturesmax(resultLength - 1, 0)。
    3. matched を ? ToString(? Get(result, "0" ))。
    4. matchLengthmatched の長さ。
    5. position を ? ToIntegerOrInfinity(? Get(result, "index" ))。
    6. position を 0 と lengthS の間にクランプ。
    7. captures を新しい空 List
    8. n を 1。
    9. nnCaptures の間繰り返し、
      1. capN を ? Get(result, ! ToString(𝔽(n)))。
      2. capNundefined でなければ
        1. capN を ? ToString(capN)。
      3. capNcaptures に追加。
      4. 注記: n = 1 のとき最初のキャプチャが captures[0] に入る。一般に n 番目のキャプチャは captures[n - 1]。
      5. nn + 1。
    10. namedCaptures を ? Get(result, "groups")。
    11. functionalReplacetrue なら
      1. replacerArgs を « matched » と captures と « 𝔽(position), S » のリスト連結とする。
      2. namedCapturesundefined でなければ
        1. replacerArgsnamedCaptures を追加。
      3. replacementValue を ? Call(replaceValue, undefined, replacerArgs)。
      4. replacementString を ? ToString(replacementValue)。
    12. そうでなければ
      1. namedCapturesundefined でなければ
        1. namedCaptures を ? ToObject(namedCaptures)。
      2. replacementString を ? GetSubstitution(matched, S, position, captures, namedCaptures, replaceValue)。
    13. positionnextSourcePosition なら
      1. 注記: position が後退するのは通常想定外であり、不正な RegExp サブクラス動作や副作用でフラグ等を変更した兆候である。その場合対応置換は無視される。
      2. accumulatedResultaccumulatedResultSnextSourcePosition から position まで、および replacementString の連結にする。
      3. nextSourcePositionposition + matchLength にする。
  16. nextSourcePositionlengthS なら accumulatedResult を返す。
  17. accumulatedResultSnextSourcePosition から末尾までの部分文字列の連結を返す。

このメソッドの "name" プロパティ値は "[Symbol.replace]" である。

22.2.6.12 RegExp.prototype [ %Symbol.search% ] ( string )

このメソッドは呼び出し時以下を行う:

  1. rxthis 値。
  2. rx がオブジェクトでなければ TypeError 例外。
  3. S を ? ToString(string)。
  4. previousLastIndex を ? Get(rx, "lastIndex" )。
  5. previousLastIndex+0𝔽 でなければ
    1. Set(rx, "lastIndex", +0𝔽, true) を実行。
  6. result を ? RegExpExec(rx, S)。
  7. currentLastIndex を ? Get(rx, "lastIndex" )。
  8. SameValue(currentLastIndex, previousLastIndex) が false なら
    1. Set(rx, "lastIndex", previousLastIndex, true) を実行。
  9. resultnull なら -1𝔽 を返す。
  10. Get(result, "index") を返す。

このメソッドの "name" プロパティ値は "[Symbol.search]" である。

Note

検索時この RegExp オブジェクトの "lastIndex""global" プロパティは無視される。"lastIndex" は変更されない。

22.2.6.13 get RegExp.prototype.source

RegExp.prototype.source は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. R がオブジェクトでなければ TypeError 例外。
  3. R[[OriginalSource]] 内部スロットを持たないなら
    1. SameValue(R, %RegExp.prototype%) が true なら "(?:)" を返す。
    2. そうでなければ TypeError 例外。
  4. アサート: R[[OriginalFlags]] 内部スロットを持つ。
  5. srcR.[[OriginalSource]]
  6. flagsR.[[OriginalFlags]]
  7. EscapeRegExpPattern(src, flags) を返す。

22.2.6.13.1 EscapeRegExpPattern ( P, F )

The abstract operation EscapeRegExpPattern takes arguments P (String) and F (String) and returns String. It performs the following steps when called:

  1. F"v" を含むなら
    1. patternSymbolPattern[+UnicodeMode, +UnicodeSetsMode] とする。
  2. そうでなく F"u" を含むなら
    1. patternSymbolPattern[+UnicodeMode, ~UnicodeSetsMode] とする。
  3. それ以外
    1. patternSymbolPattern[~UnicodeMode, ~UnicodeSetsMode] とする。
  4. S を、特定コードポイントが下記のようにエスケープされた、P (UTF-16 エンコードされた Unicode コードポイントと解釈) に等価な patternSymbol 形式の String とする。SP と同一である場合と異なる場合があるが、SpatternSymbol として評価して得られる抽象クロージャは生成オブジェクトの [[RegExpMatcher]] 内部スロットの抽象クロージャと同一に振る舞わなければならない。同じ P, F での複数回呼び出しは同一結果を生成しなければならない。
  5. パターンに現れる / または任意の LineTerminator コードポイントは、"/", S, "/", F の連結が (適切な字句文脈で) 同一に振る舞う RegularExpressionLiteral としてパース可能となるよう S 内で必要に応じエスケープされる。例: P"/" の場合 S"\/""\u002F" 等が許されるが "/" は不可 ( /// + FSingleLineComment と解釈されるため )。 P が空文字列なら S"(?:)" として要件を満たせる。
  6. S を返す。
Note

名前が類似していても RegExp.escape と EscapeRegExpPattern は異なる。前者は文字列をパターン内部表現用にエスケープし、後者はパターンを文字列表現用にエスケープする。

22.2.6.14 RegExp.prototype [ %Symbol.split% ] ( string, limit )

Note 1

このメソッドは string を String に変換した結果の部分文字列を格納した配列を返す。部分文字列this 値である正規表現のマッチを左から右に探索して決定され、マッチ位置自体は結果配列要素には含まれず文字列を区切る役割をする。

this 値は空の正規表現、または空文字列にマッチする正規表現であり得る。その場合、入力文字列の先頭・末尾、前の区切りマッチ末尾における空 substring にはマッチしない。(例: 正規表現が空文字列にマッチするなら文字列は各コードユニット要素に分割され、結果配列長は文字列長に等しく、各 substring は 1 コードユニット。)あるインデックスで考慮されるマッチは最初の一つのみで、バックトラッキングにより非空マッチが得られても再考しない。(例: /a*?/[Symbol.split]("ab")["a","b"]/a*/[Symbol.split]("ab")["","b"]。)

string が(または変換後)空文字列の場合、正規表現が空文字列にマッチ可能かどうかで結果が異なる。マッチ可能なら結果配列は空、そうでなければ空文字列 1 要素を含む。

正規表現が捕捉括弧を含むとき、separator がマッチする毎にその結果(undefined を含む)が出力配列に挿入される。例:

/<(\/)?([^<>]+)>/[Symbol.split]("A<B>bold</B>and<CODE>coded</CODE>")

は配列

["A", undefined, "B", "bold", "/", "B", "and", undefined, "CODE", "coded", "/", "CODE", ""]

を生成する。

limitundefined でなければ、出力配列は limit 要素を超えないよう切り詰められる。

このメソッドは呼び出し時以下を行う:

  1. rxthis 値。
  2. rx がオブジェクトでなければ TypeError 例外。
  3. S を ? ToString(string)。
  4. C を ? SpeciesConstructor(rx, %RegExp%)。
  5. flags を ? ToString(? Get(rx, "flags" ))。
  6. flags"u" または "v" を含むなら unicodeMatchingtrue、そうでなければ false
  7. flags"y" を含むなら newFlagsflags、そうでなければ newFlagsflags"y" の連結とする。
  8. splitter を ? Construct(C, « rx, newFlags »)。
  9. A を ! ArrayCreate(0)。
  10. lengthA を 0。
  11. limitundefined なら lim を 232 - 1、そうでなければ (? ToUint32(limit))。
  12. lim = 0 なら A を返す。
  13. S が空文字列なら
    1. z を ? RegExpExec(splitter, S)。
    2. znull でなければ A を返す。
    3. CreateDataPropertyOrThrow(A, "0", S)。
    4. A を返す。
  14. sizeS の長さ。
  15. p を 0。
  16. qp
  17. q < size の間繰り返し、
    1. Set(splitter, "lastIndex", 𝔽(q), true)。
    2. z を ? RegExpExec(splitter, S)。
    3. znull なら
      1. qAdvanceStringIndex(S, q, unicodeMatching) とする。
    4. そうでなければ
      1. e(? ToLength(? Get(splitter, "lastIndex")))。
      2. emin(e, size)。
      3. e = p なら
        1. qAdvanceStringIndex(S, q, unicodeMatching)。
      4. そうでなければ
        1. TSp から q部分文字列
        2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), T)。
        3. lengthAlengthA + 1。
        4. lengthA = lim なら A を返す。
        5. pe
        6. numberOfCaptures を ? LengthOfArrayLike(z)。
        7. numberOfCapturesmax(numberOfCaptures - 1, 0)。
        8. i を 1。
        9. inumberOfCaptures の間繰り返し、
          1. nextCapture を ? Get(z, ! ToString(𝔽(i)))。
          2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), nextCapture)。
          3. ii + 1。
          4. lengthAlengthA + 1。
          5. lengthA = lim なら A を返す。
        10. qp に設定。
  18. TSp から size部分文字列
  19. CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), T)。
  20. A を返す。

このメソッドの "name" プロパティ値は "[Symbol.split]" である。

Note 2

このメソッドは RegExp オブジェクトの "global" および "sticky" プロパティ値を無視する。

22.2.6.15 get RegExp.prototype.sticky

RegExp.prototype.sticky は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x0079 (LATIN SMALL LETTER Y)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.16 RegExp.prototype.test ( S )

このメソッドは呼び出し時以下を行う:

  1. Rthis 値。
  2. R がオブジェクトでなければ TypeError 例外。
  3. string を ? ToString(S)。
  4. match を ? RegExpExec(R, string)。
  5. matchnull でなければ true、そうでなければ false を返す。

22.2.6.17 RegExp.prototype.toString ( )

  1. Rthis 値。
  2. R がオブジェクトでなければ TypeError 例外。
  3. pattern を ? ToString(? Get(R, "source" ))。
  4. flags を ? ToString(? Get(R, "flags" ))。
  5. result"/", pattern, "/", flags の連結とする。
  6. result を返す。
Note

返される String は RegularExpressionLiteral の形式であり、同じ挙動の別 RegExp オブジェクトを評価する。

22.2.6.18 get RegExp.prototype.unicode

RegExp.prototype.unicode は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x0075 (LATIN SMALL LETTER U)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.6.19 get RegExp.prototype.unicodeSets

RegExp.prototype.unicodeSets は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Rthis 値。
  2. cu を 0x0076 (LATIN SMALL LETTER V)。
  3. RegExpHasFlag(R, cu) を返す。

22.2.7 RegExp マッチングのための抽象操作

22.2.7.1 RegExpExec ( R, S )

The abstract operation RegExpExec takes arguments R (オブジェクト) and S (String) and returns オブジェクトまたは null を含む通常完了、または throw 完了. It performs the following steps when called:

  1. exec を ? Get(R, "exec") とする。
  2. IsCallable(exec) が true なら
    1. result を ? Call(exec, R, « S ») とする。
    2. result がオブジェクトでも null でもなければ TypeError 例外。
    3. result を返す。
  3. RequireInternalSlot(R, [[RegExpMatcher]]) を実行。
  4. RegExpBuiltinExec(R, S) を返す。
Note

呼び出し可能な "exec" プロパティが見つからない場合、このアルゴリズムは組み込み正規表現マッチングアルゴリズムにフォールバックする。これは過去版でほとんどの組み込みアルゴリズムが "exec" の動的プロパティ参照を行わなかったコードとの互換性を提供する。

22.2.7.2 RegExpBuiltinExec ( R, S )

The abstract operation RegExpBuiltinExec takes arguments R (初期化済み RegExp インスタンス) and S (String) and returns Array エキゾチックオブジェクトまたは null を含む通常完了、または throw 完了. It performs the following steps when called:

  1. lengthS の長さ。
  2. lastIndex(? ToLength(! Get(R, "lastIndex" )))。
  3. flagsR.[[OriginalFlags]]
  4. flags"g" を含むなら globaltrue、そうでなければ false
  5. flags"y" を含むなら stickytrue、そうでなければ false
  6. flags"d" を含むなら hasIndicestrue、そうでなければ false
  7. globalfalse かつ stickyfalse なら lastIndex を 0 に設定。
  8. matcherR.[[RegExpMatcher]]
  9. flags"u" または "v" を含むなら fullUnicodetrue、そうでなければ false
  10. matchSucceededfalse
  11. fullUnicodetrue なら input を StringToCodePoints(S)、そうでなければ inputS のコードユニット列 List とする。
  12. 注記: input の各要素は文字と見なす。
  13. matchSucceededfalse の間繰り返し、
    1. lastIndex > length なら
      1. global または stickytrue なら
        1. Set(R, "lastIndex", +0𝔽, true) を実行。
      2. null を返す。
    2. inputIndexSlastIndex 番目要素から得た文字の input 内インデックスとする。
    3. rmatcher(input, inputIndex) とする。
    4. rfailure なら
      1. stickytrue なら
        1. Set(R, "lastIndex", +0𝔽, true)。
        2. null を返す。
      2. lastIndexAdvanceStringIndex(S, lastIndex, fullUnicode) に設定。
    5. そうでなければ
      1. アサート: rMatchState
      2. matchSucceededtrue にする。
  14. er.[[EndIndex]]
  15. fullUnicodetrue なら eGetStringIndex(S, e) に設定。
  16. global または stickytrue なら
    1. Set(R, "lastIndex", 𝔽(e), true)。
  17. nr.[[Captures]] の要素数。
  18. アサート: n = R.[[RegExpRecord]].[[CapturingGroupsCount]]
  19. アサート: n < 232 - 1。
  20. A を ! ArrayCreate(n + 1)。
  21. アサート: A."length" の数学的値は n + 1。
  22. CreateDataPropertyOrThrow(A, "index", 𝔽(lastIndex))。
  23. CreateDataPropertyOrThrow(A, "input", S)。
  24. matchMatch Record { [[StartIndex]]: lastIndex, [[EndIndex]]: e }。
  25. indices を空 List
  26. groupNames を空 List
  27. indicesmatch を追加。
  28. matchedSubstrGetMatchString(S, match)。
  29. CreateDataPropertyOrThrow(A, "0", matchedSubstr)。
  30. RGroupName を含むなら
    1. groupsOrdinaryObjectCreate(null)。
    2. hasGroupstrue
  31. そうでなければ
    1. groupsundefined
    2. hasGroupsfalse
  32. CreateDataPropertyOrThrow(A, "groups", groups)。
  33. matchedGroupNames を空 List
  34. 1 ≤ in を昇順で各 i について
    1. captureIr.[[Captures]]i 番目要素。
    2. captureIundefined なら
      1. capturedValueundefined
      2. indicesundefined を追加。
    3. そうでなければ
      1. captureStartcaptureI.[[StartIndex]]
      2. captureEndcaptureI.[[EndIndex]]
      3. fullUnicodetrue なら
        1. captureStartGetStringIndex(S, captureStart)。
        2. captureEndGetStringIndex(S, captureEnd)。
      4. captureMatch Record { [[StartIndex]]: captureStart, [[EndIndex]]: captureEnd }。
      5. capturedValueGetMatchString(S, capture)。
      6. indicescapture を追加。
    4. CreateDataPropertyOrThrow(A, ! ToString(𝔽(i)), capturedValue)。
    5. i 番目のキャプチャが GroupName で定義されているなら
      1. s をその GroupName の CapturingGroupName とする。
      2. matchedGroupNamess を含むなら
        1. アサート: capturedValueundefined
        2. groupNamesundefined を追加。
      3. そうでなければ
        1. capturedValueundefined でなければ smatchedGroupNames に追加。
        2. 注記: 同名グループが複数ある場合 groups に既に s プロパティが存在することがあるが、すべて可書きデータプロパティなので CreateDataPropertyOrThrow は成功する。
        3. CreateDataPropertyOrThrow(groups, s, capturedValue)。
        4. groupNamess を追加。
    6. そうでなければ
      1. groupNamesundefined を追加。
  35. hasIndicestrue なら
    1. indicesArrayMakeMatchIndicesIndexPairArray(S, indices, groupNames, hasGroups) とする。
    2. CreateDataPropertyOrThrow(A, "indices", indicesArray)。
  36. A を返す。

22.2.7.3 AdvanceStringIndex ( S, index, unicode )

The abstract operation AdvanceStringIndex takes arguments S (String), index (非負整数), and unicode (Boolean) and returns 整数. It performs the following steps when called:

  1. アサート: index ≤ 253 - 1。
  2. unicodefalse なら index + 1 を返す。
  3. lengthS の長さ。
  4. index + 1 ≥ length なら index + 1 を返す。
  5. cp を CodePointAt(S, index)。
  6. index + cp.[[CodeUnitCount]] を返す。

22.2.7.4 GetStringIndex ( S, codePointIndex )

The abstract operation GetStringIndex takes arguments S (String) and codePointIndex (非負整数) and returns 非負整数. S を UTF-16 エンコードされたコードポイント列として解釈し (6.1.4)、codePointIndex に対応するコードユニットインデックスが存在すればそれを返し、存在しなければ S の長さを返す。 It performs the following steps when called:

  1. S が空文字列なら 0 を返す。
  2. lenS の長さ。
  3. codeUnitCount を 0。
  4. codePointCount を 0。
  5. codeUnitCount < len の間繰り返し、
    1. codePointCount = codePointIndex なら codeUnitCount を返す。
    2. cp を CodePointAt(S, codeUnitCount)。
    3. codeUnitCountcodeUnitCount + cp.[[CodeUnitCount]] に。
    4. codePointCountcodePointCount + 1 に。
  6. len を返す。

22.2.7.5 Match レコード

Match Record は正規表現のマッチまたはキャプチャの開始・終了インデックスを保持する Record 値である。

Match Record は Table 70 に列挙するフィールドを持つ。

Table 70: Match Record Fields
Field Name Value Meaning
[[StartIndex]] 非負整数 マッチ開始位置 (含む) までのコードユニット数。
[[EndIndex]] [[StartIndex]] 以上の整数 マッチ終了位置 (含まない) までのコードユニット数。

22.2.7.6 GetMatchString ( S, match )

The abstract operation GetMatchString takes arguments S (String) and match (Match Record) and returns String. It performs the following steps when called:

  1. アサート: match.[[StartIndex]]match.[[EndIndex]]S の長さ。
  2. Smatch.[[StartIndex]] から match.[[EndIndex]] までの部分文字列を返す。

22.2.7.7 GetMatchIndexPair ( S, match )

The abstract operation GetMatchIndexPair takes arguments S (String) and match (Match Record) and returns Array. It performs the following steps when called:

  1. アサート: match.[[StartIndex]]match.[[EndIndex]]S の長さ。
  2. CreateArrayFromList𝔽(match.[[StartIndex]]), 𝔽(match.[[EndIndex]]) ») を返す。

22.2.7.8 MakeMatchIndicesIndexPairArray ( S, indices, groupNames, hasGroups )

The abstract operation MakeMatchIndicesIndexPairArray takes arguments S (String), indices (Match Record または undefinedList), groupNames (String または undefinedList), and hasGroups (Boolean) and returns Array. It performs the following steps when called:

  1. nindices の要素数。
  2. アサート: n < 232 - 1。
  3. アサート: groupNamesn - 1 要素を持つ。
  4. 注記: groupNames の要素は indices[1] から整列。
  5. A を ! ArrayCreate(n)。
  6. hasGroupstrue なら
    1. groupsOrdinaryObjectCreate(null)。
  7. そうでなければ
    1. groupsundefined
  8. CreateDataPropertyOrThrow(A, "groups", groups)。
  9. 0 ≤ i < n を昇順で各 i について
    1. matchIndicesindices[i]。
    2. matchIndicesundefined でなければ
      1. matchIndexPairGetMatchIndexPair(S, matchIndices)。
    3. そうでなければ
      1. matchIndexPairundefined
    4. CreateDataPropertyOrThrow(A, ! ToString(𝔽(i)), matchIndexPair)。
    5. i > 0 なら
      1. sgroupNames[i - 1]。
      2. sundefined でなければ
        1. アサート: groupsundefined でない。
        2. 注記: 同名グループが複数ある場合でも groups通常オブジェクトなので再作成は成功する。
        3. CreateDataPropertyOrThrow(groups, s, matchIndexPair)。
  10. A を返す。

22.2.8 RegExp インスタンスのプロパティ

RegExp インスタンスは RegExp プロトタイプオブジェクトからプロパティを継承する通常オブジェクトである。RegExp インスタンスは内部スロット [[OriginalSource]], [[OriginalFlags]], [[RegExpRecord]], [[RegExpMatcher]] を持つ。[[RegExpMatcher]] 内部スロットの値は RegExp オブジェクトの Pattern の抽象クロージャ表現である。

Note

ECMAScript 2015 以前は RegExp インスタンスは独自データプロパティ "source", "global", "ignoreCase", "multiline" を持つと規定されていた。これらは現在 RegExp.prototypeアクセサプロパティとして規定される。

RegExp インスタンスは次のプロパティも持つ:

22.2.8.1 lastIndex

"lastIndex" プロパティの値は次のマッチを開始する String インデックスを指定する。使用時に整数 Number へ強制される (22.2.7.2 参照)。属性は { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } とする。

22.2.9 RegExp 文字列イテレータオブジェクト

RegExp String Iterator は、特定の RegExp インスタンスオブジェクトに対して、特定の String インスタンスオブジェクト上の反復処理を表すオブジェクトである。RegExp String Iterator オブジェクトに対する名前付きコンストラクターは存在しない。代わりに、RegExp インスタンスオブジェクトの特定メソッド呼び出しによって生成される。

22.2.9.1 CreateRegExpStringIterator ( R, S, global, fullUnicode )

The abstract operation CreateRegExpStringIterator takes arguments R (オブジェクト), S (String), global (Boolean), and fullUnicode (Boolean) and returns オブジェクト. It performs the following steps when called:

  1. iteratorOrdinaryObjectCreate(%RegExpStringIteratorPrototype%, « [[IteratingRegExp]], [[IteratedString]], [[Global]], [[Unicode]], [[Done]] ») とする。
  2. iterator.[[IteratingRegExp]]R を設定する。
  3. iterator.[[IteratedString]]S を設定する。
  4. iterator.[[Global]]global を設定する。
  5. iterator.[[Unicode]]fullUnicode を設定する。
  6. iterator.[[Done]]false を設定する。
  7. iterator を返す。

22.2.9.2 %RegExpStringIteratorPrototype% オブジェクト

%RegExpStringIteratorPrototype% オブジェクト:

  • 全ての RegExp String Iterator オブジェクトに継承されるプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]] 内部スロットの値は %Iterator.prototype% である。
  • 以下のプロパティを持つ:

22.2.9.2.1 %RegExpStringIteratorPrototype%.next ( )

  1. Othis 値とする。
  2. O がオブジェクトでなければ TypeError 例外を投げる。
  3. ORegExp String Iterator Object Instance の全内部スロット(22.2.9.3 参照)を持たなければ TypeError 例外を投げる。
  4. O.[[Done]]true なら
    1. CreateIteratorResultObject(undefined, true) を返す。
  5. RO.[[IteratingRegExp]] とする。
  6. SO.[[IteratedString]] とする。
  7. globalO.[[Global]] とする。
  8. fullUnicodeO.[[Unicode]] とする。
  9. match を ? RegExpExec(R, S) とする。
  10. matchnull なら
    1. O.[[Done]]true を設定する。
    2. CreateIteratorResultObject(undefined, true) を返す。
  11. globalfalse なら
    1. O.[[Done]]true を設定する。
    2. CreateIteratorResultObject(match, false) を返す。
  12. matchStr を ? ToString(? Get(match, "0" )) とする。
  13. matchStr が空文字列なら
    1. thisIndex(? ToLength(? Get(R, "lastIndex"))) とする。
    2. nextIndexAdvanceStringIndex(S, thisIndex, fullUnicode) とする。
    3. Set(R, "lastIndex", 𝔽(nextIndex), true) を実行する。
  14. CreateIteratorResultObject(match, false) を返す。

22.2.9.2.2 %RegExpStringIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "RegExp String Iterator" である。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } である。

22.2.9.3 RegExp String Iterator インスタンスのプロパティ

RegExp String Iterator インスタンスは %RegExpStringIteratorPrototype% 組込みオブジェクトからプロパティを継承する通常オブジェクトである。RegExp String Iterator インスタンスは初期化時に Table 71 に列挙された内部スロットを持つ。

Table 71: RegExp String Iterator インスタンスの内部スロット
Internal Slot Type Description
[[IteratingRegExp]] an Object 反復に使用される正規表現。IsRegExp([[IteratingRegExp]]) は初期状態で true
[[IteratedString]] a String 反復対象となる String 値。
[[Global]] a Boolean [[IteratingRegExp]] が global かどうかを示す。
[[Unicode]] a Boolean [[IteratingRegExp]] が Unicode モードかどうかを示す。
[[Done]] a Boolean 反復処理が完了しているかどうかを示す。

23 インデックス付きコレクション

23.1 Array オブジェクト

配列 (Array) は特定種類のプロパティ名に特別な扱いを与えるエキゾチックオブジェクトである。この特別扱いの定義については 10.4.2 を参照。

23.1.1 Array コンストラクター

Array コンストラクター:

  • %Array% である。
  • グローバルオブジェクト"Array" プロパティの初期値である。
  • コンストラクターとして呼び出されたとき新しい Array を生成し初期化する。
  • 関数として(コンストラクターではなく)呼び出された場合も新しい Array を生成し初期化する。従って関数呼び出し Array(…) は、同じ引数のオブジェクト生成式 new Array(…) と等価である。
  • その振る舞いが引数の個数と型に依存して変化する関数である。
  • クラス定義の extends 句の値として利用できる。エキゾチック Array の挙動を継承することを意図したサブクラスコンストラクターは、サブクラスインスタンス(Array エキゾチックオブジェクト)を初期化するために Array コンストラクターへの super 呼び出しを含めなければならない。ただし、Array.prototype のメソッドの多くは this 値が Array エキゾチックオブジェクトであることに依存しない汎用メソッドである。

23.1.1.1 Array ( ...values )

この関数は呼び出し時に以下の手順を実行する:

  1. NewTarget が undefined なら newTarget をアクティブな関数オブジェクトとし;そうでなければ newTarget を NewTarget とする。
  2. proto を ? GetPrototypeFromConstructor(newTarget, "%Array.prototype%") とする。
  3. numberOfArgsvalues の要素数とする。
  4. numberOfArgs = 0 なら
    1. ArrayCreate(0, proto) を返す。
  5. そうでなく numberOfArgs = 1 なら
    1. lenvalues[0] とする。
    2. array を ! ArrayCreate(0, proto) とする。
    3. len が Number でなければ
      1. CreateDataPropertyOrThrow(array, "0", len) を実行。
      2. intLen1𝔽 とする。
    4. そうでなければ
      1. intLen を ! ToUint32(len) とする。
      2. SameValueZero(intLen, len) が false なら RangeError 例外を投げる。
    5. Set(array, "length", intLen, true) を実行。
    6. array を返す。
  6. それ以外の場合
    1. アサート: numberOfArgs ≥ 2.
    2. array を ? ArrayCreate(numberOfArgs, proto) とする。
    3. k を 0 とする。
    4. k < numberOfArgs の間繰り返し、
      1. Pk を ! ToString(𝔽(k)) とする。
      2. itemKvalues[k] とする。
      3. CreateDataPropertyOrThrow(array, Pk, itemK) を実行。
      4. kk + 1 にする。
    5. アサート: array"length" プロパティの数学的値は numberOfArgs である。
    6. array を返す。

23.1.2 Array コンストラクターのプロパティ

Array コンストラクター:

  • %Function.prototype% を持つ [[Prototype]] 内部スロットを有する。
  • 1𝔽"length" プロパティを持つ。
  • 以下のプロパティを持つ:

23.1.2.1 Array.from ( items [ , mapper [ , thisArg ] ] )

このメソッドは呼び出し時に以下を実行する:

  1. Cthis 値とする。
  2. mapperundefined なら
    1. mappingfalse とする。
  3. そうでなければ
    1. IsCallable(mapper) が false なら TypeError 例外を投げる。
    2. mappingtrue とする。
  4. usingIterator を ? GetMethod(items, %Symbol.iterator%) とする。
  5. usingIteratorundefined でなければ
    1. IsConstructor(C) が true なら
      1. A を ? Construct(C) とする。
    2. そうでなければ
      1. A を ! ArrayCreate(0) とする。
    3. iteratorRecord を ? GetIteratorFromMethod(items, usingIterator) とする。
    4. k を 0 とする。
    5. 繰り返し、
      1. k ≥ 253 - 1 なら
        1. errorThrowCompletion(新規 TypeError オブジェクト) とする。
        2. IteratorClose(iteratorRecord, error) を返す。
      2. Pk を ! ToString(𝔽(k)) とする。
      3. next を ? IteratorStepValue(iteratorRecord) とする。
      4. nextdone なら
        1. Set(A, "length", 𝔽(k), true) を実行。
        2. A を返す。
      5. mappingtrue なら
        1. mappedValueCompletion(Call(mapper, thisArg, « next, 𝔽(k) »)) とする。
        2. IfAbruptCloseIterator(mappedValue, iteratorRecord)。
      6. そうでなければ
        1. mappedValuenext とする。
      7. defineStatusCompletion(CreateDataPropertyOrThrow(A, Pk, mappedValue)) とする。
      8. IfAbruptCloseIterator(defineStatus, iteratorRecord)。
      9. kk + 1 にする。
  6. 注記: itemsiterable ではないので配列ライクオブジェクトとみなす。
  7. arrayLike を ! ToObject(items) とする。
  8. len を ? LengthOfArrayLike(arrayLike) とする。
  9. IsConstructor(C) が true なら
    1. A を ? Construct(C, « 𝔽(len) ») とする。
  10. そうでなければ
    1. A を ? ArrayCreate(len) とする。
  11. k を 0 にする。
  12. k < len の間繰り返し、
    1. Pk を ! ToString(𝔽(k)) とする。
    2. kValue を ? Get(arrayLike, Pk) とする。
    3. mappingtrue なら
      1. mappedValue を ? Call(mapper, thisArg, « kValue, 𝔽(k) ») とする。
    4. そうでなければ
      1. mappedValuekValue とする。
    5. CreateDataPropertyOrThrow(A, Pk, mappedValue) を実行。
    6. kk + 1 にする。
  13. Set(A, "length", 𝔽(len), true) を実行。
  14. A を返す。
Note

このメソッドは意図的に汎用のファクトリメソッドであり、this 値が Array コンストラクターであることを要求しない。そのため単一の数値引数で呼び出され得る他のコンストラクターに転用または継承できる。

23.1.2.2 Array.isArray ( arg )

この関数は呼び出し時に以下を実行する:

  1. IsArray(arg) を返す。

23.1.2.3 Array.of ( ...items )

このメソッドは呼び出し時に以下を実行する:

  1. lenitems の要素数とする。
  2. lenNumber𝔽(len) とする。
  3. Cthis 値とする。
  4. IsConstructor(C) が true なら
    1. A を ? Construct(C, « lenNumber ») とする。
  5. そうでなければ
    1. A を ? ArrayCreate(len) とする。
  6. k を 0。
  7. k < len の間繰り返し、
    1. kValueitems[k] とする。
    2. Pk を ! ToString(𝔽(k)) とする。
    3. CreateDataPropertyOrThrow(A, Pk, kValue) を実行。
    4. kk + 1。
  8. Set(A, "length", lenNumber, true) を実行。
  9. A を返す。
Note

このメソッドは意図的に汎用のファクトリメソッドであり、this 値が Array コンストラクターであることを要求しない。そのため単一の数値引数で呼び出され得る他のコンストラクターへ転用または継承できる。

23.1.2.4 Array.prototype

Array.prototype の値は Array プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

23.1.2.5 get Array [ %Symbol.species% ]

Array[%Symbol.species%] は set アクセサ関数が undefinedアクセサプロパティであり、その get アクセサは以下を行う:

  1. this 値を返す。

この関数の "name" プロパティの値は "get [Symbol.species]" である。

Note

Array プロトタイプメソッドは通常、その this 値の constructor を使って派生オブジェクトを生成する。しかしサブクラスコンストラクターは %Symbol.species% プロパティを再定義することで既定の挙動を上書きできる。

23.1.3 Array プロトタイプオブジェクトのプロパティ

Array プロトタイプオブジェクト:

  • %Array.prototype% である。
  • Array エキゾチックオブジェクトであり、そのようなオブジェクトに規定された内部メソッドを持つ。
  • 初期値 +0𝔽"length" プロパティを持ち、その属性は { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } である。
  • [[Prototype]] 内部スロットの値は %Object.prototype% である。
Note

Array プロトタイプオブジェクトを Array エキゾチックオブジェクトとして規定するのは ECMAScript 2015 以前に作成されたコードとの互換性を確保するためである。

23.1.3.1 Array.prototype.at ( index )

  1. O を ? ToObject(this value) とする。
  2. len を ? LengthOfArrayLike(O) とする。
  3. relativeIndex を ? ToIntegerOrInfinity(index) とする。
  4. relativeIndex ≥ 0 なら
    1. krelativeIndex とする。
  5. そうでなければ
    1. klen + relativeIndex とする。
  6. k < 0 または klen なら undefined を返す。
  7. Get(O, ! ToString(𝔽(k))) を返す。

23.1.3.2 Array.prototype.concat ( ...items )

このメソッドは対象オブジェクトの配列要素に続いて各引数の配列要素を順に含む配列を返す。

呼び出し時に以下を実行する:

  1. O を ? ToObject(this value) とする。
  2. A を ? ArraySpeciesCreate(O, 0) とする。
  3. n を 0。
  4. items の先頭に O を挿入する。
  5. 各要素 Eitems について:
    1. spreadable を ? IsConcatSpreadable(E) とする。
    2. spreadabletrue なら
      1. len を ? LengthOfArrayLike(E) とする。
      2. n + len > 253 - 1 なら TypeError 例外。
      3. k を 0。
      4. k < len の間:
        1. Pk を ! ToString(𝔽(k)) とする。
        2. exists を ? HasProperty(E, Pk) とする。
        3. existstrue なら
          1. subElement を ? Get(E, Pk) とする。
          2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), subElement) を実行。
        4. nn + 1。
        5. kk + 1。
    3. そうでなければ
      1. 注記: E は展開されず単一要素として追加される。
      2. n ≥ 253 - 1 なら TypeError 例外。
      3. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), E) を実行。
      4. nn + 1。
  6. Set(A, "length", 𝔽(n), true) を実行。
  7. A を返す。

このメソッドの "length" プロパティは 1𝔽 である。

Note 1

ステップ "length" を明示的に設定するのは、items の最後の非空要素に後続の hole がある場合や A が組込み Array でない場合の正しい長さを保証するためである。

Note 2

このメソッドは意図的に汎用であり、this 値が Array であることを要求しない。そのため他の種類のオブジェクトへメソッドとして転用可能である。

23.1.3.2.1 IsConcatSpreadable ( O )

The abstract operation IsConcatSpreadable takes argument O (ECMAScript 言語値) and returns Boolean を含む通常完了または throw 完了. It performs the following steps when called:

  1. O がオブジェクトでなければ false を返す。
  2. spreadable を ? Get(O, %Symbol.isConcatSpreadable%) とする。
  3. spreadableundefined でなければ ToBoolean(spreadable) を返す。
  4. IsArray(O) を返す。

23.1.3.3 Array.prototype.constructor

Array.prototype.constructor の初期値は %Array% である。

23.1.3.4 Array.prototype.copyWithin ( target, start [ , end ] )

Note 1

end 引数は省略可。指定されない場合 this 値の長さが使われる。

Note 2

target が負なら配列長を length として length + target と扱う。start が負なら length + startend が負なら length + end と扱う。

このメソッドは呼び出し時に以下を実行する:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. relativeTarget を ? ToIntegerOrInfinity(target)。
  4. relativeTarget = -∞ なら to = 0。
  5. そうでなく relativeTarget < 0 なら to = max(len + relativeTarget, 0)。
  6. それ以外は to = min(relativeTarget, len)。
  7. relativeStart を ? ToIntegerOrInfinity(start)。
  8. relativeStart = -∞ なら from = 0。
  9. そうでなく relativeStart < 0 なら from = max(len + relativeStart, 0)。
  10. それ以外は from = min(relativeStart, len)。
  11. endundefined なら relativeEnd = len;そうでなければ relativeEnd を ? ToIntegerOrInfinity(end)。
  12. relativeEnd = -∞ なら final = 0。
  13. そうでなく relativeEnd < 0 なら final = max(len + relativeEnd, 0)。
  14. それ以外は final = min(relativeEnd, len)。
  15. countmin(final - from, len - to)。
  16. from < to かつ to < from + count なら
    1. direction = -1。
    2. from = from + count - 1。
    3. to = to + count - 1。
  17. そうでなければ
    1. direction = 1。
  18. count > 0 の間繰り返し、
    1. fromKey を ! ToString(𝔽(from))。
    2. toKey を ! ToString(𝔽(to))。
    3. fromPresent を ? HasProperty(O, fromKey)。
    4. fromPresenttrue なら
      1. fromValue を ? Get(O, fromKey)。
      2. Set(O, toKey, fromValue, true)。
    5. そうでなければ
      1. アサート: fromPresentfalse
      2. DeletePropertyOrThrow(O, toKey)。
    6. from += direction
    7. to += direction
    8. count -= 1。
  19. O を返す。
Note 3

このメソッドは意図的に汎用であり、this 値が Array である必要はない。他オブジェクトへ転用できる。

23.1.3.5 Array.prototype.entries ( )

このメソッドは呼び出し時以下を実行する:

  1. O を ? ToObject(this value)。
  2. CreateArrayIterator(O, key+value) を返す。

23.1.3.6 Array.prototype.every ( callback [ , thisArg ] )

Note 1

callback は 3 引数を受け取り Boolean へ強制可能な値を返す関数であるべき。every は昇順で各要素に対し callback を 1 回ずつ呼び、callbackfalse を返す要素を見つけた時点で直ちに false を返す。見つからなければ true を返す。callback は実際に存在する要素に対してのみ呼ばれ、欠落要素には呼ばれない。

thisArg が指定されれば各呼び出しの this 値として使用され、指定がなければ undefined が用いられる。

callback は (要素値, 要素インデックス, 走査対象オブジェクト) を受け取る。

every 自体は直接対象オブジェクトをミューテートしないが、callback の呼び出しにより変更され得る。

処理される要素の範囲は最初の callback 呼び出し前に固定される。every 開始後に追加された要素は訪問されない。既存要素が変更された場合、その時点の値が渡される;開始後に削除された要素は訪問されない。空配列に対しては true を返し、数学の「全て」量化に相当する。

このメソッドは呼び出し時以下を実行する:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. IsCallable(callback) が false なら TypeError 例外。
  4. k = 0。
  5. k < len の間繰り返し、
    1. Pk を ! ToString(𝔽(k))。
    2. kPresent を ? HasProperty(O, Pk)。
    3. kPresenttrue なら
      1. kValue を ? Get(O, Pk)。
      2. testResultToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))。
      3. testResultfalse なら false を返す。
    4. kk + 1。
  6. true を返す。
Note 2

このメソッドは意図的に汎用であり、this 値が Array であることを要求しない。

23.1.3.7 Array.prototype.fill ( value [ , start [ , end ] ] )

Note 1

start は省略可。省略時 +0𝔽 を使用。

end は省略可。省略時 this 値の長さを使用。

Note 2

start が負なら length + startend が負なら length + end と扱う。

このメソッドは呼び出し時以下を実行:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. relativeStart を ? ToIntegerOrInfinity(start)。
  4. relativeStart = -∞ なら k = 0。
  5. そうでなく relativeStart < 0 なら k = max(len + relativeStart, 0)。
  6. それ以外は k = min(relativeStart, len)。
  7. endundefined なら relativeEnd = len;そうでなければ relativeEnd = ? ToIntegerOrInfinity(end)。
  8. relativeEnd = -∞ なら final = 0。
  9. そうでなく relativeEnd < 0 なら final = max(len + relativeEnd, 0)。
  10. それ以外は final = min(relativeEnd, len)。
  11. k < final の間繰り返し、
    1. Pk を ! ToString(𝔽(k))。
    2. Set(O, Pk, value, true)。
    3. k++。
  12. O を返す。
Note 3

このメソッドは意図的に汎用。

23.1.3.8 Array.prototype.filter ( callback [ , thisArg ] )

Note 1

callback は 3 引数を受け Boolean へ強制可能な値を返す関数であるべき。filter は昇順で各要素に対し callback を呼び、true を返した値を集め新しい配列を構成する。欠落要素には呼ばれない。

thisArg が提供されれば this として使われ、なければ undefined

callback は (値, インデックス, 走査対象) を受け取る。

filter 自体は直接オブジェクトを変更しないが callback により変更され得る。

処理範囲は開始前に固定。開始後に追加された要素は訪問されず、変更された既存要素は訪問時点の値、開始後に削除された要素は訪問されない。

このメソッドは呼び出し時以下を実行:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. IsCallable(callback) が false なら TypeError
  4. A を ? ArraySpeciesCreate(O, 0)。
  5. k = 0。
  6. to = 0。
  7. k < len の間繰り返し、
    1. Pk を ! ToString(𝔽(k))。
    2. kPresent を ? HasProperty(O, Pk)。
    3. kPresenttrue なら
      1. kValue を ? Get(O, Pk)。
      2. selectedToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))。
      3. selectedtrue なら
        1. CreateDataPropertyOrThrow(A, ! ToString(𝔽(to)), kValue)。
        2. to++。
    4. k++。
  8. A を返す。
Note 2

このメソッドは汎用。

23.1.3.9 Array.prototype.find ( predicate [ , thisArg ] )

Note 1

このメソッドは昇順インデックスで各要素に対し predicate を呼び、true に強制される値を返した最初の要素値を返す。存在しなければ undefined

追加情報は FindViaPredicate を参照。

呼び出し時の手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. findRec を ? FindViaPredicate(O, len, ascending, predicate, thisArg)。
  4. findRec.[[Value]] を返す。
Note 2

汎用メソッド。

23.1.3.10 Array.prototype.findIndex ( predicate [ , thisArg ] )

Note 1

昇順で predicate を呼び、true に強制される値を返した最初の要素のインデックスを返す。なければ -1。

追加情報は FindViaPredicate 参照。

呼び出し時手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. findRec を ? FindViaPredicate(O, len, ascending, predicate, thisArg)。
  4. findRec.[[Index]] を返す。
Note 2

汎用。

23.1.3.11 Array.prototype.findLast ( predicate [ , thisArg ] )

Note 1

降順で predicate を呼び、true に強制される値を返した最初の要素値を返す。なければ undefined

追加情報は FindViaPredicate 参照。

手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. findRec を ? FindViaPredicate(O, len, descending, predicate, thisArg)。
  4. findRec.[[Value]] を返す。
Note 2

汎用。

23.1.3.12 Array.prototype.findLastIndex ( predicate [ , thisArg ] )

Note 1

降順で predicate を呼び、true に強制される値を返した最初の要素のインデックスを返す。なければ -1。

追加情報は FindViaPredicate 参照。

手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. findRec を ? FindViaPredicate(O, len, descending, predicate, thisArg)。
  4. findRec.[[Index]] を返す。
Note 2

汎用。

23.1.3.12.1 FindViaPredicate ( O, len, direction, predicate, thisArg )

The abstract operation FindViaPredicate takes arguments O (オブジェクト), len (非負整数), direction (ascending または descending), predicate (ECMAScript 言語値), and thisArg (ECMAScript 言語値) and returns フィールド [[Index]] (整数 Number) と [[Value]] (ECMAScript 言語値) を持つ Record を含む通常完了または throw 完了.

O は配列ライクまたは TypedArray であるべき。この操作は指定方向で各要素に predicate を 1 回ずつ呼び、true に強制される値を返した時点でそのインデックスと値を含む Record を返す。該当要素がない場合、インデックス -1𝔽 と値 undefinedRecord を返す。

predicate は関数であるべき。呼び出し時 (要素値, インデックス, 対象オブジェクト) が渡され、戻り値は Boolean へ強制される。

thisArg は各呼び出しの this として用いられる。

この操作自体は直接オブジェクトを変更しないが predicate により変更され得る。

処理範囲は走査開始直前に固定される。以降に追加された要素は訪問されない。既存要素が変更された場合はその訪問時の値が渡される。走査開始後に削除された要素は依然訪問され、存在しなければ undefined またはプロトタイプから取得される。

It performs the following steps when called:

  1. IsCallable(predicate) が false なら TypeError 例外。
  2. directionascending なら
    1. indices を 0 以上 len 未満の整数の昇順 List とする。
  3. そうでなければ
    1. indices を 0 以上 len 未満の整数の降順 List とする。
  4. 整数 kindices について
    1. Pk を ! ToString(𝔽(k))。
    2. 注記: OTypedArray の場合、次の Get 呼び出しは正常完了を返す。
    3. kValue を ? Get(O, Pk)。
    4. testResult を ? Call(predicate, thisArg, « kValue, 𝔽(k), O »)。
    5. ToBoolean(testResult) が true なら Record { [[Index]]: 𝔽(k), [[Value]]: kValue } を返す。
  5. Record { [[Index]]: -1𝔽, [[Value]]: undefined } を返す。

23.1.3.13 Array.prototype.flat ( [ depth ] )

このメソッドは呼び出し時以下を実行する:

  1. O を ? ToObject(this value)。
  2. sourceLen を ? LengthOfArrayLike(O)。
  3. depthNum = 1。
  4. depthundefined でなければ
    1. depthNum を ? ToIntegerOrInfinity(depth) に設定。
    2. depthNum < 0 なら depthNum = 0。
  5. A を ? ArraySpeciesCreate(O, 0)。
  6. FlattenIntoArray(A, O, sourceLen, 0, depthNum) を実行。
  7. A を返す。

23.1.3.13.1 FlattenIntoArray ( target, source, sourceLen, start, depth [ , mapperFunction [ , thisArg ] ] )

The abstract operation FlattenIntoArray takes arguments target (オブジェクト), source (オブジェクト), sourceLen (非負整数), start (非負整数), and depth (非負整数または +∞) and optional arguments mapperFunction (関数オブジェクト) and thisArg (ECMAScript 言語値) and returns 非負整数を含む通常完了または throw 完了. It performs the following steps when called:

  1. アサート: mapperFunction が存在するなら IsCallable(mapperFunction) は true であり、thisArg が存在し、かつ depth は 1。
  2. targetIndexstart
  3. sourceIndex+0𝔽
  4. (sourceIndex) < sourceLen の間繰り返し、
    1. P を ! ToString(sourceIndex)。
    2. exists を ? HasProperty(source, P)。
    3. existstrue なら
      1. element を ? Get(source, P)。
      2. mapperFunction が存在するなら
        1. element を ? Call(mapperFunction, thisArg, « element, sourceIndex, source ») に設定。
      3. shouldFlattenfalse
      4. depth > 0 なら
        1. shouldFlatten を ? IsArray(element) に設定。
      5. shouldFlattentrue なら
        1. depth = +∞ なら newDepth = +∞。
        2. そうでなければ newDepth = depth - 1。
        3. elementLen を ? LengthOfArrayLike(element)。
        4. targetIndex を ? FlattenIntoArray(target, element, elementLen, targetIndex, newDepth) に設定。
      6. そうでなければ
        1. targetIndex ≥ 253 - 1 なら TypeError 例外。
        2. CreateDataPropertyOrThrow(target, ! ToString(𝔽(targetIndex)), element)。
        3. targetIndex++。
    4. sourceIndexsourceIndex + 1𝔽
  5. targetIndex を返す。

23.1.3.14 Array.prototype.flatMap ( mapperFunction [ , thisArg ] )

このメソッドは呼び出し時以下を実行する:

  1. O を ? ToObject(this value)。
  2. sourceLen を ? LengthOfArrayLike(O)。
    1. IsCallable(mapperFunction) が false なら TypeError 例外。
  3. A を ? ArraySpeciesCreate(O, 0)。
  4. FlattenIntoArray(A, O, sourceLen, 0, 1, mapperFunction, thisArg) を実行。
  5. A を返す。

23.1.3.15 Array.prototype.forEach ( callback [ , thisArg ] )

Note 1

callback は 3 引数を受け取る関数であるべき。forEach は昇順で存在する各要素に対し callback を 1 回呼ぶ。欠落要素には呼ばれない。

thisArg があれば this 値、なければ undefined

callback の引数は (値, インデックス, 対象オブジェクト)。

forEach 自体は直接オブジェクトを変更しないが callback により変更され得る。

処理範囲は開始前に決定。開始後に追加された要素は訪問されず、変更された要素は訪問時の値、開始後に削除されたものは訪問されない。

手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. IsCallable(callback) が false なら TypeError
  4. k = 0。
  5. k < len の間、
    1. Pk を ! ToString(𝔽(k))。
    2. kPresent を ? HasProperty(O, Pk)。
    3. kPresenttrue なら
      1. kValue を ? Get(O, Pk)。
      2. ? Call(callback, thisArg, « kValue, 𝔽(k), O »)。
    4. k++。
  6. undefined を返す。
Note 2

汎用。

23.1.3.16 Array.prototype.includes ( searchElement [ , fromIndex ] )

Note 1

このメソッドは SameValueZero アルゴリズムで昇順に searchElement と各要素を比較し、いずれかで一致したら true、なければ false を返す。

第 2 引数 fromIndex の既定値は +0𝔽(全検索)。配列長以上なら false-0𝔽 未満なら末尾からのオフセットとして扱い、計算結果が +0𝔽 以下なら全検索。

手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. len = 0 なら false
  4. n を ? ToIntegerOrInfinity(fromIndex)。
  5. アサート: fromIndexundefined なら n = 0。
  6. n = +∞ なら false
  7. そうでなく n = -∞ なら n = 0。
  8. n ≥ 0 なら
    1. k = n
  9. そうでなければ
    1. k = len + n
    2. k < 0 なら k = 0。
  10. k < len の間、
    1. elementK を ? Get(O, ! ToString(𝔽(k)))。
    2. SameValueZero(searchElement, elementK) が true なら true
    3. k++。
  11. false を返す。
Note 2

汎用。

Note 3

このメソッドは indexOf と異なり、SameValueZero を使うため NaN を検出でき、欠落要素をスキップせず undefined として扱う。

23.1.3.17 Array.prototype.indexOf ( searchElement [ , fromIndex ] )

昇順で IsStrictlyEqual アルゴリズムにより比較し、マッチする最小インデックスを返し、なければ -1𝔽 を返す。

Note 1

第 2 引数 fromIndex の既定値は +0𝔽。配列長以上なら検索せず -1𝔽-0𝔽 未満なら末尾からのオフセットとして扱い、結果が +0𝔽 以下なら全検索。

手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. len = 0 なら -1𝔽
  4. n を ? ToIntegerOrInfinity(fromIndex)。
  5. アサート: fromIndexundefined なら n = 0。
  6. n = +∞ なら -1𝔽
  7. そうでなく n = -∞ なら n = 0。
  8. n ≥ 0 なら
    1. k = n
  9. そうでなければ
    1. k = len + n
    2. k < 0 なら k = 0。
  10. k < len の間、
    1. Pk を ! ToString(𝔽(k))。
    2. kPresent を ? HasProperty(O, Pk)。
    3. kPresenttrue なら
      1. elementK を ? Get(O, Pk)。
      2. IsStrictlyEqual(searchElement, elementK) が true なら 𝔽(k)。
    4. k++。
  11. -1𝔽 を返す。
Note 2

汎用。

23.1.3.18 Array.prototype.join ( separator )

配列要素を String に変換し separator を挟んで連結した結果を返す。separator 未指定ならカンマ。

呼び出し時手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. separatorundefined なら sep = ",";そうでなければ sep = ? ToString(separator)。
  4. R を空文字列。
  5. k = 0。
  6. k < len の間、
    1. k > 0 なら RRsep の連結に更新。
    2. element を ? Get(O, ! ToString(𝔽(k)))。
    3. elementundefined でも null でもなければ
      1. S を ? ToString(element)。
      2. RRS の連結に。
    4. k++。
  7. R を返す。
Note

汎用。

23.1.3.19 Array.prototype.keys ( )

このメソッドは呼び出し時以下を実行する:

  1. O を ? ToObject(this value)。
  2. CreateArrayIterator(O, key) を返す。

23.1.3.20 Array.prototype.lastIndexOf ( searchElement [ , fromIndex ] )

Note 1

降順で IsStrictlyEqual により比較し、一致した最大インデックスを返し、なければ -1𝔽

第2引数 fromIndex の既定は長さ−1。長さ以上なら全検索。-0𝔽 未満なら末尾からのオフセット。計算結果が +0𝔽 以下なら -1𝔽

手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. len = 0 なら -1𝔽
  4. fromIndex が存在すれば n = ? ToIntegerOrInfinity(fromIndex);そうでなければ n = len - 1。
  5. n = -∞ なら -1𝔽
  6. n ≥ 0 なら
    1. k = min(n, len - 1)。
  7. そうでなければ
    1. k = len + n
  8. k ≥ 0 の間、
    1. Pk を ! ToString(𝔽(k))。
    2. kPresent を ? HasProperty(O, Pk)。
    3. kPresenttrue なら
      1. elementK を ? Get(O, Pk)。
      2. IsStrictlyEqual(searchElement, elementK) が true なら 𝔽(k)。
    4. k--。
  9. -1𝔽 を返す。
Note 2

汎用。

23.1.3.21 Array.prototype.map ( callback [ , thisArg ] )

Note 1

callback は 3 引数を受ける関数であるべき。map は昇順に各要素に対し callback を呼び、その結果から新しい配列を作成。欠落要素には呼ばない。

thisArg があれば this、なければ undefined

callback の引数: (値, インデックス, 対象)。

map 自体は直接ミューテーションしないが callback による変更はあり得る。

処理範囲は開始前に固定。開始後追加要素は無視、変更要素は訪問時点の値、開始後削除された要素は訪問されない。

手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. IsCallable(callback) が false なら TypeError
  4. A を ? ArraySpeciesCreate(O, len)。
  5. k = 0。
  6. k < len の間、
    1. Pk を ! ToString(𝔽(k))。
    2. kPresent を ? HasProperty(O, Pk)。
    3. kPresenttrue なら
      1. kValue を ? Get(O, Pk)。
      2. mappedValue を ? Call(callback, thisArg, « kValue, 𝔽(k), O »)。
      3. CreateDataPropertyOrThrow(A, Pk, mappedValue)。
    4. k++。
  7. A を返す。
Note 2

汎用。

23.1.3.22 Array.prototype.pop ( )

Note 1

最後の要素を削除して返す。

手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. len = 0 なら
    1. Set(O, "length", +0𝔽, true)。
    2. undefined を返す。
  4. それ以外
    1. アサート: len > 0。
    2. newLen = 𝔽(len - 1)。
    3. index = ! ToString(newLen)。
    4. element を ? Get(O, index)。
    5. DeletePropertyOrThrow(O, index)。
    6. Set(O, "length", newLen, true)。
    7. element を返す。
Note 2

汎用。

23.1.3.23 Array.prototype.push ( ...items )

Note 1

引数を末尾に順に追加し新しい長さを返す。

手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. argCountitems の要素数。
  4. len + argCount > 253 - 1 なら TypeError
  5. Eitems について
    1. Set(O, ! ToString(𝔽(len)), E, true)。
    2. len++。
  6. Set(O, "length", 𝔽(len), true)。
  7. 𝔽(len) を返す。

このメソッドの "length"1𝔽

Note 2

汎用。

23.1.3.24 Array.prototype.reduce ( callback [ , initialValue ] )

Note 1

callback は 4 引数を受け取るべき。reduce は最初の(もしくは初期値を与えた場合その次の)要素以降に対して昇順で 1 回ずつ呼ぶ。

callback の引数: previousValue, currentValue, currentIndex, 走査対象オブジェクト。最初の呼び出し時の previousValuecurrentValue は初期値有無で変化。空配列かつ初期値なしは TypeError

reduce 自体は直接ミューテートしない。

処理範囲は開始前固定。追加要素は無視。変更要素は訪問時の値。開始後削除された要素は訪問されない。

手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. IsCallable(callback) が false なら TypeError
  4. len = 0 かつ initialValue が無ければ TypeError
  5. k = 0。
  6. accumulator = undefined
  7. initialValue が存在すれば
    1. accumulator = initialValue
  8. そうでなければ
    1. kPresent = false
    2. kPresentfalse かつ k < len の間、
      1. Pk = ! ToString(𝔽(k))。
      2. kPresent = ? HasProperty(O, Pk)。
      3. kPresenttrue なら
        1. accumulator = ? Get(O, Pk)。
      4. k++。
    3. kPresentfalse なら TypeError
  9. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. kPresenttrue なら
      1. kValue = ? Get(O, Pk)。
      2. accumulator = ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), O »)。
    4. k++。
  10. accumulator を返す。
Note 2

汎用。

23.1.3.25 Array.prototype.reduceRight ( callback [ , initialValue ] )

Note 1

説明は reduce の逆方向版。空配列で初期値なしは TypeError

手順:

  1. O, len を前節同様に取得。
  2. IsCallable(callback) が false なら TypeError
  3. len = 0 かつ initialValue 無しなら TypeError
  4. k = len - 1。
  5. accumulator = undefined
  6. initialValue が存在すれば
    1. accumulator = initialValue
  7. そうでなければ
    1. kPresent = false
    2. kPresentfalse かつ k ≥ 0 の間、
      1. Pk = ! ToString(𝔽(k))。
      2. kPresent = ? HasProperty(O, Pk)。
      3. kPresenttrue なら
        1. accumulator = ? Get(O, Pk)。
      4. k--。
    3. kPresentfalse なら TypeError
  8. k ≥ 0 の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. kPresenttrue なら
      1. kValue = ? Get(O, Pk)。
      2. accumulator = ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), O »)。
    4. k--。
  9. accumulator を返す。
Note 2

汎用。

23.1.3.26 Array.prototype.reverse ( )

Note 1

要素順序を反転し配列を返す。

手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. middle = floor(len / 2)。
  4. lower = 0。
  5. lowermiddle の間、
    1. upper = len - lower - 1。
    2. upperP = ! ToString(𝔽(upper))。
    3. lowerP = ! ToString(𝔽(lower))。
    4. lowerExists = ? HasProperty(O, lowerP)。
    5. lowerExiststrue なら lowerValue = ? Get(O, lowerP)。
    6. upperExists = ? HasProperty(O, upperP)。
    7. upperExiststrue なら upperValue = ? Get(O, upperP)。
    8. 両方 true なら
      1. Set(O, lowerP, upperValue, true)。
      2. Set(O, upperP, lowerValue, true)。
    9. そうでなく lowerExists false かつ upperExists true なら
      1. Set(O, lowerP, upperValue, true)。
      2. DeletePropertyOrThrow(O, upperP)。
    10. そうでなく lowerExists true かつ upperExists false なら
      1. DeletePropertyOrThrow(O, lowerP)。
      2. Set(O, upperP, lowerValue, true)。
    11. そうでなければ(両方 false)何もしない。
    12. lower++。
  6. O を返す。
Note 2

汎用。

23.1.3.27 Array.prototype.shift ( )

最初の要素を削除して返す。

手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. len = 0 なら
    1. Set(O, "length", +0𝔽, true)。
    2. undefined を返す。
  4. first を ? Get(O, "0")。
  5. k = 1。
  6. k < len の間、
    1. from = ! ToString(𝔽(k))。
    2. to = ! ToString(𝔽(k - 1))。
    3. fromPresent = ? HasProperty(O, from)。
    4. fromPresenttrue なら
      1. fromValue = ? Get(O, from)。
      2. Set(O, to, fromValue, true)。
    5. そうでなければ
      1. DeletePropertyOrThrow(O, to)。
    6. k++。
  7. DeletePropertyOrThrow(O, ! ToString(𝔽(len - 1)))。
  8. Set(O, "length", 𝔽(len - 1), true)。
  9. first を返す。
Note

汎用。

23.1.3.28 Array.prototype.slice ( start, end )

start から(endundefined なら末尾まで、そうでなければ end 非含む)要素を含む新しい配列を返す。負値は長さを length として length + start, length + end

手順:

  1. O を ? ToObject(this value)。
  2. len を ? LengthOfArrayLike(O)。
  3. relativeStart を ? ToIntegerOrInfinity(start)。
  4. relativeStart = -∞ なら k = 0。
  5. そうでなく relativeStart < 0 なら k = max(len + relativeStart, 0)。
  6. それ以外は k = min(relativeStart, len)。
  7. endundefined なら relativeEnd = len;そうでなければ relativeEnd = ? ToIntegerOrInfinity(end)。
  8. relativeEnd = -∞ なら final = 0。
  9. そうでなく relativeEnd < 0 なら final = max(len + relativeEnd, 0)。
  10. それ以外は final = min(relativeEnd, len)。
  11. count = max(final - k, 0)。
  12. A を ? ArraySpeciesCreate(O, count)。
  13. n = 0。
  14. k < final の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. kPresenttrue なら
      1. kValue = ? Get(O, Pk)。
      2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), kValue)。
    4. k++。
    5. n++。
  15. Set(A, "length", 𝔽(n), true) を実行。
  16. A を返す。
Note 1

で明示的に長さを設定するのは A が組込み Array でない場合でも正しい長さを保証するため。

Note 2

汎用。

23.1.3.29 Array.prototype.some ( callback [ , thisArg ] )

Note 1

callback は 3 引数を受け Boolean へ強制可能な値を返す関数であるべき。sometrue を返す最初の要素を見つけるまで昇順で呼び、見つかれば true、なければ false。欠落要素は無視。

thisArg があれば this、なければ undefined

引数: (値, インデックス, 対象)。

オブジェクトは直接ミューテートしないが callback により変更され得る。

範囲は開始前に固定。追加要素は無視。変更要素は訪問時の値。削除要素は訪問されない。空配列では false(数学の「存在」量化)。

手順:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. IsCallable(callback) が false なら TypeError
  4. k = 0。
  5. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ? HasProperty(O, Pk)。
    3. kPresenttrue なら
      1. kValue = ? Get(O, Pk)。
      2. testResult = ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))。
      3. testResulttrue なら true
    4. k++。
  6. false を返す。
Note 2

汎用。

23.1.3.30 Array.prototype.sort ( comparator )

配列要素をソートする。comparatorundefined でなければ 2 引数 (x, y) を受け負数 / 正数 / 0 を返す関数であるべき。

手順:

  1. comparatorundefined でなく IsCallable(comparator) が false なら TypeError
  2. obj = ? ToObject(this value)。
  3. len = ? LengthOfArrayLike(obj)
  4. SortCompare を (x, y) を引数に comparator を捕捉し呼出時 CompareArrayElements を返す新しい抽象クロージャとする。
  5. sortedList = ? SortIndexedProperties(obj, len, SortCompare, skip-holes)
  6. itemCountsortedList の要素数。
  7. j = 0。
  8. j < itemCount の間、
    1. Set(obj, ! ToString(𝔽(j)), sortedList[j], true)。
    2. j++。
  9. 注記: ステップ の呼出は skip-holes を用いる。残りのインデックスは hole 数を保持するため削除する。
  10. j < len の間、
    1. DeletePropertyOrThrow(obj, ! ToString(𝔽(j)))。
    2. j++。
  11. obj を返す。
Note 1

存在しないプロパティ値は常に undefined より後方、かつ undefined は他の任意値より後方に並ぶため(CompareArrayElements 参照)、undefined が末尾、その後に非存在要素が続く。

Note 2

手順 , ToString によるメソッド呼出は SortCompare一貫した比較器にしない可能性がある。

Note 3

汎用。

23.1.3.30.1 SortIndexedProperties ( obj, len, SortCompare, holes )

The abstract operation SortIndexedProperties takes arguments obj (オブジェクト), len (非負整数), SortCompare (2 パラメータ抽象クロージャ), and holes (skip-holes または read-through-holes) and returns ECMAScript 言語値の List を含む通常完了または throw 完了. It performs the following steps when called:

  1. items を空 List
  2. k = 0。
  3. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. holesskip-holes なら
      1. kRead = ? HasProperty(obj, Pk)。
    3. そうでなければ(read-through-holes
      1. kRead = true
    4. kReadtrue なら
      1. kValue = ? Get(obj, Pk)。
      2. itemskValue を追加。
    5. k++。
  4. 実装定義SortCompare 呼出列 を用いて items をソート。いずれかの呼出が異常完了したらそれ以上呼び出さずその Completion Record を返す。
  5. items を返す。

ソート順 は上記アルゴリズムのステップ 後の items の順序。SortCompare一貫した比較器でない場合は実装定義。Array.prototype.sort または Array.prototype.toSorted により呼び出された場合で comparatorundefined かつ特定値への全ての ToString 適用結果が同じでない場合も実装定義

実装定義でない場合、次を満たすこと:

  • 非負整数 itemCount 未満の整数についてある置換 π が存在し、各 j (0 ≤ j < itemCount) で old[j]new[π(j)] と同一。
  • すべての j, k について (SortCompare(old[j], old[k])) < 0 なら π(j) < π(k)
  • j < k < itemCount かつ (SortCompare(old[j], old[k])) = 0 なら π(j) < π(k)(安定ソート)。

old[j] はステップ 前の items[j]new[j] は後の値。

抽象クロージャまたは関数 comparator が集合 S一貫した比較器 であるとは、任意の a, b, cS について以下を満たすこと。記法 a <C b(comparator(a, b)) < 0 を、=C, >C も同様。

  • 同一ペア (a, b) への呼出は常に同じ Number vNaN でない)を返し、三つの関係のいずれかのみ成り立つ。
  • comparator 呼出は obj またはそのプロトタイプチェーン上のオブジェクトを変更しない。
  • 反射律: a =C a
  • 対称律: a =C bb =C a
  • 推移律 (=): a =C b, b =C ca =C c
  • 推移律 (<): a <C b, b <C ca <C c
  • 推移律 (>): a >C b, b >C ca >C c
Note

これら条件は comparatorS を同値類に分割し、それらが全順序付けされるために必要十分。

23.1.3.30.2 CompareArrayElements ( x, y, comparator )

The abstract operation CompareArrayElements takes arguments x (ECMAScript 言語値), y (ECMAScript 言語値), and comparator (関数オブジェクトまたは undefined) and returns Number を含む通常完了または異常完了. It performs the following steps when called:

  1. xy が共に undefined なら +0𝔽
  2. xundefined なら 1𝔽
  3. yundefined なら -1𝔽
  4. comparatorundefined でなければ
    1. v を ? ToNumber(? Call(comparator, undefined, « x, y »))。
    2. vNaN なら +0𝔽 を返す。
    3. v を返す。
  5. xString = ? ToString(x)
  6. yString = ? ToString(y)
  7. xSmaller = ! IsLessThan(xString, yString, true)。
  8. xSmallertrue なら -1𝔽
  9. ySmaller = ! IsLessThan(yString, xString, true)。
  10. ySmallertrue なら 1𝔽
  11. +0𝔽 を返す。

23.1.3.31 Array.prototype.splice ( start, deleteCount, ...items )

Note 1

start 位置から deleteCount 個を削除し、items を挿入する。削除要素の配列を返す。

手順:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. relativeStart = ? ToIntegerOrInfinity(start)。
  4. relativeStart = -∞ なら actualStart = 0。
  5. そうでなく relativeStart < 0 なら actualStart = max(len + relativeStart, 0)。
  6. それ以外は actualStart = min(relativeStart, len)。
  7. itemCountitems の要素数。
  8. start が存在しなければ actualDeleteCount = 0。
  9. そうでなく deleteCount が存在しなければ actualDeleteCount = len - actualStart
  10. それ以外
    1. dc = ? ToIntegerOrInfinity(deleteCount)。
    2. actualDeleteCount = clamp(dc, 0, len - actualStart)。
  11. len + itemCount - actualDeleteCount > 253 - 1 なら TypeError
  12. A = ? ArraySpeciesCreate(O, actualDeleteCount)。
  13. k = 0。
  14. k < actualDeleteCount の間、
    1. from = ! ToString(𝔽(actualStart + k))。
    2. HasProperty(O, from) が true なら
      1. fromValue = ? Get(O, from)。
      2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(k)), fromValue)。
    3. k++。
  15. Set(A, "length", 𝔽(actualDeleteCount), true) を実行。
  16. itemCount < actualDeleteCount の場合
    1. k = actualStart
    2. k < (len - actualDeleteCount) の間、
      1. from = ! ToString(𝔽(k + actualDeleteCount))。
      2. to = ! ToString(𝔽(k + itemCount))。
      3. HasProperty(O, from) が true なら
        1. fromValue = ? Get(O, from)。
        2. Set(O, to, fromValue, true)。
      4. そうでなければ ? DeletePropertyOrThrow(O, to)。
      5. k++。
    3. k = len
    4. k > (len - actualDeleteCount + itemCount) の間、
      1. DeletePropertyOrThrow(O, ! ToString(𝔽(k - 1)))。
      2. k--。
  17. そうでなく itemCount > actualDeleteCount の場合
    1. k = (len - actualDeleteCount)。
    2. k > actualStart の間、
      1. from = ! ToString(𝔽(k + actualDeleteCount - 1))。
      2. to = ! ToString(𝔽(k + itemCount - 1))。
      3. HasProperty(O, from) が true なら
        1. fromValue = ? Get(O, from)。
        2. Set(O, to, fromValue, true)。
      4. そうでなければ ? DeletePropertyOrThrow(O, to)。
      5. k--。
  18. k = actualStart
  19. Eitems について
    1. Set(O, ! ToString(𝔽(k)), E, true)。
    2. k++。
  20. Set(O, "length", 𝔽(len - actualDeleteCount + itemCount), true) を実行。
  21. A を返す。
Note 2

ステップ , で明示的に長さを設定するのは組込み配列でない場合でも正しい長さを保証するため。

Note 3

汎用。

23.1.3.32 Array.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 国際化 API を含む実装は ECMA-402 仕様に従って実装しなければならない。含まない場合は以下の仕様を用いる。

Note 1

ECMA-402 第 1 版はこのメソッドの代替仕様を含まなかった。

オプション引数の意味は ECMA-402 に定義され、未サポート実装は他目的に利用してはならない。

手順:

  1. array = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(array)。
  3. separatorホストロケールに適切な実装定義リスト区切り文字列(例 ", ")とする。
  4. R を空文字列。
  5. k = 0。
  6. k < len の間、
    1. k > 0 なら R = R + separator
    2. element = ? Get(array, ! ToString(𝔽(k)))。
    3. elementundefined でも null でもなければ
      1. S = ? ToString(? Invoke(element, "toLocaleString"))。
      2. R = R + S
    4. k++。
  7. R を返す。
Note 2

各要素の toLocaleString 結果をロケール依存区切りで連結。toString のロケール感知版。

Note 3

汎用。

23.1.3.33 Array.prototype.toReversed ( )

このメソッドは呼び出し時以下を実行する:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. A = ? ArrayCreate(len)。
  4. k = 0。
  5. k < len の間、
    1. from = ! ToString(𝔽(len - k - 1))。
    2. Pk = ! ToString(𝔽(k))。
    3. fromValue = ? Get(O, from)。
    4. CreateDataPropertyOrThrow(A, Pk, fromValue)。
    5. k++。
  6. A を返す。

23.1.3.34 Array.prototype.toSorted ( comparator )

呼び出し時手順:

  1. comparatorundefined でなく IsCallable(comparator) が false なら TypeError
  2. O = ? ToObject(this value)。
  3. len = ? LengthOfArrayLike(O)。
  4. A = ? ArrayCreate(len)。
  5. SortCompare を (x, y) を引数に comparator を捕捉し CompareArrayElements を呼ぶ抽象クロージャとする。
  6. sortedList = ? SortIndexedProperties(O, len, SortCompare, read-through-holes)。
  7. j = 0。
  8. j < len の間、
    1. CreateDataPropertyOrThrow(A, ! ToString(𝔽(j)), sortedList[j])。
    2. j++。
  9. A を返す。

23.1.3.35 Array.prototype.toSpliced ( start, skipCount, ...items )

呼び出し時手順:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. relativeStart = ? ToIntegerOrInfinity(start)。
  4. relativeStart = -∞ なら actualStart = 0。
  5. そうでなく relativeStart < 0 なら actualStart = max(len + relativeStart, 0)。
  6. それ以外は actualStart = min(relativeStart, len)。
  7. insertCountitems 要素数。
  8. start が存在しなければ actualSkipCount = 0。
  9. そうでなく skipCount が存在しなければ actualSkipCount = len - actualStart
  10. それ以外
    1. sc = ? ToIntegerOrInfinity(skipCount)。
    2. actualSkipCount = clamp(sc, 0, len - actualStart)。
  11. newLen = len + insertCount - actualSkipCount
  12. newLen > 253 - 1 なら TypeError
  13. A = ? ArrayCreate(newLen)。
  14. i = 0。
  15. r = actualStart + actualSkipCount
  16. i < actualStart の間、
    1. Pi = ! ToString(𝔽(i))。
    2. iValue = ? Get(O, Pi)。
    3. CreateDataPropertyOrThrow(A, Pi, iValue)。
    4. i++。
  17. Eitems について
    1. Pi = ! ToString(𝔽(i))。
    2. CreateDataPropertyOrThrow(A, Pi, E)。
    3. i++。
  18. i < newLen の間、
    1. Pi = ! ToString(𝔽(i))。
    2. from = ! ToString(𝔽(r))。
    3. fromValue = ? Get(O, from)。
    4. CreateDataPropertyOrThrow(A, Pi, fromValue)。
    5. i++。
    6. r++。
  19. A を返す。

23.1.3.36 Array.prototype.toString ( )

呼び出し時手順:

  1. array = ? ToObject(this value)。
  2. func = ? Get(array, "join")。
  3. IsCallable(func) が false なら func を %Object.prototype.toString% に設定。
  4. ? Call(func, array) を返す。
Note

汎用。

23.1.3.37 Array.prototype.unshift ( ...items )

引数を配列先頭に順序を保って挿入する。

手順:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. argCount = items の要素数。
  4. argCount > 0 なら
    1. len + argCount > 253 - 1 なら TypeError
    2. k = len
    3. k > 0 の間、
      1. from = ! ToString(𝔽(k - 1))。
      2. to = ! ToString(𝔽(k + argCount - 1))。
      3. fromPresent = ? HasProperty(O, from)。
      4. fromPresenttrue なら
        1. fromValue = ? Get(O, from)。
        2. Set(O, to, fromValue, true)。
      5. そうでなければ ? DeletePropertyOrThrow(O, to)。
      6. k--。
    4. j = +0𝔽
    5. Eitems について
      1. Set(O, ! ToString(j), E, true)。
      2. j += 1𝔽
  5. Set(O, "length", 𝔽(len + argCount), true)。
  6. 𝔽(len + argCount) を返す。

このメソッドの "length"1𝔽

Note

汎用。

23.1.3.38 Array.prototype.values ( )

呼び出し時手順:

  1. O = ? ToObject(this value)。
  2. CreateArrayIterator(O, value) を返す。

23.1.3.39 Array.prototype.with ( index, value )

呼び出し時手順:

  1. O = ? ToObject(this value)。
  2. len = ? LengthOfArrayLike(O)。
  3. relativeIndex = ? ToIntegerOrInfinity(index)。
  4. relativeIndex ≥ 0 なら actualIndex = relativeIndex;そうでなければ actualIndex = len + relativeIndex
  5. actualIndexlen または actualIndex < 0 なら RangeError
  6. A = ? ArrayCreate(len)。
  7. k = 0。
  8. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. k = actualIndex なら fromValue = value;そうでなければ fromValue = ? Get(O, Pk)。
    3. CreateDataPropertyOrThrow(A, Pk, fromValue)。
    4. k++。
  9. A を返す。

23.1.3.40 Array.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator% プロパティの初期値は 23.1.3.38 で定義される %Array.prototype.values% である。

23.1.3.41 Array.prototype [ %Symbol.unscopables% ]

%Symbol.unscopables% データプロパティの初期値は以下で生成されるオブジェクト:

  1. unscopableList = OrdinaryObjectCreate(null)。
  2. CreateDataPropertyOrThrow(unscopableList, "at", true)。
  3. CreateDataPropertyOrThrow(unscopableList, "copyWithin", true)。
  4. CreateDataPropertyOrThrow(unscopableList, "entries", true)。
  5. CreateDataPropertyOrThrow(unscopableList, "fill", true)。
  6. CreateDataPropertyOrThrow(unscopableList, "find", true)。
  7. CreateDataPropertyOrThrow(unscopableList, "findIndex", true)。
  8. CreateDataPropertyOrThrow(unscopableList, "findLast", true)。
  9. CreateDataPropertyOrThrow(unscopableList, "findLastIndex", true)。
  10. CreateDataPropertyOrThrow(unscopableList, "flat", true)。
  11. CreateDataPropertyOrThrow(unscopableList, "flatMap", true)。
  12. CreateDataPropertyOrThrow(unscopableList, "includes", true)。
  13. CreateDataPropertyOrThrow(unscopableList, "keys", true)。
  14. CreateDataPropertyOrThrow(unscopableList, "toReversed", true)。
  15. CreateDataPropertyOrThrow(unscopableList, "toSorted", true)。
  16. CreateDataPropertyOrThrow(unscopableList, "toSpliced", true)。
  17. CreateDataPropertyOrThrow(unscopableList, "values", true)。
  18. unscopableList を返す。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 属性を持つ。

Note

このオブジェクトの own プロパティ名は ECMAScript 2015 以前に Array.prototype の標準プロパティでなかった名前であり、with 文でシャドウされる既存コードの挙動を守るため無視される。

"with" が含まれないのは既に 予約語 であるため。

23.1.4 Array インスタンスのプロパティ

Array インスタンスは Array エキゾチックオブジェクトであり、その内部メソッドを持つ。Array プロトタイプオブジェクトからプロパティを継承する。

Array インスタンスは "length" プロパティと配列インデックス名を持つ列挙可能プロパティ集合を有する。

23.1.4.1 length

Array インスタンスの "length" プロパティは、配列インデックス名を持つ全ての configurable な自プロパティ名より常に数値的に大きい値を持つデータプロパティである。

初期属性は { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。

Note

"length" の値を減少させると旧値と新値の間のインデックスを持つ自要素が削除される(ただし非設定可能は削除不可)。非設定可能な array-indexed プロパティの最大値以上に "length" を減らそうとすると、その最大値 + 1 に設定される。10.4.2.1 参照。

23.1.5 Array イテレータオブジェクト

Array Iterator は特定の Array インスタンス上の反復を表すオブジェクトである。名前付きコンストラクターは存在せず、Array インスタンスの特定メソッド呼出により生成される。

23.1.5.1 CreateArrayIterator ( array, kind )

The abstract operation CreateArrayIterator takes arguments array (オブジェクト) and kind (key+value, key, または value) and returns オブジェクト. Array メソッドが返すイテレータオブジェクトを生成するために用いる。 It performs the following steps when called:

  1. iteratorOrdinaryObjectCreate(%ArrayIteratorPrototype%, « [[IteratedArrayLike]], [[ArrayLikeNextIndex]], [[ArrayLikeIterationKind]] ») とする。
  2. iterator.[[IteratedArrayLike]] = array
  3. iterator.[[ArrayLikeNextIndex]] = 0。
  4. iterator.[[ArrayLikeIterationKind]] = kind
  5. iterator を返す。

23.1.5.2 %ArrayIteratorPrototype% オブジェクト

%ArrayIteratorPrototype% オブジェクト:

  • Array Iterator オブジェクトが継承するプロパティを持つ。
  • 通常のオブジェクト。
  • [[Prototype]] 内部スロット値は %Iterator.prototype%
  • 以下のプロパティを持つ:

23.1.5.2.1 %ArrayIteratorPrototype%.next ( )

  1. Othis 値。
  2. O がオブジェクトでなければ TypeError
  3. OArray Iterator Instance の全内部スロットを持たなければ TypeError
  4. array = O.[[IteratedArrayLike]]
  5. arrayundefined なら CreateIteratorResultObject(undefined, true)。
  6. index = O.[[ArrayLikeNextIndex]]
  7. kind = O.[[ArrayLikeIterationKind]]
  8. array[[TypedArrayName]] 内部スロットを持つなら
    1. taRecord = MakeTypedArrayWithBufferWitnessRecord(array, seq-cst)。
    2. IsTypedArrayOutOfBounds(taRecord) が true なら TypeError
    3. len = TypedArrayLength(taRecord)。
  9. そうでなければ
    1. len = ? LengthOfArrayLike(array)。
  10. indexlen なら
    1. O.[[IteratedArrayLike]] = undefined
    2. CreateIteratorResultObject(undefined, true) を返す。
  11. O.[[ArrayLikeNextIndex]] = index + 1。
  12. indexNumber = 𝔽(index)。
  13. kind = key なら
    1. result = indexNumber
  14. そうでなければ
    1. elementKey = ! ToString(indexNumber)。
    2. elementValue = ? Get(array, elementKey)。
    3. kind = value なら
      1. result = elementValue
    4. そうでなければ(key+value
      1. result = CreateArrayFromListindexNumber, elementValue »)。
  15. CreateIteratorResultObject(result, false) を返す。

23.1.5.2.2 %ArrayIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "Array Iterator"

属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

23.1.5.3 Array Iterator インスタンスのプロパティ

Array Iterator インスタンスは %ArrayIteratorPrototype% から継承する通常オブジェクトで、初期化時に Table 72 の内部スロットを持つ。

Table 72: Array Iterator インスタンスの内部スロット
Internal Slot Type Description
[[IteratedArrayLike]] an Object or undefined 反復対象となる配列ライクオブジェクト。
[[ArrayLikeNextIndex]] a non-negative integer 次に調べる要素の整数インデックス
[[ArrayLikeIterationKind]] key+value, key, or value 各反復で返す内容を識別する値。

23.2 TypedArray オブジェクト

TypedArray は基礎となるバイナリデータバッファ (25.1) に対する配列ライクなビューを提供する。TypedArray 要素型TypedArray インスタンスのすべての要素が持つ基礎バイナリのスカラーデータ型である。サポートされる各要素型ごとに Table 73 に列挙される別個の TypedArray コンストラクターが存在する。Table 73 内の各コンストラクターはそれぞれ固有のプロトタイプオブジェクトを持つ。

Table 73: TypedArray コンストラクタ
コンストラクター名と組込み 要素型 要素サイズ 変換操作 説明
Int8Array
%Int8Array%
int8 1 ToInt8 8 ビット 2 の補数符号付き整数
Uint8Array
%Uint8Array%
uint8 1 ToUint8 8 ビット符号なし整数
Uint8ClampedArray
%Uint8ClampedArray%
uint8clamped 1 ToUint8Clamp 8 ビット符号なし整数 (クランプ変換)
Int16Array
%Int16Array%
int16 2 ToInt16 16 ビット 2 の補数符号付き整数
Uint16Array
%Uint16Array%
uint16 2 ToUint16 16 ビット符号なし整数
Int32Array
%Int32Array%
int32 4 ToInt32 32 ビット 2 の補数符号付き整数
Uint32Array
%Uint32Array%
uint32 4 ToUint32 32 ビット符号なし整数
BigInt64Array
%BigInt64Array%
bigint64 8 ToBigInt64 64 ビット 2 の補数符号付き整数
BigUint64Array
%BigUint64Array%
biguint64 8 ToBigUint64 64 ビット符号なし整数
Float16Array
%Float16Array%
float16 2 16 ビット IEEE 浮動小数点
Float32Array
%Float32Array%
float32 4 32 ビット IEEE 浮動小数点
Float64Array
%Float64Array%
float64 8 64 ビット IEEE 浮動小数点

以下の定義では TypedArray への参照は上表から適切なコンストラクター名に置き換えるものとする。

23.2.1 %TypedArray% 組込みオブジェクト

%TypedArray% 組込みオブジェクト:

23.2.1.1 %TypedArray% ( )

この関数は呼び出し時に次を行う:

  1. TypeError 例外を投げる。

この関数の "length" プロパティは +0𝔽 である。

23.2.2 %TypedArray% 組込みオブジェクトのプロパティ

%TypedArray% 組込みオブジェクト:

  • %Function.prototype%[[Prototype]] 内部スロットを持つ。
  • "name" プロパティ値は "TypedArray"
  • 以下のプロパティを持つ:

23.2.2.1 %TypedArray%.from ( source [ , mapper [ , thisArg ] ] )

このメソッドは呼び出し時に以下を行う:

  1. Cthis 値とする。
  2. IsConstructor(C) が false なら TypeError 例外。
  3. mapperundefined なら
    1. mappingfalse とする。
  4. そうでなければ
    1. IsCallable(mapper) が false なら TypeError 例外。
    2. mappingtrue とする。
  5. usingIterator を ? GetMethod(source, %Symbol.iterator%) とする。
  6. usingIteratorundefined でなければ
    1. values を ? IteratorToList(? GetIteratorFromMethod(source, usingIterator)) とする。
    2. lenvalues の要素数とする。
    3. targetObj を ? TypedArrayCreateFromConstructor(C, « 𝔽(len) ») とする。
    4. k = 0。
    5. k < len の間繰り返し、
      1. Pk = ! ToString(𝔽(k))。
      2. kValuevalues の先頭要素とする。
      3. values から先頭要素を除去。
      4. mappingtrue なら
        1. mappedValue = ? Call(mapper, thisArg, « kValue, 𝔽(k) »)。
      5. そうでなければ
        1. mappedValue = kValue
      6. Set(targetObj, Pk, mappedValue, true)。
      7. kk + 1 に。
    6. アサート: values は空 List
    7. targetObj を返す。
  7. 注: sourceiterable でないので配列ライクであるとみなす。
  8. arrayLike = ! ToObject(source)。
  9. len = ? LengthOfArrayLike(arrayLike)。
  10. targetObj = ? TypedArrayCreateFromConstructor(C, « 𝔽(len) »)。
  11. k = 0。
  12. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ? Get(arrayLike, Pk)。
    3. mappingtrue なら
      1. mappedValue = ? Call(mapper, thisArg, « kValue, 𝔽(k) »)。
    4. そうでなければ
      1. mappedValue = kValue
    5. Set(targetObj, Pk, mappedValue, true)。
    6. k++。
  13. targetObj を返す。

23.2.2.2 %TypedArray%.of ( ...items )

このメソッドは呼び出し時に以下を行う:

  1. lenitems の要素数とする。
  2. Cthis 値とする。
  3. IsConstructor(C) が false なら TypeError 例外。
  4. newObj = ? TypedArrayCreateFromConstructor(C, « 𝔽(len) »)。
  5. k = 0。
  6. k < len の間、
    1. kValue = items[k]。
    2. Pk = ! ToString(𝔽(k))。
    3. Set(newObj, Pk, kValue, true)。
    4. k++。
  7. newObj を返す。

23.2.2.3 %TypedArray%.prototype

%TypedArray%.prototype の初期値は %TypedArray% プロトタイプオブジェクトである。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

23.2.2.4 get %TypedArray% [ %Symbol.species% ]

%TypedArray%[%Symbol.species%] は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. this 値を返す。

この関数の "name" プロパティ値は "get [Symbol.species]"

Note

%TypedArray.prototype% の各メソッドは通常 this 値のコンストラクターを用いて派生オブジェクトを生成する。サブクラスコンストラクターは %Symbol.species% を再定義して既定挙動を上書きできる。

23.2.3 %TypedArray% プロトタイプオブジェクトのプロパティ

%TypedArray% プロトタイプオブジェクト:

  • [[Prototype]] 内部スロット値は %Object.prototype%
  • %TypedArray.prototype% である。
  • 通常のオブジェクトである。
  • [[ViewedArrayBuffer]] など TypedArray インスタンス特有の内部スロットを持たない。

23.2.3.1 %TypedArray%.prototype.at ( index )

  1. Othis 値とする。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. relativeIndex = ? ToIntegerOrInfinity(index)。
  5. relativeIndex ≥ 0 なら
    1. k = relativeIndex
  6. そうでなければ
    1. k = len + relativeIndex
  7. k < 0 または klen なら undefined を返す。
  8. Get(O, ! ToString(𝔽(k))) を返す。

23.2.3.2 get %TypedArray%.prototype.buffer

%TypedArray%.prototype.buffer は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Othis 値とする。
  2. RequireInternalSlot(O, [[TypedArrayName]])。
  3. アサート: O[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. buffer = O.[[ViewedArrayBuffer]]
  5. buffer を返す。

23.2.3.3 get %TypedArray%.prototype.byteLength

%TypedArray%.prototype.byteLength は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[TypedArrayName]])。
  3. アサート: O[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. taRecord = MakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
  5. size = TypedArrayByteLength(taRecord)。
  6. 𝔽(size) を返す。

23.2.3.4 get %TypedArray%.prototype.byteOffset

%TypedArray%.prototype.byteOffset は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[TypedArrayName]])。
  3. アサート: O[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. taRecord = MakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
  5. IsTypedArrayOutOfBounds(taRecord) が true なら +0𝔽 を返す。
  6. offset = O.[[ByteOffset]]
  7. 𝔽(offset) を返す。

23.2.3.5 %TypedArray%.prototype.constructor

%TypedArray%.prototype.constructor の初期値は %TypedArray% である。

23.2.3.6 %TypedArray%.prototype.copyWithin ( target, start [ , end ] )

引数の意味と使用法は 23.1.3.4 に定義された Array.prototype.copyWithin と同じ。

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. relativeTarget = ? ToIntegerOrInfinity(target)。
  5. relativeTarget = -∞ なら targetIndex = 0。
  6. そうでなく relativeTarget < 0 なら targetIndex = max(len + relativeTarget, 0)。
  7. それ以外は targetIndex = min(relativeTarget, len)。
  8. relativeStart = ? ToIntegerOrInfinity(start)。
  9. relativeStart = -∞ なら startIndex = 0。
  10. そうでなく relativeStart < 0 なら startIndex = max(len + relativeStart, 0)。
  11. それ以外は startIndex = min(relativeStart, len)。
  12. endundefined なら relativeEnd = len; そうでなければ relativeEnd = ? ToIntegerOrInfinity(end)。
  13. relativeEnd = -∞ なら endIndex = 0。
  14. そうでなく relativeEnd < 0 なら endIndex = max(len + relativeEnd, 0)。
  15. それ以外は endIndex = min(relativeEnd, len)。
  16. count = min(endIndex - startIndex, len - targetIndex)。
  17. count > 0 なら
    1. 注: コピーはソースのビットレベルエンコーディングを保持する方法で行わねばならない。
    2. buffer = O.[[ViewedArrayBuffer]]
    3. taRecord = MakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
    4. IsTypedArrayOutOfBounds(taRecord) が true なら TypeError
    5. len = TypedArrayLength(taRecord)。
    6. elementSize = TypedArrayElementSize(O)。
    7. byteOffset = O.[[ByteOffset]]
    8. bufferByteLimit = (len × elementSize) + byteOffset
    9. toByteIndex = (targetIndex × elementSize) + byteOffset
    10. fromByteIndex = (startIndex × elementSize) + byteOffset
    11. countBytes = count × elementSize
    12. もし fromByteIndex < toByteIndex かつ toByteIndex < fromByteIndex + countBytes なら
      1. direction = -1。
      2. fromByteIndex = fromByteIndex + countBytes - 1。
      3. toByteIndex = toByteIndex + countBytes - 1。
    13. そうでなければ
      1. direction = 1。
    14. countBytes > 0 の間繰り返し、
      1. もし fromByteIndex < bufferByteLimit かつ toByteIndex < bufferByteLimit なら
        1. value = GetValueFromBuffer(buffer, fromByteIndex, uint8, true, unordered)。
        2. SetValueInBuffer(buffer, toByteIndex, uint8, value, true, unordered) を実行。
        3. fromByteIndex += direction
        4. toByteIndex += direction
        5. countBytes = countBytes - 1。
      2. そうでなければ
        1. countBytes = 0。
  18. O を返す。

23.2.3.7 %TypedArray%.prototype.entries ( )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. ValidateTypedArray(O, seq-cst)。
  3. CreateArrayIterator(O, key+value) を返す。

23.2.3.8 %TypedArray%.prototype.every ( callback [ , thisArg ] )

引数の意味と使用法は 23.1.3.6Array.prototype.every と同じ。

このメソッドは呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. IsCallable(callback) が false なら TypeError
  5. k = 0。
  6. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. testResult = ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))。
    4. testResultfalse なら false
    5. k++。
  7. true を返す。

このメソッドは汎用ではない。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければならない。

23.2.3.9 %TypedArray%.prototype.fill ( value [ , start [ , end ] ] )

引数の意味と使用法は 23.1.3.7Array.prototype.fill と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. O.[[ContentType]]bigint なら value = ? ToBigInt(value)。そうでなければ value = ? ToNumber(value)。
  5. relativeStart = ? ToIntegerOrInfinity(start)。
  6. relativeStart = -∞ なら startIndex = 0。
  7. そうでなく relativeStart < 0 なら startIndex = max(len + relativeStart, 0)。
  8. それ以外は startIndex = min(relativeStart, len)。
  9. endundefined なら relativeEnd = len; そうでなければ relativeEnd = ? ToIntegerOrInfinity(end)。
  10. relativeEnd = -∞ なら endIndex = 0。
  11. そうでなく relativeEnd < 0 なら endIndex = max(len + relativeEnd, 0)。
  12. それ以外は endIndex = min(relativeEnd, len)。
  13. taRecord = MakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
  14. IsTypedArrayOutOfBounds(taRecord) が true なら TypeError
  15. len = TypedArrayLength(taRecord)。
  16. endIndex = min(endIndex, len)。
  17. k = startIndex
  18. k < endIndex の間、
    1. Pk = ! ToString(𝔽(k))。
    2. Set(O, Pk, value, true)。
    3. k++。
  19. O を返す。

23.2.3.10 %TypedArray%.prototype.filter ( callback [ , thisArg ] )

引数の意味と使用法は 23.1.3.8Array.prototype.filter と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. IsCallable(callback) が false なら TypeError
  5. kept = 新しい空 List
  6. captured = 0。
  7. k = 0。
  8. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. selected = ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))。
    4. selectedtrue なら
      1. kValuekept に追加。
      2. captured = captured + 1。
    5. k++。
  9. A = ? TypedArraySpeciesCreate(O, « 𝔽(captured) »)。
  10. n = 0。
  11. ekept について
    1. Set(A, ! ToString(𝔽(n)), e, true)。
    2. n++。
  12. A を返す。

このメソッドは汎用ではない。this 値は [[TypedArrayName]] 内部スロットを持つ必要がある。

23.2.3.11 %TypedArray%.prototype.find ( predicate [ , thisArg ] )

引数の意味と使用法は 23.1.3.9Array.prototype.find と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. findRec = ? FindViaPredicate(O, len, ascending, predicate, thisArg)。
  5. findRec.[[Value]] を返す。

汎用ではない。

23.2.3.12 %TypedArray%.prototype.findIndex ( predicate [ , thisArg ] )

引数の意味と使用法は 23.1.3.10Array.prototype.findIndex と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. findRec = ? FindViaPredicate(O, len, ascending, predicate, thisArg)。
  5. findRec.[[Index]] を返す。

汎用ではない。

23.2.3.13 %TypedArray%.prototype.findLast ( predicate [ , thisArg ] )

引数の意味と使用法は 23.1.3.11Array.prototype.findLast と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. findRec = ? FindViaPredicate(O, len, descending, predicate, thisArg)。
  5. findRec.[[Value]] を返す。

汎用ではない。

23.2.3.14 %TypedArray%.prototype.findLastIndex ( predicate [ , thisArg ] )

引数の意味と使用法は 23.1.3.12Array.prototype.findLastIndex と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. findRec = ? FindViaPredicate(O, len, descending, predicate, thisArg)。
  5. findRec.[[Index]] を返す。

汎用ではない。

23.2.3.15 %TypedArray%.prototype.forEach ( callback [ , thisArg ] )

引数の意味と使用法は 23.1.3.15Array.prototype.forEach と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. IsCallable(callback) が false なら TypeError
  5. k = 0。
  6. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. ? Call(callback, thisArg, « kValue, 𝔽(k), O »)。
    4. k++。
  7. undefined を返す。

汎用ではない。

23.2.3.16 %TypedArray%.prototype.includes ( searchElement [ , fromIndex ] )

引数の意味と使用法は 23.1.3.16Array.prototype.includes と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. len = 0 なら false
  5. n = ? ToIntegerOrInfinity(fromIndex)。
  6. アサート: fromIndexundefined なら n = 0。
  7. n = +∞ なら false
  8. そうでなく n = -∞ なら n = 0。
  9. n ≥ 0 なら
    1. k = n
  10. そうでなければ
    1. k = len + n
    2. k < 0 なら k = 0。
  11. k < len の間、
    1. elementK = ! Get(O, ! ToString(𝔽(k)))。
    2. SameValueZero(searchElement, elementK) が true なら true
    3. k++。
  12. false を返す。

汎用ではない。

23.2.3.17 %TypedArray%.prototype.indexOf ( searchElement [ , fromIndex ] )

引数の意味と使用法は 23.1.3.17Array.prototype.indexOf と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. len = 0 なら -1𝔽
  5. n = ? ToIntegerOrInfinity(fromIndex)。
  6. アサート: fromIndex undefinedn = 0。
  7. n = +∞ なら -1𝔽
  8. そうでなく n = -∞ なら n = 0。
  9. n ≥ 0 なら
    1. k = n
  10. そうでなければ
    1. k = len + n
    2. k < 0 なら k = 0。
  11. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ! HasProperty(O, Pk)。
    3. kPresenttrue なら
      1. elementK = ! Get(O, Pk)。
      2. IsStrictlyEqual(searchElement, elementK) が true なら 𝔽(k)。
    4. k++。
  12. -1𝔽 を返す。

汎用ではない。

23.2.3.18 %TypedArray%.prototype.join ( separator )

引数の意味と使用法は 23.1.3.18Array.prototype.join と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. separatorundefined なら sep = ",";そうでなければ sep = ? ToString(separator)。
  5. R = 空文字列。
  6. k = 0。
  7. k < len の間、
    1. k > 0 なら R = Rsep の連結。
    2. element = ! Get(O, ! ToString(𝔽(k)))。
    3. elementundefined でないなら
      1. S = ! ToString(element)。
      2. R = R + S
    4. k++。
  8. R を返す。

汎用ではない。

23.2.3.19 %TypedArray%.prototype.keys ( )

このメソッドは呼び出し時:

  1. O = this 値。
  2. ValidateTypedArray(O, seq-cst)。
  3. CreateArrayIterator(O, key) を返す。

23.2.3.20 %TypedArray%.prototype.lastIndexOf ( searchElement [ , fromIndex ] )

引数の意味と使用法は 23.1.3.20Array.prototype.lastIndexOf と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. len = 0 なら -1𝔽
  5. fromIndex が存在するなら n = ? ToIntegerOrInfinity(fromIndex); そうでなければ n = len - 1。
  6. n = -∞ なら -1𝔽
  7. n ≥ 0 なら
    1. k = min(n, len - 1)。
  8. そうでなければ
    1. k = len + n
  9. k ≥ 0 の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kPresent = ! HasProperty(O, Pk)。
    3. kPresenttrue なら
      1. elementK = ! Get(O, Pk)。
      2. IsStrictlyEqual(searchElement, elementK) が true なら 𝔽(k)。
    4. k--。
  10. -1𝔽 を返す。

汎用ではない。

23.2.3.21 get %TypedArray%.prototype.length

%TypedArray%.prototype.length は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. O = this 値。
  2. RequireInternalSlot(O, [[TypedArrayName]])。
  3. アサート: O[[ViewedArrayBuffer]][[ArrayLength]] を持つ。
  4. taRecord = MakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
  5. IsTypedArrayOutOfBounds(taRecord) が true なら +0𝔽
  6. length = TypedArrayLength(taRecord)。
  7. 𝔽(length) を返す。

この関数は汎用ではない。

23.2.3.22 %TypedArray%.prototype.map ( callback [ , thisArg ] )

引数の意味と使用法は 23.1.3.21Array.prototype.map と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. IsCallable(callback) が false なら TypeError
  5. A = ? TypedArraySpeciesCreate(O, « 𝔽(len) »)。
  6. k = 0。
  7. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. mappedValue = ? Call(callback, thisArg, « kValue, 𝔽(k), O »)。
    4. Set(A, Pk, mappedValue, true)。
    5. k++。
  8. A を返す。

汎用ではない。

23.2.3.23 %TypedArray%.prototype.reduce ( callback [ , initialValue ] )

引数の意味と使用法は 23.1.3.24Array.prototype.reduce と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. IsCallable(callback) が false なら TypeError
  5. len = 0 かつ initialValue 非存在なら TypeError
  6. k = 0。
  7. accumulator = undefined
  8. initialValue 存在なら
    1. accumulator = initialValue
  9. そうでなければ
    1. Pk = ! ToString(𝔽(k))。
    2. accumulator = ! Get(O, Pk)。
    3. k++。
  10. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. accumulator = ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), O »)。
    4. k++。
  11. accumulator を返す。

汎用ではない。

23.2.3.24 %TypedArray%.prototype.reduceRight ( callback [ , initialValue ] )

引数の意味と使用法は 23.1.3.25Array.prototype.reduceRight と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. IsCallable(callback) が false なら TypeError
  5. len = 0 かつ initialValue 無しなら TypeError
  6. k = len - 1。
  7. accumulator = undefined
  8. initialValue 存在なら
    1. accumulator = initialValue
  9. そうでなければ
    1. Pk = ! ToString(𝔽(k))。
    2. accumulator = ! Get(O, Pk)。
    3. k--。
  10. k ≥ 0 の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. accumulator = ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), O »)。
    4. k--。
  11. accumulator を返す。

汎用ではない。

23.2.3.25 %TypedArray%.prototype.reverse ( )

引数の意味と使用法は 23.1.3.26Array.prototype.reverse と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. middle = floor(len / 2)。
  5. lower = 0。
  6. lowermiddle の間、
    1. upper = len - lower - 1。
    2. upperP = ! ToString(𝔽(upper))。
    3. lowerP = ! ToString(𝔽(lower))。
    4. lowerValue = ! Get(O, lowerP)。
    5. upperValue = ! Get(O, upperP)。
    6. Set(O, lowerP, upperValue, true)。
    7. Set(O, upperP, lowerValue, true)。
    8. lower++。
  7. O を返す。

汎用ではない。

23.2.3.26 %TypedArray%.prototype.set ( source [ , offset ] )

このメソッドは source から値を読み取り複数の値をこの TypedArray に設定する。詳細は source の型に依存する。任意の offset は書き込み開始位置の要素インデックスを示し、省略時 0。

呼び出し時:

  1. target = this 値。
  2. RequireInternalSlot(target, [[TypedArrayName]])。
  3. アサート: target[[ViewedArrayBuffer]] を持つ。
  4. targetOffset = ? ToIntegerOrInfinity(offset)。
  5. targetOffset < 0 なら RangeError
  6. もし source[[TypedArrayName]] を持つオブジェクトなら
    1. SetTypedArrayFromTypedArray(target, targetOffset, source)。
  7. そうでなければ
    1. SetTypedArrayFromArrayLike(target, targetOffset, source)。
  8. undefined を返す。

汎用ではない。

23.2.3.26.1 SetTypedArrayFromArrayLike ( target, targetOffset, source )

The abstract operation SetTypedArrayFromArrayLike takes arguments target (a TypedArray), targetOffset (a non-negative integer or +∞), and source (an ECMAScript language value, but not a TypedArray) and returns unused を含む通常完了または throw 完了. targettargetOffset から source の値を複数設定する。 It performs the following steps when called:

  1. targetRecord = MakeTypedArrayWithBufferWitnessRecord(target, seq-cst)。
  2. IsTypedArrayOutOfBounds(targetRecord) が true なら TypeError
  3. targetLength = TypedArrayLength(targetRecord)。
  4. src = ? ToObject(source)。
  5. srcLength = ? LengthOfArrayLike(src)。
  6. targetOffset = +∞ なら RangeError
  7. srcLength + targetOffset > targetLength なら RangeError
  8. k = 0。
  9. k < srcLength の間、
    1. Pk = ! ToString(𝔽(k))。
    2. value = ? Get(src, Pk)。
    3. targetIndex = 𝔽(targetOffset + k)。
    4. TypedArraySetElement(target, targetIndex, value)。
    5. k++。
  10. unused を返す。

23.2.3.26.2 SetTypedArrayFromTypedArray ( target, targetOffset, source )

The abstract operation SetTypedArrayFromTypedArray takes arguments target (a TypedArray), targetOffset (a non-negative integer or +∞), and source (a TypedArray) and returns unused を含む通常完了または throw 完了. targettargetOffset から source の値を複数設定する。 It performs the following steps when called:

  1. targetBuffer = target.[[ViewedArrayBuffer]]
  2. targetRecord = MakeTypedArrayWithBufferWitnessRecord(target, seq-cst)。
  3. IsTypedArrayOutOfBounds(targetRecord) が true なら TypeError
  4. targetLength = TypedArrayLength(targetRecord)。
  5. srcBuffer = source.[[ViewedArrayBuffer]]
  6. srcRecord = MakeTypedArrayWithBufferWitnessRecord(source, seq-cst)。
  7. IsTypedArrayOutOfBounds(srcRecord) が true なら TypeError
  8. srcLength = TypedArrayLength(srcRecord)。
  9. targetType = TypedArrayElementType(target)。
  10. targetElementSize = TypedArrayElementSize(target)。
  11. targetByteOffset = target.[[ByteOffset]]
  12. srcType = TypedArrayElementType(source)。
  13. srcElementSize = TypedArrayElementSize(source)。
  14. srcByteOffset = source.[[ByteOffset]]
  15. targetOffset = +∞ なら RangeError
  16. srcLength + targetOffset > targetLength なら RangeError
  17. target.[[ContentType]]source.[[ContentType]] なら TypeError
  18. IsSharedArrayBuffer(srcBuffer) かつ IsSharedArrayBuffer(targetBuffer) かつ srcBuffer.[[ArrayBufferData]] = targetBuffer.[[ArrayBufferData]] なら sameSharedArrayBuffer = true、そうでなければ false
  19. SameValue(srcBuffer, targetBuffer) または sameSharedArrayBuffertrue なら
    1. srcByteLength = TypedArrayByteLength(srcRecord)。
    2. srcBuffer = ? CloneArrayBuffer(srcBuffer, srcByteOffset, srcByteLength)。
    3. srcByteIndex = 0。
  20. そうでなければ
    1. srcByteIndex = srcByteOffset
  21. targetByteIndex = (targetOffset × targetElementSize) + targetByteOffset
  22. limit = targetByteIndex + (targetElementSize × srcLength)。
  23. srcType = targetType なら
    1. 注: 転送はビットレベルエンコーディングを保持する形で行う。
    2. targetByteIndex < limit の間、
      1. value = GetValueFromBuffer(srcBuffer, srcByteIndex, uint8, true, unordered)。
      2. SetValueInBuffer(targetBuffer, targetByteIndex, uint8, value, true, unordered)。
      3. srcByteIndex++。
      4. targetByteIndex++。
  24. そうでなければ
    1. targetByteIndex < limit の間、
      1. value = GetValueFromBuffer(srcBuffer, srcByteIndex, srcType, true, unordered)。
      2. SetValueInBuffer(targetBuffer, targetByteIndex, targetType, value, true, unordered)。
      3. srcByteIndex += srcElementSize
      4. targetByteIndex += targetElementSize
  25. unused を返す。

23.2.3.27 %TypedArray%.prototype.slice ( start, end )

引数の意味と使用法は 23.1.3.28Array.prototype.slice と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. srcArrayLength = TypedArrayLength(taRecord)。
  4. relativeStart = ? ToIntegerOrInfinity(start)。
  5. relativeStart = -∞ なら startIndex = 0。
  6. そうでなく relativeStart < 0 なら startIndex = max(srcArrayLength + relativeStart, 0)。
  7. それ以外 startIndex = min(relativeStart, srcArrayLength)。
  8. endundefined なら relativeEnd = srcArrayLength; そうでなければ relativeEnd = ? ToIntegerOrInfinity(end)。
  9. relativeEnd = -∞ なら endIndex = 0。
  10. そうでなく relativeEnd < 0 なら endIndex = max(srcArrayLength + relativeEnd, 0)。
  11. それ以外 endIndex = min(relativeEnd, srcArrayLength)。
  12. countBytes = max(endIndex - startIndex, 0)。
  13. A = ? TypedArraySpeciesCreate(O, « 𝔽(countBytes) »)。
  14. countBytes > 0 なら
    1. taRecord = MakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
    2. IsTypedArrayOutOfBounds(taRecord) が true なら TypeError
    3. endIndex = min(endIndex, TypedArrayLength(taRecord))。
    4. countBytes = max(endIndex - startIndex, 0)。
    5. srcType = TypedArrayElementType(O)。
    6. targetType = TypedArrayElementType(A)。
    7. もし srcType = targetType なら
      1. 注: 転送はビットエンコーディング保持で行う。
      2. srcBuffer = O.[[ViewedArrayBuffer]]
      3. targetBuffer = A.[[ViewedArrayBuffer]]
      4. elementSize = TypedArrayElementSize(O)。
      5. srcByteOffset = O.[[ByteOffset]]
      6. srcByteIndex = (startIndex × elementSize) + srcByteOffset
      7. targetByteIndex = A.[[ByteOffset]]
      8. endByteIndex = targetByteIndex + (countBytes × elementSize)。
      9. targetByteIndex < endByteIndex の間、
        1. value = GetValueFromBuffer(srcBuffer, srcByteIndex, uint8, true, unordered)。
        2. SetValueInBuffer(targetBuffer, targetByteIndex, uint8, value, true, unordered)。
        3. srcByteIndex++。
        4. targetByteIndex++。
    8. そうでなければ
      1. n = 0。
      2. k = startIndex
      3. k < endIndex の間、
        1. Pk = ! ToString(𝔽(k))。
        2. kValue = ! Get(O, Pk)。
        3. Set(A, ! ToString(𝔽(n)), kValue, true)。
        4. k++。
        5. n++。
  15. A を返す。

汎用ではない。

23.2.3.28 %TypedArray%.prototype.some ( callback [ , thisArg ] )

引数の意味と使用法は 23.1.3.29Array.prototype.some と同じ。

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. IsCallable(callback) が false なら TypeError
  5. k = 0。
  6. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ! Get(O, Pk)。
    3. testResult = ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))。
    4. testResulttrue なら true
    5. k++。
  7. false を返す。

汎用ではない。

23.2.3.29 %TypedArray%.prototype.sort ( comparator )

これは独立したメソッドであり、以下に述べる点を除き 23.1.3.30Array.prototype.sort と同じ要件を実装する。実装は this 値が固定長で疎でない整数インデックス付きプロパティを持つことを利用して最適化できる。

汎用ではない。

呼び出し時:

  1. comparatorundefined でなく IsCallable(comparator) が false なら TypeError
  2. obj = this 値。
  3. taRecord = ? ValidateTypedArray(obj, seq-cst)。
  4. len = TypedArrayLength(taRecord)。
  5. 注: 以下のクロージャは文字列比較ではなく数値比較を行う。
  6. SortCompare を (x, y) を取り comparator を捕捉し CompareTypedArrayElements を呼ぶ抽象クロージャとする。
  7. sortedList = ? SortIndexedProperties(obj, len, SortCompare, read-through-holes)。
  8. j = 0。
  9. j < len の間、
    1. Set(obj, ! ToString(𝔽(j)), sortedList[j], true)。
    2. j++。
  10. obj を返す。
Note

NaN は他の任意値より常に大きく比較されるため (CompareTypedArrayElements 参照)、comparator 未指定時は NaN 値は末尾に並ぶ。

23.2.3.30 %TypedArray%.prototype.subarray ( start, end )

このメソッドは元の TypedArray と同じ要素型・同じ ArrayBuffer を参照し、start (含む) から end (含まない) までの要素を参照する新しい TypedArray を返す。start または end が負なら配列末尾からのインデックスを示す。

呼び出し時:

  1. O = this 値。
  2. RequireInternalSlot(O, [[TypedArrayName]])。
  3. アサート: O[[ViewedArrayBuffer]] を持つ。
    1. buffer = O.[[ViewedArrayBuffer]]
  4. srcRecord = MakeTypedArrayWithBufferWitnessRecord(O, seq-cst)。
  5. IsTypedArrayOutOfBounds(srcRecord) が true なら
    1. srcLength = 0。
  6. そうでなければ
    1. srcLength = TypedArrayLength(srcRecord)。
  7. relativeStart = ? ToIntegerOrInfinity(start)。
  8. relativeStart = -∞ なら startIndex = 0。
  9. そうでなく relativeStart < 0 なら startIndex = max(srcLength + relativeStart, 0)。
  10. それ以外 startIndex = min(relativeStart, srcLength)。
  11. elementSize = TypedArrayElementSize(O)。
  12. srcByteOffset = O.[[ByteOffset]]
  13. beginByteOffset = srcByteOffset + (startIndex × elementSize)。
  14. もし O.[[ArrayLength]]auto かつ endundefined なら
    1. argumentsList = « buffer, 𝔽(beginByteOffset) »。
  15. そうでなければ
    1. endundefined なら relativeEnd = srcLength; そうでなければ relativeEnd = ? ToIntegerOrInfinity(end)。
    2. relativeEnd = -∞ なら endIndex = 0。
    3. そうでなく relativeEnd < 0 なら endIndex = max(srcLength + relativeEnd, 0)。
    4. それ以外 endIndex = min(relativeEnd, srcLength)。
    5. newLength = max(endIndex - startIndex, 0)。
    6. argumentsList = « buffer, 𝔽(beginByteOffset), 𝔽(newLength) »。
  16. TypedArraySpeciesCreate(O, argumentsList) を返す。

汎用ではない。

23.2.3.31 %TypedArray%.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

これは 23.1.3.32Array.prototype.toLocaleString と同アルゴリズムを実装するが、"length"[[Get]] の代わりに TypedArrayLength を呼ぶ点が異なる。基礎バッファがリサイズ不可で固定長かつ疎でないことを利用した最適化は許されるが、観測可能な仕様上の挙動を変えてはならない。

汎用ではない。アルゴリズム実行前に ValidateTypedArraythis 値と seq-cst で呼ばれ、その結果が異常完了ならアルゴリズムを実行せず例外を投げる。

Note

実装が ECMA-402 国際化 API を含む場合、このメソッドは ECMA-402 における Array.prototype.toLocaleString アルゴリズムに基づく。

23.2.3.32 %TypedArray%.prototype.toReversed ( )

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. A = ? TypedArrayCreateSameType(O, len)。
  5. k = 0。
  6. k < len の間、
    1. from = ! ToString(𝔽(len - k - 1))。
    2. Pk = ! ToString(𝔽(k))。
    3. fromValue = ! Get(O, from)。
    4. Set(A, Pk, fromValue, true)。
    5. k++。
  7. A を返す。

23.2.3.33 %TypedArray%.prototype.toSorted ( comparator )

呼び出し時:

  1. comparatorundefined でなく IsCallable(comparator) が false なら TypeError
  2. O = this 値。
  3. taRecord = ? ValidateTypedArray(O, seq-cst)。
  4. len = TypedArrayLength(taRecord)。
  5. A = ? TypedArrayCreateSameType(O, len)。
  6. 注: 以下のクロージャは文字列比較でなく数値比較。
  7. SortCompare を (x, y) を取り comparator を捕捉し CompareTypedArrayElements を呼ぶ抽象クロージャとする。
  8. sortedList = ? SortIndexedProperties(O, len, SortCompare, read-through-holes)。
  9. j = 0。
  10. j < len の間、
    1. Set(A, ! ToString(𝔽(j)), sortedList[j], true)。
    2. j++。
  11. A を返す。

23.2.3.34 %TypedArray%.prototype.toString ( )

"toString" プロパティの初期値は 23.1.3.36 で定義される %Array.prototype.toString% である。

23.2.3.35 %TypedArray%.prototype.values ( )

呼び出し時:

  1. O = this 値。
  2. ValidateTypedArray(O, seq-cst)。
  3. CreateArrayIterator(O, value) を返す。

23.2.3.36 %TypedArray%.prototype.with ( index, value )

呼び出し時:

  1. O = this 値。
  2. taRecord = ? ValidateTypedArray(O, seq-cst)。
  3. len = TypedArrayLength(taRecord)。
  4. relativeIndex = ? ToIntegerOrInfinity(index)。
  5. relativeIndex ≥ 0 なら actualIndex = relativeIndex; そうでなければ actualIndex = len + relativeIndex
  6. O.[[ContentType]]bigint なら numericValue = ? ToBigInt(value); そうでなければ numericValue = ? ToNumber(value)。
  7. IsValidIntegerIndex(O, 𝔽(actualIndex)) が false なら RangeError
  8. A = ? TypedArrayCreateSameType(O, len)。
  9. k = 0。
  10. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. k = actualIndex なら fromValue = numericValue; そうでなければ fromValue = ! Get(O, Pk)。
    3. Set(A, Pk, fromValue, true)。
    4. k++。
  11. A を返す。

23.2.3.37 %TypedArray%.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator% プロパティの初期値は 23.2.3.35 で定義される %TypedArray.prototype.values% である。

23.2.3.38 get %TypedArray%.prototype [ %Symbol.toStringTag% ]

%TypedArray%.prototype[%Symbol.toStringTag%] は set アクセサが undefinedアクセサプロパティであり、get アクセサは以下を行う:

  1. O = this 値。
  2. O がオブジェクトでなければ undefined
  3. O[[TypedArrayName]] を持たなければ undefined
  4. name = O.[[TypedArrayName]]
  5. アサート: name は String。
  6. name を返す。

このプロパティは { [[Enumerable]]: false, [[Configurable]]: true } を持つ。

この関数の "name" プロパティ初期値は "get [Symbol.toStringTag]"

23.2.4 TypedArray オブジェクト用抽象操作

23.2.4.1 TypedArrayCreateFromConstructor ( constructor, argumentList )

The abstract operation TypedArrayCreateFromConstructor takes arguments constructor (a constructor) and argumentList (a List of ECMAScript language values) and returns TypedArray を含む通常完了または throw 完了. コンストラクター関数を用いた新規 TypedArray の作成を規定する。 It performs the following steps when called:

  1. newTypedArray = ? Construct(constructor, argumentList)。
  2. taRecord = ? ValidateTypedArray(newTypedArray, seq-cst)。
  3. アサート: newTypedArrayTypedArray インスタンスのプロパティ 記載の内部スロットを全て持つ。
  4. argumentList の要素数が 1 で argumentList[0] が Number なら
    1. IsTypedArrayOutOfBounds(taRecord) が true なら TypeError
    2. length = TypedArrayLength(taRecord)。
    3. length < (argumentList[0]) なら TypeError
  5. newTypedArray を返す。

23.2.4.2 TypedArrayCreateSameType ( exemplar, length )

The abstract operation TypedArrayCreateSameType takes arguments exemplar (a TypedArray) and length (a non-negative integer) and returns TypedArray を含む通常完了または throw 完了. exemplar から派生したコンストラクターと length を用いて新しい TypedArray を生成する。TypedArraySpeciesCreate%Symbol.species% によりカスタムサブクラスを構築できるのに対し常に組込み TypedArray コンストラクターを用いる。 It performs the following steps when called:

  1. constructorexemplar.[[TypedArrayName]] に対応する Table 73 の組込みオブジェクトとする。
  2. result = ? TypedArrayCreateFromConstructor(constructor, « 𝔽(length) »)。
  3. アサート: result[[TypedArrayName]][[ContentType]] を持つ。
  4. アサート: result.[[ContentType]]exemplar.[[ContentType]]
  5. result を返す。

23.2.4.3 TypedArraySpeciesCreate ( exemplar, argumentList )

The abstract operation TypedArraySpeciesCreate takes arguments exemplar (a TypedArray) and argumentList (a List of ECMAScript language values) and returns TypedArray を含む通常完了または throw 完了. exemplar から派生したコンストラクターを用いて新しい TypedArray を作成する。ArraySpeciesCreate と異なり常に実際の TypedArray を生成することを強制する。 It performs the following steps when called:

  1. defaultConstructorexemplar.[[TypedArrayName]] に対応する組込みオブジェクトとする。
  2. constructor = ? SpeciesConstructor(exemplar, defaultConstructor)。
  3. result = ? TypedArrayCreateFromConstructor(constructor, argumentList)。
  4. result.[[ContentType]]exemplar.[[ContentType]] なら TypeError
  5. result を返す。

23.2.4.4 ValidateTypedArray ( O, order )

The abstract operation ValidateTypedArray takes arguments O (an ECMAScript language value) and order (seq-cst or unordered) and returns TypedArray With Buffer Witness Record を含む通常完了または throw 完了. It performs the following steps when called:

  1. RequireInternalSlot(O, [[TypedArrayName]])。
  2. アサート: O[[ViewedArrayBuffer]] を持つ。
  3. taRecord = MakeTypedArrayWithBufferWitnessRecord(O, order)。
  4. IsTypedArrayOutOfBounds(taRecord) が true なら TypeError
  5. taRecord を返す。

23.2.4.5 TypedArrayElementSize ( O )

The abstract operation TypedArrayElementSize takes argument O (a TypedArray) and returns 非負整数. It performs the following steps when called:

  1. O.[[TypedArrayName]] に対し Table 73 で規定された要素サイズ値を返す。

23.2.4.6 TypedArrayElementType ( O )

The abstract operation TypedArrayElementType takes argument O (a TypedArray) and returns TypedArray 要素型. It performs the following steps when called:

  1. O.[[TypedArrayName]] に対し Table 73 で規定された要素型値を返す。

23.2.4.7 CompareTypedArrayElements ( x, y, comparator )

The abstract operation CompareTypedArrayElements takes arguments x (a Number or a BigInt), y (a Number or a BigInt), and comparator (a function object or undefined) and returns Number を含む通常完了または異常完了. It performs the following steps when called:

  1. アサート: xy は両方 Number か両方 BigInt。
  2. comparatorundefined でないなら
    1. v = ? ToNumber(? Call(comparator, undefined, « x, y »))。
    2. vNaN なら +0𝔽
    3. v を返す。
  3. xy が両方 NaN なら +0𝔽
  4. xNaN なら 1𝔽
  5. yNaN なら -1𝔽
  6. x < y なら -1𝔽
  7. x > y なら 1𝔽
  8. x-0𝔽 かつ y+0𝔽 なら -1𝔽
  9. x+0𝔽 かつ y-0𝔽 なら 1𝔽
  10. +0𝔽 を返す。
Note
これは 23.1.3.30.2 の文字列比較ではなく数値比較を行う。

23.2.5 TypedArray コンストラクター

TypedArray コンストラクターは:

  • Table 73 にて TypedArray の代わりに用いられる名称が異なるだけで、以下に記述する構造を持つ組込みオブジェクトである。
  • 引数の数と型により挙動が変わる関数であり、呼び出し時の実際の挙動は渡された引数の数と種類に依存する。
  • 関数として呼び出すことを意図しておらず、その形で呼べば例外を投げる。
  • クラス定義の extends 句に利用できる。指定された TypedArray の挙動を継承するサブクラスコンストラクターは、%TypedArray%.prototype 組込みメソッドを支える内部状態でインスタンスを初期化するため TypedArray コンストラクターへの super 呼び出しを含めねばならない。

23.2.5.1 TypedArray ( ...args )

TypedArray コンストラクターは呼び出し時に以下を行う:

  1. NewTarget が undefined なら TypeError
  2. constructorName をこの TypedArray コンストラクターに対応する Table 73 の Constructor Name の String 値とする。
  3. proto = "%TypedArray.prototype%"
  4. numberOfArgs = args の要素数。
  5. numberOfArgs = 0 なら
    1. AllocateTypedArray(constructorName, NewTarget, proto, 0) を返す。
  6. それ以外
    1. firstArgument = args[0]。
    2. firstArgument がオブジェクトなら
      1. O = ? AllocateTypedArray(constructorName, NewTarget, proto)。
      2. firstArgument[[TypedArrayName]] を持つなら
        1. InitializeTypedArrayFromTypedArray(O, firstArgument)。
      3. そうでなく [[ArrayBufferData]] を持つなら
        1. numberOfArgs > 1 なら byteOffset = args[1]; そうでなければ undefined
        2. numberOfArgs > 2 なら length = args[2]; そうでなければ undefined
        3. InitializeTypedArrayFromArrayBuffer(O, firstArgument, byteOffset, length)。
      4. それ以外
        1. アサート: firstArgument はオブジェクトで [[TypedArrayName]][[ArrayBufferData]] も持たない。
        2. usingIterator = ? GetMethod(firstArgument, %Symbol.iterator%)。
        3. usingIteratorundefined でなければ
          1. values = ? IteratorToList(? GetIteratorFromMethod(firstArgument, usingIterator))。
          2. InitializeTypedArrayFromList(O, values)。
        4. そうでなければ
          1. 注: firstArgumentiterable でないので配列ライクと仮定。
          2. InitializeTypedArrayFromArrayLike(O, firstArgument)。
      5. O を返す。
    3. そうでなければ
      1. アサート: firstArgument はオブジェクトでない。
      2. elementLength = ? ToIndex(firstArgument)。
      3. AllocateTypedArray(constructorName, NewTarget, proto, elementLength) を返す。

23.2.5.1.1 AllocateTypedArray ( constructorName, newTarget, defaultProto [ , length ] )

The abstract operation AllocateTypedArray takes arguments constructorName (Table 73 にある TypedArray コンストラクター名 String), newTarget (a constructor), and defaultProto (a String) and optional argument length (非負整数) and returns TypedArray を含む通常完了または throw 完了. TypedArray コンストラクターインスタンスを検証・生成する。length が渡されればその長さの ArrayBuffer も割当て関連付ける。TypedArray が用いる共通セマンティクスを提供。 It performs the following steps when called:

  1. proto = ? GetPrototypeFromConstructor(newTarget, defaultProto)。
  2. obj = TypedArrayCreate(proto)。
  3. アサート: obj.[[ViewedArrayBuffer]]undefined
  4. obj.[[TypedArrayName]] = constructorName
  5. constructorName"BigInt64Array" または "BigUint64Array" なら obj.[[ContentType]] = bigint
  6. それ以外は obj.[[ContentType]] = number
  7. length 非存在なら
    1. obj.[[ByteLength]] = 0。
    2. obj.[[ByteOffset]] = 0。
    3. obj.[[ArrayLength]] = 0。
  8. そうでなければ
    1. AllocateTypedArrayBuffer(obj, length)。
  9. obj を返す。

23.2.5.1.2 InitializeTypedArrayFromTypedArray ( O, srcArray )

The abstract operation InitializeTypedArrayFromTypedArray takes arguments O (a TypedArray) and srcArray (a TypedArray) and returns unused を含む通常完了または throw 完了. It performs the following steps when called:

  1. srcData = srcArray.[[ViewedArrayBuffer]]
  2. elementType = TypedArrayElementType(O)。
  3. elementSize = TypedArrayElementSize(O)。
  4. srcType = TypedArrayElementType(srcArray)。
  5. srcElementSize = TypedArrayElementSize(srcArray)。
  6. srcByteOffset = srcArray.[[ByteOffset]]
  7. srcRecord = MakeTypedArrayWithBufferWitnessRecord(srcArray, seq-cst)。
  8. IsTypedArrayOutOfBounds(srcRecord) が true なら TypeError
  9. elementLength = TypedArrayLength(srcRecord)。
  10. byteLength = elementSize × elementLength
  11. elementType = srcType なら
    1. data = ? CloneArrayBuffer(srcData, srcByteOffset, byteLength)。
  12. そうでなければ
    1. data = ? AllocateArrayBuffer(%ArrayBuffer%, byteLength)。
    2. srcArray.[[ContentType]]O.[[ContentType]] なら TypeError
    3. srcByteIndex = srcByteOffset
    4. targetByteIndex = 0。
    5. count = elementLength
    6. count > 0 の間、
      1. value = GetValueFromBuffer(srcData, srcByteIndex, srcType, true, unordered)。
      2. SetValueInBuffer(data, targetByteIndex, elementType, value, true, unordered)。
      3. srcByteIndex += srcElementSize
      4. targetByteIndex += elementSize
      5. count--。
  13. O.[[ViewedArrayBuffer]] = data
  14. O.[[ByteLength]] = byteLength
  15. O.[[ByteOffset]] = 0。
  16. O.[[ArrayLength]] = elementLength
  17. unused を返す。

23.2.5.1.3 InitializeTypedArrayFromArrayBuffer ( O, buffer, byteOffset, length )

The abstract operation InitializeTypedArrayFromArrayBuffer takes arguments O (a TypedArray), buffer (an ArrayBuffer or a SharedArrayBuffer), byteOffset (an ECMAScript language value), and length (an ECMAScript language value) and returns unused を含む通常完了または throw 完了. It performs the following steps when called:

  1. elementSize = TypedArrayElementSize(O)。
  2. offset = ? ToIndex(byteOffset)。
  3. offset mod elementSize ≠ 0 なら RangeError
  4. bufferIsFixedLength = IsFixedLengthArrayBuffer(buffer)。
  5. lengthundefined でなければ
    1. newLength = ? ToIndex(length)。
  6. IsDetachedBuffer(buffer) が true なら TypeError
  7. bufferByteLength = ArrayBufferByteLength(buffer, seq-cst)。
  8. lengthundefined かつ bufferIsFixedLengthfalse なら
    1. offset > bufferByteLength なら RangeError
    2. O.[[ByteLength]] = auto
    3. O.[[ArrayLength]] = auto
  9. そうでなければ
    1. もし lengthundefined なら
      1. bufferByteLength mod elementSize ≠ 0 なら RangeError
      2. newByteLength = bufferByteLength - offset
      3. newByteLength < 0 なら RangeError
    2. そうでなければ
      1. newByteLength = newLength × elementSize
      2. offset + newByteLength > bufferByteLength なら RangeError
    3. O.[[ByteLength]] = newByteLength
    4. O.[[ArrayLength]] = newByteLength / elementSize
  10. O.[[ViewedArrayBuffer]] = buffer
  11. O.[[ByteOffset]] = offset
  12. unused を返す。

23.2.5.1.4 InitializeTypedArrayFromList ( O, values )

The abstract operation InitializeTypedArrayFromList takes arguments O (a TypedArray) and values (a List of ECMAScript language values) and returns unused を含む通常完了または throw 完了. It performs the following steps when called:

  1. len = values の要素数。
  2. AllocateTypedArrayBuffer(O, len)。
  3. k = 0。
  4. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = values の先頭要素。
    3. values から先頭を除去。
    4. Set(O, Pk, kValue, true)。
    5. k++。
  5. アサート: values は空。
  6. unused を返す。

23.2.5.1.5 InitializeTypedArrayFromArrayLike ( O, arrayLike )

The abstract operation InitializeTypedArrayFromArrayLike takes arguments O (a TypedArray) and arrayLike (an Object, but not a TypedArray or an ArrayBuffer) and returns unused を含む通常完了または throw 完了. It performs the following steps when called:

  1. len = ? LengthOfArrayLike(arrayLike)。
  2. AllocateTypedArrayBuffer(O, len)。
  3. k = 0。
  4. k < len の間、
    1. Pk = ! ToString(𝔽(k))。
    2. kValue = ? Get(arrayLike, Pk)。
    3. Set(O, Pk, kValue, true)。
    4. k++。
  5. unused を返す。

23.2.5.1.6 AllocateTypedArrayBuffer ( O, length )

The abstract operation AllocateTypedArrayBuffer takes arguments O (a TypedArray) and length (a non-negative integer) and returns unused を含む通常完了または throw 完了. O に ArrayBuffer を割当て関連付ける。 It performs the following steps when called:

  1. アサート: O.[[ViewedArrayBuffer]]undefined
  2. elementSize = TypedArrayElementSize(O)。
  3. byteLength = elementSize × length
  4. data = ? AllocateArrayBuffer(%ArrayBuffer%, byteLength)。
  5. O.[[ViewedArrayBuffer]] = data
  6. O.[[ByteLength]] = byteLength
  7. O.[[ByteOffset]] = 0。
  8. O.[[ArrayLength]] = length
  9. unused を返す。

23.2.6 TypedArray コンストラクターのプロパティ

TypedArray コンストラクターは:

  • [[Prototype]] 内部スロット値が %TypedArray%
  • "length" プロパティ値は 3𝔽
  • "name" プロパティ値は Table 73 に規定されたコンストラクター名の String 値。
  • 以下のプロパティを持つ:

23.2.6.1 TypedArray.BYTES_PER_ELEMENT

TypedArray.BYTES_PER_ELEMENT の値は Table 73 における TypedArray の要素サイズ値。

属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

23.2.6.2 TypedArray.prototype

TypedArray.prototype の初期値は対応する TypedArray プロトタイプ組込みオブジェクト (23.2.7) である。

属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

23.2.7 TypedArray プロトタイプオブジェクトのプロパティ

TypedArray プロトタイプオブジェクトは:

  • [[Prototype]] 内部スロット値が %TypedArray.prototype%
  • 通常のオブジェクト。
  • [[ViewedArrayBuffer]] など TypedArray インスタンス固有内部スロットを持たない。

23.2.7.1 TypedArray.prototype.BYTES_PER_ELEMENT

TypedArray.prototype.BYTES_PER_ELEMENT の値は Table 73 における TypedArray の要素サイズ値。

属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

23.2.7.2 TypedArray.prototype.constructor

与えられた TypedArray コンストラクターのプロトタイプにおける "constructor" プロパティ初期値はそのコンストラクター自身である。

23.2.8 TypedArray インスタンスのプロパティ

TypedArray インスタンスは TypedArray である。各 TypedArray インスタンスは対応する TypedArray プロトタイプオブジェクトからプロパティを継承し、[[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] の内部スロットを持つ。

24 キー付きコレクション

24.1 Map オブジェクト

Map はキー/値ペアのコレクションであり、キーと値の両方に任意の ECMAScript 言語値を使用できる。Map のコレクション内では、同一のキー値はただ 1 つのキー/値ペアにしか現れない。異なるキー値の判別には SameValueZero 比較アルゴリズムの意味論が用いられる。

Map はハッシュテーブルまたはコレクション内要素数に対して平均で亜線形のアクセス時間を提供する他の機構を用いて実装されなければならない。本仕様で用いるデータ構造は Map の必要な観測可能セマンティクスを記述するためだけのものであり、実際に成立する実装モデルであることを意図しない。

24.1.1 Map コンストラクター

Map コンストラクター:

  • %Map% である。
  • グローバルオブジェクト"Map" プロパティの初期値である。
  • コンストラクターとして呼ばれたとき新しい Map を生成し初期化する。
  • 関数として呼び出すことは意図されておらず、その形で呼び出されると例外を投げる。
  • クラス定義の extends 句の値として使用できる。指定された Map の挙動を継承することを意図するサブクラスコンストラクターは、Map.prototype 組込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、Map コンストラクターへの super 呼び出しを含めなければならない。

24.1.1.1 Map ( [ iterable ] )

この関数は呼び出し時に次を行う:

  1. NewTarget が undefined なら TypeError 例外を投げる。
  2. map を ? OrdinaryCreateFromConstructor(NewTarget, "%Map.prototype%", « [[MapData]] ») とする。
  3. map.[[MapData]] を新しい空 List に設定する。
  4. iterableundefined または null なら map を返す。
  5. adder を ? Get(map, "set") とする。
  6. IsCallable(adder) が false なら TypeError 例外。
  7. AddEntriesFromIterable(map, iterable, adder) を返す。
Note

引数 iterable が与えられる場合、それは %Symbol.iterator% メソッドを実装し、最初の要素が Map のキーとして用いられる値、2 番目の要素がそのキーに関連付ける値である 2 要素の配列ライクオブジェクトを生成するイテレータオブジェクトを返すオブジェクトであることが期待される。

24.1.1.2 AddEntriesFromIterable ( target, iterable, adder )

The abstract operation AddEntriesFromIterable takes arguments target (an Object), iterable (an ECMAScript language value, but not undefined or null), and adder (a function object) and returns either a normal completion containing an ECMAScript language value or a throw completion. addertarget をレシーバとして呼び出される。 It performs the following steps when called:

  1. iteratorRecord を ? GetIterator(iterable, sync) とする。
  2. 繰り返し、
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone なら target を返す。
    3. next がオブジェクトでないなら
      1. errorThrowCompletion(新規 TypeError オブジェクト) とする。
      2. IteratorClose(iteratorRecord, error) を返す。
    4. kCompletion(Get(next, "0" )) とする。
    5. IfAbruptCloseIterator(k, iteratorRecord)。
    6. vCompletion(Get(next, "1" )) とする。
    7. IfAbruptCloseIterator(v, iteratorRecord)。
    8. statusCompletion(Call(adder, target, « k, v »)) とする。
    9. IfAbruptCloseIterator(status, iteratorRecord)。
Note

引数 iterable%Symbol.iterator% メソッドを実装し、最初の要素が Map のキー、2 番目の要素がそのキーに対応する値である 2 要素配列ライクを生成するイテレータオブジェクトを返すオブジェクトであることが期待される。

24.1.2 Map コンストラクターのプロパティ

Map コンストラクター:

  • [[Prototype]] 内部スロットの値が %Function.prototype% である。
  • 以下のプロパティを持つ:

24.1.2.1 Map.groupBy ( items, callback )

Note

callback は 2 つの引数を受け取る関数であるべき。groupByitems の各要素に対し昇順で callback を 1 度ずつ呼び、新しい Map を構築する。callback が返した各値は Map のキーとして用いられる。そのキーごとに、結果 Map はそのキーをキーとし、callback がそのキーを返した全要素を含む配列を値とするエントリを持つ。

callback は 2 つの引数 (要素の値、要素のインデックス) で呼ばれる。

groupBy の戻り値は Map である。

この関数は呼び出し時に次を行う:

  1. groups を ? GroupBy(items, callback, collection) とする。
  2. map を ! Construct(%Map%) とする。
  3. Record { [[Key]], [[Elements]] } ggroups について
    1. elementsCreateArrayFromList(g.[[Elements]]) とする。
    2. entry を { [[Key]]: g.[[Key]], [[Value]]: elements } という Record とする。
    3. entrymap.[[MapData]] に追加する。
  4. map を返す。

24.1.2.2 Map.prototype

Map.prototype の初期値は Map プロトタイプオブジェクトである。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } の属性を持つ。

24.1.2.3 get Map [ %Symbol.species% ]

Map[%Symbol.species%] は set アクセサが undefinedアクセサプロパティであり、その get アクセサは呼び出し時に次を行う:

  1. this 値を返す。

この関数の "name" プロパティの値は "get [Symbol.species]" である。

Note

派生コレクションオブジェクトを生成するメソッドは %Symbol.species% を呼び出して派生オブジェクトを生成するためのコンストラクターを決定すべき。サブクラスコンストラクターは %Symbol.species% を再定義して既定のコンストラクター割り当てを変更できる。

24.1.3 Map プロトタイプオブジェクトのプロパティ

Map プロトタイプオブジェクト:

  • %Map.prototype% である。
  • [[Prototype]] 内部スロットの値が %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[MapData]] 内部スロットを持たない。

24.1.3.1 Map.prototype.clear ( )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値とする。
  2. RequireInternalSlot(M, [[MapData]]) を実行。
  3. Record { [[Key]], [[Value]] } pM.[[MapData]] について
    1. p.[[Key]]empty に設定。
    2. p.[[Value]]empty に設定。
  4. undefined を返す。
Note

既存の [[MapData]] List は保持される。これはその List 上の反復途中で一時停止している Map Iterator オブジェクトが存在する可能性があるためである。

24.1.3.2 Map.prototype.constructor

Map.prototype.constructor の初期値は %Map% である。

24.1.3.3 Map.prototype.delete ( key )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値とする。
  2. RequireInternalSlot(M, [[MapData]])。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定。
  4. Record { [[Key]], [[Value]] } pM.[[MapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら
      1. p.[[Key]]empty に。
      2. p.[[Value]]empty に。
      3. true を返す。
  5. false を返す。
Note

empty はエントリが削除されたことを示す仕様上の装置として用いられる。実装は内部データ構造から物理的にエントリを除去するなど別の手段を取ってもよい。

24.1.3.4 Map.prototype.entries ( )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値とする。
  2. CreateMapIterator(M, key+value) を返す。

24.1.3.5 Map.prototype.forEach ( callback [ , thisArg ] )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[MapData]])。
  3. IsCallable(callback) が false なら TypeError
  4. entriesM.[[MapData]]
  5. numEntriesentries の要素数。
  6. index = 0。
  7. index < numEntries の間繰り返し、
    1. e = entries[index]。
    2. indexindex + 1 に。
    3. e.[[Key]]empty でなければ
      1. ? Call(callback, thisArg, « e.[[Value]], e.[[Key]], M »)。
      2. 注: callback の実行中に entries の要素数が増加した可能性がある。
      3. numEntriesentries の要素数に設定。
  8. undefined を返す。
Note

callback は 3 引数を受け取る関数であるべき。forEach は Map に存在する各キー/値ペアについてキー挿入順に 1 度ずつ callback を呼ぶ。削除済みキーについては呼ばれない。

thisArg が与えられれば各呼出しの this 値として用いられ、無ければ undefined

callback は (値, キー, 走査対象 Map) で呼ばれる。

forEach 自体は直接オブジェクトをミューテートしないが callback により変更され得る。Map の [[MapData]] の各エントリは 1 度だけ訪問される。forEach 開始後に追加された新しいキーは訪問される。訪問後に削除され再追加されたキーは再訪問され得る。開始後に削除され訪問前のキーは再追加されない限り訪問されない。

24.1.3.6 Map.prototype.get ( key )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[MapData]])。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定。
  4. Record { [[Key]], [[Value]] } pM.[[MapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら p.[[Value]] を返す。
  5. undefined を返す。

24.1.3.7 Map.prototype.has ( key )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[MapData]])。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定。
  4. Record { [[Key]], [[Value]] } pM.[[MapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら true を返す。
  5. false を返す。

24.1.3.8 Map.prototype.keys ( )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. CreateMapIterator(M, key) を返す。

24.1.3.9 Map.prototype.set ( key, value )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[MapData]])。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定。
  4. Record { [[Key]], [[Value]] } pM.[[MapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら
      1. p.[[Value]]value に設定。
      2. M を返す。
  5. p を { [[Key]]: key, [[Value]]: value } とする Record とする。
  6. pM.[[MapData]] に追加。
  7. M を返す。

24.1.3.10 get Map.prototype.size

Map.prototype.size は set アクセサが undefinedアクセサプロパティであり、その get アクセサは呼び出し時に次を行う:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[MapData]])。
  3. count を 0 とする。
  4. Record { [[Key]], [[Value]] } pM.[[MapData]] について
    1. p.[[Key]]empty でなければ countcount + 1 に設定。
  5. 𝔽(count) を返す。

24.1.3.11 Map.prototype.values ( )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. CreateMapIterator(M, value) を返す。

24.1.3.12 Map.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator% プロパティの初期値は 24.1.3.4 で定義される %Map.prototype.entries% である。

24.1.3.13 Map.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "Map" である。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } の属性を持つ。

24.1.4 Map インスタンスのプロパティ

Map インスタンスは通常のオブジェクトであり、Map プロトタイプオブジェクトからプロパティを継承する。Map インスタンスは [[MapData]] 内部スロットも持つ。

24.1.5 Map イテレータオブジェクト

Map Iterator は特定の Map インスタンスオブジェクト上の特定の反復を表すオブジェクトである。Map Iterator オブジェクトには名前付きコンストラクターは存在しない。代わりに、Map インスタンスオブジェクトの特定メソッド呼出により生成される。

24.1.5.1 CreateMapIterator ( map, kind )

The abstract operation CreateMapIterator takes arguments map (an ECMAScript language value) and kind (key+value, key, or value) and returns either a normal completion containing a Generator or a throw completion. Map メソッドのうち、そのようなイテレータを返すもののためのイテレータオブジェクトを生成するために用いられる。 It performs the following steps when called:

  1. RequireInternalSlot(map, [[MapData]]) を実行。
  2. 引数なしで mapkind を捕捉し呼び出し時に以下を行う新しい抽象クロージャ closure を作成:
    1. entriesmap.[[MapData]]
    2. index = 0。
    3. numEntriesentries の要素数。
    4. index < numEntries の間繰り返し、
      1. e = entries[index]。
      2. indexindex + 1。
      3. e.[[Key]]empty でなければ
        1. kindkey なら
          1. result = e.[[Key]]
        2. そうでなく kindvalue なら
          1. result = e.[[Value]]
        3. それ以外
          1. アサート: kindkey+value
          2. result = CreateArrayFromListe.[[Key]], e.[[Value]] »)。
        4. GeneratorYield(CreateIteratorResultObject(result, false)) を実行。
        5. 注: GeneratorYield による一時停止中に entries の要素数が増加した可能性がある。
        6. numEntriesentries の要素数に設定。
    5. NormalCompletion(unused) を返す。
  3. CreateIteratorFromClosure(closure, "%MapIteratorPrototype%", %MapIteratorPrototype%) を返す。

24.1.5.2 %MapIteratorPrototype% オブジェクト

%MapIteratorPrototype% オブジェクト:

  • Map Iterator オブジェクトが継承するプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]] 内部スロットの値は %Iterator.prototype%
  • 以下のプロパティを持つ:

24.1.5.2.1 %MapIteratorPrototype%.next ( )

  1. GeneratorResume(this value, empty, "%MapIteratorPrototype%") を返す。

24.1.5.2.2 %MapIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "Map Iterator" である。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } の属性を持つ。

24.2 Set オブジェクト

Set オブジェクトは ECMAScript 言語値のコレクションである。異なる値は Set のコレクション内で 1 度だけ要素として現れる。異なる値の判別には SameValueZero 比較アルゴリズムの意味論が用いられる。

Set オブジェクトはハッシュテーブルまたはコレクション内要素数に対し平均で亜線形アクセス時間を提供する他の機構を用いて実装されなければならない。本仕様で用いるデータ構造は Set オブジェクトの必要な観測可能セマンティクスを記述するためのみのものであり、実装モデルとなることを意図しない。

24.2.1 Set オブジェクトに関する抽象操作

24.2.1.1 Set Record

Set Record は Set または類似オブジェクトのインターフェースをカプセル化するために用いられる Record 値である。

Set Record は Table 74 に列挙したフィールドを持つ。

Table 74: Set Record のフィールド
フィールド名 意味
[[SetObject]] an Object Set または類似オブジェクト。
[[Size]] a non-negative integer or +∞ オブジェクトの報告サイズ。
[[Has]] a function object オブジェクトの has メソッド。
[[Keys]] a function object オブジェクトの keys メソッド。

24.2.1.2 GetSetRecord ( obj )

The abstract operation GetSetRecord takes argument obj (an ECMAScript language value) and returns either a normal completion containing a Set Record or a throw completion. It performs the following steps when called:

  1. obj がオブジェクトでなければ TypeError 例外。
  2. rawSize を ? Get(obj, "size") とする。
  3. numSize を ? ToNumber(rawSize) とする。
  4. 注: rawSizeundefined の場合 numSizeNaN になる。
  5. numSizeNaN なら TypeError 例外。
  6. intSize を ! ToIntegerOrInfinity(numSize) とする。
  7. intSize < 0 なら RangeError 例外。
  8. has を ? Get(obj, "has")。
  9. IsCallable(has) が false なら TypeError 例外。
  10. keys を ? Get(obj, "keys")。
  11. IsCallable(keys) が false なら TypeError 例外。
  12. 新しい Set Record { [[SetObject]]: obj, [[Size]]: intSize, [[Has]]: has, [[Keys]]: keys } を返す。

24.2.1.3 SetDataHas ( setData, value )

The abstract operation SetDataHas takes arguments setData (a List of either ECMAScript language values or empty) and value (an ECMAScript language value) and returns a Boolean. It performs the following steps when called:

  1. SetDataIndex(setData, value) が not-found なら false を返す。
  2. true を返す。

24.2.1.4 SetDataIndex ( setData, value )

The abstract operation SetDataIndex takes arguments setData (a List of either ECMAScript language values or empty) and value (an ECMAScript language value) and returns a non-negative integer or not-found. It performs the following steps when called:

  1. valueCanonicalizeKeyedCollectionKey(value) に設定。
  2. sizesetData の要素数とする。
  3. index = 0。
  4. index < size の間、
    1. e = setData[index]。
    2. eempty でなく evalue なら
      1. index を返す。
    3. index = index + 1。
  5. not-found を返す。

24.2.1.5 SetDataSize ( setData )

The abstract operation SetDataSize takes argument setData (a List of either ECMAScript language values or empty) and returns a non-negative integer. It performs the following steps when called:

  1. count = 0。
  2. 各要素 esetData について
    1. eempty でなければ count = count + 1。
  3. count を返す。

24.2.2 Set コンストラクター

Set コンストラクター:

  • %Set% である。
  • グローバルオブジェクト"Set" プロパティの初期値である。
  • コンストラクターとして呼ばれたとき新しい Set オブジェクトを生成し初期化する。
  • 関数として呼び出すことは意図されておらず、その形で呼ばれると例外を投げる。
  • クラス定義の extends 句の値として使用できる。指定された Set の挙動を継承するサブクラスコンストラクターは、Set.prototype 組込みメソッドをサポートするための内部状態でサブクラスインスタンスを生成・初期化するため、Set コンストラクターへの super 呼び出しを含めなければならない。

24.2.2.1 Set ( [ iterable ] )

この関数は呼び出し時に次を行う:

  1. NewTarget が undefined なら TypeError 例外。
  2. set を ? OrdinaryCreateFromConstructor(NewTarget, "%Set.prototype%", « [[SetData]] ») とする。
  3. set.[[SetData]] を新しい空 List に設定。
  4. iterableundefined または null なら set を返す。
  5. adder を ? Get(set, "add") とする。
  6. IsCallable(adder) が false なら TypeError 例外。
  7. iteratorRecord を ? GetIterator(iterable, sync) とする。
  8. 繰り返し、
    1. next = ? IteratorStepValue(iteratorRecord)。
    2. nextdone なら set を返す。
    3. statusCompletion(Call(adder, set, « next »)) とする。
    4. IfAbruptCloseIterator(status, iteratorRecord)。

24.2.3 Set コンストラクターのプロパティ

Set コンストラクター:

  • [[Prototype]] 内部スロットの値が %Function.prototype% である。
  • 以下のプロパティを持つ:

24.2.3.1 Set.prototype

Set.prototype の初期値は Set プロトタイプオブジェクトである。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } の属性を持つ。

24.2.3.2 get Set [ %Symbol.species% ]

Set[%Symbol.species%] は set アクセサが undefinedアクセサプロパティであり、その get アクセサは呼び出し時に次を行う:

  1. this 値を返す。

この関数の "name" プロパティの値は "get [Symbol.species]" である。

Note

派生コレクションオブジェクトを生成するメソッドは %Symbol.species% を呼び出して派生オブジェクトを生成するのに使用するコンストラクターを決定すべき。サブクラスコンストラクターは %Symbol.species% を再定義して既定のコンストラクター割り当てを変更できる。

24.2.4 Set プロトタイプオブジェクトのプロパティ

Set プロトタイプオブジェクト:

  • %Set.prototype% である。
  • [[Prototype]] 内部スロットの値が %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[SetData]] 内部スロットを持たない。

24.2.4.1 Set.prototype.add ( value )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[SetData]])。
  3. valueCanonicalizeKeyedCollectionKey(value) に設定。
  4. 各要素 eS.[[SetData]] について
    1. eempty でなく SameValue(e, value) が true なら
      1. S を返す。
  5. valueS.[[SetData]] に追加。
  6. S を返す。

24.2.4.2 Set.prototype.clear ( )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[SetData]])。
  3. 各要素 eS.[[SetData]] について
    1. 値が e の要素を値が empty の要素で置き換える。
  4. undefined を返す。
Note

既存の [[SetData]] List は保持される。これはその List 上の反復途中で一時停止している Set Iterator オブジェクトが存在する可能性があるためである。

24.2.4.3 Set.prototype.constructor

Set.prototype.constructor の初期値は %Set% である。

24.2.4.4 Set.prototype.delete ( value )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[SetData]])。
  3. valueCanonicalizeKeyedCollectionKey(value) に設定。
  4. 各要素 eS.[[SetData]] について
    1. eempty でなく SameValue(e, value) が true なら
      1. 値が e の要素を値が empty の要素で置き換える。
      2. true を返す。
  5. false を返す。
Note

empty は削除済みエントリを示す仕様上の装置。実装は内部構造から実際に除去するなど他の手段を取ってよい。

24.2.4.5 Set.prototype.difference ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. resultSetDataO.[[SetData]] のコピーとする。
  5. もし SetDataSize(O.[[SetData]]) ≤ otherRec.[[Size]] なら
    1. thisSizeO.[[SetData]] の要素数とする。
    2. index = 0。
    3. index < thisSize の間、
      1. e = resultSetData[index]。
      2. eempty でなければ
        1. inOther = ToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « e »))。
        2. inOthertrue なら
          1. resultSetData[index] = empty
      3. index = index + 1。
  6. それ以外
    1. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])。
    2. next = not-started
    3. nextdone でない間、
      1. next = ? IteratorStepValue(keysIter)。
      2. nextdone でなければ
        1. next = CanonicalizeKeyedCollectionKey(next)。
        2. valueIndex = SetDataIndex(resultSetData, next)。
        3. valueIndexnot-found でなければ
          1. resultSetData[valueIndex] = empty
  7. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») とする。
  8. result.[[SetData]] = resultSetData
  9. result を返す。

24.2.4.6 Set.prototype.entries ( )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. CreateSetIterator(S, key+value) を返す。
Note

反復目的では、Set は各エントリのキーと値が同一である Map に似て見える。

24.2.4.7 Set.prototype.forEach ( callback [ , thisArg ] )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[SetData]])。
  3. IsCallable(callback) が false なら TypeError
  4. entries = S.[[SetData]]
  5. numEntries = entries の要素数。
  6. index = 0。
  7. index < numEntries の間、
    1. e = entries[index]。
    2. index = index + 1。
    3. eempty でなければ
      1. ? Call(callback, thisArg, « e, e, S »)。
      2. 注: callback 実行中に entries の要素数が増加した可能性がある。
      3. numEntriesentries の要素数に設定。
  8. undefined を返す。
Note

callback は 3 引数を受け取る関数であるべき。forEach は Set オブジェクト内の各値に対して値挿入順で callback を 1 度呼ぶ。削除済みの値については呼ばれない。

thisArg が与えられれば各呼出しの this 値として使用し、無ければ undefined

callback は 3 引数で呼ばれる: 最初の 2 引数は Set に含まれる値で同一の値、3 番目は走査対象の Set。

callback が 3 引数で呼ばれるのは Map や Array の forEach のコールバックと整合性を保つため。Set では各項目値がキーと値の双方であるとみなされる。

forEach 自体は直接オブジェクトを変更しないが、callback により変更され得る。

各値は通常 1 度だけ訪問されるが、訪問後削除され完了前に再追加された場合は再訪問される。開始後に削除され訪問前であった値は完了前に再追加されない限り訪問されない。開始後に追加された新しい値は訪問される。

24.2.4.8 Set.prototype.has ( value )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[SetData]])。
  3. valueCanonicalizeKeyedCollectionKey(value) に設定。
  4. 各要素 eS.[[SetData]] について
    1. eempty でなく SameValue(e, value) が true なら true を返す。
  5. false を返す。

24.2.4.9 Set.prototype.intersection ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. resultSetData を新しい空 List とする。
  5. もし SetDataSize(O.[[SetData]]) ≤ otherRec.[[Size]] なら
    1. thisSizeO.[[SetData]] の要素数。
    2. index = 0。
    3. index < thisSize の間、
      1. e = O.[[SetData]][index]。
      2. index = index + 1。
      3. eempty でなければ
        1. inOther = ToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « e »))。
        2. inOthertrue なら
          1. 注: 以前の otherRec.[[Has]] 呼出しが O.[[SetData]] の要素を削除再追加し、この反復で同じ要素が 2 度訪問され得る。
          2. SetDataHas(resultSetData, e) が false なら resultSetDatae を追加。
        3. 注: otherRec.[[Has]] 実行中に O.[[SetData]] の要素数が増えた可能性。
        4. thisSizeO.[[SetData]] の要素数に設定。
  6. それ以外
    1. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])。
    2. next = not-started
    3. nextdone でない間、
      1. next = ? IteratorStepValue(keysIter)。
      2. nextdone でなければ
        1. next = CanonicalizeKeyedCollectionKey(next)。
        2. inThis = SetDataHas(O.[[SetData]], next)。
        3. inThistrue なら
          1. 注: other は任意のオブジェクトであるためその "keys" イテレータが同じ値を複数回生成し得る。
          2. SetDataHas(resultSetData, next) が false なら resultSetDatanext を追加。
  7. result = OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)。
  8. result.[[SetData]] = resultSetData
  9. result を返す。

24.2.4.10 Set.prototype.isDisjointFrom ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. もし SetDataSize(O.[[SetData]]) ≤ otherRec.[[Size]] なら
    1. thisSizeO.[[SetData]] の要素数。
    2. index = 0。
    3. index < thisSize の間、
      1. e = O.[[SetData]][index]。
      2. index = index + 1。
      3. eempty でなければ
        1. inOther = ToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « e »))。
        2. inOthertrue なら false を返す。
        3. 注: otherRec.[[Has]] 実行中に O.[[SetData]] の要素数が増加した可能性。
        4. thisSizeO.[[SetData]] の要素数に設定。
  5. それ以外
    1. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])。
    2. next = not-started
    3. nextdone でない間、
      1. next = ? IteratorStepValue(keysIter)。
      2. nextdone でなければ
        1. SetDataHas(O.[[SetData]], next) が true なら
          1. IteratorClose(keysIter, NormalCompletion(unused)) を実行。
          2. false を返す。
  6. true を返す。

24.2.4.11 Set.prototype.isSubsetOf ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. SetDataSize(O.[[SetData]]) > otherRec.[[Size]] なら false を返す。
  5. thisSizeO.[[SetData]] の要素数。
  6. index = 0。
  7. index < thisSize の間、
    1. e = O.[[SetData]][index]。
    2. index = index + 1。
    3. eempty でなければ
      1. inOther = ToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « e »))。
      2. inOtherfalse なら false を返す。
      3. 注: otherRec.[[Has]] 実行中に O.[[SetData]] の要素数が増加した可能性。
      4. thisSizeO.[[SetData]] の要素数に設定。
  8. true を返す。

24.2.4.12 Set.prototype.isSupersetOf ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. SetDataSize(O.[[SetData]]) < otherRec.[[Size]] なら false を返す。
  5. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])。
  6. next = not-started
  7. nextdone でない間、
    1. next = ? IteratorStepValue(keysIter)。
    2. nextdone でなければ
      1. SetDataHas(O.[[SetData]], next) が false なら
        1. IteratorClose(keysIter, NormalCompletion(unused))。
        2. false を返す。
  8. true を返す。

24.2.4.13 Set.prototype.keys ( )

"keys" プロパティの初期値は 24.2.4.17 で定義される %Set.prototype.values% である。

Note

反復目的では、Set は各エントリのキーと値が同一の Map のように見える。

24.2.4.14 get Set.prototype.size

Set.prototype.size は set アクセサが undefinedアクセサプロパティであり、その get アクセサは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[SetData]])。
  3. size = SetDataSize(S.[[SetData]])。
  4. 𝔽(size) を返す。

24.2.4.15 Set.prototype.symmetricDifference ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])。
  5. resultSetDataO.[[SetData]] のコピーとする。
  6. next = not-started
  7. nextdone でない間、
    1. next = ? IteratorStepValue(keysIter)。
    2. nextdone でなければ
      1. next = CanonicalizeKeyedCollectionKey(next)。
      2. resultIndex = SetDataIndex(resultSetData, next)。
      3. resultIndexnot-found なら alreadyInResult = false、そうでなければ true
      4. SetDataHas(O.[[SetData]], next) が true なら
        1. alreadyInResulttrue なら resultSetData[resultIndex] = empty
      5. そうでなければ
        1. alreadyInResultfalse なら resultSetDatanext を追加。
  8. result = OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)。
  9. result.[[SetData]] = resultSetData
  10. result を返す。

24.2.4.16 Set.prototype.union ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])。
  5. resultSetDataO.[[SetData]] のコピーとする。
  6. next = not-started
  7. nextdone でない間、
    1. next = ? IteratorStepValue(keysIter)。
    2. nextdone でなければ
      1. next = CanonicalizeKeyedCollectionKey(next)。
      2. SetDataHas(resultSetData, next) が false なら
        1. resultSetDatanext を追加。
  8. result = OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)。
  9. result.[[SetData]] = resultSetData
  10. result を返す。

24.2.4.17 Set.prototype.values ( )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. CreateSetIterator(S, value) を返す。

24.2.4.18 Set.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator% プロパティの初期値は 24.2.4.17 で定義される %Set.prototype.values% である。

24.2.4.19 Set.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "Set" である。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } の属性を持つ。

24.2.5 Set インスタンスのプロパティ

Set インスタンスは通常のオブジェクトであり、Set プロトタイプオブジェクトからプロパティを継承する。Set インスタンスは [[SetData]] 内部スロットも持つ。

24.2.6 Set イテレータオブジェクト

Set Iterator は以下で定義される構造を持つ通常のオブジェクトであり、特定の Set インスタンスオブジェクト上の特定の反復を表す。Set Iterator オブジェクトには名前付きコンストラクターは存在しない。代わりに Set インスタンスオブジェクトの特定メソッド呼出によって生成される。

24.2.6.1 CreateSetIterator ( set, kind )

The abstract operation CreateSetIterator takes arguments set (an ECMAScript language value) and kind (key+value or value) and returns either a normal completion containing a Generator or a throw completion. Set メソッドのうちイテレータを返すもののためのイテレータオブジェクトを生成するために用いられる。 It performs the following steps when called:

  1. RequireInternalSlot(set, [[SetData]]) を実行。
  2. 引数なしで setkind を捕捉し呼び出し時に以下を行う新しい抽象クロージャ closure を作成:
    1. index = 0。
    2. entries = set.[[SetData]]
    3. numEntries = entries の要素数。
    4. index < numEntries の間、
      1. e = entries[index]。
      2. index = index + 1。
      3. eempty でなければ
        1. kindkey+value なら
          1. result = CreateArrayFromListe, e »)。
          2. GeneratorYield(CreateIteratorResultObject(result, false))。
        2. そうでなければ
          1. アサート: kindvalue
          2. GeneratorYield(CreateIteratorResultObject(e, false))。
        3. 注: GeneratorYield による一時停止中に entries の要素数が増加した可能性。
        4. numEntriesentries の要素数に設定。
    5. NormalCompletion(unused) を返す。
  3. CreateIteratorFromClosure(closure, "%SetIteratorPrototype%", %SetIteratorPrototype%) を返す。

24.2.6.2 %SetIteratorPrototype% オブジェクト

%SetIteratorPrototype% オブジェクト:

  • すべての Set Iterator オブジェクトが継承するプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]] 内部スロットの値は %Iterator.prototype%
  • 以下のプロパティを持つ:

24.2.6.2.1 %SetIteratorPrototype%.next ( )

  1. GeneratorResume(this value, empty, "%SetIteratorPrototype%") を返す。

24.2.6.2.2 %SetIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "Set Iterator" である。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } の属性を持つ。

24.3 WeakMap オブジェクト

WeakMap はキーがオブジェクトおよび/またはシンボルであり、値が任意の ECMAScript 言語値であるキー/値ペアのコレクションである。WeakMap は特定のキーを持つキー/値ペアを含むかを問い合わせできるが、保持する値をキーとして列挙する仕組みは提供されない。特定の状況では、9.9.3 に記述されるように、存活していない値は WeakMap のキーとして除去される。

実装は、WeakMap のキー/値ペアが到達不能になってから WeakMap から除去されるまでの間に任意に決定される遅延を課すことができる。もしこの遅延が ECMAScript プログラムから観測可能であれば、プログラム実行に影響する不確定性の原因となり得る。そのため ECMAScript 実装は、観測者が観測対象のキーを提示することなく WeakMap のキーを観測する手段を提供してはならない。

WeakMap はハッシュテーブルまたはコレクション内キー/値ペア数に対し平均で亜線形のアクセス時間を提供する他の機構を用いて実装されなければならない。本仕様で用いられるデータ構造は WeakMap の必要な観測可能セマンティクスを記述するためだけのもので、実装モデルとなることを意図しない。

Note

WeakMap と WeakSet は、WeakMap や WeakSet インスタンスが存在しなかった場合にそのオブジェクトまたはシンボルが到達不能となり実装のガーベジコレクション機構によるリソース回収対象となる状況で、メモリ資源を “リーク” しない形で動的に状態を関連付ける機構を提供することを意図している。この特性は WeakMap または WeakSet インスタンスからキーへの逆方向 per-object/symbol マッピングを用いることで達成できる。あるいは各 WeakMap または WeakSet インスタンスが内部にキーと値データを保持してもよいが、この方法は WeakMap/WeakSet 実装とガーベジコレクタ間の協調を要する。以下の参考文献は WeakMap および WeakSet の実装に有用となり得る機構を記述している:

Barry Hayes. 1997. Ephemerons: a new finalization mechanism. In Proceedings of the 12th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications (OOPSLA '97), A. Michael Berman (Ed.). ACM, New York, NY, USA, 176-183, http://doi.acm.org/10.1145/263698.263733.

Alexandra Barros, Roberto Ierusalimschy, Eliminating Cycles in Weak Tables. Journal of Universal Computer Science - J.UCS, vol. 14, no. 21, pp. 3481-3497, 2008, http://www.jucs.org/jucs_14_21/eliminating_cycles_in_weak

24.3.1 WeakMap コンストラクター

WeakMap コンストラクター:

  • %WeakMap% である。
  • グローバルオブジェクト"WeakMap" プロパティの初期値である。
  • コンストラクターとして呼ばれたとき新しい WeakMap を生成し初期化する。
  • 関数として呼び出すことは意図されておらず、その形で呼ばれると例外を投げる。
  • クラス定義の extends 句の値として使用できる。指定された WeakMap の挙動を継承するサブクラスコンストラクターは、WeakMap.prototype 組込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、WeakMap コンストラクターへの super 呼び出しを含めなければならない。

24.3.1.1 WeakMap ( [ iterable ] )

この関数は呼び出し時に次を行う:

  1. NewTarget が undefined なら TypeError 例外。
  2. map を ? OrdinaryCreateFromConstructor(NewTarget, "%WeakMap.prototype%", « [[WeakMapData]] ») とする。
  3. map.[[WeakMapData]] を新しい空 List に設定。
  4. iterableundefined または null なら map を返す。
  5. adder を ? Get(map, "set") とする。
  6. IsCallable(adder) が false なら TypeError 例外。
  7. AddEntriesFromIterable(map, iterable, adder) を返す。
Note

引数 iterable が与えられる場合、それは %Symbol.iterator% メソッドを実装し、最初の要素が WeakMap のキー、2 番目の要素がそのキーに関連付ける値である 2 要素配列ライクを生成するイテレータオブジェクトを返すオブジェクトであることが期待される。

24.3.2 WeakMap コンストラクターのプロパティ

WeakMap コンストラクター:

  • [[Prototype]] 内部スロットの値が %Function.prototype% である。
  • 以下のプロパティを持つ:

24.3.2.1 WeakMap.prototype

WeakMap.prototype の初期値は WeakMap プロトタイプオブジェクトである。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } の属性を持つ。

24.3.3 WeakMap プロトタイプオブジェクトのプロパティ

WeakMap プロトタイプオブジェクト:

  • %WeakMap.prototype% である。
  • [[Prototype]] 内部スロットの値が %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[WeakMapData]] 内部スロットを持たない。

24.3.3.1 WeakMap.prototype.constructor

WeakMap.prototype.constructor の初期値は %WeakMap% である。

24.3.3.2 WeakMap.prototype.delete ( key )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[WeakMapData]])。
  3. CanBeHeldWeakly(key) が false なら false を返す。
  4. Record { [[Key]], [[Value]] } pM.[[WeakMapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら
      1. p.[[Key]]empty に。
      2. p.[[Value]]empty に。
      3. true を返す。
  5. false を返す。
Note

empty は削除を示す仕様上の装置。実装は内部データ構造から物理的に削除するなど別の手段を取ってもよい。

24.3.3.3 WeakMap.prototype.get ( key )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[WeakMapData]])。
  3. CanBeHeldWeakly(key) が false なら undefined を返す。
  4. Record { [[Key]], [[Value]] } pM.[[WeakMapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら p.[[Value]] を返す。
  5. undefined を返す。

24.3.3.4 WeakMap.prototype.has ( key )

このメソッドは呼び出し時:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[WeakMapData]])。
  3. CanBeHeldWeakly(key) が false なら false を返す。
  4. Record { [[Key]], [[Value]] } pM.[[WeakMapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら true を返す。
  5. false を返す。

24.3.3.5 WeakMap.prototype.set ( key, value )

このメソッドは呼び出し時:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[WeakMapData]])。
  3. CanBeHeldWeakly(key) が false なら TypeError 例外。
  4. Record { [[Key]], [[Value]] } pM.[[WeakMapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら
      1. p.[[Value]]value に設定。
      2. M を返す。
  5. p を { [[Key]]: key, [[Value]]: value } という Record とする。
  6. pM.[[WeakMapData]] に追加。
  7. M を返す。

24.3.3.6 WeakMap.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "WeakMap" である。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } の属性を持つ。

24.3.4 WeakMap インスタンスのプロパティ

WeakMap インスタンスは通常のオブジェクトであり、WeakMap プロトタイプオブジェクトからプロパティを継承する。WeakMap インスタンスは [[WeakMapData]] 内部スロットも持つ。

24.4 WeakSet オブジェクト

WeakSet はオブジェクトおよび/またはシンボルのコレクションである。区別されるオブジェクトまたはシンボルは WeakSet のコレクション内で 1 度だけ要素として現れる。WeakSet は特定の値を含むかを問い合わせできるが、保持する値を列挙する仕組みは提供されない。特定の状況では、9.9.3 に記述されるように、存活していない値は WeakSet の要素として除去される。

実装は WeakSet に含まれる値が到達不能になってから WeakSet から除去されるまでの間に任意の遅延を課すことができる。もしこの遅延が ECMAScript プログラムから観測可能であれば、不確定性の原因となり得る。そのため ECMAScript 実装は、観測者が観測対象値を提示することなく WeakSet が特定値を含むか決定する手段を提供してはならない。

WeakSet はハッシュテーブルまたはコレクション内要素数に対し平均で亜線形アクセス時間を提供する他の機構を用いて実装されなければならない。本仕様のデータ構造は WeakSet の必要な観測可能セマンティクスを記述するためだけのもので、実装モデルとなることを意図しない。

Note

24.3 の注を参照。

24.4.1 WeakSet コンストラクター

WeakSet コンストラクター:

  • %WeakSet% である。
  • グローバルオブジェクト"WeakSet" プロパティの初期値である。
  • コンストラクターとして呼ばれたとき新しい WeakSet を生成し初期化する。
  • 関数として呼び出すことは意図されておらず、その形で呼ばれると例外を投げる。
  • クラス定義の extends 句の値として使用できる。指定された WeakSet の挙動を継承するサブクラスコンストラクターは、WeakSet.prototype 組込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、WeakSet コンストラクターへの super 呼び出しを含めなければならない。

24.4.1.1 WeakSet ( [ iterable ] )

この関数は呼び出し時に次を行う:

  1. NewTarget が undefined なら TypeError 例外。
  2. set を ? OrdinaryCreateFromConstructor(NewTarget, "%WeakSet.prototype%", « [[WeakSetData]] ») とする。
  3. set.[[WeakSetData]] を新しい空 List に設定。
  4. iterableundefined または null なら set を返す。
  5. adder を ? Get(set, "add") とする。
  6. IsCallable(adder) が false なら TypeError 例外。
  7. iteratorRecord を ? GetIterator(iterable, sync) とする。
  8. 繰り返し、
    1. next = ? IteratorStepValue(iteratorRecord)。
    2. nextdone なら set を返す。
    3. statusCompletion(Call(adder, set, « next »)) とする。
    4. IfAbruptCloseIterator(status, iteratorRecord)。

24.4.2 WeakSet コンストラクターのプロパティ

WeakSet コンストラクター:

  • [[Prototype]] 内部スロットの値が %Function.prototype% である。
  • 以下のプロパティを持つ:

24.4.2.1 WeakSet.prototype

WeakSet.prototype の初期値は WeakSet プロトタイプオブジェクトである。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } の属性を持つ。

24.4.3 WeakSet プロトタイプオブジェクトのプロパティ

WeakSet プロトタイプオブジェクト:

  • %WeakSet.prototype% である。
  • [[Prototype]] 内部スロットの値が %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[WeakSetData]] 内部スロットを持たない。

24.4.3.1 WeakSet.prototype.add ( value )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[WeakSetData]])。
  3. CanBeHeldWeakly(value) が false なら TypeError 例外。
  4. 各要素 eS.[[WeakSetData]] について
    1. eempty でなく SameValue(e, value) が true なら
      1. S を返す。
  5. valueS.[[WeakSetData]] に追加。
  6. S を返す。

24.4.3.2 WeakSet.prototype.constructor

WeakSet.prototype.constructor の初期値は %WeakSet% である。

24.4.3.3 WeakSet.prototype.delete ( value )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[WeakSetData]])。
  3. CanBeHeldWeakly(value) が false なら false を返す。
  4. 各要素 eS.[[WeakSetData]] について
    1. eempty でなく SameValue(e, value) が true なら
      1. 値が e の要素を値が empty の要素で置き換える。
      2. true を返す。
  5. false を返す。
Note

empty は削除を示す仕様上の装置。実装は内部構造から物理的に除去するなど別手段を取ってよい。

24.4.3.4 WeakSet.prototype.has ( value )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[WeakSetData]])。
  3. CanBeHeldWeakly(value) が false なら false
  4. 各要素 eS.[[WeakSetData]] について
    1. eempty でなく SameValue(e, value) が true なら true
  5. false を返す。

24.4.3.5 WeakSet.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "WeakSet" である。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } の属性を持つ。

24.4.4 WeakSet インスタンスのプロパティ

WeakSet インスタンスは通常のオブジェクトであり、WeakSet プロトタイプオブジェクトからプロパティを継承する。WeakSet インスタンスは [[WeakSetData]] 内部スロットも持つ。

24.5 キー付きコレクションに関する抽象操作

24.5.1 CanonicalizeKeyedCollectionKey ( key )

The abstract operation CanonicalizeKeyedCollectionKey takes argument key (an ECMAScript language value) and returns an ECMAScript language value. It performs the following steps when called:

  1. key-0𝔽 なら +0𝔽 を返す。
  2. key を返す。

25 構造化データ

25.1 ArrayBuffer オブジェクト

25.1.1 記法

本節、および 25.429 における以下の記述は、read-modify-write 変更関数 (modification function) の内部データ構造を用いる。

read-modify-write 変更関数 とは、2 つのバイト値 List を引数に取り、バイト値List を返す抽象クロージャとして表現される数学的関数である。これらの抽象クロージャは以下のすべての性質を満たす:

  • アルゴリズムの全ステップをアトミックに実行する。
  • 個々のアルゴリズムステップは観測不可能である。
Note

read-modify-write 変更関数のアルゴリズムステップが純粋な数学的関数を成していることの検証を助けるため、次の編集上の慣例を推奨する:

  • 直接または呼び出される抽象操作・抽象クロージャを経由して、そのパラメータと捕捉した値以外の言語値や仕様上の値へアクセスしない。
  • 直接または遷移的に Completion Record を返す抽象操作や抽象クロージャを呼び出さない。
  • Completion Record を返さない。

25.1.2 固定長およびリサイズ可能 ArrayBuffer オブジェクト

固定長 ArrayBuffer とは、生成後にバイト長が変化しない ArrayBuffer である。

リサイズ可能 ArrayBuffer とは、ArrayBuffer.prototype.resize ( newLength ) の呼び出しによって生成後にバイト長を変更し得る ArrayBuffer である。

生成される ArrayBuffer オブジェクトの種類は、ArrayBuffer ( length [ , options ] ) に渡された引数に依存する。

25.1.3 ArrayBuffer オブジェクトに関する抽象操作

25.1.3.1 AllocateArrayBuffer ( constructor, byteLength [ , maxByteLength ] )

The abstract operation AllocateArrayBuffer takes arguments constructor (a constructor) and byteLength (a non-negative integer) and optional argument maxByteLength (a non-negative integer or empty) and returns either a normal completion containing an ArrayBuffer or a throw completion. ArrayBuffer を生成するために使用される。 It performs the following steps when called:

  1. slots を « [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] » とする。
  2. maxByteLength が存在し empty でないなら allocatingResizableBuffertrue、そうでなければ false とする。
  3. allocatingResizableBuffertrue なら
    1. byteLength > maxByteLength なら RangeError 例外を投げる。
    2. [[ArrayBufferMaxByteLength]]slots に追加する。
  4. obj を ? OrdinaryCreateFromConstructor(constructor, "%ArrayBuffer.prototype%", slots) とする。
  5. block を ? CreateByteDataBlock(byteLength) とする。
  6. obj.[[ArrayBufferData]]block を設定する。
  7. obj.[[ArrayBufferByteLength]]byteLength を設定する。
  8. allocatingResizableBuffertrue なら
    1. maxByteLength バイトから成る Data Block block を生成できない場合 RangeError 例外を投げる。
    2. 注: リサイズ可能 ArrayBuffer はインプレース成長で実装可能となるよう設計されている。実装は例えば仮想メモリを事前確保できない場合に投げてもよい。
    3. obj.[[ArrayBufferMaxByteLength]]maxByteLength を設定する。
  9. obj を返す。

25.1.3.2 ArrayBufferByteLength ( arrayBuffer, order )

The abstract operation ArrayBufferByteLength takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer) and order (seq-cst or unordered) and returns a non-negative integer. It performs the following steps when called:

  1. IsSharedArrayBuffer(arrayBuffer) が true かつ arrayBuffer[[ArrayBufferByteLengthData]] 内部スロットを持つなら
    1. bufferByteLengthBlockarrayBuffer.[[ArrayBufferByteLengthData]] とする。
    2. rawLengthGetRawBytesFromSharedBlock(bufferByteLengthBlock, 0, biguint64, true, order) とする。
    3. isLittleEndian を周囲のエージェントの Agent Record[[LittleEndian]] フィールドの値とする。
    4. (RawBytesToNumeric(biguint64, rawLength, isLittleEndian)) を返す。
  2. アサート: IsDetachedBuffer(arrayBuffer) は false
  3. arrayBuffer.[[ArrayBufferByteLength]] を返す。

25.1.3.3 ArrayBufferCopyAndDetach ( arrayBuffer, newLength, preserveResizability )

The abstract operation ArrayBufferCopyAndDetach takes arguments arrayBuffer (an ECMAScript language value), newLength (an ECMAScript language value), and preserveResizability (preserve-resizability or fixed-length) and returns either a normal completion containing an ArrayBuffer or a throw completion. It performs the following steps when called:

  1. RequireInternalSlot(arrayBuffer, [[ArrayBufferData]]) を実行。
  2. IsSharedArrayBuffer(arrayBuffer) が true なら TypeError 例外。
  3. newLengthundefined なら
    1. newByteLengtharrayBuffer.[[ArrayBufferByteLength]] とする。
  4. そうでなければ
    1. newByteLength を ? ToIndex(newLength) とする。
  5. IsDetachedBuffer(arrayBuffer) が true なら TypeError 例外。
  6. preserveResizabilitypreserve-resizability かつ IsFixedLengthArrayBuffer(arrayBuffer) が false なら
    1. newMaxByteLengtharrayBuffer.[[ArrayBufferMaxByteLength]] とする。
  7. そうでなければ
    1. newMaxByteLengthempty とする。
  8. arrayBuffer.[[ArrayBufferDetachKey]]undefined でなければ TypeError 例外。
  9. newBuffer を ? AllocateArrayBuffer(%ArrayBuffer%, newByteLength, newMaxByteLength) とする。
  10. copyLengthmin(newByteLength, arrayBuffer.[[ArrayBufferByteLength]]) とする。
  11. fromBlockarrayBuffer.[[ArrayBufferData]] とする。
  12. toBlocknewBuffer.[[ArrayBufferData]] とする。
  13. CopyDataBlockBytes(toBlock, 0, fromBlock, 0, copyLength) を実行。
  14. 注: 新しい Data Block の生成および旧 Data Block からのコピーは観測不可能。実装はゼロコピー移動や realloc として実装してよい。
  15. DetachArrayBuffer(arrayBuffer) を実行。
  16. newBuffer を返す。

25.1.3.4 IsDetachedBuffer ( arrayBuffer )

The abstract operation IsDetachedBuffer takes argument arrayBuffer (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. It performs the following steps when called:

  1. arrayBuffer.[[ArrayBufferData]]null なら true を返す。
  2. false を返す。

25.1.3.5 DetachArrayBuffer ( arrayBuffer [ , key ] )

The abstract operation DetachArrayBuffer takes argument arrayBuffer (an ArrayBuffer) and optional argument key (anything) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. アサート: IsSharedArrayBuffer(arrayBuffer) は false
  2. key が存在しなければ keyundefined に設定。
  3. arrayBuffer.[[ArrayBufferDetachKey]]key でなければ TypeError 例外。
  4. arrayBuffer.[[ArrayBufferData]]null に設定。
  5. arrayBuffer.[[ArrayBufferByteLength]] を 0 に設定。
  6. unused を返す。
Note

ArrayBuffer インスタンスをデタッチすることは、裏付けとして使用される Data Block をそのインスタンスから切り離し、バイト長を 0 に設定する。

25.1.3.6 CloneArrayBuffer ( srcBuffer, srcByteOffset, srcLength )

The abstract operation CloneArrayBuffer takes arguments srcBuffer (an ArrayBuffer or a SharedArrayBuffer), srcByteOffset (a non-negative integer), and srcLength (a non-negative integer) and returns either a normal completion containing an ArrayBuffer or a throw completion. srcByteOffset で開始し srcLength バイト継続する範囲の srcBuffer のデータをコピーした新しい ArrayBuffer を作成する。 It performs the following steps when called:

  1. アサート: IsDetachedBuffer(srcBuffer) は false
  2. targetBuffer を ? AllocateArrayBuffer(%ArrayBuffer%, srcLength) とする。
  3. srcBlocksrcBuffer.[[ArrayBufferData]] とする。
  4. targetBlocktargetBuffer.[[ArrayBufferData]] とする。
  5. CopyDataBlockBytes(targetBlock, 0, srcBlock, srcByteOffset, srcLength) を実行。
  6. targetBuffer を返す。

25.1.3.7 GetArrayBufferMaxByteLengthOption ( options )

The abstract operation GetArrayBufferMaxByteLengthOption takes argument options (an ECMAScript language value) and returns either a normal completion containing either a non-negative integer or empty, or a throw completion. It performs the following steps when called:

  1. options がオブジェクトでなければ empty を返す。
  2. maxByteLength を ? Get(options, "maxByteLength") とする。
  3. maxByteLengthundefined なら empty を返す。
  4. ToIndex(maxByteLength) を返す。

25.1.3.8 HostResizeArrayBuffer ( buffer, newByteLength )

The host-defined abstract operation HostResizeArrayBuffer takes arguments buffer (an ArrayBuffer) and newByteLength (a non-negative integer) and returns either a normal completion containing either handled or unhandled, or a throw completion. ホストbuffer実装定義のリサイズを行う機会を提供する。ホストがリサイズを扱わない場合、既定動作のため unhandled を返してよい。

HostResizeArrayBuffer の実装は以下に従わなければならない:

  • 抽象操作buffer をデタッチしない。
  • 抽象操作handled で正常完了した場合、buffer.[[ArrayBufferByteLength]]newByteLength である。

HostResizeArrayBuffer の既定実装は NormalCompletion(unhandled) を返すことである。

25.1.3.9 IsFixedLengthArrayBuffer ( arrayBuffer )

The abstract operation IsFixedLengthArrayBuffer takes argument arrayBuffer (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. It performs the following steps when called:

  1. arrayBuffer[[ArrayBufferMaxByteLength]] 内部スロットを持つなら false を返す。
  2. true を返す。

25.1.3.10 IsUnsignedElementType ( type )

The abstract operation IsUnsignedElementType takes argument type (a TypedArray element type) and returns a Boolean. 引数 type が符号なし TypedArray 要素型か検証する。 It performs the following steps when called:

  1. typeuint8, uint8clamped, uint16, uint32, biguint64 のいずれかなら true を返す。
  2. false を返す。

25.1.3.11 IsUnclampedIntegerElementType ( type )

The abstract operation IsUnclampedIntegerElementType takes argument type (a TypedArray element type) and returns a Boolean. 引数 typeuint8clamped を除く整数 TypedArray 要素型か検証する。 It performs the following steps when called:

  1. typeint8, uint8, int16, uint16, int32, uint32 のいずれかなら true
  2. false を返す。

25.1.3.12 IsBigIntElementType ( type )

The abstract operation IsBigIntElementType takes argument type (a TypedArray element type) and returns a Boolean. 引数 type が BigInt TypedArray 要素型か検証する。 It performs the following steps when called:

  1. typebiguint64 または bigint64 のいずれかなら true
  2. false を返す。

25.1.3.13 IsNoTearConfiguration ( type, order )

The abstract operation IsNoTearConfiguration takes arguments type (a TypedArray element type) and order (seq-cst, unordered, or init) and returns a Boolean. It performs the following steps when called:

  1. IsUnclampedIntegerElementType(type) が true なら true を返す。
  2. IsBigIntElementType(type) が true かつ orderinit でも unordered でもないなら true を返す。
  3. false を返す。

25.1.3.14 RawBytesToNumeric ( type, rawBytes, isLittleEndian )

The abstract operation RawBytesToNumeric takes arguments type (a TypedArray element type), rawBytes (a List of byte values), and isLittleEndian (a Boolean) and returns a Number or a BigInt. It performs the following steps when called:

  1. elementSize を要素型 type について Table 73 に指定された要素サイズ値とする。
  2. isLittleEndianfalse なら rawBytes の要素順を反転する。
  3. typefloat16 なら
    1. valuerawBytes のバイト要素を連結し IEEE 754-2019 binary16 値のリトルエンディアンビット列エンコーディングとして解釈したものとする。
    2. value が NaN なら NaN を返す。
    3. value に対応する Number 値を返す。
  4. typefloat32 なら
    1. valuerawBytes のバイト要素を連結し IEEE 754-2019 binary32 値のリトルエンディアンビット列エンコーディングとして解釈したものとする。
    2. value が NaN なら NaN
    3. 対応する Number 値を返す。
  5. typefloat64 なら
    1. valuerawBytes のバイト要素を連結し IEEE 754-2019 binary64 値のリトルエンディアンビット列エンコーディングとして解釈したものとする。
    2. value が NaN なら NaN
    3. 対応する Number 値を返す。
  6. IsUnsignedElementType(type) が true なら
    1. intValuerawBytes のバイト要素を連結し符号なしリトルエンディアン 2 進数のビット列エンコーディングとして解釈したものとする。
  7. そうでなければ
    1. intValuerawBytes のバイト要素を連結しビット長 elementSize × 8 のリトルエンディアン 2 の補数表現として解釈したものとする。
  8. IsBigIntElementType(type) が true なら intValue に対応する BigInt 値を返す。
  9. そうでなければ intValue に対応する Number 値を返す。

25.1.3.15 GetRawBytesFromSharedBlock ( block, byteIndex, type, isTypedArray, order )

The abstract operation GetRawBytesFromSharedBlock takes arguments block (a Shared Data Block), byteIndex (a non-negative integer), type (a TypedArray element type), isTypedArray (a Boolean), and order (seq-cst or unordered) and returns a List of byte values. It performs the following steps when called:

  1. elementSize を要素型 type について Table 73 に指定された要素サイズ値とする。
  2. execution を周囲のエージェントの Agent Record[[CandidateExecution]] フィールドとする。
  3. eventsRecordexecution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() である Agent Events Record とする。
  4. isTypedArraytrue かつ IsNoTearConfiguration(type, order) が true なら noTear = true、そうでなければ false
  5. rawValue を長さ elementSizeList で、その要素が非決定的に選ばれたバイト値とする。
  6. 注: 実装では rawValue は基盤ハードウェア上の非アトミックまたはアトミック read 命令の結果。非決定性は弱い一貫性ハードウェアの観測可能動作を記述するメモリモデル上の意味的規定。
  7. readEventReadSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize } とする。
  8. readEventeventsRecord.[[EventList]] に追加。
  9. Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: rawValue } を execution.[[ChosenValues]] に追加。
  10. rawValue を返す。

25.1.3.16 GetValueFromBuffer ( arrayBuffer, byteIndex, type, isTypedArray, order [ , isLittleEndian ] )

The abstract operation GetValueFromBuffer takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative integer), type (a TypedArray element type), isTypedArray (a Boolean), and order (seq-cst or unordered) and optional argument isLittleEndian (a Boolean) and returns a Number or a BigInt. It performs the following steps when called:

  1. アサート: IsDetachedBuffer(arrayBuffer) は false
  2. アサート: arrayBufferbyteIndex から type の値を表現するのに十分なバイトが存在する。
  3. blockarrayBuffer.[[ArrayBufferData]] とする。
  4. elementSize を要素型 type について Table 73 に指定された要素サイズ値とする。
  5. IsSharedArrayBuffer(arrayBuffer) が true なら
    1. アサート: blockShared Data Block
    2. rawValueGetRawBytesFromSharedBlock(block, byteIndex, type, isTypedArray, order) とする。
  6. そうでなければ
    1. rawValue を、byteIndex (含む) から byteIndex + elementSize (含まない) のインデックスにある block のバイトからなる List とする。
  7. アサート: rawValue の要素数は elementSize
  8. isLittleEndian が存在しなければ、周囲のエージェントの Agent Record[[LittleEndian]] フィールドの値を設定。
  9. RawBytesToNumeric(type, rawValue, isLittleEndian) を返す。

25.1.3.17 NumericToRawBytes ( type, value, isLittleEndian )

The abstract operation NumericToRawBytes takes arguments type (a TypedArray element type), value (a Number or a BigInt), and isLittleEndian (a Boolean) and returns a List of byte values. It performs the following steps when called:

  1. typefloat16 なら
    1. rawBytes を、value を roundTiesToEven モードで IEEE 754-2019 binary16 形式に変換した結果の 2 バイトを要素とする List とする。バイトはリトルエンディアン順。valueNaN の場合、rawBytes は実装が選ぶ任意の IEEE 754-2019 binary16 NaN エンコーディングとなり得る。実装は区別可能な各 NaN 値に常に同じエンコーディングを選択しなければならない。
  2. Else if typefloat32 なら
    1. 同様に 4 バイト (binary32)。
  3. Else if typefloat64 なら
    1. 同様に 8 バイト (binary64)。
  4. Else
    1. n を要素型 type について Table 73 に指定された要素サイズ値とする。
    2. conversionOperationTable 73 の変換操作列に type について示された抽象操作とする。
    3. intValue(! conversionOperation(value)) とする。
    4. intValue ≥ 0 なら
      1. rawBytesintValuen バイト 2 進エンコーディング (リトルエンディアン) を要素とする List とする。
    5. そうでなければ
      1. rawBytesintValuen バイト 2 の補数エンコーディング (リトルエンディアン) を要素とする List とする。
  5. isLittleEndianfalse なら rawBytes の順序を反転。
  6. rawBytes を返す。

25.1.3.18 SetValueInBuffer ( arrayBuffer, byteIndex, type, value, isTypedArray, order [ , isLittleEndian ] )

The abstract operation SetValueInBuffer takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative integer), type (a TypedArray element type), value (a Number or a BigInt), isTypedArray (a Boolean), and order (seq-cst, unordered, or init) and optional argument isLittleEndian (a Boolean) and returns unused. It performs the following steps when called:

  1. アサート: IsDetachedBuffer(arrayBuffer) は false
  2. アサート: byteIndex から始まり type の値を表す十分なバイトが存在する。
  3. アサート: IsBigIntElementType(type) が true なら value は BigInt、そうでなければ Number。
  4. blockarrayBuffer.[[ArrayBufferData]] とする。
  5. elementSize を要素型 type について Table 73 に指定された要素サイズ値。
  6. isLittleEndian が存在しなければ周囲のエージェントの Agent Record[[LittleEndian]] フィールド値を設定。
  7. rawBytesNumericToRawBytes(type, value, isLittleEndian) とする。
  8. IsSharedArrayBuffer(arrayBuffer) が true なら
    1. execution を周囲のエージェントの Agent Record[[CandidateExecution]] フィールド。
    2. eventsRecordexecution.[[EventsRecords]] 内で [[AgentSignifier]]AgentSignifier() の Agent Events Record
    3. isTypedArraytrue かつ IsNoTearConfiguration(type, order) が true なら noTear = true、そうでなければ false
    4. WriteSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes } を eventsRecord.[[EventList]] に追加。
  9. そうでなければ
    1. rawBytes の各バイトを block[byteIndex] から順に格納。
  10. unused を返す。

25.1.3.19 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op )

The abstract operation GetModifySetValueInBuffer takes arguments arrayBuffer (an ArrayBuffer or a SharedArrayBuffer), byteIndex (a non-negative integer), type (a TypedArray element type), value (a Number or a BigInt), and op (a read-modify-write modification function) and returns a Number or a BigInt. It performs the following steps when called:

  1. アサート: IsDetachedBuffer(arrayBuffer) は false
  2. アサート: byteIndex から type の値を表す十分なバイトが存在する。
  3. アサート: IsBigIntElementType(type) が true なら value は BigInt、そうでなければ Number。
  4. blockarrayBuffer.[[ArrayBufferData]] とする。
  5. elementSize を要素型 type について Table 73 に指定された要素サイズ値。
  6. isLittleEndian を周囲のエージェントの Agent Record[[LittleEndian]] フィールド値とする。
  7. rawBytesNumericToRawBytes(type, value, isLittleEndian) とする。
  8. IsSharedArrayBuffer(arrayBuffer) が true なら
    1. execution を周囲のエージェントの Agent Record[[CandidateExecution]]
    2. eventsRecordexecution.[[EventsRecords]] 内で [[AgentSignifier]]AgentSignifier() の Agent Events Record
    3. rawBytesRead を長さ elementSizeList(非決定的に選ばれたバイト値)。
    4. 注: rawBytesRead は基盤ハードウェア上の read-modify-write 命令、load-link、load-exclusive などのオペランド結果。非決定性は弱い一貫性ハードウェアの観測可能動作を記述。
    5. rmwEventReadModifyWriteSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes, [[ModifyOp]]: op } とする。
    6. rmwEventeventsRecord.[[EventList]] に追加。
    7. Chosen Value Record { [[Event]]: rmwEvent, [[ChosenValue]]: rawBytesRead } を execution.[[ChosenValues]] に追加。
  9. そうでなければ
    1. rawBytesRead を長さ elementSizeList で、block[byteIndex] からの elementSize バイト列。
    2. rawBytesModifiedop(rawBytesRead, rawBytes) とする。
    3. rawBytesModified の各バイトを block[byteIndex] から格納。
  10. RawBytesToNumeric(type, rawBytesRead, isLittleEndian) を返す。

25.1.4 ArrayBuffer コンストラクター

ArrayBuffer コンストラクター:

  • %ArrayBuffer% である。
  • グローバルオブジェクト"ArrayBuffer" プロパティの初期値である。
  • コンストラクターとして呼び出された際、新しい ArrayBuffer を生成し初期化する。
  • 関数として呼び出すことは意図されておらず、その形で呼び出されると例外を投げる。
  • クラス定義の extends 句の値として使用できる。指定された ArrayBuffer の挙動を継承するサブクラスコンストラクターは、ArrayBuffer.prototype 組込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、ArrayBuffer コンストラクターへの super 呼び出しを含める必要がある。

25.1.4.1 ArrayBuffer ( length [ , options ] )

この関数は呼び出し時に次を行う:

  1. NewTarget が undefined なら TypeError 例外。
  2. byteLength を ? ToIndex(length) とする。
  3. requestedMaxByteLength を ? GetArrayBufferMaxByteLengthOption(options) とする。
  4. AllocateArrayBuffer(NewTarget, byteLength, requestedMaxByteLength) を返す。

25.1.5 ArrayBuffer コンストラクターのプロパティ

ArrayBuffer コンストラクター:

  • [[Prototype]] 内部スロットの値が %Function.prototype% である。
  • 以下のプロパティを持つ:

25.1.5.1 ArrayBuffer.isView ( arg )

この関数は呼び出し時に次を行う:

  1. arg がオブジェクトでなければ false を返す。
  2. arg[[ViewedArrayBuffer]] 内部スロットを持てば true を返す。
  3. false を返す。

25.1.5.2 ArrayBuffer.prototype

ArrayBuffer.prototype の初期値は ArrayBuffer プロトタイプオブジェクトである。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } の属性を持つ。

25.1.5.3 get ArrayBuffer [ %Symbol.species% ]

ArrayBuffer[%Symbol.species%] は set アクセサが undefinedアクセサプロパティであり、その get アクセサは呼び出し時に次を行う:

  1. this 値を返す。

この関数の "name" プロパティ値は "get [Symbol.species]" である。

Note

ArrayBuffer.prototype.slice ( start, end ) は通常、派生オブジェクトを生成するために this 値のコンストラクターを用いる。しかしサブクラスコンストラクターは %Symbol.species% プロパティを再定義することで ArrayBuffer.prototype.slice ( start, end ) メソッドの既定挙動を上書きできる。

25.1.6 ArrayBuffer プロトタイプオブジェクトのプロパティ

ArrayBuffer プロトタイプオブジェクト:

  • %ArrayBuffer.prototype% である。
  • [[Prototype]] 内部スロットの値が %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[ArrayBufferData]] および [[ArrayBufferByteLength]] 内部スロットを持たない。

25.1.6.1 get ArrayBuffer.prototype.byteLength

ArrayBuffer.prototype.byteLength は set アクセサが undefinedアクセサプロパティであり、その get アクセサは呼び出し時に次を行う:

  1. Othis 値とする。
  2. RequireInternalSlot(O, [[ArrayBufferData]]) を実行。
  3. IsSharedArrayBuffer(O) が true なら TypeError 例外。
  4. IsDetachedBuffer(O) が true なら +0𝔽 を返す。
  5. lengthO.[[ArrayBufferByteLength]] とする。
  6. 𝔽(length) を返す。

25.1.6.2 ArrayBuffer.prototype.constructor

ArrayBuffer.prototype.constructor の初期値は %ArrayBuffer% である。

25.1.6.3 get ArrayBuffer.prototype.detached

ArrayBuffer.prototype.detached は set アクセサが undefinedアクセサプロパティであり、その get アクセサは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[ArrayBufferData]])。
  3. IsSharedArrayBuffer(O) が true なら TypeError 例外。
  4. IsDetachedBuffer(O) を返す。

25.1.6.4 get ArrayBuffer.prototype.maxByteLength

ArrayBuffer.prototype.maxByteLength は set アクセサが undefinedアクセサプロパティであり、その get アクセサは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[ArrayBufferData]])。
  3. IsSharedArrayBuffer(O) が true なら TypeError 例外。
  4. IsDetachedBuffer(O) が true なら +0𝔽 を返す。
  5. IsFixedLengthArrayBuffer(O) が true なら
    1. lengthO.[[ArrayBufferByteLength]] とする。
  6. そうでなければ
    1. lengthO.[[ArrayBufferMaxByteLength]] とする。
  7. 𝔽(length) を返す。

25.1.6.5 get ArrayBuffer.prototype.resizable

ArrayBuffer.prototype.resizable は set アクセサが undefinedアクセサプロパティであり、その get アクセサは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[ArrayBufferData]])。
  3. IsSharedArrayBuffer(O) が true なら TypeError 例外。
  4. IsFixedLengthArrayBuffer(O) が false なら true を返し、そうでなければ false を返す。

25.1.6.6 ArrayBuffer.prototype.resize ( newLength )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[ArrayBufferMaxByteLength]])。
  3. IsSharedArrayBuffer(O) が true なら TypeError 例外。
  4. newByteLength を ? ToIndex(newLength) とする。
  5. IsDetachedBuffer(O) が true なら TypeError 例外。
  6. newByteLength > O.[[ArrayBufferMaxByteLength]] なら RangeError 例外。
  7. hostHandled を ? HostResizeArrayBuffer(O, newByteLength) とする。
  8. hostHandledhandled なら undefined を返す。
  9. oldBlockO.[[ArrayBufferData]] とする。
  10. newBlock を ? CreateByteDataBlock(newByteLength) とする。
  11. copyLengthmin(newByteLength, O.[[ArrayBufferByteLength]]) とする。
  12. CopyDataBlockBytes(newBlock, 0, oldBlock, 0, copyLength) を実行。
  13. 注: 新旧 Data Block の生成・コピーは観測不可能。実装はインプレース成長・縮小として実装してもよい。
  14. O.[[ArrayBufferData]]newBlock に設定。
  15. O.[[ArrayBufferByteLength]]newByteLength に設定。
  16. undefined を返す。

25.1.6.7 ArrayBuffer.prototype.slice ( start, end )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[ArrayBufferData]])。
  3. IsSharedArrayBuffer(O) が true なら TypeError 例外。
  4. IsDetachedBuffer(O) が true なら TypeError 例外。
  5. lenO.[[ArrayBufferByteLength]] とする。
  6. relativeStart を ? ToIntegerOrInfinity(start) とする。
  7. relativeStart = -∞ なら first = 0。
  8. Else if relativeStart < 0 なら first = max(len + relativeStart, 0)。
  9. Else first = min(relativeStart, len)。
  10. endundefined なら relativeEnd = len、そうでなければ ? ToIntegerOrInfinity(end)。
  11. relativeEnd = -∞ なら final = 0。
  12. Else if relativeEnd < 0 なら final = max(len + relativeEnd, 0)。
  13. Else final = min(relativeEnd, len)。
  14. newLenmax(final - first, 0) とする。
  15. ctor を ? SpeciesConstructor(O, %ArrayBuffer%) とする。
  16. new を ? Construct(ctor, « 𝔽(newLen) ») とする。
  17. RequireInternalSlot(new, [[ArrayBufferData]])。
  18. IsSharedArrayBuffer(new) が true なら TypeError
  19. IsDetachedBuffer(new) が true なら TypeError
  20. SameValue(new, O) が true なら TypeError
  21. new.[[ArrayBufferByteLength]] < newLen なら TypeError
  22. 注: 以上の副作用で O がデタッチまたはリサイズされた可能性。
  23. IsDetachedBuffer(O) が true なら TypeError
  24. fromBufO.[[ArrayBufferData]]
  25. toBufnew.[[ArrayBufferData]]
  26. currentLenO.[[ArrayBufferByteLength]]
  27. first < currentLen なら
    1. countmin(newLen, currentLen - first)。
    2. CopyDataBlockBytes(toBuf, 0, fromBuf, first, count) を実行。
  28. new を返す。

25.1.6.8 ArrayBuffer.prototype.transfer ( [ newLength ] )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. ArrayBufferCopyAndDetach(O, newLength, preserve-resizability) を返す。

25.1.6.9 ArrayBuffer.prototype.transferToFixedLength ( [ newLength ] )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. ArrayBufferCopyAndDetach(O, newLength, fixed-length) を返す。

25.1.6.10 ArrayBuffer.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "ArrayBuffer" である。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } の属性を持つ。

25.1.7 ArrayBuffer インスタンスのプロパティ

ArrayBuffer インスタンスは ArrayBuffer プロトタイプオブジェクトからプロパティを継承する。各 ArrayBuffer インスタンスは [[ArrayBufferData]] 内部スロット、[[ArrayBufferByteLength]] 内部スロット、[[ArrayBufferDetachKey]] 内部スロットを持つ。リサイズ可能な ArrayBuffer インスタンスはさらに [[ArrayBufferMaxByteLength]] 内部スロットを持つ。

[[ArrayBufferData]]null の ArrayBuffer インスタンスはデタッチされていると見なされ、当該インスタンスに含まれるデータへアクセスまたは変更を試みる演算子はすべて失敗する。

[[ArrayBufferDetachKey]]undefined 以外に設定されている ArrayBuffer インスタンスでは、その同じ「デタッチキー」を引数として渡す DetachArrayBuffer 呼び出しのみが必要であり、そうでなければ TypeError になる。この内部スロットは特定の埋め込み環境によってのみ設定され、本仕様のアルゴリズムでは設定されない。

25.1.8 リサイズ可能 ArrayBuffer ガイドライン

Note 1

以下はリサイズ可能 ArrayBuffer を扱う ECMAScript プログラマー向けガイドラインである。

可能であれば展開環境でプログラムをテストすることを推奨する。利用可能な物理メモリ量はハードウェアデバイス間で大きく異なる。同様に仮想メモリサブシステムもデバイスや OS により大きく異なる。64 ビットデスクトップ Web ブラウザでメモリ不足を起こさないアプリケーションが 32 ビットモバイル Web ブラウザではメモリ不足になる可能性がある。

リサイズ可能 ArrayBuffer"maxByteLength" オプション値を選ぶ際、アプリケーションにとって可能な限り小さいサイズを選ぶことを推奨する。"maxByteLength" は 1,073,741,824 (230 バイト, 1GiB) を超えないことを推奨する。

特定の最大サイズでリサイズ可能 ArrayBuffer を生成できても、将来のリサイズが成功する保証はない点に留意されたい。

Note 2

以下はリサイズ可能 ArrayBuffer を実装する ECMAScript 実装者向けガイドラインである。

リサイズ可能 ArrayBuffer は、リサイズ時コピー、仮想メモリを事前確保したインプレース成長、またはコンストラクターの "maxByteLength" オプション値に応じた両者の組み合わせとして実装できる。

ホストが (多数の ECMAScript アプリケーションを同時に実行する) マルチテナントであり、インプレース成長を仮想メモリ予約で実装する場合、32 ビット/64 ビット実装ともに "maxByteLength" ≥ 1GiB〜1.5GiB の値に対して例外を投げることを推奨する。これは単一アプリケーションによる仮想アドレス空間の枯渇可能性と相互運用性リスクを低減するためである。

ホストに仮想メモリが無い (MMU 無し組込みデバイスなど) 場合、またはコピーによるリサイズのみを実装する場合、"maxByteLength" オプションに任意の Number value for を受け入れてもよい。ただし要求サイズのメモリブロックを決して割り当てられない場合は RangeError を投げることを推奨する。例えば要求サイズがデバイスで利用可能な最大メモリ量を超える場合など。

25.2 SharedArrayBuffer オブジェクト

25.2.1 固定長および成長可能 (growable) SharedArrayBuffer オブジェクト

固定長 SharedArrayBuffer とは、生成後にそのバイト長が変更できない SharedArrayBuffer である。

成長可能 SharedArrayBuffer とは、SharedArrayBuffer.prototype.grow ( newLength ) の呼び出しによって生成後にバイト長を増やすことができる SharedArrayBuffer である。

生成される SharedArrayBuffer オブジェクトの種別は、SharedArrayBuffer ( length [ , options ] ) に渡された引数に依存する。

25.2.2 SharedArrayBuffer オブジェクト用抽象操作

25.2.2.1 AllocateSharedArrayBuffer ( constructor, byteLength [ , maxByteLength ] )

The abstract operation AllocateSharedArrayBuffer takes arguments constructor (a constructor) and byteLength (a non-negative integer) and optional argument maxByteLength (a non-negative integer or empty) and returns either a normal completion containing a SharedArrayBuffer or a throw completion. SharedArrayBuffer を生成するために用いられる。 It performs the following steps when called:

  1. slots を « [[ArrayBufferData]] » とする。
  2. maxByteLength が存在しかつ empty でないなら allocatingGrowableBuffer = true、そうでなければ false とする。
  3. allocatingGrowableBuffertrue なら
    1. byteLength > maxByteLength なら RangeError 例外を投げる。
    2. [[ArrayBufferByteLengthData]][[ArrayBufferMaxByteLength]]slots に追加する。
  4. そうでなければ
    1. [[ArrayBufferByteLength]]slots に追加する。
  5. obj を ? OrdinaryCreateFromConstructor(constructor, "%SharedArrayBuffer.prototype%", slots) とする。
  6. allocatingGrowableBuffertrue なら allocLength = maxByteLength、そうでなければ allocLength = byteLength
  7. block を ? CreateSharedByteDataBlock(allocLength) とする。
  8. obj.[[ArrayBufferData]]block を設定する。
  9. allocatingGrowableBuffertrue なら
    1. アサート: byteLengthmaxByteLength
    2. byteLengthBlock を ? CreateSharedByteDataBlock(8) とする。
    3. SetValueInBuffer(byteLengthBlock, 0, biguint64, (byteLength), true, seq-cst) を実行。
    4. obj.[[ArrayBufferByteLengthData]]byteLengthBlock を設定。
    5. obj.[[ArrayBufferMaxByteLength]]maxByteLength を設定。
  10. そうでなければ
    1. obj.[[ArrayBufferByteLength]]byteLength を設定。
  11. obj を返す。

25.2.2.2 IsSharedArrayBuffer ( obj )

The abstract operation IsSharedArrayBuffer takes argument obj (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. オブジェクトが ArrayBuffer / SharedArrayBuffer あるいはそのサブタイプかどうかを判定する。 It performs the following steps when called:

  1. bufferDataobj.[[ArrayBufferData]] とする。
  2. bufferDatanull なら false を返す。
  3. bufferDataData Block なら false を返す。
  4. アサート: bufferDataShared Data Block である。
  5. true を返す。

25.2.2.3 HostGrowSharedArrayBuffer ( buffer, newByteLength )

The host-defined abstract operation HostGrowSharedArrayBuffer takes arguments buffer (a SharedArrayBuffer) and newByteLength (a non-negative integer) and returns either a normal completion containing either handled or unhandled, or a throw completion. ホストbuffer実装定義の成長処理を行う機会を与える。ホストが処理しない場合は既定動作として unhandled を返してよい。

HostGrowSharedArrayBuffer の実装は以下の要件に従わなければならない:

  • 抽象操作unhandled で正常完了しない(= それ以外で正常完了する)場合で、newByteLengthbuffer の現在のバイト長より小さい、または newByteLength > buffer.[[ArrayBufferMaxByteLength]] のいずれかなら RangeError 例外を投げる。
  • isLittleEndian を周囲のエージェントの Agent Record[[LittleEndian]] フィールド値とする。抽象操作handled で正常完了した場合、[[Order]]seq-cst[[Payload]]NumericToRawBytes(biguint64, newByteLength, isLittleEndian)、[[Block]]buffer.[[ArrayBufferByteLengthData]][[ByteIndex]] が 0、[[ElementSize]] が 8 の WriteSharedMemory または ReadModifyWriteSharedMemory イベントを周囲のエージェントの候補実行 (candidate execution) に追加し、SharedArrayBuffer.prototype.grow への競合する呼び出しが「失われない」(沈黙して何もしないことがない)ようにする。
Note

上記 2 つ目の要件は、buffer の現在バイト長をどのよう/いつ読み取るかについて意図的に曖昧にしている。基盤ハードウェア上でバイト長をアトミック read-modify-write で更新する必要があるため、load-link/store-conditional や load-exclusive/store-exclusive 命令対を用いるアーキテクチャでは命令ペアを命令ストリーム内で近接させたい場合がある。そのため SharedArrayBuffer.prototype.grow 自体は HostGrowSharedArrayBuffer を呼ぶ前に newByteLength の境界チェックを行わず、また現在のバイト長をいつ読むかを規定しない。

これは HostResizeArrayBuffer と対照的であり、後者では newByteLength が 0 以上かつ buffer.[[ArrayBufferMaxByteLength]] 以下であることが保証される。

HostGrowSharedArrayBuffer の既定実装は NormalCompletion(unhandled) を返す。

25.2.3 SharedArrayBuffer コンストラクター

SharedArrayBuffer コンストラクター:

  • %SharedArrayBuffer% である。
  • ホストがそれを提供する場合)グローバルオブジェクト"SharedArrayBuffer" プロパティの初期値である。
  • コンストラクターとして呼ばれたとき新しい SharedArrayBuffer を生成し初期化する。
  • 関数として呼び出すことは意図されておらず、その形で呼び出されると例外を投げる。
  • クラス定義の extends 句の値として使用できる。指定された SharedArrayBuffer の挙動を継承するサブクラスコンストラクターは SharedArrayBuffer.prototype の組込みメソッドを支える内部状態でサブクラスインスタンスを生成・初期化するため super 呼び出しを含めねばならない。

ホストが SharedArrayBuffer への並行アクセスを提供しない場合、グローバルオブジェクト"SharedArrayBuffer" プロパティを省略してよい。

Note

ArrayBuffer と異なり、SharedArrayBuffer はデタッチされず、その内部 [[ArrayBufferData]] スロットが null になることはない。

25.2.3.1 SharedArrayBuffer ( length [ , options ] )

この関数は呼び出し時に次を行う:

  1. NewTarget が undefined なら TypeError 例外。
  2. byteLength を ? ToIndex(length) とする。
  3. requestedMaxByteLength を ? GetArrayBufferMaxByteLengthOption(options) とする。
  4. AllocateSharedArrayBuffer(NewTarget, byteLength, requestedMaxByteLength) を返す。

25.2.4 SharedArrayBuffer コンストラクターのプロパティ

SharedArrayBuffer コンストラクター:

  • [[Prototype]] 内部スロット値が %Function.prototype% である。
  • 以下のプロパティを持つ:

25.2.4.1 SharedArrayBuffer.prototype

SharedArrayBuffer.prototype の初期値は SharedArrayBuffer プロトタイプオブジェクトである。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

25.2.4.2 get SharedArrayBuffer [ %Symbol.species% ]

SharedArrayBuffer[%Symbol.species%] は set アクセサが undefinedアクセサプロパティであり、その get アクセサの挙動は次の通り:

  1. this 値を返す。

この関数の "name" プロパティ値は "get [Symbol.species]" である。

25.2.5 SharedArrayBuffer プロトタイプオブジェクトのプロパティ

SharedArrayBuffer プロトタイプオブジェクト:

  • %SharedArrayBuffer.prototype% である。
  • [[Prototype]] 内部スロット値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[ArrayBufferData]][[ArrayBufferByteLength]] 内部スロットを持たない。

25.2.5.1 get SharedArrayBuffer.prototype.byteLength

SharedArrayBuffer.prototype.byteLength は set アクセサが undefinedアクセサプロパティであり、その get アクセサは呼び出し時に以下を行う:

  1. Othis 値とする。
  2. RequireInternalSlot(O, [[ArrayBufferData]])。
  3. IsSharedArrayBuffer(O) が false なら TypeError 例外。
  4. lengthArrayBufferByteLength(O, seq-cst) とする。
  5. 𝔽(length) を返す。

25.2.5.2 SharedArrayBuffer.prototype.constructor

SharedArrayBuffer.prototype.constructor の初期値は %SharedArrayBuffer% である。

25.2.5.3 SharedArrayBuffer.prototype.grow ( newLength )

このメソッドは呼び出し時に以下を行う:

  1. Othis 値とする。
  2. RequireInternalSlot(O, [[ArrayBufferMaxByteLength]])。
  3. IsSharedArrayBuffer(O) が false なら TypeError 例外。
  4. newByteLength を ? ToIndex(newLength) とする。
  5. hostHandled を ? HostGrowSharedArrayBuffer(O, newByteLength) とする。
  6. hostHandledhandled なら undefined を返す。
  7. isLittleEndian を周囲のエージェントの Agent Record[[LittleEndian]] フィールド値とする。
  8. byteLengthBlockO.[[ArrayBufferByteLengthData]] とする。
  9. currentByteLengthRawBytesGetRawBytesFromSharedBlock(byteLengthBlock, 0, biguint64, true, seq-cst) とする。
  10. newByteLengthRawBytesNumericToRawBytes(biguint64, (newByteLength), isLittleEndian) とする。
  11. 繰り返し、
    1. 注: 競合する grow を全順序化し、失われたり沈黙して無視されたりしないようにするための compare-and-exchange ループ。
    2. currentByteLength(RawBytesToNumeric(biguint64, currentByteLengthRawBytes, isLittleEndian)) とする。
    3. newByteLength = currentByteLength なら undefined を返す。
    4. newByteLength < currentByteLength または newByteLength > O.[[ArrayBufferMaxByteLength]] なら RangeError 例外。
    5. byteLengthDeltanewByteLength - currentByteLength とする。
    6. byteLengthDelta バイトから成る新しい Shared Data Block 値を作成できないなら RangeError 例外。
    7. 注: ここで新しい Shared Data Block を作って差し替えるわけではない。最大サイズの Shared Data Block を事前確保する仕様上のモデルであり、メモリ不足なら RangeError を投げることを要求するための手順。
    8. readByteLengthRawBytesAtomicCompareExchangeInSharedBlock(byteLengthBlock, 0, 8, currentByteLengthRawBytes, newByteLengthRawBytes) とする。
    9. ByteListEqual(readByteLengthRawBytes, currentByteLengthRawBytes) が true なら undefined を返す。
    10. currentByteLengthRawBytesreadByteLengthRawBytes に設定。
Note

長さ更新の compare-exchange の擬似的失敗は許されない。新しい長さの境界チェックが通り、実装がメモリ不足でない場合、候補実行には常に ReadModifyWriteSharedMemory イベント(成功した compare-exchange)が追加される。

SharedArrayBuffer.prototype.grow への並列呼び出しは全順序化される。例: sab.grow(10)sab.grow(20) が競合する場合、必ずどちらかが勝つ。sab.grow(10)sab.grow(20) の後でも sab を縮めることはなく、その場合は RangeError を投げる。

25.2.5.4 get SharedArrayBuffer.prototype.growable

SharedArrayBuffer.prototype.growable は set アクセサが undefinedアクセサプロパティであり、get アクセサは次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[ArrayBufferData]])。
  3. IsSharedArrayBuffer(O) が false なら TypeError 例外。
  4. IsFixedLengthArrayBuffer(O) が false なら true、そうでなければ false を返す。

25.2.5.5 get SharedArrayBuffer.prototype.maxByteLength

SharedArrayBuffer.prototype.maxByteLength は set アクセサが undefinedアクセサプロパティであり、get アクセサは次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[ArrayBufferData]])。
  3. IsSharedArrayBuffer(O) が false なら TypeError 例外。
  4. IsFixedLengthArrayBuffer(O) が true なら
    1. lengthO.[[ArrayBufferByteLength]] とする。
  5. そうでなければ
    1. lengthO.[[ArrayBufferMaxByteLength]] とする。
  6. 𝔽(length) を返す。

25.2.5.6 SharedArrayBuffer.prototype.slice ( start, end )

このメソッドは呼び出し時に以下を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[ArrayBufferData]])。
  3. IsSharedArrayBuffer(O) が false なら TypeError 例外。
  4. lenArrayBufferByteLength(O, seq-cst) とする。
  5. relativeStart を ? ToIntegerOrInfinity(start) とする。
  6. relativeStart = -∞ なら first = 0。
  7. そうでなく relativeStart < 0 なら first = max(len + relativeStart, 0)。
  8. それ以外は first = min(relativeStart, len)。
  9. endundefined なら relativeEnd = len; そうでなければ ? ToIntegerOrInfinity(end)。
  10. relativeEnd = -∞ なら final = 0。
  11. そうでなく relativeEnd < 0 なら final = max(len + relativeEnd, 0)。
  12. それ以外は final = min(relativeEnd, len)。
  13. newLen = max(final - first, 0)。
  14. ctor = ? SpeciesConstructor(O, %SharedArrayBuffer%)。
  15. new = ? Construct(ctor, « 𝔽(newLen) »)。
  16. RequireInternalSlot(new, [[ArrayBufferData]])。
  17. IsSharedArrayBuffer(new) が false なら TypeError
  18. new.[[ArrayBufferData]]O.[[ArrayBufferData]] と同一なら TypeError
  19. ArrayBufferByteLength(new, seq-cst) < newLen なら TypeError
  20. fromBuf = O.[[ArrayBufferData]]
  21. toBuf = new.[[ArrayBufferData]]
  22. CopyDataBlockBytes(toBuf, 0, fromBuf, first, newLen) を実行。
  23. new を返す。

25.2.5.7 SharedArrayBuffer.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "SharedArrayBuffer" である。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

25.2.6 SharedArrayBuffer インスタンスのプロパティ

SharedArrayBuffer インスタンスは SharedArrayBuffer プロトタイプオブジェクトからプロパティを継承する。各インスタンスは [[ArrayBufferData]] 内部スロットを持つ。成長不可のインスタンスは [[ArrayBufferByteLength]] 内部スロットを持つ。成長可能インスタンスは [[ArrayBufferByteLengthData]] および [[ArrayBufferMaxByteLength]] 内部スロットを持つ。

Note

ArrayBuffer と異なり、SharedArrayBuffer インスタンスは決してデタッチされない。

25.2.7 成長可能 SharedArrayBuffer ガイドライン

Note 1

以下は成長可能 SharedArrayBuffer を扱う ECMAScript プログラマー向けガイドラインである。

可能な限り実際のデプロイ環境でテストすることを推奨する。利用可能な物理メモリ量はハードウェア間で大きく異なる。同様に仮想メモリサブシステムもハードウェアや OS により大きく異なる。64 ビットデスクトップブラウザで正常なアプリが 32 ビットモバイルブラウザではメモリ不足になる可能性がある。

成長可能 SharedArrayBuffer"maxByteLength" オプション値はアプリで必要な最小限の値を選ぶことを推奨し、1,073,741,824 (1GiB) を超えないことを推奨する。

特定の最大サイズで成長可能 SharedArrayBuffer を生成できても、将来の grow が成功する保証はない。

成長可能 SharedArrayBuffer の長さ読み出しの全てが同期的 (seq-cst) 読みとは限らない。u8[idx] のような整数インデックス付きプロパティアクセスの境界チェックに用いる長さの読み出しは同期化されない。一般に明示的同期が無い場合、あるアクセスがインバウンドでも同じエージェント内の後続アクセスもインバウンドとは限らない。対照的に SharedArrayBuffer の length / byteLength ゲッター、%TypedArray%.prototype、DataView.prototype を介した明示的読み出しは同期化される。TypedArray が完全に out-of-bounds かを確認するための組込みメソッドによる長さの読み出しも同期化される。

Note 2

以下は成長可能 SharedArrayBuffer を実装する実装者向けガイドラインである。

成長可能 SharedArrayBuffer は仮想メモリ事前予約によるインプレース成長で実装することを推奨する。

grow 操作は基盤メモリアクセスと並行し得るため、メモリモデル上の制約として非順序 (unordered) アクセスでも「ティア」(値の一部が混ざる) を起こしてはならない。実際には基盤データブロックをコピーで拡張する(世界停止を伴う)手法では実装しづらい。世界停止は直列化ポイントを導入し遅いため推奨しない。

追加されたメモリは作成直後(競合アクセスに対しても)ゼロ化されているように見えねばならない。ゼロ初期化オンデマンドの仮想メモリページ、または手動ゼロ化時の慎重な同期で実現できる。

成長可能 SharedArrayBuffer 上の TypedArray ビューの整数インデックス付きプロパティアクセスは、基礎バッファ長へのアクセスが同期化されない(前述)ため、非成長 SharedArrayBuffer 上の場合と同様に最適化可能なことを意図している。例えば境界チェックをループ外へホイストできる。

仮想メモリを持たない(MMU の無い組込み等)ホストでコピー方式による実装は困難である。そうしたホストにおけるメモリ使用は仮想メモリを持つホストと大きく異なる可能性があるため、メモリ使用の期待値を明確に伝えるべきである。

25.3 DataView オブジェクト

25.3.1 DataView オブジェクト用抽象操作

25.3.1.1 DataView With Buffer Witness Record

DataView With Buffer Witness Record は、DataView と、その参照バッファのキャッシュされたバイト長をカプセル化するための Record 値である。これは、参照バッファが成長可能 SharedArrayBuffer である場合にバイト長データブロックに対する単一の共有メモリ読み出しイベントを保証する助けとして用いられる。

DataView With Buffer Witness Record は Table 75 に示すフィールドを持つ。

Table 75: DataView With Buffer Witness Record のフィールド
Field Name Value Meaning
[[Object]] a DataView バッファのバイト長が読み込まれる DataView オブジェクト。
[[CachedBufferByteLength]] a non-negative integer or detached Record 作成時点のオブジェクトの [[ViewedArrayBuffer]] のバイト長。

25.3.1.2 MakeDataViewWithBufferWitnessRecord ( obj, order )

The abstract operation MakeDataViewWithBufferWitnessRecord takes arguments obj (a DataView) and order (seq-cst or unordered) and returns a DataView With Buffer Witness Record. It performs the following steps when called:

  1. bufferobj.[[ViewedArrayBuffer]] とする。
  2. IsDetachedBuffer(buffer) が true なら
    1. byteLength = detached
  3. そうでなければ
    1. byteLength = ArrayBufferByteLength(buffer, order)。
  4. DataView With Buffer Witness Record { [[Object]]: obj, [[CachedBufferByteLength]]: byteLength } を返す。

25.3.1.3 GetViewByteLength ( viewRecord )

The abstract operation GetViewByteLength takes argument viewRecord (a DataView With Buffer Witness Record) and returns a non-negative integer. It performs the following steps when called:

  1. アサート: IsViewOutOfBounds(viewRecord) は false
  2. viewviewRecord.[[Object]] とする。
  3. view.[[ByteLength]]auto でないなら view.[[ByteLength]] を返す。
  4. アサート: IsFixedLengthArrayBuffer(view.[[ViewedArrayBuffer]]) は false
  5. byteOffset = view.[[ByteOffset]]
  6. byteLength = viewRecord.[[CachedBufferByteLength]]
  7. アサート: byteLengthdetached ではない。
  8. byteLength - byteOffset を返す。

25.3.1.4 IsViewOutOfBounds ( viewRecord )

The abstract operation IsViewOutOfBounds takes argument viewRecord (a DataView With Buffer Witness Record) and returns a Boolean. It performs the following steps when called:

  1. viewviewRecord.[[Object]] とする。
  2. bufferByteLengthviewRecord.[[CachedBufferByteLength]] とする。
  3. アサート: IsDetachedBuffer(view.[[ViewedArrayBuffer]]) が true であることと bufferByteLengthdetached であることは同値。
  4. bufferByteLengthdetached なら true を返す。
  5. byteOffsetStart = view.[[ByteOffset]]
  6. view.[[ByteLength]]auto なら
    1. byteOffsetEnd = bufferByteLength
  7. そうでなければ
    1. byteOffsetEnd = byteOffsetStart + view.[[ByteLength]]
  8. byteOffsetStart > bufferByteLength または byteOffsetEnd > bufferByteLength なら true
  9. 注: 長さ 0 の DataView は out-of-bounds とみなさない。
  10. false を返す。

25.3.1.5 GetViewValue ( view, requestIndex, isLittleEndian, type )

The abstract operation GetViewValue takes arguments view (an ECMAScript language value), requestIndex (an ECMAScript language value), isLittleEndian (an ECMAScript language value), and type (a TypedArray element type) and returns either a normal completion containing either a Number or a BigInt, or a throw completion. DataView インスタンス上の関数からビューのバッファから値を取得する際に使用される。 It performs the following steps when called:

  1. RequireInternalSlot(view, [[DataView]])。
  2. アサート: view[[ViewedArrayBuffer]] 内部スロットを持つ。
  3. getIndex = ? ToIndex(requestIndex)。
  4. isLittleEndian = ToBoolean(isLittleEndian)。
  5. viewOffset = view.[[ByteOffset]]
  6. viewRecord = MakeDataViewWithBufferWitnessRecord(view, unordered)。
  7. 注: view のバッファが成長可能 SharedArrayBuffer の場合、境界チェックは同期化されない操作。
  8. IsViewOutOfBounds(viewRecord) が true なら TypeError 例外。
  9. viewSize = GetViewByteLength(viewRecord)。
  10. elementSizeTable 73 における要素型 type の要素サイズ値とする。
  11. getIndex + elementSize > viewSize なら RangeError 例外。
  12. bufferIndex = getIndex + viewOffset
  13. GetValueFromBuffer(view.[[ViewedArrayBuffer]], bufferIndex, type, false, unordered, isLittleEndian) を返す。

25.3.1.6 SetViewValue ( view, requestIndex, isLittleEndian, type, value )

The abstract operation SetViewValue takes arguments view (an ECMAScript language value), requestIndex (an ECMAScript language value), isLittleEndian (an ECMAScript language value), type (a TypedArray element type), and value (an ECMAScript language value) and returns either a normal completion containing undefined or a throw completion. DataView インスタンス上の関数からビューのバッファへ値を書き込むために使用される。 It performs the following steps when called:

  1. RequireInternalSlot(view, [[DataView]])。
  2. アサート: view[[ViewedArrayBuffer]] 内部スロットを持つ。
  3. getIndex = ? ToIndex(requestIndex)。
  4. IsBigIntElementType(type) が true なら numberValue = ? ToBigInt(value)。
  5. そうでなければ numberValue = ? ToNumber(value)。
  6. isLittleEndian = ToBoolean(isLittleEndian)。
  7. viewOffset = view.[[ByteOffset]]
  8. viewRecord = MakeDataViewWithBufferWitnessRecord(view, unordered)。
  9. 注: view のバッファが成長可能 SharedArrayBuffer の場合、境界チェックは同期化されない。
  10. IsViewOutOfBounds(viewRecord) が true なら TypeError 例外。
  11. viewSize = GetViewByteLength(viewRecord)。
  12. elementSizeTable 73type の要素サイズ値とする。
  13. getIndex + elementSize > viewSize なら RangeError 例外。
  14. bufferIndex = getIndex + viewOffset
  15. SetValueInBuffer(view.[[ViewedArrayBuffer]], bufferIndex, type, numberValue, false, unordered, isLittleEndian) を実行。
  16. undefined を返す。

25.3.2 DataView コンストラクター

DataView コンストラクター:

  • %DataView% である。
  • グローバルオブジェクト"DataView" プロパティの初期値である。
  • コンストラクターとして呼ばれた際に新しい DataView を生成し初期化する。
  • 関数として呼び出すことは意図されず、その形で呼ぶと例外を投げる。
  • クラス定義の extends 句の値として使用できる。指定された DataView の挙動を継承するサブクラスコンストラクターは DataView.prototype の組込みメソッドを支える内部状態でインスタンスを初期化するため super 呼び出しを含めねばならない。

25.3.2.1 DataView ( buffer [ , byteOffset [ , byteLength ] ] )

この関数は呼び出し時に次を行う:

  1. NewTarget が undefined なら TypeError 例外。
  2. RequireInternalSlot(buffer, [[ArrayBufferData]])。
  3. offset = ? ToIndex(byteOffset)。
  4. IsDetachedBuffer(buffer) が true なら TypeError 例外。
  5. bufferByteLength = ArrayBufferByteLength(buffer, seq-cst)。
  6. offset > bufferByteLength なら RangeError 例外。
  7. bufferIsFixedLength = IsFixedLengthArrayBuffer(buffer)。
  8. byteLengthundefined なら
    1. bufferIsFixedLengthtrue なら
      1. viewByteLength = bufferByteLength - offset
    2. そうでなければ
      1. viewByteLength = auto
  9. そうでなければ
    1. viewByteLength = ? ToIndex(byteLength)。
    2. offset + viewByteLength > bufferByteLength なら RangeError 例外。
  10. O = ? OrdinaryCreateFromConstructor(NewTarget, "%DataView.prototype%", « [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] »)。
  11. IsDetachedBuffer(buffer) が true なら TypeError 例外。
  12. bufferByteLength = ArrayBufferByteLength(buffer, seq-cst) に再設定。
  13. offset > bufferByteLength なら RangeError 例外。
  14. byteLengthundefined でないなら
    1. offset + viewByteLength > bufferByteLength なら RangeError 例外。
  15. O.[[ViewedArrayBuffer]] = buffer
  16. O.[[ByteLength]] = viewByteLength
  17. O.[[ByteOffset]] = offset
  18. O を返す。

25.3.3 DataView コンストラクターのプロパティ

DataView コンストラクター:

  • [[Prototype]] 内部スロット値が %Function.prototype% である。
  • 以下のプロパティを持つ:

25.3.3.1 DataView.prototype

DataView.prototype の初期値は DataView プロトタイプオブジェクトである。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

25.3.4 DataView プロトタイプオブジェクトのプロパティ

DataView プロトタイプオブジェクト:

  • %DataView.prototype% である。
  • [[Prototype]] 内部スロット値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] 内部スロットを持たない。

25.3.4.1 get DataView.prototype.buffer

DataView.prototype.buffer は set アクセサが undefinedアクセサプロパティであり、その get アクセサは以下を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[DataView]])。
  3. アサート: O[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. buffer = O.[[ViewedArrayBuffer]]
  5. buffer を返す。

25.3.4.2 get DataView.prototype.byteLength

DataView.prototype.byteLength は set アクセサが undefinedアクセサプロパティであり、その get アクセサは以下を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[DataView]])。
  3. アサート: O[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. viewRecord = MakeDataViewWithBufferWitnessRecord(O, seq-cst)。
  5. IsViewOutOfBounds(viewRecord) が true なら TypeError 例外。
  6. size = GetViewByteLength(viewRecord)。
  7. 𝔽(size) を返す。

25.3.4.3 get DataView.prototype.byteOffset

DataView.prototype.byteOffset は set アクセサが undefinedアクセサプロパティであり、その get アクセサは以下を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[DataView]])。
  3. アサート: O[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. viewRecord = MakeDataViewWithBufferWitnessRecord(O, seq-cst)。
  5. IsViewOutOfBounds(viewRecord) が true なら TypeError 例外。
  6. offset = O.[[ByteOffset]]
  7. 𝔽(offset) を返す。

25.3.4.4 DataView.prototype.constructor

DataView.prototype.constructor の初期値は %DataView% である。

25.3.4.5 DataView.prototype.getBigInt64 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. GetViewValue(view, byteOffset, littleEndian, bigint64) を返す。

25.3.4.6 DataView.prototype.getBigUint64 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. GetViewValue(view, byteOffset, littleEndian, biguint64) を返す。

25.3.4.7 DataView.prototype.getFloat16 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. GetViewValue(view, byteOffset, littleEndian, float16) を返す。

25.3.4.8 DataView.prototype.getFloat32 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. GetViewValue(view, byteOffset, littleEndian, float32) を返す。

25.3.4.9 DataView.prototype.getFloat64 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. GetViewValue(view, byteOffset, littleEndian, float64) を返す。

25.3.4.10 DataView.prototype.getInt8 ( byteOffset )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. GetViewValue(view, byteOffset, true, int8) を返す。

25.3.4.11 DataView.prototype.getInt16 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. GetViewValue(view, byteOffset, littleEndian, int16) を返す。

25.3.4.12 DataView.prototype.getInt32 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. GetViewValue(view, byteOffset, littleEndian, int32) を返す。

25.3.4.13 DataView.prototype.getUint8 ( byteOffset )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. GetViewValue(view, byteOffset, true, uint8) を返す。

25.3.4.14 DataView.prototype.getUint16 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. GetViewValue(view, byteOffset, littleEndian, uint16) を返す。

25.3.4.15 DataView.prototype.getUint32 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. GetViewValue(view, byteOffset, littleEndian, uint32) を返す。

25.3.4.16 DataView.prototype.setBigInt64 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. SetViewValue(view, byteOffset, littleEndian, bigint64, value) を返す。

25.3.4.17 DataView.prototype.setBigUint64 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. SetViewValue(view, byteOffset, littleEndian, biguint64, value) を返す。

25.3.4.18 DataView.prototype.setFloat16 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. SetViewValue(view, byteOffset, littleEndian, float16, value) を返す。

25.3.4.19 DataView.prototype.setFloat32 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. SetViewValue(view, byteOffset, littleEndian, float32, value) を返す。

25.3.4.20 DataView.prototype.setFloat64 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. SetViewValue(view, byteOffset, littleEndian, float64, value) を返す。

25.3.4.21 DataView.prototype.setInt8 ( byteOffset, value )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. SetViewValue(view, byteOffset, true, int8, value) を返す。

25.3.4.22 DataView.prototype.setInt16 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. SetViewValue(view, byteOffset, littleEndian, int16, value) を返す。

25.3.4.23 DataView.prototype.setInt32 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. SetViewValue(view, byteOffset, littleEndian, int32, value) を返す。

25.3.4.24 DataView.prototype.setUint8 ( byteOffset, value )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. SetViewValue(view, byteOffset, true, uint8, value) を返す。

25.3.4.25 DataView.prototype.setUint16 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. SetViewValue(view, byteOffset, littleEndian, uint16, value) を返す。

25.3.4.26 DataView.prototype.setUint32 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出し時に以下を行う:

  1. viewthis 値。
  2. littleEndian が存在しなければ littleEndian = false
  3. SetViewValue(view, byteOffset, littleEndian, uint32, value) を返す。

25.3.4.27 DataView.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティ初期値は文字列 "DataView" である。

このプロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

25.3.5 DataView インスタンスのプロパティ

DataView インスタンスは DataView プロトタイプオブジェクトからプロパティを継承する。各インスタンスは [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] 内部スロットを持つ。

Note

[[DataView]] 内部スロットの値自体は仕様内では使用されない。その内部スロットが存在すること自体で DataView コンストラクターにより生成されたオブジェクトであることを識別する。

25.4 Atomics オブジェクト

Atomics オブジェクトは次の通りである:

  • %Atomics% である。
  • グローバルオブジェクト"Atomics" プロパティの初期値である。
  • 通常のオブジェクトである。
  • その [[Prototype]] 内部スロットの値は %Object.prototype% である。
  • [[Construct]] 内部メソッドを持たない;new 演算子でコンストラクタとして使用できない。
  • [[Call]] 内部メソッドを持たない;関数として呼び出せない。

Atomics オブジェクトは共有メモリ配列セルに対して不可分(アトミック)に動作する関数、およびエージェントがプリミティブなイベントを待機・送出するための関数を提供する。規律を守って用いることで、共有メモリを介して通信するマルチエージェントプログラムは、並列 CPU 上であっても理解可能な順序で実行される。共有メモリ通信を支配する規則は後述のメモリモデルで定義される。

Note

ECMAScript での共有メモリのプログラミングおよび実装に関する参考指針については、メモリモデル節末尾の注記を参照のこと。

25.4.1 Waiter Record

Waiter RecordAtomics.wait または Atomics.waitAsync への特定の呼び出しを表すために用いられる Record 値である。

Waiter Record は Table 76 に挙げるフィールドを持つ。

Table 76: Waiter Record のフィールド
フィールド名 意味
[[AgentSignifier]] エージェント識別子 Atomics.wait または Atomics.waitAsync を呼び出したエージェント。
[[PromiseCapability]] PromiseCapability Record または blocking Atomics.waitAsync の呼び出しを表す場合はその結果の Promise、それ以外は blocking
[[TimeoutTime]] 非負の拡張数学的値 タイムアウトが発火し得る最も早い時刻;時間値を用いて計算される。
[[Result]] "ok" または "timed-out" 呼び出しの戻り値。

25.4.2 WaiterList Records

WaiterList RecordAtomics.wait, Atomics.waitAsync, Atomics.notify を通じたエージェントの待機と通知を説明するために用いられる。

WaiterList Record は Table 77 に挙げるフィールドを持つ。

Table 77: WaiterList Record のフィールド
フィールド名 意味
[[Waiters]] Waiter RecordList この WaiterList が関連付けられているロケーションで待機している Atomics.wait または Atomics.waitAsync への呼び出し。
[[MostRecentLeaveEvent]] Synchronize event または empty 直近にそのクリティカルセクションを離れたイベント。未入場なら empty

同一のエージェント識別子を持つ複数の Waiter Record が 1 つの WaiterList に存在し得る。

エージェントクラスタは WaiterList Record の保管領域を持ち、そのインデックスは (block, i) であり、blockShared Data Blocki はそのメモリ内のバイトオフセットである。WaiterList Record はエージェント非依存であり、(block, i) による WaiterList Record の参照はクラスタ内どのエージェントからも同一の WaiterList Record を得る。

各 WaiterList Record はその評価中の排他的アクセスを制御する クリティカルセクション を持つ。同時に入場できるのは 1 つのエージェントのみである。クリティカルセクションへの入退場は抽象操作 EnterCriticalSectionLeaveCriticalSection により制御される。待機エージェントの追加/削除、リスト走査、リスト上のエージェントのサスペンドおよび通知、Synchronize event の設定/取得といった WaiterList Record 上の操作は、クリティカルセクションへ入場したエージェントのみが実行できる。

25.4.3 Atomics のための抽象操作

25.4.3.1 ValidateIntegerTypedArray ( typedArray, waitable )

The abstract operation ValidateIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and waitable (a Boolean) and returns 正常完了で TypedArray With Buffer Witness Record を含むか、または throw completion. It performs the following steps when called:

  1. taRecord を ? ValidateTypedArray(typedArray, unordered) の結果とする。
  2. 注: typedArray の裏付けバッファが拡張可能な SharedArrayBuffer のとき、境界チェックは同期化操作ではない。
  3. もし waitabletrue なら、
    1. もし typedArray.[[TypedArrayName]]"Int32Array" でも "BigInt64Array" でもないなら TypeError 例外を投げる。
  4. それ以外なら、
    1. typeTypedArrayElementType(typedArray) とする。
    2. IsUnclampedIntegerElementType(type) が false かつ IsBigIntElementType(type) が false なら TypeError 例外を投げる。
  5. taRecord を返す。

25.4.3.2 ValidateAtomicAccess ( taRecord, requestIndex )

The abstract operation ValidateAtomicAccess takes arguments taRecord (a TypedArray With Buffer Witness Record) and requestIndex (an ECMAScript language value) and returns 正常完了で整数を含むか、または throw completion. It performs the following steps when called:

  1. lengthTypedArrayLength(taRecord) とする。
  2. accessIndex を ? ToIndex(requestIndex) とする。
  3. 事前条件: accessIndex ≥ 0.
  4. もし accessIndexlength なら RangeError 例外を投げる。
  5. typedArraytaRecord.[[Object]] とする。
  6. elementSizeTypedArrayElementSize(typedArray) とする。
  7. offsettypedArray.[[ByteOffset]] とする。
  8. (accessIndex × elementSize) + offset を返す。

25.4.3.3 ValidateAtomicAccessOnIntegerTypedArray ( typedArray, requestIndex )

The abstract operation ValidateAtomicAccessOnIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and requestIndex (an ECMAScript language value) and returns 正常完了で整数を含むか、または throw completion. It performs the following steps when called:

  1. taRecord を ? ValidateIntegerTypedArray(typedArray, false) とする。
  2. ValidateAtomicAccess(taRecord, requestIndex) を返す。

25.4.3.4 RevalidateAtomicAccess ( typedArray, byteIndexInBuffer )

The abstract operation RevalidateAtomicAccess takes arguments typedArray (a TypedArray) and byteIndexInBuffer (an integer) and returns 正常完了で unused を含むか、または throw completion. この操作は Atomics メソッド内で全ての引数強制が行われた後(それらには任意の副作用があり得て、バッファを out of bounds にし得る)、アトミック操作のための裏付けバッファ内のインデックスを再検証する。typedArray の裏付けバッファが SharedArrayBuffer の場合、この操作は例外を投げない。 It performs the following steps when called:

  1. taRecordMakeTypedArrayWithBufferWitnessRecord(typedArray, unordered) とする。
  2. 注: typedArray の裏付けバッファが拡張可能な SharedArrayBuffer のとき、境界チェックは同期化操作ではない。
  3. もし IsTypedArrayOutOfBounds(taRecord) が true なら TypeError 例外を投げる。
  4. 事前条件: byteIndexInBuffertypedArray.[[ByteOffset]].
  5. もし byteIndexInBuffertaRecord.[[CachedBufferByteLength]] なら RangeError 例外を投げる。
  6. unused を返す。

25.4.3.5 GetWaiterList ( block, i )

The abstract operation GetWaiterList takes arguments block (a Shared Data Block) and i (4 で割り切れる非負整数) and returns WaiterList Record. It performs the following steps when called:

  1. 事前条件: i および i + 3 は block のメモリ内の有効なバイトオフセットである。
  2. 組 (block, i) により参照される WaiterList Record を返す。

25.4.3.6 EnterCriticalSection ( WL )

The abstract operation EnterCriticalSection takes argument WL (a WaiterList Record) and returns unused. It performs the following steps when called:

  1. 事前条件: 周囲のエージェントはいかなる WaiterList Recordクリティカルセクションにも入っていない。
  2. いずれのエージェントも WLクリティカルセクションにいないまで待ち、次に(他のエージェントを入れずに)WLクリティカルセクションへ入る。
  3. もし WL.[[MostRecentLeaveEvent]]empty でないなら、
    1. 注: WLクリティカルセクションが少なくとも一度入場された場合、LeaveCriticalSection により Synchronize event が設定されている。
    2. execution を周囲エージェントの Agent Record[[CandidateExecution]] フィールドとする。
    3. eventsRecordexecution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() である Agent Events Record とする。
    4. enterEvent を新たな Synchronize event とする。
    5. enterEventeventsRecord.[[EventList]] に追加する。
    6. (WL.[[MostRecentLeaveEvent]], enterEvent) を eventsRecord.[[AgentSynchronizesWith]] に追加する。
  4. unused を返す。

EnterCriticalSection は、クリティカルセクションへ入ろうとするエージェントが他のエージェントの退出を待たねばならないとき 競合 (contention) を持つ。競合がないとき、EnterCriticalSection 呼び出しの FIFO 順序は観測可能である。競合があるとき、実装は任意の順序を選択できるが、エージェントを無期限に待たせてはならない。

25.4.3.7 LeaveCriticalSection ( WL )

The abstract operation LeaveCriticalSection takes argument WL (a WaiterList Record) and returns unused. It performs the following steps when called:

  1. 事前条件: 周囲のエージェントは WLクリティカルセクション内にいる。
  2. execution を周囲エージェントの Agent Record[[CandidateExecution]] フィールドとする。
  3. eventsRecordexecution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() の Agent Events Record とする。
  4. leaveEvent を新たな Synchronize event とする。
  5. leaveEventeventsRecord.[[EventList]] に追加する。
  6. WL.[[MostRecentLeaveEvent]]leaveEvent に設定する。
  7. WLクリティカルセクションを離れる。
  8. unused を返す。

25.4.3.8 AddWaiter ( WL, waiterRecord )

The abstract operation AddWaiter takes arguments WL (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:

  1. 事前条件: 周囲のエージェントは WLクリティカルセクション内にいる。
  2. 事前条件: WL.[[Waiters]][[PromiseCapability]] フィールドが waiterRecord.[[PromiseCapability]] かつ [[AgentSignifier]] フィールドが waiterRecord.[[AgentSignifier]] である Waiter Record は存在しない。
  3. waiterRecordWL.[[Waiters]] に追加する。
  4. unused を返す。

25.4.3.9 RemoveWaiter ( WL, waiterRecord )

The abstract operation RemoveWaiter takes arguments WL (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:

  1. 事前条件: 周囲のエージェントは WLクリティカルセクション内にいる。
  2. 事前条件: WL.[[Waiters]]waiterRecord を含む。
  3. waiterRecordWL.[[Waiters]] から除去する。
  4. unused を返す。

25.4.3.10 RemoveWaiters ( WL, c )

The abstract operation RemoveWaiters takes arguments WL (a WaiterList Record) and c (非負整数または +∞) and returns Waiter RecordList. It performs the following steps when called:

  1. 事前条件: 周囲のエージェントは WLクリティカルセクション内にいる。
  2. lenWL.[[Waiters]] の要素数とする。
  3. nmin(c, len) とする。
  4. LWL.[[Waiters]] の最初の n 要素からなる List とする。
  5. WL.[[Waiters]] の最初の n 要素を除去する。
  6. L を返す。

25.4.3.11 SuspendThisAgent ( WL, waiterRecord )

The abstract operation SuspendThisAgent takes arguments WL (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:

  1. 事前条件: 周囲のエージェントは WLクリティカルセクション内にいる。
  2. 事前条件: WL.[[Waiters]]waiterRecord を含む。
  3. thisAgentAgentSignifier() とする。
  4. 事前条件: waiterRecord.[[AgentSignifier]]thisAgent である。
  5. 事前条件: waiterRecord.[[PromiseCapability]]blocking である。
  6. 事前条件: AgentCanSuspend() は true である。
  7. LeaveCriticalSection(WL) を行い、サスペンドが有効になる前に通知が到着しても失われない方法で、周囲のエージェントを waiterRecord.[[TimeoutTime]] の時刻までサスペンドし、その後周囲のエージェントはサスペンド解除される。サスペンド解除はタイムアウト、または他のエージェントが NotifyWaiterWL, thisAgent で呼び出した(つまり Atomics.notify 呼び出し経由)場合のみ起こる。
  8. EnterCriticalSection(WL) を実行する。
  9. unused を返す。

25.4.3.12 NotifyWaiter ( WL, waiterRecord )

The abstract operation NotifyWaiter takes arguments WL (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:

  1. 事前条件: 周囲のエージェントは WLクリティカルセクション内にいる。
  2. もし waiterRecord.[[PromiseCapability]]blocking なら、
    1. 識別子が waiterRecord.[[AgentSignifier]] であるエージェントをサスペンドから起こす。
    2. 注: これによりエージェントは SuspendThisAgent 内の実行を再開する。
  3. そうでなく AgentSignifier() が waiterRecord.[[AgentSignifier]] なら、
    1. promiseCapabilitywaiterRecord.[[PromiseCapability]] とする。
    2. ! Call(promiseCapability.[[Resolve]], undefined, « waiterRecord.[[Result]] ») を実行する。
  4. その他の場合、
    1. EnqueueResolveInAgentJob(waiterRecord.[[AgentSignifier]], waiterRecord.[[PromiseCapability]], waiterRecord.[[Result]]) を実行する。
  5. unused を返す。
Note

エージェントは、ホストへ渡す以外の形で他エージェントの promise capability にアクセスしてはならない。

25.4.3.13 EnqueueResolveInAgentJob ( agentSignifier, promiseCapability, resolution )

The abstract operation EnqueueResolveInAgentJob takes arguments agentSignifier (an agent signifier), promiseCapability (a PromiseCapability Record), and resolution ("ok" or "timed-out") and returns unused. It performs the following steps when called:

  1. resolveJob を、引数なしで agentSignifier, promiseCapability, resolution を捕捉し、呼び出されたとき次を行う新たな Job Abstract Closure とする:
    1. 事前条件: AgentSignifier() は agentSignifier である。
    2. ! Call(promiseCapability.[[Resolve]], undefined, « resolution ») を実行する。
    3. unused を返す。
  2. realmInTargetAgent を ! GetFunctionRealm(promiseCapability.[[Resolve]]) とする。
  3. 事前条件: agentSignifierrealmInTargetAgent.[[AgentSignifier]] である。
  4. HostEnqueueGenericJob(resolveJob, realmInTargetAgent) を実行する。
  5. unused を返す。

25.4.3.14 DoWait ( mode, typedArray, index, value, timeout )

The abstract operation DoWait takes arguments mode (sync or async), typedArray (an ECMAScript language value), index (an ECMAScript language value), value (an ECMAScript language value), and timeout (an ECMAScript language value) and returns 正常完了で Object, "not-equal", "timed-out", "ok" のいずれか、または throw completion. It performs the following steps when called:

  1. taRecord を ? ValidateIntegerTypedArray(typedArray, true) とする。
  2. buffertaRecord.[[Object]].[[ViewedArrayBuffer]] とする。
  3. もし IsSharedArrayBuffer(buffer) が false なら TypeError 例外を投げる。
  4. i を ? ValidateAtomicAccess(taRecord, index) とする。
  5. arrayTypeNametypedArray.[[TypedArrayName]] とする。
  6. もし arrayTypeName"BigInt64Array" なら v を ? ToBigInt64(value) とする。
  7. そうでなければ v を ? ToInt32(value) とする。
  8. q を ? ToNumber(timeout) とする。
  9. もし qNaN 又は +∞𝔽 なら t を +∞ とする;q-∞𝔽 なら t を 0;それ以外は tmax((q), 0) とする。
  10. もし modesync かつ AgentCanSuspend() が false なら TypeError 例外を投げる。
  11. blockbuffer.[[ArrayBufferData]] とする。
  12. offsettypedArray.[[ByteOffset]] とする。
  13. byteIndexInBuffer を (i × 4) + offset とする。
  14. WLGetWaiterList(block, byteIndexInBuffer) とする。
  15. もし modesync なら
    1. promiseCapabilityblocking とする。
    2. resultObjectundefined とする。
  16. それ以外なら
    1. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
    2. resultObjectOrdinaryObjectCreate(%Object.prototype%) とする。
  17. EnterCriticalSection(WL) を実行する。
  18. elementTypeTypedArrayElementType(typedArray) とする。
  19. wGetValueFromBuffer(buffer, byteIndexInBuffer, elementType, true, seq-cst) とする。
  20. もし vw なら
    1. LeaveCriticalSection(WL) を実行する。
    2. もし modesync なら "not-equal" を返す。
    3. CreateDataPropertyOrThrow(resultObject, "async", false) を実行。
    4. CreateDataPropertyOrThrow(resultObject, "value", "not-equal") を実行。
    5. resultObject を返す。
  21. もし t = 0 かつ modeasync なら
    1. 注: 同期即時タイムアウトには特別扱いはない。非同期即時タイムアウトは失敗を速め、不要な Promise ジョブを避ける特別扱いを持つ。
    2. LeaveCriticalSection(WL) を実行する。
    3. CreateDataPropertyOrThrow(resultObject, "async", false) を実行。
    4. CreateDataPropertyOrThrow(resultObject, "value", "timed-out") を実行。
    5. resultObject を返す。
  22. thisAgentAgentSignifier() とする。
  23. now を現在時刻 (UTC) を示す time value とする。
  24. additionalTimeout実装定義の非負数学的値とする。
  25. timeoutTime(now) + t + additionalTimeout とする。
  26. 注: t が +∞ のとき timeoutTime も +∞。
  27. waiterRecord を新たな Waiter Record { [[AgentSignifier]]: thisAgent, [[PromiseCapability]]: promiseCapability, [[TimeoutTime]]: timeoutTime, [[Result]]: "ok" } とする。
  28. AddWaiter(WL, waiterRecord) を実行する。
  29. もし modesync なら
    1. SuspendThisAgent(WL, waiterRecord) を実行する。
  30. それ以外で timeoutTime有限なら
    1. EnqueueAtomicsWaitAsyncTimeoutJob(WL, waiterRecord) を実行する。
  31. LeaveCriticalSection(WL) を実行する。
  32. もし modesync なら waiterRecord.[[Result]] を返す。
  33. CreateDataPropertyOrThrow(resultObject, "async", true) を実行。
  34. CreateDataPropertyOrThrow(resultObject, "value", promiseCapability.[[Promise]]) を実行。
  35. resultObject を返す。
Note

additionalTimeout は、電力消費削減やタイミング攻撃緩和のためのタイマー分解能粗化など、実装が必要に応じてタイムアウトにパディングを追加することを許容する。値は DoWait の呼び出しごとに異なり得る。

25.4.3.15 EnqueueAtomicsWaitAsyncTimeoutJob ( WL, waiterRecord )

The abstract operation EnqueueAtomicsWaitAsyncTimeoutJob takes arguments WL (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:

  1. timeoutJob を、引数なしで WLwaiterRecord を捕捉し、呼び出されたとき以下を行う新たな Job Abstract Closure とする:
    1. EnterCriticalSection(WL) を実行する。
    2. もし WL.[[Waiters]]waiterRecord を含むなら
      1. timeOfJobExecution を現在時刻 (UTC) を示す time value とする。
      2. 事前条件: (timeOfJobExecution) ≥ waiterRecord.[[TimeoutTime]]時間値の非単調性は無視)。
      3. waiterRecord.[[Result]]"timed-out" に設定する。
      4. RemoveWaiter(WL, waiterRecord) を実行する。
      5. NotifyWaiter(WL, waiterRecord) を実行する。
    3. LeaveCriticalSection(WL) を実行する。
    4. unused を返す。
  2. now を現在時刻 (UTC) を示す time value とする。
  3. currentRealm を現在の Realm Record とする。
  4. HostEnqueueTimeoutJob(timeoutJob, currentRealm, 𝔽(waiterRecord.[[TimeoutTime]]) - now) を実行する。
  5. unused を返す。

25.4.3.16 AtomicCompareExchangeInSharedBlock ( block, byteIndexInBuffer, elementSize, expectedBytes, replacementBytes )

The abstract operation AtomicCompareExchangeInSharedBlock takes arguments block (a Shared Data Block), byteIndexInBuffer (an integer), elementSize (a non-negative integer), expectedBytes (a List of byte values), and replacementBytes (a List of byte values) and returns byte 値の List. It performs the following steps when called:

  1. execution を周囲エージェントの Agent Record[[CandidateExecution]] フィールドとする。
  2. eventsRecordexecution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() の Agent Events Record とする。
  3. rawBytesRead を長さ elementSizeList とし、要素は非決定的に選ばれるバイト値とする。
  4. 注: 実装では rawBytesRead は基盤ハードウェア上のロードリンク、ロード排他、または read-modify-write 命令のオペランドの結果である。この非決定性は弱い一貫性を持つハードウェアの観測可能な振る舞いを記述するための意味的規定。
  5. 注: 期待値と読み取った値の比較は read-modify-write 変更関数の外で行い、期待値不一致の場合に不必要な強い同期化を避ける。
  6. もし ByteListEqual(rawBytesRead, expectedBytes) が true なら
    1. second を (oldBytes, newBytes) を引数に取り何も捕捉せず呼ばれるとアトミックに次を行う新たな read-modify-write 変更関数とし、newBytes を返す。
    2. eventReadModifyWriteSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndexInBuffer, [[ElementSize]]: elementSize, [[Payload]]: replacementBytes, [[ModifyOp]]: second } とする。
  7. それ以外なら
    1. eventReadSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndexInBuffer, [[ElementSize]]: elementSize } とする。
  8. eventeventsRecord.[[EventList]] に追加する。
  9. Chosen Value Record { [[Event]]: event, [[ChosenValue]]: rawBytesRead } を execution.[[ChosenValues]] に追加する。
  10. rawBytesRead を返す。

25.4.3.17 AtomicReadModifyWrite ( typedArray, index, value, op )

The abstract operation AtomicReadModifyWrite takes arguments typedArray (an ECMAScript language value), index (an ECMAScript language value), value (an ECMAScript language value), and op (a read-modify-write modification function) and returns 正常完了で Number または BigInt を含むか、または throw completion. op は2つの byte 値 List を引数に取り、byte 値 List を返す。この操作は値をアトミックに読み込み、別の値と結合し、その結合を格納し、読み込んだ値を返す。 It performs the following steps when called:

  1. byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index) とする。
  2. もし typedArray.[[ContentType]]bigint なら v を ? ToBigInt(value) とする。
  3. それ以外は v𝔽(? ToIntegerOrInfinity(value)) とする。
  4. RevalidateAtomicAccess(typedArray, byteIndexInBuffer) を実行する。
  5. buffertypedArray.[[ViewedArrayBuffer]] とする。
  6. elementTypeTypedArrayElementType(typedArray) とする。
  7. GetModifySetValueInBuffer(buffer, byteIndexInBuffer, elementType, v, op) を返す。

25.4.3.18 ByteListBitwiseOp ( op, xBytes, yBytes )

The abstract operation ByteListBitwiseOp takes arguments op (&, ^, または |), xBytes (a List of byte values), and yBytes (a List of byte values) and returns byte 値の List. この操作は引数の全てのバイト値に対してビット単位演算をアトミックに行い、byte 値の List を返す。 It performs the following steps when called:

  1. 事前条件: xBytesyBytes は同じ要素数を持つ。
  2. result を新たな空 List とする。
  3. i を 0 とする。
  4. 各要素 xByte について
    1. yByteyBytes[i] とする。
    2. もし op& なら
      1. resultBytexByteyByte のビット単位 AND の結果とする。
    3. そうでなく op^ なら
      1. resultBytexByteyByte のビット単位 XOR の結果とする。
    4. それ以外
      1. 事前条件: op|
      2. resultBytexByteyByte のビット単位 OR の結果とする。
    5. ii + 1 にする。
    6. resultByteresult に追加する。
  5. result を返す。

25.4.3.19 ByteListEqual ( xBytes, yBytes )

The abstract operation ByteListEqual takes arguments xBytes (a List of byte values) and yBytes (a List of byte values) and returns Boolean. It performs the following steps when called:

  1. もし xBytesyBytes が同じ要素数でなければ false を返す。
  2. i を 0 とする。
  3. 各要素 xByte について
    1. yByteyBytes[i] とする。
    2. もし xByteyByte なら false を返す。
    3. ii + 1 にする。
  4. true を返す。

25.4.4 Atomics.add ( typedArray, index, value )

この関数は呼び出されたとき次を行う:

  1. add を (xBytes, yBytes) を引数に取り typedArray を捕捉し、呼ばれるとアトミックに以下を行う新たな read-modify-write 変更関数とする:
    1. typeTypedArrayElementType(typedArray) とする。
    2. isLittleEndian を周囲エージェントの Agent Record[[LittleEndian]] フィールドの値とする。
    3. xRawBytesToNumeric(type, xBytes, isLittleEndian) とする。
    4. yRawBytesToNumeric(type, yBytes, isLittleEndian) とする。
    5. もし x が Number なら
      1. sumNumber::add(x, y) とする。
    6. それ以外
      1. 事前条件: x は BigInt。
      2. sumBigInt::add(x, y) とする。
    7. sumBytesNumericToRawBytes(type, sum, isLittleEndian) とする。
    8. 事前条件: sumBytes, xBytes, yBytes は同じ要素数。
    9. sumBytes を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, add) を返す。

25.4.5 Atomics.and ( typedArray, index, value )

この関数は呼び出されたとき次を行う:

  1. and を (xBytes, yBytes) を引数に取り何も捕捉せず、呼ばれるとアトミックに次を行う新たな read-modify-write 変更関数とし、ByteListBitwiseOp(&, xBytes, yBytes) を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, and) を返す。

25.4.6 Atomics.compareExchange ( typedArray, index, expectedValue, replacementValue )

この関数は呼び出されたとき次を行う:

  1. byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index) とする。
  2. buffertypedArray.[[ViewedArrayBuffer]] とする。
  3. blockbuffer.[[ArrayBufferData]] とする。
  4. もし typedArray.[[ContentType]]bigint なら
    1. expected を ? ToBigInt(expectedValue) とする。
    2. replacement を ? ToBigInt(replacementValue) とする。
  5. それ以外
    1. expected𝔽(? ToIntegerOrInfinity(expectedValue)) とする。
    2. replacement𝔽(? ToIntegerOrInfinity(replacementValue)) とする。
  6. RevalidateAtomicAccess(typedArray, byteIndexInBuffer) を実行する。
  7. elementTypeTypedArrayElementType(typedArray) とする。
  8. elementSizeTypedArrayElementSize(typedArray) とする。
  9. isLittleEndian を周囲エージェントの Agent Record[[LittleEndian]] フィールド値とする。
  10. expectedBytesNumericToRawBytes(elementType, expected, isLittleEndian) とする。
  11. replacementBytesNumericToRawBytes(elementType, replacement, isLittleEndian) とする。
  12. もし IsSharedArrayBuffer(buffer) が true なら
    1. rawBytesReadAtomicCompareExchangeInSharedBlock(block, byteIndexInBuffer, elementSize, expectedBytes, replacementBytes) とする。
  13. それ以外
    1. rawBytesRead を長さ elementSizeList とし、block[byteIndexInBuffer] から始まる elementSize バイト列とする。
    2. もし ByteListEqual(rawBytesRead, expectedBytes) が true なら
      1. replacementBytes の各バイトを blockblock[byteIndexInBuffer] から書き込む。
  14. RawBytesToNumeric(elementType, rawBytesRead, isLittleEndian) を返す。

25.4.7 Atomics.exchange ( typedArray, index, value )

この関数は呼び出されたとき次を行う:

  1. second を (oldBytes, newBytes) を引数に取り何も捕捉せず、呼ばれるとアトミックに newBytes を返す read-modify-write 変更関数とする。
  2. AtomicReadModifyWrite(typedArray, index, value, second) を返す。

25.4.8 Atomics.isLockFree ( size )

この関数は呼び出されたとき次を行う:

  1. n を ? ToIntegerOrInfinity(size) とする。
  2. AR を周囲エージェントの Agent Record とする。
  3. もし n = 1 なら AR.[[IsLockFree1]] を返す。
  4. もし n = 2 なら AR.[[IsLockFree2]] を返す。
  5. もし n = 4 なら true を返す。
  6. もし n = 8 なら AR.[[IsLockFree8]] を返す。
  7. false を返す。
Note

この関数は最適化プリミティブである。直感的には、サイズ n バイトのデータに対するアトミックプリミティブ(compareExchange, load, store, add, sub, and, or, xor, exchange)のアトミックステップが、そのデータ n バイト外のロックを取得せずに実行されるなら Atomics.isLockFree(n) は true を返す。高性能アルゴリズムはこの関数を用いてクリティカルセクションでロックを使うかアトミック操作を使うかを決定する。アトミックプリミティブがロックフリーでない場合、アルゴリズムが独自のロックを提供する方がしばしば効率的である。

Atomics.isLockFree(4) は常に true を返し、これは全ての関連ハードウェアでサポート可能である。これを前提できることでプログラムは一般に単純化する。

この関数が返す値に関わらず、全てのアトミック操作はアトミックであることが保証される。例えば、操作の途中で可視な操作が発生(いわゆる「tearing」)することは決してない。

25.4.9 Atomics.load ( typedArray, index )

この関数は呼び出されたとき次を行う:

  1. byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index) とする。
  2. RevalidateAtomicAccess(typedArray, byteIndexInBuffer) を実行する。
  3. buffertypedArray.[[ViewedArrayBuffer]] とする。
  4. elementTypeTypedArrayElementType(typedArray) とする。
  5. GetValueFromBuffer(buffer, byteIndexInBuffer, elementType, true, seq-cst) を返す。

25.4.10 Atomics.or ( typedArray, index, value )

この関数は呼び出されたとき次を行う:

  1. or を (xBytes, yBytes) を引数に取り何も捕捉せず、呼ばれるとアトミックに ByteListBitwiseOp(|, xBytes, yBytes) を返す read-modify-write 変更関数とする。
  2. AtomicReadModifyWrite(typedArray, index, value, or) を返す。

25.4.11 Atomics.store ( typedArray, index, value )

この関数は呼び出されたとき次を行う:

  1. byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index) とする。
  2. もし typedArray.[[ContentType]]bigint なら v を ? ToBigInt(value) とする。
  3. それ以外は v𝔽(? ToIntegerOrInfinity(value)) とする。
  4. RevalidateAtomicAccess(typedArray, byteIndexInBuffer) を実行する。
  5. buffertypedArray.[[ViewedArrayBuffer]] とする。
  6. elementTypeTypedArrayElementType(typedArray) とする。
  7. SetValueInBuffer(buffer, byteIndexInBuffer, elementType, v, true, seq-cst) を実行する。
  8. v を返す。

25.4.12 Atomics.sub ( typedArray, index, value )

この関数は呼び出されたとき次を行う:

  1. subtract を (xBytes, yBytes) を引数に取り typedArray を捕捉し、呼ばれるとアトミックに以下を行う新たな read-modify-write 変更関数とする:
    1. typeTypedArrayElementType(typedArray) とする。
    2. isLittleEndian を周囲エージェントの Agent Record[[LittleEndian]] フィールド値とする。
    3. xRawBytesToNumeric(type, xBytes, isLittleEndian) とする。
    4. yRawBytesToNumeric(type, yBytes, isLittleEndian) とする。
    5. もし x が Number なら
      1. differenceNumber::subtract(x, y) とする。
    6. それ以外
      1. 事前条件: x は BigInt。
      2. differenceBigInt::subtract(x, y) とする。
    7. differenceBytesNumericToRawBytes(type, difference, isLittleEndian) とする。
    8. 事前条件: differenceBytes, xBytes, yBytes は同じ要素数。
    9. differenceBytes を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, subtract) を返す。

25.4.13 Atomics.wait ( typedArray, index, value, timeout )

この関数は周囲のエージェントを待機キューに入れ、通知またはタイムアウトまでサスペンドし、それらを区別する文字列を返す。

呼び出されたとき次を行う:

  1. DoWait(sync, typedArray, index, value, timeout) を返す。

25.4.14 Atomics.waitAsync ( typedArray, index, value, timeout )

この関数は、呼び出しエージェントが通知されるかタイムアウトに達したとき解決される Promise を返す。

呼び出されたとき次を行う:

  1. DoWait(async, typedArray, index, value, timeout) を返す。

25.4.15 Atomics.notify ( typedArray, index, count )

この関数は待機キューでスリープしている一部のエージェントに通知する。

呼び出されたとき次を行う:

  1. taRecord を ? ValidateIntegerTypedArray(typedArray, true) とする。
  2. byteIndexInBuffer を ? ValidateAtomicAccess(taRecord, index) とする。
  3. もし countundefined なら
    1. c を +∞ とする。
  4. それ以外
    1. intCount を ? ToIntegerOrInfinity(count) とする。
    2. cmax(intCount, 0) とする。
  5. buffertypedArray.[[ViewedArrayBuffer]] とする。
  6. blockbuffer.[[ArrayBufferData]] とする。
  7. もし IsSharedArrayBuffer(buffer) が false なら +0𝔽 を返す。
  8. WLGetWaiterList(block, byteIndexInBuffer) とする。
  9. EnterCriticalSection(WL) を実行する。
  10. SRemoveWaiters(WL, c) とする。
  11. S の要素 W について
    1. NotifyWaiter(WL, W) を実行する。
  12. LeaveCriticalSection(WL) を実行する。
  13. nS の要素数とする。
  14. 𝔽(n) を返す。

25.4.16 Atomics.xor ( typedArray, index, value )

この関数は呼び出されたとき次を行う:

  1. xor を (xBytes, yBytes) を引数に取り何も捕捉せず、呼ばれるとアトミックに ByteListBitwiseOp(^, xBytes, yBytes) を返す read-modify-write 変更関数とする。
  2. AtomicReadModifyWrite(typedArray, index, value, xor) を返す。

25.4.17 Atomics [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "Atomics" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

25.5 JSON オブジェクト

JSON オブジェクトは次の通りである:

  • %JSON% である。
  • グローバルオブジェクト"JSON" プロパティの初期値である。
  • 通常のオブジェクトである。
  • parsestringify の 2 つの関数を含み、JSON テキストの構文解析と構築に使用される。
  • [[Prototype]] 内部スロットの値は %Object.prototype% である。
  • [[Construct]] 内部メソッドを持たず、new 演算子でコンストラクタとして使用できない。
  • [[Call]] 内部メソッドを持たず、関数として呼び出せない。

JSON データ交換形式は ECMA-404 に定義される。本仕様で使用される JSON 交換形式は ECMA-404 に記述されるものと正確に同一である。JSON.parse および JSON.stringify の適合実装は ECMA-404 仕様に記述された交換形式を、削除や拡張なしにサポートしなければならない。

25.5.1 JSON.parse ( text [ , reviver ] )

この関数は JSON テキスト(JSON 形式の文字列)を構文解析し、ECMAScript 言語値を生成する。JSON 形式はリテラル、配列、オブジェクトを ECMAScript のリテラル、配列初期化子、オブジェクト初期化子に類似した構文で表現する。構文解析後、JSON オブジェクトは ECMAScript オブジェクトとして実体化され、JSON 配列は ECMAScript の Array インスタンスとして実体化される。JSON の文字列、数値、真偽値、および null はそれぞれ ECMAScript の String, Number, Boolean, null として実体化される。

任意の reviver パラメータは 2 つのパラメータ key, value を取る関数であり、結果をフィルタおよび変換できる。構文解析で生成された各 key/value ペアで呼び出され、その戻り値が元の値の代わりに使用される。受け取ったものをそのまま返した場合、構造は変更されない。undefined を返した場合、そのプロパティは結果から削除される。

  1. jsonString を ? ToString(text) とする。
  2. unfiltered を ? ParseJSON(jsonString) とする。
  3. もし IsCallable(reviver) が true なら
    1. rootOrdinaryObjectCreate(%Object.prototype%) とする。
    2. rootName を空文字列とする。
    3. CreateDataPropertyOrThrow(root, rootName, unfiltered) を実行する。
    4. InternalizeJSONProperty(root, rootName, reviver) を返す。
  4. それ以外
    1. unfiltered を返す。

この関数の "length" プロパティは 2𝔽 である。

25.5.1.1 ParseJSON ( text )

The abstract operation ParseJSON takes argument text (a String) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion. It performs the following steps when called:

  1. もし StringToCodePoints(text) が ECMA-404 で規定された有効な JSON テキストでないなら SyntaxError 例外を投げる。
  2. scriptString"(", text, ");"文字列連結とする。
  3. script を ParseText(scriptString, Script) とする。
  4. 注: 13.2.5.1 で定義される早期エラールールは上記 ParseText 呼び出しに特別な扱いを持つ。
  5. 事前条件: script は Parse Node。
  6. result を ! script の評価 とする。
  7. 注: 13.2.5.5 で定義される PropertyDefinitionEvaluation の意味論は ParseJSON 中特別な扱いを持つ。
  8. 事前条件: result は String, Number, Boolean, ArrayLiteralObjectLiteral により定義される Object, または null のいずれかである。
  9. result を返す。

適合実装が JSON.parse の JSON 文法を拡張することは許されない。修正または拡張された JSON 交換形式をサポートしたい実装は別の parse 関数を定義しなければならない。

Note 1

有効な JSON テキストは ECMAScript PrimaryExpression 構文の部分集合である。ステップ 1jsonString がその部分集合に従うことを検証し、ステップ 8 は評価が適切な型の値を返すことを保証する。

しかし、13.2.5.5 が ParseJSON 中で異なる振る舞いをするため、同一のソーステキストを PrimaryExpression として評価した場合と JSON として評価した場合で異なる結果を生むことがある。さらにオブジェクトリテラル内の重複 "__proto__" プロパティの Early Error(ParseJSON 中は適用されない)により、文法に合致していても ParseJSON が受理するすべてのテキストが PrimaryExpression として有効とは限らない。

Note 2

オブジェクト内に重複する name String が存在する場合、字句的に先行する同一キーの値は上書きされる。

25.5.1.2 InternalizeJSONProperty ( holder, name, reviver )

The abstract operation InternalizeJSONProperty takes arguments holder (an Object), name (a String), and reviver (a function object) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion.

Note

このアルゴリズムは [[Delete]] または CreateDataPropertyfalse を返しても例外を投げないことを意図している。

呼び出されたとき次を行う:

  1. val を ? Get(holder, name) とする。
  2. もし val が Object なら
    1. isArray を ? IsArray(val) とする。
    2. もし isArraytrue なら
      1. len を ? LengthOfArrayLike(val) とする。
      2. I を 0 とする。
      3. I < len の間繰り返す:
        1. prop を ! ToString(𝔽(I)) とする。
        2. newElement を ? InternalizeJSONProperty(val, prop, reviver) とする。
        3. もし newElementundefined なら
          1. val.[[Delete]](prop) を実行。
        4. それ以外
          1. CreateDataProperty(val, prop, newElement) を実行。
        5. II + 1 にする。
    3. それ以外
      1. keys を ? EnumerableOwnProperties(val, key) とする。
      2. 各 String P について
        1. newElement を ? InternalizeJSONProperty(val, P, reviver) とする。
        2. もし newElementundefined なら
          1. val.[[Delete]](P) を実行。
        3. それ以外
          1. CreateDataProperty(val, P, newElement) を実行。
  3. ? Call(reviver, holder, « name, val ») を返す。

25.5.2 JSON.stringify ( value [ , replacer [ , space ] ] )

この関数は value を UTF-16 エンコードされた JSON 形式の文字列か undefined で表現して返す。3 つのパラメータを取る。value通常オブジェクトまたは配列であるが、String, Boolean, Number, null も指定可能。任意の replacer はオブジェクトや配列の文字列化方法を変更する関数、または文字列と数値の配列であり、文字列化に含めるプロパティを選択する包含リストとして振る舞う。任意の space は String または Number で、人間可読性向上のため結果に空白を挿入できる。

呼び出されたとき次を行う:

  1. stack を新たな空 List とする。
  2. indent を空文字列とする。
  3. PropertyListundefined とする。
  4. ReplacerFunctionundefined とする。
  5. もし replacer が Object なら
    1. もし IsCallable(replacer) が true なら
      1. ReplacerFunctionreplacer に設定する。
    2. それ以外
      1. isArray を ? IsArray(replacer) とする。
      2. もし isArraytrue なら
        1. PropertyList を新たな空 List とする。
        2. len を ? LengthOfArrayLike(replacer) とする。
        3. k を 0 とする。
        4. k < len の間繰り返す:
          1. prop を ! ToString(𝔽(k)) とする。
          2. v を ? Get(replacer, prop) とする。
          3. itemundefined とする。
          4. もし v が String なら
            1. itemv とする。
          5. それ以外で v が Number なら
            1. item を ! ToString(v) とする。
          6. それ以外で v が Object なら
            1. もし v[[StringData]] または [[NumberData]] 内部スロットを持つなら item を ? ToString(v) とする。
          7. もし itemundefined でなく かつ PropertyList に含まれていなければ itemPropertyList に追加する。
          8. kk + 1 にする。
  6. もし space が Object なら
    1. もし space[[NumberData]] 内部スロットを持つなら
      1. space を ? ToNumber(space) とする。
    2. それ以外で space[[StringData]] 内部スロットを持つなら
      1. space を ? ToString(space) とする。
  7. もし space が Number なら
    1. spaceMV を ! ToIntegerOrInfinity(space) とする。
    2. spaceMVmin(10, spaceMV) に設定する。
    3. もし spaceMV < 1 なら gap を空文字列、それ以外はコード単位 0x0020 (SPACE) の spaceMV 回繰り返しからなる文字列値とする。
  8. それ以外で space が String なら
    1. もし space の長さ ≤ 10 なら gapspace とし、そうでなければ space の 0 から 10 までの部分文字列とする。
  9. それ以外
    1. gap を空文字列とする。
  10. wrapperOrdinaryObjectCreate(%Object.prototype%) とする。
  11. CreateDataPropertyOrThrow(wrapper, 空文字列, value) を実行する。
  12. stateJSON Serialization Record { [[ReplacerFunction]]: ReplacerFunction, [[Stack]]: stack, [[Indent]]: indent, [[Gap]]: gap, [[PropertyList]]: PropertyList } とする。
  13. SerializeJSONProperty(state, 空文字列, wrapper) を返す。

この関数の "length" プロパティは 3𝔽 である。

Note 1

JSON 構造は任意の深さにネスト可能であるが非循環でなければならない。value が循環構造であるか含む場合、この関数は TypeError 例外を投げねばならない。以下は文字列化できない値の例:

a = [];
a[0] = a;
my_text = JSON.stringify(a); // これは TypeError を投げなければならない。
Note 2

シンボリックなプリミティブ値は以下のようにレンダリングされる:

  • null 値は JSON テキストでは文字列値 "null" として表現される。
  • undefined 値はレンダリングされない。
  • true 値は JSON テキストでは文字列値 "true" として表現される。
  • false 値は JSON テキストでは文字列値 "false" として表現される。
Note 3

文字列値は QUOTATION MARK (") コード単位で囲まれる。コード単位 "\\ 接頭辞でエスケープされる。制御文字コード単位は \uHHHH のエスケープシーケンス、または短い形式 \b (BACKSPACE), \f (FORM FEED), \n (LINE FEED), \r (CARRIAGE RETURN), \t (CHARACTER TABULATION) に置換される。

Note 4

有限の数値は ToString(number) 呼び出しと同様に文字列化される。NaN と符号に関わらず Infinity は文字列値 "null" として表現される。

Note 5

JSON 表現を持たない値(undefined や関数など)は文字列を生成しない。代わりに undefined を生成する。配列ではこれらの値は文字列値 "null" として表現され、オブジェクトでは表現不能な値はそのプロパティが文字列化から除外される。

Note 6

オブジェクトは U+007B (LEFT CURLY BRACKET) で開始し、0 個以上のプロパティを U+002C (COMMA) で区切り、U+007D (RIGHT CURLY BRACKET) で閉じる。プロパティはプロパティ名を表す引用符付き String、U+003A (COLON)、およびその文字列化された値で構成される。配列は U+005B (LEFT SQUARE BRACKET) で開始し、0 個以上の値を U+002C (COMMA) で区切り、U+005D (RIGHT SQUARE BRACKET) で閉じる。

25.5.2.1 JSON Serialization Record

JSON Serialization Record は JSON 形式へのシリアライズを可能にするために用いられる Record 値である。

JSON Serialization Record は Table 78 に挙げるフィールドを持つ。

Table 78: JSON Serialization Record のフィールド
フィールド名 意味
[[ReplacerFunction]] 関数オブジェクトまたは undefined オブジェクトプロパティに代替値を提供できる関数(JSON.stringify の replacer パラメータ)。
[[PropertyList]] String の List または undefined 非配列オブジェクトをシリアライズする際に含めるプロパティ名(JSON.stringify の replacer パラメータ)。
[[Gap]] String インデント単位(JSON.stringify の space パラメータ)。
[[Stack]] Object の List シリアライズ処理中の入れ子オブジェクト集合。循環構造検出に使用。
[[Indent]] String 現在のインデント。

25.5.2.2 SerializeJSONProperty ( state, key, holder )

The abstract operation SerializeJSONProperty takes arguments state (a JSON Serialization Record), key (a String), and holder (an Object) and returns 正常完了で String または undefined を含むか、または throw completion. It performs the following steps when called:

  1. value を ? Get(holder, key) とする。
  2. もし value が Object かまたは value が BigInt なら
    1. toJSON を ? GetV(value, "toJSON") とする。
    2. もし IsCallable(toJSON) が true なら
      1. value を ? Call(toJSON, value, « key ») とする。
  3. もし state.[[ReplacerFunction]]undefined でなければ
    1. value を ? Call(state.[[ReplacerFunction]], holder, « key, value ») とする。
  4. もし value が Object なら
    1. もし value[[NumberData]] 内部スロットを持つなら
      1. value を ? ToNumber(value) とする。
    2. それ以外で [[StringData]] 内部スロットを持つなら
      1. value を ? ToString(value) とする。
    3. それ以外で [[BooleanData]] 内部スロットを持つなら
      1. valuevalue.[[BooleanData]] とする。
    4. それ以外で [[BigIntData]] 内部スロットを持つなら
      1. valuevalue.[[BigIntData]] とする。
  5. もし valuenull なら "null" を返す。
  6. もし valuetrue なら "true" を返す。
  7. もし valuefalse なら "false" を返す。
  8. もし value が String なら QuoteJSONString(value) を返す。
  9. もし value が Number なら
    1. もし value有限なら ! ToString(value) を返す。
    2. "null" を返す。
  10. もし value が BigInt なら TypeError 例外を投げる。
  11. もし value が Object かつ IsCallable(value) が false なら
    1. isArray を ? IsArray(value) とする。
    2. もし isArraytrue なら ? SerializeJSONArray(state, value) を返す。
    3. SerializeJSONObject(state, value) を返す。
  12. undefined を返す。

25.5.2.3 QuoteJSONString ( value )

The abstract operation QuoteJSONString takes argument value (a String) and returns String. value を 0x0022 (QUOTATION MARK) コード単位で囲み、その内部の特定コード単位をエスケープする。この操作は 6.1.4 に記述される通り UTF-16 エンコードされたコードポイント列として value を解釈する。 It performs the following steps when called:

  1. product をコード単位 0x0022 (QUOTATION MARK) だけからなる文字列値とする。
  2. StringToCodePoints(value) の各コードポイント C について
    1. もし CTable 79 の “Code Point” 列に記載されているなら
      1. productproduct と対応行の “Escape Sequence” 列のエスケープシーケンスの文字列連結とする。
    2. それ以外で C の数値が 0x0020 (SPACE) 未満か、C が前方サロゲートまたは後方サロゲートと同じ数値なら
      1. unitC の数値と同じ数値を持つコード単位とする。
      2. productproductUnicodeEscape(unit) の文字列連結とする。
    3. それ以外
      1. productproduct と UTF16EncodeCodePoint(C) の文字列連結とする。
  3. productproduct とコード単位 0x0022 (QUOTATION MARK) の文字列連結とする。
  4. product を返す。
Table 79: JSON 単一文字エスケープシーケンス
Code Point Unicode Character Name Escape Sequence
U+0008 BACKSPACE \b
U+0009 CHARACTER TABULATION \t
U+000A LINE FEED (LF) \n
U+000C FORM FEED (FF) \f
U+000D CARRIAGE RETURN (CR) \r
U+0022 QUOTATION MARK \"
U+005C REVERSE SOLIDUS \\

25.5.2.4 UnicodeEscape ( C )

The abstract operation UnicodeEscape takes argument C (a code unit) and returns String. C を Unicode エスケープシーケンスとして表現する。 It performs the following steps when called:

  1. nC の数値とする。
  2. 事前条件: n ≤ 0xFFFF.
  3. hexn の小文字 16 進数形式の文字列表現とする。
  4. コード単位 0x005C (REVERSE SOLIDUS), "u", および StringPad(hex, 4, "0", start) の文字列連結を返す。

25.5.2.5 SerializeJSONObject ( state, value )

The abstract operation SerializeJSONObject takes arguments state (a JSON Serialization Record) and value (an Object) and returns 正常完了で String を含むか、または throw completion. オブジェクトをシリアライズする。 It performs the following steps when called:

  1. もし state.[[Stack]]value を含むなら構造が循環しているので TypeError 例外を投げる。
  2. valuestate.[[Stack]] に追加する。
  3. stepBackstate.[[Indent]] とする。
  4. state.[[Indent]]state.[[Indent]]state.[[Gap]]文字列連結とする。
  5. もし state.[[PropertyList]]undefined でなければ
    1. Kstate.[[PropertyList]] とする。
  6. それ以外
    1. K を ? EnumerableOwnProperties(value, key) とする。
  7. partial を新たな空 List とする。
  8. K の要素 P について
    1. strP を ? SerializeJSONProperty(state, P, value) とする。
    2. もし strPundefined でなければ
      1. memberQuoteJSONString(P) とする。
      2. membermember":"文字列連結とする。
      3. もし state.[[Gap]] が空文字列でなければ
        1. membermember とコード単位 0x0020 (SPACE) の文字列連結とする。
      4. membermemberstrP文字列連結とする。
      5. memberpartial に追加する。
  9. もし partial が空なら
    1. final"{}" とする。
  10. それ以外
    1. もし state.[[Gap]] が空文字列なら
      1. propertiespartial の全要素文字列をコード単位 0x002C (COMMA) で区切って連結した String 値とし(先頭や末尾には挿入しない)、final"{", properties, "}"文字列連結とする。
    2. それ以外
      1. separator を コード単位 0x002C (COMMA), 0x000A (LINE FEED), state.[[Indent]]文字列連結とする。
      2. propertiespartial の全要素文字列を separator で区切って連結した String 値とし(先頭/末尾には挿入しない)、final"{", コード単位 0x000A (LINE FEED), state.[[Indent]], properties, コード単位 0x000A (LINE FEED), stepBack, "}"文字列連結とする。
  11. state.[[Stack]] の最後の要素を除去する。
  12. state.[[Indent]]stepBack に設定する。
  13. final を返す。

25.5.2.6 SerializeJSONArray ( state, value )

The abstract operation SerializeJSONArray takes arguments state (a JSON Serialization Record) and value (an ECMAScript language value) and returns 正常完了で String を含むか、または throw completion. 配列をシリアライズする。 It performs the following steps when called:

  1. もし state.[[Stack]]value を含むなら構造が循環しているので TypeError 例外を投げる。
  2. valuestate.[[Stack]] に追加する。
  3. stepBackstate.[[Indent]] とする。
  4. state.[[Indent]]state.[[Indent]]state.[[Gap]]文字列連結とする。
  5. partial を新たな空 List とする。
  6. len を ? LengthOfArrayLike(value) とする。
  7. index を 0 とする。
  8. index < len の間繰り返す:
    1. strP を ? SerializeJSONProperty(state, ! ToString(𝔽(index)), value) とする。
    2. もし strPundefined なら
      1. "null"partial に追加する。
    3. それ以外
      1. strPpartial に追加する。
    4. indexindex + 1 にする。
  9. もし partial が空なら
    1. final"[]" とする。
  10. それ以外
    1. もし state.[[Gap]] が空文字列なら
      1. propertiespartial の全要素文字列をコード単位 0x002C (COMMA) で区切って連結した String 値とする。
      2. final"[", properties, "]"文字列連結とする。
    2. それ以外
      1. separator を コード単位 0x002C (COMMA), コード単位 0x000A (LINE FEED), state.[[Indent]]文字列連結とする。
      2. propertiespartial の全要素文字列を separator で区切って連結した String 値とする。
      3. final"[", コード単位 0x000A (LINE FEED), state.[[Indent]], properties, コード単位 0x000A (LINE FEED), stepBack, "]"文字列連結とする。
  11. state.[[Stack]] の最後の要素を除去する。
  12. state.[[Indent]]stepBack に設定する。
  13. final を返す。
Note

配列の表現には +0𝔽(含む)から array.length(含まない)までの要素のみが含まれる。配列インデックスでないキーのプロパティは文字列化から除外される。配列は左角括弧、要素を COMMA で区切り、右角括弧で表現される。

25.5.3 JSON [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "JSON" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

26 メモリの管理

26.1 WeakRef オブジェクト

WeakRef は、ターゲットとなるオブジェクトまたはシンボルをガベージコレクションから保護せずに参照するためのオブジェクトである。ターゲットがまだガベージコレクションに回収されていない場合、WeakRef は逆参照してターゲット値へアクセスできる。

26.1.1 WeakRef コンストラクタ

WeakRef コンストラクタは次の通り:

  • %WeakRef% である。
  • グローバルオブジェクト"WeakRef" プロパティの初期値である。
  • コンストラクタとして呼び出されたとき新しい WeakRef を生成し初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外を投げる。
  • クラス定義の extends 句における値として使用できる。指定された WeakRef の挙動を継承することを意図するサブクラスのコンストラクタは、WeakRef.prototype 組み込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、WeakRef コンストラクタへの super 呼び出しを含めなければならない。

26.1.1.1 WeakRef ( target )

この関数は呼び出されると次の手順を実行する:

  1. もし NewTarget が undefined なら TypeError 例外を投げる。
  2. もし CanBeHeldWeakly(target) が false なら TypeError 例外を投げる。
  3. weakRef を ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRef.prototype%", « [[WeakRefTarget]] ») とする。
  4. AddToKeptObjects(target) を実行する。
  5. weakRef.[[WeakRefTarget]]target を設定する。
  6. weakRef を返す。

26.1.2 WeakRef コンストラクタのプロパティ

WeakRef コンストラクタは次の通り:

  • その [[Prototype]] 内部スロットの値は %Function.prototype% である。
  • 以下のプロパティを持つ:

26.1.2.1 WeakRef.prototype

WeakRef.prototype の初期値は WeakRef プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

26.1.3 WeakRef プロトタイプオブジェクトのプロパティ

WeakRef プロトタイプオブジェクト は次の通り:

  • %WeakRef.prototype% である。
  • その [[Prototype]] 内部スロットの値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[WeakRefTarget]] 内部スロットを持たない。
Normative Optional

26.1.3.1 WeakRef.prototype.constructor

WeakRef.prototype.constructor の初期値は %WeakRef% である。

26.1.3.2 WeakRef.prototype.deref ( )

このメソッドは呼び出されると次の手順を実行する:

  1. weakRefthis 値とする。
  2. RequireInternalSlot(weakRef, [[WeakRefTarget]]) を実行する。
  3. WeakRefDeref(weakRef) を返す。
Note

WeakRefundefined でない target 値を返す場合、その target 値は現在の ECMAScript コードの実行が完了するまでガベージコレクションされないべきである。AddToKeptObjects 操作は読み取りの一貫性が維持されることを保証する。

let target = { foo() {} };
let weakRef = new WeakRef(target);

// ... あとで ...

if (weakRef.deref()) {
  weakRef.deref().foo();
}

上の例では、最初の deref が undefined で評価されないなら、2 回目の deref も undefined にはなり得ない。

26.1.3.3 WeakRef.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "WeakRef" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

26.1.4 WeakRef 抽象操作

26.1.4.1 WeakRefDeref ( weakRef )

The abstract operation WeakRefDeref takes argument weakRef (a WeakRef) and returns ECMAScript 言語値. It performs the following steps when called:

  1. targetweakRef.[[WeakRefTarget]] とする。
  2. もし targetempty でないなら
    1. AddToKeptObjects(target) を実行する。
    2. target を返す。
  3. undefined を返す。
Note

この抽象操作は、WeakRef.prototype.deref と切り離して定義されており、ライブネスを簡潔に定義できるようにしている。

26.1.5 WeakRef インスタンスのプロパティ

WeakRef インスタンスは WeakRef プロトタイプオブジェクトからプロパティを継承する通常のオブジェクトである。WeakRef インスタンスはさらに [[WeakRefTarget]] 内部スロットを持つ。

26.2 FinalizationRegistry オブジェクト

FinalizationRegistry は、ターゲットオブジェクトおよびシンボルがガベージコレクションされた際に実行されるクリーンアップ操作の登録および登録解除を管理するオブジェクトである。

26.2.1 FinalizationRegistry コンストラクタ

FinalizationRegistry コンストラクタは次の通り:

  • %FinalizationRegistry% である。
  • グローバルオブジェクト"FinalizationRegistry" プロパティの初期値である。
  • コンストラクタとして呼び出されたとき新しい FinalizationRegistry を生成し初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外を投げる。
  • クラス定義の extends 句における値として使用できる。指定された FinalizationRegistry の挙動を継承することを意図するサブクラスのコンストラクタは、FinalizationRegistry.prototype 組み込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、FinalizationRegistry コンストラクタへの super 呼び出しを含めなければならない。

26.2.1.1 FinalizationRegistry ( cleanupCallback )

この関数は呼び出されると次の手順を実行する:

  1. もし NewTarget が undefined なら TypeError 例外を投げる。
  2. もし IsCallable(cleanupCallback) が false なら TypeError 例外を投げる。
  3. finalizationRegistry を ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationRegistry.prototype%", « [[Realm]], [[CleanupCallback]], [[Cells]] ») とする。
  4. fn をアクティブな関数オブジェクトとする。
  5. finalizationRegistry.[[Realm]]fn.[[Realm]] を設定する。
  6. finalizationRegistry.[[CleanupCallback]]HostMakeJobCallback(cleanupCallback) を設定する。
  7. finalizationRegistry.[[Cells]] に新しい空の List を設定する。
  8. finalizationRegistry を返す。

26.2.2 FinalizationRegistry コンストラクタのプロパティ

FinalizationRegistry コンストラクタは次の通り:

  • その [[Prototype]] 内部スロットの値は %Function.prototype% である。
  • 以下のプロパティを持つ:

26.2.2.1 FinalizationRegistry.prototype

FinalizationRegistry.prototype の初期値は FinalizationRegistry プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

26.2.3 FinalizationRegistry プロトタイプオブジェクトのプロパティ

FinalizationRegistry プロトタイプオブジェクト は次の通り:

  • %FinalizationRegistry.prototype% である。
  • その [[Prototype]] 内部スロットの値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[Cells]] および [[CleanupCallback]] 内部スロットを持たない。

26.2.3.1 FinalizationRegistry.prototype.constructor

FinalizationRegistry.prototype.constructor の初期値は %FinalizationRegistry% である。

26.2.3.2 FinalizationRegistry.prototype.register ( target, heldValue [ , unregisterToken ] )

このメソッドは呼び出されると次の手順を実行する:

  1. finalizationRegistrythis 値とする。
  2. RequireInternalSlot(finalizationRegistry, [[Cells]]) を実行する。
  3. もし CanBeHeldWeakly(target) が false なら TypeError 例外を投げる。
  4. もし SameValue(target, heldValue) が true なら TypeError 例外を投げる。
  5. もし CanBeHeldWeakly(unregisterToken) が false なら
    1. もし unregisterTokenundefined でないなら TypeError 例外を投げる。
    2. unregisterTokenempty に設定する。
  6. cellRecord { [[WeakRefTarget]]: target, [[HeldValue]]: heldValue, [[UnregisterToken]]: unregisterToken } とする。
  7. cellfinalizationRegistry.[[Cells]] に追加する。
  8. undefined を返す。
Note

本仕様のアルゴリズムと定義に基づくと、finalizationRegistry.[[Cells]]cell を含む間、cell.[[HeldValue]] はライブである。しかしこれは必ずしも cell.[[UnregisterToken]]cell.[[Target]] がライブであることを意味しない。例えば、あるオブジェクトをその自身を unregister token として登録しても、そのオブジェクトを永遠に生存させるわけではない。

26.2.3.3 FinalizationRegistry.prototype.unregister ( unregisterToken )

このメソッドは呼び出されると次の手順を実行する:

  1. finalizationRegistrythis 値とする。
  2. RequireInternalSlot(finalizationRegistry, [[Cells]]) を実行する。
  3. もし CanBeHeldWeakly(unregisterToken) が false なら TypeError 例外を投げる。
  4. removedfalse とする。
  5. finalizationRegistry.[[Cells]] の各 Record { [[WeakRefTarget]], [[HeldValue]], [[UnregisterToken]] } である cell について
    1. もし cell.[[UnregisterToken]]empty でなく、かつ SameValue(cell.[[UnregisterToken]], unregisterToken) が true なら
      1. cellfinalizationRegistry.[[Cells]] から除去する。
      2. removedtrue に設定する。
  6. removed を返す。

26.2.3.4 FinalizationRegistry.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "FinalizationRegistry" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

26.2.4 FinalizationRegistry インスタンスのプロパティ

FinalizationRegistry インスタンスは FinalizationRegistry プロトタイプオブジェクトからプロパティを継承する通常のオブジェクトである。FinalizationRegistry インスタンスはさらに [[Cells]] および [[CleanupCallback]] 内部スロットを持つ。

27 制御抽象オブジェクト (Control Abstraction Objects)

27.1 反復 (Iteration)

27.1.1 共通の反復インタフェース (Common Iteration Interfaces)

インタフェースとは、対応する値が特定の仕様に適合するプロパティキーの集合である。インタフェースの仕様で記述されたすべてのプロパティを提供する任意のオブジェクトは、そのインタフェースに適合する。インタフェースは別個のオブジェクトとして表現されない。そのインタフェースに適合する、個別に実装された多数のオブジェクトが存在し得る。個々のオブジェクトは複数のインタフェースに適合し得る。

27.1.1.1 Iterable インタフェース (The Iterable Interface)

iterable インタフェースTable 80 に記述されるプロパティを含む:

Table 80: Iterable インタフェース 必須プロパティ (Iterable Interface Required Properties)
プロパティ (Property) 値 (Value) 要件 (Requirements)
%Symbol.iterator% イテレータオブジェクトを返す関数 (a function that returns an iterator object) 返されるオブジェクトは iterator インタフェースに適合しなければならない (The returned object must conform to the iterator interface).

27.1.1.2 Iterator インタフェース (The Iterator Interface)

iterator インタフェース を実装するオブジェクトは Table 81 のプロパティを含まなければならない。そのようなオブジェクトは Table 82 のプロパティを実装してもよい。

Table 81: Iterator インタフェース 必須プロパティ (Iterator Interface Required Properties)
プロパティ (Property) 値 (Value) 要件 (Requirements)
"next" IteratorResult オブジェクトを返す関数 (a function that returns an IteratorResult object) 返されるオブジェクトは IteratorResult インタフェースに適合しなければならない。あるイテレータの next メソッドへの以前の呼び出しが "done" プロパティが true の IteratorResult オブジェクトを返した場合、そのオブジェクトへの以後のすべての next 呼び出しも "done" プロパティが true の IteratorResult オブジェクトを返すべきである。ただしこの要件は強制されない。
Note 1

next 関数に引数を渡すことができるが、その解釈と妥当性は対象イテレータに依存する。for-of 文および他の一般的なイテレータ利用者は引数を渡さないため、そのように利用されることを想定するイテレータオブジェクトは引数なしで呼ばれる状況に対処できなければならない。

Table 82: Iterator インタフェース 任意プロパティ (Iterator Interface Optional Properties)
プロパティ (Property) 値 (Value) 要件 (Requirements)
"return" IteratorResult オブジェクトを返す関数 (a function that returns an IteratorResult object) 返されるオブジェクトは IteratorResult インタフェースに適合しなければならない。このメソッドの呼び出しは、呼び出し側がこれ以上そのイテレータの next メソッドを呼び出す意図がないことをイテレータオブジェクトへ通知する。返される IteratorResult オブジェクトは典型的に "done" プロパティが true の値を持ち、return メソッドの引数として渡された値を持つ "value" プロパティを持つ。しかしこの要件は強制されない。
"throw" IteratorResult オブジェクトを返す関数 (a function that returns an IteratorResult object) 返されるオブジェクトは IteratorResult インタフェースに適合しなければならない。このメソッドの呼び出しは、呼び出し側がエラー状態を検出したことをイテレータオブジェクトに通知する。引数はエラー状態を識別するために用いることができ、典型的には例外オブジェクトである。典型的な応答はその引数値を throw することである。メソッドが throw しない場合、返される IteratorResult オブジェクトは通常 "done" プロパティが true の値を持つ。
Note 2

通常これらのメソッドの呼び出し側は、呼び出す前に存在確認を行うべきである。for-ofyield*、配列の分割代入などの特定の ECMAScript 言語機能は存在確認後にこれらを呼び出す。引数として iterable オブジェクトを受け取る多くの ECMAScript ライブラリ関数も条件付きでそれらを呼び出す。

27.1.1.3 Async Iterable インタフェース (The Async Iterable Interface)

async iterable インタフェースTable 83 に記述されるプロパティを含む:

Table 83: Async Iterable インタフェース 必須プロパティ (Async Iterable Interface Required Properties)
プロパティ (Property) 値 (Value) 要件 (Requirements)
%Symbol.asyncIterator% 非同期イテレータオブジェクトを返す関数 (a function that returns an async iterator object) 返されるオブジェクトは async iterator インタフェースに適合しなければならない (The returned object must conform to the async iterator interface).

27.1.1.4 Async Iterator インタフェース (The Async Iterator Interface)

async iterator インタフェース を実装するオブジェクトは Table 84 のプロパティを含まなければならない。そのようなオブジェクトは Table 85 のプロパティを実装してもよい。

Table 84: Async Iterator インタフェース 必須プロパティ (Async Iterator Interface Required Properties)
プロパティ (Property) 値 (Value) 要件 (Requirements)
"next" IteratorResult オブジェクトの promise を返す関数 (a function that returns a promise for an IteratorResult object)

返される promise は、履行時に IteratorResult インタフェースに適合するオブジェクトで履行されなければならない。ある async イテレータの next メソッドへの以前の呼び出しが "done" プロパティが true の IteratorResult オブジェクトの promise を返した場合、そのオブジェクトへの以後のすべての next 呼び出しも "done" プロパティが true の IteratorResult オブジェクトの promise を返すべきである。ただしこの要件は強制されない。

さらに、履行値となる IteratorResult オブジェクトの "value" プロパティの値は promise(または「thenable」)でないべきである。これも強制されない。

Note 1

next 関数には引数を渡せるが、その解釈と妥当性は対象となる async イテレータに依存する。for-await-of 文および他の一般的な async イテレータ利用者は引数を渡さないため、そのような利用を想定する async イテレータオブジェクトは引数なし呼び出しに備える必要がある。

Table 85: Async Iterator インタフェース 任意プロパティ (Async Iterator Interface Optional Properties)
プロパティ (Property) 値 (Value) 要件 (Requirements)
"return" IteratorResult オブジェクトの promise を返す関数 (a function that returns a promise for an IteratorResult object)

返される promise は履行時に IteratorResult インタフェースに適合するオブジェクトで履行されなければならない。このメソッドの呼び出しは、呼び出し側がその async イテレータの next メソッドをこれ以上呼び出す意図がないことを通知する。返される promise は典型的に "done" プロパティが true の IteratorResult オブジェクトで履行され、かつ return メソッドに渡された引数の値を持つ "value" プロパティを持つ。ただしこの要件は強制されない。

さらに、履行値となる IteratorResult オブジェクトの "value" プロパティの値は promise(または「thenable」)でないべきである。引数値が典型的な方法で使用される場合、もしそれが拒否された promise なら同じ理由で拒否された promise を返すべきであり、履行された promise ならその履行値を返される promise の IteratorResult オブジェクトの "value" プロパティとして使用すべきである。ただしこれらの要件も強制されない。

"throw" IteratorResult オブジェクトの promise を返す関数 (a function that returns a promise for an IteratorResult object)

返される promise は履行時に IteratorResult インタフェースに適合するオブジェクトで履行されなければならない。このメソッド呼び出しは、呼び出し側がエラー状態を検出したことを async イテレータオブジェクトに通知する。引数はエラー状態を識別するために使用でき、典型的には例外オブジェクトである。典型的な応答は、その引数値で拒否される promise を返すことである。

返される promise が履行された場合、履行値である IteratorResult オブジェクトは通常 "done" プロパティが true の値を持つ。さらに、その "value" プロパティの値は promise(または「thenable」)でないべきだが、この要件は強制されない。

Note 2

通常これらのメソッドの呼び出し側は存在確認を行ってから呼び出すべきである。for-await-ofyield* を含む特定の ECMAScript 言語機能は存在確認後にこれらを呼び出す。

27.1.1.5 IteratorResult インタフェース (The IteratorResult Interface)

IteratorResult インタフェースTable 86 に列挙されるプロパティを含む:

Table 86: IteratorResult インタフェース プロパティ (IteratorResult Interface Properties)
プロパティ (Property) 値 (Value) 要件 (Requirements)
"done" 真偽値 (a Boolean) これはイテレータの next メソッド呼び出しの結果状態である。イテレータの終端に到達した場合 "done"true。終端でない場合 "done"false で値が利用可能。"done" プロパティ(自身または継承)が存在しない場合、その値は false と見なされる。
"value" ECMAScript 言語値 (an ECMAScript language value) done が false の場合、これは現在の反復要素の値。done が true の場合、(提供されたなら)イテレータの戻り値。イテレータに戻り値がない場合 "value"undefined。その場合、明示的な "value" プロパティを継承していなければ、適合オブジェクトから "value" プロパティを省いてもよい。

27.1.2 イテレータヘルパーオブジェクト (Iterator Helper Objects)

Iterator Helper オブジェクト は、特定のソースイテレータオブジェクトの遅延変換を表す通常のオブジェクトである。Iterator Helper オブジェクト用の名前付きコンストラクタはない。代わりに、Iterator Helper オブジェクトは Iterator インスタンスオブジェクトの特定メソッド呼び出しによって生成される。

27.1.2.1 %IteratorHelperPrototype% オブジェクト (The %IteratorHelperPrototype% Object)

%IteratorHelperPrototype% オブジェクト:

27.1.2.1.1 %IteratorHelperPrototype%.next ( )

  1. GeneratorResume(this value, undefined, "Iterator Helper") を返す。

27.1.2.1.2 %IteratorHelperPrototype%.return ( )

  1. Othis 値とする。
  2. RequireInternalSlot(O, [[UnderlyingIterator]]) を実行する。
  3. 事前条件: O[[GeneratorState]] 内部スロットを持つ。
  4. もし O.[[GeneratorState]]suspended-start なら
    1. O.[[GeneratorState]]completed に設定する。
    2. 注: 一度 generator が completed 状態になると離脱せず、その関連実行コンテキストは再開されない。O に関連する任意の実行状態はここで破棄できる。
    3. IteratorClose(O.[[UnderlyingIterator]], NormalCompletion(unused)) を実行する。
    4. CreateIteratorResultObject(undefined, true) を返す。
  5. CReturnCompletion(undefined) とする。
  6. GeneratorResumeAbrupt(O, C, "Iterator Helper") を返す。

27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "Iterator Helper" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.1.3 イテレータオブジェクト (Iterator Objects)

27.1.3.1 Iterator コンストラクタ (The Iterator Constructor)

Iterator コンストラクタ:

  • %Iterator% である。
  • グローバルオブジェクト"Iterator" プロパティの初期値である。
  • サブクラス化可能として設計されている。クラス定義の extends 句の値として使用できる。

27.1.3.1.1 Iterator ( )

この関数は呼び出されると次を実行する:

  1. もし NewTarget が undefined またはアクティブな関数オブジェクトのいずれかなら TypeError 例外を投げる。
  2. OrdinaryCreateFromConstructor(NewTarget, "%Iterator.prototype%") を返す。

27.1.3.2 Iterator コンストラクタのプロパティ (Properties of the Iterator Constructor)

Iterator コンストラクタ:

  • [[Prototype]] 内部スロットの値は %Function.prototype% である。
  • 次のプロパティを持つ:

27.1.3.2.1 Iterator.from ( O )

  1. iteratorRecord を ? GetIteratorFlattenable(O, iterate-string-primitives) とする。
  2. hasInstance を ? OrdinaryHasInstance(%Iterator%, iteratorRecord.[[Iterator]]) とする。
  3. もし hasInstancetrue なら
    1. iteratorRecord.[[Iterator]] を返す。
  4. wrapperOrdinaryObjectCreate(%WrapForValidIteratorPrototype%, « [[Iterated]] ») とする。
  5. wrapper.[[Iterated]]iteratorRecord を設定する。
  6. wrapper を返す。

27.1.3.2.1.1 %WrapForValidIteratorPrototype% オブジェクト (The %WrapForValidIteratorPrototype% Object)

%WrapForValidIteratorPrototype% オブジェクト:

  • 通常のオブジェクトである。
  • [[Prototype]] 内部スロットの値は %Iterator.prototype% である。

27.1.3.2.1.1.1 %WrapForValidIteratorPrototype%.next ( )

  1. Othis 値とする。
  2. RequireInternalSlot(O, [[Iterated]]) を実行する。
  3. iteratorRecordO.[[Iterated]] とする。
  4. ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]) を返す。

27.1.3.2.1.1.2 %WrapForValidIteratorPrototype%.return ( )

  1. Othis 値とする。
  2. RequireInternalSlot(O, [[Iterated]]) を実行する。
  3. iteratorO.[[Iterated]].[[Iterator]] とする。
  4. 事前条件: iterator は Object。
  5. returnMethod を ? GetMethod(iterator, "return") とする。
  6. もし returnMethodundefined なら
    1. CreateIteratorResultObject(undefined, true) を返す。
  7. ? Call(returnMethod, iterator) を返す。

27.1.3.2.2 Iterator.prototype

Iterator.prototype の初期値は Iterator プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

27.1.4 Iterator プロトタイプオブジェクトのプロパティ (Properties of the Iterator Prototype Object)

Iterator プロトタイプオブジェクト:

  • %Iterator.prototype% である。
  • [[Prototype]] 内部スロットの値は %Object.prototype% である。
  • 通常のオブジェクトである。
Note

この仕様で iterator インタフェースを実装するすべてのオブジェクトは %Iterator.prototype% を継承する。ECMAScript コードは %Iterator.prototype% を継承するオブジェクトを定義することもできる。%Iterator.prototype% はすべてのイテレータオブジェクトに適用可能な追加メソッドを追加できる場所を提供する。

次の式は ECMAScript コードが %Iterator.prototype% オブジェクトにアクセスする一つの方法である:

Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))

27.1.4.1 Iterator.prototype.constructor

Iterator.prototype.constructor は属性 { [[Enumerable]]: false, [[Configurable]]: true } を持つアクセスプロパティである。[[Get]] および [[Set]] 属性は次のように定義される:

27.1.4.1.1 get Iterator.prototype.constructor

[[Get]] 属性の値は引数を必要としない組み込み関数であり、呼び出されると次を実行する:

  1. %Iterator% を返す。

27.1.4.1.2 set Iterator.prototype.constructor

[[Set]] 属性の値は引数 v を取る組み込み関数であり、呼び出されると次を実行する:

  1. SetterThatIgnoresPrototypeProperties(this value, %Iterator.prototype%, "constructor", v) を実行する。
  2. undefined を返す。
Note

ほとんどの組み込みプロトタイプ上の "constructor" プロパティと異なり、Web 互換性の理由からこのプロパティはアクセサでなければならない。

27.1.4.2 Iterator.prototype.drop ( limit )

このメソッドは呼び出されると次を実行する:

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. numLimitCompletion(ToNumber(limit)) とする。
  5. IfAbruptCloseIterator(numLimit, iterated)。
  6. もし numLimitNaN なら
    1. errorThrowCompletion(新しく生成された RangeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  7. integerLimit を ! ToIntegerOrInfinity(numLimit) とする。
  8. もし integerLimit < 0 なら
    1. errorThrowCompletion(新しく生成された RangeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  9. iterated を ? GetIteratorDirect(O) に設定する。
  10. closure を、引数なしで iteratedintegerLimit を捕捉し、呼び出されると次を実行する新たな Abstract Closure とする:
    1. remainingintegerLimit とする。
    2. remaining > 0 の間繰り返す,
      1. もし remaining ≠ +∞ なら
        1. remainingremaining - 1 にする。
      2. next を ? IteratorStep(iterated) とする。
      3. もし nextdone なら ReturnCompletion(undefined) を返す。
    3. 繰り返す,
      1. value を ? IteratorStepValue(iterated) とする。
      2. もし valuedone なら ReturnCompletion(undefined) を返す。
      3. completionCompletion(Yield(value)) とする。
      4. IfAbruptCloseIterator(completion, iterated)。
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] ») とする。
  12. result.[[UnderlyingIterator]]iterated を設定する。
  13. result を返す。

27.1.4.3 Iterator.prototype.every ( predicate )

このメソッドは呼び出されると次を実行する:

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(predicate) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  6. counter を 0 とする。
  7. 繰り返す,
    1. value を ? IteratorStepValue(iterated) とする。
    2. もし valuedone なら true を返す。
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. もし ToBoolean(result) が false なら ? IteratorClose(iterated, NormalCompletion(false)) を返す。
    6. countercounter + 1 にする。

27.1.4.4 Iterator.prototype.filter ( predicate )

このメソッドは呼び出されると次を実行する:

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(predicate) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  6. closure を、引数なしで iteratedpredicate を捕捉し呼び出されると次を実行する新たな Abstract Closure とする:
    1. counter を 0 とする。
    2. 繰り返す,
      1. value を ? IteratorStepValue(iterated) とする。
      2. もし valuedone なら ReturnCompletion(undefined) を返す。
      3. selectedCompletion(Call(predicate, undefined, « value, 𝔽(counter) »)) とする。
      4. IfAbruptCloseIterator(selected, iterated)。
      5. もし ToBoolean(selected) が true なら
        1. completionCompletion(Yield(value)) とする。
        2. IfAbruptCloseIterator(completion, iterated)。
      6. countercounter + 1 にする。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] ») とする。
  8. result.[[UnderlyingIterator]]iterated を設定する。
  9. result を返す。

27.1.4.5 Iterator.prototype.find ( predicate )

このメソッドは呼び出されると次を実行する:

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(predicate) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  6. counter を 0 とする。
  7. 繰り返す,
    1. value を ? IteratorStepValue(iterated) とする。
    2. もし valuedone なら undefined を返す。
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. もし ToBoolean(result) が true なら ? IteratorClose(iterated, NormalCompletion(value)) を返す。
    6. countercounter + 1 にする。

27.1.4.6 Iterator.prototype.flatMap ( mapper )

このメソッドは呼び出されると次を実行する:

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(mapper) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  6. closure を、引数なしで iteratedmapper を捕捉し呼び出されると次を実行する新たな Abstract Closure とする:
    1. counter を 0 とする。
    2. 繰り返す,
      1. value を ? IteratorStepValue(iterated) とする。
      2. もし valuedone なら ReturnCompletion(undefined) を返す。
      3. mappedCompletion(Call(mapper, undefined, « value, 𝔽(counter) »)) とする。
      4. IfAbruptCloseIterator(mapped, iterated)。
      5. innerIteratorCompletion(GetIteratorFlattenable(mapped, reject-primitives)) とする。
      6. IfAbruptCloseIterator(innerIterator, iterated)。
      7. innerAlivetrue とする。
      8. innerAlivetrue の間繰り返す,
        1. innerValueCompletion(IteratorStepValue(innerIterator)) とする。
        2. IfAbruptCloseIterator(innerValue, iterated)。
        3. もし innerValuedone なら
          1. innerAlivefalse に設定する。
        4. それ以外
          1. completionCompletion(Yield(innerValue)) とする。
          2. もし completionabrupt completion なら
            1. backupCompletionCompletion(IteratorClose(innerIterator, completion)) とする。
            2. IfAbruptCloseIterator(backupCompletion, iterated)。
            3. IteratorClose(iterated, completion) を返す。
      9. countercounter + 1 にする。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] ») とする。
  8. result.[[UnderlyingIterator]]iterated を設定する。
  9. result を返す。

27.1.4.7 Iterator.prototype.forEach ( procedure )

このメソッドは呼び出されると次を実行する:

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(procedure) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  6. counter を 0 とする。
  7. 繰り返す,
    1. value を ? IteratorStepValue(iterated) とする。
    2. もし valuedone なら undefined を返す。
    3. resultCompletion(Call(procedure, undefined, « value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. countercounter + 1 にする。

27.1.4.8 Iterator.prototype.map ( mapper )

このメソッドは呼び出されると次を実行する:

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(mapper) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  6. closure を、引数なしで iteratedmapper を捕捉し呼び出されると次を実行する新たな Abstract Closure とする:
    1. counter を 0 とする。
    2. 繰り返す,
      1. value を ? IteratorStepValue(iterated) とする。
      2. もし valuedone なら ReturnCompletion(undefined) を返す。
      3. mappedCompletion(Call(mapper, undefined, « value, 𝔽(counter) »)) とする。
      4. IfAbruptCloseIterator(mapped, iterated)。
      5. completionCompletion(Yield(mapped)) とする。
      6. IfAbruptCloseIterator(completion, iterated)。
      7. countercounter + 1 にする。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] ») とする。
  8. result.[[UnderlyingIterator]]iterated を設定する。
  9. result を返す。

27.1.4.9 Iterator.prototype.reduce ( reducer [ , initialValue ] )

このメソッドは呼び出されると次を実行する:

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(reducer) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  6. もし initialValue が存在しなければ
    1. accumulator を ? IteratorStepValue(iterated) とする。
    2. もし accumulatordone なら TypeError 例外を投げる。
    3. counter を 1 とする。
  7. それ以外
    1. accumulatorinitialValue とする。
    2. counter を 0 とする。
  8. 繰り返す,
    1. value を ? IteratorStepValue(iterated) とする。
    2. もし valuedone なら accumulator を返す。
    3. resultCompletion(Call(reducer, undefined, « accumulator, value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. accumulatorresult に設定する。
    6. countercounter + 1 にする。

27.1.4.10 Iterator.prototype.some ( predicate )

このメソッドは呼び出されると次を実行する:

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(predicate) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  6. counter を 0 とする。
  7. 繰り返す,
    1. value を ? IteratorStepValue(iterated) とする。
    2. もし valuedone なら false を返す。
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. もし ToBoolean(result) が true なら ? IteratorClose(iterated, NormalCompletion(true)) を返す。
    6. countercounter + 1 にする。

27.1.4.11 Iterator.prototype.take ( limit )

このメソッドは呼び出されると次を実行する:

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. numLimitCompletion(ToNumber(limit)) とする。
  5. IfAbruptCloseIterator(numLimit, iterated)。
  6. もし numLimitNaN なら
    1. errorThrowCompletion(新しく生成された RangeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  7. integerLimit を ! ToIntegerOrInfinity(numLimit) とする。
  8. もし integerLimit < 0 なら
    1. errorThrowCompletion(新しく生成された RangeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  9. iterated を ? GetIteratorDirect(O) に設定する。
  10. closure を、引数なしで iteratedintegerLimit を捕捉し呼び出されると次を実行する新たな Abstract Closure とする:
    1. remainingintegerLimit とする。
    2. 繰り返す,
      1. もし remaining = 0 なら
        1. IteratorClose(iterated, ReturnCompletion(undefined)) を返す。
      2. もし remaining ≠ +∞ なら
        1. remainingremaining - 1 にする。
      3. value を ? IteratorStepValue(iterated) とする。
      4. もし valuedone なら ReturnCompletion(undefined) を返す。
      5. completionCompletion(Yield(value)) とする。
      6. IfAbruptCloseIterator(completion, iterated)。
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] ») とする。
  12. result.[[UnderlyingIterator]]iterated を設定する。
  13. result を返す。

27.1.4.12 Iterator.prototype.toArray ( )

このメソッドは呼び出されると次を実行する:

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iterated を ? GetIteratorDirect(O) とする。
  4. items を新しい空の List とする。
  5. 繰り返す,
    1. value を ? IteratorStepValue(iterated) とする。
    2. もし valuedone なら CreateArrayFromList(items) を返す。
    3. valueitems に追加する。

27.1.4.13 Iterator.prototype [ %Symbol.iterator% ] ( )

この関数は呼び出されると次を実行する:

  1. this 値を返す。

この関数の "name" プロパティの値は "[Symbol.iterator]" である。

27.1.4.14 Iterator.prototype [ %Symbol.toStringTag% ]

Iterator.prototype[%Symbol.toStringTag%] は属性 { [[Enumerable]]: false, [[Configurable]]: true } を持つアクセスプロパティである。[[Get]] および [[Set]] 属性は次のように定義される:

27.1.4.14.1 get Iterator.prototype [ %Symbol.toStringTag% ]

[[Get]] 属性の値は引数を必要としない組み込み関数であり、呼び出されると次を実行する:

  1. "Iterator" を返す。

27.1.4.14.2 set Iterator.prototype [ %Symbol.toStringTag% ]

[[Set]] 属性の値は引数 v を取る組み込み関数であり、呼び出されると次を実行する:

  1. SetterThatIgnoresPrototypeProperties(this value, %Iterator.prototype%, %Symbol.toStringTag%, v) を実行する。
  2. undefined を返す。
Note

ほとんどの組み込みプロトタイプ上の %Symbol.toStringTag% プロパティと異なり、Web 互換性の理由からこのプロパティはアクセサでなければならない。

27.1.5 %AsyncIteratorPrototype% オブジェクト (The %AsyncIteratorPrototype% Object)

%AsyncIteratorPrototype% オブジェクト:

  • [[Prototype]] 内部スロットの値は %Object.prototype% である。
  • 通常のオブジェクトである。
Note

この仕様で async iterator インタフェースを実装するすべてのオブジェクトは %AsyncIteratorPrototype% を継承する。ECMAScript コードは %AsyncIteratorPrototype% を継承するオブジェクトを定義することもできる。%AsyncIteratorPrototype% オブジェクトはすべての async イテレータオブジェクトに適用可能な追加メソッドを追加できる場所を提供する。

27.1.5.1 %AsyncIteratorPrototype% [ %Symbol.asyncIterator% ] ( )

この関数は呼び出されると次を実行する:

  1. this 値を返す。

この関数の "name" プロパティの値は "[Symbol.asyncIterator]" である。

27.1.6 同期イテレータからの非同期イテレータオブジェクト (Async-from-Sync Iterator Objects)

Async-from-Sync Iterator オブジェクト は特定の同期イテレータを適応させる async イテレータである。Async-from-Sync Iterator オブジェクトは ECMAScript コードから直接アクセスされることはない。名前付きコンストラクタは存在せず、必要に応じて抽象操作 CreateAsyncFromSyncIterator によって生成される。

27.1.6.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )

The abstract operation CreateAsyncFromSyncIterator takes argument syncIteratorRecord (an Iterator Record) and returns Iterator Record. 同期の Iterator Record から async の Iterator Record を生成するために使用される。 It performs the following steps when called:

  1. asyncIteratorOrdinaryObjectCreate(%AsyncFromSyncIteratorPrototype%, « [[SyncIteratorRecord]] ») とする。
  2. asyncIterator.[[SyncIteratorRecord]]syncIteratorRecord を設定する。
  3. nextMethod を ! Get(asyncIterator, "next") とする。
  4. iteratorRecordIterator Record { [[Iterator]]: asyncIterator, [[NextMethod]]: nextMethod, [[Done]]: false } とする。
  5. iteratorRecord を返す。

27.1.6.2 %AsyncFromSyncIteratorPrototype% オブジェクト (The %AsyncFromSyncIteratorPrototype% Object)

%AsyncFromSyncIteratorPrototype% オブジェクト:

27.1.6.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )

  1. Othis 値とする。
  2. 事前条件: O[[SyncIteratorRecord]] 内部スロットを持つ Object。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordO.[[SyncIteratorRecord]] とする。
  5. もし value が存在すれば
    1. resultCompletion(IteratorNext(syncIteratorRecord, value)) とする。
  6. それ以外
    1. resultCompletion(IteratorNext(syncIteratorRecord)) とする。
  7. IfAbruptRejectPromise(result, promiseCapability)。
  8. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true) を返す。

27.1.6.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )

  1. Othis 値とする。
  2. 事前条件: O[[SyncIteratorRecord]] 内部スロットを持つ Object。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordO.[[SyncIteratorRecord]] とする。
  5. syncIteratorsyncIteratorRecord.[[Iterator]] とする。
  6. returnCompletion(GetMethod(syncIterator, "return")) とする。
  7. IfAbruptRejectPromise(return, promiseCapability)。
  8. もし returnundefined なら
    1. iteratorResultCreateIteratorResultObject(value, true) とする。
    2. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») を実行する。
    3. promiseCapability.[[Promise]] を返す。
  9. もし value が存在すれば
    1. resultCompletion(Call(return, syncIterator, « value »)) とする。
  10. それ以外
    1. resultCompletion(Call(return, syncIterator)) とする。
  11. IfAbruptRejectPromise(result, promiseCapability)。
  12. もし result が Object でなければ
    1. ! Call(promiseCapability.[[Reject]], undefined, « 新しく生成された TypeError オブジェクト ») を実行する。
    2. promiseCapability.[[Promise]] を返す。
  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, false) を返す。

27.1.6.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [ value ] )

Note
本仕様では value は常に提供されるが、%AsyncFromSyncIteratorPrototype%.return ( [ value ] ) との一貫性のため任意としている。
  1. Othis 値とする。
  2. 事前条件: O[[SyncIteratorRecord]] 内部スロットを持つ Object。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordO.[[SyncIteratorRecord]] とする。
  5. syncIteratorsyncIteratorRecord.[[Iterator]] とする。
  6. throwCompletion(GetMethod(syncIterator, "throw")) とする。
  7. IfAbruptRejectPromise(throw, promiseCapability)。
  8. もし throwundefined なら
    1. 注: syncIteratorthrow メソッドがない場合、capability を拒否する前にクリーンアップの機会を与えるため閉じる。
    2. closeCompletionNormalCompletion(empty) とする。
    3. resultCompletion(IteratorClose(syncIteratorRecord, closeCompletion)) とする。
    4. IfAbruptRejectPromise(result, promiseCapability)。
    5. 注: 次のステップはプロトコル違反(syncIteratorthrow メソッドがない)を示す TypeError を投げる。
    6. 注: syncIterator の close が例外を投げない場合、その結果は無視される(拒否された promise を生成しても)。
    7. ! Call(promiseCapability.[[Reject]], undefined, « 新しく生成された TypeError オブジェクト ») を実行する。
    8. promiseCapability.[[Promise]] を返す。
  9. もし value が存在すれば
    1. resultCompletion(Call(throw, syncIterator, « value »)) とする。
  10. それ以外
    1. resultCompletion(Call(throw, syncIterator)) とする。
  11. IfAbruptRejectPromise(result, promiseCapability)。
  12. もし result が Object でなければ
    1. ! Call(promiseCapability.[[Reject]], undefined, « 新しく生成された TypeError オブジェクト ») を実行する。
    2. promiseCapability.[[Promise]] を返す。
  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true) を返す。

27.1.6.3 Async-from-Sync Iterator インスタンスのプロパティ (Properties of Async-from-Sync Iterator Instances)

Async-from-Sync Iterator インスタンスは %AsyncFromSyncIteratorPrototype% 組込みオブジェクトからプロパティを継承する通常のオブジェクトである。これらインスタンスは Table 87 に列挙される内部スロットを持って初期化される。

Table 87: Async-from-Sync Iterator インスタンスの内部スロット (Internal Slots of Async-from-Sync Iterator Instances)
内部スロット (Internal Slot) 型 (Type) 説明 (Description)
[[SyncIteratorRecord]] Iterator Record 適応対象となる元の同期イテレータを表す (Represents the original synchronous iterator which is being adapted).

27.1.6.4 AsyncFromSyncIteratorContinuation ( result, promiseCapability, syncIteratorRecord, closeOnRejection )

The abstract operation AsyncFromSyncIteratorContinuation takes arguments result (an Object), promiseCapability (a PromiseCapability Record for an intrinsic %Promise%), syncIteratorRecord (an Iterator Record), and closeOnRejection (a Boolean) and returns Promise. It performs the following steps when called:

  1. 注: promiseCapability は組込み %Promise% から派生するので、以下の IfAbruptRejectPromise 使用に伴う promiseCapability.[[Reject]] への呼び出しは throw しないことが保証される。
  2. doneCompletion(IteratorComplete(result)) とする。
  3. IfAbruptRejectPromise(done, promiseCapability)。
  4. valueCompletion(IteratorValue(result)) とする。
  5. IfAbruptRejectPromise(value, promiseCapability)。
  6. valueWrapperCompletion(PromiseResolve(%Promise%, value)) とする。
  7. もし valueWrapperabrupt completion で、donefalse, かつ closeOnRejectiontrue なら
    1. valueWrapperCompletion(IteratorClose(syncIteratorRecord, valueWrapper)) とする。
  8. IfAbruptRejectPromise(valueWrapper, promiseCapability)。
  9. unwrap をパラメータ (v) を持ち done を捕捉し呼び出されると次を実行する新たな Abstract Closure とし、CreateIteratorResultObject(v, done) を返す。
  10. onFulfilledCreateBuiltinFunction(unwrap, 1, "", « ») とする。
  11. 注: onFulfilled は IteratorResult オブジェクトの "value" プロパティを処理する際、その値が promise であれば待機し、新たな「unwrapped」 IteratorResult オブジェクトとして再パッケージするために使用される。
  12. もし donetrue または closeOnRejectionfalse なら
    1. onRejectedundefined とする。
  13. それ以外
    1. closeIterator をパラメータ (error) を持ち syncIteratorRecord を捕捉し呼び出されると ? IteratorClose(syncIteratorRecord, ThrowCompletion(error)) を返す新たな Abstract Closure とする。
    2. onRejectedCreateBuiltinFunction(closeIterator, 1, "", « ») とする。
    3. 注: onRejected は IteratorResult オブジェクトが返す "value" プロパティが拒否された promise である場合に Iterator を close するために使用される。
  14. PerformPromiseThen(valueWrapper, onFulfilled, onRejected, promiseCapability) を実行する。
  15. promiseCapability.[[Promise]] を返す。

27.2 Promise オブジェクト

Promise は、延期された(かつ非同期である可能性のある)計算の最終的な結果に対するプレースホルダーとして使われるオブジェクトである。

任意の Promise は互いに排他的な 3 つの状態のいずれかにある: fulfilled(履行済)、rejected(拒否済)、pending(保留):

  • Promise p が fulfilled であるとは、p.then(f, r) が直ちに関数 f を呼び出す Job をキューに入れる場合をいう。
  • Promise p が rejected であるとは、p.then(f, r) が直ちに関数 r を呼び出す Job をキューに入れる場合をいう。
  • Promise が pending であるとは、それが fulfilled でも rejected でもない場合をいう。

Promise が settled(確定)であるとは、それが pending でない(すなわち fulfilled か rejected である)ことをいう。

Promise が resolved であるとは、それが settled であるか、他の Promise の状態に一致するよう「ロックイン」された場合をいう。resolved な Promise をさらに resolve あるいは reject しようとしても効果はない。Promise が resolved でない場合、それは unresolved である。unresolved な Promise は常に pending 状態である。resolved な Promise は pending / fulfilled / rejected のいずれにもなり得る。

27.2.1 Promise の抽象操作

27.2.1.1 PromiseCapability レコード

PromiseCapability Record は、ある Promise(または Promise 風オブジェクト)と、それを解決または拒否できる関数をカプセル化するために用いられる Record 値である。PromiseCapability Record は抽象操作 NewPromiseCapability によって生成される。

PromiseCapability Record は Table 88 に列挙するフィールドを持つ。

Table 88: PromiseCapability Record フィールド
フィールド名 意味
[[Promise]] Object Promise として使用可能なオブジェクト。
[[Resolve]] 関数オブジェクト 対象の Promise を解決するために使われる関数。
[[Reject]] 関数オブジェクト 対象の Promise を拒否するために使われる関数。

27.2.1.1.1 IfAbruptRejectPromise ( value, capability )

IfAbruptRejectPromise は PromiseCapability Record を用いるアルゴリズム手順列の短縮記法である。次の形式のアルゴリズム手順:

  1. IfAbruptRejectPromise(value, capability).

は次と同じ意味である:

  1. 事前条件: valueCompletion Record である。
  2. もし valueabrupt completion なら
    1. ? Call(capability.[[Reject]], undefined, « value.[[Value]] ») を実行する。
    2. capability.[[Promise]] を返す。
  3. それ以外
    1. value を ! value に設定する。

27.2.1.2 PromiseReaction レコード

PromiseReaction Record は、ある Promise が特定の値で解決または拒否されたときにどのように反応すべきかを格納するための Record 値である。PromiseReaction Record は抽象操作 PerformPromiseThen によって生成され、NewPromiseReactionJob が返す Abstract Closure によって使用される。

PromiseReaction Record は Table 89 に列挙するフィールドを持つ。

Table 89: PromiseReaction Record フィールド
フィールド名 意味
[[Capability]] PromiseCapability Record または undefined このレコードがリアクションハンドラを提供する Promise のケイパビリティ。
[[Type]] fulfill または reject [[Handler]]empty のときに、確定種別固有の挙動を可能にするために使用される。
[[Handler]] JobCallback Record または empty 入力値に適用され、その戻り値が派生 Promise の挙動を決定する関数。[[Handler]]empty の場合、[[Type]] の値に依存した関数が代わりに使用される。

27.2.1.3 CreateResolvingFunctions ( promise )

The abstract operation CreateResolvingFunctions takes argument promise (a Promise) and returns [[Resolve]] (関数オブジェクト) および [[Reject]] (関数オブジェクト) フィールドを持つ Record. It performs the following steps when called:

  1. alreadyResolvedRecord { [[Value]]: false } とする。
  2. stepsResolvePromise Resolve 関数 で定義されるアルゴリズム手順とする。
  3. lengthResolvePromise Resolve 関数 にある関数定義の省略不可パラメータ数とする。
  4. resolveCreateBuiltinFunction(stepsResolve, lengthResolve, "", « [[Promise]], [[AlreadyResolved]] ») とする。
  5. resolve.[[Promise]]promise を設定する。
  6. resolve.[[AlreadyResolved]]alreadyResolved を設定する。
  7. stepsRejectPromise Reject 関数 で定義されるアルゴリズム手順とする。
  8. lengthRejectPromise Reject 関数 にある関数定義の省略不可パラメータ数とする。
  9. rejectCreateBuiltinFunction(stepsReject, lengthReject, "", « [[Promise]], [[AlreadyResolved]] ») とする。
  10. reject.[[Promise]]promise を設定する。
  11. reject.[[AlreadyResolved]]alreadyResolved を設定する。
  12. Record { [[Resolve]]: resolve, [[Reject]]: reject } を返す。

27.2.1.3.1 Promise Reject 関数

Promise reject 関数は [[Promise]][[AlreadyResolved]] 内部スロットを持つ匿名組み込み関数である。

Promise reject 関数が引数 reason で呼ばれたとき、次を行う:

  1. F をアクティブな関数オブジェクトとする。
  2. 事前条件: F は値が Object である [[Promise]] 内部スロットを持つ。
  3. promiseF.[[Promise]] とする。
  4. alreadyResolvedF.[[AlreadyResolved]] とする。
  5. もし alreadyResolved.[[Value]]true なら undefined を返す。
  6. alreadyResolved.[[Value]]true に設定する。
  7. RejectPromise(promise, reason) を実行する。
  8. undefined を返す。

Promise reject 関数の "length" プロパティは 1𝔽 である。

27.2.1.3.2 Promise Resolve 関数

Promise resolve 関数は [[Promise]][[AlreadyResolved]] 内部スロットを持つ匿名組み込み関数である。

Promise resolve 関数が引数 resolution で呼ばれたとき、次を行う:

  1. F をアクティブな関数オブジェクトとする。
  2. 事前条件: F は値が Object である [[Promise]] 内部スロットを持つ。
  3. promiseF.[[Promise]] とする。
  4. alreadyResolvedF.[[AlreadyResolved]] とする。
  5. もし alreadyResolved.[[Value]]true なら undefined を返す。
  6. alreadyResolved.[[Value]]true に設定する。
  7. もし SameValue(resolution, promise) が true なら
    1. selfResolutionError を新たに生成された TypeError オブジェクトとする。
    2. RejectPromise(promise, selfResolutionError) を実行する。
    3. undefined を返す。
  8. もし resolution が Object でなければ
    1. FulfillPromise(promise, resolution) を実行する。
    2. undefined を返す。
  9. thenCompletion(Get(resolution, "then")) とする。
  10. もし thenabrupt completion なら
    1. RejectPromise(promise, then.[[Value]]) を実行する。
    2. undefined を返す。
  11. thenActionthen.[[Value]] とする。
  12. もし IsCallable(thenAction) が false なら
    1. FulfillPromise(promise, resolution) を実行する。
    2. undefined を返す。
  13. thenJobCallbackHostMakeJobCallback(thenAction) とする。
  14. jobNewPromiseResolveThenableJob(promise, resolution, thenJobCallback) とする。
  15. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) を実行する。
  16. undefined を返す。

Promise resolve 関数の "length" プロパティは 1𝔽 である。

27.2.1.4 FulfillPromise ( promise, value )

The abstract operation FulfillPromise takes arguments promise (a Promise) and value (an ECMAScript language value) and returns unused. It performs the following steps when called:

  1. 事前条件: promise.[[PromiseState]]pending である。
  2. reactionspromise.[[PromiseFulfillReactions]] とする。
  3. promise.[[PromiseResult]]value に設定する。
  4. promise.[[PromiseFulfillReactions]]undefined に設定する。
  5. promise.[[PromiseRejectReactions]]undefined に設定する。
  6. promise.[[PromiseState]]fulfilled に設定する。
  7. TriggerPromiseReactions(reactions, value) を実行する。
  8. unused を返す。

27.2.1.5 NewPromiseCapability ( C )

The abstract operation NewPromiseCapability takes argument C (an ECMAScript language value) and returns 正常完了で PromiseCapability Record を含むか、または throw completion. これは C を組み込み Promise コンストラクタと同様の方法でコンストラクタとして用いて Promise を生成し、その resolve / reject 関数を取得しようとする。得られた Promise と resolve / reject 関数によって新しい PromiseCapability Record を初期化する。 It performs the following steps when called:

  1. もし IsConstructor(C) が false なら TypeError 例外を投げる。
  2. 注: C は Promise コンストラクタのパラメータ規約(27.2.3.1 参照)をサポートするコンストラクタ関数であると仮定される。
  3. resolvingFunctionsRecord { [[Resolve]]: undefined, [[Reject]]: undefined } とする。
  4. executorClosure をパラメータ (resolve, reject) を持ち resolvingFunctions を捕捉し、呼び出されると次を行う新たな Abstract Closure とする:
    1. もし resolvingFunctions.[[Resolve]]undefined でなければ TypeError 例外を投げる。
    2. もし resolvingFunctions.[[Reject]]undefined でなければ TypeError 例外を投げる。
    3. resolvingFunctions.[[Resolve]]resolve に設定する。
    4. resolvingFunctions.[[Reject]]reject に設定する。
    5. NormalCompletion(undefined) を返す。
  5. executorCreateBuiltinFunction(executorClosure, 2, "", « ») とする。
  6. promise を ? Construct(C, « executor ») とする。
  7. もし IsCallable(resolvingFunctions.[[Resolve]]) が false なら TypeError 例外を投げる。
  8. もし IsCallable(resolvingFunctions.[[Reject]]) が false なら TypeError 例外を投げる。
  9. PromiseCapability Record { [[Promise]]: promise, [[Resolve]]: resolvingFunctions.[[Resolve]], [[Reject]]: resolvingFunctions.[[Reject]] } を返す。
Note

この抽象操作は、渡された executor 関数引数を Promise コンストラクタと同様に呼び出す任意のコンストラクタに対して総称的であるため、Promise のサブクラス化をサポートする。これは Promise コンストラクタの静的メソッドを任意のサブクラスへ一般化するために使用される。

27.2.1.6 IsPromise ( x )

The abstract operation IsPromise takes argument x (an ECMAScript language value) and returns Boolean. オブジェクト上の promise ブランドを確認する。 It performs the following steps when called:

  1. もし x が Object でなければ false を返す。
  2. もし x[[PromiseState]] 内部スロットを持たなければ false を返す。
  3. true を返す。

27.2.1.7 RejectPromise ( promise, reason )

The abstract operation RejectPromise takes arguments promise (a Promise) and reason (an ECMAScript language value) and returns unused. It performs the following steps when called:

  1. 事前条件: promise.[[PromiseState]]pending である。
  2. reactionspromise.[[PromiseRejectReactions]] とする。
  3. promise.[[PromiseResult]]reason に設定する。
  4. promise.[[PromiseFulfillReactions]]undefined に設定する。
  5. promise.[[PromiseRejectReactions]]undefined に設定する。
  6. promise.[[PromiseState]]rejected に設定する。
  7. もし promise.[[PromiseIsHandled]]false なら HostPromiseRejectionTracker(promise, "reject") を実行する。
  8. TriggerPromiseReactions(reactions, reason) を実行する。
  9. unused を返す。

27.2.1.8 TriggerPromiseReactions ( reactions, argument )

The abstract operation TriggerPromiseReactions takes arguments reactions (a List of PromiseReaction Records) and argument (an ECMAScript language value) and returns unused. reactions の各レコードに対して新たな Job をキューに入れる。各 JobPromiseReaction Record[[Type]][[Handler]] を処理し、[[Handler]]empty でなければ与えられた引数を渡して呼び出す。[[Handler]]empty の場合、挙動は [[Type]] によって決定される。 It performs the following steps when called:

  1. reactions の各要素 reaction について
    1. jobNewPromiseReactionJob(reaction, argument) とする。
    2. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) を実行する。
  2. unused を返す。

27.2.1.9 HostPromiseRejectionTracker ( promise, operation )

The host-defined abstract operation HostPromiseRejectionTracker takes arguments promise (a Promise) and operation ("reject" or "handle") and returns unused. ホスト環境が Promise の拒否を追跡できるようにする。

HostPromiseRejectionTracker のデフォルト実装は unused を返すことである。

Note 1

HostPromiseRejectionTracker は次の 2 つの状況で呼ばれる:

  • Promise がハンドラなしで拒否されたとき、operation 引数に "reject" を指定して呼ばれる。
  • 拒否済みの Promise に初めてハンドラが追加されたとき、operation 引数に "handle" を指定して呼ばれる。

典型的な実装は、未処理拒否を開発者に通知しようと試みる一方で、後からハンドラが追加されて以前の通知が無効化される場合にも注意深く通知する。

Note 2

operation"handle" の場合、実装はガベージコレクションを妨げる形で promise への参照を保持すべきではない。operation"reject" の場合には、拒否は稀でホットパスではないと期待されるため、実装は promise への参照を保持してもよい。

27.2.2 Promise の Job (Promise Jobs)

27.2.2.1 NewPromiseReactionJob ( reaction, argument )

The abstract operation NewPromiseReactionJob takes arguments reaction (a PromiseReaction Record) and argument (an ECMAScript language value) and returns フィールド [[Job]] (Job Abstract Closure) および [[Realm]] (Realm Record または null) を持つ Record. 受け取った値に適切なハンドラを適用し、その戻り値を用いてそのハンドラに関連付けられた派生 Promise を解決または拒否する新しい Job Abstract Closure を返す。 It performs the following steps when called:

  1. job を、引数なしで reactionargument を捕捉し、呼び出されると次を実行する新たな Job Abstract Closure とする:
    1. promiseCapabilityreaction.[[Capability]] とする。
    2. typereaction.[[Type]] とする。
    3. handlerreaction.[[Handler]] とする。
    4. もし handlerempty なら
      1. もし typefulfill なら
        1. handlerResultNormalCompletion(argument) とする。
      2. それ以外
        1. 事前条件: typereject である。
        2. handlerResultThrowCompletion(argument) とする。
    5. それ以外
      1. handlerResultCompletion(HostCallJobCallback(handler, undefined, « argument »)) とする。
    6. もし promiseCapabilityundefined なら
      1. 事前条件: handlerResultabrupt completion ではない。
      2. empty を返す。
    7. 事前条件: promiseCapabilityPromiseCapability Record である。
    8. もし handlerResultabrupt completion なら
      1. ? Call(promiseCapability.[[Reject]], undefined, « handlerResult.[[Value]] ») を返す。
    9. それ以外
      1. ? Call(promiseCapability.[[Resolve]], undefined, « handlerResult.[[Value]] ») を返す。
  2. handlerRealmnull とする。
  3. もし reaction.[[Handler]]empty でないなら
    1. getHandlerRealmResultCompletion(GetFunctionRealm(reaction.[[Handler]].[[Callback]])) とする。
    2. もし getHandlerRealmResultnormal completion なら handlerRealmgetHandlerRealmResult.[[Value]] に設定する。
    3. それ以外なら handlerRealm を現在の Realm Record に設定する。
    4. 注: handlerRealmnull になるのはハンドラが undefined の場合に限られる。ハンドラが取り消された Proxy で ECMAScript コードが実行されない場合、handlerRealm はエラーオブジェクト生成に用いられる。
  4. Record { [[Job]]: job, [[Realm]]: handlerRealm } を返す。

27.2.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )

The abstract operation NewPromiseResolveThenableJob takes arguments promiseToResolve (a Promise), thenable (an Object), and then (a JobCallback Record) and returns フィールド [[Job]] (Job Abstract Closure) および [[Realm]] (Realm Record) を持つ Record. It performs the following steps when called:

  1. job を、引数なしで promiseToResolve, thenable, then を捕捉し、呼び出されると次を実行する新たな Job Abstract Closure とする:
    1. resolvingFunctionsCreateResolvingFunctions(promiseToResolve) とする。
    2. thenCallResultCompletion(HostCallJobCallback(then, thenable, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »)) とする。
    3. もし thenCallResultabrupt completion なら
      1. ? Call(resolvingFunctions.[[Reject]], undefined, « thenCallResult.[[Value]] ») を返す。
    4. thenCallResult を返す。
  2. getThenRealmResultCompletion(GetFunctionRealm(then.[[Callback]])) とする。
  3. もし getThenRealmResultnormal completion なら thenRealmgetThenRealmResult.[[Value]] とする。
  4. それ以外なら thenRealm を現在の Realm Record とする。
  5. 注: thenRealmnull になることはない。then.[[Callback]] が取り消された Proxy でコードが実行されない場合、thenRealm はエラーオブジェクト生成に用いられる。
  6. Record { [[Job]]: job, [[Realm]]: thenRealm } を返す。
Note

この Job は与えられた thenable とその then メソッドを利用して指定された Promise を解決する。この過程は、then メソッドの評価が周囲コードの評価完了後に行われることを保証するため、Job として実行されなければならない。

27.2.3 Promise コンストラクタ (The Promise Constructor)

Promise コンストラクタ:

  • %Promise% である。
  • グローバルオブジェクト"Promise" プロパティの初期値である。
  • コンストラクタとして呼び出されたとき新しい Promise を生成し初期化する。
  • 関数として呼び出すことは意図されておらず、そのように呼び出された場合は例外を投げる。
  • クラス定義の extends 句における値として使用できる。指定された Promise の挙動を継承することを意図するサブクラスのコンストラクタは、Promise および Promise.prototype の組み込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、Promise コンストラクタへの super 呼び出しを含めなければならない。

27.2.3.1 Promise ( executor )

この関数は呼び出されると次の手順を実行する:

  1. もし NewTarget が undefined なら TypeError 例外を投げる。
  2. もし IsCallable(executor) が false なら TypeError 例外を投げる。
  3. promise を ? OrdinaryCreateFromConstructor(NewTarget, "%Promise.prototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] ») とする。
  4. promise.[[PromiseState]]pending に設定する。
  5. promise.[[PromiseResult]]empty に設定する。
  6. promise.[[PromiseFulfillReactions]] を新しい空 List に設定する。
  7. promise.[[PromiseRejectReactions]] を新しい空 List に設定する。
  8. promise.[[PromiseIsHandled]]false に設定する。
  9. resolvingFunctionsCreateResolvingFunctions(promise) とする。
  10. completionCompletion(Call(executor, undefined, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »)) とする。
  11. もし completionabrupt completion なら
    1. ? Call(resolvingFunctions.[[Reject]], undefined, « completion.[[Value]] ») を実行する。
  12. promise を返す。
Note

executor 引数は関数オブジェクトでなければならない。これはこの Promise が表す、遅延される可能性のある処理の開始と完了報告のために呼び出される。executor は 2 つの引数 resolvereject で呼び出される。これらは遅延計算の最終的な完了または失敗を報告するために executor が使用できる関数である。executor から復帰することは遅延処理が完了したことを意味せず、遅延処理を最終的に実行する要求が受理されたことのみを意味する。

executor に渡される resolve 関数は 1 つの引数を受け取る。executor コードは最終的に resolve を呼び、関連する Promise を解決したい意図を示すことができる。resolve に渡される引数は遅延処理の最終的な値を表し、実際の履行値か、履行された場合にその値を与える別の Promise のいずれかである。

executor に渡される reject 関数は 1 つの引数を受け取る。executor コードは最終的に reject を呼び、関連する Promise が拒否され決して履行されないことを示すことができる。reject に渡される引数は Promise の拒否理由として用いられ、典型的には Error オブジェクトである。

Promise コンストラクタexecutor に渡す resolve / reject 関数には、関連する Promise を実際に解決/拒否する能力がある。サブクラスは異なるコンストラクタ挙動を持ち、resolve と reject にカスタマイズされた値を渡す場合がある。

27.2.4 Promise コンストラクタのプロパティ (Properties of the Promise Constructor)

Promise コンストラクタ:

  • [[Prototype]] 内部スロットの値は %Function.prototype% である。
  • 次のプロパティを持つ:

27.2.4.1 Promise.all ( iterable )

この関数は、渡された Promise 群について、その履行値の配列で履行される新しい Promise を返す。あるいは最初に拒否された Promise の理由で拒否される。実行中、渡された iterable の各要素を Promise に解決する。

  1. Cthis 値とする。
  2. promiseCapability を ? NewPromiseCapability(C) とする。
  3. promiseResolveCompletion(GetPromiseResolve(C)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseAll(iteratorRecord, C, promiseCapability, promiseResolve)) とする。
  8. もし resultabrupt completion なら
    1. もし iteratorRecord.[[Done]]false なら resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note

この関数は this 値が Promise コンストラクタのパラメータ規約をサポートするコンストラクタ関数であることを要する。

27.2.4.1.1 GetPromiseResolve ( promiseConstructor )

The abstract operation GetPromiseResolve takes argument promiseConstructor (a constructor) and returns 正常完了で関数オブジェクトを含むか、または throw completion. It performs the following steps when called:

  1. promiseResolve を ? Get(promiseConstructor, "resolve") とする。
  2. もし IsCallable(promiseResolve) が false なら TypeError 例外を投げる。
  3. promiseResolve を返す。

27.2.4.1.2 PerformPromiseAll ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseAll takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion. It performs the following steps when called:

  1. values を新しい空 List とする。
  2. remainingElementsCountRecord { [[Value]]: 1 } とする。
  3. index を 0 とする。
  4. 繰り返す,
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. もし nextdone なら
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      2. もし remainingElementsCount.[[Value]] = 0 なら
        1. valuesArrayCreateArrayFromList(values) とする。
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を実行する。
      3. resultCapability.[[Promise]] を返す。
    3. undefinedvalues に追加する。
    4. nextPromise を ? Call(promiseResolve, constructor, « next ») とする。
    5. stepsPromise.all Resolve 要素関数 (Promise.all Resolve Element Functions) で定義されるアルゴリズム手順とする。
    6. lengthPromise.all Resolve 要素関数 (Promise.all Resolve Element Functions) にある関数定義の省略不可パラメータ数とする。
    7. onFulfilledCreateBuiltinFunction(steps, length, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») とする。
    8. onFulfilled.[[AlreadyCalled]]false に設定する。
    9. onFulfilled.[[Index]]index に設定する。
    10. onFulfilled.[[Values]]values に設定する。
    11. onFulfilled.[[Capability]]resultCapability に設定する。
    12. onFulfilled.[[RemainingElements]]remainingElementsCount に設定する。
    13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 に設定する。
    14. ? Invoke(nextPromise, "then", « onFulfilled, resultCapability.[[Reject]] ») を実行する。
    15. indexindex + 1 に設定する。

27.2.4.1.3 Promise.all Resolve 要素関数 (Promise.all Resolve Element Functions)

Promise.all Resolve 要素関数は特定の Promise.all の要素を解決するために使われる匿名組み込み関数である。各 Promise.all Resolve 要素関数は [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 内部スロットを持つ。

Promise.all Resolve 要素関数が引数 x で呼ばれたとき、次を行う:

  1. F をアクティブな関数オブジェクトとする。
  2. もし F.[[AlreadyCalled]]true なら undefined を返す。
  3. F.[[AlreadyCalled]]true に設定する。
  4. indexF.[[Index]] とする。
  5. valuesF.[[Values]] とする。
  6. promiseCapabilityF.[[Capability]] とする。
  7. remainingElementsCountF.[[RemainingElements]] とする。
  8. values[index] を x に設定する。
  9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
  10. もし remainingElementsCount.[[Value]] = 0 なら
    1. valuesArrayCreateArrayFromList(values) とする。
    2. ? Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») を返す。
  11. undefined を返す。

Promise.all Resolve 要素関数の "length" プロパティは 1𝔽 である。

27.2.4.2 Promise.allSettled ( iterable )

この関数は、元のすべての Promise が確定(fulfilled か rejected)した後に、Promise 状態スナップショットの配列で履行される Promise を返す。実行中、渡された iterable の各要素を Promise に解決する。

  1. Cthis 値とする。
  2. promiseCapability を ? NewPromiseCapability(C) とする。
  3. promiseResolveCompletion(GetPromiseResolve(C)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseAllSettled(iteratorRecord, C, promiseCapability, promiseResolve)) とする。
  8. もし resultabrupt completion なら
    1. もし iteratorRecord.[[Done]]false なら resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note

この関数は this 値が Promise コンストラクタのパラメータ規約をサポートするコンストラクタ関数であることを要する。

27.2.4.2.1 PerformPromiseAllSettled ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseAllSettled takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion. It performs the following steps when called:

  1. values を新しい空 List とする。
  2. remainingElementsCountRecord { [[Value]]: 1 } とする。
  3. index を 0 とする。
  4. 繰り返す,
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. もし nextdone なら
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      2. もし remainingElementsCount.[[Value]] = 0 なら
        1. valuesArrayCreateArrayFromList(values) とする。
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を実行する。
      3. resultCapability.[[Promise]] を返す。
    3. undefinedvalues に追加する。
    4. nextPromise を ? Call(promiseResolve, constructor, « next ») とする。
    5. stepsFulfilledPromise.allSettled Resolve 要素関数 (Promise.allSettled Resolve Element Functions) で定義されるアルゴリズム手順とする。
    6. lengthFulfilledPromise.allSettled Resolve 要素関数 (Promise.allSettled Resolve Element Functions) にある関数定義の省略不可パラメータ数とする。
    7. onFulfilledCreateBuiltinFunction(stepsFulfilled, lengthFulfilled, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») とする。
    8. alreadyCalledRecord { [[Value]]: false } とする。
    9. onFulfilled.[[AlreadyCalled]]alreadyCalled に設定する。
    10. onFulfilled.[[Index]]index に設定する。
    11. onFulfilled.[[Values]]values に設定する。
    12. onFulfilled.[[Capability]]resultCapability に設定する。
    13. onFulfilled.[[RemainingElements]]remainingElementsCount に設定する。
    14. stepsRejectedPromise.allSettled Reject 要素関数 (Promise.allSettled Reject Element Functions) で定義されるアルゴリズム手順とする。
    15. lengthRejectedPromise.allSettled Reject 要素関数 (Promise.allSettled Reject Element Functions) にある関数定義の省略不可パラメータ数とする。
    16. onRejectedCreateBuiltinFunction(stepsRejected, lengthRejected, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») とする。
    17. onRejected.[[AlreadyCalled]]alreadyCalled に設定する。
    18. onRejected.[[Index]]index に設定する。
    19. onRejected.[[Values]]values に設定する。
    20. onRejected.[[Capability]]resultCapability に設定する。
    21. onRejected.[[RemainingElements]]remainingElementsCount に設定する。
    22. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 に設定する。
    23. ? Invoke(nextPromise, "then", « onFulfilled, onRejected ») を実行する。
    24. indexindex + 1 に設定する。

27.2.4.2.2 Promise.allSettled Resolve 要素関数 (Promise.allSettled Resolve Element Functions)

Promise.allSettled Resolve 要素関数は特定の Promise.allSettled の要素を解決するために使われる匿名組み込み関数である。各 Promise.allSettled Resolve 要素関数は [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 内部スロットを持つ。

Promise.allSettled Resolve 要素関数が引数 x で呼ばれたとき、次を行う:

  1. F をアクティブな関数オブジェクトとする。
  2. alreadyCalledF.[[AlreadyCalled]] とする。
  3. もし alreadyCalled.[[Value]]true なら undefined を返す。
  4. alreadyCalled.[[Value]]true に設定する。
  5. indexF.[[Index]] とする。
  6. valuesF.[[Values]] とする。
  7. promiseCapabilityF.[[Capability]] とする。
  8. remainingElementsCountF.[[RemainingElements]] とする。
  9. objOrdinaryObjectCreate(%Object.prototype%) とする。
  10. CreateDataPropertyOrThrow(obj, "status", "fulfilled") を実行する。
  11. CreateDataPropertyOrThrow(obj, "value", x) を実行する。
  12. values[index] を obj に設定する。
  13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
  14. もし remainingElementsCount.[[Value]] = 0 なら
    1. valuesArrayCreateArrayFromList(values) とする。
    2. ? Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») を返す。
  15. undefined を返す。

Promise.allSettled Resolve 要素関数の "length" プロパティは 1𝔽 である。

27.2.4.2.3 Promise.allSettled Reject 要素関数 (Promise.allSettled Reject Element Functions)

Promise.allSettled Reject 要素関数は特定の Promise.allSettled の要素を拒否させるために使われる匿名組み込み関数である。各 Promise.allSettled Reject 要素関数は [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 内部スロットを持つ。

Promise.allSettled Reject 要素関数が引数 x で呼ばれたとき、次を行う:

  1. F をアクティブな関数オブジェクトとする。
  2. alreadyCalledF.[[AlreadyCalled]] とする。
  3. もし alreadyCalled.[[Value]]true なら undefined を返す。
  4. alreadyCalled.[[Value]]true に設定する。
  5. indexF.[[Index]] とする。
  6. valuesF.[[Values]] とする。
  7. promiseCapabilityF.[[Capability]] とする。
  8. remainingElementsCountF.[[RemainingElements]] とする。
  9. objOrdinaryObjectCreate(%Object.prototype%) とする。
  10. CreateDataPropertyOrThrow(obj, "status", "rejected") を実行する。
  11. CreateDataPropertyOrThrow(obj, "reason", x) を実行する。
  12. values[index] を obj に設定する。
  13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
  14. もし remainingElementsCount.[[Value]] = 0 なら
    1. valuesArrayCreateArrayFromList(values) とする。
    2. ? Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») を返す。
  15. undefined を返す。

Promise.allSettled Reject 要素関数の "length" プロパティは 1𝔽 である。

27.2.4.3 Promise.any ( iterable )

この関数は、最初に fulfilled になった渡された Promise の値で履行されるか、すべてが拒否された場合には拒否理由を保持する AggregateError で拒否される Promise を返す。実行中、渡された iterable の各要素を Promise に解決する。

  1. Cthis 値とする。
  2. promiseCapability を ? NewPromiseCapability(C) とする。
  3. promiseResolveCompletion(GetPromiseResolve(C)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseAny(iteratorRecord, C, promiseCapability, promiseResolve)) とする。
  8. もし resultabrupt completion なら
    1. もし iteratorRecord.[[Done]]false なら resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note

この関数は this 値が Promise コンストラクタのパラメータ規約をサポートするコンストラクタ関数であることを要する。

27.2.4.3.1 PerformPromiseAny ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseAny takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion. It performs the following steps when called:

  1. errors を新しい空 List とする。
  2. remainingElementsCountRecord { [[Value]]: 1 } とする。
  3. index を 0 とする。
  4. 繰り返す,
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. もし nextdone なら
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      2. もし remainingElementsCount.[[Value]] = 0 なら
        1. error を新しく生成された AggregateError オブジェクトとする。
        2. DefinePropertyOrThrow(error, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }) を実行する。
        3. Return ThrowCompletion(error)。
      3. resultCapability.[[Promise]] を返す。
    3. undefinederrors に追加する。
    4. nextPromise を ? Call(promiseResolve, constructor, « next ») とする。
    5. stepsRejectedPromise.any Reject 要素関数 (Promise.any Reject Element Functions) で定義されるアルゴリズム手順とする。
    6. lengthRejectedPromise.any Reject 要素関数 (Promise.any Reject Element Functions) にある関数定義の省略不可パラメータ数とする。
    7. onRejectedCreateBuiltinFunction(stepsRejected, lengthRejected, "", « [[AlreadyCalled]], [[Index]], [[Errors]], [[Capability]], [[RemainingElements]] ») とする。
    8. onRejected.[[AlreadyCalled]]false に設定する。
    9. onRejected.[[Index]]index に設定する。
    10. onRejected.[[Errors]]errors に設定する。
    11. onRejected.[[Capability]]resultCapability に設定する。
    12. onRejected.[[RemainingElements]]remainingElementsCount に設定する。
    13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 に設定する。
    14. ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], onRejected ») を実行する。
    15. indexindex + 1 に設定する。

27.2.4.3.2 Promise.any Reject 要素関数 (Promise.any Reject Element Functions)

Promise.any Reject 要素関数は特定の Promise.any 要素を拒否するために使われる匿名組み込み関数である。各 Promise.any Reject 要素関数は [[Index]], [[Errors]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 内部スロットを持つ。

Promise.any Reject 要素関数が引数 x で呼ばれたとき、次を行う:

  1. F をアクティブな関数オブジェクトとする。
  2. もし F.[[AlreadyCalled]]true なら undefined を返す。
  3. F.[[AlreadyCalled]]true に設定する。
  4. indexF.[[Index]] とする。
  5. errorsF.[[Errors]] とする。
  6. promiseCapabilityF.[[Capability]] とする。
  7. remainingElementsCountF.[[RemainingElements]] とする。
  8. errors[index] を x に設定する。
  9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
  10. もし remainingElementsCount.[[Value]] = 0 なら
    1. error を新しく生成された AggregateError オブジェクトとする。
    2. DefinePropertyOrThrow(error, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }) を実行する。
    3. ? Call(promiseCapability.[[Reject]], undefined, « error ») を返す。
  11. undefined を返す。

Promise.any Reject 要素関数の "length" プロパティは 1𝔽 である。

27.2.4.4 Promise.prototype

Promise.prototype の初期値は Promise プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

27.2.4.5 Promise.race ( iterable )

この関数は、渡された Promise 群のうち最初に確定したものと同じ方法で確定する新しい Promise を返す。実行中、渡された iterable の各要素を Promise に解決する。

  1. Cthis 値とする。
  2. promiseCapability を ? NewPromiseCapability(C) とする。
  3. promiseResolveCompletion(GetPromiseResolve(C)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseRace(iteratorRecord, C, promiseCapability, promiseResolve)) とする。
  8. もし resultabrupt completion なら
    1. もし iteratorRecord.[[Done]]false なら resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note 1

iterable 引数が値を一切生成しないか、生成された Promise がいずれも確定しない場合、このメソッドが返す pending 状態の Promise は確定しないままである。

Note 2

この関数は this 値が Promise コンストラクタのパラメータ規約をサポートするコンストラクタ関数であり、かつ this 値が resolve メソッドを提供することを期待する。

27.2.4.5.1 PerformPromiseRace ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseRace takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion. It performs the following steps when called:

  1. 繰り返す,
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. もし nextdone なら
      1. resultCapability.[[Promise]] を返す。
    3. nextPromise を ? Call(promiseResolve, constructor, « next ») とする。
    4. ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], resultCapability.[[Reject]] ») を実行する。

27.2.4.6 Promise.reject ( r )

この関数は渡された引数で拒否された新しい Promise を返す。

  1. Cthis 値とする。
  2. promiseCapability を ? NewPromiseCapability(C) とする。
  3. ? Call(promiseCapability.[[Reject]], undefined, « r ») を実行する。
  4. promiseCapability.[[Promise]] を返す。
Note

この関数は this 値が Promise コンストラクタのパラメータ規約をサポートするコンストラクタ関数であることを期待する。

27.2.4.7 Promise.resolve ( x )

この関数は、引数がこのコンストラクタによって生成された Promise であればその引数自体を、そうでなければ引数で解決された新しい Promise を返す。

  1. Cthis 値とする。
  2. もし C が Object でなければ TypeError 例外を投げる。
  3. PromiseResolve(C, x) を返す。
Note

この関数は this 値が Promise コンストラクタのパラメータ規約をサポートするコンストラクタ関数であることを期待する。

27.2.4.7.1 PromiseResolve ( C, x )

The abstract operation PromiseResolve takes arguments C (an Object) and x (an ECMAScript language value) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion. x で解決された新しい Promise を返す。 It performs the following steps when called:

  1. もし IsPromise(x) が true なら
    1. xConstructor を ? Get(x, "constructor") とする。
    2. もし SameValue(xConstructor, C) が true なら x を返す。
  2. promiseCapability を ? NewPromiseCapability(C) とする。
  3. ? Call(promiseCapability.[[Resolve]], undefined, « x ») を実行する。
  4. promiseCapability.[[Promise]] を返す。

27.2.4.8 Promise.try ( callback, ...args )

この関数は呼び出されたとき次の手順を実行する:

  1. Cthis 値とする。
  2. もし C が Object でなければ TypeError 例外を投げる。
  3. promiseCapability を ? NewPromiseCapability(C) とする。
  4. statusCompletion(Call(callback, undefined, args)) とする。
  5. もし statusabrupt completion なら
    1. ? Call(promiseCapability.[[Reject]], undefined, « status.[[Value]] ») を実行する。
  6. それ以外
    1. ? Call(promiseCapability.[[Resolve]], undefined, « status.[[Value]] ») を実行する。
  7. promiseCapability.[[Promise]] を返す。
Note

この関数は this 値が Promise コンストラクタのパラメータ規約をサポートするコンストラクタ関数であることを期待する。

27.2.4.9 Promise.withResolvers ( )

この関数は 3 つのプロパティ(新しい Promise とそれに結び付けられた resolve / reject 関数)を持つオブジェクトを返す。

  1. Cthis 値とする。
  2. promiseCapability を ? NewPromiseCapability(C) とする。
  3. objOrdinaryObjectCreate(%Object.prototype%) とする。
  4. CreateDataPropertyOrThrow(obj, "promise", promiseCapability.[[Promise]]) を実行する。
  5. CreateDataPropertyOrThrow(obj, "resolve", promiseCapability.[[Resolve]]) を実行する。
  6. CreateDataPropertyOrThrow(obj, "reject", promiseCapability.[[Reject]]) を実行する。
  7. obj を返す。

27.2.4.10 get Promise [ %Symbol.species% ]

Promise[%Symbol.species%] は set アクセサ関数が undefined であるアクセサプロパティであり、get アクセサ関数は呼び出されると次の手順を実行する:

  1. this 値を返す。

この関数の "name" プロパティの値は "get [Symbol.species]" である。

Note

Promise プロトタイプメソッドは通常、派生オブジェクト生成に this 値のコンストラクタを使用する。しかしサブクラスコンストラクタはその %Symbol.species% プロパティを再定義することで既定の挙動を上書きできる。

27.2.5 Promise プロトタイプオブジェクトのプロパティ

Promise プロトタイプオブジェクト は次の通り:

  • %Promise.prototype% である。
  • [[Prototype]] 内部スロットの値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[PromiseState]] 内部スロットや Promise インスタンスの他の内部スロットを持たない。

27.2.5.1 Promise.prototype.catch ( onRejected )

このメソッドは呼び出されると次の手順を実行する:

  1. promisethis 値とする。
  2. Return ? Invoke(promise, "then", « undefined, onRejected »).

27.2.5.2 Promise.prototype.constructor

Promise.prototype.constructor の初期値は %Promise% である。

27.2.5.3 Promise.prototype.finally ( onFinally )

このメソッドは呼び出されると次の手順を実行する:

  1. promisethis 値とする。
  2. もし promise が Object でなければ TypeError 例外を投げる。
  3. C を ? SpeciesConstructor(promise, %Promise%) とする。
  4. 事前条件: IsConstructor(C) は true である。
  5. もし IsCallable(onFinally) が false なら
    1. thenFinallyonFinally とする。
    2. catchFinallyonFinally とする。
  6. それ以外
    1. thenFinallyClosure をパラメータ (value) を取り onFinallyC を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
      1. result を ? Call(onFinally, undefined) とする。
      2. p を ? PromiseResolve(C, result) とする。
      3. returnValue を引数なしで value を捕捉し呼び出されると次を行う新たな Abstract Closure とし、NormalCompletion(value) を返す。
      4. valueThunkCreateBuiltinFunction(returnValue, 0, "", « ») とする。
      5. Return ? Invoke(p, "then", « valueThunk »).
    2. thenFinallyCreateBuiltinFunction(thenFinallyClosure, 1, "", « ») とする。
    3. catchFinallyClosure をパラメータ (reason) を取り onFinallyC を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
      1. result を ? Call(onFinally, undefined) とする。
      2. p を ? PromiseResolve(C, result) とする。
      3. throwReason を引数なしで reason を捕捉し呼び出されると次を行う新たな Abstract Closure とし、Return ThrowCompletion(reason)。
      4. throwerCreateBuiltinFunction(throwReason, 0, "", « ») とする。
      5. Return ? Invoke(p, "then", « thrower »).
    4. catchFinallyCreateBuiltinFunction(catchFinallyClosure, 1, "", « ») とする。
  7. Return ? Invoke(promise, "then", « thenFinally, catchFinally »).

27.2.5.4 Promise.prototype.then ( onFulfilled, onRejected )

このメソッドは呼び出されると次の手順を実行する:

  1. promisethis 値とする。
  2. もし IsPromise(promise) が false なら TypeError 例外を投げる。
  3. C を ? SpeciesConstructor(promise, %Promise%) とする。
  4. resultCapability を ? NewPromiseCapability(C) とする。
  5. Return PerformPromiseThen(promise, onFulfilled, onRejected, resultCapability)。

27.2.5.4.1 PerformPromiseThen ( promise, onFulfilled, onRejected [ , resultCapability ] )

The abstract operation PerformPromiseThen takes arguments promise (a Promise), onFulfilled (an ECMAScript language value), and onRejected (an ECMAScript language value) and optional argument resultCapability (a PromiseCapability Record) and returns an ECMAScript language value. promise に対し onFulfilledonRejected を確定時アクションとして “then” 操作を行う。resultCapability が渡された場合、その Promise を更新して結果を格納する。渡されない場合、結果を不要とする仕様内部操作による呼び出しである。 It performs the following steps when called:

  1. 事前条件: IsPromise(promise) は true である。
  2. もし resultCapability が存在しなければ
    1. resultCapabilityundefined に設定する。
  3. もし IsCallable(onFulfilled) が false なら
    1. onFulfilledJobCallbackempty とする。
  4. それ以外
    1. onFulfilledJobCallbackHostMakeJobCallback(onFulfilled) とする。
  5. もし IsCallable(onRejected) が false なら
    1. onRejectedJobCallbackempty とする。
  6. それ以外
    1. onRejectedJobCallbackHostMakeJobCallback(onRejected) とする。
  7. fulfillReactionPromiseReaction Record { [[Capability]]: resultCapability, [[Type]]: fulfill, [[Handler]]: onFulfilledJobCallback } とする。
  8. rejectReactionPromiseReaction Record { [[Capability]]: resultCapability, [[Type]]: reject, [[Handler]]: onRejectedJobCallback } とする。
  9. もし promise.[[PromiseState]]pending なら
    1. fulfillReactionpromise.[[PromiseFulfillReactions]] に追加する。
    2. rejectReactionpromise.[[PromiseRejectReactions]] に追加する。
  10. それ以外で promise.[[PromiseState]]fulfilled なら
    1. valuepromise.[[PromiseResult]] とする。
    2. fulfillJobNewPromiseReactionJob(fulfillReaction, value) とする。
    3. HostEnqueuePromiseJob(fulfillJob.[[Job]], fulfillJob.[[Realm]]) を実行する。
  11. それ以外
    1. 事前条件: promise.[[PromiseState]]rejected である。
    2. reasonpromise.[[PromiseResult]] とする。
    3. もし promise.[[PromiseIsHandled]]false なら HostPromiseRejectionTracker(promise, "handle") を実行する。
    4. rejectJobNewPromiseReactionJob(rejectReaction, reason) とする。
    5. HostEnqueuePromiseJob(rejectJob.[[Job]], rejectJob.[[Realm]]) を実行する。
  12. promise.[[PromiseIsHandled]]true に設定する。
  13. もし resultCapabilityundefined なら
    1. undefined を返す。
  14. それ以外
    1. resultCapability.[[Promise]] を返す。

27.2.5.5 Promise.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "Promise" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.2.6 Promise インスタンスのプロパティ

Promise インスタンスは(組み込み %Promise.prototype% である)Promise プロトタイプオブジェクトからプロパティを継承する通常のオブジェクトである。Promise インスタンスは Table 90 に記述される内部スロットを持って初期化される。

Table 90: Promise インスタンスの内部スロット
Internal Slot Type Description
[[PromiseState]] pending, fulfilled, or rejected その then メソッドへの呼び出しに対し Promise がどのように反応するかを制御する。
[[PromiseResult]] ECMAScript 言語値または empty Promise が履行または拒否された値(存在する場合)。empty[[PromiseState]]pending の場合に限り設定される。
[[PromiseFulfillReactions]] PromiseReaction RecordList pending から fulfilled への遷移時(または遷移した場合)に処理されるレコード。
[[PromiseRejectReactions]] PromiseReaction RecordList pending から rejected への遷移時(または遷移した場合)に処理されるレコード。
[[PromiseIsHandled]] Boolean 一度でも履行または拒否ハンドラを持ったことがあるかを示す;未処理拒否の追跡に使用される。

27.3 GeneratorFunction オブジェクト

GeneratorFunction は、通常 GeneratorDeclarationGeneratorExpressionGeneratorMethod を評価することで生成される関数である。また %GeneratorFunction% 組込みを呼び出すことでも生成され得る。

Figure 6 (Informative): Generator オブジェクトの関係
無数のボックスと矢印。

27.3.1 GeneratorFunction コンストラクタ

GeneratorFunction コンストラクタ:

  • %GeneratorFunction% である。
  • Function のサブクラスである。
  • コンストラクタとしてではなく関数として呼び出されたとき、新しい GeneratorFunction を生成し初期化する。したがって関数呼び出し GeneratorFunction (…) は同じ引数でのオブジェクト生成式 new GeneratorFunction (…) と同等である。
  • クラス定義の extends 句の値として使用できる。指定された GeneratorFunction の挙動を継承することを意図するサブクラスのコンストラクタは、組込み GeneratorFunction の挙動に必要な内部スロットを持つサブクラスインスタンスを生成・初期化するため、GeneratorFunction コンストラクタへの super 呼び出しを含めなければならない。ジェネレータ関数オブジェクトを定義する全ての ECMAScript 構文形式は GeneratorFunction の直接インスタンスを生成する。GeneratorFunction のサブクラスインスタンスを構文的に生成する手段は存在しない。

27.3.1.1 GeneratorFunction ( ...parameterArgs, bodyArg )

最後の引数(もしあれば)がジェネレータ関数の本体(実行コード)を指定し、それ以前の引数が仮引数を指定する。

この関数は呼び出されると次の手順を実行する:

  1. C をアクティブな関数オブジェクトとする。
  2. もし bodyArg が存在しなければ bodyArg を空文字列に設定する。
  3. CreateDynamicFunction(C, NewTarget, generator, parameterArgs, bodyArg) を返す。
Note

20.2.1.1 の注を参照。

27.3.2 GeneratorFunction コンストラクタのプロパティ

GeneratorFunction コンストラクタ:

  • Function コンストラクタを継承する標準組込み関数オブジェクトである。
  • [[Prototype]] 内部スロットの値は %Function% である。
  • "length" プロパティを持ち、その値は 1𝔽 である。
  • "name" プロパティを持ち、その値は "GeneratorFunction" である。
  • 次のプロパティを持つ:

27.3.2.1 GeneratorFunction.prototype

GeneratorFunction.prototype の初期値は GeneratorFunction プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

27.3.3 GeneratorFunction プロトタイプオブジェクトのプロパティ

GeneratorFunction プロトタイプオブジェクト:

  • %GeneratorFunction.prototype% である (Figure 6 を参照)。
  • 通常のオブジェクトである。
  • 関数オブジェクトではなく、Table 28 または Table 91 に列挙される [[ECMAScriptCode]] 内部スロットやその他の内部スロットを持たない。
  • [[Prototype]] 内部スロットの値は %Function.prototype% である。

27.3.3.1 GeneratorFunction.prototype.constructor

GeneratorFunction.prototype.constructor の初期値は %GeneratorFunction% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.3.3.2 GeneratorFunction.prototype.prototype

GeneratorFunction.prototype.prototype の初期値は %GeneratorPrototype% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.3.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "GeneratorFunction" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.3.4 GeneratorFunction インスタンス

すべての GeneratorFunction インスタンスは ECMAScript 関数オブジェクトであり、Table 28 に列挙される内部スロットを持つ。そのすべてのインスタンスにおける [[IsClassConstructor]] 内部スロットの値は false である。

各 GeneratorFunction インスタンスは次の独自プロパティを持つ:

27.3.4.1 length

20.2.4.1 で与えられる Function インスタンスの "length" プロパティの仕様は GeneratorFunction インスタンスにも適用される。

27.3.4.2 name

20.2.4.2 で与えられる Function インスタンスの "name" プロパティの仕様は GeneratorFunction インスタンスにも適用される。

27.3.4.3 prototype

GeneratorFunction インスタンスが生成されるたびに別の通常オブジェクトも生成され、そのジェネレータ関数の "prototype" プロパティの初期値となる。prototype プロパティの値は、そのジェネレータ関数オブジェクト[[Call]] を用いて呼び出されたとき、新たに生成される Generator の [[Prototype]] 内部スロットを初期化するために用いられる。

このプロパティは属性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

Note

Function インスタンスと異なり、GeneratorFunction の "prototype" プロパティの値であるオブジェクトは、その値がその GeneratorFunction インスタンスである "constructor" プロパティを持たない。

27.4 AsyncGeneratorFunction オブジェクト

AsyncGeneratorFunction は、通常 AsyncGeneratorDeclaration, AsyncGeneratorExpression, AsyncGeneratorMethod の構文生成物を評価することで生成される関数である。また %AsyncGeneratorFunction% 組込みを呼び出すことでも生成され得る。

27.4.1 AsyncGeneratorFunction コンストラクタ

AsyncGeneratorFunction コンストラクタ:

  • %AsyncGeneratorFunction% である。
  • Function のサブクラスである。
  • コンストラクタとしてではなく関数として呼び出されたとき、新しい AsyncGeneratorFunction を生成し初期化する。したがって関数呼び出し AsyncGeneratorFunction (...) は同じ引数でのオブジェクト生成式 new AsyncGeneratorFunction (...) と同等である。
  • クラス定義の extends 句の値として使用できる。指定された AsyncGeneratorFunction の挙動を継承することを意図するサブクラスのコンストラクタは、組込み AsyncGeneratorFunction の挙動に必要な内部スロットを持つサブクラスインスタンスを生成・初期化するため、AsyncGeneratorFunction コンストラクタへの super 呼び出しを含めなければならない。非同期ジェネレータ関数オブジェクトを定義する全ての ECMAScript 構文形式は AsyncGeneratorFunction の直接インスタンスを生成する。AsyncGeneratorFunction サブクラスのインスタンスを構文的に生成する手段は存在しない。

27.4.1.1 AsyncGeneratorFunction ( ...parameterArgs, bodyArg )

最後の引数(もしあれば)が非同期ジェネレータ関数の本体(実行コード)を指定し、それ以前の引数が仮引数を指定する。

この関数は呼び出されると次の手順を実行する:

  1. C をアクティブな関数オブジェクトとする。
  2. もし bodyArg が存在しなければ bodyArg を空文字列に設定する。
  3. CreateDynamicFunction(C, NewTarget, async-generator, parameterArgs, bodyArg) を返す。
Note

20.2.1.1 の注を参照。

27.4.2 AsyncGeneratorFunction コンストラクタのプロパティ

AsyncGeneratorFunction コンストラクタ:

  • Function コンストラクタを継承する標準組込み関数オブジェクトである。
  • [[Prototype]] 内部スロットの値は %Function% である。
  • "length" プロパティを持ち、その値は 1𝔽 である。
  • "name" プロパティを持ち、その値は "AsyncGeneratorFunction" である。
  • 次のプロパティを持つ:

27.4.2.1 AsyncGeneratorFunction.prototype

AsyncGeneratorFunction.prototype の初期値は AsyncGeneratorFunction プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

27.4.3 AsyncGeneratorFunction プロトタイプオブジェクトのプロパティ

AsyncGeneratorFunction プロトタイプオブジェクト:

  • %AsyncGeneratorFunction.prototype% である。
  • 通常のオブジェクトである。
  • 関数オブジェクトではなく、Table 28 または Table 92 に列挙される [[ECMAScriptCode]] 内部スロットやその他の内部スロットを持たない。
  • [[Prototype]] 内部スロットの値は %Function.prototype% である。

27.4.3.1 AsyncGeneratorFunction.prototype.constructor

AsyncGeneratorFunction.prototype.constructor の初期値は %AsyncGeneratorFunction% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.4.3.2 AsyncGeneratorFunction.prototype.prototype

AsyncGeneratorFunction.prototype.prototype の初期値は %AsyncGeneratorPrototype% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.4.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "AsyncGeneratorFunction" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.4.4 AsyncGeneratorFunction インスタンス

すべての AsyncGeneratorFunction インスタンスは ECMAScript 関数オブジェクトであり、Table 28 に列挙される内部スロットを持つ。そのすべてのインスタンスにおける [[IsClassConstructor]] 内部スロットの値は false である。

各 AsyncGeneratorFunction インスタンスは次の独自プロパティを持つ:

27.4.4.1 length

"length" プロパティの値は、その AsyncGeneratorFunction が典型的に期待する引数の数を示す整数 Number である。ただし言語仕様上、他の数の引数で呼び出すことも許される。"length" プロパティで指定された数以外の引数個数で呼び出された際の動作はその関数に依存する。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.4.4.2 name

20.2.4.2 で与えられる Function インスタンスの "name" プロパティの仕様は AsyncGeneratorFunction インスタンスにも適用される。

27.4.4.3 prototype

AsyncGeneratorFunction インスタンスが生成されるたびに別の通常オブジェクトも生成され、その非同期ジェネレータ関数の "prototype" プロパティの初期値となる。prototype プロパティの値は、そのジェネレータ関数オブジェクト[[Call]] を用いて呼び出されたとき、新たに生成される AsyncGenerator の [[Prototype]] 内部スロットを初期化するために用いられる。

このプロパティは属性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

Note

関数インスタンスと異なり、AsyncGeneratorFunction の "prototype" プロパティの値であるオブジェクトは、その値がその AsyncGeneratorFunction インスタンスである "constructor" プロパティを持たない。

27.5 Generator オブジェクト

Generator はジェネレータ関数を呼び出すことで生成され、イテレータインタフェースおよび iterable インタフェースの双方に適合する。

Generator インスタンスは、それを生成したジェネレータ関数の "prototype" プロパティ初期値から直接プロパティを継承する。Generator インスタンスは間接的に %GeneratorPrototype% からプロパティを継承する。

27.5.1 %GeneratorPrototype% オブジェクト

%GeneratorPrototype% オブジェクト:

  • %GeneratorFunction.prototype.prototype% である。
  • 通常のオブジェクトである。
  • Generator インスタンスではなく、[[GeneratorState]] 内部スロットを持たない。
  • [[Prototype]] 内部スロットの値は %Iterator.prototype% である。
  • すべての Generator インスタンスが間接的に継承するプロパティを持つ。

27.5.1.1 %GeneratorPrototype%.constructor

%GeneratorPrototype%.constructor の初期値は %GeneratorFunction.prototype% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.5.1.2 %GeneratorPrototype%.next ( value )

  1. GeneratorResume(this value, value, empty) を返す。

27.5.1.3 %GeneratorPrototype%.return ( value )

このメソッドは呼び出されると次の手順を実行する:

  1. gthis 値とする。
  2. CReturnCompletion(value) とする。
  3. GeneratorResumeAbrupt(g, C, empty) を返す。

27.5.1.4 %GeneratorPrototype%.throw ( exception )

このメソッドは呼び出されると次の手順を実行する:

  1. gthis 値とする。
  2. CThrowCompletion(exception) とする。
  3. GeneratorResumeAbrupt(g, C, empty) を返す。

27.5.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "Generator" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.5.2 Generator インスタンスのプロパティ

Generator インスタンスは Table 91 に記述される内部スロットを持って初期化される。

Table 91: Generator インスタンスの内部スロット
Internal Slot Type Description
[[GeneratorState]] suspended-start, suspended-yield, executing, or completed ジェネレータの現在の実行状態。
[[GeneratorContext]] 実行コンテキスト このジェネレータのコードを実行する際に使用される実行コンテキスト。
[[GeneratorBrand]] 文字列または empty 異なる種類のジェネレータを区別するために使用されるブランド。ECMAScript ソーステキストで宣言されたジェネレータの [[GeneratorBrand]] は常に empty である。

27.5.3 Generator 抽象操作

27.5.3.1 GeneratorStart ( generator, generatorBody )

The abstract operation GeneratorStart takes arguments generator (a Generator) and generatorBody (a FunctionBody Parse Node or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:

  1. 事前条件: generator.[[GeneratorState]]suspended-start である。
  2. genContext を実行中の実行コンテキストとする。
  3. genContext の Generator コンポーネントを generator に設定する。
  4. closure を、引数なしで generatorBody を捕捉し、呼び出されると次を行う新たな Abstract Closure とする:
    1. acGenContext を実行中の実行コンテキストとする。
    2. acGeneratoracGenContext の Generator コンポーネントとする。
    3. もし generatorBody が Parse Node なら
      1. resultCompletion(Evaluation of generatorBody) とする。
    4. それ以外
      1. 事前条件: generatorBody は引数なしの Abstract Closure である。
      2. resultCompletion(generatorBody()) とする。
    5. 事前条件: ここに戻ってきたとき、ジェネレータは例外を投げたか、暗黙または明示の return を実行している。
    6. acGenContext を実行コンテキストスタックから除去し、スタックトップの実行コンテキストを実行中の実行コンテキストとして復元する。
    7. acGenerator.[[GeneratorState]]completed に設定する。
    8. 注: ジェネレータが completed 状態に入ると二度と離れず、その関連実行コンテキストが再開されることはない。acGenerator に関連する任意の実行状態はこの時点で破棄可能。
    9. もし resultnormal completion なら
      1. resultValueundefined とする。
    10. それ以外で resultreturn completion なら
      1. resultValueresult.[[Value]] とする。
    11. それ以外
      1. 事前条件: resultthrow completion である。
      2. result を返す。
    12. NormalCompletion(CreateIteratorResultObject(resultValue, true)) を返す。
  5. genContext のコード評価状態を、評価が再開されたとき引数なしで closure が呼び出されるように設定する。
  6. generator.[[GeneratorContext]]genContext に設定する。
  7. unused を返す。

27.5.3.2 GeneratorValidate ( generator, generatorBrand )

The abstract operation GeneratorValidate takes arguments generator (an ECMAScript language value) and generatorBrand (a String or empty) and returns 正常完了で suspended-start, suspended-yield, completed のいずれかを含むか、または throw completion. It performs the following steps when called:

  1. RequireInternalSlot(generator, [[GeneratorState]]) を実行する。
  2. RequireInternalSlot(generator, [[GeneratorBrand]]) を実行する。
  3. もし generator.[[GeneratorBrand]]generatorBrand でなければ TypeError 例外を投げる。
  4. 事前条件: generator[[GeneratorContext]] 内部スロットも持つ。
  5. stategenerator.[[GeneratorState]] とする。
  6. もし stateexecuting なら TypeError 例外を投げる。
  7. state を返す。

27.5.3.3 GeneratorResume ( generator, value, generatorBrand )

The abstract operation GeneratorResume takes arguments generator (an ECMAScript language value), value (an ECMAScript language value or empty), and generatorBrand (a String or empty) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion. It performs the following steps when called:

  1. state を ? GeneratorValidate(generator, generatorBrand) とする。
  2. もし statecompleted なら CreateIteratorResultObject(undefined, true) を返す。
  3. 事前条件: statesuspended-start または suspended-yield のいずれか。
  4. genContextgenerator.[[GeneratorContext]] とする。
  5. methodContext を実行中の実行コンテキストとする。
  6. methodContext をサスペンドする。
  7. generator.[[GeneratorState]]executing に設定する。
  8. genContext を実行コンテキストスタックにプッシュし、genContext を実行中の実行コンテキストとする。
  9. genContext のサスペンドされた評価を再開し、サスペンドを発生させた操作の結果として NormalCompletion(value) を用いる。result を再開された計算により返された値とする。
  10. 事前条件: ここに戻るとき、genContext はすでに実行コンテキストスタックから除去され、methodContext が現在の実行中の実行コンテキストである。
  11. result を返す。

27.5.3.4 GeneratorResumeAbrupt ( generator, abruptCompletion, generatorBrand )

The abstract operation GeneratorResumeAbrupt takes arguments generator (an ECMAScript language value), abruptCompletion (a return completion or a throw completion), and generatorBrand (a String or empty) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion. It performs the following steps when called:

  1. state を ? GeneratorValidate(generator, generatorBrand) とする。
  2. もし statesuspended-start なら
    1. generator.[[GeneratorState]]completed に設定する。
    2. 注: ジェネレータが completed 状態に入ると二度と離れず、その関連実行コンテキストが再開されることはない。generator に関連する任意の実行状態はこの時点で破棄可能。
    3. statecompleted に設定する。
  3. もし statecompleted なら
    1. もし abruptCompletionreturn completion なら
      1. CreateIteratorResultObject(abruptCompletion.[[Value]], true) を返す。
    2. abruptCompletion を返す。
  4. 事前条件: statesuspended-yield である。
  5. genContextgenerator.[[GeneratorContext]] とする。
  6. methodContext を実行中の実行コンテキストとする。
  7. methodContext をサスペンドする。
  8. generator.[[GeneratorState]]executing に設定する。
  9. genContext を実行コンテキストスタックにプッシュし、genContext を実行中の実行コンテキストとする。
  10. genContext のサスペンドされた評価を再開し、サスペンドを発生させた操作の結果として abruptCompletion を用いる。result を再開された計算により返された Completion Record とする。
  11. 事前条件: ここに戻るとき、genContext はすでに実行コンテキストスタックから除去され、methodContext が現在の実行中の実行コンテキストである。
  12. result を返す。

27.5.3.5 GetGeneratorKind ( )

The abstract operation GetGeneratorKind takes no arguments and returns non-generator, sync, or async. It performs the following steps when called:

  1. genContext を実行中の実行コンテキストとする。
  2. もし genContext が Generator コンポーネントを持たなければ non-generator を返す。
  3. generatorgenContext の Generator コンポーネントとする。
  4. もし generator[[AsyncGeneratorState]] 内部スロットを持てば async を返す。
  5. それ以外は sync を返す。

27.5.3.6 GeneratorYield ( iteratorResult )

The abstract operation GeneratorYield takes argument iteratorResult (an Object that conforms to the IteratorResult interface) and returns 正常完了で ECMAScript 言語値を含むか、または abrupt completion. It performs the following steps when called:

  1. genContext を実行中の実行コンテキストとする。
  2. 事前条件: genContext はジェネレータの実行コンテキストである。
  3. generatorgenContext の Generator コンポーネントの値とする。
  4. 事前条件: GetGeneratorKind() は sync である。
  5. generator.[[GeneratorState]]suspended-yield に設定する。
  6. genContext を実行コンテキストスタックから除去し、スタックトップの実行コンテキストを実行中の実行コンテキストとして復元する。
  7. callerContext を実行中の実行コンテキストとする。
  8. callerContext を再開し NormalCompletion(iteratorResult) を渡す。もし genContext が再度再開されるなら、resumptionValue をそれで再開された Completion Record とする。
  9. 事前条件: ここに制御が到達したとき、genContext が再び実行中の実行コンテキストである。
  10. resumptionValue を返す。

27.5.3.7 Yield ( value )

The abstract operation Yield takes argument value (an ECMAScript language value) and returns 正常完了で ECMAScript 言語値を含むか、または abrupt completion. It performs the following steps when called:

  1. generatorKindGetGeneratorKind() とする。
  2. もし generatorKindasync なら ? AsyncGeneratorYield(? Await(value)) を返す。
  3. それ以外は ? GeneratorYield(CreateIteratorResultObject(value, false)) を返す。

27.5.3.8 CreateIteratorFromClosure ( closure, generatorBrand, generatorPrototype [ , extraSlots ] )

The abstract operation CreateIteratorFromClosure takes arguments closure (an Abstract Closure with no parameters), generatorBrand (a String or empty), and generatorPrototype (an Object) and optional argument extraSlots (a List of names of internal slots) and returns a Generator. It performs the following steps when called:

  1. 注: closure は IteratorResult オブジェクトを yield するために Yield 操作を使用することができる。
  2. もし extraSlots が存在しなければ extraSlots を新しい空 List に設定する。
  3. internalSlotsListextraSlots と « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] » のリスト結合とする。
  4. generatorOrdinaryObjectCreate(generatorPrototype, internalSlotsList) とする。
  5. generator.[[GeneratorBrand]]generatorBrand に設定する。
  6. generator.[[GeneratorState]]suspended-start に設定する。
  7. callerContext を実行中の実行コンテキストとする。
  8. calleeContext を新しい実行コンテキストとする。
  9. calleeContext の Function を null に設定する。
  10. calleeContextRealm を現在の Realm Record に設定する。
  11. calleeContext の ScriptOrModule を callerContext の ScriptOrModule に設定する。
  12. もし callerContext がまだサスペンドされていなければ callerContext をサスペンドする。
  13. calleeContext を実行コンテキストスタックにプッシュし、calleeContext を実行中の実行コンテキストとする。
  14. GeneratorStart(generator, closure) を実行する。
  15. calleeContext を実行コンテキストスタックから除去し、callerContext を実行中の実行コンテキストとして復元する。
  16. generator を返す。

27.6 AsyncGenerator オブジェクト

AsyncGenerator は非同期ジェネレータ関数を呼び出すことで生成され、非同期イテレータインタフェースおよび非同期 iterable インタフェースの双方に適合する。

AsyncGenerator インスタンスは、それを生成した非同期ジェネレータ関数の "prototype" プロパティ初期値から直接プロパティを継承し、間接的に %AsyncGeneratorPrototype% からプロパティを継承する。

27.6.1 %AsyncGeneratorPrototype% オブジェクト

%AsyncGeneratorPrototype% オブジェクト:

  • %AsyncGeneratorFunction.prototype.prototype% である。
  • 通常のオブジェクトである。
  • AsyncGenerator インスタンスではなく、[[AsyncGeneratorState]] 内部スロットを持たない。
  • [[Prototype]] 内部スロットの値は %AsyncIteratorPrototype% である。
  • すべての AsyncGenerator インスタンスが間接的に継承するプロパティを持つ。

27.6.1.1 %AsyncGeneratorPrototype%.constructor

%AsyncGeneratorPrototype%.constructor の初期値は %AsyncGeneratorFunction.prototype% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.6.1.2 %AsyncGeneratorPrototype%.next ( value )

  1. generatorthis 値とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. resultCompletion(AsyncGeneratorValidate(generator, empty)) とする。
  4. IfAbruptRejectPromise(result, promiseCapability)。
  5. stategenerator.[[AsyncGeneratorState]] とする。
  6. もし statecompleted なら
    1. iteratorResultCreateIteratorResultObject(undefined, true) とする。
    2. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») を実行する。
    3. promiseCapability.[[Promise]] を返す。
  7. completionNormalCompletion(value) とする。
  8. AsyncGeneratorEnqueue(generator, completion, promiseCapability) を実行する。
  9. もし statesuspended-start または suspended-yield のいずれかなら
    1. AsyncGeneratorResume(generator, completion) を実行する。
  10. それ以外
    1. 事前条件: stateexecuting または draining-queue のいずれか。
  11. promiseCapability.[[Promise]] を返す。

27.6.1.3 %AsyncGeneratorPrototype%.return ( value )

  1. generatorthis 値とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. resultCompletion(AsyncGeneratorValidate(generator, empty)) とする。
  4. IfAbruptRejectPromise(result, promiseCapability)。
  5. completionReturnCompletion(value) とする。
  6. AsyncGeneratorEnqueue(generator, completion, promiseCapability) を実行する。
  7. stategenerator.[[AsyncGeneratorState]] とする。
  8. もし statesuspended-start あるいは completed のいずれかなら
    1. generator.[[AsyncGeneratorState]]draining-queue に設定する。
    2. AsyncGeneratorAwaitReturn(generator) を実行する。
  9. それ以外で statesuspended-yield なら
    1. AsyncGeneratorResume(generator, completion) を実行する。
  10. それ以外
    1. 事前条件: stateexecuting または draining-queue のいずれか。
  11. promiseCapability.[[Promise]] を返す。

27.6.1.4 %AsyncGeneratorPrototype%.throw ( exception )

  1. generatorthis 値とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. resultCompletion(AsyncGeneratorValidate(generator, empty)) とする。
  4. IfAbruptRejectPromise(result, promiseCapability)。
  5. stategenerator.[[AsyncGeneratorState]] とする。
  6. もし statesuspended-start なら
    1. generator.[[AsyncGeneratorState]]completed に設定する。
    2. statecompleted に設定する。
  7. もし statecompleted なら
    1. ! Call(promiseCapability.[[Reject]], undefined, « exception ») を実行する。
    2. promiseCapability.[[Promise]] を返す。
  8. completionThrowCompletion(exception) とする。
  9. AsyncGeneratorEnqueue(generator, completion, promiseCapability) を実行する。
  10. もし statesuspended-yield なら
    1. AsyncGeneratorResume(generator, completion) を実行する。
  11. それ以外
    1. 事前条件: stateexecuting または draining-queue のいずれか。
  12. promiseCapability.[[Promise]] を返す。

27.6.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "AsyncGenerator" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.6.2 AsyncGenerator インスタンスのプロパティ

AsyncGenerator インスタンスは初期化時に以下の内部スロットを持つ:

Table 92: AsyncGenerator インスタンスの内部スロット
Internal Slot Type Description
[[AsyncGeneratorState]] suspended-start, suspended-yield, executing, draining-queue, or completed 非同期ジェネレータの現在の実行状態。
[[AsyncGeneratorContext]] an execution context この非同期ジェネレータのコードを実行する際に用いる実行コンテキスト。
[[AsyncGeneratorQueue]] a List of AsyncGeneratorRequest Records 非同期ジェネレータ再開要求を表すレコード。状態遷移中を除き、[[AsyncGeneratorState]]executing または draining-queue の場合に限り非空。
[[GeneratorBrand]] a String or empty 異なる種類の非同期ジェネレータを識別するブランド。ECMAScript ソースで宣言されたものの [[GeneratorBrand]] は常に empty

27.6.3 AsyncGenerator 抽象操作

27.6.3.1 AsyncGeneratorRequest レコード

AsyncGeneratorRequest は、非同期ジェネレータをどのように再開すべきかの情報を保持し、対応する promise を履行または拒否するためのケイパビリティを含む Record 値である。

以下のフィールドを持つ:

Table 93: AsyncGeneratorRequest Record フィールド
Field Name Value Meaning
[[Completion]] a Completion Record 非同期ジェネレータを再開する際に使用すべき Completion Record
[[Capability]] a PromiseCapability Record この要求に関連付けられた promise ケイパビリティ。

27.6.3.2 AsyncGeneratorStart ( generator, generatorBody )

The abstract operation AsyncGeneratorStart takes arguments generator (an AsyncGenerator) and generatorBody (a FunctionBody Parse Node or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:

  1. 事前条件: generator.[[AsyncGeneratorState]]suspended-start
  2. genContext を実行中の実行コンテキストとする。
  3. genContext の Generator コンポーネントを generator に設定する。
  4. closure を、引数なしで generatorBody を捕捉し、呼び出されると次を行う新たな Abstract Closure とする:
    1. acGenContext を実行中の実行コンテキストとする。
    2. acGeneratoracGenContext の Generator コンポーネントとする。
    3. もし generatorBody が Parse Node なら
      1. resultCompletion(Evaluation of generatorBody) とする。
    4. それ以外
      1. 事前条件: generatorBody は引数なしの Abstract Closure
      2. resultCompletion(generatorBody()) とする。
    5. 事前条件: ここに戻るとき、非同期ジェネレータは例外送出または暗黙/明示の return を行っている。
    6. acGenContext を実行コンテキストスタックから除去し、スタック頂上の実行コンテキストを実行中として復元する。
    7. acGenerator.[[AsyncGeneratorState]]draining-queue に設定する。
    8. もし resultnormal completion なら resultNormalCompletion(undefined) に設定する。
    9. もし resultreturn completion なら resultNormalCompletion(result.[[Value]]) に設定する。
    10. AsyncGeneratorCompleteStep(acGenerator, result, true) を実行する。
    11. AsyncGeneratorDrainQueue(acGenerator) を実行する。
    12. NormalCompletion(undefined) を返す。
  5. genContext のコード評価状態を、再開時に引数なしで closure が呼ばれるよう設定する。
  6. generator.[[AsyncGeneratorContext]]genContext に設定する。
  7. generator.[[AsyncGeneratorQueue]] を新しい空の List に設定する。
  8. unused を返す。

27.6.3.3 AsyncGeneratorValidate ( generator, generatorBrand )

The abstract operation AsyncGeneratorValidate takes arguments generator (an ECMAScript language value) and generatorBrand (a String or empty) and returns 正常完了で unused を含むか、または throw completion. It performs the following steps when called:

  1. RequireInternalSlot(generator, [[AsyncGeneratorContext]]) を実行。
  2. RequireInternalSlot(generator, [[AsyncGeneratorState]]) を実行。
  3. RequireInternalSlot(generator, [[AsyncGeneratorQueue]]) を実行。
  4. もし generator.[[GeneratorBrand]]generatorBrand でなければ TypeError 例外を投げる。
  5. unused を返す。

27.6.3.4 AsyncGeneratorEnqueue ( generator, completion, promiseCapability )

The abstract operation AsyncGeneratorEnqueue takes arguments generator (an AsyncGenerator), completion (a Completion Record), and promiseCapability (a PromiseCapability Record) and returns unused. It performs the following steps when called:

  1. requestAsyncGeneratorRequest { [[Completion]]: completion, [[Capability]]: promiseCapability } とする。
  2. requestgenerator.[[AsyncGeneratorQueue]] に追加する。
  3. unused を返す。

27.6.3.5 AsyncGeneratorCompleteStep ( generator, completion, done [ , realm ] )

The abstract operation AsyncGeneratorCompleteStep takes arguments generator (an AsyncGenerator), completion (a Completion Record), and done (a Boolean) and optional argument realm (a Realm Record) and returns unused. It performs the following steps when called:

  1. 事前条件: generator.[[AsyncGeneratorQueue]] は空でない。
  2. nextgenerator.[[AsyncGeneratorQueue]] の先頭要素とする。
  3. 先頭要素を generator.[[AsyncGeneratorQueue]] から除去する。
  4. promiseCapabilitynext.[[Capability]] とする。
  5. valuecompletion.[[Value]] とする。
  6. もし completionthrow completion なら
    1. ! Call(promiseCapability.[[Reject]], undefined, « value ») を実行する。
  7. それ以外
    1. 事前条件: completionnormal completion
    2. もし realm が存在すれば
      1. oldRealm を実行中の実行コンテキストの Realm とする。
      2. 実行中の実行コンテキストの Realmrealm に設定する。
      3. iteratorResultCreateIteratorResultObject(value, done) とする。
      4. 実行中の実行コンテキストの RealmoldRealm に戻す。
    3. それ以外
      1. iteratorResultCreateIteratorResultObject(value, done) とする。
    4. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») を実行する。
  8. unused を返す。

27.6.3.6 AsyncGeneratorResume ( generator, completion )

The abstract operation AsyncGeneratorResume takes arguments generator (an AsyncGenerator) and completion (a Completion Record) and returns unused. It performs the following steps when called:

  1. 事前条件: generator.[[AsyncGeneratorState]]suspended-startsuspended-yield のいずれか。
  2. genContextgenerator.[[AsyncGeneratorContext]] とする。
  3. callerContext を実行中の実行コンテキストとする。
  4. callerContext をサスペンドする。
  5. generator.[[AsyncGeneratorState]]executing に設定する。
  6. genContext を実行コンテキストスタックにプッシュし、実行中の実行コンテキストとする。
  7. genContext のサスペンドされた評価を再開し、サスペンドを引き起こした操作の結果として completion を用いる。result を再開計算が返す Completion Record とする。
  8. 事前条件: resultabrupt completion にはならない。
  9. 事前条件: ここに戻るとき genContext はスタックから除去され、callerContext が実行中。
  10. unused を返す。

27.6.3.7 AsyncGeneratorUnwrapYieldResumption ( resumptionValue )

The abstract operation AsyncGeneratorUnwrapYieldResumption takes argument resumptionValue (a Completion Record) and returns 正常完了で ECMAScript 言語値を含むか、または abrupt completion. It performs the following steps when called:

  1. もし resumptionValuereturn completion でなければ ? resumptionValue を返す。
  2. awaitedCompletion(Await(resumptionValue.[[Value]])) とする。
  3. もし awaitedthrow completion なら ? awaited を返す。
  4. 事前条件: awaitednormal completion
  5. Return ReturnCompletion(awaited.[[Value]])。

27.6.3.8 AsyncGeneratorYield ( value )

The abstract operation AsyncGeneratorYield takes argument value (an ECMAScript language value) and returns 正常完了で ECMAScript 言語値を含むか、または abrupt completion. It performs the following steps when called:

  1. genContext を実行中の実行コンテキストとする。
  2. 事前条件: genContext はジェネレータの実行コンテキスト。
  3. generatorgenContext の Generator コンポーネントの値とする。
  4. 事前条件: GetGeneratorKind() は async
  5. completionNormalCompletion(value) とする。
  6. 事前条件: 実行コンテキストスタックは少なくとも 2 要素を持つ。
  7. previousContext をスタック二番目の要素とする。
  8. previousRealmpreviousContextRealm とする。
  9. AsyncGeneratorCompleteStep(generator, completion, false, previousRealm) を実行する。
  10. queuegenerator.[[AsyncGeneratorQueue]] とする。
  11. もし queue が空でないなら
    1. 注: ジェネレータをサスペンドせず実行継続。
    2. toYieldqueue の先頭要素とする。
    3. resumptionValueCompletion(toYield.[[Completion]]) とする。
    4. AsyncGeneratorUnwrapYieldResumption(resumptionValue) を返す。
  12. それ以外
    1. generator.[[AsyncGeneratorState]]suspended-yield に設定する。
    2. genContext を実行コンテキストスタックから除去し、頂上の実行コンテキストを実行中として復元する。
    3. callerContext を実行中の実行コンテキストとする。
    4. callerContextundefined を渡して再開する。もし genContext が再度再開されるなら resumptionValue をその Completion Record とする。
    5. 事前条件: ここに到達したとき genContext が再び実行中。
    6. AsyncGeneratorUnwrapYieldResumption(resumptionValue) を返す。

27.6.3.9 AsyncGeneratorAwaitReturn ( generator )

The abstract operation AsyncGeneratorAwaitReturn takes argument generator (an AsyncGenerator) and returns unused. It performs the following steps when called:

  1. 事前条件: generator.[[AsyncGeneratorState]]draining-queue
  2. queuegenerator.[[AsyncGeneratorQueue]] とする。
  3. 事前条件: queue は空でない。
  4. nextqueue の先頭要素とする。
  5. completionCompletion(next.[[Completion]]) とする。
  6. 事前条件: completionreturn completion
  7. promiseCompletionCompletion(PromiseResolve(%Promise%, completion.[[Value]])) とする。
  8. もし promiseCompletionabrupt completion なら
    1. AsyncGeneratorCompleteStep(generator, promiseCompletion, true) を実行。
    2. AsyncGeneratorDrainQueue(generator) を実行。
    3. unused を返す。
  9. 事前条件: promiseCompletionnormal completion
  10. promisepromiseCompletion.[[Value]] とする。
  11. fulfilledClosure をパラメータ (value) を取り generator を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
    1. 事前条件: generator.[[AsyncGeneratorState]]draining-queue
    2. resultNormalCompletion(value) とする。
    3. AsyncGeneratorCompleteStep(generator, result, true) を実行。
    4. AsyncGeneratorDrainQueue(generator) を実行。
    5. NormalCompletion(undefined) を返す。
  12. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « ») とする。
  13. rejectedClosure をパラメータ (reason) を取り generator を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
    1. 事前条件: generator.[[AsyncGeneratorState]]draining-queue
    2. resultThrowCompletion(reason) とする。
    3. AsyncGeneratorCompleteStep(generator, result, true) を実行。
    4. AsyncGeneratorDrainQueue(generator) を実行。
    5. NormalCompletion(undefined) を返す。
  14. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « ») とする。
  15. PerformPromiseThen(promise, onFulfilled, onRejected) を実行する。
  16. unused を返す。

27.6.3.10 AsyncGeneratorDrainQueue ( generator )

The abstract operation AsyncGeneratorDrainQueue takes argument generator (an AsyncGenerator) and returns unused. AsyncGeneratorQueue を、return completion を保持する AsyncGeneratorRequest に遭遇するまで処理する。 It performs the following steps when called:

  1. 事前条件: generator.[[AsyncGeneratorState]]draining-queue
  2. queuegenerator.[[AsyncGeneratorQueue]] とする。
  3. queue が空でない間繰り返す,
    1. nextqueue の先頭要素とする。
    2. completionCompletion(next.[[Completion]]) とする。
    3. もし completionreturn completion なら
      1. AsyncGeneratorAwaitReturn(generator) を実行。
      2. unused を返す。
    4. それ以外
      1. もし completionnormal completion なら
        1. completionNormalCompletion(undefined) に設定。
      2. AsyncGeneratorCompleteStep(generator, completion, true) を実行。
  4. generator.[[AsyncGeneratorState]]completed に設定。
  5. unused を返す。

27.6.3.11 CreateAsyncIteratorFromClosure ( closure, generatorBrand, generatorPrototype )

The abstract operation CreateAsyncIteratorFromClosure takes arguments closure (an Abstract Closure with no parameters), generatorBrand (a String or empty), and generatorPrototype (an Object) and returns an AsyncGenerator. It performs the following steps when called:

  1. 注: closureAwait 操作および IteratorResult オブジェクトを yield するための Yield 操作を含み得る。
  2. internalSlotsList を « [[AsyncGeneratorState]], [[AsyncGeneratorContext]], [[AsyncGeneratorQueue]], [[GeneratorBrand]] » とする。
  3. generatorOrdinaryObjectCreate(generatorPrototype, internalSlotsList) とする。
  4. generator.[[GeneratorBrand]]generatorBrand に設定する。
  5. generator.[[AsyncGeneratorState]]suspended-start に設定する。
  6. callerContext を実行中の実行コンテキストとする。
  7. calleeContext を新しい実行コンテキストとする。
  8. calleeContext の Function を null に設定する。
  9. calleeContextRealm を現在の Realm Record に設定する。
  10. calleeContext の ScriptOrModule を callerContext の ScriptOrModule に設定する。
  11. もし callerContext がまだサスペンドされていなければ callerContext をサスペンドする。
  12. calleeContext を実行コンテキストスタックにプッシュし、実行中の実行コンテキストとする。
  13. AsyncGeneratorStart(generator, closure) を実行する。
  14. calleeContext を実行コンテキストスタックから除去し、callerContext を実行中として復元する。
  15. generator を返す。

27.7 AsyncFunction オブジェクト

AsyncFunction は通常 AsyncFunctionDeclarationAsyncFunctionExpressionAsyncMethodAsyncArrowFunction を評価することで生成される。%AsyncFunction% 組込みを呼び出すことでも生成され得る。

27.7.1 AsyncFunction コンストラクタ

AsyncFunction コンストラクタ:

  • %AsyncFunction% である。
  • Function のサブクラスである。
  • コンストラクタではなく関数として呼び出されたとき新しい AsyncFunction を生成し初期化する。したがって関数呼び出し AsyncFunction(…) は同じ引数での new AsyncFunction(…) と同等。
  • クラス定義の extends 句の値として使用できる。指定された AsyncFunction の挙動を継承するサブクラスコンストラクタは、組込み非同期関数挙動に必要な内部スロットを備えたサブクラスインスタンスを生成・初期化するため AsyncFunction コンストラクタへの super 呼び出しを含めなければならない。非同期関数オブジェクトを定義する全ての構文形式は AsyncFunction の直接インスタンスを生成する。AsyncFunction サブクラスインスタンスを構文的に生成する手段はない。

27.7.1.1 AsyncFunction ( ...parameterArgs, bodyArg )

最後の引数(存在する場合)が非同期関数の本体(実行コード)を指定し、それ以前の引数が仮引数を指定する。

この関数は呼び出されると次を実行する:

  1. C をアクティブな関数オブジェクトとする。
  2. もし bodyArg が存在しなければ bodyArg を空文字列に設定する。
  3. CreateDynamicFunction(C, NewTarget, async, parameterArgs, bodyArg) を返す。
Note
20.2.1.1 の注参照。

27.7.2 AsyncFunction コンストラクタのプロパティ

AsyncFunction コンストラクタ:

  • Function コンストラクタを継承する標準組込み関数オブジェクトである。
  • [[Prototype]] 内部スロットの値は %Function% である。
  • "length" プロパティを持ち、その値は 1𝔽 である。
  • "name" プロパティを持ち、その値は "AsyncFunction" である。
  • 次のプロパティを持つ:

27.7.2.1 AsyncFunction.prototype

AsyncFunction.prototype の初期値は AsyncFunction プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

27.7.3 AsyncFunction プロトタイプオブジェクトのプロパティ

AsyncFunction プロトタイプオブジェクト:

  • %AsyncFunction.prototype% である。
  • 通常のオブジェクトである。
  • 関数オブジェクトではなく、Table 28 に列挙される [[ECMAScriptCode]] 内部スロットや他の内部スロットを持たない。
  • [[Prototype]] 内部スロットの値は %Function.prototype% である。

27.7.3.1 AsyncFunction.prototype.constructor

AsyncFunction.prototype.constructor の初期値は %AsyncFunction% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.7.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "AsyncFunction" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.7.4 AsyncFunction インスタンス

すべての AsyncFunction インスタンスは ECMAScript 関数オブジェクトであり、Table 28 に列挙される内部スロットを持つ。これらのインスタンスの [[IsClassConstructor]] 内部スロット値は false。AsyncFunction インスタンスはコンストラクタではなく [[Construct]] 内部メソッドを持たない。また構築不可能であるため prototype プロパティを持たない。

各 AsyncFunction インスタンスは次の独自プロパティを持つ:

27.7.4.1 length

20.2.4.1 で与えられる Function インスタンスの "length" プロパティ仕様は AsyncFunction インスタンスにも適用される。

27.7.4.2 name

20.2.4.2 で与えられる Function インスタンスの "name" プロパティ仕様は AsyncFunction インスタンスにも適用される。

27.7.5 Async Function 抽象操作

27.7.5.1 AsyncFunctionStart ( promiseCapability, asyncFunctionBody )

The abstract operation AsyncFunctionStart takes arguments promiseCapability (a PromiseCapability Record) and asyncFunctionBody (a FunctionBody Parse Node, an ExpressionBody Parse Node, or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:

  1. runningContext を実行中の実行コンテキストとする。
  2. asyncContextrunningContext のコピーとする。
  3. 注: 現在実行中のコンテキストを再開することは未定義であるため、AsyncBlockStart が再開できるよう実行状態のコピーが必要。
  4. AsyncBlockStart(promiseCapability, asyncFunctionBody, asyncContext) を実行する。
  5. unused を返す。

27.7.5.2 AsyncBlockStart ( promiseCapability, asyncBody, asyncContext )

The abstract operation AsyncBlockStart takes arguments promiseCapability (a PromiseCapability Record), asyncBody (a Parse Node or an Abstract Closure with no parameters), and asyncContext (an execution context) and returns unused. It performs the following steps when called:

  1. runningContext を実行中の実行コンテキストとする。
  2. closure を、引数なしで promiseCapabilityasyncBody を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
    1. acAsyncContext を実行中の実行コンテキストとする。
    2. もし asyncBody が Parse Node なら
      1. resultCompletion(Evaluation of asyncBody) とする。
    3. それ以外
      1. 事前条件: asyncBody は引数なしの Abstract Closure
      2. resultCompletion(asyncBody()) とする。
    4. 事前条件: ここに戻るとき非同期関数は例外送出か暗黙/明示の return を行っており、全ての await は完了。
    5. acAsyncContext を実行コンテキストスタックから除去し、頂上の実行コンテキストを実行中として復元。
    6. もし resultnormal completion なら
      1. ! Call(promiseCapability.[[Resolve]], undefined, « undefined ») を実行。
    7. それ以外で resultreturn completion なら
      1. Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] ») を実行。
    8. それ以外
      1. 事前条件: resultthrow completion
      2. ! Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] ») を実行。
    9. NormalCompletion(unused) を返す。
  3. asyncContext のコード評価状態を、再開時に引数なしで closure が呼ばれるよう設定。
  4. asyncContext を実行コンテキストスタックにプッシュし実行中とする。
  5. asyncContext のサスペンドされた評価を再開result を再開計算が返した値とする。
  6. 事前条件: ここに戻るとき asyncContext はスタックから除去され runningContext が実行中。
  7. 事前条件: result は値 unused を持つ normal completion。値の起源は Await か(await が無い場合)上記 2.i
  8. unused を返す。

27.7.5.3 Await ( value )

The abstract operation Await takes argument value (an ECMAScript language value) and returns 正常完了で ECMAScript 言語値または empty を含むか、または throw completion. It performs the following steps when called:

  1. asyncContext を実行中の実行コンテキストとする。
  2. promise を ? PromiseResolve(%Promise%, value) とする。
  3. fulfilledClosure をパラメータ (v) を取り asyncContext を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
    1. prevContext を実行中の実行コンテキストとする。
    2. prevContext をサスペンドする。
    3. asyncContext を実行コンテキストスタックにプッシュし実行中とする。
    4. asyncContext のサスペンドされた評価を再開し、サスペンドを発生させた操作の結果として NormalCompletion(v) を用いる。
    5. 事前条件: この段階で asyncContext はスタックから除去され prevContext が実行中。
    6. NormalCompletion(undefined) を返す。
  4. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « ») とする。
  5. rejectedClosure をパラメータ (reason) を取り asyncContext を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
    1. prevContext を実行中の実行コンテキストとする。
    2. prevContext をサスペンドする。
    3. asyncContext を実行コンテキストスタックにプッシュし実行中とする。
    4. asyncContext のサスペンドされた評価を再開し、サスペンドを発生させた操作の結果として ThrowCompletion(reason) を用いる。
    5. 事前条件: この段階で asyncContext はスタックから除去され prevContext が実行中。
    6. NormalCompletion(undefined) を返す。
  6. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « ») とする。
  7. PerformPromiseThen(promise, onFulfilled, onRejected) を実行する。
  8. asyncContext を実行コンテキストスタックから除去し、頂上の実行コンテキストを実行中として復元する。
  9. callerContext を実行中の実行コンテキストとする。
  10. callerContextempty を渡して再開する。もし asyncContext が再度再開されるなら completion をその Completion Record とする。
  11. 事前条件: ここに到達したとき asyncContext が再び実行中。
  12. completion を返す。

28 リフレクション (Reflection)

28.1 Reflect オブジェクト (The Reflect Object)

Reflect オブジェクト:

  • %Reflect% である。
  • グローバルオブジェクト"Reflect" プロパティの初期値である。
  • 通常のオブジェクトである。
  • [[Prototype]] 内部スロットの値は %Object.prototype% である。
  • 関数オブジェクトではない。
  • [[Construct]] 内部メソッドを持たない;new 演算子でコンストラクタとして使用できない。
  • [[Call]] 内部メソッドを持たない;関数として呼び出すことはできない。

28.1.1 Reflect.apply ( target, thisArgument, argumentsList )

この関数は呼び出されると次の手順を実行する:

  1. もし IsCallable(target) が false なら TypeError 例外を投げる。
  2. args を ? CreateListFromArrayLike(argumentsList) とする。
  3. PrepareForTailCall() を実行する。
  4. ? Call(target, thisArgument, args) を返す。

28.1.2 Reflect.construct ( target, argumentsList [ , newTarget ] )

この関数は呼び出されると次の手順を実行する:

  1. もし IsConstructor(target) が false なら TypeError 例外を投げる。
  2. もし newTarget が存在しなければ newTargettarget に設定する。
  3. それ以外で IsConstructor(newTarget) が false なら TypeError 例外を投げる。
  4. args を ? CreateListFromArrayLike(argumentsList) とする。
  5. ? Construct(target, args, newTarget) を返す。

28.1.3 Reflect.defineProperty ( target, propertyKey, attributes )

この関数は呼び出されると次の手順を実行する:

  1. もし target が Object でなければ TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. desc を ? ToPropertyDescriptor(attributes) とする。
  4. target.[[DefineOwnProperty]](key, desc) を返す。

28.1.4 Reflect.deleteProperty ( target, propertyKey )

この関数は呼び出されると次の手順を実行する:

  1. もし target が Object でなければ TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. target.[[Delete]](key) を返す。

28.1.5 Reflect.get ( target, propertyKey [ , receiver ] )

この関数は呼び出されると次の手順を実行する:

  1. もし target が Object でなければ TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. もし receiver が存在しなければ
    1. receivertarget に設定する。
  4. target.[[Get]](key, receiver) を返す。

28.1.6 Reflect.getOwnPropertyDescriptor ( target, propertyKey )

この関数は呼び出されると次の手順を実行する:

  1. もし target が Object でなければ TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. desc を ? target.[[GetOwnProperty]](key) とする。
  4. FromPropertyDescriptor(desc) を返す。

28.1.7 Reflect.getPrototypeOf ( target )

この関数は呼び出されると次の手順を実行する:

  1. もし target が Object でなければ TypeError 例外を投げる。
  2. target.[[GetPrototypeOf]]() を返す。

28.1.8 Reflect.has ( target, propertyKey )

この関数は呼び出されると次の手順を実行する:

  1. もし target が Object でなければ TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. target.[[HasProperty]](key) を返す。

28.1.9 Reflect.isExtensible ( target )

この関数は呼び出されると次の手順を実行する:

  1. もし target が Object でなければ TypeError 例外を投げる。
  2. target.[[IsExtensible]]() を返す。

28.1.10 Reflect.ownKeys ( target )

この関数は呼び出されると次の手順を実行する:

  1. もし target が Object でなければ TypeError 例外を投げる。
  2. keys を ? target.[[OwnPropertyKeys]]() とする。
  3. CreateArrayFromList(keys) を返す。

28.1.11 Reflect.preventExtensions ( target )

この関数は呼び出されると次の手順を実行する:

  1. もし target が Object でなければ TypeError 例外を投げる。
  2. target.[[PreventExtensions]]() を返す。

28.1.12 Reflect.set ( target, propertyKey, V [ , receiver ] )

この関数は呼び出されると次の手順を実行する:

  1. もし target が Object でなければ TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. もし receiver が存在しなければ
    1. receivertarget に設定する。
  4. target.[[Set]](key, V, receiver) を返す。

28.1.13 Reflect.setPrototypeOf ( target, proto )

この関数は呼び出されると次の手順を実行する:

  1. もし target が Object でなければ TypeError 例外を投げる。
  2. もし proto が Object でなく かつ protonull でなければ TypeError 例外を投げる。
  3. target.[[SetPrototypeOf]](proto) を返す。

28.1.14 Reflect [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列値 "Reflect" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

28.2 Proxy オブジェクト (Proxy Objects)

28.2.1 Proxy コンストラクタ (The Proxy Constructor)

Proxy コンストラクタ:

  • %Proxy% である。
  • グローバルオブジェクト"Proxy" プロパティの初期値である。
  • コンストラクタとして呼び出されたとき新しい Proxy オブジェクトを生成し初期化する。
  • 関数として呼び出すことは意図されておらず、そのように呼び出されると例外を投げる。

28.2.1.1 Proxy ( target, handler )

この関数は呼び出されると次の手順を実行する:

  1. もし NewTarget が undefined なら TypeError 例外を投げる。
  2. ProxyCreate(target, handler) を返す。

28.2.2 Proxy コンストラクタのプロパティ (Properties of the Proxy Constructor)

Proxy コンストラクタ:

  • [[Prototype]] 内部スロットの値は %Function.prototype% である。
  • Proxy オブジェクトは初期化を要する [[Prototype]] 内部スロットを持たないため "prototype" プロパティを持たない。
  • 次のプロパティを持つ:

28.2.2.1 Proxy.revocable ( target, handler )

この関数は取り消し可能な Proxy オブジェクトを生成する。

呼び出されると次の手順を実行する:

  1. proxy を ? ProxyCreate(target, handler) とする。
  2. revokerClosure を、引数無しで何も捕捉せず呼び出されると次を行う新たな Abstract Closure とする:
    1. F をアクティブな関数オブジェクトとする。
    2. pF.[[RevocableProxy]] とする。
    3. もし pnull なら NormalCompletion(undefined) を返す。
    4. F.[[RevocableProxy]]null に設定する。
    5. 事前条件: pProxy エキゾチックオブジェクトである。
    6. p.[[ProxyTarget]]null に設定する。
    7. p.[[ProxyHandler]]null に設定する。
    8. NormalCompletion(undefined) を返す。
  3. revokerCreateBuiltinFunction(revokerClosure, 0, "", « [[RevocableProxy]] ») とする。
  4. revoker.[[RevocableProxy]]proxy に設定する。
  5. resultOrdinaryObjectCreate(%Object.prototype%) とする。
  6. CreateDataPropertyOrThrow(result, "proxy", proxy) を実行する。
  7. CreateDataPropertyOrThrow(result, "revoke", revoker) を実行する。
  8. result を返す。

28.3 モジュール名前空間オブジェクト (Module Namespace Objects)

モジュール名前空間オブジェクトはモジュールのエクスポート束縛へ実行時のプロパティベースアクセスを提供する module namespace エキゾチックオブジェクトである。Module Namespace Objects 用のコンストラクタ関数は存在しない。代わりに、このようなオブジェクトは NameSpaceImport を含む ImportDeclaration によりインポートされた各モジュールごとに生成される。

10.4.6 で規定されるプロパティに加えて、各 Module Namespace Object は次の自前プロパティを持つ:

28.3.1 %Symbol.toStringTag%

%Symbol.toStringTag% プロパティの初期値は文字列値 "Module" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

29 メモリーモデル (Memory Model)

メモリ一貫性モデル、すなわち memory model は、SharedArrayBuffer に裏付けられた TypedArray インスタンスへのアクセスおよび Atomics オブジェクト上のメソッドにより生じる Shared Data Block イベントの起こり得る順序を規定する。プログラムに(後述の定義による)データ競合がない場合、イベント順序は逐次的一貫性 (sequentially consistent) として現れ、すなわち各エージェントのアクションのインターリーブとして現れる。プログラムにデータ競合がある場合、共有メモリアクセスは逐次的一貫性を欠いて見える可能性がある。例えばプログラムは因果律に反する振る舞いやその他の驚きを示し得る。これらの驚きはコンパイラ変換および CPU 設計(例: 命令のアウトオブオーダ実行や投機)に由来する。メモリーモデルはプログラムが逐次的一貫性を示す正確な条件と、データ競合から読み得る値の可能性を定義する。言い換えると、undefined behaviour は存在しない。

メモリーモデルは SharedArrayBuffer 上の抽象操作または Atomics オブジェクト上のメソッドによって評価中に導入されるイベントに対する関係制約として定義される。

Note

この節は SharedArrayBuffer 上の抽象操作によって導入されるイベントに関する公理的モデルを提供する。モデルは仕様の他の部分と異なりアルゴリズム的に表現できないことを強調する。抽象操作によるイベントの非決定的導入は ECMAScript 評価の操作的意味論とメモリーモデルの公理的意味論とのインタフェースである。これらイベントの意味は評価内の全イベントのグラフを考慮して定義される。これらは静的意味論でも実行時意味論でもない。既知のアルゴリズム実装は示されておらず、代わりに特定のイベントグラフが許容されるか否かを決定する制約集合がある。

29.1 メモリーモデルの基本 (Memory Model Fundamentals)

共有メモリアクセス(読み書き)は後述の定義に従い atomic アクセスと data アクセスの 2 群に分けられる。Atomic アクセスは逐次的一貫性を持つ、すなわちエージェントクラスタ内の全エージェントが合意する厳密な全順序が存在する。非 atomic アクセスは全エージェントが合意する厳密な全順序を持たず、すなわち unordered である。

Note 1

逐次的一貫性より弱く、unordered より強い順序(例: release-acquire)はサポートされない。

Shared Data Block eventReadSharedMemoryWriteSharedMemory、または ReadModifyWriteSharedMemory Record のいずれかである。

Table 94: ReadSharedMemory イベントフィールド (ReadSharedMemory Event Fields)
Field Name Value Meaning
[[Order]] seq-cst または unordered このイベントに対してメモリーモデルが保証する最弱の順序。
[[NoTear]] Boolean このイベントが同一範囲を持つ複数の書き込みイベントから読み取ることを許されるかどうか。
[[Block]] Shared Data Block イベントが作用するブロック。
[[ByteIndex]] 非負整数 [[Block]] 内での読み取りのバイト位置。
[[ElementSize]] 非負整数 読み取りサイズ。
Table 95: WriteSharedMemory イベントフィールド (WriteSharedMemory Event Fields)
Field Name Value Meaning
[[Order]] seq-cst, unordered, または init このイベントに対してメモリーモデルが保証する最弱の順序。
[[NoTear]] Boolean このイベントが同一範囲を持つ複数の読み取りイベントから読み取られることを許されるかどうか。
[[Block]] Shared Data Block イベントが作用するブロック。
[[ByteIndex]] 非負整数 [[Block]] 内での書き込みのバイト位置。
[[ElementSize]] 非負整数 書き込みサイズ。
[[Payload]] バイト値List 他のイベントによって読み取られるバイト値List
Table 96: ReadModifyWriteSharedMemory イベントフィールド (ReadModifyWriteSharedMemory Event Fields)
Field Name Value Meaning
[[Order]] seq-cst Read-modify-write イベントは常に逐次的一貫性。
[[NoTear]] true Read-modify-write イベントは tear しない。
[[Block]] Shared Data Block イベントが作用するブロック。
[[ByteIndex]] 非負整数 [[Block]] 内での read-modify-write のバイト位置。
[[ElementSize]] 非負整数 read-modify-write のサイズ。
[[Payload]] バイト値List [[ModifyOp]] に渡されるバイト値List
[[ModifyOp]] read-modify-write 変更関数 読み取ったバイト値List[[Payload]] から変更後のバイト値List を返す抽象クロージャ。

これらのイベントは抽象操作または Atomics オブジェクト上のメソッドによって導入される。

一部操作は Synchronize イベントも導入し得る。Synchronize event はフィールドを持たず、他イベントの許容順序を直接制約するためだけに存在する。

Shared Data Block イベントと Synchronize イベントに加えて、ホスト固有イベントが存在する。

ReadSharedMemory / WriteSharedMemory / ReadModifyWriteSharedMemory イベントの範囲はその [[ByteIndex]] から [[ByteIndex]] + [[ElementSize]] - 1 までの連続整数集合とする。2 つのイベントの範囲が同じ [[Block]] を持ち要素毎に等しいとき、それらの範囲は等しい。2 つのイベントの範囲が同じ [[Block]] を持ち、範囲が等しくなく かつ 交差が空でないとき、範囲は重複 (overlapping) する。2 つのイベントの範囲が同じ [[Block]] を持たないか、範囲が等しくも重複もしていないとき、範囲は素 (disjoint) である。

Note 2

考慮すべきホスト固有同期イベント例:SharedArrayBuffer を一方のエージェントから他方へ送る(ブラウザでの postMessage など)、エージェントの開始と停止、共有メモリ以外のチャネルによるエージェントクラスタ内通信。特定の実行 execution において、それらイベントは host-synchronizes-with 厳密半順序を通じてホストにより提供される。さらにホストis-agent-order-before 関係に参加するため execution.[[EventList]]ホスト固有同期イベントを追加できる。

イベントは以下で定義する関係によって候補実行内で順序付けられる。

29.2 Agent Events レコード (Agent Events Records)

Agent Events Record は次のフィールドを持つ Record である。

Table 97: Agent Events Record フィールド (Agent Events Record Fields)
Field Name Value Meaning
[[AgentSignifier]] エージェント識別子 この順序付けに結果した評価を行ったエージェント。
[[EventList]] イベントの List 評価中にイベントがリストへ追加される。
[[AgentSynchronizesWith]] Synchronize イベントのペアの List 操作的意味論によって導入された Synchronize 関係。

29.3 Chosen Value レコード (Chosen Value Records)

Chosen Value Record は次のフィールドを持つ Record である。

Table 98: Chosen Value Record フィールド (Chosen Value Record Fields)
Field Name Value Meaning
[[Event]] Shared Data Block event この選択値のために導入された ReadSharedMemory または ReadModifyWriteSharedMemory イベント。
[[ChosenValue]] バイト値List 評価中に非決定的に選択されたバイト。

29.4 候補実行 (Candidate Executions)

candidate execution とは次のフィールドを持つエージェントクラスタ評価の Record である。

Table 99: Candidate Execution Record フィールド (Candidate Execution Record Fields)
Field Name Value Meaning
[[EventsRecords]] Agent Events RecordsList エージェントを評価中に追加されたイベントの List に対応付ける。
[[ChosenValues]] Chosen Value RecordsList ReadSharedMemory または ReadModifyWriteSharedMemory イベントを評価中に選択されたバイト値List に対応付ける。

empty candidate execution はフィールドが空 List である candidate execution Record である。

29.5 メモリーモデル用抽象操作 (Abstract Operations for the Memory Model)

29.5.1 EventSet ( execution )

The abstract operation EventSet takes argument execution (a candidate execution) and returns a Set of events. It performs the following steps when called:

  1. events を空集合とする。
  2. execution.[[EventsRecords]] の各 Agent Events Record aer について
    1. aer.[[EventList]] の各イベント E について
      1. Eevents に追加する。
  3. events を返す。

29.5.2 SharedDataBlockEventSet ( execution )

The abstract operation SharedDataBlockEventSet takes argument execution (a candidate execution) and returns a Set of events. It performs the following steps when called:

  1. events を空集合とする。
  2. EventSet(execution) の各イベント E について
    1. もし EReadSharedMemory / WriteSharedMemory / ReadModifyWriteSharedMemory イベントなら Eevents に追加する。
  3. events を返す。

29.5.3 HostEventSet ( execution )

The abstract operation HostEventSet takes argument execution (a candidate execution) and returns a Set of events. It performs the following steps when called:

  1. events を空集合とする。
  2. EventSet(execution) の各イベント E について
    1. もし ESharedDataBlockEventSet(execution) に含まれないなら Eevents に追加する。
  3. events を返す。

29.5.4 ComposeWriteEventBytes ( execution, byteIndex, Ws )

The abstract operation ComposeWriteEventBytes takes arguments execution (a candidate execution), byteIndex (a non-negative integer), and Ws (a List of either WriteSharedMemory or ReadModifyWriteSharedMemory events) and returns a List of byte values. It performs the following steps when called:

  1. byteLocationbyteIndex とする。
  2. bytesRead を新しい空の List とする。
  3. Ws の各要素 W について
    1. 事前条件: W はその範囲に byteLocation を含む。
    2. payloadIndexbyteLocation - W.[[ByteIndex]] とする。
    3. もし WWriteSharedMemory イベントなら
      1. byteW.[[Payload]][payloadIndex] とする。
    4. それ以外
      1. 事前条件: WReadModifyWriteSharedMemory イベントである。
      2. bytesValueOfReadEvent(execution, W) とする。
      3. bytesModifiedW.[[ModifyOp]](bytes, W.[[Payload]]) とする。
      4. bytebytesModified[payloadIndex] とする。
    5. bytebytesRead に追加する。
    6. byteLocationbyteLocation + 1 に設定する。
  4. bytesRead を返す。
Note 1

read-modify-write 変更 [[ModifyOp]]ReadModifyWriteSharedMemory イベントを導入する Atomics オブジェクト上の関数プロパティによって与えられる。

Note 2

この抽象操作は書き込みイベントの Listバイト値List に合成する。ReadSharedMemory および ReadModifyWriteSharedMemory イベントのイベント意味論で使用される。

29.5.5 ValueOfReadEvent ( execution, R )

The abstract operation ValueOfReadEvent takes arguments execution (a candidate execution) and R (a ReadSharedMemory or ReadModifyWriteSharedMemory event) and returns a List of byte values. It performs the following steps when called:

  1. Wsexecution における reads-bytes-from(R) とする。
  2. 事前条件: WsR.[[ElementSize]] と同じ長さの WriteSharedMemory または ReadModifyWriteSharedMemory イベントの List
  3. ComposeWriteEventBytes(execution, R.[[ByteIndex]], Ws) を返す。

29.6 候補実行における関係 (Relations of Candidate Executions)

以下の関係と数学的関数は特定の候補実行をパラメータに取り、そのイベントを順序付ける。

29.6.1 is-agent-order-before

候補実行 execution における is-agent-order-before 関係は次を満たす最小のイベント上の関係である。

  • イベント ED について、execution.[[EventsRecords]] 内のある Agent Events Record aer が存在し aer.[[EventList]]ED が含まれ かつ EList 順序で D より前にあるなら、E is-agent-order-before D in execution
Note

各エージェントは評価中にエージェント毎の厳密な全順序でイベントを導入する。これはそれら厳密全順序の合併である。

29.6.2 reads-bytes-from

候補実行 execution における reads-bytes-from 関数は SharedDataBlockEventSet(execution) 内のイベントを同集合内のイベントの List に写像し次の条件を満たす数学的関数である。

候補実行は常に reads-bytes-from 関数を許容する。

29.6.3 reads-from

候補実行 execution における reads-from 関係は次を満たす最小のイベント上の関係である。

29.6.4 host-synchronizes-with

候補実行 execution における host-synchronizes-with 関係はホスト提供のホスト固有イベント上の厳密半順序で少なくとも次を満たす。

  • もし E host-synchronizes-with D in execution なら HostEventSet(execution) は ED を含む。
  • host-synchronizes-with と is-agent-order-before の合併にサイクルが存在しない。
Note 1

候補実行 execution 内のホスト固有イベント ED について、E host-synchronizes-with D in executionE happens-before D in execution を意味する。

Note 2

この関係はホストに追加の同期機構(HTML ワーカー間の postMessage など)を提供させる。

29.6.5 synchronizes-with

候補実行 execution における synchronizes-with 関係は次を満たす最小のイベント上の関係である。

  • イベント RW について、R reads-from W in execution, R.[[Order]]seq-cst, W.[[Order]]seq-cst, かつ RW が等しい範囲なら W synchronizes-with R in execution
  • execution.[[EventsRecords]] の各要素 eventsRecord について次が成り立つ。
    • イベント SSw について、eventsRecord.[[AgentSynchronizesWith]] が (S, Sw) を含むなら S synchronizes-with Sw in execution
  • イベント ED について、execution.[[HostSynchronizesWith]] が (E, D) を含むなら E synchronizes-with D in execution
Note 1

メモリーモデル文献の慣例により、候補実行 execution では書き込みイベントが読み取りイベントを synchronizes-with する。

Note 2

候補実行 execution では init イベントはこの関係に参加せず、代わりに happens-before により直接制約される。

Note 3

候補実行 execution において reads-from で関連する全 seq-cst イベントが synchronizes-with で関連するとは限らない。等しい範囲を持つイベントのみが synchronizes-with で関連する。

Note 4

候補実行 executionShared Data Block イベント RWW synchronizes-with R の場合、RW 以外の書き込みからも reads-from し得る。

29.6.6 happens-before

候補実行 execution における happens-before 関係は次を満たす最小のイベント上の関係である。

  • イベント ED について、次のいずれかが真なら E happens-before D in execution

Note

happens-before は agent-order の上位集合であるため、候補実行は ECMAScript の単一スレッド評価意味論と整合する。

29.7 有効な実行の性質 (Properties of Valid Executions)

29.7.1 Valid Chosen Reads

候補実行 execution が valid chosen reads を持つとは次のアルゴリズムが true を返す場合である。

  1. SharedDataBlockEventSet(execution) の各 ReadSharedMemory または ReadModifyWriteSharedMemory イベント R について
    1. chosenValueRecordexecution.[[ChosenValues]] のうち [[Event]] フィールドが R である要素とする。
    2. chosenValuechosenValueRecord.[[ChosenValue]] とする。
    3. readValueValueOfReadEvent(execution, R) とする。
    4. chosenLenchosenValue の要素数とする。
    5. readLenreadValue の要素数とする。
    6. もし chosenLenreadLen なら
      1. false を返す。
    7. もし 区間 [0, chosenLen) のある整数 i について chosenValue[i] ≠ readValue[i] なら
      1. false を返す。
  2. true を返す。

29.7.2 Coherent Reads

候補実行 execution が coherent reads を持つとは次のアルゴリズムが true を返す場合である。

  1. SharedDataBlockEventSet(execution) の各 ReadSharedMemory または ReadModifyWriteSharedMemory イベント R について
    1. Wsreads-bytes-from(R) in execution とする。
    2. byteLocationR.[[ByteIndex]] とする。
    3. Ws の各要素 W について
      1. もし R happens-before W in execution なら
        1. false を返す。
      2. もし byteLocation をその範囲に含む WriteSharedMemory または ReadModifyWriteSharedMemory イベント V が存在し、W happens-before V かつ V happens-before R in execution なら
        1. false を返す。
      3. byteLocationbyteLocation + 1 に設定する。
  2. true を返す。

29.7.3 Tear Free Reads

候補実行 execution が tear free reads を持つとは次のアルゴリズムが true を返す場合である。

  1. SharedDataBlockEventSet(execution) の各 ReadSharedMemory または ReadModifyWriteSharedMemory イベント R について
    1. もし R.[[NoTear]]true なら
      1. 事前条件: R.[[ByteIndex]]R.[[ElementSize]] で割った余りは 0。
      2. R reads-from W in execution であり W.[[NoTear]]true である各イベント W について
        1. もし RW が等しい範囲を持ち、RW が同じ Shared Data Block event でなく、R reads-from V in execution を満たす等しい範囲と [[NoTear]]true のイベント V が存在するなら
          1. false を返す。
  2. true を返す。
Note

イベントの [[NoTear]] フィールドは整数 TypedArray へのアクセスで導入されたとき true、浮動小数点 TypedArray または DataView で導入されたとき false

直感的説明: メモリ範囲が整数 TypedArray によりアラインされた形でアクセスされたとき、その範囲に対する単一の書き込みイベントが同範囲の他の書き込みイベントとのデータ競合で「勝つ」必要がある。より厳密には、アラインされた読み取りイベントが、同一範囲を持つ複数の異なる書き込みイベントのバイトを混合した値を読んではならない。なお、アラインされた読み取りイベントが重複範囲を持つ複数の書き込みイベントから読む可能性は残る。

29.7.4 Sequentially Consistent Atomics

候補実行 execution において、is-memory-order-beforeEventSet(execution) 内の全イベント上の厳密全順序で次を満たす。

  • イベント ED について、E happens-before D in execution なら E is-memory-order-before D in execution
  • R reads-from W in execution であるイベント RW について、SharedDataBlockEventSet(execution) 内に WriteSharedMemory または ReadModifyWriteSharedMemory イベント V が存在し、V.[[Order]]seq-cst, W is-memory-order-before V, V is-memory-order-before R であり、かつ以下のいずれかが真である状況は存在しない。

    Note 1

    この節は等しい範囲における seq-cst イベントを追加制約する。

  • SharedDataBlockEventSet(execution) 内の各 WriteSharedMemory または ReadModifyWriteSharedMemory イベント W について、W.[[Order]]seq-cst なら、W より memory-order 前に等しい範囲で無限個の ReadSharedMemory または ReadModifyWriteSharedMemory イベントが存在することはない。

    Note 2

    この節とエージェントの前進性保証により、seq-cst 書き込みが有限時間で等しい範囲の seq-cst 読み取りに可視化されるという活性 (liveness) 条件を確保する。

候補実行は is-memory-order-before 関係を許容するなら sequentially consistent atomics を持つ。

Note 3

is-memory-order-before は EventSet(execution) の全イベントを含むが、execution 内で happens-before または synchronizes-with によって制約されないものは順序中の任意位置に現れてよい。

29.7.5 Valid Executions

候補実行 execution が有効実行 (execution) であるとは、以下すべてが真であること。

  • ホストexecution に対する host-synchronizes-with 関係を提供する。
  • execution が厳密半順序である happens-before 関係を許容する。
  • execution が valid chosen reads を持つ。
  • execution が coherent reads を持つ。
  • execution が tear free reads を持つ。
  • execution が sequentially consistent atomics を持つ。

全てのプログラムは少なくとも 1 つの有効実行を持つ。

29.8 競合 (Races)

実行 executionSharedDataBlockEventSet(execution) に含まれるイベント ED について、次のアルゴリズムが true を返すとき EDrace にある。

  1. もし ED が同一の Shared Data Block event でないなら
    1. もし E happens-before D in execution かつ D happens-before E in execution の双方が成り立たないなら
      1. もし ED が共に WriteSharedMemory または ReadModifyWriteSharedMemory イベントで かつ ED の範囲が素でないなら
        1. true を返す。
      2. もし E reads-from D in execution または D reads-from E in execution なら
        1. true を返す。
  2. false を返す。

29.9 データ競合 (Data Races)

実行 executionSharedDataBlockEventSet(execution) に含まれるイベント ED について、次のアルゴリズムが true を返すとき EDdata race にある。

  1. もし EDrace in execution にあるなら
    1. もし E.[[Order]]seq-cst ではない または D.[[Order]]seq-cst ではないなら
      1. true を返す。
    2. もし ED が重複する範囲を持つなら
      1. true を返す。
  2. false を返す。

29.10 データ競合の不存在 (Data Race Freedom)

実行 executiondata race free とは SharedDataBlockEventSet(execution) 内に data race にある 2 つのイベントが存在しないこと。

プログラムが data race free とはそのすべての実行が data race free であること。

メモリーモデルは data race free プログラムの全イベントについて逐次的一貫性を保証する。

29.11 共有メモリ利用指針 (Shared Memory Guidelines)

Note 1

以下は共有メモリを扱う ECMAScript プログラマ向けガイドラインである。

プログラムを data race free に保つ(すなわち同一メモリ位置に対する並行する非 atomic 操作が不可能であるようにする)ことを推奨する。Data race free プログラムは各エージェントの評価意味論ステップが互いにインターリーブされる意味論(インターリービング意味論)を持つ。Data race free プログラムではメモリーモデルの詳細を理解する必要はない。詳細は ECMAScript をより良く書くための直観をほぼ与えない。

より一般には、プログラムが data race free でなくとも、atomic 操作がどのデータ競合にも巻き込まれず、競合する操作がすべて同じアクセスサイズであれば予測可能な振る舞いを持ち得る。Atomic 操作を競合に巻き込まない最も簡単な方法は、atomic と非 atomic の操作が異なるメモリセルを使用し、異なるサイズの atomic アクセスを同じセルに同時利用しないようにすることである。実質的にプログラムは共有メモリを可能な限り強い型付けがあるものとして扱うべきである。依然として競合する非 atomic アクセスの順序やタイミングに依存することはできないが、メモリを強く型付けとして扱えば競合するアクセスは「tear」(値のビット断片の混在)しない。

Note 2

以下は共有メモリを使用するプログラムにコンパイラ変換を適用する ECMAScript 実装者向けガイドラインである。

単一エージェント環境で有効なほとんどのプログラム変換をマルチエージェント環境でも許容することが望ましい。これによりマルチエージェントプログラムにおける各エージェントの性能が単一エージェント環境と同様に良好となる。しばしばこれら変換は判断が難しい。以下にメモリーモデルによって含意される(またはそれより強い)規範的意図を持つが網羅的ではない規則を示す。これらは is-agent-order-before 関係を構成するイベントが導入される以前のプログラム変換に適用されることを意図する。

agent-order slice を単一エージェントに関わる is-agent-order-before 関係の部分集合とする。

読み取りイベントの possible read values を、そのイベントに対する全有効実行における ValueOfReadEvent の値集合とする。

共有メモリが存在しない場合に有効なエージェント順スライスの任意の変換は、以下の例外を除き共有メモリ存在下でも有効である。

  • Atomic は石版に刻まれている: プログラム変換はエージェント順スライス内の seq-cst イベントを unordered 操作と再順序付けしてはならず、seq-cst 操作同士を再順序付けしてもならず、seq-cst 操作を is-agent-order-before 関係から除去してもならない。

    (実際には並べ替え禁止はコンパイラに全 seq-cst 操作が同期であり最終的な is-memory-order-before 関係に含まれると仮定させる。これは相互エージェント解析不在で通常仮定せざるを得ない。さらに呼び出し先の memory-order への影響が未知な呼び出しは seq-cst 操作を含み得ると仮定させる。)

  • 読み取りは安定: 任意の共有メモリ読み取りは 1 回の実行で単一の値のみ観測しなければならない。

    (例: プログラム上意味的に 1 回の読みを複数回実行した場合、後続で観測される値はそのうち 1 つのみ許される。Rematerialization として知られる変換はこの規則に違反し得る。)

  • 書き込みは安定: 共有メモリへの全ての観測可能な書き込みは実行中のプログラム意味論から導かれていなければならない。

    (例: より大きな場所での read-modify-write を用いて小さなデータを書いたり、プログラムが書き得ない値の書き込み、他エージェントにより上書きされ得る位置に直前に読み取った値をそのまま書き戻したりしてはならない。)

  • Possible read values は空であってはならない: プログラム変換は共有メモリ読み取りの possible read values を空集合にしてはならない。

    (直観に反して、この規則は実際には書き込み上の変換を制約する。書き込みは読み取りイベントにより読まれることでメモリーモデル上の効力を持つため。例えば書き込みは seq-cst 操作 2 つの間で移動・合併・時に再順序付けできるが、ある位置を更新する全ての書き込みを除去することはできない;何らかの書き込みは残さねばならない。)

依然として有効な変換例: 同一位置への複数の非 atomic 読み取りのマージ、非 atomic 読み取りの再順序付け、投機的非 atomic 読み取りの導入、同一位置への複数非 atomic 書き込みのマージ、異なる位置への非 atomic 書き込みの再順序付け、非 atomic 読み取りのループ外へのホイスト(終了性に影響があっても)。一般にエイリアスされた TypedArray は位置が異なることの証明を難しくする。

Note 3

以下は共有メモリアクセスに対して機械語生成を行う ECMAScript 実装者向けガイドラインである。

ARM や Power より弱くないメモリーモデルを持つアーキテクチャでは、非 atomic store / load は素の store / load 命令にコンパイルできる。Atomic store / load は逐次的一貫性を保証する命令にコンパイルできる。そうした命令が無い場合、フェンス(両側への配置など)を利用する。Read-modify-write 操作は対象アーキテクチャの read-modify-write 命令列(x86 の LOCK 接頭辞、ARM の load-exclusive/store-exclusive、Power の load-link/store-conditional 等)にコンパイルできる。

具体的に、メモリーモデルは以下のコード生成を許容する意図である。

  • プログラム中の全 atomic 操作は必要であると仮定する。
  • Atomic 操作は互い、または非 atomic 操作と再順序付けされない。
  • 関数呼び出しは常に atomic 操作を行うと仮定する。
  • Atomic 操作はより大きなデータ上の read-modify-write を用いて実装されず、適切なサイズの atomic 操作がプラットフォームにない場合は non-lock-free atomics として実装される。(全ての興味あるサイズの通常メモリアクセス命令は存在すると仮定。)

素朴なコード生成パターン:

  • 通常の load/store は単一の load/store 命令。
  • ロックフリー atomic load/store は完全フェンス、通常 load/store、完全フェンス。
  • ロックフリー atomic read-modify-write は完全フェンス、atomic read-modify-write 命令列、完全フェンス。
  • 非ロックフリー atomic はスピンロック獲得、完全フェンス、非 atomic load/store 列、完全フェンス、スピンロック解放。

この写像は、アドレス範囲上の atomic 操作が非 atomic 書き込みまたは異なるサイズの atomic 操作と競合しない限り正しい。それで十分である:メモリーモデルは競合に関与する atomic 操作を非 atomic とみなす。一方素朴な写像は強い:メモリーモデルが実際には保証しない逐次的一貫フェンスとして atomic 操作を使用できる。

これら基本パターンへの局所的改善も、メモリーモデル制約に従う限り許容される。例:

  • 冗長フェンスの除去(x86 では load/store 周りのフェンス省略など、LOCK 接頭辞命令使用により read-modify-write でフェンス不要)や、弱いフェンスの使用。
  • 多くのプラットフォームは必要な全サイズのロックフリー atomic をサポート。非ロックフリーが必要なら atomic 操作本体を囲むフェンスはロック獲得/解放に折り込める。最も簡単なのは SharedArrayBuffer 毎に単一のロック語を持つこと。
  • 2 つの連続フェンスは単一フェンスと同等な場合が多く、連続する 2 つの atomic 操作生成時は間に 1 つで良い。x86 では atomic store 連続間のフェンスを省略可能など。

Annex A (informative) 文法サマリー

A.1 字句文法 (Lexical Grammar)

SourceCharacter :: any Unicode code point InputElementDiv :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator RightBracePunctuator InputElementRegExp :: WhiteSpace LineTerminator Comment CommonToken RightBracePunctuator RegularExpressionLiteral InputElementRegExpOrTemplateTail :: WhiteSpace LineTerminator Comment CommonToken RegularExpressionLiteral TemplateSubstitutionTail InputElementTemplateTail :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator TemplateSubstitutionTail InputElementHashbangOrRegExp :: WhiteSpace LineTerminator Comment CommonToken HashbangComment RegularExpressionLiteral WhiteSpace :: <TAB> <VT> <FF> <ZWNBSP> <USP> LineTerminator :: <LF> <CR> <LS> <PS> LineTerminatorSequence :: <LF> <CR> [lookahead ≠ <LF>] <LS> <PS> <CR> <LF> Comment :: MultiLineComment SingleLineComment MultiLineComment :: /* MultiLineCommentCharsopt */ MultiLineCommentChars :: MultiLineNotAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt PostAsteriskCommentChars :: MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt MultiLineNotAsteriskChar :: SourceCharacter but not * MultiLineNotForwardSlashOrAsteriskChar :: SourceCharacter but not one of / or * SingleLineComment :: // SingleLineCommentCharsopt SingleLineCommentChars :: SingleLineCommentChar SingleLineCommentCharsopt SingleLineCommentChar :: SourceCharacter but not LineTerminator HashbangComment :: #! SingleLineCommentCharsopt CommonToken :: IdentifierName PrivateIdentifier Punctuator NumericLiteral StringLiteral Template PrivateIdentifier :: # IdentifierName IdentifierName :: IdentifierStart IdentifierName IdentifierPart IdentifierStart :: IdentifierStartChar \ UnicodeEscapeSequence IdentifierPart :: IdentifierPartChar \ UnicodeEscapeSequence IdentifierStartChar :: UnicodeIDStart $ _ IdentifierPartChar :: UnicodeIDContinue $ AsciiLetter :: one of a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z UnicodeIDStart :: any Unicode code point with the Unicode property “ID_Start” UnicodeIDContinue :: any Unicode code point with the Unicode property “ID_Continue” ReservedWord :: one of await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield Punctuator :: OptionalChainingPunctuator OtherPunctuator OptionalChainingPunctuator :: ?. [lookahead ∉ DecimalDigit] OtherPunctuator :: one of { ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ?? ? : = += -= *= %= **= <<= >>= >>>= &= |= ^= &&= ||= ??= => DivPunctuator :: / /= RightBracePunctuator :: } NullLiteral :: null BooleanLiteral :: true false NumericLiteralSeparator :: _ NumericLiteral :: DecimalLiteral DecimalBigIntegerLiteral NonDecimalIntegerLiteral[+Sep] NonDecimalIntegerLiteral[+Sep] BigIntLiteralSuffix LegacyOctalIntegerLiteral DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix NonZeroDigit DecimalDigits[+Sep]opt BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits[+Sep] BigIntLiteralSuffix NonDecimalIntegerLiteral[Sep] :: BinaryIntegerLiteral[?Sep] OctalIntegerLiteral[?Sep] HexIntegerLiteral[?Sep] BigIntLiteralSuffix :: n DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits[+Sep]opt ExponentPart[+Sep]opt . DecimalDigits[+Sep] ExponentPart[+Sep]opt DecimalIntegerLiteral ExponentPart[+Sep]opt DecimalIntegerLiteral :: 0 NonZeroDigit NonZeroDigit NumericLiteralSeparatoropt DecimalDigits[+Sep] NonOctalDecimalIntegerLiteral DecimalDigits[Sep] :: DecimalDigit DecimalDigits[?Sep] DecimalDigit [+Sep] DecimalDigits[+Sep] NumericLiteralSeparator DecimalDigit DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9 NonZeroDigit :: one of 1 2 3 4 5 6 7 8 9 ExponentPart[Sep] :: ExponentIndicator SignedInteger[?Sep] ExponentIndicator :: one of e E SignedInteger[Sep] :: DecimalDigits[?Sep] + DecimalDigits[?Sep] - DecimalDigits[?Sep] BinaryIntegerLiteral[Sep] :: 0b BinaryDigits[?Sep] 0B BinaryDigits[?Sep] BinaryDigits[Sep] :: BinaryDigit BinaryDigits[?Sep] BinaryDigit [+Sep] BinaryDigits[+Sep] NumericLiteralSeparator BinaryDigit BinaryDigit :: one of 0 1 OctalIntegerLiteral[Sep] :: 0o OctalDigits[?Sep] 0O OctalDigits[?Sep] OctalDigits[Sep] :: OctalDigit OctalDigits[?Sep] OctalDigit [+Sep] OctalDigits[+Sep] NumericLiteralSeparator OctalDigit LegacyOctalIntegerLiteral :: 0 OctalDigit LegacyOctalIntegerLiteral OctalDigit NonOctalDecimalIntegerLiteral :: 0 NonOctalDigit LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit NonOctalDecimalIntegerLiteral DecimalDigit LegacyOctalLikeDecimalIntegerLiteral :: 0 OctalDigit LegacyOctalLikeDecimalIntegerLiteral OctalDigit OctalDigit :: one of 0 1 2 3 4 5 6 7 NonOctalDigit :: one of 8 9 HexIntegerLiteral[Sep] :: 0x HexDigits[?Sep] 0X HexDigits[?Sep] HexDigits[Sep] :: HexDigit HexDigits[?Sep] HexDigit [+Sep] HexDigits[+Sep] NumericLiteralSeparator HexDigit HexDigit :: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F StringLiteral :: " DoubleStringCharactersopt " ' SingleStringCharactersopt ' DoubleStringCharacters :: DoubleStringCharacter DoubleStringCharactersopt SingleStringCharacters :: SingleStringCharacter SingleStringCharactersopt DoubleStringCharacter :: SourceCharacter but not one of " or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation SingleStringCharacter :: SourceCharacter but not one of ' or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation LineContinuation :: \ LineTerminatorSequence EscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence HexEscapeSequence UnicodeEscapeSequence CharacterEscapeSequence :: SingleEscapeCharacter NonEscapeCharacter SingleEscapeCharacter :: one of ' " \ b f n r t v NonEscapeCharacter :: SourceCharacter but not one of EscapeCharacter or LineTerminator EscapeCharacter :: SingleEscapeCharacter DecimalDigit x u LegacyOctalEscapeSequence :: 0 [lookahead ∈ { 8, 9 }] NonZeroOctalDigit [lookahead ∉ OctalDigit] ZeroToThree OctalDigit [lookahead ∉ OctalDigit] FourToSeven OctalDigit ZeroToThree OctalDigit OctalDigit NonZeroOctalDigit :: OctalDigit but not 0 ZeroToThree :: one of 0 1 2 3 FourToSeven :: one of 4 5 6 7 NonOctalDecimalEscapeSequence :: one of 8 9 HexEscapeSequence :: x HexDigit HexDigit UnicodeEscapeSequence :: u Hex4Digits u{ CodePoint } Hex4Digits :: HexDigit HexDigit HexDigit HexDigit RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags RegularExpressionBody :: RegularExpressionFirstChar RegularExpressionChars RegularExpressionChars :: [empty] RegularExpressionChars RegularExpressionChar RegularExpressionFirstChar :: RegularExpressionNonTerminator but not one of * or \ or / or [ RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionChar :: RegularExpressionNonTerminator but not one of \ or / or [ RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionBackslashSequence :: \ RegularExpressionNonTerminator RegularExpressionNonTerminator :: SourceCharacter but not LineTerminator RegularExpressionClass :: [ RegularExpressionClassChars ] RegularExpressionClassChars :: [empty] RegularExpressionClassChars RegularExpressionClassChar RegularExpressionClassChar :: RegularExpressionNonTerminator but not one of ] or \ RegularExpressionBackslashSequence RegularExpressionFlags :: [empty] RegularExpressionFlags IdentifierPartChar Template :: NoSubstitutionTemplate TemplateHead NoSubstitutionTemplate :: ` TemplateCharactersopt ` TemplateHead :: ` TemplateCharactersopt ${ TemplateSubstitutionTail :: TemplateMiddle TemplateTail TemplateMiddle :: } TemplateCharactersopt ${ TemplateTail :: } TemplateCharactersopt ` TemplateCharacters :: TemplateCharacter TemplateCharactersopt TemplateCharacter :: $ [lookahead ≠ {] \ TemplateEscapeSequence \ NotEscapeSequence LineContinuation LineTerminatorSequence SourceCharacter but not one of ` or \ or $ or LineTerminator TemplateEscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] HexEscapeSequence UnicodeEscapeSequence NotEscapeSequence :: 0 DecimalDigit DecimalDigit but not 0 x [lookahead ∉ HexDigit] x HexDigit [lookahead ∉ HexDigit] u [lookahead ∉ HexDigit] [lookahead ≠ {] u HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit HexDigit [lookahead ∉ HexDigit] u { [lookahead ∉ HexDigit] u { NotCodePoint [lookahead ∉ HexDigit] u { CodePoint [lookahead ∉ HexDigit] [lookahead ≠ }] NotCodePoint :: HexDigits[~Sep] but only if the MV of HexDigits > 0x10FFFF CodePoint :: HexDigits[~Sep] but only if the MV of HexDigits ≤ 0x10FFFF

A.2 式 (Expressions)

IdentifierReference[Yield, Await] : Identifier [~Yield] yield [~Await] await BindingIdentifier[Yield, Await] : Identifier yield await LabelIdentifier[Yield, Await] : Identifier [~Yield] yield [~Await] await Identifier : IdentifierName but not ReservedWord PrimaryExpression[Yield, Await] : this IdentifierReference[?Yield, ?Await] Literal ArrayLiteral[?Yield, ?Await] ObjectLiteral[?Yield, ?Await] FunctionExpression ClassExpression[?Yield, ?Await] GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral[?Yield, ?Await, ~Tagged] CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] : ( Expression[+In, ?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ) ( ) ( ... BindingIdentifier[?Yield, ?Await] ) ( ... BindingPattern[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingIdentifier[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingPattern[?Yield, ?Await] )

次の生成規則のインスタンスを処理する際
PrimaryExpression[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList の解釈は以下の文法で精密化される:

ParenthesizedExpression[Yield, Await] : ( Expression[+In, ?Yield, ?Await] )

 

Literal : NullLiteral BooleanLiteral NumericLiteral StringLiteral ArrayLiteral[Yield, Await] : [ Elisionopt ] [ ElementList[?Yield, ?Await] ] [ ElementList[?Yield, ?Await] , Elisionopt ] ElementList[Yield, Await] : Elisionopt AssignmentExpression[+In, ?Yield, ?Await] Elisionopt SpreadElement[?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt AssignmentExpression[+In, ?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt SpreadElement[?Yield, ?Await] Elision : , Elision , SpreadElement[Yield, Await] : ... AssignmentExpression[+In, ?Yield, ?Await] ObjectLiteral[Yield, Await] : { } { PropertyDefinitionList[?Yield, ?Await] } { PropertyDefinitionList[?Yield, ?Await] , } PropertyDefinitionList[Yield, Await] : PropertyDefinition[?Yield, ?Await] PropertyDefinitionList[?Yield, ?Await] , PropertyDefinition[?Yield, ?Await] PropertyDefinition[Yield, Await] : IdentifierReference[?Yield, ?Await] CoverInitializedName[?Yield, ?Await] PropertyName[?Yield, ?Await] : AssignmentExpression[+In, ?Yield, ?Await] MethodDefinition[?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] PropertyName[Yield, Await] : LiteralPropertyName ComputedPropertyName[?Yield, ?Await] LiteralPropertyName : IdentifierName StringLiteral NumericLiteral ComputedPropertyName[Yield, Await] : [ AssignmentExpression[+In, ?Yield, ?Await] ] CoverInitializedName[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await] Initializer[In, Yield, Await] : = AssignmentExpression[?In, ?Yield, ?Await] TemplateLiteral[Yield, Await, Tagged] : NoSubstitutionTemplate SubstitutionTemplate[?Yield, ?Await, ?Tagged] SubstitutionTemplate[Yield, Await, Tagged] : TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged] TemplateSpans[Yield, Await, Tagged] : TemplateTail TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateTail TemplateMiddleList[Yield, Await, Tagged] : TemplateMiddle Expression[+In, ?Yield, ?Await] TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await] MemberExpression[Yield, Await] : PrimaryExpression[?Yield, ?Await] MemberExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] MemberExpression[?Yield, ?Await] . IdentifierName MemberExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] SuperProperty[?Yield, ?Await] MetaProperty new MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await] MemberExpression[?Yield, ?Await] . PrivateIdentifier SuperProperty[Yield, Await] : super [ Expression[+In, ?Yield, ?Await] ] super . IdentifierName MetaProperty : NewTarget ImportMeta NewTarget : new . target ImportMeta : import . meta NewExpression[Yield, Await] : MemberExpression[?Yield, ?Await] new NewExpression[?Yield, ?Await] CallExpression[Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] SuperCall[?Yield, ?Await] ImportCall[?Yield, ?Await] CallExpression[?Yield, ?Await] Arguments[?Yield, ?Await] CallExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] CallExpression[?Yield, ?Await] . IdentifierName CallExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] CallExpression[?Yield, ?Await] . PrivateIdentifier

次の生成規則のインスタンスを処理する際
CallExpression[Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await]
CoverCallExpressionAndAsyncArrowHead の解釈は以下の文法で精密化される:

CallMemberExpression[Yield, Await] : MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]

 

SuperCall[Yield, Await] : super Arguments[?Yield, ?Await] ImportCall[Yield, Await] : import ( AssignmentExpression[+In, ?Yield, ?Await] ,opt ) import ( AssignmentExpression[+In, ?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ,opt ) Arguments[Yield, Await] : ( ) ( ArgumentList[?Yield, ?Await] ) ( ArgumentList[?Yield, ?Await] , ) ArgumentList[Yield, Await] : AssignmentExpression[+In, ?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , ... AssignmentExpression[+In, ?Yield, ?Await] OptionalExpression[Yield, Await] : MemberExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalChain[Yield, Await] : ?. Arguments[?Yield, ?Await] ?. [ Expression[+In, ?Yield, ?Await] ] ?. IdentifierName ?. TemplateLiteral[?Yield, ?Await, +Tagged] ?. PrivateIdentifier OptionalChain[?Yield, ?Await] Arguments[?Yield, ?Await] OptionalChain[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] OptionalChain[?Yield, ?Await] . IdentifierName OptionalChain[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] OptionalChain[?Yield, ?Await] . PrivateIdentifier LeftHandSideExpression[Yield, Await] : NewExpression[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalExpression[?Yield, ?Await] UpdateExpression[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++ LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] -- ++ UnaryExpression[?Yield, ?Await] -- UnaryExpression[?Yield, ?Await] UnaryExpression[Yield, Await] : UpdateExpression[?Yield, ?Await] delete UnaryExpression[?Yield, ?Await] void UnaryExpression[?Yield, ?Await] typeof UnaryExpression[?Yield, ?Await] + UnaryExpression[?Yield, ?Await] - UnaryExpression[?Yield, ?Await] ~ UnaryExpression[?Yield, ?Await] ! UnaryExpression[?Yield, ?Await] [+Await] AwaitExpression[?Yield] ExponentiationExpression[Yield, Await] : UnaryExpression[?Yield, ?Await] UpdateExpression[?Yield, ?Await] ** ExponentiationExpression[?Yield, ?Await] MultiplicativeExpression[Yield, Await] : ExponentiationExpression[?Yield, ?Await] MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?Yield, ?Await] MultiplicativeOperator : one of * / % AdditiveExpression[Yield, Await] : MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] + MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] - MultiplicativeExpression[?Yield, ?Await] ShiftExpression[Yield, Await] : AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] << AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] >> AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] >>> AdditiveExpression[?Yield, ?Await] RelationalExpression[In, Yield, Await] : ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] < ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] > ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] <= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] >= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] instanceof ShiftExpression[?Yield, ?Await] [+In] RelationalExpression[+In, ?Yield, ?Await] in ShiftExpression[?Yield, ?Await] [+In] PrivateIdentifier in ShiftExpression[?Yield, ?Await] EqualityExpression[In, Yield, Await] : RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] == RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] != RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] === RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] !== RelationalExpression[?In, ?Yield, ?Await] BitwiseANDExpression[In, Yield, Await] : EqualityExpression[?In, ?Yield, ?Await] BitwiseANDExpression[?In, ?Yield, ?Await] & EqualityExpression[?In, ?Yield, ?Await] BitwiseXORExpression[In, Yield, Await] : BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseXORExpression[?In, ?Yield, ?Await] ^ BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseORExpression[In, Yield, Await] : BitwiseXORExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] | BitwiseXORExpression[?In, ?Yield, ?Await] LogicalANDExpression[In, Yield, Await] : BitwiseORExpression[?In, ?Yield, ?Await] LogicalANDExpression[?In, ?Yield, ?Await] && BitwiseORExpression[?In, ?Yield, ?Await] LogicalORExpression[In, Yield, Await] : LogicalANDExpression[?In, ?Yield, ?Await] LogicalORExpression[?In, ?Yield, ?Await] || LogicalANDExpression[?In, ?Yield, ?Await] CoalesceExpression[In, Yield, Await] : CoalesceExpressionHead[?In, ?Yield, ?Await] ?? BitwiseORExpression[?In, ?Yield, ?Await] CoalesceExpressionHead[In, Yield, Await] : CoalesceExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] ShortCircuitExpression[In, Yield, Await] : LogicalORExpression[?In, ?Yield, ?Await] CoalesceExpression[?In, ?Yield, ?Await] ConditionalExpression[In, Yield, Await] : ShortCircuitExpression[?In, ?Yield, ?Await] ShortCircuitExpression[?In, ?Yield, ?Await] ? AssignmentExpression[+In, ?Yield, ?Await] : AssignmentExpression[?In, ?Yield, ?Await] AssignmentExpression[In, Yield, Await] : ConditionalExpression[?In, ?Yield, ?Await] [+Yield] YieldExpression[?In, ?Await] ArrowFunction[?In, ?Yield, ?Await] AsyncArrowFunction[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] AssignmentOperator AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] &&= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ||= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ??= AssignmentExpression[?In, ?Yield, ?Await] AssignmentOperator : one of *= /= %= += -= <<= >>= >>>= &= ^= |= **=

次の生成規則のインスタンスを処理する特定の状況で
AssignmentExpression[In, Yield, Await] : LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await]
LeftHandSideExpression の解釈は以下の文法で精密化される:

AssignmentPattern[Yield, Await] : ObjectAssignmentPattern[?Yield, ?Await] ArrayAssignmentPattern[?Yield, ?Await] ObjectAssignmentPattern[Yield, Await] : { } { AssignmentRestProperty[?Yield, ?Await] } { AssignmentPropertyList[?Yield, ?Await] } { AssignmentPropertyList[?Yield, ?Await] , AssignmentRestProperty[?Yield, ?Await]opt } ArrayAssignmentPattern[Yield, Await] : [ Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] [ AssignmentElementList[?Yield, ?Await] ] [ AssignmentElementList[?Yield, ?Await] , Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] AssignmentRestProperty[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] AssignmentPropertyList[Yield, Await] : AssignmentProperty[?Yield, ?Await] AssignmentPropertyList[?Yield, ?Await] , AssignmentProperty[?Yield, ?Await] AssignmentElementList[Yield, Await] : AssignmentElisionElement[?Yield, ?Await] AssignmentElementList[?Yield, ?Await] , AssignmentElisionElement[?Yield, ?Await] AssignmentElisionElement[Yield, Await] : Elisionopt AssignmentElement[?Yield, ?Await] AssignmentProperty[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt PropertyName[?Yield, ?Await] : AssignmentElement[?Yield, ?Await] AssignmentElement[Yield, Await] : DestructuringAssignmentTarget[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt AssignmentRestElement[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] DestructuringAssignmentTarget[Yield, Await] : LeftHandSideExpression[?Yield, ?Await]

 

Expression[In, Yield, Await] : AssignmentExpression[?In, ?Yield, ?Await] Expression[?In, ?Yield, ?Await] , AssignmentExpression[?In, ?Yield, ?Await]

A.3 文 (Statements)

Statement[Yield, Await, Return] : BlockStatement[?Yield, ?Await, ?Return] VariableStatement[?Yield, ?Await] EmptyStatement ExpressionStatement[?Yield, ?Await] IfStatement[?Yield, ?Await, ?Return] BreakableStatement[?Yield, ?Await, ?Return] ContinueStatement[?Yield, ?Await] BreakStatement[?Yield, ?Await] [+Return] ReturnStatement[?Yield, ?Await] WithStatement[?Yield, ?Await, ?Return] LabelledStatement[?Yield, ?Await, ?Return] ThrowStatement[?Yield, ?Await] TryStatement[?Yield, ?Await, ?Return] DebuggerStatement Declaration[Yield, Await] : HoistableDeclaration[?Yield, ?Await, ~Default] ClassDeclaration[?Yield, ?Await, ~Default] LexicalDeclaration[+In, ?Yield, ?Await] HoistableDeclaration[Yield, Await, Default] : FunctionDeclaration[?Yield, ?Await, ?Default] GeneratorDeclaration[?Yield, ?Await, ?Default] AsyncFunctionDeclaration[?Yield, ?Await, ?Default] AsyncGeneratorDeclaration[?Yield, ?Await, ?Default] BreakableStatement[Yield, Await, Return] : IterationStatement[?Yield, ?Await, ?Return] SwitchStatement[?Yield, ?Await, ?Return] BlockStatement[Yield, Await, Return] : Block[?Yield, ?Await, ?Return] Block[Yield, Await, Return] : { StatementList[?Yield, ?Await, ?Return]opt } StatementList[Yield, Await, Return] : StatementListItem[?Yield, ?Await, ?Return] StatementList[?Yield, ?Await, ?Return] StatementListItem[?Yield, ?Await, ?Return] StatementListItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] Declaration[?Yield, ?Await] LexicalDeclaration[In, Yield, Await] : LetOrConst BindingList[?In, ?Yield, ?Await] ; LetOrConst : let const BindingList[In, Yield, Await] : LexicalBinding[?In, ?Yield, ?Await] BindingList[?In, ?Yield, ?Await] , LexicalBinding[?In, ?Yield, ?Await] LexicalBinding[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await] VariableStatement[Yield, Await] : var VariableDeclarationList[+In, ?Yield, ?Await] ; VariableDeclarationList[In, Yield, Await] : VariableDeclaration[?In, ?Yield, ?Await] VariableDeclarationList[?In, ?Yield, ?Await] , VariableDeclaration[?In, ?Yield, ?Await] VariableDeclaration[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await] BindingPattern[Yield, Await] : ObjectBindingPattern[?Yield, ?Await] ArrayBindingPattern[?Yield, ?Await] ObjectBindingPattern[Yield, Await] : { } { BindingRestProperty[?Yield, ?Await] } { BindingPropertyList[?Yield, ?Await] } { BindingPropertyList[?Yield, ?Await] , BindingRestProperty[?Yield, ?Await]opt } ArrayBindingPattern[Yield, Await] : [ Elisionopt BindingRestElement[?Yield, ?Await]opt ] [ BindingElementList[?Yield, ?Await] ] [ BindingElementList[?Yield, ?Await] , Elisionopt BindingRestElement[?Yield, ?Await]opt ] BindingRestProperty[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] BindingPropertyList[Yield, Await] : BindingProperty[?Yield, ?Await] BindingPropertyList[?Yield, ?Await] , BindingProperty[?Yield, ?Await] BindingElementList[Yield, Await] : BindingElisionElement[?Yield, ?Await] BindingElementList[?Yield, ?Await] , BindingElisionElement[?Yield, ?Await] BindingElisionElement[Yield, Await] : Elisionopt BindingElement[?Yield, ?Await] BindingProperty[Yield, Await] : SingleNameBinding[?Yield, ?Await] PropertyName[?Yield, ?Await] : BindingElement[?Yield, ?Await] BindingElement[Yield, Await] : SingleNameBinding[?Yield, ?Await] BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt SingleNameBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt BindingRestElement[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] ... BindingPattern[?Yield, ?Await] EmptyStatement : ; ExpressionStatement[Yield, Await] : [lookahead ∉ { {, function, async [no LineTerminator here] function, class, let [ }] Expression[+In, ?Yield, ?Await] ; IfStatement[Yield, Await, Return] : if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] else Statement[?Yield, ?Await, ?Return] if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [lookahead ≠ else] IterationStatement[Yield, Await, Return] : DoWhileStatement[?Yield, ?Await, ?Return] WhileStatement[?Yield, ?Await, ?Return] ForStatement[?Yield, ?Await, ?Return] ForInOfStatement[?Yield, ?Await, ?Return] DoWhileStatement[Yield, Await, Return] : do Statement[?Yield, ?Await, ?Return] while ( Expression[+In, ?Yield, ?Await] ) ; WhileStatement[Yield, Await, Return] : while ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] ForStatement[Yield, Await, Return] : for ( [lookahead ≠ let [] Expression[~In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] for ( var VariableDeclarationList[~In, ?Yield, ?Await] ; Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] for ( LexicalDeclaration[~In, ?Yield, ?Await] Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] ForInOfStatement[Yield, Await, Return] : for ( [lookahead ≠ let [] LeftHandSideExpression[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( ForDeclaration[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( [lookahead ∉ { let, async of }] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( ForDeclaration[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( [lookahead ≠ let] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( var ForBinding[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( ForDeclaration[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] ForDeclaration[Yield, Await] : LetOrConst ForBinding[?Yield, ?Await] ForBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] BindingPattern[?Yield, ?Await] ContinueStatement[Yield, Await] : continue ; continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; BreakStatement[Yield, Await] : break ; break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; ReturnStatement[Yield, Await] : return ; return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; WithStatement[Yield, Await, Return] : with ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] SwitchStatement[Yield, Await, Return] : switch ( Expression[+In, ?Yield, ?Await] ) CaseBlock[?Yield, ?Await, ?Return] CaseBlock[Yield, Await, Return] : { CaseClauses[?Yield, ?Await, ?Return]opt } { CaseClauses[?Yield, ?Await, ?Return]opt DefaultClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return]opt } CaseClauses[Yield, Await, Return] : CaseClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return] CaseClause[?Yield, ?Await, ?Return] CaseClause[Yield, Await, Return] : case Expression[+In, ?Yield, ?Await] : StatementList[?Yield, ?Await, ?Return]opt DefaultClause[Yield, Await, Return] : default : StatementList[?Yield, ?Await, ?Return]opt LabelledStatement[Yield, Await, Return] : LabelIdentifier[?Yield, ?Await] : LabelledItem[?Yield, ?Await, ?Return] LabelledItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] FunctionDeclaration[?Yield, ?Await, ~Default] ThrowStatement[Yield, Await] : throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; TryStatement[Yield, Await, Return] : try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] Catch[Yield, Await, Return] : catch ( CatchParameter[?Yield, ?Await] ) Block[?Yield, ?Await, ?Return] catch Block[?Yield, ?Await, ?Return] Finally[Yield, Await, Return] : finally Block[?Yield, ?Await, ?Return] CatchParameter[Yield, Await] : BindingIdentifier[?Yield, ?Await] BindingPattern[?Yield, ?Await] DebuggerStatement : debugger ;

A.4 関数とクラス (Functions and Classes)

UniqueFormalParameters[Yield, Await] : FormalParameters[?Yield, ?Await] FormalParameters[Yield, Await] : [empty] FunctionRestParameter[?Yield, ?Await] FormalParameterList[?Yield, ?Await] FormalParameterList[?Yield, ?Await] , FormalParameterList[?Yield, ?Await] , FunctionRestParameter[?Yield, ?Await] FormalParameterList[Yield, Await] : FormalParameter[?Yield, ?Await] FormalParameterList[?Yield, ?Await] , FormalParameter[?Yield, ?Await] FunctionRestParameter[Yield, Await] : BindingRestElement[?Yield, ?Await] FormalParameter[Yield, Await] : BindingElement[?Yield, ?Await] FunctionDeclaration[Yield, Await, Default] : function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } [+Default] function ( FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } FunctionExpression : function BindingIdentifier[~Yield, ~Await]opt ( FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } FunctionBody[Yield, Await] : FunctionStatementList[?Yield, ?Await] FunctionStatementList[Yield, Await] : StatementList[?Yield, ?Await, +Return]opt ArrowFunction[In, Yield, Await] : ArrowParameters[?Yield, ?Await] [no LineTerminator here] => ConciseBody[?In] ArrowParameters[Yield, Await] : BindingIdentifier[?Yield, ?Await] CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] ConciseBody[In] : [lookahead ≠ {] ExpressionBody[?In, ~Await] { FunctionBody[~Yield, ~Await] } ExpressionBody[In, Await] : AssignmentExpression[?In, ~Yield, ?Await]

次の生成規則のインスタンスを処理する際
ArrowParameters[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList の解釈は以下の文法で精密化される:

ArrowFormalParameters[Yield, Await] : ( UniqueFormalParameters[?Yield, ?Await] )

 

AsyncArrowFunction[In, Yield, Await] : async [no LineTerminator here] AsyncArrowBindingIdentifier[?Yield] [no LineTerminator here] => AsyncConciseBody[?In] CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In] AsyncConciseBody[In] : [lookahead ≠ {] ExpressionBody[?In, +Await] { AsyncFunctionBody } AsyncArrowBindingIdentifier[Yield] : BindingIdentifier[?Yield, +Await] CoverCallExpressionAndAsyncArrowHead[Yield, Await] : MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]

次の生成規則のインスタンスを処理する際
AsyncArrowFunction[In, Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In]
CoverCallExpressionAndAsyncArrowHead の解釈は以下の文法で精密化される:

AsyncArrowHead : async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]

 

MethodDefinition[Yield, Await] : ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } GeneratorMethod[?Yield, ?Await] AsyncMethod[?Yield, ?Await] AsyncGeneratorMethod[?Yield, ?Await] get ClassElementName[?Yield, ?Await] ( ) { FunctionBody[~Yield, ~Await] } set ClassElementName[?Yield, ?Await] ( PropertySetParameterList ) { FunctionBody[~Yield, ~Await] } PropertySetParameterList : FormalParameter[~Yield, ~Await] GeneratorDeclaration[Yield, Await, Default] : function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, ~Await] ) { GeneratorBody } [+Default] function * ( FormalParameters[+Yield, ~Await] ) { GeneratorBody } GeneratorExpression : function * BindingIdentifier[+Yield, ~Await]opt ( FormalParameters[+Yield, ~Await] ) { GeneratorBody } GeneratorMethod[Yield, Await] : * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, ~Await] ) { GeneratorBody } GeneratorBody : FunctionBody[+Yield, ~Await] YieldExpression[In, Await] : yield yield [no LineTerminator here] AssignmentExpression[?In, +Yield, ?Await] yield [no LineTerminator here] * AssignmentExpression[?In, +Yield, ?Await] AsyncGeneratorDeclaration[Yield, Await, Default] : async [no LineTerminator here] function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } [+Default] async [no LineTerminator here] function * ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorExpression : async [no LineTerminator here] function * BindingIdentifier[+Yield, +Await]opt ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorMethod[Yield, Await] : async [no LineTerminator here] * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorBody : FunctionBody[+Yield, +Await] AsyncFunctionDeclaration[Yield, Await, Default] : async [no LineTerminator here] function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } [+Default] async [no LineTerminator here] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionExpression : async [no LineTerminator here] function BindingIdentifier[~Yield, +Await]opt ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncMethod[Yield, Await] : async [no LineTerminator here] ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionBody : FunctionBody[~Yield, +Await] AwaitExpression[Yield] : await UnaryExpression[?Yield, +Await] ClassDeclaration[Yield, Await, Default] : class BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await] [+Default] class ClassTail[?Yield, ?Await] ClassExpression[Yield, Await] : class BindingIdentifier[?Yield, ?Await]opt ClassTail[?Yield, ?Await] ClassTail[Yield, Await] : ClassHeritage[?Yield, ?Await]opt { ClassBody[?Yield, ?Await]opt } ClassHeritage[Yield, Await] : extends LeftHandSideExpression[?Yield, ?Await] ClassBody[Yield, Await] : ClassElementList[?Yield, ?Await] ClassElementList[Yield, Await] : ClassElement[?Yield, ?Await] ClassElementList[?Yield, ?Await] ClassElement[?Yield, ?Await] ClassElement[Yield, Await] : MethodDefinition[?Yield, ?Await] static MethodDefinition[?Yield, ?Await] FieldDefinition[?Yield, ?Await] ; static FieldDefinition[?Yield, ?Await] ; ClassStaticBlock ; FieldDefinition[Yield, Await] : ClassElementName[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt ClassElementName[Yield, Await] : PropertyName[?Yield, ?Await] PrivateIdentifier ClassStaticBlock : static { ClassStaticBlockBody } ClassStaticBlockBody : ClassStaticBlockStatementList ClassStaticBlockStatementList : StatementList[~Yield, +Await, ~Return]opt

A.5 スクリプトとモジュール (Scripts and Modules)

Script : ScriptBodyopt ScriptBody : StatementList[~Yield, ~Await, ~Return] Module : ModuleBodyopt ModuleBody : ModuleItemList ModuleItemList : ModuleItem ModuleItemList ModuleItem ModuleItem : ImportDeclaration ExportDeclaration StatementListItem[~Yield, +Await, ~Return] ModuleExportName : IdentifierName StringLiteral ImportDeclaration : import ImportClause FromClause WithClauseopt ; import ModuleSpecifier WithClauseopt ; ImportClause : ImportedDefaultBinding NameSpaceImport NamedImports ImportedDefaultBinding , NameSpaceImport ImportedDefaultBinding , NamedImports ImportedDefaultBinding : ImportedBinding NameSpaceImport : * as ImportedBinding NamedImports : { } { ImportsList } { ImportsList , } FromClause : from ModuleSpecifier ImportsList : ImportSpecifier ImportsList , ImportSpecifier ImportSpecifier : ImportedBinding ModuleExportName as ImportedBinding ModuleSpecifier : StringLiteral ImportedBinding : BindingIdentifier[~Yield, +Await] WithClause : with { } with { WithEntries ,opt } WithEntries : AttributeKey : StringLiteral AttributeKey : StringLiteral , WithEntries AttributeKey : IdentifierName StringLiteral ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ; export VariableStatement[~Yield, +Await] export Declaration[~Yield, +Await] export default HoistableDeclaration[~Yield, +Await, +Default] export default ClassDeclaration[~Yield, +Await, +Default] export default [lookahead ∉ { function, async [no LineTerminator here] function, class }] AssignmentExpression[+In, ~Yield, +Await] ; ExportFromClause : * * as ModuleExportName NamedExports NamedExports : { } { ExportsList } { ExportsList , } ExportsList : ExportSpecifier ExportsList , ExportSpecifier ExportSpecifier : ModuleExportName ModuleExportName as ModuleExportName

A.6 数値変換 (Number Conversions)

StringNumericLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt StrWhiteSpace ::: StrWhiteSpaceChar StrWhiteSpaceopt StrWhiteSpaceChar ::: WhiteSpace LineTerminator StrNumericLiteral ::: StrDecimalLiteral NonDecimalIntegerLiteral[~Sep] StrDecimalLiteral ::: StrUnsignedDecimalLiteral + StrUnsignedDecimalLiteral - StrUnsignedDecimalLiteral StrUnsignedDecimalLiteral ::: Infinity DecimalDigits[~Sep] . DecimalDigits[~Sep]opt ExponentPart[~Sep]opt . DecimalDigits[~Sep] ExponentPart[~Sep]opt DecimalDigits[~Sep] ExponentPart[~Sep]opt

StringNumericLiteral 文法で明示的に定義されていない文法記号は 数値リテラルの字句文法 で用いられる定義を使用する。

StringIntegerLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrIntegerLiteral StrWhiteSpaceopt StrIntegerLiteral ::: SignedInteger[~Sep] NonDecimalIntegerLiteral[~Sep]

A.7 タイムゾーンオフセット文字列形式 (Time Zone Offset String Format)

UTCOffset ::: ASCIISign Hour ASCIISign Hour HourSubcomponents[+Extended] ASCIISign Hour HourSubcomponents[~Extended] ASCIISign ::: one of + - Hour ::: 0 DecimalDigit 1 DecimalDigit 20 21 22 23 HourSubcomponents[Extended] ::: TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TemporalDecimalFractionopt TimeSeparator[Extended] ::: [+Extended] : [~Extended] [empty] MinuteSecond ::: 0 DecimalDigit 1 DecimalDigit 2 DecimalDigit 3 DecimalDigit 4 DecimalDigit 5 DecimalDigit TemporalDecimalFraction ::: TemporalDecimalSeparator DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator ::: one of . ,

A.8 正規表現 (Regular Expressions)

Pattern[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Disjunction[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] | Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Alternative[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: [empty] Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Term[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Term[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Assertion[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Quantifier Assertion[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: ^ $ \b \B (?= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) Quantifier :: QuantifierPrefix QuantifierPrefix ? QuantifierPrefix :: * + ? { DecimalDigits[~Sep] } { DecimalDigits[~Sep] ,} { DecimalDigits[~Sep] , DecimalDigits[~Sep] } Atom[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: PatternCharacter . \ AtomEscape[?UnicodeMode, ?NamedCaptureGroups] CharacterClass[?UnicodeMode, ?UnicodeSetsMode] ( GroupSpecifier[?UnicodeMode]opt Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers : Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) RegularExpressionModifiers :: [empty] RegularExpressionModifiers RegularExpressionModifier RegularExpressionModifier :: one of i m s SyntaxCharacter :: one of ^ $ \ . * + ? ( ) [ ] { } | PatternCharacter :: SourceCharacter but not SyntaxCharacter AtomEscape[UnicodeMode, NamedCaptureGroups] :: DecimalEscape CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode] [+NamedCaptureGroups] k GroupName[?UnicodeMode] CharacterEscape[UnicodeMode] :: ControlEscape c AsciiLetter 0 [lookahead ∉ DecimalDigit] HexEscapeSequence RegExpUnicodeEscapeSequence[?UnicodeMode] IdentityEscape[?UnicodeMode] ControlEscape :: one of f n r t v GroupSpecifier[UnicodeMode] :: ? GroupName[?UnicodeMode] GroupName[UnicodeMode] :: < RegExpIdentifierName[?UnicodeMode] > RegExpIdentifierName[UnicodeMode] :: RegExpIdentifierStart[?UnicodeMode] RegExpIdentifierName[?UnicodeMode] RegExpIdentifierPart[?UnicodeMode] RegExpIdentifierStart[UnicodeMode] :: IdentifierStartChar \ RegExpUnicodeEscapeSequence[+UnicodeMode] [~UnicodeMode] UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart[UnicodeMode] :: IdentifierPartChar \ RegExpUnicodeEscapeSequence[+UnicodeMode] [~UnicodeMode] UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpUnicodeEscapeSequence[UnicodeMode] :: [+UnicodeMode] u HexLeadSurrogate \u HexTrailSurrogate [+UnicodeMode] u HexLeadSurrogate [+UnicodeMode] u HexTrailSurrogate [+UnicodeMode] u HexNonSurrogate [~UnicodeMode] u Hex4Digits [+UnicodeMode] u{ CodePoint } UnicodeLeadSurrogate :: any Unicode code point in the inclusive interval from U+D800 to U+DBFF UnicodeTrailSurrogate :: any Unicode code point in the inclusive interval from U+DC00 to U+DFFF

選択される関連 u HexLeadSurrogate が曖昧な各 \u HexTrailSurrogate は、他に対応する \u HexTrailSurrogate を持たない最も近い u HexLeadSurrogate に関連付けられなければならない。

 

HexLeadSurrogate :: Hex4Digits but only if the MV of Hex4Digits is in the inclusive interval from 0xD800 to 0xDBFF HexTrailSurrogate :: Hex4Digits but only if the MV of Hex4Digits is in the inclusive interval from 0xDC00 to 0xDFFF HexNonSurrogate :: Hex4Digits but only if the MV of Hex4Digits is not in the inclusive interval from 0xD800 to 0xDFFF IdentityEscape[UnicodeMode] :: [+UnicodeMode] SyntaxCharacter [+UnicodeMode] / [~UnicodeMode] SourceCharacter but not UnicodeIDContinue DecimalEscape :: NonZeroDigit DecimalDigits[~Sep]opt [lookahead ∉ DecimalDigit] CharacterClassEscape[UnicodeMode] :: d D s S w W [+UnicodeMode] p{ UnicodePropertyValueExpression } [+UnicodeMode] P{ UnicodePropertyValueExpression } UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue LoneUnicodePropertyNameOrValue UnicodePropertyName :: UnicodePropertyNameCharacters UnicodePropertyNameCharacters :: UnicodePropertyNameCharacter UnicodePropertyNameCharactersopt UnicodePropertyValue :: UnicodePropertyValueCharacters LoneUnicodePropertyNameOrValue :: UnicodePropertyValueCharacters UnicodePropertyValueCharacters :: UnicodePropertyValueCharacter UnicodePropertyValueCharactersopt UnicodePropertyValueCharacter :: UnicodePropertyNameCharacter DecimalDigit UnicodePropertyNameCharacter :: AsciiLetter _ CharacterClass[UnicodeMode, UnicodeSetsMode] :: [ [lookahead ≠ ^] ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] [^ ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] ClassContents[UnicodeMode, UnicodeSetsMode] :: [empty] [~UnicodeSetsMode] NonemptyClassRanges[?UnicodeMode] [+UnicodeSetsMode] ClassSetExpression NonemptyClassRanges[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtom[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtom[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] NonemptyClassRangesNoDash[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] ClassAtom[UnicodeMode] :: - ClassAtomNoDash[?UnicodeMode] ClassAtomNoDash[UnicodeMode] :: SourceCharacter but not one of \ or ] or - \ ClassEscape[?UnicodeMode] ClassEscape[UnicodeMode] :: b [+UnicodeMode] - CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode] ClassSetExpression :: ClassUnion ClassIntersection ClassSubtraction ClassUnion :: ClassSetRange ClassUnionopt ClassSetOperand ClassUnionopt ClassIntersection :: ClassSetOperand && [lookahead ≠ &] ClassSetOperand ClassIntersection && [lookahead ≠ &] ClassSetOperand ClassSubtraction :: ClassSetOperand -- ClassSetOperand ClassSubtraction -- ClassSetOperand ClassSetRange :: ClassSetCharacter - ClassSetCharacter ClassSetOperand :: NestedClass ClassStringDisjunction ClassSetCharacter NestedClass :: [ [lookahead ≠ ^] ClassContents[+UnicodeMode, +UnicodeSetsMode] ] [^ ClassContents[+UnicodeMode, +UnicodeSetsMode] ] \ CharacterClassEscape[+UnicodeMode] ClassStringDisjunction :: \q{ ClassStringDisjunctionContents } ClassStringDisjunctionContents :: ClassString ClassString | ClassStringDisjunctionContents ClassString :: [empty] NonEmptyClassString NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt ClassSetCharacter :: [lookahead ∉ ClassSetReservedDoublePunctuator] SourceCharacter but not ClassSetSyntaxCharacter \ CharacterEscape[+UnicodeMode] \ ClassSetReservedPunctuator \b ClassSetReservedDoublePunctuator :: one of && !! ## $$ %% ** ++ ,, .. :: ;; << == >> ?? @@ ^^ `` ~~ ClassSetSyntaxCharacter :: one of ( ) [ ] { } / - \ | ClassSetReservedPunctuator :: one of & - ! # % , : ; < = > @ ` ~

Annex B (normative) Web ブラウザ向け追加 ECMAScript 機能

本附属書で定義される ECMAScript 言語の構文および意味論は、ECMAScript ホストが Web ブラウザである場合には必須である。ホストが Web ブラウザでない場合、この附属書の内容は規範的だが任意である。

本附属書で定義される一部の機能は本附属書内に記述され、他の一部は本文(メイン仕様)内に記述される。

ある機能が本文で規定されている場合、その機能が文書に影響する各箇所は彩色されたボックス内の "Normative Optional" という語で示される。さらに、アルゴリズムや早期エラー規則中で特定の文言がその機能に依存する場合、それは「その関連機能を the host supportsホストがサポートする)」という条件でガードされる。Web ブラウザはそのような機能をすべてサポートすることが要求される。

Note

この附属書は各種レガシー機能および Web ブラウザ ECMAScript ホストの特性を記述する。本附属書に規定される言語機能と挙動は一つ以上の望ましくない特性を持ち、レガシー利用が存在しなければ仕様から削除されるものである。しかし多数の既存 Web ページがこれら機能を利用しているため、Web ブラウザは継続的なサポートが必要である。本附属書の規定はこれらレガシー機能の相互運用可能な実装要件を定義する。

これら機能は ECMAScript 言語のコアには含まれないと見なされる。新しい ECMAScript コードを書く際、開発者はこれらの機能や振る舞いの存在を使用・前提とすべきではない。Web ブラウザの一部であるか、Web ブラウザが遭遇する同じレガシー ECMAScript コードを実行する必要がある場合を除き、実装はこれら機能の実装を推奨されない。

B.1 追加構文

B.1.1 HTML 風コメント

12.4 の構文と意味論は、ゴール記号 Module を用いたソーステキスト解析ではこの拡張が許可されないことを除き、以下のように拡張される。

構文

InputElementHashbangOrRegExp :: WhiteSpace LineTerminator Comment CommonToken HashbangComment RegularExpressionLiteral HTMLCloseComment Comment :: MultiLineComment SingleLineComment SingleLineHTMLOpenComment SingleLineHTMLCloseComment SingleLineDelimitedComment MultiLineComment :: /* FirstCommentLineopt LineTerminator MultiLineCommentCharsopt */ HTMLCloseCommentopt FirstCommentLine :: SingleLineDelimitedCommentChars SingleLineHTMLOpenComment :: <!-- SingleLineCommentCharsopt SingleLineHTMLCloseComment :: LineTerminatorSequence HTMLCloseComment SingleLineDelimitedComment :: /* SingleLineDelimitedCommentCharsopt */ HTMLCloseComment :: WhiteSpaceSequenceopt SingleLineDelimitedCommentSequenceopt --> SingleLineCommentCharsopt SingleLineDelimitedCommentChars :: SingleLineNotAsteriskChar SingleLineDelimitedCommentCharsopt * SingleLinePostAsteriskCommentCharsopt SingleLineNotAsteriskChar :: SourceCharacter but not one of * or LineTerminator SingleLinePostAsteriskCommentChars :: SingleLineNotForwardSlashOrAsteriskChar SingleLineDelimitedCommentCharsopt * SingleLinePostAsteriskCommentCharsopt SingleLineNotForwardSlashOrAsteriskChar :: SourceCharacter but not one of / or * or LineTerminator WhiteSpaceSequence :: WhiteSpace WhiteSpaceSequenceopt SingleLineDelimitedCommentSequence :: SingleLineDelimitedComment WhiteSpaceSequenceopt SingleLineDelimitedCommentSequenceopt

LineTerminator のコードポイントを含む MultiLineComment と同様に、SingleLineHTMLCloseComment は構文文法による構文解析上 LineTerminator と見なされる。

B.1.2 正規表現パターン

22.2.1 の構文は以下のように修正・拡張される。これらの変更は文法生成規則の順序および文脈情報で解消される曖昧性を導入する。以下の文法で構文解析する際、各選択肢はそれ以前の生成規則選択肢がマッチしない場合のみ検討される。

この代替パターン文法と意味論は BMP パターンの構文と意味論のみを変更する。以下の文法拡張には [UnicodeMode] パラメータ付き生成規則が含まれる。しかし、これら拡張はゴール記号に [UnicodeMode] パラメータが存在する場合に認識される Unicode パターンの構文を変更しない。

構文

Term[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: [+UnicodeMode] Assertion[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] [+UnicodeMode] Atom[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Quantifier [+UnicodeMode] Atom[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] [~UnicodeMode] QuantifiableAssertion[?NamedCaptureGroups] Quantifier [~UnicodeMode] Assertion[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] [~UnicodeMode] ExtendedAtom[?NamedCaptureGroups] Quantifier [~UnicodeMode] ExtendedAtom[?NamedCaptureGroups] Assertion[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: ^ $ \b \B [+UnicodeMode] (?= Disjunction[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) [+UnicodeMode] (?! Disjunction[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) [~UnicodeMode] QuantifiableAssertion[?NamedCaptureGroups] (?<= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) QuantifiableAssertion[NamedCaptureGroups] :: (?= Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) (?! Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) ExtendedAtom[NamedCaptureGroups] :: . \ AtomEscape[~UnicodeMode, ?NamedCaptureGroups] \ [lookahead = c] CharacterClass[~UnicodeMode, ~UnicodeSetsMode] ( GroupSpecifier[~UnicodeMode]opt Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers : Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) InvalidBracedQuantifier ExtendedPatternCharacter InvalidBracedQuantifier :: { DecimalDigits[~Sep] } { DecimalDigits[~Sep] ,} { DecimalDigits[~Sep] , DecimalDigits[~Sep] } ExtendedPatternCharacter :: SourceCharacter but not one of ^ $ \ . * + ? ( ) [ | AtomEscape[UnicodeMode, NamedCaptureGroups] :: [+UnicodeMode] DecimalEscape [~UnicodeMode] DecimalEscape but only if the CapturingGroupNumber of DecimalEscape is ≤ CountLeftCapturingParensWithin(the Pattern containing DecimalEscape) CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode, ?NamedCaptureGroups] [+NamedCaptureGroups] k GroupName[?UnicodeMode] CharacterEscape[UnicodeMode, NamedCaptureGroups] :: ControlEscape c AsciiLetter 0 [lookahead ∉ DecimalDigit] HexEscapeSequence RegExpUnicodeEscapeSequence[?UnicodeMode] [~UnicodeMode] LegacyOctalEscapeSequence IdentityEscape[?UnicodeMode, ?NamedCaptureGroups] IdentityEscape[UnicodeMode, NamedCaptureGroups] :: [+UnicodeMode] SyntaxCharacter [+UnicodeMode] / [~UnicodeMode] SourceCharacterIdentityEscape[?NamedCaptureGroups] SourceCharacterIdentityEscape[NamedCaptureGroups] :: [~NamedCaptureGroups] SourceCharacter but not c [+NamedCaptureGroups] SourceCharacter but not one of c or k ClassAtomNoDash[UnicodeMode, NamedCaptureGroups] :: SourceCharacter but not one of \ or ] or - \ ClassEscape[?UnicodeMode, ?NamedCaptureGroups] \ [lookahead = c] ClassEscape[UnicodeMode, NamedCaptureGroups] :: b [+UnicodeMode] - [~UnicodeMode] c ClassControlLetter CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode, ?NamedCaptureGroups] ClassControlLetter :: DecimalDigit _ Note

同一の左辺が [+UnicodeMode] と [~UnicodeMode] の両方で現れるのは曖昧性解消の優先度を制御するためである。

B.1.2.1 静的意味論: 早期エラー

22.2.1.1 の意味論は次のように拡張される:

ExtendedAtom :: InvalidBracedQuantifier
  • この生成規則にマッチするソーステキストが存在する場合は Syntax Error である。

さらに、以下の生成規則に対する規則は 強調された 追加文言を含むよう修正される:

NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents
  • 最初の ClassAtom の IsCharacterClass が true または 2 番目の ClassAtom の IsCharacterClass が true かつ本生成規則が [UnicodeMode] パラメータを持つ 場合は Syntax Error。
  • 最初の ClassAtom の IsCharacterClass が false、2 番目の ClassAtom の IsCharacterClass が false で、最初の ClassAtom の CharacterValue が 2 番目より厳密に大きい場合は Syntax Error。
NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents
  • ClassAtomNoDash の IsCharacterClass が true または ClassAtom の IsCharacterClass が true かつ本生成規則が [UnicodeMode] パラメータを持つ 場合は Syntax Error。
  • ClassAtomNoDash の IsCharacterClass が falseClassAtom の IsCharacterClass が false で、ClassAtomNoDash の CharacterValue が ClassAtom の CharacterValue より厳密に大きい場合は Syntax Error。

B.1.2.2 静的意味論: CountLeftCapturingParensWithin / CountLeftCapturingParensBefore

CountLeftCapturingParensWithin および CountLeftCapturingParensBefore の定義において “ Atom :: ( GroupSpecifieropt Disjunction ) ” という参照は “ Atom :: ( GroupSpecifieropt Disjunction ) ” または “ ExtendedAtom :: ( GroupSpecifieropt Disjunction ) ” を意味するものとして解釈する。

B.1.2.3 静的意味論: IsCharacterClass

22.2.1.6 の意味論は以下のように拡張される:

ClassAtomNoDash :: \ [lookahead = c]
  1. false を返す。

B.1.2.4 静的意味論: CharacterValue

22.2.1.7 の意味論は以下のように拡張される:

ClassAtomNoDash :: \ [lookahead = c]
  1. U+005C (REVERSE SOLIDUS) の数値値を返す。
ClassEscape :: c ClassControlLetter
  1. chClassControlLetter にマッチしたコードポイントとする。
  2. ich の数値値とする。
  3. i を 32 で割った余りを返す。
CharacterEscape :: LegacyOctalEscapeSequence
  1. LegacyOctalEscapeSequence の MV を返す (12.9.4.3 を参照)。

B.1.2.5 実行時意味論: CompileSubpattern

CompileSubpattern の意味論は以下のように拡張される:

Term :: QuantifiableAssertion Quantifier の規則は Term :: Atom Quantifier の規則と同一だが AtomQuantifiableAssertion に置き換える。

Term :: ExtendedAtom Quantifier の規則は Term :: Atom Quantifier の規則と同一だが AtomExtendedAtom に置き換える。

Term :: ExtendedAtom の規則は Term :: Atom の規則と同一だが AtomExtendedAtom に置き換える。

B.1.2.6 実行時意味論: CompileAssertion

Assertion :: (?= Disjunction ) および Assertion :: (?! Disjunction ) の CompileAssertion 規則は QuantifiableAssertion 生成規則にも用いられるが、AssertionQuantifiableAssertion に置き換える。

B.1.2.7 実行時意味論: CompileAtom

Atom 生成規則( Atom :: PatternCharacter を除く)に対する CompileAtom 規則は ExtendedAtom 生成規則にも用いられ、AtomExtendedAtom に置き換える。さらに parameter direction を伴う以下の規則が追加される:

ExtendedAtom :: \ [lookahead = c]
  1. A を単一文字 \ U+005C (REVERSE SOLIDUS) を含む CharSet とする。
  2. CharacterSetMatcher(rer, A, false, direction) を返す。
ExtendedAtom :: ExtendedPatternCharacter
  1. chExtendedPatternCharacter により表される文字とする。
  2. A を文字 ch を 1 要素として含む CharSet とする。
  3. CharacterSetMatcher(rer, A, false, direction) を返す。

B.1.2.8 実行時意味論: CompileToCharSet

22.2.2.9 の意味論は以下のように拡張される:

次の 2 つの規則は CompileToCharSet の対応する規則を置き換える。

NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents
  1. A を第 1 の ClassAtom に対し引数 rer で CompileToCharSet を適用した結果とする。
  2. B を第 2 の ClassAtom に対し引数 rer で CompileToCharSet を適用した結果とする。
  3. CClassContents に対し引数 rer で CompileToCharSet を適用した結果とする。
  4. DCharacterRangeOrUnion(rer, A, B) とする。
  5. DC の和集合を返す。
NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents
  1. AClassAtomNoDash に対し引数 rer で CompileToCharSet を適用した結果とする。
  2. BClassAtom に対し引数 rer で CompileToCharSet を適用した結果とする。
  3. CClassContents に対し引数 rer で CompileToCharSet を適用した結果とする。
  4. DCharacterRangeOrUnion(rer, A, B) とする。
  5. DC の和集合を返す。

加えて、以下の規則が CompileToCharSet に追加される。

ClassEscape :: c ClassControlLetter
  1. cv をこの ClassEscape の CharacterValue とする。
  2. c を文字値が cv の文字とする。
  3. 文字 c を単一要素として含む CharSet を返す。
ClassAtomNoDash :: \ [lookahead = c]
  1. 単一文字 \ U+005C (REVERSE SOLIDUS) を含む CharSet を返す。
Note
この生成規則は、受容可能な制御文字が続かない文字クラス内部のシーケンス \c からのみ到達し得る。

B.1.2.8.1 CharacterRangeOrUnion ( rer, A, B )

The abstract operation CharacterRangeOrUnion takes arguments rer (a RegExp Record), A (a CharSet), and B (a CharSet) and returns a CharSet. It performs the following steps when called:

  1. HasEitherUnicodeFlag(rer) が false なら
    1. もし A がちょうど 1 文字を含むわけではない、または B がちょうど 1 文字を含むわけではないなら
      1. C を単一文字 - U+002D (HYPHEN-MINUS) を含む CharSet とする。
      2. CharSet A, B, C の和集合を返す。
  2. CharacterRange(A, B) を返す。

B.1.2.9 静的意味論: ParsePattern ( patternText, u, v )

22.2.3.4 の意味論は以下のように拡張される:

抽象操作 ParsePattern は引数 patternText(Unicode コードポイント列)、u(Boolean)、v(Boolean)を取り、呼び出し時に次を行う:

  1. もし vtrue かつ utrue なら
    1. parseResult を 1 個以上の SyntaxError オブジェクトを含む List とする。
  2. それ以外で vtrue なら
    1. parseResult を ParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups]) とする。
  3. それ以外で utrue なら
    1. parseResult を ParseText(patternText, Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups]) とする。
  4. それ以外
    1. parseResult を ParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, ~NamedCaptureGroups]) とする。
    2. もし parseResult が Parse Node でかつ GroupName を含むなら
      1. parseResult を ParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups]) に設定する。
  5. parseResult を返す。

B.2 追加の組込みプロパティ

ECMAScript ホストが Web ブラウザである場合、標準組込みオブジェクトに以下の追加プロパティが定義される。

B.2.1 グローバルオブジェクトの追加プロパティ

Table 100 の項目が Table 6 に追加される。

Table 100: Additional Well-known Intrinsic Objects
Intrinsic Name Global Name ECMAScript Language Association
%escape% escape escape 関数 (B.2.1.1)
%unescape% unescape unescape 関数 (B.2.1.2)

B.2.1.1 escape ( string )

この関数はグローバルオブジェクトのプロパティである。特定のコードユニットを 16 進エスケープシーケンスに置換した新しい String 値を生成する。

数値値が 0x00FF 以下のコードユニットを置換する際は %xx 形式の 2 桁エスケープシーケンスを用いる。数値値が 0x00FF を超えるコードユニットを置換する際は %uxxxx 形式の 4 桁エスケープシーケンスを用いる。

これは %escape% イントリンシックオブジェクトである。

呼び出し時、次の手順を実行する:

  1. string を ? ToString(string) に設定する。
  2. lenstring の長さとする。
  3. R を空文字列とする。
  4. unescapedSet を ASCII の単語構成文字と "@*+-./"文字列連結とする。
  5. k を 0 とする。
  6. 繰り返し (k < len の間):
    1. Cstring 内インデックス k のコードユニットとする。
    2. もし unescapedSetC を含むなら
      1. SC とする。
    3. それ以外
      1. nC の数値値とする。
      2. もし n < 256 なら
        1. hexn の大文字 16 進表現とする。
        2. S"%"StringPad(hex, 2, "0", start) の連結とする。
      3. それ以外
        1. hexn の大文字 16 進表現とする。
        2. S"%u"StringPad(hex, 4, "0", start) の連結とする。
    4. RRS の連結に設定する。
    5. kk + 1 に設定する。
  7. R を返す。
Note

このエンコーディングは部分的に RFC 1738 に記述されたエンコーディングに基づくが、本標準で規定されるエンコーディング全体は RFC 1738 の内容を参照せず上記で完結している。このエンコーディングは RFC 3986 による RFC 1738 への変更を反映しない。

B.2.1.2 unescape ( string )

この関数はグローバルオブジェクトのプロパティである。escape 関数によって導入され得る種類の各エスケープシーケンスを、その表すコードユニットへ置換した新しい String 値を生成する。

これは %unescape% イントリンシックオブジェクトである。

呼び出し時、次の手順を実行する:

  1. string を ? ToString(string) に設定する。
  2. lenstring の長さとする。
  3. R を空文字列とする。
  4. k を 0 とする。
  5. 繰り返し (k < len の間):
    1. Cstring 内インデックス k のコードユニットとする。
    2. もし C がコードユニット 0x0025 (PERCENT SIGN) なら
      1. hexDigits を空文字列とする。
      2. optionalAdvance を 0 とする。
      3. もし k + 5 < len かつ string のインデックス k + 1 のコードユニットが 0x0075 (LATIN SMALL LETTER U) なら
        1. hexDigitsstringk + 2 から k + 6 までの部分文字列とする。
        2. optionalAdvance を 5 に設定する。
      4. それ以外で k + 3 ≤ len なら
        1. hexDigitsstringk + 1 から k + 3 までの部分文字列とする。
        2. optionalAdvance を 2 に設定する。
      5. parseResult を ParseText(hexDigits, HexDigits[~Sep]) とする。
      6. もし parseResult が Parse Node なら
        1. nparseResult の MV とする。
        2. C を数値値 n のコードユニットとする。
        3. kk + optionalAdvance に設定する。
    3. RRC の連結に設定する。
    4. kk + 1 に設定する。
  6. R を返す。

B.2.2 String.prototype オブジェクトの追加プロパティ

B.2.2.1 String.prototype.substr ( start, length )

このメソッドは this 値を String に変換した結果の substring を返す。開始インデックス start から length 個のコードユニット(lengthundefined の場合末尾まで)を含む。start が負なら sourceLength を文字列長として sourceLength + start として扱う。結果は String 値であり String オブジェクトではない。

呼び出し時、次を行う:

  1. Othis 値とする。
  2. RequireObjectCoercible(O) を実行する。
  3. S を ? ToString(O) とする。
  4. sizeS の長さとする。
  5. intStart を ? ToIntegerOrInfinity(start) とする。
  6. もし intStart = -∞ なら intStart を 0 に設定する。
  7. それ以外で intStart < 0 なら intStartmax(size + intStart, 0) に設定する。
  8. それ以外は intStartmin(intStart, size) に設定する。
  9. もし lengthundefined なら intLengthsize とする;そうでなければ intLength を ? ToIntegerOrInfinity(length) とする。
  10. intLength を 0 と size の間にクランプした結果に設定する。
  11. intEndmin(intStart + intLength, size) とする。
  12. SintStart から intEnd までの substring を返す。
Note

このメソッドは意図的にジェネリックであり、this 値が String オブジェクトであることを要求しない。他オブジェクトへメソッドとして移して使用できる。

B.2.2.2 String.prototype.anchor ( name )

呼び出し時、次を行う:

  1. Sthis 値とする。
  2. CreateHTML(S, "a", "name", name) を返す。

B.2.2.2.1 CreateHTML ( string, tag, attribute, value )

The abstract operation CreateHTML takes arguments string (an ECMAScript language value), tag (a String), attribute (a String), and value (an ECMAScript language value) and returns 正常完了で String を含むか、または throw completion. It performs the following steps when called:

  1. RequireObjectCoercible(string) を実行する。
  2. S を ? ToString(string) とする。
  3. p1"<"tag の連結とする。
  4. もし attribute が空文字列でなければ
    1. V を ? ToString(value) とする。
    2. escapedVV 内の各 0x0022 (QUOTATION MARK) を 6 コードユニット列 "&quot;" に置換した文字列値とする。
    3. p1 を以下の連結とする:
      • p1
      • 0x0020 (SPACE)
      • attribute
      • 0x003D (EQUALS SIGN)
      • 0x0022 (QUOTATION MARK)
      • escapedV
      • 0x0022 (QUOTATION MARK)
  5. p2p1">" の連結とする。
  6. p3p2S の連結とする。
  7. p4p3, "</", tag, ">" の連結とする。
  8. p4 を返す。

B.2.2.3 String.prototype.big ( )

呼び出し時、次を行う:

  1. Sthis 値とする。
  2. CreateHTML(S, "big", "", "") を返す。

B.2.2.4 String.prototype.blink ( )

呼び出し時、次を行う:

  1. Sthis 値とする。
  2. CreateHTML(S, "blink", "", "") を返す。

B.2.2.5 String.prototype.bold ( )

呼び出し時、次を行う:

  1. Sthis 値とする。
  2. CreateHTML(S, "b", "", "") を返す。

B.2.2.6 String.prototype.fixed ( )

呼び出し時、次を行う:

  1. Sthis 値とする。
  2. CreateHTML(S, "tt", "", "") を返す。

B.2.2.7 String.prototype.fontcolor ( colour )

呼び出し時、次を行う:

  1. Sthis 値とする。
  2. CreateHTML(S, "font", "color", colour) を返す。

B.2.2.8 String.prototype.fontsize ( size )

呼び出し時、次を行う:

  1. Sthis 値とする。
  2. CreateHTML(S, "font", "size", size) を返す。

B.2.2.9 String.prototype.italics ( )

呼び出し時、次を行う:

  1. Sthis 値とする。
  2. CreateHTML(S, "i", "", "") を返す。

B.2.2.10 String.prototype.link ( url )

呼び出し時、次を行う:

  1. Sthis 値とする。
  2. CreateHTML(S, "a", "href", url) を返す。

B.2.2.11 String.prototype.small ( )

呼び出し時、次を行う:

  1. Sthis 値とする。
  2. CreateHTML(S, "small", "", "") を返す。

B.2.2.12 String.prototype.strike ( )

呼び出し時、次を行う:

  1. Sthis 値とする。
  2. CreateHTML(S, "strike", "", "") を返す。

B.2.2.13 String.prototype.sub ( )

呼び出し時、次を行う:

  1. Sthis 値とする。
  2. CreateHTML(S, "sub", "", "") を返す。

B.2.2.14 String.prototype.sup ( )

呼び出し時、次を行う:

  1. Sthis 値とする。
  2. CreateHTML(S, "sup", "", "") を返す。

B.2.2.15 String.prototype.trimLeft ( )

Note

"trimStart" プロパティが推奨される。"trimLeft" は主として古いコードとの互換性のために提供される。新しい ECMAScript コードでは "trimStart" の使用が推奨される。

"trimLeft" プロパティの初期値は 22.1.3.34 で定義される %String.prototype.trimStart% である。

B.2.2.16 String.prototype.trimRight ( )

Note

"trimEnd" プロパティが推奨される。"trimRight" は主として古いコードとの互換性のために提供される。新しい ECMAScript コードでは "trimEnd" の使用が推奨される。

"trimRight" プロパティの初期値は 22.1.3.33 で定義される %String.prototype.trimEnd% である。

B.2.3 Date.prototype オブジェクトの追加プロパティ

B.2.3.1 Date.prototype.getYear ( )

Note

“2000 年問題” を回避できるため、ほぼ全ての目的で getFullYear メソッドが推奨される。

このメソッドは呼び出し時に次を行う:

  1. dateObjectthis 値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. もし tNaN なら NaN を返す。
  5. YearFromTime(LocalTime(t)) - 1900𝔽 を返す。

B.2.3.2 Date.prototype.setYear ( year )

Note

“2000 年問題” を回避できるため、ほぼ全ての目的で setFullYear メソッドが推奨される。

このメソッドは呼び出し時に次を行う:

  1. dateObjectthis 値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. y を ? ToNumber(year) とする。
  5. もし tNaN なら t+0𝔽 に、そうでなければ tLocalTime(t) に設定する。
  6. yyyyMakeFullYear(y) とする。
  7. dMakeDay(yyyy, MonthFromTime(t), DateFromTime(t)) とする。
  8. dateMakeDate(d, TimeWithinDay(t)) とする。
  9. uTimeClip(UTC(date)) とする。
  10. dateObject.[[DateValue]]u に設定する。
  11. u を返す。

B.2.3.3 Date.prototype.toGMTString ( )

Note

toUTCString メソッドが推奨される。このメソッドは主として古いコードとの互換性のために提供される。

"toGMTString" プロパティの初期値は 21.4.4.43 で定義される %Date.prototype.toUTCString% である。

B.2.4 RegExp.prototype オブジェクトの追加プロパティ

B.2.4.1 RegExp.prototype.compile ( pattern, flags )

このメソッドは呼び出し時に次を行う:

  1. Othis 値とする。
  2. RequireInternalSlot(O, [[RegExpMatcher]]) を実行する。
  3. もし pattern が Object で [[RegExpMatcher]] 内部スロットを持つなら
    1. もし flagsundefined でなければ TypeError 例外を投げる。
    2. Ppattern.[[OriginalSource]] とする。
    3. Fpattern.[[OriginalFlags]] とする。
  4. それ以外
    1. Ppattern とする。
    2. Fflags とする。
  5. RegExpInitialize(O, P, F) を返す。
Note

このメソッドは this の RegExp を新しいパターンとフラグで完全に再初期化する。実装はこのメソッドの使用を、結果の RegExp オブジェクトが複数回使用され最適化候補であるという表明として解釈し得る。

B.3 その他の追加機能

B.3.1 ラベル付き Function 宣言

ECMAScript 2015 以前、LabelledStatement の仕様は FunctionDeclaration にステートメントラベルを関連付けることを許可していなかった。しかし非 strict コード向けの拡張として許容され、多くのブラウザホスト実装はそれをサポートしていた。ECMAScript 2015 以降、LabelledStatement の文法生成規則は FunctionDeclarationLabelledItem として許容するが、14.13.1早期エラー規則がそれを Syntax Error とする。その規則はホストがこの機能をサポートする場合、非 strict コードで Syntax Error を抑制するよう修正される。

Note

WithStatement, IfStatement, IterationStatement早期エラー規則は非 strict コード内でこれらのステートメントがラベル付き FunctionDeclaration を含むことを防ぐ。

B.3.2 ブロックレベル Function 宣言 (Web レガシー互換意味論)

ECMAScript 2015 以前、Block ステートメントの StatementList 要素として FunctionDeclaration が出現することは ECMAScript 仕様で定義されていなかった。しかしその形式は拡張として許容され、多くのブラウザ実装で許可されていた。不幸にも実装間で意味論が異なる。これらの差異のため、Block レベルの function 宣言を用いる既存 Web ソースは、全ブラウザ実装の意味論的交差に依存する場合のみ移植性がある。以下はその交差意味論に属するユースケースである:

  1. 関数が宣言され単一のブロック内でのみ参照される。

  2. 関数が 1 つの Block 内で宣言され(必要なら使用される)さらに同一 Block 外の内側関数定義から参照される。

    • 識別子 fBindingIdentifier とする 1 つ以上の FunctionDeclaration が外側関数 g の関数コード内の Block にネストして現れる。
    • g の関数コード内に var 以外の f の他の宣言が存在しない。
    • fIdentifierReference 出現が宣言を含む BlockStatementList 内に存在してもよい。
    • g 内にネストした別の関数 h 内に fIdentifierReference 出現が少なくとも 1 つ存在し、h 内からの参照を隠す f の他の宣言がない。
    • h の呼び出しは f の宣言が評価された後にのみ起こる。
  3. 関数が 1 つのブロック内で宣言され(必要なら使用され)さらに後続のブロック内で参照される。

最初のユースケースは ECMAScript 2015 が提供する Block レベル function 宣言の意味論と相互運用可能である。このユースケースを用いる既存のソースは 101415 で定義される意味論を用いて動作する。

2 番目と 3 番目のユースケースの ECMAScript 2015 相互運用性には、101519.2.116.1.7 節の意味論への以下の拡張が必要である。

実装が診断警告メッセージを報告する仕組みを持つ場合、この互換意味論が適用され非互換意味論との差異が観測可能となる FunctionDeclaration を含むコードに対して警告を出すべきである。例えば var バインディングの導入が早期エラーを生むために導入されない場合は警告を出すべきでない。

この機能は次の箇所で特別な意味論を伴う:

B.3.3 IfStatement の節内 FunctionDeclarations

以下は 14.6IfStatement 生成規則を拡張する:

IfStatement[Yield, Await, Return] : if ( Expression[+In, ?Yield, ?Await] ) FunctionDeclaration[?Yield, ?Await, ~Default] else Statement[?Yield, ?Await, ?Return] if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] else FunctionDeclaration[?Yield, ?Await, ~Default] if ( Expression[+In, ?Yield, ?Await] ) FunctionDeclaration[?Yield, ?Await, ~Default] else FunctionDeclaration[?Yield, ?Await, ~Default] if ( Expression[+In, ?Yield, ?Await] ) FunctionDeclaration[?Yield, ?Await, ~Default] [lookahead ≠ else]

この生成規則は非 strict コードを解析する場合にのみ適用される。この生成規則にマッチするソーステキストは、各 FunctionDeclaration[?Yield, ?Await, ~Default] の一致がその位置に 1 つの BlockStatement の唯一の StatementListItem として存在するかのように処理される。その合成 BlockStatement の意味論は B.3.2 で指定される Web レガシー互換意味論を含む。

B.3.4 Catch ブロック内の VariableStatements

この機能では、Catch 節の BlockCatchParameter によってもバインドされる名前を var 宣言でバインドできる。これは 14.15.1 Catch : catch ( CatchParameter ) Block 早期エラー規則を修正することで達成する。

Note

実行時にはそのようなバインディングは VariableDeclarationEnvironment にインスタンス化される。同名の CatchParameter によって導入されたバインディングをシャドウせず、そのような var 宣言の Initializer は catch パラメータに代入する。

この変更は Catch 節の Block 内に含まれる direct eval 呼び出しによって導入される var および function 宣言にも適用される。この変更は EvalDeclarationInstantiation3.d.i.2.a.i および 13.b.ii.4.a.i.i ステップを修正することで行う。

B.3.5 ForIn 文ヘッドの Initializer

以下は 14.7.5 における ForInOfStatement 生成規則を拡張する:

ForInOfStatement[Yield, Await, Return] : for ( var BindingIdentifier[?Yield, ?Await] Initializer[~In, ?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return]

この生成規則は非 strict コードを解析する場合にのみ適用される。

8.3.1 の ContainsDuplicateLabels の静的意味論は以下で拡張される:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. Statement の ContainsDuplicateLabels を引数 labelSet で返す。

8.3.2 の ContainsUndefinedBreakTarget の静的意味論は以下で拡張される:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. Statement の ContainsUndefinedBreakTarget を引数 labelSet で返す。

8.3.3 の ContainsUndefinedContinueTarget の静的意味論は以下で拡張される:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. Statement の ContainsUndefinedContinueTarget を引数 iterationSet と « » で返す。

14.7.5.2 の IsDestructuring の静的意味論は以下で拡張される:

BindingIdentifier : Identifier yield await
  1. false を返す。

8.2.6 の VarDeclaredNames の静的意味論は以下で拡張される:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. names1BindingIdentifier の BoundNames とする。
  2. names2Statement の VarDeclaredNames とする。
  3. names1names2リスト結合を返す。

8.2.7 の VarScopedDeclarations の静的意味論は以下で拡張される:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. declarations1 を « BindingIdentifier » とする。
  2. declarations2Statement の VarScopedDeclarations とする。
  3. declarations1declarations2リスト結合を返す。

14.7.5.5 の ForInOfLoopEvaluation の実行時意味論は以下で拡張される:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. bindingIdBindingIdentifier の StringValue とする。
  2. lhs を ? ResolveBinding(bindingId) とする。
  3. もし IsAnonymousFunctionDefinition(Initializer) が true なら
    1. value を ? NamedEvaluation(Initializer, 引数 bindingId) とする。
  4. それ以外
    1. rhs を ? Evaluation(Initializer) とする。
    2. value を ? GetValue(rhs) とする。
  5. PutValue(lhs, value) を実行する。
  6. keyResult を ? ForIn/OfHeadEvaluation(« », Expression, enumerate) とする。
  7. ForIn/OfBodyEvaluation(BindingIdentifier, Statement, keyResult, enumerate, var-binding, labelSet) を返す。

B.3.6 [[IsHTMLDDA]] 内部スロット

ホスト定義オブジェクトに [[IsHTMLDDA]] internal slot が存在する場合がある。この内部スロットを持つオブジェクトは ToBoolean 抽象操作および IsLooselyEqual 抽象操作、ならびに typeof 演算子 の被演算子として使用されると undefined のように振る舞う。

Note

[[IsHTMLDDA]] 内部スロットを持つオブジェクトは本仕様によって生成されない。ただし Web 互換性のために存在するブラウザの document.all オブジェクト はこのスロットを持つホスト定義エキゾチックオブジェクトである。この種の他の例は知られておらず、実装は document.all を例外として新たに作成すべきでない。

この機能は次の箇所で特別な意味論を伴う:

B.3.7 HostMakeJobCallback における非デフォルト挙動

HostMakeJobCallback 抽象操作は Web ブラウザであるホストが非デフォルト挙動を指定することを許可する。

B.3.8 HostEnsureCanAddPrivateElement における非デフォルト挙動

HostEnsureCanAddPrivateElement 抽象操作は Web ブラウザであるホストが非デフォルト挙動を指定することを許可する。

B.3.9 関数呼び出し代入ターゲットの実行時エラー

非 strict コードで関数呼び出し (13.3.6) が代入ターゲットとして用いられる場合、早期エラーを生成する代わりに、代入の評価中に ReferenceError がスローされる。

Note

代入ターゲットが AssignmentExpressionLeftHandSideExpression である場合、代入演算子は =AssignmentOperator でなければならず、論理代入演算子 (??=, &&=, ||=) には適用されない。

CallExpression : CoverCallExpressionAndAsyncArrowHead および CallExpression : CallExpression Arguments に関する AssignmentTargetType の 1 ステップを参照。

Annex C (informative) ECMAScript の Strict Mode

Strict mode の制約と例外

Annex D (informative) ホストのレイヤリングポイント

ホストの定義については 4.2 を参照。

D.1 ホストフック

HostCallJobCallback(...)

HostEnqueueFinalizationRegistryCleanupJob(...)

HostEnqueueGenericJob(...)

HostEnqueuePromiseJob(...)

HostEnqueueTimeoutJob(...)

HostEnsureCanCompileStrings(...)

HostFinalizeImportMeta(...)

HostGetImportMetaProperties(...)

HostGrowSharedArrayBuffer(...)

HostHasSourceTextAvailable(...)

HostLoadImportedModule(...)

HostGetSupportedImportAttributes(...)

HostMakeJobCallback(...)

HostPromiseRejectionTracker(...)

HostResizeArrayBuffer(...)

InitializeHostDefinedRealm(...)

D.2 ホスト定義フィールド

Realm Record[[HostDefined]]: Table 22 を参照。

Script Record[[HostDefined]]: Table 37 を参照。

Module Record[[HostDefined]]: Table 41 を参照。

JobCallback Record[[HostDefined]]: Table 26 を参照。

Candidate Executions の [[HostSynchronizesWith]]: Table 99 を参照。

[[IsHTMLDDA]]: B.3.6 を参照。

D.3 ホスト定義オブジェクト

グローバルオブジェクト: 19 節を参照。

D.4 ジョブの実行

Job 抽象クロージャ呼び出しの前の準備ステップおよび後のクリーンアップステップ。9.5 を参照。

D.5 エキゾチックオブジェクトの内部メソッド

本仕様内で明示的に規定されていないエキゾチックオブジェクトに対する Table 4 の必須内部メソッドのいずれか。

D.6 組込みオブジェクトとメソッド

17.1 で制限される場合を除き、本仕様で定義されていない組込みオブジェクトおよびメソッド。

Annex E (informative) ECMAScript 2015 における修正と明確化(互換性へ影響し得るもの)

9.1.1.4.14-9.1.1.4.17: 第 5 / 5.1 版では新しいグローバル宣言に対応するグローバルオブジェクトプロパティが既に存在するかをプロパティ存在テストで判定していた。ECMAScript 2015 では独自 (own) プロパティ存在テストを使用する。これは多くの Web ブラウザ実装で一般的な挙動に対応する。

10.4.2.1: 第 5 版は配列インデックスまたは新しい長さ値の整数変換前に現在の配列長を捕捉するよう移動した。しかし変換過程が配列長を変化させ得る副作用を持つ場合、その捕捉値は無効になり得た。ECMAScript 2015 はそのような副作用が起こり得た後で現在の配列長を捕捉しなければならないと規定する。

21.4.1.31: 以前の版では TimeClip 抽象操作は 0 時刻を +0𝔽-0𝔽 いずれかで表現してよかった。ECMAScript 2015 は常に +0𝔽 を返すと規定する。つまり Date の時刻値が観測可能に -0𝔽 となることはなく、時刻値を返すメソッドも -0𝔽 を返さない。

21.4.1.32: UTC オフセット表現が存在しない場合、ローカルタイムゾーンが使用される。第 5.1 版は誤って欠如するタイムゾーンを "z" と解釈すべきと述べていた。

21.4.4.36: 年が 21.4.1.32 で規定される Date Time String Format で表現できない場合 RangeError 例外を投げる。以前の版はそのケースを規定していなかった。

21.4.4.41: 以前の版は time value が NaN のとき Date.prototype.toString が返す値を規定していなかった。ECMAScript 2015 は結果を文字列 "Invalid Date" と規定する。

22.2.4.1, 22.2.6.13.1: RegExp インスタンスの "source" プロパティ値内の LineTerminator コードポイントはエスケープシーケンスで表現されなければならない。第 5.1 版は / のエスケープのみ要求していた。

22.2.6.8, 22.2.6.11: 以前の版で String.prototype.matchString.prototype.replace の仕様は global フラグを持つ RegExp 値をパターン引数にした場合の挙動が不正確であった。以前の仕様は各マッチ試行で lastIndex が変化しなければ 1 増やすべきと述べたが、正しい挙動は空文字列にマッチした場合のみ 1 増やすことである。

23.1.3.30: 以前の版は _comparator_NaN を返した場合の Array.prototype.sort の解釈を規定していなかった。ECMAScript 2015 はその値を +0𝔽 が返されたかのように扱うと規定する。また 2015 版は _comparator_ の結果に ToNumber を適用する。以前は Number でない結果の効果は実装依存であり、実際には実装は ToNumber を呼び出していた。

Annex F (informative) 従来版との非互換を導入する追加および変更

6.2.5: ECMAScript 2015 では関数呼び出しは Reference Record を返すことができない。

7.1.4.1: ECMAScript 2015 では String 値への ToNumberBinaryIntegerLiteralOctalIntegerLiteral の数値文字列を認識して変換する。以前はそれらは NaN へ変換されていた。

9.3: ECMAScript 2018 ではテンプレートオブジェクトは以前のように Realm 内の全出現横断ではなく Parse Node(ソース位置)に基づき正規化される。

12.2: ECMAScript 2016 では Unicode 8.0.0 以上が必須になり、2015 版の Unicode 5.1 必須から変更された。特に U+180E MONGOLIAN VOWEL SEPARATOR は Space_Separator (Zs) から Format (Cf) へ移動(Unicode 6.3.0)し、空白としての扱いが変化した。これは空白に敏感なメソッドの挙動差異を生む。例えば以前は "\u180E".trim().length0 だが 2016 以降は 1。さらに ECMAScript 2017 は常に Unicode 最新版を使用することを義務付けた。

12.7: ECMAScript 2015 では IdentifierName の有効コードポイントを Unicode プロパティ “ID_Start” と “ID_Continue” で規定。以前は様々な Unicode カテゴリ列挙で規定されていた。

12.10.1: ECMAScript 2015 では do-while 文末尾のセミコロンが欠如していると自動セミコロン挿入が追加する。これは実装挙動との整合。

13.2.5.1: ECMAScript 2015 では Object Initializer で重複プロパティ名があっても早期エラーではなくなった。

13.15.1: ECMAScript 2015 では FunctionExpression の関数名のような不変バインディングへの代入を含む strict mode コードは早期エラーではなく実行時エラーを生成する。

14.2: ECMAScript 2015 ではトークン let に続いて入力要素 LineTerminator その後 Identifier で始まる StatementListLexicalDeclaration の開始。以前は自動セミコロン挿入が常に Identifier 前にセミコロンを挿入した。

14.5: ECMAScript 2015 ではトークン let に続いてトークン [ の並びで始まる StatementListItemLexicalDeclaration の開始。以前は ExpressionStatement の開始だった。

14.6.2: ECMAScript 2015 では IfStatement の通常結果が empty になることはない。Statement 部分が評価されないか empty を含む通常完了なら結果は undefined

14.7: ECMAScript 2015 では for 文の ( の直後が let [ トークン列なら letLexicalDeclaration の開始。以前は Expression の開始だった。

14.7: ECMAScript 2015 では for-in 文の ( の直後が let [ なら letForDeclaration の開始。以前は LeftHandSideExpression の開始だった。

14.7: ECMAScript 2015 以前、初期化式は in の前の VariableDeclaration の一部として現れ得た。2015 では同位置の ForBinding はそのような初期化子を許さない。2017 では非 strict コードでのみ許容。

14.7: ECMAScript 2015 では IterationStatement の評価結果が [[Value]] empty の通常完了になることはない。Statement 部分が評価されないか最終評価が empty の場合結果は undefined

14.11.2: ECMAScript 2015 では WithStatement の評価結果が empty の通常完了にならない。Statement 部分が empty の通常完了なら結果は undefined

14.12.4: ECMAScript 2015 では SwitchStatement の評価結果が empty の通常完了にならない。CaseBlock 部分が empty の通常完了なら結果は undefined

14.15: ECMAScript 2015 では Catch 節がパラメータと同じ Identifiervar 宣言を含むと早期エラー。以前はその変数宣言は囲む variable environment にインスタンス化され初期化子値が Catch パラメータへ代入された。

14.15, 19.2.1.3: ECMAScript 2015 では Catch 節が非 strict の直接 eval を評価し、その eval コードが Catch パラメータと同じ Identifier をバインドする var / FunctionDeclaration を含むと実行時 SyntaxError を投げる。

14.15.3: ECMAScript 2015 では TryStatement の結果が empty 値になることはない。Block 部分が empty を含む通常完了なら結果は undefinedBlock が throw 完了で Catchempty の通常完了を返し、Finally が無いか empty の通常完了なら結果は undefined

15.4.5: ECMAScript 2015 では ObjectLiteralアクセサプロパティ [[Get]] / [[Set]] 属性値として作成される関数オブジェクトコンストラクタではなく "prototype" 自身プロパティを持たない。以前はコンストラクタ"prototype" を持っていた。

20.1.2.6: ECMAScript 2015 では Object.freeze 引数がオブジェクトでない場合、独自プロパティを持たない非拡張の通常オブジェクトとして扱う。以前は常に TypeError

20.1.2.8: ECMAScript 2015 では引数がオブジェクトでない場合 ToObject 変換を試み、成功すればその結果を使用。以前は常に TypeError

20.1.2.10: 同上の挙動。

20.1.2.12: 同上の挙動。

20.1.2.16: 引数がオブジェクトでない場合、非拡張の空オブジェクトとして扱う。以前は TypeError

20.1.2.17: 同様。

20.1.2.18: 同様。

20.1.2.19: 引数がオブジェクトでない場合 ToObject を試み、成功時その結果を使用。以前は TypeError

20.1.2.20: 引数が非オブジェクトなら非拡張の空オブジェクト扱い。以前は TypeError

20.1.2.22: 同様。

20.2.3.2: ECMAScript 2015 ではバインド関数の [[Prototype]] はターゲット関数の [[GetPrototypeOf]] の値。以前は常に %Function.prototype%

20.2.4.1: ECMAScript 2015 では関数インスタンスの "length" プロパティは設定可能。以前は不可。

20.5.6.2: ECMAScript 2015 では NativeError コンストラクタ[[Prototype]] 内部スロットは Error コンストラクタ。以前は Function prototype オブジェクト。

21.4.4 ECMAScript 2015 では Date prototype オブジェクトは Date インスタンスではない。以前は TimeValue が NaN の Date インスタンス。

22.1.3.12 ECMAScript 2015 では String.prototype.localeCompare は Unicode 標準で正規等価な文字列を同一として扱う。以前は正規等価性を無視しビット単位比較も可能だった。

22.1.3.28 および 22.1.3.30 ECMAScript 2015 では大小変換処理はコードポイント単位。以前はコードユニット個別。影響を受けるのは Deseret ブロック。

22.1.3.32 ECMAScript 2015 では String.prototype.trim は BMP 外に存在し得る空白コードポイントを認識するよう定義(Unicode 7 時点で該当なし)。以前は認識しなかった。

22.2.4.1 ECMAScript 2015 では pattern 引数が RegExp インスタンスで flagsundefined でなければ、新しい RegExp を作成し既存フラグを置換。以前は TypeError

22.2.6 ECMAScript 2015 では RegExp prototype オブジェクトは RegExp インスタンスではない。以前は空文字パターンのインスタンス。

22.2.6 ECMAScript 2015 では "source", "global", "ignoreCase", "multiline" は RegExp prototype 上のアクセサプロパティ。以前はインスタンス上のデータプロパティ

25.4.15: ECMAScript 2019 で Atomics.wakeAtomics.notify に改名され Atomics.wait との混同を防ぐ。

27.1.6.4, 27.6.3.6: ECMAScript 2019 で await によりエンキューされる Job 数が減り、then() 呼び出しと await 式間の解決順序に観測可能な差異を生む可能性がある。

参考文献

  1. IEEE 754-2019: IEEE Standard for Floating-Point Arithmetic. Institute of Electrical and Electronic Engineers, New York (2019) Note

    IEEE 754-2008 と IEEE 754-2019 の間で ECMA-262 仕様に影響する規範的変更はない。

  2. The Unicode Standard, <https://unicode.org/versions/latest>
  3. Unicode Technical Note #5: Canonical Equivalence in Applications, <https://unicode.org/notes/tn5/>
  4. Unicode Technical Standard #10: Unicode Collation Algorithm, <https://unicode.org/reports/tr10/>
  5. Unicode Standard Annex #15, Unicode Normalization Forms, <https://unicode.org/reports/tr15/>
  6. Unicode Standard Annex #18: Unicode Regular Expressions, <https://unicode.org/reports/tr18/>
  7. Unicode Standard Annex #24: Unicode Script Property, <https://unicode.org/reports/tr24/>
  8. Unicode Standard Annex #31, Unicode Identifiers and Pattern Syntax, <https://unicode.org/reports/tr31/>
  9. Unicode Standard Annex #44: Unicode Character Database, <https://unicode.org/reports/tr44/>
  10. Unicode Technical Standard #51: Unicode Emoji, <https://unicode.org/reports/tr51/>
  11. IANA Time Zone Database, <https://www.iana.org/time-zones>
  12. ISO 8601:2004(E) Data elements and interchange formats — Information interchange — Representation of dates and times
  13. RFC 1738 “Uniform Resource Locators (URL)”, <https://tools.ietf.org/html/rfc1738>
  14. RFC 2396 “Uniform Resource Identifiers (URI): Generic Syntax”, <https://tools.ietf.org/html/rfc2396>
  15. RFC 3629 “UTF-8, a transformation format of ISO 10646”, <https://tools.ietf.org/html/rfc3629>
  16. RFC 7231 “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content”, <https://tools.ietf.org/html/rfc7231>

奥付

この仕様は GitHub 上で Ecmarkup と呼ばれるプレーンテキストソース形式で作成される。Ecmarkup はこの文書の編集上の慣習に従う完全な HTML レンダリングへ仕様を処理するためのフレームワークおよびツールセットを提供する HTML と Markdown の方言である。Ecmarkup は構文定義に Grammarkdown、アルゴリズム手順記述に Ecmarkdown など複数のフォーマットおよび技術を統合している。この仕様の PDF レンダリングは CSS Paged Media 仕様を利用する印刷スタイルシートを用いて生成され PrinceXML で変換される。

以前の版は Word を用いて作成されており、本版の基盤となった Ecmarkup ソーステキストは ECMAScript 2015 の Word ドキュメントを自動変換ツールで Ecmarkup へ変換して得られた。

Copyright & Software License

Ecma International

Rue du Rhone 114

CH-1204 Geneva

Tel: +41 22 849 6000

Fax: +41 22 849 6001

Web: https://ecma-international.org/

Software License

All Software contained in this document ("Software") is protected by copyright and is being made available under the "BSD License", included below. This Software may be subject to third party rights (rights from parties other than Ecma International), including patent rights, and no licenses under such third party rights are granted under this license even if the third party concerned is a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT https://ecma-international.org/memento/codeofconduct.htm FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA INTERNATIONAL STANDARDS.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  3. Neither the name of the authors nor Ecma International may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.