草案 ECMA-262 / 2026年10月1日 ECMAScript® 2027 言語 仕様
序文
この Ecma 標準は、ECMAScript 2027 言語を定義します。これは ECMAScript 言語仕様の第18版です。ECMAScript はいくつかの先行技術に基づいており、最もよく知られているものは JavaScript(Netscape)と JScript(Microsoft)です。この言語は Netscape の Brendan Eich によって考案され、同社の Navigator 2.0 ブラウザーで初めて登場しました。Web ブラウザーに組み込まれた言語として最もよく知られていますが、サーバーや組込みアプリケーションを含むブラウザー以外の用途にも広く採用され、世界で最も広く使用されている汎用プログラミング言語の一つへと成長しました。
ECMAScript 言語仕様の開発は、1996年11月に始まりました。この Ecma 標準の初版は、1997年6月の Ecma 総会で採択されました。
この Ecma 標準は、迅速承認手続きによる採用のため ISO/IEC JTC 1 に提出され、1998年4月に国際標準 ISO/IEC 16262 として承認されました。1998年6月の Ecma 総会は、ISO/IEC 16262 との完全な整合性を維持するため、ECMA-262 の第2版を承認しました。初版と第2版の間の変更は、編集上のものです。
この標準の第3版では、強力な正規表現、文字列処理の改善、新しい制御文、try/catch による例外処理、エラー定義の厳密化、数値出力の書式設定、および将来の言語の発展を見据えた小規模な変更が導入されました。ECMAScript 標準の第3版は、1999年12月の Ecma 総会で採択され、2002年6月に ISO/IEC 16262:2002 として発行されました。
第3版の発行後、ECMAScript は World Wide Web とともに大規模に普及し、事実上すべての Web ブラウザーでサポートされるプログラミング言語となりました。ECMAScript の第4版を開発するために多大な作業が行われました。しかし、その作業は完了せず、ECMAScript の第4版として発行されることはありませんでしたが、その一部は第6版の開発に取り込まれました。
ECMAScript の第5版(ECMA-262 第5版 として発行)は、ブラウザー実装間で共通となっていた言語仕様の事実上の解釈を明文化し、第3版の発行以降に登場した新機能のサポートを追加しました。これらの機能には、アクセサープロパティ 、リフレクションによるオブジェクトの作成と検査、プログラムによるプロパティ属性の制御、追加の配列操作関数、JSON オブジェクト符号化形式のサポート、およびエラーチェックとプログラムの安全性を強化する厳格モードが含まれます。第5版は、2009年12月の Ecma 総会で採択されました。
第5版は、迅速承認手続きによる採用のため ISO/IEC JTC 1 に提出され、国際標準 ISO/IEC 16262:2011 として承認されました。ECMAScript 標準の第5.1版には軽微な修正が取り込まれており、ISO/IEC 16262:2011 と同一の本文になっています。第5.1版は、2011年6月の Ecma 総会で採択されました。
第6版の集中的な開発は、第5版の発行準備が進められていた2009年に始まりました。しかし、それに先立って、1999年の第3版の発行にまでさかのぼる、広範な実験と言語拡張の設計作業が行われていました。まさに第6版の完成は、15年にわたる取り組みの集大成です。この版の目標には、大規模アプリケーション、ライブラリの作成、および他の言語のコンパイル先としての ECMAScript の利用に対するサポートの改善が含まれていました。主な拡張には、モジュール、クラス宣言、レキシカルなブロックスコープ、イテレーターとジェネレーター、非同期プログラミングのためのプロミス、分割代入パターン、および適正な末尾呼出しが含まれます。ECMAScript の組込みライブラリは、マップ、セット、バイナリ数値の配列などの追加のデータ抽象化をサポートするように拡張され、文字列および正規表現における Unicode 補助文字のサポートも追加されました。また、組込み機能はサブクラス化によって拡張可能になりました。第6版は、言語とライブラリの定期的かつ段階的な拡張の基盤を提供します。第6版は、2015年6月の総会で採択されました。
ECMAScript 2016 は、Ecma TC39 の新しい年次リリース周期とオープンな開発プロセスのもとでリリースされた最初の ECMAScript の版です。以後の開発をすべて GitHub 上で行うための基礎として、ECMAScript 2015 のソース文書からプレーンテキストのソース文書が作成されました。この標準の開発が行われた1年間に、数千件のバグ修正、編集上の修正、その他の改善に相当する数百件のプルリクエストと課題が提出されました。さらに、この取り組みを支援するため、Ecmarkup、Ecmarkdown、Grammarkdown など、多数のソフトウェアツールが開発されました。ES2016 には新しいべき乗演算子のサポートも含まれ、Array.prototype に includes という新しいメソッドが追加されました。
ECMAScript 2017 では、非同期関数、共有メモリ、およびアトミック操作が導入され、あわせて小規模な言語とライブラリの拡張、バグ修正、および編集上の更新が行われました。非同期関数は、プロミスを返す関数のための構文を提供することで、非同期プログラミングの利便性を向上させます。共有メモリとアトミック操作は、並列 CPU 上でも明確に定義された実行順序を保証するアトミック操作を使用して、複数のエージェント からなるプログラムが通信できるようにする新しいメモリモデル を導入します。また、Object に新しい静的メソッド Object.values、Object.entries、および Object.getOwnPropertyDescriptors が追加されました。
ECMAScript 2018 では、非同期イテレータープロトコルと非同期ジェネレーターを介した非同期反復のサポートが導入されました。また、正規表現に4つの新機能として、dotAll フラグ、名前付きキャプチャグループ、Unicode プロパティエスケープ、および後読みアサーションが追加されました。最後に、オブジェクトの残余プロパティとスプレッドプロパティが追加されました。
ECMAScript 2019 では、いくつかの新しい組込み関数が導入されました。配列を平坦化するための Array.prototype の flat と flatMap、Object.entries の戻り値を直接新しい Object に変換するための Object.fromEntries、および広く実装されているものの非標準である組込み関数 String.prototype.trimLeft と trimRight に代わる、より適切な名前を持つ String.prototype の trimStart と trimEnd です。さらに、構文と意味論にいくつかの小規模な更新が加えられました。構文の更新には、catch 束縛パラメーターの省略、および JSON との整合性のために文字列リテラル内で U+2028(LINE SEPARATOR)と U+2029(PARAGRAPH SEPARATOR)を許可することが含まれます。その他の更新には、Array.prototype.sort を安定ソートとする要件、入力にかかわらず JSON.stringify が整形式の UTF-8 を返す要件、および対応する元のソーステキストか標準のプレースホルダーのいずれかを返すことを要求することによる Function.prototype.toString の明確化が含まれます。
第11版 である ECMAScript 2020 では、グローバルな正規表現によって生成されるすべての一致オブジェクトのイテレーターを生成する String の matchAll メソッド、動的な指定子でモジュールを非同期にインポートする構文 import()、任意精度の整数 を扱うための新しい数値プリミティブ BigInt、短絡しない新しい Promise コンビネーター Promise.allSettled、グローバルな this 値にアクセスするための汎用的な方法 globalThis、モジュール内で使用する専用の構文 export * as ns from 'module'、for-in の列挙順序の標準化の進展、モジュール内で利用でき、そのモジュールのコンテキスト情報を含む場合がある、ホスト が内容を設定するオブジェクト import.meta が導入されました。さらに、“nullish” な値(undefined または null )の扱いを改善する2つの新しい構文機能が追加されました。値選択演算子である nullish 合体と、アクセスまたは呼出しの対象となる値が nullish の場合に短絡する、プロパティアクセスおよび関数呼出し演算子であるオプショナルチェーンです。
第12版 である ECMAScript 2021 では、String の replaceAll メソッド、入力値の一つが履行されると短絡する Promise コンビネーター Promise.any、複数のエラーを一度に表す新しい Error 型 AggregateError、論理代入演算子(??=、&&=、||=)、対象オブジェクトのガベージコレクションを妨げずに参照するための WeakRef、対象オブジェクトがガベージコレクションされるときに実行されるクリーンアップ操作の登録と登録解除を管理する FinalizationRegistry、および数値リテラルの区切り文字(1_000)が導入されました。また、Array.prototype.sort がより厳密に定義され、ソート順序 が実装定義 になる場合が減少しました。
第13版 である ECMAScript 2022 では、モジュールのトップレベルでキーワード を使用できるトップレベル await、新しいクラス要素として、公開および非公開のインスタンスフィールド、公開および非公開の静的フィールド、非公開のインスタンスメソッドとアクセサー、および非公開の静的メソッドとアクセサー、クラスの評価ごとに初期化を実行するクラス内の静的ブロック、オブジェクト上の非公開フィールドの存在を検査する #x in obj 構文、一致した部分文字列 の開始インデックスと終了インデックスを提供する /d フラグによる正規表現の一致インデックス、エラーの原因の連鎖を記録するために使用できる Error オブジェクトの cause プロパティ、相対インデックスを使用できる String、Array、および TypedArray の at メソッド、ならびに Object.prototype.hasOwnProperty に代わる便利な Object.hasOwn が導入されました。
第14版 である ECMAScript 2023 では、Array.prototype と TypedArray.prototype に toSorted、toReversed、with、findLast、および findLastIndex メソッドが導入され、Array.prototype には toSpliced メソッドも導入されました。また、実行可能な ECMAScript ファイルをより容易に扱えるよう、ファイル先頭の #! コメントのサポートが追加され、弱いコレクションのキーとしてほとんどの Symbol を使用できるようになりました。
第15版 である ECMAScript 2024 では、ArrayBuffer と SharedArrayBuffer のサイズ変更および転送のための機能が追加されました。また、文字列の集合を扱うためのより高度な機能を備えた RegExp を作成する新しい RegExp の /v フラグが追加されました。さらに、Promise を構築するための便利なメソッド Promise.withResolvers、データを集約するための Object.groupBy と Map.groupBy メソッド、共有メモリの変更を非同期に待機するための Atomics.waitAsync メソッド、および文字列が整形式の Unicode のみを含むことを検査し、保証するための String.prototype.isWellFormed と String.prototype.toWellFormed メソッドが導入されました。
第16版 である ECMAScript 2025 では、イテレーターを扱うための静的メソッドとプロトタイプメソッドを備えた、新しいグローバルな Iterator が追加されました。また、Set に対する一般的な操作を実行するメソッドが Set.prototype に追加され、JSON モジュールのインポートのサポートと、インポートするモジュールの属性を宣言する構文が追加されました。さらに、正規表現内で安全に使用できるように文字列をエスケープする RegExp.escape メソッド、正規表現内で修飾フラグをインラインで有効または無効にする構文、Promise を返す場合も返さない場合もある関数を呼び出し、その結果が常に Promise になることを保証する Promise.try メソッド、および新しい TypedArray の種類である Float16Array と、それに関連する DataView.prototype.getFloat16、DataView.prototype.setFloat16、Math.f16round メソッドが追加されました。
第17版 である ECMAScript 2026 では、精度の損失を最小限に抑えながら、大きさの異なる Number の反復可能オブジェクトを合計する Math.sumPrecise、イテレーターを順につなぐ Iterator.concat、非同期反復可能オブジェクトやその他の非同期ソースから Array を構築する Array.fromAsync、エラーオブジェクトを識別する Error.isError、取得時にキーが存在しない場合に使用する既定値を提供するための Map.prototype と WeakMap.prototype のメソッド、16進数および base64 で符号化されたバイナリデータの String との相互変換を行う Uint8Array のメソッド、一致した JSON ソースの部分にアクセスするための JSON.parse の reviver のパラメーター、およびプリミティブ値に対する JSON.stringify の出力を細かく制御するための JSON.rawJSON が追加されました。
多くの組織を代表する数十人の人々が、Ecma TC39 において、この版および以前の各版の開発に非常に大きな貢献をしました。さらに、TC39 の ECMAScript に関する取り組みを支援する活発なコミュニティが生まれました。このコミュニティは、多数の草案をレビューし、数千件のバグ報告を提出し、実装実験を行い、テストスイートを提供し、世界中の開発者コミュニティに ECMAScript についての知識を広めてきました。残念ながら、この取り組みに貢献したすべての個人と組織を特定し、謝意を表すことはできません。
Allen Wirfs-Brock
ECMA-262, プロジェクト編集者, 第6版
Brian Terlson
ECMA-262, プロジェクト編集者, 第7版 から第10版
Jordan Harband
ECMA-262, プロジェクト編集者, 第10版 から第12版
Kevin Gibbons
ECMA-262, プロジェクト編集者, 第12版 から第17版
Shu-yu Guo
ECMA-262, プロジェクト編集者, 第12版 から第18版
Michael Ficarra
ECMA-262, プロジェクト編集者, 第12版 から第18版
Richard Gibson
ECMA-262, プロジェクト編集者, 第18版
Ron Buckton
ECMA-262, プロジェクト編集者, 第18版
Nicolò Ribaudo
ECMA-262, プロジェクト編集者, 第18版
Linus Groh
ECMA-262, プロジェクト編集者, 第18版
1 適用範囲
この標準は、汎用プログラミング言語 ECMAScript 2027 を定義します。
2 適合性
ECMAScript の適合実装は、この仕様に記述されているすべての型、値、オブジェクト、プロパティ、関数、およびプログラムの構文と意味論を提供し、サポートしなければなりません。
ECMAScript の適合実装は、Unicode 標準および ISO/IEC 10646 の最新版に適合するように、入力されたソーステキストを解釈しなければなりません。
異なる自然言語や国で用いられる言語的および文化的な慣習に適応する必要があるプログラムをサポートするアプリケーションプログラミングインターフェース(API)を提供する ECMAScript の適合実装は、この仕様と互換性のある ECMA-402 の最新版で定義されたインターフェースを実装しなければなりません。
ECMAScript の適合実装は、この仕様に記述されているものに加えて、追加の型、値、オブジェクト、プロパティ、および関数を提供してもかまいません。特に、ECMAScript の適合実装は、この仕様に記述されているオブジェクトに対して、この仕様に記述されていないプロパティと、それらのプロパティの値を提供してもかまいません。
ECMAScript の適合実装は、この仕様に記述されていないプログラムおよび正規表現の構文をサポートしてもかまいません。特に、ECMAScript の適合実装は、この仕様の細分箇条 12.7.2 に記載されている“将来の予約語 ”を使用するプログラム構文をサポートしてもかまいません。
ECMAScript の適合実装は、細分箇条 17.1 に禁止された拡張として列挙されている拡張を実装してはなりません。
ECMAScript の適合実装は、実装定義 、実装近似 、またはホスト定義 のいずれでもない機能を再定義してはなりません。
ECMAScript の適合実装は、特に指定がない限り、規範的任意 の細分箇条を実装するかどうかを選択してもかまいません。一般に、Web ブラウザーには、すべての規範的任意の細分箇条を実装することが要求されます。(附属書 B を参照してください。)規範的任意の動作を一つでも実装する場合、その動作を含む規範的任意の箇条内のすべての動作を実装しなければなりません。この仕様では、規範的任意の箇条は、以下に示すように、色付きのボックス内の“規範的任意”という語で示されます。
規定の任意機能
2.1 規範的任意の箇条の見出しの例
箇条の内容の例。
ECMAScript の適合実装は、規範的任意とも指定されている場合を除き、レガシー の細分箇条を実装しなければなりません。レガシーの細分箇条で規定されるすべての言語機能と動作には、一つ以上の望ましくない特性があります。しかし、既存のアプリケーションで引き続き使用されているため、この仕様から削除することはできません。これらの機能は、ECMAScript 言語の中核の一部とはみなされません。プログラマーは、新しい ECMAScript コードを書く際に、これらの機能と動作を使用したり、その存在を前提としたりするべきではありません。
2.2 レガシーの箇条の見出しの例
箇条の内容の例。
2.3 レガシーかつ規範的任意の箇条の見出しの例
箇条の内容の例。
3 引用規格
以下の引用文書は、この文書の適用に不可欠です。日付が付された引用については、引用された版のみが適用されます。日付が付されていない引用については、引用文書の最新版(すべての追補を含む)が適用されます。
IEEE 754-2019 , 浮動小数点演算に関する IEEE 標準 。
Unicode 標準。
https://unicode.org/versions/latest
ISO/IEC 10646, 情報技術 — 国際符号化文字集合(UCS) ならびに追補1:2005、追補2:2006、追補3:2008、追補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 の用途は単純なスクリプトの範囲を超え、現在では、多様な環境と規模におけるあらゆるプログラミング作業に使用されています。ECMAScript の利用が拡大するにつれて、その機能も拡充されてきました。現在の ECMAScript は、十分な機能を備えた汎用プログラミング言語です。
4.1 Web スクリプティング
Web ブラウザーは、クライアント側の計算のための ECMAScript ホスト環境 を提供します。これには、たとえば、ウィンドウ、メニュー、ポップアップ、ダイアログボックス、テキスト領域、アンカー、フレーム、履歴、Cookie、および入出力を表すオブジェクトが含まれます。さらに、ホスト環境 は、フォーカスの変更、ページや画像の読み込み、アンロード、エラーと中断、選択、フォームの送信、およびマウス操作などのイベントにスクリプトコードを関連付ける手段を提供します。スクリプトコードは HTML 内に記述され、表示されるページは、ユーザーインターフェース要素と、固定された、または計算によって生成されたテキストおよび画像の組合せです。スクリプトコードはユーザーの操作に反応するため、メインプログラムは必要ありません。
Web サーバーは、サーバー側の計算のために異なるホスト環境 を提供します。これには、リクエスト、クライアント、およびファイルを表すオブジェクトと、データをロックおよび共有する仕組みが含まれます。ブラウザー側とサーバー側のスクリプトを併用することで、Web ベースのアプリケーションにカスタマイズされたユーザーインターフェースを提供しながら、クライアントとサーバーの間で計算を分散させることができます。
ECMAScript をサポートする各 Web ブラウザーとサーバーは、独自のホスト環境 を提供し、ECMAScript の実行環境を補完します。
4.2 ホストと実装
ECMAScript をホスト環境 に統合しやすくするため、この仕様は、特定の機能(たとえば、抽象操作 )の定義の全部または一部を、この仕様の外部の情報源に委ねます。編集上、この仕様は、以下の種類の委譲を区別します。
実装 とは、附属書 D に列挙されている機能、または実装定義 もしくは実装近似 と指定されている機能を、さらに定義する外部の情報源です。非形式的な用法では、実装は、特定の Web ブラウザーなどの具体的な成果物を指します。
実装定義 の機能とは、追加の条件を付けずに、その定義を外部の情報源に委ねる機能です。この仕様は特定の動作を推奨せず、適合実装は、この仕様が定める制約の範囲内で任意の動作を自由に選択できます。
実装近似 の機能とは、理想的な動作を推奨しながら、その定義を外部の情報源に委ねる機能です。適合実装は、この仕様が定める制約の範囲内で任意の動作を自由に選択できますが、理想に近づけるよう努めることが奨励されます。Math.exp など、一部の数学的操作は実装近似 です。
ホスト とは、附属書 D に列挙されている機能をさらに定義するものの、その他の実装定義 または実装近似 の機能はさらに定義しない、外部の情報源です。非形式的な用法では、ホスト は、すべての Web ブラウザーの集合など、附属書 D を介して同じ方法でこの仕様と連携する、すべての実装の集合を指します。ホスト は、WHATWG HTML(https://html.spec.whatwg.org/ )などの外部仕様であることがよくあります。言い換えると、ホスト定義 の機能は、外部仕様でさらに定義されることがよくあります。
ホストフック とは、外部の情報源によって全部または一部が定義される抽象操作 です。すべてのホストフック は、附属書 D に列挙されていなければなりません。ホストフック は、少なくとも以下の要件に適合しなければなりません。
正常完了 またはスロー完了のいずれかを返さなければなりません。
ホスト定義 の機能とは、追加の条件を付けずにその定義を外部の情報源に委ね、附属書 D に列挙されている機能です。ホスト ではない実装も、ホスト定義 の機能の定義を提供してもかまいません。
ホスト環境 とは、すべてのホスト定義 の機能について、特定の定義を選択したものです。ホスト環境 には通常、グローバルオブジェクト のホスト定義 のプロパティとして、入力の取得や出力の提供を可能にするオブジェクトまたは関数が含まれます。
この仕様は、常に最も具体的な用語を使用するという編集上の慣例に従います。たとえば、ある機能がホスト定義 である場合、それを実装定義 と呼ぶべきではありません。
ホスト と実装のどちらも、ここで定義されている言語型、仕様型、抽象操作 、文法の生成規則、固有オブジェクト、および固有シンボルを介して、この仕様と連携してもかまいません。
4.3 ECMAScript の概要
以下は ECMAScript の非形式的な概要であり、言語のすべての部分を説明するものではありません。この概要は、標準の本体の一部ではありません。
ECMAScript はオブジェクトを基盤としています。基本的な言語機能とホスト 機能はオブジェクトによって提供され、ECMAScript プログラムは、相互に通信するオブジェクトの集合です。ECMAScript におけるオブジェクト とは、0個以上のプロパティ の集合であり、各プロパティには、その使用方法を決定する属性 があります。たとえば、プロパティの Writable 属性が false に設定されている場合、実行される ECMAScript コードがそのプロパティに別の値を代入しようとする試みは、すべて失敗します。プロパティは、他のオブジェクト、プリミティブ値 、または関数 を保持する入れ物です。プリミティブ値は、次の組込み型のいずれかに属します。Undefined 、Null 、Boolean 、Number 、BigInt 、String 、および Symbol; オブジェクトは組込み型 Object に属し、関数は呼出し可能なオブジェクトです。プロパティを介してオブジェクトに関連付けられた関数を、メソッド と呼びます。
ECMAScript は、ECMAScript の構成要素の定義を補完する組込みオブジェクト の集合を定義します。これらの組込みオブジェクトには、グローバルオブジェクト 、Object、Function、Boolean、Symbol、および各種 Error オブジェクトなど、言語の実行時意味論 の基礎となるオブジェクト、Math、Number、Date など、数値を表現および操作するオブジェクト、テキスト処理オブジェクト String と RegExp、Array および各要素が特定の数値データ表現を持つ9種類の型付き配列など、値のインデックス付きコレクションであるオブジェクト、Map と Set オブジェクトなどのキー付きコレクション、JSON オブジェクト、ArrayBuffer、SharedArrayBuffer、および DataView などの構造化データをサポートするオブジェクト、ジェネレーター関数と Promise オブジェクトなどの制御の抽象化をサポートするオブジェクト、ならびに Proxy と Reflect などのリフレクションオブジェクトが含まれます。
ECMAScript は、組込みの演算子 の集合も定義します。ECMAScript の演算子には、各種単項演算、乗除演算子、加減演算子、ビットシフト演算子、関係演算子、等価演算子、二項ビット演算子、二項論理演算子、代入演算子、およびカンマ演算子が含まれます。
大規模な ECMAScript プログラムは、プログラムを複数の文と宣言の列に分割できるモジュール によってサポートされます。各モジュールは、そのモジュールが使用する宣言のうち他のモジュールから提供される必要があるものと、そのモジュールの宣言のうち他のモジュールから使用できるものを、明示的に指定します。
ECMAScript の構文は、意図的に Java の構文に似せてあります。使いやすいスクリプト言語として利用できるよう、ECMAScript の構文は緩やかに設計されています。たとえば、変数の型を宣言する必要はなく、プロパティにも型は関連付けられません。また、定義された関数の宣言が、その関数の呼出しよりもソーステキスト上で前に現れる必要もありません。
4.3.1 オブジェクト
ECMAScript にはクラス定義の構文がありますが、ECMAScript のオブジェクトは、C++、Smalltalk、Java のオブジェクトのように、根本的にクラスを基盤とするものではありません。代わりに、オブジェクトはさまざまな方法で作成できます。これには、リテラル表記による作成や、オブジェクトを作成した後、そのプロパティに初期値を代入することでオブジェクトの全部または一部を初期化するコードを実行するコンストラクター による作成が含まれます。各コンストラクター は、プロトタイプに基づく継承 と共有プロパティ を実装するために使用される "prototype" という名前のプロパティを持つ関数です。オブジェクトは、new 式でコンストラクター を使用して作成します。たとえば、new Date(2009, 11) は新しい Date オブジェクトを作成します。new を使用せずにコンストラクター を呼び出した結果は、そのコンストラクター によって異なります。たとえば、Date() は、オブジェクトではなく、現在の日付と時刻の文字列表現を生成します。
コンストラクター によって作成されたすべてのオブジェクトは、そのコンストラクター の "prototype" プロパティの値への暗黙の参照(そのオブジェクトのプロトタイプ と呼ばれます)を持ちます。さらに、プロトタイプ自身も、そのプロトタイプへの null ではない暗黙の参照を持つ場合があり、以後も同様に続きます。これをプロトタイプチェーン と呼びます。オブジェクト内のプロパティが参照されると、その参照は、プロトタイプチェーン内でその名前のプロパティを含む最初のオブジェクトの、その名前のプロパティを指します。言い換えると、まず直接指定されたオブジェクトにそのプロパティがあるかを調べます。そのオブジェクトが指定された名前のプロパティを含む場合、それが参照先のプロパティです。そのオブジェクトが指定された名前のプロパティを含まない場合、次にそのオブジェクトのプロトタイプを調べ、以後も同様に続けます。
図 1: オブジェクト/プロトタイプの関係
クラスを基盤とするオブジェクト指向言語では、一般に、状態はインスタンスが保持し、メソッドはクラスが保持し、継承されるのは構造と動作のみです。ECMAScript では、状態とメソッドはオブジェクトが保持し、構造、動作、および状態のすべてが継承されます。
プロトタイプが持つ特定のプロパティを直接には持たないすべてのオブジェクトは、そのプロパティとその値を共有します。図1は、これを示しています。
CF はコンストラクター です(同時にオブジェクトでもあります)。new 式を使用して、5つのオブジェクト cf1 、cf2 、cf3 、cf4 、および cf5 が作成されています。これらの各オブジェクトは、"q1" と "q2" という名前のプロパティを含みます。破線は、暗黙のプロトタイプ関係を表します。したがって、たとえば、cf3 のプロトタイプは CFp です。コンストラクター CF 自身は、"P1" と "P2" という名前の2つのプロパティを持ちますが、これらは CFp 、cf1 、cf2 、cf3 、cf4 、および cf5 からは見えません。CFp 内の "CFP1" という名前のプロパティは、cf1 、cf2 、cf3 、cf4 、および cf5 によって共有されます(ただし、CF によっては共有されません)。同様に、CFp の暗黙のプロトタイプチェーン内にある、"q1" 、"q2" 、または "CFP1" という名前ではないプロパティも共有されます。CF と CFp の間には、暗黙のプロトタイプリンクがないことに注意してください。
クラスを基盤とする多くのオブジェクト言語とは異なり、プロパティに値を代入することで、オブジェクトにプロパティを動的に追加できます。つまり、コンストラクター は、構築するオブジェクトのすべてのプロパティ、あるいはいずれかのプロパティについてさえ、名前を指定したり値を代入したりする必要はありません。上の図では、cf1 、cf2 、cf3 、cf4 、および cf5 のための新しい共有プロパティを、CFp 内のプロパティに新しい値を代入することで追加できます。
ECMAScript のオブジェクトは本質的にクラスを基盤とするものではありませんが、コンストラクター 関数、プロトタイプオブジェクト、およびメソッドの共通パターンに基づいて、クラスに似た抽象化を定義すると便利なことがよくあります。ECMAScript の組込みオブジェクト自体も、そのようなクラスに似たパターンに従っています。ECMAScript 2015 以降、ECMAScript 言語にはクラス定義の構文が含まれており、プログラマーは、組込みオブジェクトが使用するものと同じ、クラスに似た抽象化パターンに従うオブジェクトを簡潔に定義できます。
4.3.2 ECMAScript の厳格版
ECMAScript 言語は、言語の利用者の一部が、その言語で利用可能な特定の機能の使用を制限したいと考える可能性を認めています。その理由としては、安全性のため、自分たちが誤りを招きやすいと考える機能を避けるため、エラーチェックを強化するため、またはその他の自ら選んだ理由が考えられます。この可能性に対応するため、ECMAScript は、言語の厳格版を定義します。言語の厳格版は、通常の ECMAScript 言語の特定の構文的および意味論的な機能を除外し、一部の機能の詳細な意味論を変更します。また、厳格版は、言語の非厳格な形式ではエラーと規定されていない状況に対して、エラー例外をスローすることで報告しなければならない追加のエラー条件を規定します。
ECMAScript の厳格版は、一般に、この言語の厳格モード と呼ばれます。厳格モードの選択と ECMAScript の厳格モードの構文および意味論の使用は、11.2.2 で説明するように、個々の ECMAScript ソーステキスト 単位のレベルで明示的に行われます。厳格モードは構文上のソーステキスト単位のレベルで選択されるため、そのようなソーステキスト単位内に局所的な効果を持つ制限のみを課します。厳格モードは、複数のソーステキスト単位にわたって一貫して動作しなければならない ECMAScript の意味論のいかなる側面も、制限または変更しません。完全な ECMAScript プログラムは、厳格モードと非厳格モードの両方の ECMAScript ソーステキスト 単位から構成される場合があります。この場合、厳格モードは、厳格モードのソーステキスト単位内で定義されたコードを実際に実行するときにのみ適用されます。
この仕様に適合するためには、ECMAScript の実装は、この仕様で定義される、制限のない完全な ECMAScript 言語と ECMAScript 言語の厳格版の両方を実装しなければなりません。さらに、実装は、制限のないソーステキスト単位と厳格モードのソーステキスト単位を、一つの複合プログラムに組み合わせることをサポートしなければなりません。
4.4 用語および定義
この文書の目的のために、以下の用語および定義を適用します。
4.4.1 実装近似
実装近似 の機能は、外部の情報源によって全部または一部が定義されるものの、この仕様において推奨される理想的な動作を持つ
4.4.2 実装定義
実装定義 の機能は、この仕様の外部の情報源によって全部または一部が定義される
4.4.3 ホスト定義
実装定義 と同じ
注
編集上の区別については、箇条 4.2 を参照してください。
4.4.4 型
箇条 6 で定義されるデータ値の集合
4.4.5 プリミティブ値
箇条 6 で定義される Undefined、Null、Boolean、Number、BigInt、Symbol、または String 型 のいずれかに属する値
注
プリミティブ値は、言語実装の最も低いレベルで直接表現されるデータです。
4.4.6 オブジェクト
Object 型 に属する値
注
オブジェクトはプロパティの集合であり、単一のプロトタイプオブジェクトを持ちます。プロトタイプは null の場合があります。
4.4.7 コンストラクター
オブジェクトを作成および初期化する関数オブジェクト
注
コンストラクター の "prototype" プロパティの値は、継承と共有プロパティを実装するために使用されるプロトタイプオブジェクトです。
4.4.8 プロトタイプ
他のオブジェクトに共有プロパティを提供するオブジェクト
注
コンストラクター がオブジェクトを作成すると、そのオブジェクトは、プロパティ参照を解決するために、コンストラクター の "prototype" プロパティを暗黙に参照します。コンストラクター の "prototype" プロパティは、プログラム式 constructor .prototype によって参照でき、オブジェクトのプロトタイプに追加されたプロパティは、継承を通じて、そのプロトタイプを共有するすべてのオブジェクトによって共有されます。あるいは、組込み関数 Object.create を使用して、プロトタイプを明示的に指定した新しいオブジェクトを作成することもできます。
4.4.9 通常オブジェクト
すべてのオブジェクトがサポートしなければならない基本内部メソッドについて、既定の動作を持つオブジェクト
4.4.10 特殊オブジェクト
一つ以上の基本内部メソッドについて、既定の動作を持たないオブジェクト
注
通常オブジェクト ではないオブジェクトは、すべて特殊オブジェクト です。
4.4.11 標準オブジェクト
意味論がこの仕様によって定義されるオブジェクト
4.4.12 組込みオブジェクト
ECMAScript の実装によって規定および提供されるオブジェクト
注
標準の組込みオブジェクトは、この仕様で定義されます。ECMAScript の実装は、追加の種類の組込みオブジェクトを規定および提供してもかまいません。
4.4.13 undefined 値
変数に値が代入されていないときに使用されるプリミティブ値
4.4.14 Undefined 型
undefined 値を唯一の値とする型
4.4.15 null 値
オブジェクト値が意図的に存在しないことを表すプリミティブ値
4.4.16 Null 型
null 値を唯一の値とする型
4.4.17 Boolean 値
Boolean 型 に属する値
注
Boolean 値は、true と false の2つだけです。
4.4.18 Boolean 型
プリミティブ値 true と false からなる型
4.4.19 Boolean オブジェクト
標準組込みコンストラクター Boolean のインスタンスである、Object 型 に属する値
注
Boolean オブジェクトは、Boolean 値を引数として渡し、new 式で Boolean コンストラクター を使用することによって作成されます。生成されたオブジェクトは、その Boolean 値を値とする内部スロットを持ちます。Boolean オブジェクトは、Boolean 値に型変換できます。
4.4.20 String 値
0個以上の16ビット符号なし整数 値からなる、有限の順序付きの列であるプリミティブ値
注
String 値は、String 型 に属する値です。列内の各整数 値は、通常、UTF-16 テキストの単一の16ビット単位を表します。ただし、ECMAScript は、それらの値が16ビット符号なし整数 でなければならないことを除き、いかなる制限や要件も課しません。
4.4.21 String 型
すべての可能な String 値の集合
4.4.22 String オブジェクト
標準組込みコンストラクター String のインスタンスである、Object 型 に属する値
注
String オブジェクトは、String 値を引数として渡し、new 式で String コンストラクター を使用することによって作成されます。生成されたオブジェクトは、その String 値を値とする内部スロットを持ちます。String オブジェクトは、String コンストラクター を関数として呼び出すことで、String 値に型変換できます(22.1.1.1 )。
4.4.23 Number 値
IEEE 754-2019 の倍精度64ビットバイナリ形式の値に対応するプリミティブ値
注
Number 値 は、Number 型 に属する値であり、数の直接的な表現です。
4.4.24 Number 型
NaN (“非数”)、+∞ 𝔽 (正の無限大)、および -∞ 𝔽 (負の無限大)を含む、すべての可能な Number 値 の集合
4.4.25 Number オブジェクト
標準組込みコンストラクター Number のインスタンスである、Object 型 に属する値
注
Number オブジェクトは、Number 値 を引数として渡し、new 式で Number コンストラクター を使用することによって作成されます。生成されたオブジェクトは、その Number 値 を値とする内部スロットを持ちます。Number オブジェクトは、Number コンストラクター を関数として呼び出すことで、Number 値 に型変換できます(21.1.1.1 )。
4.4.26 Infinity
正の無限大の Number 値 である Number 値
4.4.27 NaN
IEEE 754-2019 の NaN(“非数”)値である Number 値
4.4.28 BigInt 値
任意精度の整数 値に対応するプリミティブ値
4.4.29 BigInt 型
すべての可能な BigInt 値 の集合
4.4.30 BigInt オブジェクト
標準組込みコンストラクター BigInt のインスタンスである、Object 型 に属する値
4.4.31 Symbol 値
一意で、String ではない Object のプロパティキー を表すプリミティブ値
4.4.32 Symbol 型
すべての可能な Symbol 値の集合
4.4.33 Symbol オブジェクト
標準組込みコンストラクター Symbol のインスタンスである、Object 型 に属する値
4.4.34 関数
サブルーチンとして呼び出せる、Object 型 に属する値
注
関数は、そのプロパティに加えて、呼び出されたときの動作を決定する実行可能なコードと状態を含みます。関数のコードは、ECMAScript で書かれている場合も、そうでない場合もあります。
4.4.35 組込み関数
関数である組込みオブジェクト
注
組込み関数の例には、parseInt と Math.exp があります。ホスト または実装は、この仕様に記述されていない追加の組込み関数を提供してもかまいません。
4.4.36 組込みコンストラクター
コンストラクター である組込み関数
注
組込みコンストラクター の例には、Object と Function があります。ホスト または実装は、この仕様に記述されていない追加の組込みコンストラクター を提供してもかまいません。
4.4.37 プロパティ
キー(String 値または Symbol 値のいずれか)と値を関連付ける、オブジェクトの一部
注
プロパティの形式に応じて、その値は、データ値(プリミティブ値、オブジェクト、または関数オブジェクト )として直接表現される場合と、一対のアクセサー関数によって間接的に表現される場合があります。
4.4.38 メソッド
プロパティの値である関数
注
関数がオブジェクトのメソッドとして呼び出されると、そのオブジェクトは、関数の this 値として関数に渡されます。
4.4.39 組込みメソッド
組込み関数であるメソッド
注
標準の組込みメソッドは、この仕様で定義されます。ホスト または実装は、この仕様に記述されていない追加の組込みメソッドを提供してもかまいません。
4.4.40 属性
プロパティの何らかの特性を定義する内部値
4.4.41 自身のプロパティ
そのオブジェクトに直接含まれるプロパティ
4.4.42 継承されたプロパティ
オブジェクト自身のプロパティではなく、そのオブジェクトのプロトタイプのプロパティ(自身のもの、または継承されたもの)である、オブジェクトのプロパティ
4.5 この仕様の構成
この仕様の残りの部分は、以下のように構成されています。
箇条 5 は、この仕様全体で使用される表記規約を定義します。
箇条 6 から 10 は、ECMAScript プログラムが動作する実行環境を定義します。
箇条 11 から 17 は、構文の符号化とすべての言語機能の実行意味論を含む、ECMAScript プログラミング言語そのものを定義します。
箇条 18 から 28 は、ECMAScript の標準ライブラリを定義します。これらには、実行中の ECMAScript プログラムが使用できる、すべての標準オブジェクトの定義が含まれます。
箇条 29 は、SharedArrayBuffer によって裏付けられるメモリへのアクセスと Atomics オブジェクトのメソッドに関する、メモリ整合性モデルを説明します。
5 表記規約
5.1 構文文法と字句文法
5.1.1 文脈自由文法
文脈自由文法 は、いくつかの生成規則 から構成されます。各生成規則は、左辺 として、非終端記号 と呼ばれる抽象的な記号を持ち、右辺 として、0個以上の非終端記号と終端記号 の列を持ちます。各文法の終端記号は、指定されたアルファベットから選ばれます。
連鎖生成規則 とは、その右辺に、0個以上の終端記号とともに、ちょうど一つの非終端記号を持つ生成規則です。
与えられた文脈自由文法は、開始記号 と呼ばれる特定の単一の非終端記号からなる文から始めることで、ある言語 を規定します。すなわち、列内の任意の非終端記号を、その非終端記号を左辺とする生成規則の右辺に繰り返し置き換えることによって得られる、終端記号のすべての可能な列の集合(無限の場合もあります)です。
5.1.2 字句文法と RegExp 文法
ECMAScript の字句文法 は、箇条 12 に示されています。この文法の終端記号は、11.1 で定義される SourceCharacter の規則に適合する Unicode コードポイントです。この文法は、開始記号 InputElementDiv 、InputElementTemplateTail 、InputElementRegExp 、InputElementRegExpOrTemplateTail 、または InputElementHashbangOrRegExp から始まり、そのようなコードポイントの列が入力要素の列に変換される方法を記述する、一連の生成規則を定義します。
空白とコメント以外の入力要素は、ECMAScript の構文文法の終端記号となり、ECMAScript のトークン と呼ばれます。これらのトークンは、ECMAScript 言語の予約語 、識別子、リテラル、および区切り記号です。また、行終端文字はトークンとはみなされませんが、入力要素の流れの一部となり、自動セミコロン挿入(12.10 )の処理を導きます。単なる空白と単一行コメントは破棄され、構文文法の入力要素の流れには現れません。MultiLineComment (すなわち、複数行にまたがるかどうかにかかわらず、/*…*/ という形式のコメント)も、行終端文字を含まない場合は同様に単に破棄されます。しかし、MultiLineComment が一つ以上の行終端文字を含む場合は、単一の行終端文字に置き換えられ、構文文法の入力要素の流れの一部となります。
ECMAScript の RegExp 文法 は、22.2.1 に示されています。この文法も、SourceCharacter で定義されるコードポイントを終端記号とします。この文法は、開始記号 Pattern から始まり、コードポイントの列が正規表現パターンに変換される方法を記述する、一連の生成規則を定義します。
字句文法と RegExp 文法の生成規則は、区切り記号として2つのコロン“:: ”を持つことで区別されます。字句文法と RegExp 文法は、一部の生成規則を共有します。
5.1.3 数値文字列文法
数値文字列文法 は、7.1.4.1 に示されています。この文法は、SourceCharacter を終端記号とし、開始記号 StringNumericLiteral から始めて、String を数値に変換するために使用されます(これは、数値リテラルの字句文法 に似ていますが、異なるものです)。
数値文字列文法の生成規則は、区切り記号として3つのコロン“::: ”を持つことで区別され、ソーステキストの解析には使用されません。
5.1.4 構文文法
ECMAScript の構文文法 は、箇条 13 から 16 に示されています。この文法は、字句文法で定義された ECMAScript のトークンを終端記号とします(5.1.2 )。この文法は、2つの選択可能な開始記号 Script と Module から始まり、トークンの列が、ECMAScript プログラムの構文的に正しい独立した構成要素を形成する方法を記述する、一連の生成規則を定義します。
コードポイントの流れを ECMAScript の Script または Module として解析するときは、まず字句文法を繰り返し適用することで、それを入力要素の流れに変換します。次に、構文文法を一度適用して、この入力要素の流れを解析します。入力要素の流れの中のトークンを、トークンを一つも残さずに、開始非終端記号(Script または Module )の単一のインスタンスとして解析できない場合、入力の流れには構文エラーがあります。
解析が成功すると、解析木 が構築されます。これは、各ノードが Parse Node である、根を持つ木構造です。各 Parse Node は、文法内の記号のインスタンス であり、その記号から導出できるソーステキストの範囲を表します。ソーステキスト全体を表す解析木の根ノードは、その解析の開始記号 のインスタンスです。Parse Node が非終端記号のインスタンスである場合、それは、その非終端記号を左辺に持つ、いずれかの生成規則のインスタンスでもあります。さらに、その生成規則の右辺の各記号に一つずつ対応する、0個以上の子 を持ちます。各子は、対応する記号のインスタンスである Parse Node です。
新しい Parse Node は、パーサーの呼出しごとに生成され、同一のソーステキストの解析であっても、解析間で再利用されることはありません。Parse Node が同じ Parse Node であるとみなされるのは、ソーステキストの同じ範囲を表し、同じ文法記号のインスタンスであり、かつ同じパーサー呼出しによって生成された場合に限られます。
注 1
同じ String を複数回解析すると、異なる Parse Node が生成されます。たとえば、次を考えます。
let str = "1 + 1;" ;
eval (str);
eval (str);
eval の各呼出しは、str の値を ECMAScript のソーステキストに変換し、独立した解析を実行して、それぞれ別個の Parse Node の木を作成します。各解析が、同じ String 値から得られたソーステキストに対して実行されても、それらの木は異なります。
注 2 Parse Node は仕様上の構成物であり、実装が類似のデータ構造を使用する必要はありません。
構文文法の生成規則は、区切り記号として一つだけのコロン“: ”を持つことで区別されます。
箇条 13 から 16 に示される構文文法は、どのトークン列が正しい ECMAScript の Script または Module として受理されるかを完全に説明するものではありません。特定の追加のトークン列も受理されます。すなわち、列内の特定の位置(たとえば、行終端文字の前)にセミコロンを追加するだけで、その文法によって記述されるようになる列です。さらに、文法によって記述される特定のトークン列も、特定の“不適切な”位置に行終端文字が現れる場合は、受理可能とはみなされません。
特定の場合には、曖昧さを避けるため、構文文法は、有効な ECMAScript の Script または Module を形成しないトークン列を許可する、一般化された生成規則を使用します。たとえば、この手法は、オブジェクトリテラルとオブジェクトの分割代入パターンに使用されます。そのような場合には、受理可能なトークン列をさらに制限する 、より制約の強い補助文法 が提供されます。通常、早期エラー規則 は、そのうえで、特定のコンテキストにおいて“p は n を被覆しなければならない ”と規定します。ここで、p は Parse Node(一般化された生成規則のインスタンス)、n は補助文法の非終端記号です。これは、以下を意味します。
p またはその子孫には、早期エラー規則 を適用しません。
最初に p と一致したトークン列を、n を開始記号 として再度解析します。n が文法パラメーターを取る場合、それらは、p が最初に解析されたときに使用された値と同じ値に設定されます。
トークン列を、トークンを一つも残さずに n の単一のインスタンスとして解析できる場合は、次のようにします。
その n のインスタンス(与えられた p に対して一意の Parse Node)を、“p によって被覆される n ”と呼びます。
“被覆しなければならない ”のさらなる適用によって修正されるとおりに、p によって被覆される n とその子孫に、早期エラー規則 を適用します。
そうでない場合(解析が失敗した場合)は、早期構文エラーです。
5.1.5 文法の表記
5.1.5.1 終端記号
ECMAScript の文法では、一部の終端記号は 等幅 フォントで示されます。これらは、記述されたとおりにソーステキスト内に現れなければなりません。この方法で指定されるすべての終端記号のコードポイントは、他の Unicode 範囲の外見が似たコードポイントではなく、基本ラテン文字ブロック内の対応する Unicode コードポイントとして解釈されます。終端記号内のコードポイントは、\ UnicodeEscapeSequence によって表現できません。
終端記号が個々の Unicode コードポイントである文法(すなわち、字句文法、RegExp 文法、および数値文字列文法)では、生成規則内に現れる複数の等幅のコードポイントの連続は、同じコードポイントの列をそれぞれ独立した終端記号として記述したものの、単なる短縮表記です。
たとえば、生成規則:
HexIntegerLiteral ::
0x
HexDigits
は、次の短縮表記です。
HexIntegerLiteral ::
0
x
HexDigits
一方、構文文法では、等幅のコードポイントの連続は、単一の終端記号です。
終端記号には、ほかに2つの形式があります。
5.1.5.2 非終端記号と生成規則
非終端記号は、斜体 で示されます。非終端記号の定義(“生成規則”とも呼ばれます)は、定義する非終端記号の名前と、それに続く一つ以上のコロンによって導入されます。(コロンの数は、その生成規則がどの文法に属するかを示します。)その後の行には、その非終端記号の右辺の選択肢が一つ以上続きます。たとえば、構文定義:
WhileStatement :
while
(
Expression
)
Statement
は、非終端記号 WhileStatement が、トークン while、それに続く左丸括弧トークン、続く Expression 、続く右丸括弧トークン、続く Statement を表すことを示します。ここに現れる Expression と Statement は、それ自体が非終端記号です。別の例として、構文定義:
ArgumentList :
AssignmentExpression
ArgumentList
,
AssignmentExpression
は、ArgumentList が、単一の AssignmentExpression 、または ArgumentList にカンマと AssignmentExpression が続くもののいずれかを表せることを示します。この ArgumentList の定義は再帰的です。つまり、それ自身を用いて定義されています。その結果、ArgumentList は、カンマで区切られた任意の正の個数の引数を含むことができ、各引数式は AssignmentExpression です。このような非終端記号の再帰的な定義は、一般的に使用されます。
5.1.5.3 省略可能な記号
終端記号または非終端記号の後に現れることがある下付きの接尾辞“opt ”は、省略可能な記号を示します。省略可能な記号を含む選択肢は、実際には、その省略可能な要素を省いたものと含めたものという、2つの右辺を指定します。これは、次の定義:
VariableDeclaration :
BindingIdentifier
Initializer opt
が、次の便利な省略表記であることを意味します。
VariableDeclaration :
BindingIdentifier
BindingIdentifier
Initializer
また、次の定義:
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
は、次の便利な省略表記です。
ForStatement :
for
(
LexicalDeclaration
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression
;
Expression opt
)
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 に続いて、最初の数字が偶数である一つ以上の10進数字が現れるもの、または、その後に別の10進数字が続かない単一の10進数字のいずれかと一致します。
これらの表記を構文文法で使用する場合、後続のトークンを決定するには、後の位置でどの字句開始記号 を使用するかを知る必要があるため、直後のトークン列を一意に特定できない場合があることに注意してください。したがって、これらを構文文法で使用する場合、使用する字句開始記号 の選択によって、seq が結果のトークン列の接頭部分になるかどうかが変わり得るならば、トークン列 seq が先読み制約に現れることは(列の集合の一部として現れる場合も含めて)、編集上の誤りとみなされます。
構文文法の生成規則の右辺に“[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
は、同じコードポイント列で ReservedWord を置き換えることができないという条件のもとで、非終端記号 Identifier を、IdentifierName を置き換えられる任意のコードポイント列で置き換えられることを意味します。
5.1.5.10 記述的な語句
最後に、すべての選択肢を列挙することが実用的ではない場合、一部の非終端記号は、サンセリフ体の記述的な語句によって説明されます。
SourceCharacter ::
any Unicode code point
5.2 アルゴリズムの規約
この仕様では、アルゴリズムの手順を規定するために、番号付きリストをよく使用します。これらのアルゴリズムは、ECMAScript 言語の構文要素に要求される意味論を正確に規定するために使用されます。これらのアルゴリズムは、特定の実装手法の使用を示唆することを意図していません。実際には、ある機能を実装するために、より効率的なアルゴリズムが存在する場合があります。
アルゴリズムは、カンマで区切られた順序付きの別名の列によって明示的にパラメーター化できます。これらの別名は、その位置に渡された引数を参照するために、アルゴリズムの手順内で使用できます。省略可能なパラメーターは、角括弧で囲んで([ , name ])示され、アルゴリズムの手順内では必須パラメーターと違いはありません。パラメーターリストの末尾には、先頭に省略記号を付けて(, ...name )示される残余パラメーターが現れる場合があります。残余パラメーターは、必須パラメーターと省略可能なパラメーターの後に渡されるすべての引数を、List にまとめます。そのような追加の引数がない場合、その List は空です。
アルゴリズムの手順は、順番に実行される副手順に細分化できます。副手順は字下げされ、それ自体をさらに字下げされた副手順に分割することもできます。副手順を識別するために階層的な番号付けの規約を使用し、第1階層の副手順には小文字のアルファベット、第2階層の副手順には小文字のローマ数字を付けます。3階層を超える階層が必要な場合は、この規則を繰り返し、第4階層では数字を使用します。たとえば:
最上位の手順副手順。 副手順。副手順の副手順。副手順の副手順の副手順副手順の副手順の副手順の副手順副手順の副手順の副手順の副手順の副手順
手順または副手順は、その副手順の実行条件となる“もし”述語として記述される場合があります。この場合、副手順は、その述語が真である場合にのみ適用されます。手順または副手順が“そうでなければ”という語で始まる場合、それは、同じ階層の直前の“もし”述語の手順を否定した述語です。
手順は、その副手順を反復して適用することを指定するために、“それぞれについて”または“繰り返す”で始まる場合があります。
“表明 :”で始まる手順は、そのアルゴリズムの不変条件を表明 します。このような表明 は、そうでなければ暗黙となるアルゴリズムの不変条件を明示するために使用されます。同様に、“注記 :”で始まる手順は、近くの手順に関連する文脈を提供します。表明 の手順と注記 の手順は、厳密に参考情報であり、追加の意味論的要件を課すものではないため、実装が検査する必要はありません。
アルゴリズムの手順は、“x を someValue とする”という形式を使用して、任意の値に対する名前付きの別名を宣言できます。これらの別名は、x と someValue の両方が同じ基礎データを参照し、どちらかへの変更が両方から見えるという点で、参照に似ています。この参照のような動作を避けたいアルゴリズムの手順は、右辺のコピーを明示的に作成するべきです。“x を someValue のコピーとする”は、someValue の浅いコピーを作成します。
宣言された別名は、以降の任意の手順から参照できますが、その別名の宣言より前の手順から参照してはなりません。別名は、“x を someOtherValue に設定する”という形式を使用して変更できます。
5.2.1 評価順序
アルゴリズムの手順に複雑な式が現れる場合、それらは左から右、内側から外側の順に評価されるものとして解釈されます。たとえば、次の手順:
A(B(), C.[[D]] ) + E(F()) を返す。
は、次と同等です。
tmp1 を B() とする。tmp2 を C.[[D]] とする。tmp3 を A(tmp1 , tmp2 ) とする。tmp4 を F() とする。tmp5 を E(tmp4 ) とする。tmp6 を tmp3 + tmp5 とする。tmp6 を返す。
ここで、各 tmpN の別名は一時的なものであり、これらの手順内でのみ参照できます。
5.2.2 抽象操作
この仕様の複数の箇所で利用しやすくするため、一部のアルゴリズムには名前が付けられ、パラメーター化された関数形式で記述されており、他のアルゴリズム内から名前で参照できるようになっています。これらを抽象操作 と呼びます。抽象操作は、通常、OperationName(arg1 , arg2 ) のような関数適用形式で参照されます。一部の抽象操作は、クラスに似た仕様上の抽象化の、多態的にディスパッチされるメソッドとして扱われます。このようなメソッドに似た抽象操作は、通常、someValue .OperationName(arg1 , arg2 ) のようなメソッド適用形式で参照されます。
5.2.3 構文指向操作
構文指向操作 とは、名前付きの操作であり、その定義は、ECMAScript のいずれかの文法の一つ以上の生成規則にそれぞれ関連付けられたアルゴリズムから構成されます。複数の定義の選択肢を持つ生成規則は、通常、各選択肢に対して別個のアルゴリズムを持ちます。アルゴリズムが文法の生成規則に関連付けられている場合、その生成規則の選択肢に含まれる終端記号と非終端記号を、アルゴリズムのパラメーターであるかのように参照できます。このように使用される場合、非終端記号は、ソーステキストの解析時に実際に一致する定義の選択肢を指します。文法の生成規則、またはそこから導かれた Parse Node に 一致するソーステキスト とは、一致に関与した最初の終端記号の先頭から始まり、一致に関与した最後の終端記号の末尾で終わる、ソーステキストの部分です。
アルゴリズムが生成規則の選択肢に関連付けられている場合、その選択肢は、通常、“[ ]”の文法注記 を一切付けずに示されます。このような注記 は、その選択肢の構文上の認識にのみ影響し、選択肢に関連付けられた意味論には影響しないようにするべきです。
構文指向操作は、次のアルゴリズムの手順 1 、3 、および 4 の規約を使用して、解析ノードと、必要に応じてその他のパラメーターを伴って呼び出されます。
status を SomeNonTerminal の SyntaxDirectedOperation とする。someParseNode を、あるソーステキストの解析結果とする。someParseNode の SyntaxDirectedOperation を実行する。引数 "value" を使用して、someParseNode の SyntaxDirectedOperation を実行する。
明示的に別の規定がない限り、すべての連鎖生成規則 は、その生成規則の左辺の非終端記号に適用され得るすべての操作について、暗黙の定義を持ちます。この暗黙の定義は、単に、同じ操作を、パラメーターがあれば同じパラメーターを使用して、連鎖生成規則 の右辺の唯一の非終端記号に再適用し、その結果を返します。たとえば、あるアルゴリズムに“Block の Evaluation を返す”という形式の手順があり、次の生成規則があるとします。
Block :
{
StatementList
}
しかし、Evaluation 操作は、この生成規則にアルゴリズムを関連付けていないとします。その場合、Evaluation 操作には、次の形式の関連付けが暗黙に含まれます。
Runtime Semantics: Evaluation
Block :
{
StatementList
}
StatementList の Evaluation を返す。
5.2.4 実行時意味論
実行時に呼び出さなければならない意味論を規定するアルゴリズムを、実行時意味論 と呼びます。実行時意味論は、抽象操作 または構文指向操作 によって定義されます。
5.2.4.1 Completion ( completionRecord )
抽象操作 Completion。引数 completionRecord (完了レコード )。戻り値:完了レコード 。 Completion Record が返されることを強調するために使用されます。 呼び出されると、次の手順を実行する。
表明 : completionRecord は Completion Record である。completionRecord を返す。
5.2.4.2 スロー
アルゴリズムの手順における“スローする”という語は、ThrowCompletion を呼び出した結果を返すことの短縮表記です。たとえば:
もし result .[[Error]] が none でなければ、result .[[Error]] をスローする。
は、次と同等です。
もし result .[[Error]] が none でなければ、ThrowCompletion (result .[[Error]] ) を返す。
特定の型の例外をスローすると記述されたアルゴリズムの手順は、スローするために、その型の例外を構築します。たとえば:
TypeError 例外をスローする。
は、次と同等です。
ThrowCompletion (新しく作成された TypeError オブジェクト) を返す。
5.2.4.3 Completion Record をアンラップするための短縮記法
接頭記号“?”と“!”は、Completion Record をアンラップする短縮記法として使用されます。“?”は、中断完了 を呼出し元へ伝播させるため、または、そうでない場合に正常完了 をアンラップするために使用されます。“!”は、Completion Record が正常であることを表明 し、それをアンラップするために使用されます。形式的には、次の手順:
result を ? record とする。
は、次と同等です。
表明 : record は Completion Record である。もし record が中断完了 であれば、record を返す。 result を record .[[Value]] とする。
同様に、次の手順:
result を ! record とする。
は、次と同等です。
表明 : record は正常完了 である。result を record .[[Value]] とする。
“?”または“!”がその他のコンテキストで使用される場合、まず、この規則を適用できるようになるまで、評価順序 で示される書換えを適用し、その後、この規則を適用します。たとえば、次の手順:
AO(? Other()) を実行する。
は、次のように書き換えられます。
tmp1 を Other() とする。tmp2 を ? tmp1 とする。AO(tmp2 ) を実行する。
これは、さらに次のように展開されます。
tmp1 を Other() とする。表明 : tmp1 は Completion Record である。もし tmp1 が中断完了 であれば、tmp1 を返す。 tmp2 を tmp1 .[[Value]] とする。AO(tmp2 ) を実行する。
5.2.4.4 暗黙の正常完了
Completion Record を返すと宣言された抽象操作 内のアルゴリズム、およびすべての組込み関数内では、返される値をまず NormalCompletion に渡し、代わりにその結果を使用します。この規則は、Completion アルゴリズム内、または返される値がその手順内で Completion Record と明示されている場合には適用されません。該当する場合は、以下のとおりです。
このような抽象操作 から、その他の手段で Completion Record が返される場合、それは編集上の誤りです。たとえば、これらの抽象操作 内では:
true を返す。
は、以下のいずれとも同じ意味です。
NormalCompletion (true ) を返す。
または:
completion を NormalCompletion (true ) とする。Completion (completion ) を返す。
または:
Completion Record { [[Type]] : normal , [[Value]] : true , [[Target]] : empty } を返す。
? 短縮記法の展開 により、次の例は許可されることに注意してください。展開後の手順では、中断の場合には Completion を適用した結果が直接返され、正常の場合にはアンラップの後に暗黙の NormalCompletion の適用が行われるためです。
? completion を返す。
次の例は、Completion Record が、その手順で注記 されることなく返されているため、編集上の誤りとなります。
completion を NormalCompletion (true ) とする。completion を返す。
5.2.5 静的意味論
文脈自由文法は、入力要素の流れが、評価可能な有効な ECMAScript の Script または Module を形成するかどうかを定義するすべての規則を表現するには、十分な表現力を持ちません。状況によっては、ECMAScript のアルゴリズム規約または文章による要件のいずれかを使用して表現される、追加の規則が必要です。このような規則は、常に文法の生成規則に関連付けられ、その生成規則の静的意味論 と呼ばれます。
静的意味論の規則には名前があり、通常はアルゴリズムを使用して定義されます。名前付きの静的意味論の規則は、文法の生成規則に関連付けられます。複数の定義の選択肢を持つ生成規則は、通常、各選択肢について、適用される名前付きの静的意味論の規則ごとに、別個のアルゴリズムを持ちます。
静的意味論の規則の特別な種類として、早期エラー規則 があります。早期エラー規則 は、特定の文法の生成規則に関連付けられた早期エラー 条件を定義します(箇条 17 を参照してください)。ほとんどの早期エラー規則 の評価は、この仕様のアルゴリズム内で明示的には呼び出されません。適合実装は、Script または Module を最初に評価する前に、その Script または Module の解析に使用された生成規則のすべての早期エラー規則 を検証しなければなりません。早期エラー規則 のいずれかに違反する場合、その Script または Module は無効であり、評価できません。
5.2.6 数学的操作
この仕様では、次の種類の数値を参照します。
この仕様の記述では、数値の種類の違いを、下付きの接尾辞を使用して区別します。下付き文字 𝔽 は Number を指し、下付き文字 ℤ は BigInt を指します。下付きの接尾辞を持たない数値は、数学的値 を指します。この仕様は、ほとんどの数値を10進数で表記します。また、0x に続いて 0-9 または A-F の数字を記述する形式の数値も、16進数の値として使用します。
一般に、この仕様が数値の種類を明示せずに、“y の長さ”や“4つの16進数字 ... で表される整数 ”などの語句で数値を参照する場合、その語句は数学的値 を指します。Number 値 または BigInt 値 を参照する語句には、その旨が明示されます。たとえば、“… 内のコードポイント数に対応する Number 値 ”または“… に対応する BigInt 値 ”です。
この仕様で 整数 という用語を使用する場合、特に断りがない限り、整数 の集合に属する数学的値 を指します。この仕様で 整数の Number という用語を使用する場合、その数学的値 が整数 の集合に属する、有限の Number 値 を指します。
+、×、=、および ≥ などの数値演算子は、オペランドの型によって決定される操作を指します。数学的値 に適用される場合、それらの演算子は、通常の数学的操作を指します。拡張数学的値 に適用される場合、それらの演算子は、拡張実数上の通常の数学的操作を指します。不定形は定義されておらず、この仕様内でのその使用は、編集上の誤りとみなすべきです。Number に適用される場合、それらの演算子は、IEEE 754-2019 内の対応する操作を指します。BigInt に適用される場合、それらの演算子は、BigInt の数学的値 に適用される通常の数学的操作を指します。異なる型のオペランド(たとえば、Number と数学的値 )に適用される数値演算子は定義されておらず、この仕様における編集上の誤りとみなすべきです。
数学値 と Number または BigInt との間の変換は、この文書では常に明示的です。数学値 または拡張数学値 x から Number への変換は、「x に対応する Number 値 」または 𝔽(x ) と表記され、6.1.6.1 で定義されます。整数 x から BigInt への変換は、「x に対応するBigInt 値 」または ℤ(x ) と表記されます。Number または BigInt x から数学値 への変換は、「x の数学値 」、または ℝ(x ) と表記されます。+0 𝔽 および -0 𝔽 の数学値 は数学値 0 です。有限でない値の数学値 は定義されません。x の拡張数学値 は、有限値については x の数学値 であり、+∞ 𝔽 および -∞ 𝔽 についてはそれぞれ +∞ および -∞ です。NaN については定義されません。
数学関数 abs(x ) は、x の絶対値を生成します。これは、x < 0 の場合は -x 、そうでない場合は x 自身です。
数学関数 ln(x ) は、x の自然対数を生成します。数学関数 log10(x ) は、x の底10の対数を生成します。数学関数 log2(x ) は、x の底2の対数を生成します。
数学関数 min(x1 , x2 , … , xN ) は、x1 から xN のうち、数学的に最小のものを生成します。数学関数 max(x1 , x2 , ..., xN ) は、x1 から xN のうち、数学的に最大のものを生成します。これらの数学関数の定義域と値域は、拡張数学的値 です。
表記“x modulo y ”(y は有限かつゼロでない必要があります)は、ある整数 q について abs (k ) < abs (y ) and x - k = q × y を満たし、y と同じ符号を持つ値 k (またはゼロ)を計算します。
“x を lower と upper の間に制限する 結果”という語句は(ここで、x は拡張数学的値 であり、lower と upper は lower ≤ upper を満たす数学的値 です)、x < lower の場合は lower 、x > upper の場合は upper 、そうでない場合は x を生成します。
数学関数 floor(x ) は、x 以下の最大の整数 (+∞ に最も近い整数 )を生成します。
注
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 (含む)までの区間 は、a から b までの閉区間 とも呼ばれ、a ≤ x ≤ b を満たす同じ数値型のすべての値 x を含み、それ以外の値を含みません。
a (含む)から b (含まない)までの区間 は、a ≤ x < b を満たす同じ数値型のすべての値 x を含み、それ以外の値を含みません。
a (含まない)から b (含む)までの区間 は、a < x ≤ b を満たす同じ数値型のすべての値 x を含み、それ以外の値を含みません。
a (含まない)から b (含まない)までの区間 は、a < x < b を満たす同じ数値型のすべての値 x を含み、それ以外の値を含みません。
たとえば、1(含む)から2(含まない)までの区間 は、1を含み2を含まない、1と2の間のすべての数学的値 から構成されます。区間 を定義する目的では、-0 𝔽 < +0 𝔽 とします。したがって、たとえば、下限が +0 𝔽 である閉区間 は、+0 𝔽 を含みますが、-0 𝔽 は含みません。NaN が区間 に含まれることはありません。
5.2.7 値の表記
この仕様では、ECMAScript 言語値 を太字 で表示します。例として、null 、true 、または "hello" があります。これらは、Function.prototype.apply や let n = 42; などの ECMAScript ソーステキスト と区別されます。
5.2.8 同一性
この仕様では、仕様値と ECMAScript 言語値 の両方について、等しいかどうかを比較します。等しいかどうかを比較するとき、値は2つの分類のいずれかに属します。同一性を持たない値 は、整数 の大きさや列の長さなど、その本来の特性がすべて同じであれば、他の同一性を持たない値と等しくなります。同一性を持たない値は、その特性を完全に記述することで、事前の参照なしに具現化できます。一方、同一性を持つ値 は、それぞれ一意であり、したがって自身とのみ等しくなります。同一性を持つ値は、同一性を持たない値に似ていますが、同一性 と呼ばれる、推測不可能、変更不可能、かつ普遍的に一意な特性を追加で持ちます。同一性自体は記述不可能であるため、既存の同一性を持つ値への参照を、単にその値を記述するだけで具現化することはできません。その代わり、これらの値への参照は、ある場所から別の場所へ明示的に渡されなければなりません。同一性を持つ値の一部は可変であり、その特性(同一性を除く)をその場で変更できるため、その値を保持するすべての主体が、新しい特性を観測することになります。同一性を持たない値が、同一性を持つ値と等しくなることはありません。
この仕様の観点では、“である”という語を、“もし bool が true であれば、...”のように、2つの値が等しいかどうかを比較するために使用します。また、“含む”という語を、“もし list が、r .[[Foo]] が true であるような Record r を含むならば、...”のように、等価比較を使用してリスト内の値を検索するために使用します。値の仕様上の同一性 は、これらの比較の結果を決定し、この仕様では公理として扱われます。
ECMAScript 言語の観点では、言語値が等しいかどうかは、抽象操作 SameValue と、それが推移的に呼び出す抽象操作 を使用して比較されます。これらの比較を行う抽象操作 のアルゴリズムが、ECMAScript 言語値 の言語上の同一性 を決定します。
仕様値について、仕様上の同一性を持たない値の例には、数学的値 と拡張数学的値 、ECMAScript ソーステキスト 、サロゲートペア 、ディレクティブプロローグ など、UTF-16 コード単位、Unicode コードポイント、列挙値、構文指向操作 やホストフック などを含む抽象操作 、および順序対が含まれますが、これらに限定されません。仕様上の同一性を持つ仕様値の例には、Property Descriptor 、PrivateElement などを含むあらゆる種類の Record 、Parse Node 、List 、Set と Relation 、Abstract Closure 、Data Block 、Private Name 、実行コンテキスト と実行コンテキストスタック 、エージェント識別子 、および WaiterList Record が含まれますが、これらに限定されません。
仕様上の同一性は、Symbol.for によって生成される Symbol 値を除く、すべての ECMAScript 言語値 について、言語上の同一性と一致します。仕様上の同一性と言語上の同一性のどちらも持たない ECMAScript 言語値 は、undefined 、null 、Boolean 、String 、Number 、および BigInt です。仕様上の同一性と言語上の同一性を持つ ECMAScript 言語値 は、Symbol のうち Symbol.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 と呼ばれる値を1つだけ持ちます。値が代入されていない変数は、値 undefined を持ちます。
6.1.2 Null 型
Null 型は、null と呼ばれる値を1つだけ持ちます。
6.1.3 Boolean 型
Boolean 型 は、true および false と呼ばれる2つの値を持つ論理的実体を表します。
6.1.4 String 型
String 型 は、0個以上の16ビット符号なし整数 値(「要素」)からなる、最大長 253 - 1 要素までの、すべての順序付き列の集合です。String 型は一般に、実行中の ECMAScript プログラム内のテキストデータを表すために使用され、その場合、String 内の各要素は UTF-16 コード単位値として扱われます。各要素は、列内の位置を占めるものとみなされます。これらの位置には、非負整数 によるインデックスが付けられます。最初の要素(存在する場合)はインデックス 0、次の要素(存在する場合)はインデックス 1 に位置し、以後同様です。String の長さは、その中に含まれる要素(すなわち16ビット値)の数です。空の String の長さは0であるため、要素を含みません。
String の内容を解釈しない ECMAScript の操作は、それ以上の意味論を適用しません。String 値を解釈する操作は、各要素を単一の UTF-16 コード単位として扱います。ただし、ECMAScript はこれらのコード単位の値や相互関係を制限しないため、String の内容を UTF-16 で符号化された Unicode コードポイントの列としてさらに解釈する操作では、不正な部分列を考慮しなければなりません。このような操作では、数値が 0xD800 以上 0xDBFF 以下の区間 にあるすべてのコード単位(Unicode 標準で先行サロゲート 、より正式には上位サロゲートコード単位 として定義されます)と、数値が 0xDC00 以上 0xDFFF 以下の区間 にあるすべてのコード単位(後続サロゲート 、より正式には下位サロゲートコード単位 として定義されます)を、次の規則を使用して特別に扱います。
先行サロゲート でも後続サロゲート でもないコード単位は、同じ値を持つコードポイントとして解釈されます。
2つのコード単位からなる列で、最初のコード単位 c1 が先行サロゲート であり、2番目のコード単位 c2 が後続サロゲート である場合、それはサロゲートペア であり、値 (c1 - 0xD800) × 0x400 + (c2 - 0xDC00) + 0x10000 を持つコードポイントとして解釈されます。(11.1.3 を参照)
先行サロゲート または後続サロゲート であるものの、サロゲートペア の一部ではないコード単位は、同じ値を持つコードポイントとして解釈されます。
関数 String.prototype.normalize(22.1.3.15 を参照)を使用して、String 値を明示的に正規化できます。String.prototype.localeCompare(22.1.3.12 を参照)は内部で String 値を正規化しますが、それ以外の操作は、操作対象の文字列を暗黙的に正規化しません。特に明記されていない限り、操作結果は言語やロケールに依存しません。
注
この設計の理由は、String の実装を可能な限り単純かつ高性能に保つことでした。ECMAScript ソーステキスト が正規化形式 C である場合、Unicode エスケープシーケンスを含まない限り、文字列リテラルも正規化されていることが保証されます。
この仕様では、「A 、B 、... の文字列連結 」(各引数は String 値、コード単位、またはコード単位の列です)という語句は、各引数(順番どおり)のコード単位(順番どおり)を連結したコード単位列を持つ String 値を表します。
「string の inclusiveStart から exclusiveEnd までの部分文字列 」(string は String 値またはコード単位の列であり、inclusiveStart と exclusiveEnd は整数 です)という語句は、インデックス inclusiveStart から始まり、インデックス exclusiveEnd の直前で終わる string の連続したコード単位からなる String 値を表します(inclusiveStart = exclusiveEnd の場合は空の String です)。「to」に相当する末尾部分が省略されている場合、string の長さが exclusiveEnd の値として使用されます。
「ASCII 単語文字 」という語句は、Unicode 基本ラテンブロック内のすべての英字と数字、および U+005F (LOW LINE) のみからなる、次の String 値を表します。
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_" .
歴史的な理由により、これはさまざまなアルゴリズムにおいて重要な意味を持ちます。
6.1.4.1 StringIndexOf ( string , searchValue , fromIndex )
抽象操作 StringIndexOf。引数 string (String)、searchValue (String) および fromIndex (非負整数)。戻り値:(非負整数 または not-found )。 呼び出されると、次の手順を実行する。
length を string の長さとする。searchValue が空の String であり、fromIndex ≤ length である場合、fromIndex を返す。searchLength を searchValue の長さとする。fromIndex ≤ i ≤ length - searchLength を満たす各整数 i について、昇順に、次を行う。candidate を string の i から i + searchLength までの部分文字列 とする。candidate が searchValue である場合、i を返す。not-found を返す。
注 1
searchValue が空の String であり、fromIndex ≤ string の長さである場合、このアルゴリズムは fromIndex を返します。空の String は、最後のコード単位の後を含め、文字列内のすべての位置で実質的に見つかります。
注 2
fromIndex + searchValue の長さ > string の長さである場合、このアルゴリズムは常に not-found を返します。
6.1.4.2 StringLastIndexOf ( string , searchValue , fromIndex )
抽象操作 StringLastIndexOf。引数 string (String)、searchValue (String) および fromIndex (非負整数)。戻り値:(非負整数 または not-found )。 呼び出されると、次の手順を実行する。
length を string の長さとする。searchLength を searchValue の長さとする。表明 : fromIndex + searchLength ≤ length 。0 ≤ i ≤ fromIndex を満たす各整数 i について、降順に、次を行う。candidate を string の i から i + searchLength までの部分文字列 とする。candidate が searchValue である場合、i を返す。 not-found を返す。
注
searchValue が空の String である場合、このアルゴリズムは fromIndex を返します。空の String は、最後のコード単位の後を含め、文字列内のすべての位置で実質的に見つかります。
6.1.5 Symbol 型
Symbol 型 は、Object プロパティのキーとして使用できる、String ではないすべての値の集合です(6.1.7 )。
各 Symbol は一意かつ不変です。
各 Symbol は、値が String または undefined のいずれかである、不変の [[Description]] 内部スロットを持ちます。
6.1.5.1 ウェルノウンシンボル
ウェルノウンシンボルは、この仕様のアルゴリズムによって明示的に参照される組込み Symbol 値です。これらは通常、仕様アルゴリズムの拡張ポイントとして機能する値を持つプロパティのキーとして使用されます。特に指定されていない限り、ウェルノウンシンボルの値はすべての Realm で共有されます(9.3 )。
この仕様内では、ウェルノウンシンボルは標準のイントリンシック表記 を使用して参照され、そのイントリンシックは 表 1 に列挙された値のいずれかです。
注 この仕様の以前の版では @@name という形式の表記が使用されていましたが、現行版では %Symbol.name% が使用されます。具体的には、@@asyncIterator、@@hasInstance、@@isConcatSpreadable、@@iterator 、@@match、@@matchAll、@@replace、@@search、@@species、@@split、@@toPrimitive、@@toStringTag、および @@unscopables という名前が使用されていました。
表 1: ウェルノウンシンボル
仕様上の名前
[[Description]]
値と目的
%Symbol.asyncDispose%
"Symbol.asyncDispose"
オブジェクトに対するリソースのクリーンアップを非同期に実行するメソッドです。AsyncDisposableStack オブジェクト、およびそれを含むスコープの評価が完了したときの await using 宣言によって呼び出されます。
%Symbol.asyncIterator%
"Symbol.asyncIterator"
オブジェクトの既定の非同期イテレーターを返すメソッドです。for-await-of 文の意味論によって呼び出されます。
%Symbol.dispose%
"Symbol.dispose"
オブジェクトに対する明示的なリソースのクリーンアップを実行するメソッドです。DisposableStack オブジェクト、AsyncDisposableStack オブジェクト、およびそれを含むスコープの評価が完了したときの using 宣言によって呼び出されます。
%Symbol.hasInstance%
"Symbol.hasInstance"
コンストラクター オブジェクトが、あるオブジェクトをそのコンストラクター のインスタンスの1つとして認識するかどうかを判定するメソッドです。instanceof 演算子の意味論によって呼び出されます。
%Symbol.isConcatSpreadable%
"Symbol.isConcatSpreadable"
true の場合に、オブジェクトを 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 には、Number と BigInt という2つの組込み数値型があります。次の抽象操作 は、これらの数値型に対して定義されています。「結果」列には戻り値の型とともに、その操作の一部の呼出しが中断完了 を返す可能性があるかどうかが示されています。
表 2: 数値型の操作
一般に数値型は、精度の損失や切り捨てなしには相互変換できないため、ECMAScript 言語はこれらの型の間に暗黙の変換を提供しません。別の型を必要とする関数を呼び出すとき、プログラマーは型を変換するために Number および BigInt 関数を明示的に呼び出さなければなりません。
注
ECMAScript の初版およびそれ以降の版では、特定の演算子について、精度を失ったり切り捨てたりする可能性のある暗黙の数値変換が提供されてきました。これらのレガシー な暗黙の変換は後方互換性のために維持されていますが、プログラマーの誤りの機会を最小限に抑え、将来の版で一般化された値型 を導入する選択肢を残すため、BigInt には提供されていません。
6.1.6.1 Number 型
Number 型 は正確に 18,437,736,874,454,810,627 個(すなわち 264 - 253 + 3 個)の値を持ち、IEEE 二進浮動小数点算術標準で規定されている倍精度浮動小数点 IEEE 754-2019 binary64 値を表す。ただし、IEEE 標準の 9,007,199,254,740,990 個(すなわち 253 - 2 個)の異なる NaN 値は、ECMAScript では単一の特別な NaN 値として表される。(NaN 値はプログラム式 NaN によって生成されることに注意。)一部の実装では、外部コードがさまざまな NaN 値の違いを検出できる場合があるが、そのような動作は実装定義 であり、ECMAScript コードにとって、すべての NaN 値は互いに区別できない。
注
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 である。その半分は正の数で、半分は負の数であり、各正の有限 Number には、同じ絶対値を持つ対応する負の 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 型において 2 つの表現、すなわち +0 𝔽 と -0 𝔽 を持つ。
有限 Number が非ゼロであり、それを表すために(上記の 2 つの形式のいずれかで)使用される整数 m が奇数である場合、その有限 Number は奇数仮数 を持つ。それ以外の場合、偶数仮数 を持つ。
この仕様において、「x に対する Number 値 」という語句で、x が正確な実数の数学的量(π のような無理数である場合もある)を表す場合、それは次の方法で選択される Number 値 を意味する。-0 𝔽 を除くすべての有限 Number の集合に、Number 型では表現できない 2 つの追加の値、すなわち 21024 (これは +1 × 253 × 2971 )および -21024 (これは -1 × 253 × 2971 )を加えた和集合からなる集合を考える。この集合の要素のうち、値が x に最も近いものを選択する。集合の 2 つの値が等しく近い場合は、偶数仮数を持つ方を選択する。この目的では、2 つの追加の値 21024 および -21024 は偶数仮数を持つものとみなす。最後に、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 ( number )
抽象操作 Number::unaryMinus。引数 number (Number)。戻り値:Number。 呼び出されると、次の手順を実行する。
number が NaN である場合、NaN を返す。number の否定を返す。すなわち、同じ大きさで反対の符号を持つ Number を計算する。
6.1.6.1.2 Number::bitwiseNOT ( number )
抽象操作 Number::bitwiseNOT。引数 number (Number)。戻り値:整数の Number 。 呼び出されると、次の手順を実行する。
oldValue を ! ToInt32 (number ) とする。oldValue のビット単位の補数を返す。結果の数学的値 は、32ビットの2の補数ビット列として正確に表現できる。
6.1.6.1.3 Number::exponentiate ( base , exponent )
抽象操作 Number::exponentiate。引数 base (Number) および exponent (Number)。戻り値:Number。 base を exponent 乗した結果を表す実装近似 値を返します。 呼び出されると、次の手順を実行する。
exponent が NaN である場合、NaN を返す。exponent が +0 𝔽 または -0 𝔽 のいずれかである場合、1 𝔽 を返す。base が NaN である場合、NaN を返す。base が +∞ 𝔽 である場合、exponent > +0 𝔽 である場合、+∞ 𝔽 を返す。+0 𝔽 を返す。base が -∞ 𝔽 である場合、exponent > +0 𝔽 である場合、exponent が奇数の整数 Number である場合、-∞ 𝔽 を返す。+∞ 𝔽 を返す。exponent が奇数の整数 Number である場合、-0 𝔽 を返す。+0 𝔽 を返す。base が +0 𝔽 である場合、exponent > +0 𝔽 である場合、+0 𝔽 を返す。+∞ 𝔽 を返す。base が -0 𝔽 である場合、exponent > +0 𝔽 である場合、exponent が奇数の整数 Number である場合、-0 𝔽 を返す。+0 𝔽 を返す。exponent が奇数の整数 Number である場合、-∞ 𝔽 を返す。+∞ 𝔽 を返す。表明 : base は有限 Number であり、+0 𝔽 でも -0 𝔽 でもない。exponent が +∞ 𝔽 である場合、abs (ℝ (base )) > 1 である場合、+∞ 𝔽 を返す。abs (ℝ (base )) = 1 である場合、NaN を返す。+0 𝔽 を返す。exponent が -∞ 𝔽 である場合、abs (ℝ (base )) > 1 である場合、+0 𝔽 を返す。abs (ℝ (base )) = 1 である場合、NaN を返す。+∞ 𝔽 を返す。表明 : exponent は有限 Number であり、+0 𝔽 でも -0 𝔽 でもない。base < -0 𝔽 であり、かつ exponent が整数 Number でない場合、NaN を返す。ℝ (base ) を ℝ (exponent ) 乗した結果を表す、実装によって近似された Number 値 を返す。
注
base が 1 𝔽 または -1 𝔽 で、exponent が +∞ 𝔽 または -∞ 𝔽 である場合、あるいは base が 1 𝔽 で exponent が NaN である場合の base ** exponent の結果は、IEEE 754-2019 と異なります。ECMAScript の初版では、この操作の結果として NaN が規定されていましたが、IEEE 754 の後の改訂では 1 𝔽 が規定されました。互換性のため、歴史的な ECMAScript の動作が維持されています。
6.1.6.1.4 Number::multiply ( x , y )
抽象操作 Number::multiply。引数 x (Number) および y (Number)。戻り値:Number。 IEEE 754-2019 の2進倍精度算術の規則に従って乗算を実行し、x と y の積を生成します。 呼び出されると、次の手順を実行する。
x が NaN または y が NaN である場合、NaN を返す。x が +∞ 𝔽 または -∞ 𝔽 のいずれかである場合、y が +0 𝔽 または -0 𝔽 のいずれかである場合、NaN を返す。y > +0 𝔽 である場合、x を返す。-x を返す。 y が +∞ 𝔽 または -∞ 𝔽 のいずれかである場合、x が +0 𝔽 または -0 𝔽 のいずれかである場合、NaN を返す。x > +0 𝔽 である場合、y を返す。-y を返す。 x が -0 𝔽 である場合、y が -0 𝔽 または y < -0 𝔽 である場合、+0 𝔽 を返す。-0 𝔽 を返す。y が -0 𝔽 である場合、x < -0 𝔽 である場合、+0 𝔽 を返す。-0 𝔽 を返す。𝔽 (ℝ (x ) × ℝ (y )) を返す。
注
有限精度の乗算は可換ですが、常に結合的であるとは限りません。
6.1.6.1.5 Number::divide ( x , y )
抽象操作 Number::divide。引数 x (Number) および y (Number)。戻り値:Number。 IEEE 754-2019 の2進倍精度算術の規則に従って除算を実行し、x を被除数、y を除数とした x と y の商を生成します。 呼び出されると、次の手順を実行する。
x が NaN または y が NaN である場合、NaN を返す。x が +∞ 𝔽 または -∞ 𝔽 のいずれかである場合、y が +∞ 𝔽 または -∞ 𝔽 のいずれかである場合、NaN を返す。y が +0 𝔽 または y > +0 𝔽 である場合、x を返す。-x を返す。 y が +∞ 𝔽 である場合、x が +0 𝔽 または x > +0 𝔽 である場合、+0 𝔽 を返す。-0 𝔽 を返す。y が -∞ 𝔽 である場合、x が +0 𝔽 または x > +0 𝔽 である場合、-0 𝔽 を返す。+0 𝔽 を返す。x が +0 𝔽 または -0 𝔽 のいずれかである場合、y が +0 𝔽 または -0 𝔽 のいずれかである場合、NaN を返す。y > +0 𝔽 である場合、x を返す。-x を返す。 y が +0 𝔽 である場合、x > +0 𝔽 である場合、+∞ 𝔽 を返す。-∞ 𝔽 を返す。y が -0 𝔽 である場合、x > +0 𝔽 である場合、-∞ 𝔽 を返す。+∞ 𝔽 を返す。𝔽 (ℝ (x ) / ℝ (y )) を返す。
6.1.6.1.6 Number::remainder ( numerator , denominator )
抽象操作 Number::remainder。引数 numerator (Number) および denominator (Number)。戻り値:Number。 numerator を被除数、denominator を除数とする、オペランドの暗黙の除算から余りを生成します。 呼び出されると、次の手順を実行する。
numerator が NaN または denominator が NaN である場合、NaN を返す。numerator が +∞ 𝔽 または -∞ 𝔽 のいずれかである場合、NaN を返す。denominator が +∞ 𝔽 または -∞ 𝔽 のいずれかである場合、numerator を返す。denominator が +0 𝔽 または -0 𝔽 のいずれかである場合、NaN を返す。numerator が +0 𝔽 または -0 𝔽 のいずれかである場合、numerator を返す。表明 : numerator は有限 Number であり、+0 𝔽 でも -0 𝔽 でもない。表明 : denominator は有限 Number であり、+0 𝔽 でも -0 𝔽 でもない。quotient を ℝ (numerator ) / ℝ (denominator ) とする。truncatedQuotient を truncate (quotient ) とする。remainder を ℝ (numerator ) - (ℝ (denominator ) × truncatedQuotient ) とする。remainder = 0 かつ numerator < -0 𝔽 である場合、-0 𝔽 を返す。𝔽 (remainder ) を返す。
注 1
C および C++ では、剰余演算子は整数 オペランドだけを受け入れます。ECMAScript では、浮動小数点オペランドも受け入れます。
注 2 % 演算子によって計算される浮動小数点剰余演算の結果は、
IEEE 754-2019 で定義される「remainder」演算と同じではありません。
IEEE 754-2019 の「remainder」演算は、切り捨て除算ではなく丸め除算によって余りを計算するため、その動作は通常の
整数 剰余演算子の動作とは類似していません。その代わり、ECMAScript 言語では、浮動小数点演算に対する
% が Java の
整数 剰余演算子と類似した方法で動作するよう定義されています。これは C ライブラリ関数 fmod と比較できます。
6.1.6.1.7 Number::add ( x , y )
抽象操作 Number::add。引数 x (Number) および y (Number)。戻り値:Number。 IEEE 754-2019 の2進倍精度算術の規則に従って加算を実行し、引数の和を生成します。 呼び出されると、次の手順を実行する。
x が NaN または y が NaN である場合、NaN を返す。x が +∞ 𝔽 であり、y が -∞ 𝔽 である場合、NaN を返す。x が -∞ 𝔽 であり、y が +∞ 𝔽 である場合、NaN を返す。x が +∞ 𝔽 または -∞ 𝔽 のいずれかである場合、x を返す。y が +∞ 𝔽 または -∞ 𝔽 のいずれかである場合、y を返す。表明 : x および y は有限 Number である。x が -0 𝔽 であり、y が -0 𝔽 である場合、-0 𝔽 を返す。𝔽 (ℝ (x ) + ℝ (y )) を返す。
注
有限精度の加算は可換ですが、常に結合的であるとは限りません。
6.1.6.1.8 Number::subtract ( x , y )
抽象操作 Number::subtract。引数 x (Number) および y (Number)。戻り値:Number。 減算を実行し、そのオペランドの差を生成します。x は被減数、y は減数です。 呼び出されると、次の手順を実行する。
Number::add (x , Number::unaryMinus (y )) を返す。
注
x - y は常に x + (-y) と同じ結果を生成します。
6.1.6.1.9 Number::leftShift ( x , y )
抽象操作 Number::leftShift。引数 x (Number) および y (Number)。戻り値:整数の Number 。 呼び出されると、次の手順を実行する。
leftNumber を ! ToInt32 (x ) とする。rightNumber を ! ToUint32 (y ) とする。shiftCount を ℝ (rightNumber ) modulo 32 とする。leftNumber を shiftCount ビット左シフトした結果を返す。結果の数学的値 は、32ビットの2の補数ビット列として正確に表現できる。
6.1.6.1.10 Number::signedRightShift ( x , y )
抽象操作 Number::signedRightShift。引数 x (Number) および y (Number)。戻り値:整数の Number 。 呼び出されると、次の手順を実行する。
leftNumber を ! ToInt32 (x ) とする。rightNumber を ! ToUint32 (y ) とする。shiftCount を ℝ (rightNumber ) modulo 32 とする。leftNumber を shiftCount ビット、符号拡張右シフトした結果を返す。最上位ビットが伝播される。結果の数学的値 は、32ビットの2の補数ビット列として正確に表現できる。
6.1.6.1.11 Number::unsignedRightShift ( x , y )
抽象操作 Number::unsignedRightShift。引数 x (Number) および y (Number)。戻り値:整数の Number 。 呼び出されると、次の手順を実行する。
leftNumber を ! ToUint32 (x ) とする。rightNumber を ! ToUint32 (y ) とする。shiftCount を ℝ (rightNumber ) modulo 32 とする。leftNumber を shiftCount ビット、ゼロ埋め右シフトした結果を返す。空いたビットはゼロで埋められる。結果の数学的値 は、32ビットの符号なしビット列として正確に表現できる。
6.1.6.1.12 Number::lessThan ( x , y )
抽象操作 Number::lessThan。引数 x (Number) および y (Number)。戻り値:(Boolean または undefined )。 呼び出されると、次の手順を実行する。
x が NaN である場合、undefined を返す。y が NaN である場合、undefined を返す。x が y である場合、false を返す。x が +0 𝔽 であり、y が -0 𝔽 である場合、false を返す。x が -0 𝔽 であり、y が +0 𝔽 である場合、false を返す。x が +∞ 𝔽 である場合、false を返す。y が +∞ 𝔽 である場合、true を返す。y が -∞ 𝔽 である場合、false を返す。x が -∞ 𝔽 である場合、true を返す。表明 : x および y は有限 Number である。ℝ (x ) < ℝ (y ) である場合、true を返す。false を返す。
6.1.6.1.13 Number::equal ( x , y )
抽象操作 Number::equal。引数 x (Number) および y (Number)。戻り値:Boolean。 呼び出されると、次の手順を実行する。
x が NaN である場合、false を返す。y が NaN である場合、false を返す。x が y である場合、true を返す。x が +0 𝔽 かつ y が -0 𝔽 である場合、true を返す。x が -0 𝔽 かつ y が +0 𝔽 である場合、true を返す。false を返す。
6.1.6.1.14 Number::sameValue ( x , y )
抽象操作 Number::sameValue。引数 x (Number) および y (Number)。戻り値:Boolean。 呼び出されると、次の手順を実行する。
x が NaN かつ y が NaN である場合、true を返す。x が +0 𝔽 かつ y が -0 𝔽 である場合、false を返す。x が -0 𝔽 かつ y が +0 𝔽 である場合、false を返す。x が y である場合、true を返す。false を返す。
6.1.6.1.15 Number::sameValueZero ( x , y )
抽象操作 Number::sameValueZero。引数 x (Number) および y (Number)。戻り値:Boolean。 呼び出されると、次の手順を実行する。
x が NaN かつ y が NaN である場合、true を返す。x が +0 𝔽 かつ y が -0 𝔽 である場合、true を返す。x が -0 𝔽 かつ y が +0 𝔽 である場合、true を返す。x が y である場合、true を返す。false を返す。
6.1.6.1.16 NumberBitwiseOp ( op , x , y )
抽象操作 NumberBitwiseOp。引数 op ((&、^ または |))、x (Number) および y (Number)。戻り値:整数の Number 。 呼び出されると、次の手順を実行する。
leftNumber を ! ToInt32 (x ) とする。rightNumber を ! ToInt32 (y ) とする。leftBits を ℝ (leftNumber ) を表す32ビットの2の補数ビット列とする。rightBits を ℝ (rightNumber ) を表す32ビットの2の補数ビット列とする。op が & である場合、result を leftBits と rightBits にビット単位 AND 演算を適用した結果とする。そうでなく、op が ^ である場合、result を leftBits と rightBits にビット単位排他的 OR(XOR)演算を適用した結果とする。 そうでない場合、表明 : op は | である。result を leftBits と rightBits にビット単位包含 OR 演算を適用した結果とする。 32ビットの2の補数ビット列 result によって表される整数 に対応する Number 値 を返す。
6.1.6.1.17 Number::bitwiseAND ( x , y )
抽象操作 Number::bitwiseAND。引数 x (Number) および y (Number)。戻り値:整数の Number 。 呼び出されると、次の手順を実行する。
NumberBitwiseOp (&, x , y ) を返す。
6.1.6.1.18 Number::bitwiseXOR ( x , y )
抽象操作 Number::bitwiseXOR。引数 x (Number) および y (Number)。戻り値:整数の Number 。 呼び出されると、次の手順を実行する。
NumberBitwiseOp (^, x , y ) を返す。
6.1.6.1.19 Number::bitwiseOR ( x , y )
抽象操作 Number::bitwiseOR。引数 x (Number) および y (Number)。戻り値:整数の Number 。 呼び出されると、次の手順を実行する。
NumberBitwiseOp (|, x , y ) を返す。
6.1.6.1.20 Number::toString ( x , radix )
抽象操作 Number::toString。引数 x (Number) および radix (an integer in the inclusive interval from 2 to 36)。戻り値:String。 基数 radix の位取り記数法を使用して x を String として表します。基数 r を使用した数値の表現に用いる数字は、"0123456789abcdefghijklmnopqrstuvwxyz" の先頭 r 個のコード単位から順番に取得されます。大きさが 1 𝔽 以上の数値の表現には、先頭のゼロは含まれません。 呼び出されると、次の手順を実行する。
x が NaN である場合、"NaN" を返す。x が +0 𝔽 または -0 𝔽 のいずれかである場合、"0" を返す。x < -0 𝔽 である場合、"-" と Number::toString (-x , radix ) の文字列連結 を返す。x が +∞ 𝔽 である場合、"Infinity" を返す。k ≥ 1、radix k - 1 ≤ s < radix k 、𝔽 (s × radix n - k ) が x であり、かつ k が可能な限り小さくなるような整数 n 、k 、および s とする。k は基数 radix を使用した s の表現の桁数であり、s は radix で割り切れず、s の最下位桁はこれらの条件によって必ずしも一意に決定されないことに注意する。radix ≠ 10 または n が -5 から 21 までの閉区間 にある場合、n ≥ k である場合、次の文字列連結 を返す。基数 radix を使用した s の表現の k 個の数字のコード単位 コード単位 0x0030 (DIGIT ZERO) の n - k 個の出現 n > 0 である場合、次の文字列連結 を返す。基数 radix を使用した s の表現の最上位 n 桁のコード単位 コード単位 0x002E (FULL STOP) 基数 radix を使用した s の表現の残りの k - n 桁のコード単位 表明 : n ≤ 0。次の文字列連結 を返す。コード単位 0x0030 (DIGIT ZERO) コード単位 0x002E (FULL STOP) コード単位 0x0030 (DIGIT ZERO) の -n 個の出現 基数 radix を使用した s の表現の k 個の数字のコード単位 注記 : この場合、入力は 1.2e+3 のような科学的 E 表記を使用して表される。表明 : radix は 10 である。n < 0 である場合、exponentSign をコード単位 0x002D (HYPHEN-MINUS) とする。そうでない場合、exponentSign をコード単位 0x002B (PLUS SIGN) とする。 k = 1 である場合、次の文字列連結 を返す。s の唯一の数字のコード単位コード単位 0x0065 (LATIN SMALL LETTER E) exponentSign abs (n - 1) の10進表現のコード単位 次の文字列連結 を返す。s の10進表現の最上位桁のコード単位コード単位 0x002E (FULL STOP) s の10進表現の残りの k - 1 桁のコード単位コード単位 0x0065 (LATIN SMALL LETTER E) exponentSign abs (n - 1) の10進表現のコード単位
注 1
以下の所見は実装の指針として役立つ場合がありますが、この標準の規範的要件の一部ではありません。
注 2
上記の規則で要求されるよりも高精度の変換を提供する実装については、手順 5 の次の代替版を指針として使用することを推奨します。
k ≥ 1、radix k - 1 ≤ s < radix k 、𝔽 (s × radix n - k ) が x であり、かつ k が可能な限り小さくなるような整数 n 、k 、および s とする。s に複数の可能性がある場合は、s × radix n - k が ℝ (x ) に最も近くなる s を選択する。そのような s の値が2つある場合は、偶数である方を選択する。k は基数 radix を使用した s の表現の桁数であり、s は radix で割り切れないことに注意する。
注 3
ECMAScript の実装者には、浮動小数点数の2進数から10進数への変換について David M. Gay が執筆した論文とコードが役立つ場合があります。
Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary Conversions. Numerical Analysis, Manuscript 90-10. AT&T Bell Laboratories (Murray Hill, New Jersey). 30 November 1990. 入手先:
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 型 は整数 値を表します。値は任意の大きさを持つことができ、特定のビット幅に制限されません。一般に、特に明記されていない限り、操作は数学的に正確な結果を返すように設計されています。二項演算では、BigInt は2の補数の2進文字列として動作し、負の数は左側に無限にビットが設定されているものとして扱われます。
6.1.6.2.1 BigInt::unaryMinus ( bigint )
抽象操作 BigInt::unaryMinus。引数 bigint (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。
bigint = 0 ℤ である場合、0 ℤ を返す。-bigint を返す。
6.1.6.2.2 BigInt::bitwiseNOT ( bigint )
抽象操作 BigInt::bitwiseNOT。引数 bigint (BigInt)。戻り値:BigInt。 bigint の1の補数を返します。 呼び出されると、次の手順を実行する。
-bigint - 1 ℤ を返す。
6.1.6.2.3 BigInt::exponentiate ( base , exponent )
抽象操作 BigInt::exponentiate。引数 base (BigInt) および exponent (BigInt)。戻り値:(正常完了 (値:BigInt) または throw 完了 )。 呼び出されると、次の手順を実行する。
exponent < 0 ℤ である場合、RangeError 例外をスローする。base = 0 ℤ かつ exponent = 0 ℤ である場合、1 ℤ を返す。base の exponent 乗を返す。
6.1.6.2.4 BigInt::multiply ( x , y )
抽象操作 BigInt::multiply。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。
x × y を返す。
注 結果のビット幅が入力よりはるかに大きくなった場合でも、数学的に正確な結果が与えられます。
6.1.6.2.5 BigInt::divide ( x , y )
抽象操作 BigInt::divide。引数 x (BigInt) および y (BigInt)。戻り値:(正常完了 (値:BigInt) または throw 完了 )。 呼び出されると、次の手順を実行する。
y = 0 ℤ である場合、RangeError 例外をスローする。quotient を ℝ (x ) / ℝ (y ) とする。ℤ (truncate (quotient )) を返す。
6.1.6.2.6 BigInt::remainder ( numerator , denominator )
抽象操作 BigInt::remainder。引数 numerator (BigInt) および denominator (BigInt)。戻り値:(正常完了 (値:BigInt) または throw 完了 )。 呼び出されると、次の手順を実行する。
denominator = 0 ℤ である場合、RangeError 例外をスローする。numerator = 0 ℤ である場合、0 ℤ を返す。quotient を ℝ (numerator ) / ℝ (denominator ) とする。truncatedQuotient を ℤ (truncate (quotient )) とする。numerator - (denominator × truncatedQuotient ) を返す。
注 結果の符号は被除数の符号です。
6.1.6.2.7 BigInt::add ( x , y )
抽象操作 BigInt::add。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。
x + y を返す。
6.1.6.2.8 BigInt::subtract ( x , y )
抽象操作 BigInt::subtract。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。
x - y を返す。
6.1.6.2.9 BigInt::leftShift ( x , y )
抽象操作 BigInt::leftShift。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。
y < 0 ℤ である場合、ℤ (floor (ℝ (x ) / 2-ℝ (y ) )) を返す。x × 2 ℤ y を返す。
注 ここでの意味論は、BigInt を無限長の2進2の補数の数字列として扱うビット単位シフトと同等であるべきです。
6.1.6.2.10 BigInt::signedRightShift ( x , y )
抽象操作 BigInt::signedRightShift。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。
BigInt::leftShift (x , -y ) を返す。
6.1.6.2.11 BigInt::unsignedRightShift ( x , y )
抽象操作 BigInt::unsignedRightShift。引数 x (BigInt) および y (BigInt)。戻り値:throw 完了 。 呼び出されると、次の手順を実行する。
TypeError 例外をスローする。
6.1.6.2.12 BigInt::lessThan ( x , y )
抽象操作 BigInt::lessThan。引数 x (BigInt) および y (BigInt)。戻り値:Boolean。 呼び出されると、次の手順を実行する。
ℝ (x ) < ℝ (y ) である場合、true を返す。false を返す。
6.1.6.2.13 BigInt::equal ( x , y )
抽象操作 BigInt::equal。引数 x (BigInt) および y (BigInt)。戻り値:Boolean。 呼び出されると、次の手順を実行する。
ℝ (x ) = ℝ (y ) である場合、true を返す。false を返す。
6.1.6.2.14 BinaryAnd ( x , y )
抽象操作 BinaryAnd。引数 x ((0 または 1)) および y ((0 または 1))。戻り値:(0 または 1)。 呼び出されると、次の手順を実行する。
x = 1 かつ y = 1 である場合、1 を返す。0 を返す。
6.1.6.2.15 BinaryOr ( x , y )
抽象操作 BinaryOr。引数 x ((0 または 1)) および y ((0 または 1))。戻り値:(0 または 1)。 呼び出されると、次の手順を実行する。
x = 1 または y = 1 である場合、1 を返す。0 を返す。
6.1.6.2.16 BinaryXor ( x , y )
抽象操作 BinaryXor。引数 x ((0 または 1)) および y ((0 または 1))。戻り値:(0 または 1)。 呼び出されると、次の手順を実行する。
x = 1 かつ y = 0 である場合、1 を返す。x = 0 かつ y = 1 である場合、1 を返す。0 を返す。
6.1.6.2.17 BigIntBitwiseOp ( op , x , y )
抽象操作 BigIntBitwiseOp。引数 op ((&、^ または |))、x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。
x を ℝ (x ) に設定する。y を ℝ (y ) に設定する。result を 0 とする。shift を 0 とする。(x = 0 または x = -1) かつ (y = 0 または y = -1) になるまで、次を繰り返す。xDigit を x modulo 2 とする。yDigit を y modulo 2 とする。op が & である場合、result を result + 2shift × BinaryAnd (xDigit , yDigit ) に設定する。そうでなく、op が | である場合、result を result + 2shift × BinaryOr (xDigit , yDigit ) に設定する。 そうでない場合、表明 : op は ^ である。result を result + 2shift × BinaryXor (xDigit , yDigit ) に設定する。 shift を shift + 1 に設定する。x を (x - xDigit ) / 2 に設定する。y を (y - yDigit ) / 2 に設定する。 op が & である場合、signBit を BinaryAnd (x modulo 2, y modulo 2) とする。そうでなく、op が | である場合、signBit を BinaryOr (x modulo 2, y modulo 2) とする。 そうでない場合、表明 : op は ^ である。signBit を BinaryXor (x modulo 2, y modulo 2) とする。 signBit ≠ 0 である場合、result を result - 2shift に設定する。注記 : これにより符号が拡張される。result に対応する BigInt 値 を返す。
6.1.6.2.18 BigInt::bitwiseAND ( x , y )
抽象操作 BigInt::bitwiseAND。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。
BigIntBitwiseOp (&, x , y ) を返す。
6.1.6.2.19 BigInt::bitwiseXOR ( x , y )
抽象操作 BigInt::bitwiseXOR。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。
BigIntBitwiseOp (^, x , y ) を返す。
6.1.6.2.20 BigInt::bitwiseOR ( x , y )
抽象操作 BigInt::bitwiseOR。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。
BigIntBitwiseOp (|, x , y ) を返す。
6.1.6.2.21 BigInt::toString ( x , radix )
抽象操作 BigInt::toString。引数 x (BigInt) および radix (an integer in the inclusive interval from 2 to 36)。戻り値:String。 基数 radix の位取り記数法を使用して x を String として表します。基数 r を使用した BigInt の表現に用いる数字は、"0123456789abcdefghijklmnopqrstuvwxyz" の先頭 r 個のコード単位から順番に取得されます。0 ℤ 以外の BigInt の表現には、先頭のゼロは含まれません。 呼び出されると、次の手順を実行する。
x < 0 ℤ である場合、"-" と BigInt::toString (-x , radix ) の文字列連結 を返す。基数 radix を使用した x の表現からなる String 値を返す。
6.1.7 Object 型
Object 型 の各インスタンスは、単に「Object」とも呼ばれ、プロパティの集合を表します。各プロパティは、データプロパティまたはアクセサープロパティのいずれかです。
データプロパティ は、キー値を ECMAScript 言語値 および Boolean 属性の集合に関連付けます。
アクセサープロパティ は、キー値を1つまたは2つのアクセサー関数、および Boolean 属性の集合に関連付けます。アクセサー関数は、そのプロパティに関連付けられた ECMAScript 言語値 を格納または取得するために使用されます。
オブジェクトのプロパティは、プロパティキー を使用して一意に識別されます。 プロパティキー は String または Symbol のいずれかです。空の String を含むすべての String および Symbol は、プロパティキー として有効です。プロパティ名 は、String であるプロパティキー です。
整数インデックス は、CanonicalNumericIndexString (n ) が +0 𝔽 から 𝔽 (253 - 1) までの閉区間 内の整数 Number を返すようなプロパティ名 n です。配列インデックス は、CanonicalNumericIndexString (n ) が +0 𝔽 から 𝔽 (232 - 2) までの閉区間 内の整数 Number を返すような整数インデックス n です。
注
すべての非負の安全な整数 には、対応する整数インデックス があります。232 - 1 を除くすべての32ビット符号なし整数 には、対応する配列インデックス があります。"-0" は整数インデックス でも配列インデックス でもありません。
プロパティキー は、プロパティとその値にアクセスするために使用されます。プロパティへのアクセスには、値の取得と代入にそれぞれ対応する get と set の2種類があります。get および set アクセスによってアクセス可能なプロパティには、オブジェクトの直接の一部である自身のプロパティ と、プロパティ継承関係を介して別の関連付けられたオブジェクトから提供される継承プロパティ の両方が含まれます。継承プロパティは、関連付けられたオブジェクトの自身のプロパティまたは継承プロパティのいずれでもかまいません。オブジェクトの各自身のプロパティは、そのオブジェクトの他の自身のプロパティのキー値とは異なるキー値を持たなければなりません。
すべてのオブジェクトは論理的にはプロパティの集合ですが、プロパティへのアクセスおよび操作の意味論が異なる複数の形式のオブジェクトがあります。複数の形式のオブジェクトの定義については、6.1.7.2 を参照してください。
さらに、一部のオブジェクトは呼出し可能です。これらは関数または関数オブジェクト と呼ばれ、以下でさらに説明します。ECMAScript のすべての関数は Object 型のメンバーです。
6.1.7.1 プロパティ属性
属性は、表 3 に記載されているように、Object プロパティの状態を定義および説明するために、この仕様で使用されます。明示的に指定されていない限り、各属性の初期値はその既定値です。
表 3: Object プロパティの属性
属性名
その属性が存在するプロパティの種類
値の領域
既定値
説明
[[Value]]
データプロパティ
ECMAScript 言語値
undefined
プロパティへの get アクセスによって取得される値です。
[[Writable]]
データプロパティ
Boolean
false
false の場合、ECMAScript コードが [[Set]] を使用してプロパティの [[Value]] 属性を変更しようとしても成功しません。
[[Getter]]
アクセサープロパティ
関数オブジェクト または undefined
undefined
値が undefined でない場合、プロパティへの get アクセスが実行されるたびに、プロパティ値を取得するため、その [[Call]] 内部メソッド(表 5 )が空の引数リストで呼び出されます。
[[Setter]]
アクセサープロパティ
関数オブジェクト または undefined
undefined
値が undefined でない場合、プロパティへの set アクセスが実行されるたびに、代入された値を唯一の引数として含む引数リストで、その [[Call]] 内部メソッド(表 5 )が呼び出されます。プロパティの [[Setter]] 内部メソッドの効果は、その後のプロパティの [[Getter]] 内部メソッドの呼出しによって返される値に影響を与える場合がありますが、その必要はありません。
[[Enumerable]]
データプロパティ またはアクセサープロパティ
Boolean
false
true の場合、そのプロパティは for-in 列挙(14.7.5 を参照)によって列挙されます。それ以外の場合、そのプロパティは列挙不可であるといいます。
[[Configurable]]
データプロパティ またはアクセサープロパティ
Boolean
false
false の場合、プロパティを削除する試み、データプロパティ からアクセサープロパティ またはアクセサープロパティ からデータプロパティ に変更する試み、あるいはその属性を変更する試み(既存の [[Value]] を置換する場合、または [[Writable]] を false に設定する場合を除く)は失敗します。
6.1.7.2 Object の内部メソッドと内部スロット
ECMAScript におけるオブジェクトの実際の意味論は、内部メソッド と呼ばれるアルゴリズムによって規定されます。ECMAScript エンジン内の各オブジェクトには、その実行時の動作を定義する内部メソッドの集合が関連付けられています。これらの内部メソッドは ECMAScript 言語の一部ではありません。これらは純粋に説明のため、この仕様によって定義されています。ただし、ECMAScript の実装内の各オブジェクトは、それに関連付けられた内部メソッドによって規定されるとおりに動作しなければなりません。これを実現する正確な方法は実装によって決定されます。
内部メソッド名は多態的です。これは、共通の内部メソッド名を異なるオブジェクト値に対して呼び出したとき、それぞれが異なるアルゴリズムを実行する場合があることを意味します。内部メソッドが呼び出される実際のオブジェクトが、その呼出しの「ターゲット」です。実行時に、アルゴリズムの実装が、オブジェクトがサポートしていない内部メソッドを使用しようとすると、TypeError 例外がスローされます。
内部スロットは、オブジェクト、Symbol、または Private Name に関連付けられ、さまざまな ECMAScript 仕様アルゴリズムによって使用される内部状態に対応します。内部スロットはオブジェクトのプロパティではなく、継承されません。特定の内部スロットの仕様に応じて、このような状態は任意の ECMAScript 言語型 の値、または特定の ECMAScript 仕様型の値から構成される場合があります。明示的に指定されていない限り、内部スロットはオブジェクト、Symbol、または Private Name の作成処理の一部として割り当てられ、動的に追加することはできません。特に指定されていない限り、内部スロットの初期値は値 undefined です。この仕様内のさまざまなアルゴリズムは、内部スロットを持つ値を作成します。ただし、ECMAScript 言語は内部スロットを直接操作する方法を提供しません。
すべてのオブジェクトは、PrivateElement の List である [[PrivateElements]] という名前の内部スロットを持ちます。この List は、オブジェクトのプライベートフィールド、メソッド、およびアクセサーの値を表します。初期状態では空の List です。
内部メソッドおよび内部スロットは、この仕様内では二重角括弧 [[ ]] で囲まれた名前によって識別されます。
表 4 は、ECMAScript コードによって作成または操作されるすべてのオブジェクトに適用される、この仕様で使用される必須内部メソッド をまとめたものです。すべてのオブジェクトは、すべての必須内部メソッドに対するアルゴリズムを持たなければなりません。ただし、すべてのオブジェクトがそれらのメソッドに同じアルゴリズムを使用するとは限りません。
通常オブジェクト は、次の基準をすべて満たすオブジェクトです。
表 4 に列挙された内部メソッドについて、そのオブジェクトは 10.1 で定義されたものを使用します。
オブジェクトが [[Call]] 内部メソッドを持つ場合、10.2.1 で定義されたもの、または 10.3.1 で定義されたもののいずれかを使用します。
オブジェクトが [[Construct]] 内部メソッドを持つ場合、10.2.2 で定義されたもの、または 10.3.2 で定義されたもののいずれかを使用します。
特殊オブジェクト は、通常オブジェクト ではないオブジェクトです。
この仕様では、特殊オブジェクト の種類を、それらのオブジェクトの内部メソッドによって区別します。特定の種類の特殊オブジェクト (Array 特殊オブジェクト や束縛関数特殊オブジェクト など)と動作上は同等であっても、その種類について規定された内部メソッドと同じ集合を持たないオブジェクトは、その種類の特殊オブジェクト として認識されません。
表 4 およびその他の同様の表は、各内部メソッドの呼出しパターンを説明します。呼出しパターンには、常に括弧で囲まれた説明的なパラメーター名のリストが含まれます。
内部メソッドは、そのパラメーターに加えて、メソッド呼出しのターゲットであるオブジェクトにも常にアクセスできます。
内部メソッドは、呼出しパターンに示された戻り値型の値をラップする正常完了 、またはスロー完了のいずれかである Completion Record を暗黙的に返します。
表 4: 必須内部メソッド
内部メソッド
説明
定義
[[GetPrototypeOf]] ( )
内部メソッド [[GetPrototypeOf]] 。引数なし。戻り値:(正常完了 (値:(Object または null )) または throw 完了 )。
このオブジェクトに継承プロパティを提供するオブジェクトを決定します。null 値は、そのようなオブジェクトが存在しないことを示します。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
[[SetPrototypeOf]] ( proto )
内部メソッド [[SetPrototypeOf]] 。引数 proto ((Object または null ))。戻り値:(正常完了 (値:Boolean) または throw 完了 )。
このオブジェクトを、継承プロパティを提供する別のオブジェクトに関連付けます。null を渡すと、継承プロパティを提供するオブジェクトが存在しないことを示します。操作が正常に完了したことを示す true 、または操作が成功しなかったことを示す false を返します。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
[[IsExtensible]] ( )
内部メソッド [[IsExtensible]] 。引数なし。戻り値:(正常完了 (値:Boolean) または throw 完了 )。
このオブジェクトに追加のプロパティを追加することが許可されているかどうかを判定します。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
[[PreventExtensions]] ( )
内部メソッド [[PreventExtensions]] 。引数なし。戻り値:(正常完了 (値:Boolean) または throw 完了 )。
このオブジェクトに新しいプロパティを追加できるかどうかを制御します。操作が成功した場合は true 、操作が失敗した場合は false を返します。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
[[GetOwnProperty]] ( propertyKey )
内部メソッド [[GetOwnProperty]] 。引数 propertyKey (プロパティキー )。戻り値:(正常完了 (値:(プロパティ記述子 または undefined )) または throw 完了 )。
キーが propertyKey であるこのオブジェクト自身のプロパティについて Property Descriptor を返し、そのようなプロパティが存在しない場合は undefined を返します。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
[[DefineOwnProperty]] ( propertyKey , propertyDesc )
内部メソッド [[DefineOwnProperty]] 。引数 propertyKey (プロパティキー ) および propertyDesc (プロパティ記述子 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。
キーが propertyKey である自身のプロパティを、propertyDesc に記述された状態を持つよう作成または変更します。操作が成功した場合は true 、プロパティを作成または更新できなかった場合は false を返します。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
[[HasProperty]] ( propertyKey )
内部メソッド [[HasProperty]] 。引数 propertyKey (プロパティキー )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。
このオブジェクトが、キーが propertyKey である自身のプロパティまたは継承プロパティのいずれかを既に持っているかどうかを示す Boolean を返します。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
[[Get]] ( propertyKey , receiver )
内部メソッド [[Get]] 。引数 propertyKey (プロパティキー ) および receiver (ECMAScript 言語値 )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。
このオブジェクトから、キーが propertyKey であるプロパティの値を返します。プロパティ値を取得するために ECMAScript コードを実行する必要がある場合、コードの評価時に receiver が this 値として使用されます。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
[[Set]] ( propertyKey , value , receiver )
内部メソッド [[Set]] 。引数 propertyKey (プロパティキー )、value (ECMAScript 言語値 ) および receiver (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。
キーが propertyKey であるプロパティの値を value に設定します。プロパティ値を設定するために ECMAScript コードを実行する必要がある場合、コードの評価時に receiver が this 値として使用されます。プロパティ値が設定された場合は true 、設定できなかった場合は false を返します。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
[[Delete]] ( propertyKey )
内部メソッド [[Delete]] 。引数 propertyKey (プロパティキー )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。
このオブジェクトから、キーが propertyKey である自身のプロパティを削除します。プロパティが削除されず、まだ存在する場合は false を返します。プロパティが削除されたか、存在しない場合は true を返します。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
[[OwnPropertyKeys]] ( )
内部メソッド [[OwnPropertyKeys]] 。引数なし。戻り値:(正常完了 (値:リスト (要素:プロパティキー )) または throw 完了 )。
要素がオブジェクト自身のすべてのプロパティキー である List を返します。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
表 5 は、関数として呼び出すことができるオブジェクトによってサポートされる追加の必須内部メソッドをまとめたものです。関数オブジェクト は、[[Call]] 内部メソッドをサポートするオブジェクトです。コンストラクター は、[[Construct]] 内部メソッドをサポートするオブジェクトです。[[Construct]] をサポートするすべてのオブジェクトは [[Call]] をサポートしなければなりません。すなわち、すべてのコンストラクター は関数オブジェクト でなければなりません。したがって、コンストラクター をコンストラクター 関数 またはコンストラクター 関数オブジェクト と呼ぶこともできます。
表 5: 関数オブジェクト の追加の必須内部メソッド
内部メソッド
説明
定義
[[Call]] ( thisArg , argList )
内部メソッド [[Call]] 。引数 thisArg (ECMAScript 言語値 ) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。
このオブジェクトに関連付けられたコードを実行します。関数呼出し式を介して呼び出されます。内部メソッドへの引数は、this 値と、関数呼出し式によって関数に渡された引数を要素とする List です。この内部メソッドを実装するオブジェクトは呼出し可能 です。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
[[Construct]] ( argList , newTarget )
内部メソッド [[Construct]] 。引数 argList (リスト (要素:ECMAScript 言語値 )) および newTarget (コンストラクター )。戻り値:(正常完了 (値:Object) または throw 完了 )。
オブジェクトを作成します。new 演算子または super 呼出しを介して呼び出されます。内部メソッドへの最初の引数は、コンストラクター 呼出しまたは super 呼出しの引数を要素とする List です。2番目の引数は、new 演算子が最初に適用されたオブジェクトです。この内部メソッドを実装するオブジェクトをコンストラクター と呼びます。関数オブジェクト は必ずしもコンストラクター ではなく、そのような非コンストラクター 関数オブジェクト は [[Construct]] 内部メソッドを持ちません。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
通常オブジェクト および標準特殊オブジェクト の必須内部メソッドの意味論は、箇条 10 で規定されています。特殊オブジェクト の内部メソッドの規定された使用を実装がサポートしていない場合、その使用を試みたときに TypeError 例外をスローしなければなりません。
6.1.7.3 必須内部メソッドの不変条件
ECMAScript エンジンの Object の内部メソッドは、以下に規定する不変条件の一覧に適合しなければなりません。通常の ECMAScript Object と、この仕様のすべての標準特殊オブジェクト は、これらの不変条件を維持します。ECMAScript Proxy オブジェクトは、[[ProxyHandler]] オブジェクト上で呼び出されるトラップの結果に対する実行時検査によって、これらの不変条件を維持します。
実装によって提供されるすべての特殊オブジェクト も、それらのオブジェクトについてこれらの不変条件を維持しなければなりません。これらの不変条件に違反すると、ECMAScript コードが予測不能な動作をしたり、セキュリティ上の問題が生じたりする可能性があります。ただし、これらの不変条件への違反によって、実装のメモリ安全性が損なわれることがあってはなりません。
実装は、必須内部メソッドの機能を、その不変条件を強制せずに実装する代替インターフェースを提供するなど、いかなる方法によってもこれらの不変条件を回避できるようにしてはなりません。
定義:
内部メソッドのターゲット は、その内部メソッドが呼び出されるオブジェクトです。
ターゲットが [[IsExtensible]] 内部メソッドから false を返すこと、または [[PreventExtensions]] 内部メソッドから true を返すことが観測された場合、そのターゲットは拡張不可 です。
存在しない プロパティとは、拡張不可のターゲット上に自身のプロパティとして存在しないプロパティです。
SameValue へのすべての参照は、SameValue アルゴリズムの定義に従います。
戻り値:
任意の内部メソッドによって返される値は、次のいずれかを持つ Completion Record でなければなりません。
[[Type]] = normal 、[[Target]] = empty 、および [[Value]] = その内部メソッドについて以下に示される「正常戻り値型」の値、または
[[Type]] = throw 、[[Target]] = empty 、および [[Value]] = 任意の ECMAScript 言語値 。
注 1
[[GetPrototypeOf]] ( )
正常戻り値型は Object または Null のいずれかです。
ターゲットが拡張不可であり、[[GetPrototypeOf]] が値 proto を返した場合、それ以降の [[GetPrototypeOf]] の呼出しはすべて、proto と SameValue である値を返すべきです。
注 2
オブジェクトのプロトタイプチェーンは有限長であるべきです(すなわち、任意のオブジェクトから開始し、その結果に [[GetPrototypeOf]] 内部メソッドを再帰的に適用すると、最終的に値 null に到達するべきです)。ただし、プロトタイプチェーンに、[[GetPrototypeOf]] の通常オブジェクト 定義を使用しない特殊オブジェクト が含まれる場合、この要件をオブジェクトレベルの不変条件として強制することはできません。このような循環プロトタイプチェーンは、オブジェクトのプロパティにアクセスするときに無限ループを引き起こす可能性があります。
[[SetPrototypeOf]] ( proto )
正常戻り値型は Boolean です。
ターゲットが拡張不可である場合、proto がターゲットで観測された [[GetPrototypeOf]] 値と SameValue でない限り、[[SetPrototypeOf]] は false を返さなければなりません。
[[IsExtensible]] ( )
正常戻り値型は Boolean です。
[[IsExtensible]] が false を返した場合、そのターゲットに対する以後の [[IsExtensible]] の呼出しはすべて false を返さなければなりません。
[[PreventExtensions]] ( )
正常戻り値型は Boolean です。
[[PreventExtensions]] が true を返した場合、そのターゲットに対する以後の [[IsExtensible]] の呼出しはすべて false を返さなければならず、そのターゲットは以後、拡張不可とみなされます。
[[GetOwnProperty]] ( propertyKey )
正常戻り値型は Property Descriptor または Undefined のいずれかです。
戻り値が Property Descriptor である場合、完全に設定された Property Descriptor でなければなりません。
propertyKey が構成不可かつ書込み不可の自身のデータプロパティ として記述された場合、それ以降の [[GetOwnProperty]] ( propertyKey ) の呼出しはすべて、[[Value]] が propertyKey の [[Value]] 属性と SameValue である Property Descriptor を返さなければなりません。
[[Writable]] および [[Value]] 以外の propertyKey の属性が時間の経過とともに変化する可能性がある場合、またはそのプロパティが削除される可能性がある場合、propertyKey の [[Configurable]] 属性は true でなければなりません。
[[Writable]] 属性が false から true に変更される可能性がある場合、[[Configurable]] 属性は true でなければなりません。
ターゲットが拡張不可であり、propertyKey が存在しない場合、そのターゲットに対する以後の [[GetOwnProperty]] (propertyKey ) の呼出しはすべて、propertyKey を存在しないものとして記述しなければなりません(すなわち [[GetOwnProperty]] (propertyKey ) は undefined を返さなければなりません)。
注 3
3番目の不変条件の結果として、プロパティがデータプロパティ として記述され、その値が時間の経過とともに異なる可能性がある場合、他の必須内部メソッドを介して値を変更する仕組みが公開されていない場合でも、[[Writable]] 属性と [[Configurable]] 属性の一方または両方が true でなければなりません。
[[DefineOwnProperty]] ( propertyKey , propertyDesc )
正常戻り値型は Boolean です。
propertyKey が以前にターゲットの構成不可の自身のプロパティとして観測されている場合、次のいずれかの場合を除き、[[DefineOwnProperty]] は false を返さなければなりません。
propertyKey が書込み可能なデータプロパティ である場合。構成不可で書込み可能なデータプロパティ は、構成不可で書込み不可のデータプロパティ に変更できます。
propertyDesc のすべての属性が propertyKey の属性と SameValue である場合。
ターゲットが拡張不可であり、propertyKey が存在しない自身のプロパティである場合、[[DefineOwnProperty]] (propertyKey , propertyDesc ) は false を返さなければなりません。すなわち、拡張不可のターゲットオブジェクトを新しいプロパティで拡張することはできません。
[[HasProperty]] ( propertyKey )
正常戻り値型は Boolean です。
propertyKey が以前にターゲットの構成不可の自身のデータプロパティ またはアクセサープロパティ として観測されている場合、[[HasProperty]] は true を返さなければなりません。
[[Get]] ( propertyKey , receiver )
正常戻り値型は任意の ECMAScript 言語型 です。
propertyKey が以前に値 value を持つ、ターゲットの構成不可かつ書込み不可の自身のデータプロパティ として観測されている場合、[[Get]] は value と SameValue である値を返さなければなりません。
propertyKey が以前に、[[Getter]] 属性が undefined であるターゲットの構成不可の自身のアクセサープロパティ として観測されている場合、[[Get]] 操作は undefined を返さなければなりません。
[[Set]] ( propertyKey , value , receiver )
正常戻り値型は Boolean です。
propertyKey が以前にターゲットの構成不可かつ書込み不可の自身のデータプロパティ として観測されている場合、value が propertyKey の [[Value]] 属性と SameValue でない限り、[[Set]] は false を返さなければなりません。
propertyKey が以前に、[[Setter]] 属性が undefined であるターゲットの構成不可の自身のアクセサープロパティ として観測されている場合、[[Set]] 操作は false を返さなければなりません。
[[Delete]] ( propertyKey )
正常戻り値型は Boolean です。
propertyKey が以前にターゲットの構成不可の自身のデータプロパティ またはアクセサープロパティ として観測されている場合、[[Delete]] は false を返さなければなりません。
[[OwnPropertyKeys]] ( )
正常戻り値型は List です。
返される List に重複する項目を含めてはなりません。
返される List の各要素はプロパティキー でなければなりません。
返される List には、以前に観測された構成不可のすべての自身のプロパティのキーが少なくとも含まれていなければなりません。
ターゲットが拡張不可である場合、返される List には [[GetOwnProperty]] を使用して観測可能なターゲット自身のすべてのプロパティのキーだけが含まれていなければなりません。
[[Call]] ( )
[[Construct]] ( )
正常戻り値型は Object です。
ターゲットは [[Call]] 内部メソッドも持たなければなりません。
6.1.7.4 ウェルノウンイントリンシックオブジェクト
ウェルノウンイントリンシックは、この仕様のアルゴリズムによって明示的に参照され、通常は Realm 固有の同一性を持つ組込みオブジェクトです。特に指定されていない限り、各イントリンシックオブジェクトは実際には Realm ごとに1つずつ存在する、類似するオブジェクトの集合に対応します。
この仕様内では、%name% のような参照は、その名前に対応する、現在の Realm に関連付けられたイントリンシックオブジェクトを意味します。%name.a.b% のような参照は、ECMAScript コードが評価される前に、イントリンシックオブジェクト %name% の "a" プロパティの値の "b" プロパティにアクセスしたかのような意味を持ちます。現在の Realm とそのイントリンシックの決定については、9.4 で説明します。ウェルノウンイントリンシックは 表 6 に列挙されています。
表 6: ウェルノウンイントリンシックオブジェクト
注
6.2 ECMAScript 仕様型
仕様型は、ECMAScript 言語構成要素および ECMAScript 言語型 の意味論を記述するためにアルゴリズム内で使用されるメタ値に対応します。仕様型には、Reference Record 、List 、Completion Record 、Property Descriptor 、Environment Record 、Abstract Closure 、および Data Block が含まれます。仕様型の値は仕様上の構成物であり、ECMAScript 実装内の特定の実体に必ずしも対応するものではありません。仕様型の値は、ECMAScript 式の評価における中間結果を記述するために使用できますが、そのような値をオブジェクトのプロパティや ECMAScript 言語変数の値として格納することはできません。
6.2.1 Enum 仕様型
Enum は、仕様内部の値であり、ECMAScript コードから直接観測することはできません。Enum は、サンセリフ 書体を使用した大文字ケバブケースで表記されます。たとえば、Completion Record の [[Type]] フィールドは、normal 、return 、または throw などの値を取ります。Enum は、その名前以外の特性を持ちません。Enum の名前は、他の Enum と区別する以外の目的を持たず、文脈におけるその使用法や意味について何も示唆しません。
6.2.2 List および Record 仕様型
List 型は、new 式、関数呼出し、および単純な順序付き値リストが必要なその他のアルゴリズムにおける引数リスト(13.3.8 を参照)の評価を説明するために使用されます。List 型の値は、個々の値を含むリスト要素の単純な順序付き列です。これらの列は任意の長さを持つことができます。リストの要素には、0 を起点とするインデックスを使用してランダムアクセスできます。表記上の便宜のため、配列に似た構文を使用して List の要素にアクセスできます。たとえば、args [2] は List args の第3要素を表す短縮表記です。
アルゴリズムが順序を指定せずに List の要素を反復する場合、使用される順序は List 内の要素の順序です。
この仕様内での表記上の便宜のため、リテラル構文を使用して新しい List 値を表すことができます。たとえば、« 1, 2 » は、それぞれ特定の値で初期化された2つの要素を持つ List 値を定義します。新しい空の List は « » と表すことができます。
この仕様では、「A 、B 、... のリスト連結 」(各引数は空であってもよい List)という語句は、各引数(順番どおり)の要素(順番どおり)を連結した要素を持つ新しい List 値を表します。
String の List に適用される場合、「辞書式コード単位順 に従ってソートする」という語句は、短い方の文字列の長さまで各コード単位の数値によってソートし、それらがすべて等しい場合は、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 から削除したりできます。Set 同士に対して和集合、積集合、または差集合を取ることができます。
Relation 型は、Set に対する制約を説明するために使用されます。Relation 型の値は、その値域に含まれる値の順序対からなる Set です。たとえば、Memory イベント 上の Relation は、Memory イベント の順序対の集合です。Relation R と、R の値域に含まれる2つの値 a および b について、a R b は、順序対 (a , b ) が R の要素であることを表す短縮表記です。ある条件に関して Relation が最小 Relation であるとは、その条件を満たす最小の Relation であることを意味します。
厳密半順序 は、以下を満たす Relation 値 R です。
注 1
上記の2つの性質は、それぞれ非反射性および推移性と呼ばれます。
厳密全順序 は、以下を満たす Relation 値 R です。
注 2
上記の3つの性質は、それぞれ完全性、非反射性、および推移性と呼ばれます。
6.2.4 Completion Record 仕様型
Completion Record 仕様型は、非局所的な制御移動を実行する文(break、continue、return、および throw)の動作など、値および制御フローの実行時の伝播を説明するために使用されます。
Completion Record は、表 7 で定義されるフィールドを持ちます。
表 7: Completion Record のフィールド
フィールド名
値
意味
[[Type]]
normal , break , continue , return , or throw
発生した完了の種類です。
[[Value]]
Completion Record を除く任意の値
生成された値です。
[[Target]]
String または empty
指向性のある制御移動の対象ラベルです。
Completion Record を参照するために、次の短縮用語が使用されることがあります。
正常完了 とは、[[Type]] 値が normal である任意の Completion Record を指します。
break 完了 とは、[[Type]] 値が break である任意の Completion Record を指します。
continue 完了 とは、[[Type]] 値が continue である任意の Completion Record を指します。
return 完了 とは、[[Type]] 値が return である任意の Completion Record を指します。
throw 完了 とは、[[Type]] 値が throw である任意の Completion Record を指します。
中断完了 とは、[[Type]] 値が normal 以外である任意の Completion Record を指します。
ある型の値を含む正常完了 とは、その [[Value]] フィールドにその型の値を持つ正常完了を指します。
この仕様で定義される呼出し可能オブジェクトは、正常完了またはスロー完了のみを返します。それ以外の種類の Completion Record を返すことは編集上の誤りとみなされます。
実装定義 の呼出し可能オブジェクトは、正常完了またはスロー完了のいずれかを返さなければなりません。
6.2.4.1 NormalCompletion ( value )
抽象操作 NormalCompletion。引数 value (any value except a Completionレコード )。戻り値:正常完了 。 呼び出されると、次の手順を実行する。
Completion Record { [[Type]] : normal , [[Value]] : value , [[Target]] : empty } を返す。
6.2.4.2 ThrowCompletion ( value )
抽象操作 ThrowCompletion。引数 value (ECMAScript 言語値 )。戻り値:throw 完了 。 呼び出されると、次の手順を実行する。
Completion Record { [[Type]] : throw , [[Value]] : value , [[Target]] : empty } を返す。
6.2.4.3 ReturnCompletion ( value )
抽象操作 ReturnCompletion。引数 value (ECMAScript 言語値 )。戻り値:return 完了 。 呼び出されると、次の手順を実行する。
Completion Record { [[Type]] : return , [[Value]] : value , [[Target]] : empty } を返す。
6.2.4.4 UpdateEmpty ( completionRecord , value )
抽象操作 UpdateEmpty。引数 completionRecord (完了レコード ) および value (any value except a Completionレコード )。戻り値:完了レコード 。 呼び出されると、次の手順を実行する。
表明 : completionRecord が return 完了 または throw 完了 のいずれかである場合、completionRecord .[[Value]] は empty ではない。completionRecord .[[Value]] が empty でない場合、? completionRecord を返す。Completion Record { [[Type]] : completionRecord .[[Type]] , [[Value]] : value , [[Target]] : completionRecord .[[Target]] } を返す。
6.2.5 Reference Record 仕様型
Reference Record 型は、delete、typeof、代入演算子、super キーワード 、およびその他の言語機能などの演算子の動作を説明するために使用されます。たとえば、代入の左辺オペランドは Reference Record を生成することが期待されます。
Reference Record は、解決済みの名前または(まだ解決されていない可能性のある)プロパティ束縛です。そのフィールドは 表 8 によって定義されます。
表 8: Reference Record のフィールド
この仕様では、Reference Record を操作するために次の抽象操作 を使用します。
6.2.5.1 IsPropertyReference ( refRecord )
抽象操作 IsPropertyReference。引数 refRecord (Referenceレコード )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
refRecord .[[Base]] が unresolvable である場合、false を返す。refRecord .[[Base]] が Environment Record である場合、false を返す。true を返す。
6.2.5.2 IsUnresolvableReference ( refRecord )
抽象操作 IsUnresolvableReference。引数 refRecord (Referenceレコード )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
refRecord .[[Base]] が unresolvable である場合、true を返す。false を返す。
6.2.5.3 IsSuperReference ( refRecord )
抽象操作 IsSuperReference。引数 refRecord (Referenceレコード )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
refRecord .[[ThisValue]] が empty である場合、false を返す。true を返す。
6.2.5.4 IsPrivateReference ( refRecord )
抽象操作 IsPrivateReference。引数 refRecord (Referenceレコード )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
refRecord .[[ReferencedName]] が Private Name である場合、true を返す。false を返す。
6.2.5.5 GetValue ( refRecord )
抽象操作 GetValue。引数 refRecord ((Referenceレコード または ECMAScript 言語値 ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 呼び出されると、次の手順を実行する。
refRecord が Reference Record でない場合、refRecord を返す。IsUnresolvableReference (refRecord ) が true である場合、ReferenceError 例外をスローする。IsPropertyReference (refRecord ) が true である場合、baseObj を ? ToObject (refRecord .[[Base]] ) とする。IsPrivateReference (refRecord ) が true である場合、? PrivateGet (baseObj , refRecord .[[ReferencedName]] ) を返す。 refRecord .[[ReferencedName]] がプロパティキー でない場合、refRecord .[[ReferencedName]] を ? ToPropertyKey (refRecord .[[ReferencedName]] ) に設定する。? baseObj .[[Get]] (refRecord .[[ReferencedName]] , GetThisValue (refRecord )) を返す。 base を refRecord .[[Base]] とする。表明 : base は Environment Record である。? base .GetBindingValue (refRecord .[[ReferencedName]] , refRecord .[[Strict]] ) を返す(9.1 を参照)。
注
手順 3.a で作成される可能性のあるオブジェクトには、上記の抽象操作 および通常オブジェクト の [[Get]] 内部メソッドの外部からアクセスすることはできません。実装は、実際にオブジェクトを作成することを避けてもかまいません。
6.2.5.6 PutValue ( refRecord , value )
抽象操作 PutValue。引数 refRecord ((Referenceレコード または ECMAScript 言語値 )) および value (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または 中途完了)。 呼び出されると、次の手順を実行する。
refRecord が Reference Record でない場合、ReferenceError 例外をスローする。IsUnresolvableReference (refRecord ) が true である場合、refRecord .[[Strict]] が true である場合、ReferenceError 例外をスローする。globalObj を GetGlobalObject () とする。? Set (globalObj , refRecord .[[ReferencedName]] , value , false ) を実行する。 unused を返す。IsPropertyReference (refRecord ) が true である場合、baseObj を ? ToObject (refRecord .[[Base]] ) とする。IsPrivateReference (refRecord ) が true である場合、? PrivateSet (baseObj , refRecord .[[ReferencedName]] , value ) を返す。 refRecord .[[ReferencedName]] がプロパティキー でない場合、refRecord .[[ReferencedName]] を ? ToPropertyKey (refRecord .[[ReferencedName]] ) に設定する。succeeded を ? baseObj .[[Set]] (refRecord .[[ReferencedName]] , value , GetThisValue (refRecord )) とする。succeeded が false かつ refRecord .[[Strict]] が true である場合、TypeError 例外をスローする。unused を返す。base を refRecord .[[Base]] とする。表明 : base は Environment Record である。? base .SetMutableBinding (refRecord .[[ReferencedName]] , value , refRecord .[[Strict]] ) を返す(9.1 を参照)。
注
手順 3.a で作成される可能性のあるオブジェクトには、上記の抽象操作 および通常オブジェクト の [[Set]] 内部メソッドの外部からアクセスすることはできません。実装は、そのオブジェクトを実際に作成することを避けてもかまいません。
6.2.5.7 GetThisValue ( refRecord )
抽象操作 GetThisValue。引数 refRecord (Referenceレコード )。戻り値:ECMAScript 言語値 。 呼び出されると、次の手順を実行する。
表明 : IsPropertyReference (refRecord ) は true である。IsSuperReference (refRecord ) が true である場合、refRecord .[[ThisValue]] を返す。refRecord .[[Base]] を返す。
6.2.5.8 InitializeReferencedBinding ( refRecord , value )
抽象操作 InitializeReferencedBinding。引数 refRecord (Referenceレコード ) および value (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または 中途完了)。 呼び出されると、次の手順を実行する。
表明 : IsUnresolvableReference (refRecord ) は false である。base を refRecord .[[Base]] とする。表明 : base は Environment Record である。? base .InitializeBinding (refRecord .[[ReferencedName]] , value ) を返す。
6.2.5.9 MakePrivateReference ( baseValue , privateIdentifier )
抽象操作 MakePrivateReference。引数 baseValue (ECMAScript 言語値 ) および privateIdentifier (String)。戻り値:Referenceレコード 。 呼び出されると、次の手順を実行する。
privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。表明 : privateEnv は null ではない。privateName を ResolvePrivateIdentifier (privateEnv , privateIdentifier ) とする。Reference Record { [[Base]] : baseValue , [[ReferencedName]] : privateName , [[Strict]] : true , [[ThisValue]] : empty } を返す。
6.2.6 Property Descriptor 仕様型
Property Descriptor 型は、Object プロパティ属性の操作および実体化を説明するために使用されます。Property Descriptor は0個以上のフィールドを持つ Record であり、各フィールドの名前は属性名、その値は 6.1.7.1 で規定される対応する属性値です。この仕様内で Property Descriptor Record のリテラル記述に印を付けるために使用されるスキーマ名は「PropertyDescriptor」です。
Property Descriptor 値は、特定のフィールドの存在または使用に基づいて、データ Property Descriptor とアクセサー Property Descriptor にさらに分類できます。データ Property Descriptor は、[[Value]] または [[Writable]] という名前のフィールドのいずれかを含むものです。アクセサー Property Descriptor は、[[Getter]] または [[Setter]] という名前のフィールドのいずれかを含むものです。任意の Property Descriptor は [[Enumerable]] および [[Configurable]] という名前のフィールドを持つことができます。Property Descriptor 値が、データ Property Descriptor とアクセサー Property Descriptor の両方になることはできません。ただし、どちらでもない場合があります(この場合は汎用 Property Descriptor です)。完全に設定された Property Descriptor とは、アクセサー Property Descriptor またはデータ Property Descriptor のいずれかであり、表 3 で定義される対応するすべてのフィールドを持つものです。
この仕様では、Property Descriptor 値を操作するために次の抽象操作 を使用します。
6.2.6.1 IsAccessorDescriptor ( propertyDesc )
抽象操作 IsAccessorDescriptor。引数 propertyDesc (プロパティ記述子 )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
propertyDesc が [[Getter]] フィールドを持つ場合、true を返す。propertyDesc が [[Setter]] フィールドを持つ場合、true を返す。false を返す。
6.2.6.2 IsDataDescriptor ( propertyDesc )
抽象操作 IsDataDescriptor。引数 propertyDesc (プロパティ記述子 )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
propertyDesc が [[Value]] フィールドを持つ場合、true を返す。propertyDesc が [[Writable]] フィールドを持つ場合、true を返す。false を返す。
6.2.6.3 IsGenericDescriptor ( propertyDesc )
抽象操作 IsGenericDescriptor。引数 propertyDesc (プロパティ記述子 )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
IsAccessorDescriptor (propertyDesc ) が true である場合、false を返す。IsDataDescriptor (propertyDesc ) が true である場合、false を返す。true を返す。
6.2.6.4 FromPropertyDescriptor ( propertyDesc )
抽象操作 FromPropertyDescriptor。引数 propertyDesc ((プロパティ記述子 または undefined ))。戻り値:(Object または undefined )。 呼び出されると、次の手順を実行する。
propertyDesc が undefined である場合、undefined を返す。obj を OrdinaryObjectCreate (%Object.prototype% ) とする。表明 : obj は、自身のプロパティを持たない拡張可能な通常オブジェクト である。propertyDesc が [[Value]] フィールドを持つ場合、! CreateDataPropertyOrThrow (obj , "value" , propertyDesc .[[Value]] ) を実行する。 propertyDesc が [[Writable]] フィールドを持つ場合、! CreateDataPropertyOrThrow (obj , "writable" , propertyDesc .[[Writable]] ) を実行する。 propertyDesc が [[Getter]] フィールドを持つ場合、! CreateDataPropertyOrThrow (obj , "get" , propertyDesc .[[Getter]] ) を実行する。 propertyDesc が [[Setter]] フィールドを持つ場合、! CreateDataPropertyOrThrow (obj , "set" , propertyDesc .[[Setter]] ) を実行する。 propertyDesc が [[Enumerable]] フィールドを持つ場合、! CreateDataPropertyOrThrow (obj , "enumerable" , propertyDesc .[[Enumerable]] ) を実行する。 propertyDesc が [[Configurable]] フィールドを持つ場合、! CreateDataPropertyOrThrow (obj , "configurable" , propertyDesc .[[Configurable]] ) を実行する。 obj を返す。
6.2.6.5 ToPropertyDescriptor ( obj )
抽象操作 ToPropertyDescriptor。引数 obj (ECMAScript 言語値 )。戻り値:(正常完了 (値:プロパティ記述子 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
obj が Object でない場合、TypeError 例外をスローする。propertyDesc を、初期状態でフィールドを持たない新しい Property Descriptor とする。hasEnumerable を ? HasProperty (obj , "enumerable" ) とする。hasEnumerable が true である場合、enumerable を ToBoolean (? Get (obj , "enumerable" )) とする。propertyDesc .[[Enumerable]] を enumerable に設定する。hasConfigurable を ? HasProperty (obj , "configurable" ) とする。hasConfigurable が true である場合、configurable を ToBoolean (? Get (obj , "configurable" )) とする。propertyDesc .[[Configurable]] を configurable に設定する。hasValue を ? HasProperty (obj , "value" ) とする。hasValue が true である場合、value を ? Get (obj , "value" ) とする。propertyDesc .[[Value]] を value に設定する。hasWritable を ? HasProperty (obj , "writable" ) とする。hasWritable が true である場合、writable を ToBoolean (? Get (obj , "writable" )) とする。propertyDesc .[[Writable]] を writable に設定する。hasGet を ? HasProperty (obj , "get" ) とする。hasGet が true である場合、getter を ? Get (obj , "get" ) とする。IsCallable (getter ) が false かつ getter が undefined でない場合、TypeError 例外をスローする。propertyDesc .[[Getter]] を getter に設定する。hasSet を ? HasProperty (obj , "set" ) とする。hasSet が true である場合、setter を ? Get (obj , "set" ) とする。IsCallable (setter ) が false かつ setter が undefined でない場合、TypeError 例外をスローする。propertyDesc .[[Setter]] を setter に設定する。propertyDesc が [[Getter]] フィールドを持つか、propertyDesc が [[Setter]] フィールドを持つ場合、propertyDesc が [[Value]] フィールドを持つか、propertyDesc が [[Writable]] フィールドを持つ場合、TypeError 例外をスローする。propertyDesc を返す。
6.2.6.6 CompletePropertyDescriptor ( propertyDesc )
抽象操作 CompletePropertyDescriptor。引数 propertyDesc (プロパティ記述子 )。戻り値:unused 。 呼び出されると、次の手順を実行する。
like を Record { [[Value]] : undefined , [[Writable]] : false , [[Getter]] : undefined , [[Setter]] : undefined , [[Enumerable]] : false , [[Configurable]] : false } とする。IsGenericDescriptor (propertyDesc ) が true または IsDataDescriptor (propertyDesc ) が true である場合、propertyDesc が [[Value]] フィールドを持たない場合、propertyDesc .[[Value]] を like .[[Value]] に設定する。propertyDesc が [[Writable]] フィールドを持たない場合、propertyDesc .[[Writable]] を like .[[Writable]] に設定する。そうでない場合、propertyDesc が [[Getter]] フィールドを持たない場合、propertyDesc .[[Getter]] を like .[[Getter]] に設定する。propertyDesc が [[Setter]] フィールドを持たない場合、propertyDesc .[[Setter]] を like .[[Setter]] に設定する。 propertyDesc が [[Enumerable]] フィールドを持たない場合、propertyDesc .[[Enumerable]] を like .[[Enumerable]] に設定する。propertyDesc が [[Configurable]] フィールドを持たない場合、propertyDesc .[[Configurable]] を like .[[Configurable]] に設定する。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 を返す場合、その Completion Record は正常完了 またはスロー完了のいずれかでなければなりません。
Abstract Closure は、次の例に示すように、他のアルゴリズムの一部としてインラインで作成されます。
addend を 41 とする。closure を、パラメーター (x ) を持ち、addend を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。x + addend を返す。value を closure (1) とする。表明 : value は 42 である。
6.2.9 データブロック
Data Block 仕様型は、バイトサイズ(8ビット)の数値からなる、独立した可変の列を記述するために使用されます。バイト値 は、0 から 255 までの閉区間 内の整数 です。Data Block 値は固定数のバイトで作成され、各バイトの初期値は 0 です。
この仕様内での表記上の便宜のため、配列に似た構文を使用して Data Block 値の個々のバイトにアクセスできます。この表記では、Data Block 値を 0 を起点とする整数インデックス付き のバイト列として表します。たとえば、dataBlock が5バイトの Data Block 値である場合、dataBlock [2] を使用してその第3バイトにアクセスできます。
複数のエージェント から同時に参照できるメモリに存在する Data Block は、Shared Data Block と指定されます。Shared Data Block は、Shared Data Block 値の等価性を検査する目的でアドレス非依存 の同一性を持ちます。これは、ブロックが任意のプロセス内でマッピングされている仮想アドレスではなく、そのブロックが表すメモリ内の位置の集合に結び付けられます。2つの Data Block が等しいのは、それらが含む位置の集合が等しい場合に限ります。それ以外の場合、それらは等しくなく、それらが含む位置の集合の共通部分は空です。最後に、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 )
抽象操作 CreateByteDataBlock。引数 size (非負整数)。戻り値:(正常完了 (値:データブロック ) または throw 完了 )。 呼び出されると、次の手順を実行する。
size > 253 - 1 である場合、RangeError 例外をスローする。dataBlock を size バイトからなる新しい Data Block 値とする。そのような Data Block を作成できない場合、RangeError 例外をスローする。dataBlock のすべてのバイトを 0 に設定する。dataBlock を返す。
6.2.9.2 CreateSharedByteDataBlock ( size )
抽象操作 CreateSharedByteDataBlock。引数 size (非負整数)。戻り値:(正常完了 (値:共有データブロック ) または throw 完了 )。 呼び出されると、次の手順を実行する。
dataBlock を size バイトからなる新しい Shared Data Block 値とする。そのような Shared Data Block を作成できない場合、RangeError 例外をスローする。agentRecord を周囲のエージェント の Agent Record とする。execution を agentRecord .[[CandidateExecution]] とする。eventsRecord を、[[AgentSignifier]] が AgentSignifier () である execution .[[EventsRecords]] の Agent Events Record とする。zero を « 0 » とする。dataBlock の各インデックス index について、次を行う。WriteSharedMemory { [[Order]] : init , [[NoTear]] : true , [[Block]] : dataBlock , [[ByteIndex]] : index , [[ElementSize]] : 1, [[Payload]] : zero } を eventsRecord .[[EventList]] に追加する。dataBlock を返す。
6.2.9.3 CopyDataBlockBytes ( toBlock , toIndex , fromBlock , fromIndex , count )
抽象操作 CopyDataBlockBytes。引数 toBlock ((データブロック または 共有データブロック ))、toIndex (非負整数)、fromBlock ((データブロック または 共有データブロック ))、fromIndex (非負整数) および count (非負整数)。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : fromBlock と toBlock は異なる値である。fromSize を fromBlock 内のバイト数とする。表明 : fromIndex + count ≤ fromSize 。toSize を toBlock 内のバイト数とする。表明 : toIndex + count ≤ toSize 。count > 0 の間、次を繰り返す。fromBlock が Shared Data Block である場合、agentRecord を周囲のエージェント の Agent Record とする。execution を agentRecord .[[CandidateExecution]] とする。eventsRecord を、[[AgentSignifier]] が AgentSignifier () である execution .[[EventsRecords]] の Agent Events Record とする。bytes を、非決定的に選択されたバイト値 を唯一の要素とする List とする。注記 : 実装では、bytes は基盤となるハードウェア上の非アトミックな読み取り命令の結果です。この非決定性は、弱い整合性を持つハードウェアの観測可能な動作を記述するための、メモリモデル による意味論的な規定です。readEvent を ReadSharedMemory { [[Order]] : unordered , [[NoTear]] : true , [[Block]] : fromBlock , [[ByteIndex]] : fromIndex , [[ElementSize]] : 1 } とする。readEvent を eventsRecord .[[EventList]] に追加する。Chosen Value Record { [[Event]] : readEvent , [[ChosenValue]] : bytes } を execution .[[ChosenValues]] に追加する。toBlock が Shared Data Block である場合、WriteSharedMemory { [[Order]] : unordered , [[NoTear]] : true , [[Block]] : toBlock , [[ByteIndex]] : toIndex , [[ElementSize]] : 1, [[Payload]] : bytes } を eventsRecord .[[EventList]] に追加する。そうでない場合、toBlock [toIndex ] を bytes [0] に設定する。 そうでない場合、表明 : toBlock は Shared Data Block ではない。toBlock [toIndex ] を fromBlock [fromIndex ] に設定する。 toIndex を toIndex + 1 に設定する。fromIndex を fromIndex + 1 に設定する。count を count - 1 に設定する。unused を返す。
6.2.10 PrivateElement 仕様型
PrivateElement 型は、private クラスフィールド、メソッド、およびアクセサーの仕様で使用される Record です。private element は Property Descriptor と関連付けられておらず、またプロパティでもありませんが、それらを参照する式の実行時意味論 は、いくつかの点で configurable でないプロパティのものと似ています(private field は書込み可能なデータプロパティ に類似し、private method は書込み不可能なデータプロパティ に類似し、private accessor はアクセサープロパティ に類似します)。対応する Record フィールドも同様の目的で使用されます。
PrivateElement 型の値は、表 9 によってフィールドが定義される Record です。このような値は PrivateElements と呼ばれます。
表 9: PrivateElement のフィールド
フィールド名
そのフィールドが存在する [[Kind]] フィールドの値
値
意味
[[Key]]
すべて
Private Name
フィールド、メソッド、またはアクセサーの名前です。
[[Kind]]
すべて
field , method , or accessor
要素の種類です。
[[Value]]
field and method
ECMAScript 言語値
フィールドの値です。
[[Getter]]
accessor
関数オブジェクト または undefined
プライベートアクセサーの getter です。
[[Setter]]
accessor
関数オブジェクト または undefined
プライベートアクセサーの setter です。
6.2.11 ClassFieldDefinition Record 仕様型
ClassFieldDefinition 型は、クラスフィールドの仕様で使用される Record です。
ClassFieldDefinition 型の値は、表 10 によってフィールドが定義される Record です。このような値は ClassFieldDefinition Records と呼ばれます。
表 10: ClassFieldDefinition Record のフィールド
フィールド名
値
意味
[[Name]]
Private Name 、String、または Symbol
フィールドの名前です。
[[Initializer]]
ECMAScript 関数オブジェクト または empty
存在する場合、フィールドの初期化子です。
6.2.12 Private Name
Private Name 仕様型は、プライベートクラス要素(フィールド、メソッド、またはアクセサー)のキーを表す、グローバルに一意な値(その他の点では区別できない場合でも、他のどの Private Name とも異なる値)を記述するために使用されます。各 Private Name は、String である不変の [[Description]] 内部スロットを持ちます。Private Name は、PrivateFieldAdd または PrivateMethodOrAccessorAdd を使用して任意の ECMAScript オブジェクトにインストールでき、その後 PrivateGet および PrivateSet を使用して読み書きできます。
6.2.13 ClassStaticBlockDefinition Record 仕様型
ClassStaticBlockDefinition Record は、クラスの静的初期化ブロックの実行可能コードをカプセル化するために使用される Record です。
ClassStaticBlockDefinition Record は、表 11 に列挙されるフィールドを持ちます。
表 11: ClassStaticBlockDefinition Record のフィールド
7 抽象操作
これらの操作は ECMAScript 言語の一部ではありません。これらは、ECMAScript 言語の意味論の仕様を支援する目的のためだけに、ここで定義されています。その他の、より専門化された抽象操作 は、この仕様全体の各所で定義されています。
7.1 型変換
ECMAScript 言語は、必要に応じて暗黙的に自動型変換を実行します。特定の構成要素の意味論を明確にするため、変換用の抽象操作 の集合を定義すると便利です。変換用の抽象操作 は多態的であり、任意の ECMAScript 言語型 の値を受け入れることができます。ただし、その他の仕様型はこれらの操作では使用されません。
BigInt 型 には ECMAScript 言語における暗黙の変換はありません。他の型から値を変換するには、プログラマーが明示的に BigInt を呼び出さなければなりません。
7.1.1 ToPrimitive ( input [ , preferredType ] )
抽象操作 ToPrimitive。引数 input (ECMAScript 言語値 )および省略可能な引数 preferredType ((string または number ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 input 引数を Object ではない型に変換します。オブジェクトが複数のプリミティブ型に変換できる場合、省略可能なヒント preferredType を使用して、その型を優先することができます。 呼び出されると、次の手順を実行する。
input が Object である場合、exoticToPrimitive を ? GetMethod (input , %Symbol.toPrimitive% ) とする。exoticToPrimitive が undefined でない場合、preferredType が存在しない場合、hint を "default" とする。そうでなく、preferredType が string である場合、hint を "string" とする。 そうでない場合、表明 : preferredType は number である。hint を "number" とする。 result を ? Call (exoticToPrimitive , input , « hint ») とする。result が Object でない場合、result を返す。TypeError 例外をスローする。preferredType が存在しない場合、preferredType を number に設定する。? OrdinaryToPrimitive (input , preferredType ) を返す。 input を返す。
注
ToPrimitive がヒントなしで呼び出された場合、一般にはヒントが number であるかのように動作します。ただし、オブジェクトは %Symbol.toPrimitive% メソッドを定義することでこの動作を上書きできます。この仕様で定義されるオブジェクトのうち、既定の ToPrimitive の動作を上書きするのは Date(21.4.4.45 を参照)と Symbol オブジェクト(20.4.3.5 を参照)だけです。Date は、ヒントが存在しない場合を、ヒントが string であるかのように扱います。
7.1.1.1 OrdinaryToPrimitive ( obj , hint )
抽象操作 OrdinaryToPrimitive。引数 obj (Object) および hint ((string または number ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
hint が string である場合、methodNames を « "toString" , "valueOf" » とする。そうでない場合、methodNames を « "valueOf" , "toString" » とする。 methodNames の各要素 name について、次を行う。method を ? Get (obj , name ) とする。IsCallable (method ) が true である場合、result を ? Call (method , obj ) とする。result が Object でない場合、result を返す。TypeError 例外をスローする。
7.1.2 ToBoolean ( arg )
抽象操作 ToBoolean。引数 arg (ECMAScript 言語値 )。戻り値:Boolean。 arg を Boolean 型 の値に変換します。 呼び出されると、次の手順を実行する。
arg が Boolean である場合、arg を返す。arg が undefined 、null 、+0 𝔽 、-0 𝔽 、NaN 、0 ℤ 、または空の String のいずれかである場合、false を返す。Normative Optional
ホスト が Web ブラウザーであるか、その他の方法で [[IsHTMLDDA]] 内部スロット をサポートする場合、arg が Object であり、arg が [[IsHTMLDDA]] 内部スロットを持つ場合、false を返す。true を返す。
7.1.3 ToNumeric ( arg )
抽象操作 ToNumeric。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:(Number または BigInt)) または throw 完了 )。 arg を Number または BigInt に変換して返します。 呼び出されると、次の手順を実行する。
primitiveValue を ? ToPrimitive (arg , number ) とする。primitiveValue が BigInt である場合、primitiveValue を返す。? ToNumber (primitiveValue ) を返す。
7.1.4 ToNumber ( arg )
抽象操作 ToNumber。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:Number) または throw 完了 )。 arg を Number 型 の値に変換します。 呼び出されると、次の手順を実行する。
arg が Number である場合、arg を返す。arg が Symbol または BigInt のいずれかである場合、TypeError 例外をスローする。arg が undefined である場合、NaN を返す。arg が null または false のいずれかである場合、+0 𝔽 を返す。arg が true である場合、1 𝔽 を返す。arg が String である場合、StringToNumber (arg ) を返す。表明 : arg は Object である。primitiveValue を ? ToPrimitive (arg , number ) とする。表明 : primitiveValue は Object ではない。? ToNumber (primitiveValue ) を返す。
7.1.4.1 String 型に適用される ToNumber
抽象操作 StringToNumber は、次の文法を使用して String 値を Number 値 に変換する方法を規定します。
構文
StringNumericLiteral :::
StrWhiteSpace opt
StrWhiteSpace opt
StrNumericLiteral
StrWhiteSpace opt
StrWhiteSpace :::
StrWhiteSpaceChar
StrWhiteSpace opt
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 )で使用される定義を持ちます。
注
StringNumericLiteral と NumericLiteral の構文には、次のようないくつかの違いがあることに注意してください。
7.1.4.1.1 StringToNumber ( string )
抽象操作 StringToNumber。引数 string (String)。戻り値:Number。 呼び出されると、次の手順を実行する。
literal を ParseText (string , StringNumericLiteral ) とする。literal がエラーの List である場合、NaN を返す。literal の StringNumericValue を返す。
7.1.4.1.2 Runtime Semantics: StringNumericValue
構文指向操作 StringNumericValue。引数なし。戻り値:Number。
注
次の生成規則ごとに定義される。
StringNumericLiteral ::: StrWhiteSpace opt
+0 𝔽 を返す。
StringNumericLiteral :::
StrWhiteSpace opt
StrNumericLiteral
StrWhiteSpace opt
StrNumericLiteral の StringNumericValue を返す。
StrNumericLiteral ::: NonDecimalIntegerLiteral
𝔽 (NonDecimalIntegerLiteral の MV) を返す。
StrDecimalLiteral :::
-
StrUnsignedDecimalLiteral
a を StrUnsignedDecimalLiteral の StringNumericValue とする。a が +0 𝔽 である場合、-0 𝔽 を返す。-a を返す。
StrUnsignedDecimalLiteral ::: Infinity
+∞ 𝔽 を返す。
StrUnsignedDecimalLiteral :::
DecimalDigits
.
DecimalDigits opt
ExponentPart opt
a を最初の DecimalDigits の MV とする。2番目の DecimalDigits が存在する場合、b を2番目の DecimalDigits の MV とする。n を2番目の DecimalDigits 内のコードポイント数とする。 そうでない場合、b を 0 とする。n を 0 とする。 ExponentPart が存在する場合、e を ExponentPart の MV とする。それ以外の場合、e を 0 とする。RoundMVResult ((a + (b × 10-n )) × 10e ) を返す。
StrUnsignedDecimalLiteral :::
.
DecimalDigits
ExponentPart opt
b を DecimalDigits の MV とする。ExponentPart が存在する場合、e を ExponentPart の MV とする。それ以外の場合、e を 0 とする。n を DecimalDigits 内のコードポイント数とする。RoundMVResult (b × 10e - n ) を返す。
StrUnsignedDecimalLiteral :::
DecimalDigits
ExponentPart opt
a を DecimalDigits の MV とする。ExponentPart が存在する場合、e を ExponentPart の MV とする。それ以外の場合、e を 0 とする。RoundMVResult (a × 10e ) を返す。
7.1.4.1.3 RoundMVResult ( n )
抽象操作 RoundMVResult。引数 n (数学的な値 )。戻り値:Number。 n を実装定義 の方法で Number に変換します。この抽象操作 では、ある桁がゼロでないか、またはその左側と右側の両方にゼロではない桁がある場合、その桁は有効桁です。この抽象操作 では、数学的値 の表現によって「表される数学的値 」は、数学的値 の「10進表現」の逆変換です。 呼び出されると、次の手順を実行する。
n の10進表現の有効桁が20桁以下である場合、𝔽 (n ) を返す。option1 を、n の10進表現における20桁目より後の各有効桁を 0 に置換した結果によって表される数学的値 とする。option2 を、n の10進表現における20桁目より後の各有効桁を 0 に置換し、その後20桁目の位置を1増加させた結果(必要に応じて繰り上げる)によって表される数学的値 とする。chosen を、option1 または option2 のいずれかを実装定義 で選択したものとする。𝔽 (chosen ) を返す。
7.1.5 ToIntegerOrInfinity ( arg )
抽象操作 ToIntegerOrInfinity。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:(整数 、+∞ または -∞)) または throw 完了 )。 arg を、その Number 値 の小数部分を切り捨てた整数 に変換し、その Number 値 が無限大の場合は +∞ または -∞ に変換します。 呼び出されると、次の手順を実行する。
number を ? ToNumber (arg ) とする。number が NaN 、+0 𝔽 、または -0 𝔽 のいずれかである場合、0 を返す。number が +∞ 𝔽 である場合、+∞ を返す。number が -∞ 𝔽 である場合、-∞ を返す。truncate (ℝ (number )) を返す。
注
𝔽 (ToIntegerOrInfinity(
x )) は、
x のどの値についても
-0 𝔽 を返しません。小数部分の切り捨ては、
x を
数学的値 に変換した後に実行されます。
7.1.6 SnapToInteger ( arg , nonIntHandling [ , minimum [ , maximum ] ] )
抽象操作 SnapToInteger。引数 arg (ECMAScript 言語値 ) および nonIntHandling ((reject または truncate ))および省略可能な引数 minimum (整数 ) および maximum (整数 )。戻り値:(正常完了 (値:整数 ) または throw 完了 )。 arg をその Number 値 を表す整数 に変換します。有限でない値は拒否し、有限だが整数 でない値は、拒否するか切り捨てるかのいずれかで処理し、必要に応じて閉区間 の制約境界を適用します。 呼び出されると、次の手順を実行する。
number を ? ToNumber (arg ) とする。number が NaN 、+∞ 𝔽 、または -∞ 𝔽 のいずれかである場合、RangeError 例外をスローする。mv を ℝ (number ) とする。nonIntHandling が truncate である場合、mv を truncate (mv ) に設定する。mv が整数 でない場合、RangeError 例外をスローする。minimum が存在し、mv < minimum である場合、RangeError 例外をスローする。maximum が存在し、mv > maximum である場合、RangeError 例外をスローする。mv を返す。
7.1.7 ToFixedSizeInteger ( int , signed , bitWidth )
抽象操作 ToFixedSizeInteger。引数 int ((整数 、+∞ または -∞))、signed ((unsigned または signed )) および bitWidth (正の整数)。戻り値:整数 。 int を、signed が unsigned の場合は 0 から 2bitWidth - 1 までの閉区間 、signed が signed の場合は -2bitWidth - 1 から 2bitWidth - 1 - 1 までの閉区間 に含まれる、2bitWidth 個の整数 のいずれかに写像します。 呼び出されると、次の手順を実行する。
int = +∞ または int = -∞ である場合、0 を返す。fixedInt を int modulo 2bitWidth とする。注記 : 次の手順は fixedInt の2の補数表現を変更しない。signed が signed かつ fixedInt ≥ 2bitWidth - 1 である場合、fixedInt を fixedInt - 2bitWidth に設定する。fixedInt を返す。
注
ToFixedSizeInteger は冪等です。任意の ECMAScript 言語値 x について、ToFixedSizeInteger(ToFixedSizeInteger(x , signed , bitWidth ), signed , bitWidth ) は ToFixedSizeInteger(x , signed , bitWidth ) と同じです。実際、+∞ および -∞ は 0 に写像されるため、この不変条件は signed を反転しても維持されます(たとえば、ToFixedSizeInteger(ToFixedSizeInteger(x , signed , 32), unsigned , 32) は ToFixedSizeInteger(x , unsigned , 32) と同じです)。
7.1.8 ToInt32 ( arg )
抽象操作 ToInt32。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:整数の Number ) または throw 完了 )。 arg を、𝔽 (-231 ) から 𝔽 (231 - 1) までの閉区間 にある、-0 𝔽 を除く 232 個の整数 Number 値 のいずれかに変換します。 呼び出されると、次の手順を実行する。
int を ? ToIntegerOrInfinity (arg ) とする。𝔽 (ToFixedSizeInteger (int , signed , 32)) を返す。
7.1.9 ToUint32 ( arg )
抽象操作 ToUint32。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:整数の Number ) または throw 完了 )。 arg を、+0 𝔽 から 𝔽 (232 - 1) までの閉区間 にある 232 個の整数 Number 値 のいずれかに変換します。 呼び出されると、次の手順を実行する。
int を ? ToIntegerOrInfinity (arg ) とする。𝔽 (ToFixedSizeInteger (int , unsigned , 32)) を返す。
7.1.10 ToInt16 ( arg )
抽象操作 ToInt16。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:整数の Number ) または throw 完了 )。 arg を、𝔽 (-215 ) から 𝔽 (215 - 1) までの閉区間 にある、-0 𝔽 を除く 216 個の整数 Number 値 のいずれかに変換します。 呼び出されると、次の手順を実行する。
int を ? ToIntegerOrInfinity (arg ) とする。𝔽 (ToFixedSizeInteger (int , signed , 16)) を返す。
7.1.11 ToUint16 ( arg )
抽象操作 ToUint16。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:整数の Number ) または throw 完了 )。 arg を、+0 𝔽 から 𝔽 (216 - 1) までの閉区間 にある 216 個の整数 Number 値 のいずれかに変換します。 呼び出されると、次の手順を実行する。
int を ? ToIntegerOrInfinity (arg ) とする。𝔽 (ToFixedSizeInteger (int , unsigned , 16)) を返す。
7.1.12 ToInt8 ( arg )
抽象操作 ToInt8。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:整数の Number ) または throw 完了 )。 arg を、-128 𝔽 から 127 𝔽 までの閉区間 にある、-0 𝔽 を除く 28 個の整数 Number 値 のいずれかに変換します。 呼び出されると、次の手順を実行する。
int を ? ToIntegerOrInfinity (arg ) とする。𝔽 (ToFixedSizeInteger (int , signed , 8)) を返す。
7.1.13 ToUint8 ( arg )
抽象操作 ToUint8。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:整数の Number ) または throw 完了 )。 arg を、+0 𝔽 から 255 𝔽 までの閉区間 にある 28 個の整数 Number 値 のいずれかに変換します。 呼び出されると、次の手順を実行する。
int を ? ToIntegerOrInfinity (arg ) とする。𝔽 (ToFixedSizeInteger (int , unsigned , 8)) を返す。
7.1.14 ToUint8Clamp ( arg )
抽象操作 ToUint8Clamp。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:整数の Number ) または throw 完了 )。 arg を、+0 𝔽 から 255 𝔽 までの閉区間 にある 28 個の整数 Number 値 のいずれかに制限して丸めます。 呼び出されると、次の手順を実行する。
number を ? ToNumber (arg ) とする。number が NaN である場合、+0 𝔽 を返す。mv を number の拡張数学的値 とする。clamped を mv を 0 と 255 の間に制限した結果とする。f を floor (clamped ) とする。clamped < f + 0.5 である場合、𝔽 (f ) を返す。clamped > f + 0.5 である場合、𝔽 (f + 1) を返す。f が偶数である場合、𝔽 (f ) を返す。𝔽 (f + 1) を返す。
注
他のほとんどの ECMAScript 整数 変換操作とは異なり、ToUint8Clamp は整数 でない値を切り捨てるのではなく丸めます。また、「五捨五入して偶数に丸める」タイブレークを使用します。これは Math.round の「五捨五入して上に丸める」タイブレークとは異なります。
7.1.15 ToBigInt ( arg )
抽象操作 ToBigInt。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:BigInt) または throw 完了 )。 arg を BigInt 値 に変換します。ただし、Number からの暗黙の変換が必要になる場合はスローします。 呼び出されると、次の手順を実行する。
primitive を ? ToPrimitive (arg , number ) とする。表 12 で primitive に対応する値を返す。
表 12: BigInt 変換
引数の型
結果
Undefined
TypeError 例外をスローする。
Null
TypeError 例外をスローする。
Boolean
primitive が true である場合は 1n を返し、primitive が false である場合は 0n を返す。
BigInt
primitive を返す。
Number
TypeError 例外をスローする。
String
n を StringToBigInt (primitive ) とする。n が undefined である場合、SyntaxError 例外をスローする。n を返す。
Symbol
TypeError 例外をスローする。
7.1.16 StringToBigInt ( string )
抽象操作 StringToBigInt。引数 string (String)。戻り値:(BigInt または undefined )。 呼び出されると、次の手順を実行する。
literal を ParseText (string , StringIntegerLiteral ) とする。literal がエラーの List である場合、undefined を返す。mv を literal の MV とする。表明 : mv は整数 である。ℤ (mv ) を返す。
7.1.16.1 StringIntegerLiteral 文法
StringToBigInt は次の文法を使用します。
構文
StringIntegerLiteral :::
StrWhiteSpace opt
StrWhiteSpace opt
StrIntegerLiteral
StrWhiteSpace opt
StrIntegerLiteral :::
SignedInteger [~Sep]
NonDecimalIntegerLiteral [~Sep]
7.1.16.2 Runtime Semantics: MV
7.1.17 ToBigInt64 ( arg )
抽象操作 ToBigInt64。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:BigInt) または throw 完了 )。 arg を、ℤ (-263 ) から ℤ (263 - 1) までの閉区間 にある 264 個の BigInt 値 のいずれかに変換します。 呼び出されると、次の手順を実行する。
int を ℝ (? ToBigInt (arg )) とする。ℤ (ToFixedSizeInteger (int , signed , 64)) を返す。
7.1.18 ToBigUint64 ( arg )
抽象操作 ToBigUint64。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:BigInt) または throw 完了 )。 arg を、0 ℤ から ℤ (264 - 1) までの閉区間 にある 264 個の BigInt 値 のいずれかに変換します。 呼び出されると、次の手順を実行する。
int を ℝ (? ToBigInt (arg )) とする。ℤ (ToFixedSizeInteger (int , unsigned , 64)) を返す。
7.1.19 ToString ( arg )
抽象操作 ToString。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:String) または throw 完了 )。 arg を String 型 の値に変換します。 呼び出されると、次の手順を実行する。
arg が String である場合、arg を返す。arg が Symbol である場合、TypeError 例外をスローする。arg が undefined である場合、"undefined" を返す。arg が null である場合、"null" を返す。arg が true である場合、"true" を返す。arg が false である場合、"false" を返す。arg が Number である場合、Number::toString (arg , 10) を返す。arg が BigInt である場合、BigInt::toString (arg , 10) を返す。表明 : arg は Object である。primitiveValue を ? ToPrimitive (arg , string ) とする。表明 : primitiveValue は Object ではない。? ToString (primitiveValue ) を返す。
7.1.20 ToObject ( arg )
抽象操作 ToObject。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:Object) または throw 完了 )。 arg を Object 型 の値に変換します。 呼び出されると、次の手順を実行する。
arg が undefined または null のいずれかである場合、TypeError 例外をスローする。arg が Boolean である場合、[[BooleanData]] 内部スロットが arg に設定された新しい Boolean オブジェクトを返す。Boolean オブジェクトの説明については 20.3 を参照。arg が Number である場合、[[NumberData]] 内部スロットが arg に設定された新しい Number オブジェクトを返す。Number オブジェクトの説明については 21.1 を参照。arg が String である場合、[[StringData]] 内部スロットが arg に設定された新しい String オブジェクトを返す。String オブジェクトの説明については 22.1 を参照。arg が Symbol である場合、[[SymbolData]] 内部スロットが arg に設定された新しい Symbol オブジェクトを返す。Symbol オブジェクトの説明については 20.4 を参照。arg が BigInt である場合、[[BigIntData]] 内部スロットが arg に設定された新しい BigInt オブジェクトを返す。BigInt オブジェクトの説明については 21.2 を参照。表明 : arg は Object である。arg を返す。
7.1.21 ToPropertyKey ( arg )
抽象操作 ToPropertyKey。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:プロパティキー ) または throw 完了 )。 arg をプロパティキー として使用できる値に変換します。 呼び出されると、次の手順を実行する。
key を ? ToPrimitive (arg , string ) とする。key が Symbol である場合、key を返す。! ToString (key ) を返す。
7.1.22 ToLength ( arg )
抽象操作 ToLength。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:非負整数の Number) または throw 完了 )。 arg を、配列状オブジェクト の長さとして使用するのに適した非負の整数 Number に制限して切り捨てます。 呼び出されると、次の手順を実行する。
length を ? ToIntegerOrInfinity (arg ) とする。clampedLength を length を 0 と 253 - 1 の間に制限した結果とする。𝔽 (clampedLength ) を返す。
7.1.23 CanonicalNumericIndexString ( arg )
抽象操作 CanonicalNumericIndexString。引数 arg (String)。戻り値:(Number または undefined )。 arg が "-0" であるか、ある Number 値 n に対する ToString (n ) と正確に一致する場合、それぞれ対応する Number 値 を返します。それ以外の場合は undefined を返します。 呼び出されると、次の手順を実行する。
arg が "-0" である場合、-0 𝔽 を返す。n を ! ToNumber (arg ) とする。! ToString (n ) が arg である場合、n を返す。 undefined を返す。
正準数値文字列 とは、CanonicalNumericIndexString 抽象操作 が undefined を返さない任意の String です。
7.1.24 ToIndex ( arg )
抽象操作 ToIndex。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:非負整数) または throw 完了 )。 arg を整数 に変換し、それが非負で整数インデックス に対応する場合、その整数 を返します。それ以外の場合は例外をスローします。 呼び出されると、次の手順を実行する。
int を ? ToIntegerOrInfinity (arg ) とする。int が 0 から 253 - 1 までの閉区間 にない場合、RangeError 例外をスローする。int を返す。
7.1.25 ToAbsoluteIndex ( value , length )
抽象操作 ToAbsoluteIndex。引数 value (ECMAScript 言語値 ) および length (非負整数)。戻り値:(正常完了 (値:(整数 、+∞ または -∞)) または throw 完了 )。 value を整数 、+∞、または -∞ に変換し、負の値を length に対する相対値として解釈します。 呼び出されると、次の手順を実行する。
int を ? ToIntegerOrInfinity (value ) とする。int が有限であり、int < 0 である場合、int を length + int に設定する。int を返す。
7.1.26 ToClampedIndex ( value , length )
抽象操作 ToClampedIndex。引数 value (ECMAScript 言語値 ) および length (非負整数)。戻り値:(正常完了 (値:非負整数) または throw 完了 )。 value を整数 に変換し(負の値は length に対する相対値として解釈します)、その結果を 0 から length までの閉区間 に制限します。 呼び出されると、次の手順を実行する。
index を ? ToAbsoluteIndex (value , length ) とする。index を 0 と length の間に制限した結果を返す。
7.2 検査および比較操作
7.2.1 RequireObjectCoercible ( arg )
抽象操作 RequireObjectCoercible。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 arg が ToObject を使用して Object に変換できない値である場合、エラーをスローします。 呼び出されると、次の手順を実行する。
arg が undefined または null のいずれかである場合、TypeError 例外をスローする。unused を返す。
7.2.2 IsArray ( arg )
抽象操作 IsArray。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
arg が Object でない場合、false を返す。arg が Array 特殊オブジェクト である場合、true を返す。arg が Proxy 特殊オブジェクト である場合、? ValidateNonRevokedProxy (arg ) を実行する。 proxyTarget を arg .[[ProxyTarget]] とする。? IsArray (proxyTarget ) を返す。 false を返す。
7.2.3 IsCallable ( arg )
抽象操作 IsCallable。引数 arg (ECMAScript 言語値 )。戻り値:Boolean。 arg が [[Call]] 内部メソッドを持つ呼出し可能な関数であるかどうかを判定します。 呼び出されると、次の手順を実行する。
arg が Object でない場合、false を返す。arg が [[Call]] 内部メソッドを持つ場合、true を返す。false を返す。
7.2.4 IsConstructor ( arg )
抽象操作 IsConstructor。引数 arg (ECMAScript 言語値 )。戻り値:Boolean。 arg が [[Construct]] 内部メソッドを持つ関数オブジェクト であるかどうかを判定します。 呼び出されると、次の手順を実行する。
arg が Object でない場合、false を返す。arg が [[Construct]] 内部メソッドを持つ場合、true を返す。false を返す。
7.2.5 IsExtensible ( obj )
抽象操作 IsExtensible。引数 obj (Object)。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 obj に追加のプロパティを追加できるかどうかを判定するために使用されます。 呼び出されると、次の手順を実行する。
? obj .[[IsExtensible]] () を返す。
7.2.6 IsRegExp ( arg )
抽象操作 IsRegExp。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
arg が Object でない場合、false を返す。matcher を ? Get (arg , %Symbol.match% ) とする。matcher が undefined でない場合、ToBoolean (matcher ) を返す。arg が [[RegExpMatcher]] 内部スロットを持つ場合、true を返す。false を返す。
7.2.7 Static Semantics: IsStringWellFormedUnicode ( string )
抽象操作 IsStringWellFormedUnicode。引数 string (String)。戻り値:Boolean。 6.1.4 で説明されているように、string を UTF-16 で符号化されたコードポイントの列として解釈し、それが整形式 の UTF-16 列であるかどうかを判定します。 呼び出されると、次の手順を実行する。
length を string の長さとする。k を 0 とする。k < length の間、次を繰り返す。codePoint を CodePointAt (string , k ) とする。codePoint .[[IsUnpairedSurrogate]] が true である場合、false を返す。k を k + codePoint .[[CodeUnitCount]] に設定する。true を返す。
7.2.8 SameType ( x , y )
抽象操作 SameType。引数 x (ECMAScript 言語値 ) および y (ECMAScript 言語値 )。戻り値:Boolean。 2つの引数が同じ型であるかどうかを判定します。 呼び出されると、次の手順を実行する。
x が undefined かつ y が undefined である場合、true を返す。x が null かつ y が null である場合、true を返す。x が Boolean かつ y が Boolean である場合、true を返す。x が Number かつ y が Number である場合、true を返す。x が BigInt かつ y が BigInt である場合、true を返す。x が Symbol かつ y が Symbol である場合、true を返す。x が String かつ y が String である場合、true を返す。x が Object かつ y が Object である場合、true を返す。false を返す。
7.2.9 SameValue ( x , y )
抽象操作 SameValue。引数 x (ECMAScript 言語値 ) および y (ECMAScript 言語値 )。戻り値:Boolean。 2つの引数が同じ値であるかどうかを判定します。 呼び出されると、次の手順を実行する。
SameType (x , y ) が false である場合、false を返す。x が Number である場合、Number::sameValue (x , y ) を返す。SameValueNonNumber (x , y ) を返す。
注
このアルゴリズムは、すべての NaN 値を等価として扱い、+0 𝔽 と -0 𝔽 を区別する点で、IsStrictlyEqual アルゴリズムと異なります。
7.2.10 SameValueZero ( x , y )
抽象操作 SameValueZero。引数 x (ECMAScript 言語値 ) および y (ECMAScript 言語値 )。戻り値:Boolean。 2つの引数が同じ値であるかどうかを判定します(+0 𝔽 と -0 𝔽 の違いは無視します)。 呼び出されると、次の手順を実行する。
SameType (x , y ) が false である場合、false を返す。x が Number である場合、Number::sameValueZero (x , y ) を返す。SameValueNonNumber (x , y ) を返す。
注
SameValueZero は、+0 𝔽 と -0 𝔽 を等価として扱う点だけが SameValue と異なります。
7.2.11 SameValueNonNumber ( x , y )
抽象操作 SameValueNonNumber。引数 x (an ECMAScript language value, but not a Number) および y (an ECMAScript language value, but not a Number)。戻り値:Boolean。 呼び出されると、次の手順を実行する。
表明 : SameType (x , y ) は true である。x が undefined または null のいずれかである場合、true を返す。x が BigInt である場合、BigInt::equal (x , y ) を返す。x が String である場合、x と y の長さが同じで、同じ位置に同じコード単位を持つ場合、true を返す。false を返す。x が Boolean である場合、x が true かつ y が true である場合、true を返す。x が false かつ y が false である場合、true を返す。false を返す。注記 : その他すべての ECMAScript 言語値 は同一性によって比較される。x が y である場合、true を返す。false を返す。
注 1
説明上の目的のため、不要であっても、このアルゴリズム内では一部のケースを個別に処理しています。
注 2
「
x が
y である」が具体的に何を意味するかは、
5.2.8 で詳しく説明されています。
7.2.12 IsLessThan ( x , y , leftFirst )
抽象操作 IsLessThan。引数 x (ECMAScript 言語値 )、y (ECMAScript 言語値 ) および leftFirst (Boolean)。戻り値:(正常完了 (値:(Boolean または undefined )) または throw 完了 )。 比較 x < y の意味論を提供し、true 、false 、または undefined (オペランドを同じ数値型の比較可能な値に型強制できなかったことを示します)を返します。leftFirst フラグは、x および y に対して実行される、観測可能な副作用を持つ可能性がある操作の順序を制御するために使用されます。ECMAScript は式を左から右へ評価すると規定しているため、これは必要です。leftFirst が true である場合、x パラメーターは y パラメーターに対応する式より左側に現れる式に対応します。leftFirst が false である場合は逆であり、x より前に y に対する操作を実行しなければなりません。 呼び出されると、次の手順を実行する。
leftFirst が true である場合、px を ? ToPrimitive (x , number ) とする。py を ? ToPrimitive (y , number ) とする。そうでない場合、注記 : 左から右への評価を維持するため、評価順序を反転する必要がある。py を ? ToPrimitive (y , number ) とする。px を ? ToPrimitive (x , number ) とする。 px が String かつ py が String である場合、lx を px の長さとする。ly を py の長さとする。0 ≤ i < min (lx , ly ) を満たす各整数 i について、昇順に、次を行う。cx を px 内のインデックス i にあるコード単位の数値とする。cy を py 内のインデックス i にあるコード単位の数値とする。cx < cy である場合、true を返す。cx > cy である場合、false を返す。 lx < ly である場合、true を返す。false を返す。px が BigInt かつ py が String である場合、ny を StringToBigInt (py ) とする。ny が undefined である場合、undefined を返す。BigInt::lessThan (px , ny ) を返す。px が String かつ py が BigInt である場合、nx を StringToBigInt (px ) とする。nx が undefined である場合、undefined を返す。BigInt::lessThan (nx , py ) を返す。注記 : px と py はプリミティブ値であるため、評価順序は重要ではない。nx を ? ToNumeric (px ) とする。ny を ? ToNumeric (py ) とする。SameType (nx , ny ) が true である場合、nx が Number である場合、Number::lessThan (nx , ny ) を返す。表明 : nx は BigInt である。BigInt::lessThan (nx , ny ) を返す。表明 : nx が BigInt かつ ny が Number であるか、nx が Number かつ ny が BigInt である。nx が NaN または ny が NaN である場合、undefined を返す。nx が -∞ 𝔽 または ny が +∞ 𝔽 である場合、true を返す。nx が +∞ 𝔽 または ny が -∞ 𝔽 である場合、false を返す。ℝ (nx ) < ℝ (ny ) である場合、true を返す。false を返す。
注 1
手順 3 は、加算演算子 + を処理するアルゴリズム(13.15.3 )の手順 1.c と異なり、論理 OR 演算ではなく論理 AND 演算を使用します。
注 2
String の比較では、UTF-16 コード単位値の列に対して単純な辞書式順序を使用します。Unicode 仕様で定義される、より複雑で意味指向の文字または文字列の等価性や照合順序の定義を使用しようとはしません。そのため、Unicode 標準に従って正準的に等価であっても、同じ正規化形式ではない String 値は不等と判定される場合があります。また、サロゲートペア を含む String では、コード単位 による辞書式順序とコードポイント による順序が異なることにも注意してください。
7.2.13 IsLooselyEqual ( x , y )
抽象操作 IsLooselyEqual。引数 x (ECMAScript 言語値 ) および y (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 == 演算子の意味論を提供します。 呼び出されると、次の手順を実行する。
SameType (x , y ) が true である場合、IsStrictlyEqual (x , y ) を返す。x が null であり、y が undefined である場合、true を返す。x が undefined であり、y が null である場合、true を返す。Normative Optional
ホスト がウェブブラウザーであるか、またはその他の方法で [[IsHTMLDDA]] 内部スロット をサポートする場合、x が Object であり、x が [[IsHTMLDDA]] 内部スロットを持ち、かつ y が undefined または null のいずれかである場合、true を返す。x が undefined または null のいずれかであり、y が Object であり、かつ y が [[IsHTMLDDA]] 内部スロットを持つ場合、true を返す。x が Number であり、y が String である場合、! IsLooselyEqual (x , ! ToNumber (y )) を返す。x が String であり、y が Number である場合、! IsLooselyEqual (! ToNumber (x ), y ) を返す。x が BigInt であり、y が String である場合、n を StringToBigInt (y ) とする。n が undefined である場合、false を返す。! IsLooselyEqual (x , n ) を返す。 x が String であり、y が BigInt である場合、! IsLooselyEqual (y , x ) を返す。x が Boolean である場合、! IsLooselyEqual (! ToNumber (x ), y ) を返す。y が Boolean である場合、! IsLooselyEqual (x , ! ToNumber (y )) を返す。x が String、Number、BigInt、または Symbol のいずれかであり、y が Object である場合、! IsLooselyEqual (x , ? ToPrimitive (y )) を返す。x が Object であり、y が String、Number、BigInt、または Symbol のいずれかである場合、! IsLooselyEqual (? ToPrimitive (x ), y ) を返す。x が BigInt であり、y が有限 Number である場合、または x が有限 Number であり、y が BigInt である場合、ℝ (x ) = ℝ (y ) である場合、true を返す。false を返す。false を返す。
7.2.14 IsStrictlyEqual ( x , y )
抽象操作 IsStrictlyEqual。引数 x (ECMAScript 言語値 ) および y (ECMAScript 言語値 )。戻り値:Boolean。 === 演算子の意味論を提供します。 呼び出されると、次の手順を実行する。
SameType (x , y ) が false である場合、false を返す。x が Number である場合、Number::equal (x , y ) を返す。SameValueNonNumber (x , y ) を返す。
注
このアルゴリズムは、符号付きゼロおよび NaN の扱いが SameValue アルゴリズムと異なります。
7.3 オブジェクトに対する操作
7.3.1 MakeBasicObject ( internalSlotsList )
抽象操作 MakeBasicObject。引数 internalSlotsList (リスト (要素:内部スロット名))。戻り値:Object。 通常オブジェクト と特殊オブジェクト の両方を含め、アルゴリズムによって作成されるすべての ECMAScript オブジェクトの生成元です。すべてのオブジェクトの作成で使用される共通の手順を切り出し、オブジェクト作成を一元化します。 呼び出されると、次の手順を実行する。
internalSlotsList を、internalSlotsList と « [[PrivateElements]] » のリスト連結 に設定する。obj を、internalSlotsList 内の各名前に対応する内部スロットを持つ、新しく作成されたオブジェクトとする。注記 : Object の内部メソッドと内部スロット で説明されているように、特に指定されていない限り、このような各内部スロットの初期値は undefined である。obj .[[PrivateElements]] を新しい空の List に設定する。obj の必須内部メソッドを、10.1 で規定される通常オブジェクト の既定の定義に設定する。表明 : 呼出し元が obj の [[GetPrototypeOf]] および [[SetPrototypeOf]] の両方の必須内部メソッドを上書きしない場合、internalSlotsList は [[Prototype]] を含む。表明 : 呼出し元が obj の [[SetPrototypeOf]] 、[[IsExtensible]] 、および [[PreventExtensions]] のすべての必須内部メソッドを上書きしない場合、internalSlotsList は [[Extensible]] を含む。internalSlotsList が [[Extensible]] を含む場合、obj .[[Extensible]] を true に設定する。obj を返す。
注
この仕様内では、特殊オブジェクト は ArrayCreate や BoundFunctionCreate などの抽象操作 内で、まず MakeBasicObject を呼び出して基本的な基盤オブジェクトを取得し、その後そのオブジェクトの内部メソッドの一部または全部を上書きすることで作成されます。特殊オブジェクト の作成をカプセル化するため、オブジェクトの必須内部メソッドはこれらの操作の外部では変更されません。
7.3.2 Get ( obj , propertyKey )
抽象操作 Get。引数 obj (Object) および propertyKey (プロパティキー )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 オブジェクトの特定のプロパティの値を取得するために使用されます。 呼び出されると、次の手順を実行する。
? obj .[[Get]] (propertyKey , obj ) を返す。
7.3.3 GetV ( value , propertyKey )
抽象操作 GetV。引数 value (ECMAScript 言語値 ) および propertyKey (プロパティキー )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 ECMAScript 言語値 の特定のプロパティの値を取得するために使用されます。値がオブジェクトでない場合、その値の型に適したラッパーオブジェクトを使用してプロパティ検索が実行されます。 呼び出されると、次の手順を実行する。
obj を ? ToObject (value ) とする。? obj .[[Get]] (propertyKey , value ) を返す。
7.3.4 Set ( obj , propertyKey , value , throw )
抽象操作 Set。引数 obj (Object)、propertyKey (プロパティキー )、value (ECMAScript 言語値 ) および throw (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 オブジェクトの特定のプロパティの値を設定するために使用されます。value はそのプロパティの新しい値です。 呼び出されると、次の手順を実行する。
success を ? obj .[[Set]] (propertyKey , value , obj ) とする。success が false かつ throw が true である場合、TypeError 例外をスローする。unused を返す。
7.3.5 CreateDataProperty ( obj , propertyKey , value )
抽象操作 CreateDataProperty。引数 obj (Object)、propertyKey (プロパティキー ) および value (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 オブジェクトに新しい自身のプロパティを作成するために使用されます。 呼び出されると、次の手順を実行する。
newDesc を PropertyDescriptor { [[Value]] : value , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : true } とする。? obj .[[DefineOwnProperty]] (propertyKey , newDesc ) を返す。
注
この抽象操作 は、ECMAScript 言語の代入演算子によって作成されるプロパティと同じ既定値に属性が設定されたプロパティを作成します。通常、そのプロパティはまだ存在していません。すでに存在し、構成不可である場合、または obj が拡張可能でない場合、[[DefineOwnProperty]] は false を返します。
7.3.6 CreateDataPropertyOrThrow ( obj , propertyKey , value )
抽象操作 CreateDataPropertyOrThrow。引数 obj (Object)、propertyKey (プロパティキー ) および value (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 オブジェクトに新しい自身のプロパティを作成するために使用されます。要求されたプロパティの更新を実行できない場合、TypeError 例外をスローします。 呼び出されると、次の手順を実行する。
success を ? CreateDataProperty (obj , propertyKey , value ) とする。success が false である場合、TypeError 例外をスローする。unused を返す。
注
この抽象操作 は、ECMAScript 言語の代入演算子によって作成されるプロパティと同じ既定値に属性が設定されたプロパティを作成します。通常、そのプロパティはまだ存在していません。すでに存在し、構成不可である場合、または obj が拡張可能でない場合、[[DefineOwnProperty]] は false を返し、この操作は TypeError 例外をスローします。
7.3.7 CreateNonEnumerableDataPropertyOrThrow ( obj , propertyKey , value )
抽象操作 CreateNonEnumerableDataPropertyOrThrow。引数 obj (Object)、propertyKey (プロパティキー ) および value (ECMAScript 言語値 )。戻り値:unused 。 通常オブジェクト に、新しい列挙不可の自身のプロパティを作成するために使用されます。 呼び出されると、次の手順を実行する。
表明 : obj は、構成不可のプロパティを持たない通常の拡張可能なオブジェクトである。newDesc を PropertyDescriptor { [[Value]] : value , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true } とする。! DefinePropertyOrThrow (obj , propertyKey , newDesc ) を実行する。 unused を返す。
注
この抽象操作 は、列挙不可であることを除き、ECMAScript 言語の代入演算子によって作成されるプロパティと同じ既定値に属性が設定されたプロパティを作成します。通常、そのプロパティはまだ存在していません。すでに存在する場合でも、DefinePropertyOrThrow は正常に完了することが保証されています。
7.3.8 DefinePropertyOrThrow ( obj , propertyKey , propertyDesc )
抽象操作 DefinePropertyOrThrow。引数 obj (Object)、propertyKey (プロパティキー ) および propertyDesc (プロパティ記述子 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 要求されたプロパティの更新を実行できない場合に TypeError 例外をスローする方法で、オブジェクトの [[DefineOwnProperty]] 内部メソッドを呼び出すために使用されます。 呼び出されると、次の手順を実行する。
success を ? obj .[[DefineOwnProperty]] (propertyKey , propertyDesc ) とする。success が false である場合、TypeError 例外をスローする。unused を返す。
7.3.9 DeletePropertyOrThrow ( obj , propertyKey )
抽象操作 DeletePropertyOrThrow。引数 obj (Object) および propertyKey (プロパティキー )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 オブジェクトの特定の自身のプロパティを削除するために使用されます。そのプロパティが構成不可である場合、例外をスローします。 呼び出されると、次の手順を実行する。
success を ? obj .[[Delete]] (propertyKey ) とする。success が false である場合、TypeError 例外をスローする。unused を返す。
7.3.10 GetMethod ( value , propertyKey )
抽象操作 GetMethod。引数 value (ECMAScript 言語値 ) および propertyKey (プロパティキー )。戻り値:(正常完了 (値:(関数オブジェクト または undefined )) または throw 完了 )。 プロパティの値が関数であることが期待される場合に、ECMAScript 言語値 の特定のプロパティの値を取得するために使用されます。 呼び出されると、次の手順を実行する。
func を ? GetV (value , propertyKey ) とする。func が undefined または null のいずれかである場合、undefined を返す。IsCallable (func ) が false である場合、TypeError 例外をスローする。func を返す。
7.3.11 HasProperty ( obj , propertyKey )
抽象操作 HasProperty。引数 obj (Object) および propertyKey (プロパティキー )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 オブジェクトが指定されたプロパティキー を持つプロパティを持っているかどうかを判定するために使用されます。そのプロパティは自身のプロパティまたは継承プロパティのいずれでもかまいません。 呼び出されると、次の手順を実行する。
? obj .[[HasProperty]] (propertyKey ) を返す。
7.3.12 HasOwnProperty ( obj , propertyKey )
抽象操作 HasOwnProperty。引数 obj (Object) および propertyKey (プロパティキー )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 オブジェクトが指定されたプロパティキー を持つ自身のプロパティを持っているかどうかを判定するために使用されます。 呼び出されると、次の手順を実行する。
propertyDesc を ? obj .[[GetOwnProperty]] (propertyKey ) とする。propertyDesc が undefined である場合、false を返す。true を返す。
7.3.13 Call ( func , thisValue [ , argList ] )
抽象操作 Call。引数 func (ECMAScript 言語値 ) および thisValue (ECMAScript 言語値 )および省略可能な引数 argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 関数オブジェクト の [[Call]] 内部メソッドを呼び出すために使用されます。func は関数オブジェクト 、thisValue は [[Call]] の this 値となる ECMAScript 言語値 、argList は内部メソッドの対応する引数に渡される値です。argList が存在しない場合、新しい空の List がその値として使用されます。 呼び出されると、次の手順を実行する。
argList が存在しない場合、argList を新しい空の List に設定する。IsCallable (func ) が false である場合、TypeError 例外をスローする。? func .[[Call]] (thisValue , argList ) を返す。
7.3.14 Construct ( ctor [ , argList [ , newTarget ] ] )
抽象操作 Construct。引数 ctor (コンストラクター )および省略可能な引数 argList (リスト (要素:ECMAScript 言語値 )) および newTarget (コンストラクター )。戻り値:(正常完了 (値:Object) または throw 完了 )。 関数オブジェクト の [[Construct]] 内部メソッドを呼び出すために使用されます。argList と newTarget は、内部メソッドの対応する引数として渡される値です。argList が存在しない場合、新しい空の List がその値として使用されます。newTarget が存在しない場合、ctor がその値として使用されます。 呼び出されると、次の手順を実行する。
newTarget が存在しない場合、newTarget を ctor に設定する。argList が存在しない場合、argList を新しい空の List に設定する。? ctor .[[Construct]] (argList , newTarget ) を返す。
注
newTarget が存在しない場合、この操作は new F(...argumentsList) と同等です。
7.3.15 SetIntegrityLevel ( obj , level )
抽象操作 SetIntegrityLevel。引数 obj (Object) および level ((sealed または frozen ))。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 オブジェクト自身のプロパティの集合を固定するために使用されます。 呼び出されると、次の手順を実行する。
status を ? obj .[[PreventExtensions]] () とする。status が false である場合、false を返す。keys を ? obj .[[OwnPropertyKeys]] () とする。level が sealed である場合、keys の各要素 key について、次を行う。? DefinePropertyOrThrow (obj , key , PropertyDescriptor { [[Configurable]] : false }) を実行する。 そうでない場合、表明 : level は frozen である。keys の各要素 key について、次を行う。currentDesc を ? obj .[[GetOwnProperty]] (key ) とする。currentDesc が undefined でない場合、IsAccessorDescriptor (currentDesc ) が true である場合、propertyDesc を PropertyDescriptor { [[Configurable]] : false } とする。そうでない場合、propertyDesc を PropertyDescriptor { [[Configurable]] : false , [[Writable]] : false } とする。 ? DefinePropertyOrThrow (obj , key , propertyDesc ) を実行する。 true を返す。
7.3.16 TestIntegrityLevel ( obj , level )
抽象操作 TestIntegrityLevel。引数 obj (Object) および level ((sealed または frozen ))。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 オブジェクト自身のプロパティの集合が固定されているかどうかを判定するために使用されます。 呼び出されると、次の手順を実行する。
extensible を ? IsExtensible (obj ) とする。extensible が true である場合、false を返す。注記 : オブジェクトが拡張可能である場合、そのプロパティはいずれも検査されない。keys を ? obj .[[OwnPropertyKeys]] () とする。keys の各要素 key について、次を行う。currentDesc を ? obj .[[GetOwnProperty]] (key ) とする。currentDesc が undefined でない場合、currentDesc .[[Configurable]] が true である場合、false を返す。level が frozen かつ IsDataDescriptor (currentDesc ) が true である場合、currentDesc .[[Writable]] が true である場合、false を返す。true を返す。
7.3.17 CreateArrayFromList ( elements )
抽象操作 CreateArrayFromList。引数 elements (リスト (要素:ECMAScript 言語値 ))。戻り値:Array。 elements によって要素が提供される Array を作成するために使用されます。 呼び出されると、次の手順を実行する。
array を ! ArrayCreate (0) とする。n を 0 とする。elements の各要素 element について、次を行う。! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (n )), element ) を実行する。 n を n + 1 に設定する。array を返す。
7.3.18 LengthOfArrayLike ( obj )
抽象操作 LengthOfArrayLike。引数 obj (Object)。戻り値:(正常完了 (値:非負整数) または throw 完了 )。 配列状オブジェクトの "length" プロパティの値を返します。 呼び出されると、次の手順を実行する。
ℝ (? ToLength (? Get (obj , "length" ))) を返す。
配列状オブジェクト とは、この操作が正常完了 を返す任意のオブジェクトです。
注 1
通常、配列状オブジェクトは
整数インデックス 名を持ついくつかのプロパティも持ちます。ただし、これはこの定義の要件ではありません。
注 2
Array および String オブジェクトは、配列状オブジェクトの例です。
7.3.19 CreateListFromArrayLike ( obj [ , validElementTypes ] )
抽象操作 CreateListFromArrayLike。引数 obj (ECMAScript 言語値 )および省略可能な引数 validElementTypes ((all または property-key ))。戻り値:(正常完了 (値:リスト (要素:ECMAScript 言語値 )) または throw 完了 )。 obj のインデックス付きプロパティによって要素が提供される List 値を作成するために使用されます。validElementTypes は、要素として許可される値の型を示します。 呼び出されると、次の手順を実行する。
validElementTypes が存在しない場合、validElementTypes を all に設定する。obj が Object でない場合、TypeError 例外をスローする。length を ? LengthOfArrayLike (obj ) とする。list を新しい空の List とする。index を 0 とする。index < length の間、次を繰り返す。indexName を ! ToString (𝔽 (index )) とする。next を ? Get (obj , indexName ) とする。validElementTypes が property-key かつ next がプロパティキー でない場合、TypeError 例外をスローする。next を list に追加する。index を index + 1 に設定する。list を返す。
7.3.20 Invoke ( value , propertyKey [ , argList ] )
抽象操作 Invoke。引数 value (ECMAScript 言語値 ) および propertyKey (プロパティキー )および省略可能な引数 argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 ECMAScript 言語値 のメソッドプロパティを呼び出すために使用されます。value は、プロパティ検索位置と呼出しの this 値の両方として機能します。argList はメソッドに渡される引数値の List です。argList が存在しない場合、新しい空の List がその値として使用されます。 呼び出されると、次の手順を実行する。
argList が存在しない場合、argList を新しい空の List に設定する。func を ? GetV (value , propertyKey ) とする。? Call (func , value , argList ) を返す。
7.3.21 OrdinaryHasInstance ( ctor , instance )
抽象操作 OrdinaryHasInstance。引数 ctor (ECMAScript 言語値 ) および instance (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 instance が ctor によって提供されるインスタンスオブジェクトの継承経路から継承しているかどうかを判定する既定のアルゴリズムを実装します。 呼び出されると、次の手順を実行する。
IsCallable (ctor ) が false である場合、false を返す。ctor が [[BoundTargetFunction]] 内部スロットを持つ場合、boundCtor を ctor .[[BoundTargetFunction]] とする。? InstanceofOperator (instance , boundCtor ) を返す。 instance が Object でない場合、false を返す。proto を ? Get (ctor , "prototype" ) とする。proto が Object でない場合、TypeError 例外をスローする。次を繰り返す。instance を ? instance .[[GetPrototypeOf]] () に設定する。instance が null である場合、false を返す。SameValue (proto , instance ) が true である場合、true を返す。
7.3.22 SpeciesConstructor ( obj , defaultCtor )
抽象操作 SpeciesConstructor。引数 obj (Object) および defaultCtor (コンストラクター )。戻り値:(正常完了 (値:コンストラクター ) または throw 完了 )。 obj から派生する新しいオブジェクトを作成するために使用するべきコンストラクター を取得するために使用されます。defaultCtor は、obj から開始してコンストラクター の %Symbol.species% プロパティを見つけられない場合に使用するコンストラクター です。 呼び出されると、次の手順を実行する。
ctor を ? Get (obj , "constructor" ) とする。ctor が undefined である場合、defaultCtor を返す。ctor が Object でない場合、TypeError 例外をスローする。species を ? Get (ctor , %Symbol.species% ) とする。species が undefined または null のいずれかである場合、defaultCtor を返す。IsConstructor (species ) が true である場合、species を返す。TypeError 例外をスローする。
7.3.23 EnumerableOwnProperties ( obj , kind )
抽象操作 EnumerableOwnProperties。引数 obj (Object) および kind ((key 、value または key+value ))。戻り値:(正常完了 (値:リスト (要素:ECMAScript 言語値 )) または throw 完了 )。 呼び出されると、次の手順を実行する。
ownKeys を ? obj .[[OwnPropertyKeys]] () とする。results を新しい空の List とする。ownKeys の各要素 key について、次を行う。key が String である場合、propertyDesc を ? obj .[[GetOwnProperty]] (key ) とする。propertyDesc が undefined でなく、propertyDesc .[[Enumerable]] が true である場合、kind が key である場合、key を results に追加する。そうでない場合、value を ? Get (obj , key ) とする。kind が value である場合、value を results に追加する。そうでない場合、表明 : kind は key+value である。entry を CreateArrayFromList (« key , value ») とする。entry を results に追加する。 results を返す。
7.3.24 GetFunctionRealm ( func )
抽象操作 GetFunctionRealm。引数 func (関数オブジェクト )。戻り値:(正常完了 (値:Realmレコード ) または throw 完了 )。 呼び出されると、次の手順を実行する。
func が [[Realm]] 内部スロットを持つ場合、func .[[Realm]] を返す。func が束縛関数特殊オブジェクト である場合、boundTargetFunc を func .[[BoundTargetFunction]] とする。? GetFunctionRealm (boundTargetFunc ) を返す。 func が Proxy 特殊オブジェクト である場合、? ValidateNonRevokedProxy (func ) を実行する。 proxyTarget を func .[[ProxyTarget]] とする。表明 : proxyTarget は関数オブジェクト である。? GetFunctionRealm (proxyTarget ) を返す。 現在の Realm Record を返す。
注
手順 4 に到達するのは、func が [[Realm]] 内部スロットを持たない非標準の関数特殊オブジェクト である場合に限られます。
7.3.25 CopyDataProperties ( target , source , excludedItems )
抽象操作 CopyDataProperties。引数 target (Object)、source (ECMAScript 言語値 ) および excludedItems (リスト (要素:プロパティキー ))。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
source が undefined または null のいずれかである場合、unused を返す。from を ! ToObject (source ) とする。keys を ? from .[[OwnPropertyKeys]] () とする。keys の各要素 nextKey について、次を行う。excluded を false とする。excludedItems の各要素 element について、次を行う。SameValue (element , nextKey ) が true である場合、excluded を true に設定する。excluded が false である場合、propertyDesc を ? from .[[GetOwnProperty]] (nextKey ) とする。propertyDesc が undefined でなく、propertyDesc .[[Enumerable]] が true である場合、propertyValue を ? Get (from , nextKey ) とする。! CreateDataPropertyOrThrow (target , nextKey , propertyValue ) を実行する。 unused を返す。
注
ここに渡されるターゲットは常に新しく作成されたオブジェクトであり、エラーがスローされた場合には直接アクセスできません。
7.3.26 PrivateElementFind ( obj , privateName )
抽象操作 PrivateElementFind。引数 obj (Object) および privateName (プライベート名 )。戻り値:(PrivateElement または empty )。 呼び出されると、次の手順を実行する。
obj .[[PrivateElements]] が、entry .[[Key]] が privateName であるような PrivateElement entry を含む場合、entry を返す。empty を返す。
7.3.27 PrivateFieldAdd ( obj , privateName , value )
抽象操作 PrivateFieldAdd。引数 obj (Object)、privateName (プライベート名 ) および value (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
ホスト が Web ブラウザーである場合、? HostEnsureCanAddPrivateElement (obj ) を実行する。 entry を PrivateElementFind (obj , privateName ) とする。entry が empty でない場合、TypeError 例外をスローする。PrivateElement { [[Key]] : privateName , [[Kind]] : field , [[Value]] : value } を obj .[[PrivateElements]] に追加する。unused を返す。
7.3.28 PrivateMethodOrAccessorAdd ( obj , method )
抽象操作 PrivateMethodOrAccessorAdd。引数 obj (Object) および method (PrivateElement )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
表明 : method .[[Kind]] は method または accessor のいずれかである。ホスト が Web ブラウザーである場合、? HostEnsureCanAddPrivateElement (obj ) を実行する。 entry を PrivateElementFind (obj , method .[[Key]] ) とする。entry が empty でない場合、TypeError 例外をスローする。method を obj .[[PrivateElements]] に追加する。unused を返す。
注
プライベートメソッドおよびアクセサーの値は、インスタンス間で共有されます。この操作は、メソッドまたはアクセサーの新しいコピーを作成しません。
7.3.29 HostEnsureCanAddPrivateElement ( obj )
ホスト定義の抽象操作 HostEnsureCanAddPrivateElement。引数 obj (Object)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 ホスト環境 が、特定のホスト定義 特殊オブジェクト へのプライベート要素の追加を防止できるようにします。
HostEnsureCanAddPrivateElement の実装は、次の要件に適合しなければなりません。
HostEnsureCanAddPrivateElement の既定の実装は、NormalCompletion (unused ) を返すことです。
この抽象操作 は、Web ブラウザーである ECMAScript ホスト によってのみ呼び出されます。
7.3.30 PrivateGet ( obj , privateName )
抽象操作 PrivateGet。引数 obj (Object) および privateName (プライベート名 )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
entry を PrivateElementFind (obj , privateName ) とする。entry が empty である場合、TypeError 例外をスローする。entry .[[Kind]] が field または method のいずれかである場合、entry .[[Value]] を返す。表明 : entry .[[Kind]] は accessor である。entry .[[Getter]] が undefined である場合、TypeError 例外をスローする。getter を entry .[[Getter]] とする。? Call (getter , obj ) を返す。
7.3.31 PrivateSet ( obj , privateName , value )
抽象操作 PrivateSet。引数 obj (Object)、privateName (プライベート名 ) および value (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
entry を PrivateElementFind (obj , privateName ) とする。entry が empty である場合、TypeError 例外をスローする。entry .[[Kind]] が method である場合、TypeError 例外をスローする。entry .[[Kind]] が field である場合、entry .[[Value]] を value に設定する。そうでない場合、表明 : entry .[[Kind]] は accessor である。entry .[[Setter]] が undefined である場合、TypeError 例外をスローする。setter を entry .[[Setter]] とする。? Call (setter , obj , « value ») を実行する。 unused を返す。
7.3.32 DefineField ( receiver , fieldRecord )
抽象操作 DefineField。引数 receiver (Object) および fieldRecord (ClassFieldDefinitionレコード )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
fieldName を fieldRecord .[[Name]] とする。initializer を fieldRecord .[[Initializer]] とする。initializer が empty でない場合、initValue を ? Call (initializer , receiver ) とする。そうでない場合、initValue を undefined とする。 fieldName が Private Name である場合、? PrivateFieldAdd (receiver , fieldName , initValue ) を実行する。 そうでない場合、表明 : fieldName はプロパティキー である。? CreateDataPropertyOrThrow (receiver , fieldName , initValue ) を実行する。 unused を返す。
7.3.33 InitializeInstanceElements ( obj , ctor )
抽象操作 InitializeInstanceElements。引数 obj (Object) および ctor ((ECMAScript 関数オブジェクト または 組込み関数オブジェクト))。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
methods を ctor .[[PrivateMethods]] とする。methods の各 PrivateElement method について、次を行う。? PrivateMethodOrAccessorAdd (obj , method ) を実行する。 fields を ctor .[[Fields]] とする。fields の各要素 fieldRecord について、次を行う。? DefineField (obj , fieldRecord ) を実行する。 unused を返す。
7.3.34 AddValueToKeyedGroup ( groups , key , value )
抽象操作 AddValueToKeyedGroup。引数 groups (リスト (要素:レコード (フィールド:[[Key]] (ECMAScript 言語値 ), [[Elements]] (リスト (要素:ECMAScript 言語値 )))))、key (ECMAScript 言語値 ) および value (ECMAScript 言語値 )。戻り値:unused 。 呼び出されると、次の手順を実行する。
groups の各 Record { [[Key]] , [[Elements]] } group について、次を行う。SameValue (group .[[Key]] , key ) が true である場合、表明 : groups のうち、この基準を満たす要素は正確に1つである。value を group .[[Elements]] に追加する。unused を返す。group を Record { [[Key]] : key , [[Elements]] : « value » } とする。group を groups に追加する。unused を返す。
7.3.35 GroupBy ( items , callback , keyCoercion )
抽象操作 GroupBy。引数 items (ECMAScript 言語値 )、callback (ECMAScript 言語値 ) および keyCoercion ((property または collection ))。戻り値:(正常完了 (値:リスト (要素:レコード (フィールド:[[Key]] (ECMAScript 言語値 ), [[Elements]] (リスト (要素:ECMAScript 言語値 ))))) または throw 完了 )。 呼び出されると、次の手順を実行する。
? RequireObjectCoercible (items ) を実行する。 IsCallable (callback ) が false である場合、TypeError 例外をスローする。groups を新しい空の List とする。iteratorRecord を ? GetIterator (items , sync ) とする。k を 0 とする。次を繰り返す。k ≥ 253 - 1 である場合、error を ThrowCompletion (新しく作成された TypeError オブジェクト) とする。? IteratorClose (iteratorRecord , error ) を返す。 next を ? IteratorStepValue (iteratorRecord ) とする。next が done である場合、groups を返す。value を next とする。key を Completion (Call (callback , undefined , « value , 𝔽 (k ) »)) とする。IfAbruptCloseIterator (key , iteratorRecord )。keyCoercion が property である場合、key を Completion (ToPropertyKey (key )) に設定する。IfAbruptCloseIterator (key , iteratorRecord )。そうでない場合、表明 : keyCoercion は collection である。key を CanonicalizeKeyedCollectionKey (key ) に設定する。 AddValueToKeyedGroup (groups , key , value ) を実行する。k を k + 1 に設定する。
7.3.36 GetOptionsObject ( options )
抽象操作 GetOptionsObject。引数 options (ECMAScript 言語値 )。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
options が undefined である場合、OrdinaryObjectCreate (null ) を返す。options が Object である場合、options を返す。TypeError 例外をスローする。
7.3.37 SetterThatIgnoresPrototypeProperties ( thisValue , home , propertyKey , value )
抽象操作 SetterThatIgnoresPrototypeProperties。引数 thisValue (ECMAScript 言語値 )、home (Object)、propertyKey (プロパティキー ) および value (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
thisValue が Object でない場合、TypeError 例外をスローする。SameValue (thisValue , home ) が true である場合、注記 : ここでのスローは、strict モードのコードで home オブジェクト上の書込み不可のデータプロパティ に代入することを模倣する。TypeError 例外をスローする。propertyDesc を ? thisValue .[[GetOwnProperty]] (propertyKey ) とする。propertyDesc が undefined である場合、? CreateDataPropertyOrThrow (thisValue , propertyKey , value ) を実行する。 そうでない場合、? Set (thisValue , propertyKey , value , true ) を実行する。 unused を返す。
7.4 Iterator オブジェクトに対する操作
共通反復インターフェース(27.1 )を参照してください。
7.4.1 Iterator Record
Iterator Record は、イテレーターまたは非同期イテレーターを、その next メソッドとともにカプセル化するために使用される Record です。
Iterator Record は、表 13 に列挙されるフィールドを持ちます。
表 13: Iterator Record のフィールド
フィールド名
値
意味
[[Iterator]]
Object
イテレーターインターフェースまたは非同期イテレーターインターフェースに適合するオブジェクトです。
[[NextMethod]]
ECMAScript 言語値
[[Iterator]] オブジェクトの next メソッドです。
[[Done]]
Boolean
イテレーターが完了したか、または閉じられたかどうかを示します。
7.4.2 GetIteratorDirect ( obj )
抽象操作 GetIteratorDirect。引数 obj (Object)。戻り値:(正常完了 (値:Iteratorレコード ) または throw 完了 )。 呼び出されると、次の手順を実行する。
nextMethod を ? Get (obj , "next" ) とする。iteratorRecord を Iterator Record { [[Iterator]] : obj , [[NextMethod]] : nextMethod , [[Done]] : false } とする。iteratorRecord を返す。
7.4.3 GetIteratorFromMethod ( obj , method )
抽象操作 GetIteratorFromMethod。引数 obj (ECMAScript 言語値 ) および method (関数オブジェクト )。戻り値:(正常完了 (値:Iteratorレコード ) または throw 完了 )。 呼び出されると、次の手順を実行する。
iterator を ? Call (method , obj ) とする。iterator が Object でない場合、TypeError 例外をスローする。? GetIteratorDirect (iterator ) を返す。
7.4.4 GetIterator ( obj , kind )
抽象操作 GetIterator。引数 obj (ECMAScript 言語値 ) および kind ((sync または async ))。戻り値:(正常完了 (値:Iteratorレコード ) または throw 完了 )。 呼び出されると、次の手順を実行する。
kind が async である場合、method を ? GetMethod (obj , %Symbol.asyncIterator% ) とする。method が undefined である場合、syncMethod を ? GetMethod (obj , %Symbol.iterator% ) とする。syncMethod が undefined である場合、TypeError 例外をスローする。syncIteratorRecord を ? GetIteratorFromMethod (obj , syncMethod ) とする。CreateAsyncFromSyncIterator (syncIteratorRecord ) を返す。そうでない場合、method を ? GetMethod (obj , %Symbol.iterator% ) とする。 method が undefined である場合、TypeError 例外をスローする。? GetIteratorFromMethod (obj , method ) を返す。
7.4.5 GetIteratorFlattenable ( obj , primitiveHandling )
抽象操作 GetIteratorFlattenable。引数 obj (ECMAScript 言語値 ) および primitiveHandling ((iterate-string-primitives または reject-primitives ))。戻り値:(正常完了 (値:Iteratorレコード ) または throw 完了 )。 呼び出されると、次の手順を実行する。
obj が Object でない場合、primitiveHandling が reject-primitives である場合、TypeError 例外をスローする。表明 : primitiveHandling は iterate-string-primitives である。obj が String でない場合、TypeError 例外をスローする。method を ? GetMethod (obj , %Symbol.iterator% ) とする。method が undefined である場合、iterator を obj とする。そうでない場合、iterator を ? Call (method , obj ) とする。 iterator が Object でない場合、TypeError 例外をスローする。? GetIteratorDirect (iterator ) を返す。
7.4.6 IteratorNext ( iteratorRecord [ , value ] )
抽象操作 IteratorNext。引数 iteratorRecord (Iteratorレコード )および省略可能な引数 value (ECMAScript 言語値 )。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
value が存在しない場合、result を Completion (Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] )) とする。そうでない場合、result を Completion (Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] , « value »)) とする。 result がスロー完了である場合、iteratorRecord .[[Done]] を true に設定する。? result を返す。 result を ! result に設定する。result が Object でない場合、iteratorRecord .[[Done]] を true に設定する。TypeError 例外をスローする。result を返す。
7.4.7 IteratorComplete ( iteratorResult )
抽象操作 IteratorComplete。引数 iteratorResult (Object)。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
ToBoolean (? Get (iteratorResult , "done" )) を返す。
7.4.8 IteratorValue ( iteratorResult )
抽象操作 IteratorValue。引数 iteratorResult (Object)。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
? Get (iteratorResult , "value" ) を返す。
7.4.9 IteratorStep ( iteratorRecord )
抽象操作 IteratorStep。引数 iteratorRecord (Iteratorレコード )。戻り値:(正常完了 (値:(Object または done )) または throw 完了 )。 iteratorRecord .[[NextMethod]] を呼び出して iteratorRecord .[[Iterator]] に次の値を要求し、イテレーターが末尾に到達したことを示す done 、または次の値が利用できる場合は IteratorResult オブジェクトのいずれかを返します。 呼び出されると、次の手順を実行する。
result を ? IteratorNext (iteratorRecord ) とする。done を Completion (IteratorComplete (result )) とする。done がスロー完了である場合、iteratorRecord .[[Done]] を true に設定する。? done を返す。 done を ! done に設定する。done が true である場合、iteratorRecord .[[Done]] を true に設定する。done を返す。result を返す。
7.4.10 IteratorStepValue ( iteratorRecord )
抽象操作 IteratorStepValue。引数 iteratorRecord (Iteratorレコード )。戻り値:(正常完了 (値:(ECMAScript 言語値 または done )) または throw 完了 )。 iteratorRecord .[[NextMethod]] を呼び出して iteratorRecord .[[Iterator]] に次の値を要求し、イテレーターが末尾に到達したことを示す done 、または次の値が利用できる場合は IteratorResult オブジェクトからの値のいずれかを返します。 呼び出されると、次の手順を実行する。
result を ? IteratorStep (iteratorRecord ) とする。result が done である場合、done を返す。value を Completion (IteratorValue (result )) とする。value がスロー完了である場合、iteratorRecord .[[Done]] を true に設定する。? value を返す。
7.4.11 IteratorClose ( iteratorRecord , completion )
抽象操作 IteratorClose。引数 iteratorRecord (Iteratorレコード ) および completion (完了レコード )。戻り値:完了レコード 。 イテレーターが完了状態に到達したときに通常実行する処理を実行するべきであることを、そのイテレーターに通知するために使用されます。 呼び出されると、次の手順を実行する。
表明 : iteratorRecord .[[Iterator]] は Object である。iterator を iteratorRecord .[[Iterator]] とする。innerResult を Completion (GetMethod (iterator , "return" )) とする。innerResult が正常完了 である場合、return を innerResult .[[Value]] とする。return が undefined である場合、? completion を返す。innerResult を Completion (Call (return , iterator )) に設定する。completion がスロー完了である場合、? completion を返す。innerResult がスロー完了である場合、? innerResult を返す。innerResult .[[Value]] が Object でない場合、TypeError 例外をスローする。? completion を返す。
7.4.12 IteratorCloseAll ( iterators , completion )
抽象操作 IteratorCloseAll。引数 iterators (リスト (要素:Iteratorレコード )) および completion (完了レコード )。戻り値:完了レコード 。 呼び出されると、次の手順を実行する。
iterators の各要素 iterator について、List の逆順に、次を行う。completion を Completion (IteratorClose (iterator , completion )) に設定する。? completion を返す。
7.4.13 IfAbruptCloseIterator ( value , iteratorRecord )
IfAbruptCloseIterator は、Iterator Record を使用する一連のアルゴリズム手順の短縮表記です。次の形式のアルゴリズム手順:
IfAbruptCloseIterator (value , iteratorRecord ).
は、次と同じ意味です。
表明 : value は Completion Record である。value が中断完了 である場合、? IteratorClose (iteratorRecord , value ) を返す。value を ! value に設定する。
7.4.14 IfAbruptCloseIterators ( value , iteratorRecords )
IfAbruptCloseIterators は、Iterator Record のリストを使用する一連のアルゴリズム手順の短縮表記です。次の形式のアルゴリズム手順:
IfAbruptCloseIterators (value , iteratorRecords ).
は、次と同じ意味です。
表明 : value は Completion Record である。value が中断完了 である場合、? IteratorCloseAll (iteratorRecords , value ) を返す。value を ! value に設定する。
7.4.15 AsyncIteratorClose ( iteratorRecord , completion )
抽象操作 AsyncIteratorClose。引数 iteratorRecord (Iteratorレコード ) および completion (完了レコード )。戻り値:完了レコード 。 非同期イテレーターが完了状態に到達したときに通常実行する処理を実行するべきであることを、その非同期イテレーターに通知するために使用されます。 呼び出されると、次の手順を実行する。
表明 : iteratorRecord .[[Iterator]] は Object である。iterator を iteratorRecord .[[Iterator]] とする。innerResult を Completion (GetMethod (iterator , "return" )) とする。innerResult が正常完了 である場合、return を innerResult .[[Value]] とする。return が undefined である場合、? completion を返す。innerResult を Completion (Call (return , iterator )) に設定する。innerResult が正常完了 である場合、innerResult を Completion (Await (innerResult .[[Value]] )) に設定する。completion がスロー完了である場合、? completion を返す。innerResult がスロー完了である場合、? innerResult を返す。innerResult .[[Value]] が Object でない場合、TypeError 例外をスローする。? completion を返す。
7.4.16 IfAbruptCloseAsyncIterator ( value , iteratorRecord )
IfAbruptCloseAsyncIterator は、Iterator Record を使用する一連のアルゴリズム手順の短縮表記です。次の形式のアルゴリズム手順:
IfAbruptCloseAsyncIterator (value , iteratorRecord ).
は、次と同じ意味です。
表明 : value は Completion Record である。value が中断完了 である場合、? AsyncIteratorClose (iteratorRecord , value ) を返す。value を ! value に設定する。
7.4.17 CreateIteratorResultObject ( value , done )
抽象操作 CreateIteratorResultObject。引数 value (ECMAScript 言語値 ) および done (Boolean)。戻り値:an Object that conforms to the IteratorResult interface。 IteratorResult インターフェースに適合するオブジェクトを作成します。 呼び出されると、次の手順を実行する。
obj を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (obj , "value" , value ) を実行する。 ! CreateDataPropertyOrThrow (obj , "done" , done ) を実行する。 obj を返す。
7.4.18 CreateListIteratorRecord ( list )
抽象操作 CreateListIteratorRecord。引数 list (リスト (要素:ECMAScript 言語値 ))。戻り値:Iteratorレコード 。 [[NextMethod]] が list の連続する要素を返す Iterator Record を作成します。 呼び出されると、次の手順を実行する。
closure を、パラメーターを持たず、list を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。list の各要素 value について、次を行う。? GeneratorYield (CreateIteratorResultObject (value , false )) を実行する。 NormalCompletion (undefined ) を返す。iterator を CreateIteratorFromClosure (closure , empty , %Iterator.prototype% ) とする。Iterator Record { [[Iterator]] : iterator , [[NextMethod]] : %GeneratorPrototype.next%, [[Done]] : false } を返す。
注
リストイテレーターオブジェクトには、ECMAScript コードから直接アクセスすることはできません。
7.4.19 IteratorToList ( iteratorRecord )
抽象操作 IteratorToList。引数 iteratorRecord (Iteratorレコード )。戻り値:(正常完了 (値:リスト (要素:ECMAScript 言語値 )) または throw 完了 )。 呼び出されると、次の手順を実行する。
values を新しい空の List とする。次を繰り返す。next を ? IteratorStepValue (iteratorRecord ) とする。next が done である場合、values を返す。next を values に追加する。
7.5 破棄可能オブジェクトに対する操作
共通リソース管理インターフェース(27.2.1 )を参照してください。
7.5.1 DisposableResource Record
DisposableResource Record は、破棄可能なオブジェクトを、そのオブジェクトを破棄するために使用されるメソッドとともにカプセル化するために使用される Record 値です。DisposableResource Record は CreateDisposableResource 抽象操作 によって生成されます。
DisposableResource Record は、表 14 に列挙されるフィールドを持ちます。
表 14: DisposableResource Record のフィールド
フィールド名
値
意味
[[ResourceValue]]
Object または undefined
破棄される値です。
[[Kind]]
sync-dispose or async-dispose
リソースが using 宣言または DisposableStack オブジェクト(sync-dispose )によって追加されたのか、それとも await using 宣言または AsyncDisposableStack オブジェクト(async-dispose )によって追加されたのかを示します。
[[DisposeMethod]]
関数オブジェクト または undefined
リソースが破棄されるときに、[[ResourceValue]] を this 値として呼び出される関数オブジェクト です。
7.5.2 AddDisposableResource ( disposableResourceStack , value , kind [ , method ] )
抽象操作 AddDisposableResource。引数 disposableResourceStack (リスト (要素:DisposableResourceレコード ))、value (ECMAScript 言語値 ) および kind ((sync-dispose または async-dispose ))および省略可能な引数 method (関数オブジェクト )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
method が存在する場合、表明 : value は undefined である。resource を ? CreateDisposableResource (undefined , kind , method ) とする。そうでない場合、value が null または undefined のいずれかであり、kind が sync-dispose である場合、unused を返す。注記 : value が null または undefined のいずれかであり、kind が async-dispose である場合、後でリソースが破棄されるときにも Await を実行することを保証するため、そのリソースが評価されたことを記録する。resource を ? CreateDisposableResource (value , kind ) とする。 resource を disposableResourceStack に追加する。unused を返す。
7.5.3 CreateDisposableResource ( value , kind [ , method ] )
抽象操作 CreateDisposableResource。引数 value (ECMAScript 言語値 ) および kind ((sync-dispose または async-dispose ))および省略可能な引数 method (関数オブジェクト )。戻り値:(正常完了 (値:DisposableResourceレコード ) または throw 完了 )。 呼び出されると、次の手順を実行する。
method が存在しない場合、value が null または undefined のいずれかである場合、value を undefined に設定する。method を undefined に設定する。そうでない場合、method を ? GetDisposeMethod (value , kind ) に設定する。method が undefined である場合、TypeError 例外をスローする。 DisposableResource Record { [[ResourceValue]] : value , [[Kind]] : kind , [[DisposeMethod]] : method } を返す。
7.5.4 GetDisposeMethod ( value , kind )
抽象操作 GetDisposeMethod。引数 value (ECMAScript 言語値 ) および kind ((sync-dispose または async-dispose ))。戻り値:(正常完了 (値:(関数オブジェクト または undefined )) または throw 完了 )。 呼び出されると、次の手順を実行する。
value が Object でない場合、TypeError 例外をスローする。kind が sync-dispose である場合、? GetMethod (value , %Symbol.dispose% ) を返す。表明 : kind は async-dispose である。asyncMethod を ? GetMethod (value , %Symbol.asyncDispose% ) とする。asyncMethod が undefined でない場合、asyncMethod を返す。syncMethod を ? GetMethod (value , %Symbol.dispose% ) とする。syncMethod が undefined である場合、undefined を返す。closure を、パラメーターを持たず、syncMethod を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。obj を this 値とする。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。result を Completion (Call (syncMethod , obj )) とする。IfAbruptRejectPromise (result , promiseCapability )。! Call (promiseCapability .[[Resolve]] , undefined , « undefined ») を実行する。 promiseCapability .[[Promise]] を返す。注記 : この関数はユーザーコードから観測できない。同期 %Symbol.dispose% メソッドから返される Promise が await されないこと、および同期例外が拒否された Promise に変換されることを保証するために使用される。CreateBuiltinFunction (closure , 0, "" , « ») を返す。
7.5.5 DisposeResources ( disposableResourceStack , completion )
抽象操作 DisposeResources。引数 disposableResourceStack (リスト (要素:DisposableResourceレコード )) および completion ((正常完了 (値:(ECMAScript 言語値 または empty )) または 中途完了))。戻り値:(正常完了 (値:(ECMAScript 言語値 または empty )) または 中途完了)。 呼び出されると、次の手順を実行する。
needsAwait を false とする。hasAwaited を false とする。outputCompletion を completion とする。disposableResourceStack の各要素 resource について、List の逆順に、次を行う。value を resource .[[ResourceValue]] とする。kind を resource .[[Kind]] とする。method を resource .[[DisposeMethod]] とする。kind が sync-dispose 、needsAwait が true 、かつ hasAwaited が false である場合、! Await (undefined ) を実行する。 needsAwait を false に設定する。method が undefined でない場合、result を Completion (Call (method , value )) とする。result が正常完了 かつ kind が async-dispose である場合、result を Completion (Await (result .[[Value]] )) に設定する。hasAwaited を true に設定する。result がスロー完了である場合、outputCompletion がスロー完了である場合、result を result .[[Value]] に設定する。suppressed を outputCompletion .[[Value]] とする。error を新しく作成された SuppressedError オブジェクトとする。CreateNonEnumerableDataPropertyOrThrow (error , "error" , result ) を実行する。CreateNonEnumerableDataPropertyOrThrow (error , "suppressed" , suppressed ) を実行する。outputCompletion を ThrowCompletion (error ) に設定する。そうでない場合、outputCompletion を result に設定する。 そうでない場合、表明 : kind は async-dispose である。needsAwait を true に設定する。注記 : これは、await using 宣言の初期化値が null または undefined のいずれかであった場合だけを示し得る。 needsAwait が true かつ hasAwaited が false である場合、! Await (undefined ) を実行する。 注記 : この時点以降、disposableResourceStack が再び使用されることはない。実装では、ガベージコレクションなどによって disposableResourceStack の内容を破棄できる。? outputCompletion を返す。
8 構文指向操作
この節で定義されるものに加えて、専門化された構文指向操作 が、この仕様全体の各所で定義されています。
8.1 Runtime Semantics: Evaluation
構文指向操作 Evaluation。引数なし。戻り値:完了レコード 。
注
この操作の定義は、この仕様の「ECMAScript 言語」の各節に分散しています。各定義は、関連する生成規則を定義する箇所の後に現れます。
8.2 スコープ解析
8.2.1 Static Semantics: BoundNames
構文指向操作 BoundNames。引数なし。戻り値:リスト (要素:String)。
注
"*default*" は、この仕様内で、別の名前を持たないモジュールのデフォルトエクスポートに対する合成名として使用されます。その名前を持つ項目がモジュールの [[Environment]] に作成され、対応する値を保持します。また、そのモジュールについて ResolveExport ( exportName [ , resolveSet ] ) を呼び出して "default" という名前のエクスポートを解決すると、[[BindingName]] が "*default*" である ResolvedBinding Record が返され、その後モジュールの [[Environment]] 内で上述の値に解決されます。これは仕様を簡潔にするためだけに行われ、匿名のデフォルトエクスポートを他のエクスポートと同様に解決できるようにするためです。この "*default*" 文字列には、ECMAScript コードからもモジュールリンクアルゴリズムからもアクセスできません。
次の生成規則ごとに定義される。
BindingIdentifier : Identifier
Identifier の StringValue を唯一の要素とする List を返す。
BindingIdentifier : yield
« "yield" » を返す。
BindingIdentifier : await
« "await" » を返す。
LexicalDeclaration :
LetOrConst
BindingList
;
BindingList の BoundNames を返す。
UsingDeclaration :
using
BindingList
;
AwaitUsingDeclaration :
CoverAwaitExpressionAndAwaitUsingDeclarationHead
BindingList
;
BindingList の BoundNames を返す。
BindingList :
BindingList
,
LexicalBinding
names1 を BindingList の BoundNames とする。names2 を LexicalBinding の BoundNames とする。names1 と names2 のリスト連結 を返す。
LexicalBinding :
BindingIdentifier
Initializer opt
BindingIdentifier の BoundNames を返す。
LexicalBinding :
BindingPattern
Initializer
BindingPattern の BoundNames を返す。
VariableDeclarationList :
VariableDeclarationList
,
VariableDeclaration
names1 を VariableDeclarationList の BoundNames とする。names2 を VariableDeclaration の BoundNames とする。names1 と names2 のリスト連結 を返す。
VariableDeclaration :
BindingIdentifier
Initializer opt
BindingIdentifier の BoundNames を返す。
VariableDeclaration :
BindingPattern
Initializer
BindingPattern の BoundNames を返す。
ObjectBindingPattern :
{
}
新しい空の List を返す。
ObjectBindingPattern :
{
BindingPropertyList
,
BindingRestProperty
}
names1 を BindingPropertyList の BoundNames とする。names2 を BindingRestProperty の BoundNames とする。names1 と names2 のリスト連結 を返す。
ArrayBindingPattern :
[
Elision opt
]
新しい空の List を返す。
ArrayBindingPattern :
[
Elision opt
BindingRestElement
]
BindingRestElement の BoundNames を返す。
ArrayBindingPattern :
[
BindingElementList
,
Elision opt
]
BindingElementList の BoundNames を返す。
ArrayBindingPattern :
[
BindingElementList
,
Elision opt
BindingRestElement
]
names1 を BindingElementList の BoundNames とする。names2 を BindingRestElement の BoundNames とする。names1 と names2 のリスト連結 を返す。
BindingPropertyList :
BindingPropertyList
,
BindingProperty
names1 を BindingPropertyList の BoundNames とする。names2 を BindingProperty の BoundNames とする。names1 と names2 のリスト連結 を返す。
BindingElementList :
BindingElementList
,
BindingElisionElement
names1 を BindingElementList の BoundNames とする。names2 を BindingElisionElement の BoundNames とする。names1 と names2 のリスト連結 を返す。
BindingElisionElement :
Elision opt
BindingElement
BindingElement の BoundNames を返す。
BindingProperty :
PropertyName
:
BindingElement
BindingElement の BoundNames を返す。
SingleNameBinding :
BindingIdentifier
Initializer opt
BindingIdentifier の BoundNames を返す。
BindingElement :
BindingPattern
Initializer opt
BindingPattern の BoundNames を返す。
ForDeclaration :
LetOrConst
ForBinding
ForBinding の BoundNames を返す。
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
BindingIdentifier の BoundNames を返す。
FunctionDeclaration :
function
(
FormalParameters
)
{
FunctionBody
}
« "*default*" » を返す。
FormalParameters : [empty]
新しい空の List を返す。
FormalParameters :
FormalParameterList
,
FunctionRestParameter
names1 を FormalParameterList の BoundNames とする。names2 を FunctionRestParameter の BoundNames とする。names1 と names2 のリスト連結 を返す。
FormalParameterList :
FormalParameterList
,
FormalParameter
names1 を FormalParameterList の BoundNames とする。names2 を FormalParameter の BoundNames とする。names1 と names2 のリスト連結 を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
formals を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ArrowFormalParameters とする。formals の BoundNames を返す。
GeneratorDeclaration :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
BindingIdentifier の BoundNames を返す。
GeneratorDeclaration :
function
*
(
FormalParameters
)
{
GeneratorBody
}
« "*default*" » を返す。
AsyncGeneratorDeclaration :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
BindingIdentifier の BoundNames を返す。
AsyncGeneratorDeclaration :
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
« "*default*" » を返す。
ClassDeclaration :
class
BindingIdentifier
ClassTail
BindingIdentifier の BoundNames を返す。
ClassDeclaration :
class
ClassTail
« "*default*" » を返す。
AsyncFunctionDeclaration :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
BindingIdentifier の BoundNames を返す。
AsyncFunctionDeclaration :
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
« "*default*" » を返す。
CoverCallExpressionAndAsyncArrowHead :
MemberExpression
Arguments
head を CoverCallExpressionAndAsyncArrowHead によって被覆される AsyncArrowHead とする。head の BoundNames を返す。
ImportDeclaration :
import
ImportClause
FromClause
WithClause opt
;
ImportClause の BoundNames を返す。
ImportDeclaration :
import
ModuleSpecifier
WithClause opt
;
新しい空の List を返す。
ImportClause :
ImportedDefaultBinding
,
NameSpaceImport
names1 を ImportedDefaultBinding の BoundNames とする。names2 を NameSpaceImport の BoundNames とする。names1 と names2 のリスト連結 を返す。
ImportClause :
ImportedDefaultBinding
,
NamedImports
names1 を ImportedDefaultBinding の BoundNames とする。names2 を NamedImports の BoundNames とする。names1 と names2 のリスト連結 を返す。
NamedImports :
{
}
新しい空の List を返す。
ImportsList :
ImportsList
,
ImportSpecifier
names1 を ImportsList の BoundNames とする。names2 を ImportSpecifier の BoundNames とする。names1 と names2 のリスト連結 を返す。
ImportSpecifier :
ModuleExportName
as
ImportedBinding
ImportedBinding の BoundNames を返す。
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
新しい空の List を返す。
ExportDeclaration :
export
VariableStatement
VariableStatement の BoundNames を返す。
ExportDeclaration :
export
Declaration
Declaration の BoundNames を返す。
ExportDeclaration :
export
default
HoistableDeclaration
declNames を HoistableDeclaration の BoundNames とする。declNames が要素 "*default*" を含まない場合、"*default*" を declNames に追加する。declNames を返す。
ExportDeclaration :
export
default
ClassDeclaration
declNames を ClassDeclaration の BoundNames とする。declNames が要素 "*default*" を含まない場合、"*default*" を declNames に追加する。declNames を返す。
ExportDeclaration :
export
default
AssignmentExpression
;
« "*default*" » を返す。
8.2.2 Static Semantics: DeclarationPart
構文指向操作 DeclarationPart。引数なし。戻り値:構文解析ノード 。 次の生成規則ごとに定義される。
HoistableDeclaration : FunctionDeclaration
FunctionDeclaration を返す。
HoistableDeclaration : GeneratorDeclaration
GeneratorDeclaration を返す。
HoistableDeclaration : AsyncFunctionDeclaration
AsyncFunctionDeclaration を返す。
HoistableDeclaration : AsyncGeneratorDeclaration
AsyncGeneratorDeclaration を返す。
Declaration : ClassDeclaration
ClassDeclaration を返す。
Declaration : LexicalDeclaration
LexicalDeclaration を返す。
8.2.3 Static Semantics: IsConstantDeclaration
構文指向操作 IsConstantDeclaration。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
LexicalDeclaration :
LetOrConst
BindingList
;
LetOrConst の IsConstantDeclaration を返す。
LetOrConst : let
false を返す。
LetOrConst : const
true を返す。
UsingDeclaration :
using
BindingList
;
AwaitUsingDeclaration :
CoverAwaitExpressionAndAwaitUsingDeclarationHead
BindingList
;
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
}
false を返す。
ClassDeclaration :
class
BindingIdentifier
ClassTail
class
ClassTail
false を返す。
ExportDeclaration :
export
ExportFromClause
FromClause
;
export
NamedExports
;
export
default
AssignmentExpression
;
false を返す。
注
export default AssignmentExpression を定数宣言として扱う必要はありません。これは、モジュールのデフォルトオブジェクトを参照するために使用される内部束縛名への代入を許可する構文が存在しないためです。
8.2.4 Static Semantics: IsUsingDeclaration
構文指向操作 IsUsingDeclaration。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
LexicalDeclaration :
LetOrConst
BindingList
;
false を返す。
UsingDeclaration :
using
BindingList
;
true を返す。
AwaitUsingDeclaration :
CoverAwaitExpressionAndAwaitUsingDeclarationHead
BindingList
;
false を返す。
ForDeclaration :
LetOrConst
ForBinding
false を返す。
ForDeclaration :
using
ForBinding
true を返す。
ForDeclaration :
await
using
ForBinding
false を返す。
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
}
false を返す。
ClassDeclaration :
class
BindingIdentifier
ClassTail
class
ClassTail
false を返す。
8.2.5 Static Semantics: IsAwaitUsingDeclaration
構文指向操作 IsAwaitUsingDeclaration。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
LexicalDeclaration :
LetOrConst
BindingList
;
false を返す。
UsingDeclaration :
using
BindingList
;
false を返す。
AwaitUsingDeclaration :
CoverAwaitExpressionAndAwaitUsingDeclarationHead
BindingList
;
true を返す。
ForDeclaration :
LetOrConst
ForBinding
false を返す。
ForDeclaration :
using
ForBinding
false を返す。
ForDeclaration :
await
using
ForBinding
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
}
false を返す。
ClassDeclaration :
class
BindingIdentifier
ClassTail
class
ClassTail
false を返す。
8.2.6 Static Semantics: LexicallyDeclaredNames
構文指向操作 LexicallyDeclaredNames。引数なし。戻り値:リスト (要素:String)。 次の生成規則ごとに定義される。
Block :
{
}
新しい空の List を返す。
StatementList :
StatementList
StatementListItem
names1 を StatementList の LexicallyDeclaredNames とする。names2 を StatementListItem の LexicallyDeclaredNames とする。names1 と names2 のリスト連結 を返す。
StatementListItem : Statement
Statement が
Statement : LabelledStatement
である場合、LabelledStatement の LexicallyDeclaredNames を返す。新しい空の List を返す。
StatementListItem : Declaration
Declaration の BoundNames を返す。
CaseBlock :
{
}
新しい空の List を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在する場合、names1 を最初の CaseClauses の LexicallyDeclaredNames とする。 そうでない場合、names1 を新しい空の List とする。 names2 を DefaultClause の LexicallyDeclaredNames とする。2番目の CaseClauses が存在する場合、names3 を2番目の CaseClauses の LexicallyDeclaredNames とする。 そうでない場合、names3 を新しい空の List とする。 names1 、names2 、および names3 のリスト連結 を返す。
CaseClauses :
CaseClauses
CaseClause
names1 を CaseClauses の LexicallyDeclaredNames とする。names2 を CaseClause の LexicallyDeclaredNames とする。names1 と names2 のリスト連結 を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在する場合、StatementList の LexicallyDeclaredNames を返す。新しい空の List を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在する場合、StatementList の LexicallyDeclaredNames を返す。新しい空の List を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
LabelledItem の LexicallyDeclaredNames を返す。
LabelledItem : Statement
新しい空の List を返す。
LabelledItem : FunctionDeclaration
FunctionDeclaration の BoundNames を返す。
FunctionStatementList : [empty]
新しい空の List を返す。
FunctionStatementList : StatementList
StatementList の TopLevelLexicallyDeclaredNames を返す。
ClassStaticBlockStatementList : [empty]
新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
StatementList の TopLevelLexicallyDeclaredNames を返す。
ConciseBody : ExpressionBody
新しい空の List を返す。
AsyncConciseBody : ExpressionBody
新しい空の List を返す。
Script : [empty]
新しい空の List を返す。
ScriptBody : StatementList
StatementList の TopLevelLexicallyDeclaredNames を返す。
注 1
Script のトップレベルでは、関数宣言はレキシカル宣言ではなく var 宣言のように扱われます。
注 2
Module の LexicallyDeclaredNames には、インポートされたすべての束縛の名前が含まれます。
ModuleItemList :
ModuleItemList
ModuleItem
names1 を ModuleItemList の LexicallyDeclaredNames とする。names2 を ModuleItem の LexicallyDeclaredNames とする。names1 と names2 のリスト連結 を返す。
ModuleItem : ImportDeclaration
ImportDeclaration の BoundNames を返す。
ModuleItem : ExportDeclaration
ExportDeclaration が export VariableStatement である場合、新しい空の List を返す。ExportDeclaration の BoundNames を返す。
ModuleItem : StatementListItem
StatementListItem の LexicallyDeclaredNames を返す。
注 3
Module のトップレベルでは、関数宣言は var 宣言ではなくレキシカル宣言のように扱われます。
8.2.7 Static Semantics: LexicallyScopedDeclarations
構文指向操作 LexicallyScopedDeclarations。引数なし。戻り値:リスト (要素:構文解析ノード )。 次の生成規則ごとに定義される。
StatementList :
StatementList
StatementListItem
decls1 を StatementList の LexicallyScopedDeclarations とする。decls2 を StatementListItem の LexicallyScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
StatementListItem : Statement
Statement が
Statement : LabelledStatement
である場合、LabelledStatement の LexicallyScopedDeclarations を返す。新しい空の List を返す。
StatementListItem : Declaration
Declaration の DeclarationPart を唯一の要素とする List を返す。
CaseBlock :
{
}
新しい空の List を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在する場合、decls1 を最初の CaseClauses の LexicallyScopedDeclarations とする。 そうでない場合、decls1 を新しい空の List とする。 decls2 を DefaultClause の LexicallyScopedDeclarations とする。2番目の CaseClauses が存在する場合、decls3 を2番目の CaseClauses の LexicallyScopedDeclarations とする。 そうでない場合、decls3 を新しい空の List とする。 decls1 、decls2 、および decls3 のリスト連結 を返す。
CaseClauses :
CaseClauses
CaseClause
decls1 を CaseClauses の LexicallyScopedDeclarations とする。decls2 を CaseClause の LexicallyScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在する場合、StatementList の LexicallyScopedDeclarations を返す。新しい空の List を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在する場合、StatementList の LexicallyScopedDeclarations を返す。新しい空の List を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
LabelledItem の LexicallyScopedDeclarations を返す。
LabelledItem : Statement
新しい空の List を返す。
LabelledItem : FunctionDeclaration
« FunctionDeclaration » を返す。
FunctionStatementList : [empty]
新しい空の List を返す。
FunctionStatementList : StatementList
StatementList の TopLevelLexicallyScopedDeclarations を返す。
ClassStaticBlockStatementList : [empty]
新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
StatementList の TopLevelLexicallyScopedDeclarations を返す。
ConciseBody : ExpressionBody
新しい空の List を返す。
AsyncConciseBody : ExpressionBody
新しい空の List を返す。
Script : [empty]
新しい空の List を返す。
ScriptBody : StatementList
StatementList の TopLevelLexicallyScopedDeclarations を返す。
Module : [empty]
新しい空の List を返す。
ModuleItemList :
ModuleItemList
ModuleItem
decls1 を ModuleItemList の LexicallyScopedDeclarations とする。decls2 を ModuleItem の LexicallyScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
ModuleItem : ImportDeclaration
新しい空の List を返す。
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
export
VariableStatement
新しい空の List を返す。
ExportDeclaration :
export
Declaration
Declaration の DeclarationPart を唯一の要素とする List を返す。
ExportDeclaration :
export
default
HoistableDeclaration
HoistableDeclaration の DeclarationPart を唯一の要素とする List を返す。
ExportDeclaration :
export
default
ClassDeclaration
ClassDeclaration を唯一の要素とする List を返す。
ExportDeclaration :
export
default
AssignmentExpression
;
この ExportDeclaration を唯一の要素とする List を返す。
8.2.8 Static Semantics: VarDeclaredNames
構文指向操作 VarDeclaredNames。引数なし。戻り値:リスト (要素:String)。 次の生成規則ごとに定義される。
Statement :
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
新しい空の List を返す。
Block :
{
}
新しい空の List を返す。
StatementList :
StatementList
StatementListItem
names1 を StatementList の VarDeclaredNames とする。names2 を StatementListItem の VarDeclaredNames とする。names1 と names2 のリスト連結 を返す。
StatementListItem : Declaration
新しい空の List を返す。
VariableStatement :
var
VariableDeclarationList
;
VariableDeclarationList の BoundNames を返す。
IfStatement :
if
(
Expression
)
Statement
else
Statement
names1 を最初の Statement の VarDeclaredNames とする。names2 を2番目の Statement の VarDeclaredNames とする。names1 と names2 のリスト連結 を返す。
IfStatement :
if
(
Expression
)
Statement
Statement の VarDeclaredNames を返す。
DoWhileStatement :
do
Statement
while
(
Expression
)
;
Statement の VarDeclaredNames を返す。
WhileStatement :
while
(
Expression
)
Statement
Statement の VarDeclaredNames を返す。
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
Statement の VarDeclaredNames を返す。
ForStatement :
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
names1 を VariableDeclarationList の BoundNames とする。names2 を Statement の VarDeclaredNames とする。names1 と names2 のリスト連結 を返す。
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
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
Statement の VarDeclaredNames を返す。
ForInOfStatement :
for
(
var
ForBinding
in
Expression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
names1 を ForBinding の BoundNames とする。names2 を Statement の VarDeclaredNames とする。names1 と names2 のリスト連結 を返す。
注
この節は、附属書 B.3.5 によって拡張されます。
WithStatement :
with
(
Expression
)
Statement
Statement の VarDeclaredNames を返す。
SwitchStatement :
switch
(
Expression
)
CaseBlock
CaseBlock の VarDeclaredNames を返す。
CaseBlock :
{
}
新しい空の List を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在する場合、names1 を最初の CaseClauses の VarDeclaredNames とする。 そうでない場合、names1 を新しい空の List とする。 names2 を DefaultClause の VarDeclaredNames とする。2番目の CaseClauses が存在する場合、names3 を2番目の CaseClauses の VarDeclaredNames とする。 そうでない場合、names3 を新しい空の List とする。 names1 、names2 、および names3 のリスト連結 を返す。
CaseClauses :
CaseClauses
CaseClause
names1 を CaseClauses の VarDeclaredNames とする。names2 を CaseClause の VarDeclaredNames とする。names1 と names2 のリスト連結 を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在する場合、StatementList の VarDeclaredNames を返す。新しい空の List を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在する場合、StatementList の VarDeclaredNames を返す。新しい空の List を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
LabelledItem の VarDeclaredNames を返す。
LabelledItem : FunctionDeclaration
新しい空の List を返す。
TryStatement :
try
Block
Catch
names1 を Block の VarDeclaredNames とする。names2 を Catch の VarDeclaredNames とする。names1 と names2 のリスト連結 を返す。
TryStatement :
try
Block
Finally
names1 を Block の VarDeclaredNames とする。names2 を Finally の VarDeclaredNames とする。names1 と names2 のリスト連結 を返す。
TryStatement :
try
Block
Catch
Finally
names1 を Block の VarDeclaredNames とする。names2 を Catch の VarDeclaredNames とする。names3 を Finally の VarDeclaredNames とする。names1 、names2 、および names3 のリスト連結 を返す。
Catch :
catch
(
CatchParameter
)
Block
Block の VarDeclaredNames を返す。
FunctionStatementList : [empty]
新しい空の List を返す。
FunctionStatementList : StatementList
StatementList の TopLevelVarDeclaredNames を返す。
ClassStaticBlockStatementList : [empty]
新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
StatementList の TopLevelVarDeclaredNames を返す。
ConciseBody : ExpressionBody
新しい空の List を返す。
AsyncConciseBody : ExpressionBody
新しい空の List を返す。
Script : [empty]
新しい空の List を返す。
ScriptBody : StatementList
StatementList の TopLevelVarDeclaredNames を返す。
ModuleItemList :
ModuleItemList
ModuleItem
names1 を ModuleItemList の VarDeclaredNames とする。names2 を ModuleItem の VarDeclaredNames とする。names1 と names2 のリスト連結 を返す。
ModuleItem : ImportDeclaration
新しい空の List を返す。
ModuleItem : ExportDeclaration
ExportDeclaration が export VariableStatement である場合、ExportDeclaration の BoundNames を返す。新しい空の List を返す。
8.2.9 Static Semantics: VarScopedDeclarations
構文指向操作 VarScopedDeclarations。引数なし。戻り値:リスト (要素:構文解析ノード )。 次の生成規則ごとに定義される。
Statement :
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
新しい空の List を返す。
Block :
{
}
新しい空の List を返す。
StatementList :
StatementList
StatementListItem
decls1 を StatementList の VarScopedDeclarations とする。decls2 を StatementListItem の VarScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
StatementListItem : Declaration
新しい空の List を返す。
VariableDeclarationList : VariableDeclaration
« VariableDeclaration » を返す。
VariableDeclarationList :
VariableDeclarationList
,
VariableDeclaration
decls1 を VariableDeclarationList の VarScopedDeclarations とする。decls1 と « VariableDeclaration » のリスト連結 を返す。
IfStatement :
if
(
Expression
)
Statement
else
Statement
decls1 を最初の Statement の VarScopedDeclarations とする。decls2 を2番目の Statement の VarScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
IfStatement :
if
(
Expression
)
Statement
Statement の VarScopedDeclarations を返す。
DoWhileStatement :
do
Statement
while
(
Expression
)
;
Statement の VarScopedDeclarations を返す。
WhileStatement :
while
(
Expression
)
Statement
Statement の VarScopedDeclarations を返す。
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
Statement の VarScopedDeclarations を返す。
ForStatement :
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
decls1 を VariableDeclarationList の VarScopedDeclarations とする。decls2 を Statement の VarScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
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
Statement の VarScopedDeclarations を返す。
ForInOfStatement :
for
(
var
ForBinding
in
Expression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
decls1 を « ForBinding » とする。decls2 を Statement の VarScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
注
この節は、附属書 B.3.5 によって拡張されます。
WithStatement :
with
(
Expression
)
Statement
Statement の VarScopedDeclarations を返す。
SwitchStatement :
switch
(
Expression
)
CaseBlock
CaseBlock の VarScopedDeclarations を返す。
CaseBlock :
{
}
新しい空の List を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在する場合、decls1 を最初の CaseClauses の VarScopedDeclarations とする。 そうでない場合、decls1 を新しい空の List とする。 decls2 を DefaultClause の VarScopedDeclarations とする。2番目の CaseClauses が存在する場合、decls3 を2番目の CaseClauses の VarScopedDeclarations とする。 そうでない場合、decls3 を新しい空の List とする。 decls1 、decls2 、および decls3 のリスト連結 を返す。
CaseClauses :
CaseClauses
CaseClause
decls1 を CaseClauses の VarScopedDeclarations とする。decls2 を CaseClause の VarScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在する場合、StatementList の VarScopedDeclarations を返す。新しい空の List を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在する場合、StatementList の VarScopedDeclarations を返す。新しい空の List を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
LabelledItem の VarScopedDeclarations を返す。
LabelledItem : FunctionDeclaration
新しい空の List を返す。
TryStatement :
try
Block
Catch
decls1 を Block の VarScopedDeclarations とする。decls2 を Catch の VarScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
TryStatement :
try
Block
Finally
decls1 を Block の VarScopedDeclarations とする。decls2 を Finally の VarScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
TryStatement :
try
Block
Catch
Finally
decls1 を Block の VarScopedDeclarations とする。decls2 を Catch の VarScopedDeclarations とする。decls3 を Finally の VarScopedDeclarations とする。decls1 、decls2 、および decls3 のリスト連結 を返す。
Catch :
catch
(
CatchParameter
)
Block
Block の VarScopedDeclarations を返す。
FunctionStatementList : [empty]
新しい空の List を返す。
FunctionStatementList : StatementList
StatementList の TopLevelVarScopedDeclarations を返す。
ClassStaticBlockStatementList : [empty]
新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
StatementList の TopLevelVarScopedDeclarations を返す。
ConciseBody : ExpressionBody
新しい空の List を返す。
AsyncConciseBody : ExpressionBody
新しい空の List を返す。
Script : [empty]
新しい空の List を返す。
ScriptBody : StatementList
StatementList の TopLevelVarScopedDeclarations を返す。
Module : [empty]
新しい空の List を返す。
ModuleItemList :
ModuleItemList
ModuleItem
decls1 を ModuleItemList の VarScopedDeclarations とする。decls2 を ModuleItem の VarScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
ModuleItem : ImportDeclaration
新しい空の List を返す。
ModuleItem : ExportDeclaration
ExportDeclaration が export VariableStatement である場合、VariableStatement の VarScopedDeclarations を返す。新しい空の List を返す。
8.2.10 Static Semantics: TopLevelLexicallyDeclaredNames
構文指向操作 TopLevelLexicallyDeclaredNames。引数なし。戻り値:リスト (要素:String)。 次の生成規則ごとに定義される。
StatementList :
StatementList
StatementListItem
names1 を StatementList の TopLevelLexicallyDeclaredNames とする。names2 を StatementListItem の TopLevelLexicallyDeclaredNames とする。names1 と names2 のリスト連結 を返す。
StatementListItem : Statement
新しい空の List を返す。
StatementListItem : Declaration
Declaration が
Declaration : HoistableDeclaration
である場合、新しい空の List を返す。 Declaration の BoundNames を返す。
注
関数またはスクリプトのトップレベルでは、関数宣言はレキシカル宣言ではなく var 宣言のように扱われます。
8.2.11 Static Semantics: TopLevelLexicallyScopedDeclarations
構文指向操作 TopLevelLexicallyScopedDeclarations。引数なし。戻り値:リスト (要素:構文解析ノード )。 次の生成規則ごとに定義される。
StatementList :
StatementList
StatementListItem
decls1 を StatementList の TopLevelLexicallyScopedDeclarations とする。decls2 を StatementListItem の TopLevelLexicallyScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
StatementListItem : Statement
新しい空の List を返す。
StatementListItem : Declaration
Declaration が
Declaration : HoistableDeclaration
である場合、新しい空の List を返す。 « Declaration » を返す。
8.2.12 Static Semantics: TopLevelVarDeclaredNames
構文指向操作 TopLevelVarDeclaredNames。引数なし。戻り値:リスト (要素:String)。 次の生成規則ごとに定義される。
StatementList :
StatementList
StatementListItem
names1 を StatementList の TopLevelVarDeclaredNames とする。names2 を StatementListItem の TopLevelVarDeclaredNames とする。names1 と names2 のリスト連結 を返す。
StatementListItem : Declaration
Declaration が
Declaration : HoistableDeclaration
である場合、HoistableDeclaration の BoundNames を返す。新しい空の List を返す。
StatementListItem : Statement
Statement が
Statement : LabelledStatement
である場合、Statement の TopLevelVarDeclaredNames を返す。Statement の VarDeclaredNames を返す。
注
関数またはスクリプトのトップレベルでは、内部の関数宣言は var 宣言のように扱われます。
LabelledStatement :
LabelIdentifier
:
LabelledItem
LabelledItem の TopLevelVarDeclaredNames を返す。
LabelledItem : Statement
Statement が
Statement : LabelledStatement
である場合、Statement の TopLevelVarDeclaredNames を返す。Statement の VarDeclaredNames を返す。
LabelledItem : FunctionDeclaration
FunctionDeclaration の BoundNames を返す。
8.2.13 Static Semantics: TopLevelVarScopedDeclarations
構文指向操作 TopLevelVarScopedDeclarations。引数なし。戻り値:リスト (要素:構文解析ノード )。 次の生成規則ごとに定義される。
StatementList :
StatementList
StatementListItem
decls1 を StatementList の TopLevelVarScopedDeclarations とする。decls2 を StatementListItem の TopLevelVarScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
StatementListItem : Statement
Statement が
Statement : LabelledStatement
である場合、Statement の TopLevelVarScopedDeclarations を返す。Statement の VarScopedDeclarations を返す。
StatementListItem : Declaration
Declaration が
Declaration : HoistableDeclaration
である場合、decl を HoistableDeclaration の DeclarationPart とする。« decl » を返す。 新しい空の List を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
LabelledItem の TopLevelVarScopedDeclarations を返す。
LabelledItem : Statement
Statement が
Statement : LabelledStatement
である場合、Statement の TopLevelVarScopedDeclarations を返す。Statement の VarScopedDeclarations を返す。
LabelledItem : FunctionDeclaration
« FunctionDeclaration » を返す。
8.3 ラベル
8.3.1 Static Semantics: ContainsDuplicateLabels
構文指向操作 ContainsDuplicateLabels。引数 labelSet (リスト (要素:String))。戻り値:Boolean。 次の生成規則ごとに定義される。
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block :
{
}
StatementListItem :
Declaration
false を返す。
StatementList :
StatementList
StatementListItem
hasDuplicates を、引数 labelSet を指定した StatementList の ContainsDuplicateLabels とする。hasDuplicates が true である場合、true を返す。引数 labelSet を指定した StatementListItem の ContainsDuplicateLabels を返す。
IfStatement :
if
(
Expression
)
Statement
else
Statement
hasDuplicate を、引数 labelSet を指定した最初の Statement の ContainsDuplicateLabels とする。hasDuplicate が true である場合、true を返す。引数 labelSet を指定した2番目の Statement の ContainsDuplicateLabels を返す。
IfStatement :
if
(
Expression
)
Statement
引数 labelSet を指定した Statement の ContainsDuplicateLabels を返す。
DoWhileStatement :
do
Statement
while
(
Expression
)
;
引数 labelSet を指定した Statement の ContainsDuplicateLabels を返す。
WhileStatement :
while
(
Expression
)
Statement
引数 labelSet を指定した Statement の ContainsDuplicateLabels を返す。
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
引数 labelSet を指定した Statement の ContainsDuplicateLabels を返す。
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
引数 labelSet を指定した Statement の ContainsDuplicateLabels を返す。
注
この節は、附属書 B.3.5 によって拡張されます。
WithStatement :
with
(
Expression
)
Statement
引数 labelSet を指定した Statement の ContainsDuplicateLabels を返す。
SwitchStatement :
switch
(
Expression
)
CaseBlock
引数 labelSet を指定した CaseBlock の ContainsDuplicateLabels を返す。
CaseBlock :
{
}
false を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在する場合、引数 labelSet を指定した最初の CaseClauses の ContainsDuplicateLabels が true である場合、true を返す。 引数 labelSet を指定した DefaultClause の ContainsDuplicateLabels が true である場合、true を返す。 2番目の CaseClauses が存在しない場合、false を返す。 引数 labelSet を指定した2番目の CaseClauses の ContainsDuplicateLabels を返す。
CaseClauses :
CaseClauses
CaseClause
hasDuplicates を、引数 labelSet を指定した CaseClauses の ContainsDuplicateLabels とする。hasDuplicates が true である場合、true を返す。引数 labelSet を指定した CaseClause の ContainsDuplicateLabels を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在する場合、引数 labelSet を指定した StatementList の ContainsDuplicateLabels を返す。false を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在する場合、引数 labelSet を指定した StatementList の ContainsDuplicateLabels を返す。false を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
label を LabelIdentifier の StringValue とする。labelSet が label を含む場合、true を返す。newLabelSet を labelSet と « label » のリスト連結 とする。引数 newLabelSet を指定した LabelledItem の ContainsDuplicateLabels を返す。
LabelledItem : FunctionDeclaration
false を返す。
TryStatement :
try
Block
Catch
hasDuplicates を、引数 labelSet を指定した Block の ContainsDuplicateLabels とする。hasDuplicates が true である場合、true を返す。引数 labelSet を指定した Catch の ContainsDuplicateLabels を返す。
TryStatement :
try
Block
Finally
hasDuplicates を、引数 labelSet を指定した Block の ContainsDuplicateLabels とする。hasDuplicates が true である場合、true を返す。引数 labelSet を指定した Finally の ContainsDuplicateLabels を返す。
TryStatement :
try
Block
Catch
Finally
引数 labelSet を指定した Block の ContainsDuplicateLabels が true である場合、true を返す。 引数 labelSet を指定した Catch の ContainsDuplicateLabels が true である場合、true を返す。 引数 labelSet を指定した Finally の ContainsDuplicateLabels を返す。
Catch :
catch
(
CatchParameter
)
Block
引数 labelSet を指定した Block の ContainsDuplicateLabels を返す。
FunctionStatementList : [empty]
false を返す。
ClassStaticBlockStatementList : [empty]
false を返す。
ModuleItemList :
ModuleItemList
ModuleItem
hasDuplicates を、引数 labelSet を指定した ModuleItemList の ContainsDuplicateLabels とする。hasDuplicates が true である場合、true を返す。引数 labelSet を指定した ModuleItem の ContainsDuplicateLabels を返す。
ModuleItem :
ImportDeclaration
ExportDeclaration
false を返す。
8.3.2 Static Semantics: ContainsUndefinedBreakTarget
構文指向操作 ContainsUndefinedBreakTarget。引数 labelSet (リスト (要素:String))。戻り値:Boolean。 次の生成規則ごとに定義される。
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block :
{
}
StatementListItem :
Declaration
false を返す。
StatementList :
StatementList
StatementListItem
hasUndefinedLabels を、引数 labelSet を指定した StatementList の ContainsUndefinedBreakTarget とする。hasUndefinedLabels が true である場合、true を返す。引数 labelSet を指定した StatementListItem の ContainsUndefinedBreakTarget を返す。
IfStatement :
if
(
Expression
)
Statement
else
Statement
hasUndefinedLabels を、引数 labelSet を指定した最初の Statement の ContainsUndefinedBreakTarget とする。hasUndefinedLabels が true である場合、true を返す。引数 labelSet を指定した2番目の Statement の ContainsUndefinedBreakTarget を返す。
IfStatement :
if
(
Expression
)
Statement
引数 labelSet を指定した Statement の ContainsUndefinedBreakTarget を返す。
DoWhileStatement :
do
Statement
while
(
Expression
)
;
引数 labelSet を指定した Statement の ContainsUndefinedBreakTarget を返す。
WhileStatement :
while
(
Expression
)
Statement
引数 labelSet を指定した Statement の ContainsUndefinedBreakTarget を返す。
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
引数 labelSet を指定した Statement の ContainsUndefinedBreakTarget を返す。
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
引数 labelSet を指定した Statement の ContainsUndefinedBreakTarget を返す。
注
この節は、附属書 B.3.5 によって拡張されます。
BreakStatement :
break
;
false を返す。
BreakStatement :
break
LabelIdentifier
;
labelSet が LabelIdentifier の StringValue を含む場合、false を返す。true を返す。
WithStatement :
with
(
Expression
)
Statement
引数 labelSet を指定した Statement の ContainsUndefinedBreakTarget を返す。
SwitchStatement :
switch
(
Expression
)
CaseBlock
引数 labelSet を指定した CaseBlock の ContainsUndefinedBreakTarget を返す。
CaseBlock :
{
}
false を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在する場合、引数 labelSet を指定した最初の CaseClauses の ContainsUndefinedBreakTarget が true である場合、true を返す。 引数 labelSet を指定した DefaultClause の ContainsUndefinedBreakTarget が true である場合、true を返す。 2番目の CaseClauses が存在しない場合、false を返す。 引数 labelSet を指定した2番目の CaseClauses の ContainsUndefinedBreakTarget を返す。
CaseClauses :
CaseClauses
CaseClause
hasUndefinedLabels を、引数 labelSet を指定した CaseClauses の ContainsUndefinedBreakTarget とする。hasUndefinedLabels が true である場合、true を返す。引数 labelSet を指定した CaseClause の ContainsUndefinedBreakTarget を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在する場合、引数 labelSet を指定した StatementList の ContainsUndefinedBreakTarget を返す。false を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在する場合、引数 labelSet を指定した StatementList の ContainsUndefinedBreakTarget を返す。false を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
label を LabelIdentifier の StringValue とする。newLabelSet を labelSet と « label » のリスト連結 とする。引数 newLabelSet を指定した LabelledItem の ContainsUndefinedBreakTarget を返す。
LabelledItem : FunctionDeclaration
false を返す。
TryStatement :
try
Block
Catch
hasUndefinedLabels を、引数 labelSet を指定した Block の ContainsUndefinedBreakTarget とする。hasUndefinedLabels が true である場合、true を返す。引数 labelSet を指定した Catch の ContainsUndefinedBreakTarget を返す。
TryStatement :
try
Block
Finally
hasUndefinedLabels を、引数 labelSet を指定した Block の ContainsUndefinedBreakTarget とする。hasUndefinedLabels が true である場合、true を返す。引数 labelSet を指定した Finally の ContainsUndefinedBreakTarget を返す。
TryStatement :
try
Block
Catch
Finally
引数 labelSet を指定した Block の ContainsUndefinedBreakTarget が true である場合、true を返す。 引数 labelSet を指定した Catch の ContainsUndefinedBreakTarget が true である場合、true を返す。 引数 labelSet を指定した Finally の ContainsUndefinedBreakTarget を返す。
Catch :
catch
(
CatchParameter
)
Block
引数 labelSet を指定した Block の ContainsUndefinedBreakTarget を返す。
FunctionStatementList : [empty]
false を返す。
ClassStaticBlockStatementList : [empty]
false を返す。
ModuleItemList :
ModuleItemList
ModuleItem
hasUndefinedLabels を、引数 labelSet を指定した ModuleItemList の ContainsUndefinedBreakTarget とする。hasUndefinedLabels が true である場合、true を返す。引数 labelSet を指定した ModuleItem の ContainsUndefinedBreakTarget を返す。
ModuleItem :
ImportDeclaration
ExportDeclaration
false を返す。
8.3.3 Static Semantics: ContainsUndefinedContinueTarget
構文指向操作 ContainsUndefinedContinueTarget。引数 iterationSet (リスト (要素:String)) および labelSet (リスト (要素:String))。戻り値:Boolean。 次の生成規則ごとに定義される。
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block :
{
}
StatementListItem :
Declaration
false を返す。
Statement : BlockStatement
引数 iterationSet および « » を指定した BlockStatement の ContainsUndefinedContinueTarget を返す。
BreakableStatement : IterationStatement
newIterationSet を iterationSet と labelSet のリスト連結 とする。引数 newIterationSet および « » を指定した IterationStatement の ContainsUndefinedContinueTarget を返す。
StatementList :
StatementList
StatementListItem
hasUndefinedLabels を、引数 iterationSet および « » を指定した StatementList の ContainsUndefinedContinueTarget とする。hasUndefinedLabels が true である場合、true を返す。引数 iterationSet および « » を指定した StatementListItem の ContainsUndefinedContinueTarget を返す。
IfStatement :
if
(
Expression
)
Statement
else
Statement
hasUndefinedLabels を、引数 iterationSet および « » を指定した最初の Statement の ContainsUndefinedContinueTarget とする。hasUndefinedLabels が true である場合、true を返す。引数 iterationSet および « » を指定した2番目の Statement の ContainsUndefinedContinueTarget を返す。
IfStatement :
if
(
Expression
)
Statement
引数 iterationSet および « » を指定した Statement の ContainsUndefinedContinueTarget を返す。
DoWhileStatement :
do
Statement
while
(
Expression
)
;
引数 iterationSet および « » を指定した Statement の ContainsUndefinedContinueTarget を返す。
WhileStatement :
while
(
Expression
)
Statement
引数 iterationSet および « » を指定した Statement の ContainsUndefinedContinueTarget を返す。
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
引数 iterationSet および « » を指定した Statement の ContainsUndefinedContinueTarget を返す。
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
引数 iterationSet および « » を指定した Statement の ContainsUndefinedContinueTarget を返す。
注
この節は、附属書 B.3.5 によって拡張されます。
ContinueStatement :
continue
;
false を返す。
ContinueStatement :
continue
LabelIdentifier
;
iterationSet が LabelIdentifier の StringValue を含む場合、false を返す。true を返す。
WithStatement :
with
(
Expression
)
Statement
引数 iterationSet および « » を指定した Statement の ContainsUndefinedContinueTarget を返す。
SwitchStatement :
switch
(
Expression
)
CaseBlock
引数 iterationSet および « » を指定した CaseBlock の ContainsUndefinedContinueTarget を返す。
CaseBlock :
{
}
false を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在する場合、引数 iterationSet および « » を指定した最初の CaseClauses の ContainsUndefinedContinueTarget が true である場合、true を返す。 引数 iterationSet および « » を指定した DefaultClause の ContainsUndefinedContinueTarget が true である場合、true を返す。 2番目の CaseClauses が存在しない場合、false を返す。 引数 iterationSet および « » を指定した2番目の CaseClauses の ContainsUndefinedContinueTarget を返す。
CaseClauses :
CaseClauses
CaseClause
hasUndefinedLabels を、引数 iterationSet および « » を指定した CaseClauses の ContainsUndefinedContinueTarget とする。hasUndefinedLabels が true である場合、true を返す。引数 iterationSet および « » を指定した CaseClause の ContainsUndefinedContinueTarget を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在する場合、引数 iterationSet および « » を指定した StatementList の ContainsUndefinedContinueTarget を返す。false を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在する場合、引数 iterationSet および « » を指定した StatementList の ContainsUndefinedContinueTarget を返す。false を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
label を LabelIdentifier の StringValue とする。newLabelSet を labelSet と « label » のリスト連結 とする。引数 iterationSet および newLabelSet を指定した LabelledItem の ContainsUndefinedContinueTarget を返す。
LabelledItem : FunctionDeclaration
false を返す。
TryStatement :
try
Block
Catch
hasUndefinedLabels を、引数 iterationSet および « » を指定した Block の ContainsUndefinedContinueTarget とする。hasUndefinedLabels が true である場合、true を返す。引数 iterationSet および « » を指定した Catch の ContainsUndefinedContinueTarget を返す。
TryStatement :
try
Block
Finally
hasUndefinedLabels を、引数 iterationSet および « » を指定した Block の ContainsUndefinedContinueTarget とする。hasUndefinedLabels が true である場合、true を返す。引数 iterationSet および « » を指定した Finally の ContainsUndefinedContinueTarget を返す。
TryStatement :
try
Block
Catch
Finally
引数 iterationSet および « » を指定した Block の ContainsUndefinedContinueTarget が true である場合、true を返す。 引数 iterationSet および « » を指定した Catch の ContainsUndefinedContinueTarget が true である場合、true を返す。 引数 iterationSet および « » を指定した Finally の ContainsUndefinedContinueTarget を返す。
Catch :
catch
(
CatchParameter
)
Block
引数 iterationSet および « » を指定した Block の ContainsUndefinedContinueTarget を返す。
FunctionStatementList : [empty]
false を返す。
ClassStaticBlockStatementList : [empty]
false を返す。
ModuleItemList :
ModuleItemList
ModuleItem
hasUndefinedLabels を、引数 iterationSet および « » を指定した ModuleItemList の ContainsUndefinedContinueTarget とする。hasUndefinedLabels が true である場合、true を返す。引数 iterationSet および « » を指定した ModuleItem の ContainsUndefinedContinueTarget を返す。
ModuleItem :
ImportDeclaration
ExportDeclaration
false を返す。
8.4 関数名の推論
8.4.1 Static Semantics: HasName
構文指向操作 HasName。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
expr を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。expr の IsFunctionDefinition が false である場合、false を返す。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
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
true を返す。
8.4.2 Static Semantics: IsFunctionDefinition
構文指向操作 IsFunctionDefinition。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
expr を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。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
CoverAwaitExpressionAndAwaitUsingDeclarationHead
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
false を返す。
AssignmentExpression :
ArrowFunction
AsyncArrowFunction
FunctionExpression :
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
GeneratorExpression :
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorExpression :
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionExpression :
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
ClassExpression :
class
BindingIdentifier opt
ClassTail
true を返す。
8.4.3 Static Semantics: IsAnonymousFunctionDefinition ( expr )
抽象操作 IsAnonymousFunctionDefinition。引数 expr ((an AssignmentExpression Parse Node 、an Initializer Parse Node または an Expression Parse Node ))。戻り値:Boolean。 引数が、名前を束縛しない関数定義であるかどうかを判定します。 呼び出されると、次の手順を実行する。
expr の IsFunctionDefinition が false である場合、false を返す。hasName を expr の HasName とする。hasName が true である場合、false を返す。true を返す。
8.4.4 Static Semantics: IsIdentifierRef
構文指向操作 IsIdentifierRef。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
PrimaryExpression : IdentifierReference
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
false を返す。
8.4.5 Runtime Semantics: NamedEvaluation
構文指向操作 NamedEvaluation。引数 name ((プロパティキー または プライベート名 ))。戻り値:(正常完了 (値:関数オブジェクト ) または 中途完了)。 次の生成規則ごとに定義される。
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
expr を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。引数 name を指定した expr の ? NamedEvaluation を返す。
ParenthesizedExpression :
(
Expression
)
表明 : IsAnonymousFunctionDefinition (Expression ) は true である。引数 name を指定した Expression の ? NamedEvaluation を返す。
FunctionExpression :
function
(
FormalParameters
)
{
FunctionBody
}
引数 name を指定した FunctionExpression の InstantiateOrdinaryFunctionExpression を返す。
GeneratorExpression :
function
*
(
FormalParameters
)
{
GeneratorBody
}
引数 name を指定した GeneratorExpression の InstantiateGeneratorFunctionExpression を返す。
AsyncGeneratorExpression :
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
引数 name を指定した AsyncGeneratorExpression の InstantiateAsyncGeneratorFunctionExpression を返す。
AsyncFunctionExpression :
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
引数 name を指定した AsyncFunctionExpression の InstantiateAsyncFunctionExpression を返す。
ArrowFunction :
ArrowParameters
=>
ConciseBody
引数 name を指定した ArrowFunction の InstantiateArrowFunctionExpression を返す。
AsyncArrowFunction :
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
引数 name を指定した AsyncArrowFunction の InstantiateAsyncArrowFunctionExpression を返す。
ClassExpression :
class
ClassTail
sourceText を ClassExpression に一致するソーステキスト とする。引数 undefined 、name 、および sourceText を指定した ClassTail の ? ClassDefinitionEvaluation を返す。
8.5 Contains
8.5.1 Static Semantics: Contains
構文指向操作 Contains。引数 symbol (文法記号)。戻り値:Boolean。
以下に列挙されていない、この仕様内のすべての文法生成規則の選択肢には、Contains の次の既定の定義が暗黙にあります。
この Parse Node の各子ノード child について、次を行う。child が symbol のインスタンスである場合、true を返す。child が非終端記号のインスタンスである場合、contained を child Contains symbol の結果とする。contained が true である場合、true を返す。 false を返す。
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
FunctionExpression :
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
GeneratorDeclaration :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
GeneratorExpression :
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorDeclaration :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression :
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionDeclaration :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionExpression :
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
false を返す。
注 1
下位構造に依存する静的意味論 規則は、一般に関数定義の内部を調べません。
ClassTail :
ClassHeritage opt
{
ClassBody
}
symbol が ClassBody である場合、true を返す。symbol が ClassHeritage である場合、ClassHeritage が存在する場合、true を返す。false を返す。ClassHeritage が存在する場合、ClassHeritage Contains symbol が true である場合、true を返す。引数 symbol を指定した ClassBody の ComputedPropertyContains の結果を返す。
注 2
下位構造に依存する静的意味論 規則は、一般に PropertyName を除いてクラス本体の内部を調べません。
ClassStaticBlock :
static
{
ClassStaticBlockBody
}
false を返す。
注 3
下位構造に依存する静的意味論 規則は、一般に static 初期化ブロックの内部を調べません。
ArrowFunction :
ArrowParameters
=>
ConciseBody
symbol が NewTarget 、SuperProperty 、SuperCall 、super、または this のいずれでもない場合、false を返す。ArrowParameters Contains symbol が true である場合、true を返す。ConciseBody Contains symbol を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
formals を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ArrowFormalParameters とする。formals Contains symbol を返す。
AsyncArrowFunction :
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
symbol が NewTarget 、SuperProperty 、SuperCall 、super、または this のいずれでもない場合、false を返す。AsyncConciseBody Contains symbol を返す。
AsyncArrowFunction :
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
symbol が NewTarget 、SuperProperty 、SuperCall 、super、または this のいずれでもない場合、false を返す。head を CoverCallExpressionAndAsyncArrowHead によって被覆される AsyncArrowHead とする。head Contains symbol が true である場合、true を返す。AsyncConciseBody Contains symbol を返す。
注 4
Contains は、ArrowFunction または AsyncArrowFunction 内での new.target、this、および super の使用を検出するために使用されます。
PropertyDefinition : MethodDefinition
symbol が MethodDefinition である場合、true を返す。引数 symbol を指定した MethodDefinition の ComputedPropertyContains の結果を返す。
LiteralPropertyName : IdentifierName
false を返す。
MemberExpression :
MemberExpression
.
IdentifierName
MemberExpression Contains symbol が true である場合、true を返す。false を返す。
SuperProperty :
super
.
IdentifierName
symbol が ReservedWord super である場合、true を返す。false を返す。
CallExpression :
CallExpression
.
IdentifierName
CallExpression Contains symbol が true である場合、true を返す。false を返す。
OptionalChain :
?.
IdentifierName
false を返す。
OptionalChain :
OptionalChain
.
IdentifierName
OptionalChain Contains symbol が true である場合、true を返す。false を返す。
8.5.2 Static Semantics: ComputedPropertyContains
構文指向操作 ComputedPropertyContains。引数 symbol (文法記号)。戻り値:Boolean。 次の生成規則ごとに定義される。
ClassElementName : PrivateIdentifier
PropertyName : LiteralPropertyName
false を返す。
PropertyName : ComputedPropertyName
ComputedPropertyName Contains symbol の結果を返す。
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
引数 symbol を指定した ClassElementName の ComputedPropertyContains の結果を返す。
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
引数 symbol を指定した ClassElementName の ComputedPropertyContains の結果を返す。
AsyncGeneratorMethod :
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
引数 symbol を指定した ClassElementName の ComputedPropertyContains の結果を返す。
ClassElementList :
ClassElementList
ClassElement
inList を、引数 symbol を指定した ClassElementList の ComputedPropertyContains とする。inList が true である場合、true を返す。引数 symbol を指定した ClassElement の ComputedPropertyContains の結果を返す。
ClassElement : ClassStaticBlock
false を返す。
ClassElement : ;
false を返す。
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
引数 symbol を指定した ClassElementName の ComputedPropertyContains の結果を返す。
FieldDefinition :
ClassElementName
Initializer opt
引数 symbol を指定した ClassElementName の ComputedPropertyContains の結果を返す。
8.6 その他
これらの操作は、この仕様全体の複数の箇所で使用されます。
8.6.1 Runtime Semantics: InstantiateFunctionObject
構文指向操作 InstantiateFunctionObject。引数 envRecord (Environmentレコード ) および privateEnv ((PrivateEnvironmentレコード または null ))。戻り値:ECMAScript 関数オブジェクト。 次の生成規則ごとに定義される。
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
引数 envRecord および privateEnv を指定した FunctionDeclaration の InstantiateOrdinaryFunctionObject を返す。
GeneratorDeclaration :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
引数 envRecord および privateEnv を指定した GeneratorDeclaration の InstantiateGeneratorFunctionObject を返す。
AsyncGeneratorDeclaration :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
引数 envRecord および privateEnv を指定した AsyncGeneratorDeclaration の InstantiateAsyncGeneratorFunctionObject を返す。
AsyncFunctionDeclaration :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
引数 envRecord および privateEnv を指定した AsyncFunctionDeclaration の InstantiateAsyncFunctionObject を返す。
8.6.2 Runtime Semantics: BindingInitialization
構文指向操作 BindingInitialization。引数 value (ECMAScript 言語値 ) および envRecord ((Environmentレコード または undefined ))。戻り値:(正常完了 (値:unused ) または 中途完了)。
注
初期化値を代入するために PutValue 操作を使用するべきことを示すため、envRecord に undefined が渡されます。これは var 文、および一部の非 strict 関数 の仮引数リストの場合です(10.2.11 を参照)。これらの場合、レキシカル束縛は、その初期化子を評価する前に巻き上げられ、事前に初期化されます。
次の生成規則ごとに定義される。
BindingIdentifier : Identifier
name を Identifier の StringValue とする。? InitializeBoundName (name , value , envRecord ) を返す。
BindingIdentifier : yield
? InitializeBoundName ("yield" , value , envRecord ) を返す。
BindingIdentifier : await
? InitializeBoundName ("await" , value , envRecord ) を返す。
BindingPattern : ObjectBindingPattern
? RequireObjectCoercible (value ) を実行する。 引数 value および envRecord を指定した ObjectBindingPattern の ? BindingInitialization を返す。
BindingPattern : ArrayBindingPattern
iteratorRecord を ? GetIterator (value , sync ) とする。result を、引数 iteratorRecord および envRecord を指定した ArrayBindingPattern の Completion (IteratorBindingInitialization ) とする。iteratorRecord .[[Done]] が false である場合、? IteratorClose (iteratorRecord , result ) を返す。? result を返す。
ObjectBindingPattern :
{
}
unused を返す。
ObjectBindingPattern :
{
BindingPropertyList
,opt
}
引数 value および envRecord を指定した BindingPropertyList の ? PropertyBindingInitialization を実行する。 unused を返す。
ObjectBindingPattern :
{
BindingRestProperty
}
excludedNames を新しい空の List とする。引数 value 、envRecord 、および excludedNames を指定した BindingRestProperty の ? RestBindingInitialization を返す。
ObjectBindingPattern :
{
BindingPropertyList
,
BindingRestProperty
}
excludedNames を、引数 value および envRecord を指定した BindingPropertyList の ? PropertyBindingInitialization とする。引数 value 、envRecord 、および excludedNames を指定した BindingRestProperty の ? RestBindingInitialization を返す。
8.6.2.1 InitializeBoundName ( name , value , envRecord )
抽象操作 InitializeBoundName。引数 name (String)、value (ECMAScript 言語値 ) および envRecord ((Environmentレコード または undefined ))。戻り値:(正常完了 (値:unused ) または 中途完了)。 呼び出されると、次の手順を実行する。
envRecord が undefined でない場合、! envRecord .InitializeBinding (name , value ) を実行する。 unused を返す。lhs を ? ResolveBinding (name ) とする。? PutValue (lhs , value ) を返す。
8.6.3 Runtime Semantics: IteratorBindingInitialization
構文指向操作 IteratorBindingInitialization。引数 iteratorRecord (Iteratorレコード ) および envRecord ((Environmentレコード または undefined ))。戻り値:(正常完了 (値:unused ) または 中途完了)。
注
envRecord に undefined が渡される場合、初期化値を代入するために PutValue 操作を使用するべきことを示します。これは非 strict 関数 の仮引数リストの場合です。この場合、同じ名前を持つ複数の仮引数が存在する可能性に対処するため、仮引数の束縛が事前に初期化されます。
次の生成規則ごとに定義される。
ArrayBindingPattern :
[
]
unused を返す。
ArrayBindingPattern :
[
Elision
]
引数 iteratorRecord を指定した Elision の ? IteratorDestructuringAssignmentEvaluation を返す。
ArrayBindingPattern :
[
Elision opt
BindingRestElement
]
Elision が存在する場合、引数 iteratorRecord を指定した Elision の ? IteratorDestructuringAssignmentEvaluation を実行する。 引数 iteratorRecord および envRecord を指定した BindingRestElement の ? IteratorBindingInitialization を返す。
ArrayBindingPattern :
[
BindingElementList
,
Elision
]
引数 iteratorRecord および envRecord を指定した BindingElementList の ? IteratorBindingInitialization を実行する。 引数 iteratorRecord を指定した Elision の ? IteratorDestructuringAssignmentEvaluation を返す。
ArrayBindingPattern :
[
BindingElementList
,
Elision opt
BindingRestElement
]
引数 iteratorRecord および envRecord を指定した BindingElementList の ? IteratorBindingInitialization を実行する。 Elision が存在する場合、引数 iteratorRecord を指定した Elision の ? IteratorDestructuringAssignmentEvaluation を実行する。 引数 iteratorRecord および envRecord を指定した BindingRestElement の ? IteratorBindingInitialization を返す。
BindingElementList :
BindingElementList
,
BindingElisionElement
引数 iteratorRecord および envRecord を指定した BindingElementList の ? IteratorBindingInitialization を実行する。 引数 iteratorRecord および envRecord を指定した BindingElisionElement の ? IteratorBindingInitialization を返す。
BindingElisionElement :
Elision
BindingElement
引数 iteratorRecord を指定した Elision の ? IteratorDestructuringAssignmentEvaluation を実行する。 引数 iteratorRecord および envRecord を指定した BindingElement の ? IteratorBindingInitialization を返す。
SingleNameBinding :
BindingIdentifier
Initializer opt
name を BindingIdentifier の StringValue とする。lhs を ? ResolveBinding (name , envRecord ) とする。value を undefined とする。iteratorRecord .[[Done]] が false である場合、next を ? IteratorStepValue (iteratorRecord ) とする。next が done でない場合、value を next に設定する。Initializer が存在し、value が undefined である場合、IsAnonymousFunctionDefinition (Initializer ) が true である場合、value を、引数 name を指定した Initializer の ? NamedEvaluation に設定する。そうでない場合、defaultValue を Initializer の ? Evaluation とする。value を ? GetValue (defaultValue ) に設定する。 envRecord が undefined である場合、? PutValue (lhs , value ) を返す。? InitializeReferencedBinding (lhs , value ) を返す。
BindingElement :
BindingPattern
Initializer opt
value を undefined とする。iteratorRecord .[[Done]] が false である場合、next を ? IteratorStepValue (iteratorRecord ) とする。next が done でない場合、value を next に設定する。Initializer が存在し、value が undefined である場合、defaultValue を Initializer の ? Evaluation とする。value を ? GetValue (defaultValue ) に設定する。引数 value および envRecord を指定した BindingPattern の ? BindingInitialization を返す。
BindingRestElement :
...
BindingIdentifier
lhs を ? ResolveBinding (BindingIdentifier の StringValue , envRecord ) とする。array を ! ArrayCreate (0) とする。n を 0 とする。次を繰り返す。next を done とする。iteratorRecord .[[Done]] が false である場合、next を ? IteratorStepValue (iteratorRecord ) に設定する。next が done である場合、envRecord が undefined である場合、? PutValue (lhs , array ) を返す。? InitializeReferencedBinding (lhs , array ) を返す。 ! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (n )), next ) を実行する。 n を n + 1 に設定する。
BindingRestElement :
...
BindingPattern
array を ! ArrayCreate (0) とする。n を 0 とする。次を繰り返す。next を done とする。iteratorRecord .[[Done]] が false である場合、next を ? IteratorStepValue (iteratorRecord ) に設定する。next が done である場合、引数 array および envRecord を指定した BindingPattern の ? BindingInitialization を返す。 ! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (n )), next ) を実行する。 n を n + 1 に設定する。
FormalParameters : [empty]
unused を返す。
FormalParameters :
FormalParameterList
,
FunctionRestParameter
引数 iteratorRecord および envRecord を指定した FormalParameterList の ? IteratorBindingInitialization を実行する。 引数 iteratorRecord および envRecord を指定した FunctionRestParameter の ? IteratorBindingInitialization を返す。
FormalParameterList :
FormalParameterList
,
FormalParameter
引数 iteratorRecord および envRecord を指定した FormalParameterList の ? IteratorBindingInitialization を実行する。 引数 iteratorRecord および envRecord を指定した FormalParameter の ? IteratorBindingInitialization を返す。
ArrowParameters : BindingIdentifier
value を undefined とする。表明 : iteratorRecord .[[Done]] は false である。next を ? IteratorStepValue (iteratorRecord ) とする。next が done でない場合、value を next に設定する。引数 value および envRecord を指定した BindingIdentifier の ? BindingInitialization を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
formals を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ArrowFormalParameters とする。引数 iteratorRecord および envRecord を指定した formals の ? IteratorBindingInitialization を返す。
AsyncArrowBindingIdentifier : BindingIdentifier
value を undefined とする。表明 : iteratorRecord .[[Done]] は false である。next を ? IteratorStepValue (iteratorRecord ) とする。next が done でない場合、value を next に設定する。引数 value および envRecord を指定した BindingIdentifier の ? BindingInitialization を返す。
8.6.4 Static Semantics: AssignmentTargetType
構文指向操作 AssignmentTargetType。引数なし。戻り値:(simple 、web-compat または invalid )。 次の生成規則ごとに定義される。
IdentifierReference : Identifier
IsStrict (this IdentifierReference ) が true であり、Identifier の StringValue が "eval" または "arguments" のいずれかである場合、invalid を返す。simple を返す。
IdentifierReference :
yield
await
CallExpression :
CallExpression
[
Expression
]
CallExpression
.
IdentifierName
CallExpression
.
PrivateIdentifier
MemberExpression :
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
SuperProperty
MemberExpression
.
PrivateIdentifier
simple を返す。
PrimaryExpression :
CoverParenthesizedExpressionAndArrowParameterList
expr を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。expr の AssignmentTargetType を返す。
CallExpression :
CoverCallExpressionAndAsyncArrowHead
CallExpression
Arguments
Normative Optional
ホスト が Web ブラウザーであるか、その他の方法で 関数呼出し代入ターゲットの実行時エラー をサポートし、かつ IsStrict (this CallExpression ) が false である場合、web-compat を返す。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
CoverAwaitExpressionAndAwaitUsingDeclarationHead
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
invalid を返す。
8.6.5 Static Semantics: PropName
構文指向操作 PropName。引数なし。戻り値:(String または empty )。 次の生成規則ごとに定義される。
PropertyDefinition : IdentifierReference
IdentifierReference の StringValue を返す。
PropertyDefinition :
...
AssignmentExpression
empty を返す。
PropertyDefinition :
PropertyName
:
AssignmentExpression
PropertyName の PropName を返す。
LiteralPropertyName : IdentifierName
AttributeKey : IdentifierName
IdentifierName の StringValue を返す。
LiteralPropertyName : StringLiteral
AttributeKey : StringLiteral
StringLiteral の SV を返す。
LiteralPropertyName : NumericLiteral
number を NumericLiteral の NumericValue とする。! ToString (number ) を返す。
ComputedPropertyName :
[
AssignmentExpression
]
empty を返す。
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
ClassElementName の PropName を返す。
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
ClassElementName の PropName を返す。
AsyncGeneratorMethod :
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
ClassElementName の PropName を返す。
ClassElement : ClassStaticBlock
empty を返す。
ClassElement : ;
empty を返す。
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
ClassElementName の PropName を返す。
FieldDefinition :
ClassElementName
Initializer opt
ClassElementName の PropName を返す。
ClassElementName : PrivateIdentifier
empty を返す。
8.6.6 Static Semantics: ContainsUsing
構文指向操作 ContainsUsing。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
StatementList :
StatementList
StatementListItem
派生した StatementList の ContainsUsing が true である場合、true を返す。 StatementListItem の ContainsUsing が true である場合、true を返す。false を返す。
StatementListItem : Statement
false を返す。
StatementListItem : Declaration
Declaration の IsUsingDeclaration が true である場合、true を返す。Declaration の IsAwaitUsingDeclaration が true である場合、true を返す。false を返す。
9 実行可能コードと実行コンテキスト
9.1 Environment Record
Environment Record は、ECMAScript コードのレキシカルな入れ子構造に基づいて、Identifier と特定の変数および関数との関連付けを定義するために使用される仕様型です。通常、Environment Record は、FunctionDeclaration 、BlockStatement 、または TryStatement の Catch 節など、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 の型階層
Environment Record は、Environment Record を抽象クラスとし、Declarative Environment Record 、Object Environment Record 、および Global Environment Record という3つの具象サブクラスを持つ、単純なオブジェクト指向の階層に存在するものと考えることができます。Function Environment Record と Module Environment Record は Declarative Environment Record のサブクラスです。
Environment Record 抽象クラスには、表 15 で定義される抽象仕様メソッドが含まれます。これらの抽象メソッドには、各具象サブクラスについて異なる具象アルゴリズムがあります。
表 15: Environment Records の抽象メソッド
メソッド
目的
定義
HasBinding ( name )
抽象メソッド HasBinding。引数 name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了 )。
Environment Record が name の束縛を持つかどうかを判定します。
次の型に具象定義があります。
CreateMutableBinding ( name , deletable )
抽象メソッド CreateMutableBinding。引数 name (String) および deletable (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。
Environment Record に、初期化されていない新しい可変束縛を作成します。name は束縛名のテキストです。deletable が true の場合、その束縛は後で削除できます。
次の型に具象定義があります。
CreateImmutableBinding ( name , strict )
抽象メソッド CreateImmutableBinding。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。
Environment Record に、初期化されていない新しい不変束縛を作成します。name は束縛名のテキストです。strict が true の場合、その束縛を初期化した後に設定しようとすると、その束縛を参照する操作の strict モード設定にかかわらず、常に例外がスローされます。
次の型に具象定義があります。
InitializeBinding ( name , value )
抽象メソッド InitializeBinding。引数 name (String) および value (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。
Environment Record 内にすでに存在するが初期化されていない束縛の値を設定します。name は束縛名のテキストです。value は束縛に設定する値です。
次の型に具象定義があります。
SetMutableBinding ( name , value , strict )
抽象メソッド SetMutableBinding。引数 name (String)、value (ECMAScript 言語値 ) および strict (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。
Environment Record 内にすでに存在する可変束縛の値を設定します。name は束縛名のテキストです。value は束縛に設定する値です。strict が true であり、束縛を設定できない場合、TypeError 例外をスローします。
次の型に具象定義があります。
GetBindingValue ( name , strict )
抽象メソッド GetBindingValue。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。
Environment Record から、すでに存在する束縛の値を返します。name は束縛名のテキストです。strict は、strict モードコード から生じた参照、またはその他の理由で strict モードの参照意味論を必要とする参照を識別するために使用されます。strict が true であり、束縛が存在しない場合、ReferenceError 例外をスローします。束縛が存在するものの初期化されていない場合、strict の値にかかわらず ReferenceError がスローされます。
次の型に具象定義があります。
DeleteBinding ( name )
抽象メソッド DeleteBinding。引数 name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了 )。
Environment Record から束縛を削除します。name は束縛名のテキストです。name の束縛が存在する場合、その束縛を削除して true を返します。束縛は存在するものの削除できない場合、false を返します。束縛が存在しない場合は true を返します。
次の型に具象定義があります。
HasThisBinding ( )
抽象メソッド HasThisBinding。引数なし。戻り値:Boolean。
Environment Record が this 束縛を確立するかどうかを判定します。確立する場合は true 、そうでない場合は false を返します。
次の型に具象定義があります。
GetThisBinding ( )
抽象メソッド GetThisBinding。引数なし。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。
この Environment Record の this 束縛の値を返します。this 束縛が初期化されていない場合、ReferenceError をスローします。
次の型に具象定義があります。
HasSuperBinding ( )
抽象メソッド HasSuperBinding。引数なし。戻り値:Boolean。
Environment Record が super メソッド束縛を確立するかどうかを判定します。確立する場合は true 、そうでない場合は false を返します。true を返す場合、その Environment Record が Function Environment Record であることを意味しますが、その逆は成立しません。
次の型に具象定義があります。
WithBaseObject ( )
抽象メソッド WithBaseObject。引数なし。戻り値:(Object または undefined )。
この Environment Record が with 文に関連付けられている場合、with オブジェクトを返します。それ以外の場合は undefined を返します。
次の型に具象定義があります。
9.1.1.1 Declarative Environment Record
各 Declarative Environment Record は、変数、定数、let、クラス、モジュール、インポート、および/または関数宣言を含む ECMAScript プログラムのスコープに関連付けられます。Declarative Environment Record は、そのスコープ内に含まれる宣言によって定義される識別子の集合を束縛します。
すべての Declarative Environment Record は [[DisposableResourceStack]] フィールドも持ち、このフィールドには DisposableResource Record の List が含まれます。このリストの要素は、Environment Record を構築した Evaluation 手順が完了したときに破棄しなければならない using 宣言および await using 宣言によって追跡されます。
9.1.1.1.1 HasBinding ( name )
a Declarative Environment Record envRecord の具象メソッド HasBinding 。引数 name (String)。戻り値:正常完了 (値:Boolean)。 引数の識別子が、この Record によって束縛される識別子の1つであるかどうかを判定します。 呼び出されると、次の手順を実行する。
envRecord が name の束縛を持つ場合、true を返す。false を返す。
9.1.1.1.2 CreateMutableBinding ( name , deletable )
a Declarative Environment Record envRecord の具象メソッド CreateMutableBinding 。引数 name (String) および deletable (Boolean)。戻り値:正常完了 (値:unused )。 初期化されていない、名前 name の新しい可変束縛を作成します。この Environment Record に name の束縛がすでに存在してはなりません。deletable が true の場合、新しい束縛は削除可能であるものとして印付けされます。 呼び出されると、次の手順を実行する。
表明 : envRecord は name の束縛をまだ持っていない。envRecord に name の可変束縛を作成し、それが初期化されていないことを記録する。deletable が true である場合、新しく作成された束縛が後の DeleteBinding 呼出しによって削除できることを記録する。unused を返す。
9.1.1.1.3 CreateImmutableBinding ( name , strict )
a Declarative Environment Record envRecord の具象メソッド CreateImmutableBinding 。引数 name (String) および strict (Boolean)。戻り値:正常完了 (値:unused )。 初期化されていない、名前 name の新しい不変束縛を作成します。この Environment Record に name の束縛がすでに存在してはなりません。strict が true の場合、新しい束縛は strict 束縛として印付けされます。 呼び出されると、次の手順を実行する。
表明 : envRecord は name の束縛をまだ持っていない。envRecord に name の不変束縛を作成し、それが初期化されていないことを記録する。strict が true である場合、新しく作成された束縛が strict 束縛であることを記録する。unused を返す。
9.1.1.1.4 InitializeBinding ( name , value )
a Declarative Environment Record envRecord の具象メソッド InitializeBinding 。引数 name (String) および value (ECMAScript 言語値 )。戻り値:正常完了 (値:unused )。 名前が name である識別子の現在の束縛の束縛値を value に設定するために使用されます。name の初期化されていない束縛がすでに存在していなければなりません。 呼び出されると、次の手順を実行する。
表明 : envRecord は name の初期化されていない束縛を持たなければならない。envRecord 内の name の束縛値を value に設定する。envRecord 内の name の束縛が初期化されたことを記録 する。unused を返す。
9.1.1.1.5 SetMutableBinding ( name , value , strict )
a Declarative Environment Record envRecord の具象メソッド SetMutableBinding 。引数 name (String)、value (ECMAScript 言語値 ) および strict (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 名前が name である識別子の現在の束縛の束縛値を value に変更しようとします。通常、name の束縛はすでに存在しますが、まれに存在しない場合があります。その束縛が不変束縛である場合、strict が true なら TypeError がスローされます。 呼び出されると、次の手順を実行する。
envRecord が name の束縛を持たない場合、strict が true である場合、ReferenceError 例外をスローする。! envRecord .CreateMutableBinding (name , true ) を実行する。 ! envRecord .InitializeBinding (name , value ) を実行する。 unused を返す。envRecord 内の name の束縛が strict 束縛である場合、strict を true に設定する。envRecord 内の name の束縛がまだ初期化されていない場合、ReferenceError 例外をスローする。そうでなく、envRecord 内の name の束縛が可変束縛である場合、その束縛値を value に変更する。 そうでない場合、表明 : これは不変束縛の値を変更しようとする試みである。strict が true である場合、TypeError 例外をスローする。 unused を返す。
注
手順 1 で束縛が存在しない状態になる ECMAScript コードの例は次のとおりです。
function f ( ) { eval ("var x; x = (delete x, 0);" ); }
9.1.1.1.6 GetBindingValue ( name , strict )
a Declarative Environment Record envRecord の具象メソッド GetBindingValue 。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 名前が name である束縛された識別子の値を返します。束縛が存在するものの初期化されていない場合、strict の値にかかわらず ReferenceError がスローされます。 呼び出されると、次の手順を実行する。
表明 : envRecord は name の束縛を持つ。envRecord 内の name の束縛が初期化されていない束縛である場合、ReferenceError 例外をスローする。envRecord 内で現在 name に束縛されている値を返す。
9.1.1.1.7 DeleteBinding ( name )
a Declarative Environment Record envRecord の具象メソッド DeleteBinding 。引数 name (String)。戻り値:正常完了 (値:Boolean)。 明示的に削除可能と指定された束縛だけを削除できます。 呼び出されると、次の手順を実行する。
表明 : envRecord は name の束縛を持つ。envRecord 内の name の束縛を削除できない場合、false を返す。envRecord から name の束縛を削除する。true を返す。
9.1.1.1.8 HasThisBinding ( )
a Declarative Environment Record envRecord の具象メソッド HasThisBinding 。引数なし。戻り値:false 。 呼び出されると、次の手順を実行する。
false を返す。
注
9.1.1.1.9 GetThisBinding ( )
Declarative Environment Record の GetThisBinding 具象メソッドは、この仕様内では使用されません。
9.1.1.1.10 HasSuperBinding ( )
a Declarative Environment Record envRecord の具象メソッド HasSuperBinding 。引数なし。戻り値:false 。 呼び出されると、次の手順を実行する。
false を返す。
注
9.1.1.1.11 WithBaseObject ( )
a Declarative Environment Record envRecord の具象メソッド WithBaseObject 。引数なし。戻り値:undefined 。 呼び出されると、次の手順を実行する。
undefined を返す。
9.1.1.2 Object Environment Record
各 Object Environment Record は、束縛オブジェクト と呼ばれるオブジェクトに関連付けられます。Object Environment Record は、その束縛オブジェクトのプロパティ名 に直接対応する文字列識別子名の集合を束縛します。IdentifierName の形式ではない文字列以外のプロパティキー は、束縛された識別子の集合に含まれません。自身のプロパティと継承プロパティはどちらも、その [[Enumerable]] 属性の設定にかかわらず集合に含まれます。プロパティはオブジェクトに動的に追加したり削除したりできるため、Object Environment Record によって束縛される識別子の集合は、プロパティを追加または削除する任意の操作の副作用として変化する可能性があります。このような副作用の結果として作成された束縛は、対応するプロパティの Writable 属性が false であっても、可変束縛とみなされます。Object Environment Record には不変束縛は存在しません。
with 文(14.11 )のために作成された Object Environment Record は、その束縛オブジェクトを、関数呼出しで使用する暗黙の this 値として提供できます。この機能は Boolean の [[IsWithEnvironment]] フィールドによって制御されます。
Object Environment Record は、表 16 に列挙される追加の状態フィールドを持ちます。
表 16: Object Environment Record の追加フィールド
9.1.1.2.1 HasBinding ( name )
an Object Environment Record envRecord の具象メソッド HasBinding 。引数 name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 関連付けられた束縛オブジェクトが、名前が name であるプロパティを持つかどうかを判定します。 呼び出されると、次の手順を実行する。
bindingObj を envRecord .[[BindingObject]] とする。foundBinding を ? HasProperty (bindingObj , name ) とする。foundBinding が false である場合、false を返す。envRecord .[[IsWithEnvironment]] が false である場合、true を返す。unscopables を ? Get (bindingObj , %Symbol.unscopables% ) とする。unscopables が Object である場合、blocked を ToBoolean (? Get (unscopables , name )) とする。blocked が true である場合、false を返す。true を返す。
9.1.1.2.2 CreateMutableBinding ( name , deletable )
an Object Environment Record envRecord の具象メソッド CreateMutableBinding 。引数 name (String) および deletable (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 Environment Record に関連付けられた束縛オブジェクトに、名前が name のプロパティを作成し、値 undefined で初期化します。deletable が true の場合、新しいプロパティの [[Configurable]] 属性は true に設定され、それ以外の場合は false に設定されます。 呼び出されると、次の手順を実行する。
bindingObj を envRecord .[[BindingObject]] とする。? DefinePropertyOrThrow (bindingObj , name , PropertyDescriptor { [[Value]] : undefined , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : deletable }) を実行する。 unused を返す。
注
通常、envRecord は name の束縛を持ちませんが、持っている場合、DefinePropertyOrThrow の意味論によって既存の束縛が置換または隠蔽されるか、中断完了 が返される場合があります。
9.1.1.2.3 CreateImmutableBinding ( name , strict )
Object Environment Record の CreateImmutableBinding 具象メソッドは、この仕様内では使用されません。
9.1.1.2.4 InitializeBinding ( name , value )
an Object Environment Record envRecord の具象メソッド InitializeBinding 。引数 name (String) および value (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 名前が name である識別子の現在の束縛の束縛値を value に設定するために使用されます。 呼び出されると、次の手順を実行する。
? envRecord .SetMutableBinding (name , value , false ) を実行する。 unused を返す。
注
9.1.1.2.5 SetMutableBinding ( name , value , strict )
an Object Environment Record envRecord の具象メソッド SetMutableBinding 。引数 name (String)、value (ECMAScript 言語値 ) および strict (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 Environment Record に関連付けられた束縛オブジェクトの、名前が name であるプロパティの値を value に設定しようとします。通常、name という名前のプロパティはすでに存在しますが、存在しない場合または現在書込み可能でない場合、エラー処理は strict によって決定されます。 呼び出されると、次の手順を実行する。
bindingObj を envRecord .[[BindingObject]] とする。stillExists を ? HasProperty (bindingObj , name ) とする。stillExists が false かつ strict が true である場合、ReferenceError 例外をスローする。? Set (bindingObj , name , value , strict ) を実行する。 unused を返す。
9.1.1.2.6 GetBindingValue ( name , strict )
an Object Environment Record envRecord の具象メソッド GetBindingValue 。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 関連付けられた束縛オブジェクトの、名前が name であるプロパティの値を返します。そのプロパティはすでに存在することが想定されますが、存在しない場合、結果は strict に依存します。 呼び出されると、次の手順を実行する。
bindingObj を envRecord .[[BindingObject]] とする。value を ? HasProperty (bindingObj , name ) とする。value が false である場合、strict が false である場合、undefined を返す。ReferenceError 例外をスローする。? Get (bindingObj , name ) を返す。
9.1.1.2.7 DeleteBinding ( name )
an Object Environment Record envRecord の具象メソッド DeleteBinding 。引数 name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 環境オブジェクトの [[Configurable]] 属性が true であるプロパティに対応する束縛だけを削除できます。 呼び出されると、次の手順を実行する。
bindingObj を envRecord .[[BindingObject]] とする。? bindingObj .[[Delete]] (name ) を返す。
9.1.1.2.8 HasThisBinding ( )
an Object Environment Record envRecord の具象メソッド HasThisBinding 。引数なし。戻り値:false 。 呼び出されると、次の手順を実行する。
false を返す。
注
9.1.1.2.9 GetThisBinding ( )
Object Environment Record の GetThisBinding 具象メソッドは、この仕様内では使用されません。
9.1.1.2.10 HasSuperBinding ( )
an Object Environment Record envRecord の具象メソッド HasSuperBinding 。引数なし。戻り値:false 。 呼び出されると、次の手順を実行する。
false を返す。
注
9.1.1.2.11 WithBaseObject ( )
an Object Environment Record envRecord の具象メソッド WithBaseObject 。引数なし。戻り値:(Object または undefined )。 呼び出されると、次の手順を実行する。
envRecord .[[IsWithEnvironment]] が true である場合、envRecord .[[BindingObject]] を返す。undefined を返す。
9.1.1.3 Function Environment Record
Function Environment Record は、関数のトップレベルスコープを表すために使用される Declarative Environment Record であり、その関数が ArrowFunction 関数または AsyncArrowFunction 関数でない場合は this 束縛を提供します。関数が ArrowFunction 関数または AsyncArrowFunction 関数でなく、super を参照する場合、その Function Environment Record は、関数内から super メソッド呼出しを実行するために使用される状態も含みます。
Function Environment Record は、表 17 に列挙される追加の状態フィールドを持ちます。
表 17: Function Environment Record の追加フィールド
フィールド名
値
意味
[[ThisValue]]
an ECMAScript language value
この関数呼出しで使用される this 値です。
[[ThisBindingStatus]]
lexical , initialized , or uninitialized
値が lexical の場合、これは ArrowFunction または AsyncArrowFunction であり、ローカルな this 値を持ちません。
[[FunctionObject]]
an ECMAScript function object
その呼出しによってこの Environment Record が作成された関数オブジェクト です。
[[NewTarget]]
a constructor or undefined
この Environment Record が [[Construct]] 内部メソッドによって作成された場合、[[NewTarget]] は [[Construct]] の newTarget パラメーターの値です。それ以外の場合、その値は undefined です。
Function Environment Record は、表 15 に列挙された Declarative Environment Record のすべてのメソッドをサポートし、HasThisBinding 、GetThisBinding 、および HasSuperBinding を除くすべてのメソッドについて同じ仕様を共有します。
9.1.1.3.1 BindThisValue ( envRecord , value )
抽象操作 BindThisValue。引数 envRecord (Function Environmentレコード ) および value (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 envRecord .[[ThisValue]] を設定し、それが初期化されたことを記録します。 呼び出されると、次の手順を実行する。
表明 : envRecord .[[ThisBindingStatus]] は lexical ではない。envRecord .[[ThisBindingStatus]] が initialized である場合、ReferenceError 例外をスローする。envRecord .[[ThisValue]] を value に設定する。envRecord .[[ThisBindingStatus]] を initialized に設定する。unused を返す。
9.1.1.3.2 HasThisBinding ( )
a Function Environment Record envRecord の具象メソッド HasThisBinding 。引数なし。戻り値:Boolean。 呼び出されると、次の手順を実行する。
envRecord .[[ThisBindingStatus]] が lexical である場合、false を返す。true を返す。
9.1.1.3.3 GetThisBinding ( )
a Function Environment Record envRecord の具象メソッド GetThisBinding 。引数なし。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
表明 : envRecord .[[ThisBindingStatus]] は lexical ではない。envRecord .[[ThisBindingStatus]] が uninitialized である場合、ReferenceError 例外をスローする。envRecord .[[ThisValue]] を返す。
9.1.1.3.4 HasSuperBinding ( )
a Function Environment Record envRecord の具象メソッド HasSuperBinding 。引数なし。戻り値:Boolean。 呼び出されると、次の手順を実行する。
envRecord .[[ThisBindingStatus]] が lexical である場合、false を返す。envRecord .[[FunctionObject]] .[[HomeObject]] が undefined である場合、false を返す。true を返す。
9.1.1.3.5 GetSuperBase ( envRecord )
抽象操作 GetSuperBase。引数 envRecord (Function Environmentレコード )。戻り値:(Object、null または undefined )。 envRecord 内で束縛された super プロパティアクセスの基底となるオブジェクトを返します。値 undefined は、そのようなアクセスが実行時エラーを生成することを示します。 呼び出されると、次の手順を実行する。
home を envRecord .[[FunctionObject]] .[[HomeObject]] とする。home が undefined である場合、undefined を返す。表明 : home は通常オブジェクト である。! home .[[GetPrototypeOf]] () を返す。
9.1.1.4 Global Environment Record
Global Environment Record は、共通の Realm 内で処理されるすべての ECMAScript Script 要素によって共有される、最外層のスコープを表すために使用されます。Global Environment Record は、組込みグローバル(箇条 19 )、グローバルオブジェクト のプロパティ、および Script 内に現れるすべてのトップレベル宣言(8.2.11 、8.2.13 )に対する束縛を提供します。
Global Environment Record は論理的には単一の Record ですが、Object Environment Record と Declarative Environment Record をカプセル化した複合体として規定されます。Object Environment Record の基底オブジェクトは、関連付けられた Realm Record のグローバルオブジェクト です。このグローバルオブジェクト は、Global Environment Record の GetThisBinding 具象メソッドによって返される値です。Global Environment Record の Object Environment Record 構成要素には、すべての組込みグローバル(箇条 19 )の束縛と、グローバルコード に含まれる FunctionDeclaration 、GeneratorDeclaration 、AsyncFunctionDeclaration 、AsyncGeneratorDeclaration 、または VariableStatement によって導入されるすべての束縛が含まれます。グローバルコード 内のその他すべての ECMAScript 宣言の束縛は、Global Environment Record の Declarative Environment Record 構成要素に含まれます。
プロパティはグローバルオブジェクト 上に直接作成することもできます。そのため、Global Environment Record の Object Environment Record 構成要素には、FunctionDeclaration 、GeneratorDeclaration 、AsyncFunctionDeclaration 、AsyncGeneratorDeclaration 、または VariableDeclaration 宣言によって明示的に作成された束縛と、グローバルオブジェクト のプロパティとして暗黙的に作成された束縛の両方が含まれる場合があります。
Global Environment Record は、表 18 に列挙される追加のフィールドを持ちます。
表 18: Global Environment Record の追加フィールド
9.1.1.4.1 HasBinding ( name )
a Global Environment Record envRecord の具象メソッド HasBinding 。引数 name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 引数の識別子が、この Record によって束縛される識別子の1つであるかどうかを判定します。 呼び出されると、次の手順を実行する。
declRecord を envRecord .[[DeclarativeRecord]] とする。! declRecord .HasBinding (name ) が true である場合、true を返す。 objRecord を envRecord .[[ObjectRecord]] とする。? objRecord .HasBinding (name ) を返す。
9.1.1.4.2 CreateMutableBinding ( name , deletable )
a Global Environment Record envRecord の具象メソッド CreateMutableBinding 。引数 name (String) および deletable (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 初期化されていない、名前 name の新しい可変束縛を作成します。束縛は関連付けられた DeclarativeRecord に作成されます。DeclarativeRecord に name の束縛がすでに存在してはなりません。deletable が true の場合、新しい束縛は削除可能であるものとして印付けされます。 呼び出されると、次の手順を実行する。
declRecord を envRecord .[[DeclarativeRecord]] とする。! declRecord .HasBinding (name ) が true である場合、TypeError 例外をスローする。 ! declRecord .CreateMutableBinding (name , deletable ) を返す。
9.1.1.4.3 CreateImmutableBinding ( name , strict )
a Global Environment Record envRecord の具象メソッド CreateImmutableBinding 。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 初期化されていない、名前 name の新しい不変束縛を作成します。この Environment Record に name の束縛がすでに存在してはなりません。strict が true の場合、新しい束縛は strict 束縛として印付けされます。 呼び出されると、次の手順を実行する。
declRecord を envRecord .[[DeclarativeRecord]] とする。! declRecord .HasBinding (name ) が true である場合、TypeError 例外をスローする。 ! declRecord .CreateImmutableBinding (name , strict ) を返す。
9.1.1.4.4 InitializeBinding ( name , value )
a Global Environment Record envRecord の具象メソッド InitializeBinding 。引数 name (String) および value (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 名前が name である識別子の現在の束縛の束縛値を value に設定するために使用されます。name の初期化されていない束縛がすでに存在していなければなりません。 呼び出されると、次の手順を実行する。
declRecord を envRecord .[[DeclarativeRecord]] とする。! declRecord .HasBinding (name ) が true である場合、! declRecord .InitializeBinding (name , value ) を返す。 表明 : 束縛が存在する場合、それは Object Environment Record 内になければならない。objRecord を envRecord .[[ObjectRecord]] とする。? objRecord .InitializeBinding (name , value ) を返す。
9.1.1.4.5 SetMutableBinding ( name , value , strict )
a Global Environment Record envRecord の具象メソッド SetMutableBinding 。引数 name (String)、value (ECMAScript 言語値 ) および strict (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 名前が name である識別子の現在の束縛の束縛値を value に変更しようとします。その束縛が不変束縛であり、strict が true の場合、TypeError がスローされます。通常、name という名前の束縛はすでに存在しますが、存在しない場合または現在書込み可能でない場合、エラー処理は strict によって決定されます。 呼び出されると、次の手順を実行する。
declRecord を envRecord .[[DeclarativeRecord]] とする。! declRecord .HasBinding (name ) が true である場合、? declRecord .SetMutableBinding (name , value , strict ) を返す。 objRecord を envRecord .[[ObjectRecord]] とする。? objRecord .SetMutableBinding (name , value , strict ) を返す。
9.1.1.4.6 GetBindingValue ( name , strict )
a Global Environment Record envRecord の具象メソッド GetBindingValue 。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 名前が name である束縛された識別子の値を返します。その束縛が初期化されていない束縛である場合、ReferenceError 例外をスローします。通常、name という名前の束縛はすでに存在しますが、存在しない場合または現在書込み可能でない場合、エラー処理は strict によって決定されます。 呼び出されると、次の手順を実行する。
declRecord を envRecord .[[DeclarativeRecord]] とする。! declRecord .HasBinding (name ) が true である場合、? declRecord .GetBindingValue (name , strict ) を返す。 objRecord を envRecord .[[ObjectRecord]] とする。? objRecord .GetBindingValue (name , strict ) を返す。
9.1.1.4.7 DeleteBinding ( name )
a Global Environment Record envRecord の具象メソッド DeleteBinding 。引数 name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 明示的に削除可能と指定された束縛だけを削除できます。 呼び出されると、次の手順を実行する。
declRecord を envRecord .[[DeclarativeRecord]] とする。! declRecord .HasBinding (name ) が true である場合、! declRecord .DeleteBinding (name ) を返す。 objRecord を envRecord .[[ObjectRecord]] とする。globalObj を objRecord .[[BindingObject]] とする。existingProperty を ? HasOwnProperty (globalObj , name ) とする。existingProperty が true である場合、? objRecord .DeleteBinding (name ) を返す。 true を返す。
9.1.1.4.8 HasThisBinding ( )
a Global Environment Record envRecord の具象メソッド HasThisBinding 。引数なし。戻り値:true 。 呼び出されると、次の手順を実行する。
true を返す。
注
9.1.1.4.9 GetThisBinding ( )
a Global Environment Record envRecord の具象メソッド GetThisBinding 。引数なし。戻り値:正常完了 (値:Object)。 呼び出されると、次の手順を実行する。
envRecord .[[GlobalThisValue]] を返す。
9.1.1.4.10 HasSuperBinding ( )
a Global Environment Record envRecord の具象メソッド HasSuperBinding 。引数なし。戻り値:false 。 呼び出されると、次の手順を実行する。
false を返す。
注
9.1.1.4.11 WithBaseObject ( )
a Global Environment Record envRecord の具象メソッド WithBaseObject 。引数なし。戻り値:undefined 。 呼び出されると、次の手順を実行する。
undefined を返す。
9.1.1.4.12 HasLexicalDeclaration ( envRecord , name )
抽象操作 HasLexicalDeclaration。引数 envRecord (Global Environmentレコード ) および name (String)。戻り値:Boolean。 引数の識別子が、LexicalDeclaration または ClassDeclaration などのレキシカル宣言を使用して作成された envRecord 内の束縛を持つかどうかを判定します。 呼び出されると、次の手順を実行する。
declRecord を envRecord .[[DeclarativeRecord]] とする。! declRecord .HasBinding (name ) を返す。
9.1.1.4.13 HasRestrictedGlobalProperty ( envRecord , name )
抽象操作 HasRestrictedGlobalProperty。引数 envRecord (Global Environmentレコード ) および name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 引数の識別子が、グローバルレキシカル束縛によって隠蔽されてはならないグローバルオブジェクト のプロパティ名 であるかどうかを判定します。 呼び出されると、次の手順を実行する。
objRecord を envRecord .[[ObjectRecord]] とする。globalObj を objRecord .[[BindingObject]] とする。existingProperty を ? globalObj .[[GetOwnProperty]] (name ) とする。existingProperty が undefined である場合、false を返す。existingProperty .[[Configurable]] が true である場合、false を返す。true を返す。
注
var 宣言または関数宣言を使用して宣言されたのではなく、直接作成されたプロパティがグローバルオブジェクト 上に存在する場合があります。グローバルオブジェクト の構成不可のプロパティと同じ名前を持つグローバルレキシカル束縛を作成することはできません。グローバルプロパティ "undefined" はそのようなプロパティの例です。
9.1.1.4.14 CanDeclareGlobalVar ( envRecord , name )
抽象操作 CanDeclareGlobalVar。引数 envRecord (Global Environmentレコード ) および name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 同じ引数 name について対応する CreateGlobalVarBinding 呼出しを行った場合に成功するかどうかを判定します。重複する var 宣言、および既存のグローバルオブジェクト プロパティに対する var 宣言は許可されます。 呼び出されると、次の手順を実行する。
objRecord を envRecord .[[ObjectRecord]] とする。globalObj を objRecord .[[BindingObject]] とする。hasProperty を ? HasOwnProperty (globalObj , name ) とする。hasProperty が true である場合、true を返す。? IsExtensible (globalObj ) を返す。
9.1.1.4.15 CanDeclareGlobalFunction ( envRecord , name )
抽象操作 CanDeclareGlobalFunction。引数 envRecord (Global Environmentレコード ) および name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 同じ引数 name について対応する CreateGlobalFunctionBinding 呼出しを行った場合に成功するかどうかを判定します。 呼び出されると、次の手順を実行する。
objRecord を envRecord .[[ObjectRecord]] とする。globalObj を objRecord .[[BindingObject]] とする。existingProperty を ? globalObj .[[GetOwnProperty]] (name ) とする。existingProperty が undefined である場合、? IsExtensible (globalObj ) を返す。existingProperty .[[Configurable]] が true である場合、true を返す。IsDataDescriptor (existingProperty ) が true であり、existingProperty が属性値 { [[Writable]] : true , [[Enumerable]] : true } を持つ場合、true を返す。false を返す。
9.1.1.4.16 CreateGlobalVarBinding ( envRecord , name , deletable )
抽象操作 CreateGlobalVarBinding。引数 envRecord (Global Environmentレコード )、name (String) および deletable (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 関連付けられた Object Environment Record に可変束縛を作成して初期化します。束縛がすでに存在する場合、それを再利用し、初期化済みであるとみなします。 呼び出されると、次の手順を実行する。
objRecord を envRecord .[[ObjectRecord]] とする。globalObj を objRecord .[[BindingObject]] とする。hasProperty を ? HasOwnProperty (globalObj , name ) とする。extensible を ? IsExtensible (globalObj ) とする。hasProperty が false かつ extensible が true である場合、? objRecord .CreateMutableBinding (name , deletable ) を実行する。 ? objRecord .InitializeBinding (name , undefined ) を実行する。 unused を返す。
9.1.1.4.17 CreateGlobalFunctionBinding ( envRecord , name , value , deletable )
抽象操作 CreateGlobalFunctionBinding。引数 envRecord (Global Environmentレコード )、name (String)、value (ECMAScript 関数オブジェクト) および deletable (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 関連付けられた Object Environment Record に可変束縛を作成して初期化します。束縛がすでに存在する場合、それを置換します。 呼び出されると、次の手順を実行する。
objRecord を envRecord .[[ObjectRecord]] とする。globalObj を objRecord .[[BindingObject]] とする。existingProperty を ? globalObj .[[GetOwnProperty]] (name ) とする。existingProperty が undefined であるか、existingProperty .[[Configurable]] が true である場合、propertyDesc を PropertyDescriptor { [[Value]] : value , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : deletable } とする。そうでない場合、propertyDesc を PropertyDescriptor { [[Value]] : value } とする。 ? DefinePropertyOrThrow (globalObj , name , propertyDesc ) を実行する。 ? Set (globalObj , name , value , false ) を実行する。 unused を返す。
注
グローバル関数宣言は常にグローバルオブジェクト 自身のプロパティとして表現されます。可能であれば、既存の自身のプロパティが標準の属性値の集合を持つように再構成されます。手順 7 は InitializeBinding 具象メソッドを呼び出す場合と同等であり、globalObj が Proxy である場合、同じ順序の Proxy トラップ呼出しを生成します。
9.1.1.5 Module Environment Record
Module Environment Record は、ECMAScript Module の外側のスコープを表すために使用される Declarative Environment Record です。通常の可変束縛および不変束縛に加えて、Module Environment Record は不変のインポート束縛も提供します。これは、別の Environment Record に存在する対象束縛への間接アクセスを提供する束縛です。
Module Environment Record は、表 15 に列挙された Declarative Environment Record のすべてのメソッドをサポートし、GetBindingValue 、DeleteBinding 、HasThisBinding 、および GetThisBinding を除くすべてのメソッドについて同じ仕様を共有します。
9.1.1.5.1 GetBindingValue ( name , strict )
a Module Environment Record envRecord の具象メソッド GetBindingValue 。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 名前が name である束縛された識別子の値を返します。ただし、束縛が間接束縛である場合は、対象束縛の値を返します。束縛が存在するものの初期化されていない場合、ReferenceError がスローされます。 呼び出されると、次の手順を実行する。
表明 : strict は true である。表明 : envRecord は name の束縛を持つ。name の束縛が間接束縛である場合、module および targetName を、この name の束縛が作成されたときに提供された間接参照値とする。targetEnv を module .[[Environment]] とする。targetEnv が empty である場合、ReferenceError 例外をスローする。? targetEnv .GetBindingValue (targetName , true ) を返す。 envRecord 内の name の束縛が初期化されていない束縛である場合、ReferenceError 例外をスローする。envRecord 内で現在 name に束縛されている値を返す。
注
Module は常に strict モードコード であるため、strict は常に true です。
9.1.1.5.2 DeleteBinding ( name )
Module Environment Record の DeleteBinding 具象メソッドは、この仕様内では使用されません。
注
Module Environment Record は strict コード内でのみ使用され、早期エラー規則 により、strict コード内の delete 演算子を、Module Environment Record の束縛に解決される Reference Record に適用することは禁止されています。13.5.1.1 を参照してください。
9.1.1.5.3 HasThisBinding ( )
a Module Environment Record envRecord の具象メソッド HasThisBinding 。引数なし。戻り値:true 。 呼び出されると、次の手順を実行する。
true を返す。
注
9.1.1.5.4 GetThisBinding ( )
a Module Environment Record envRecord の具象メソッド GetThisBinding 。引数なし。戻り値:正常完了 (値:undefined )。 呼び出されると、次の手順を実行する。
undefined を返す。
9.1.1.5.5 CreateImportBinding ( envRecord , name , targetModule , targetName )
抽象操作 CreateImportBinding。引数 envRecord (Module Environmentレコード )、name (String)、targetModule (Moduleレコード ) および targetName (String)。戻り値:unused 。 名前 name に対して、初期化済みの新しい不変の間接束縛を作成します。envRecord に name の束縛がすでに存在してはなりません。targetName は targetModule の Module Environment Record に存在する束縛名です。新しい束縛の値へのアクセスは、対象束縛の束縛値に間接的にアクセスします。 呼び出されると、次の手順を実行する。
表明 : envRecord は name の束縛をまだ持っていない。表明 : targetModule .[[Environment]] がインスタンス化されるとき、targetName の直接束縛を持つ。targetModule と targetName を対象束縛として参照する、name の不変の間接束縛を envRecord に作成し、その束縛が初期化済みであることを記録する。unused を返す。
9.1.2 Environment Record に対する操作
この仕様では、Environment Record を操作するために次の抽象操作 を使用します。
9.1.2.1 GetIdentifierReference ( envRecord , name , strict )
抽象操作 GetIdentifierReference。引数 envRecord ((Environmentレコード または null ))、name (String) および strict (Boolean)。戻り値:(正常完了 (値:Referenceレコード ) または throw 完了 )。 呼び出されると、次の手順を実行する。
envRecord が null である場合、Reference Record { [[Base]] : unresolvable , [[ReferencedName]] : name , [[Strict]] : strict , [[ThisValue]] : empty } を返す。exists を ? envRecord .HasBinding (name ) とする。exists が true である場合、Reference Record { [[Base]] : envRecord , [[ReferencedName]] : name , [[Strict]] : strict , [[ThisValue]] : empty } を返す。outer を envRecord .[[OuterEnv]] とする。? GetIdentifierReference (outer , name , strict ) を返す。
9.1.2.2 NewDeclarativeEnvironment ( outerEnv )
抽象操作 NewDeclarativeEnvironment。引数 outerEnv ((Environmentレコード または null ))。戻り値:Declarative Environmentレコード 。 呼び出されると、次の手順を実行する。
envRecord を、束縛を持たない新しい Declarative Environment Record とする。envRecord .[[OuterEnv]] を outerEnv に設定する。envRecord .[[DisposableResourceStack]] を新しい空の List に設定する。envRecord を返す。
9.1.2.3 NewObjectEnvironment ( obj , isWithEnv , outerEnv )
抽象操作 NewObjectEnvironment。引数 obj (Object)、isWithEnv (Boolean) および outerEnv ((Environmentレコード または null ))。戻り値:Object Environmentレコード 。 呼び出されると、次の手順を実行する。
envRecord を新しい Object Environment Record とする。envRecord .[[BindingObject]] を obj に設定する。envRecord .[[IsWithEnvironment]] を isWithEnv に設定する。envRecord .[[OuterEnv]] を outerEnv に設定する。envRecord を返す。
9.1.2.4 NewFunctionEnvironment ( func , newTarget )
抽象操作 NewFunctionEnvironment。引数 func (ECMAScript 関数オブジェクト) および newTarget ((Object または undefined ))。戻り値:Function Environmentレコード 。 呼び出されると、次の手順を実行する。
envRecord を、束縛を持たない新しい Function Environment Record とする。envRecord .[[FunctionObject]] を func に設定する。func .[[ThisMode]] が lexical である場合、envRecord .[[ThisBindingStatus]] を lexical に設定する。そうでない場合、envRecord .[[ThisBindingStatus]] を uninitialized に設定する。 envRecord .[[NewTarget]] を newTarget に設定する。envRecord .[[OuterEnv]] を func .[[Environment]] に設定する。envRecord .[[DisposableResourceStack]] を新しい空の List に設定する。envRecord を返す。
9.1.2.5 NewGlobalEnvironment ( obj , thisValue )
抽象操作 NewGlobalEnvironment。引数 obj (Object) および thisValue (Object)。戻り値:Global Environmentレコード 。 呼び出されると、次の手順を実行する。
objRecord を NewObjectEnvironment (obj , false , null ) とする。declRecord を NewDeclarativeEnvironment (null ) とする。envRecord を新しい Global Environment Record とする。envRecord .[[ObjectRecord]] を objRecord に設定する。envRecord .[[GlobalThisValue]] を thisValue に設定する。envRecord .[[DeclarativeRecord]] を declRecord に設定する。envRecord .[[OuterEnv]] を null に設定する。envRecord を返す。
9.1.2.6 NewModuleEnvironment ( outerEnv )
抽象操作 NewModuleEnvironment。引数 outerEnv (Global Environmentレコード )。戻り値:Module Environmentレコード 。 呼び出されると、次の手順を実行する。
envRecord を、束縛を持たない新しい Module Environment Record とする。envRecord .[[OuterEnv]] を outerEnv に設定する。envRecord .[[DisposableResourceStack]] を新しい空の List に設定する。envRecord を返す。
9.2 PrivateEnvironment Record
PrivateEnvironment Record は、ECMAScript コード内の ClassDeclaration および ClassExpression のレキシカルな入れ子構造に基づいて Private Name を追跡するために使用される仕様上の仕組みです。Environment Record と似ていますが、別のものです。各 PrivateEnvironment Record は ClassDeclaration または ClassExpression に関連付けられます。このようなクラスが評価されるたびに、そのクラスによって宣言された Private Name を記録するため、新しい PrivateEnvironment Record が作成されます。
各 PrivateEnvironment Record は、表 19 で定義されるフィールドを持ちます。
表 19: PrivateEnvironment Record のフィールド
9.2.1 PrivateEnvironment Record に対する操作
この仕様では、PrivateEnvironment Record を操作するために次の抽象操作 を使用します。
9.2.1.1 NewPrivateEnvironment ( outerPrivateEnv )
抽象操作 NewPrivateEnvironment。引数 outerPrivateEnv ((PrivateEnvironmentレコード または null ))。戻り値:PrivateEnvironmentレコード 。 呼び出されると、次の手順を実行する。
names を新しい空の List とする。PrivateEnvironment Record { [[OuterPrivateEnvironment]] : outerPrivateEnv , [[Names]] : names } を返す。
9.2.1.2 ResolvePrivateIdentifier ( privateEnv , identifier )
抽象操作 ResolvePrivateIdentifier。引数 privateEnv (PrivateEnvironmentレコード ) および identifier (String)。戻り値:プライベート名 。 呼び出されると、次の手順を実行する。
names を privateEnv .[[Names]] とする。names の各 Private Name privateName について、次を行う。privateName .[[Description]] が identifier である場合、privateName を返す。outerPrivateEnv を privateEnv .[[OuterPrivateEnvironment]] とする。表明 : outerPrivateEnv は null ではない。ResolvePrivateIdentifier (outerPrivateEnv , identifier ) を返す。
9.3 Realm
すべての ECMAScript コードは、評価される前に Realm に関連付けられなければなりません。概念上、Realm は、イントリンシックオブジェクトの集合、ECMAScript グローバル環境、そのグローバル環境のスコープ内に読み込まれたすべての ECMAScript コード、およびその他の関連する状態とリソースから構成されます。
この仕様では、Realm は、表 20 で指定されるフィールドを持つ Realm Record として表されます。
表 20: Realm Record のフィールド
9.3.1 InitializeHostDefinedRealm ( )
抽象操作 InitializeHostDefinedRealm。引数なし。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
realm を新しい Realm Record とする。CreateIntrinsics (realm ) を実行する。realm .[[AgentSignifier]] を AgentSignifier () に設定する。realm .[[TemplateMap]] を新しい空の List に設定する。newContext を新しい実行コンテキスト とする。newContext の Function を null に設定する。newContext の Realm を realm に設定する。newContext の ScriptOrModule を null に設定する。newContext を実行コンテキストスタック にプッシュする。これで newContext が実行中の実行コンテキスト になる。ホスト が realm のグローバルオブジェクト として機能する特定のオブジェクトの使用を要求する場合、global を、ホスト定義 の方法で作成されたそのようなオブジェクトとする。そうでない場合、global を OrdinaryObjectCreate (realm .[[Intrinsics]] .[[%Object.prototype% ]]) とする。 ホスト が realm のグローバルスコープ内の this 束縛からグローバルオブジェクト とは異なるオブジェクトを返すことを要求する場合、thisValue を、ホスト定義 の方法で作成されたそのようなオブジェクトとする。そうでない場合、thisValue を global とする。 realm .[[GlobalObject]] を global に設定する。realm .[[GlobalEnv]] を NewGlobalEnvironment (global , thisValue ) に設定する。? SetDefaultGlobalBindings (realm ) を実行する。 global にホスト定義 のグローバルオブジェクト プロパティを作成する。unused を返す。
9.3.2 CreateIntrinsics ( realmRecord )
抽象操作 CreateIntrinsics。引数 realmRecord (Realmレコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
realmRecord .[[Intrinsics]] を新しい Record に設定する。realmRecord .[[Intrinsics]] のフィールドを、表 6 に列挙される値で設定する。フィールド名は、表の「イントリンシック名」列に列挙される名前である。各フィールドの値は、箇条 19 から 28 までにある各オブジェクトの仕様で定義されるプロパティ値を、完全かつ再帰的に設定した新しいオブジェクト値である。すべてのオブジェクトプロパティ値は新しく作成されたオブジェクト値である。組込み関数オブジェクト であるすべての値は、CreateBuiltinFunction (steps , length , name , slots , realmRecord , proto , async ) を実行して作成される。ここで steps はこの仕様によって提供されるその関数の定義、name は関数の "name" プロパティの初期値、length は関数の "length" プロパティの初期値、slots は関数について規定された内部スロット名が存在する場合のその List 、proto は関数の [[Prototype]] 内部スロットについて規定された値、async は関数が「async」と記述されている場合は true 、それ以外の場合は false である。イントリンシックおよびそのプロパティの作成は、まだ作成されていないオブジェクトへの依存を避けるような順序で行わなければならない。AddRestrictedFunctionProperties (realmRecord .[[Intrinsics]] .[[%Function.prototype% ]], realmRecord ) を実行する。unused を返す。
9.3.3 SetDefaultGlobalBindings ( realmRecord )
抽象操作 SetDefaultGlobalBindings。引数 realmRecord (Realmレコード )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
global を realmRecord .[[GlobalObject]] とする。箇条 19 で規定される Global Object の各プロパティについて、次を行う。name をプロパティ名 の String 値とする。propertyDesc を、そのプロパティについて規定された属性を含む、そのプロパティの完全に設定されたデータ Property Descriptor とする。19.2 、19.3 、または 19.4 に列挙されるプロパティについては、[[Value]] 属性の値は realmRecord からの対応するイントリンシックオブジェクトである。? DefinePropertyOrThrow (global , name , propertyDesc ) を実行する。 unused を返す。
9.4 実行コンテキスト
実行コンテキスト は、ECMAScript 実装によるコードの実行時評価を追跡するために使用される仕様上の仕組みです。任意の時点において、実際にコードを実行している実行コンテキストは、エージェント ごとに最大1つだけです。これはそのエージェント の 実行中の実行コンテキスト と呼ばれます。この仕様における実行中の実行コンテキスト へのすべての参照は、周囲のエージェント の実行中の実行コンテキスト を表します。
実行コンテキストスタック は、実行コンテキストを追跡するために使用されます。実行中の実行コンテキスト は常にこのスタックの最上位要素です。現在実行中の実行コンテキスト に関連付けられた実行可能コードから、その実行コンテキストに関連付けられていない実行可能コードへ制御が移るたびに、新しい実行コンテキストが作成されます。新しく作成された実行コンテキストはスタックにプッシュされ、実行中の実行コンテキスト になります。
実行コンテキストには、関連するコードの実行進行状況を追跡するために必要な、実装固有のあらゆる状態が含まれます。各実行コンテキストは、少なくとも 表 21 に列挙される状態構成要素を持ちます。
表 21: すべての実行コンテキスト の状態構成要素
実行中の実行コンテキスト によるコードの評価は、この仕様内で定義されるさまざまな時点で中断される場合があります。実行中の実行コンテキスト が中断されると、別の実行コンテキストが実行中の実行コンテキスト となり、そのコードの評価を開始する場合があります。その後、ある時点で、中断された実行コンテキストが再び実行中の実行コンテキスト となり、以前に中断された地点からコードの評価を続行する場合があります。実行コンテキスト間での実行中の実行コンテキスト 状態の遷移は、通常、スタックの後入れ先出し方式で行われます。ただし、一部の ECMAScript 機能では、実行中の実行コンテキスト に非 LIFO の遷移が必要です。
実行中の実行コンテキスト の Realm 構成要素の値は、現在の Realm Record とも呼ばれます。実行中の実行コンテキスト の Function 構成要素の値は、アクティブ関数オブジェクト とも呼ばれます。
ECMAScript コード実行コンテキスト は、表 22 に列挙される追加の状態構成要素を持ちます。
表 22: ECMAScript コード実行コンテキスト の追加の状態構成要素
実行コンテキストの LexicalEnvironment および VariableEnvironment 構成要素は常に Environment Record です。
Generator の評価を表す実行コンテキストは、表 23 に列挙される追加の状態構成要素を持ちます。
表 23: Generator 実行コンテキスト の追加の状態構成要素
構成要素
目的
Generator
この実行コンテキスト が評価している Generator です。
ほとんどの場合、この仕様内のアルゴリズムによって直接操作されるのは、実行中の実行コンテキスト (実行コンテキストスタック の最上位)だけです。そのため、「LexicalEnvironment」および「VariableEnvironment」という用語が修飾なしで使用される場合、それらは実行中の実行コンテキスト の対応する構成要素を指します。
実行コンテキストは純粋に仕様上の仕組みであり、ECMAScript 実装の特定の実体に対応する必要はありません。ECMAScript コードから実行コンテキストへ直接アクセスしたり、それを観測したりすることはできません。
9.4.1 GetActiveScriptOrModule ( )
抽象操作 GetActiveScriptOrModule。引数なし。戻り値:(Scriptレコード 、Moduleレコード または null )。 実行中の実行コンテキスト に基づいて、実行中のスクリプトまたはモジュールを判定するために使用されます。 呼び出されると、次の手順を実行する。
実行コンテキストスタック が空である場合、null を返す。executionContext を、実行コンテキストスタック 上で ScriptOrModule 構成要素が null でない最上位の実行コンテキスト とする。そのような実行コンテキスト が存在しない場合、null を返す。 executionContext の ScriptOrModule を返す。
9.4.2 ResolveBinding ( name [ , envRecord ] )
抽象操作 ResolveBinding。引数 name (String)および省略可能な引数 envRecord ((Environmentレコード または undefined ))。戻り値:(正常完了 (値:Referenceレコード ) または throw 完了 )。 name の束縛を判定するために使用されます。envRecord を使用して、束縛を検索する Environment Record を明示的に指定できます。 呼び出されると、次の手順を実行する。
envRecord が存在しないか、envRecord が undefined である場合、envRecord を実行中の実行コンテキスト の LexicalEnvironment に設定する。表明 : envRecord は Environment Record である。strict を IsStrict (評価中の構文生成規則) とする。? GetIdentifierReference (envRecord , name , strict ) を返す。
注
ResolveBinding の結果は常に [[ReferencedName]] フィールドが name である Reference Record です。
9.4.3 GetThisEnvironment ( )
抽象操作 GetThisEnvironment。引数なし。戻り値:Environmentレコード 。 現在キーワード this の束縛を提供している Environment Record を見つけます。 呼び出されると、次の手順を実行する。
envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。次を繰り返す。exists を envRecord .HasThisBinding () とする。exists が true である場合、envRecord を返す。outer を envRecord .[[OuterEnv]] とする。表明 : outer は null ではない。envRecord を outer に設定する。
注
手順 2 のループは常に終了します。これは、環境のリストが常に this 束縛を持つグローバル環境で終わるためです。
9.4.4 ResolveThisBinding ( )
抽象操作 ResolveThisBinding。引数なし。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 実行中の実行コンテキスト の LexicalEnvironment を使用して、キーワード this の束縛を判定します。 呼び出されると、次の手順を実行する。
envRecord を GetThisEnvironment () とする。? envRecord .GetThisBinding () を返す。
9.4.5 GetNewTarget ( )
抽象操作 GetNewTarget。引数なし。戻り値:(Object または undefined )。 実行中の実行コンテキスト の LexicalEnvironment を使用して、NewTarget 値を判定します。 呼び出されると、次の手順を実行する。
envRecord を GetThisEnvironment () とする。表明 : envRecord は [[NewTarget]] フィールドを持つ。envRecord .[[NewTarget]] を返す。
9.4.6 GetGlobalObject ( )
抽象操作 GetGlobalObject。引数なし。戻り値:Object。 現在実行中の実行コンテキスト によって使用されるグローバルオブジェクト を返します。 呼び出されると、次の手順を実行する。
currentRealm を現在の Realm Record とする。currentRealm .[[GlobalObject]] を返す。
9.4.7 RunSuspendedContext ( context , completionRecord )
抽象操作 RunSuspendedContext。引数 context (実行コンテキスト ) および completionRecord (完了レコード )。戻り値:(正常完了 (値:(ECMAScript 言語値 または unused )) または 中途完了)。 context を再開し(再開値として completionRecord を渡します)、結果を待ちます。 呼び出されると、次の手順を実行する。
callerContext を実行中の実行コンテキスト とする。callerContext を中断する。context を実行コンテキストスタック にプッシュする。これで context が実行中の実行コンテキスト になる。context の中断された評価を再開し 、それを中断させた操作の結果として completionRecord を渡す。result を、再開された計算によって渡される Completion Record とする。表明 : この手順に到達したとき、context はすでに実行コンテキストスタック から削除されており、callerContext が再び実行中の実行コンテキスト である。Completion (result ) を返す。
9.4.8 RunCallerContext ( value )
抽象操作 RunCallerContext。引数 value ((ECMAScript 言語値 または empty ))。戻り値:完了レコード 。 呼出し元コンテキストを再開し(再開値として value を渡します)、結果がある場合はそれを待ちます。 呼び出されると、次の手順を実行する。
genContext を実行中の実行コンテキスト とする。genContext を実行コンテキストスタック から削除し、実行コンテキストスタック の最上位にある実行コンテキスト を実行中の実行コンテキスト として復元する。callerContext を実行中の実行コンテキスト とする。NormalCompletion (value ) を渡して callerContext を再開する。注記 : 上の手順は制御を callerContext に移し、一時停止する。このアルゴリズム内の後続手順へ進むために一時停止を解除する唯一の方法は、genContext が再び再開されることであり、それは決して起こらない可能性もある。表明 : genContext は実行中の実行コンテキスト である。result を、genContext が直前に再開された際の Completion Record とする。Completion (result ) を返す。
9.5 Job および Job をキューに追加するためのホスト操作
Job は、パラメーターを持たない Abstract Closure であり、他の ECMAScript 計算が現在進行していないときに ECMAScript 計算を開始します。
Job は、特定のエージェント 内で ECMAScript ホスト環境 によって実行予定が設定されます。この仕様では、Job の実行予定を設定するためのホストフック HostEnqueueGenericJob 、HostEnqueueFinalizationRegistryCleanupJob 、HostEnqueuePromiseJob 、および HostEnqueueTimeoutJob を説明します。この仕様のホストフック は、Job のスケジューリングに課される追加の制約に従って整理されています。ホスト は、Job の実行予定を設定する追加の抽象操作 を定義してもかまいません。このような操作は、Job Abstract Closure と Realm (Realm Record または null )をパラメーターとして受け取ります。Realm Record が提供された場合、これらの操作は、その Realm を所有するエージェント 内で、将来のある時点に提供された Realm 内で Job を実行するようスケジュールします。Realm に null が提供された場合、その Job は ECMAScript コードを評価しません。その実装は次の要件に適合しなければなりません。
注 1
ホスト環境 は、スケジューリングに関してすべての
Job を一様に扱う必要はありません。たとえば、Web ブラウザーと Node.js は Promise を処理する
Job を他の作業より高い優先度で扱います。将来の機能では、それほど高い優先度で扱われない
Job が追加される可能性があります。
任意の時点において、scriptOrModule (Script Record 、Module Record 、または null )は、次の条件がすべて真である場合に アクティブなスクリプトまたはモジュール です。
任意の時点において、次の条件がすべて真である場合、実行は ECMAScript コードを評価する準備ができている といいます。
注 2
ホスト環境 は、実行コンテキスト を実行コンテキストスタック にプッシュすることによって、コードを評価するための実行を準備できます。具体的な手順は実装定義 です。
Realm の具体的な選択はホスト環境 に委ねられます。この最初の実行コンテキスト および Realm は、コールバック関数が呼び出される前にのみ使用されます。Promise ハンドラーなど、Job に関連するコールバック関数が呼び出されると、その呼出しは独自の実行コンテキスト と Realm をプッシュします。
特定の種類の Job には追加の適合要件があります。
9.5.1 JobCallback Record
JobCallback Record は、関数オブジェクト とホスト定義 値を格納するために使用される Record です。ホスト によってキューに追加された Job を介して呼び出される関数オブジェクト には、追加のホスト定義 コンテキストがある場合があります。この状態を伝播するため、Job Abstract Closure は関数オブジェクト を直接捕捉して呼び出すべきではありません。代わりに HostMakeJobCallback と HostCallJobCallback を使用します。
注
たとえば、WHATWG HTML 仕様(https://html.spec.whatwg.org/ )では、Promise コールバックの incumbent settings object を伝播するためにホスト定義 値を使用します。
JobCallback Record は、表 24 に列挙されるフィールドを持ちます。
表 24: JobCallback Record のフィールド
フィールド名
値
意味
[[Callback]]
a function object
Job が呼び出されるときに呼び出す関数です。
[[HostDefined]]
anything (default value is empty )
ホスト による使用のために予約されたフィールドです。
9.5.2 HostMakeJobCallback ( callback )
ホスト定義の抽象操作 HostMakeJobCallback。引数 callback (関数オブジェクト )。戻り値:JobCallbackレコード 。
HostMakeJobCallback の実装は、次の要件に適合しなければなりません。
HostMakeJobCallback の既定の実装は、呼び出されたときに次の手順を実行します。
JobCallback Record { [[Callback]] : callback , [[HostDefined]] : empty } を返す。
Web ブラウザーではない ECMAScript ホスト は、HostMakeJobCallback の既定の実装を使用しなければなりません。
注
これは、最終的にコールバックをスケジュールして実行する責任を持つ関数に、そのコールバックが渡された時点で呼び出されます。たとえば、promise.then(thenAction) は、リアクション Job をスケジュールするときではなく、Promise.prototype.then を呼び出す時点で thenAction に対して MakeJobCallback を呼び出します。
9.5.3 HostCallJobCallback ( jobCallback , thisValue , argList )
ホスト定義の抽象操作 HostCallJobCallback。引数 jobCallback (JobCallbackレコード )、thisValue (ECMAScript 言語値 ) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。
HostCallJobCallback の実装は、次の要件に適合しなければなりません。
Call (jobCallback .[[Callback]] , thisValue , argList ) を実行し、その結果を返さなければなりません。
注
この要件は、ホスト がこの仕様で定義された関数オブジェクト の [[Call]] 動作を変更できないことを意味します。
HostCallJobCallback の既定の実装は、呼び出されたときに次の手順を実行します。
表明 : IsCallable (jobCallback .[[Callback]] ) は true である。? Call (jobCallback .[[Callback]] , thisValue , argList ) を返す。
Web ブラウザーではない ECMAScript ホスト は、HostCallJobCallback の既定の実装を使用しなければなりません。
9.5.4 HostEnqueueGenericJob ( job , realm )
ホスト定義の抽象操作 HostEnqueueGenericJob。引数 job (a Job Abstract Closure ) および realm (Realmレコード )。戻り値:unused 。 realm .[[AgentSignifier]] によって示されるエージェント 内の Realm realm に job を、将来のある時点に実行されるようスケジュールします。このアルゴリズムで使用される Abstract Closure は、優先度や順序などの追加の制約なしでスケジュールされることを意図しています。
HostEnqueueGenericJob の実装は、9.5 の要件に適合しなければなりません。
9.5.5 HostEnqueuePromiseJob ( job , realm )
ホスト定義の抽象操作 HostEnqueuePromiseJob。引数 job (a Job Abstract Closure ) および realm ((Realmレコード または null ))。戻り値:unused 。 job を将来のある時点に実行されるようスケジュールします。このアルゴリズムで使用される Abstract Closure は、Promise の処理に関連するか、またはその他の方法で Promise 処理操作と同等の優先度でスケジュールされることを意図しています。
HostEnqueuePromiseJob の実装は、9.5 の要件に加えて、次の要件にも適合しなければなりません。
注
NewPromiseResolveThenableJob によって返される Job の realm は通常、then 関数オブジェクト に対して GetFunctionRealm を呼び出した結果です。NewPromiseReactionJob によって返される Job の realm は通常、ハンドラーが undefined でない場合にそのハンドラーに対して GetFunctionRealm を呼び出した結果です。ハンドラーが undefined の場合、realm は null です。どちらの種類の Job についても、GetFunctionRealm が異常完了する場合(すなわち、取り消された Proxy に対して呼び出された場合)、realm は GetFunctionRealm 呼出し時の現在の Realm Record です。realm が null の場合、ユーザー ECMAScript コードは評価されず、新しい ECMAScript オブジェクト(たとえば Error オブジェクト)も作成されません。たとえば、WHATWG HTML 仕様(https://html.spec.whatwg.org/ )では、realm を使用して、スクリプトを実行する能力と entry 概念を検査します。
9.5.6 HostEnqueueTimeoutJob ( timeoutJob , realm , milliseconds )
ホスト定義の抽象操作 HostEnqueueTimeoutJob。引数 timeoutJob (a Job Abstract Closure )、realm (Realmレコード ) および milliseconds (非負で有限の Number)。戻り値:unused 。 realm .[[AgentSignifier]] によって示されるエージェント 内の Realm realm に timeoutJob を、少なくとも milliseconds ミリ秒後に実行されるようスケジュールします。
HostEnqueueTimeoutJob の実装は、9.5 の要件に適合しなければなりません。
9.6 エージェント
エージェント は、ECMAScript 実行コンテキスト の集合、実行コンテキストスタック 、実行中の実行コンテキスト 、Agent Record 、および 実行スレッド から構成されます。実行スレッド を除き、エージェント の構成要素はそのエージェント だけに属します。
エージェント の実行スレッド は、他のエージェント とは独立して、そのエージェント の実行コンテキスト に対するアルゴリズム手順を実行します。ただし、スレッドを共有するエージェント のいずれにも [[CanBlock]] フィールドが true の Agent Record がない場合、1つの実行スレッド を複数のエージェント が実行スレッド として使用してもかまいません。
注 1
たとえば、一部の Web ブラウザーは、ブラウザーウィンドウ内の関連のない複数のタブ間で単一の実行スレッド を共有します。
エージェント の実行スレッド がアルゴリズム手順を実行している間、そのエージェント は、それらの手順に対する 周囲のエージェント です。手順は、周囲のエージェント を使用して、そのエージェント 内に保持される仕様レベルの実行オブジェクト、すなわち実行中の実行コンテキスト 、実行コンテキストスタック 、および Agent Record のフィールドにアクセスします。
エージェント識別子 は、Agent を識別するために使用される、グローバルに一意な不透明値です。
表 25: Agent Record のフィールド
フィールド名
値
意味
[[LittleEndian]]
a Boolean
アルゴリズム GetValueFromBuffer および SetValueInBuffer が必要とする場合に、isLittleEndian パラメーターに対して計算される既定値です。その選択は実装定義 であり、実装にとって最も効率的な選択肢であるべきです。
[[CanBlock]]
a Boolean
エージェント がブロックできるかどうかを決定します。
[[Signifier]]
an agent signifier
エージェントクラスタ 内でエージェント を一意に識別します。
[[IsLockFree1]]
a Boolean
1バイト値 に対するアトミック操作がロックフリーである場合は true 、それ以外の場合は false です。
[[IsLockFree2]]
a Boolean
2バイト値 に対するアトミック操作がロックフリーである場合は true 、それ以外の場合は false です。
[[IsLockFree8]]
a Boolean
8バイト値 に対するアトミック操作がロックフリーである場合は true 、それ以外の場合は false です。
[[CandidateExecution]]
a candidate execution Record
メモリモデル を参照してください。
[[KeptAlive]]
a List of either Objects or Symbols
初期状態では新しい空の List であり、現在の Job の終了まで生存させるオブジェクトおよび/またはシンボルのリストを表します。
[[ModuleAsyncEvaluationCount]]
an integer
初期値は 0 であり、非同期であるか非同期依存関係を持つモジュールの [[AsyncEvaluationOrder]] フィールドに、一意に増加する値を割り当てるために使用されます。
[[GlobalSymbolRegistry]]
a List of GlobalSymbolRegistry Records
初期状態では新しい空の List であり、Symbol.for によって生成された Symbol 値のリストを表します。
[[LittleEndian]] 、[[Signifier]] 、[[IsLockFree1]] 、[[IsLockFree2]] 、および [[IsLockFree8]] の値は変更できません。
[[GlobalSymbolRegistry]] List は追記専用であり、再代入されることはありません。
注 2
[[IsLockFree1]] 、[[IsLockFree2]] 、および [[IsLockFree8]] の値は、必ずしもハードウェアだけによって決定されるものではなく、時間の経過や ECMAScript 実装間で異なり得る実装上の選択も反映する場合があります。
[[IsLockFree4]] フィールドは存在しません。4バイトのアトミック操作は常にロックフリーです。
実際には、アトミック操作が何らかの種類のロックを使用して実装されている場合、その操作はロックフリーではありません。ロックフリーであることはウェイトフリーであることを意味しません。ロックフリーなアトミック操作の完了に必要となる機械ステップ数には上限がありません。
サイズ n のアトミックアクセスがロックフリーであることは、サイズ n の非アトミックアクセスの(知覚される)原子性について何も意味しません。特に、非アトミックアクセスは複数の独立したメモリアクセスの列として実行される場合があります。詳細については ReadSharedMemory および WriteSharedMemory を参照してください。
注 3
エージェント は仕様上の仕組みであり、ECMAScript 実装の特定の実体に対応する必要はありません。
9.6.1 AgentSignifier ( )
抽象操作 AgentSignifier。引数なし。戻り値:an agent signifier。 呼び出されると、次の手順を実行する。
agentRecord を周囲のエージェント の Agent Record とする。agentRecord .[[Signifier]] を返す。
9.6.2 AgentCanSuspend ( )
抽象操作 AgentCanSuspend。引数なし。戻り値:Boolean。 呼び出されると、次の手順を実行する。
agentRecord を周囲のエージェント の Agent Record とする。agentRecord .[[CanBlock]] を返す。
注
一部の環境では、特定のエージェント を中断することが妥当でない場合があります。たとえば Web ブラウザー環境では、文書のメインイベント処理スレッドの中断は禁止しつつ、Worker のイベント処理スレッドの中断は許可することが妥当な場合があります。
9.6.3 IncrementModuleAsyncEvaluationCount ( )
抽象操作 IncrementModuleAsyncEvaluationCount。引数なし。戻り値:非負整数。 呼び出されると、次の手順を実行する。
agentRecord を周囲のエージェント の Agent Record とする。count を agentRecord .[[ModuleAsyncEvaluationCount]] とする。agentRecord .[[ModuleAsyncEvaluationCount]] を count + 1 に設定する。count を返す。
注
この値は、保留中のモジュール間の相対的な評価順序を追跡するためにのみ使用されます。保留中のモジュールが存在しないときはいつでも、実装は観測されることなく [[ModuleAsyncEvaluationCount]] を 0 にリセットしてもかまいません。
9.7 エージェントクラスタ
エージェントクラスタ は、共有メモリを操作することで通信できるエージェント の極大集合です。
注 1
異なるエージェント 内のプログラムは、規定されていない方法でメモリを共有する場合があります。少なくとも、SharedArrayBuffer の基盤となるメモリは、クラスタ内のエージェント 間で共有できます。
メッセージパッシングによって通信できてもメモリを共有できないエージェント が存在する場合があります。そのようなエージェント が同じエージェントクラスタに属することはありません。
すべてのエージェント は、正確に1つのエージェントクラスタに属します。
注 2
クラスタ内のすべてのエージェント が、ある特定の時点で生存している 必要はありません。エージェント A が別のエージェント B を作成し、その後 A が終了し、B がエージェント C を作成した場合、A が B と何らかのメモリを共有でき、B が C と何らかのメモリを共有できるのであれば、3つのエージェント は同じクラスタに属します。
クラスタ内のすべてのエージェント は、それぞれの Agent Record の [[LittleEndian]] フィールドについて同じ値を持たなければなりません。
注 3
エージェントクラスタ内の異なるエージェント が [[LittleEndian]] について異なる値を持つ場合、複数バイトデータに共有メモリを使用することが困難になります。
クラスタ内のすべてのエージェント は、それぞれの Agent Record の [[IsLockFree1]] フィールドについて同じ値を持たなければなりません。[[IsLockFree2]] および [[IsLockFree8]] フィールドについても同様です。
クラスタ内のすべてのエージェント は、それぞれの Agent Record の [[Signifier]] フィールドについて異なる値を持たなければなりません。
埋込み環境は、エージェント の知識または協力なしに、エージェント を非アクティブ化(前進を停止)またはアクティブ化(前進を再開)してもかまいません。埋込み環境がこれを行う場合、クラスタ内の一部のエージェント をアクティブなままにし、同じクラスタ内の別のエージェント を無期限に非アクティブ化したままにしてはなりません。
注 4
前述の制約の目的は、別のエージェント が非アクティブ化されたために、あるエージェント がデッドロックしたり枯渇したりする状況を避けることです。たとえば、どのウィンドウ内の文書からも独立した存続期間を持つ HTML Shared Worker が、そのような独立した文書の Dedicated Worker とメモリを共有できるとします。その文書と Dedicated Worker が、Dedicated Worker がロックを保持している間に非アクティブ化され(たとえば、文書がそのウィンドウの履歴にプッシュされ)、その後 Shared Worker がそのロックの取得を試みた場合、Shared Worker は、Dedicated Worker が再びアクティブ化されるまで、場合によっては永遠に、ブロックされます。その間、他のウィンドウから Shared Worker にアクセスしようとする他の Worker は枯渇します。
この制約から、埋込み環境内で同じ中断/復帰集合に属さないエージェント 間ではメモリを共有できないことになります。
埋込み環境は、エージェント のクラスタ内の他のエージェント に事前に知られることも協力されることもなく、エージェント を終了してもかまいません。エージェント が自身またはクラスタ内の別のエージェント のプログラム上の操作によってではなく、クラスタ外部の力によって終了された場合、埋込み環境は次の2つの戦略のいずれかを選択しなければなりません。クラスタ内のすべてのエージェント を終了するか、クラスタ内のエージェント が協調できる信頼性のある API を提供し、クラスタに残る少なくとも1つのメンバーが終了を検出できるようにし、その終了データに終了されたエージェント を識別するのに十分な情報を含めるかのいずれかです。
注 5
そのような終了の例としては、別々のプロセスで実行されているエージェント をオペレーティングシステムまたはユーザーが終了する場合や、エージェント 単位のリソース計測によってそのエージェント が暴走していることが示されたため、他のエージェント と同一プロセス内で実行されているエージェント を埋込み環境自身が終了する場合があります。
次の各仕様値、およびそれらから推移的に到達可能な値は、正確に1つのエージェントクラスタに属します。
クラスタ内の任意のエージェント によって ECMAScript コードが評価される前に、クラスタ内のすべてのエージェント の Agent Record の [[CandidateExecution]] フィールドが initial candidate execution に設定されます。initial candidate execution は空の candidate execution であり、その [[EventsRecords]] フィールドは、各エージェント について、そのエージェント の agent signifier を [[AgentSignifier]] フィールドに持ち、[[EventList]] および [[AgentSynchronizesWith]] フィールドが空の List である Agent Events Record を含む List です。
注 6
エージェントクラスタ内のすべてのエージェント は、その Agent Record の [[CandidateExecution]] フィールドで同じ candidate execution を共有します。candidate execution は、メモリモデル で使用される仕様上の仕組みです。
注 7
エージェントクラスタは仕様上の仕組みであり、ECMAScript 実装の特定の実体に対応する必要はありません。
9.8 前進保証
エージェント が前進する とは、この仕様に従って評価手順を実行することです。
エージェント の実行中の実行コンテキスト が外部イベントを同期的かつ無期限に待機すると、そのエージェント はブロック されます。この意味でブロックされ得るのは、Agent Record の [[CanBlock]] フィールドが true であるエージェント だけです。非ブロック エージェント とは、ブロックされていないエージェント です。
実装は次のことを保証しなければなりません。
注
これは、メモリモデル の生存性保証とあわせて、すべての seq-cst 書込みが最終的にすべてのエージェント から観測可能になることを保証します。
9.9 WeakRef および FinalizationRegistry のターゲットの処理モデル
9.9.1 目的
この仕様は、いかなるオブジェクトまたはシンボルがガベージコレクションされることについても保証しません。生存していないオブジェクトやシンボルであっても、長期間の後に解放される場合もあれば、まったく解放されない場合もあります。このため、この仕様では、ガベージコレクションによって引き起こされる動作を説明するときに「してもよい」という表現を使用します。
WeakRef と FinalizationRegistry の意味論は、特定の時点に発生する2つの操作に基づいています。
これらのどちらの操作(ClearKeptObjects または CleanupFinalizationRegistry )も、同期的な ECMAScript 実行を中断してはなりません。ホスト はより長い同期的な ECMAScript 実行をまとめる場合があるため、この仕様では ClearKeptObjects と CleanupFinalizationRegistry のスケジューリングをホスト環境 に委ねます。
一部の ECMAScript 実装には、ECMAScript がアイドル状態のときも含め、バックグラウンドで実行されるガベージコレクター実装が含まれます。ホスト環境 に CleanupFinalizationRegistry のスケジューリングを委ねることで、ファイナライザー処理を実行するために ECMAScript 実行を再開でき、保持されている値を解放して全体のメモリ使用量を削減できる場合があります。
9.9.2 生存性
オブジェクトおよび/またはシンボルのある集合 objSet について、objSet に関する 仮想的な WeakRef 非依存 実行とは、参照対象が objSet の要素である WeakRef の抽象操作 WeakRefDeref が常に undefined を返す実行です。
注 1
WeakRef 非依存性は、生存性とあわせて2つの概念を表します。1つ目は、
WeakRef 自身はその参照対象を生存させないということです。2つ目は、生存性の循環が値の生存を意味しないということです。具体的には、
v の生存性を判定するために
WeakRef の参照対象
r の生存性の判定が必要である場合、
r の生存性を判定する際に
v の生存性を前提にすることはできません。それは循環論法になるためです。
注 2
循環を考慮するため、
WeakRef 非依存性は個々の値ではなくオブジェクトまたはシンボルの集合について定義されます。個々の値について定義した場合、循環内の
WeakRef の参照対象は、その同一性が循環内の他の
WeakRef の参照対象を介してのみ観測される場合でも、生存しているとみなされてしまいます。
注 3
口語的には、個々のオブジェクトまたはシンボルを含むすべての集合が生存している場合、そのオブジェクトまたはシンボルは生存しているといいます。
評価中の任意の時点で、オブジェクトおよび/またはシンボルの集合 objSet は、次の条件のいずれかを満たす場合に 生存している とみなされます。
objSet 内のいずれかの要素が、いずれかのエージェント の [[KeptAlive]] List に含まれる。
objSet に関する有効な将来の仮想的な WeakRef 非依存実行が存在し、その実行が objSet 内のいずれかの値の同一性を観測する。
注 4
上記の2番目の条件は、
WeakRef 以外の手段によって同一性を観測できる場合に値が生存している、という直感を表すことを意図しています。値の同一性は、厳密等価比較を観測することや、値が Map のキーとして使用されることを観測することによって確認できる場合があります。
注 5
フィールド、内部スロット、またはプロパティにオブジェクトまたはシンボルが存在すること自体は、その値が生存していることを意味しません。たとえば、問題の値がプログラムへ決して返されない場合、その値は観測できません。
これは、WeakMap のキー、WeakSet のメンバー、および FinalizationRegistry Cell Record の [[WeakRefTarget]] と [[UnregisterToken]] フィールドに該当します。
上記の定義は、WeakMap のキーが生存していない場合、その対応する値も必ずしも生存しているわけではないことを意味します。
注 6
生存性は、エンジンがどの
WeakRef を空にしてはならないかを保証するための下限です。ここで定義される生存性は決定不能です。実際には、エンジンは到達可能性などの保守的な近似を使用します。実装には大きな裁量が認められることが想定されています。
9.9.3 実行
任意の時点で、オブジェクトおよび/またはシンボルの集合 objSet が生存していない場合、ECMAScript 実装は次の手順を原子的に実行してもかまいません。
objSet の各要素 value について、次を行う。ref .[[WeakRefTarget]] が value である各 WeakRef ref について、次を行う。ref .[[WeakRefTarget]] を empty に設定する。finalizationRegistry .[[Cells]] が cell .[[WeakRefTarget]] が value である Record cell を含む各 FinalizationRegistry finalizationRegistry について、次を行う。cell .[[WeakRefTarget]] を empty に設定する。enqueueCleanup を true または false のいずれかとして実装定義 で選択する。enqueueCleanup が true である場合、HostEnqueueFinalizationRegistryCleanupJob (finalizationRegistry ) を実行する。map .[[WeakMapData]] が entry .[[Key]] が value である Record entry を含む各 WeakMap map について、次を行う。entry .[[Key]] を empty に設定する。entry .[[Value]] を empty に設定する。set .[[WeakSetData]] が value を含む各 WeakSet set について、次を行う。set .[[WeakSetData]] 内の値が value である要素を、値が empty である要素に置換する。
注 1
生存性の定義とあわせて、この箇条は実装が WeakRef に関して適用してもよい最適化を規定します。
オブジェクトの同一性を観測せずにそのオブジェクトへアクセスすることは可能です。同一性が観測されない、外部へ脱出しないオブジェクトのプロパティに対するデッド変数除去やスカラー置換などの最適化は許可されます。したがって、これらの最適化が、そのようなオブジェクトを指す WeakRef を観測可能な形で空にすることも許可されます。
一方、オブジェクトの同一性が観測可能で、そのオブジェクトが WeakRef の [[WeakRefTarget]] 内部スロットにある場合、WeakRef を観測可能な形で空にする再実体化などの最適化は禁止されます。
HostEnqueueFinalizationRegistryCleanupJob の呼出しは任意であるため、FinalizationRegistry に登録されたオブジェクトが、その FinalizationRegistry を必ずしも生存させるわけではありません。実装は任意の理由で FinalizationRegistry のコールバックを省略してもかまいません。たとえば、FinalizationRegistry 自身が生存しなくなった場合や、アプリケーションが終了中の場合などです。
注 2
実装は、生存していないオブジェクトまたはシンボルの極大集合について WeakRef を空にする義務を負いません。
実装が WeakRef を空にする生存していない集合 objSet を選択した場合、この定義は objSet 内のすべての値について WeakRef を同時に空にすることを要求します。言い換えると、値 v を指す WeakRef を空にする一方で、空にしなければ v の値を観測する実行につながり得る他の WeakRef を空にしないことは、適合する実装ではありません。
9.9.4 ホストフック
9.9.4.1 HostEnqueueFinalizationRegistryCleanupJob ( finalizationRegistry )
ホスト定義の抽象操作 HostEnqueueFinalizationRegistryCleanupJob。引数 finalizationRegistry (FinalizationRegistry )。戻り値:unused 。
cleanupJob を、パラメーターを持たず、finalizationRegistry を捕捉し、呼び出されたときに次の手順を実行する新しい Job Abstract Closure とする。
cleanupResult を Completion (CleanupFinalizationRegistry (finalizationRegistry )) とする。cleanupResult が中断完了 である場合、エラーを報告するためのホスト定義 の手順を実行する。unused を返す。
HostEnqueueFinalizationRegistryCleanupJob の実装は、可能であれば cleanupJob を将来のある時点に実行されるようスケジュールします。また、9.5 の要件にも適合しなければなりません。
9.10 ClearKeptObjects ( )
抽象操作 ClearKeptObjects。引数なし。戻り値:unused 。 ECMAScript 実装は、ECMAScript 実行の同期的な列が完了したときに ClearKeptObjects を呼び出すことが期待されます。 呼び出されると、次の手順を実行する。
agentRecord を周囲のエージェント の Agent Record とする。agentRecord .[[KeptAlive]] を新しい空の List に設定する。unused を返す。
9.11 AddToKeptObjects ( value )
抽象操作 AddToKeptObjects。引数 value ((Object または Symbol))。戻り値:unused 。 呼び出されると、次の手順を実行する。
agentRecord を周囲のエージェント の Agent Record とする。value を agentRecord .[[KeptAlive]] に追加する。unused を返す。
注
Abstract Operation AddToKeptObjects が対象オブジェクトまたはシンボルを指定して呼び出されると、その対象を、
ClearKeptObjects が呼び出されるまで対象を強参照するリストに追加します。
9.12 CleanupFinalizationRegistry ( finalizationRegistry )
抽象操作 CleanupFinalizationRegistry。引数 finalizationRegistry (FinalizationRegistry )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
表明 : finalizationRegistry は [[Cells]] および [[CleanupCallback]] 内部スロットを持つ。callback を finalizationRegistry .[[CleanupCallback]] とする。finalizationRegistry .[[Cells]] が cell .[[WeakRefTarget]] が empty である Record cell を含む間、実装は次の手順を実行してもかまわない。そのような cell を任意に1つ選択する。 cell を finalizationRegistry .[[Cells]] から削除する。? HostCallJobCallback (callback , undefined , « cell .[[HeldValue]] ») を実行する。 unused を返す。
9.13 CanBeHeldWeakly ( arg )
抽象操作 CanBeHeldWeakly。引数 arg (ECMAScript 言語値 )。戻り値:Boolean。 arg が弱参照として使用するのに適している場合に限り true を返します。弱参照として使用するのに適した値だけが、WeakMap のキー、WeakSet の要素、WeakRef の対象、または FinalizationRegistry の対象の1つになることができます。 呼び出されると、次の手順を実行する。
arg が Object である場合、true を返す。arg が Symbol であり、KeyForSymbol (arg ) が undefined である場合、true を返す。false を返す。
注
言語上の同一性 を持たない言語値は、事前の参照なしに具現化できるため、弱参照としての使用には適していません。Symbol.for によって生成された Symbol 値は、他の Symbol 値とは異なり、言語上の同一性を持たず、弱参照としての使用には適していません。ウェルノウンシンボル は、ほとんど収集されない可能性がありますが、その数が限定されており、さまざまな実装手法で管理可能であるため、それでも弱参照としての使用に適しているものとして扱われます。ただし、生存している WeakMap 内でウェルノウンシンボルに関連付けられた値は収集される可能性が低く、実装内でメモリリソースを「リーク」する可能性があります。
10 通常オブジェクトおよび特殊オブジェクトの動作
10.1 通常オブジェクトの内部メソッドと内部スロット
すべての通常オブジェクト は [[Prototype]] と呼ばれる内部スロットを持ちます。この内部スロットの値は null またはオブジェクトのいずれかであり、継承の実装に使用されます。propertyKey という名前のプロパティが通常オブジェクト obj には存在しないものの、その [[Prototype]] オブジェクトには存在すると仮定します。propertyKey が [[Prototype]] オブジェクト上のデータプロパティ を参照する場合、obj は get アクセスのためにそれを継承し、propertyKey が obj のプロパティであるかのように動作します。propertyKey が [[Prototype]] オブジェクト上の書込み可能なデータプロパティ を参照する場合、obj 上で propertyKey に set アクセスすると、obj 上に propertyKey という名前の新しいデータプロパティ が作成されます。propertyKey が [[Prototype]] オブジェクト上の書込み不可のデータプロパティ を参照する場合、obj 上での propertyKey への set アクセスは失敗します。propertyKey が [[Prototype]] オブジェクト上のアクセサープロパティ を参照する場合、そのアクセサーは get アクセスと set アクセスの両方について obj に継承されます。
すべての通常オブジェクト は Boolean 値を持つ [[Extensible]] 内部スロットを持ち、6.1.7.3 で規定される拡張可能性に関する内部メソッドの不変条件を満たすために使用されます。すなわち、オブジェクトの [[Extensible]] 内部スロットの値が一度 false に設定されると、そのオブジェクトにプロパティを追加したり、そのオブジェクトの [[Prototype]] 内部スロットの値を変更したり、その後 [[Extensible]] の値を true に変更したりすることはできなくなります。
以下のアルゴリズムの説明では、obj は通常オブジェクト 、propertyKey はプロパティキー 値、value は任意の ECMAScript 言語値 、propertyDesc は Property Descriptor Record であると仮定します。
各通常オブジェクト 内部メソッドは、同様の名前を持つ抽象操作 へ処理を委譲します。その抽象操作 が別の内部メソッドに依存する場合、同様の名前を持つ抽象操作 を直接呼び出すのではなく、obj に対してその内部メソッドが呼び出されます。この意味論により、通常オブジェクト の内部メソッドが特殊オブジェクト に適用された場合、その特殊オブジェクト で上書きされた内部メソッドが呼び出されることが保証されます。
10.1.1 [[GetPrototypeOf]] ( )
an ordinary object obj の内部メソッド [[GetPrototypeOf]] 。引数なし。戻り値:正常完了 (値:(Object または null ))。 呼び出されると、次の手順を実行する。
OrdinaryGetPrototypeOf (obj ) を返す。
10.1.1.1 OrdinaryGetPrototypeOf ( obj )
抽象操作 OrdinaryGetPrototypeOf。引数 obj (Object)。戻り値:(Object または null )。 呼び出されると、次の手順を実行する。
obj .[[Prototype]] を返す。
10.1.2 [[SetPrototypeOf]] ( proto )
an ordinary object obj の内部メソッド [[SetPrototypeOf]] 。引数 proto ((Object または null ))。戻り値:正常完了 (値:Boolean)。 呼び出されると、次の手順を実行する。
OrdinarySetPrototypeOf (obj , proto ) を返す。
10.1.2.1 OrdinarySetPrototypeOf ( obj , proto )
抽象操作 OrdinarySetPrototypeOf。引数 obj (Object) および proto ((Object または null ))。戻り値:Boolean。 呼び出されると、次の手順を実行する。
current を obj .[[Prototype]] とする。SameValue (proto , current ) が true である場合、true を返す。extensible を obj .[[Extensible]] とする。extensible が false である場合、false を返す。cursor を proto とする。done を false とする。done が false である間、次を繰り返す。cursor が null である場合、done を true に設定する。そうでなく、SameValue (cursor , obj ) が true である場合、false を返す。 そうでない場合、cursor .[[GetPrototypeOf]] が 10.1.1 で定義される通常オブジェクト 内部メソッドでない場合、done を true に設定する。そうでない場合、cursor を cursor .[[Prototype]] に設定する。 obj .[[Prototype]] を proto に設定する。true を返す。
注
手順 7 のループは、[[GetPrototypeOf]] および [[SetPrototypeOf]] に通常オブジェクト の定義を使用するオブジェクトのみを含むプロトタイプチェーンに循環が存在しないことを保証します。
10.1.3 [[IsExtensible]] ( )
an ordinary object obj の内部メソッド [[IsExtensible]] 。引数なし。戻り値:正常完了 (値:Boolean)。 呼び出されると、次の手順を実行する。
OrdinaryIsExtensible (obj ) を返す。
10.1.3.1 OrdinaryIsExtensible ( obj )
抽象操作 OrdinaryIsExtensible。引数 obj (Object)。戻り値:Boolean。 呼び出されると、次の手順を実行する。
obj .[[Extensible]] を返す。
10.1.4 [[PreventExtensions]] ( )
an ordinary object obj の内部メソッド [[PreventExtensions]] 。引数なし。戻り値:正常完了 (値:true )。 呼び出されると、次の手順を実行する。
OrdinaryPreventExtensions (obj ) を返す。
10.1.4.1 OrdinaryPreventExtensions ( obj )
抽象操作 OrdinaryPreventExtensions。引数 obj (Object)。戻り値:true 。 呼び出されると、次の手順を実行する。
obj .[[Extensible]] を false に設定する。true を返す。
10.1.5 [[GetOwnProperty]] ( propertyKey )
an ordinary object obj の内部メソッド [[GetOwnProperty]] 。引数 propertyKey (プロパティキー )。戻り値:正常完了 (値:(プロパティ記述子 または undefined ))。 呼び出されると、次の手順を実行する。
OrdinaryGetOwnProperty (obj , propertyKey ) を返す。
10.1.5.1 OrdinaryGetOwnProperty ( obj , propertyKey )
抽象操作 OrdinaryGetOwnProperty。引数 obj (Object) および propertyKey (プロパティキー )。戻り値:(プロパティ記述子 または undefined )。 呼び出されると、次の手順を実行する。
obj がキー propertyKey を持つ自身のプロパティを持たない場合、undefined を返す。propertyDesc を、フィールドを持たない新しく作成された Property Descriptor とする。ownProperty を、キーが propertyKey である obj 自身のプロパティとする。ownProperty がデータプロパティ である場合、propertyDesc .[[Value]] を ownProperty の [[Value]] 属性の値に設定する。propertyDesc .[[Writable]] を ownProperty の [[Writable]] 属性の値に設定する。そうでない場合、表明 : ownProperty はアクセサープロパティ である。propertyDesc .[[Getter]] を ownProperty の [[Getter]] 属性の値に設定する。propertyDesc .[[Setter]] を ownProperty の [[Setter]] 属性の値に設定する。 propertyDesc .[[Enumerable]] を ownProperty の [[Enumerable]] 属性の値に設定する。propertyDesc .[[Configurable]] を ownProperty の [[Configurable]] 属性の値に設定する。propertyDesc を返す。
10.1.6 [[DefineOwnProperty]] ( propertyKey , propertyDesc )
an ordinary object obj の内部メソッド [[DefineOwnProperty]] 。引数 propertyKey (プロパティキー ) および propertyDesc (プロパティ記述子 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
? OrdinaryDefineOwnProperty (obj , propertyKey , propertyDesc ) を返す。
10.1.6.1 OrdinaryDefineOwnProperty ( obj , propertyKey , propertyDesc )
抽象操作 OrdinaryDefineOwnProperty。引数 obj (Object)、propertyKey (プロパティキー ) および propertyDesc (プロパティ記述子 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
current を ? obj .[[GetOwnProperty]] (propertyKey ) とする。extensible を ? IsExtensible (obj ) とする。ValidateAndApplyPropertyDescriptor (obj , propertyKey , extensible , propertyDesc , current ) を返す。
10.1.6.2 IsCompatiblePropertyDescriptor ( extensible , propertyDesc , current )
抽象操作 IsCompatiblePropertyDescriptor。引数 extensible (Boolean)、propertyDesc (プロパティ記述子 ) および current ((プロパティ記述子 または undefined ))。戻り値:Boolean。 呼び出されると、次の手順を実行する。
ValidateAndApplyPropertyDescriptor (undefined , "" , extensible , propertyDesc , current ) を返す。
10.1.6.3 ValidateAndApplyPropertyDescriptor ( obj , propertyKey , extensible , propertyDesc , current )
抽象操作 ValidateAndApplyPropertyDescriptor。引数 obj ((Object または undefined ))、propertyKey (プロパティキー )、extensible (Boolean)、propertyDesc (プロパティ記述子 ) および current ((プロパティ記述子 または undefined ))。戻り値:Boolean。 指定された extensibility と現在のプロパティ current を持つオブジェクトのプロパティとして propertyDesc を適用しても 不変条件 が維持される場合に限り true を返します。そのような適用が可能で、かつ obj が undefined でない場合、propertyKey という名前のプロパティに対して適用が実行されます(必要であれば作成されます)。 呼び出されると、次の手順を実行する。
表明 : propertyKey はプロパティキー である。current が undefined である場合、extensible が false である場合、false を返す。obj が undefined である場合、true を返す。IsAccessorDescriptor (propertyDesc ) が true である場合、オブジェクト obj に propertyKey という名前の自身のアクセサープロパティ を作成する。その [[Getter]] 、[[Setter]] 、[[Enumerable]] 、および [[Configurable]] 属性は、propertyDesc が対応するフィールドを持つ場合はそのフィールドの値に、そうでない場合は属性の 既定値 に設定する。 そうでない場合、オブジェクト obj に propertyKey という名前の自身のデータプロパティ を作成する。その [[Value]] 、[[Writable]] 、[[Enumerable]] 、および [[Configurable]] 属性は、propertyDesc が対応するフィールドを持つ場合はそのフィールドの値に、そうでない場合は属性の 既定値 に設定する。 true を返す。表明 : current は完全に設定された Property Descriptor である。propertyDesc がフィールドを1つも持たない場合、true を返す。current .[[Configurable]] が false である場合、propertyDesc が [[Configurable]] フィールドを持ち、propertyDesc .[[Configurable]] が true である場合、false を返す。propertyDesc が [[Enumerable]] フィールドを持ち、propertyDesc .[[Enumerable]] が current .[[Enumerable]] でない場合、false を返す。IsGenericDescriptor (propertyDesc ) が false であり、IsAccessorDescriptor (propertyDesc ) が IsAccessorDescriptor (current ) でない場合、false を返す。IsAccessorDescriptor (current ) が true である場合、propertyDesc が [[Getter]] フィールドを持ち、SameValue (propertyDesc .[[Getter]] , current .[[Getter]] ) が false である場合、false を返す。propertyDesc が [[Setter]] フィールドを持ち、SameValue (propertyDesc .[[Setter]] , current .[[Setter]] ) が false である場合、false を返す。そうでなく、current .[[Writable]] が false である場合、propertyDesc が [[Writable]] フィールドを持ち、propertyDesc .[[Writable]] が true である場合、false を返す。注記 : SameValue は、他の手段によって区別できる可能性がある NaN 値について true を返す。ここで返すことで、obj の既存のプロパティが変更されないことを保証する。propertyDesc が [[Value]] フィールドを持つ場合、SameValue (propertyDesc .[[Value]] , current .[[Value]] ) を返す。 obj が undefined でない場合、IsDataDescriptor (current ) が true であり、IsAccessorDescriptor (propertyDesc ) が true である場合、propertyDesc が [[Configurable]] フィールドを持つ場合、configurable を propertyDesc .[[Configurable]] とする。そうでない場合、configurable を current .[[Configurable]] とする。propertyDesc が [[Enumerable]] フィールドを持つ場合、enumerable を propertyDesc .[[Enumerable]] とする。そうでない場合、enumerable を current .[[Enumerable]] とする。オブジェクト obj の propertyKey という名前のプロパティを、[[Configurable]] および [[Enumerable]] 属性がそれぞれ configurable および enumerable に設定され、[[Getter]] および [[Setter]] 属性が、propertyDesc が対応するフィールドを持つ場合はそのフィールドの値に、そうでない場合は属性の 既定値 に設定されたアクセサープロパティ に置換する。 そうでなく、IsAccessorDescriptor (current ) が true であり、IsDataDescriptor (propertyDesc ) が true である場合、propertyDesc が [[Configurable]] フィールドを持つ場合、configurable を propertyDesc .[[Configurable]] とする。そうでない場合、configurable を current .[[Configurable]] とする。propertyDesc が [[Enumerable]] フィールドを持つ場合、enumerable を propertyDesc .[[Enumerable]] とする。そうでない場合、enumerable を current .[[Enumerable]] とする。オブジェクト obj の propertyKey という名前のプロパティを、[[Configurable]] および [[Enumerable]] 属性がそれぞれ configurable および enumerable に設定され、[[Value]] および [[Writable]] 属性が、propertyDesc が対応するフィールドを持つ場合はそのフィールドの値に、そうでない場合は属性の 既定値 に設定されたデータプロパティ に置換する。 そうでない場合、propertyDesc の各フィールド名 fieldName について、オブジェクト obj の propertyKey という名前のプロパティの fieldName という名前の属性を、propertyDesc の fieldName フィールドの値に設定する。 true を返す。
10.1.7 [[HasProperty]] ( propertyKey )
an ordinary object obj の内部メソッド [[HasProperty]] 。引数 propertyKey (プロパティキー )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
? OrdinaryHasProperty (obj , propertyKey ) を返す。
10.1.7.1 OrdinaryHasProperty ( obj , propertyKey )
抽象操作 OrdinaryHasProperty。引数 obj (Object) および propertyKey (プロパティキー )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
hasOwn を ? obj .[[GetOwnProperty]] (propertyKey ) とする。hasOwn が undefined でない場合、true を返す。parent を ? obj .[[GetPrototypeOf]] () とする。parent が null でない場合、? parent .[[HasProperty]] (propertyKey ) を返す。 false を返す。
10.1.8 [[Get]] ( propertyKey , receiver )
an ordinary object obj の内部メソッド [[Get]] 。引数 propertyKey (プロパティキー ) および receiver (ECMAScript 言語値 )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
? OrdinaryGet (obj , propertyKey , receiver ) を返す。
10.1.8.1 OrdinaryGet ( obj , propertyKey , receiver )
抽象操作 OrdinaryGet。引数 obj (Object)、propertyKey (プロパティキー ) および receiver (ECMAScript 言語値 )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
propertyDesc を ? obj .[[GetOwnProperty]] (propertyKey ) とする。propertyDesc が undefined である場合、parent を ? obj .[[GetPrototypeOf]] () とする。parent が null である場合、undefined を返す。? parent .[[Get]] (propertyKey , receiver ) を返す。 IsDataDescriptor (propertyDesc ) が true である場合、propertyDesc .[[Value]] を返す。表明 : IsAccessorDescriptor (propertyDesc ) は true である。getter を propertyDesc .[[Getter]] とする。getter が undefined である場合、undefined を返す。? Call (getter , receiver ) を返す。
10.1.9 [[Set]] ( propertyKey , value , receiver )
an ordinary object obj の内部メソッド [[Set]] 。引数 propertyKey (プロパティキー )、value (ECMAScript 言語値 ) および receiver (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
? OrdinarySet (obj , propertyKey , value , receiver ) を返す。
10.1.9.1 OrdinarySet ( obj , propertyKey , value , receiver )
抽象操作 OrdinarySet。引数 obj (Object)、propertyKey (プロパティキー )、value (ECMAScript 言語値 ) および receiver (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
ownDesc を ? obj .[[GetOwnProperty]] (propertyKey ) とする。? OrdinarySetWithOwnDescriptor (obj , propertyKey , value , receiver , ownDesc ) を返す。
10.1.9.2 OrdinarySetWithOwnDescriptor ( obj , propertyKey , value , receiver , ownDesc )
抽象操作 OrdinarySetWithOwnDescriptor。引数 obj (Object)、propertyKey (プロパティキー )、value (ECMAScript 言語値 )、receiver (ECMAScript 言語値 ) および ownDesc ((プロパティ記述子 または undefined ))。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
ownDesc が undefined である場合、parent を ? obj .[[GetPrototypeOf]] () とする。parent が null でない場合、? parent .[[Set]] (propertyKey , value , receiver ) を返す。ownDesc を PropertyDescriptor { [[Value]] : undefined , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : true } に設定する。IsDataDescriptor (ownDesc ) が true である場合、ownDesc .[[Writable]] が false である場合、false を返す。receiver が Object でない場合、false を返す。existingDesc を ? receiver .[[GetOwnProperty]] (propertyKey ) とする。existingDesc が undefined である場合、表明 : receiver は現在 propertyKey プロパティを持っていない。? CreateDataProperty (receiver , propertyKey , value ) を返す。 IsAccessorDescriptor (existingDesc ) が true である場合、false を返す。existingDesc .[[Writable]] が false である場合、false を返す。valueDesc を PropertyDescriptor { [[Value]] : value } とする。? receiver .[[DefineOwnProperty]] (propertyKey , valueDesc ) を返す。 表明 : IsAccessorDescriptor (ownDesc ) は true である。setter を ownDesc .[[Setter]] とする。setter が undefined である場合、false を返す。? Call (setter , receiver , « value ») を実行する。 true を返す。
10.1.10 [[Delete]] ( propertyKey )
an ordinary object obj の内部メソッド [[Delete]] 。引数 propertyKey (プロパティキー )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
? OrdinaryDelete (obj , propertyKey ) を返す。
10.1.10.1 OrdinaryDelete ( obj , propertyKey )
抽象操作 OrdinaryDelete。引数 obj (Object) および propertyKey (プロパティキー )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
propertyDesc を ? obj .[[GetOwnProperty]] (propertyKey ) とする。propertyDesc が undefined である場合、true を返す。propertyDesc .[[Configurable]] が true である場合、obj から名前 propertyKey の自身のプロパティを削除する。true を返す。false を返す。
10.1.11 [[OwnPropertyKeys]] ( )
an ordinary object obj の内部メソッド [[OwnPropertyKeys]] 。引数なし。戻り値:正常完了 (値:リスト (要素:プロパティキー ))。 呼び出されると、次の手順を実行する。
OrdinaryOwnPropertyKeys (obj ) を返す。
10.1.11.1 OrdinaryOwnPropertyKeys ( obj )
抽象操作 OrdinaryOwnPropertyKeys。引数 obj (Object)。戻り値:リスト (要素:プロパティキー )。 呼び出されると、次の手順を実行する。
keys を新しい空の List とする。obj の自身のプロパティキー propertyKey のうち、propertyKey が配列インデックス であるものについて、数値インデックスの昇順で、次を行う。propertyKey を keys に追加する。obj の自身のプロパティキー propertyKey のうち、propertyKey が String であり配列インデックス ではないものについて、プロパティ作成時刻の昇順で、次を行う。propertyKey を keys に追加する。obj の自身のプロパティキー propertyKey のうち、propertyKey が Symbol であるものについて、プロパティ作成時刻の昇順で、次を行う。propertyKey を keys に追加する。keys を返す。
10.1.12 OrdinaryObjectCreate ( proto [ , additionalInternalSlotsList ] )
抽象操作 OrdinaryObjectCreate。引数 proto ((Object または null ))および省略可能な引数 additionalInternalSlotsList (リスト (要素:内部スロット名))。戻り値:Object。 新しい通常オブジェクト の実行時作成を規定するために使用されます。additionalInternalSlotsList には、[[Prototype]] および [[Extensible]] に加えて、オブジェクトの一部として定義しなければならない追加の内部スロットの名前が含まれます。additionalInternalSlotsList が提供されない場合、新しい空の List が使用されます。 呼び出されると、次の手順を実行する。
internalSlotsList を « [[Prototype]] , [[Extensible]] » とする。additionalInternalSlotsList が存在する場合、internalSlotsList を internalSlotsList と additionalInternalSlotsList のリスト連結 に設定する。obj を MakeBasicObject (internalSlotsList ) とする。obj .[[Prototype]] を proto に設定する。obj を返す。
注
OrdinaryObjectCreate は MakeBasicObject を呼び出すこと以上の処理をほとんど行いませんが、その使用は特殊オブジェクト ではなく通常オブジェクト を作成する意図を表します。そのため、この仕様内では、その後オブジェクトの内部メソッドを変更して結果が通常オブジェクト でなくなるようなアルゴリズムからは呼び出されません。特殊オブジェクト を作成する操作は MakeBasicObject を直接呼び出します。
10.1.13 OrdinaryCreateFromConstructor ( ctor , intrinsicDefaultProto [ , internalSlotsList ] )
抽象操作 OrdinaryCreateFromConstructor。引数 ctor (関数オブジェクト ) および intrinsicDefaultProto (String)および省略可能な引数 internalSlotsList (リスト (要素:内部スロット名))。戻り値:(正常完了 (値:Object) または throw 完了 )。 コンストラクター の "prototype" プロパティが存在する場合、そのプロパティから [[Prototype]] 値を取得した通常オブジェクト を作成します。それ以外の場合、intrinsicDefaultProto で指定されるイントリンシックが [[Prototype]] に使用されます。internalSlotsList には、オブジェクトの一部として定義しなければならない追加の内部スロット名が含まれます。internalSlotsList が提供されない場合、新しい空の List が使用されます。 呼び出されると、次の手順を実行する。
表明 : intrinsicDefaultProto は、この仕様におけるイントリンシックオブジェクトの名前である。対応するオブジェクトは、オブジェクトの [[Prototype]] 値として使用されることを意図したイントリンシックでなければならない。proto を ? GetPrototypeFromConstructor (ctor , intrinsicDefaultProto ) とする。internalSlotsList が存在する場合、slots を internalSlotsList とする。そうでない場合、slots を新しい空の List とする。 OrdinaryObjectCreate (proto , slots ) を返す。
10.1.14 GetPrototypeFromConstructor ( ctor , intrinsicDefaultProto )
抽象操作 GetPrototypeFromConstructor。引数 ctor (関数オブジェクト ) および intrinsicDefaultProto (String)。戻り値:(正常完了 (値:Object) または throw 完了 )。 特定のコンストラクター に対応するオブジェクトを作成する際に使用するべき [[Prototype]] 値を決定します。その値は、コンストラクター の "prototype" プロパティが存在する場合はそこから取得されます。それ以外の場合、intrinsicDefaultProto で指定されるイントリンシックが [[Prototype]] に使用されます。 呼び出されると、次の手順を実行する。
表明 : intrinsicDefaultProto は、この仕様におけるイントリンシックオブジェクトの名前である。対応するオブジェクトは、オブジェクトの [[Prototype]] 値として使用されることを意図したイントリンシックでなければならない。proto を ? Get (ctor , "prototype" ) とする。proto が Object でない場合、realm を ? GetFunctionRealm (ctor ) とする。proto を realm の intrinsicDefaultProto という名前のイントリンシックオブジェクトに設定する。proto を返す。
注
ctor が [[Prototype]] 値を提供しない場合、使用される既定値は実行中の実行コンテキスト からではなく、ctor 関数の Realm から取得されます。
10.1.15 RequireInternalSlot ( obj , internalSlot )
抽象操作 RequireInternalSlot。引数 obj (ECMAScript 言語値 ) および internalSlot (内部スロット名)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 obj が Object であり、かつ指定された内部スロットを持つ場合を除き、例外をスローします。 呼び出されると、次の手順を実行する。
obj が Object でない場合、TypeError 例外をスローする。obj が internalSlot 内部スロットを持たない場合、TypeError 例外をスローする。unused を返す。
10.2 ECMAScript 関数オブジェクト
ECMAScript 関数オブジェクト は、レキシカル環境を閉包として取り込んだパラメーター化された ECMAScript コードをカプセル化し、そのコードの動的評価をサポートします。ECMAScript 関数オブジェクト は通常オブジェクト であり、他の通常オブジェクト と同じ内部スロットと内部メソッドを持ちます。ECMAScript 関数オブジェクト のコードは strict モードコード (11.2.2 )または非 strict コード のいずれでもかまいません。コードが strict モードコード である ECMAScript 関数オブジェクト を strict 関数 と呼びます。コードが strict モードコード でないものを 非 strict 関数 と呼びます。
[[Extensible]] および [[Prototype]] に加えて、ECMAScript 関数オブジェクト は 表 26 に列挙される内部スロットも持ちます。
表 26: ECMAScript 関数オブジェクト の内部スロット
内部スロット
型
説明
[[Environment]]
an Environment Record
関数が閉包として取り込んだ Environment Record です。関数のコードを評価するときに外側の環境として使用されます。
[[PrivateEnvironment]]
a PrivateEnvironment Record or null
関数が閉包として取り込んだ Private Name の PrivateEnvironment Record です。この関数が構文上クラス内に含まれていない場合は null です。関数のコードを評価するとき、内側のクラスに対する外側の PrivateEnvironment として使用されます。
[[FormalParameters]]
a Parse Node
関数の仮引数リストを定義するソーステキストのルート Parse Node です。
[[ECMAScriptCode]]
a Parse Node
関数本体を定義するソーステキストのルート Parse Node です。
[[ConstructorKind]]
base or derived
関数が派生クラスのコンストラクター であるかどうかを示します。
[[Realm]]
a Realm Record
関数が作成された Realm であり、関数の評価中にアクセスされるイントリンシックオブジェクトを提供します。
[[ScriptOrModule]]
a Script Record or a Module Record
関数が作成されたスクリプトまたはモジュールです。
[[ThisMode]]
lexical , strict , or global
関数の仮引数およびコード本体内で this 参照をどのように解釈するかを定義します。lexical は、this がレキシカルに外側の関数の this 値を参照することを意味します。strict は、関数呼出しによって提供された this 値をそのまま使用することを意味します。global は、undefined または null の this 値をグローバルオブジェクト への参照として解釈し、その他の this 値は最初に ToObject に渡されることを意味します。
[[Strict]]
a Boolean
strict 関数 である場合は true 、非 strict 関数 である場合は false です。
[[HomeObject]]
an Object or undefined
関数が super を使用する場合、これは、その [[GetPrototypeOf]] が super プロパティ検索を開始するオブジェクトを提供するオブジェクトです。
[[SourceText]]
a sequence of Unicode code points
関数を定義するソーステキスト です。
[[Fields]]
a List of ClassFieldDefinition Records
関数がクラスである場合、クラスの非 static フィールドと対応する初期化子を表す Record のリストです。
[[PrivateMethods]]
a List of PrivateElements
関数がクラスである場合、クラスの非 static プライベートメソッドおよびアクセサーを表すリストです。
[[ClassFieldInitializerName]]
a String, a Symbol, a Private Name , or empty
関数がクラスフィールドの初期化子として作成された場合、フィールドの NamedEvaluation に使用する名前です。それ以外の場合は empty です。
[[IsClassConstructor]]
a Boolean
関数がクラスコンストラクター であるかどうかを示します。(true の場合、関数の [[Call]] を呼び出すと直ちに TypeError 例外がスローされます。)
すべての ECMAScript 関数オブジェクト は、ここで定義される [[Call]] 内部メソッドを持ちます。コンストラクター でもある ECMAScript 関数は、さらに [[Construct]] 内部メソッドも持ちます。
10.2.1 [[Call]] ( thisArg , argList )
an ECMAScript function object func の内部メソッド [[Call]] 。引数 thisArg (ECMAScript 言語値 ) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
callerContext を実行中の実行コンテキスト とする。calleeContext を PrepareForOrdinaryCall (func , undefined ) とする。表明 : calleeContext は現在、実行中の実行コンテキスト である。func .[[IsClassConstructor]] が true である場合、error を新しく作成された TypeError オブジェクトとする。注記 : error は calleeContext 内で、func に関連付けられた Realm Record を使用して作成される。calleeContext を実行コンテキストスタック から削除し、callerContext を実行中の実行コンテキスト として復元する。error をスローする。OrdinaryCallBindThis (func , calleeContext , thisArg ) を実行する。result を Completion (OrdinaryCallEvaluateBody (func , argList )) とする。calleeContext を実行コンテキストスタック から削除し、callerContext を実行中の実行コンテキスト として復元する。result がスロー完了である場合、? result を返す。表明 : result は return 完了 である。result .[[Value]] を返す。
注
手順 7 で calleeContext が実行コンテキストスタック から削除されるとき、それが中断され、アクセス可能な Generator による後の再開のため保持されている場合には、破棄してはなりません。
10.2.1.1 PrepareForOrdinaryCall ( func , newTarget )
抽象操作 PrepareForOrdinaryCall。引数 func (ECMAScript 関数オブジェクト) および newTarget ((Object または undefined ))。戻り値:実行コンテキスト 。 呼び出されると、次の手順を実行する。
callerContext を実行中の実行コンテキスト とする。calleeContext を新しい ECMAScript コード実行コンテキスト とする。calleeContext の Function を func に設定する。calleeRealm を func .[[Realm]] とする。calleeContext の Realm を calleeRealm に設定する。calleeContext の ScriptOrModule を func .[[ScriptOrModule]] に設定する。localEnv を NewFunctionEnvironment (func , newTarget ) とする。calleeContext の LexicalEnvironment を localEnv に設定する。calleeContext の VariableEnvironment を localEnv に設定する。calleeContext の PrivateEnvironment を func .[[PrivateEnvironment]] に設定する。callerContext がまだ中断されていない場合、callerContext を中断する。calleeContext を実行コンテキストスタック にプッシュする。これで calleeContext が実行中の実行コンテキスト になる。注記 : この時点以降に生成されるすべての例外オブジェクトは calleeRealm に関連付けられる。calleeContext を返す。
10.2.1.2 OrdinaryCallBindThis ( func , calleeContext , thisArg )
抽象操作 OrdinaryCallBindThis。引数 func (ECMAScript 関数オブジェクト)、calleeContext (実行コンテキスト ) および thisArg (ECMAScript 言語値 )。戻り値:unused 。 呼び出されると、次の手順を実行する。
thisMode を func .[[ThisMode]] とする。thisMode が lexical である場合、unused を返す。calleeRealm を func .[[Realm]] とする。localEnv を calleeContext の LexicalEnvironment とする。thisMode が strict である場合、thisValue を thisArg とする。そうでない場合、thisArg が undefined または null のいずれかである場合、globalEnv を calleeRealm .[[GlobalEnv]] とする。表明 : globalEnv は Global Environment Record である。thisValue を globalEnv .[[GlobalThisValue]] とする。そうでない場合、thisValue を ! ToObject (thisArg ) とする。注記 : ToObject は calleeRealm を使用してラッパーオブジェクトを生成する。 表明 : localEnv は Function Environment Record である。表明 : localEnv .[[ThisBindingStatus]] が initialized ではないため、次の手順が中断完了 を返すことはない。! BindThisValue (localEnv , thisValue ) を実行する。 unused を返す。
10.2.1.3 Runtime Semantics: EvaluateBody
構文指向操作 EvaluateBody。引数 func (ECMAScript 関数オブジェクト) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(return 完了 または throw 完了 )。 次の生成規則ごとに定義される。
FunctionBody : FunctionStatementList
引数 func および argList を指定した FunctionBody の ? EvaluateFunctionBody を返す。
ConciseBody : ExpressionBody
引数 func および argList を指定した ConciseBody の ? EvaluateConciseBody を返す。
GeneratorBody : FunctionBody
引数 func および argList を指定した GeneratorBody の ? EvaluateGeneratorBody を返す。
AsyncGeneratorBody : FunctionBody
引数 func および argList を指定した AsyncGeneratorBody の ? EvaluateAsyncGeneratorBody を返す。
AsyncFunctionBody : FunctionBody
引数 func および argList を指定した AsyncFunctionBody の ? EvaluateAsyncFunctionBody を返す。
AsyncConciseBody : ExpressionBody
引数 func および argList を指定した AsyncConciseBody の ? EvaluateAsyncConciseBody を返す。
Initializer :
=
AssignmentExpression
表明 : argList は空である。表明 : func .[[ClassFieldInitializerName]] は empty ではない。IsAnonymousFunctionDefinition (AssignmentExpression ) が true である場合、value を、引数 func .[[ClassFieldInitializerName]] を指定した Initializer の ? NamedEvaluation とする。そうでない場合、rhs を AssignmentExpression の ? Evaluation とする。value を ? GetValue (rhs ) とする。 ReturnCompletion (value ) を返す。
注
フィールド初期化子は関数境界を構成しますが、FunctionDeclarationInstantiation を呼び出しても観測可能な効果がないため、省略されています。
ClassStaticBlockBody : ClassStaticBlockStatementList
表明 : argList は空である。引数 func を指定した ClassStaticBlockBody の ? EvaluateClassStaticBlockBody を返す。
10.2.1.4 OrdinaryCallEvaluateBody ( func , argList )
抽象操作 OrdinaryCallEvaluateBody。引数 func (ECMAScript 関数オブジェクト) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(return 完了 または throw 完了 )。 呼び出されると、次の手順を実行する。
引数 func および argList を指定した func .[[ECMAScriptCode]] の ? EvaluateBody を返す。
10.2.2 [[Construct]] ( argList , newTarget )
an ECMAScript function object func の内部メソッド [[Construct]] 。引数 argList (リスト (要素:ECMAScript 言語値 )) および newTarget (コンストラクター )。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
callerContext を実行中の実行コンテキスト とする。kind を func .[[ConstructorKind]] とする。kind が base である場合、thisArg を ? OrdinaryCreateFromConstructor (newTarget , "%Object.prototype%" ) とする。calleeContext を PrepareForOrdinaryCall (func , newTarget ) とする。表明 : calleeContext は現在、実行中の実行コンテキスト である。kind が base である場合、OrdinaryCallBindThis (func , calleeContext , thisArg ) を実行する。initializeResult を Completion (InitializeInstanceElements (thisArg , func )) とする。initializeResult が中断完了 である場合、calleeContext を実行コンテキストスタック から削除し、callerContext を実行中の実行コンテキスト として復元する。? initializeResult を返す。 ctorEnv を calleeContext の LexicalEnvironment とする。result を Completion (OrdinaryCallEvaluateBody (func , argList )) とする。calleeContext を実行コンテキストスタック から削除し、callerContext を実行中の実行コンテキスト として復元する。result がスロー完了である場合、? result を返す。表明 : result は return 完了 である。result .[[Value]] が Object である場合、result .[[Value]] を返す。kind が base である場合、thisArg を返す。result .[[Value]] が undefined でない場合、TypeError 例外をスローする。thisBinding を ? ctorEnv .GetThisBinding () とする。表明 : thisBinding は Object である。thisBinding を返す。
10.2.3 OrdinaryFunctionCreate ( proto , sourceText , paramList , body , thisMode , envRecord , privateEnv )
抽象操作 OrdinaryFunctionCreate。引数 proto (Object)、sourceText (a sequence of Unicode code points)、paramList (構文解析ノード )、body (構文解析ノード )、thisMode ((lexical-this または non-lexical-this ))、envRecord (Environmentレコード ) および privateEnv ((PrivateEnvironmentレコード または null ))。戻り値:ECMAScript 関数オブジェクト。 既定の [[Call]] 内部メソッドを持ち、[[Construct]] 内部メソッドを持たない新しい関数の実行時作成を規定するために使用されます(ただし、MakeConstructor などの操作によって後から追加される場合があります)。sourceText は、作成される関数の構文上の定義のソーステキストです。 呼び出されると、次の手順を実行する。
internalSlotsList を 表 26 に列挙される内部スロットとする。func を OrdinaryObjectCreate (proto , internalSlotsList ) とする。func .[[Call]] を 10.2.1 で規定される定義に設定する。func .[[SourceText]] を sourceText に設定する。func .[[FormalParameters]] を paramList に設定する。func .[[ECMAScriptCode]] を body に設定する。strict を IsStrict (body ) とする。func .[[Strict]] を strict に設定する。thisMode が lexical-this である場合、func .[[ThisMode]] を lexical に設定する。そうでなく、strict が true である場合、func .[[ThisMode]] を strict に設定する。 そうでない場合、func .[[ThisMode]] を global に設定する。 func .[[IsClassConstructor]] を false に設定する。func .[[Environment]] を envRecord に設定する。func .[[PrivateEnvironment]] を privateEnv に設定する。func .[[ScriptOrModule]] を GetActiveScriptOrModule () に設定する。func .[[Realm]] を現在の Realm Record に設定する。func .[[HomeObject]] を undefined に設定する。func .[[Fields]] を新しい空の List に設定する。func .[[PrivateMethods]] を新しい空の List に設定する。func .[[ClassFieldInitializerName]] を empty に設定する。length を paramList の ExpectedArgumentCount とする。SetFunctionLength (func , length ) を実行する。func を返す。
10.2.4 AddRestrictedFunctionProperties ( func , realm )
抽象操作 AddRestrictedFunctionProperties。引数 func (関数オブジェクト ) および realm (Realmレコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : realm .[[Intrinsics]] .[[%ThrowTypeError% ]] は存在し、初期化済みである。thrower を realm .[[Intrinsics]] .[[%ThrowTypeError% ]] とする。! DefinePropertyOrThrow (func , "caller" , PropertyDescriptor { [[Getter]] : thrower , [[Setter]] : thrower , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 ! DefinePropertyOrThrow (func , "arguments" , PropertyDescriptor { [[Getter]] : thrower , [[Setter]] : thrower , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 unused を返す。
10.2.4.1 %ThrowTypeError% ( )
この関数は %ThrowTypeError% イントリンシックオブジェクトです。
これは、各 Realm について1回だけ定義される匿名の組込み関数オブジェクト です。
呼び出されたとき、次の手順を実行します。
TypeError 例外をスローする。
この関数の [[Extensible]] 内部スロットの値は false です。
この関数の "length" プロパティは、属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
この関数の "name" プロパティは、属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
10.2.5 MakeConstructor ( func [ , writableProto [ , proto ] ] )
抽象操作 MakeConstructor。引数 func ((ECMAScript 関数オブジェクト または 組込み関数オブジェクト))および省略可能な引数 writableProto (Boolean) および proto (Object)。戻り値:unused 。 func をコンストラクター に変換します。 呼び出されると、次の手順を実行する。
func が ECMAScript 関数オブジェクト である場合、表明 : IsConstructor (func ) は false である。表明 : func は "prototype" 自身のプロパティを持たない拡張可能なオブジェクトである。func .[[Construct]] を 10.2.2 で規定される定義に設定する。そうでない場合、func .[[Construct]] を 10.3.2 で規定される定義に設定する。 func .[[ConstructorKind]] を base に設定する。writableProto が存在しない場合、writableProto を true に設定する。proto が存在しない場合、proto を OrdinaryObjectCreate (%Object.prototype% ) に設定する。! DefinePropertyOrThrow (proto , "constructor" , PropertyDescriptor { [[Value]] : func , [[Writable]] : writableProto , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 ! DefinePropertyOrThrow (func , "prototype" , PropertyDescriptor { [[Value]] : proto , [[Writable]] : writableProto , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 unused を返す。
10.2.6 MakeClassConstructor ( func )
抽象操作 MakeClassConstructor。引数 func (ECMAScript 関数オブジェクト)。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : func .[[IsClassConstructor]] は false である。func .[[IsClassConstructor]] を true に設定する。unused を返す。
10.2.7 MakeMethod ( func , homeObj )
抽象操作 MakeMethod。引数 func (ECMAScript 関数オブジェクト) および homeObj (Object)。戻り値:unused 。 func をメソッドとして設定します。 呼び出されると、次の手順を実行する。
表明 : homeObj は通常オブジェクト である。func .[[HomeObject]] を homeObj に設定する。unused を返す。
10.2.8 DefineMethodProperty ( homeObj , name , closure , enumerable )
抽象操作 DefineMethodProperty。引数 homeObj (Object)、name ((プロパティキー または プライベート名 ))、closure (関数オブジェクト ) および enumerable (Boolean)。戻り値:(正常完了 (値:(PrivateElement または empty )) または 中途完了)。 呼び出されると、次の手順を実行する。
表明 : homeObj は通常の拡張可能なオブジェクトである。name が Private Name である場合、PrivateElement { [[Key]] : name , [[Kind]] : method , [[Value]] : closure } を返す。propertyDesc を PropertyDescriptor { [[Value]] : closure , [[Writable]] : true , [[Enumerable]] : enumerable , [[Configurable]] : true } とする。? DefinePropertyOrThrow (homeObj , name , propertyDesc ) を実行する。 注記 : DefinePropertyOrThrow が中断完了 を返すのは、name が "prototype" であるクラス static メソッドを定義しようとする場合だけである。empty を返す。
10.2.9 SetFunctionName ( func , name [ , prefix ] )
抽象操作 SetFunctionName。引数 func (関数オブジェクト ) および name ((プロパティキー または プライベート名 ))および省略可能な引数 prefix (String)。戻り値:unused 。 func に "name" プロパティを追加します。 呼び出されると、次の手順を実行する。
表明 : func は "name" 自身のプロパティを持たない拡張可能なオブジェクトである。name が Symbol である場合、description を name .[[Description]] とする。description が undefined である場合、name を空の String に設定する。そうでない場合、name を "[" 、description 、および "]" の文字列連結 に設定する。 そうでなく、name が Private Name である場合、name を name .[[Description]] に設定する。 initialName を name とする。prefix が存在する場合、prefixedName を prefix 、コード単位 0x0020 (SPACE)、および name の文字列連結 とする。initialName を prefixedName に設定する。Normative Optional, Legacy
initialName を name または prefixedName のいずれかとして実装定義 で選択する。name を prefixedName に設定する。func が [[InitialName]] 内部スロットを持つ場合、func .[[InitialName]] を initialName に設定する。! DefinePropertyOrThrow (func , "name" , PropertyDescriptor { [[Value]] : name , [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 unused を返す。
注
func .[[InitialName]] に prefixedName を使用するかどうかの選択は、Function.prototype.toString ( ) の出力に影響します。手順 5.c で異なる組込み関数ごとに異なる選択を行うことは、推奨されないレガシー 動作です。
10.2.10 SetFunctionLength ( func , length )
抽象操作 SetFunctionLength。引数 func (関数オブジェクト ) および length ((非負整数 または +∞))。戻り値:unused 。 func に "length" プロパティを追加します。 呼び出されると、次の手順を実行する。
表明 : func は "length" 自身のプロパティを持たない拡張可能なオブジェクトである。! DefinePropertyOrThrow (func , "length" , PropertyDescriptor { [[Value]] : 𝔽 (length ), [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 unused を返す。
10.2.11 FunctionDeclarationInstantiation ( func , argList )
抽象操作 FunctionDeclarationInstantiation。引数 func (ECMAScript 関数オブジェクト) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(正常完了 (値:unused ) または throw 完了 )。 func は、実行コンテキスト が確立されている関数オブジェクト です。
注
ECMAScript 関数を評価するための実行コンテキスト が確立されると、新しい Function Environment Record が作成され、各仮引数の束縛がその Environment Record にインスタンス化されます。関数本体内の各宣言もインスタンス化されます。関数の仮引数に既定値初期化子が含まれていない場合、本体の宣言は引数と同じ Environment Record にインスタンス化されます。既定値の引数初期化子が存在する場合、本体の宣言のために2つ目の Environment Record が作成されます。仮引数と関数は FunctionDeclarationInstantiation の一部として初期化されます。その他すべての束縛は、関数本体の評価中に初期化されます。
呼び出されたとき、次の手順を実行します。
calleeContext を実行中の実行コンテキスト とする。code を func .[[ECMAScriptCode]] とする。strict を func .[[Strict]] とする。formals を func .[[FormalParameters]] とする。paramNames を formals の BoundNames とする。paramNames に重複する項目がある場合、hasDuplicates を true とする。そうでない場合、hasDuplicates を false とする。simpleParamList を formals の IsSimpleParameterList とする。hasParamExprs を formals の ContainsExpression とする。variableNames を code の VarDeclaredNames とする。variableDecls を code の VarScopedDeclarations とする。lexicalNames を code の LexicallyDeclaredNames とする。funcNames を新しい空の List とする。funcsToInitialize を新しい空の List とする。variableDecls の各要素 variableDecl について、List の逆順で、次を行う。variableDecl が VariableDeclaration 、ForBinding 、BindingIdentifier のいずれでもない場合、表明 : variableDecl は FunctionDeclaration 、GeneratorDeclaration 、AsyncFunctionDeclaration 、または AsyncGeneratorDeclaration のいずれかである。funcName を variableDecl の BoundNames の唯一の要素とする。funcNames が funcName を含まない場合、funcName を funcNames の先頭要素として挿入する。注記 : 同じ名前に複数の関数宣言がある場合、最後の宣言が使用される。variableDecl を funcsToInitialize の先頭要素として挿入する。argumentsObjNeeded を true とする。func .[[ThisMode]] が lexical である場合、注記 : アロー関数は arguments オブジェクトを持たない。argumentsObjNeeded を false に設定する。そうでなく、paramNames が "arguments" を含む場合、argumentsObjNeeded を false に設定する。 そうでなく、hasParamExprs が false である場合、funcNames が "arguments" を含むか、lexicalNames が "arguments" を含む場合、argumentsObjNeeded を false に設定する。 strict が true または hasParamExprs が false である場合、注記 : strict モードコード 内の eval の呼出しは eval の外側から可視な新しい束縛を作成できないため、引数には単一の Environment Record だけでよい。envRecord を calleeContext の LexicalEnvironment とする。そうでない場合、注記 : 仮引数リスト内の direct eval 呼出しによって作成された束縛が、引数が宣言される環境の外側にあることを保証するため、別の Environment Record が必要である。calleeEnv を calleeContext の LexicalEnvironment とする。envRecord を NewDeclarativeEnvironment (calleeEnv ) とする。表明 : calleeContext の VariableEnvironment と calleeEnv は同じ Environment Record である。calleeContext の LexicalEnvironment を envRecord に設定する。 paramNames の各 String paramName について、次を行う。alreadyDeclared を ! envRecord .HasBinding (paramName ) とする。注記 : 早期エラー により、重複する引数名は、引数の既定値または rest 引数を持たない非 strict 関数 においてのみ発生し得る。alreadyDeclared が false である場合、! envRecord .CreateMutableBinding (paramName , false ) を実行する。 hasDuplicates が true である場合、! envRecord .InitializeBinding (paramName , undefined ) を実行する。 argumentsObjNeeded が true である場合、strict が true または simpleParamList が false である場合、argumentsObj を CreateUnmappedArgumentsObject (argList ) とする。そうでない場合、注記 : マップされた arguments オブジェクトは、rest 引数、引数の既定値初期化子、または分割代入された引数を持たない非 strict 関数 に対してのみ提供される。argumentsObj を CreateMappedArgumentsObject (func , formals , argList , envRecord ) とする。 strict が true である場合、! envRecord .CreateImmutableBinding ("arguments" , false ) を実行する。 注記 : strict モードコード では、早期エラー によりこの束縛への代入が禁止されるため、その可変性は観測できない。そうでない場合、! envRecord .CreateMutableBinding ("arguments" , false ) を実行する。 ! envRecord .InitializeBinding ("arguments" , argumentsObj ) を実行する。 paramBindings を paramNames と « "arguments" » のリスト連結 とする。そうでない場合、paramBindings を paramNames とする。 iteratorRecord を CreateListIteratorRecord (argList ) とする。hasDuplicates が true である場合、usedEnv を undefined とする。そうでない場合、usedEnv を envRecord とする。 注記 : 次の手順は ReturnCompletion を返すことができない。これは、式の位置でそのような完了が生じる唯一の方法は YieldExpression の使用によるものであり、これは 15.5.1 および 15.6.1 の早期エラー規則 によって引数リスト内では禁止されているためである。引数 iteratorRecord および usedEnv を指定した formals の ? IteratorBindingInitialization を実行する。 hasParamExprs が false である場合、注記 : 引数とトップレベルの var には単一の Environment Record だけでよい。instantiatedVariableNames を List paramBindings のコピーとする。variableNames の各要素 name について、次を行う。instantiatedVariableNames が name を含まない場合、name を instantiatedVariableNames に追加する。! envRecord .CreateMutableBinding (name , false ) を実行する。 ! envRecord .InitializeBinding (name , undefined ) を実行する。 variableEnv を envRecord とする。そうでない場合、注記 : 仮引数リスト内の式によって作成されたクロージャから関数本体内の宣言が見えないことを保証するため、別の Environment Record が必要である。variableEnv を NewDeclarativeEnvironment (envRecord ) とする。calleeContext の VariableEnvironment を variableEnv に設定する。instantiatedVariableNames を新しい空の List とする。variableNames の各要素 name について、次を行う。instantiatedVariableNames が name を含まない場合、name を instantiatedVariableNames に追加する。! variableEnv .CreateMutableBinding (name , false ) を実行する。 paramBindings が name を含まないか、funcNames が name を含む場合、initialValue を undefined とする。そうでない場合、initialValue を ! envRecord .GetBindingValue (name , false ) とする。 ! variableEnv .InitializeBinding (name , initialValue ) を実行する。 注記 : 仮引数と同じ名前を持つ var は、初期状態では対応する初期化済み引数と同じ値を持つ。 strict が true である場合、lexicalEnv を variableEnv とする。そうでない場合、Normative Optional
ホスト が Web ブラウザーであるか、その他の方法で ブロックレベル関数宣言の Web Legacy 互換性意味論 をサポートする場合、code Contains x が true であるような任意の Block 、CaseClause 、または DefaultClause x の StatementList に直接含まれる各 FunctionDeclaration funcDecl について、次を行う。funcName を funcDecl の BindingIdentifier の StringValue とする。FunctionDeclaration funcDecl を、BindingIdentifier として funcName を持つ VariableStatement に置換しても func に対する早期エラー が生成されず、かつ paramNames が funcName を含まない場合、注記 : funcName の var 束縛は、それが VarDeclaredName、仮引数の名前、または別の FunctionDeclaration の名前のいずれでもない場合にのみ、ここでインスタンス化される。instantiatedVariableNames が funcName を含まず、funcName が "arguments" でない場合、! variableEnv .CreateMutableBinding (funcName , false ) を実行する。 ! variableEnv .InitializeBinding (funcName , undefined ) を実行する。 funcName を instantiatedVariableNames に追加する。FunctionDeclaration funcDecl が評価されるとき、15.2.6 で提供される FunctionDeclaration Evaluation アルゴリズムの代わりに、次の手順を実行する。funcEnv を実行中の実行コンテキスト の VariableEnvironment とする。blockEnv を実行中の実行コンテキスト の LexicalEnvironment とする。funcObj を ! blockEnv .GetBindingValue (funcName , false ) とする。! funcEnv .SetMutableBinding (funcName , funcObj , false ) を実行する。 unused を返す。lexicalEnv を NewDeclarativeEnvironment (variableEnv ) とする。注記 : 非 strict 関数 はトップレベルのレキシカル宣言に別個の Environment Record を使用する。これにより、direct eval は eval コードによって導入された var スコープ宣言が、既存のトップレベルのレキシカルスコープ宣言と競合 するかどうかを判定できる。strict direct eval は常にすべての宣言を新しい Environment Record に配置するため、strict 関数 ではこれは不要である。 calleeContext の LexicalEnvironment を lexicalEnv に設定する。lexicalDecls を code の LexicallyScopedDeclarations とする。lexicalDecls の各要素 lexicalDecl について、次を行う。注記 : レキシカル宣言された名前は、関数/ジェネレーター宣言、仮引数、または var 名と同じにはなれない。レキシカル宣言された名前は、ここではインスタンス化されるだけで初期化されない。lexicalDecl の BoundNames の各要素 name について、次を行う。lexicalDecl の IsConstantDeclaration が true である場合、! lexicalEnv .CreateImmutableBinding (name , true ) を実行する。 そうでない場合、! lexicalEnv .CreateMutableBinding (name , false ) を実行する。 privateEnv を calleeContext の PrivateEnvironment とする。funcsToInitialize の各 Parse Node funcDecl について、次を行う。funcName を funcDecl の BoundNames の唯一の要素とする。funcObj を、引数 lexicalEnv および privateEnv を指定した funcDecl の InstantiateFunctionObject とする。! variableEnv .SetMutableBinding (funcName , funcObj , false ) を実行する。 unused を返す。
10.3 組込み関数オブジェクト
組込み関数オブジェクト は通常オブジェクト であり、10.1 で規定される通常オブジェクト の要件を満たさなければなりません。
すべての通常オブジェクト に必要な内部スロット(10.1 を参照)に加えて、組込み関数オブジェクト は次の内部スロットも持たなければなりません。
特に指定されていない限り、組込み関数オブジェクト の [[Prototype]] 内部スロットの初期値は %Function.prototype% です。
組込み関数オブジェクト は、10.3.1 の定義に適合する [[Call]] 内部メソッドを持たなければなりません。
組込み関数オブジェクト が [[Construct]] 内部メソッドを持つのは、それが「constructor」と記述されている場合、またはこの仕様内の何らかのアルゴリズムがその [[Construct]] 内部メソッドを明示的に設定する場合に限ります。そのような [[Construct]] 内部メソッドは、10.3.2 の定義に適合しなければなりません。
実装は、この仕様で定義されていない追加の組込み関数オブジェクト を提供してもかまいません。
10.3.1 [[Call]] ( thisArg , argList )
a built-in function object func の内部メソッド [[Call]] 。引数 thisArg (ECMAScript 言語値 ) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
? BuiltinCallOrConstruct (func , thisArg , argList , undefined ) を返す。
10.3.2 [[Construct]] ( argList , newTarget )
a built-in function object func (when the method is present)の内部メソッド [[Construct]] 。引数 argList (リスト (要素:ECMAScript 言語値 )) および newTarget (コンストラクター )。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
result を ? BuiltinCallOrConstruct (func , uninitialized , argList , newTarget ) とする。表明 : result は Object である。result を返す。
10.3.3 BuiltinCallOrConstruct ( func , thisArg , argList , newTarget )
抽象操作 BuiltinCallOrConstruct。引数 func (組込み関数オブジェクト)、thisArg ((ECMAScript 言語値 または uninitialized ))、argList (リスト (要素:ECMAScript 言語値 )) および newTarget ((コンストラクター または undefined ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
callerContext を実行中の実行コンテキスト とする。callerContext がまだ中断されていない場合、callerContext を中断する。calleeContext を新しい実行コンテキスト とする。calleeContext の Function を func に設定する。calleeRealm を func .[[Realm]] とする。calleeContext の Realm を calleeRealm に設定する。calleeContext の ScriptOrModule を null に設定する。calleeContext に必要な実装定義 の初期化を実行する。calleeContext を実行コンテキストスタック にプッシュする。これで calleeContext が実行中の実行コンテキスト になる。func .[[Async]] が true である場合、promiseCapability を ! NewPromiseCapability (%Promise% ) とする。resultsClosure を、パラメーターを持たず、func 、thisArg 、argList 、および newTarget を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。result を、func の仕様に適合する方法で func を評価した結果 である Completion Record とする。thisArg が uninitialized である場合、this 値は初期化されていない。そうでない場合、thisArg が this 値を提供する。argList が名前付きパラメーターを提供する。newTarget が NewTarget 値を提供する。注記 : func がこの文書で定義されている場合、「func の仕様」とは、アルゴリズム手順またはその他の手段によって規定されたその動作である。Completion (result ) を返す。AsyncFunctionStart (promiseCapability , resultsClosure ) を実行する。calleeContext を実行コンテキストスタック から削除し、callerContext を実行中の実行コンテキスト として復元する。promiseCapability .[[Promise]] を返す。result を、func の仕様に適合する方法で func を評価した結果 である Completion Record とする。thisArg が uninitialized である場合、this 値は初期化されていない。そうでない場合、thisArg が this 値を提供する。argList が名前付きパラメーターを提供する。newTarget が NewTarget 値を提供する。注記 : func がこの文書で定義されている場合、「func の仕様」とは、アルゴリズム手順またはその他の手段によって規定されたその動作である。calleeContext を実行コンテキストスタック から削除し、callerContext を実行中の実行コンテキスト として復元する。? result を返す。
注
calleeContext が実行コンテキストスタック から削除されるとき、それが中断され、アクセス可能な Generator による後の再開のため保持されている場合には、破棄してはなりません。
10.3.4 CreateBuiltinFunction ( behaviour , length , name , additionalInternalSlotsList [ , realm [ , proto [ , prefix [ , async ] ] ] ] )
抽象操作 CreateBuiltinFunction。引数 behaviour ((抽象クロージャ 、a set of algorithm steps または some other definition of a function's behaviour provided in this specification))、length ((非負整数 または +∞))、name ((プロパティキー または プライベート名 )) および additionalInternalSlotsList (リスト (要素:内部スロット名))および省略可能な引数 realm (Realmレコード )、proto ((Object または null ))、prefix (String) および async (Boolean)。戻り値:組込み関数オブジェクト。 additionalInternalSlotsList には、オブジェクトの一部として定義しなければならない追加の内部スロット名が含まれます。この操作は組込み関数オブジェクト を作成します。 呼び出されると、次の手順を実行する。
realm が存在しない場合、realm を現在の Realm Record に設定する。proto が存在しない場合、proto を realm .[[Intrinsics]] .[[%Function.prototype% ]] に設定する。async が存在しない場合、async を false に設定する。internalSlotsList を、これから作成される組込み関数オブジェクト について 10.3 が要求するすべての内部スロット名を含む List とする。additionalInternalSlotsList の要素を internalSlotsList に追加する。func を新しい組込み関数オブジェクト とする。このオブジェクトは呼び出されると、提供された引数を behaviour で規定された対応するパラメーターの値として使用して、behaviour によって記述された動作を実行する。新しい関数オブジェクト は、名前が internalSlotsList の要素である内部スロットと、[[InitialName]] 内部スロットを持つ。func .[[Async]] を async に設定する。func .[[Prototype]] を proto に設定する。func .[[Extensible]] を true に設定する。func .[[Realm]] を realm に設定する。func .[[InitialName]] を null に設定する。SetFunctionLength (func , length ) を実行する。prefix が存在しない場合、SetFunctionName (func , name ) を実行する。そうでない場合、SetFunctionName (func , name , prefix ) を実行する。 func を返す。
この仕様で定義される各組込み関数は、CreateBuiltinFunction 抽象操作 を呼び出すことによって作成されます。
10.4 組込み特殊オブジェクトの内部メソッドとスロット
この仕様では、いくつかの種類の組込み特殊オブジェクト を定義します。これらのオブジェクトは、いくつかの特定の状況を除いて、通常オブジェクト と概ね同様に動作します。以下の特殊オブジェクト は、以下で明示的に別途規定されている場合を除き、通常オブジェクト の内部メソッドを使用します。
10.4.1 束縛関数特殊オブジェクト
束縛関数特殊オブジェクト は、別の関数オブジェクト をラップする特殊オブジェクト です。束縛関数特殊オブジェクト は呼出し可能です([[Call]] 内部メソッドを持ち、[[Construct]] 内部メソッドを持つ場合があります)。束縛関数特殊オブジェクト を呼び出すと、通常はそれがラップしている関数が呼び出されます。
オブジェクトの [[Call]] および(該当する場合)[[Construct]] 内部メソッドが以下の実装を使用し、その他の必須内部メソッドが 10.1 にある定義を使用する場合、そのオブジェクトは 束縛関数特殊オブジェクト です。これらのメソッドは BoundFunctionCreate でインストールされます。
束縛関数特殊オブジェクト は、表 26 に列挙された ECMAScript 関数オブジェクト の内部スロットを持ちません。その代わり、[[Prototype]] および [[Extensible]] に加えて、表 27 に列挙される内部スロットを持ちます。
表 27: 束縛関数特殊オブジェクト の内部スロット
内部スロット
型
説明
[[BoundTargetFunction]]
a callable Object
ラップされる関数オブジェクト です。
[[BoundThis]]
an ECMAScript language value
ラップされた関数を呼び出すときに常に this 値として渡される値です。
[[BoundArguments]]
a List of ECMAScript language values
ラップされた関数の任意の呼出しに対する先頭の引数として使用される値を要素とする List です。
10.4.1.1 [[Call]] ( thisArg , argList )
a bound function exotic object func の内部メソッド [[Call]] 。引数 thisArg (ECMAScript 言語値 ) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
target を func .[[BoundTargetFunction]] とする。boundThis を func .[[BoundThis]] とする。boundArgs を func .[[BoundArguments]] とする。args を boundArgs と argList のリスト連結 とする。? Call (target , boundThis , args ) を返す。
10.4.1.2 [[Construct]] ( argList , newTarget )
a bound function exotic object func の内部メソッド [[Construct]] 。引数 argList (リスト (要素:ECMAScript 言語値 )) および newTarget (コンストラクター )。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
target を func .[[BoundTargetFunction]] とする。表明 : IsConstructor (target ) は true である。boundArgs を func .[[BoundArguments]] とする。args を boundArgs と argList のリスト連結 とする。SameValue (func , newTarget ) が true である場合、newTarget を target に設定する。? Construct (target , args , newTarget ) を返す。
10.4.1.3 BoundFunctionCreate ( targetFunc , boundThis , boundArgs )
抽象操作 BoundFunctionCreate。引数 targetFunc (関数オブジェクト )、boundThis (ECMAScript 言語値 ) および boundArgs (リスト (要素:ECMAScript 言語値 ))。戻り値:(正常完了 (値:関数オブジェクト ) または throw 完了 )。 新しい束縛関数特殊オブジェクト の作成を規定するために使用されます。 呼び出されると、次の手順を実行する。
proto を ? targetFunc .[[GetPrototypeOf]] () とする。internalSlotsList を « [[Prototype]] , [[Extensible]] » と 表 27 に列挙される内部スロットのリスト連結 とする。obj を MakeBasicObject (internalSlotsList ) とする。obj .[[Prototype]] を proto に設定する。obj .[[Call]] を 10.4.1.1 で規定されるとおりに設定する。IsConstructor (targetFunc ) が true である場合、obj .[[Construct]] を 10.4.1.2 で規定されるとおりに設定する。obj .[[BoundTargetFunction]] を targetFunc に設定する。obj .[[BoundThis]] を boundThis に設定する。obj .[[BoundArguments]] を boundArgs に設定する。obj を返す。
10.4.2 Array 特殊オブジェクト
Array は、配列インデックス のプロパティキー (6.1.7 を参照)を特別に扱う特殊オブジェクト です。プロパティ名 が配列インデックス であるプロパティは要素 とも呼ばれます。すべての Array は構成不可の "length" プロパティを持ち、その値は常に数学的値 が 232 より厳密に小さい非負の整数 Number です。"length" プロパティの値は、名前が配列インデックス であるすべての自身のプロパティ名 より数値的に大きくなります。Array の自身のプロパティが作成または変更されるたびに、この不変条件を維持するため、必要に応じて他のプロパティが調整されます。具体的には、名前が配列インデックス である自身のプロパティが追加されるたびに、必要であれば "length" プロパティの値がその配列インデックス の数値より1大きい値に変更されます。また、"length" プロパティの値が変更されるたびに、新しい長さ以上の値を持つ配列インデックス 名の自身のプロパティはすべて削除されます。この制約は Array 自身のプロパティにのみ適用され、そのプロトタイプから継承される可能性がある "length" または配列インデックス プロパティの影響を受けません。
オブジェクトの [[DefineOwnProperty]] 内部メソッドが以下の実装を使用し、その他の必須内部メソッドが 10.1 にある定義を使用する場合、そのオブジェクトは Array 特殊オブジェクト (または単に Array)です。これらのメソッドは ArrayCreate でインストールされます。
10.4.2.1 [[DefineOwnProperty]] ( propertyKey , propertyDesc )
an Array exotic object array の内部メソッド [[DefineOwnProperty]] 。引数 propertyKey (プロパティキー ) および propertyDesc (プロパティ記述子 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
propertyKey が "length" である場合、? ArraySetLength (array , propertyDesc ) を返す。propertyKey が配列インデックス である場合、lengthDesc を OrdinaryGetOwnProperty (array , "length" ) とする。表明 : lengthDesc は undefined ではない。表明 : IsDataDescriptor (lengthDesc ) は true である。表明 : lengthDesc .[[Configurable]] は false である。length を lengthDesc .[[Value]] とする。表明 : length は非負の整数 Number である。index を ! ToUint32 (propertyKey ) とする。index ≥ length かつ lengthDesc .[[Writable]] が false である場合、false を返す。succeeded を ! OrdinaryDefineOwnProperty (array , propertyKey , propertyDesc ) とする。succeeded が false である場合、false を返す。index ≥ length である場合、lengthDesc .[[Value]] を index + 1 𝔽 に設定する。succeeded を ! OrdinaryDefineOwnProperty (array , "length" , lengthDesc ) に設定する。表明 : succeeded は true である。true を返す。? OrdinaryDefineOwnProperty (array , propertyKey , propertyDesc ) を返す。
10.4.2.2 ArrayCreate ( length [ , proto ] )
抽象操作 ArrayCreate。引数 length (非負整数)および省略可能な引数 proto (Object)。戻り値:(正常完了 (値:Arrayエキゾチックオブジェクト) または throw 完了 )。 新しい Array の作成を規定するために使用されます。 呼び出されると、次の手順を実行する。
length > 232 - 1 である場合、RangeError 例外をスローする。proto が存在しない場合、proto を %Array.prototype% に設定する。array を MakeBasicObject (« [[Prototype]] , [[Extensible]] ») とする。array .[[Prototype]] を proto に設定する。array .[[DefineOwnProperty]] を 10.4.2.1 で規定されるとおりに設定する。! OrdinaryDefineOwnProperty (array , "length" , PropertyDescriptor { [[Value]] : 𝔽 (length ), [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 array を返す。
10.4.2.3 ArraySpeciesCreate ( originalArray , length )
抽象操作 ArraySpeciesCreate。引数 originalArray (Object) および length (非負整数)。戻り値:(正常完了 (値:Object) または throw 完了 )。 originalArray から派生したコンストラクター 関数を使用して、新しい Array または類似オブジェクトを作成することを規定するために使用されます。コンストラクター 関数が Array を返すことは強制しません。 呼び出されると、次の手順を実行する。
isArray を ? IsArray (originalArray ) とする。isArray が false である場合、? ArrayCreate (length ) を返す。ctor を ? Get (originalArray , "constructor" ) とする。IsConstructor (ctor ) が true である場合、thisRealm を現在の Realm Record とする。ctorRealm を ? GetFunctionRealm (ctor ) とする。thisRealm と ctorRealm が同じ Realm Record でない場合、SameValue (ctor , ctorRealm .[[Intrinsics]] .[[%Array% ]]) が true である場合、ctor を undefined に設定する。ctor が Object である場合、ctor を ? Get (ctor , %Symbol.species% ) に設定する。ctor が null である場合、ctor を undefined に設定する。ctor が undefined である場合、? ArrayCreate (length ) を返す。IsConstructor (ctor ) が false である場合、TypeError 例外をスローする。? Construct (ctor , « 𝔽 (length ) ») を返す。
注
originalArray が実行中の実行コンテキスト の Realm ではない Realm の標準組込み Array コンストラクター を使用して作成された場合、新しい Array は実行中の実行コンテキスト の Realm を使用して作成されます。これにより、現在 ArraySpeciesCreate を使用して定義されている Array.prototype メソッドについて、歴史的にその動作を持っていた Web ブラウザーとの互換性が維持されます。
10.4.2.4 ArraySetLength ( array , propertyDesc )
抽象操作 ArraySetLength。引数 array (Array) および propertyDesc (プロパティ記述子 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
propertyDesc が [[Value]] フィールドを持たない場合、! OrdinaryDefineOwnProperty (array , "length" , propertyDesc ) を返す。 newLengthDesc を propertyDesc のコピーとする。newLength を ? ToUint32 (propertyDesc .[[Value]] ) とする。numberLength を ? ToNumber (propertyDesc .[[Value]] ) とする。SameValueZero (newLength , numberLength ) が false である場合、RangeError 例外をスローする。newLengthDesc .[[Value]] を newLength に設定する。oldLengthDesc を OrdinaryGetOwnProperty (array , "length" ) とする。表明 : oldLengthDesc は undefined ではない。表明 : IsDataDescriptor (oldLengthDesc ) は true である。表明 : oldLengthDesc .[[Configurable]] は false である。oldLength を oldLengthDesc .[[Value]] とする。newLength ≥ oldLength である場合、! OrdinaryDefineOwnProperty (array , "length" , newLengthDesc ) を返す。 oldLengthDesc .[[Writable]] が false である場合、false を返す。newLengthDesc が [[Writable]] フィールドを持たないか、newLengthDesc .[[Writable]] が true である場合、newWritable を true とする。そうでない場合、注記 : 要素を削除できない場合に備え、[[Writable]] 属性を false に設定するのを遅延する。newWritable を false とする。newLengthDesc .[[Writable]] を true に設定する。 succeeded を ! OrdinaryDefineOwnProperty (array , "length" , newLengthDesc ) とする。succeeded が false である場合、false を返す。array の自身のプロパティキー propertyKey のうち、propertyKey が配列インデックス であり、! ToUint32 (propertyKey ) ≥ newLength であるものについて、数値インデックスの降順で、次を行う。deleteSucceeded を ! array .[[Delete]] (propertyKey ) とする。deleteSucceeded が false である場合、newLengthDesc .[[Value]] を ! ToUint32 (propertyKey ) + 1 𝔽 に設定する。newWritable が false である場合、newLengthDesc .[[Writable]] を false に設定する。! OrdinaryDefineOwnProperty (array , "length" , newLengthDesc ) を実行する。 false を返す。newWritable が false である場合、succeeded を ! OrdinaryDefineOwnProperty (array , "length" , PropertyDescriptor { [[Writable]] : false }) に設定する。表明 : succeeded は true である。true を返す。
注
手順 3 および 4 において、propertyDesc .[[Value]] がオブジェクトである場合、その valueOf メソッドは2回呼び出されます。これは、この仕様の第2版からこの効果を持つものとして規定されているレガシー 動作です。
10.4.3 String 特殊オブジェクト
String オブジェクトは、String 値をカプセル化し、その String 値の個々のコード単位要素に対応する仮想的な整数インデックス 付きデータプロパティ を公開する特殊オブジェクト です。String 特殊オブジェクト は常に "length" という名前のデータプロパティ を持ち、その値はカプセル化された String 値の長さです。コード単位データプロパティ と "length" プロパティはどちらも書込み不可かつ構成不可です。
オブジェクトの [[GetOwnProperty]] 、[[DefineOwnProperty]] 、および [[OwnPropertyKeys]] 内部メソッドが以下の実装を使用し、その他の必須内部メソッドが 10.1 にある定義を使用する場合、そのオブジェクトは String 特殊オブジェクト (または単に String オブジェクト)です。これらのメソッドは StringCreate でインストールされます。
String 特殊オブジェクト は通常オブジェクト と同じ内部スロットを持ちます。さらに [[StringData]] 内部スロットも持ちます。
10.4.3.1 [[GetOwnProperty]] ( propertyKey )
a String exotic object string の内部メソッド [[GetOwnProperty]] 。引数 propertyKey (プロパティキー )。戻り値:正常完了 (値:(プロパティ記述子 または undefined ))。 呼び出されると、次の手順を実行する。
propertyDesc を OrdinaryGetOwnProperty (string , propertyKey ) とする。propertyDesc が undefined でない場合、propertyDesc を返す。StringGetOwnProperty (string , propertyKey ) を返す。
10.4.3.2 [[DefineOwnProperty]] ( propertyKey , propertyDesc )
a String exotic object string の内部メソッド [[DefineOwnProperty]] 。引数 propertyKey (プロパティキー ) および propertyDesc (プロパティ記述子 )。戻り値:正常完了 (値:Boolean)。 呼び出されると、次の手順を実行する。
stringDesc を StringGetOwnProperty (string , propertyKey ) とする。stringDesc が undefined でない場合、extensible を string .[[Extensible]] とする。IsCompatiblePropertyDescriptor (extensible , propertyDesc , stringDesc ) を返す。! OrdinaryDefineOwnProperty (string , propertyKey , propertyDesc ) を返す。
10.4.3.3 [[OwnPropertyKeys]] ( )
a String exotic object obj の内部メソッド [[OwnPropertyKeys]] 。引数なし。戻り値:正常完了 (値:リスト (要素:プロパティキー ))。 呼び出されると、次の手順を実行する。
keys を新しい空の List とする。string を obj .[[StringData]] とする。表明 : string は String である。length を string の長さとする。0 ≤ i < length を満たす各整数 i について、昇順で、次を行う。! ToString (𝔽 (i )) を keys に追加する。 obj の自身のプロパティキー propertyKey のうち、propertyKey が配列インデックス であり、! ToIntegerOrInfinity (propertyKey ) ≥ length であるものについて、数値インデックスの昇順で、次を行う。propertyKey を keys に追加する。obj の自身のプロパティキー propertyKey のうち、propertyKey が String であり配列インデックス ではないものについて、プロパティ作成時刻の昇順で、次を行う。propertyKey を keys に追加する。obj の自身のプロパティキー propertyKey のうち、propertyKey が Symbol であるものについて、プロパティ作成時刻の昇順で、次を行う。propertyKey を keys に追加する。keys を返す。
10.4.3.4 StringCreate ( value , proto )
抽象操作 StringCreate。引数 value (String) および proto (Object)。戻り値:Stringエキゾチックオブジェクト。 新しい String 特殊オブジェクト の作成を規定するために使用されます。 呼び出されると、次の手順を実行する。
string を MakeBasicObject (« [[Prototype]] , [[Extensible]] , [[StringData]] ») とする。string .[[Prototype]] を proto に設定する。string .[[StringData]] を value に設定する。string .[[GetOwnProperty]] を 10.4.3.1 で規定されるとおりに設定する。string .[[DefineOwnProperty]] を 10.4.3.2 で規定されるとおりに設定する。string .[[OwnPropertyKeys]] を 10.4.3.3 で規定されるとおりに設定する。length を value の長さとする。! DefinePropertyOrThrow (string , "length" , PropertyDescriptor { [[Value]] : 𝔽 (length ), [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 string を返す。
10.4.3.5 StringGetOwnProperty ( string , propertyKey )
抽象操作 StringGetOwnProperty。引数 string (Stringエキゾチックオブジェクト) および propertyKey (プロパティキー )。戻り値:(プロパティ記述子 または undefined )。 呼び出されると、次の手順を実行する。
propertyKey が String でない場合、undefined を返す。numericIndex を CanonicalNumericIndexString (propertyKey ) とする。numericIndex が整数 Number でない場合、undefined を返す。numericIndex が -0 𝔽 であるか、numericIndex < -0 𝔽 である場合、undefined を返す。stringData を string .[[StringData]] とする。表明 : stringData は String である。length を stringData の長さとする。ℝ (numericIndex ) ≥ length である場合、undefined を返す。resultString を stringData の ℝ (numericIndex ) から ℝ (numericIndex ) + 1 までの部分文字列 とする。PropertyDescriptor { [[Value]] : resultString , [[Writable]] : false , [[Enumerable]] : true , [[Configurable]] : false } を返す。
10.4.4 Arguments 特殊オブジェクト
ほとんどの ECMAScript 関数は、そのコードから arguments オブジェクトを利用できるようにします。関数定義の特性に応じて、その arguments オブジェクトは通常オブジェクト または arguments 特殊オブジェクト のいずれかです。arguments 特殊オブジェクト は、その配列インデックス プロパティが、関連付けられた ECMAScript 関数の呼出しの仮引数束縛に対応付けられる特殊オブジェクト です。
オブジェクトの内部メソッドが以下の実装を使用し、ここで規定されていないものについて 10.1 にある定義を使用する場合、そのオブジェクトは arguments 特殊オブジェクト です。これらのメソッドは CreateMappedArgumentsObject でインストールされます。
注 1
arguments 特殊オブジェクト は通常オブジェクト と同じ内部スロットを持ちます。さらに [[ParameterMap]] 内部スロットも持ちます。通常の arguments オブジェクトも [[ParameterMap]] 内部スロットを持ち、その値は常に undefined です。通常の arguments オブジェクトでは、[[ParameterMap]] 内部スロットは Object.prototype.toString(20.1.3.6 )によってそれらを arguments オブジェクトとして識別するためだけに使用されます。
注 2
arguments 特殊オブジェクト の整数インデックス 付きデータプロパティ のうち、数値名の値が対応する関数オブジェクト の仮引数の数より小さいものは、初期状態では関数の実行コンテキスト 内の対応する引数束縛と値を共有します。これは、そのプロパティを変更すると対応する引数束縛の値も変更され、その逆も同様であることを意味します。この対応関係は、そのようなプロパティが削除された後で再定義された場合、またはそのプロパティがアクセサープロパティ に変更された場合に失われます。arguments オブジェクトが通常オブジェクト である場合、そのプロパティ値は単に関数に渡された引数のコピーであり、プロパティ値と仮引数値の間に動的な関連はありません。
注 3
ParameterMap オブジェクトとそのプロパティ値は、arguments オブジェクトと引数束縛との対応関係を規定するための仕組みとして使用されます。ParameterMap オブジェクトおよびそのプロパティ値であるオブジェクトは、ECMAScript コードから直接観測できません。ECMAScript 実装は、規定された意味論を実装するためにそのようなオブジェクトを実際に作成または使用する必要はありません。
注 4
通常の arguments オブジェクトは、"callee" という名前の構成不可のアクセサープロパティ を定義し、アクセス時に TypeError 例外をスローします。"callee" プロパティは、一部の非 strict 関数 クラスに対してのみ作成される arguments 特殊オブジェクト では、より具体的な意味を持ちます。通常版でこのプロパティを定義するのは、適合する ECMAScript 実装によって他の方法で定義されないことを保証するためです。
注 5
arguments 特殊オブジェクト の ECMAScript 実装には、歴史的に "caller" という名前のアクセサープロパティ が含まれていました。ECMAScript 2017 より前、この仕様には通常の arguments オブジェクト上で例外をスローする "caller" プロパティの定義が含まれていました。実装がもはやこの拡張を含まなくなったため、ECMAScript 2017 では例外をスローする "caller" アクセサーの要件が削除されました。
10.4.4.1 [[GetOwnProperty]] ( propertyKey )
an arguments exotic object args の内部メソッド [[GetOwnProperty]] 。引数 propertyKey (プロパティキー )。戻り値:正常完了 (値:(プロパティ記述子 または undefined ))。 呼び出されると、次の手順を実行する。
propertyDesc を OrdinaryGetOwnProperty (args , propertyKey ) とする。propertyDesc が undefined である場合、undefined を返す。map を args .[[ParameterMap]] とする。isMapped を ! HasOwnProperty (map , propertyKey ) とする。isMapped が true である場合、propertyDesc .[[Value]] を ! Get (map , propertyKey ) に設定する。propertyDesc を返す。
10.4.4.2 [[DefineOwnProperty]] ( propertyKey , propertyDesc )
an arguments exotic object args の内部メソッド [[DefineOwnProperty]] 。引数 propertyKey (プロパティキー ) および propertyDesc (プロパティ記述子 )。戻り値:正常完了 (値:Boolean)。 呼び出されると、次の手順を実行する。
map を args .[[ParameterMap]] とする。isMapped を ! HasOwnProperty (map , propertyKey ) とする。newArgDesc を propertyDesc とする。isMapped が true かつ IsDataDescriptor (propertyDesc ) が true である場合、propertyDesc が [[Value]] フィールドを持たず、propertyDesc が [[Writable]] フィールドを持ち、propertyDesc .[[Writable]] が false である場合、newArgDesc を propertyDesc のコピーに設定する。newArgDesc .[[Value]] を ! Get (map , propertyKey ) に設定する。allowed を ! OrdinaryDefineOwnProperty (args , propertyKey , newArgDesc ) とする。allowed が false である場合、false を返す。isMapped が true である場合、IsAccessorDescriptor (propertyDesc ) が true である場合、! map .[[Delete]] (propertyKey ) を実行する。 そうでない場合、propertyDesc が [[Value]] フィールドを持つ場合、表明 : arguments オブジェクトによってマップされる仮引数は常に書込み可能であるため、次の Set は成功する。! Set (map , propertyKey , propertyDesc .[[Value]] , false ) を実行する。 propertyDesc が [[Writable]] フィールドを持ち、propertyDesc .[[Writable]] が false である場合、! map .[[Delete]] (propertyKey ) を実行する。 true を返す。
10.4.4.3 [[Get]] ( propertyKey , receiver )
an arguments exotic object args の内部メソッド [[Get]] 。引数 propertyKey (プロパティキー ) および receiver (ECMAScript 言語値 )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
map を args .[[ParameterMap]] とする。isMapped を ! HasOwnProperty (map , propertyKey ) とする。isMapped が false である場合、? OrdinaryGet (args , propertyKey , receiver ) を返す。表明 : map は propertyKey に対する仮引数の対応付けを含む。! Get (map , propertyKey ) を返す。
10.4.4.4 [[Set]] ( propertyKey , value , receiver )
an arguments exotic object args の内部メソッド [[Set]] 。引数 propertyKey (プロパティキー )、value (ECMAScript 言語値 ) および receiver (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
SameValue (args , receiver ) が false である場合、isMapped を false とする。そうでない場合、map を args .[[ParameterMap]] とする。isMapped を ! HasOwnProperty (map , propertyKey ) とする。 isMapped が true である場合、表明 : arguments オブジェクトによってマップされる仮引数は常に書込み可能であるため、次の Set は成功する。! Set (map , propertyKey , value , false ) を実行する。 ? OrdinarySet (args , propertyKey , value , receiver ) を返す。
10.4.4.5 [[Delete]] ( propertyKey )
an arguments exotic object args の内部メソッド [[Delete]] 。引数 propertyKey (プロパティキー )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
map を args .[[ParameterMap]] とする。isMapped を ! HasOwnProperty (map , propertyKey ) とする。result を ? OrdinaryDelete (args , propertyKey ) とする。result が true かつ isMapped が true である場合、! map .[[Delete]] (propertyKey ) を実行する。 result を返す。
10.4.4.6 CreateUnmappedArgumentsObject ( argList )
抽象操作 CreateUnmappedArgumentsObject。引数 argList (リスト (要素:ECMAScript 言語値 ))。戻り値:通常オブジェクト 。 呼び出されると、次の手順を実行する。
length を argList の要素数とする。obj を OrdinaryObjectCreate (%Object.prototype% , « [[ParameterMap]] ») とする。obj .[[ParameterMap]] を undefined に設定する。! DefinePropertyOrThrow (obj , "length" , PropertyDescriptor { [[Value]] : 𝔽 (length ), [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 index を 0 とする。index < length の間、次を繰り返す。value を argList [index ] とする。! CreateDataPropertyOrThrow (obj , ! ToString (𝔽 (index )), value ) を実行する。 index を index + 1 に設定する。! DefinePropertyOrThrow (obj , %Symbol.iterator% , PropertyDescriptor { [[Value]] : %Array.prototype.values%, [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 ! DefinePropertyOrThrow (obj , "callee" , PropertyDescriptor { [[Getter]] : %ThrowTypeError% , [[Setter]] : %ThrowTypeError% , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 obj を返す。
10.4.4.7 CreateMappedArgumentsObject ( func , formals , argList , envRecord )
抽象操作 CreateMappedArgumentsObject。引数 func (ECMAScript 関数オブジェクト)、formals (構文解析ノード )、argList (リスト (要素:ECMAScript 言語値 )) および envRecord (Environmentレコード )。戻り値:argumentsエキゾチックオブジェクト。 呼び出されると、次の手順を実行する。
表明 : formals は rest 引数、束縛パターン、または初期化子を含まない。重複する識別子を含む場合がある。length を argList の要素数とする。obj を MakeBasicObject (« [[Prototype]] , [[Extensible]] , [[ParameterMap]] ») とする。obj .[[GetOwnProperty]] を 10.4.4.1 で規定されるとおりに設定する。obj .[[DefineOwnProperty]] を 10.4.4.2 で規定されるとおりに設定する。obj .[[Get]] を 10.4.4.3 で規定されるとおりに設定する。obj .[[Set]] を 10.4.4.4 で規定されるとおりに設定する。obj .[[Delete]] を 10.4.4.5 で規定されるとおりに設定する。obj .[[Prototype]] を %Object.prototype% に設定する。map を OrdinaryObjectCreate (null ) とする。obj .[[ParameterMap]] を map に設定する。paramNames を formals の BoundNames とする。paramCount を paramNames の要素数とする。index を 0 とする。index < length の間、次を繰り返す。value を argList [index ] とする。! CreateDataPropertyOrThrow (obj , ! ToString (𝔽 (index )), value ) を実行する。 index を index + 1 に設定する。! DefinePropertyOrThrow (obj , "length" , PropertyDescriptor { [[Value]] : 𝔽 (length ), [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 mappedNames を新しい空の List とする。index を paramCount - 1 に設定する。index ≥ 0 の間、次を繰り返す。name を paramNames [index ] とする。mappedNames が name を含まない場合、name を mappedNames に追加する。index < length である場合、getter を MakeArgGetter (name , envRecord ) とする。setter を MakeArgSetter (name , envRecord ) とする。! map .[[DefineOwnProperty]] (! ToString (𝔽 (index )), PropertyDescriptor { [[Setter]] : setter , [[Getter]] : getter , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 index を index - 1 に設定する。! DefinePropertyOrThrow (obj , %Symbol.iterator% , PropertyDescriptor { [[Value]] : %Array.prototype.values%, [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 ! DefinePropertyOrThrow (obj , "callee" , PropertyDescriptor { [[Value]] : func , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 obj を返す。
10.4.4.7.1 MakeArgGetter ( name , envRecord )
抽象操作 MakeArgGetter。引数 name (String) および envRecord (Environmentレコード )。戻り値:関数オブジェクト 。 実行されると envRecord 内で name に束縛されている値を返す組込み関数オブジェクト を作成します。 呼び出されると、次の手順を実行する。
getterClosure を、パラメーターを持たず、name および envRecord を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。NormalCompletion (! envRecord .GetBindingValue (name , false )) を返す。getter を CreateBuiltinFunction (getterClosure , 0, "" , « ») とする。注記 : getter は ECMAScript コードから直接アクセスされることはない。getter を返す。
10.4.4.7.2 MakeArgSetter ( name , envRecord )
抽象操作 MakeArgSetter。引数 name (String) および envRecord (Environmentレコード )。戻り値:関数オブジェクト 。 実行されると envRecord 内で name に束縛されている値を設定する組込み関数オブジェクト を作成します。 呼び出されると、次の手順を実行する。
setterClosure を、パラメーター (value ) を持ち、name および envRecord を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。NormalCompletion (! envRecord .SetMutableBinding (name , value , false )) を返す。setter を CreateBuiltinFunction (setterClosure , 1, "" , « ») とする。注記 : setter は ECMAScript コードから直接アクセスされることはない。setter を返す。
10.4.5 TypedArray 特殊オブジェクト
TypedArray は、正準数値文字列 であるプロパティキー を特別に処理する特殊オブジェクト です。そのうち範囲内の整数インデックス を、一様な型の要素へのインデックスとして使用し、残りについてはプロトタイプチェーンを走査することなく存在しないという不変条件を強制します。
注
任意の 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]] ( )
a TypedArray obj の内部メソッド [[PreventExtensions]] 。引数なし。戻り値:正常完了 (値:Boolean)。 呼び出されると、次の手順を実行する。
注記 : 6.1.7.3 で規定される拡張可能性に関する不変条件では、obj がプロパティを獲得する(または失った後で再獲得する)可能性がある場合、このメソッドが true を返すことは許されない。これは、基盤となるバッファがサイズ変更されたとき、整数インデックス 名を持つプロパティについて発生する可能性がある。IsTypedArrayFixedLength (obj ) が false である場合、false を返す。OrdinaryPreventExtensions (obj ) を返す。
10.4.5.2 [[GetOwnProperty]] ( propertyKey )
a TypedArray obj の内部メソッド [[GetOwnProperty]] 。引数 propertyKey (プロパティキー )。戻り値:正常完了 (値:(プロパティ記述子 または undefined ))。 呼び出されると、次の手順を実行する。
propertyKey が String である場合、numericIndex を CanonicalNumericIndexString (propertyKey ) とする。numericIndex が undefined でない場合、value を TypedArrayGetElement (obj , numericIndex ) とする。value が undefined である場合、undefined を返す。PropertyDescriptor { [[Value]] : value , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : true } を返す。 OrdinaryGetOwnProperty (obj , propertyKey ) を返す。
10.4.5.3 [[HasProperty]] ( propertyKey )
a TypedArray obj の内部メソッド [[HasProperty]] 。引数 propertyKey (プロパティキー )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
propertyKey が String である場合、numericIndex を CanonicalNumericIndexString (propertyKey ) とする。numericIndex が undefined でない場合、IsValidIntegerIndex (obj , numericIndex ) を返す。? OrdinaryHasProperty (obj , propertyKey ) を返す。
10.4.5.4 [[DefineOwnProperty]] ( propertyKey , propertyDesc )
a TypedArray obj の内部メソッド [[DefineOwnProperty]] 。引数 propertyKey (プロパティキー ) および propertyDesc (プロパティ記述子 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
propertyKey が String である場合、numericIndex を CanonicalNumericIndexString (propertyKey ) とする。numericIndex が undefined でない場合、IsValidIntegerIndex (obj , numericIndex ) が false である場合、false を返す。propertyDesc が [[Configurable]] フィールドを持ち、propertyDesc .[[Configurable]] が false である場合、false を返す。propertyDesc が [[Enumerable]] フィールドを持ち、propertyDesc .[[Enumerable]] が false である場合、false を返す。IsAccessorDescriptor (propertyDesc ) が true である場合、false を返す。propertyDesc が [[Writable]] フィールドを持ち、propertyDesc .[[Writable]] が false である場合、false を返す。propertyDesc が [[Value]] フィールドを持つ場合、? TypedArraySetElement (obj , numericIndex , propertyDesc .[[Value]] ) を実行する。true を返す。! OrdinaryDefineOwnProperty (obj , propertyKey , propertyDesc ) を返す。
10.4.5.5 [[Get]] ( propertyKey , receiver )
a TypedArray obj の内部メソッド [[Get]] 。引数 propertyKey (プロパティキー ) および receiver (ECMAScript 言語値 )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
propertyKey が String である場合、numericIndex を CanonicalNumericIndexString (propertyKey ) とする。numericIndex が undefined でない場合、TypedArrayGetElement (obj , numericIndex ) を返す。? OrdinaryGet (obj , propertyKey , receiver ) を返す。
10.4.5.6 [[Set]] ( propertyKey , value , receiver )
a TypedArray obj の内部メソッド [[Set]] 。引数 propertyKey (プロパティキー )、value (ECMAScript 言語値 ) および receiver (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
propertyKey が String である場合、numericIndex を CanonicalNumericIndexString (propertyKey ) とする。numericIndex が undefined でない場合、SameValue (obj , receiver ) が true である場合、? TypedArraySetElement (obj , numericIndex , value ) を実行する。 true を返す。IsValidIntegerIndex (obj , numericIndex ) が false である場合、true を返す。? OrdinarySet (obj , propertyKey , value , receiver ) を返す。
10.4.5.7 [[Delete]] ( propertyKey )
a TypedArray obj の内部メソッド [[Delete]] 。引数 propertyKey (プロパティキー )。戻り値:正常完了 (値:Boolean)。 呼び出されると、次の手順を実行する。
propertyKey が String である場合、numericIndex を CanonicalNumericIndexString (propertyKey ) とする。numericIndex が undefined でない場合、IsValidIntegerIndex (obj , numericIndex ) が false である場合、true を返す。false を返す。! OrdinaryDelete (obj , propertyKey ) を返す。
10.4.5.8 [[OwnPropertyKeys]] ( )
a TypedArray obj の内部メソッド [[OwnPropertyKeys]] 。引数なし。戻り値:正常完了 (値:リスト (要素:プロパティキー ))。 呼び出されると、次の手順を実行する。
taRecord を MakeTypedArrayWithBufferWitnessRecord (obj , seq-cst ) とする。keys を新しい空の List とする。IsTypedArrayOutOfBounds (taRecord ) が false である場合、length を TypedArrayLength (taRecord ) とする。0 ≤ i < length を満たす各整数 i について、昇順で、次を行う。! ToString (𝔽 (i )) を keys に追加する。 obj の自身のプロパティキー propertyKey のうち、propertyKey が String であり整数インデックス ではないものについて、プロパティ作成時刻の昇順で、次を行う。propertyKey を keys に追加する。obj の自身のプロパティキー propertyKey のうち、propertyKey が Symbol であるものについて、プロパティ作成時刻の昇順で、次を行う。propertyKey を keys に追加する。keys を返す。
10.4.5.9 TypedArray With Buffer Witness Record
TypedArray With Buffer Witness Record は、TypedArray と、その参照対象バッファのキャッシュ済みバイト長をカプセル化するために使用される Record です。参照対象バッファが拡張可能な SharedArrayBuffer である場合に、バイト長データブロックについて ReadSharedMemory イベントが1回だけ発生することを保証するために使用されます。
TypedArray With Buffer Witness Record は、表 28 に列挙されるフィールドを持ちます。
表 28: TypedArray With Buffer Witness Record のフィールド
フィールド名
値
意味
[[Object]]
a TypedArray
そのバッファのバイト長が読み込まれた TypedArray です。
[[CachedBufferByteLength]]
a non-negative integer or detached
Record が作成された時点でのオブジェクトの [[ViewedArrayBuffer]] のバイト長です。
10.4.5.10 MakeTypedArrayWithBufferWitnessRecord ( obj , order )
抽象操作 MakeTypedArrayWithBufferWitnessRecord。引数 obj (TypedArray ) および order ((seq-cst または unordered ))。戻り値:TypedArray With Buffer Witnessレコード 。 呼び出されると、次の手順を実行する。
buffer を obj .[[ViewedArrayBuffer]] とする。IsDetachedBuffer (buffer ) が true である場合、byteLength を detached とする。そうでない場合、byteLength を ArrayBufferByteLength (buffer , order ) とする。 TypedArray With Buffer Witness Record { [[Object]] : obj , [[CachedBufferByteLength]] : byteLength } を返す。
10.4.5.11 TypedArrayCreate ( proto )
抽象操作 TypedArrayCreate。引数 proto (Object)。戻り値:TypedArray 。 新しい TypedArray の作成を規定するために使用されます。 呼び出されると、次の手順を実行する。
internalSlotsList を « [[Prototype]] , [[Extensible]] , [[ViewedArrayBuffer]] , [[TypedArrayName]] , [[ContentType]] , [[ByteLength]] , [[ByteOffset]] , [[ArrayLength]] » とする。ta を MakeBasicObject (internalSlotsList ) とする。ta .[[PreventExtensions]] を 10.4.5.1 で規定されるとおりに設定する。ta .[[GetOwnProperty]] を 10.4.5.2 で規定されるとおりに設定する。ta .[[HasProperty]] を 10.4.5.3 で規定されるとおりに設定する。ta .[[DefineOwnProperty]] を 10.4.5.4 で規定されるとおりに設定する。ta .[[Get]] を 10.4.5.5 で規定されるとおりに設定する。ta .[[Set]] を 10.4.5.6 で規定されるとおりに設定する。ta .[[Delete]] を 10.4.5.7 で規定されるとおりに設定する。ta .[[OwnPropertyKeys]] を 10.4.5.8 で規定されるとおりに設定する。ta .[[Prototype]] を proto に設定する。ta を返す。
10.4.5.12 TypedArrayByteLength ( taRecord )
抽象操作 TypedArrayByteLength。引数 taRecord (TypedArray With Buffer Witnessレコード )。戻り値:非負整数。 呼び出されると、次の手順を実行する。
表明 : IsTypedArrayOutOfBounds (taRecord ) は false である。obj を taRecord .[[Object]] とする。obj .[[ByteLength]] が auto でない場合、obj .[[ByteLength]] を返す。length を TypedArrayLength (taRecord ) とする。elementSize を TypedArrayElementSize (obj ) とする。注記 : 基盤となるバッファが elementSize の整数 倍でないサイズに変更された場合でも、返されるバイト長は常に elementSize の整数 倍である。length × elementSize を返す。
10.4.5.13 TypedArrayLength ( taRecord )
抽象操作 TypedArrayLength。引数 taRecord (TypedArray With Buffer Witnessレコード )。戻り値:非負整数。 呼び出されると、次の手順を実行する。
表明 : IsTypedArrayOutOfBounds (taRecord ) は false である。obj を taRecord .[[Object]] とする。obj .[[ArrayLength]] が auto でない場合、obj .[[ArrayLength]] を返す。表明 : IsFixedLengthArrayBuffer (obj .[[ViewedArrayBuffer]] ) は false である。byteOffset を obj .[[ByteOffset]] とする。elementSize を TypedArrayElementSize (obj ) とする。byteLength を taRecord .[[CachedBufferByteLength]] とする。表明 : byteLength は detached ではない。floor ((byteLength - byteOffset ) / elementSize ) を返す。
10.4.5.14 IsTypedArrayOutOfBounds ( taRecord )
抽象操作 IsTypedArrayOutOfBounds。引数 taRecord (TypedArray With Buffer Witnessレコード )。戻り値:Boolean。 オブジェクトの数値プロパティのいずれかが、基盤となるバッファの範囲内に含まれないインデックスの値を参照するかどうかを検査します。 呼び出されると、次の手順を実行する。
obj を taRecord .[[Object]] とする。bufferByteLength を taRecord .[[CachedBufferByteLength]] とする。IsDetachedBuffer (obj .[[ViewedArrayBuffer]] ) が true である場合、表明 : bufferByteLength は detached である。true を返す。表明 : bufferByteLength は非負の整数 である。byteOffsetStart を obj .[[ByteOffset]] とする。obj .[[ArrayLength]] が auto である場合、byteOffsetEnd を bufferByteLength とする。そうでない場合、elementSize を TypedArrayElementSize (obj ) とする。arrayByteLength を obj .[[ArrayLength]] × elementSize とする。byteOffsetEnd を byteOffsetStart + arrayByteLength とする。 注記 : [[ByteOffset]] が bufferByteLength である長さ0の TypedArray は範囲外とはみなされない。byteOffsetStart > bufferByteLength または byteOffsetEnd > bufferByteLength である場合、true を返す。false を返す。
10.4.5.15 IsTypedArrayFixedLength ( obj )
抽象操作 IsTypedArrayFixedLength。引数 obj (TypedArray )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
obj .[[ArrayLength]] が auto である場合、false を返す。buffer を obj .[[ViewedArrayBuffer]] とする。IsFixedLengthArrayBuffer (buffer ) が false かつ IsSharedArrayBuffer (buffer ) が false である場合、false を返す。true を返す。
10.4.5.16 IsValidIntegerIndex ( obj , index )
抽象操作 IsValidIntegerIndex。引数 obj (TypedArray ) および index (Number)。戻り値:Boolean。 呼び出されると、次の手順を実行する。
IsDetachedBuffer (obj .[[ViewedArrayBuffer]] ) が true である場合、false を返す。index が整数 Number でない場合、false を返す。index が -0 𝔽 であるか、index < -0 𝔽 である場合、false を返す。taRecord を MakeTypedArrayWithBufferWitnessRecord (obj , unordered ) とする。注記 : obj の基盤バッファが拡張可能な SharedArrayBuffer である場合、境界検査は同期操作ではない。IsTypedArrayOutOfBounds (taRecord ) が true である場合、false を返す。length を TypedArrayLength (taRecord ) とする。ℝ (index ) ≥ length である場合、false を返す。true を返す。
10.4.5.17 TypedArrayGetElement ( obj , index )
抽象操作 TypedArrayGetElement。引数 obj (TypedArray ) および index (Number)。戻り値:(Number、BigInt または undefined )。 呼び出されると、次の手順を実行する。
IsValidIntegerIndex (obj , index ) が false である場合、undefined を返す。offset を obj .[[ByteOffset]] とする。elementSize を TypedArrayElementSize (obj ) とする。byteIndexInBuffer を (ℝ (index ) × elementSize ) + offset とする。elementType を TypedArrayElementType (obj ) とする。GetValueFromBuffer (obj .[[ViewedArrayBuffer]] , byteIndexInBuffer , elementType , true , unordered ) を返す。
10.4.5.18 TypedArraySetElement ( obj , index , value )
抽象操作 TypedArraySetElement。引数 obj (TypedArray )、index (Number) および value (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
obj .[[ContentType]] が bigint である場合、number を ? ToBigInt (value ) とする。そうでない場合、number を ? ToNumber (value ) とする。 IsValidIntegerIndex (obj , index ) が true である場合、offset を obj .[[ByteOffset]] とする。elementSize を TypedArrayElementSize (obj ) とする。byteIndexInBuffer を (ℝ (index ) × elementSize ) + offset とする。elementType を TypedArrayElementType (obj ) とする。SetValueInBuffer (obj .[[ViewedArrayBuffer]] , byteIndexInBuffer , elementType , number , true , unordered ) を実行する。unused を返す。
注
この操作は常に成功したように見えますが、TypedArray の末尾を越えて書き込もうとした場合、または切り離された ArrayBuffer を基盤とする TypedArray に書き込もうとした場合には効果がありません。
10.4.5.19 IsArrayBufferViewOutOfBounds ( obj )
抽象操作 IsArrayBufferViewOutOfBounds。引数 obj ((TypedArray または DataView))。戻り値:Boolean。 TypedArray の数値プロパティのいずれか、または DataView オブジェクトのメソッドが、基盤となるデータブロックの範囲内に含まれないインデックスの値を参照できるかどうかを検査します。この抽象操作 は、上流仕様での利便性のために存在します。 呼び出されると、次の手順を実行する。
obj が [[DataView]] 内部スロットを持つ場合、viewRecord を MakeDataViewWithBufferWitnessRecord (obj , seq-cst ) とする。IsViewOutOfBounds (viewRecord ) を返す。taRecord を MakeTypedArrayWithBufferWitnessRecord (obj , seq-cst ) とする。IsTypedArrayOutOfBounds (taRecord ) を返す。
10.4.6 Module Namespace 特殊オブジェクト
Module Namespace 特殊オブジェクト は、ECMAScript Module からエクスポートされた束縛を公開する特殊オブジェクト です(16.2.3 を参照)。Module Namespace 特殊オブジェクト の String キー付き自身のプロパティと、Module によってエクスポートされる束縛名の間には1対1の対応関係があります。エクスポートされる束縛には、export * エクスポート項目を使用して間接的にエクスポートされる束縛も含まれます。String 値を持つ各自身のプロパティキー は、対応するエクスポートされた束縛名の StringValue です。これらが Module Namespace 特殊オブジェクト の唯一の String キー付きプロパティです。このような各プロパティは、属性 { [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : false } を持ちます。Module Namespace 特殊オブジェクト は拡張可能ではありません。
オブジェクトの [[GetPrototypeOf]] 、[[SetPrototypeOf]] 、[[IsExtensible]] 、[[PreventExtensions]] 、[[GetOwnProperty]] 、[[DefineOwnProperty]] 、[[HasProperty]] 、[[Get]] 、[[Set]] 、[[Delete]] 、および [[OwnPropertyKeys]] 内部メソッドがこの節の定義を使用し、その他の必須内部メソッドが 10.1 にある定義を使用する場合、そのオブジェクトは Module Namespace 特殊オブジェクト です。これらのメソッドは ModuleNamespaceCreate によってインストールされます。
Module Namespace 特殊オブジェクト は、表 29 で定義される内部スロットを持ちます。
表 29: Module Namespace 特殊オブジェクト の内部スロット
10.4.6.1 [[GetPrototypeOf]] ( )
a module namespace exotic objectの内部メソッド [[GetPrototypeOf]] 。引数なし。戻り値:正常完了 (値:null )。 呼び出されると、次の手順を実行する。
null を返す。
10.4.6.2 [[SetPrototypeOf]] ( proto )
a module namespace exotic object obj の内部メソッド [[SetPrototypeOf]] 。引数 proto ((Object または null ))。戻り値:正常完了 (値:Boolean)。 呼び出されると、次の手順を実行する。
! SetImmutablePrototype (obj , proto ) を返す。
10.4.6.3 [[IsExtensible]] ( )
a module namespace exotic objectの内部メソッド [[IsExtensible]] 。引数なし。戻り値:正常完了 (値:false )。 呼び出されると、次の手順を実行する。
false を返す。
10.4.6.4 [[PreventExtensions]] ( )
a module namespace exotic objectの内部メソッド [[PreventExtensions]] 。引数なし。戻り値:正常完了 (値:true )。 呼び出されると、次の手順を実行する。
true を返す。
10.4.6.5 [[GetOwnProperty]] ( propertyKey )
a module namespace exotic object obj の内部メソッド [[GetOwnProperty]] 。引数 propertyKey (プロパティキー )。戻り値:(正常完了 (値:(プロパティ記述子 または undefined )) または throw 完了 )。 呼び出されると、次の手順を実行する。
propertyKey が Symbol である場合、OrdinaryGetOwnProperty (obj , propertyKey ) を返す。exports を obj .[[Exports]] とする。exports が propertyKey を含まない場合、undefined を返す。value を ? obj .[[Get]] (propertyKey , obj ) とする。PropertyDescriptor { [[Value]] : value , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : false } を返す。
10.4.6.6 [[DefineOwnProperty]] ( propertyKey , propertyDesc )
a module namespace exotic object obj の内部メソッド [[DefineOwnProperty]] 。引数 propertyKey (プロパティキー ) および propertyDesc (プロパティ記述子 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
propertyKey が Symbol である場合、! OrdinaryDefineOwnProperty (obj , propertyKey , propertyDesc ) を返す。current を ? obj .[[GetOwnProperty]] (propertyKey ) とする。current が undefined である場合、false を返す。propertyDesc が [[Configurable]] フィールドを持ち、propertyDesc .[[Configurable]] が true である場合、false を返す。propertyDesc が [[Enumerable]] フィールドを持ち、propertyDesc .[[Enumerable]] が false である場合、false を返す。IsAccessorDescriptor (propertyDesc ) が true である場合、false を返す。propertyDesc が [[Writable]] フィールドを持ち、propertyDesc .[[Writable]] が false である場合、false を返す。propertyDesc が [[Value]] フィールドを持つ場合、SameValue (propertyDesc .[[Value]] , current .[[Value]] ) を返す。true を返す。
10.4.6.7 [[HasProperty]] ( propertyKey )
a module namespace exotic object obj の内部メソッド [[HasProperty]] 。引数 propertyKey (プロパティキー )。戻り値:正常完了 (値:Boolean)。 呼び出されると、次の手順を実行する。
propertyKey が Symbol である場合、! OrdinaryHasProperty (obj , propertyKey ) を返す。exports を obj .[[Exports]] とする。exports が propertyKey を含む場合、true を返す。false を返す。
10.4.6.8 [[Get]] ( propertyKey , receiver )
a module namespace exotic object obj の内部メソッド [[Get]] 。引数 propertyKey (プロパティキー ) および receiver (ECMAScript 言語値 )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
propertyKey が Symbol である場合、! OrdinaryGet (obj , propertyKey , receiver ) を返す。 exports を obj .[[Exports]] とする。exports が propertyKey を含まない場合、undefined を返す。module を obj .[[Module]] とする。binding を module .ResolveExport (propertyKey ) とする。表明 : binding は ResolvedBinding Record である。targetModule を binding .[[Module]] とする。表明 : targetModule は undefined ではない。binding .[[BindingName]] が namespace である場合、GetModuleNamespace (targetModule ) を返す。targetEnv を targetModule .[[Environment]] とする。targetEnv が empty である場合、ReferenceError 例外をスローする。? targetEnv .GetBindingValue (binding .[[BindingName]] , true ) を返す。
注
ResolveExport には副作用がありません。この操作が特定の exportName 、resolveSet の組を引数として呼び出されるたびに、同じ結果を返さなければなりません。実装は、各 Module Namespace 特殊オブジェクト の [[Exports]] について ResolveExport の結果を事前計算またはキャッシュすることを選択してもかまいません。
10.4.6.9 [[Set]] ( propertyKey , value , receiver )
a module namespace exotic objectの内部メソッド [[Set]] 。引数 propertyKey (プロパティキー )、value (ECMAScript 言語値 ) および receiver (ECMAScript 言語値 )。戻り値:正常完了 (値:false )。 呼び出されると、次の手順を実行する。
false を返す。
10.4.6.10 [[Delete]] ( propertyKey )
a module namespace exotic object obj の内部メソッド [[Delete]] 。引数 propertyKey (プロパティキー )。戻り値:正常完了 (値:Boolean)。 呼び出されると、次の手順を実行する。
propertyKey が Symbol である場合、! OrdinaryDelete (obj , propertyKey ) を返す。 exports を obj .[[Exports]] とする。exports が propertyKey を含む場合、false を返す。true を返す。
10.4.6.11 [[OwnPropertyKeys]] ( )
a module namespace exotic object obj の内部メソッド [[OwnPropertyKeys]] 。引数なし。戻り値:正常完了 (値:リスト (要素:プロパティキー ))。 呼び出されると、次の手順を実行する。
exports を obj .[[Exports]] とする。symbolKeys を OrdinaryOwnPropertyKeys (obj ) とする。exports と symbolKeys のリスト連結 を返す。
10.4.6.12 ModuleNamespaceCreate ( module , exports )
抽象操作 ModuleNamespaceCreate。引数 module (Moduleレコード ) および exports (リスト (要素:String))。戻り値:module namespaceエキゾチックオブジェクト。 新しい Module Namespace 特殊オブジェクト の作成を規定するために使用されます。 呼び出されると、次の手順を実行する。
表明 : module .[[Namespace]] は empty である。internalSlotsList を 表 29 に列挙される内部スロットとする。namespace を MakeBasicObject (internalSlotsList ) とする。namespace の必須内部メソッドを 10.4.6 で規定される定義に設定する。namespace .[[Module]] を module に設定する。sortedExports を、exports の要素を辞書式コード単位順 に従ってソートした要素を持つ List とする。namespace .[[Exports]] を sortedExports に設定する。28.3 の定義に対応する namespace 自身のプロパティを作成する。module .[[Namespace]] を namespace に設定する。namespace を返す。
10.4.7 不変プロトタイプ特殊オブジェクト
不変プロトタイプ特殊オブジェクト は、初期化された後は変更されない [[Prototype]] 内部スロットを持つ特殊オブジェクト です。
オブジェクトの [[SetPrototypeOf]] 内部メソッドが以下の実装を使用する場合、そのオブジェクトは 不変プロトタイプ特殊オブジェクト です。(その他の必須内部メソッドは、対象となる具体的な不変プロトタイプ特殊オブジェクト に応じて、任意の実装を使用できます。)
注
他の特殊オブジェクト とは異なり、不変プロトタイプ特殊オブジェクト には専用の作成用抽象操作 は提供されていません。これは、それらが %Object.prototype% とホスト環境 でのみ使用され、ホスト環境 では対象オブジェクトが他の点でも特殊である可能性があり、そのため独自の専用作成操作を必要とするためです。
10.4.7.1 [[SetPrototypeOf]] ( proto )
an immutable prototype exotic object obj の内部メソッド [[SetPrototypeOf]] 。引数 proto ((Object または null ))。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
? SetImmutablePrototype (obj , proto ) を返す。
10.4.7.2 SetImmutablePrototype ( obj , proto )
抽象操作 SetImmutablePrototype。引数 obj (Object) および proto ((Object または null ))。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
current を ? obj .[[GetPrototypeOf]] () とする。SameValue (proto , current ) が true である場合、true を返す。false を返す。
10.5 Proxy オブジェクトの内部メソッドと内部スロット
Proxy オブジェクトは、その必須内部メソッドの一部が ECMAScript コードを使用して実装される特殊オブジェクト です。すべての Proxy オブジェクトは [[ProxyHandler]] と呼ばれる内部スロットを持ちます。[[ProxyHandler]] の値は、Proxy のハンドラーオブジェクト と呼ばれるオブジェクト、または null です。ハンドラーオブジェクトのメソッド(表 30 を参照)を使用して、Proxy オブジェクトの1つ以上の内部メソッドの実装を拡張できます。すべての Proxy オブジェクトは [[ProxyTarget]] と呼ばれる内部スロットも持ち、その値はオブジェクトまたは null のいずれかです。このオブジェクトを Proxy のターゲットオブジェクト と呼びます。
オブジェクトの必須内部メソッド(該当する場合は [[Call]] および [[Construct]] を含む)がこの節の定義を使用する場合、そのオブジェクトは Proxy 特殊オブジェクト です。これらの内部メソッドは ProxyCreate でインストールされます。
表 30: Proxy ハンドラーメソッド
内部メソッド
ハンドラーメソッド
[[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 のターゲットオブジェクトがパラメーターとしてハンドラーメソッドに渡されます。Proxy のハンドラーオブジェクトは、必ずしもすべての必須内部メソッドに対応するメソッドを持つとは限りません。ハンドラーオブジェクトが内部トラップに対応するメソッドを持たない場合、Proxy 上で内部メソッドを呼び出すと、Proxy のターゲットオブジェクト上の対応する内部メソッドが呼び出されます。
Proxy オブジェクトの [[ProxyHandler]] および [[ProxyTarget]] 内部スロットは、オブジェクトの作成時に常に初期化され、通常は変更できません。一部の Proxy オブジェクトは、その後取り消す ことができる方法で作成されます。Proxy が取り消されると、その [[ProxyHandler]] および [[ProxyTarget]] 内部スロットは null に設定され、その Proxy オブジェクト上での以後の内部メソッド呼出しは TypeError 例外をスローします。
Proxy オブジェクトでは、任意の ECMAScript コードによって内部メソッドの実装を提供できるため、6.1.7.3 で定義される不変条件に違反するハンドラーメソッドを持つ Proxy オブジェクトを定義することが可能です。6.1.7.3 で定義される内部メソッド不変条件の一部は、必須の整合性不変条件です。これらの不変条件は、この節で規定される Proxy オブジェクト内部メソッドによって明示的に強制されます。ECMAScript 実装は、あらゆる可能な不変条件違反が存在しても堅牢でなければなりません。
以下のアルゴリズムの説明では、obj は ECMAScript Proxy オブジェクト、propertyKey はプロパティキー 値、value は任意の ECMAScript 言語値 、propertyDesc は Property Descriptor Record であると仮定します。
10.5.1 [[GetPrototypeOf]] ( )
a Proxy exotic object obj の内部メソッド [[GetPrototypeOf]] 。引数なし。戻り値:(正常完了 (値:(Object または null )) または throw 完了 )。 呼び出されると、次の手順を実行する。
? ValidateNonRevokedProxy (obj ) を実行する。 target を obj .[[ProxyTarget]] とする。handler を obj .[[ProxyHandler]] とする。表明 : handler は Object である。trap を ? GetMethod (handler , "getPrototypeOf" ) とする。trap が undefined である場合、? target .[[GetPrototypeOf]] () を返す。 handlerProto を ? Call (trap , handler , « target ») とする。handlerProto が Object でも null でもない場合、TypeError 例外をスローする。extensibleTarget を ? IsExtensible (target ) とする。extensibleTarget が true である場合、handlerProto を返す。targetProto を ? target .[[GetPrototypeOf]] () とする。SameValue (handlerProto , targetProto ) が false である場合、TypeError 例外をスローする。handlerProto を返す。
注
Proxy オブジェクトの [[GetPrototypeOf]] は、次の不変条件を強制します。
[[GetPrototypeOf]] の結果は Object または null のいずれかでなければなりません。
ターゲットオブジェクトが拡張可能でない場合、Proxy オブジェクトに適用された [[GetPrototypeOf]] は、Proxy オブジェクトのターゲットオブジェクトに適用された [[GetPrototypeOf]] と同じ値を返さなければなりません。
10.5.2 [[SetPrototypeOf]] ( proto )
a Proxy exotic object obj の内部メソッド [[SetPrototypeOf]] 。引数 proto ((Object または null ))。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
? ValidateNonRevokedProxy (obj ) を実行する。 target を obj .[[ProxyTarget]] とする。handler を obj .[[ProxyHandler]] とする。表明 : handler は Object である。trap を ? GetMethod (handler , "setPrototypeOf" ) とする。trap が undefined である場合、? target .[[SetPrototypeOf]] (proto ) を返す。 boolTrapResult を ToBoolean (? Call (trap , handler , « target , proto »)) とする。boolTrapResult が false である場合、false を返す。extensibleTarget を ? IsExtensible (target ) とする。extensibleTarget が true である場合、true を返す。targetProto を ? target .[[GetPrototypeOf]] () とする。SameValue (proto , targetProto ) が false である場合、TypeError 例外をスローする。true を返す。
注
Proxy オブジェクトの [[SetPrototypeOf]] は、次の不変条件を強制します。
[[SetPrototypeOf]] の結果は Boolean 値です。
ターゲットオブジェクトが拡張可能でない場合、引数値はターゲットオブジェクトに適用された [[GetPrototypeOf]] の結果と同じでなければなりません。
10.5.3 [[IsExtensible]] ( )
a Proxy exotic object obj の内部メソッド [[IsExtensible]] 。引数なし。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
? ValidateNonRevokedProxy (obj ) を実行する。 target を obj .[[ProxyTarget]] とする。handler を obj .[[ProxyHandler]] とする。表明 : handler は Object である。trap を ? GetMethod (handler , "isExtensible" ) とする。trap が undefined である場合、? IsExtensible (target ) を返す。 boolTrapResult を ToBoolean (? Call (trap , handler , « target »)) とする。targetResult を ? IsExtensible (target ) とする。boolTrapResult が targetResult でない場合、TypeError 例外をスローする。boolTrapResult を返す。
注
Proxy オブジェクトの [[IsExtensible]] は、次の不変条件を強制します。
[[IsExtensible]] の結果は Boolean 値です。
Proxy オブジェクトに適用された [[IsExtensible]] は、同じ引数で Proxy オブジェクトのターゲットオブジェクトに適用された [[IsExtensible]] と同じ値を返さなければなりません。
10.5.4 [[PreventExtensions]] ( )
a Proxy exotic object obj の内部メソッド [[PreventExtensions]] 。引数なし。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
? ValidateNonRevokedProxy (obj ) を実行する。 target を obj .[[ProxyTarget]] とする。handler を obj .[[ProxyHandler]] とする。表明 : handler は Object である。trap を ? GetMethod (handler , "preventExtensions" ) とする。trap が undefined である場合、? target .[[PreventExtensions]] () を返す。 boolTrapResult を ToBoolean (? Call (trap , handler , « target »)) とする。boolTrapResult が true である場合、extensibleTarget を ? IsExtensible (target ) とする。extensibleTarget が true である場合、TypeError 例外をスローする。boolTrapResult を返す。
注
Proxy オブジェクトの [[PreventExtensions]] は、次の不変条件を強制します。
[[PreventExtensions]] の結果は Boolean 値です。
Proxy オブジェクトに適用された [[PreventExtensions]] が true を返すのは、Proxy オブジェクトのターゲットオブジェクトに適用された [[IsExtensible]] が false である場合に限ります。
10.5.5 [[GetOwnProperty]] ( propertyKey )
a Proxy exotic object obj の内部メソッド [[GetOwnProperty]] 。引数 propertyKey (プロパティキー )。戻り値:(正常完了 (値:(プロパティ記述子 または undefined )) または throw 完了 )。 呼び出されると、次の手順を実行する。
? ValidateNonRevokedProxy (obj ) を実行する。 target を obj .[[ProxyTarget]] とする。handler を obj .[[ProxyHandler]] とする。表明 : handler は Object である。trap を ? GetMethod (handler , "getOwnPropertyDescriptor" ) とする。trap が undefined である場合、? target .[[GetOwnProperty]] (propertyKey ) を返す。 trapResultObj を ? Call (trap , handler , « target , propertyKey ») とする。trapResultObj が Object でも undefined でもない場合、TypeError 例外をスローする。targetDesc を ? target .[[GetOwnProperty]] (propertyKey ) とする。trapResultObj が undefined である場合、targetDesc が undefined である場合、undefined を返す。targetDesc .[[Configurable]] が false である場合、TypeError 例外をスローする。extensibleTarget を ? IsExtensible (target ) とする。extensibleTarget が false である場合、TypeError 例外をスローする。undefined を返す。extensibleTarget を ? IsExtensible (target ) とする。resultDesc を ? ToPropertyDescriptor (trapResultObj ) とする。CompletePropertyDescriptor (resultDesc ) を実行する。valid を IsCompatiblePropertyDescriptor (extensibleTarget , resultDesc , targetDesc ) とする。valid が false である場合、TypeError 例外をスローする。resultDesc .[[Configurable]] が false である場合、targetDesc が undefined であるか、targetDesc .[[Configurable]] が true である場合、TypeError 例外をスローする。resultDesc が [[Writable]] フィールドを持ち、resultDesc .[[Writable]] が false である場合、表明 : targetDesc は [[Writable]] フィールドを持つ。targetDesc .[[Writable]] が true である場合、TypeError 例外をスローする。resultDesc を返す。
注
Proxy オブジェクトの [[GetOwnProperty]] は、次の不変条件を強制します。
[[GetOwnProperty]] の結果は Property Descriptor または undefined のいずれかでなければなりません。
ターゲットオブジェクトの構成不可の自身のプロパティとして存在するプロパティを、存在しないと報告することはできません。
拡張可能でないターゲットオブジェクトの自身のプロパティとして存在するプロパティを、存在しないと報告することはできません。
ターゲットオブジェクトの自身のプロパティとして存在せず、かつターゲットオブジェクトが拡張可能でない場合、そのプロパティを存在すると報告することはできません。
ターゲットオブジェクトの構成不可の自身のプロパティとして存在する場合を除き、プロパティを構成不可と報告することはできません。
ターゲットオブジェクトの構成不可かつ書込み不可の自身のプロパティとして存在する場合を除き、プロパティを構成不可かつ書込み不可と報告することはできません。
10.5.6 [[DefineOwnProperty]] ( propertyKey , propertyDesc )
a Proxy exotic object obj の内部メソッド [[DefineOwnProperty]] 。引数 propertyKey (プロパティキー ) および propertyDesc (プロパティ記述子 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
? ValidateNonRevokedProxy (obj ) を実行する。 target を obj .[[ProxyTarget]] とする。handler を obj .[[ProxyHandler]] とする。表明 : handler は Object である。trap を ? GetMethod (handler , "defineProperty" ) とする。trap が undefined である場合、? target .[[DefineOwnProperty]] (propertyKey , propertyDesc ) を返す。 propertyDescObj を FromPropertyDescriptor (propertyDesc ) とする。boolTrapResult を ToBoolean (? Call (trap , handler , « target , propertyKey , propertyDescObj »)) とする。boolTrapResult が false である場合、false を返す。targetDesc を ? target .[[GetOwnProperty]] (propertyKey ) とする。extensibleTarget を ? IsExtensible (target ) とする。propertyDesc が [[Configurable]] フィールドを持ち、propertyDesc .[[Configurable]] が false である場合、settingConfigurableFalse を true とする。そうでない場合、settingConfigurableFalse を false とする。 targetDesc が undefined である場合、extensibleTarget が false である場合、TypeError 例外をスローする。settingConfigurableFalse が true である場合、TypeError 例外をスローする。そうでない場合、IsCompatiblePropertyDescriptor (extensibleTarget , propertyDesc , targetDesc ) が false である場合、TypeError 例外をスローする。settingConfigurableFalse が true かつ targetDesc .[[Configurable]] が true である場合、TypeError 例外をスローする。IsDataDescriptor (targetDesc ) が true 、targetDesc .[[Configurable]] が false 、かつ targetDesc .[[Writable]] が true である場合、propertyDesc が [[Writable]] フィールドを持ち、propertyDesc .[[Writable]] が false である場合、TypeError 例外をスローする。 true を返す。
注
Proxy オブジェクトの [[DefineOwnProperty]] は、次の不変条件を強制します。
[[DefineOwnProperty]] の結果は Boolean 値です。
ターゲットオブジェクトが拡張可能でない場合、プロパティを追加することはできません。
対応する構成不可のターゲットオブジェクト自身のプロパティが存在する場合を除き、プロパティを構成不可にすることはできません。
対応する構成不可かつ書込み不可のターゲットオブジェクト自身のプロパティが存在する場合を除き、構成不可のプロパティを書込み不可にすることはできません。
プロパティに対応するターゲットオブジェクトのプロパティが存在する場合、そのプロパティの Property Descriptor を [[DefineOwnProperty]] を使用してターゲットオブジェクトに適用しても例外はスローされません。
10.5.7 [[HasProperty]] ( propertyKey )
a Proxy exotic object obj の内部メソッド [[HasProperty]] 。引数 propertyKey (プロパティキー )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
? ValidateNonRevokedProxy (obj ) を実行する。 target を obj .[[ProxyTarget]] とする。handler を obj .[[ProxyHandler]] とする。表明 : handler は Object である。trap を ? GetMethod (handler , "has" ) とする。trap が undefined である場合、? target .[[HasProperty]] (propertyKey ) を返す。 boolTrapResult を ToBoolean (? Call (trap , handler , « target , propertyKey »)) とする。boolTrapResult が false である場合、targetDesc を ? target .[[GetOwnProperty]] (propertyKey ) とする。targetDesc が undefined でない場合、targetDesc .[[Configurable]] が false である場合、TypeError 例外をスローする。extensibleTarget を ? IsExtensible (target ) とする。extensibleTarget が false である場合、TypeError 例外をスローする。boolTrapResult を返す。
注
Proxy オブジェクトの [[HasProperty]] は、次の不変条件を強制します。
[[HasProperty]] の結果は Boolean 値です。
ターゲットオブジェクトの構成不可の自身のプロパティとして存在するプロパティを、存在しないと報告することはできません。
ターゲットオブジェクト自身のプロパティとして存在し、かつターゲットオブジェクトが拡張可能でない場合、そのプロパティを存在しないと報告することはできません。
10.5.8 [[Get]] ( propertyKey , receiver )
a Proxy exotic object obj の内部メソッド [[Get]] 。引数 propertyKey (プロパティキー ) および receiver (ECMAScript 言語値 )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
? ValidateNonRevokedProxy (obj ) を実行する。 target を obj .[[ProxyTarget]] とする。handler を obj .[[ProxyHandler]] とする。表明 : handler は Object である。trap を ? GetMethod (handler , "get" ) とする。trap が undefined である場合、? target .[[Get]] (propertyKey , receiver ) を返す。 trapResult を ? Call (trap , handler , « target , propertyKey , receiver ») とする。targetDesc を ? target .[[GetOwnProperty]] (propertyKey ) とする。targetDesc が undefined でなく、targetDesc .[[Configurable]] が false である場合、IsDataDescriptor (targetDesc ) が true かつ targetDesc .[[Writable]] が false である場合、SameValue (trapResult , targetDesc .[[Value]] ) が false である場合、TypeError 例外をスローする。IsAccessorDescriptor (targetDesc ) が true かつ targetDesc .[[Getter]] が undefined である場合、trapResult が undefined でない場合、TypeError 例外をスローする。trapResult を返す。
注
Proxy オブジェクトの [[Get]] は、次の不変条件を強制します。
対応するターゲットオブジェクトのプロパティが書込み不可かつ構成不可の自身のデータプロパティ である場合、プロパティについて報告される値は、そのターゲットオブジェクトのプロパティ値と同じでなければなりません。
対応するターゲットオブジェクトのプロパティが、[[Getter]] 属性として undefined を持つ構成不可の自身のアクセサープロパティ である場合、プロパティについて報告される値は undefined でなければなりません。
10.5.9 [[Set]] ( propertyKey , value , receiver )
a Proxy exotic object obj の内部メソッド [[Set]] 。引数 propertyKey (プロパティキー )、value (ECMAScript 言語値 ) および receiver (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
? ValidateNonRevokedProxy (obj ) を実行する。 target を obj .[[ProxyTarget]] とする。handler を obj .[[ProxyHandler]] とする。表明 : handler は Object である。trap を ? GetMethod (handler , "set" ) とする。trap が undefined である場合、? target .[[Set]] (propertyKey , value , receiver ) を返す。 boolTrapResult を ToBoolean (? Call (trap , handler , « target , propertyKey , value , receiver »)) とする。boolTrapResult が false である場合、false を返す。targetDesc を ? target .[[GetOwnProperty]] (propertyKey ) とする。targetDesc が undefined でなく、targetDesc .[[Configurable]] が false である場合、IsDataDescriptor (targetDesc ) が true かつ targetDesc .[[Writable]] が false である場合、SameValue (value , targetDesc .[[Value]] ) が false である場合、TypeError 例外をスローする。IsAccessorDescriptor (targetDesc ) が true である場合、targetDesc .[[Setter]] が undefined である場合、TypeError 例外をスローする。true を返す。
注
Proxy オブジェクトの [[Set]] は、次の不変条件を強制します。
[[Set]] の結果は Boolean 値です。
対応するターゲットオブジェクトのプロパティが書込み不可かつ構成不可の自身のデータプロパティ である場合、そのプロパティ値と異なる値に変更することはできません。
対応するターゲットオブジェクトのプロパティが、[[Setter]] 属性として undefined を持つ構成不可の自身のアクセサープロパティ である場合、プロパティの値を設定することはできません。
10.5.10 [[Delete]] ( propertyKey )
a Proxy exotic object obj の内部メソッド [[Delete]] 。引数 propertyKey (プロパティキー )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
? ValidateNonRevokedProxy (obj ) を実行する。 target を obj .[[ProxyTarget]] とする。handler を obj .[[ProxyHandler]] とする。表明 : handler は Object である。trap を ? GetMethod (handler , "deleteProperty" ) とする。trap が undefined である場合、? target .[[Delete]] (propertyKey ) を返す。 boolTrapResult を ToBoolean (? Call (trap , handler , « target , propertyKey »)) とする。boolTrapResult が false である場合、false を返す。targetDesc を ? target .[[GetOwnProperty]] (propertyKey ) とする。targetDesc が undefined である場合、true を返す。targetDesc .[[Configurable]] が false である場合、TypeError 例外をスローする。extensibleTarget を ? IsExtensible (target ) とする。extensibleTarget が false である場合、TypeError 例外をスローする。true を返す。
注
Proxy オブジェクトの [[Delete]] は、次の不変条件を強制します。
[[Delete]] の結果は Boolean 値です。
ターゲットオブジェクトの構成不可の自身のプロパティとして存在するプロパティを、削除されたと報告することはできません。
ターゲットオブジェクトの自身のプロパティとして存在し、かつターゲットオブジェクトが拡張可能でない場合、そのプロパティを削除されたと報告することはできません。
10.5.11 [[OwnPropertyKeys]] ( )
a Proxy exotic object obj の内部メソッド [[OwnPropertyKeys]] 。引数なし。戻り値:(正常完了 (値:リスト (要素:プロパティキー )) または throw 完了 )。 呼び出されると、次の手順を実行する。
? ValidateNonRevokedProxy (obj ) を実行する。 target を obj .[[ProxyTarget]] とする。handler を obj .[[ProxyHandler]] とする。表明 : handler は Object である。trap を ? GetMethod (handler , "ownKeys" ) とする。trap が undefined である場合、? target .[[OwnPropertyKeys]] () を返す。 trapResultArray を ? Call (trap , handler , « target ») とする。trapResult を ? CreateListFromArrayLike (trapResultArray , property-key ) とする。trapResult に重複する項目が含まれる場合、TypeError 例外をスローする。extensibleTarget を ? IsExtensible (target ) とする。targetKeys を ? target .[[OwnPropertyKeys]] () とする。表明 : targetKeys はプロパティキー の List である。表明 : targetKeys は重複する項目を含まない。targetConfigurableKeys を新しい空の List とする。targetNonconfigurableKeys を新しい空の List とする。targetKeys の各要素 key について、次を行う。propertyDesc を ? target .[[GetOwnProperty]] (key ) とする。propertyDesc が undefined でなく、propertyDesc .[[Configurable]] が false である場合、key を targetNonconfigurableKeys に追加する。そうでない場合、key を targetConfigurableKeys に追加する。 extensibleTarget が true かつ targetNonconfigurableKeys が空である場合、trapResult を返す。uncheckedResultKeys を、trapResult の要素を要素とする List とする。targetNonconfigurableKeys の各要素 key について、次を行う。uncheckedResultKeys が key を含まない場合、TypeError 例外をスローする。key を uncheckedResultKeys から削除する。extensibleTarget が true である場合、trapResult を返す。targetConfigurableKeys の各要素 key について、次を行う。uncheckedResultKeys が key を含まない場合、TypeError 例外をスローする。key を uncheckedResultKeys から削除する。uncheckedResultKeys が空でない場合、TypeError 例外をスローする。trapResult を返す。
注
Proxy オブジェクトの [[OwnPropertyKeys]] は、次の不変条件を強制します。
[[OwnPropertyKeys]] の結果は List です。
返される List は重複する項目を含みません。
返される List の各要素はプロパティキー です。
結果の List は、ターゲットオブジェクトの構成不可のすべての自身のプロパティのキーを含まなければなりません。
ターゲットオブジェクトが拡張可能でない場合、結果の List はターゲットオブジェクト自身のすべてのプロパティキー を含み、それ以外の値を含んではなりません。
10.5.12 [[Call]] ( thisArg , argList )
a Proxy exotic object obj の内部メソッド [[Call]] 。引数 thisArg (ECMAScript 言語値 ) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
? ValidateNonRevokedProxy (obj ) を実行する。 target を obj .[[ProxyTarget]] とする。handler を obj .[[ProxyHandler]] とする。表明 : handler は Object である。trap を ? GetMethod (handler , "apply" ) とする。trap が undefined である場合、? Call (target , thisArg , argList ) を返す。 argArray を CreateArrayFromList (argList ) とする。? Call (trap , handler , « target , thisArg , argArray ») を返す。
注
Proxy 特殊オブジェクト が [[Call]] 内部メソッドを持つのは、その [[ProxyTarget]] 内部スロットの初期値が [[Call]] 内部メソッドを持つオブジェクトである場合に限ります。
10.5.13 [[Construct]] ( argList , newTarget )
a Proxy exotic object obj の内部メソッド [[Construct]] 。引数 argList (リスト (要素:ECMAScript 言語値 )) および newTarget (コンストラクター )。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
? ValidateNonRevokedProxy (obj ) を実行する。 target を obj .[[ProxyTarget]] とする。表明 : IsConstructor (target ) は true である。handler を obj .[[ProxyHandler]] とする。表明 : handler は Object である。trap を ? GetMethod (handler , "construct" ) とする。trap が undefined である場合、? Construct (target , argList , newTarget ) を返す。 argArray を CreateArrayFromList (argList ) とする。newObj を ? Call (trap , handler , « target , argArray , newTarget ») とする。newObj が Object でない場合、TypeError 例外をスローする。newObj を返す。
注 1
Proxy 特殊オブジェクト が [[Construct]] 内部メソッドを持つのは、その [[ProxyTarget]] 内部スロットの初期値が [[Construct]] 内部メソッドを持つオブジェクトである場合に限ります。
注 2
Proxy オブジェクトの [[Construct]] は、次の不変条件を強制します。
[[Construct]] の結果は Object でなければなりません。
10.5.14 ValidateNonRevokedProxy ( proxy )
抽象操作 ValidateNonRevokedProxy。引数 proxy (Proxyエキゾチックオブジェクト)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 proxy が取り消されている場合、TypeError 例外をスローします。 呼び出されると、次の手順を実行する。
proxy .[[ProxyTarget]] が null である場合、TypeError 例外をスローする。表明 : proxy .[[ProxyHandler]] は null ではない。unused を返す。
10.5.15 ProxyCreate ( target , handler )
抽象操作 ProxyCreate。引数 target (ECMAScript 言語値 ) および handler (ECMAScript 言語値 )。戻り値:(正常完了 (値:Proxyエキゾチックオブジェクト) または throw 完了 )。 新しい Proxy オブジェクトの作成を規定するために使用されます。 呼び出されると、次の手順を実行する。
target が Object でない場合、TypeError 例外をスローする。handler が Object でない場合、TypeError 例外をスローする。proxy を MakeBasicObject (« [[ProxyHandler]] , [[ProxyTarget]] ») とする。proxy の [[Call]] および [[Construct]] を除く必須内部メソッドを、10.5 で規定される定義に設定する。IsCallable (target ) が true である場合、proxy .[[Call]] を 10.5.12 で規定されるとおりに設定する。IsConstructor (target ) が true である場合、proxy .[[Construct]] を 10.5.13 で規定されるとおりに設定する。proxy .[[ProxyTarget]] を target に設定する。proxy .[[ProxyHandler]] を handler に設定する。proxy を返す。
11 ECMAScript 言語: ソーステキスト
11.1 ソーステキスト
構文
SourceCharacter ::
any Unicode code point
ECMAScript ソーステキスト は Unicode コードポイントの列です。U+0000 から U+10FFFF までのすべての Unicode コードポイント値は、サロゲートコードポイントを含め、ECMAScript 文法で許可される箇所の ECMAScript ソーステキストに現れることができます。ECMAScript ソーステキストの保存および交換に実際に使用される符号化方式は、この仕様には関係ありません。外部のソーステキストの符号化方式にかかわらず、適合する ECMAScript 実装は、ソーステキストを、それぞれの SourceCharacter が Unicode コードポイントである、等価な SourceCharacter 値の列であるかのように処理します。適合する ECMAScript 実装は、ソーステキストの正規化を行う必要はなく、ソーステキストの正規化を行っているかのように動作する必要もありません。
結合文字列の構成要素は、利用者には列全体が単一の文字のように見える場合でも、個々の Unicode コードポイントとして扱われます。
注
文字列リテラル、正規表現リテラル、テンプレートリテラル、および識別子では、任意の Unicode コードポイントを、そのコードポイントの数値を明示的に表す Unicode エスケープシーケンスを使用して表すこともできます。コメント内では、このようなエスケープシーケンスは実質的にコメントの一部として無視されます。
ECMAScript は、Unicode エスケープシーケンスの動作において Java プログラミング言語とは異なります。Java プログラムでは、たとえば Unicode エスケープシーケンス \u000A が単一行コメント内に現れると、それは行終端文字(Unicode コードポイント U+000A は LINE FEED (LF))として解釈されるため、次のコードポイントはコメントの一部にはなりません。同様に、Unicode エスケープシーケンス \u000A が Java プログラムの文字列リテラル内に現れた場合も行終端文字として解釈されますが、行終端文字は文字列リテラル内では許可されていないため、文字列リテラルの値に LINE FEED (LF) を含めるには \u000A の代わりに \n と記述しなければなりません。ECMAScript プログラムでは、コメント内に現れる Unicode エスケープシーケンスは決して解釈されないため、コメントの終了に寄与することはありません。同様に、ECMAScript プログラムの文字列リテラル内に現れる Unicode エスケープシーケンスは常にそのリテラルに寄与し、行終端文字として、または文字列リテラルを終了させ得るコードポイントとして解釈されることはありません。
11.1.1 Static Semantics: UTF16EncodeCodePoint ( codePoint )
抽象操作 UTF16EncodeCodePoint。引数 codePoint (Unicode コードポイント)。戻り値:String。 呼び出されると、次の手順を実行する。
表明 : 0 ≤ codePoint ≤ 0x10FFFF。codePoint ≤ 0xFFFF である場合、数値が codePoint であるコード単位からなる String 値を返す。cu1 を、数値が floor ((codePoint - 0x10000) / 0x400) + 0xD800 であるコード単位とする。cu2 を、数値が ((codePoint - 0x10000) modulo 0x400) + 0xDC00 であるコード単位とする。cu1 と cu2 の文字列連結 を返す。
11.1.2 Static Semantics: CodePointsToString ( text )
抽象操作 CodePointsToString。引数 text (a sequence of Unicode code points)。戻り値:String。 6.1.4 で説明されているように、text を String 値に変換します。 呼び出されると、次の手順を実行する。
result を空の String とする。text の各コードポイント codePoint について、次を行う。result を result と UTF16EncodeCodePoint (codePoint ) の文字列連結 に設定する。result を返す。
11.1.3 Static Semantics: UTF16SurrogatePairToCodePoint ( lead , trail )
抽象操作 UTF16SurrogatePairToCodePoint。引数 lead (コード単位) および trail (コード単位)。戻り値:コードポイント。 UTF-16 サロゲートペア を形成する2つのコード単位をコードポイントに変換します。 呼び出されると、次の手順を実行する。
表明 : lead は先行サロゲート であり、trail は後続サロゲート である。codePoint を (lead - 0xD800) × 0x400 + (trail - 0xDC00) + 0x10000 とする。コードポイント codePoint を返す。
11.1.4 Static Semantics: CodePointAt ( string , position )
抽象操作 CodePointAt。引数 string (String) および position (非負整数)。戻り値:レコード (フィールド:[[CodePoint]] (コードポイント), [[CodeUnitCount]] (正の整数), [[IsUnpairedSurrogate]] (Boolean))。 6.1.4 で説明されているように、string を UTF-16 で符号化されたコードポイントの列として解釈し、インデックス position にあるコード単位から始まる1つのコードポイントを読み取ります。 呼び出されると、次の手順を実行する。
size を string の長さとする。表明 : position ≥ 0 かつ position < size 。first を string 内のインデックス position にあるコード単位とする。codePoint を、数値が first の数値であるコードポイントとする。first が先行サロゲート でも後続サロゲート でもない場合、Record { [[CodePoint]] : codePoint , [[CodeUnitCount]] : 1, [[IsUnpairedSurrogate]] : false } を返す。first が後続サロゲート であるか、position + 1 = size である場合、Record { [[CodePoint]] : codePoint , [[CodeUnitCount]] : 1, [[IsUnpairedSurrogate]] : true } を返す。second を string 内のインデックス position + 1 にあるコード単位とする。second が後続サロゲート でない場合、Record { [[CodePoint]] : codePoint , [[CodeUnitCount]] : 1, [[IsUnpairedSurrogate]] : true } を返す。codePoint を UTF16SurrogatePairToCodePoint (first , second ) に設定する。Record { [[CodePoint]] : codePoint , [[CodeUnitCount]] : 2, [[IsUnpairedSurrogate]] : false } を返す。
11.1.5 Static Semantics: StringToCodePoints ( string )
抽象操作 StringToCodePoints。引数 string (String)。戻り値:リスト (要素:コードポイント)。 6.1.4 で説明されているように、string を UTF-16 で符号化された Unicode テキストとして解釈した結果となる Unicode コードポイントの列を返します。 呼び出されると、次の手順を実行する。
codePoints を新しい空の List とする。size を string の長さとする。position を 0 とする。position < size の間、次を繰り返す。codePoint を CodePointAt (string , position ) とする。codePoint .[[CodePoint]] を codePoints に追加する。position を position + codePoint .[[CodeUnitCount]] に設定する。codePoints を返す。
11.1.6 Static Semantics: ParseText ( sourceText , goalSymbol )
抽象操作 ParseText。引数 sourceText ((String または a sequence of Unicode code points)) および goalSymbol (a nonterminal in one of the ECMAScript grammars)。戻り値:(構文解析ノード または a non-empty List of SyntaxError objects)。 呼び出されると、次の手順を実行する。
sourceText が String である場合、sourceText を StringToCodePoints (sourceText ) に設定する。goalSymbol を目標記号として sourceText の構文解析を試み、構文解析結果について早期エラー 条件がないか解析する。構文解析と早期エラー 検出は、実装定義 の方法で交互に実行してもよい。構文解析に成功し、早期エラー が見つからなかった場合、構文解析によって得られた構文木のルートにある Parse Node (goalSymbol のインスタンス)を返す。 構文解析エラーおよび/または早期エラー を表す1つ以上の SyntaxError オブジェクトの List を返す。複数の構文解析エラーまたは早期エラー が存在する場合、List 内のエラーオブジェクトの個数と順序は実装定義 ですが、少なくとも1つは存在しなければならない。
注 1
ある箇所に早期エラー があり、それより後の箇所に構文エラーもあるテキストを考えます。構文解析パスの後に早期エラー パスを実行する実装は、構文エラーを報告し、早期エラー パスまでは進まない場合があります。2つの処理を交互に実行する実装は、早期エラー を報告し、構文エラーを見つけるところまで進まない場合があります。3つ目の実装は両方のエラーを報告する場合があります。これらの動作はいずれも適合しています。
注 2
11.2 ソースコードの種類
ECMAScript コードには4つの種類があります。
注 1
関数コードは一般に、関数定義(15.2 )、アロー関数定義(15.3 )、メソッド定義(15.4 )、ジェネレーター関数定義(15.5 )、Async 関数定義(15.8 )、Async ジェネレーター関数定義(15.6 )、および Async アロー関数(15.9 )の本体として提供されます。関数コードは、Function コンストラクター (20.2.1.1 )、GeneratorFunction コンストラクター (27.6.1.1 )、AsyncFunction コンストラクター (27.10.1.1 )、および AsyncGeneratorFunction コンストラクター (27.7.1.1 )への引数からも生成されます。
注 2
11.2.1 ディレクティブプロローグと Use Strict ディレクティブ
ディレクティブプロローグ は、FunctionBody 、ScriptBody 、または ModuleBody の最初の StatementListItem または ModuleItem として現れる ExpressionStatement の最長の列であり、その列内の各 ExpressionStatement は、完全に StringLiteral トークンとそれに続くセミコロンだけで構成されます。セミコロンは明示的に現れてもよく、セミコロン自動挿入(12.10 )によって挿入されてもかまいません。ディレクティブプロローグ は空の列であってもかまいません。
Use Strict ディレクティブ は、ディレクティブプロローグ 内の ExpressionStatement であり、その StringLiteral がコードポイント列 "use strict" または 'use strict' のいずれかと正確に一致するものです。Use Strict ディレクティブ には EscapeSequence または LineContinuation を含めることはできません。
ディレクティブプロローグ には複数の Use Strict ディレクティブ を含めてもかまいません。ただし、その場合、実装は警告を出してもかまいません。
注
ディレクティブプロローグ の ExpressionStatement は、包含する生成規則の評価中に通常どおり評価されます。実装は、Use Strict ディレクティブ ではなく、ディレクティブプロローグ 内に現れる ExpressionStatement に実装固有の意味を定義してもかまいません。適切な通知機構が存在する場合、ディレクティブプロローグ 内で Use Strict ディレクティブ ではなく、かつ実装によって意味が定義されていない ExpressionStatement に遭遇したとき、実装は警告を出すべきです。
11.2.2 Strict モードコード
ECMAScript の構文単位は、制限なしまたは strict モードの構文および意味論(4.3.2 )のいずれかを使用して処理できます。コードは、次の場合に strict モードコード として解釈されます。
strict モードコードではない ECMAScript コードを 非 strict コード と呼びます。
11.2.2.1 Static Semantics: IsStrict ( parseNode )
抽象操作 IsStrict。引数 parseNode (構文解析ノード )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
parseNode に一致するソーステキスト が strict モードコード である場合、true を返す。false を返す。
11.2.3 非 ECMAScript 関数
ECMAScript 実装は、ECMAScript ソーステキスト 以外のホスト定義 形式の実行可能コードで評価動作が表される関数特殊オブジェクト の評価をサポートしてもかまいません。関数オブジェクト が ECMAScript コード内で定義されているか、組込み関数であるかは、その関数オブジェクト を呼び出す、またはその関数オブジェクト から呼び出される ECMAScript コードからは観測できません。
12 ECMAScript 言語: 字句文法
ECMAScript Script または Module のソーステキストは、最初に、トークン、行終端文字、コメント、または空白である入力要素の列に変換されます。ソーステキストは左から右へ走査され、可能な限り最長のコードポイント列を次の入力要素として繰り返し取得します。
字句入力要素の識別が、その入力要素を消費する構文文法の文脈に依存する状況がいくつかあります。このため、字句文法には複数の目標記号が必要です。InputElementHashbangOrRegExp 目標は Script または Module の先頭で使用されます。InputElementRegExpOrTemplateTail 目標は、RegularExpressionLiteral 、TemplateMiddle 、または TemplateTail が許可される構文文法の文脈で使用されます。InputElementRegExp 目標記号は、RegularExpressionLiteral は許可されるものの、TemplateMiddle と TemplateTail のいずれも許可されないすべての構文文法の文脈で使用されます。InputElementTemplateTail 目標は、TemplateMiddle または TemplateTail は許可されるものの、RegularExpressionLiteral は許可されないすべての構文文法の文脈で使用されます。それ以外のすべての文脈では、InputElementDiv が字句目標記号として使用されます。
注
複数の字句目標を使用することで、セミコロン自動挿入に影響する字句上の曖昧さが存在しないことが保証されます。たとえば、先頭の除算または除算代入と、先頭の RegularExpressionLiteral の両方が許可される構文文法の文脈はありません。これはセミコロン挿入(12.10 を参照)の影響を受けません。次のような例では:
a = b
/hi/g.exec (c).map (d);
LineTerminator の後にある最初の空白でもコメントでもないコードポイントが U+002F (SOLIDUS) であり、構文上の文脈で除算または除算代入が許可される場合、LineTerminator の位置にセミコロンは挿入されません。つまり、上の例は次と同じように解釈されます。
a = b / hi / g.exec (c).map (d);
構文
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 書式制御文字(すなわち、LEFT-TO-RIGHT MARK や RIGHT-TO-LEFT MARK など、Unicode Character Database のカテゴリ「Cf」に属する文字)は、マークアップ言語などの上位レベルのプロトコルが存在しない場合に、一定範囲のテキストの書式を制御するために使用される制御コードです。
編集と表示を容易にするため、ソーステキスト内で書式制御文字を許可することは有用です。すべての書式制御文字は、コメント内、および文字列リテラル、テンプレートリテラル、正規表現リテラル内で使用できます。
U+FEFF (ZERO WIDTH NO-BREAK SPACE) は、主にテキストの先頭で、そのテキストが Unicode であることを示し、テキストの符号化方式およびバイト順を検出できるようにするために使用される書式制御文字です。この目的のための <ZWNBSP> 文字が、たとえばファイルの連結の結果として、テキストの先頭より後に現れる場合もあります。ECMAScript ソーステキスト では、コメント、文字列リテラル、テンプレートリテラル、および正規表現リテラルの外側にある <ZWNBSP> コードポイントは空白文字として扱われます(12.2 を参照)。
12.2 空白
空白コードポイントは、ソーステキストの可読性を向上させ、トークン(分割不可能な字句単位)を互いに分離するために使用されますが、それ以外の意味はありません。空白コードポイントは任意の2つのトークンの間、および入力の先頭または末尾に現れることができます。空白コードポイントは StringLiteral 、RegularExpressionLiteral 、Template 、または TemplateSubstitutionTail 内にも現れることができ、その場合はリテラル値の一部を形成する意味のあるコードポイントとみなされます。また Comment 内にも現れることができますが、それ以外の種類のトークン内には現れることができません。
ECMAScript の空白コードポイントを 表 31 に示します。
表 31: 空白コードポイント
コードポイント
名前
略称
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>
注 1
U+0020 (SPACE) および U+00A0 (NO-BREAK SPACE) のコードポイントは <USP> の一部です。
注 2
表 31 に列挙されるコードポイントを除き、ECMAScript の WhiteSpace は、Unicode の「White_Space」プロパティを持つものの、一般カテゴリ「Space_Separator」(「Zs」)に分類されないすべてのコードポイントを意図的に除外しています。
構文
WhiteSpace ::
<TAB>
<VT>
<FF>
<ZWNBSP>
<USP>
12.3 行終端文字
空白コードポイントと同様に、行終端コードポイントはソーステキストの可読性を向上させ、トークン(分割不可能な字句単位)を互いに分離するために使用されます。ただし、空白コードポイントとは異なり、行終端文字は構文文法の動作にある程度影響します。一般に、行終端文字は任意の2つのトークンの間に現れることができますが、構文文法によって禁止される箇所がいくつかあります。行終端文字はセミコロン自動挿入(12.10 )の処理にも影響します。行終端文字は、StringLiteral 、Template 、または TemplateSubstitutionTail を除くいかなるトークン内にも現れることができません。<LF> および <CR> 行終端文字は、LineContinuation の一部である場合を除き、StringLiteral トークン内に現れることができません。
行終端文字は MultiLineComment 内に現れることができますが、SingleLineComment 内には現れることができません。
行終端文字は、正規表現の \s クラスに一致する空白コードポイントの集合に含まれます。
ECMAScript の行終端コードポイントを 表 32 に示します。
表 32: 行終端コードポイント
コードポイント
Unicode 名
略称
U+000A
LINE FEED (LF)
<LF>
U+000D
CARRIAGE RETURN (CR)
<CR>
U+2028
LINE SEPARATOR
<LS>
U+2029
PARAGRAPH SEPARATOR
<PS>
表 32 にある Unicode コードポイントだけが行終端文字として扱われます。その他の改行または行分割の Unicode コードポイントは行終端文字として扱われませんが、表 31 に列挙される要件を満たす場合は空白として扱われます。
構文
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence ::
<LF>
<CR>
[lookahead ≠ <LF> ]
<LS>
<PS>
<CR>
<LF>
注
生成規則
LineTerminatorSequence ::
<CR>
<LF>
は、診断で行番号を報告する場合などに、全体として単一の行終端文字として動作するべきコードポイント列に一致します。
12.5 Hashbang コメント
Hashbang コメントは位置依存であり、他の種類のコメントと同様に、構文文法の入力要素ストリームから破棄されます。
構文
12.6 トークン
構文
CommonToken ::
IdentifierName
PrivateIdentifier
Punctuator
NumericLiteral
StringLiteral
Template
注
12.7 名前とキーワード
IdentifierName および ReservedWord は、Unicode Standard Annex #31「Identifier and Pattern Syntax」で規定される Default Identifier Syntax に、いくつかの小さな変更を加えて解釈されるトークンです。ReservedWord は IdentifierName の列挙された部分集合です。構文文法では、Identifier を ReservedWord ではない IdentifierName として定義します。Unicode 識別子文法は、Unicode Standard で規定される文字プロパティに基づいています。Unicode Standard の最新バージョンで指定されたカテゴリに属する Unicode コードポイントは、すべての適合する ECMAScript 実装によってそのカテゴリに属するものとして扱われなければなりません。ECMAScript 実装は、Unicode Standard の後の版で定義された識別子コードポイントを認識してもかまいません。
注 1
この標準では、特定のコードポイントの追加を規定しています。U+0024 (DOLLAR SIGN) および U+005F (LOW LINE) は、IdentifierName 内の任意の位置で許可されます。
構文
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 に示されています。
注 2
注 3
Unicode プロパティ「ID_Start」および「ID_Continue」を持つコードポイントの集合には、それぞれ Unicode プロパティ「Other_ID_Start」および「Other_ID_Continue」を持つコードポイントが含まれます。
12.7.1 識別子名
Unicode エスケープシーケンスは IdentifierName 内で許可され、その場合、UnicodeEscapeSequence の IdentifierCodePoint に等しい1つの Unicode コードポイントとして寄与します。UnicodeEscapeSequence に先行する \ は、いかなるコードポイントにも寄与しません。UnicodeEscapeSequence を、そうでなければ無効になるコードポイントを IdentifierName に含めるために使用することはできません。言い換えると、`` |UnicodeEscapeSequence| の列を、それが寄与する |SourceCharacter| に置き換えた場合でも、結果は元の |IdentifierName| とまったく同じ |SourceCharacter| 要素の列を持つ有効な |IdentifierName| でなければなりません。この仕様における |IdentifierName| のすべての解釈は、特定のコードポイントを寄与させるためにエスケープシーケンスが使用されたかどうかにかかわらず、その実際のコードポイントに基づきます。
Unicode Standard に従って正準的に等価な2つの IdentifierName であっても、各 UnicodeEscapeSequence を置換した後にまったく同じコードポイント列で表現されない限り、等しくありません 。
12.7.1.1 Static Semantics: 早期エラー
IdentifierStart ::
\
UnicodeEscapeSequence
IdentifierPart ::
\
UnicodeEscapeSequence
12.7.1.2 Static Semantics: IdentifierCodePoints
構文指向操作 IdentifierCodePoints。引数なし。戻り値:リスト (要素:コードポイント)。 次の生成規則ごとに定義される。
IdentifierName :: IdentifierStart
codePoint を IdentifierStart の IdentifierCodePoint とする。« codePoint » を返す。
IdentifierName ::
IdentifierName
IdentifierPart
codePoints を派生した IdentifierName の IdentifierCodePoints とする。codePoint を IdentifierPart の IdentifierCodePoint とする。codePoints と « codePoint » のリスト連結 を返す。
12.7.1.3 Static Semantics: IdentifierCodePoint
構文指向操作 IdentifierCodePoint。引数なし。戻り値:コードポイント。 次の生成規則ごとに定義される。
IdentifierStart :: IdentifierStartChar
IdentifierStartChar に一致するコードポイントを返す。
IdentifierPart :: IdentifierPartChar
IdentifierPartChar に一致するコードポイントを返す。
UnicodeEscapeSequence ::
u
Hex4Digits
数値が Hex4Digits の MV であるコードポイントを返す。
UnicodeEscapeSequence ::
u{
CodePoint
}
数値が CodePoint の MV であるコードポイントを返す。
12.7.2 キーワードと予約語
キーワード とは、IdentifierName に一致する一方で、構文上の用途も持つトークンです。つまり、何らかの構文生成規則に fixed width フォントで文字どおりに現れます。ECMAScript のキーワードには、if、while、async、await など多数あります。
予約語 とは、識別子として使用できない IdentifierName です。多くのキーワードは予約語ですが、一部は予約語ではなく、一部は特定の文脈でのみ予約されます。if と while は予約語です。await は async 関数とモジュールの内部でのみ予約されます。async は予約されておらず、制限なく変数名または文ラベルとして使用できます。
この仕様では、文法生成規則と早期エラー規則 を組み合わせて、どの名前が有効な識別子であり、どの名前が予約語であるかを規定します。以下の ReservedWord リスト内のすべてのトークンは、await と yield を除き、無条件に予約されています。await および yield の例外は、パラメーター化された構文生成規則を使用して 13.1 で規定されています。最後に、いくつかの早期エラー規則 が有効な識別子の集合を制限します。13.1.1 、14.3.1.1 、14.7.5.1 、および 15.7.1 を参照してください。まとめると、識別子名には5つのカテゴリがあります。
Math、window、toString、_ など、常に識別子として許可され、キーワードではないもの。
決して識別子として許可されないもの。すなわち、以下に列挙される ReservedWord のうち await と yield を除くもの。
文脈に応じて識別子として許可されるもの。すなわち await と yield。
strict モードコード において、文脈に応じて識別子として禁止されるもの。let、static、implements、interface、package、private、protected、および public。
常に識別子として許可される一方で、Identifier が許可されない箇所において特定の構文生成規則内ではキーワードとしても現れるもの。as、async、from、get、meta、of、set、および target。
条件付きキーワード 、または 文脈依存キーワード という用語は、最後の3つのカテゴリに属し、一部の文脈では識別子として、その他の文脈ではキーワードとして使用できるキーワードを指すために使用されることがあります。
構文
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
注 1
5.1.5 に従い、文法内のキーワードは特定の SourceCharacter 要素のリテラル列に一致します。キーワード内のコードポイントを \ UnicodeEscapeSequence で表すことはできません。
IdentifierName は \ UnicodeEscapeSequence を含むことができますが、els\u{65} と記述して「else」という名前の変数を宣言することはできません。13.1.1 の早期エラー規則 は、予約語と同じ StringValue を持つ識別子を排除します。
注 2
enum は現在、この仕様ではキーワードとして使用されていません。これは将来の予約語 であり、将来の言語拡張でキーワードとして使用するために予約されています。
同様に、implements、interface、package、private、protected、および public は、strict モードコード における将来の予約語です。
注 3
arguments および eval という名前はキーワードではありませんが、strict モードコード ではいくつかの制限を受けます。13.1.1 、8.6.4 、15.2.1 、15.5.1 、15.6.1 、および 15.8.1 を参照してください。
12.8 区切り子
構文
Punctuator ::
OptionalChainingPunctuator
OtherPunctuator
OptionalChainingPunctuator ::
?.
[lookahead ∉ DecimalDigit ]
OtherPunctuator :: one of { ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ?? ? : = += -= *= %= **= <<= >>= >>>= &= |= ^= &&= ||= ??= =>
DivPunctuator ::
/
/=
RightBracePunctuator ::
}
12.9 リテラル
12.9.1 Null リテラル
構文
NullLiteral ::
null
12.9.2 Boolean リテラル
構文
BooleanLiteral ::
true
false
12.9.3 数値リテラル
構文
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
NumericLiteralSeparator opt
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 の直後の SourceCharacter は IdentifierStart または DecimalDigit であってはなりません。
注
たとえば、3in はエラーであり、2つの入力要素 3 と in ではありません。
12.9.3.1 Static Semantics: 早期エラー
NumericLiteral :: LegacyOctalIntegerLiteral
DecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral
IsStrict (this production) が true である場合、Syntax Error です。
注
12.9.3.2 Static Semantics: MV
数値リテラルは Number 型 または BigInt 型 の値を表します。
12.9.3.3 Static Semantics: NumericValue
構文指向操作 NumericValue。引数なし。戻り値:(Number または BigInt)。 次の生成規則ごとに定義される。
NumericLiteral :: DecimalLiteral
RoundMVResult (DecimalLiteral の MV) を返す。
NumericLiteral :: NonDecimalIntegerLiteral
𝔽 (NonDecimalIntegerLiteral の MV) を返す。
NumericLiteral :: LegacyOctalIntegerLiteral
𝔽 (LegacyOctalIntegerLiteral の MV) を返す。
NumericLiteral ::
NonDecimalIntegerLiteral
BigIntLiteralSuffix
NonDecimalIntegerLiteral の MV に対応する BigInt 値 を返す。
DecimalBigIntegerLiteral ::
0
BigIntLiteralSuffix
0 ℤ を返す。
DecimalBigIntegerLiteral ::
NonZeroDigit
BigIntLiteralSuffix
NonZeroDigit の MV に対応する BigInt 値 を返す。
DecimalBigIntegerLiteral ::
NonZeroDigit
DecimalDigits
BigIntLiteralSuffix
NonZeroDigit
NumericLiteralSeparator
DecimalDigits
BigIntLiteralSuffix
n を、NumericLiteralSeparator のすべての出現を除いた DecimalDigits 内のコードポイント数とする。mv を(NonZeroDigit の MV × 10n )に DecimalDigits の MV を加えた値とする。ℤ (mv ) を返す。
12.9.4 文字列リテラル
注 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 で符号化されます。基本多言語面に属するコードポイントは、String の単一のコード単位要素として符号化されます。それ以外のすべてのコードポイントは、String の2つのコード単位要素として符号化されます。
構文
StringLiteral ::
"
DoubleStringCharacters opt
"
'
SingleStringCharacters opt
'
DoubleStringCharacters ::
DoubleStringCharacter
DoubleStringCharacters opt
SingleStringCharacters ::
SingleStringCharacter
SingleStringCharacters opt
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 に示されています。SourceCharacter は 11.1 で定義されています。
注 2
<LF> および <CR> は、空のコードポイント列を生成する LineContinuation の一部である場合を除き、文字列リテラル内に現れることができません。文字列リテラルの String 値にこれらのいずれかを含める正しい方法は、\n や \u000A などのエスケープシーケンスを使用することです。
12.9.4.1 Static Semantics: 早期エラー
EscapeSequence ::
LegacyOctalEscapeSequence
NonOctalDecimalEscapeSequence
IsStrict (this production) が true である場合、Syntax Error です。
注 1
注 2
文字列リテラルが、包含コードを strict モード にする Use Strict ディレクティブ より前に現れることがあり、実装はそのようなリテラルについて上記の規則を適用するよう注意しなければなりません。たとえば、次のソーステキストには Syntax Error が含まれます。
function invalid ( ) { "\7" ; "use strict" ; }
12.9.4.2 Static Semantics: SV
構文指向操作 SV。引数なし。戻り値:String。
文字列リテラルは String 型 の値を表します。SV は、文字列リテラルのさまざまな部分に再帰的に適用することによって、文字列リテラルの String 値を生成します。この処理の一部として、文字列リテラル内の一部の Unicode コードポイントは、以下または 12.9.3 で説明されるように、数学的な値を持つものとして解釈されます。
表 33: 文字列の単一文字エスケープシーケンス
エスケープシーケンス
コード単位値
Unicode 文字名
記号
\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 Static Semantics: MV
12.9.5 正規表現リテラル
注 1
正規表現リテラルは、そのリテラルが評価されるたびに RegExp オブジェクト(22.2 を参照)へ変換される入力要素です。プログラム内の2つの正規表現リテラルは、2つのリテラルの内容が同一であっても、互いに === と比較して等しくなることのない正規表現オブジェクトへ評価されます。RegExp オブジェクトは、実行時に new RegExp または RegExp コンストラクター を関数として呼び出すことによって作成することもできます(22.2.4 を参照)。
以下の生成規則は正規表現リテラルの構文を説明し、入力要素スキャナーによって正規表現リテラルの終端を見つけるために使用されます。RegularExpressionBody および RegularExpressionFlags を構成するソーステキストは、その後、より厳密な ECMAScript 正規表現文法(22.2.1 )を使用して再度構文解析されます。
実装は 22.2.1 で定義される ECMAScript 正規表現文法を拡張してもかまいませんが、以下で定義される RegularExpressionBody および RegularExpressionFlags の生成規則、またはこれらの生成規則によって使用される生成規則を拡張してはなりません。
構文
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
注 2
正規表現リテラルを空にすることはできません。空の正規表現リテラルを表す代わりに、コード単位列 // は単一行コメントを開始します。空の正規表現を指定するには /(?:)/ を使用してください。
12.9.5.1 Static Semantics: BodyText
構文指向操作 BodyText。引数なし。戻り値:ソーステキスト。 次の生成規則ごとに定義される。
RegularExpressionLiteral ::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionBody として認識されたソーステキストを返す。
12.9.5.2 Static Semantics: FlagText
構文指向操作 FlagText。引数なし。戻り値:ソーステキスト。 次の生成規則ごとに定義される。
RegularExpressionLiteral ::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionFlags として認識されたソーステキストを返す。
12.9.6 テンプレートリテラルの字句構成要素
構文
Template ::
NoSubstitutionTemplate
TemplateHead
NoSubstitutionTemplate ::
`
TemplateCharacters opt
`
TemplateHead ::
`
TemplateCharacters opt
${
TemplateSubstitutionTail ::
TemplateMiddle
TemplateTail
TemplateMiddle ::
}
TemplateCharacters opt
${
TemplateTail ::
}
TemplateCharacters opt
`
TemplateCharacters ::
TemplateCharacter
TemplateCharacters opt
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
注
12.9.6.1 Static Semantics: TV
構文指向操作 TV。引数なし。戻り値:(String または undefined )。 テンプレートリテラルの構成要素は、TV によって String 型 の値として解釈されます。TV は、テンプレートオブジェクトのインデックス付き構成要素(口語的にはテンプレート値)を構築するために使用されます。TV では、エスケープシーケンスは、そのエスケープシーケンスが表す Unicode コードポイントの UTF-16 コード単位に置換されます。
12.9.6.2 Static Semantics: TRV
構文指向操作 TRV。引数なし。戻り値:String。 テンプレートリテラルの構成要素は、TRV によって String 型 の値として解釈されます。TRV は、テンプレートオブジェクトの raw 構成要素(口語的にはテンプレート raw 値)を構築するために使用されます。TRV は TV と似ていますが、TRV ではエスケープシーケンスがリテラル内に現れるとおりに解釈される点が異なります。
注
TV は LineContinuation のコード単位を除外しますが、TRV はそれらを含めます。<CR><LF> および <CR> の LineTerminatorSequence は、TV と TRV の両方で <LF> に正規化されます。<CR> または <CR><LF> の列を含めるには、明示的な TemplateEscapeSequence が必要です。
12.10 セミコロン自動挿入
ほとんどの ECMAScript の文および宣言は、セミコロンで終了しなければなりません。このようなセミコロンは常にソーステキスト内に明示的に現れてもかまいません。ただし、利便性のため、特定の状況ではこのようなセミコロンをソーステキストから省略できます。これらの状況は、その状況でセミコロンがソースコードのトークンストリームに自動的に挿入される、と表現されます。
12.10.1 セミコロン自動挿入の規則
以下の規則において、「トークン」とは、箇条 12 で説明される現在の字句目標記号を使用して決定された、実際に認識された字句トークンを意味します。
セミコロン挿入には3つの基本規則があります。
ソーステキストを左から右へ構文解析しているとき、文法のどの生成規則によっても許可されないトークン(問題のあるトークン と呼びます)に遭遇した場合、次の条件の1つ以上が真であれば、問題のあるトークンの前にセミコロンが自動的に挿入されます。
問題のあるトークンが、直前のトークンから少なくとも1つの LineTerminator によって分離されている。
問題のあるトークンが } である。
直前のトークンが ) であり、挿入されたセミコロンが do-while 文(14.7.2 )の終端セミコロンとして構文解析される。
ソーステキストを左から右へ構文解析しているとき、入力トークンストリームの末尾に達し、構文解析器が入力トークンストリームを目標非終端記号の単一のインスタンスとして構文解析できない場合、入力ストリームの末尾にセミコロンが自動的に挿入されます。
ソーステキストを左から右へ構文解析しているとき、文法のある生成規則によって許可されるトークンに遭遇したものの、その生成規則が制限された生成規則 であり、そのトークンが制限された生成規則内の注記 「[no LineTerminator here]」の直後にある終端記号または非終端記号の最初のトークンになる場合(したがって、そのようなトークンを制限トークンと呼びます)、かつその制限トークンが直前のトークンから少なくとも1つの LineTerminator によって分離されている場合、その制限トークンの前にセミコロンが自動的に挿入されます。
ただし、上記の規則にはさらに優先する条件があります。セミコロンを挿入すると空文として構文解析される場合、またはそのセミコロンが for 文のヘッダー内の2つのセミコロンのうちの1つになる場合(14.7.4 を参照)、セミコロンが自動的に挿入されることはありません。
注
文法内の制限された生成規則は、次に示すものだけです。
UpdateExpression [Yield, Await] :
LeftHandSideExpression [?Yield, ?Await]
[no LineTerminator here]
++
LeftHandSideExpression [?Yield, ?Await]
[no LineTerminator here]
--
UsingDeclaration [In, Yield, Await] :
using
[no LineTerminator here]
BindingList [?In, ?Yield, ?Await, ~Pattern]
;
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 が存在した場合、++ または -- トークンの前にセミコロンが自動的に挿入されます。
using トークンに遭遇し、IdentifierName トークンの前に LineTerminator が存在する場合、using トークンの後にセミコロンが自動的に挿入されます。
continue、break、return、throw、または yield トークンに遭遇し、次のトークンの前に LineTerminator が存在する場合、continue、break、return、throw、または yield トークンの後にセミコロンが自動的に挿入されます。
アロー関数の引数の後、=> トークンの前に LineTerminator が存在する場合、セミコロンが自動的に挿入され、その区切り子によって構文エラーが発生します。
async トークンの後、function、IdentifierName 、または ( トークンの前に LineTerminator が存在する場合、セミコロンが自動的に挿入され、async トークンは後続のトークンと同じ式またはクラス要素の一部として扱われません。
async トークンの後、* トークンの前に LineTerminator が存在する場合、セミコロンが自動的に挿入され、その区切り子によって構文エラーが発生します。
その結果、ECMAScript プログラマーへの実用的な助言は次のようになります。
後置 ++ または -- 演算子は、そのオペランドと同じ行に置くべきです。
using 宣言内の BindingList は、using トークンと同じ行から開始するべきです。
return または throw 文内の Expression 、あるいは yield 式内の AssignmentExpression は、return、throw、または yield トークンと同じ行から開始するべきです。
break または continue 文内の LabelIdentifier は、break または continue トークンと同じ行に置くべきです。
アロー関数の引数の末尾とその => は同じ行に置くべきです。
非同期関数またはメソッドに先行する async トークンは、直後のトークンと同じ行に置くべきです。
12.10.2 セミコロン自動挿入の例
この節は非規範的です。
次のソース
{ 1 2 } 3
は、セミコロン自動挿入の規則を適用しても ECMAScript 文法の有効な文ではありません。これに対して、次のソース
{ 1
2 } 3
もそのままでは有効な ECMAScript 文ではありませんが、セミコロン自動挿入によって次のように変換されます。
{ 1
;2 ;} 3 ;
これは有効な ECMAScript 文です。
次のソース
for (a; b
)
は有効な ECMAScript 文ではなく、セミコロンは for 文のヘッダーに必要なため、セミコロン自動挿入によって変更されません。セミコロン自動挿入は、for 文のヘッダー内の2つのセミコロンのいずれも挿入しません。
次のソース
return
a + b
は、セミコロン自動挿入によって次のように変換されます。
return ;
a + b;
注 1
LineTerminator が式 a + b とトークン return を分離しているため、式 a + b は return 文によって返される値として扱われません。
次のソース
a = b
++c
は、セミコロン自動挿入によって次のように変換されます。
a = b;
++c;
注 2
b と ++ の間に LineTerminator があるため、トークン ++ は変数 b に適用される後置演算子として扱われません。
次のソース
if (a > b)
else c = d
は有効な ECMAScript 文ではなく、その位置では文法のどの生成規則も適用できないにもかかわらず、else トークンの前でセミコロン自動挿入によって変更されません。これは、自動的に挿入されたセミコロンが空文として構文解析されることになるためです。
次のソース
a = b + c
(d + e).print ()
は、セミコロン自動挿入によって変換されません 。これは、2行目の先頭にある括弧付き式を関数呼出しの引数リストとして解釈できるためです。
a = b + c (d + e).print ()
代入文を左丸括弧で始めなければならない場合、プログラマーはセミコロン自動挿入に頼るのではなく、直前の文の末尾に明示的なセミコロンを記述することを推奨します。
12.10.3 セミコロン自動挿入の興味深いケース
この節は非規範的です。
ECMAScript プログラムは、セミコロン自動挿入に依存することで、非常に少ないセミコロンしか使用しないスタイルで記述できます。上で説明したように、セミコロンはすべての改行位置に挿入されるわけではなく、セミコロン自動挿入は行終端文字をまたぐ複数のトークンに依存する場合があります。
ECMAScript に新しい構文機能が追加されると、新しい文法生成規則が追加される可能性があり、その結果、その前でセミコロン自動挿入に依存していた行が、構文解析時に別の文法生成規則へ変化する場合があります。
この節では、直前のソーステキストに応じてセミコロンが挿入される場合と挿入されない場合がある箇所を、セミコロン自動挿入の興味深いケースとみなします。この節の残りでは、このバージョンの ECMAScript におけるセミコロン自動挿入の興味深いケースをいくつか説明します。
12.10.3.1 文リストにおけるセミコロン自動挿入の興味深いケース
StatementList では、多くの StatementListItem がセミコロンで終了し、そのセミコロンはセミコロン自動挿入を使用して省略できます。上記の規則の結果として、式を終了する行の末尾では、次の行が次のいずれかで始まる場合、セミコロンが必要です。
12.10.3.2 セミコロン自動挿入と「[no LineTerminator here]」のケース
この節は非規範的です。
ECMAScript には「[no LineTerminator here]」を含む文法生成規則があります。これらの生成規則は、文法で省略可能なオペランドを持たせるために使用されることがあります。これらの位置に LineTerminator を導入すると、省略可能なオペランドを持たない文法生成規則を使用することになり、ソーステキストの文法生成規則が変化します。
この節の残りでは、このバージョンの ECMAScript で「[no LineTerminator here]」を使用するいくつかの生成規則について説明します。
12.10.3.2.1 省略可能なオペランドと「[no LineTerminator here]」を持つ文法生成規則の一覧
13 ECMAScript 言語: 式
13.1 識別子
構文
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
注
yield および await は文法では BindingIdentifier として許可され、以下の静的意味論 によって禁止されます。これは、次のような場合にセミコロン自動挿入が行われることを防ぐためです。
let
await 0 ;
13.1.1 Static Semantics: 早期エラー
BindingIdentifier : Identifier
IdentifierReference : yield
BindingIdentifier : yield
LabelIdentifier : yield
IsStrict (this production) が true である場合、Syntax Error です。
IdentifierReference : await
BindingIdentifier : await
LabelIdentifier : await
構文文法の目標記号が Module である場合、Syntax Error です。
BindingIdentifier [Yield, Await] : yield
この生成規則が [Yield] パラメーターを持つ場合、Syntax Error です。
BindingIdentifier [Yield, Await] : await
この生成規則が [Await] パラメーターを持つ場合、Syntax Error です。
IdentifierReference [Yield, Await] : Identifier
BindingIdentifier [Yield, Await] : Identifier
LabelIdentifier [Yield, Await] : Identifier
Identifier : IdentifierName but not ReservedWord
注
IdentifierName の StringValue は、IdentifierName 内のあらゆる Unicode エスケープシーケンスを正規化するため、そのようなエスケープを使用して、コードポイント列が ReservedWord と同じ Identifier を記述することはできません。
13.1.2 Static Semantics: StringValue
構文指向操作 StringValue。引数なし。戻り値:String。 次の生成規則ごとに定義される。
IdentifierName ::
IdentifierStart
IdentifierName
IdentifierPart
nameUnescaped を IdentifierName の IdentifierCodePoints とする。CodePointsToString (nameUnescaped ) を返す。
IdentifierReference : yield
BindingIdentifier : yield
LabelIdentifier : yield
"yield" を返す。
IdentifierReference : await
BindingIdentifier : await
LabelIdentifier : await
"await" を返す。
Identifier : IdentifierName but not ReservedWord
IdentifierName の StringValue を返す。
PrivateIdentifier ::
#
IdentifierName
0x0023 (NUMBER SIGN) と IdentifierName の StringValue の文字列連結 を返す。
ModuleExportName : StringLiteral
StringLiteral の SV を返す。
13.1.3 Runtime Semantics: Evaluation
IdentifierReference : Identifier
? ResolveBinding (Identifier の StringValue ) を返す。
IdentifierReference : yield
? ResolveBinding ("yield" ) を返す。
IdentifierReference : await
? ResolveBinding ("await" ) を返す。
注 1
IdentifierReference を評価した結果は、常に Reference 型の値です。
注 2
非 strict コード では、キーワード yield を識別子として使用できます。IdentifierReference の評価は、yield の束縛を Identifier であるかのように解決します。早期エラー による制限によって、このような評価は非 strict コード でのみ発生できることが保証されます。
13.2 基本式
構文
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]
,opt
)
(
...
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]
)
13.2.1 this キーワード
13.2.1.1 Runtime Semantics: Evaluation
PrimaryExpression : this
? ResolveThisBinding () を返す。
13.2.2 識別子参照
IdentifierReference については 13.1 を参照してください。
13.2.3 リテラル
構文
Literal :
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
13.2.3.1 Runtime Semantics: Evaluation
Literal : NullLiteral
null を返す。
Literal : BooleanLiteral
BooleanLiteral がトークン false である場合、false を返す。BooleanLiteral がトークン true である場合、true を返す。
Literal : NumericLiteral
12.9.3 で定義される NumericLiteral の NumericValue を返す。
Literal : StringLiteral
12.9.4.2 で定義される StringLiteral の SV を返す。
13.2.4 Array 初期化子
注
ArrayLiteral は Array の初期化を記述する式であり、角括弧で囲まれた0個以上の式のリストを使用し、それぞれの式が配列要素を表します。要素はリテラルである必要はなく、配列初期化子が評価されるたびに評価されます。
Array の要素は、要素リストの先頭、中間、または末尾で省略できます。要素リスト内のコンマの直前に AssignmentExpression がない場合(すなわち、先頭のコンマまたは別のコンマの後のコンマ)、欠落した配列要素は Array の長さに寄与し、後続要素のインデックスを増加させます。省略された配列要素は定義されません。配列の末尾で要素が省略された場合、その要素は Array の長さに寄与しません。
構文
ArrayLiteral [Yield, Await] :
[
Elision opt
]
[
ElementList [?Yield, ?Await]
]
[
ElementList [?Yield, ?Await]
,
Elision opt
]
ElementList [Yield, Await] :
Elision opt
AssignmentExpression [+In, ?Yield, ?Await]
Elision opt
SpreadElement [?Yield, ?Await]
ElementList [?Yield, ?Await]
,
Elision opt
AssignmentExpression [+In, ?Yield, ?Await]
ElementList [?Yield, ?Await]
,
Elision opt
SpreadElement [?Yield, ?Await]
Elision :
,
Elision
,
SpreadElement [Yield, Await] :
...
AssignmentExpression [+In, ?Yield, ?Await]
13.2.4.1 Runtime Semantics: ArrayAccumulation
構文指向操作 ArrayAccumulation。引数 array (Array) および nextIndex (整数 )。戻り値:(正常完了 (値:整数 ) または 中途完了)。 次の生成規則ごとに定義される。
Elision : ,
length を nextIndex + 1 とする。? Set (array , "length" , 𝔽 (length ), true ) を実行する。 注記 : length が 232 - 1 を超える場合、上の手順はスローする。length を返す。
Elision :
Elision
,
引数 array および (nextIndex + 1) を指定した Elision の ? ArrayAccumulation を返す。
ElementList :
Elision opt
AssignmentExpression
Elision が存在する場合、nextIndex を、引数 array および nextIndex を指定した Elision の ? ArrayAccumulation に設定する。initResult を AssignmentExpression の ? Evaluation とする。initValue を ? GetValue (initResult ) とする。! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (nextIndex )), initValue ) を実行する。 nextIndex + 1 を返す。
ElementList :
Elision opt
SpreadElement
Elision が存在する場合、nextIndex を、引数 array および nextIndex を指定した Elision の ? ArrayAccumulation に設定する。引数 array および nextIndex を指定した SpreadElement の ? ArrayAccumulation を返す。
ElementList :
ElementList
,
Elision opt
AssignmentExpression
nextIndex を、引数 array および nextIndex を指定した派生 ElementList の ? ArrayAccumulation に設定する。Elision が存在する場合、nextIndex を、引数 array および nextIndex を指定した Elision の ? ArrayAccumulation に設定する。initResult を AssignmentExpression の ? Evaluation とする。initValue を ? GetValue (initResult ) とする。! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (nextIndex )), initValue ) を実行する。 nextIndex + 1 を返す。
ElementList :
ElementList
,
Elision opt
SpreadElement
nextIndex を、引数 array および nextIndex を指定した派生 ElementList の ? ArrayAccumulation に設定する。Elision が存在する場合、nextIndex を、引数 array および nextIndex を指定した Elision の ? ArrayAccumulation に設定する。引数 array および nextIndex を指定した SpreadElement の ? ArrayAccumulation を返す。
SpreadElement :
...
AssignmentExpression
spreadRef を AssignmentExpression の ? Evaluation とする。spreadObj を ? GetValue (spreadRef ) とする。iteratorRecord を ? GetIterator (spreadObj , sync ) とする。次を繰り返す。next を ? IteratorStepValue (iteratorRecord ) とする。next が done である場合、nextIndex を返す。! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (nextIndex )), next ) を実行する。 nextIndex を nextIndex + 1 に設定する。
注
標準組込み Array プロトタイプオブジェクトが、[[Set]] を使用した新しい自身のプロパティの作成を妨げるように変更されている場合でも、配列に自身のプロパティが確実に定義されるようにするため、CreateDataPropertyOrThrow が使用されます。
13.2.4.2 Runtime Semantics: Evaluation
ArrayLiteral :
[
Elision opt
]
array を ! ArrayCreate (0) とする。Elision が存在する場合、引数 array および 0 を指定した Elision の ? ArrayAccumulation を実行する。 array を返す。
ArrayLiteral :
[
ElementList
]
array を ! ArrayCreate (0) とする。引数 array および 0 を指定した ElementList の ? ArrayAccumulation を実行する。 array を返す。
ArrayLiteral :
[
ElementList
,
Elision opt
]
array を ! ArrayCreate (0) とする。nextIndex を、引数 array および 0 を指定した ElementList の ? ArrayAccumulation とする。Elision が存在する場合、引数 array および nextIndex を指定した Elision の ? ArrayAccumulation を実行する。 array を返す。
13.2.5 オブジェクト初期化子
注 1
オブジェクト初期化子は、リテラルに似た形式で記述された、Object の初期化を説明する式です。波括弧で囲まれた、0個以上のプロパティキー と対応する値の組のリストです。値はリテラルである必要はなく、オブジェクト初期化子が評価されるたびに評価されます。
構文
ObjectLiteral [Yield, Await] :
{
}
{
PropertyDefinitionList [?Yield, ?Await]
,opt
}
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]
注 2
注 3
CoverInitializedName の意義については次の節を参照してください。
13.2.5.1 Static Semantics: 早期エラー
ObjectLiteral :
{
PropertyDefinitionList
,opt
}
注 1
PropertyDefinition : MethodDefinition
PropertyDefinition : CoverInitializedName
注 2
この仕様の他の箇所には、特定の状況で LeftHandSideExpression が AssignmentPattern を被覆しなければならない ことを要求する早期エラー規則 があります。その結果、ObjectLiteral は ObjectAssignmentPattern の被覆文法として機能します。CoverInitializedName 生成規則は AssignmentProperty を完全に被覆するために必要ですが、実際のオブジェクト初期化子内では有効ではありません。
具体的には、実際の ObjectLiteral が期待される文脈では、上記の早期エラー規則 によって CoverInitializedName の使用が防止されます。しかし、ObjectLiteral が被覆文法として使用される場合、「被覆しなければならない 」の意味論によって、ObjectLiteral 内の Parse Node は早期エラー規則 の対象とならないため、CoverInitializedName が許可されます。
たとえば、次を考えます。
let o = {f = 1 };
{f = 1} は CoverInitializedName を持つ ObjectLiteral として構文解析され、この早期エラー規則 によって Syntax Error になります。
これに対して、次を考えます。
({f = 1 } = {f : 2 });
ここでも {f = 1} は最初に CoverInitializedName を持つ ObjectLiteral として構文解析されますが、これは AssignmentExpression の LeftHandSideExpression であるため、AssignmentPattern を被覆しなければならず、その結果、ObjectLiteral と CoverInitializedName は早期エラー規則 の対象になりません。代わりに {f = 1} は AssignmentProperty を持つ ObjectAssignmentPattern として再構文解析され、Syntax Error は発生しません。
13.2.5.2 Static Semantics: IsComputedPropertyKey
構文指向操作 IsComputedPropertyKey。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
PropertyName : LiteralPropertyName
false を返す。
PropertyName : ComputedPropertyName
true を返す。
13.2.5.3 Static Semantics: PropertyDefinitionNodes
構文指向操作 PropertyDefinitionNodes。引数なし。戻り値:リスト (要素:構文解析ノード )。 次の生成規則ごとに定義される。
ObjectLiteral :
{
}
新しい空の List を返す。
PropertyDefinitionList : PropertyDefinition
« PropertyDefinition » を返す。
PropertyDefinitionList :
PropertyDefinitionList
,
PropertyDefinition
head を派生 PropertyDefinitionList の PropertyDefinitionNodes とする。head と « PropertyDefinition » のリスト連結 を返す。
13.2.5.4 Static Semantics: PropertyNameList
構文指向操作 PropertyNameList。引数なし。戻り値:リスト (要素:String)。 次の生成規則ごとに定義される。
PropertyDefinitionList : PropertyDefinition
propertyName を PropertyDefinition の PropName とする。propertyName が empty である場合、新しい空の List を返す。« propertyName » を返す。
PropertyDefinitionList :
PropertyDefinitionList
,
PropertyDefinition
list を PropertyDefinitionList の PropertyNameList とする。propertyName を PropertyDefinition の PropName とする。propertyName が empty である場合、list を返す。list と « propertyName » のリスト連結 を返す。
13.2.5.5 Runtime Semantics: Evaluation
ObjectLiteral :
{
}
OrdinaryObjectCreate (%Object.prototype% ) を返す。
ObjectLiteral :
{
PropertyDefinitionList
,opt
}
obj を OrdinaryObjectCreate (%Object.prototype% ) とする。引数 obj を指定した PropertyDefinitionList の ? PropertyDefinitionEvaluation を実行する。 obj を返す。
LiteralPropertyName : IdentifierName
IdentifierName の StringValue を返す。
LiteralPropertyName : StringLiteral
StringLiteral の SV を返す。
LiteralPropertyName : NumericLiteral
number を NumericLiteral の NumericValue とする。! ToString (number ) を返す。
ComputedPropertyName :
[
AssignmentExpression
]
exprValue を AssignmentExpression の ? Evaluation とする。propertyName を ? GetValue (exprValue ) とする。? ToPropertyKey (propertyName ) を返す。
13.2.5.6 Runtime Semantics: PropertyDefinitionEvaluation
構文指向操作 PropertyDefinitionEvaluation。引数 obj (Object)。戻り値:(正常完了 (値:unused ) または 中途完了)。 次の生成規則ごとに定義される。
PropertyDefinitionList :
PropertyDefinitionList
,
PropertyDefinition
引数 obj を指定した PropertyDefinitionList の ? PropertyDefinitionEvaluation を実行する。 引数 obj を指定した PropertyDefinition の ? PropertyDefinitionEvaluation を実行する。 unused を返す。
PropertyDefinition :
...
AssignmentExpression
exprValue を AssignmentExpression の ? Evaluation とする。fromValue を ? GetValue (exprValue ) とする。excludedNames を新しい空の List とする。? CopyDataProperties (obj , fromValue , excludedNames ) を実行する。 unused を返す。
PropertyDefinition : IdentifierReference
propertyName を IdentifierReference の StringValue とする。exprValue を IdentifierReference の ? Evaluation とする。propertyValue を ? GetValue (exprValue ) とする。表明 : obj は構成不可のプロパティを持たない、通常の拡張可能なオブジェクトである。! CreateDataPropertyOrThrow (obj , propertyName , propertyValue ) を実行する。 unused を返す。
PropertyDefinition :
PropertyName
:
AssignmentExpression
propertyKey を PropertyName の ? Evaluation とする。この PropertyDefinition が、ParseJSON のために評価されている Script 内に含まれる場合(ParseJSON の手順 6 を参照)、isProtoSetter を false とする。 そうでなく、propertyKey が "__proto__" であり、PropertyName の IsComputedPropertyKey が false である場合、isProtoSetter を true とする。 そうでない場合、isProtoSetter を false とする。 IsAnonymousFunctionDefinition (AssignmentExpression ) が true であり、isProtoSetter が false である場合、propertyValue を、引数 propertyKey を指定した AssignmentExpression の ? NamedEvaluation とする。そうでない場合、exprValueRef を AssignmentExpression の ? Evaluation とする。propertyValue を ? GetValue (exprValueRef ) とする。 isProtoSetter が true である場合、propertyValue が Object であるか、propertyValue が null である場合、! obj .[[SetPrototypeOf]] (propertyValue ) を実行する。 unused を返す。表明 : obj は構成不可のプロパティを持たない、通常の拡張可能なオブジェクトである。! CreateDataPropertyOrThrow (obj , propertyKey , propertyValue ) を実行する。 unused を返す。
PropertyDefinition : MethodDefinition
result を、引数 obj および true を指定した MethodDefinition の ? MethodDefinitionEvaluation とする。表明 : result は empty である。unused を返す。
13.2.6 関数定義式
PrimaryExpression : FunctionExpression
については 15.2 を参照してください。
PrimaryExpression : GeneratorExpression
については 15.5 を参照してください。
PrimaryExpression : ClassExpression
については 15.7 を参照してください。
PrimaryExpression : AsyncFunctionExpression
については 15.8 を参照してください。
PrimaryExpression : AsyncGeneratorExpression
については 15.6 を参照してください。
13.2.7 正規表現リテラル
構文
12.9.5 を参照してください。
13.2.7.1 Static Semantics: 早期エラー
PrimaryExpression : RegularExpressionLiteral
13.2.7.2 Static Semantics: IsValidRegularExpressionLiteral ( literal )
抽象操作 IsValidRegularExpressionLiteral。引数 literal (a RegularExpressionLiteral Parse Node )。戻り値:Boolean。 引数が有効な正規表現リテラルであるかどうかを判定します。 呼び出されると、次の手順を実行する。
flags を literal の FlagText とする。flags が d、g、i、m、s、u、v、または y 以外のコードポイントを含む場合、false を返す。flags が同じコードポイントを複数回含む場合、false を返す。flags が u を含む場合、u を true とする。そうでない場合、u を false とする。flags が v を含む場合、v を true とする。そうでない場合、v を false とする。patternText を literal の BodyText とする。u が false であり、v が false である場合、stringValue を CodePointsToString (patternText ) とする。patternText を、stringValue の各16ビット要素を Unicode BMP コードポイントとして解釈して得られるコードポイント列に設定する。要素には UTF-16 デコードを適用しない。parseResult を ParsePattern (patternText , u , v ) とする。parseResult が Parse Node である場合、true を返す。false を返す。
13.2.7.3 Runtime Semantics: Evaluation
PrimaryExpression : RegularExpressionLiteral
pattern を CodePointsToString (RegularExpressionLiteral の BodyText ) とする。flags を CodePointsToString (RegularExpressionLiteral の FlagText ) とする。! RegExpCreate (pattern , flags ) を返す。
13.2.8 テンプレートリテラル
構文
TemplateLiteral [Yield, Await, Tagged] :
NoSubstitutionTemplate
SubstitutionTemplate [?Yield, ?Await]
SubstitutionTemplate [Yield, Await] :
TemplateHead
Expression [+In, ?Yield, ?Await]
TemplateSpans [?Yield, ?Await]
TemplateSpans [Yield, Await] :
TemplateTail
TemplateMiddleList [?Yield, ?Await]
TemplateTail
TemplateMiddleList [Yield, Await] :
TemplateMiddle
Expression [+In, ?Yield, ?Await]
TemplateMiddleList [?Yield, ?Await]
TemplateMiddle
Expression [+In, ?Yield, ?Await]
13.2.8.1 Static Semantics: 早期エラー
TemplateLiteral [Yield, Await, Tagged] : NoSubstitutionTemplate
TemplateLiteral [Yield, Await, Tagged] : SubstitutionTemplate [?Yield, ?Await]
13.2.8.2 Static Semantics: TemplateStrings
構文指向操作 TemplateStrings。引数 escapes ((raw または cooked ))。戻り値:リスト (要素:(String または undefined ))。 次の生成規則ごとに定義される。
TemplateLiteral : NoSubstitutionTemplate
« TemplateString (NoSubstitutionTemplate , escapes ) » を返す。
SubstitutionTemplate :
TemplateHead
Expression
TemplateSpans
head を « TemplateString (TemplateHead , escapes ) » とする。tail を、引数 escapes を指定した TemplateSpans の TemplateStrings とする。head と tail のリスト連結 を返す。
TemplateSpans : TemplateTail
« TemplateString (TemplateTail , escapes ) » を返す。
TemplateSpans :
TemplateMiddleList
TemplateTail
middle を、引数 escapes を指定した TemplateMiddleList の TemplateStrings とする。tail を « TemplateString (TemplateTail , escapes ) » とする。middle と tail のリスト連結 を返す。
TemplateMiddleList :
TemplateMiddle
Expression
« TemplateString (TemplateMiddle , escapes ) » を返す。
TemplateMiddleList :
TemplateMiddleList
TemplateMiddle
Expression
front を、引数 escapes を指定した TemplateMiddleList の TemplateStrings とする。last を « TemplateString (TemplateMiddle , escapes ) » とする。front と last のリスト連結 を返す。
13.2.8.3 Static Semantics: TemplateString ( templateToken , escapes )
抽象操作 TemplateString。引数 templateToken ((a NoSubstitutionTemplate Parse Node 、a TemplateHead Parse Node 、a TemplateMiddle Parse Node または a TemplateTail Parse Node )) および escapes ((raw または cooked ))。戻り値:(String または undefined )。 呼び出されると、次の手順を実行する。
escapes が raw である場合、templateToken の TRV を返す。templateToken の TV を返す。
注
この操作は、escapes が raw であり、templateToken が NotEscapeSequence を含む場合、undefined を返します。それ以外のすべての場合では String を返します。
13.2.8.4 GetTemplateObject ( templateLiteral )
抽象操作 GetTemplateObject。引数 templateLiteral (構文解析ノード )。戻り値:Array。 呼び出されると、次の手順を実行する。
realm を現在の Realm Record とする。templateRegistry を realm .[[TemplateMap]] とする。templateRegistry の各要素 element について、次を行う。element .[[Site]] が templateLiteral と同じ Parse Node である場合、element .[[Array]] を返す。rawStrings を、引数 raw を指定した templateLiteral の TemplateStrings とする。表明 : rawStrings は String の List である。cookedStrings を、引数 cooked を指定した templateLiteral の TemplateStrings とする。count を List cookedStrings の要素数とする。表明 : count ≤ 232 - 1。template を ! ArrayCreate (count ) とする。rawObj を ! ArrayCreate (count ) とする。index を 0 とする。index < count の間、次を繰り返す。propertyKey を ! ToString (𝔽 (index )) とする。cookedValue を cookedStrings [index ] とする。! DefinePropertyOrThrow (template , propertyKey , PropertyDescriptor { [[Value]] : cookedValue , [[Writable]] : false , [[Enumerable]] : true , [[Configurable]] : false }) を実行する。 rawValue を String 値 rawStrings [index ] とする。! DefinePropertyOrThrow (rawObj , propertyKey , PropertyDescriptor { [[Value]] : rawValue , [[Writable]] : false , [[Enumerable]] : true , [[Configurable]] : false }) を実行する。 index を index + 1 に設定する。! SetIntegrityLevel (rawObj , frozen ) を実行する。 ! DefinePropertyOrThrow (template , "raw" , PropertyDescriptor { [[Value]] : rawObj , [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 ! SetIntegrityLevel (template , frozen ) を実行する。 Record { [[Site]] : templateLiteral , [[Array]] : template } を realm .[[TemplateMap]] に追加する。template を返す。
注 1
テンプレートオブジェクトの作成が中断完了 になることはありません。
注 2
Realm のプログラムコード内の各 TemplateLiteral は、タグ付き Template(13.2.8.6 )の評価で使用される一意なテンプレートオブジェクトに関連付けられます。テンプレートオブジェクトは凍結され、特定のタグ付き Template が評価されるたびに同じテンプレートオブジェクトが使用されます。テンプレートオブジェクトを TemplateLiteral の最初の評価時に遅延作成するか、最初の評価前に先行して作成するかは実装上の選択であり、ECMAScript コードから観測できません。
注 3
この仕様の将来の版では、テンプレートオブジェクトの追加の列挙不可プロパティが定義される可能性があります。
13.2.8.5 Runtime Semantics: SubstitutionEvaluation
構文指向操作 SubstitutionEvaluation。引数なし。戻り値:(正常完了 (値:リスト (要素:ECMAScript 言語値 )) または 中途完了)。 次の生成規則ごとに定義される。
TemplateSpans : TemplateTail
新しい空の List を返す。
TemplateSpans :
TemplateMiddleList
TemplateTail
TemplateMiddleList の ? SubstitutionEvaluation を返す。
TemplateMiddleList :
TemplateMiddle
Expression
subRef を Expression の ? Evaluation とする。sub を ? GetValue (subRef ) とする。« sub » を返す。
TemplateMiddleList :
TemplateMiddleList
TemplateMiddle
Expression
preceding を TemplateMiddleList の ? SubstitutionEvaluation とする。nextRef を Expression の ? Evaluation とする。next を ? GetValue (nextRef ) とする。preceding と « next » のリスト連結 を返す。
13.2.8.6 Runtime Semantics: Evaluation
TemplateLiteral : NoSubstitutionTemplate
12.9.6 で定義される NoSubstitutionTemplate の TV を返す。
SubstitutionTemplate :
TemplateHead
Expression
TemplateSpans
head を、12.9.6 で定義される TemplateHead の TV とする。subRef を Expression の ? Evaluation とする。sub を ? GetValue (subRef ) とする。middle を ? ToString (sub ) とする。tail を TemplateSpans の ? Evaluation とする。head 、middle 、および tail の文字列連結 を返す。
注 1
Expression の値に適用される文字列変換の意味論は、+ 演算子よりも String.prototype.concat に似ています。
TemplateSpans : TemplateTail
12.9.6 で定義される TemplateTail の TV を返す。
TemplateSpans :
TemplateMiddleList
TemplateTail
head を TemplateMiddleList の ? Evaluation とする。tail を、12.9.6 で定義される TemplateTail の TV とする。head と tail の文字列連結 を返す。
TemplateMiddleList :
TemplateMiddle
Expression
head を、12.9.6 で定義される TemplateMiddle の TV とする。subRef を Expression の ? Evaluation とする。sub を ? GetValue (subRef ) とする。middle を ? ToString (sub ) とする。head と middle の文字列連結 を返す。
注 2
Expression の値に適用される文字列変換の意味論は、+ 演算子よりも String.prototype.concat に似ています。
TemplateMiddleList :
TemplateMiddleList
TemplateMiddle
Expression
rest を TemplateMiddleList の ? Evaluation とする。middle を、12.9.6 で定義される TemplateMiddle の TV とする。subRef を Expression の ? Evaluation とする。sub を ? GetValue (subRef ) とする。last を ? ToString (sub ) とする。rest 、middle 、および last の文字列連結 を返す。
注 3
Expression の値に適用される文字列変換の意味論は、+ 演算子よりも String.prototype.concat に似ています。
13.2.9 グループ化演算子
13.2.9.1 Static Semantics: 早期エラー
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
13.2.9.2 Runtime Semantics: Evaluation
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
expr を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。expr の ? Evaluation を返す。
ParenthesizedExpression :
(
Expression
)
Expression の ? Evaluation を返す。これは Reference 型である場合があります。
注
このアルゴリズムは、Expression の Evaluation に GetValue を適用しません。その主な理由は、delete や typeof などの演算子を括弧付き式に適用できるようにするためです。
13.3 左辺式
構文
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]
,opt
)
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]
補助構文
次の生成規則のインスタンスを処理するとき
CallExpression : CoverCallExpressionAndAsyncArrowHead
CoverCallExpressionAndAsyncArrowHead の解釈は、次の文法を使用して詳細化されます。
CallMemberExpression [Yield, Await] :
MemberExpression [?Yield, ?Await]
Arguments [?Yield, ?Await]
13.3.1 静的意味論
13.3.1.1 Static Semantics: 早期エラー
OptionalChain :
?.
TemplateLiteral
OptionalChain
TemplateLiteral
注
この生成規則は、次のコードにセミコロン自動挿入規則(12.10 )が適用されるのを防ぐために存在します。
a?.b
`c`
これにより、2つの有効な文として解釈されることを防ぎます。その目的は、オプショナルチェーンを使用しない次の類似コードとの一貫性を保つことです。
a.b
`c`
これは有効な文であり、セミコロン自動挿入は適用されません。
ImportMeta :
import
.
meta
構文上の目標記号が Module でない場合、Syntax Error です。
13.3.2 プロパティアクセサー
注
プロパティには、次のドット記法を使用して名前でアクセスできます。
または、次の括弧記法を使用します。
ドット記法は、次の構文変換によって説明されます。
は、動作上、次と同一です。
同様に、
は、動作上、次と同一です。
ここで <identifier-name-string > は IdentifierName の StringValue です。
13.3.2.1 Runtime Semantics: Evaluation
MemberExpression :
MemberExpression
[
Expression
]
baseRef を MemberExpression の ? Evaluation とする。baseValue を ? GetValue (baseRef ) とする。strict を IsStrict (this MemberExpression ) とする。? EvaluatePropertyAccessWithExpressionKey (baseValue , Expression , strict ) を返す。
MemberExpression :
MemberExpression
.
IdentifierName
baseRef を MemberExpression の ? Evaluation とする。baseValue を ? GetValue (baseRef ) とする。strict を IsStrict (this MemberExpression ) とする。EvaluatePropertyAccessWithIdentifierKey (baseValue , IdentifierName , strict ) を返す。
MemberExpression :
MemberExpression
.
PrivateIdentifier
baseRef を MemberExpression の ? Evaluation とする。baseValue を ? GetValue (baseRef ) とする。fieldNameString を PrivateIdentifier の StringValue とする。MakePrivateReference (baseValue , fieldNameString ) を返す。
CallExpression :
CallExpression
[
Expression
]
baseRef を CallExpression の ? Evaluation とする。baseValue を ? GetValue (baseRef ) とする。strict を IsStrict (this CallExpression ) とする。? EvaluatePropertyAccessWithExpressionKey (baseValue , Expression , strict ) を返す。
CallExpression :
CallExpression
.
IdentifierName
baseRef を CallExpression の ? Evaluation とする。baseValue を ? GetValue (baseRef ) とする。strict を IsStrict (this CallExpression ) とする。EvaluatePropertyAccessWithIdentifierKey (baseValue , IdentifierName , strict ) を返す。
CallExpression :
CallExpression
.
PrivateIdentifier
baseRef を CallExpression の ? Evaluation とする。baseValue を ? GetValue (baseRef ) とする。fieldNameString を PrivateIdentifier の StringValue とする。MakePrivateReference (baseValue , fieldNameString ) を返す。
13.3.3 EvaluatePropertyAccessWithExpressionKey ( baseValue , expr , strict )
抽象操作 EvaluatePropertyAccessWithExpressionKey。引数 baseValue (ECMAScript 言語値 )、expr (an Expression Parse Node ) および strict (Boolean)。戻り値:(正常完了 (値:Referenceレコード ) または 中途完了)。 呼び出されると、次の手順を実行する。
propertyNameRef を expr の ? Evaluation とする。propertyNameValue を ? GetValue (propertyNameRef ) とする。注記 : ほとんどの場合、この手順の直後に propertyNameValue に対して ToPropertyKey が実行される。ただし、a[b] = c の場合、c の評価後まで実行されない。Reference Record { [[Base]] : baseValue , [[ReferencedName]] : propertyNameValue , [[Strict]] : strict , [[ThisValue]] : empty } を返す。
13.3.4 EvaluatePropertyAccessWithIdentifierKey ( baseValue , identifierName , strict )
抽象操作 EvaluatePropertyAccessWithIdentifierKey。引数 baseValue (ECMAScript 言語値 )、identifierName (an IdentifierName Parse Node ) および strict (Boolean)。戻り値:Referenceレコード 。 呼び出されると、次の手順を実行する。
propertyNameString を identifierName の StringValue とする。Reference Record { [[Base]] : baseValue , [[ReferencedName]] : propertyNameString , [[Strict]] : strict , [[ThisValue]] : empty } を返す。
13.3.5 new 演算子
13.3.5.1 Runtime Semantics: Evaluation
NewExpression :
new
NewExpression
? EvaluateNew (NewExpression , empty ) を返す。
MemberExpression :
new
MemberExpression
Arguments
? EvaluateNew (MemberExpression , Arguments ) を返す。
13.3.5.1.1 EvaluateNew ( constructExpr , argumentsNode )
抽象操作 EvaluateNew。引数 constructExpr ((a NewExpression Parse Node または a MemberExpression Parse Node )) および argumentsNode ((empty または an Arguments Parse Node ))。戻り値:(正常完了 (値:Object) または 中途完了)。 呼び出されると、次の手順を実行する。
ref を constructExpr の ? Evaluation とする。ctor を ? GetValue (ref ) とする。argumentsNode が empty である場合、argList を新しい空の List とする。そうでない場合、argList を argumentsNode の ? ArgumentListEvaluation とする。 IsConstructor (ctor ) が false である場合、TypeError 例外をスローする。? Construct (ctor , argList ) を返す。
13.3.6 関数呼出し
13.3.6.1 Runtime Semantics: Evaluation
CallExpression : CoverCallExpressionAndAsyncArrowHead
expr を CoverCallExpressionAndAsyncArrowHead によって被覆される CallMemberExpression とする。memberExpr を expr の MemberExpression とする。args を expr の Arguments とする。ref を memberExpr の ? Evaluation とする。func を ? GetValue (ref ) とする。ref が Reference Record であり、IsPropertyReference (ref ) が false であり、ref .[[ReferencedName]] が "eval" である場合、SameValue (func , %eval% ) が true である場合、argList を args の ? ArgumentListEvaluation とする。argList が要素を持たない場合、undefined を返す。evalArg を argList の最初の要素とする。IsStrict (this CallExpression ) が true である場合、strictCaller を true とする。そうでない場合、strictCaller を false とする。? PerformEval (evalArg , strictCaller , true ) を返す。 thisCall をこの CallExpression とする。tailCall を IsInTailPosition (thisCall ) とする。? EvaluateCall (func , ref , args , tailCall ) を返す。
手順 6.a.v を実行する CallExpression の評価を direct eval と呼びます。
CallExpression :
CallExpression
Arguments
ref を CallExpression の ? Evaluation とする。func を ? GetValue (ref ) とする。thisCall をこの CallExpression とする。tailCall を IsInTailPosition (thisCall ) とする。? EvaluateCall (func , ref , Arguments , tailCall ) を返す。
13.3.6.2 EvaluateCall ( func , thisValueRef , argumentListNode , tailPosition )
抽象操作 EvaluateCall。引数 func (ECMAScript 言語値 )、thisValueRef ((ECMAScript 言語値 または Referenceレコード ))、argumentListNode (構文解析ノード ) および tailPosition (Boolean)。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 呼び出されると、次の手順を実行する。
thisValueRef が Reference Record である場合、IsPropertyReference (thisValueRef ) が true である場合、thisValue を GetThisValue (thisValueRef ) とする。そうでない場合、refEnv を thisValueRef .[[Base]] とする。表明 : refEnv は Environment Record である。thisValue を refEnv .WithBaseObject () とする。 そうでない場合、thisValue を undefined とする。 argList を argumentListNode の ? ArgumentListEvaluation とする。func が Object でない場合、TypeError 例外をスローする。IsCallable (func ) が false である場合、TypeError 例外をスローする。tailPosition が true である場合、PrepareForTailCall () を実行する。? Call (func , thisValue , argList ) を返す。
13.3.7 super キーワード
13.3.7.1 Runtime Semantics: Evaluation
SuperProperty :
super
[
Expression
]
envRecord を GetThisEnvironment () とする。actualThis を ? envRecord .GetThisBinding () とする。propertyNameRef を Expression の ? Evaluation とする。propertyNameValue を ? GetValue (propertyNameRef ) とする。strict を IsStrict (this SuperProperty ) とする。注記 : ほとんどの場合、この手順の直後に propertyNameValue に対して ToPropertyKey が実行される。ただし、super[b] = c の場合、c の評価後まで実行されない。MakeSuperPropertyReference (actualThis , propertyNameValue , strict ) を返す。
SuperProperty :
super
.
IdentifierName
envRecord を GetThisEnvironment () とする。actualThis を ? envRecord .GetThisBinding () とする。propertyKey を IdentifierName の StringValue とする。strict を IsStrict (this SuperProperty ) とする。MakeSuperPropertyReference (actualThis , propertyKey , strict ) を返す。
SuperCall :
super
Arguments
newTarget を GetNewTarget () とする。表明 : newTarget はコンストラクター である。superCtor を GetSuperConstructor () とする。argList を Arguments の ? ArgumentListEvaluation とする。IsConstructor (superCtor ) が false である場合、TypeError 例外をスローする。result を ? Construct (superCtor , argList , newTarget ) とする。thisER を GetThisEnvironment () とする。表明 : thisER は Function Environment Record である。? BindThisValue (thisER , result ) を実行する。 funcObj を thisER .[[FunctionObject]] とする。表明 : funcObj は ECMAScript 関数オブジェクト である。? InitializeInstanceElements (result , funcObj ) を実行する。 result を返す。
13.3.7.2 GetSuperConstructor ( )
抽象操作 GetSuperConstructor。引数なし。戻り値:(Object または null )。 呼び出されると、次の手順を実行する。
envRecord を GetThisEnvironment () とする。表明 : envRecord は Function Environment Record である。activeFunc を envRecord .[[FunctionObject]] とする。表明 : activeFunc は ECMAScript 関数オブジェクト である。superCtor を ! activeFunc .[[GetPrototypeOf]] () とする。superCtor を返す。
13.3.7.3 MakeSuperPropertyReference ( actualThis , propertyKey , strict )
抽象操作 MakeSuperPropertyReference。引数 actualThis (ECMAScript 言語値 )、propertyKey (ECMAScript 言語値 ) および strict (Boolean)。戻り値:Super Referenceレコード 。 呼び出されると、次の手順を実行する。
envRecord を GetThisEnvironment () とする。表明 : envRecord .HasSuperBinding () は true である。表明 : envRecord は Function Environment Record である。baseValue を GetSuperBase (envRecord ) とする。Reference Record { [[Base]] : baseValue , [[ReferencedName]] : propertyKey , [[Strict]] : strict , [[ThisValue]] : actualThis } を返す。
13.3.8 引数リスト
注
13.3.8.1 Runtime Semantics: ArgumentListEvaluation
構文指向操作 ArgumentListEvaluation。引数なし。戻り値:(正常完了 (値:リスト (要素:ECMAScript 言語値 )) または 中途完了)。 次の生成規則ごとに定義される。
Arguments :
(
)
新しい空の List を返す。
ArgumentList : AssignmentExpression
ref を AssignmentExpression の ? Evaluation とする。arg を ? GetValue (ref ) とする。« arg » を返す。
ArgumentList :
...
AssignmentExpression
list を新しい空の List とする。spreadRef を AssignmentExpression の ? Evaluation とする。spreadObj を ? GetValue (spreadRef ) とする。iteratorRecord を ? GetIterator (spreadObj , sync ) とする。次を繰り返す。next を ? IteratorStepValue (iteratorRecord ) とする。next が done である場合、list を返す。next を list に追加する。
ArgumentList :
ArgumentList
,
AssignmentExpression
precedingArgs を ArgumentList の ? ArgumentListEvaluation とする。ref を AssignmentExpression の ? Evaluation とする。arg を ? GetValue (ref ) とする。precedingArgs と « arg » のリスト連結 を返す。
ArgumentList :
ArgumentList
,
...
AssignmentExpression
precedingArgs を ArgumentList の ? ArgumentListEvaluation とする。spreadRef を AssignmentExpression の ? Evaluation とする。iteratorRecord を ? GetIterator (? GetValue (spreadRef ), sync ) とする。次を繰り返す。next を ? IteratorStepValue (iteratorRecord ) とする。next が done である場合、precedingArgs を返す。next を precedingArgs に追加する。
TemplateLiteral : NoSubstitutionTemplate
templateLiteral をこの TemplateLiteral とする。siteObj を GetTemplateObject (templateLiteral ) とする。« siteObj » を返す。
TemplateLiteral : SubstitutionTemplate
templateLiteral をこの TemplateLiteral とする。siteObj を GetTemplateObject (templateLiteral ) とする。remaining を SubstitutionTemplate の ? ArgumentListEvaluation とする。« siteObj » と remaining のリスト連結 を返す。
SubstitutionTemplate :
TemplateHead
Expression
TemplateSpans
firstSubRef を Expression の ? Evaluation とする。firstSub を ? GetValue (firstSubRef ) とする。restSub を TemplateSpans の ? SubstitutionEvaluation とする。表明 : restSub は空である可能性のある List である。« firstSub » と restSub のリスト連結 を返す。
13.3.9 オプショナルチェーン
注 オプショナルチェーンは、1つ以上のプロパティアクセスおよび関数呼出しのチェーンであり、その最初のものがトークン ?. で始まります。
13.3.9.1 Runtime Semantics: Evaluation
OptionalExpression :
MemberExpression
OptionalChain
baseRef を MemberExpression の ? Evaluation とする。baseValue を ? GetValue (baseRef ) とする。baseValue が undefined または null のいずれかである場合、undefined を返す。引数 baseValue および baseRef を指定した OptionalChain の ? ChainEvaluation を返す。
OptionalExpression :
CallExpression
OptionalChain
baseRef を CallExpression の ? Evaluation とする。baseValue を ? GetValue (baseRef ) とする。baseValue が undefined または null のいずれかである場合、undefined を返す。引数 baseValue および baseRef を指定した OptionalChain の ? ChainEvaluation を返す。
OptionalExpression :
OptionalExpression
OptionalChain
baseRef を OptionalExpression の ? Evaluation とする。baseValue を ? GetValue (baseRef ) とする。baseValue が undefined または null のいずれかである場合、undefined を返す。引数 baseValue および baseRef を指定した OptionalChain の ? ChainEvaluation を返す。
13.3.9.2 Runtime Semantics: ChainEvaluation
構文指向操作 ChainEvaluation。引数 baseValue (ECMAScript 言語値 ) および baseRef ((ECMAScript 言語値 または Referenceレコード ))。戻り値:(正常完了 (値:(ECMAScript 言語値 または Referenceレコード )) または 中途完了)。 次の生成規則ごとに定義される。
OptionalChain :
?.
Arguments
thisChain をこの OptionalChain とする。tailCall を IsInTailPosition (thisChain ) とする。? EvaluateCall (baseValue , baseRef , Arguments , tailCall ) を返す。
OptionalChain :
?.
[
Expression
]
strict を IsStrict (this OptionalChain ) とする。? EvaluatePropertyAccessWithExpressionKey (baseValue , Expression , strict ) を返す。
OptionalChain :
?.
IdentifierName
strict を IsStrict (this OptionalChain ) とする。EvaluatePropertyAccessWithIdentifierKey (baseValue , IdentifierName , strict ) を返す。
OptionalChain :
?.
PrivateIdentifier
fieldNameString を PrivateIdentifier の StringValue とする。MakePrivateReference (baseValue , fieldNameString ) を返す。
OptionalChain :
OptionalChain
Arguments
optionalChain を OptionalChain とする。newRef を、引数 baseValue および baseRef を指定した optionalChain の ? ChainEvaluation とする。newValue を ? GetValue (newRef ) とする。thisChain をこの OptionalChain とする。tailCall を IsInTailPosition (thisChain ) とする。? EvaluateCall (newValue , newRef , Arguments , tailCall ) を返す。
OptionalChain :
OptionalChain
[
Expression
]
optionalChain を OptionalChain とする。newRef を、引数 baseValue および baseRef を指定した optionalChain の ? ChainEvaluation とする。newValue を ? GetValue (newRef ) とする。strict を IsStrict (this OptionalChain ) とする。? EvaluatePropertyAccessWithExpressionKey (newValue , Expression , strict ) を返す。
OptionalChain :
OptionalChain
.
IdentifierName
optionalChain を OptionalChain とする。newRef を、引数 baseValue および baseRef を指定した optionalChain の ? ChainEvaluation とする。newValue を ? GetValue (newRef ) とする。strict を IsStrict (this OptionalChain ) とする。EvaluatePropertyAccessWithIdentifierKey (newValue , IdentifierName , strict ) を返す。
OptionalChain :
OptionalChain
.
PrivateIdentifier
optionalChain を OptionalChain とする。newRef を、引数 baseValue および baseRef を指定した optionalChain の ? ChainEvaluation とする。newValue を ? GetValue (newRef ) とする。fieldNameString を PrivateIdentifier の StringValue とする。MakePrivateReference (newValue , fieldNameString ) を返す。
13.3.10 Import 呼出し
13.3.10.1 Runtime Semantics: Evaluation
ImportCall :
import
(
AssignmentExpression
,opt
)
? EvaluateImportCall (AssignmentExpression ) を返す。
ImportCall :
import
(
AssignmentExpression
,
AssignmentExpression
,opt
)
? EvaluateImportCall (最初の AssignmentExpression , 2番目の AssignmentExpression ) を返す。
13.3.10.2 EvaluateImportCall ( specifierExpr [ , optionsExpr ] )
抽象操作 EvaluateImportCall。引数 specifierExpr (構文解析ノード )および省略可能な引数 optionsExpr (構文解析ノード )。戻り値:(正常完了 (値:Promise) または 中途完了)。 呼び出されると、次の手順を実行する。
referrer を GetActiveScriptOrModule () とする。referrer が null である場合、referrer を現在の Realm Record に設定する。specifierRef を specifierExpr の ? Evaluation とする。specifier を ? GetValue (specifierRef ) とする。optionsExpr が存在する場合、optionsRef を optionsExpr の ? Evaluation とする。options を ? GetValue (optionsRef ) とする。そうでない場合、options を undefined とする。 promiseCapability を ! NewPromiseCapability (%Promise% ) とする。specifierString を Completion (ToString (specifier )) とする。IfAbruptRejectPromise (specifierString , promiseCapability )。attrs を新しい空の List とする。options が undefined でない場合、options が Object でない場合、! Call (promiseCapability .[[Reject]] , undefined , « 新しく作成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。attrsObj を Completion (Get (options , "with" )) とする。IfAbruptRejectPromise (attrsObj , promiseCapability )。attrsObj が undefined でない場合、attrsObj が Object でない場合、! Call (promiseCapability .[[Reject]] , undefined , « 新しく作成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。entries を Completion (EnumerableOwnProperties (attrsObj , key+value )) とする。IfAbruptRejectPromise (entries , promiseCapability )。entries の各要素 entry について、次を行う。key を ! Get (entry , "0" ) とする。value を ! Get (entry , "1" ) とする。key が String である場合、value が String でない場合、! Call (promiseCapability .[[Reject]] , undefined , « 新しく作成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。ImportAttribute Record { [[Key]] : key , [[Value]] : value } を attrs に追加する。AllImportAttributesSupported (attrs ) が false である場合、! Call (promiseCapability .[[Reject]] , undefined , « 新しく作成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。attrs を、その [[Key]] フィールドの辞書式順序に従って並べ替える。各フィールドの値は UTF-16 コード単位値の列として扱う。注記 : この並べ替えが観測可能なのは、属性が列挙された順序に基づいてホスト が動作を変更することを禁止されるという点だけである。moduleRequest を新しい ModuleRequest Record { [[Specifier]] : specifierString , [[Attributes]] : attrs } とする。HostLoadImportedModule (referrer , moduleRequest , empty , promiseCapability ) を実行する。promiseCapability .[[Promise]] を返す。
13.3.10.3 ContinueDynamicImport ( promiseCapability , moduleCompletion )
抽象操作 ContinueDynamicImport。引数 promiseCapability (PromiseCapabilityレコード ) および moduleCompletion ((正常完了 (値:Moduleレコード ) または throw 完了 ))。戻り値:unused 。 import() 呼出しによって最初に開始された動的インポートの処理を完了し、その呼出しによって返された Promise を適切に解決または拒否します。 呼び出されると、次の手順を実行する。
moduleCompletion が中断完了 である場合、! Call (promiseCapability .[[Reject]] , undefined , « moduleCompletion .[[Value]] ») を実行する。 unused を返す。module を moduleCompletion .[[Value]] とする。loadPromise を module .LoadRequestedModules () とする。rejectedClosure を、パラメーター (reason ) を持ち、promiseCapability を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。! Call (promiseCapability .[[Reject]] , undefined , « reason ») を実行する。 NormalCompletion (undefined ) を返す。onRejected を CreateBuiltinFunction (rejectedClosure , 1, "" , « ») とする。linkAndEvaluateClosure を、パラメーターを持たず、module 、promiseCapability 、および onRejected を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。link を Completion (module .Link ()) とする。link が中断完了 である場合、! Call (promiseCapability .[[Reject]] , undefined , « link .[[Value]] ») を実行する。 NormalCompletion (undefined ) を返す。evaluatePromise を module .Evaluate () とする。fulfilledClosure を、パラメーターを持たず、module および promiseCapability を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。namespace を GetModuleNamespace (module ) とする。! Call (promiseCapability .[[Resolve]] , undefined , « namespace ») を実行する。 NormalCompletion (undefined ) を返す。onFulfilled を CreateBuiltinFunction (fulfilledClosure , 0, "" , « ») とする。PerformPromiseThen (evaluatePromise , onFulfilled , onRejected ) を実行する。unused を返す。linkAndEvaluate を CreateBuiltinFunction (linkAndEvaluateClosure , 0, "" , « ») とする。PerformPromiseThen (loadPromise , linkAndEvaluate , onRejected ) を実行する。unused を返す。
13.3.11 タグ付きテンプレート
注
タグ付きテンプレートは、呼出しの引数が TemplateLiteral (13.2.8 )から導出される関数呼出しです。実際の引数には、テンプレートオブジェクト(13.2.8.4 )と、TemplateLiteral 内に埋め込まれた式を評価して生成される値が含まれます。
13.3.11.1 Runtime Semantics: Evaluation
MemberExpression :
MemberExpression
TemplateLiteral
tagRef を MemberExpression の ? Evaluation とする。tagFunc を ? GetValue (tagRef ) とする。thisCall をこの MemberExpression とする。tailCall を IsInTailPosition (thisCall ) とする。? EvaluateCall (tagFunc , tagRef , TemplateLiteral , tailCall ) を返す。
CallExpression :
CallExpression
TemplateLiteral
tagRef を CallExpression の ? Evaluation とする。tagFunc を ? GetValue (tagRef ) とする。thisCall をこの CallExpression とする。tailCall を IsInTailPosition (thisCall ) とする。? EvaluateCall (tagFunc , tagRef , TemplateLiteral , tailCall ) を返す。
13.3.12 メタプロパティ
13.3.12.1 Runtime Semantics: Evaluation
NewTarget :
new
.
target
GetNewTarget () を返す。
ImportMeta :
import
.
meta
module を GetActiveScriptOrModule () とする。表明 : module は Source Text Module Record である。importMeta を module .[[ImportMeta]] とする。importMeta が empty である場合、importMeta を OrdinaryObjectCreate (null ) に設定する。importMetaValues を HostGetImportMetaProperties (module ) とする。importMetaValues の各 Record { [[Key]] , [[Value]] } entry について、次を行う。! CreateDataPropertyOrThrow (importMeta , entry .[[Key]] , entry .[[Value]] ) を実行する。 HostFinalizeImportMeta (importMeta , module ) を実行する。module .[[ImportMeta]] を importMeta に設定する。importMeta を返す。表明 : importMeta は Object である。importMeta を返す。
13.3.12.1.1 HostGetImportMetaProperties ( moduleRecord )
ホスト定義の抽象操作 HostGetImportMetaProperties。引数 moduleRecord (Moduleレコード )。戻り値:リスト (要素:レコード (フィールド:[[Key]] (プロパティキー ), [[Value]] (ECMAScript 言語値 )))。 ホスト が import.meta から返されるオブジェクトにプロパティキー と値を提供できるようにします。
HostGetImportMetaProperties の既定の実装は、新しい空の List を返すことです。
13.3.12.1.2 HostFinalizeImportMeta ( importMeta , moduleRecord )
ホスト定義の抽象操作 HostFinalizeImportMeta。引数 importMeta (Object) および moduleRecord (Moduleレコード )。戻り値:unused 。 ホスト が import.meta から返されるオブジェクトを準備するために、通常ではない操作を実行できるようにします。
ほとんどのホスト は、単に HostGetImportMetaProperties を定義し、HostFinalizeImportMeta を既定の動作のままにすることができます。ただし、HostFinalizeImportMeta は、ECMAScript コードに公開される前にオブジェクトを直接操作する必要があるホスト のための「逃げ道」を提供します。
HostFinalizeImportMeta の既定の実装は unused を返すことです。
13.4 更新式
構文
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: 早期エラー
UpdateExpression :
LeftHandSideExpression
++
LeftHandSideExpression
--
UpdateExpression :
++
UnaryExpression
--
UnaryExpression
13.4.2 後置インクリメント演算子
13.4.2.1 Runtime Semantics: Evaluation
UpdateExpression :
LeftHandSideExpression
++
lhs を LeftHandSideExpression の ? Evaluation とする。LeftHandSideExpression の AssignmentTargetType が web-compat である場合、ReferenceError 例外をスローする。oldValue を ? ToNumeric (? GetValue (lhs )) とする。oldValue が Number である場合、newValue を Number::add (oldValue , 1 𝔽 ) とする。そうでない場合、表明 : oldValue は BigInt である。newValue を BigInt::add (oldValue , 1 ℤ ) とする。 ? PutValue (lhs , newValue ) を実行する。 oldValue を返す。
13.4.3 後置デクリメント演算子
13.4.3.1 Runtime Semantics: Evaluation
UpdateExpression :
LeftHandSideExpression
--
lhs を LeftHandSideExpression の ? Evaluation とする。LeftHandSideExpression の AssignmentTargetType が web-compat である場合、ReferenceError 例外をスローする。oldValue を ? ToNumeric (? GetValue (lhs )) とする。oldValue が Number である場合、newValue を Number::subtract (oldValue , 1 𝔽 ) とする。そうでない場合、表明 : oldValue は BigInt である。newValue を BigInt::subtract (oldValue , 1 ℤ ) とする。 ? PutValue (lhs , newValue ) を実行する。 oldValue を返す。
13.4.4 前置インクリメント演算子
13.4.4.1 Runtime Semantics: Evaluation
UpdateExpression :
++
UnaryExpression
expr を UnaryExpression の ? Evaluation とする。UnaryExpression の AssignmentTargetType が web-compat である場合、ReferenceError 例外をスローする。oldValue を ? ToNumeric (? GetValue (expr )) とする。oldValue が Number である場合、newValue を Number::add (oldValue , 1 𝔽 ) とする。そうでない場合、表明 : oldValue は BigInt である。newValue を BigInt::add (oldValue , 1 ℤ ) とする。 ? PutValue (expr , newValue ) を実行する。 newValue を返す。
13.4.5 前置デクリメント演算子
13.4.5.1 Runtime Semantics: Evaluation
UpdateExpression :
--
UnaryExpression
expr を UnaryExpression の ? Evaluation とする。UnaryExpression の AssignmentTargetType が web-compat である場合、ReferenceError 例外をスローする。oldValue を ? ToNumeric (? GetValue (expr )) とする。oldValue が Number である場合、newValue を Number::subtract (oldValue , 1 𝔽 ) とする。そうでない場合、表明 : oldValue は BigInt である。newValue を BigInt::subtract (oldValue , 1 ℤ ) とする。 ? PutValue (expr , newValue ) を実行する。 newValue を返す。
13.5 単項演算子
構文
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]
CoverAwaitExpressionAndAwaitUsingDeclarationHead [?Yield]
CoverAwaitExpressionAndAwaitUsingDeclarationHead [Yield] :
await
UnaryExpression [?Yield, +Await]
補助構文
次の生成規則のインスタンスを処理するとき
UnaryExpression : CoverAwaitExpressionAndAwaitUsingDeclarationHead
CoverAwaitExpressionAndAwaitUsingDeclarationHead の解釈は、次の文法を使用して詳細化されます。
AwaitExpression [Yield] :
await
UnaryExpression [?Yield, +Await]
13.5.1 delete 演算子
13.5.1.1 Static Semantics: 早期エラー
UnaryExpression :
delete
UnaryExpression
注
最後の規則は、delete (((foo))) のような式が、最初の規則の再帰的適用によって早期エラー を生成することを意味します。
13.5.1.2 Runtime Semantics: Evaluation
UnaryExpression :
delete
UnaryExpression
ref を UnaryExpression の ? Evaluation とする。ref が Reference Record でない場合、true を返す。IsUnresolvableReference (ref ) が true である場合、表明 : ref .[[Strict]] は false である。true を返す。IsPropertyReference (ref ) が true である場合、表明 : IsPrivateReference (ref ) は false である。IsSuperReference (ref ) が true である場合、ReferenceError 例外をスローする。baseObj を ? ToObject (ref .[[Base]] ) とする。ref .[[ReferencedName]] がプロパティキー でない場合、ref .[[ReferencedName]] を ? ToPropertyKey (ref .[[ReferencedName]] ) に設定する。deleteStatus を ? baseObj .[[Delete]] (ref .[[ReferencedName]] ) とする。deleteStatus が false であり、ref .[[Strict]] が true である場合、TypeError 例外をスローする。deleteStatus を返す。base を ref .[[Base]] とする。表明 : base は Environment Record である。? base .DeleteBinding (ref .[[ReferencedName]] ) を返す。
注 1
strict モードコード 内に delete 演算子が現れる場合、その UnaryExpression が変数、関数引数、または関数名への直接参照であれば、SyntaxError 例外がスローされます。さらに、strict モードコード 内に delete 演算子が現れ、削除されるプロパティが属性 { [[Configurable]] : false } を持つ場合(またはその他の理由で削除できない場合)、TypeError 例外がスローされます。
注 2
手順 4.c で作成される可能性のあるオブジェクトは、上記の抽象操作 と通常オブジェクト の [[Delete]] 内部メソッドの外部からアクセスできません。実装は、そのオブジェクトを実際には作成しないことを選択してもかまいません。
13.5.2 void 演算子
13.5.2.1 Runtime Semantics: Evaluation
UnaryExpression :
void
UnaryExpression
expr を UnaryExpression の ? Evaluation とする。? GetValue (expr ) を実行する。 undefined を返す。
注
GetValue の値は使用されませんが、観測可能な副作用を持つ可能性があるため、GetValue を呼び出さなければなりません。
13.5.3 typeof 演算子
13.5.3.1 Runtime Semantics: Evaluation
UnaryExpression :
typeof
UnaryExpression
value を UnaryExpression の ? Evaluation とする。value が Reference Record である場合、IsUnresolvableReference (value ) が true である場合、"undefined" を返す。value を ? GetValue (value ) に設定する。value が undefined である場合、"undefined" を返す。value が null である場合、"object" を返す。value が String である場合、"string" を返す。value が Symbol である場合、"symbol" を返す。value が Boolean である場合、"boolean" を返す。value が Number である場合、"number" を返す。value が BigInt である場合、"bigint" を返す。表明 : value は Object である。Normative Optional
ホスト が Web ブラウザーであるか、その他の方法で [[IsHTMLDDA]] 内部スロット をサポートする場合、value が [[IsHTMLDDA]] 内部スロットを持つ場合、"undefined" を返す。value が [[Call]] 内部メソッドを持つ場合、"function" を返す。"object" を返す。
13.5.4 単項 + 演算子
注
単項 + 演算子は、そのオペランドを Number 型 に変換します。
13.5.4.1 Runtime Semantics: Evaluation
UnaryExpression :
+
UnaryExpression
expr を UnaryExpression の ? Evaluation とする。? ToNumber (? GetValue (expr )) を返す。
13.5.5 単項 - 演算子
注
単項 - 演算子は、そのオペランドを数値に変換してから符号を反転します。+0 𝔽 の符号を反転すると -0 𝔽 になり、-0 𝔽 の符号を反転すると +0 𝔽 になります。
13.5.5.1 Runtime Semantics: Evaluation
UnaryExpression :
-
UnaryExpression
expr を UnaryExpression の ? Evaluation とする。oldValue を ? ToNumeric (? GetValue (expr )) とする。oldValue が Number である場合、Number::unaryMinus (oldValue ) を返す。表明 : oldValue は BigInt である。BigInt::unaryMinus (oldValue ) を返す。
13.5.6 ビット単位 NOT 演算子 ( ~ )
13.5.6.1 Runtime Semantics: Evaluation
UnaryExpression :
~
UnaryExpression
expr を UnaryExpression の ? Evaluation とする。oldValue を ? ToNumeric (? GetValue (expr )) とする。oldValue が Number である場合、Number::bitwiseNOT (oldValue ) を返す。表明 : oldValue は BigInt である。BigInt::bitwiseNOT (oldValue ) を返す。
13.5.7 論理 NOT 演算子 ( ! )
13.5.7.1 Runtime Semantics: Evaluation
UnaryExpression :
!
UnaryExpression
expr を UnaryExpression の ? Evaluation とする。oldValue を ToBoolean (? GetValue (expr )) とする。oldValue が true である場合、false を返す。true を返す。
13.6 べき乗演算子
構文
ExponentiationExpression [Yield, Await] :
UnaryExpression [?Yield, ?Await]
UpdateExpression [?Yield, ?Await]
**
ExponentiationExpression [?Yield, ?Await]
13.6.1 Runtime Semantics: Evaluation
ExponentiationExpression :
UpdateExpression
**
ExponentiationExpression
? EvaluateStringOrNumericBinaryExpression (UpdateExpression , **, ExponentiationExpression ) を返す。
13.7 乗法演算子
構文
MultiplicativeExpression [Yield, Await] :
ExponentiationExpression [?Yield, ?Await]
MultiplicativeExpression [?Yield, ?Await]
MultiplicativeOperator
ExponentiationExpression [?Yield, ?Await]
MultiplicativeOperator : one of * / %
注
* 演算子は乗算を実行し、オペランドの積を生成します。
/ 演算子は除算を実行し、オペランドの商を生成します。
% 演算子は、暗黙の除算によるオペランドの剰余を生成します。
13.7.1 Runtime Semantics: Evaluation
MultiplicativeExpression :
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
opText を MultiplicativeOperator に一致するソーステキスト とする。? EvaluateStringOrNumericBinaryExpression (MultiplicativeExpression , opText , ExponentiationExpression ) を返す。
13.8 加法演算子
構文
AdditiveExpression [Yield, Await] :
MultiplicativeExpression [?Yield, ?Await]
AdditiveExpression [?Yield, ?Await]
+
MultiplicativeExpression [?Yield, ?Await]
AdditiveExpression [?Yield, ?Await]
-
MultiplicativeExpression [?Yield, ?Await]
13.8.1 加算演算子 ( + )
注
加算演算子は、文字列連結 または数値加算のいずれかを実行します。
13.8.1.1 Runtime Semantics: Evaluation
AdditiveExpression :
AdditiveExpression
+
MultiplicativeExpression
? EvaluateStringOrNumericBinaryExpression (AdditiveExpression , +, MultiplicativeExpression ) を返す。
13.8.2 減算演算子 ( - )
注
- 演算子は減算を実行し、オペランドの差を生成します。
13.8.2.1 Runtime Semantics: Evaluation
AdditiveExpression :
AdditiveExpression
-
MultiplicativeExpression
? EvaluateStringOrNumericBinaryExpression (AdditiveExpression , -, MultiplicativeExpression ) を返す。
13.9 ビットシフト演算子
構文
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 左シフト演算子 ( << )
注
右オペランドで指定された量だけ、左オペランドに対してビット単位の左シフト操作を実行します。
13.9.1.1 Runtime Semantics: Evaluation
ShiftExpression :
ShiftExpression
<<
AdditiveExpression
? EvaluateStringOrNumericBinaryExpression (ShiftExpression , <<, AdditiveExpression ) を返す。
13.9.2 符号付き右シフト演算子 ( >> )
注
右オペランドで指定された量だけ、左オペランドに対して符号ビットで埋めるビット単位の右シフト操作を実行します。
13.9.2.1 Runtime Semantics: Evaluation
ShiftExpression :
ShiftExpression
>>
AdditiveExpression
? EvaluateStringOrNumericBinaryExpression (ShiftExpression , >>, AdditiveExpression ) を返す。
13.9.3 符号なし右シフト演算子 ( >>> )
注
右オペランドで指定された量だけ、左オペランドに対してゼロで埋めるビット単位の右シフト操作を実行します。
13.9.3.1 Runtime Semantics: Evaluation
ShiftExpression :
ShiftExpression
>>>
AdditiveExpression
? EvaluateStringOrNumericBinaryExpression (ShiftExpression , >>>, AdditiveExpression ) を返す。
13.10 関係演算子
注 1
関係演算子を評価した結果は常に Boolean 型 であり、その演算子が表す関係が2つのオペランド間で成立するかどうかを表します。
構文
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]
注 2
[In] 文法パラメーターは、関係式内の in 演算子と for 文内の in 演算子の混同を避けるために必要です。
13.10.1 Runtime Semantics: Evaluation
RelationalExpression :
RelationalExpression
<
ShiftExpression
leftRef を RelationalExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。rightRef を ShiftExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。result を ? IsLessThan (leftValue , rightValue , true ) とする。result が undefined である場合、false を返す。result を返す。
RelationalExpression :
RelationalExpression
>
ShiftExpression
leftRef を RelationalExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。rightRef を ShiftExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。result を ? IsLessThan (rightValue , leftValue , false ) とする。result が undefined である場合、false を返す。result を返す。
RelationalExpression :
RelationalExpression
<=
ShiftExpression
leftRef を RelationalExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。rightRef を ShiftExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。result を ? IsLessThan (rightValue , leftValue , false ) とする。result が true または undefined のいずれかである場合、false を返す。true を返す。
RelationalExpression :
RelationalExpression
>=
ShiftExpression
leftRef を RelationalExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。rightRef を ShiftExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。result を ? IsLessThan (leftValue , rightValue , true ) とする。result が true または undefined のいずれかである場合、false を返す。true を返す。
RelationalExpression :
RelationalExpression
instanceof
ShiftExpression
leftRef を RelationalExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。rightRef を ShiftExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。? InstanceofOperator (leftValue , rightValue ) を返す。
RelationalExpression :
RelationalExpression
in
ShiftExpression
leftRef を RelationalExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。rightRef を ShiftExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。rightValue が Object でない場合、TypeError 例外をスローする。? HasProperty (rightValue , ? ToPropertyKey (leftValue )) を返す。
RelationalExpression :
PrivateIdentifier
in
ShiftExpression
privateIdentifier を PrivateIdentifier の StringValue とする。rightRef を ShiftExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。rightValue が Object でない場合、TypeError 例外をスローする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。表明 : privateEnv は null ではない。privateName を ResolvePrivateIdentifier (privateEnv , privateIdentifier ) とする。PrivateElementFind (rightValue , privateName ) が empty である場合、false を返す。true を返す。
13.10.2 InstanceofOperator ( value , target )
抽象操作 InstanceofOperator。引数 value (ECMAScript 言語値 ) および target (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 target の %Symbol.hasInstance% メソッドを調べるか、そのメソッドが存在しない場合は target の "prototype" プロパティの値が value のプロトタイプチェーン内に存在するかどうかを判定することにより、value が target のインスタンスであるかどうかを判定する汎用アルゴリズムを実装します。 呼び出されると、次の手順を実行する。
target が Object でない場合、TypeError 例外をスローする。instOfHandler を ? GetMethod (target , %Symbol.hasInstance% ) とする。instOfHandler が undefined でない場合、ToBoolean (? Call (instOfHandler , target , « value »)) を返す。IsCallable (target ) が false である場合、TypeError 例外をスローする。? OrdinaryHasInstance (target , value ) を返す。
注
手順 4 および 5 は、instanceof 演算子の意味論を定義するために %Symbol.hasInstance% メソッドを使用していなかった以前の ECMAScript の版との互換性を提供します。オブジェクトが %Symbol.hasInstance% を定義も継承もしていない場合、既定の instanceof 意味論を使用します。
13.11 等価演算子
注
等価演算子を評価した結果は常に Boolean 型 であり、その演算子が表す関係が2つのオペランド間で成立するかどうかを表します。
構文
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
leftRef を EqualityExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。rightRef を RelationalExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。? IsLooselyEqual (rightValue , leftValue ) を返す。
EqualityExpression :
EqualityExpression
!=
RelationalExpression
leftRef を EqualityExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。rightRef を RelationalExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。result を ? IsLooselyEqual (rightValue , leftValue ) とする。result が true である場合、false を返す。true を返す。
EqualityExpression :
EqualityExpression
===
RelationalExpression
leftRef を EqualityExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。rightRef を RelationalExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。IsStrictlyEqual (rightValue , leftValue ) を返す。
EqualityExpression :
EqualityExpression
!==
RelationalExpression
leftRef を EqualityExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。rightRef を RelationalExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。result を IsStrictlyEqual (rightValue , leftValue ) とする。result が true である場合、false を返す。true を返す。
注 1
等価演算子は、次の不変条件を維持します。
A != B は !(A == B) と等価です。
A == B は、A と B の評価順序を除き、B == A と等価です。
注 2
等価演算子は常に推移的であるとは限りません。たとえば、同じ String 値を表す2つの異なる String オブジェクトが存在する場合、それぞれの String オブジェクトは == 演算子によって String 値と等しいとみなされますが、2つの String オブジェクト同士は等しくありません。たとえば:
new String("a") == "a" と "a" == new String("a") はどちらも true です。
new String("a") == new String("a") は false です。
注 3
String の比較では、コード単位値の列に対する単純な等価性テストを使用します。Unicode 仕様で定義される、より複雑で意味論指向の文字または文字列の等価性や照合順序の定義を使用しようとはしません。したがって、Unicode Standard に従って正準的に等しい String 値でも、等しくないと判定される可能性があります。実質的に、このアルゴリズムは両方の String がすでに正規化形式であることを前提としています。
13.12 二項ビット演算子
構文
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
? EvaluateStringOrNumericBinaryExpression (BitwiseANDExpression , &, EqualityExpression ) を返す。
BitwiseXORExpression :
BitwiseXORExpression
^
BitwiseANDExpression
? EvaluateStringOrNumericBinaryExpression (BitwiseXORExpression , ^, BitwiseANDExpression ) を返す。
BitwiseORExpression :
BitwiseORExpression
|
BitwiseXORExpression
? EvaluateStringOrNumericBinaryExpression (BitwiseORExpression , |, BitwiseXORExpression ) を返す。
13.13 二項論理演算子
構文
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]
注
&& または || 演算子によって生成される値は、必ずしも Boolean 型 ではありません。生成される値は常に2つのオペランド式のいずれかの値です。
13.13.1 Runtime Semantics: Evaluation
LogicalANDExpression :
LogicalANDExpression
&&
BitwiseORExpression
leftRef を LogicalANDExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。ToBoolean (leftValue ) が false である場合、leftValue を返す。rightRef を BitwiseORExpression の ? Evaluation とする。? GetValue (rightRef ) を返す。
LogicalORExpression :
LogicalORExpression
||
LogicalANDExpression
leftRef を LogicalORExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。ToBoolean (leftValue ) が true である場合、leftValue を返す。rightRef を LogicalANDExpression の ? Evaluation とする。? GetValue (rightRef ) を返す。
CoalesceExpression :
CoalesceExpressionHead
??
BitwiseORExpression
leftRef を CoalesceExpressionHead の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。leftValue が undefined でも null でもない場合、leftValue を返す。rightRef を BitwiseORExpression の ? Evaluation とする。? GetValue (rightRef ) を返す。
13.14 条件演算子 ( ? : )
構文
ConditionalExpression [In, Yield, Await] :
ShortCircuitExpression [?In, ?Yield, ?Await]
ShortCircuitExpression [?In, ?Yield, ?Await]
?
AssignmentExpression [+In, ?Yield, ?Await]
:
AssignmentExpression [?In, ?Yield, ?Await]
注
ECMAScript の ConditionalExpression の文法は C および Java のものとわずかに異なります。C と Java では、第2部分式に Expression を許可しますが、第3式を ConditionalExpression に制限します。ECMAScript でこの違いを設けた理由は、条件のどちらの分岐でも代入式を使用できるようにし、中央の式としてコンマ式を使用するという混乱を招き、ほとんど役に立たない場合を排除するためです。
13.14.1 Runtime Semantics: Evaluation
ConditionalExpression :
ShortCircuitExpression
?
AssignmentExpression
:
AssignmentExpression
leftRef を ShortCircuitExpression の ? Evaluation とする。leftValue を ToBoolean (? GetValue (leftRef )) とする。leftValue が true である場合、trueRef を最初の AssignmentExpression の ? Evaluation とする。? GetValue (trueRef ) を返す。 falseRef を2番目の AssignmentExpression の ? Evaluation とする。? GetValue (falseRef ) を返す。
13.15 代入演算子
構文
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: 早期エラー
AssignmentExpression :
LeftHandSideExpression
=
AssignmentExpression
AssignmentExpression :
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
AssignmentExpression :
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
13.15.2 Runtime Semantics: Evaluation
AssignmentExpression :
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression が ObjectLiteral と ArrayLiteral のいずれでもない場合、leftRef を LeftHandSideExpression の ? Evaluation とする。LeftHandSideExpression の AssignmentTargetType が web-compat である場合、ReferenceError 例外をスローする。IsAnonymousFunctionDefinition (AssignmentExpression ) が true であり、LeftHandSideExpression の IsIdentifierRef が true である場合、lhs を LeftHandSideExpression の StringValue とする。rightValue を、引数 lhs を指定した AssignmentExpression の ? NamedEvaluation とする。そうでない場合、rightRef を AssignmentExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。 ? PutValue (leftRef , rightValue ) を実行する。 rightValue を返す。assignmentPattern を LeftHandSideExpression によって被覆される AssignmentPattern とする。rightRef を AssignmentExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。引数 rightValue を指定した assignmentPattern の ? DestructuringAssignmentEvaluation を実行する。 rightValue を返す。
AssignmentExpression :
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
leftRef を LeftHandSideExpression の ? Evaluation とする。LeftHandSideExpression の AssignmentTargetType が web-compat である場合、ReferenceError 例外をスローする。leftValue を ? GetValue (leftRef ) とする。rightRef を AssignmentExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。assignmentOpText を AssignmentOperator に一致するソーステキスト とする。opText を、次の表で assignmentOpText に関連付けられた Unicode コードポイント列とする。
assignmentOpText opText
**= **
*= *
/= /
%= %
+= +
-= -
<<= <<
>>= >>
>>>= >>>
&= &
^= ^
|= |
result を ? ApplyStringOrNumericBinaryOperator (leftValue , opText , rightValue ) とする。? PutValue (leftRef , result ) を実行する。 result を返す。
AssignmentExpression :
LeftHandSideExpression
&&=
AssignmentExpression
leftRef を LeftHandSideExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。ToBoolean (leftValue ) が false である場合、leftValue を返す。IsAnonymousFunctionDefinition (AssignmentExpression ) が true であり、LeftHandSideExpression の IsIdentifierRef が true である場合、lhs を LeftHandSideExpression の StringValue とする。rightValue を、引数 lhs を指定した AssignmentExpression の ? NamedEvaluation とする。そうでない場合、rightRef を AssignmentExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。 ? PutValue (leftRef , rightValue ) を実行する。 rightValue を返す。
AssignmentExpression :
LeftHandSideExpression
||=
AssignmentExpression
leftRef を LeftHandSideExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。ToBoolean (leftValue ) が true である場合、leftValue を返す。IsAnonymousFunctionDefinition (AssignmentExpression ) が true であり、LeftHandSideExpression の IsIdentifierRef が true である場合、lhs を LeftHandSideExpression の StringValue とする。rightValue を、引数 lhs を指定した AssignmentExpression の ? NamedEvaluation とする。そうでない場合、rightRef を AssignmentExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。 ? PutValue (leftRef , rightValue ) を実行する。 rightValue を返す。
AssignmentExpression :
LeftHandSideExpression
??=
AssignmentExpression
leftRef を LeftHandSideExpression の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。leftValue が undefined でも null でもない場合、leftValue を返す。IsAnonymousFunctionDefinition (AssignmentExpression ) が true であり、LeftHandSideExpression の IsIdentifierRef が true である場合、lhs を LeftHandSideExpression の StringValue とする。rightValue を、引数 lhs を指定した AssignmentExpression の ? NamedEvaluation とする。そうでない場合、rightRef を AssignmentExpression の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。 ? PutValue (leftRef , rightValue ) を実行する。 rightValue を返す。
注
この式が strict モードコード 内に現れる場合、手順 1.e 、3 、2 、2 、2 の leftRef が解決不能参照であれば実行時エラーです。その場合、ReferenceError 例外がスローされます。さらに、手順 9 、6 、6 、6 の leftRef が、属性値 { [[Writable]] : false } を持つデータプロパティ 、属性値 { [[Setter]] : undefined } を持つアクセサープロパティ 、または IsExtensible 述語が false を返すオブジェクトの存在しないプロパティへの参照である場合も実行時エラーです。これらの場合、TypeError 例外がスローされます。
13.15.3 ApplyStringOrNumericBinaryOperator ( leftValue , opText , rightValue )
抽象操作 ApplyStringOrNumericBinaryOperator。引数 leftValue (ECMAScript 言語値 )、opText ((**、*、/、%、+、-、<<、>>、>>>、&、^ または |)) および rightValue (ECMAScript 言語値 )。戻り値:(正常完了 (値:(String、BigInt または Number)) または throw 完了 )。 呼び出されると、次の手順を実行する。
opText が + である場合、leftPrimitive を ? ToPrimitive (leftValue ) とする。rightPrimitive を ? ToPrimitive (rightValue ) とする。leftPrimitive が String であるか、rightPrimitive が String である場合、leftString を ? ToString (leftPrimitive ) とする。rightString を ? ToString (rightPrimitive ) とする。leftString と rightString の文字列連結 を返す。leftValue を leftPrimitive に設定する。rightValue を rightPrimitive に設定する。注記 : この時点では、数値演算でなければならない。leftNumber を ? ToNumeric (leftValue ) とする。rightNumber を ? ToNumeric (rightValue ) とする。SameType (leftNumber , rightNumber ) が false である場合、TypeError 例外をスローする。leftNumber が BigInt である場合、opText が ** である場合、? BigInt::exponentiate (leftNumber , rightNumber ) を返す。opText が / である場合、? BigInt::divide (leftNumber , rightNumber ) を返す。opText が % である場合、? BigInt::remainder (leftNumber , rightNumber ) を返す。opText が >>> である場合、? BigInt::unsignedRightShift (leftNumber , rightNumber ) を返す。operation を、次の表で opText に関連付けられた抽象操作 とする。
そうでない場合、表明 : leftNumber は Number である。operation を、次の表で opText に関連付けられた抽象操作 とする。
operation (leftNumber , rightNumber ) を返す。
注 1
手順 1.a および 1.b の ToPrimitive 呼出しにはヒントが与えられません。Date を除くすべての標準オブジェクトは、ヒントがない場合を number が与えられた場合と同様に処理します。Date はヒントがない場合を string が与えられた場合と同様に処理します。特殊オブジェクト はヒントがない場合を別の方法で処理してもかまいません。
注 2
手順 1.c は、論理積演算ではなく論理和演算を使用する点で、IsLessThan アルゴリズムの手順 3 と異なります。
13.15.4 EvaluateStringOrNumericBinaryExpression ( leftOperand , opText , rightOperand )
抽象操作 EvaluateStringOrNumericBinaryExpression。引数 leftOperand (構文解析ノード )、opText ((**、*、/、%、+、-、<<、>>、>>>、&、^ または |)) および rightOperand (構文解析ノード )。戻り値:(正常完了 (値:(String、BigInt または Number)) または 中途完了)。 呼び出されると、次の手順を実行する。
leftRef を leftOperand の ? Evaluation とする。leftValue を ? GetValue (leftRef ) とする。rightRef を rightOperand の ? Evaluation とする。rightValue を ? GetValue (rightRef ) とする。? ApplyStringOrNumericBinaryOperator (leftValue , opText , rightValue ) を返す。
13.15.5 分割代入
補助構文
特定の状況で次の生成規則のインスタンスを処理するとき
AssignmentExpression :
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression の解釈は、次の文法を使用して詳細化されます。
AssignmentPattern [Yield, Await] :
ObjectAssignmentPattern [?Yield, ?Await]
ArrayAssignmentPattern [?Yield, ?Await]
ObjectAssignmentPattern [Yield, Await] :
{
}
{
AssignmentRestProperty [?Yield, ?Await]
}
{
AssignmentPropertyList [?Yield, ?Await]
,opt
}
{
AssignmentPropertyList [?Yield, ?Await]
,
AssignmentRestProperty [?Yield, ?Await]
}
ArrayAssignmentPattern [Yield, Await] :
[
Elision opt
AssignmentRestElement [?Yield, ?Await] opt
]
[
AssignmentElementList [?Yield, ?Await]
]
[
AssignmentElementList [?Yield, ?Await]
,
Elision opt
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] :
Elision opt
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: 早期エラー
AssignmentProperty :
IdentifierReference
Initializer opt
AssignmentRestProperty :
...
DestructuringAssignmentTarget
DestructuringAssignmentTarget : LeftHandSideExpression
13.15.5.2 Runtime Semantics: DestructuringAssignmentEvaluation
構文指向操作 DestructuringAssignmentEvaluation。引数 value (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または 中途完了)。 次の生成規則ごとに定義される。
ObjectAssignmentPattern :
{
}
? RequireObjectCoercible (value ) を実行する。 unused を返す。
ObjectAssignmentPattern :
{
AssignmentPropertyList
,opt
}
? RequireObjectCoercible (value ) を実行する。 引数 value を指定した AssignmentPropertyList の ? PropertyDestructuringAssignmentEvaluation を実行する。 unused を返す。
ObjectAssignmentPattern :
{
AssignmentRestProperty
}
? RequireObjectCoercible (value ) を実行する。 excludedNames を新しい空の List とする。引数 value および excludedNames を指定した AssignmentRestProperty の ? RestDestructuringAssignmentEvaluation を返す。
ObjectAssignmentPattern :
{
AssignmentPropertyList
,
AssignmentRestProperty
}
? RequireObjectCoercible (value ) を実行する。 excludedNames を、引数 value を指定した AssignmentPropertyList の ? PropertyDestructuringAssignmentEvaluation とする。引数 value および excludedNames を指定した AssignmentRestProperty の ? RestDestructuringAssignmentEvaluation を返す。
ArrayAssignmentPattern :
[
]
iteratorRecord を ? GetIterator (value , sync ) とする。? IteratorClose (iteratorRecord , NormalCompletion (unused )) を返す。
ArrayAssignmentPattern :
[
Elision
]
iteratorRecord を ? GetIterator (value , sync ) とする。result を、引数 iteratorRecord を指定した Elision の IteratorDestructuringAssignmentEvaluation の Completion とする。iteratorRecord .[[Done]] が false である場合、? IteratorClose (iteratorRecord , result ) を返す。result を返す。
ArrayAssignmentPattern :
[
Elision opt
AssignmentRestElement
]
iteratorRecord を ? GetIterator (value , sync ) とする。Elision が存在する場合、status を、引数 iteratorRecord を指定した Elision の IteratorDestructuringAssignmentEvaluation の Completion とする。status が中断完了 である場合、表明 : iteratorRecord .[[Done]] は true である。? status を返す。 result を、引数 iteratorRecord を指定した AssignmentRestElement の IteratorDestructuringAssignmentEvaluation の Completion とする。iteratorRecord .[[Done]] が false である場合、? IteratorClose (iteratorRecord , result ) を返す。result を返す。
ArrayAssignmentPattern :
[
AssignmentElementList
]
iteratorRecord を ? GetIterator (value , sync ) とする。result を、引数 iteratorRecord を指定した AssignmentElementList の IteratorDestructuringAssignmentEvaluation の Completion とする。iteratorRecord .[[Done]] が false である場合、? IteratorClose (iteratorRecord , result ) を返す。result を返す。
ArrayAssignmentPattern :
[
AssignmentElementList
,
Elision opt
AssignmentRestElement opt
]
iteratorRecord を ? GetIterator (value , sync ) とする。status を、引数 iteratorRecord を指定した AssignmentElementList の IteratorDestructuringAssignmentEvaluation の Completion とする。status が中断完了 である場合、iteratorRecord .[[Done]] が false である場合、? IteratorClose (iteratorRecord , status ) を返す。? status を返す。 Elision が存在する場合、status を、引数 iteratorRecord を指定した Elision の IteratorDestructuringAssignmentEvaluation の Completion に設定する。status が中断完了 である場合、表明 : iteratorRecord .[[Done]] は true である。? status を返す。 AssignmentRestElement が存在する場合、status を、引数 iteratorRecord を指定した AssignmentRestElement の IteratorDestructuringAssignmentEvaluation の Completion に設定する。iteratorRecord .[[Done]] が false である場合、? IteratorClose (iteratorRecord , status ) を返す。? status を返す。
13.15.5.3 Runtime Semantics: PropertyDestructuringAssignmentEvaluation
構文指向操作 PropertyDestructuringAssignmentEvaluation。引数 value (ECMAScript 言語値 )。戻り値:(正常完了 (値:リスト (要素:プロパティキー )) または 中途完了)。 分割代入されたすべてのプロパティキー のリストを収集します。 次の生成規則ごとに定義される。
AssignmentPropertyList :
AssignmentPropertyList
,
AssignmentProperty
propertyNames を、引数 value を指定した AssignmentPropertyList の ? PropertyDestructuringAssignmentEvaluation とする。nextNames を、引数 value を指定した AssignmentProperty の ? PropertyDestructuringAssignmentEvaluation とする。propertyNames と nextNames のリスト連結 を返す。
AssignmentProperty :
IdentifierReference
Initializer opt
propertyName を IdentifierReference の StringValue とする。leftRef を ? ResolveBinding (propertyName ) とする。value を ? GetV (value , propertyName ) に設定する。Initializer が存在し、value が undefined である場合、IsAnonymousFunctionDefinition (Initializer ) が true である場合、value を、引数 propertyName を指定した Initializer の ? NamedEvaluation に設定する。そうでない場合、defaultValue を Initializer の ? Evaluation とする。value を ? GetValue (defaultValue ) に設定する。 ? PutValue (leftRef , value ) を実行する。 « propertyName » を返す。
AssignmentProperty :
PropertyName
:
AssignmentElement
name を PropertyName の ? Evaluation とする。引数 value および name を指定した AssignmentElement の ? KeyedDestructuringAssignmentEvaluation を実行する。 « name » を返す。
13.15.5.4 Runtime Semantics: RestDestructuringAssignmentEvaluation
構文指向操作 RestDestructuringAssignmentEvaluation。引数 value (ECMAScript 言語値 ) および excludedNames (リスト (要素:プロパティキー ))。戻り値:(正常完了 (値:unused ) または 中途完了)。 次の生成規則ごとに定義される。
AssignmentRestProperty :
...
DestructuringAssignmentTarget
leftRef を DestructuringAssignmentTarget の ? Evaluation とする。restObj を OrdinaryObjectCreate (%Object.prototype% ) とする。? CopyDataProperties (restObj , value , excludedNames ) を実行する。 ? PutValue (leftRef , restObj ) を返す。
13.15.5.5 Runtime Semantics: IteratorDestructuringAssignmentEvaluation
構文指向操作 IteratorDestructuringAssignmentEvaluation。引数 iteratorRecord (Iteratorレコード )。戻り値:(正常完了 (値:unused ) または 中途完了)。 次の生成規則ごとに定義される。
AssignmentElementList : AssignmentElisionElement
引数 iteratorRecord を指定した AssignmentElisionElement の ? IteratorDestructuringAssignmentEvaluation を返す。
AssignmentElementList :
AssignmentElementList
,
AssignmentElisionElement
引数 iteratorRecord を指定した AssignmentElementList の ? IteratorDestructuringAssignmentEvaluation を実行する。 引数 iteratorRecord を指定した AssignmentElisionElement の ? IteratorDestructuringAssignmentEvaluation を返す。
AssignmentElisionElement : AssignmentElement
引数 iteratorRecord を指定した AssignmentElement の ? IteratorDestructuringAssignmentEvaluation を返す。
AssignmentElisionElement :
Elision
AssignmentElement
引数 iteratorRecord を指定した Elision の ? IteratorDestructuringAssignmentEvaluation を実行する。 引数 iteratorRecord を指定した AssignmentElement の ? IteratorDestructuringAssignmentEvaluation を返す。
Elision : ,
iteratorRecord .[[Done]] が false である場合、? IteratorStep (iteratorRecord ) を実行する。 unused を返す。
Elision :
Elision
,
引数 iteratorRecord を指定した Elision の ? IteratorDestructuringAssignmentEvaluation を実行する。 iteratorRecord .[[Done]] が false である場合、? IteratorStep (iteratorRecord ) を実行する。 unused を返す。
AssignmentElement :
DestructuringAssignmentTarget
Initializer opt
DestructuringAssignmentTarget が ObjectLiteral と ArrayLiteral のいずれでもない場合、leftRef を DestructuringAssignmentTarget の ? Evaluation とする。value を undefined とする。iteratorRecord .[[Done]] が false である場合、next を ? IteratorStepValue (iteratorRecord ) とする。next が done でない場合、value を next に設定する。Initializer が存在し、value が undefined である場合、IsAnonymousFunctionDefinition (Initializer ) が true であり、DestructuringAssignmentTarget の IsIdentifierRef が true である場合、target を DestructuringAssignmentTarget の StringValue とする。value を、引数 target を指定した Initializer の ? NamedEvaluation に設定する。そうでない場合、defaultValue を Initializer の ? Evaluation とする。value を ? GetValue (defaultValue ) に設定する。 DestructuringAssignmentTarget が ObjectLiteral または ArrayLiteral のいずれかである場合、nestedAssignmentPattern を DestructuringAssignmentTarget によって被覆される AssignmentPattern とする。引数 value を指定した nestedAssignmentPattern の ? DestructuringAssignmentEvaluation を返す。 ? PutValue (leftRef , value ) を返す。
注
分割パターンではない DestructuringAssignmentTarget を、イテレーターへのアクセスや Initializer の評価より前に評価することによって、左から右への評価順序が維持されます。
AssignmentRestElement :
...
DestructuringAssignmentTarget
DestructuringAssignmentTarget が ObjectLiteral と ArrayLiteral のいずれでもない場合、leftRef を DestructuringAssignmentTarget の ? Evaluation とする。array を ! ArrayCreate (0) とする。n を 0 とする。iteratorRecord .[[Done]] が false の間、次を繰り返す。next を ? IteratorStepValue (iteratorRecord ) とする。next が done でない場合、! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (n )), next ) を実行する。 n を n + 1 に設定する。DestructuringAssignmentTarget が ObjectLiteral と ArrayLiteral のいずれでもない場合、? PutValue (leftRef , array ) を返す。 nestedAssignmentPattern を DestructuringAssignmentTarget によって被覆される AssignmentPattern とする。引数 array を指定した nestedAssignmentPattern の ? DestructuringAssignmentEvaluation を返す。
13.15.5.6 Runtime Semantics: KeyedDestructuringAssignmentEvaluation
構文指向操作 KeyedDestructuringAssignmentEvaluation。引数 value (ECMAScript 言語値 ) および propertyName (プロパティキー )。戻り値:(正常完了 (値:unused ) または 中途完了)。 次の生成規則ごとに定義される。
AssignmentElement :
DestructuringAssignmentTarget
Initializer opt
DestructuringAssignmentTarget が ObjectLiteral と ArrayLiteral のいずれでもない場合、leftRef を DestructuringAssignmentTarget の ? Evaluation とする。value を ? GetV (value , propertyName ) に設定する。Initializer が存在し、value が undefined である場合、IsAnonymousFunctionDefinition (Initializer ) が true であり、DestructuringAssignmentTarget の IsIdentifierRef が true である場合、target を DestructuringAssignmentTarget の StringValue とする。rhsValue を、引数 target を指定した Initializer の ? NamedEvaluation とする。そうでない場合、defaultValue を Initializer の ? Evaluation とする。rhsValue を ? GetValue (defaultValue ) とする。 そうでない場合、rhsValue を value とする。 DestructuringAssignmentTarget が ObjectLiteral または ArrayLiteral のいずれかである場合、assignmentPattern を DestructuringAssignmentTarget によって被覆される AssignmentPattern とする。引数 rhsValue を指定した assignmentPattern の ? DestructuringAssignmentEvaluation を返す。 ? PutValue (leftRef , rhsValue ) を返す。
13.16 コンマ演算子 ( , )
構文
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
leftRef を Expression の ? Evaluation とする。? GetValue (leftRef ) を実行する。 rightRef を AssignmentExpression の ? Evaluation とする。? GetValue (rightRef ) を返す。
注
GetValue の値は使用されませんが、観測可能な副作用を持つ可能性があるため、GetValue を呼び出さなければなりません。
14 ECMAScript 言語: 文と宣言
構文
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 文の意味論
14.1.1 Runtime Semantics: Evaluation
HoistableDeclaration :
GeneratorDeclaration
AsyncFunctionDeclaration
AsyncGeneratorDeclaration
empty を返す。
HoistableDeclaration : FunctionDeclaration
FunctionDeclaration の ? Evaluation を返す。
BreakableStatement :
IterationStatement
SwitchStatement
newLabelSet を新しい空の List とする。引数 newLabelSet を指定したこの BreakableStatement の ? LabelledEvaluation を返す。
14.2 ブロック
構文
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: 早期エラー
Block :
{
StatementList
}
14.2.2 Runtime Semantics: Evaluation
Block :
{
}
empty を返す。
Block :
{
StatementList
}
oldEnv を実行中の実行コンテキスト の LexicalEnvironment とする。blockEnv を NewDeclarativeEnvironment (oldEnv ) とする。BlockDeclarationInstantiation (StatementList , blockEnv ) を実行する。実行中の実行コンテキスト の LexicalEnvironment を blockEnv に設定する。blockValue を Completion (StatementList の Evaluation ) とする。blockValue を Completion (DisposeResources (blockEnv .[[DisposableResourceStack]] , blockValue )) に設定する。実行中の実行コンテキスト の LexicalEnvironment を oldEnv に設定する。? blockValue を返す。
注 1
Block からどのように制御が離れても、LexicalEnvironment は常に以前の状態に復元されます。
StatementList :
StatementList
StatementListItem
sl を StatementList の ? Evaluation とする。s を Completion (StatementListItem の Evaluation ) とする。? UpdateEmpty (s , sl ) を返す。
注 2
StatementList の値は、StatementList 内で最後に値を生成する項目の値です。たとえば、次の eval 関数の呼出しはいずれも値 1 を返します。
eval ("1;;;;;" )
eval ("1;{}" )
eval ("1;var a;" )
14.2.3 BlockDeclarationInstantiation ( code , envRecord )
抽象操作 BlockDeclarationInstantiation。引数 code (構文解析ノード ) および envRecord (Declarative Environmentレコード )。戻り値:unused 。 code はブロック本体に対応する Parse Node です。envRecord は束縛が作成される Environment Record です。
注
Block または CaseBlock が評価されると、新しい Declarative Environment Record が作成され、ブロック内で宣言された各ブロックスコープ変数、定数、関数、またはクラスの束縛が Environment Record にインスタンス化されます。
呼び出されたとき、次の手順を実行します。
decls を code の LexicallyScopedDeclarations とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。decls の各要素 decl について、次を行う。decl の BoundNames の各要素 name について、次を行う。decl の IsConstantDeclaration が true である場合、! envRecord .CreateImmutableBinding (name , true ) を実行する。 そうでない場合、Normative Optional
ホスト が Web ブラウザーであるか、その他の方法で ブロックレベル関数宣言の Web Legacy 互換性意味論 をサポートする場合、! envRecord .HasBinding (name ) が false である場合、! envRecord .CreateMutableBinding (name , false ) を実行する。 そうでない場合、! envRecord .CreateMutableBinding (name , false ) を実行する。 decl が FunctionDeclaration 、GeneratorDeclaration 、AsyncFunctionDeclaration 、または AsyncGeneratorDeclaration のいずれかである場合、funcName を decl の BoundNames の唯一の要素とする。funcObj を、引数 envRecord および privateEnv を指定した decl の InstantiateFunctionObject とする。Normative Optional
ホスト が Web ブラウザーであるか、その他の方法で ブロックレベル関数宣言の Web Legacy 互換性意味論 をサポートする場合、envRecord 内の funcName の束縛が初期化されていない束縛である場合、! envRecord .InitializeBinding (funcName , funcObj ) を実行する。 そうでない場合、表明 : decl は FunctionDeclaration である。! envRecord .SetMutableBinding (funcName , funcObj , false ) を実行する。 そうでない場合、! envRecord .InitializeBinding (funcName , funcObj ) を実行する。 unused を返す。
14.3 宣言と変数文
14.3.1 Let、Const、Using、および Await Using 宣言
注
let、const、using、および await using 宣言は、実行中の実行コンテキスト の LexicalEnvironment をスコープとする変数を定義します。変数は、それを含む Environment Record がインスタンス化されるときに作成されますが、その変数の LexicalBinding が評価されるまでは、いかなる方法でもアクセスできません。Initializer を持つ LexicalBinding によって定義された変数には、変数が作成されたときではなく、LexicalBinding が評価されたときに、その Initializer の AssignmentExpression の値が代入されます。let 宣言内の LexicalBinding が Initializer を持たない場合、LexicalBinding が評価されたときに変数へ値 undefined が代入されます。
構文
LexicalDeclaration [In, Yield, Await] :
LetOrConst
BindingList [?In, ?Yield, ?Await, +Pattern]
;
UsingDeclaration [?In, ?Yield, ?Await]
[+Await]
AwaitUsingDeclaration [?In, ?Yield]
LetOrConst :
let
const
UsingDeclaration [In, Yield, Await] :
using
[no LineTerminator here]
BindingList [?In, ?Yield, ?Await, ~Pattern]
;
AwaitUsingDeclaration [In, Yield] :
CoverAwaitExpressionAndAwaitUsingDeclarationHead [?Yield]
[no LineTerminator here]
BindingList [?In, ?Yield, +Await, ~Pattern]
;
BindingList [In, Yield, Await, Pattern] :
LexicalBinding [?In, ?Yield, ?Await, ?Pattern]
BindingList [?In, ?Yield, ?Await, ?Pattern]
,
LexicalBinding [?In, ?Yield, ?Await, ?Pattern]
LexicalBinding [In, Yield, Await, Pattern] :
BindingIdentifier [?Yield, ?Await]
Initializer [?In, ?Yield, ?Await] opt
[+Pattern]
BindingPattern [?Yield, ?Await]
Initializer [?In, ?Yield, ?Await]
補助構文
次の生成規則のインスタンスを処理するとき
AwaitUsingDeclaration :
CoverAwaitExpressionAndAwaitUsingDeclarationHead
BindingList
;
CoverAwaitExpressionAndAwaitUsingDeclarationHead の解釈は、次の文法を使用して詳細化されます。
AwaitUsingDeclarationHead :
await
[no LineTerminator here]
using
14.3.1.1 Static Semantics: 早期エラー
LexicalDeclaration :
LetOrConst
BindingList
;
UsingDeclaration :
using
BindingList
;
AwaitUsingDeclaration :
CoverAwaitExpressionAndAwaitUsingDeclarationHead
BindingList
;
LexicalBinding :
BindingIdentifier
Initializer opt
14.3.1.2 Runtime Semantics: Evaluation
LexicalDeclaration :
LetOrConst
BindingList
;
引数 normal を指定した BindingList の ? BindingEvaluation を実行する。 empty を返す。
UsingDeclaration :
using
BindingList
;
引数 sync-dispose を指定した BindingList の ? BindingEvaluation を実行する。 empty を返す。
AwaitUsingDeclaration :
CoverAwaitExpressionAndAwaitUsingDeclarationHead
BindingList
;
引数 async-dispose を指定した BindingList の ? BindingEvaluation を実行する。 empty を返す。
14.3.1.3 Runtime Semantics: BindingEvaluation
構文指向操作 BindingEvaluation。引数 kind ((normal 、sync-dispose または async-dispose ))。戻り値:(正常完了 (値:unused ) または 中途完了)。 次の生成規則ごとに定義される。
BindingList :
BindingList
,
LexicalBinding
引数 kind を指定した派生 BindingList の ? BindingEvaluation を実行する。 引数 kind を指定した LexicalBinding の ? BindingEvaluation を返す。
LexicalBinding : BindingIdentifier
表明 : kind は normal である。lhs を ! ResolveBinding (BindingIdentifier の StringValue ) とする。! InitializeReferencedBinding (lhs , undefined ) を実行する。 unused を返す。
注
静的意味論 の規則により、この形式の LexicalBinding は const、using、または await using 宣言内には決して現れません。
LexicalBinding :
BindingIdentifier
Initializer
name を BindingIdentifier の StringValue とする。lhs を ! ResolveBinding (name ) とする。IsAnonymousFunctionDefinition (Initializer ) が true である場合、value を、引数 name を指定した Initializer の ? NamedEvaluation とする。そうでない場合、rhs を Initializer の ? Evaluation とする。value を ? GetValue (rhs ) とする。 kind が normal でない場合、表明 : IsUnresolvableReference (lhs ) は false である。base を lhs .[[Base]] とする。表明 : base は Declarative Environment Record である。? AddDisposableResource (base .[[DisposableResourceStack]] , value , kind ) を実行する。 ? InitializeReferencedBinding (lhs , value ) を実行する。 unused を返す。
LexicalBinding :
BindingPattern
Initializer
表明 : kind は normal である。rhs を Initializer の ? Evaluation とする。value を ? GetValue (rhs ) とする。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。引数 value および envRecord を指定した BindingPattern の ? BindingInitialization を返す。
14.3.2 変数文
注
var 文は、実行中の実行コンテキスト の VariableEnvironment をスコープとする変数を宣言します。var 変数は、それを含む Environment Record がインスタンス化されるときに作成され、作成時に undefined で初期化されます。任意の VariableEnvironment のスコープ内で、同じ BindingIdentifier が複数の VariableDeclaration に現れてもかまいませんが、それらの宣言全体で定義される変数は1つだけです。Initializer を持つ VariableDeclaration によって定義された変数には、変数が作成されたときではなく、VariableDeclaration が実行されたときに、その Initializer の AssignmentExpression の値が代入されます。
構文
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 Runtime Semantics: Evaluation
VariableStatement :
var
VariableDeclarationList
;
VariableDeclarationList の ? Evaluation を実行する。empty を返す。
VariableDeclarationList :
VariableDeclarationList
,
VariableDeclaration
VariableDeclarationList の ? Evaluation を実行する。VariableDeclaration の ? Evaluation を返す。
VariableDeclaration : BindingIdentifier
empty を返す。
VariableDeclaration :
BindingIdentifier
Initializer
name を BindingIdentifier の StringValue とする。lhs を ? ResolveBinding (name ) とする。IsAnonymousFunctionDefinition (Initializer ) が true である場合、value を、引数 name を指定した Initializer の ? NamedEvaluation とする。そうでない場合、rhs を Initializer の ? Evaluation とする。value を ? GetValue (rhs ) とする。 ? PutValue (lhs , value ) を実行する。 empty を返す。
注
VariableDeclaration が with 文内に入れ子にされ、その VariableDeclaration 内の BindingIdentifier が with 文の Object Environment Record の束縛オブジェクトのプロパティ名 と同じである場合、手順 5 は Identifier の VariableEnvironment 束縛へ代入する代わりに、そのプロパティへ value を代入します。
VariableDeclaration :
BindingPattern
Initializer
rhs を Initializer の ? Evaluation とする。rightValue を ? GetValue (rhs ) とする。引数 rightValue および undefined を指定した BindingPattern の ? BindingInitialization を返す。
14.3.3 分割束縛パターン
構文
BindingPattern [Yield, Await] :
ObjectBindingPattern [?Yield, ?Await]
ArrayBindingPattern [?Yield, ?Await]
ObjectBindingPattern [Yield, Await] :
{
}
{
BindingRestProperty [?Yield, ?Await]
}
{
BindingPropertyList [?Yield, ?Await]
,opt
}
{
BindingPropertyList [?Yield, ?Await]
,
BindingRestProperty [?Yield, ?Await]
}
ArrayBindingPattern [Yield, Await] :
[
Elision opt
BindingRestElement [?Yield, ?Await] opt
]
[
BindingElementList [?Yield, ?Await]
]
[
BindingElementList [?Yield, ?Await]
,
Elision opt
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] :
Elision opt
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 Runtime Semantics: PropertyBindingInitialization
構文指向操作 PropertyBindingInitialization。引数 value (ECMAScript 言語値 ) および envRecord ((Environmentレコード または undefined ))。戻り値:(正常完了 (値:リスト (要素:プロパティキー )) または 中途完了)。 束縛されたすべてのプロパティ名 のリストを収集します。 次の生成規則ごとに定義される。
BindingPropertyList :
BindingPropertyList
,
BindingProperty
boundNames を、引数 value および envRecord を指定した BindingPropertyList の ? PropertyBindingInitialization とする。nextNames を、引数 value および envRecord を指定した BindingProperty の ? PropertyBindingInitialization とする。boundNames と nextNames のリスト連結 を返す。
BindingProperty : SingleNameBinding
name を SingleNameBinding の BoundNames の唯一の要素とする。引数 value 、envRecord 、および name を指定した SingleNameBinding の ? KeyedBindingInitialization を実行する。 « name » を返す。
BindingProperty :
PropertyName
:
BindingElement
propertyKey を PropertyName の ? Evaluation とする。引数 value 、envRecord 、および propertyKey を指定した BindingElement の ? KeyedBindingInitialization を実行する。 « propertyKey » を返す。
14.3.3.2 Runtime Semantics: RestBindingInitialization
構文指向操作 RestBindingInitialization。引数 value (ECMAScript 言語値 )、envRecord ((Environmentレコード または undefined )) および excludedNames (リスト (要素:プロパティキー ))。戻り値:(正常完了 (値:unused ) または 中途完了)。 次の生成規則ごとに定義される。
BindingRestProperty :
...
BindingIdentifier
lhs を ? ResolveBinding (BindingIdentifier の StringValue , envRecord ) とする。restObj を OrdinaryObjectCreate (%Object.prototype% ) とする。? CopyDataProperties (restObj , value , excludedNames ) を実行する。 envRecord が undefined である場合、? PutValue (lhs , restObj ) を返す。? InitializeReferencedBinding (lhs , restObj ) を返す。
14.3.3.3 Runtime Semantics: KeyedBindingInitialization
構文指向操作 KeyedBindingInitialization。引数 value (ECMAScript 言語値 )、envRecord ((Environmentレコード または undefined )) および propertyName (プロパティキー )。戻り値:(正常完了 (値:unused ) または 中途完了)。
注
envRecord に undefined が渡された場合、初期化値の代入に PutValue 操作を使用するべきであることを示します。これは非 strict 関数 の仮引数リストの場合です。その場合、同じ名前の複数の引数が存在する可能性に対応するため、仮引数の束縛は事前に初期化されます。
次の生成規則ごとに定義される。
BindingElement :
BindingPattern
Initializer opt
value を ? GetV (value , propertyName ) に設定する。Initializer が存在し、value が undefined である場合、defaultValue を Initializer の ? Evaluation とする。value を ? GetValue (defaultValue ) に設定する。引数 value および envRecord を指定した BindingPattern の ? BindingInitialization を返す。
SingleNameBinding :
BindingIdentifier
Initializer opt
name を BindingIdentifier の StringValue とする。lhs を ? ResolveBinding (name , envRecord ) とする。value を ? GetV (value , propertyName ) に設定する。Initializer が存在し、value が undefined である場合、IsAnonymousFunctionDefinition (Initializer ) が true である場合、value を、引数 name を指定した Initializer の ? NamedEvaluation に設定する。そうでない場合、defaultValue を Initializer の ? Evaluation とする。value を ? GetValue (defaultValue ) に設定する。 envRecord が undefined である場合、? PutValue (lhs , value ) を返す。? InitializeReferencedBinding (lhs , value ) を返す。
14.4 空文
構文
EmptyStatement :
;
14.4.1 Runtime Semantics: Evaluation
EmptyStatement : ;
empty を返す。
14.5 式文
構文
ExpressionStatement [Yield, Await] :
[lookahead ∉ { { , function , async
[no LineTerminator here]
function , class , let
[ }]
Expression [+In, ?Yield, ?Await]
;
注
14.5.1 Runtime Semantics: Evaluation
ExpressionStatement :
Expression
;
exprRef を Expression の ? Evaluation とする。? GetValue (exprRef ) を返す。
14.6 if 文
構文
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 ]
注 先読み制限 [lookahead ≠ else] は、古典的な「dangling else」問題を通常の方法で解決します。つまり、関連付ける if の選択がそれ以外では曖昧な場合、else は候補となる if のうち最も近い(最も内側の)ものに関連付けられます。
14.6.1 Static Semantics: 早期エラー
IfStatement :
if
(
Expression
)
Statement
else
Statement
IfStatement :
if
(
Expression
)
Statement
注
この規則を適用する必要があるのは、B.3.1 で規定される拡張が実装されている場合だけです。
14.6.2 Runtime Semantics: Evaluation
IfStatement :
if
(
Expression
)
Statement
else
Statement
exprRef を Expression の ? Evaluation とする。exprValue を ToBoolean (? GetValue (exprRef )) とする。exprValue が true である場合、stmtCompletion を Completion (最初の Statement の Evaluation ) とする。そうでない場合、stmtCompletion を Completion (2番目の Statement の Evaluation ) とする。 ? UpdateEmpty (stmtCompletion , undefined ) を返す。
IfStatement :
if
(
Expression
)
Statement
exprRef を Expression の ? Evaluation とする。exprValue を ToBoolean (? GetValue (exprRef )) とする。exprValue が false である場合、undefined を返す。stmtCompletion を Completion (Statement の Evaluation ) とする。? UpdateEmpty (stmtCompletion , undefined ) を返す。
14.7 反復文
構文
IterationStatement [Yield, Await, Return] :
DoWhileStatement [?Yield, ?Await, ?Return]
WhileStatement [?Yield, ?Await, ?Return]
ForStatement [?Yield, ?Await, ?Return]
ForInOfStatement [?Yield, ?Await, ?Return]
14.7.1 意味論
14.7.1.1 LoopContinues ( completion , labelSet )
抽象操作 LoopContinues。引数 completion (完了レコード ) および labelSet (リスト (要素:String))。戻り値:Boolean。 呼び出されると、次の手順を実行する。
completion が正常完了 である場合、true を返す。completion が continue 完了 でない場合、false を返す。completion .[[Target]] が empty である場合、true を返す。labelSet が completion .[[Target]] を含む場合、true を返す。false を返す。
注
14.7.1.2 Runtime Semantics: LoopEvaluation
構文指向操作 LoopEvaluation。引数 labelSet (リスト (要素:String))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 次の生成規則ごとに定義される。
IterationStatement : DoWhileStatement
引数 labelSet を指定した DoWhileStatement の ? DoWhileLoopEvaluation を返す。
IterationStatement : WhileStatement
引数 labelSet を指定した WhileStatement の ? WhileLoopEvaluation を返す。
IterationStatement : ForStatement
引数 labelSet を指定した ForStatement の ? ForLoopEvaluation を返す。
IterationStatement : ForInOfStatement
引数 labelSet を指定した ForInOfStatement の ? ForInOfLoopEvaluation を返す。
14.7.2 do-while 文
構文
DoWhileStatement [Yield, Await, Return] :
do
Statement [?Yield, ?Await, ?Return]
while
(
Expression [+In, ?Yield, ?Await]
)
;
14.7.2.1 Static Semantics: 早期エラー
DoWhileStatement :
do
Statement
while
(
Expression
)
;
注
この規則を適用する必要があるのは、B.3.1 で規定される拡張が実装されている場合だけです。
14.7.2.2 Runtime Semantics: DoWhileLoopEvaluation
構文指向操作 DoWhileLoopEvaluation。引数 labelSet (リスト (要素:String))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 次の生成規則ごとに定義される。
DoWhileStatement :
do
Statement
while
(
Expression
)
;
iterationResult を undefined とする。次を繰り返す。stmtResult を Completion (Statement の Evaluation ) とする。LoopContinues (stmtResult , labelSet ) が false である場合、? UpdateEmpty (stmtResult , iterationResult ) を返す。stmtResult .[[Value]] が empty でない場合、iterationResult を stmtResult .[[Value]] に設定する。exprRef を Expression の ? Evaluation とする。exprValue を ? GetValue (exprRef ) とする。ToBoolean (exprValue ) が false である場合、iterationResult を返す。
14.7.3 while 文
構文
WhileStatement [Yield, Await, Return] :
while
(
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
14.7.3.1 Static Semantics: 早期エラー
WhileStatement :
while
(
Expression
)
Statement
注
この規則を適用する必要があるのは、B.3.1 で規定される拡張が実装されている場合だけです。
14.7.3.2 Runtime Semantics: WhileLoopEvaluation
構文指向操作 WhileLoopEvaluation。引数 labelSet (リスト (要素:String))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 次の生成規則ごとに定義される。
WhileStatement :
while
(
Expression
)
Statement
iterationResult を undefined とする。次を繰り返す。exprRef を Expression の ? Evaluation とする。exprValue を ? GetValue (exprRef ) とする。ToBoolean (exprValue ) が false である場合、iterationResult を返す。stmtResult を Completion (Statement の Evaluation ) とする。LoopContinues (stmtResult , labelSet ) が false である場合、? UpdateEmpty (stmtResult , iterationResult ) を返す。stmtResult .[[Value]] が empty でない場合、iterationResult を stmtResult .[[Value]] に設定する。
14.7.4 for 文
構文
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 Static Semantics: 早期エラー
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
注
この規則を適用する必要があるのは、B.3.1 で規定される拡張が実装されている場合だけです。
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
14.7.4.2 Runtime Semantics: ForLoopEvaluation
構文指向操作 ForLoopEvaluation。引数 labelSet (リスト (要素:String))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 次の生成規則ごとに定義される。
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
最初の Expression が存在する場合、exprRef を最初の Expression の ? Evaluation とする。? GetValue (exprRef ) を実行する。 2番目の Expression が存在する場合、test を2番目の Expression とする。そうでない場合、test を empty とする。 3番目の Expression が存在する場合、increment を3番目の Expression とする。そうでない場合、increment を empty とする。 ? ForBodyEvaluation (test , increment , Statement , « », labelSet ) を返す。
ForStatement :
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
VariableDeclarationList の ? Evaluation を実行する。最初の Expression が存在する場合、test を最初の Expression とする。そうでない場合、test を empty とする。 2番目の Expression が存在する場合、increment を2番目の Expression とする。そうでない場合、increment を empty とする。 ? ForBodyEvaluation (test , increment , Statement , « », labelSet ) を返す。
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
oldEnv を実行中の実行コンテキスト の LexicalEnvironment とする。loopEnv を NewDeclarativeEnvironment (oldEnv ) とする。isConst を LexicalDeclaration の IsConstantDeclaration とする。boundNames を LexicalDeclaration の BoundNames とする。boundNames の各要素 name について、次を行う。isConst が true である場合、! loopEnv .CreateImmutableBinding (name , true ) を実行する。 そうでない場合、! loopEnv .CreateMutableBinding (name , false ) を実行する。 実行中の実行コンテキスト の LexicalEnvironment を loopEnv に設定する。forDecl を Completion (LexicalDeclaration の Evaluation ) とする。forDecl が中断完了 である場合、forDecl を Completion (DisposeResources (loopEnv .[[DisposableResourceStack]] , forDecl )) に設定する。表明 : forDecl は中断完了 である。実行中の実行コンテキスト の LexicalEnvironment を oldEnv に設定する。? forDecl を返す。 isConst が false である場合、perIterationLets を boundNames とする。そうでない場合、perIterationLets を新しい空の List とする。最初の Expression が存在する場合、test を最初の Expression とする。そうでない場合、test を empty とする。 2番目の Expression が存在する場合、increment を2番目の Expression とする。そうでない場合、increment を empty とする。 bodyResult を Completion (ForBodyEvaluation (test , increment , Statement , perIterationLets , labelSet )) とする。bodyResult を Completion (DisposeResources (loopEnv .[[DisposableResourceStack]] , bodyResult )) に設定する。表明 : bodyResult が正常完了 である場合、bodyResult .[[Value]] は empty ではない。実行中の実行コンテキスト の LexicalEnvironment を oldEnv に設定する。? bodyResult を返す。
14.7.4.3 ForBodyEvaluation ( test , increment , stmt , perIterationBindings , labelSet )
抽象操作 ForBodyEvaluation。引数 test ((an Expression Parse Node または empty ))、increment ((an Expression Parse Node または empty ))、stmt (a Statement Parse Node )、perIterationBindings (リスト (要素:String)) および labelSet (リスト (要素:String))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 呼び出されると、次の手順を実行する。
iterationResult を undefined とする。? CreatePerIterationEnvironment (perIterationBindings ) を実行する。 次を繰り返す。test が empty でない場合、testRef を test の ? Evaluation とする。testValue を ? GetValue (testRef ) とする。ToBoolean (testValue ) が false である場合、iterationResult を返す。result を Completion (stmt の Evaluation ) とする。LoopContinues (result , labelSet ) が false である場合、? UpdateEmpty (result , iterationResult ) を返す。result .[[Value]] が empty でない場合、iterationResult を result .[[Value]] に設定する。? CreatePerIterationEnvironment (perIterationBindings ) を実行する。 increment が empty でない場合、incrementRef を increment の ? Evaluation とする。? GetValue (incrementRef ) を実行する。
14.7.4.4 CreatePerIterationEnvironment ( perIterationBindings )
抽象操作 CreatePerIterationEnvironment。引数 perIterationBindings (リスト (要素:String))。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
perIterationBindings が要素を持つ場合、lastIterationEnv を実行中の実行コンテキスト の LexicalEnvironment とする。outer を lastIterationEnv .[[OuterEnv]] とする。表明 : outer は null ではない。thisIterationEnv を NewDeclarativeEnvironment (outer ) とする。perIterationBindings の各要素 name について、次を行う。! thisIterationEnv .CreateMutableBinding (name , false ) を実行する。 lastValue を ? lastIterationEnv .GetBindingValue (name , true ) とする。! thisIterationEnv .InitializeBinding (name , lastValue ) を実行する。 実行中の実行コンテキスト の LexicalEnvironment を thisIterationEnv に設定する。unused を返す。
14.7.5 for-in、for-of、および for-await-of 文
構文
ForInOfStatement [Yield, Await, Return] :
for
(
[lookahead ≠ let
[ ]
LeftHandSideExpression [?Yield, ?Await]
in
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
var
ForBinding [?Yield, ?Await, +Pattern]
in
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
ForDeclaration [?Yield, ?Await, ~Using]
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, +Pattern]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
[lookahead ≠ using
of ]
ForDeclaration [?Yield, ?Await, +Using]
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, +Pattern]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
[+Await]
for
await
(
[lookahead ≠ using
of ]
ForDeclaration [?Yield, ?Await, +Using]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
ForDeclaration [Yield, Await, Using] :
LetOrConst
ForBinding [?Yield, ?Await, +Pattern]
[+Using]
using
[no LineTerminator here]
ForBinding [?Yield, ?Await, ~Pattern]
[+Using, +Await]
await
[no LineTerminator here]
using
[no LineTerminator here]
ForBinding [?Yield, +Await, ~Pattern]
ForBinding [Yield, Await, Pattern] :
BindingIdentifier [?Yield, ?Await]
[+Pattern]
BindingPattern [?Yield, ?Await]
注
この節は、附属書 B.3.5 によって拡張されます。
14.7.5.1 Static Semantics: 早期エラー
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
注
この規則を適用する必要があるのは、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
14.7.5.2 Static Semantics: IsDestructuring
構文指向操作 IsDestructuring。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
MemberExpression : PrimaryExpression
PrimaryExpression が ObjectLiteral または ArrayLiteral のいずれかである場合、true を返す。false を返す。
MemberExpression :
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
MemberExpression
TemplateLiteral
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
.
PrivateIdentifier
NewExpression :
new
NewExpression
LeftHandSideExpression :
CallExpression
OptionalExpression
false を返す。
ForDeclaration :
LetOrConst
ForBinding
ForBinding の IsDestructuring を返す。
ForBinding : BindingIdentifier
false を返す。
ForBinding : BindingPattern
true を返す。
注
この節は、附属書 B.3.5 によって拡張されます。
14.7.5.3 Runtime Semantics: ForDeclarationBindingInitialization
構文指向操作 ForDeclarationBindingInitialization。引数 value (ECMAScript 言語値 ) および envRecord (Environmentレコード )。戻り値:(正常完了 (値:unused ) または 中途完了)。 次の生成規則ごとに定義される。
ForDeclaration :
LetOrConst
ForBinding
引数 value および envRecord を指定した ForBinding の ? BindingInitialization を返す。
ForDeclaration :
using
ForBinding
await
using
ForBinding
SyntaxError 例外をスローする。
14.7.5.4 Runtime Semantics: ForDeclarationBindingInstantiation
構文指向操作 ForDeclarationBindingInstantiation。引数 envRecord (Declarative Environmentレコード )。戻り値:unused 。 次の生成規則ごとに定義される。
ForDeclaration :
LetOrConst
ForBinding
ForBinding の BoundNames の各要素 name について、次を行う。LetOrConst の IsConstantDeclaration が true である場合、! envRecord .CreateImmutableBinding (name , true ) を実行する。 そうでない場合、! envRecord .CreateMutableBinding (name , false ) を実行する。 unused を返す。
ForDeclaration :
using
ForBinding
await
using
ForBinding
ForBinding の BoundNames の各要素 name について、次を行う。! envRecord .CreateImmutableBinding (name , true ) を実行する。 unused を返す。
14.7.5.5 Runtime Semantics: ForInOfLoopEvaluation
構文指向操作 ForInOfLoopEvaluation。引数 labelSet (リスト (要素:String))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 次の生成規則ごとに定義される。
ForInOfStatement :
for
(
LeftHandSideExpression
in
Expression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (« », Expression , enumerate ) とする。? ForIn/OfBodyEvaluation (LeftHandSideExpression , Statement , keyResult , enumerate , assignment , labelSet ) を返す。
ForInOfStatement :
for
(
var
ForBinding
in
Expression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (« », Expression , enumerate ) とする。? ForIn/OfBodyEvaluation (ForBinding , Statement , keyResult , enumerate , var-binding , labelSet ) を返す。
ForInOfStatement :
for
(
ForDeclaration
in
Expression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (ForDeclaration の BoundNames , Expression , enumerate ) とする。? ForIn/OfBodyEvaluation (ForDeclaration , Statement , keyResult , enumerate , lexical-binding , labelSet ) を返す。
ForInOfStatement :
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (« », AssignmentExpression , iterate ) とする。? ForIn/OfBodyEvaluation (LeftHandSideExpression , Statement , keyResult , iterate , assignment , labelSet ) を返す。
ForInOfStatement :
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (« », AssignmentExpression , iterate ) とする。? ForIn/OfBodyEvaluation (ForBinding , Statement , keyResult , iterate , var-binding , labelSet ) を返す。
ForInOfStatement :
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (ForDeclaration の BoundNames , AssignmentExpression , iterate ) とする。? ForIn/OfBodyEvaluation (ForDeclaration , Statement , keyResult , iterate , lexical-binding , labelSet ) を返す。
ForInOfStatement :
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (« », AssignmentExpression , async-iterate ) とする。? ForIn/OfBodyEvaluation (LeftHandSideExpression , Statement , keyResult , iterate , assignment , labelSet , async ) を返す。
ForInOfStatement :
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (« », AssignmentExpression , async-iterate ) とする。? ForIn/OfBodyEvaluation (ForBinding , Statement , keyResult , iterate , var-binding , labelSet , async ) を返す。
ForInOfStatement :
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (ForDeclaration の BoundNames , AssignmentExpression , async-iterate ) とする。? ForIn/OfBodyEvaluation (ForDeclaration , Statement , keyResult , iterate , lexical-binding , labelSet , async ) を返す。
注
この節は、附属書 B.3.5 によって拡張されます。
14.7.5.6 ForIn/OfHeadEvaluation ( uninitializedBoundNames , expr , iterationKind )
抽象操作 ForIn/OfHeadEvaluation。引数 uninitializedBoundNames (リスト (要素:String))、expr ((an Expression Parse Node または an AssignmentExpression Parse Node )) および iterationKind ((enumerate 、iterate または async-iterate ))。戻り値:(正常完了 (値:Iteratorレコード ) または 中途完了)。 呼び出されると、次の手順を実行する。
oldEnv を実行中の実行コンテキスト の LexicalEnvironment とする。uninitializedBoundNames が空でない場合、表明 : uninitializedBoundNames は重複する項目を持たない。newEnv を NewDeclarativeEnvironment (oldEnv ) とする。uninitializedBoundNames の各 String name について、次を行う。! newEnv .CreateMutableBinding (name , false ) を実行する。 実行中の実行コンテキスト の LexicalEnvironment を newEnv に設定する。exprRef を Completion (expr の Evaluation ) とする。実行中の実行コンテキスト の LexicalEnvironment を oldEnv に設定する。exprValue を ? GetValue (? exprRef ) とする。iterationKind が enumerate である場合、exprValue が undefined または null のいずれかである場合、Completion Record { [[Type]] : break , [[Value]] : empty , [[Target]] : empty } を返す。obj を ! ToObject (exprValue ) とする。iterator を EnumerateObjectProperties (obj ) とする。nextMethod を ! GetV (iterator , "next" ) とする。Iterator Record { [[Iterator]] : iterator , [[NextMethod]] : nextMethod , [[Done]] : false } を返す。表明 : iterationKind は iterate または async-iterate のいずれかである。iterationKind が async-iterate である場合、iteratorKind を async とする。そうでない場合、iteratorKind を sync とする。 ? GetIterator (exprValue , iteratorKind ) を返す。
14.7.5.7 ForIn/OfBodyEvaluation ( lhs , stmt , iteratorRecord , iterationKind , lhsKind , labelSet [ , iteratorKind ] )
抽象操作 ForIn/OfBodyEvaluation。引数 lhs (構文解析ノード )、stmt (a Statement Parse Node )、iteratorRecord (Iteratorレコード )、iterationKind ((enumerate または iterate ))、lhsKind ((assignment 、var-binding または lexical-binding )) および labelSet (リスト (要素:String))および省略可能な引数 iteratorKind ((sync または async ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 呼び出されると、次の手順を実行する。
iteratorKind が存在しない場合、iteratorKind を sync に設定する。oldEnv を実行中の実行コンテキスト の LexicalEnvironment とする。iterationResult を undefined とする。lhsKind が lexical-binding である場合、表明 : lhs は ForDeclaration である。lhs の IsAwaitUsingDeclaration が true である場合、declKind を async-dispose とする。そうでなく、lhs の IsUsingDeclaration が true である場合、declKind を sync-dispose とする。 そうでない場合、declKind を normal とする。 そうでない場合、declKind を normal とする。 destructuring を lhs の IsDestructuring とする。destructuring が true かつ lhsKind が assignment である場合、表明 : lhs は LeftHandSideExpression である。assignmentPattern を lhs によって被覆される AssignmentPattern とする。次を繰り返す。nextResult を ? Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] ) とする。iteratorKind が async である場合、nextResult を ? Await (nextResult ) に設定する。nextResult が Object でない場合、TypeError 例外をスローする。done を ? IteratorComplete (nextResult ) とする。done が true である場合、iterationResult を返す。nextValue を ? IteratorValue (nextResult ) とする。lhsKind が assignment または var-binding のいずれかである場合、destructuring が true である場合、lhsKind が assignment である場合、status を Completion (引数 nextValue を指定した assignmentPattern の DestructuringAssignmentEvaluation ) とする。そうでない場合、表明 : lhsKind は var-binding である。表明 : lhs は ForBinding である。status を Completion (引数 nextValue および undefined を指定した lhs の BindingInitialization ) とする。 そうでない場合、lhsRef を Completion (lhs の Evaluation ) とする。(繰り返し評価される場合があります。)lhsKind が assignment であり、lhs の AssignmentTargetType が web-compat である場合、ReferenceError 例外をスローする。lhsRef が中断完了 である場合、status を lhsRef とする。そうでない場合、status を Completion (PutValue (lhsRef .[[Value]] , nextValue )) とする。 iterationEnv を undefined とする。そうでない場合、表明 : lhsKind は lexical-binding である。表明 : lhs は ForDeclaration である。iterationEnv を NewDeclarativeEnvironment (oldEnv ) とする。引数 iterationEnv を指定した lhs の ForDeclarationBindingInstantiation を実行する。 実行中の実行コンテキスト の LexicalEnvironment を iterationEnv に設定する。destructuring が true である場合、status を Completion (引数 nextValue および iterationEnv を指定した lhs の ForDeclarationBindingInitialization ) とする。そうでない場合、表明 : lhs は単一の名前を束縛する。lhsName を lhs の BoundNames の唯一の要素とする。lhsRef を ! ResolveBinding (lhsName ) とする。declKind が normal でない場合、表明 : IsUnresolvableReference (lhsRef ) は false である。base を lhsRef .[[Base]] とする。表明 : base は Declarative Environment Record である。status を Completion (AddDisposableResource (base .[[DisposableResourceStack]] , nextValue , declKind )) とする。そうでない場合、status を NormalCompletion (unused ) とする。 status が正常完了 である場合、status を Completion (InitializeReferencedBinding (lhsRef , nextValue )) に設定する。 status が中断完了 である場合、iterationEnv が undefined でない場合、status を Completion (DisposeResources (iterationEnv .[[DisposableResourceStack]] , status )) に設定する。表明 : status は中断完了 である。実行中の実行コンテキスト の LexicalEnvironment を oldEnv に設定する。iterationKind が enumerate である場合、? status を返す。表明 : iterationKind は iterate である。iteratorKind が async である場合、? AsyncIteratorClose (iteratorRecord , status ) を返す。? IteratorClose (iteratorRecord , status ) を返す。 result を Completion (stmt の Evaluation ) とする。iterationEnv が undefined でない場合、result を Completion (DisposeResources (iterationEnv .[[DisposableResourceStack]] , result )) に設定する。実行中の実行コンテキスト の LexicalEnvironment を oldEnv に設定する。LoopContinues (result , labelSet ) が false である場合、status を Completion (UpdateEmpty (result , iterationResult )) に設定する。iterationKind が enumerate である場合、? status を返す。表明 : iterationKind は iterate である。iteratorKind が async である場合、? AsyncIteratorClose (iteratorRecord , status ) を返す。? IteratorClose (iteratorRecord , status ) を返す。 result .[[Value]] が empty でない場合、iterationResult を result .[[Value]] に設定する。
14.7.5.8 Runtime Semantics: Evaluation
BindingIdentifier :
Identifier
yield
await
name を BindingIdentifier の StringValue とする。? ResolveBinding (name ) を返す。
14.7.5.9 EnumerateObjectProperties ( obj )
抽象操作 EnumerateObjectProperties。引数 obj (Object)。戻り値:イテレーターオブジェクト 。 呼び出されると、次の手順を実行する。
next メソッドが obj の列挙可能なプロパティの String 値キーをすべて反復するイテレーターオブジェクトを返す。このイテレーターオブジェクトは ECMAScript コードから直接アクセスされることはない。プロパティを列挙する仕組みと順序は規定されないが、以下で規定される規則に適合しなければならない。
イテレーターの throw および return メソッドは null であり、決して呼び出されません。イテレーターの next メソッドは、プロパティキー をイテレーター値として返すべきかどうかを判定するためにオブジェクトのプロパティを処理します。返されるプロパティキー には Symbol であるキーは含まれません。対象オブジェクトのプロパティは列挙中に削除される場合があります。イテレーターの next メソッドによって処理される前に削除されたプロパティは無視されます。列挙中に対象オブジェクトへ新しいプロパティが追加された場合、新しく追加されたプロパティが進行中の列挙で処理されることは保証されません。プロパティ名 は、任意の列挙においてイテレーターの next メソッドによって最大1回だけ返されます。
対象オブジェクトのプロパティの列挙には、そのプロトタイプ、そのプロトタイプのプロトタイプ、というように再帰的にプロトタイプのプロパティを列挙することも含まれます。ただし、プロトタイプのプロパティが、イテレーターの next メソッドによってすでに処理されたプロパティと同じ名前を持つ場合、そのプロパティは処理されません。プロトタイプオブジェクトのプロパティがすでに処理されたかどうかを判定するとき、[[Enumerable]] 属性の値は考慮されません。プロトタイプオブジェクトの列挙可能なプロパティ名 は、そのプロトタイプオブジェクトを引数として渡して EnumerateObjectProperties を呼び出すことによって取得しなければなりません。EnumerateObjectProperties は、対象オブジェクトの [[OwnPropertyKeys]] 内部メソッドを呼び出して自身のプロパティキー を取得しなければなりません。対象オブジェクトのプロパティ属性は、その [[GetOwnProperty]] 内部メソッドを呼び出して取得しなければなりません。
さらに、obj も、そのプロトタイプチェーン内のいずれのオブジェクトも Proxy 特殊オブジェクト 、TypedArray 、Module Namespace 特殊オブジェクト 、または実装提供の特殊オブジェクト でない場合、次のいずれかが発生するまで、イテレーターは CreateForInIterator (obj ) によって与えられるイテレーターと同じように動作しなければなりません。
obj またはそのプロトタイプチェーン内のオブジェクトの [[Prototype]] 内部スロットの値が変更される、
obj またはそのプロトタイプチェーン内のオブジェクトからプロパティが削除される、
obj のプロトタイプチェーン内のオブジェクトにプロパティが追加される、または
obj またはそのプロトタイプチェーン内のオブジェクトのプロパティの [[Enumerable]] 属性の値が変更される。
注 1
ECMAScript 実装は、14.7.5.10.2.1 のアルゴリズムを直接実装する必要はありません。前の段落の制約のいずれかに違反しない限り、そのアルゴリズムから動作が逸脱しない任意の実装を選択できます。
次は、これらの規則に適合する ECMAScript ジェネレーター関数の参考定義です。
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;
}
}
注 2
実装が
CreateForInIterator と一致する必要のない
特殊オブジェクト の一覧は、それらの場合について実装の動作が歴史的に異なり、それ以外のすべての場合では一致していたため選択されています。
14.7.5.10 For-In Iterator オブジェクト
For-In Iterator は、特定のオブジェクトに対する特定の反復を表すオブジェクトです。For-In Iterator オブジェクトは ECMAScript コードから直接アクセスされることはなく、EnumerateObjectProperties の動作を説明するためだけに存在します。
14.7.5.10.1 CreateForInIterator ( obj )
抽象操作 CreateForInIterator。引数 obj (Object)。戻り値:a For-In Iterator 。 obj の自身および継承された列挙可能な文字列プロパティを特定の順序で反復する For-In Iterator オブジェクトを作成するために使用されます。 呼び出されると、次の手順を実行する。
iterator を OrdinaryObjectCreate (%ForInIteratorPrototype% , « [[Object]] , [[ObjectWasVisited]] , [[VisitedKeys]] , [[RemainingKeys]] ») とする。iterator .[[Object]] を obj に設定する。iterator .[[ObjectWasVisited]] を false に設定する。iterator .[[VisitedKeys]] を新しい空の List に設定する。iterator .[[RemainingKeys]] を新しい空の List に設定する。iterator を返す。
14.7.5.10.2 %ForInIteratorPrototype% オブジェクト
%ForInIteratorPrototype% オブジェクトは:
14.7.5.10.2.1 %ForInIteratorPrototype%.next ( )
iterator を this 値とする。表明 : iterator は Object である。表明 : iterator は For-In Iterator インスタンスのすべての内部スロット(14.7.5.10.3 )を持つ。obj を iterator .[[Object]] とする。次を繰り返す。iterator .[[ObjectWasVisited]] が false である場合、keys を ? obj .[[OwnPropertyKeys]] () とする。keys の各要素 key について、次を行う。key が String である場合、key を iterator .[[RemainingKeys]] に追加する。iterator .[[ObjectWasVisited]] を true に設定する。iterator .[[RemainingKeys]] が空でない間、次を繰り返す。key を iterator .[[RemainingKeys]] の最初の要素とする。iterator .[[RemainingKeys]] から最初の要素を削除する。iterator .[[VisitedKeys]] が key を含まない場合、propertyDesc を ? obj .[[GetOwnProperty]] (key ) とする。propertyDesc が undefined でない場合、key を iterator .[[VisitedKeys]] に追加する。propertyDesc .[[Enumerable]] が true である場合、CreateIteratorResultObject (key , false ) を返す。obj を ? obj .[[GetPrototypeOf]] () に設定する。iterator .[[Object]] を obj に設定する。iterator .[[ObjectWasVisited]] を false に設定する。obj が null である場合、CreateIteratorResultObject (undefined , true ) を返す。
14.7.5.10.3 For-In Iterator インスタンスのプロパティ
For-In Iterator インスタンスは、%ForInIteratorPrototype% イントリンシックオブジェクトからプロパティを継承する通常オブジェクト です。For-In Iterator インスタンスは、初期状態では 表 34 に列挙される内部スロットを持つように作成されます。
表 34: For-In Iterator インスタンスの内部スロット
内部スロット
型
説明
[[Object]]
an Object
プロパティが反復されている Object 値です。
[[ObjectWasVisited]]
a Boolean
イテレーターが [[Object]] に対して [[OwnPropertyKeys]] を呼び出している場合は true 、それ以外の場合は false です。
[[VisitedKeys]]
a List of Strings
このイテレーターがこれまでに出力した値です。
[[RemainingKeys]]
a List of Strings
そのプロトタイプが null でない場合にプロトタイプのプロパティを反復する前に、現在のオブジェクトについて出力するために残っている値です。
14.8 continue 文
構文
ContinueStatement [Yield, Await] :
continue
;
continue
[no LineTerminator here]
LabelIdentifier [?Yield, ?Await]
;
14.8.1 Static Semantics: 早期エラー
ContinueStatement :
continue
;
continue
LabelIdentifier
;
14.8.2 Runtime Semantics: Evaluation
ContinueStatement :
continue
;
Completion Record { [[Type]] : continue , [[Value]] : empty , [[Target]] : empty } を返す。
ContinueStatement :
continue
LabelIdentifier
;
label を LabelIdentifier の StringValue とする。Completion Record { [[Type]] : continue , [[Value]] : empty , [[Target]] : label } を返す。
14.9 break 文
構文
BreakStatement [Yield, Await] :
break
;
break
[no LineTerminator here]
LabelIdentifier [?Yield, ?Await]
;
14.9.1 Static Semantics: 早期エラー
BreakStatement :
break
;
14.9.2 Runtime Semantics: Evaluation
BreakStatement :
break
;
Completion Record { [[Type]] : break , [[Value]] : empty , [[Target]] : empty } を返す。
BreakStatement :
break
LabelIdentifier
;
label を LabelIdentifier の StringValue とする。Completion Record { [[Type]] : break , [[Value]] : empty , [[Target]] : label } を返す。
14.10 return 文
構文
ReturnStatement [Yield, Await] :
return
;
return
[no LineTerminator here]
Expression [+In, ?Yield, ?Await]
;
注
return 文は関数の実行を停止させ、ほとんどの場合、呼出し元へ値を返します。Expression が省略された場合、戻り値は undefined です。そうでない場合、戻り値は Expression の値です。周囲の文脈によっては、return 文が実際には呼出し元へ値を返さない場合があります。たとえば try ブロック内では、return 文の Completion Record が finally ブロックの評価中に別の Completion Record に置き換えられる場合があります。
14.10.1 Runtime Semantics: Evaluation
ReturnStatement :
return
;
ReturnCompletion (undefined ) を返す。
ReturnStatement :
return
Expression
;
exprRef を Expression の ? Evaluation とする。exprValue を ? GetValue (exprRef ) とする。GetGeneratorKind () が async である場合、exprValue を ? Await (exprValue ) に設定する。ReturnCompletion (exprValue ) を返す。
14.11 with 文
注 1
新しい ECMAScript コードでレガシー な with 文を使用することは推奨されません。分割代入 など、strict モードコード と非 strict コード の両方で許可される代替手段を検討してください。
構文
WithStatement [Yield, Await, Return] :
with
(
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
注 2
with 文は、計算されたオブジェクトの Object Environment Record を実行中の実行コンテキスト のレキシカル環境に追加します。次に、この拡張されたレキシカル環境を使用して文を実行します。最後に、元のレキシカル環境を復元します。
14.11.1 Static Semantics: 早期エラー
WithStatement :
with
(
Expression
)
Statement
注
2番目の規則を適用する必要があるのは、B.3.1 で規定される拡張が実装されている場合だけです。
14.11.2 Runtime Semantics: Evaluation
WithStatement :
with
(
Expression
)
Statement
value を Expression の ? Evaluation とする。obj を ? ToObject (? GetValue (value )) とする。oldEnv を実行中の実行コンテキスト の LexicalEnvironment とする。newEnv を NewObjectEnvironment (obj , true , oldEnv ) とする。実行中の実行コンテキスト の LexicalEnvironment を newEnv に設定する。stmtCompletion を Completion (Statement の Evaluation ) とする。実行中の実行コンテキスト の LexicalEnvironment を oldEnv に設定する。? UpdateEmpty (stmtCompletion , undefined ) を返す。
注
埋め込まれた Statement から制御が正常に離れる場合でも、何らかの中断完了 または例外によって離れる場合でも、LexicalEnvironment は常に以前の状態に復元されます。
14.12 switch 文
構文
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 Static Semantics: 早期エラー
SwitchStatement :
switch
(
Expression
)
CaseBlock
CaseClause :
case
Expression
:
StatementList
DefaultClause :
default
:
StatementList
14.12.2 Runtime Semantics: CaseBlockEvaluation
構文指向操作 CaseBlockEvaluation。引数 input (ECMAScript 言語値 )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 次の生成規則ごとに定義される。
CaseBlock :
{
}
undefined を返す。
CaseBlock :
{
CaseClauses
}
resultValue を undefined とする。caseClauses を、ソーステキスト順の CaseClauses 内の CaseClause 項目の List とする。found を false とする。caseClauses の各 CaseClause clause について、次を行う。found が false である場合、found を ? CaseClauseIsSelected (clause , input ) に設定する。found が true である場合、completion を Completion (clause の Evaluation ) とする。completion .[[Value]] が empty でない場合、resultValue を completion .[[Value]] に設定する。completion が中断完了 である場合、? UpdateEmpty (completion , resultValue ) を返す。resultValue を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
resultValue を undefined とする。最初の CaseClauses が存在する場合、caseClauses を、ソーステキスト順の最初の CaseClauses 内の CaseClause 項目の List とする。 そうでない場合、caseClauses を新しい空の List とする。 found を false とする。caseClauses の各 CaseClause clause について、次を行う。found が false である場合、found を ? CaseClauseIsSelected (clause , input ) に設定する。found が true である場合、completion を Completion (clause の Evaluation ) とする。completion .[[Value]] が empty でない場合、resultValue を completion .[[Value]] に設定する。completion が中断完了 である場合、? UpdateEmpty (completion , resultValue ) を返す。foundInB を false とする。2番目の CaseClauses が存在する場合、secondCaseClauses を、ソーステキスト順の2番目の CaseClauses 内の CaseClause 項目の List とする。 そうでない場合、secondCaseClauses を新しい空の List とする。 found が false である場合、secondCaseClauses の各 CaseClause clause について、次を行う。foundInB が false である場合、foundInB を ? CaseClauseIsSelected (clause , input ) に設定する。foundInB が true である場合、completion を Completion (CaseClause clause の Evaluation ) とする。completion .[[Value]] が empty でない場合、resultValue を completion .[[Value]] に設定する。completion が中断完了 である場合、? UpdateEmpty (completion , resultValue ) を返す。foundInB が true である場合、resultValue を返す。defaultR を Completion (DefaultClause の Evaluation ) とする。defaultR .[[Value]] が empty でない場合、resultValue を defaultR .[[Value]] に設定する。defaultR が中断完了 である場合、? UpdateEmpty (defaultR , resultValue ) を返す。注記 : 次は2番目の CaseClauses のもう1回の完全な反復である。secondCaseClauses の各 CaseClause clause について、次を行う。completion を Completion (CaseClause clause の Evaluation ) とする。completion .[[Value]] が empty でない場合、resultValue を completion .[[Value]] に設定する。completion が中断完了 である場合、? UpdateEmpty (completion , resultValue ) を返す。resultValue を返す。
14.12.3 CaseClauseIsSelected ( caseClauseNode , input )
抽象操作 CaseClauseIsSelected。引数 caseClauseNode (a CaseClause Parse Node ) および input (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または 中途完了)。 caseClauseNode が input と一致するかどうかを判定します。 呼び出されると、次の手順を実行する。
表明 : caseClauseNode は生成規則
CaseClause :
case
Expression
:
StatementList opt
のインスタンスである。exprRef を caseClauseNode の Expression の ? Evaluation とする。clauseSelector を ? GetValue (exprRef ) とする。IsStrictlyEqual (input , clauseSelector ) を返す。
注
この操作は caseClauseNode の StatementList (存在する場合)を実行しません。CaseBlock アルゴリズムは、その戻り値を使用して、どの StatementList から実行を開始するかを判定します。
14.12.4 Runtime Semantics: Evaluation
SwitchStatement :
switch
(
Expression
)
CaseBlock
exprRef を Expression の ? Evaluation とする。switchValue を ? GetValue (exprRef ) とする。oldEnv を実行中の実行コンテキスト の LexicalEnvironment とする。blockEnv を NewDeclarativeEnvironment (oldEnv ) とする。BlockDeclarationInstantiation (CaseBlock , blockEnv ) を実行する。実行中の実行コンテキスト の LexicalEnvironment を blockEnv に設定する。blockResult を Completion (引数 switchValue を指定した CaseBlock の CaseBlockEvaluation ) とする。表明 : blockEnv .[[DisposableResourceStack]] は空の List である。実行中の実行コンテキスト の LexicalEnvironment を oldEnv に設定する。blockResult を返す。
注
SwitchStatement からどのように制御が離れても、LexicalEnvironment は常に以前の状態に復元されます。
CaseClause :
case
Expression
:
empty を返す。
CaseClause :
case
Expression
:
StatementList
StatementList の ? Evaluation を返す。
DefaultClause :
default
:
empty を返す。
DefaultClause :
default
:
StatementList
StatementList の ? Evaluation を返す。
14.13 ラベル付き文
構文
LabelledStatement [Yield, Await, Return] :
LabelIdentifier [?Yield, ?Await]
:
LabelledItem [?Yield, ?Await, ?Return]
LabelledItem [Yield, Await, Return] :
Statement [?Yield, ?Await, ?Return]
FunctionDeclaration [?Yield, ?Await, ~Default]
注
Statement にはラベルを前置できます。ラベル付き文は、ラベル付き break 文および continue 文と組み合わせてのみ使用されます。ECMAScript には goto 文はありません。Statement は LabelledStatement の一部になることができ、その LabelledStatement 自身がさらに LabelledStatement の一部になることができ、以下同様です。このように導入されたラベルは、個々の文の意味論を説明する際にまとめて「現在のラベル集合」と呼ばれます。
14.13.1 Static Semantics: 早期エラー
LabelledItem : FunctionDeclaration
14.13.2 Static Semantics: IsLabelledFunction ( stmt )
抽象操作 IsLabelledFunction。引数 stmt (a Statement Parse Node )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
stmt が LabelledStatement でない場合、false を返す。item を stmt の LabelledItem とする。item が
LabelledItem : FunctionDeclaration
である場合、true を返す。subStmt を item の Statement とする。IsLabelledFunction (subStmt ) を返す。
14.13.3 Runtime Semantics: Evaluation
LabelledStatement :
LabelIdentifier
:
LabelledItem
引数 « » を指定したこの LabelledStatement の ? LabelledEvaluation を返す。
14.13.4 Runtime Semantics: LabelledEvaluation
構文指向操作 LabelledEvaluation。引数 labelSet (リスト (要素:String))。戻り値:(正常完了 (値:(ECMAScript 言語値 または empty )) または 中途完了)。 次の生成規則ごとに定義される。
BreakableStatement : IterationStatement
stmtResult を Completion (引数 labelSet を指定した IterationStatement の LoopEvaluation ) とする。stmtResult が break 完了 である場合、stmtResult .[[Target]] が empty である場合、stmtResult .[[Value]] が empty である場合、stmtResult を NormalCompletion (undefined ) に設定する。そうでない場合、stmtResult を NormalCompletion (stmtResult .[[Value]] ) に設定する。 ? stmtResult を返す。
BreakableStatement : SwitchStatement
stmtResult を Completion (SwitchStatement の Evaluation ) とする。stmtResult が break 完了 である場合、stmtResult .[[Target]] が empty である場合、stmtResult .[[Value]] が empty である場合、stmtResult を NormalCompletion (undefined ) に設定する。そうでない場合、stmtResult を NormalCompletion (stmtResult .[[Value]] ) に設定する。 ? stmtResult を返す。
注 1
LabelledStatement :
LabelIdentifier
:
LabelledItem
label を LabelIdentifier の StringValue とする。newLabelSet を labelSet と « label » のリスト連結 とする。stmtResult を Completion (引数 newLabelSet を指定した LabelledItem の LabelledEvaluation ) とする。stmtResult が break 完了 であり、stmtResult .[[Target]] が label である場合、stmtResult を NormalCompletion (stmtResult .[[Value]] ) に設定する。? stmtResult を返す。
LabelledItem : FunctionDeclaration
FunctionDeclaration の ? Evaluation を返す。
Statement :
BlockStatement
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
ThrowStatement
TryStatement
DebuggerStatement
Statement の ? Evaluation を返す。
注 2
LabelledEvaluation に特別な意味論を持つ Statement の生成規則は、BreakableStatement と LabelledStatement の2つだけです。
14.14 throw 文
構文
ThrowStatement [Yield, Await] :
throw
[no LineTerminator here]
Expression [+In, ?Yield, ?Await]
;
14.14.1 Runtime Semantics: Evaluation
ThrowStatement :
throw
Expression
;
exprRef を Expression の ? Evaluation とする。exprValue を ? GetValue (exprRef ) とする。exprValue をスローする。
14.15 try 文
構文
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]
注
try 文は、実行時エラーや throw 文などの例外的な条件が発生し得るコードブロックを囲みます。catch 節は例外処理コードを提供します。catch 節が例外を捕捉すると、その CatchParameter はその例外に束縛されます。
14.15.1 Static Semantics: 早期エラー
Catch :
catch
(
CatchParameter
)
Block
14.15.2 Runtime Semantics: CatchClauseEvaluation
構文指向操作 CatchClauseEvaluation。引数 thrownValue (ECMAScript 言語値 )。戻り値:(正常完了 (値:(ECMAScript 言語値 または empty )) または 中途完了)。 次の生成規則ごとに定義される。
Catch :
catch
(
CatchParameter
)
Block
oldEnv を実行中の実行コンテキスト の LexicalEnvironment とする。catchEnv を NewDeclarativeEnvironment (oldEnv ) とする。CatchParameter の BoundNames の各要素 argName について、次を行う。! catchEnv .CreateMutableBinding (argName , false ) を実行する。 実行中の実行コンテキスト の LexicalEnvironment を catchEnv に設定する。status を Completion (引数 thrownValue および catchEnv を指定した CatchParameter の BindingInitialization ) とする。status が中断完了 である場合、実行中の実行コンテキスト の LexicalEnvironment を oldEnv に設定する。? status を返す。 blockCompletion を Completion (Block の Evaluation ) とする。実行中の実行コンテキスト の LexicalEnvironment を oldEnv に設定する。? blockCompletion を返す。
Catch :
catch
Block
Block の ? Evaluation を返す。
注
Block からどのように制御が離れても、LexicalEnvironment は常に以前の状態に復元されます。
14.15.3 Runtime Semantics: Evaluation
TryStatement :
try
Block
Catch
blockResult を Completion (Block の Evaluation ) とする。blockResult がスロー完了である場合、catchResult を Completion (引数 blockResult .[[Value]] を指定した Catch の CatchClauseEvaluation ) とする。そうでない場合、catchResult を blockResult とする。 ? UpdateEmpty (catchResult , undefined ) を返す。
TryStatement :
try
Block
Finally
blockResult を Completion (Block の Evaluation ) とする。finallyResult を Completion (Finally の Evaluation ) とする。finallyResult が正常完了 である場合、finallyResult を blockResult に設定する。? UpdateEmpty (finallyResult , undefined ) を返す。
TryStatement :
try
Block
Catch
Finally
blockResult を Completion (Block の Evaluation ) とする。blockResult がスロー完了である場合、catchResult を Completion (引数 blockResult .[[Value]] を指定した Catch の CatchClauseEvaluation ) とする。そうでない場合、catchResult を blockResult とする。 finallyResult を Completion (Finally の Evaluation ) とする。finallyResult が正常完了 である場合、finallyResult を catchResult に設定する。? UpdateEmpty (finallyResult , undefined ) を返す。
14.16 debugger 文
構文
DebuggerStatement :
debugger
;
14.16.1 Runtime Semantics: Evaluation
注
DebuggerStatement を評価すると、デバッガーの下で実行されている場合、実装がブレークポイントを発生させることができる場合があります。デバッガーが存在しないか、アクティブでない場合、この文には観測可能な効果はありません。
DebuggerStatement :
debugger
;
実装定義 のデバッグ機能が利用可能で有効になっている場合、実装定義 のデバッグ動作を実行する。新しい実装定義 の Completion Record を返す。 empty を返す。
15 ECMAScript 言語: 関数とクラス
注
さまざまな ECMAScript 言語要素によって、ECMAScript 関数オブジェクト (10.2 )が作成されます。このような関数の評価は、その [[Call]] 内部メソッド(10.2.1 )の実行から始まります。
15.1 パラメーターリスト
構文
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 Static Semantics: 早期エラー
UniqueFormalParameters : FormalParameters
FormalParameters : FormalParameterList
注
FormalParameterList 内で同じ BindingIdentifier が複数回現れることが許可されるのは、単純なパラメーターリストを持ち、strict モードコード で定義されていない関数だけです。
15.1.2 Static Semantics: ContainsExpression
構文指向操作 ContainsExpression。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
ObjectBindingPattern :
{
}
{
BindingRestProperty
}
false を返す。
ObjectBindingPattern :
{
BindingPropertyList
,
BindingRestProperty
}
BindingPropertyList の ContainsExpression を返す。
ArrayBindingPattern :
[
Elision opt
]
false を返す。
ArrayBindingPattern :
[
Elision opt
BindingRestElement
]
BindingRestElement の ContainsExpression を返す。
ArrayBindingPattern :
[
BindingElementList
,
Elision opt
]
BindingElementList の ContainsExpression を返す。
ArrayBindingPattern :
[
BindingElementList
,
Elision opt
BindingRestElement
]
has を BindingElementList の ContainsExpression とする。has が true である場合、true を返す。BindingRestElement の ContainsExpression を返す。
BindingPropertyList :
BindingPropertyList
,
BindingProperty
has を BindingPropertyList の ContainsExpression とする。has が true である場合、true を返す。BindingProperty の ContainsExpression を返す。
BindingElementList :
BindingElementList
,
BindingElisionElement
has を BindingElementList の ContainsExpression とする。has が true である場合、true を返す。BindingElisionElement の ContainsExpression を返す。
BindingElisionElement :
Elision opt
BindingElement
BindingElement の ContainsExpression を返す。
BindingProperty :
PropertyName
:
BindingElement
has を PropertyName の IsComputedPropertyKey とする。has が true である場合、true を返す。BindingElement の ContainsExpression を返す。
BindingElement :
BindingPattern
Initializer
true を返す。
SingleNameBinding : BindingIdentifier
false を返す。
SingleNameBinding :
BindingIdentifier
Initializer
true を返す。
BindingRestElement :
...
BindingIdentifier
false を返す。
BindingRestElement :
...
BindingPattern
BindingPattern の ContainsExpression を返す。
FormalParameters : [empty]
false を返す。
FormalParameters :
FormalParameterList
,
FunctionRestParameter
FormalParameterList の ContainsExpression が true である場合、true を返す。FunctionRestParameter の ContainsExpression を返す。
FormalParameterList :
FormalParameterList
,
FormalParameter
FormalParameterList の ContainsExpression が true である場合、true を返す。FormalParameter の ContainsExpression を返す。
ArrowParameters : BindingIdentifier
false を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
formals を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ArrowFormalParameters とする。formals の ContainsExpression を返す。
AsyncArrowBindingIdentifier : BindingIdentifier
false を返す。
15.1.3 Static Semantics: IsSimpleParameterList
構文指向操作 IsSimpleParameterList。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
BindingElement : BindingPattern
false を返す。
BindingElement :
BindingPattern
Initializer
false を返す。
SingleNameBinding : BindingIdentifier
true を返す。
SingleNameBinding :
BindingIdentifier
Initializer
false を返す。
FormalParameters : [empty]
true を返す。
FormalParameters : FunctionRestParameter
false を返す。
FormalParameters :
FormalParameterList
,
FunctionRestParameter
false を返す。
FormalParameterList :
FormalParameterList
,
FormalParameter
FormalParameterList の IsSimpleParameterList が false である場合、false を返す。FormalParameter の IsSimpleParameterList を返す。
FormalParameter : BindingElement
BindingElement の IsSimpleParameterList を返す。
ArrowParameters : BindingIdentifier
true を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
formals を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ArrowFormalParameters とする。formals の IsSimpleParameterList を返す。
AsyncArrowBindingIdentifier : BindingIdentifier
true を返す。
CoverCallExpressionAndAsyncArrowHead :
MemberExpression
Arguments
head を CoverCallExpressionAndAsyncArrowHead によって被覆される AsyncArrowHead とする。head の IsSimpleParameterList を返す。
15.1.4 Static Semantics: HasInitializer
構文指向操作 HasInitializer。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
BindingElement : BindingPattern
false を返す。
BindingElement :
BindingPattern
Initializer
true を返す。
SingleNameBinding : BindingIdentifier
false を返す。
SingleNameBinding :
BindingIdentifier
Initializer
true を返す。
FormalParameterList :
FormalParameterList
,
FormalParameter
FormalParameterList の HasInitializer が true である場合、true を返す。FormalParameter の HasInitializer を返す。
15.1.5 Static Semantics: ExpectedArgumentCount
構文指向操作 ExpectedArgumentCount。引数なし。戻り値:非負整数。 次の生成規則ごとに定義される。
FormalParameters :
[empty]
FunctionRestParameter
0 を返す。
FormalParameters :
FormalParameterList
,
FunctionRestParameter
FormalParameterList の ExpectedArgumentCount を返す。
注
FormalParameterList の ExpectedArgumentCount は、rest パラメーターまたは Initializer を持つ最初の FormalParameter のいずれかより左側にある FormalParameters の数です。Initializer を持つ最初のパラメーターの後に、initializer を持たない FormalParameter を置くことは許可されますが、そのようなパラメーターは、既定値が undefined の省略可能なものとみなされます。
FormalParameterList : FormalParameter
FormalParameter の HasInitializer が true である場合、0 を返す。1 を返す。
FormalParameterList :
FormalParameterList
,
FormalParameter
count を FormalParameterList の ExpectedArgumentCount とする。FormalParameterList の HasInitializer が true であるか、FormalParameter の HasInitializer が true である場合、count を返す。count + 1 を返す。
ArrowParameters : BindingIdentifier
1 を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
formals を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ArrowFormalParameters とする。formals の ExpectedArgumentCount を返す。
PropertySetParameterList : FormalParameter
FormalParameter の HasInitializer が true である場合、0 を返す。1 を返す。
AsyncArrowBindingIdentifier : BindingIdentifier
1 を返す。
15.2 関数定義
構文
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 Static Semantics: 早期エラー
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
FunctionExpression :
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
注
FunctionBody の LexicallyDeclaredNames には、var または関数宣言を使用して束縛された識別子は含まれません。
FunctionBody : FunctionStatementList
15.2.2 Static Semantics: FunctionBodyContainsUseStrict
構文指向操作 FunctionBodyContainsUseStrict。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
FunctionBody : FunctionStatementList
FunctionBody のディレクティブプロローグ が Use Strict ディレクティブ を含む場合、true を返す。false を返す。
15.2.3 Runtime Semantics: EvaluateFunctionBody
構文指向操作 EvaluateFunctionBody。引数 funcObj (ECMAScript 関数オブジェクト) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(return 完了 または throw 完了 )。 次の生成規則ごとに定義される。
FunctionBody : FunctionStatementList
? FunctionDeclarationInstantiation (funcObj , argList ) を実行する。 FunctionStatementList の ? Evaluation を実行する。注記 : 前の手順が正常完了 になった場合、評価は FunctionStatementList の末尾を通過して終了した。ReturnCompletion (undefined ) を返す。
15.2.4 Runtime Semantics: InstantiateOrdinaryFunctionObject
構文指向操作 InstantiateOrdinaryFunctionObject。引数 envRecord (Environmentレコード ) および privateEnv ((PrivateEnvironmentレコード または null ))。戻り値:ECMAScript 関数オブジェクト。 次の生成規則ごとに定義される。
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
name を BindingIdentifier の StringValue とする。sourceText を FunctionDeclaration に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%Function.prototype% , sourceText , FormalParameters , FunctionBody , non-lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。MakeConstructor (closure ) を実行する。closure を返す。
FunctionDeclaration :
function
(
FormalParameters
)
{
FunctionBody
}
sourceText を FunctionDeclaration に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%Function.prototype% , sourceText , FormalParameters , FunctionBody , non-lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , "default" ) を実行する。MakeConstructor (closure ) を実行する。closure を返す。
注
匿名の FunctionDeclaration は export default 宣言の一部としてのみ現れることができ、その関数コード はしたがって常に strict モードコード です。
15.2.5 Runtime Semantics: InstantiateOrdinaryFunctionExpression
構文指向操作 InstantiateOrdinaryFunctionExpression。省略可能な引数 name ((プロパティキー または プライベート名 ))。戻り値:ECMAScript 関数オブジェクト。 次の生成規則ごとに定義される。
FunctionExpression :
function
(
FormalParameters
)
{
FunctionBody
}
name が存在しない場合、name を空の String に設定する。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を FunctionExpression に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%Function.prototype% , sourceText , FormalParameters , FunctionBody , non-lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。MakeConstructor (closure ) を実行する。closure を返す。
FunctionExpression :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
表明 : name は存在しない。name を BindingIdentifier の StringValue に設定する。outerEnv を実行中の実行コンテキスト の LexicalEnvironment とする。funcEnv を NewDeclarativeEnvironment (outerEnv ) とする。! funcEnv .CreateImmutableBinding (name , false ) を実行する。 privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を FunctionExpression に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%Function.prototype% , sourceText , FormalParameters , FunctionBody , non-lexical-this , funcEnv , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。MakeConstructor (closure ) を実行する。! funcEnv .InitializeBinding (name , closure ) を実行する。 closure を返す。
注
15.2.6 Runtime Semantics: Evaluation
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
empty を返す。
注 1
FunctionDeclaration :
function
(
FormalParameters
)
{
FunctionBody
}
empty を返す。
FunctionExpression :
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
FunctionExpression の InstantiateOrdinaryFunctionExpression を返す。
注 2
関数がコンストラクター として使用される可能性を許容するため、FunctionDeclaration または FunctionExpression を使用して定義されたすべての関数には、"prototype" プロパティが自動的に作成されます。
FunctionStatementList : [empty]
undefined を返す。
FunctionStatementList : StatementList
result を Completion (StatementList の Evaluation ) とする。env を実行中の実行コンテキスト の LexicalEnvironment とする。表明 : env は Declarative Environment Record である。? DisposeResources (env .[[DisposableResourceStack]] , result ) を返す。
15.3 アロー関数定義
構文
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]
)
15.3.1 Static Semantics: 早期エラー
ArrowFunction :
ArrowParameters
=>
ConciseBody
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
15.3.2 Static Semantics: ConciseBodyContainsUseStrict
構文指向操作 ConciseBodyContainsUseStrict。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
ConciseBody : ExpressionBody
false を返す。
ConciseBody :
{
FunctionBody
}
FunctionBody の FunctionBodyContainsUseStrict を返す。
15.3.3 Runtime Semantics: EvaluateConciseBody
構文指向操作 EvaluateConciseBody。引数 funcObj (ECMAScript 関数オブジェクト) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(return 完了 または throw 完了 )。 次の生成規則ごとに定義される。
ConciseBody : ExpressionBody
? FunctionDeclarationInstantiation (funcObj , argList ) を実行する。 ExpressionBody の ? Evaluation を返す。
15.3.4 Runtime Semantics: InstantiateArrowFunctionExpression
構文指向操作 InstantiateArrowFunctionExpression。省略可能な引数 name ((プロパティキー または プライベート名 ))。戻り値:ECMAScript 関数オブジェクト。 次の生成規則ごとに定義される。
ArrowFunction :
ArrowParameters
=>
ConciseBody
name が存在しない場合、name を空の String に設定する。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を ArrowFunction に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%Function.prototype% , sourceText , ArrowParameters , ConciseBody , lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。closure を返す。
注
ArrowFunction は arguments、super、this、または new.target に対するローカル束縛を定義しません。ArrowFunction 内の arguments、super、this、または new.target への参照は、レキシカルに外側の環境内の束縛へ解決されなければなりません。通常、これは直近の外側の関数の Function Environment です。ArrowFunction が super への参照を含む場合でも、手順 5 で作成された関数オブジェクト は MakeMethod の実行によってメソッドにはされません。super を参照する ArrowFunction は常に非 ArrowFunction 内に含まれており、super を実装するために必要な状態には、ArrowFunction の関数オブジェクト が捕捉した envRecord を介してアクセスできます。
15.3.5 Runtime Semantics: Evaluation
ArrowFunction :
ArrowParameters
=>
ConciseBody
ArrowFunction の InstantiateArrowFunctionExpression を返す。
ExpressionBody : AssignmentExpression
exprRef を AssignmentExpression の ? Evaluation とする。exprValue を ? GetValue (exprRef ) とする。ReturnCompletion (exprValue ) を返す。
15.4 メソッド定義
構文
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 Static Semantics: 早期エラー
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
MethodDefinition :
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
15.4.2 Static Semantics: HasDirectSuper
構文指向操作 HasDirectSuper。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
UniqueFormalParameters Contains SuperCall が true である場合、true を返す。FunctionBody Contains SuperCall を返す。
MethodDefinition :
get
ClassElementName
(
)
{
FunctionBody
}
FunctionBody Contains SuperCall を返す。
MethodDefinition :
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
PropertySetParameterList Contains SuperCall が true である場合、true を返す。FunctionBody Contains SuperCall を返す。
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
UniqueFormalParameters Contains SuperCall が true である場合、true を返す。GeneratorBody Contains SuperCall を返す。
AsyncGeneratorMethod :
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
UniqueFormalParameters Contains SuperCall が true である場合、true を返す。AsyncGeneratorBody Contains SuperCall を返す。
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
UniqueFormalParameters Contains SuperCall が true である場合、true を返す。AsyncFunctionBody Contains SuperCall を返す。
15.4.3 Static Semantics: SpecialMethod
構文指向操作 SpecialMethod。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
false を返す。
MethodDefinition :
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
true を返す。
15.4.4 Runtime Semantics: DefineMethod
構文指向操作 DefineMethod。引数 obj (Object)および省略可能な引数 proto (Object)。戻り値:(正常完了 (値:レコード (フィールド:[[Key]] (プロパティキー ), [[Closure]] (ECMAScript 関数オブジェクト))) または 中途完了)。 次の生成規則ごとに定義される。
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
propertyKey を ClassElementName の ? Evaluation とする。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。proto が存在しない場合、proto を %Function.prototype% に設定する。sourceText を MethodDefinition に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (proto , sourceText , UniqueFormalParameters , FunctionBody , non-lexical-this , envRecord , privateEnv ) とする。MakeMethod (closure , obj ) を実行する。Record { [[Key]] : propertyKey , [[Closure]] : closure } を返す。
15.4.5 Runtime Semantics: MethodDefinitionEvaluation
構文指向操作 MethodDefinitionEvaluation。引数 obj (Object) および enumerable (Boolean)。戻り値:(正常完了 (値:(PrivateElement または empty )) または 中途完了)。 次の生成規則ごとに定義される。
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
methodDef を、引数 obj を指定した MethodDefinition の ? DefineMethod とする。SetFunctionName (methodDef .[[Closure]] , methodDef .[[Key]] ) を実行する。? DefineMethodProperty (obj , methodDef .[[Key]] , methodDef .[[Closure]] , enumerable ) を返す。
MethodDefinition :
get
ClassElementName
(
)
{
FunctionBody
}
propertyKey を ClassElementName の ? Evaluation とする。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を MethodDefinition に一致するソーステキスト とする。formalParamList を生成規則
FormalParameters : [empty]
のインスタンスとする。closure を OrdinaryFunctionCreate (%Function.prototype% , sourceText , formalParamList , FunctionBody , non-lexical-this , envRecord , privateEnv ) とする。MakeMethod (closure , obj ) を実行する。SetFunctionName (closure , propertyKey , "get" ) を実行する。propertyKey が Private Name である場合、PrivateElement { [[Key]] : propertyKey , [[Kind]] : accessor , [[Getter]] : closure , [[Setter]] : undefined } を返す。propertyDesc を PropertyDescriptor { [[Getter]] : closure , [[Enumerable]] : enumerable , [[Configurable]] : true } とする。? DefinePropertyOrThrow (obj , propertyKey , propertyDesc ) を実行する。 empty を返す。
MethodDefinition :
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
propertyKey を ClassElementName の ? Evaluation とする。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を MethodDefinition に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%Function.prototype% , sourceText , PropertySetParameterList , FunctionBody , non-lexical-this , envRecord , privateEnv ) とする。MakeMethod (closure , obj ) を実行する。SetFunctionName (closure , propertyKey , "set" ) を実行する。propertyKey が Private Name である場合、PrivateElement { [[Key]] : propertyKey , [[Kind]] : accessor , [[Getter]] : undefined , [[Setter]] : closure } を返す。propertyDesc を PropertyDescriptor { [[Setter]] : closure , [[Enumerable]] : enumerable , [[Configurable]] : true } とする。? DefinePropertyOrThrow (obj , propertyKey , propertyDesc ) を実行する。 empty を返す。
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
propertyKey を ClassElementName の ? Evaluation とする。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を GeneratorMethod に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%GeneratorFunction.prototype% , sourceText , UniqueFormalParameters , GeneratorBody , non-lexical-this , envRecord , privateEnv ) とする。MakeMethod (closure , obj ) を実行する。SetFunctionName (closure , propertyKey ) を実行する。proto を OrdinaryObjectCreate (%GeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : proto , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 ? DefineMethodProperty (obj , propertyKey , closure , enumerable ) を返す。
AsyncGeneratorMethod :
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
propertyKey を ClassElementName の ? Evaluation とする。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を AsyncGeneratorMethod に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% , sourceText , UniqueFormalParameters , AsyncGeneratorBody , non-lexical-this , envRecord , privateEnv ) とする。MakeMethod (closure , obj ) を実行する。SetFunctionName (closure , propertyKey ) を実行する。proto を OrdinaryObjectCreate (%AsyncGeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : proto , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 ? DefineMethodProperty (obj , propertyKey , closure , enumerable ) を返す。
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
propertyKey を ClassElementName の ? Evaluation とする。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を AsyncMethod に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , UniqueFormalParameters , AsyncFunctionBody , non-lexical-this , envRecord , privateEnv ) とする。MakeMethod (closure , obj ) を実行する。SetFunctionName (closure , propertyKey ) を実行する。? DefineMethodProperty (obj , propertyKey , closure , enumerable ) を返す。
15.5 ジェネレーター関数定義
構文
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]
注 1
yield の直後の構文文脈では、InputElementRegExpOrTemplateTail 字句目標を使用する必要があります。
注 2
YieldExpression はジェネレーター関数の FormalParameters 内では使用できません。FormalParameters の一部である式は、生成される Generator が再開可能な状態になる前に評価されるためです。
注 3
Generator に関連する抽象操作 は 27.8.3 で定義されています。
15.5.1 Static Semantics: 早期エラー
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
GeneratorDeclaration :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
GeneratorExpression :
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
15.5.2 Runtime Semantics: EvaluateGeneratorBody
構文指向操作 EvaluateGeneratorBody。引数 funcObj (ECMAScript 関数オブジェクト) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(throw 完了 または return 完了 )。 次の生成規則ごとに定義される。
GeneratorBody : FunctionBody
? FunctionDeclarationInstantiation (funcObj , argList ) を実行する。 gen を ? OrdinaryCreateFromConstructor (funcObj , "%GeneratorPrototype%" , « [[GeneratorState]] , [[GeneratorContext]] , [[GeneratorBrand]] ») とする。gen .[[GeneratorBrand]] を empty に設定する。gen .[[GeneratorState]] を suspended-start に設定する。GeneratorStart (gen , FunctionBody ) を実行する。ReturnCompletion (gen ) を返す。
15.5.3 Runtime Semantics: InstantiateGeneratorFunctionObject
構文指向操作 InstantiateGeneratorFunctionObject。引数 envRecord (Environmentレコード ) および privateEnv ((PrivateEnvironmentレコード または null ))。戻り値:ECMAScript 関数オブジェクト。 次の生成規則ごとに定義される。
GeneratorDeclaration :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
name を BindingIdentifier の StringValue とする。sourceText を GeneratorDeclaration に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%GeneratorFunction.prototype% , sourceText , FormalParameters , GeneratorBody , non-lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。proto を OrdinaryObjectCreate (%GeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : proto , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 closure を返す。
GeneratorDeclaration :
function
*
(
FormalParameters
)
{
GeneratorBody
}
sourceText を GeneratorDeclaration に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%GeneratorFunction.prototype% , sourceText , FormalParameters , GeneratorBody , non-lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , "default" ) を実行する。proto を OrdinaryObjectCreate (%GeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : proto , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 closure を返す。
注
匿名の GeneratorDeclaration は export default 宣言の一部としてのみ現れることができ、その関数コード はしたがって常に strict モードコード です。
15.5.4 Runtime Semantics: InstantiateGeneratorFunctionExpression
構文指向操作 InstantiateGeneratorFunctionExpression。省略可能な引数 name ((プロパティキー または プライベート名 ))。戻り値:ECMAScript 関数オブジェクト。 次の生成規則ごとに定義される。
GeneratorExpression :
function
*
(
FormalParameters
)
{
GeneratorBody
}
name が存在しない場合、name を空の String に設定する。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を GeneratorExpression に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%GeneratorFunction.prototype% , sourceText , FormalParameters , GeneratorBody , non-lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。proto を OrdinaryObjectCreate (%GeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : proto , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 closure を返す。
GeneratorExpression :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
表明 : name は存在しない。name を BindingIdentifier の StringValue に設定する。outerEnv を実行中の実行コンテキスト の LexicalEnvironment とする。funcEnv を NewDeclarativeEnvironment (outerEnv ) とする。! funcEnv .CreateImmutableBinding (name , false ) を実行する。 privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を GeneratorExpression に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%GeneratorFunction.prototype% , sourceText , FormalParameters , GeneratorBody , non-lexical-this , funcEnv , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。proto を OrdinaryObjectCreate (%GeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : proto , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 ! funcEnv .InitializeBinding (name , closure ) を実行する。 closure を返す。
注
15.5.5 Runtime Semantics: Evaluation
GeneratorExpression :
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
GeneratorExpression の InstantiateGeneratorFunctionExpression を返す。
YieldExpression : yield
? Yield (undefined ) を返す。
YieldExpression :
yield
AssignmentExpression
exprRef を AssignmentExpression の ? Evaluation とする。value を ? GetValue (exprRef ) とする。? Yield (value ) を返す。
YieldExpression :
yield
*
AssignmentExpression
genKind を GetGeneratorKind () とする。表明 : genKind は sync または async のいずれかである。exprRef を AssignmentExpression の ? Evaluation とする。value を ? GetValue (exprRef ) とする。iteratorRecord を ? GetIterator (value , genKind ) とする。iterator を iteratorRecord .[[Iterator]] とする。received を NormalCompletion (undefined ) とする。次を繰り返す。received が正常完了 である場合、innerResult を ? Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] , « received .[[Value]] ») とする。genKind が async である場合、innerResult を ? Await (innerResult ) に設定する。innerResult が Object でない場合、TypeError 例外をスローする。done を ? IteratorComplete (innerResult ) とする。done が true である場合、? IteratorValue (innerResult ) を返す。 genKind が async である場合、received を Completion (AsyncGeneratorYield (? IteratorValue (innerResult ))) に設定する。そうでない場合、received を Completion (GeneratorYield (innerResult )) に設定する。 そうでなく、received がスロー完了である場合、throw を ? GetMethod (iterator , "throw" ) とする。throw が undefined でない場合、innerResult を ? Call (throw , iterator , « received .[[Value]] ») とする。genKind が async である場合、innerResult を ? Await (innerResult ) に設定する。注記 : 内側のイテレーターの throw メソッドからの例外は伝播される。内側の throw メソッドからの正常完了 は、内側の next と同様に処理される。innerResult が Object でない場合、TypeError 例外をスローする。done を ? IteratorComplete (innerResult ) とする。done が true である場合、? IteratorValue (innerResult ) を返す。 genKind が async である場合、received を Completion (AsyncGeneratorYield (? IteratorValue (innerResult ))) に設定する。そうでない場合、received を Completion (GeneratorYield (innerResult )) に設定する。 そうでない場合、注記 : iterator が throw メソッドを持たない場合、このスローによって yield* ループは終了する。ただし、まず iterator にクリーンアップの機会を与える必要がある。closeCompletion を NormalCompletion (empty ) とする。genKind が async である場合、? AsyncIteratorClose (iteratorRecord , closeCompletion ) を実行する。そうでない場合、? IteratorClose (iteratorRecord , closeCompletion ) を実行する。 注記 : 次の手順では、yield* プロトコル違反、すなわち iterator が throw メソッドを持たないことを示すために TypeError をスローする。TypeError 例外をスローする。 そうでない場合、表明 : received は return 完了 である。return を ? GetMethod (iterator , "return" ) とする。return が undefined である場合、receivedValue を received .[[Value]] とする。genKind が async である場合、receivedValue を ? Await (receivedValue ) に設定する。ReturnCompletion (receivedValue ) を返す。innerReturnResult を ? Call (return , iterator , « received .[[Value]] ») とする。genKind が async である場合、innerReturnResult を ? Await (innerReturnResult ) に設定する。innerReturnResult が Object でない場合、TypeError 例外をスローする。done を ? IteratorComplete (innerReturnResult ) とする。done が true である場合、returnedValue を ? IteratorValue (innerReturnResult ) とする。ReturnCompletion (returnedValue ) を返す。genKind が async である場合、received を Completion (AsyncGeneratorYield (? IteratorValue (innerReturnResult ))) に設定する。そうでない場合、received を Completion (GeneratorYield (innerReturnResult )) に設定する。
15.6 Async ジェネレーター関数定義
構文
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]
注 1
YieldExpression および AwaitExpression は async ジェネレーター関数の FormalParameters 内では使用できません。FormalParameters の一部である式は、生成される AsyncGenerator が再開可能な状態になる前に評価されるためです。
注 2
AsyncGenerator に関連する抽象操作 は 27.9.3 で定義されています。
15.6.1 Static Semantics: 早期エラー
AsyncGeneratorMethod :
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorDeclaration :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression :
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
15.6.2 Runtime Semantics: EvaluateAsyncGeneratorBody
構文指向操作 EvaluateAsyncGeneratorBody。引数 funcObj (ECMAScript 関数オブジェクト) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(throw 完了 または return 完了 )。 次の生成規則ごとに定義される。
AsyncGeneratorBody : FunctionBody
? FunctionDeclarationInstantiation (funcObj , argList ) を実行する。 gen を ? OrdinaryCreateFromConstructor (funcObj , "%AsyncGeneratorPrototype%" , « [[AsyncGeneratorState]] , [[AsyncGeneratorContext]] , [[AsyncGeneratorQueue]] , [[GeneratorBrand]] ») とする。gen .[[GeneratorBrand]] を empty に設定する。gen .[[AsyncGeneratorState]] を suspended-start に設定する。AsyncGeneratorStart (gen , FunctionBody ) を実行する。ReturnCompletion (gen ) を返す。
15.6.3 Runtime Semantics: InstantiateAsyncGeneratorFunctionObject
構文指向操作 InstantiateAsyncGeneratorFunctionObject。引数 envRecord (Environmentレコード ) および privateEnv ((PrivateEnvironmentレコード または null ))。戻り値:ECMAScript 関数オブジェクト。 次の生成規則ごとに定義される。
AsyncGeneratorDeclaration :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
name を BindingIdentifier の StringValue とする。sourceText を AsyncGeneratorDeclaration に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% , sourceText , FormalParameters , AsyncGeneratorBody , non-lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。proto を OrdinaryObjectCreate (%AsyncGeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : proto , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 closure を返す。
AsyncGeneratorDeclaration :
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
sourceText を AsyncGeneratorDeclaration に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% , sourceText , FormalParameters , AsyncGeneratorBody , non-lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , "default" ) を実行する。proto を OrdinaryObjectCreate (%AsyncGeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : proto , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 closure を返す。
注
匿名の AsyncGeneratorDeclaration は export default 宣言の一部としてのみ現れることができます。
15.6.4 Runtime Semantics: InstantiateAsyncGeneratorFunctionExpression
構文指向操作 InstantiateAsyncGeneratorFunctionExpression。省略可能な引数 name ((プロパティキー または プライベート名 ))。戻り値:ECMAScript 関数オブジェクト。 次の生成規則ごとに定義される。
AsyncGeneratorExpression :
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
name が存在しない場合、name を空の String に設定する。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を AsyncGeneratorExpression に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% , sourceText , FormalParameters , AsyncGeneratorBody , non-lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。proto を OrdinaryObjectCreate (%AsyncGeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : proto , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 closure を返す。
AsyncGeneratorExpression :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
表明 : name は存在しない。name を BindingIdentifier の StringValue に設定する。outerEnv を実行中の実行コンテキスト の LexicalEnvironment とする。funcEnv を NewDeclarativeEnvironment (outerEnv ) とする。! funcEnv .CreateImmutableBinding (name , false ) を実行する。 privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を AsyncGeneratorExpression に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% , sourceText , FormalParameters , AsyncGeneratorBody , non-lexical-this , funcEnv , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。proto を OrdinaryObjectCreate (%AsyncGeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : proto , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 ! funcEnv .InitializeBinding (name , closure ) を実行する。 closure を返す。
注
15.6.5 Runtime Semantics: Evaluation
AsyncGeneratorExpression :
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression の InstantiateAsyncGeneratorFunctionExpression を返す。
15.7 クラス定義
構文
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
注
15.7.1 Static Semantics: 早期エラー
ClassTail :
ClassHeritage opt
{
ClassBody
}
ClassBody : ClassElementList
ClassElement : MethodDefinition
ClassElement :
static
MethodDefinition
ClassElement :
FieldDefinition
;
ClassElement :
static
FieldDefinition
;
FieldDefinition :
ClassElementName
Initializer opt
ClassElementName : PrivateIdentifier
ClassStaticBlockBody : ClassStaticBlockStatementList
15.7.2 Static Semantics: ClassElementKind
構文指向操作 ClassElementKind。引数なし。戻り値:(constructor-method 、non-constructor-method または empty )。 次の生成規則ごとに定義される。
ClassElement : MethodDefinition
MethodDefinition の PropName が "constructor" である場合、constructor-method を返す。non-constructor-method を返す。
ClassElement :
static
MethodDefinition
FieldDefinition
;
static
FieldDefinition
;
non-constructor-method を返す。
ClassElement : ClassStaticBlock
non-constructor-method を返す。
ClassElement : ;
empty を返す。
15.7.3 Static Semantics: ConstructorMethod
構文指向操作 ConstructorMethod。引数なし。戻り値:(a ClassElement Parse Node または empty )。 次の生成規則ごとに定義される。
ClassElementList : ClassElement
ClassElement の ClassElementKind が constructor-method である場合、ClassElement を返す。empty を返す。
ClassElementList :
ClassElementList
ClassElement
head を ClassElementList の ConstructorMethod とする。head が empty でない場合、head を返す。ClassElement の ClassElementKind が constructor-method である場合、ClassElement を返す。empty を返す。
注
早期エラー規則 により、"constructor" という名前のメソッド定義は1つだけであり、それがアクセサープロパティ またはジェネレーター定義ではないことが保証されます。
15.7.4 Static Semantics: IsStatic
構文指向操作 IsStatic。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
ClassElement : MethodDefinition
false を返す。
ClassElement :
static
MethodDefinition
true を返す。
ClassElement :
FieldDefinition
;
false を返す。
ClassElement :
static
FieldDefinition
;
true を返す。
ClassElement : ClassStaticBlock
true を返す。
ClassElement : ;
false を返す。
15.7.5 Static Semantics: NonConstructorElements
構文指向操作 NonConstructorElements。引数なし。戻り値:リスト (要素:ClassElement Parse Nodes )。 次の生成規則ごとに定義される。
ClassElementList : ClassElement
ClassElement の ClassElementKind が non-constructor-method である場合、« ClassElement » を返す。 新しい空の List を返す。
ClassElementList :
ClassElementList
ClassElement
list を ClassElementList の NonConstructorElements とする。ClassElement の ClassElementKind が non-constructor-method である場合、ClassElement を list に追加する。list を返す。
15.7.6 Static Semantics: PrototypePropertyNameList
構文指向操作 PrototypePropertyNameList。引数なし。戻り値:リスト (要素:プロパティキー )。 次の生成規則ごとに定義される。
ClassElementList : ClassElement
propertyName を ClassElement の PropName とする。propertyName が empty である場合、新しい空の List を返す。ClassElement の IsStatic が true である場合、新しい空の List を返す。« propertyName » を返す。
ClassElementList :
ClassElementList
ClassElement
list を ClassElementList の PrototypePropertyNameList とする。propertyName を ClassElement の PropName とする。propertyName が empty である場合、list を返す。ClassElement の IsStatic が true である場合、list を返す。list と « propertyName » のリスト連結 を返す。
15.7.7 Static Semantics: AllPrivateIdentifiersValid
構文指向操作 AllPrivateIdentifiersValid。引数 names (リスト (要素:String))。戻り値:Boolean。
以下に列挙されていない、この仕様内のすべての文法生成規則の選択肢は、暗黙的に次の AllPrivateIdentifiersValid の既定定義を持ちます。
この Parse Node の各子ノード child について、次を行う。child が非終端記号のインスタンスである場合、引数 names を指定した child の AllPrivateIdentifiersValid が false である場合、false を返す。 true を返す。
MemberExpression :
MemberExpression
.
PrivateIdentifier
names が PrivateIdentifier の StringValue を含む場合、引数 names を指定した MemberExpression の AllPrivateIdentifiersValid を返す。 false を返す。
CallExpression :
CallExpression
.
PrivateIdentifier
names が PrivateIdentifier の StringValue を含む場合、引数 names を指定した CallExpression の AllPrivateIdentifiersValid を返す。 false を返す。
OptionalChain :
?.
PrivateIdentifier
names が PrivateIdentifier の StringValue を含む場合、true を返す。false を返す。
OptionalChain :
OptionalChain
.
PrivateIdentifier
names が PrivateIdentifier の StringValue を含む場合、引数 names を指定した OptionalChain の AllPrivateIdentifiersValid を返す。 false を返す。
ClassBody : ClassElementList
newNames を names と ClassBody の PrivateBoundIdentifiers のリスト連結 とする。引数 newNames を指定した ClassElementList の AllPrivateIdentifiersValid を返す。
RelationalExpression :
PrivateIdentifier
in
ShiftExpression
names が PrivateIdentifier の StringValue を含む場合、引数 names を指定した ShiftExpression の AllPrivateIdentifiersValid を返す。 false を返す。
15.7.8 Static Semantics: PrivateBoundIdentifiers
構文指向操作 PrivateBoundIdentifiers。引数なし。戻り値:リスト (要素:String)。 次の生成規則ごとに定義される。
FieldDefinition :
ClassElementName
Initializer opt
ClassElementName の PrivateBoundIdentifiers を返す。
ClassElementName : PrivateIdentifier
唯一の要素が PrivateIdentifier の StringValue である List を返す。
ClassElementName :
PropertyName
ClassElement :
ClassStaticBlock
;
新しい空の List を返す。
ClassElementList :
ClassElementList
ClassElement
names1 を ClassElementList の PrivateBoundIdentifiers とする。names2 を ClassElement の PrivateBoundIdentifiers とする。names1 と names2 のリスト連結 を返す。
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
}
ClassElementName の PrivateBoundIdentifiers を返す。
15.7.9 Static Semantics: ContainsArguments
構文指向操作 ContainsArguments。引数なし。戻り値:Boolean。
以下に列挙されていない、この仕様内のすべての文法生成規則の選択肢は、暗黙的に次の ContainsArguments の既定定義を持ちます。
この Parse Node の各子ノード child について、次を行う。child が非終端記号のインスタンスである場合、child の ContainsArguments が true である場合、true を返す。 false を返す。
IdentifierReference : Identifier
Identifier の StringValue が "arguments" である場合、true を返す。false を返す。
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
FunctionExpression :
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
GeneratorDeclaration :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
GeneratorExpression :
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorDeclaration :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression :
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionDeclaration :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionExpression :
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
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
}
ClassElementName の ContainsArguments を返す。
15.7.10 Runtime Semantics: ClassFieldDefinitionEvaluation
構文指向操作 ClassFieldDefinitionEvaluation。引数 homeObj (Object)。戻り値:(正常完了 (値:ClassFieldDefinitionレコード ) または 中途完了)。 次の生成規則ごとに定義される。
FieldDefinition :
ClassElementName
Initializer opt
name を ClassElementName の ? Evaluation とする。Initializer が存在する場合、formalParamList を生成規則
FormalParameters : [empty]
のインスタンスとする。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を Unicode コードポイントの空の列とする。initializer を OrdinaryFunctionCreate (%Function.prototype% , sourceText , formalParamList , Initializer , non-lexical-this , envRecord , privateEnv ) とする。MakeMethod (initializer , homeObj ) を実行する。initializer .[[ClassFieldInitializerName]] を name に設定する。そうでない場合、initializer を empty とする。 ClassFieldDefinition Record { [[Name]] : name , [[Initializer]] : initializer } を返す。
注
initializer のために作成された関数は、ECMAScript コードから直接アクセスされることはありません。
15.7.11 Runtime Semantics: ClassStaticBlockDefinitionEvaluation
構文指向操作 ClassStaticBlockDefinitionEvaluation。引数 homeObj (Object)。戻り値:ClassStaticBlockDefinitionレコード 。 次の生成規則ごとに定義される。
ClassStaticBlock :
static
{
ClassStaticBlockBody
}
lexicalEnv を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を Unicode コードポイントの空の列とする。formalParams を生成規則
FormalParameters : [empty]
のインスタンスとする。bodyFunc を OrdinaryFunctionCreate (%Function.prototype% , sourceText , formalParams , ClassStaticBlockBody , non-lexical-this , lexicalEnv , privateEnv ) とする。MakeMethod (bodyFunc , homeObj ) を実行する。ClassStaticBlockDefinition Record { [[BodyFunction]] : bodyFunc } を返す。
注 関数 bodyFunc は ECMAScript コードから直接アクセスされることはありません。
15.7.12 Runtime Semantics: EvaluateClassStaticBlockBody
構文指向操作 EvaluateClassStaticBlockBody。引数 funcObj (ECMAScript 関数オブジェクト)。戻り値:(return 完了 または throw 完了 )。 次の生成規則ごとに定義される。
ClassStaticBlockBody : ClassStaticBlockStatementList
表明 : funcObj は ClassStaticBlockDefinitionEvaluation の手順 5 によって作成された合成関数である。! FunctionDeclarationInstantiation (funcObj , « ») を実行する。 result を Completion (ClassStaticBlockStatementList の Evaluation ) とする。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。表明 : envRecord は Declarative Environment Record である。? DisposeResources (envRecord .[[DisposableResourceStack]] , result ) を実行する。 ReturnCompletion (undefined ) を返す。
15.7.13 Runtime Semantics: ClassElementEvaluation
構文指向操作 ClassElementEvaluation。引数 obj (Object)。戻り値:(正常完了 (値:(ClassFieldDefinitionレコード 、ClassStaticBlockDefinitionレコード 、PrivateElement または empty )) または 中途完了)。 次の生成規則ごとに定義される。
ClassElement :
FieldDefinition
;
static
FieldDefinition
;
引数 obj を指定した FieldDefinition の ? ClassFieldDefinitionEvaluation を返す。
ClassElement :
MethodDefinition
static
MethodDefinition
引数 obj および false を指定した MethodDefinition の ? MethodDefinitionEvaluation を返す。
ClassElement : ClassStaticBlock
引数 obj を指定した ClassStaticBlock の ClassStaticBlockDefinitionEvaluation を返す。
ClassElement : ;
empty を返す。
15.7.14 Runtime Semantics: ClassDefinitionEvaluation
構文指向操作 ClassDefinitionEvaluation。引数 classBinding ((String または undefined ))、className ((プロパティキー または プライベート名 )) および sourceText (ECMAScript ソーステキスト )。戻り値:(正常完了 (値:関数オブジェクト ) または 中途完了)。
注
仕様を簡潔にするため、プライベートメソッドおよびアクセサーは、プライベートフィールドとともにクラスインスタンスの [[PrivateElements]] スロットに含まれます。ただし、任意のオブジェクトは、あるクラスによって定義されたプライベートメソッドおよびアクセサーをすべて持つか、まったく持たないかのいずれかです。この機能は、各メソッドまたはアクセサーを個別に追跡する必要のない戦略を使用してプライベートメソッドおよびアクセサーを実装することを、実装が選択できるように設計されています。
たとえば実装は、インスタンスのプライベートメソッドを対応する Private Name に直接関連付け、各オブジェクトについて、そのオブジェクトを this 値としてどのクラスコンストラクター が実行されたかを追跡できます。その場合、オブジェクト上のインスタンスプライベートメソッドの検索は、そのメソッドを定義するクラスコンストラクター がそのオブジェクトの初期化に使用されたことを確認し、その後 Private Name に関連付けられたメソッドを返すことで構成されます。
これはプライベートフィールドとは異なります。フィールド初期化子はクラスのインスタンス化中にスローする可能性があるため、個々のオブジェクトが特定のクラスのプライベートフィールドの真部分集合のみを持つ場合があり、そのため一般にプライベートフィールドは個別に追跡しなければなりません。
次の生成規則ごとに定義される。
ClassTail :
ClassHeritage opt
{
ClassBody opt
}
envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。classEnv を NewDeclarativeEnvironment (envRecord ) とする。classBinding が undefined でない場合、! classEnv .CreateImmutableBinding (classBinding , true ) を実行する。 outerPrivateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。classPrivateEnv を NewPrivateEnvironment (outerPrivateEnv ) とする。ClassBody が存在する場合、ClassBody の PrivateBoundIdentifiers の各 String description について、次を行う。classPrivateEnv .[[Names]] が、privateName .[[Description]] が description である Private Name privateName を含む場合、表明 : これは getter/setter の組に対してのみ可能である。そうでない場合、name を [[Description]] が description である新しい Private Name とする。name を classPrivateEnv .[[Names]] に追加する。 ClassHeritage が存在しない場合、protoParent を %Object.prototype% とする。ctorParent を %Function.prototype% とする。そうでない場合、実行中の実行コンテキスト の LexicalEnvironment を classEnv に設定する。注記 : ClassHeritage を評価するとき、実行中の実行コンテキスト の PrivateEnvironment は outerPrivateEnv である。superclassRef を Completion (ClassHeritage の Evaluation ) とする。実行中の実行コンテキスト の LexicalEnvironment を envRecord に設定する。superclass を ? GetValue (? superclassRef ) とする。superclass が null である場合、protoParent を null とする。ctorParent を %Function.prototype% とする。そうでなく、IsConstructor (superclass ) が false である場合、TypeError 例外をスローする。 そうでない場合、protoParent を ? Get (superclass , "prototype" ) とする。protoParent が Object でなく、かつ protoParent が null でない場合、TypeError 例外をスローする。ctorParent を superclass とする。 proto を OrdinaryObjectCreate (protoParent ) とする。ClassBody が存在しない場合、ctor を empty とする。そうでない場合、ctor を ClassBody の ConstructorMethod とする。 実行中の実行コンテキスト の LexicalEnvironment を classEnv に設定する。実行中の実行コンテキスト の PrivateEnvironment を classPrivateEnv に設定する。ctor が empty である場合、defaultCtor を、パラメーターを持たず何も捕捉せず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。args を [[Call]] または [[Construct]] によってこの関数へ渡された引数の List とする。NewTarget が undefined である場合、TypeError 例外をスローする。 ctorFunc をアクティブな関数オブジェクト とする。ctorFunc .[[ConstructorKind]] が derived である場合、注記 : この分岐は constructor(...args) { super(...args); } と同様に動作する。最も重要な違いは、前述の ECMAScript ソーステキスト では %Array.prototype% 上の %Symbol.iterator% メソッドが観測可能な形で呼び出されるのに対し、この関数では呼び出されないことである。func を ! ctorFunc .[[GetPrototypeOf]] () とする。IsConstructor (func ) が false である場合、TypeError 例外をスローする。result を ? Construct (func , args , NewTarget) とする。そうでない場合、注記 : この分岐は constructor() {} と同様に動作する。result を ? OrdinaryCreateFromConstructor (NewTarget, "%Object.prototype%" ) とする。 ? InitializeInstanceElements (result , ctorFunc ) を実行する。 NormalCompletion (result ) を返す。ctorFunc を CreateBuiltinFunction (defaultCtor , 0, className , « [[ConstructorKind]] , [[SourceText]] , [[PrivateMethods]] , [[Fields]] », 現在の Realm Record , ctorParent ) とする。そうでない場合、ctorInfo を、引数 proto および ctorParent を指定した ctor の ! DefineMethod とする。ctorFunc を ctorInfo .[[Closure]] とする。MakeClassConstructor (ctorFunc ) を実行する。SetFunctionName (ctorFunc , className ) を実行する。 ctorFunc .[[SourceText]] を sourceText に設定する。MakeConstructor (ctorFunc , false , proto ) を実行する。ClassHeritage が存在する場合、ctorFunc .[[ConstructorKind]] を derived に設定する。! DefineMethodProperty (proto , "constructor" , ctorFunc , false ) を実行する。 ClassBody が存在しない場合、classElements を新しい空の List とする。そうでない場合、classElements を ClassBody の NonConstructorElements とする。 instancePrivateMethods を新しい空の List とする。staticPrivateMethods を新しい空の List とする。instanceFields を新しい空の List とする。staticElements を新しい空の List とする。classElements の各 ClassElement classElement について、次を行う。classElement の IsStatic が false である場合、element を Completion (引数 proto を指定した classElement の ClassElementEvaluation ) とする。そうでない場合、element を Completion (引数 ctorFunc を指定した classElement の ClassElementEvaluation ) とする。 element が中断完了 である場合、実行中の実行コンテキスト の LexicalEnvironment を envRecord に設定する。実行中の実行コンテキスト の PrivateEnvironment を outerPrivateEnv に設定する。? element を返す。 element を ! element に設定する。element が PrivateElement である場合、表明 : element .[[Kind]] は method または accessor のいずれかである。classElement の IsStatic が false である場合、container を instancePrivateMethods とする。そうでない場合、container を staticPrivateMethods とする。 container が、existingElement .[[Key]] が element .[[Key]] である PrivateElement existingElement を含む場合、表明 : element .[[Kind]] と existingElement .[[Kind]] はどちらも accessor である。element .[[Getter]] が undefined である場合、combined を PrivateElement { [[Key]] : element .[[Key]] , [[Kind]] : accessor , [[Getter]] : existingElement .[[Getter]] , [[Setter]] : element .[[Setter]] } とする。そうでない場合、combined を PrivateElement { [[Key]] : element .[[Key]] , [[Kind]] : accessor , [[Getter]] : element .[[Getter]] , [[Setter]] : existingElement .[[Setter]] } とする。 container 内の existingElement を combined に置換する。そうでない場合、element を container に追加する。 そうでなく、element が ClassFieldDefinition Record である場合、classElement の IsStatic が false である場合、element を instanceFields に追加する。そうでない場合、element を staticElements に追加する。 そうでなく、element が ClassStaticBlockDefinition Record である場合、element を staticElements に追加する。 そうでない場合、表明 : element は empty である。 実行中の実行コンテキスト の LexicalEnvironment を envRecord に設定する。classBinding が undefined でない場合、! classEnv .InitializeBinding (classBinding , ctorFunc ) を実行する。 ctorFunc .[[PrivateMethods]] を instancePrivateMethods に設定する。ctorFunc .[[Fields]] を instanceFields に設定する。staticPrivateMethods の各 PrivateElement method について、次を行う。! PrivateMethodOrAccessorAdd (ctorFunc , method ) を実行する。 staticElements の各要素 elementRecord について、次を行う。elementRecord が ClassFieldDefinition Record である場合、result を Completion (DefineField (ctorFunc , elementRecord )) とする。そうでない場合、表明 : elementRecord は ClassStaticBlockDefinition Record である。result を Completion (Call (elementRecord .[[BodyFunction]] , ctorFunc )) とする。 result が中断完了 である場合、実行中の実行コンテキスト の PrivateEnvironment を outerPrivateEnv に設定する。? result を返す。 実行中の実行コンテキスト の PrivateEnvironment を outerPrivateEnv に設定する。ctorFunc を返す。
15.7.15 Runtime Semantics: BindingClassDeclarationEvaluation
構文指向操作 BindingClassDeclarationEvaluation。引数なし。戻り値:(正常完了 (値:関数オブジェクト ) または 中途完了)。 次の生成規則ごとに定義される。
ClassDeclaration :
class
BindingIdentifier
ClassTail
className を BindingIdentifier の StringValue とする。sourceText を ClassDeclaration に一致するソーステキスト とする。value を、引数 className 、className 、および sourceText を指定した ClassTail の ? ClassDefinitionEvaluation とする。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。? InitializeBoundName (className , value , envRecord ) を実行する。 value を返す。
ClassDeclaration :
class
ClassTail
sourceText を ClassDeclaration に一致するソーステキスト とする。引数 undefined 、"default" 、および sourceText を指定した ClassTail の ? ClassDefinitionEvaluation を返す。
注
ClassDeclaration :
class
ClassTail
は ExportDeclaration の一部としてのみ現れ、その束縛の確立はその生成規則の評価動作の一部として処理されます。16.2.3.7 を参照してください。
15.7.16 Runtime Semantics: Evaluation
ClassDeclaration :
class
BindingIdentifier
ClassTail
この ClassDeclaration の ? BindingClassDeclarationEvaluation を実行する。 empty を返す。
注
ClassExpression :
class
ClassTail
sourceText を ClassExpression に一致するソーステキスト とする。引数 undefined 、空の String、および sourceText を指定した ClassTail の ? ClassDefinitionEvaluation を返す。
ClassExpression :
class
BindingIdentifier
ClassTail
className を BindingIdentifier の StringValue とする。sourceText を ClassExpression に一致するソーステキスト とする。引数 className 、className 、および sourceText を指定した ClassTail の ? ClassDefinitionEvaluation を返す。
ClassElementName : PrivateIdentifier
privateIdentifier を PrivateIdentifier の StringValue とする。privateEnvRecord を実行中の実行コンテキスト の PrivateEnvironment とする。names を privateEnvRecord .[[Names]] とする。表明 : names の要素のうち、[[Description]] が privateIdentifier である Private Name は正確に1つである。privateName を、names 内で [[Description]] が privateIdentifier である Private Name とする。privateName を返す。
ClassStaticBlockStatementList : [empty]
undefined を返す。
15.8 Async 関数定義
構文
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]
注 1
[Await] パラメーターが存在する場合、await は AwaitExpression のキーワード として構文解析されます。[Await] パラメーターは次の文脈のトップレベルに存在しますが、FunctionBody などの非終端記号によっては一部の文脈でパラメーターが存在しない場合があります。
Script が構文上の目標記号である場合、[Await] パラメーターが存在しないとき、await は識別子として構文解析される場合があります。これには次の文脈が含まれます。
注 2
YieldExpression とは異なり、AwaitExpression のオペランドを省略すると Syntax Error です。何かを await しなければなりません。
15.8.1 Static Semantics: 早期エラー
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionDeclaration :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionExpression :
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
15.8.2 Runtime Semantics: InstantiateAsyncFunctionObject
構文指向操作 InstantiateAsyncFunctionObject。引数 envRecord (Environmentレコード ) および privateEnv ((PrivateEnvironmentレコード または null ))。戻り値:ECMAScript 関数オブジェクト。 次の生成規則ごとに定義される。
AsyncFunctionDeclaration :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
name を BindingIdentifier の StringValue とする。sourceText を AsyncFunctionDeclaration に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , FormalParameters , AsyncFunctionBody , non-lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。closure を返す。
AsyncFunctionDeclaration :
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
sourceText を AsyncFunctionDeclaration に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , FormalParameters , AsyncFunctionBody , non-lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , "default" ) を実行する。closure を返す。
15.8.3 Runtime Semantics: InstantiateAsyncFunctionExpression
構文指向操作 InstantiateAsyncFunctionExpression。省略可能な引数 name ((プロパティキー または プライベート名 ))。戻り値:ECMAScript 関数オブジェクト。 次の生成規則ごとに定義される。
AsyncFunctionExpression :
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
name が存在しない場合、name を空の String に設定する。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を AsyncFunctionExpression に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , FormalParameters , AsyncFunctionBody , non-lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。closure を返す。
AsyncFunctionExpression :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
表明 : name は存在しない。name を BindingIdentifier の StringValue に設定する。outerEnv を実行中の実行コンテキスト の LexicalEnvironment とする。funcEnv を NewDeclarativeEnvironment (outerEnv ) とする。! funcEnv .CreateImmutableBinding (name , false ) を実行する。 privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を AsyncFunctionExpression に一致するソーステキスト とする。closure を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , FormalParameters , AsyncFunctionBody , non-lexical-this , funcEnv , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。! funcEnv .InitializeBinding (name , closure ) を実行する。 closure を返す。
注
15.8.4 Runtime Semantics: EvaluateAsyncFunctionBody
構文指向操作 EvaluateAsyncFunctionBody。引数 funcObj (ECMAScript 関数オブジェクト) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:return 完了 。 次の生成規則ごとに定義される。
AsyncFunctionBody : FunctionBody
promiseCapability を ! NewPromiseCapability (%Promise% ) とする。completion を Completion (FunctionDeclarationInstantiation (funcObj , argList )) とする。completion が中断完了 である場合、! Call (promiseCapability .[[Reject]] , undefined , « completion .[[Value]] ») を実行する。 そうでない場合、AsyncFunctionStart (promiseCapability , FunctionBody ) を実行する。 ReturnCompletion (promiseCapability .[[Promise]] ) を返す。
15.8.5 Runtime Semantics: Evaluation
AsyncFunctionExpression :
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionExpression の InstantiateAsyncFunctionExpression を返す。
UnaryExpression : CoverAwaitExpressionAndAwaitUsingDeclarationHead
expr を CoverAwaitExpressionAndAwaitUsingDeclarationHead によって被覆される AwaitExpression とする。expr の ? Evaluation を返す。
AwaitExpression :
await
UnaryExpression
exprRef を UnaryExpression の ? Evaluation とする。value を ? GetValue (exprRef ) とする。? Await (value ) を返す。
15.9 Async アロー関数定義
構文
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 :
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead の解釈は、次の文法を使用して詳細化されます。
AsyncArrowHead :
async
[no LineTerminator here]
ArrowFormalParameters [~Yield, +Await]
15.9.1 Static Semantics: 早期エラー
AsyncArrowFunction :
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
AsyncArrowFunction :
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
15.9.2 Static Semantics: AsyncConciseBodyContainsUseStrict
構文指向操作 AsyncConciseBodyContainsUseStrict。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
AsyncConciseBody : ExpressionBody
false を返す。
AsyncConciseBody :
{
AsyncFunctionBody
}
AsyncFunctionBody の FunctionBodyContainsUseStrict を返す。
15.9.3 Runtime Semantics: EvaluateAsyncConciseBody
構文指向操作 EvaluateAsyncConciseBody。引数 funcObj (ECMAScript 関数オブジェクト) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:return 完了 。 次の生成規則ごとに定義される。
AsyncConciseBody : ExpressionBody
promiseCapability を ! NewPromiseCapability (%Promise% ) とする。completion を Completion (FunctionDeclarationInstantiation (funcObj , argList )) とする。completion が中断完了 である場合、! Call (promiseCapability .[[Reject]] , undefined , « completion .[[Value]] ») を実行する。 そうでない場合、AsyncFunctionStart (promiseCapability , ExpressionBody ) を実行する。 ReturnCompletion (promiseCapability .[[Promise]] ) を返す。
15.9.4 Runtime Semantics: InstantiateAsyncArrowFunctionExpression
構文指向操作 InstantiateAsyncArrowFunctionExpression。省略可能な引数 name ((プロパティキー または プライベート名 ))。戻り値:ECMAScript 関数オブジェクト。 次の生成規則ごとに定義される。
AsyncArrowFunction :
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
name が存在しない場合、name を空の String に設定する。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を AsyncArrowFunction に一致するソーステキスト とする。params を AsyncArrowBindingIdentifier とする。closure を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , params , AsyncConciseBody , lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。closure を返す。
AsyncArrowFunction :
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
name が存在しない場合、name を空の String に設定する。envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。privateEnv を実行中の実行コンテキスト の PrivateEnvironment とする。sourceText を AsyncArrowFunction に一致するソーステキスト とする。head を CoverCallExpressionAndAsyncArrowHead によって被覆される AsyncArrowHead とする。params を head の ArrowFormalParameters とする。closure を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , params , AsyncConciseBody , lexical-this , envRecord , privateEnv ) とする。SetFunctionName (closure , name ) を実行する。closure を返す。
15.9.5 Runtime Semantics: Evaluation
AsyncArrowFunction :
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
AsyncArrowFunction の InstantiateAsyncArrowFunctionExpression を返す。
15.10 末尾位置の呼出し
15.10.1 Static Semantics: IsInTailPosition ( call )
抽象操作 IsInTailPosition。引数 call ((a CallExpression Parse Node 、a MemberExpression Parse Node または an OptionalChain Parse Node ))。戻り値:Boolean。 呼び出されると、次の手順を実行する。
IsStrict (call ) が false である場合、false を返す。call が FunctionBody 、ConciseBody 、または AsyncConciseBody 内に含まれていない場合、false を返す。body を、call を最も近くで包含する FunctionBody 、ConciseBody 、または AsyncConciseBody とする。body が GeneratorBody の FunctionBody である場合、false を返す。body が AsyncFunctionBody の FunctionBody である場合、false を返す。body が AsyncGeneratorBody の FunctionBody である場合、false を返す。body が AsyncConciseBody である場合、false を返す。引数 call を指定した body の HasCallInTailPosition の結果を返す。
注
末尾位置の呼出しが定義されるのは strict モードコード 内だけです。これは、呼出し元コンテキストの連鎖を観測できるようにする一般的な非標準言語拡張(10.2.4 を参照)が存在するためです。
15.10.2 Static Semantics: HasCallInTailPosition
構文指向操作 HasCallInTailPosition。引数 call ((a CallExpression Parse Node 、a MemberExpression Parse Node または an OptionalChain Parse Node ))。戻り値:Boolean。
注 1
call はソーステキストの特定の範囲を表す Parse Node です。以下のアルゴリズムで call を別の Parse Node と比較する場合、それらが同じソーステキストを表しているかどうかを検査します。
注 2
直後に呼出し結果の GetValue を返す可能性のある末尾位置呼出しも、末尾位置呼出しになり得ます。関数呼出しは Reference Record を返すことができないため、このような GetValue 操作は常に実際の関数呼出し結果と同じ値を返します。
注 3
次の生成規則ごとに定義される。
StatementList :
StatementList
StatementListItem
has を、引数 call を指定した派生 StatementList の HasCallInTailPosition とする。has が true である場合、true を返す。派生 StatementList の ContainsUsing が true である場合、false を返す。 引数 call を指定した StatementListItem の HasCallInTailPosition を返す。
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 :
{
}
false を返す。
IfStatement :
if
(
Expression
)
Statement
else
Statement
has を、引数 call を指定した最初の Statement の HasCallInTailPosition とする。has が true である場合、true を返す。引数 call を指定した2番目の Statement の HasCallInTailPosition を返す。
IfStatement :
if
(
Expression
)
Statement
DoWhileStatement :
do
Statement
while
(
Expression
)
;
WhileStatement :
while
(
Expression
)
Statement
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
ForInOfStatement :
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
WithStatement :
with
(
Expression
)
Statement
引数 call を指定した Statement の HasCallInTailPosition を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
引数 call を指定した LabelledItem の HasCallInTailPosition を返す。
ReturnStatement :
return
Expression
;
引数 call を指定した Expression の HasCallInTailPosition を返す。
SwitchStatement :
switch
(
Expression
)
CaseBlock
引数 call を指定した CaseBlock の HasCallInTailPosition を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
has を false とする。最初の CaseClauses が存在する場合、has を、引数 call を指定した最初の CaseClauses の HasCallInTailPosition に設定する。 has が true である場合、true を返す。has を、引数 call を指定した DefaultClause の HasCallInTailPosition に設定する。has が true である場合、true を返す。2番目の CaseClauses が存在する場合、has を、引数 call を指定した2番目の CaseClauses の HasCallInTailPosition に設定する。 has を返す。
CaseClauses :
CaseClauses
CaseClause
has を、引数 call を指定した CaseClauses の HasCallInTailPosition とする。has が true である場合、true を返す。引数 call を指定した CaseClause の HasCallInTailPosition を返す。
CaseClause :
case
Expression
:
StatementList opt
DefaultClause :
default
:
StatementList opt
StatementList が存在する場合、引数 call を指定した StatementList の HasCallInTailPosition を返す。false を返す。
TryStatement :
try
Block
Catch
引数 call を指定した Catch の HasCallInTailPosition を返す。
TryStatement :
try
Block
Finally
try
Block
Catch
Finally
引数 call を指定した Finally の HasCallInTailPosition を返す。
Catch :
catch
(
CatchParameter
)
Block
引数 call を指定した Block の HasCallInTailPosition を返す。
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
CoverAwaitExpressionAndAwaitUsingDeclarationHead
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
false を返す。
Expression :
AssignmentExpression
Expression
,
AssignmentExpression
引数 call を指定した AssignmentExpression の HasCallInTailPosition を返す。
ConditionalExpression :
ShortCircuitExpression
?
AssignmentExpression
:
AssignmentExpression
has を、引数 call を指定した最初の AssignmentExpression の HasCallInTailPosition とする。has が true である場合、true を返す。引数 call を指定した2番目の AssignmentExpression の HasCallInTailPosition を返す。
LogicalANDExpression :
LogicalANDExpression
&&
BitwiseORExpression
引数 call を指定した BitwiseORExpression の HasCallInTailPosition を返す。
LogicalORExpression :
LogicalORExpression
||
LogicalANDExpression
引数 call を指定した LogicalANDExpression の HasCallInTailPosition を返す。
CoalesceExpression :
CoalesceExpressionHead
??
BitwiseORExpression
引数 call を指定した BitwiseORExpression の HasCallInTailPosition を返す。
CallExpression :
CoverCallExpressionAndAsyncArrowHead
CallExpression
Arguments
CallExpression
TemplateLiteral
この CallExpression が call である場合、true を返す。 false を返す。
OptionalExpression :
MemberExpression
OptionalChain
CallExpression
OptionalChain
OptionalExpression
OptionalChain
引数 call を指定した OptionalChain の HasCallInTailPosition を返す。
OptionalChain :
?.
[
Expression
]
?.
IdentifierName
?.
PrivateIdentifier
OptionalChain
[
Expression
]
OptionalChain
.
IdentifierName
OptionalChain
.
PrivateIdentifier
false を返す。
OptionalChain :
?.
Arguments
OptionalChain
Arguments
この OptionalChain が call である場合、true を返す。 false を返す。
MemberExpression :
MemberExpression
TemplateLiteral
この MemberExpression が call である場合、true を返す。 false を返す。
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
expr を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。引数 call を指定した expr の HasCallInTailPosition を返す。
ParenthesizedExpression :
(
Expression
)
引数 call を指定した Expression の HasCallInTailPosition を返す。
15.10.3 PrepareForTailCall ( )
抽象操作 PrepareForTailCall。引数なし。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : 現在の実行コンテキスト は、その後いかなる ECMAScript コードまたは組込み関数の評価にも使用されない。この抽象操作 の呼出しに続く Call の呼出しは、そのような評価を実行する前に新しい実行コンテキスト を作成してプッシュする。現在の実行コンテキスト に関連付けられたすべてのリソースを破棄する。 unused を返す。
末尾位置の呼出しは、対象関数を呼び出す前に、現在実行中の関数の実行コンテキスト に関連付けられた一時的な内部リソースを解放するか、対象関数をサポートするためにそれらのリソースを再利用しなければなりません。
注
たとえば、末尾位置の呼出しによって実装のアクティベーションレコードスタックが増加する量は、対象関数のアクティベーションレコードのサイズが呼出し元関数のアクティベーションレコードのサイズを超える分だけであるべきです。対象関数のアクティベーションレコードの方が小さい場合、スタック全体のサイズは減少するべきです。
16 ECMAScript 言語: スクリプトとモジュール
16.1 スクリプト
構文
Script :
ScriptBody opt
ScriptBody :
StatementList [~Yield, ~Await, ~Return]
16.1.1 Static Semantics: 早期エラー
Script : ScriptBody
ScriptBody : StatementList
16.1.2 Static Semantics: ScriptIsStrict
構文指向操作 ScriptIsStrict。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
Script : ScriptBody opt
ScriptBody が存在し、ScriptBody のディレクティブプロローグ が Use Strict ディレクティブ を含む場合、true を返す。false を返す。
16.1.3 Runtime Semantics: Evaluation
Script : [empty]
undefined を返す。
16.1.4 Script Record
Script Record は、評価されるスクリプトに関する情報をカプセル化します。各 script record は 表 35 に列挙されたフィールドを含みます。
表 35: Script Record のフィールド
16.1.5 ParseScript ( sourceText , realm , hostDefined )
抽象操作 ParseScript。引数 sourceText ((String または a sequence of Unicode code points))、realm (Realmレコード ) および hostDefined (任意の値)。戻り値:(Scriptレコード または a non-empty List of SyntaxError objects)。 sourceText を Script として構文解析した結果に基づいて Script Record を作成します。 呼び出されると、次の手順を実行する。
script を ParseText (sourceText , Script ) とする。script がエラーの List である場合、script を返す。Script Record { [[Realm]] : realm , [[ECMAScriptCode]] : script , [[LoadedModules]] : « », [[HostDefined]] : hostDefined } を返す。
注
実装は、あるスクリプトソーステキストについて ParseScript を評価する前に、そのソーステキストを構文解析し、早期エラー 条件について解析してもかまいません。ただし、エラーの報告は、この仕様が実際にそのソーステキストに対して ParseScript を実行する時点まで延期しなければなりません。
16.1.6 ScriptEvaluation ( scriptRecord )
抽象操作 ScriptEvaluation。引数 scriptRecord (Scriptレコード )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 呼び出されると、次の手順を実行する。
globalEnv を scriptRecord .[[Realm]] .[[GlobalEnv]] とする。scriptContext を新しい ECMAScript コード実行コンテキスト とする。scriptContext の Function を null に設定する。scriptContext の Realm を scriptRecord .[[Realm]] に設定する。scriptContext の ScriptOrModule を scriptRecord に設定する。scriptContext の VariableEnvironment を globalEnv に設定する。scriptContext の LexicalEnvironment を globalEnv に設定する。scriptContext の PrivateEnvironment を null に設定する。実行中の実行コンテキスト を一時停止する。scriptContext を実行コンテキストスタック にプッシュする。これで scriptContext が実行中の実行コンテキスト になる。scriptNode を scriptRecord .[[ECMAScriptCode]] とする。result を Completion (GlobalDeclarationInstantiation (scriptNode , globalEnv )) とする。result が正常完了 である場合、result を Completion (scriptNode の Evaluation ) に設定する。result が正常完了 であり、result .[[Value]] が empty である場合、result を NormalCompletion (undefined ) に設定する。scriptContext を一時停止し、実行コンテキストスタック から削除する。表明 : 実行コンテキストスタック は空ではない。現在実行コンテキストスタック の先頭にあるコンテキストを、実行中の実行コンテキスト として再開する。 ? result を返す。
16.1.7 GlobalDeclarationInstantiation ( script , envRecord )
抽象操作 GlobalDeclarationInstantiation。引数 script (a Script Parse Node ) および envRecord (Global Environmentレコード )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 script は、実行コンテキスト が確立される対象の Script です。envRecord は、束縛が作成されるグローバル環境です。
注 1
スクリプトを評価するための実行コンテキスト が確立されると、宣言は現在のグローバル環境内でインスタンス化されます。コード内で宣言された各グローバル束縛がインスタンス化されます。
呼び出されたとき、次の手順を実行します。
lexicalNames を script の LexicallyDeclaredNames とする。variableNames を script の VarDeclaredNames とする。lexicalNames の各要素 name について、次を行う。HasLexicalDeclaration (envRecord , name ) が true である場合、SyntaxError 例外をスローする。hasRestrictedGlobal を ? HasRestrictedGlobalProperty (envRecord , name ) とする。注記 : グローバル var および function 束縛(非 strict direct eval によって導入されるものを除く)は構成不可であり、したがって制限されたグローバルプロパティである。hasRestrictedGlobal が true である場合、SyntaxError 例外をスローする。variableNames の各要素 name について、次を行う。HasLexicalDeclaration (envRecord , name ) が true である場合、SyntaxError 例外をスローする。variableDecls を script の VarScopedDeclarations とする。funcsToInitialize を新しい空の List とする。declaredFuncNames を新しい空の List とする。variableDecls の各要素 variableDecl について、List の逆順で次を行う。variableDecl が VariableDeclaration 、ForBinding 、または BindingIdentifier のいずれでもない場合、表明 : variableDecl は FunctionDeclaration 、GeneratorDeclaration 、AsyncFunctionDeclaration 、または AsyncGeneratorDeclaration のいずれかである。注記 : 同じ名前について複数の関数宣言がある場合、最後の宣言が使用される。funcName を variableDecl の BoundNames の唯一の要素とする。declaredFuncNames が funcName を含まない場合、funcDefinable を ? CanDeclareGlobalFunction (envRecord , funcName ) とする。funcDefinable が false である場合、TypeError 例外をスローする。funcName を declaredFuncNames に追加する。variableDecl を funcsToInitialize の最初の要素として挿入する。declaredVariableNames を新しい空の List とする。variableDecls の各要素 variableDecl について、次を行う。variableDecl が VariableDeclaration 、ForBinding 、または BindingIdentifier のいずれかである場合、variableDecl の BoundNames の各 String name について、次を行う。declaredFuncNames が name を含まない場合、variableDefinable を ? CanDeclareGlobalVar (envRecord , name ) とする。variableDefinable が false である場合、TypeError 例外をスローする。declaredVariableNames が name を含まない場合、name を declaredVariableNames に追加する。注記 : グローバルオブジェクト が通常オブジェクト である場合、このアルゴリズムのこの手順以降では異常終了は発生しない。ただし、グローバルオブジェクト が Proxy 特殊オブジェクト である場合、後続の手順の一部で異常終了を引き起こす動作を示す可能性がある。Normative Optional
ホスト が Web ブラウザーであるか、その他の方法で ブロックレベル関数宣言の Web Legacy 互換性意味論 をサポートする場合、strict を script の ScriptIsStrict とする。strict が false である場合、declaredFuncOrVariableNames を declaredFuncNames と declaredVariableNames のリスト連結 とする。script Contains x が true となる任意の Block 、CaseClause 、または DefaultClause x の StatementList に直接含まれる各 FunctionDeclaration funcDecl について、次を行う。funcName を funcDecl の BindingIdentifier の StringValue とする。FunctionDeclaration funcDecl を、funcName を BindingIdentifier として持つ VariableStatement に置き換えても script に早期エラー が生じない場合、HasLexicalDeclaration (envRecord , funcName ) が false である場合、funcDefinable を ? CanDeclareGlobalVar (envRecord , funcName ) とする。funcDefinable が true である場合、注記 : funcName の var 束縛がここでインスタンス化されるのは、それが VarDeclaredName でも別の FunctionDeclaration の名前でもない場合だけである。declaredFuncOrVariableNames が funcName を含まない場合、? CreateGlobalVarBinding (envRecord , funcName , false ) を実行する。 funcName を declaredFuncOrVariableNames に追加する。FunctionDeclaration funcDecl が評価されるとき、15.2.6 で提供される FunctionDeclaration Evaluation アルゴリズムの代わりに、次の手順を実行する。globalEnv を実行中の実行コンテキスト の VariableEnvironment とする。blockEnv を実行中の実行コンテキスト の LexicalEnvironment とする。funcObj を ! blockEnv .GetBindingValue (funcName , false ) とする。? globalEnv .SetMutableBinding (funcName , funcObj , false ) を実行する。 unused を返す。lexicalDecls を script の LexicallyScopedDeclarations とする。privateEnv を null とする。lexicalDecls の各要素 lexicalDecl について、次を行う。注記 : レキシカルに宣言された名前はここではインスタンス化されるだけで、初期化はされない。lexicalDecl の BoundNames の各要素 name について、次を行う。lexicalDecl の IsConstantDeclaration が true である場合、? envRecord .CreateImmutableBinding (name , true ) を実行する。 そうでない場合、? envRecord .CreateMutableBinding (name , false ) を実行する。 funcsToInitialize の各 Parse Node funcDecl について、次を行う。funcName を funcDecl の BoundNames の唯一の要素とする。funcObj を、引数 envRecord および privateEnv を指定した funcDecl の InstantiateFunctionObject とする。? CreateGlobalFunctionBinding (envRecord , funcName , funcObj , false ) を実行する。 declaredVariableNames の各 String variableName について、次を行う。? CreateGlobalVarBinding (envRecord , variableName , false ) を実行する。 unused を返す。
注 2
16.1.1 で規定される早期エラー は、単一の Script 内に含まれる宣言について、function/var 宣言と let/const/class 宣言との名前衝突、および let/const/class 束縛の再宣言を防止します。ただし、複数の Script にまたがるこのような衝突および再宣言は、GlobalDeclarationInstantiation 中に実行時エラーとして検出されます。このようなエラーが検出された場合、そのスクリプトについて束縛は一切インスタンス化されません。ただし、グローバルオブジェクト が Proxy 特殊オブジェクト を使用して定義されている場合、競合 する宣言に対する実行時検査が信頼できず、中断完了 となり、一部のグローバル宣言がインスタンス化されない可能性があります。この場合、Script のコードは評価されません。
明示的な var または function 宣言とは異なり、グローバルオブジェクト 上に直接作成されたプロパティから生じるグローバル束縛は、let/const/class 宣言によって隠蔽される場合があります。
16.2 モジュール
構文
Module :
ModuleBody opt
ModuleBody :
ModuleItemList
ModuleItemList :
ModuleItem
ModuleItemList
ModuleItem
ModuleItem :
ImportDeclaration
ExportDeclaration
StatementListItem [~Yield, +Await, ~Return]
ModuleExportName :
IdentifierName
StringLiteral
16.2.1 モジュールの意味論
16.2.1.1 Static Semantics: 早期エラー
ModuleBody : ModuleItemList
注
ExportedNames の重複規則により、ModuleBody 内に複数の export default ExportDeclaration 項目がある場合は Syntax Error になります。競合 または重複する宣言に関する追加のエラー条件は、Module の評価前のモジュールリンク中に検査されます。このようなエラーが検出された場合、Module は評価されません。
ModuleExportName : StringLiteral
16.2.1.2 Static Semantics: ImportedLocalNames ( importEntries )
抽象操作 ImportedLocalNames。引数 importEntries (リスト (要素:ImportEntryレコード ))。戻り値:リスト (要素:String)。 importEntries によって定義されるすべてのローカル名束縛の List を作成します。 呼び出されると、次の手順を実行する。
localNames を新しい空の List とする。importEntries の各 ImportEntry Record importEntry について、次を行う。importEntry .[[LocalName]] を localNames に追加する。localNames を返す。
16.2.1.3 ModuleRequest Record
ModuleRequest Record は、指定されたインポート属性を持つモジュールをインポートする要求を表します。これは次のフィールドで構成されます。
表 36: ModuleRequest Record のフィールド
LoadedModuleRequest Record は、モジュールをインポートする要求と、その結果として得られる Module Record を表します。これは 表 36 の表で定義されるものと同じフィールドに加えて、[[Module]] を持ちます。
表 37: LoadedModuleRequest Record のフィールド
ImportAttribute Record は次のフィールドで構成されます。
表 38: ImportAttribute Record のフィールド
フィールド名
値の型
意味
[[Key]]
a String
属性キー
[[Value]]
a String
属性値
16.2.1.3.1 ModuleRequestsEqual ( x , y )
抽象操作 ModuleRequestsEqual。引数 x ((ModuleRequestレコード または LoadedModuleRequestレコード )) および y ((ModuleRequestレコード または LoadedModuleRequestレコード ))。戻り値:Boolean。 呼び出されると、次の手順を実行する。
x .[[Specifier]] が y .[[Specifier]] でない場合、false を返す。xAttrs を x .[[Attributes]] とする。yAttrs を y .[[Attributes]] とする。xAttrsCount を xAttrs の要素数とする。yAttrsCount を yAttrs の要素数とする。xAttrsCount ≠ yAttrsCount である場合、false を返す。xAttrs の各 ImportAttribute Record xAttr について、次を行う。yAttrs が、xAttr .[[Key]] が yAttr .[[Key]] であり、かつ xAttr .[[Value]] が yAttr .[[Value]] である ImportAttribute Record yAttr を含まない場合、false を返す。true を返す。
16.2.1.4 Static Semantics: ModuleRequests
構文指向操作 ModuleRequests。引数なし。戻り値:リスト (要素:ModuleRequestレコード )。 次の生成規則ごとに定義される。
Module : [empty]
新しい空の List を返す。
ModuleItemList : ModuleItem
ModuleItem の ModuleRequests を返す。
ModuleItemList :
ModuleItemList
ModuleItem
requests を ModuleItemList の ModuleRequests とする。additionalRequests を ModuleItem の ModuleRequests とする。additionalRequests の各 ModuleRequest Record moduleRequest について、次を行う。requests が、ModuleRequestsEqual (moduleRequest , otherModuleRequest ) が true である ModuleRequest Record otherModuleRequest を含まない場合、moduleRequest を requests に追加する。requests を返す。
ModuleItem : StatementListItem
新しい空の List を返す。
ImportDeclaration :
import
ImportClause
FromClause
;
specifier を FromClause の SV とする。唯一の要素が ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : « » } である List を返す。
ImportDeclaration :
import
ImportClause
FromClause
WithClause
;
specifier を FromClause の SV とする。attrs を WithClause の WithClauseToAttributes とする。唯一の要素が ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : attrs } である List を返す。
ImportDeclaration :
import
ModuleSpecifier
;
specifier を ModuleSpecifier の SV とする。唯一の要素が ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : « » } である List を返す。
ImportDeclaration :
import
ModuleSpecifier
WithClause
;
specifier を ModuleSpecifier の SV とする。attrs を WithClause の WithClauseToAttributes とする。唯一の要素が ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : attrs } である List を返す。
ExportDeclaration :
export
ExportFromClause
FromClause
;
specifier を FromClause の SV とする。唯一の要素が ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : « » } である List を返す。
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause
;
specifier を FromClause の SV とする。attrs を WithClause の WithClauseToAttributes とする。唯一の要素が ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : attrs } である List を返す。
ExportDeclaration :
export
NamedExports
;
export
VariableStatement
export
Declaration
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
;
新しい空の List を返す。
16.2.1.5 抽象 Module Record
Module Record は、単一モジュールのインポートおよびエクスポートに関する構造情報をカプセル化します。この情報は、接続されたモジュール群のインポートとエクスポートをリンクするために使用されます。Module Record には、モジュールを評価するときにだけ使用される4つのフィールドが含まれます。
仕様上、Module Record は Record 仕様型の値であり、Module Record が抽象クラスで、抽象サブクラスと具象サブクラスの両方を持つ単純なオブジェクト指向階層に存在すると考えることができます。この仕様では、Cyclic Module Record という名前の抽象サブクラスと、その具象サブクラスである Source Text Module Record を定義します。他の仕様および実装は、それらが定義する代替モジュール定義機能に対応する追加の Module Record サブクラスを定義してもかまいません。
Module Record は 表 39 に列挙されるフィールドを定義します。すべての Module Definition サブクラスは少なくともこれらのフィールドを含みます。Module Record はさらに、表 40 にある抽象メソッドのリストを定義します。すべての Module 定義サブクラスは、これらの抽象メソッドの具象実装を提供しなければなりません。
表 39: Module Record のフィールド
フィールド名
値の型
意味
[[Realm]]
a Realm Record
このモジュールが作成された Realm 。
[[Environment]]
a Module Environment Record or empty
このモジュールのトップレベル束縛を含む Environment Record 。このフィールドはモジュールがリンクされたときに設定されます。
[[Namespace]]
an Object or empty
このモジュールについて作成されている場合、その Module Namespace Object(28.3 )。
[[HostDefined]]
anything (default value is undefined )
モジュールに追加情報を関連付ける必要があるホスト環境 が使用するために予約されたフィールド。
表 40: Module Records の抽象メソッド
メソッド
目的
定義
LoadRequestedModules ( [ hostDefined ] )
抽象メソッド LoadRequestedModules。省略可能な引数 hostDefined (任意の値)。戻り値:Promise。
すべての依存関係を再帰的に読み込むことによって、モジュールをリンクするための準備を行います。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
GetExportedNames ( [ exportStarSet ] )
抽象メソッド GetExportedNames。省略可能な引数 exportStarSet (リスト (要素:Source Text Moduleレコード ))。戻り値:リスト (要素:String)。
このモジュールから直接または間接的にエクスポートされるすべての名前のリストを返します。
このメソッドを呼び出す前に、LoadRequestedModules が正常に完了していなければなりません。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
ResolveExport ( exportName [ , resolveSet ] )
抽象メソッド ResolveExport。引数 exportName (String)および省略可能な引数 resolveSet (リスト (要素:レコード (フィールド:[[Module]] (Moduleレコード ), [[ExportName]] (String))))。戻り値:(ResolvedBindingレコード 、null または ambiguous )。
このモジュールによってエクスポートされた名前の束縛を返します。束縛は、{ [[Module]] : Module Record , [[BindingName]] : String | namespace } という形式の ResolvedBinding Record によって表されます。エクスポートがどのモジュールにも直接束縛を持たない Module Namespace Object である場合、[[BindingName]] は namespace に設定されます。名前を解決できない場合は null 、複数の束縛が見つかった場合は ambiguous を返します。
この操作が特定の exportName 、resolveSet の組を引数として呼び出されるたびに、同じ結果を返さなければなりません。
このメソッドを呼び出す前に、LoadRequestedModules が正常に完了していなければなりません。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
Link ( )
抽象メソッド Link。引数なし。戻り値:(正常完了 (値:unused ) または throw 完了 )。
すべてのモジュール依存関係を推移的に解決し、Module Environment Record を作成することによって、モジュールを評価するための準備を行います。
このメソッドを呼び出す前に、LoadRequestedModules が正常に完了していなければなりません。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
Evaluate ( )
抽象メソッド Evaluate。引数なし。戻り値:Promise。
このモジュールとその依存関係の評価に対する promise を返します。評価が成功した場合、またはすでに正常に評価済みの場合は解決し、評価エラーの場合、またはすでに評価に失敗している場合は拒否します。promise が拒否された場合、ホスト は promise の拒否を処理し、評価エラーを再スローすることが期待されます。このモジュールが Cyclic Module Record でない限り、返される promise はすでに決定済みでなければなりません。
このメソッドを呼び出す前に、Link が正常に完了していなければなりません。
この仕様内では次の型に定義があります。ホスト は独自の定義を持つ追加の型を提供してもかまいません。
16.2.1.5.1 EvaluateModuleSync ( module )
抽象操作 EvaluateModuleSync。引数 module (Moduleレコード )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼出し元が module の評価によってすでに決定済みの promise が返されることを保証する場合、module を同期的に評価します。 呼び出されると、次の手順を実行する。
表明 : module は Cyclic Module Record ではない。promise を module .Evaluate () とする。表明 : promise .[[PromiseState]] は fulfilled または rejected のいずれかである。promise .[[PromiseState]] が rejected である場合、promise .[[PromiseIsHandled]] が false である場合、HostPromiseRejectionTracker (promise , "handle" ) を実行する。promise .[[PromiseIsHandled]] を true に設定する。promise .[[PromiseResult]] をスローする。unused を返す。
16.2.1.6 Cyclic Module Record
Cyclic Module Record は、Cyclic Module Record 型のサブクラスである他のモジュールとの依存関係サイクルに参加できるモジュールに関する情報を表すために使用されます。Cyclic Module Record 型のサブクラスでない Module Record は、Source Text Module Record との依存関係サイクルに参加してはなりません。
表 39 で定義されたフィールドに加えて、Cyclic Module Record は 表 41 に列挙される追加のフィールドを持ちます。
表 41: Cyclic Module Record の追加フィールド
フィールド名
値の型
意味
[[Status]]
new , unlinked , linking , linked , evaluating , evaluating-async , or evaluated
初期値は new 。モジュールのライフサイクルの進行に伴って、unlinked 、linking 、linked 、evaluating 、場合によっては evaluating-async 、evaluated の順に遷移します。evaluating-async は、このモジュールが非同期依存関係の完了時に実行するようキューに入れられているか、または [[HasTLA]] フィールドが true で、すでに実行され、トップレベルの完了を待機しているモジュールであることを示します。
[[EvaluationError]]
a throw completion or empty
評価中に発生した例外を表すスロー完了。例外が発生していない場合、または [[Status]] が evaluated でない場合は empty 。
[[DFSAncestorIndex]]
an integer or empty
Link および Evaluate の間だけ使用される補助フィールド。[[Status]] が linking または evaluating のいずれかである場合、これはそのモジュールの深さ優先走査インデックス、または同じ強連結成分内の「より前」のモジュールのインデックスのいずれかです。
[[RequestedModules]]
a List of ModuleRequest Records
このモジュール内のインポートに関連付けられた ModuleRequest Record の List 。この List は、インポートがソーステキストに出現する順序です。
[[LoadedModules]]
a List of LoadedModuleRequest Records
この record によって表されるモジュールが、対応するインポート属性を伴ってモジュールのインポートを要求するために使用した指定子文字列から、解決された Module Record への対応付け。このリストには、ModuleRequestsEqual (r1 , r2 ) が true となる2つの異なる Record r1 と r2 は含まれません。
[[CycleRoot]]
a Cyclic Module Record or empty
サイクルで最初に訪問されたモジュール、すなわち強連結成分のルート DFS 祖先。サイクルに属さないモジュールの場合、これはそのモジュール自身です。Evaluate が完了すると、モジュールの [[DFSAncestorIndex]] はその [[CycleRoot]] の深さ優先走査インデックスになります。
[[HasTLA]]
a Boolean
このモジュール自体が非同期であるかどうか(たとえば、トップレベル await を含む Source Text Module Record の場合)。非同期依存関係を持つことは、このフィールドが true であることを意味しません。このフィールドは、モジュールが構文解析された後に変更してはなりません。
[[AsyncEvaluationOrder]]
unset , an integer, or done
このフィールドは初期状態で unset に設定され、完全に同期的なモジュールでは unset のままです。それ自体が非同期であるか、非同期依存関係を持つモジュールでは、16.2.1.6.1.3.4 によって保留中のモジュールの実行がキューに入れられる順序を決定する整数 に設定されます。保留中のモジュールが正常に実行されると、このフィールドは done に設定されます。
[[TopLevelCapability]]
a PromiseCapability Record or empty
このモジュールが何らかのサイクルの [[CycleRoot]] であり、そのサイクル内のいずれかのモジュールに対して Evaluate () が呼び出された場合、このフィールドはその評価全体に対する PromiseCapability Record を含みます。これは Evaluate () 抽象メソッドから返される Promise オブジェクトを決定するために使用されます。このモジュールの依存関係については、それらの一部に対してトップレベルの Evaluate () が開始されていない限り、このフィールドは empty です。
[[AsyncParentModules]]
a List of Cyclic Module Records
このモジュールまたは依存関係の [[HasTLA]] が true であり、実行が進行中の場合、トップレベル実行ジョブについてこのモジュールの親インポーターを追跡します。これらの親モジュールは、このモジュールが正常に実行を完了する前には実行を開始しません。
[[PendingAsyncDependencies]]
an integer or empty
このモジュールに非同期依存関係がある場合、このフィールドは、このモジュールについて実行が残っている非同期依存モジュールの数を追跡します。非同期依存関係を持つモジュールは、このフィールドが 0 になり、実行エラーがない場合に実行されます。
表 40 で定義されたメソッドに加えて、Cyclic Module Record は 表 42 に列挙される追加のメソッドを持ちます。
表 42: Cyclic Module Record の追加の抽象メソッド
GraphLoadingState Record は、モジュールグラフの読み込み処理に関する情報を含む Record です。HostLoadImportedModule の呼出し後に読み込みを継続するために使用されます。各 GraphLoadingState Record は 表 43 で定義されるフィールドを持ちます。
表 43: GraphLoadingState Record のフィールド
16.2.1.6.1 Module Record 抽象メソッドの実装
以下は、表 40 で定義された対応する Module Record 抽象メソッドを実装する Cyclic Module Record の具象メソッドです。
16.2.1.6.1.1 LoadRequestedModules ( [ hostDefined ] )
a Cyclic Module Record module の具象メソッド LoadRequestedModules 。省略可能な引数 hostDefined (任意の値)。戻り値:Promise。 module の依存関係グラフにあるすべての Module Record の [[LoadedModules]] を設定します(作業の大部分は補助関数 InnerModuleLoading によって行われます)。HostLoadImportedModule フックへ渡される省略可能な hostDefined パラメーターを取ります。 呼び出されると、次の手順を実行する。
hostDefined が存在しない場合、hostDefined を empty に設定する。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。state を GraphLoadingState Record { [[IsLoading]] : true , [[PendingModulesCount]] : 1, [[Visited]] : « », [[PromiseCapability]] : promiseCapability , [[HostDefined]] : hostDefined } とする。InnerModuleLoading (state , module ) を実行する。promiseCapability .[[Promise]] を返す。
注
hostDefined パラメーターは、インポートされたモジュールを取得するために必要な追加情報を渡すために使用できます。たとえば HTML では、<link rel="preload" as="..."> タグに正しい fetch destination を設定するために使用されます。
import() 式が hostDefined パラメーターを設定することはありません。
16.2.1.6.1.1.1 InnerModuleLoading ( state , module )
抽象操作 InnerModuleLoading。引数 state (GraphLoadingStateレコード ) および module (Moduleレコード )。戻り値:unused 。 LoadRequestedModules によって、module の依存関係グラフに対する実際の読み込み処理を再帰的に実行するために使用されます。 呼び出されると、次の手順を実行する。
表明 : state .[[IsLoading]] は true である。module が Cyclic Module Record であり、module .[[Status]] が new であり、state .[[Visited]] が module を含まない場合、module を state .[[Visited]] に追加する。requestedModulesCount を module .[[RequestedModules]] の要素数とする。state .[[PendingModulesCount]] を state .[[PendingModulesCount]] + requestedModulesCount に設定する。module .[[RequestedModules]] の各 ModuleRequest Record request について、次を行う。AllImportAttributesSupported (request .[[Attributes]] ) が false である場合、error を ThrowCompletion (新しく作成された SyntaxError オブジェクト) とする。ContinueModuleLoading (state , error ) を実行する。そうでなく、module .[[LoadedModules]] が、ModuleRequestsEqual (record , request ) が true である LoadedModuleRequest Record record を含む場合、InnerModuleLoading (state , record .[[Module]] ) を実行する。 そうでない場合、HostLoadImportedModule (module , request , state .[[HostDefined]] , state ) を実行する。注記 : HostLoadImportedModule は FinishLoadingImportedModule を呼び出し、それによって ContinueModuleLoading を介してグラフ読み込み処理へ再び入る。 state .[[IsLoading]] が false である場合、unused を返す。表明 : state .[[PendingModulesCount]] ≥ 1。state .[[PendingModulesCount]] を state .[[PendingModulesCount]] - 1 に設定する。state .[[PendingModulesCount]] = 0 である場合、state .[[IsLoading]] を false に設定する。state .[[Visited]] の各 Cyclic Module Record loaded について、次を行う。loaded .[[Status]] が new である場合、loaded .[[Status]] を unlinked に設定する。! Call (state .[[PromiseCapability]] .[[Resolve]] , undefined , « undefined ») を実行する。 unused を返す。
16.2.1.6.1.1.2 ContinueModuleLoading ( state , moduleCompletion )
抽象操作 ContinueModuleLoading。引数 state (GraphLoadingStateレコード ) および moduleCompletion ((正常完了 (値:Moduleレコード ) または throw 完了 ))。戻り値:unused 。 HostLoadImportedModule の呼出し後に読み込み処理へ再び入るために使用されます。 呼び出されると、次の手順を実行する。
state .[[IsLoading]] が false である場合、unused を返す。moduleCompletion が正常完了 である場合、InnerModuleLoading (state , moduleCompletion .[[Value]] ) を実行する。そうでない場合、state .[[IsLoading]] を false に設定する。! Call (state .[[PromiseCapability]] .[[Reject]] , undefined , « moduleCompletion .[[Value]] ») を実行する。 unused を返す。
16.2.1.6.1.2 Link ( )
a Cyclic Module Record module の具象メソッド Link 。引数なし。戻り値:(正常完了 (値:unused ) または throw 完了 )。 成功すると、Link はこのモジュールの [[Status]] を unlinked から linked に遷移させます。失敗すると例外がスローされ、このモジュールの [[Status]] は unlinked のままです。(作業の大部分は補助関数 InnerModuleLinking によって行われます。) 呼び出されると、次の手順を実行する。
表明 : module .[[Status]] は unlinked 、linked 、evaluating-async 、または evaluated のいずれかである。stack を新しい空の List とする。result を Completion (InnerModuleLinking (module , stack , 0)) とする。result が中断完了 である場合、stack の各 Cyclic Module Record requiredModule について、次を行う。表明 : requiredModule .[[Status]] は linking である。requiredModule .[[Status]] を unlinked に設定する。表明 : module .[[Status]] は unlinked である。? result を返す。 表明 : module .[[Status]] は linked 、evaluating-async 、または evaluated のいずれかである。表明 : stack は空である。unused を返す。
16.2.1.6.1.2.1 InnerModuleLinking ( module , stack , index )
抽象操作 InnerModuleLinking。引数 module (Moduleレコード )、stack (リスト (要素:Cyclic Moduleレコード )) および index (非負整数)。戻り値:(正常完了 (値:非負整数) または throw 完了 )。 Link によって、module に対する実際のリンク処理と、依存関係グラフ内の他のすべてのモジュールに対する再帰的なリンク処理を実行するために使用されます。stack および index パラメーターと、モジュールの [[DFSAncestorIndex]] フィールドは、深さ優先探索(DFS)の走査を追跡します。特に、[[DFSAncestorIndex]] は強連結成分(SCC)を検出するために使用され、SCC 内のすべてのモジュールがまとめて linked に遷移するようにします。 呼び出されると、次の手順を実行する。
module が Cyclic Module Record でない場合、? module .Link () を実行する。 index を返す。module .[[Status]] が linking 、linked 、evaluating-async 、または evaluated のいずれかである場合、index を返す。表明 : module .[[Status]] は unlinked である。module .[[Status]] を linking に設定する。moduleIndex を index とする。module .[[DFSAncestorIndex]] を index に設定する。index を index + 1 に設定する。module を stack に追加する。module .[[RequestedModules]] の各 ModuleRequest Record request について、次を行う。requiredModule を GetImportedModule (module , request ) とする。index を ? InnerModuleLinking (requiredModule , stack , index ) に設定する。requiredModule が Cyclic Module Record である場合、表明 : requiredModule .[[Status]] は linking 、linked 、evaluating-async 、または evaluated のいずれかである。表明 : requiredModule .[[Status]] が linking であることと、stack が requiredModule を含むことは同値である。requiredModule .[[Status]] が linking である場合、module .[[DFSAncestorIndex]] を min (module .[[DFSAncestorIndex]] , requiredModule .[[DFSAncestorIndex]] ) に設定する。? module .InitializeEnvironment () を実行する。 表明 : module は stack 内に正確に1回現れる。表明 : module .[[DFSAncestorIndex]] ≤ moduleIndex 。module .[[DFSAncestorIndex]] = moduleIndex である場合、done を false とする。done が false の間、次を繰り返す。requiredModule を stack の最後の要素とする。stack の最後の要素を削除する。表明 : requiredModule は Cyclic Module Record である。requiredModule .[[Status]] を linked に設定する。requiredModule と module が同じ Module Record である場合、done を true に設定する。index を返す。
16.2.1.6.1.3 Evaluate ( )
a Cyclic Module Record module の具象メソッド Evaluate 。引数なし。戻り値:Promise。 Evaluate はこのモジュールの [[Status]] を linked から evaluating-async または evaluated のいずれかへ遷移させます。特定の強連結成分内のモジュールに対して最初に呼び出されたとき、Evaluate は、モジュールの評価が完了したときに解決する Promise を作成して返します。この Promise は、その成分の [[CycleRoot]] の [[TopLevelCapability]] フィールドに保存されます。成分内の任意のモジュールに対する以後の Evaluate 呼出しは、同じ Promise を返します。(作業の大部分は補助関数 InnerModuleEvaluation によって行われます。) 呼び出されると、次の手順を実行する。
表明 : この Evaluate の呼出しは、周囲の agent 内の別の Evaluate 呼出しと同時には発生していない。表明 : module .[[Status]] は linked 、evaluating-async 、または evaluated のいずれかである。module .[[Status]] が evaluating-async または evaluated のいずれかである場合、module .[[CycleRoot]] が empty でない場合、module を module .[[CycleRoot]] に設定する。そうでない場合、表明 : module .[[Status]] は evaluated であり、module .[[EvaluationError]] はスロー完了である。 module .[[TopLevelCapability]] が empty でない場合、module .[[TopLevelCapability]] .[[Promise]] を返す。stack を新しい空の List とする。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。module .[[TopLevelCapability]] を promiseCapability に設定する。result を Completion (InnerModuleEvaluation (module , stack , 0)) とする。result が中断完了 である場合、stack の各 Cyclic Module Record requiredModule について、次を行う。表明 : requiredModule .[[Status]] は evaluating である。requiredModule .[[Status]] を evaluated に設定する。requiredModule .[[EvaluationError]] を result に設定する。表明 : module .[[Status]] は evaluated である。表明 : module .[[EvaluationError]] と result は同じ Completion Record である。! Call (promiseCapability .[[Reject]] , undefined , « result .[[Value]] ») を実行する。 そうでない場合、表明 : module .[[Status]] は evaluating-async または evaluated のいずれかである。表明 : module .[[EvaluationError]] は empty である。module .[[Status]] が evaluated である場合、表明 : module .[[AsyncEvaluationOrder]] は unset または done のいずれかである。注記 : module がすでに評価済みであり、その評価が非同期であった場合に限り、module .[[AsyncEvaluationOrder]] は done である。! Call (promiseCapability .[[Resolve]] , undefined , « undefined ») を実行する。 表明 : stack は空である。 promiseCapability .[[Promise]] を返す。
16.2.1.6.1.3.1 InnerModuleEvaluation ( module , stack , index )
抽象操作 InnerModuleEvaluation。引数 module (Moduleレコード )、stack (リスト (要素:Cyclic Moduleレコード )) および index (非負整数)。戻り値:(正常完了 (値:非負整数) または throw 完了 )。 Evaluate によって、module に対する実際の評価処理と、依存関係グラフ内の他のすべてのモジュールに対する再帰的な評価処理を実行するために使用されます。stack および index パラメーターと module の [[DFSAncestorIndex]] フィールドは、InnerModuleLinking と同じ方法で使用されます。 呼び出されると、次の手順を実行する。
module が Cyclic Module Record でない場合、? EvaluateModuleSync (module ) を実行する。 index を返す。module .[[Status]] が evaluating-async または evaluated のいずれかである場合、module .[[EvaluationError]] が empty である場合、index を返す。? module .[[EvaluationError]] を返す。 module .[[Status]] が evaluating である場合、index を返す。表明 : module .[[Status]] は linked である。module .[[Status]] を evaluating に設定する。moduleIndex を index とする。module .[[DFSAncestorIndex]] を index に設定する。module .[[PendingAsyncDependencies]] を 0 に設定する。index を index + 1 に設定する。module を stack に追加する。module .[[RequestedModules]] の各 ModuleRequest Record request について、次を行う。requiredModule を GetImportedModule (module , request ) とする。index を ? InnerModuleEvaluation (requiredModule , stack , index ) に設定する。requiredModule が Cyclic Module Record である場合、表明 : requiredModule .[[Status]] は evaluating 、evaluating-async 、または evaluated のいずれかである。表明 : requiredModule .[[Status]] が evaluating であることと、stack が requiredModule を含むことは同値である。requiredModule .[[Status]] が evaluating である場合、module .[[DFSAncestorIndex]] を min (module .[[DFSAncestorIndex]] , requiredModule .[[DFSAncestorIndex]] ) に設定する。そうでない場合、requiredModule を requiredModule .[[CycleRoot]] に設定する。表明 : requiredModule .[[Status]] は evaluating-async または evaluated のいずれかである。requiredModule .[[EvaluationError]] が empty でない場合、? requiredModule .[[EvaluationError]] を返す。 requiredModule .[[AsyncEvaluationOrder]] が整数 である場合、module .[[PendingAsyncDependencies]] を module .[[PendingAsyncDependencies]] + 1 に設定する。module を requiredModule .[[AsyncParentModules]] に追加する。module .[[HasTLA]] が true であるか、module .[[PendingAsyncDependencies]] > 0 である場合、表明 : module .[[AsyncEvaluationOrder]] は unset である。module .[[AsyncEvaluationOrder]] を IncrementModuleAsyncEvaluationCount () に設定する。module .[[PendingAsyncDependencies]] = 0 である場合、ExecuteAsyncModule (module ) を実行する。そうでない場合、? module .ExecuteModule () を実行する。 表明 : module は stack 内に正確に1回現れる。表明 : module .[[DFSAncestorIndex]] ≤ moduleIndex 。module .[[DFSAncestorIndex]] = moduleIndex である場合、done を false とする。done が false の間、次を繰り返す。requiredModule を stack の最後の要素とする。stack の最後の要素を削除する。表明 : requiredModule は Cyclic Module Record である。表明 : requiredModule .[[AsyncEvaluationOrder]] は整数 または unset のいずれかである。requiredModule .[[AsyncEvaluationOrder]] が unset である場合、requiredModule .[[Status]] を evaluated に設定する。そうでない場合、requiredModule .[[Status]] を evaluating-async に設定する。 requiredModule と module が同じ Module Record である場合、done を true に設定する。requiredModule .[[CycleRoot]] を module に設定する。index を返す。
注 1
モジュールは InnerModuleEvaluation によって走査されている間は evaluating です。実行が完了すると evaluated になり、[[HasTLA]] フィールドが true である場合、または非同期依存関係を持つ場合は、実行中に evaluating-async になります。
注 2
非同期サイクルのモジュールに依存するモジュールは、そのサイクルが evaluating でない場合、代わりに [[CycleRoot]] を介してサイクルのルートの実行に依存します。これにより、サイクルの状態を、そのルートモジュールの状態を通じて単一の強連結成分として扱うことができます。
16.2.1.6.1.3.2 ExecuteAsyncModule ( module )
抽象操作 ExecuteAsyncModule。引数 module (Cyclic Moduleレコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : module .[[Status]] は evaluating または evaluating-async のいずれかである。表明 : module .[[HasTLA]] は true である。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。fulfilledClosure を、パラメーターを持たず、module を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。AsyncModuleExecutionFulfilled (module ) を実行する。NormalCompletion (undefined ) を返す。onFulfilled を CreateBuiltinFunction (fulfilledClosure , 0, "" , « ») とする。rejectedClosure を、パラメーター (error ) を持ち、module を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。AsyncModuleExecutionRejected (module , error ) を実行する。NormalCompletion (undefined ) を返す。onRejected を CreateBuiltinFunction (rejectedClosure , 0, "" , « ») とする。PerformPromiseThen (promiseCapability .[[Promise]] , onFulfilled , onRejected ) を実行する。! module .ExecuteModule (promiseCapability ) を実行する。 unused を返す。
16.2.1.6.1.3.3 GatherAvailableAncestors ( module , execList )
抽象操作 GatherAvailableAncestors。引数 module (Cyclic Moduleレコード ) および execList (リスト (要素:Cyclic Moduleレコード ))。戻り値:unused 。 呼び出されると、次の手順を実行する。
module .[[AsyncParentModules]] の各 Cyclic Module Record ancestorModule について、次を行う。execList が ancestorModule を含まず、かつ ancestorModule .[[CycleRoot]] .[[EvaluationError]] が empty である場合、表明 : ancestorModule .[[Status]] は evaluating-async である。表明 : ancestorModule .[[EvaluationError]] は empty である。表明 : ancestorModule .[[AsyncEvaluationOrder]] は整数 である。表明 : ancestorModule .[[PendingAsyncDependencies]] > 0。ancestorModule .[[PendingAsyncDependencies]] を ancestorModule .[[PendingAsyncDependencies]] - 1 に設定する。ancestorModule .[[PendingAsyncDependencies]] = 0 である場合、ancestorModule を execList に追加する。ancestorModule .[[HasTLA]] が false である場合、GatherAvailableAncestors (ancestorModule , execList ) を実行する。unused を返す。
注
ルート module の非同期実行が fulfilled になると、この関数は、この完了時に同期的にまとめて実行できるモジュールのリストを決定し、それらを execList に格納します。
16.2.1.6.1.3.4 AsyncModuleExecutionFulfilled ( module )
抽象操作 AsyncModuleExecutionFulfilled。引数 module (Cyclic Moduleレコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
module .[[Status]] が evaluated である場合、表明 : module .[[EvaluationError]] は empty ではない。unused を返す。表明 : module .[[Status]] は evaluating-async である。表明 : module .[[AsyncEvaluationOrder]] は整数 である。表明 : module .[[EvaluationError]] は empty である。module .[[AsyncEvaluationOrder]] を done に設定する。module .[[Status]] を evaluated に設定する。module .[[TopLevelCapability]] が empty でない場合、表明 : module .[[CycleRoot]] と module は同じ Module Record である。! Call (module .[[TopLevelCapability]] .[[Resolve]] , undefined , « undefined ») を実行する。 execList を新しい空の List とする。GatherAvailableAncestors (module , execList ) を実行する。表明 : execList のすべての要素は、[[AsyncEvaluationOrder]] フィールドが整数 に設定され、[[PendingAsyncDependencies]] フィールドが 0 に設定され、[[EvaluationError]] フィールドが empty に設定されている。sortedExecList を、execList の要素を [[AsyncEvaluationOrder]] フィールドの昇順で並べ替えた List とする。sortedExecList の各 Cyclic Module Record ancestorModule について、次を行う。ancestorModule .[[Status]] が evaluated である場合、表明 : ancestorModule .[[EvaluationError]] は empty ではない。そうでなく、ancestorModule .[[HasTLA]] が true である場合、ExecuteAsyncModule (ancestorModule ) を実行する。 そうでない場合、result を Completion (ancestorModule .ExecuteModule () ) とする。result が中断完了 である場合、AsyncModuleExecutionRejected (ancestorModule , result .[[Value]] ) を実行する。そうでない場合、ancestorModule .[[AsyncEvaluationOrder]] を done に設定する。ancestorModule .[[Status]] を evaluated に設定する。ancestorModule .[[TopLevelCapability]] が empty でない場合、表明 : ancestorModule .[[CycleRoot]] と ancestorModule は同じ Module Record である。! Call (ancestorModule .[[TopLevelCapability]] .[[Resolve]] , undefined , « undefined ») を実行する。 unused を返す。
16.2.1.6.1.3.5 AsyncModuleExecutionRejected ( module , error )
抽象操作 AsyncModuleExecutionRejected。引数 module (Cyclic Moduleレコード ) および error (ECMAScript 言語値 )。戻り値:unused 。 呼び出されると、次の手順を実行する。
module .[[Status]] が evaluated である場合、表明 : module .[[EvaluationError]] は empty ではない。unused を返す。表明 : module .[[Status]] は evaluating-async である。表明 : module .[[AsyncEvaluationOrder]] は整数 である。表明 : module .[[EvaluationError]] は empty である。module .[[EvaluationError]] を ThrowCompletion (error ) に設定する。module .[[Status]] を evaluated に設定する。module .[[AsyncEvaluationOrder]] を done に設定する。注記 : module .[[AsyncEvaluationOrder]] は AsyncModuleExecutionFulfilled との対称性のために done に設定される。InnerModuleEvaluation では、モジュールの [[EvaluationError]] 内部スロットが empty でない場合、その [[AsyncEvaluationOrder]] 内部スロットの値は使用されない。module .[[TopLevelCapability]] が empty でない場合、表明 : module .[[CycleRoot]] と module は同じ Module Record である。! Call (module .[[TopLevelCapability]] .[[Reject]] , undefined , « error ») を実行する。 module .[[AsyncParentModules]] の各 Cyclic Module Record ancestorModule について、次を行う。AsyncModuleExecutionRejected (ancestorModule , error ) を実行する。unused を返す。
16.2.1.6.2 Cyclic Module Record グラフの例
この非規範的な節では、一般的なモジュールグラフのリンクと評価について、特にエラーがどのように発生し得るかに重点を置いた一連の例を示します。
まず、次の単純なモジュールグラフを考えます。
図 2: 単純なモジュールグラフ
まず、エラー条件がないものと仮定します。ホスト が最初に A .LoadRequestedModules () を呼び出すと、仮定により正常に完了し、B と C の依存関係(それぞれ 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 () が正常に呼び出された後にリンクエラーが発生する場合を考えます。C の InnerModuleLinking は成功するものの、その後 B について失敗した場合、たとえば C が提供していないものをインポートしている場合、元の A .Link () は失敗し、A と B の [[Status]] はどちらも unlinked のままです。ただし、C の [[Status]] は linked になっています。
最後に、Link () の呼出しが成功した後に評価エラーが発生する場合を考えます。C の InnerModuleEvaluation は成功するものの、その後 B について失敗した場合、たとえば B が例外をスローするコードを含む場合、元の A .Evaluate () は失敗し、拒否された Promise を返します。結果として生じる例外は A と B の両方の [[EvaluationError]] フィールドに記録され、それらの [[Status]] は evaluated になります。C も evaluated になりますが、評価が正常に完了したため、A と B とは異なり [[EvaluationError]] を持たないままです。例外を保存することで、ホスト が A または B の Evaluate () メソッドを呼び出して再利用しようとするたびに、同じ例外に遭遇することが保証されます。(ホスト は Cyclic Module Record を再利用する必要はありません。同様に、ホスト はこれらのメソッドによってスローされた例外オブジェクトを公開する必要もありません。ただし、仕様はそのような使用を可能にしています。)
次に、別の種類のエラー条件を考えます。
図 3: 解決不能なモジュールを含むモジュールグラフ
このシナリオでは、モジュール A は別のモジュールへの依存関係を宣言していますが、そのモジュールに対応する Module Record が存在しません。つまり、HostLoadImportedModule はそのモジュールを要求されたとき、例外を伴って FinishLoadingImportedModule を呼び出します。これは、対応するリソースが存在しない、またはリソースは存在するものの、その結果のソーステキストを構文解析しようとしたときに ParseModule が何らかのエラーを返すなど、さまざまな理由で発生し得ます。ホスト は、FinishLoadingImportedModule に渡す完了を介して失敗原因を公開することを選択できます。いずれの場合も、この例外によって読み込みが失敗し、その結果 A の [[Status]] は new のままです。
ここでの読み込み、リンク、および評価エラーの違いは、次の特性によるものです。
評価は副作用を引き起こす可能性があるため、一度だけ実行しなければなりません。そのため、失敗した場合でも評価がすでに実行されたかどうかを記憶しておくことが重要です。(エラーの場合は、例外も記憶しておくのが合理的です。そうしなければ、以後の Evaluate () 呼出しで新しい例外を合成しなければならなくなるためです。)
一方、リンクには副作用がないため、失敗した場合でも後で問題なく再試行できます。
読み込みはホスト と密接に相互作用するため、一部のホスト では失敗した読み込みをユーザーが再試行できるようにすることが望ましい場合があります(たとえば、失敗が一時的なネットワーク状態の悪化による場合)。
次に、サイクルを持つモジュールグラフを考えます。
図 4: 循環モジュールグラフ
ここではエントリポイントがモジュール A であると仮定するため、ホスト は A .LoadRequestedModules () を呼び出し、A に対して InnerModuleLoading を実行します。これはさらに B と C に対して InnerModuleLoading を呼び出します。サイクルがあるため、これによって A に対する InnerModuleLoading が再び発生しますが、この時点では、この LoadRequestedModules 処理中に A の依存関係の読み込みがすでに開始されているため、何も行いません。グラフ内のすべてのモジュールが正常に読み込まれると、それらの [[Status]] は同時に new から unlinked へ遷移します。
次にホスト は A .Link () を呼び出し、A に対して InnerModuleLinking を実行します。これはさらに B に対して InnerModuleLinking を呼び出します。サイクルがあるため、これによって A に対する InnerModuleLinking が再び発生しますが、この時点では A .[[Status]] がすでに linking であるため、何も行いません。制御が A に戻り、C に対して InnerModuleLinking が開始される時点でも、B .[[Status]] 自体は linking のままです。C .[[Status]] が linked となって戻った後、A と B はまとめて linking から linked に遷移します。これは、それらが強連結成分を形成しているため意図された動作です。この段階ではモジュールグラフが深さ優先探索によって走査されるため、同じ SCC 内のモジュールの status を同時に遷移させることができます。
循環モジュールグラフの評価段階でも、成功する場合は同様のことが起こります。
次に、A にリンクエラーがある場合を考えます。たとえば、存在しない束縛を C からインポートしようとする場合です。この場合でも、A に対する InnerModuleLinking の2回目の呼出しからの早期 return を含め、上記の手順はそのまま発生します。ただし、元の A に対する InnerModuleLinking まで巻き戻ると、InitializeEnvironment 中、具体的には C .ResolveExport () の直後で失敗します。スローされた SyntaxError 例外は A .Link まで伝播し、その stack に現在存在するすべてのモジュール(これらは常にまだ linking であるモジュールと正確に一致します)をリセットします。したがって、A と B はどちらも unlinked になります。C は linked のままであることに注意してください。
あるいは、A に評価エラーがある場合、たとえばそのソースコードが例外をスローする場合を考えます。この場合も、A に対する InnerModuleEvaluation の2回目の呼出しからの早期 return を含め、上記に対応する評価時の手順が発生します。ただし、元の A に対する InnerModuleEvaluation まで巻き戻ると、仮定により失敗します。スローされた例外は A .Evaluate () まで伝播し、その stack に現在存在するすべてのモジュール(すなわち、まだ evaluating であるモジュール)と、AsyncModuleExecutionRejected アルゴリズムを介して依存関係グラフ全体にわたってトップレベル await を含む、またはそれに依存するモジュールの連鎖を形成する [[AsyncParentModules]] にエラーを記録します。したがって、A と B はどちらも evaluated になり、例外が A と B の両方の [[EvaluationError]] フィールドに記録されます。一方、C は [[EvaluationError]] を持たない evaluated のままです。
最後に、すべてのモジュールが非同期に完了する、サイクルを持つモジュールグラフを考えます。
図 5: 非同期の循環モジュールグラフ
読み込みとリンクは以前と同様に行われ、すべてのモジュールの [[Status]] は最終的に linked に設定されます。
A .Evaluate () を呼び出すと、A 、B 、D に対して InnerModuleEvaluation が呼び出され、それらはすべて evaluating に遷移します。次に A に対して InnerModuleEvaluation が再び呼び出されますが、すでに evaluating であるため何も行いません。この時点で D .[[PendingAsyncDependencies]] は 0 なので、ExecuteAsyncModule (D ) が呼び出され、D の非同期実行を追跡する新しい PromiseCapability とともに D .ExecuteModule を呼び出します。B に対する InnerModuleEvaluation まで巻き戻り、B .[[PendingAsyncDependencies]] を 1、B .[[AsyncEvaluationOrder]] を 1 に設定します。元の A に対する InnerModuleEvaluation まで巻き戻り、A .[[PendingAsyncDependencies]] を 1 に設定します。A の依存関係に対するループの次の反復では、C に対して InnerModuleEvaluation を呼び出し、その結果 D (再び何も行わない)と E に対しても呼び出します。E は依存関係を持たず、サイクルの一部でもないため、D と同様に ExecuteAsyncModule (E ) を呼び出し、E は直ちにスタックから削除されます。再び C に対する InnerModuleEvaluation まで巻き戻り、C .[[AsyncEvaluationOrder]] を 3 に設定します。ここで A の依存関係に対するループを終了し、A .[[AsyncEvaluationOrder]] を 4 に設定し、強連結成分全体をスタックから削除し、すべてのモジュールを一度に evaluating-async に遷移させます。この時点で、モジュールのフィールドは 表 44 に示すとおりです。
表 44: 最初の Evaluate () 呼出し後のモジュールフィールド
フィールド
モジュール
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 (B and C )
1 (D )
2 (D and E )
0
0
E が最初に実行を完了すると仮定します。そうなると AsyncModuleExecutionFulfilled が呼び出され、E .[[Status]] は evaluated に設定され、C .[[PendingAsyncDependencies]] はデクリメントされて 1 になります。更新されたモジュールのフィールドは 表 45 に示すとおりです。
表 45: モジュール E の実行完了後のモジュールフィールド
フィールド
モジュール
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 ([[AsyncEvaluationOrder]] が 3)であるため、B が先に処理されます。B .[[PendingAsyncDependencies]] はデクリメントされて 0 になり、B に対して ExecuteAsyncModule が呼び出され、実行を開始します。C .[[PendingAsyncDependencies]] もデクリメントされて 0 になり、C が実行を開始します(B が await を含む場合、B と並行して実行される可能性があります)。更新されたモジュールのフィールドは 表 46 に示すとおりです。
表 46: モジュール D の実行完了後のモジュールフィールド
フィールド
モジュール
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]] は evaluated に設定され、A .[[PendingAsyncDependencies]] はデクリメントされて 1 になります。更新されたモジュールのフィールドは 表 47 に示すとおりです。
表 47: モジュール C の実行完了後のモジュールフィールド
フィールド
モジュール
A
C
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
4
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
1 (B )
0
次に B が実行を完了します。そうなると AsyncModuleExecutionFulfilled が再び呼び出され、B .[[Status]] は evaluated に設定されます。A .[[PendingAsyncDependencies]] はデクリメントされて 0 になるため、ExecuteAsyncModule が呼び出され、A が実行を開始します。更新されたモジュールのフィールドは 表 48 に示すとおりです。
表 48: モジュール B の実行完了後のモジュールフィールド
フィールド
モジュール
A
B
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
4
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
0
0
最後に A が実行を完了します。そうなると AsyncModuleExecutionFulfilled が再び呼び出され、A .[[Status]] は evaluated に設定されます。この時点で、A .[[TopLevelCapability]] 内の Promise(A .Evaluate () から返されたもの)が解決され、このモジュールグラフの処理は終了します。更新されたモジュールのフィールドは 表 49 に示すとおりです。
表 49: モジュール A の実行完了後のモジュールフィールド
フィールド
モジュール
A
[[DFSAncestorIndex]]
0
[[Status]]
evaluated
[[AsyncEvaluationOrder]]
done
[[AsyncParentModules]]
« »
[[PendingAsyncDependencies]]
0
代わりに、B が実行を完了する前に C の実行が失敗してエラーを返す失敗ケースを考えます。そうなると AsyncModuleExecutionRejected が呼び出され、C .[[Status]] を evaluated に、C .[[EvaluationError]] をそのエラーに設定します。次に、各 AsyncParentModules に対して AsyncModuleExecutionRejected を実行することによって、このエラーをすべての AsyncParentModules に伝播します。更新されたモジュールのフィールドは 表 50 に示すとおりです。
表 50: モジュール C がエラーで終了した後のモジュールフィールド
フィールド
モジュール
A
C
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluated
evaluated
[[AsyncEvaluationOrder]]
done
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
1 (B )
0
[[EvaluationError]]
empty
C の評価エラー
C が C のエラーを指定して A に対して AsyncModuleExecutionRejected を呼び出すため、A は C と同じエラーで拒否されます。A .[[Status]] は evaluated に設定されます。この時点で、A .[[TopLevelCapability]] 内の Promise(A .Evaluate () から返されたもの)が拒否されます。更新されたモジュールのフィールドは 表 51 に示すとおりです。
表 51: モジュール A が拒否された後のモジュールフィールド
フィールド
モジュール
A
[[DFSAncestorIndex]]
0
[[Status]]
evaluated
[[AsyncEvaluationOrder]]
done
[[AsyncParentModules]]
« »
[[PendingAsyncDependencies]]
0
[[EvaluationError]]
C の評価エラー
その後、B はエラーなく実行を完了します。そうなると AsyncModuleExecutionFulfilled が再び呼び出され、B .[[Status]] は evaluated に設定されます。B に対して GatherAvailableAncestors が呼び出されます。ただし、A .[[CycleRoot]] は A であり、評価エラーを持っているため、返される sortedExecList には追加されず、AsyncModuleExecutionFulfilled はそれ以上処理せずに戻ります。以後の B のインポーターは、サイクルルート A に設定された C の評価エラーから、B .[[CycleRoot]] .[[EvaluationError]] の拒否を解決します。更新されたモジュールのフィールドは 表 52 に示すとおりです。
表 52: エラーのあるグラフでモジュール B の実行が完了した後のモジュールフィールド
フィールド
モジュール
A
B
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluated
evaluated
[[AsyncEvaluationOrder]]
4
1
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
0
0
[[EvaluationError]]
C の評価エラー
empty
16.2.1.7 Source Text Module Record
Source Text Module Record は、目標記号 Module を使用して構文解析された ECMAScript ソーステキスト (11 )から定義されたモジュールに関する情報を表すために使用されます。そのフィールドには、モジュールによってインポートおよびエクスポートされる名前について整理された情報が含まれ、その具象メソッドはこれらの情報を使用してモジュールをリンクおよび評価します。
Source Text Module Record は、抽象 Module Record 型の他のサブクラスとともにモジュールグラフ内に存在でき、Cyclic Module Record 型の他のサブクラスとサイクルに参加できます。
表 41 で定義されるフィールドに加えて、Source Text Module Record は 表 53 に列挙される追加のフィールドを持ちます。これらの各フィールドは、最初に ParseModule で設定されます。
表 53: Source Text Module Record の追加フィールド
フィールド名
値の型
意味
[[ECMAScriptCode]]
a Parse Node
Module を目標記号としてこのモジュールのソーステキストを構文解析した結果。
[[Context]]
an ECMAScript code execution context or empty
このモジュールに関連付けられた実行コンテキスト 。モジュールの環境が初期化されるまでは empty 。
[[ImportMeta]]
an Object or empty
import.meta メタプロパティを通じて公開されるオブジェクト。ECMAScript コードからアクセスされるまでは empty 。
[[ImportEntries]]
a List of ImportEntry Records
このモジュールのコードから導出された ImportEntry record の List 。
[[LocalExportEntries]]
a List of ExportEntry Records
このモジュール内で発生する宣言に対応する、このモジュールのコードから導出された ExportEntry record の List 。
[[IndirectExportEntries]]
a List of ExportEntry Records
このモジュール内で発生する再エクスポートされたインポート、または export * as namespace 宣言からのエクスポートに対応する、このモジュールのコードから導出された ExportEntry record の List 。
[[StarExportEntries]]
a List of ExportEntry Records
export * as namespace 宣言を含まず、このモジュール内で発生する export * 宣言に対応する、このモジュールのコードから導出された ExportEntry record の List 。
ImportEntry Record は、単一の宣言的インポートに関する情報を整理した Record です。各 ImportEntry Record は 表 54 で定義されるフィールドを持ちます。
表 54: ImportEntry Record のフィールド
注 1
表 55 は、構文上のインポート形式を表すために使用される ImportEntry record のフィールドの例を示します。
表 55 (参考): インポート形式から ImportEntry Record への対応
import 文の形式
[[ModuleRequest]]
[[ImportName]]
[[LocalName]]
import v from "mod";
"mod"
"default"
"v"
import * as ns from "mod";
"mod"
namespace
"ns"
import {x} from "mod";
"mod"
"x"
"x"
import {x as v} from "mod";
"mod"
"x"
"v"
import "mod";
ImportEntry Record は作成されません。
ExportEntry Record は、単一の宣言的エクスポートに関する情報を整理した Record です。各 ExportEntry Record は 表 56 で定義されるフィールドを持ちます。
表 56: ExportEntry Record のフィールド
注 2
表 57 は、構文上のエクスポート形式を表すために使用される ExportEntry record のフィールドの例を示します。
表 57 (参考): エクスポート形式から 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"
namespace
null
次の定義は、Source Text Module Record に必要な具象メソッドおよびその他の抽象操作 を規定します。
16.2.1.7.1 ParseModule ( sourceText , realm , hostDefined )
抽象操作 ParseModule。引数 sourceText ((String または a sequence of Unicode code points))、realm (Realmレコード ) および hostDefined (任意の値)。戻り値:(Source Text Moduleレコード または a non-empty List of SyntaxError objects)。 sourceText を Module として構文解析した結果に基づいて Source Text Module Record を作成します。 呼び出されると、次の手順を実行する。
body を ParseText (sourceText , Module ) とする。body がエラーの List である場合、body を返す。requestedModules を body の ModuleRequests とする。importEntries を body の ImportEntries とする。importedBoundNames を ImportedLocalNames (importEntries ) とする。indirectExportEntries を新しい空の List とする。localExportEntries を新しい空の List とする。starExportEntries を新しい空の List とする。exportEntries を body の ExportEntries とする。exportEntries の各 ExportEntry Record exportEntry について、次を行う。exportEntry .[[ModuleRequest]] が null である場合、importedBoundNames が exportEntry .[[LocalName]] を含まない場合、exportEntry を localExportEntries に追加する。そうでない場合、注記 : 元々別のモジュールからインポートされた束縛または namespace オブジェクトをエクスポートする場合、ExportEntry Record は、その束縛または namespace オブジェクトがインポート後にエクスポートされたのではなく、元のモジュールから直接再エクスポートされた場合と同じ形式になるよう書き換えられる。これにより、export * from を通じて同じ名前で同じ束縛または namespace を2回エクスポートすることから生じる競合 を、Source Text Module Record の ResolveExport 具象メソッド の手順 9.e.iii で曖昧として扱うのではなく無視できる。importEntry を、[[LocalName]] が exportEntry .[[LocalName]] である importEntries の要素とする。ExportEntry Record { [[ModuleRequest]] : importEntry .[[ModuleRequest]] , [[ImportName]] : importEntry .[[ImportName]] , [[LocalName]] : null , [[ExportName]] : exportEntry .[[ExportName]] } を indirectExportEntries に追加する。 そうでなく、exportEntry .[[ImportName]] が all-but-default である場合、表明 : exportEntry .[[ExportName]] は null である。exportEntry を starExportEntries に追加する。 そうでない場合、exportEntry を indirectExportEntries に追加する。 async を body Contains await とする。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 } を返す。
注
実装は、あるモジュールソーステキストについて ParseModule を評価する前に、そのソーステキストを構文解析し、早期エラー 条件について解析してもかまいません。ただし、エラーの報告は、この仕様が実際にそのソーステキストに対して ParseModule を実行する時点まで延期しなければなりません。
16.2.1.7.2 Module Record 抽象メソッドの実装
以下は、表 40 で定義された対応する Module Record 抽象メソッドを実装する Source Text Module Record の具象メソッドです。
16.2.1.7.2.1 GetExportedNames ( [ exportStarSet ] )
a Source Text Module Record module の具象メソッド GetExportedNames 。省略可能な引数 exportStarSet (リスト (要素:Source Text Moduleレコード ))。戻り値:リスト (要素:String)。 呼び出されると、次の手順を実行する。
表明 : module .[[Status]] は new ではない。exportStarSet が存在しない場合、exportStarSet を新しい空の List に設定する。exportStarSet が module を含む場合、表明 : export * の循環性の開始点に到達した。新しい空の List を返す。 module を exportStarSet に追加する。exportedNames を新しい空の List とする。module .[[LocalExportEntries]] の各 ExportEntry Record exportEntry について、次を行う。表明 : module はこのエクスポートに対する直接束縛を提供する。表明 : exportEntry .[[ExportName]] は null ではない。exportEntry .[[ExportName]] を exportedNames に追加する。module .[[IndirectExportEntries]] の各 ExportEntry Record exportEntry について、次を行う。表明 : module はこのエクスポートについて特定の束縛をインポートする。表明 : exportEntry .[[ExportName]] は null ではない。exportEntry .[[ExportName]] を exportedNames に追加する。module .[[StarExportEntries]] の各 ExportEntry Record exportEntry について、次を行う。表明 : exportEntry .[[ModuleRequest]] は null ではない。requestedModule を GetImportedModule (module , exportEntry .[[ModuleRequest]] ) とする。starNames を requestedModule .GetExportedNames (exportStarSet ) とする。starNames の各要素 name について、次を行う。name が "default" でない場合、exportedNames が name を含まない場合、name を exportedNames に追加する。exportedNames を返す。
注
GetExportedNames は、曖昧な star export 束縛を持つ名前を除外せず、それらについて例外もスローしません。
16.2.1.7.2.2 ResolveExport ( exportName [ , resolveSet ] )
a Source Text Module Record module の具象メソッド ResolveExport 。引数 exportName (String)および省略可能な引数 resolveSet (リスト (要素:レコード (フィールド:[[Module]] (Moduleレコード ), [[ExportName]] (String))))。戻り値:(ResolvedBindingレコード 、null または ambiguous )。
ResolveExport は、インポートされた束縛を、実際に定義しているモジュールとローカル束縛名へ解決しようとします。定義元モジュールは、このメソッドが呼び出された Module Record によって表されるモジュールである場合も、そのモジュールがインポートする別のモジュールである場合もあります。パラメーター resolveSet は、解決されない循環 import/export 経路を検出するために使用されます。特定の Module Record と exportName からなる組が、すでに resolveSet に存在する状態で再び到達された場合、インポートの循環性が発生しています。ResolveExport を再帰的に呼び出す前に、module と exportName からなる組が resolveSet に追加されます。
定義元モジュールが見つかった場合、ResolvedBinding Record { [[Module]] , [[BindingName]] } が返されます。この record は、元々要求されたエクスポートの解決済み束縛を識別します。ただし、これはローカル束縛を持たない namespace のエクスポートである場合を除きます。その場合、[[BindingName]] は namespace に設定されます。定義が見つからなかった場合、または要求が循環していると判定された場合は null が返されます。要求が曖昧であると判定された場合は ambiguous が返されます。
呼び出されると、次の手順を実行する。
表明 : module .[[Status]] は new ではない。resolveSet が存在しない場合、resolveSet を新しい空の List に設定する。resolveSet の各 Record { [[Module]] , [[ExportName]] } record について、次を行う。module と record .[[Module]] が同じ Module Record であり、exportName が record .[[ExportName]] である場合、表明 : これは循環インポート要求である。null を返す。Record { [[Module]] : module , [[ExportName]] : exportName } を resolveSet に追加する。module .[[LocalExportEntries]] の各 ExportEntry Record exportEntry について、次を行う。exportEntry .[[ExportName]] が exportName である場合、表明 : module はこのエクスポートに対する直接束縛を提供する。ResolvedBinding Record { [[Module]] : module , [[BindingName]] : exportEntry .[[LocalName]] } を返す。module .[[IndirectExportEntries]] の各 ExportEntry Record exportEntry について、次を行う。exportEntry .[[ExportName]] が exportName である場合、表明 : exportEntry .[[ModuleRequest]] は null ではない。importedModule を GetImportedModule (module , exportEntry .[[ModuleRequest]] ) とする。exportEntry .[[ImportName]] が namespace である場合、表明 : module はこのエクスポートに対する直接束縛を提供しない。ResolvedBinding Record { [[Module]] : importedModule , [[BindingName]] : namespace } を返す。表明 : module はこのエクスポートについて特定の束縛をインポートする。表明 : exportEntry .[[ImportName]] は String である。importedModule .ResolveExport (exportEntry .[[ImportName]] , resolveSet ) を返す。exportName が "default" である場合、表明 : default エクスポートはこのモジュールによって明示的に定義されていない。null を返す。注記 : default エクスポートを export * from "mod" 宣言によって提供することはできない。starResolution を null とする。module .[[StarExportEntries]] の各 ExportEntry Record exportEntry について、次を行う。表明 : exportEntry .[[ModuleRequest]] は null ではない。importedModule を GetImportedModule (module , exportEntry .[[ModuleRequest]] ) とする。resolution を importedModule .ResolveExport (exportName , resolveSet ) とする。resolution が ambiguous である場合、ambiguous を返す。resolution が null でない場合、表明 : resolution は ResolvedBinding Record である。starResolution が null である場合、starResolution を resolution に設定する。そうでない場合、表明 : 要求された名前を含む * エクスポートが複数存在する。resolution .[[Module]] と starResolution .[[Module]] が同じ Module Record でない場合、ambiguous を返す。resolution .[[BindingName]] が starResolution .[[BindingName]] でない場合、ambiguous を返す。 starResolution を返す。
16.2.1.7.3 Cyclic Module Record 抽象メソッドの実装
以下は、表 42 で定義された対応する Cyclic Module Record 抽象メソッドを実装する Source Text Module Record の具象メソッドです。
16.2.1.7.3.1 InitializeEnvironment ( )
a Source Text Module Record module の具象メソッド InitializeEnvironment 。引数なし。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
module .[[IndirectExportEntries]] の各 ExportEntry Record exportEntry について、次を行う。表明 : exportEntry .[[ExportName]] は null ではない。resolution を module .ResolveExport (exportEntry .[[ExportName]] ) とする。resolution が null または ambiguous のいずれかである場合、SyntaxError 例外をスローする。表明 : resolution は ResolvedBinding Record である。表明 : module からのすべての名前付きエクスポートは解決可能である。realm を module .[[Realm]] とする。表明 : realm は undefined ではない。envRecord を NewModuleEnvironment (realm .[[GlobalEnv]] ) とする。module .[[Environment]] を envRecord に設定する。module .[[ImportEntries]] の各 ImportEntry Record importEntry について、次を行う。importedModule を GetImportedModule (module , importEntry .[[ModuleRequest]] ) とする。importEntry .[[ImportName]] が namespace である場合、namespace を GetModuleNamespace (importedModule ) とする。! envRecord .CreateImmutableBinding (importEntry .[[LocalName]] , true ) を実行する。 ! envRecord .InitializeBinding (importEntry .[[LocalName]] , namespace ) を実行する。 そうでない場合、表明 : importEntry .[[ImportName]] は String である。resolution を importedModule .ResolveExport (importEntry .[[ImportName]] ) とする。resolution が null または ambiguous のいずれかである場合、SyntaxError 例外をスローする。resolution .[[BindingName]] が namespace である場合、namespace を GetModuleNamespace (resolution .[[Module]] ) とする。! envRecord .CreateImmutableBinding (importEntry .[[LocalName]] , true ) を実行する。 ! envRecord .InitializeBinding (importEntry .[[LocalName]] , namespace ) を実行する。 そうでない場合、CreateImportBinding (envRecord , importEntry .[[LocalName]] , resolution .[[Module]] , resolution .[[BindingName]] ) を実行する。 moduleContext を新しい ECMAScript コード実行コンテキスト とする。moduleContext の Function を null に設定する。表明 : module .[[Realm]] は undefined ではない。moduleContext の Realm を module .[[Realm]] に設定する。moduleContext の ScriptOrModule を module に設定する。moduleContext の VariableEnvironment を module .[[Environment]] に設定する。moduleContext の LexicalEnvironment を module .[[Environment]] に設定する。moduleContext の PrivateEnvironment を null に設定する。module .[[Context]] を moduleContext に設定する。moduleContext を実行コンテキストスタック にプッシュする。これで moduleContext が実行中の実行コンテキスト になる。code を module .[[ECMAScriptCode]] とする。variableDecls を code の VarScopedDeclarations とする。declaredVariableNames を新しい空の List とする。variableDecls の各要素 variableDecl について、次を行う。variableDecl の BoundNames の各要素 name について、次を行う。declaredVariableNames が name を含まない場合、! envRecord .CreateMutableBinding (name , false ) を実行する。 ! envRecord .InitializeBinding (name , undefined ) を実行する。 name を declaredVariableNames に追加する。lexicalDecls を code の LexicallyScopedDeclarations とする。privateEnv を null とする。lexicalDecls の各要素 lexicalDecl について、次を行う。lexicalDecl の BoundNames の各要素 name について、次を行う。lexicalDecl の IsConstantDeclaration が true である場合、! envRecord .CreateImmutableBinding (name , true ) を実行する。 そうでない場合、! envRecord .CreateMutableBinding (name , false ) を実行する。 lexicalDecl が FunctionDeclaration 、GeneratorDeclaration 、AsyncFunctionDeclaration 、または AsyncGeneratorDeclaration のいずれかである場合、funcObj を、引数 envRecord および privateEnv を指定した lexicalDecl の InstantiateFunctionObject とする。! envRecord .InitializeBinding (name , funcObj ) を実行する。 moduleContext を実行コンテキストスタック から削除する。unused を返す。
16.2.1.7.3.2 ExecuteModule ( [ capability ] )
a Source Text Module Record module の具象メソッド ExecuteModule 。省略可能な引数 capability (PromiseCapabilityレコード )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
表明 : module はリンクされており、そのモジュール環境内の宣言はインスタンス化済みである。moduleContext を module .[[Context]] とする。module .[[HasTLA]] が false である場合、表明 : capability は存在しない。env を module .[[Environment]] とする。実行中の実行コンテキスト を一時停止する。moduleContext を実行コンテキストスタック にプッシュする。これで moduleContext が実行中の実行コンテキスト になる。result を Completion (module .[[ECMAScriptCode]] の Evaluation ) とする。result を Completion (DisposeResources (env .[[DisposableResourceStack]] , result )) に設定する。moduleContext を一時停止し、実行コンテキストスタック から削除する。現在実行コンテキストスタック の先頭にあるコンテキストを、実行中の実行コンテキスト として再開する。 result が中断完了 である場合、? result を返す。 そうでない場合、表明 : capability は PromiseCapability Record である。AsyncBlockStart (capability , module .[[ECMAScriptCode]] , moduleContext ) を実行する。 unused を返す。
16.2.1.8 Synthetic Module Record
Synthetic Module Record は、仕様によって定義されるモジュールに関する情報を表すために使用されます。そのエクスポート名は作成時に静的に定義されますが、対応する値は SetSyntheticModuleExport を使用して時間の経過とともに変更できます。インポートも依存関係も持ちません。
注 Synthetic Module Record は、たとえば JSON モジュールや CSS モジュールなど、さまざまなモジュール型を定義するために使用できます。
表 39 で定義されるフィールドに加えて、Synthetic Module Record は 表 58 に列挙される追加のフィールドを持ちます。
表 58: Synthetic Module Record の追加フィールド
16.2.1.8.1 CreateDefaultExportSyntheticModule ( defaultExport )
抽象操作 CreateDefaultExportSyntheticModule。引数 defaultExport (ECMAScript 言語値 )。戻り値:Synthetic Moduleレコード 。 デフォルトエクスポートが defaultExport である Synthetic Module Record を作成します。 呼び出されると、次の手順を実行する。
realm を現在の Realm Record とする。setDefaultExport を、パラメーター (module ) を持ち、defaultExport を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。SetSyntheticModuleExport (module , "default" , defaultExport ) を実行する。NormalCompletion (unused ) を返す。Synthetic Module Record { [[Realm]] : realm , [[Environment]] : empty , [[Namespace]] : empty , [[HostDefined]] : undefined , [[ExportNames]] : « "default" », [[EvaluationSteps]] : setDefaultExport } を返す。
16.2.1.8.2 ParseJSONModule ( source )
抽象操作 ParseJSONModule。引数 source (String)。戻り値:(正常完了 (値:Synthetic Moduleレコード ) または throw 完了 )。 呼び出されると、次の手順を実行する。
parseResult を ? ParseJSON (source ) とする。CreateDefaultExportSyntheticModule (parseResult .[[Value]] ) を返す。
16.2.1.8.3 SetSyntheticModuleExport ( module , exportName , exportValue )
抽象操作 SetSyntheticModuleExport。引数 module (Synthetic Moduleレコード )、exportName (String) および exportValue (ECMAScript 言語値 )。戻り値:unused 。 Synthetic Module Record の既存のエクスポートについて、エクスポートされる値を設定または変更するために使用できます。 呼び出されると、次の手順を実行する。
表明 : module .[[ExportNames]] は exportName を含む。envRecord を module .[[Environment]] とする。表明 : envRecord は empty ではない。! envRecord .SetMutableBinding (exportName , exportValue , true ) を実行する。 unused を返す。
16.2.1.8.4 Module Record 抽象メソッドの実装
以下は、表 40 で定義された対応する Module Record 抽象メソッドを実装する Synthetic Module Record の具象メソッドです。
16.2.1.8.4.1 LoadRequestedModules ( [ hostDefined ] )
a Synthetic Module Record module の具象メソッド LoadRequestedModules 。省略可能な引数 hostDefined (任意の値)。戻り値:Promise。 呼び出されると、次の手順を実行する。
注記 : この LoadRequestedModules の実装は hostDefined を使用しない。! PromiseResolve (%Promise% , undefined ) を返す。
注
16.2.1.8.4.2 GetExportedNames ( [ exportStarSet ] )
a Synthetic Module Record module の具象メソッド GetExportedNames 。省略可能な引数 exportStarSet (リスト (要素:Source Text Moduleレコード ))。戻り値:リスト (要素:String)。 呼び出されると、次の手順を実行する。
注記 : この GetExportedNames の実装は exportStarSet を使用しない。module .[[ExportNames]] を返す。
16.2.1.8.4.3 ResolveExport ( exportName [ , resolveSet ] )
a Synthetic Module Record module の具象メソッド ResolveExport 。引数 exportName (String)および省略可能な引数 resolveSet (リスト (要素:レコード (フィールド:[[Module]] (Moduleレコード ), [[ExportName]] (String))))。戻り値:(ResolvedBindingレコード 、null または ambiguous )。 呼び出されると、次の手順を実行する。
注記 : この ResolveExport の実装は resolveSet を使用しない。module .[[ExportNames]] が exportName を含まない場合、null を返す。ResolvedBinding Record { [[Module]] : module , [[BindingName]] : exportName } を返す。
16.2.1.8.4.4 Link ( )
a Synthetic Module Record module の具象メソッド Link 。引数なし。戻り値:正常完了 (値:unused )。 呼び出されると、次の手順を実行する。
realm を module .[[Realm]] とする。envRecord を NewModuleEnvironment (realm .[[GlobalEnv]] ) とする。module .[[Environment]] を envRecord に設定する。module .[[ExportNames]] の各 String exportName について、次を行う。! envRecord .CreateMutableBinding (exportName , false ) を実行する。 ! envRecord .InitializeBinding (exportName , undefined ) を実行する。 NormalCompletion (unused ) を返す。
16.2.1.8.4.5 Evaluate ( )
a Synthetic Module Record module の具象メソッド Evaluate 。引数なし。戻り値:Promise。 呼び出されると、次の手順を実行する。
moduleContext を新しい ECMAScript コード実行コンテキスト とする。moduleContext の Function を null に設定する。moduleContext の Realm を module .[[Realm]] に設定する。moduleContext の ScriptOrModule を module に設定する。moduleContext の VariableEnvironment を module .[[Environment]] に設定する。moduleContext の LexicalEnvironment を module .[[Environment]] に設定する。実行中の実行コンテキスト を一時停止する。moduleContext を実行コンテキストスタック にプッシュする。これで moduleContext が実行中の実行コンテキスト になる。steps を module .[[EvaluationSteps]] とする。result を Completion (steps (module )) とする。moduleContext を一時停止し、実行コンテキストスタック から削除する。現在実行コンテキストスタック の先頭にあるコンテキストを、実行中の実行コンテキスト として再開する。 promiseCapability を ! NewPromiseCapability (%Promise% ) とする。IfAbruptRejectPromise (result , promiseCapability )。! Call (promiseCapability .[[Resolve]] , undefined , « undefined ») を実行する。 promiseCapability .[[Promise]] を返す。
16.2.1.9 GetImportedModule ( referrer , request )
抽象操作 GetImportedModule。引数 referrer (Cyclic Moduleレコード ) および request (ModuleRequestレコード )。戻り値:Moduleレコード 。 呼び出されると、次の手順を実行する。
records を、ModuleRequestsEqual (r , request ) が true となる referrer .[[LoadedModules]] の各 LoadedModuleRequest Record r からなる List とする。表明 : この抽象操作 を呼び出す前に referrer に対する LoadRequestedModules が正常に完了しているため、records は正確に1つの要素を持つ。record を records の唯一の要素とする。record .[[Module]] を返す。
16.2.1.10 HostLoadImportedModule ( referrer , moduleRequest , hostDefined , payload )
ホスト定義の抽象操作 HostLoadImportedModule。引数 referrer ((Scriptレコード 、Cyclic Moduleレコード または Realmレコード ))、moduleRequest (ModuleRequestレコード )、hostDefined (任意の値) および payload ((GraphLoadingStateレコード または PromiseCapabilityレコード ))。戻り値:unused 。
注 1
referrer が Realm Record になり得る場合の例として、Web ブラウザーホスト があります。そこで、ユーザーが次のようなコントロールをクリックした場合、
<button type ="button" onclick ="import('./foo.mjs')" > Click me</button >
import() 式が実行される時点では、アクティブなスクリプトまたはモジュール は存在しません。より一般的には、ホスト が null の ScriptOrModule 構成要素を持つ実行コンテキスト を実行コンテキストスタック にプッシュする任意の状況で、このことが発生し得ます。
HostLoadImportedModule の実装は、次の要件に適合しなければなりません。
ホスト環境 は、同期的または非同期的に FinishLoadingImportedModule (referrer , moduleRequest , payload , result ) を実行しなければなりません。ここで result は、読み込まれた Module Record を含む正常完了 またはスロー完了のいずれかです。
この操作が、次の条件を満たす2つの (referrer , moduleRequest ) の組について複数回呼び出された場合、
最初の referrer が2番目の referrer と同じである。
ModuleRequestsEqual (最初の moduleRequest , 2番目の moduleRequest ) が true である。
そして、result が正常完了 である FinishLoadingImportedModule (referrer , moduleRequest , payload , result ) を実行する場合、毎回同じ result を使用して FinishLoadingImportedModule (referrer , moduleRequest , payload , result ) を実行しなければなりません。
moduleRequest .[[Attributes]] が、entry .[[Key]] が "type" であり、entry .[[Value]] が "json" である項目 entry を持つ場合、ホスト環境 が FinishLoadingImportedModule (referrer , moduleRequest , payload , result ) を実行するとき、result は ParseJSONModule の呼出しによって返された Completion Record またはスロー完了のいずれかでなければなりません。
この操作は payload を、FinishLoadingImportedModule へそのまま渡される不透明な値として扱わなければなりません。
実際に実行される処理はホスト定義 ですが、通常は適切な Module Record を読み込むために必要な I/O 操作を実行することから構成されます。複数の異なる (referrer , moduleRequest .[[Specifier]] , moduleRequest .[[Attributes]] ) の三つ組が、同じ Module Record インスタンスへ対応付けられる場合があります。実際の対応付けの意味論はホスト定義 ですが、通常は対応付け処理の一部として specifier に正規化処理が適用されます。一般的な正規化処理には、相対パスおよび省略されたパス指定子の展開などの処理が含まれます。
注 2
上記のテキストは、type: "json" を指定してインポートされた場合(かつ HostLoadImportedModule が正常に完了する場合)にホスト が JSON モジュールをサポートすることを要求しますが、type: "json" なしでインポートされた場合にホスト が JSON モジュールをサポートすることを禁止するものではありません。
16.2.1.11 FinishLoadingImportedModule ( referrer , moduleRequest , payload , result )
抽象操作 FinishLoadingImportedModule。引数 referrer ((Scriptレコード 、Cyclic Moduleレコード または Realmレコード ))、moduleRequest (ModuleRequestレコード )、payload ((GraphLoadingStateレコード または PromiseCapabilityレコード )) および result ((正常完了 (値:Moduleレコード ) または throw 完了 ))。戻り値:unused 。 呼び出されると、次の手順を実行する。
result が正常完了 である場合、referrer .[[LoadedModules]] が、ModuleRequestsEqual (record , moduleRequest ) が true である LoadedModuleRequest Record record を含む場合、表明 : record .[[Module]] と result .[[Value]] は同じ Module Record である。そうでない場合、LoadedModuleRequest Record { [[Specifier]] : moduleRequest .[[Specifier]] , [[Attributes]] : moduleRequest .[[Attributes]] , [[Module]] : result .[[Value]] } を referrer .[[LoadedModules]] に追加する。 payload が GraphLoadingState Record である場合、ContinueModuleLoading (payload , result ) を実行する。そうでない場合、ContinueDynamicImport (payload , result ) を実行する。 unused を返す。
16.2.1.12 AllImportAttributesSupported ( attrs )
抽象操作 AllImportAttributesSupported。引数 attrs (リスト (要素:ImportAttributeレコード ))。戻り値:Boolean。 呼び出されると、次の手順を実行する。
supported を HostGetSupportedImportAttributes () とする。attrs の各 ImportAttribute Record attr について、次を行う。supported が attr .[[Key]] を含まない場合、false を返す。true を返す。
16.2.1.12.1 HostGetSupportedImportAttributes ( )
ホスト定義の抽象操作 HostGetSupportedImportAttributes。引数なし。戻り値:リスト (要素:String)。 ホスト環境 が、サポートするインポート属性を指定できるようにします。サポートされているキーを持つ属性だけがホスト へ提供されます。
HostGetSupportedImportAttributes の実装は、次の要件に適合しなければなりません。
サポートされる属性をそれぞれ示す String の List を返さなければなりません。
この操作が呼び出されるたびに、同じ内容を同じ順序で持つ同じ List を返さなければなりません。
HostGetSupportedImportAttributes の既定の実装は、新しい空の List を返すことです。
注 ホスト にすべての属性を渡してから、処理するものを
ホスト 自身に選択させるのではなく、サポートするインポート属性を
ホスト に指定させる目的は、サポートされていない属性が異なる
ホスト 間で一貫した方法で処理されることを保証するためです。
16.2.1.13 GetModuleNamespace ( module )
抽象操作 GetModuleNamespace。引数 module (instance of a concrete subclass of Moduleレコード )。戻り値:a Module Namespace Object。 module のエクスポートを表す Module Namespace Object を取得します。最初に要求されたときに遅延作成し、以後の取得のために module .[[Namespace]] に保存します。 呼び出されると、次の手順を実行する。
表明 : module が Cyclic Module Record である場合、module .[[Status]] は new でも unlinked でもない。namespace を module .[[Namespace]] とする。namespace が empty である場合、exportedNames を module .GetExportedNames () とする。unambiguousNames を新しい空の List とする。exportedNames の各要素 name について、次を行う。resolution を module .ResolveExport (name ) とする。resolution が ResolvedBinding Record である場合、name を unambiguousNames に追加する。namespace を ModuleNamespaceCreate (module , unambiguousNames ) に設定する。namespace を返す。
注
GetModuleNamespace がスローすることはありません。代わりに、解決不能な名前はこの時点で namespace から単純に除外されます。それらがどこからも明示的に要求されない曖昧な star export だけでない限り、後で実際のリンクエラーになります。
16.2.1.14 Runtime Semantics: Evaluation
Module : [empty]
undefined を返す。
ModuleBody : ModuleItemList
result を Completion (ModuleItemList の Evaluation ) とする。result が正常完了 であり、result .[[Value]] が empty である場合、undefined を返す。? result を返す。
ModuleItemList :
ModuleItemList
ModuleItem
sl を ModuleItemList の ? Evaluation とする。s を Completion (ModuleItem の Evaluation ) とする。? UpdateEmpty (s , sl ) を返す。
注
ModuleItem : ImportDeclaration
empty を返す。
16.2.2 インポート
構文
ImportDeclaration :
import
ImportClause
FromClause
WithClause opt
;
import
ModuleSpecifier
WithClause opt
;
ImportClause :
ImportedDefaultBinding
NameSpaceImport
NamedImports
ImportedDefaultBinding
,
NameSpaceImport
ImportedDefaultBinding
,
NamedImports
ImportedDefaultBinding :
ImportedBinding
NameSpaceImport :
*
as
ImportedBinding
NamedImports :
{
}
{
ImportsList
,opt
}
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 Static Semantics: 早期エラー
ModuleItem : ImportDeclaration
WithClause :
with
{
WithEntries
,opt
}
16.2.2.2 Static Semantics: ImportEntries
構文指向操作 ImportEntries。引数なし。戻り値:リスト (要素:ImportEntryレコード )。 次の生成規則ごとに定義される。
Module : [empty]
新しい空の List を返す。
ModuleItemList :
ModuleItemList
ModuleItem
entries1 を ModuleItemList の ImportEntries とする。entries2 を ModuleItem の ImportEntries とする。entries1 と entries2 のリスト連結 を返す。
ModuleItem :
ExportDeclaration
StatementListItem
新しい空の List を返す。
ImportDeclaration :
import
ImportClause
FromClause
WithClause opt
;
module を ImportDeclaration の ModuleRequests の唯一の要素とする。引数 module を指定した ImportClause の ImportEntriesForModule を返す。
ImportDeclaration :
import
ModuleSpecifier
WithClause opt
;
新しい空の List を返す。
16.2.2.3 Static Semantics: ImportEntriesForModule
構文指向操作 ImportEntriesForModule。引数 module (ModuleRequestレコード )。戻り値:リスト (要素:ImportEntryレコード )。 次の生成規則ごとに定義される。
ImportClause :
ImportedDefaultBinding
,
NameSpaceImport
entries1 を、引数 module を指定した ImportedDefaultBinding の ImportEntriesForModule とする。entries2 を、引数 module を指定した NameSpaceImport の ImportEntriesForModule とする。entries1 と entries2 のリスト連結 を返す。
ImportClause :
ImportedDefaultBinding
,
NamedImports
entries1 を、引数 module を指定した ImportedDefaultBinding の ImportEntriesForModule とする。entries2 を、引数 module を指定した NamedImports の ImportEntriesForModule とする。entries1 と entries2 のリスト連結 を返す。
ImportedDefaultBinding : ImportedBinding
localName を ImportedBinding の BoundNames の唯一の要素とする。defaultEntry を ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : "default" , [[LocalName]] : localName } とする。« defaultEntry » を返す。
NameSpaceImport :
*
as
ImportedBinding
localName を ImportedBinding の StringValue とする。entry を ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : namespace , [[LocalName]] : localName } とする。« entry » を返す。
NamedImports :
{
}
新しい空の List を返す。
ImportsList :
ImportsList
,
ImportSpecifier
specs1 を、引数 module を指定した ImportsList の ImportEntriesForModule とする。specs2 を、引数 module を指定した ImportSpecifier の ImportEntriesForModule とする。specs1 と specs2 のリスト連結 を返す。
ImportSpecifier : ImportedBinding
localName を ImportedBinding の BoundNames の唯一の要素とする。entry を ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : localName , [[LocalName]] : localName } とする。« entry » を返す。
ImportSpecifier :
ModuleExportName
as
ImportedBinding
importName を ModuleExportName の StringValue とする。localName を ImportedBinding の StringValue とする。entry を ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : importName , [[LocalName]] : localName } とする。« entry » を返す。
16.2.2.4 Static Semantics: WithClauseToAttributes
構文指向操作 WithClauseToAttributes。引数なし。戻り値:リスト (要素:ImportAttributeレコード )。 次の生成規則ごとに定義される。
WithClause :
with
{
}
新しい空の List を返す。
WithClause :
with
{
WithEntries
,opt
}
attrs を WithEntries の WithClauseToAttributes とする。attrs を、その [[Key]] フィールドの辞書式順序に従って並べ替える。各フィールドの値は UTF-16 コード単位値の列として扱う。注記 : この並べ替えが観測可能なのは、属性が列挙された順序に基づいてホスト が動作を変更することを禁止されるという点だけである。attrs を返す。
WithEntries :
AttributeKey
:
StringLiteral
key を AttributeKey の PropName とする。entry を ImportAttribute Record { [[Key]] : key , [[Value]] : StringLiteral の SV } とする。« entry » を返す。
WithEntries :
AttributeKey
:
StringLiteral
,
WithEntries
key を AttributeKey の PropName とする。entry を ImportAttribute Record { [[Key]] : key , [[Value]] : StringLiteral の SV } とする。rest を WithEntries の WithClauseToAttributes とする。« entry » と rest のリスト連結 を返す。
16.2.3 エクスポート
構文
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
export
VariableStatement [~Yield, +Await]
export
[lookahead ∉ { using , await }]
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
,opt
}
ExportsList :
ExportSpecifier
ExportsList
,
ExportSpecifier
ExportSpecifier :
ModuleExportName
ModuleExportName
as
ModuleExportName
16.2.3.1 Static Semantics: 早期エラー
ExportDeclaration :
export
NamedExports
;
注
16.2.3.2 Static Semantics: ExportedBindings
構文指向操作 ExportedBindings。引数なし。戻り値:リスト (要素:String)。
注
ExportedBindings は、Module の ExportedNames と明示的に関連付けられたローカルに束縛された名前です。
次の生成規則ごとに定義される。
ModuleItemList :
ModuleItemList
ModuleItem
names1 を ModuleItemList の ExportedBindings とする。names2 を ModuleItem の ExportedBindings とする。names1 と names2 のリスト連結 を返す。
ModuleItem :
ImportDeclaration
StatementListItem
新しい空の List を返す。
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
新しい空の List を返す。
ExportDeclaration :
export
NamedExports
;
NamedExports の ExportedBindings を返す。
ExportDeclaration :
export
VariableStatement
VariableStatement の BoundNames を返す。
ExportDeclaration :
export
Declaration
Declaration の BoundNames を返す。
ExportDeclaration :
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
;
この ExportDeclaration の BoundNames を返す。
NamedExports :
{
}
新しい空の List を返す。
ExportsList :
ExportsList
,
ExportSpecifier
names1 を ExportsList の ExportedBindings とする。names2 を ExportSpecifier の ExportedBindings とする。names1 と names2 のリスト連結 を返す。
ExportSpecifier : ModuleExportName
唯一の要素が ModuleExportName の StringValue である List を返す。
ExportSpecifier :
ModuleExportName
as
ModuleExportName
唯一の要素が最初の ModuleExportName の StringValue である List を返す。
16.2.3.3 Static Semantics: ExportedNames
構文指向操作 ExportedNames。引数なし。戻り値:リスト (要素:String)。
注
ExportedNames は、Module がそのローカル名束縛の1つへ明示的に対応付ける、外部から見える名前です。
次の生成規則ごとに定義される。
ModuleItemList :
ModuleItemList
ModuleItem
names1 を ModuleItemList の ExportedNames とする。names2 を ModuleItem の ExportedNames とする。names1 と names2 のリスト連結 を返す。
ModuleItem : ExportDeclaration
ExportDeclaration の ExportedNames を返す。
ModuleItem :
ImportDeclaration
StatementListItem
新しい空の List を返す。
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
ExportFromClause の ExportedNames を返す。
ExportFromClause : *
新しい空の List を返す。
ExportFromClause :
*
as
ModuleExportName
唯一の要素が ModuleExportName の StringValue である List を返す。
ExportFromClause : NamedExports
NamedExports の ExportedNames を返す。
ExportDeclaration :
export
VariableStatement
VariableStatement の BoundNames を返す。
ExportDeclaration :
export
Declaration
Declaration の BoundNames を返す。
ExportDeclaration :
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
;
« "default" » を返す。
NamedExports :
{
}
新しい空の List を返す。
ExportsList :
ExportsList
,
ExportSpecifier
names1 を ExportsList の ExportedNames とする。names2 を ExportSpecifier の ExportedNames とする。names1 と names2 のリスト連結 を返す。
ExportSpecifier : ModuleExportName
唯一の要素が ModuleExportName の StringValue である List を返す。
ExportSpecifier :
ModuleExportName
as
ModuleExportName
唯一の要素が2番目の ModuleExportName の StringValue である List を返す。
16.2.3.4 Static Semantics: ExportEntries
構文指向操作 ExportEntries。引数なし。戻り値:リスト (要素:ExportEntryレコード )。 次の生成規則ごとに定義される。
Module : [empty]
新しい空の List を返す。
ModuleItemList :
ModuleItemList
ModuleItem
entries1 を ModuleItemList の ExportEntries とする。entries2 を ModuleItem の ExportEntries とする。entries1 と entries2 のリスト連結 を返す。
ModuleItem :
ImportDeclaration
StatementListItem
新しい空の List を返す。
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
module を ExportDeclaration の ModuleRequests の唯一の要素とする。引数 module を指定した ExportFromClause の ExportEntriesForModule を返す。
ExportDeclaration :
export
NamedExports
;
引数 null を指定した NamedExports の ExportEntriesForModule を返す。
ExportDeclaration :
export
VariableStatement
entries を新しい空の List とする。names を VariableStatement の BoundNames とする。names の各要素 name について、次を行う。ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : name , [[ExportName]] : name } を entries に追加する。entries を返す。
ExportDeclaration :
export
Declaration
entries を新しい空の List とする。names を Declaration の BoundNames とする。names の各要素 name について、次を行う。ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : name , [[ExportName]] : name } を entries に追加する。entries を返す。
ExportDeclaration :
export
default
HoistableDeclaration
names を HoistableDeclaration の BoundNames とする。localName を names の唯一の要素とする。唯一の要素が新しい ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : localName , [[ExportName]] : "default" } である List を返す。
ExportDeclaration :
export
default
ClassDeclaration
names を ClassDeclaration の BoundNames とする。localName を names の唯一の要素とする。唯一の要素が新しい ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : localName , [[ExportName]] : "default" } である List を返す。
ExportDeclaration :
export
default
AssignmentExpression
;
entry を ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : "*default*" , [[ExportName]] : "default" } とする。« entry » を返す。
注
"*default*" は、この仕様内で匿名のデフォルトエクスポート値を表す合成名として使用されます。詳細については この注記 を参照してください。
16.2.3.5 Static Semantics: ExportEntriesForModule
構文指向操作 ExportEntriesForModule。引数 module ((ModuleRequestレコード または null ))。戻り値:リスト (要素:ExportEntryレコード )。 次の生成規則ごとに定義される。
ExportFromClause : *
entry を ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : all-but-default , [[LocalName]] : null , [[ExportName]] : null } とする。« entry » を返す。
ExportFromClause :
*
as
ModuleExportName
exportName を ModuleExportName の StringValue とする。entry を ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : namespace , [[LocalName]] : null , [[ExportName]] : exportName } とする。« entry » を返す。
NamedExports :
{
}
新しい空の List を返す。
ExportsList :
ExportsList
,
ExportSpecifier
specs1 を、引数 module を指定した ExportsList の ExportEntriesForModule とする。specs2 を、引数 module を指定した ExportSpecifier の ExportEntriesForModule とする。specs1 と specs2 のリスト連結 を返す。
ExportSpecifier : ModuleExportName
sourceName を ModuleExportName の StringValue とする。module が null である場合、localName を sourceName とする。importName を null とする。そうでない場合、localName を null とする。importName を sourceName とする。 唯一の要素が新しい ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : importName , [[LocalName]] : localName , [[ExportName]] : sourceName } である List を返す。
ExportSpecifier :
ModuleExportName
as
ModuleExportName
sourceName を最初の ModuleExportName の StringValue とする。exportName を2番目の ModuleExportName の StringValue とする。module が null である場合、localName を sourceName とする。importName を null とする。そうでない場合、localName を null とする。importName を sourceName とする。 唯一の要素が新しい ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : importName , [[LocalName]] : localName , [[ExportName]] : exportName } である List を返す。
16.2.3.6 Static Semantics: ReferencedBindings
構文指向操作 ReferencedBindings。引数なし。戻り値:リスト (要素:構文解析ノード )。 次の生成規則ごとに定義される。
NamedExports :
{
}
新しい空の List を返す。
ExportsList :
ExportsList
,
ExportSpecifier
names1 を ExportsList の ReferencedBindings とする。names2 を ExportSpecifier の ReferencedBindings とする。names1 と names2 のリスト連結 を返す。
ExportSpecifier :
ModuleExportName
as
ModuleExportName
最初の ModuleExportName の ReferencedBindings を返す。
ModuleExportName : IdentifierName
唯一の要素が IdentifierName である List を返す。
ModuleExportName : StringLiteral
唯一の要素が StringLiteral である List を返す。
16.2.3.7 Runtime Semantics: Evaluation
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
empty を返す。
ExportDeclaration :
export
VariableStatement
VariableStatement の ? Evaluation を返す。
ExportDeclaration :
export
Declaration
Declaration の ? Evaluation を返す。
ExportDeclaration :
export
default
HoistableDeclaration
HoistableDeclaration の ? Evaluation を返す。
ExportDeclaration :
export
default
ClassDeclaration
value を ClassDeclaration の ? BindingClassDeclarationEvaluation とする。className を ClassDeclaration の BoundNames の唯一の要素とする。className が "*default*" である場合、envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。? InitializeBoundName ("*default*" , value , envRecord ) を実行する。 empty を返す。
ExportDeclaration :
export
default
AssignmentExpression
;
IsAnonymousFunctionDefinition (AssignmentExpression ) が true である場合、value を、引数 "default" を指定した AssignmentExpression の ? NamedEvaluation とする。そうでない場合、rhs を AssignmentExpression の ? Evaluation とする。value を ? GetValue (rhs ) とする。 envRecord を実行中の実行コンテキスト の LexicalEnvironment とする。? InitializeBoundName ("*default*" , value , envRecord ) を実行する。 empty を返す。
17 エラー処理と言語拡張
実装は、関連する ECMAScript 言語構文が評価される時点で、ほとんどのエラーを報告しなければなりません。早期エラー とは、エラーを含む Script 内のいずれの構文も評価される前に検出して報告できるエラーです。早期エラー が存在すると、その構文は評価されません。実装は、ParseScript でその Script を構文解析する一環として、Script 内の早期エラー を報告しなければなりません。Module 内の早期エラー は、その Module が評価される時点で報告され、Module は決して初期化されません。eval コード内の早期エラー は eval が呼び出された時点で報告され、eval コードの評価を妨げます。早期エラー でないすべてのエラーは実行時エラーです。
実装は、この仕様の「Static Semantics: 早期エラー 」副節に列挙されている条件が発生した場合、それを早期エラー として報告しなければなりません。
コンパイラーが、ある構文がいかなる状況でもエラーなしに実行できないことを証明できる場合であっても、実装はその他の種類のエラーを早期エラー として扱ってはなりません。そのような場合、実装は早期警告を出してもかまいませんが、関連する構文が実際に実行されるまではエラーを報告するべきではありません。
実装は、次の場合を除いて、規定どおりにすべてのエラーを報告しなければなりません。
17.1 で制限されている場合を除き、ホスト または実装は Script 構文、Module 構文、および正規表現パターンまたはフラグ構文を拡張してもかまいません。これを可能にするため、SyntaxError をスローすることが許可されているすべての操作(eval の呼出し、正規表現リテラルの使用、Function または RegExp コンストラクター の使用など)は、スクリプト構文または正規表現パターンもしくはフラグ構文に対するホスト定義 の拡張に遭遇した場合、SyntaxError をスローする代わりにホスト定義 の動作を示すことが許可されます。
17.1 で制限されている場合を除き、ホスト または実装は、この仕様で説明されているものに加えて、追加の型、値、オブジェクト、プロパティ、および関数を提供してもかまいません。これにより、構文(グローバルスコープで変数を検索する場合など)が、エラー(ReferenceError など)をスローする代わりにホスト定義 の動作を示す場合があります。
17.1 禁止される拡張
実装は、次の方法でこの仕様を拡張してはなりません。
18 ECMAScript 標準組込みオブジェクト
ECMAScript Script または Module が実行を開始するときは常に、特定の組込みオブジェクトを利用できます。その1つであるグローバルオブジェクト は、実行中のプログラムのグローバル環境の一部です。その他は、グローバルオブジェクト の初期プロパティとして、またはアクセス可能な組込みオブジェクトのプロパティとして間接的にアクセスできます。
別段の規定がない限り、関数として呼出し可能な組込みオブジェクトは、10.3 で説明される特性を持つ組込み関数オブジェクト です。別段の規定がない限り、組込みオブジェクトの [[Extensible]] 内部スロットは初期状態で値 true を持ちます。すべての組込み関数オブジェクト は [[Realm]] 内部スロットを持ち、その値は、そのオブジェクトが最初に作成された realm の Realm Record です。
多くの組込みオブジェクトは関数です。つまり、引数を指定して呼び出すことができます。さらに、そのうちのいくつかはコンストラクター です。つまり、new 演算子とともに使用することを意図した関数です。各組込み関数について、この仕様はその関数に必要な引数と、その関数オブジェクト のプロパティを説明します。各組込みコンストラクター について、この仕様はさらに、そのコンストラクター の prototype オブジェクトのプロパティと、そのコンストラクター を呼び出す new 式によって返される特定のオブジェクトインスタンスのプロパティを説明します。
特定の関数の説明で別段の規定がない限り、組込み関数またはコンストラクター に、その関数が必要とすると規定されている数より少ない引数が渡された場合、その関数またはコンストラクター は、不足する各引数として undefined 値が渡されたかのように正確に動作しなければなりません。このような不足している引数は「存在しない」とみなされ、仕様アルゴリズムによってそのように識別される場合があります。特定の関数の説明において、「this 値」および「NewTarget」という用語は、10.3 で与えられる意味を持ちます。
特定の関数の説明で別段の規定がない限り、説明される組込み関数またはコンストラクター に、その関数が許容すると規定されている数より多い引数が渡された場合、余分な引数は呼出しによって評価された後、その関数によって無視されます。ただし、余分な引数が存在するという理由だけを根拠として TypeError 例外をスローする動作でない限り、実装はそのような引数に関連する実装固有の動作を定義してもかまいません。
注 1
組込み関数の集合に追加機能を加える実装には、既存の関数に新しいパラメーターを追加するのではなく、新しい関数を追加することが推奨されます。
別段の規定がない限り、すべての組込み関数およびすべての組込みコンストラクター は、その [[Prototype]] 内部スロットの値として、式 Function.prototype の初期値である Function prototype オブジェクト (20.2.3 )を持ちます。
別段の規定がない限り、Object prototype オブジェクト 自身を除くすべての組込み prototype オブジェクトは、その [[Prototype]] 内部スロットの値として、式 Object.prototype の初期値である Object prototype オブジェクト (20.1.3 )を持ちます。
この仕様が組込みコンストラクター の動作をアルゴリズム手順によって定義する場合、それは [[Call]] と [[Construct]] の両方における動作です。このようなアルゴリズムが2つの場合を区別する必要がある場合、NewTarget が undefined であるかどうかを検査します。これは [[Call]] による呼出しを示します。
コンストラクター として識別されていない組込み関数オブジェクト は、特定の関数の説明で別段の規定がない限り、[[Construct]] 内部メソッドを実装しません。
コンストラクター でない組込み関数オブジェクト は、特定の関数の説明で別段の規定がない限り、"prototype" プロパティを持ちません。
この仕様で定義される各組込み関数は、CreateBuiltinFunction 抽象操作 (10.3.4 )を呼び出すことによって作成されます。length および name パラメーターの値は、以下で説明するように、"length" および "name" プロパティの初期値です。prefix パラメーターの値についても同様に以下で説明します。
コンストラクター を含むすべての組込み関数オブジェクト は、値が非負の整数 Number である "length" プロパティを持ちます。別段の規定がない限り、この値は関数の説明の副節見出しに示される必須パラメーターの数です。省略可能なパラメーターおよび rest パラメーターはパラメーター数に含まれません。
注 2
たとえば、Array prototype オブジェクト の "map" プロパティの初期値である関数オブジェクト は、副節見出し «Array.prototype.map (callback [ , thisArg])» で説明されており、名前付き引数 callback と thisArg の2つが示されています。後者は省略可能です。したがって、その関数オブジェクト の "length" プロパティの値は 1 𝔽 です。
別段の規定がない限り、組込み関数オブジェクト の "length" プロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
コンストラクター を含むすべての組込み関数オブジェクト は、値が String である "name" プロパティを持ちます。別段の規定がない限り、この値はこの仕様でその関数に与えられている名前です。匿名関数として識別される関数は、"name" プロパティの値として空の String を使用します。オブジェクトのプロパティとして規定される関数では、name 値はその関数にアクセスするために使用されるプロパティ名 文字列です。組込みプロパティの get または set アクセサー関数として規定される関数では、CreateBuiltinFunction を呼び出すときに、それぞれ "get" または "set" が prefix パラメーターに渡されます。
プロパティキー が Symbol 値である各組込み関数について、"name" プロパティの値は明示的に規定されます。このように明示的に規定された値が接頭辞 "get " または "set " で始まり、その値が規定されている関数が組込みプロパティの get または set アクセサー関数である場合、接頭辞を除いた値が name パラメーターに渡され、CreateBuiltinFunction を呼び出すときに、それぞれ値 "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 グローバルオブジェクト
グローバルオブジェクト は:
制御がいずれかの実行コンテキスト に入る前に作成されます。
[[Construct]] 内部メソッドを持ちません。new 演算子を使用してコンストラクター として使用することはできません。
[[Call]] 内部メソッドを持ちません。関数として呼び出すことはできません。
値がホスト定義 である [[Prototype]] 内部スロットを持ちます。
この仕様で定義されるプロパティに加えて、ホスト定義 のプロパティを持つ場合があります。これには、値がグローバルオブジェクト自身であるプロパティが含まれる場合があります。
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 ( source )
この関数は %eval% イントリンシックオブジェクトです。
呼び出されたとき、次の手順を実行します。
? PerformEval (source , false , false ) を返す。
19.2.1.1 PerformEval ( source , strictCaller , direct )
抽象操作 PerformEval。引数 source (ECMAScript 言語値 )、strictCaller (Boolean) および direct (Boolean)。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
表明 : direct が false である場合、strictCaller も false である。source が String でない場合、source を返す。evalRealm を現在の Realm Record とする。注記 : direct eval の場合、evalRealm は eval の呼出し元と eval 関数自身の両方の realm である。? HostEnsureCanCompileStrings (evalRealm , « », source , direct ) を実行する。 inFunc を false とする。inMethod を false とする。inDerivedCtor を false とする。inClassFieldInitializer を false とする。direct が true である場合、thisEnvRecord を GetThisEnvironment () とする。thisEnvRecord が Function Environment Record である場合、func を thisEnvRecord .[[FunctionObject]] とする。inFunc を true に設定する。inMethod を thisEnvRecord .HasSuperBinding () に設定する。func .[[ConstructorKind]] が derived である場合、inDerivedCtor を true に設定する。classFieldInitializerName を func .[[ClassFieldInitializerName]] とする。classFieldInitializerName が empty でない場合、inClassFieldInitializer を true に設定する。次の副手順を実装定義 の順序で実行し、構文解析とエラー検出を交互に行ってもよい。script を ParseText (source , Script ) とする。script がエラーの List である場合、SyntaxError 例外をスローする。script Contains ScriptBody が false である場合、undefined を返す。body を script の ScriptBody とする。inFunc が false であり、body Contains NewTarget である場合、SyntaxError 例外をスローする。inMethod が false であり、body Contains SuperProperty である場合、SyntaxError 例外をスローする。inDerivedCtor が false であり、body Contains SuperCall である場合、SyntaxError 例外をスローする。inClassFieldInitializer が true であり、body の ContainsArguments が true である場合、SyntaxError 例外をスローする。 strictCaller が true である場合、strictEval を true とする。そうでない場合、strictEval を script の ScriptIsStrict とする。 runningContext を実行中の実行コンテキスト とする。注記 : direct が true である場合、runningContext は direct eval を実行した実行コンテキスト である。direct が false である場合、runningContext は eval 関数の呼出しに対する実行コンテキスト である。direct が true である場合、lexicalEnv を NewDeclarativeEnvironment (runningContext の LexicalEnvironment) とする。variableEnv を runningContext の VariableEnvironment とする。privateEnv を runningContext の PrivateEnvironment とする。そうでない場合、lexicalEnv を NewDeclarativeEnvironment (evalRealm .[[GlobalEnv]] ) とする。variableEnv を evalRealm .[[GlobalEnv]] とする。privateEnv を null とする。 strictEval が true である場合、variableEnv を lexicalEnv に設定する。runningContext がまだ一時停止されていない場合、runningContext を一時停止する。evalContext を新しい ECMAScript コード実行コンテキスト とする。evalContext の Function を null に設定する。evalContext の Realm を evalRealm に設定する。evalContext の ScriptOrModule を runningContext の ScriptOrModule に設定する。evalContext の VariableEnvironment を variableEnv に設定する。evalContext の LexicalEnvironment を lexicalEnv に設定する。evalContext の PrivateEnvironment を privateEnv に設定する。evalContext を実行コンテキストスタック にプッシュする。これで evalContext が実行中の実行コンテキスト になる。result を Completion (EvalDeclarationInstantiation (body , variableEnv , lexicalEnv , privateEnv , strictEval )) とする。result が正常完了 である場合、result を Completion (body の Evaluation ) に設定する。result が正常完了 であり、result .[[Value]] が empty である場合、result を NormalCompletion (undefined ) に設定する。evalContext を一時停止し、実行コンテキストスタック から削除する。現在実行コンテキストスタック の先頭にあるコンテキストを、実行中の実行コンテキスト として再開する。 ? result を返す。
注
呼出し元コンテキストのコードまたは eval コードのいずれかが strict モードコード である場合、eval コードは、その eval を呼び出した呼出し元コンテキストの variable environment 内に変数または関数束縛をインスタンス化できません。代わりに、このような束縛は eval コードからだけアクセス可能な新しい VariableEnvironment 内にインスタンス化されます。let、const、または class 宣言によって導入される束縛は、常に新しい LexicalEnvironment 内にインスタンス化されます。
19.2.1.2 HostEnsureCanCompileStrings ( calleeRealm , paramStrings , bodyString , direct )
ホスト定義の抽象操作 HostEnsureCanCompileStrings。引数 calleeRealm (Realmレコード )、paramStrings (リスト (要素:String))、bodyString (String) および direct (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 開発者が文字列を ECMAScript コードとして解釈および評価できるようにする特定の ECMAScript 関数を、ホスト環境 がブロックできるようにします。
paramStrings は、関数コンストラクター の1つを使用するときに、パラメーターリストを構築するために連結される文字列を表します。bodyString は、関数本体または eval 呼出しに渡された文字列を表します。
direct は、評価が direct eval であるかどうかを示します。
HostEnsureCanCompileStrings の既定の実装は、NormalCompletion (unused ) を返すことです。
19.2.1.3 EvalDeclarationInstantiation ( body , variableEnv , lexicalEnv , privateEnv , strict )
抽象操作 EvalDeclarationInstantiation。引数 body (a ScriptBody Parse Node )、variableEnv (Environmentレコード )、lexicalEnv (Declarative Environmentレコード )、privateEnv ((PrivateEnvironmentレコード または null )) および strict (Boolean)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
variableNames を body の VarDeclaredNames とする。variableDecls を body の VarScopedDeclarations とする。strict が false である場合、variableEnv が Global Environment Record である場合、variableNames の各要素 name について、次を行う。HasLexicalDeclaration (variableEnv , name ) が true である場合、SyntaxError 例外をスローする。注記 : eval は、グローバルレキシカル宣言によって隠蔽されるグローバル var 宣言を作成しない。thisEnv を lexicalEnv とする。表明 : 次のループは終了する。thisEnv と variableEnv が同じ Environment Record でない間、次を繰り返す。thisEnv が Object Environment Record でない場合、注記 : with 文の環境はいかなるレキシカル宣言も含むことができないため、var/let の巻き上げ競合 について検査する必要はない。variableNames の各要素 name について、次を行う。! thisEnv .HasBinding (name ) が true である場合、Normative Optional
ホスト が Web ブラウザーであるか、その他の方法で Catch ブロック内の VariableStatement をサポートする場合、thisEnv が Catch 節の Environment Record でない場合、SyntaxError 例外をスローする。そうでない場合、SyntaxError 例外をスローする。 注記 : direct eval は、同じ名前のレキシカル宣言を越えて var 宣言を巻き上げない。thisEnv を thisEnv .[[OuterEnv]] に設定する。privateIdentifiers を新しい空の List とする。pointer を privateEnv とする。pointer が null でない間、次を繰り返す。pointer .[[Names]] の各 Private Name binding について、次を行う。privateIdentifiers が binding .[[Description]] を含まない場合、binding .[[Description]] を privateIdentifiers に追加する。pointer を pointer .[[OuterPrivateEnvironment]] に設定する。引数 privateIdentifiers を指定した body の AllPrivateIdentifiersValid が false である場合、SyntaxError 例外をスローする。 funcsToInitialize を新しい空の List とする。declaredFuncNames を新しい空の List とする。variableDecls の各要素 variableDecl について、List の逆順で次を行う。variableDecl が VariableDeclaration 、ForBinding 、または BindingIdentifier のいずれでもない場合、表明 : variableDecl は FunctionDeclaration 、GeneratorDeclaration 、AsyncFunctionDeclaration 、または AsyncGeneratorDeclaration のいずれかである。注記 : 同じ名前について複数の関数宣言がある場合、最後の宣言が使用される。funcName を variableDecl の BoundNames の唯一の要素とする。declaredFuncNames が funcName を含まない場合、variableEnv が Global Environment Record である場合、funcDefinable を ? CanDeclareGlobalFunction (variableEnv , funcName ) とする。funcDefinable が false である場合、TypeError 例外をスローする。funcName を declaredFuncNames に追加する。variableDecl を funcsToInitialize の最初の要素として挿入する。declaredVariableNames を新しい空の List とする。variableDecls の各要素 variableDecl について、次を行う。variableDecl が VariableDeclaration 、ForBinding 、または BindingIdentifier のいずれかである場合、variableDecl の BoundNames の各 String name について、次を行う。declaredFuncNames が name を含まない場合、variableEnv が Global Environment Record である場合、variableDefinable を ? CanDeclareGlobalVar (variableEnv , name ) とする。variableDefinable が false である場合、TypeError 例外をスローする。declaredVariableNames が name を含まない場合、name を declaredVariableNames に追加する。Normative Optional
strict が false であり、ホスト が Web ブラウザーであるか、その他の方法で ブロックレベル関数宣言の Web Legacy 互換性意味論 をサポートする場合、declaredFuncOrVariableNames を declaredFuncNames と declaredVariableNames のリスト連結 とする。body Contains x が true となる任意の Block 、CaseClause 、または DefaultClause x の StatementList に直接含まれる各 FunctionDeclaration funcDecl について、次を行う。funcName を funcDecl の BindingIdentifier の StringValue とする。FunctionDeclaration funcDecl を、funcName を BindingIdentifier として持つ VariableStatement に置き換えても body に早期エラー が生じない場合、bindingExists を false とする。thisEnv を lexicalEnv に設定する。表明 : 次のループは終了する。thisEnv が variableEnv でない間、次を繰り返す。thisEnv が Object Environment Record でない場合、! thisEnv .HasBinding (funcName ) が true である場合、Normative Optional
ホスト が Web ブラウザーであるか、その他の方法で Catch ブロック内の VariableStatement をサポートする場合、thisEnv が Catch 節の Environment Record でない場合、bindingExists を true に設定する。そうでない場合、bindingExists を true に設定する。 thisEnv を thisEnv .[[OuterEnv]] に設定する。bindingExists が false であり、variableEnv が Global Environment Record である場合、HasLexicalDeclaration (variableEnv , funcName ) が false である場合、funcDefinable を ? CanDeclareGlobalVar (variableEnv , funcName ) とする。そうでない場合、funcDefinable を false とする。 そうでない場合、funcDefinable を true とする。 bindingExists が false であり、funcDefinable が true である場合、declaredFuncOrVariableNames が funcName を含まない場合、variableEnv が Global Environment Record である場合、? CreateGlobalVarBinding (variableEnv , funcName , true ) を実行する。 そうでない場合、bindingExists を ! variableEnv .HasBinding (funcName ) に設定する。bindingExists が false である場合、! variableEnv .CreateMutableBinding (funcName , true ) を実行する。 ! variableEnv .InitializeBinding (funcName , undefined ) を実行する。 funcName を declaredFuncOrVariableNames に追加する。FunctionDeclaration funcDecl が評価されるとき、15.2.6 で提供される FunctionDeclaration Evaluation アルゴリズムの代わりに、次の手順を実行する。globalEnv を実行中の実行コンテキスト の VariableEnvironment とする。blockEnv を実行中の実行コンテキスト の LexicalEnvironment とする。funcObj を ! blockEnv .GetBindingValue (funcName , false ) とする。? globalEnv .SetMutableBinding (funcName , funcObj , false ) を実行する。 unused を返す。注記 : variableEnv が Global Environment Record であり、かつグローバルオブジェクト が Proxy 特殊オブジェクト である場合を除き、このアルゴリズムのこの手順以降では異常終了は発生しない。lexicalDecls を body の LexicallyScopedDeclarations とする。lexicalDecls の各要素 lexicalDecl について、次を行う。注記 : レキシカルに宣言された名前はここではインスタンス化されるだけで、初期化はされない。lexicalDecl の BoundNames の各要素 name について、次を行う。lexicalDecl の IsConstantDeclaration が true である場合、? lexicalEnv .CreateImmutableBinding (name , true ) を実行する。 そうでない場合、? lexicalEnv .CreateMutableBinding (name , false ) を実行する。 funcsToInitialize の各 Parse Node funcDecl について、次を行う。funcName を funcDecl の BoundNames の唯一の要素とする。funcObj を、引数 lexicalEnv および privateEnv を指定した funcDecl の InstantiateFunctionObject とする。variableEnv が Global Environment Record である場合、? CreateGlobalFunctionBinding (variableEnv , funcName , funcObj , true ) を実行する。 そうでない場合、bindingExists を ! variableEnv .HasBinding (funcName ) とする。bindingExists が false である場合、注記 : 手順 14 に先立つ検証により、次の呼出しは中断完了 を返すことができない。! variableEnv .CreateMutableBinding (funcName , true ) を実行する。 ! variableEnv .InitializeBinding (funcName , funcObj ) を実行する。 そうでない場合、! variableEnv .SetMutableBinding (funcName , funcObj , false ) を実行する。 declaredVariableNames の各 String variableName について、次を行う。variableEnv が Global Environment Record である場合、? CreateGlobalVarBinding (variableEnv , variableName , true ) を実行する。 そうでない場合、bindingExists を ! variableEnv .HasBinding (variableName ) とする。bindingExists が false である場合、注記 : 手順 14 に先立つ検証により、次の呼出しは中断完了 を返すことができない。! variableEnv .CreateMutableBinding (variableName , true ) を実行する。 ! variableEnv .InitializeBinding (variableName , undefined ) を実行する。 unused を返す。
19.2.2 isFinite ( value )
この関数は %isFinite% イントリンシックオブジェクトです。
呼び出されたとき、次の手順を実行します。
number を ? ToNumber (value ) とする。number が有限 Number である場合、true を返す。false を返す。
19.2.3 isNaN ( value )
この関数は %isNaN% イントリンシックオブジェクトです。
呼び出されたとき、次の手順を実行します。
number を ? ToNumber (value ) とする。number が NaN である場合、true を返す。false を返す。
注
ECMAScript コードで値 X が NaN かどうかを確実に検査する方法は、X !== X という形式の式です。X が NaN である場合に限り、結果は true になります。
19.2.4 parseFloat ( string )
この関数は、string 引数の内容を10進リテラルとして解釈した結果に従って Number 値 を生成します。
これは %parseFloat% イントリンシックオブジェクトです。
呼び出されたとき、次の手順を実行します。
inputString を ? ToString (string ) とする。trimmedString を ! TrimString (inputString , start ) とする。trimmed を StringToCodePoints (trimmedString ) とする。trimmedPrefix を、StrDecimalLiteral の構文を満たす trimmed の最長の接頭辞とする。これは trimmed 自身である場合もある。そのような接頭辞が存在しない場合、NaN を返す。parsedNumber を ParseText (trimmedPrefix , StrDecimalLiteral ) とする。表明 : parsedNumber は Parse Node である。parsedNumber の StringNumericValue を返す。
注
この関数は 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% イントリンシックオブジェクトです。
呼び出されたとき、次の手順を実行します。
inputString を ? ToString (string ) とする。radixMV を ℝ (? ToInt32 (radix )) とする。radixMV ≠ 0 であり、radixMV が 2 から 36 までの閉区間 内にない場合、NaN を返す。trimmedString を ! TrimString (inputString , start ) とする。trimmedString が空の String である場合、NaN を返す。sign を 1 とする。trimmedString の最初のコード単位がコード単位 0x002D (HYPHEN-MINUS) である場合、sign を -1 に設定する。trimmedString を、1 から始まる trimmedString の部分文字列 に設定する。そうでなく、trimmedString の最初のコード単位がコード単位 0x002B (PLUS SIGN) である場合、trimmedString を、1 から始まる trimmedString の部分文字列 に設定する。 radixMV = 0 または radixMV = 16 である場合、trimmedString の長さ ≥ 2 であり、0 から 2 までの trimmedString の部分文字列 が "0x" または "0X" のいずれかである場合、trimmedString を、2 から始まる trimmedString の部分文字列 に設定する。radixMV を 16 に設定する。radixMV = 0 である場合、radixMV を 10 に設定する。trimmedString が基数 radixMV の数字でないコード単位を含む場合、end をそのような最初のコード単位の trimmedString 内のインデックスとする。そうでない場合、end を trimmedString の長さとする。numberString を、0 から end までの trimmedString の部分文字列 とする。numberString が空である場合、NaN を返す。mathInt を、値 10 から 35 の数字として A から Z および a から z の文字を使用して、基数 radixMV 表記の numberString によって表される整数 値とする。(ただし、radixMV = 10 で numberString が20桁を超える有効数字を含む場合、実装の選択により21桁目以降の各有効数字を数字 0 に置き換えてもよい。また、radixMV が 2、4、8、10、16、または 32 のいずれでもない場合、mathInt は基数 radixMV 表記で numberString によって表される整数 値を表す、実装によって近似された整数 であってもよい。)sign = -1 かつ mathInt = 0 である場合、-0 𝔽 を返す。𝔽 (sign × mathInt ) を返す。
注
この関数は string の先頭部分だけを整数 値として解釈する場合があります。整数 表記の一部として解釈できないコード単位は無視され、そのようなコード単位が無視されたことを示す通知は行われません。
19.2.6 URI 処理関数
Uniform Resource Identifier、すなわち URI は、インターネット上のリソース(Web ページやファイルなど)と、それらにアクセスするための転送プロトコル(HTTP や FTP など)を識別する String です。ECMAScript 言語自体は、この節で説明する URI をエンコードおよびデコードする関数を除いて、URI を使用するためのサポートを提供しません。encodeURI および decodeURI は完全な URI を扱うことを意図しています。これらは、予約文字が特殊な意味(区切り文字など)を持つことを意図しているものと仮定するため、それらをエンコードしません。encodeURIComponent および decodeURIComponent は URI の個々の構成要素を扱うことを意図しています。これらは、予約文字がテキストを表しているものと仮定し、その構成要素が完全な URI の一部となるときに特殊な意味を持たないようにエンコードしなければならないものとします。
注 1
予約文字の集合は RFC 2396 に基づいており、より新しい RFC 3986 によって導入された変更を反映していません。
注 2
ECMAScript の多くの実装は、Web ページを操作する追加の関数およびメソッドを提供していますが、これらの関数はこの標準の範囲外です。
19.2.6.1 decodeURI ( encodedURI )
この関数は、encodeURI 関数によって導入される可能性がある種類の各エスケープシーケンスおよび UTF-8 エンコーディングを、それが表すコードポイントの UTF-16 エンコーディングで置き換えた URI の新しい版を計算します。encodeURI によって導入され得ないエスケープシーケンスは置き換えられません。
これは %decodeURI% イントリンシックオブジェクトです。
呼び出されたとき、次の手順を実行します。
uriString を ? ToString (encodedURI ) とする。preserveEscapeSet を ";/?:@&=+$,#" とする。? Decode (uriString , preserveEscapeSet ) を返す。
19.2.6.2 decodeURIComponent ( encodedURIComponent )
この関数は、encodeURIComponent 関数によって導入される可能性がある種類の各エスケープシーケンスおよび UTF-8 エンコーディングを、それが表すコードポイントの UTF-16 エンコーディングで置き換えた URI の新しい版を計算します。
これは %decodeURIComponent% イントリンシックオブジェクトです。
呼び出されたとき、次の手順を実行します。
componentString を ? ToString (encodedURIComponent ) とする。preserveEscapeSet を空の String とする。? Decode (componentString , preserveEscapeSet ) を返す。
19.2.6.3 encodeURI ( uri )
この関数は、特定のコードポイントの各インスタンスを、そのコードポイントの UTF-8 エンコーディングを表す1つ、2つ、3つ、または4つのエスケープシーケンスで置き換えた、UTF-16 でエンコードされた(6.1.4 )URI の新しい版を計算します。
これは %encodeURI% イントリンシックオブジェクトです。
呼び出されたとき、次の手順を実行します。
uriString を ? ToString (uri ) とする。extraUnescaped を ";/?:@&=+$,#" とする。? Encode (uriString , extraUnescaped ) を返す。
19.2.6.4 encodeURIComponent ( uriComponent )
この関数は、特定のコードポイントの各インスタンスを、そのコードポイントの UTF-8 エンコーディングを表す1つ、2つ、3つ、または4つのエスケープシーケンスで置き換えた、UTF-16 でエンコードされた(6.1.4 )URI の新しい版を計算します。
これは %encodeURIComponent% イントリンシックオブジェクトです。
呼び出されたとき、次の手順を実行します。
componentString を ? ToString (uriComponent ) とする。extraUnescaped を空の String とする。? Encode (componentString , extraUnescaped ) を返す。
19.2.6.5 Encode ( string , extraUnescaped )
抽象操作 Encode。引数 string (String) および extraUnescaped (String)。戻り値:(正常完了 (値:String) または throw 完了 )。 6.1.4 で説明されるように string を UTF-16 でエンコードされたコードポイントの列として解釈し、URI のエンコードおよびエスケープを実行します。文字が RFC 2396 で unreserved と識別されるか、extraUnescaped に現れる場合、その文字はエスケープされません。 呼び出されると、次の手順を実行する。
length を string の長さとする。result を空の String とする。alwaysUnescaped を ASCII word characters と "-.!~*'()" の文字列連結 とする。unescapedSet を alwaysUnescaped と extraUnescaped の文字列連結 とする。k を 0 とする。k < length の間、次を繰り返す。codeUnit を string 内のインデックス k にあるコード単位とする。unescapedSet が codeUnit を含む場合、k を k + 1 に設定する。result を result と codeUnit の文字列連結 に設定する。そうでない場合、codePoint を CodePointAt (string , k ) とする。codePoint .[[IsUnpairedSurrogate]] が true である場合、URIError 例外をスローする。k を k + codePoint .[[CodeUnitCount]] に設定する。octets を、codePoint .[[CodePoint]] に UTF-8 変換を適用した結果のオクテットの List とする。octets の各要素 octet について、次を行う。hex を、octet を大文字の16進数として整形した String 表現とする。result を result 、"%" 、および StringPad (hex , 2, "0" , start ) の文字列連結 に設定する。 result を返す。
注
パーセントエンコーディングは個々のオクテットを表すために使用されるので、1つのコードポイントが複数の連続したエスケープシーケンス(8ビット UTF-8 コード単位ごとに1つ)として表現される場合があります。
19.2.6.6 Decode ( string , preserveEscapeSet )
抽象操作 Decode。引数 string (String) および preserveEscapeSet (String)。戻り値:(正常完了 (値:String) または throw 完了 )。 URI のエスケープ解除およびデコードを実行し、preserveEscapeSet 内の Basic Latin 文字に対応するエスケープシーケンスを保持します。 呼び出されると、次の手順を実行する。
length を string の長さとする。result を空の String とする。k を 0 とする。k < length の間、次を繰り返す。codeUnit を string 内のインデックス k にあるコード単位とする。segment を codeUnit とする。codeUnit がコード単位 0x0025 (PERCENT SIGN) である場合、k + 3 > length である場合、URIError 例外をスローする。escape を string の k から k + 3 までの部分文字列 とする。firstOctet を ParseHexOctet (string , k + 1) とする。firstOctet が整数 でない場合、URIError 例外をスローする。k を k + 2 に設定する。n を firstOctet 内の先頭の 1 ビットの数とする。n = 0 である場合、asciiChar を、数値が firstOctet であるコード単位とする。preserveEscapeSet が asciiChar を含む場合、segment を escape に設定する。そうでない場合、segment を asciiChar に設定する。そうでない場合、n = 1 または n > 4 である場合、URIError 例外をスローする。octets を « firstOctet » とする。j を 1 とする。j < n の間、次を繰り返す。k を k + 1 に設定する。k + 3 > length である場合、URIError 例外をスローする。string 内のインデックス k にあるコード単位がコード単位 0x0025 (PERCENT SIGN) でない場合、URIError 例外をスローする。continuationByte を ParseHexOctet (string , k + 1) とする。continuationByte が整数 でない場合、URIError 例外をスローする。continuationByte を octets に追加する。k を k + 2 に設定する。j を j + 1 に設定する。表明 : octets の長さは n である。octets が Unicode コードポイントの有効な UTF-8 エンコーディングを含まない場合、URIError 例外をスローする。codePoint を、octets に UTF-8 変換を適用して得られるコードポイント、すなわちオクテットの List から21ビット値へ変換したものとする。segment を UTF16EncodeCodePoint (codePoint ) に設定する。 result を result と segment の文字列連結 に設定する。k を k + 1 に設定する。result を返す。
注
RFC 3629 は無効な UTF-8 オクテット列のデコードを禁止しています。たとえば、無効な列 0xC0 0x80 をコード単位 0x0000 にデコードしてはなりません。Decode アルゴリズムの実装は、このような無効な列に遭遇した場合に URIError をスローすることが要求されます。
19.2.6.7 ParseHexOctet ( string , position )
抽象操作 ParseHexOctet。引数 string (String) および position (非負整数)。戻り値:(非負整数 または a non-empty List of SyntaxError objects)。 string 内の指定された position にある2つの16進文字の列を、符号なし8ビット整数 として構文解析します。 呼び出されると、次の手順を実行する。
length を string の長さとする。表明 : position + 2 ≤ length 。hexDigits を string の position から position + 2 までの部分文字列 とする。parseResult を ParseText (hexDigits , HexDigits [~Sep] ) とする。parseResult が Parse Node でない場合、parseResult を返す。n を parseResult の MV とする。表明 : n は 0 から 255 までの閉区間 内にある。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 AsyncDisposableStack ( . . . )
27.4.1 を参照してください。
19.3.5 BigInt ( . . . )
21.2.1 を参照してください。
19.3.6 BigInt64Array ( . . . )
23.2.5 を参照してください。
19.3.7 BigUint64Array ( . . . )
23.2.5 を参照してください。
19.3.8 Boolean ( . . . )
20.3.1 を参照してください。
19.3.9 DataView ( . . . )
25.3.2 を参照してください。
19.3.10 Date ( . . . )
21.4.2 を参照してください。
19.3.11 DisposableStack ( . . . )
27.3.1 を参照してください。
19.3.12 Error ( . . . )
20.5.1 を参照してください。
19.3.13 EvalError ( . . . )
20.5.5.1 を参照してください。
19.3.14 FinalizationRegistry ( . . . )
26.2.1 を参照してください。
19.3.15 Float16Array ( . . . )
23.2.5 を参照してください。
19.3.16 Float32Array ( . . . )
23.2.5 を参照してください。
19.3.17 Float64Array ( . . . )
23.2.5 を参照してください。
19.3.18 Function ( . . . )
20.2.1 を参照してください。
19.3.19 Int8Array ( . . . )
23.2.5 を参照してください。
19.3.20 Int16Array ( . . . )
23.2.5 を参照してください。
19.3.21 Int32Array ( . . . )
23.2.5 を参照してください。
19.3.22 Iterator ( . . . )
27.1.3.1 を参照してください。
19.3.23 Map ( . . . )
24.1.1 を参照してください。
19.3.24 Number ( . . . )
21.1.1 を参照してください。
19.3.25 Object ( . . . )
20.1.1 を参照してください。
19.3.26 Promise ( . . . )
27.5.3 を参照してください。
19.3.27 Proxy ( . . . )
28.2.1 を参照してください。
19.3.28 RangeError ( . . . )
20.5.5.2 を参照してください。
19.3.29 ReferenceError ( . . . )
20.5.5.3 を参照してください。
19.3.30 RegExp ( . . . )
22.2.4 を参照してください。
19.3.31 Set ( . . . )
24.2.2 を参照してください。
19.3.32 SharedArrayBuffer ( . . . )
25.2.3 を参照してください。
19.3.33 String ( . . . )
22.1.1 を参照してください。
19.3.34 SuppressedError ( . . . )
20.5.8.1 を参照してください。
19.3.35 Symbol ( . . . )
20.4.1 を参照してください。
19.3.36 SyntaxError ( . . . )
20.5.5.4 を参照してください。
19.3.37 TypeError ( . . . )
20.5.5.5 を参照してください。
19.3.38 Uint8Array ( . . . )
23.2.5 を参照してください。
19.3.39 Uint8ClampedArray ( . . . )
23.2.5 を参照してください。
19.3.40 Uint16Array ( . . . )
23.2.5 を参照してください。
19.3.41 Uint32Array ( . . . )
23.2.5 を参照してください。
19.3.42 URIError ( . . . )
20.5.5.6 を参照してください。
19.3.43 WeakMap ( . . . )
24.3.1 を参照してください。
19.3.44 WeakRef ( . . . )
26.1.1 を参照してください。
19.3.45 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 基本オブジェクト
20.1 Object オブジェクト
20.1.1 Object コンストラクター
Object コンストラクター は:
20.1.1.1 Object ( value )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined でもアクティブな関数オブジェクト でもない場合、? OrdinaryCreateFromConstructor (NewTarget, "%Object.prototype%" ) を返す。 value が undefined または null のいずれかである場合、OrdinaryObjectCreate (%Object.prototype% ) を返す。! ToObject (value ) を返す。
20.1.2 Object コンストラクターのプロパティ
Object コンストラクター は:
20.1.2.1 Object.assign ( target , ...sources )
この関数は、1つ以上のソースオブジェクトから、すべての列挙可能な独自プロパティの値を target オブジェクトへコピーします。
呼び出されたとき、次の手順を実行します。
targetObj を ? ToObject (target ) とする。引数が1つだけ渡された場合、targetObj を返す。 sources の各要素 nextSource について、次を行う。nextSource が undefined でも null でもない場合、from を ! ToObject (nextSource ) とする。keys を ? from .[[OwnPropertyKeys]] () とする。keys の各要素 nextKey について、次を行う。propertyDesc を ? from .[[GetOwnProperty]] (nextKey ) とする。propertyDesc が undefined でなく、propertyDesc .[[Enumerable]] が true である場合、propertyValue を ? Get (from , nextKey ) とする。? Set (targetObj , nextKey , propertyValue , true ) を実行する。 targetObj を返す。
この関数の "length" プロパティは 2 𝔽 です。
20.1.2.2 Object.create ( proto , properties )
この関数は、指定された prototype を持つ新しいオブジェクトを作成します。
呼び出されたとき、次の手順を実行します。
proto が Object でなく、かつ proto が null でない場合、TypeError 例外をスローする。obj を OrdinaryObjectCreate (proto ) とする。properties が undefined でない場合、? ObjectDefineProperties (obj , properties ) を返す。 obj を返す。
20.1.2.3 Object.defineProperties ( obj , properties )
この関数は、オブジェクトに独自プロパティを追加し、または既存の独自プロパティの属性を更新します。
呼び出されたとき、次の手順を実行します。
obj が Object でない場合、TypeError 例外をスローする。? ObjectDefineProperties (obj , properties ) を返す。
20.1.2.3.1 ObjectDefineProperties ( obj , properties )
抽象操作 ObjectDefineProperties。引数 obj (Object) および properties (ECMAScript 言語値 )。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
properties を ? ToObject (properties ) に設定する。keys を ? properties .[[OwnPropertyKeys]] () とする。propertyDescs を新しい空の List とする。keys の各要素 nextKey について、次を行う。currentPropertyDesc を ? properties .[[GetOwnProperty]] (nextKey ) とする。currentPropertyDesc が undefined でなく、currentPropertyDesc .[[Enumerable]] が true である場合、propertyDescObj を ? Get (properties , nextKey ) とする。propertyDesc を ? ToPropertyDescriptor (propertyDescObj ) とする。Record { [[Key]] : nextKey , [[Descriptor]] : propertyDesc } を propertyDescs に追加する。propertyDescs の各要素 property について、次を行う。? DefinePropertyOrThrow (obj , property .[[Key]] , property .[[Descriptor]] ) を実行する。 obj を返す。
20.1.2.4 Object.defineProperty ( obj , key , attrs )
この関数は、オブジェクトに独自プロパティを追加し、または既存の独自プロパティの属性を更新します。
呼び出されたとき、次の手順を実行します。
obj が Object でない場合、TypeError 例外をスローする。propertyKey を ? ToPropertyKey (key ) とする。propertyDesc を ? ToPropertyDescriptor (attrs ) とする。? DefinePropertyOrThrow (obj , propertyKey , propertyDesc ) を実行する。 obj を返す。
20.1.2.5 Object.entries ( obj )
この関数は呼び出されたとき、次の手順を実行します。
coerced を ? ToObject (obj ) とする。entryList を ? EnumerableOwnProperties (coerced , key+value ) とする。CreateArrayFromList (entryList ) を返す。
20.1.2.6 Object.freeze ( obj )
この関数は呼び出されたとき、次の手順を実行します。
obj が Object でない場合、obj を返す。status を ? SetIntegrityLevel (obj , frozen ) とする。status が false である場合、TypeError 例外をスローする。obj を返す。
20.1.2.7 Object.fromEntries ( iterable )
この関数は呼び出されたとき、次の手順を実行します。
? RequireObjectCoercible (iterable ) を実行する。 obj を OrdinaryObjectCreate (%Object.prototype% ) とする。表明 : obj は独自プロパティを持たない拡張可能な通常オブジェクト である。closure を、パラメーター (key , value ) を持ち、obj を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。propertyKey を ? ToPropertyKey (key ) とする。! CreateDataPropertyOrThrow (obj , propertyKey , value ) を実行する。 NormalCompletion (undefined ) を返す。adder を CreateBuiltinFunction (closure , 2, "" , « ») とする。? AddEntriesFromIterable (obj , iterable , adder ) を返す。
注
adder のために作成された関数は ECMAScript コードから直接アクセスされることはありません。
20.1.2.8 Object.getOwnPropertyDescriptor ( obj , key )
この関数は呼び出されたとき、次の手順を実行します。
coerced を ? ToObject (obj ) とする。propertyKey を ? ToPropertyKey (key ) とする。propertyDesc を ? coerced .[[GetOwnProperty]] (propertyKey ) とする。FromPropertyDescriptor (propertyDesc ) を返す。
20.1.2.9 Object.getOwnPropertyDescriptors ( obj )
この関数は呼び出されたとき、次の手順を実行します。
coerced を ? ToObject (obj ) とする。ownKeys を ? coerced .[[OwnPropertyKeys]] () とする。descs を OrdinaryObjectCreate (%Object.prototype% ) とする。ownKeys の各要素 key について、次を行う。propertyDesc を ? coerced .[[GetOwnProperty]] (key ) とする。propertyDescObj を FromPropertyDescriptor (propertyDesc ) とする。propertyDescObj が undefined でない場合、! CreateDataPropertyOrThrow (descs , key , propertyDescObj ) を実行する。descs を返す。
20.1.2.10 Object.getOwnPropertyNames ( obj )
この関数は呼び出されたとき、次の手順を実行します。
CreateArrayFromList (? GetOwnPropertyKeys (obj , string )) を返す。
20.1.2.11 Object.getOwnPropertySymbols ( obj )
この関数は呼び出されたとき、次の手順を実行します。
CreateArrayFromList (? GetOwnPropertyKeys (obj , symbol )) を返す。
20.1.2.11.1 GetOwnPropertyKeys ( value , type )
抽象操作 GetOwnPropertyKeys。引数 value (ECMAScript 言語値 ) および type ((string または symbol ))。戻り値:(正常完了 (値:リスト (要素:プロパティキー )) または throw 完了 )。 呼び出されると、次の手順を実行する。
obj を ? ToObject (value ) とする。keys を ? obj .[[OwnPropertyKeys]] () とする。nameList を新しい空の List とする。keys の各要素 nextKey について、次を行う。nextKey が Symbol で type が symbol であるか、または nextKey が String で type が string である場合、nextKey を nameList に追加する。nameList を返す。
20.1.2.12 Object.getPrototypeOf ( obj )
この関数は呼び出されたとき、次の手順を実行します。
coerced を ? ToObject (obj ) とする。? coerced .[[GetPrototypeOf]] () を返す。
20.1.2.13 Object.groupBy ( items , callback )
注
callback は2つの引数を受け取る関数であるべきです。groupBy は items 内の各要素について昇順に1回ずつ callback を呼び出し、新しいオブジェクトを構築します。callback によって返される各値はプロパティキー へ型強制されます。このような各プロパティキー について、結果オブジェクトは、そのプロパティキー をキーとし、callback の戻り値がそのキーへ型強制されたすべての要素を含む配列を値とするプロパティを持ちます。
callback は2つの引数、すなわち要素の値と要素のインデックスを指定して呼び出されます。
groupBy の戻り値は %Object.prototype% から継承しないオブジェクトです。
この関数は呼び出されたとき、次の手順を実行します。
groups を ? GroupBy (items , callback , property ) とする。obj を OrdinaryObjectCreate (null ) とする。groups の各 Record { [[Key]] , [[Elements]] } group について、次を行う。elements を CreateArrayFromList (group .[[Elements]] ) とする。! CreateDataPropertyOrThrow (obj , group .[[Key]] , elements ) を実行する。 obj を返す。
20.1.2.14 Object.hasOwn ( obj , key )
この関数は呼び出されたとき、次の手順を実行します。
coerced を ? ToObject (obj ) とする。propertyKey を ? ToPropertyKey (key ) とする。? HasOwnProperty (coerced , propertyKey ) を返す。
20.1.2.15 Object.is ( value1 , value2 )
この関数は呼び出されたとき、次の手順を実行します。
SameValue (value1 , value2 ) を返す。
20.1.2.16 Object.isExtensible ( obj )
この関数は呼び出されたとき、次の手順を実行します。
obj が Object でない場合、false を返す。? IsExtensible (obj ) を返す。
20.1.2.17 Object.isFrozen ( obj )
この関数は呼び出されたとき、次の手順を実行します。
obj が Object でない場合、true を返す。? TestIntegrityLevel (obj , frozen ) を返す。
20.1.2.18 Object.isSealed ( obj )
この関数は呼び出されたとき、次の手順を実行します。
obj が Object でない場合、true を返す。? TestIntegrityLevel (obj , sealed ) を返す。
20.1.2.19 Object.keys ( obj )
この関数は呼び出されたとき、次の手順を実行します。
coerced を ? ToObject (obj ) とする。keyList を ? EnumerableOwnProperties (coerced , key ) とする。CreateArrayFromList (keyList ) を返す。
20.1.2.20 Object.preventExtensions ( obj )
この関数は呼び出されたとき、次の手順を実行します。
obj が Object でない場合、obj を返す。status を ? obj .[[PreventExtensions]] () とする。status が false である場合、TypeError 例外をスローする。obj を返す。
20.1.2.21 Object.prototype
Object.prototype の初期値は Object prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.1.2.22 Object.seal ( obj )
この関数は呼び出されたとき、次の手順を実行します。
obj が Object でない場合、obj を返す。status を ? SetIntegrityLevel (obj , sealed ) とする。status が false である場合、TypeError 例外をスローする。obj を返す。
20.1.2.23 Object.setPrototypeOf ( obj , proto )
この関数は呼び出されたとき、次の手順を実行します。
? RequireObjectCoercible (obj ) を実行する。 proto が Object でなく、かつ proto が null でない場合、TypeError 例外をスローする。obj が Object でない場合、obj を返す。status を ? obj .[[SetPrototypeOf]] (proto ) とする。status が false である場合、TypeError 例外をスローする。obj を返す。
20.1.2.24 Object.values ( obj )
この関数は呼び出されたとき、次の手順を実行します。
coerced を ? ToObject (obj ) とする。valueList を ? EnumerableOwnProperties (coerced , value ) とする。CreateArrayFromList (valueList ) を返す。
20.1.3 Object Prototype オブジェクトのプロパティ
Object prototype オブジェクト は:
%Object.prototype% です。
値が true である [[Extensible]] 内部スロットを持ちます。
[[SetPrototypeOf]] メソッドを除き、通常オブジェクト について定義された内部メソッドを持ちます。[[SetPrototypeOf]] メソッドは 10.4.7.1 で定義されるとおりです。(したがって、これは immutable prototype 特殊オブジェクト です。)
値が null である [[Prototype]] 内部スロットを持ちます。
20.1.3.1 Object.prototype.constructor
Object.prototype.constructor の初期値は %Object% です。
20.1.3.2 Object.prototype.hasOwnProperty ( value )
このメソッドは呼び出されたとき、次の手順を実行します。
propertyKey を ? ToPropertyKey (value ) とする。obj を ? ToObject (this 値) とする。? HasOwnProperty (obj , propertyKey ) を返す。
注
手順 1 と 2 の順序は、以前の版のこの仕様において手順 1 によってスローされていた例外が、this 値が undefined または null である場合でも引き続きスローされることを保証するために選択されています。
20.1.3.3 Object.prototype.isPrototypeOf ( value )
このメソッドは呼び出されたとき、次の手順を実行します。
value が Object でない場合、false を返す。obj を ? ToObject (this 値) とする。次を繰り返す。value を ? value .[[GetPrototypeOf]] () に設定する。value が null である場合、false を返す。SameValue (obj , value ) が true である場合、true を返す。
注
手順 1 と 2 の順序は、value がオブジェクトでなく、this 値が undefined または null である場合について、以前の版のこの仕様で規定されていた動作を保持します。
20.1.3.4 Object.prototype.propertyIsEnumerable ( value )
このメソッドは呼び出されたとき、次の手順を実行します。
propertyKey を ? ToPropertyKey (value ) とする。obj を ? ToObject (this 値) とする。propertyDesc を ? obj .[[GetOwnProperty]] (propertyKey ) とする。propertyDesc が undefined である場合、false を返す。propertyDesc .[[Enumerable]] を返す。
注 1
このメソッドは prototype チェーン内のオブジェクトを考慮しません。
注 2
手順 1 と 2 の順序は、以前の版のこの仕様において手順 1 によってスローされていた例外が、this 値が undefined または null である場合でも引き続きスローされることを保証するために選択されています。
20.1.3.5 Object.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? Invoke (thisValue , "toString" ) を返す。
このメソッドの省略可能なパラメーターは使用されませんが、ECMA-402 の toLocaleString メソッドで使用されるパラメーターパターンに対応することを意図しています。ECMA-402 のサポートを含まない実装は、これらのパラメーター位置を他の目的に使用してはなりません。
注 1
このメソッドは、ロケール依存の toString 動作を持たないオブジェクトのための汎用的な toLocaleString 実装を提供します。Array、Number、Date、および %TypedArray% は、それぞれ独自のロケール依存 toLocaleString メソッドを提供します。
注 2
ECMA-402 は意図的に、この既定の実装の代替を提供していません。
20.1.3.6 Object.prototype.toString ( )
このメソッドは呼び出されたとき、次の手順を実行します。
this 値が undefined である場合、"[object Undefined]" を返す。this 値が null である場合、"[object Null]" を返す。obj を ! ToObject (this 値) とする。isArray を ? IsArray (obj ) とする。isArray が true である場合、builtinTag を "Array" とする。そうでなく、obj が [[ParameterMap]] 内部スロットを持つ場合、builtinTag を "Arguments" とする。 そうでなく、obj が [[Call]] 内部メソッドを持つ場合、builtinTag を "Function" とする。 そうでなく、obj が [[ErrorData]] 内部スロットを持つ場合、builtinTag を "Error" とする。 そうでなく、obj が [[BooleanData]] 内部スロットを持つ場合、builtinTag を "Boolean" とする。 そうでなく、obj が [[NumberData]] 内部スロットを持つ場合、builtinTag を "Number" とする。 そうでなく、obj が [[StringData]] 内部スロットを持つ場合、builtinTag を "String" とする。 そうでなく、obj が [[DateValue]] 内部スロットを持つ場合、builtinTag を "Date" とする。 そうでなく、obj が [[RegExpMatcher]] 内部スロットを持つ場合、builtinTag を "RegExp" とする。 そうでない場合、builtinTag を "Object" とする。 tag を ? Get (obj , %Symbol.toStringTag% ) とする。tag が String でない場合、tag を builtinTag に設定する。"[object " 、tag 、および "]" の文字列連結 を返す。
注
歴史的に、このメソッドは、以前の版のこの仕様でさまざまな組込みオブジェクトの名目的な型タグとして使用されていた [[Class]] 内部スロットの String 値へアクセスするために使用されることがありました。上記の toString の定義は、それらの特定種類の組込みオブジェクトを検査するために toString を使用するレガシー コードとの互換性を保持します。他の種類の組込みオブジェクトまたはプログラム定義オブジェクトについて、信頼できる型検査の仕組みを提供するものではありません。さらに、プログラムは %Symbol.toStringTag% を、このようなレガシー 型検査の信頼性を無効にする方法で使用できます。
20.1.3.7 Object.prototype.valueOf ( )
このメソッドは呼び出されたとき、次の手順を実行します。
? ToObject (this 値) を返す。
20.1.3.8 Object.prototype.__proto__
Object.prototype.__proto__ は属性 { [[Enumerable]] : false , [[Configurable]] : true } を持つアクセサープロパティ です。[[Getter]] および [[Setter]] 属性は次のように定義されます。
20.1.3.8.1 get Object.prototype.__proto__
[[Getter]] 属性の値は、引数を必要としない組込み関数です。呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。? obj .[[GetPrototypeOf]] () を返す。
20.1.3.8.2 set Object.prototype.__proto__
[[Setter]] 属性の値は、引数 proto を取る組込み関数です。呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 proto が Object でなく、かつ proto が null でない場合、undefined を返す。thisValue が Object でない場合、undefined を返す。status を ? thisValue .[[SetPrototypeOf]] (proto ) とする。status が false である場合、TypeError 例外をスローする。undefined を返す。
20.1.3.9 レガシー Object.prototype アクセサーメソッド
20.1.3.9.1 Object.prototype.__defineGetter__ ( key , getter )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。IsCallable (getter ) が false である場合、TypeError 例外をスローする。propertyDesc を PropertyDescriptor { [[Getter]] : getter , [[Enumerable]] : true , [[Configurable]] : true } とする。propertyKey を ? ToPropertyKey (key ) とする。? DefinePropertyOrThrow (obj , propertyKey , propertyDesc ) を実行する。 undefined を返す。
20.1.3.9.2 Object.prototype.__defineSetter__ ( key , setter )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。IsCallable (setter ) が false である場合、TypeError 例外をスローする。propertyDesc を PropertyDescriptor { [[Setter]] : setter , [[Enumerable]] : true , [[Configurable]] : true } とする。propertyKey を ? ToPropertyKey (key ) とする。? DefinePropertyOrThrow (obj , propertyKey , propertyDesc ) を実行する。 undefined を返す。
20.1.3.9.3 Object.prototype.__lookupGetter__ ( key )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。propertyKey を ? ToPropertyKey (key ) とする。次を繰り返す。propertyDesc を ? obj .[[GetOwnProperty]] (propertyKey ) とする。propertyDesc が undefined でない場合、IsAccessorDescriptor (propertyDesc ) が true である場合、propertyDesc .[[Getter]] を返す。undefined を返す。obj を ? obj .[[GetPrototypeOf]] () に設定する。obj が null である場合、undefined を返す。
20.1.3.9.4 Object.prototype.__lookupSetter__ ( key )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。propertyKey を ? ToPropertyKey (key ) とする。次を繰り返す。propertyDesc を ? obj .[[GetOwnProperty]] (propertyKey ) とする。propertyDesc が undefined でない場合、IsAccessorDescriptor (propertyDesc ) が true である場合、propertyDesc .[[Setter]] を返す。undefined を返す。obj を ? obj .[[GetPrototypeOf]] () に設定する。obj が null である場合、undefined を返す。
20.1.4 Object インスタンスのプロパティ
Object インスタンスは、Object prototype オブジェクト から継承されるもの以外に特別なプロパティを持ちません。
20.2 Function オブジェクト
20.2.1 Function コンストラクター
Function コンストラクター は:
%Function% です。
グローバルオブジェクト の "Function" プロパティの初期値です。
コンストラクター としてではなく関数として呼び出されたとき、新しい関数オブジェクト を作成して初期化します。したがって、関数呼出し Function(…) は、同じ引数を持つオブジェクト作成式 new Function(…) と同等です。
クラス定義の extends 節の値として使用できます。規定された Function の動作を継承しようとするサブクラスコンストラクター は、組込み関数の動作に必要な内部スロットを持つサブクラスインスタンスを作成して初期化するために、Function コンストラクター への super 呼出しを含まなければなりません。関数オブジェクト を定義するすべての ECMAScript 構文形式は Function のインスタンスを作成します。組込みの GeneratorFunction、AsyncFunction、および AsyncGeneratorFunction サブクラスを除き、Function サブクラスのインスタンスを作成する構文上の手段はありません。
20.2.1.1 Function ( ...paramArgs , bodyArg )
最後の引数(存在する場合)は関数の本体(実行可能コード)を指定し、それより前の引数は仮パラメーターを指定します。
この関数は呼び出されたとき、次の手順を実行します。
ctor をアクティブな関数オブジェクト とする。bodyArg が存在しない場合、bodyArg を空の String に設定する。? CreateDynamicFunction (ctor , NewTarget, normal , paramArgs , bodyArg ) を返す。
注
指定される各仮パラメーターごとに1つの引数を持つことは許可されますが、必須ではありません。たとえば、次の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 ( ctor , newTarget , kind , paramArgs , bodyArg )
抽象操作 CreateDynamicFunction。引数 ctor (コンストラクター )、newTarget ((コンストラクター または undefined ))、kind ((normal 、generator 、async または async-generator ))、paramArgs (リスト (要素:ECMAScript 言語値 )) および bodyArg (ECMAScript 言語値 )。戻り値:(正常完了 (値:ECMAScript 関数オブジェクト) または throw 完了 )。 ctor はこの処理を実行しているコンストラクター 関数です。newTarget は new が最初に適用されたコンストラクター です。paramArgs および bodyArg は ctor に渡された引数値を反映します。 呼び出されると、次の手順を実行する。
newTarget が undefined である場合、newTarget を ctor に設定する。kind が normal である場合、prefix を "function" とする。exprGrammar を文法記号 FunctionExpression とする。bodyGrammar を文法記号 FunctionBody [~Yield, ~Await] とする。paramGrammar を文法記号 FormalParameters [~Yield, ~Await] とする。fallbackProto を "%Function.prototype%" とする。そうでなく、kind が generator である場合、prefix を "function*" とする。exprGrammar を文法記号 GeneratorExpression とする。bodyGrammar を文法記号 GeneratorBody とする。paramGrammar を文法記号 FormalParameters [+Yield, ~Await] とする。fallbackProto を "%GeneratorFunction.prototype%" とする。 そうでなく、kind が async である場合、prefix を "async function" とする。exprGrammar を文法記号 AsyncFunctionExpression とする。bodyGrammar を文法記号 AsyncFunctionBody とする。paramGrammar を文法記号 FormalParameters [~Yield, +Await] とする。fallbackProto を "%AsyncFunction.prototype%" とする。 そうでない場合、表明 : kind は async-generator である。prefix を "async function*" とする。exprGrammar を文法記号 AsyncGeneratorExpression とする。bodyGrammar を文法記号 AsyncGeneratorBody とする。paramGrammar を文法記号 FormalParameters [+Yield, +Await] とする。fallbackProto を "%AsyncGeneratorFunction.prototype%" とする。 argCount を paramArgs の要素数とする。paramStrings を新しい空の List とする。paramArgs の各要素 arg について、次を行う。? ToString (arg ) を paramStrings に追加する。 bodyString を ? ToString (bodyArg ) とする。currentRealm を現在の Realm Record とする。? HostEnsureCanCompileStrings (currentRealm , paramStrings , bodyString , false ) を実行する。 paramString を空の String とする。argCount > 0 である場合、paramString を paramStrings [0] に設定する。k を 1 とする。k < argCount の間、次を繰り返す。nextArgString を paramStrings [k ] とする。paramString を paramString 、"," (コンマ)、および nextArgString の文字列連結 に設定する。k を k + 1 に設定する。bodyParseString を 0x000A (LINE FEED)、bodyString 、および 0x000A (LINE FEED) の文字列連結 とする。sourceString を prefix 、" anonymous(" 、paramString 、0x000A (LINE FEED)、") {" 、bodyParseString 、および "}" の文字列連結 とする。sourceText を StringToCodePoints (sourceString ) とする。params を ParseText (paramString , paramGrammar ) とする。params がエラーの List である場合、SyntaxError 例外をスローする。body を ParseText (bodyParseString , bodyGrammar ) とする。body がエラーの List である場合、SyntaxError 例外をスローする。注記 : パラメーターと本体は、それぞれ単独で有効であることを保証するために別々に構文解析される。たとえば、new Function("/*", "*/ ) {") は関数に評価されない。注記 : この手順に到達した場合、sourceText は exprGrammar の構文を持たなければならない(ただし逆は成り立たない)。次の2つの手順の目的は、exprGrammar に直接適用される早期エラー規則 を適用することである。expr を ParseText (sourceText , exprGrammar ) とする。expr がエラーの List である場合、SyntaxError 例外をスローする。funcProto を ? GetPrototypeFromConstructor (newTarget , fallbackProto ) とする。envRecord を currentRealm .[[GlobalEnv]] とする。privateEnv を null とする。func を OrdinaryFunctionCreate (funcProto , sourceText , params , body , non-lexical-this , envRecord , privateEnv ) とする。SetFunctionName (func , "anonymous" ) を実行する。kind が generator である場合、protoProto を OrdinaryObjectCreate (%GeneratorPrototype% ) とする。! DefinePropertyOrThrow (func , "prototype" , PropertyDescriptor { [[Value]] : protoProto , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 そうでなく、kind が async-generator である場合、protoProto を OrdinaryObjectCreate (%AsyncGeneratorPrototype% ) とする。! DefinePropertyOrThrow (func , "prototype" , PropertyDescriptor { [[Value]] : protoProto , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 そうでなく、kind が normal である場合、MakeConstructor (func ) を実行する。 注記 : kind が async である関数は constructable ではなく、[[Construct]] 内部メソッドも "prototype" プロパティも持たない。func を返す。
注
CreateDynamicFunction は、その関数がコンストラクター として使用される可能性に備えて、kind が async でない、作成するすべての関数に "prototype" プロパティを定義します。
20.2.2 Function コンストラクターのプロパティ
Function コンストラクター は:
20.2.2.1 Function.prototype
Function.prototype の値は Function prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.2.3 Function Prototype オブジェクトのプロパティ
Function prototype オブジェクト は:
%Function.prototype% です。
それ自体が組込み関数オブジェクト です。
任意の引数を受け取り、呼び出されると undefined を返します。
[[Construct]] 内部メソッドを持ちません。new 演算子を使用してコンストラクター として使用することはできません。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
"prototype" プロパティを持ちません。
値が +0 𝔽 である "length" プロパティを持ちます。
値が空の String である "name" プロパティを持ちます。
注
Function prototype オブジェクトは、ECMAScript 2015 仕様より前に作成された ECMAScript コードとの互換性を保証するため、関数オブジェクト であると規定されています。
20.2.3.1 Function.prototype.apply ( thisArg , argArray )
このメソッドは呼び出されたとき、次の手順を実行します。
func を this 値とする。IsCallable (func ) が false である場合、TypeError 例外をスローする。argArray が undefined または null のいずれかである場合、PrepareForTailCall () を実行する。? Call (func , thisArg ) を返す。 argList を ? CreateListFromArrayLike (argArray ) とする。PrepareForTailCall () を実行する。? Call (func , thisArg , argList ) を返す。
注 1
thisArg 値は変更されずに this 値として渡されます。これは Edition 3 からの変更であり、Edition 3 では undefined または null の thisArg はグローバルオブジェクト に置き換えられ、その他のすべての値には ToObject が適用され、その結果が this 値として渡されていました。thisArg は変更されずに渡されますが、非 strict 関数 は関数への進入時に依然としてこれらの変換を実行します。
注 2
func がアロー関数または bound function 特殊オブジェクト のいずれかである場合、手順 6 の関数 [[Call]] によって thisArg は無視されます。
20.2.3.2 Function.prototype.bind ( thisArg , ...args )
このメソッドは呼び出されたとき、次の手順を実行します。
target を this 値とする。IsCallable (target ) が false である場合、TypeError 例外をスローする。boundFunc を ? BoundFunctionCreate (target , thisArg , args ) とする。length を 0 とする。targetHasLength を ? HasOwnProperty (target , "length" ) とする。targetHasLength が true である場合、targetLength を ? Get (target , "length" ) とする。targetLength が Number である場合、targetLengthAsInt を ! ToIntegerOrInfinity (targetLength ) とする。targetLengthAsInt = +∞ である場合、length を +∞ に設定する。そうでなく、targetLengthAsInt = -∞ である場合、length を 0 に設定する。 そうでない場合、argCount を args の要素数とする。length を max (targetLengthAsInt - argCount , 0) に設定する。 SetFunctionLength (boundFunc , length ) を実行する。targetName を ? Get (target , "name" ) とする。targetName が String でない場合、targetName を空の String に設定する。SetFunctionName (boundFunc , targetName , "bound" ) を実行する。boundFunc を返す。
注 1
Function.prototype.bind を使用して作成された Function オブジェクトは特殊オブジェクト です。また、"prototype" プロパティを持ちません。
注 2
target がアロー関数または bound function 特殊オブジェクト のいずれかである場合、このメソッドに渡された thisArg は、以後の func の呼出しでは使用されません。
20.2.3.3 Function.prototype.call ( thisArg , ...args )
このメソッドは呼び出されたとき、次の手順を実行します。
func を this 値とする。IsCallable (func ) が false である場合、TypeError 例外をスローする。PrepareForTailCall () を実行する。? Call (func , thisArg , args ) を返す。
注 1
thisArg 値は変更されずに this 値として渡されます。これは Edition 3 からの変更であり、Edition 3 では undefined または null の thisArg はグローバルオブジェクト に置き換えられ、その他のすべての値には ToObject が適用され、その結果が this 値として渡されていました。thisArg は変更されずに渡されますが、非 strict 関数 は関数への進入時に依然としてこれらの変換を実行します。
注 2
func がアロー関数または bound function 特殊オブジェクト のいずれかである場合、手順 4 の関数 [[Call]] によって thisArg は無視されます。
20.2.3.4 Function.prototype.constructor
Function.prototype.constructor の初期値は %Function% です。
20.2.3.5 Function.prototype.toString ( )
このメソッドは呼び出されたとき、次の手順を実行します。
func を this 値とする。func が Object であり、func が [[SourceText]] 内部スロットを持ち、func .[[SourceText]] が Unicode コードポイントの列であり、HostHasSourceTextAvailable (func ) が true である場合、CodePointsToString (func .[[SourceText]] ) を返す。func が 組込み関数オブジェクト である場合、func の実装定義 の String ソースコード表現を返す。この表現は NativeFunction の構文を持たなければならない。さらに、func が [[InitialName]] 内部スロットを持ち、func .[[InitialName]] が String である場合、返される String のうち NativeFunctionAccessor opt PropertyName に一致する部分は func .[[InitialName]] でなければならない。func が Object であり、IsCallable (func ) が true である場合、func の実装定義 の String ソースコード表現を返す。この表現は NativeFunction の構文を持たなければならない。TypeError 例外をスローする。
NativeFunction :
function
NativeFunctionAccessor opt
PropertyName [~Yield, ~Await] opt
(
FormalParameters [~Yield, ~Await]
)
{
[
native
code
]
}
NativeFunctionAccessor :
get
set
20.2.3.6 Function.prototype [ %Symbol.hasInstance% ] ( value )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? OrdinaryHasInstance (thisValue , value ) を返す。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
注
これは、ほとんどの関数が継承する %Symbol.hasInstance% の既定の実装です。%Symbol.hasInstance% は、ある値が特定のコンストラクター のインスタンスであるかどうかを判定するために instanceof 演算子によって呼び出されます。たとえば次のような式は、
v instanceof F
次のように評価されます。
F[%Symbol .hasInstance %](v)
コンストラクター 関数は、関数上で別の %Symbol.hasInstance% メソッドを公開することにより、instanceof によってどのオブジェクトがそのインスタンスとして認識されるかを制御できます。
このプロパティは、bound function の対象関数をグローバルに公開するために使用できる改変を防ぐため、書込み不可かつ構成不可です。
このメソッドの "name" プロパティの値は "[Symbol.hasInstance]" です。
20.2.4 Function インスタンス
すべての Function インスタンスは ECMAScript 関数オブジェクト であり、表 26 に列挙される内部スロットを持ちます。Function.prototype.bind メソッド(20.2.3.2 )を使用して作成された Function オブジェクトは、表 27 に列挙される内部スロットを持ちます。
Function インスタンスは次のプロパティを持ちます。
20.2.4.1 length
"length" プロパティの値は、関数が通常期待する引数の数を示す整数 Number です。ただし、言語はそれ以外の数の引数で関数を呼び出すことも許可します。"length" プロパティで指定された数とは異なる数の引数で呼び出されたときの関数の動作は、その関数に依存します。このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
20.2.4.2 name
"name" プロパティの値は、その関数を説明する String です。名前は意味論上の意味を持ちませんが、通常は ECMAScript ソーステキスト 内の定義位置でその関数を参照するために使用される変数名またはプロパティ名 です。このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
この仕様によって文脈上の名前が関連付けられていない匿名関数オブジェクト は、"name" プロパティの値として空の String を使用します。
20.2.4.3 prototype
コンストラクター として使用できる Function インスタンスは "prototype" プロパティを持ちます。このような Function インスタンスが作成されるたびに、別の通常オブジェクト も作成され、関数の "prototype" プロパティの初期値になります。別段の規定がない限り、"prototype" プロパティの値は、その関数がコンストラクター として呼び出されたときに作成されるオブジェクトの [[Prototype]] 内部スロットを初期化するために使用されます。
このプロパティは属性 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
注
Function.prototype.bind を使用して作成された Function オブジェクト、または MethodDefinition (GeneratorMethod または AsyncGeneratorMethod ではないもの)もしくは ArrowFunction を評価して作成された Function オブジェクトは、"prototype" プロパティを持ちません。
20.2.5 HostHasSourceTextAvailable ( func )
ホスト定義の抽象操作 HostHasSourceTextAvailable。引数 func (関数オブジェクト )。戻り値:Boolean。 ホスト環境 が func のソーステキストの提供を防止できるようにします。
HostHasSourceTextAvailable の実装は、次の要件に適合しなければなりません。
そのパラメーターに関して決定論的でなければなりません。特定の func を引数として呼び出されるたびに、同じ結果を返さなければなりません。
HostHasSourceTextAvailable の既定の実装は true を返すことです。
20.3 Boolean オブジェクト
20.3.1 Boolean コンストラクター
Boolean コンストラクター は:
%Boolean% です。
グローバルオブジェクト の "Boolean" プロパティの初期値です。
コンストラクター として呼び出されたとき、新しい Boolean オブジェクトを作成して初期化します。
コンストラクター としてではなく関数として呼び出されたとき、型変換を実行します。
クラス定義の extends 節の値として使用できます。規定された Boolean の動作を継承しようとするサブクラスコンストラクター は、[[BooleanData]] 内部スロットを持つサブクラスインスタンスを作成して初期化するために、Boolean コンストラクター への super 呼出しを含まなければなりません。
20.3.1.1 Boolean ( value )
この関数は呼び出されたとき、次の手順を実行します。
bool を ToBoolean (value ) とする。NewTarget が undefined である場合、bool を返す。 obj を ? OrdinaryCreateFromConstructor (NewTarget, "%Boolean.prototype%" , « [[BooleanData]] ») とする。obj .[[BooleanData]] を bool に設定する。obj を返す。
20.3.2 Boolean コンストラクターのプロパティ
Boolean コンストラクター は:
20.3.2.1 Boolean.prototype
Boolean.prototype の初期値は Boolean prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.3.3 Boolean Prototype オブジェクトのプロパティ
Boolean prototype オブジェクト は:
%Boolean.prototype% です。
通常オブジェクト です。
それ自体が Boolean オブジェクトです。値が false である [[BooleanData]] 内部スロットを持ちます。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
20.3.3.1 Boolean.prototype.constructor
Boolean.prototype.constructor の初期値は %Boolean% です。
20.3.3.2 Boolean.prototype.toString ( )
このメソッドは呼び出されたとき、次の手順を実行します。
bool を ? ThisBooleanValue (this 値) とする。bool が true である場合、"true" を返す。"false" を返す。
20.3.3.3 Boolean.prototype.valueOf ( )
このメソッドは呼び出されたとき、次の手順を実行します。
? ThisBooleanValue (this 値) を返す。
20.3.3.3.1 ThisBooleanValue ( arg )
抽象操作 ThisBooleanValue。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
arg が Boolean である場合、arg を返す。arg が Object であり、arg が [[BooleanData]] 内部スロットを持つ場合、bool を arg .[[BooleanData]] とする。表明 : bool は Boolean である。bool を返す。TypeError 例外をスローする。
20.3.4 Boolean インスタンスのプロパティ
Boolean インスタンスは、Boolean prototype オブジェクト からプロパティを継承する通常オブジェクト です。Boolean インスタンスは [[BooleanData]] 内部スロットを持ちます。[[BooleanData]] 内部スロットは、この Boolean オブジェクトによって表される Boolean 値です。
20.4 Symbol オブジェクト
20.4.1 Symbol コンストラクター
Symbol コンストラクター は:
%Symbol% です。
グローバルオブジェクト の "Symbol" プロパティの初期値です。
関数として呼び出されたとき、新しい Symbol 値を返します。
new 演算子とともに使用することを意図していません。
サブクラス化されることを意図していません。
クラス定義の extends 節の値として使用できますが、それに対する super 呼出しは例外を発生させます。
20.4.1.1 Symbol ( [ description ] )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined でない場合、TypeError 例外をスローする。 description が undefined である場合、descString を undefined とする。そうでない場合、descString を ? ToString (description ) とする。 descString を [[Description]] とする新しい Symbol を返す。
20.4.2 Symbol コンストラクターのプロパティ
Symbol コンストラクター は:
20.4.2.1 Symbol.asyncDispose
Symbol.asyncDispose の初期値は well-known symbol %Symbol.asyncDispose% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.2 Symbol.asyncIterator
Symbol.asyncIterator の初期値は well-known symbol %Symbol.asyncIterator% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.3 Symbol.dispose
Symbol.dispose の初期値は well-known symbol %Symbol.dispose% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.4 Symbol.for ( key )
この関数は呼び出されたとき、次の手順を実行します。
stringKey を ? ToString (key ) とする。agentRecord を周囲の agent の Agent Record とする。globalSymbolRegistry を agentRecord .[[GlobalSymbolRegistry]] とする。globalSymbolRegistry の各要素 element について、次を行う。element .[[Key]] が stringKey である場合、element .[[Symbol]] を返す。表明 : globalSymbolRegistry は現在 stringKey の項目を含まない。newSymbol を、[[Description]] が stringKey である新しい Symbol とする。GlobalSymbolRegistry Record { [[Key]] : stringKey , [[Symbol]] : newSymbol } を globalSymbolRegistry に追加する。newSymbol を返す。
20.4.2.5 Symbol.hasInstance
Symbol.hasInstance の初期値は well-known symbol %Symbol.hasInstance% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.6 Symbol.isConcatSpreadable
Symbol.isConcatSpreadable の初期値は well-known symbol %Symbol.isConcatSpreadable% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.7 Symbol.iterator
Symbol.iterator の初期値は well-known symbol %Symbol.iterator% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.8 Symbol.keyFor ( symbol )
この関数は呼び出されたとき、次の手順を実行します。
symbol が Symbol でない場合、TypeError 例外をスローする。KeyForSymbol (symbol ) を返す。
20.4.2.9 Symbol.match
Symbol.match の初期値は well-known symbol %Symbol.match% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.10 Symbol.matchAll
Symbol.matchAll の初期値は well-known symbol %Symbol.matchAll% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.11 Symbol.prototype
Symbol.prototype の初期値は Symbol prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.12 Symbol.replace
Symbol.replace の初期値は well-known symbol %Symbol.replace% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.13 Symbol.search
Symbol.search の初期値は well-known symbol %Symbol.search% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.14 Symbol.species
Symbol.species の初期値は well-known symbol %Symbol.species% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.15 Symbol.split
Symbol.split の初期値は well-known symbol %Symbol.split% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.16 Symbol.toPrimitive
Symbol.toPrimitive の初期値は well-known symbol %Symbol.toPrimitive% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.17 Symbol.toStringTag
Symbol.toStringTag の初期値は well-known symbol %Symbol.toStringTag% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.2.18 Symbol.unscopables
Symbol.unscopables の初期値は well-known symbol %Symbol.unscopables% (表 1 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.4.3 Symbol Prototype オブジェクトのプロパティ
Symbol prototype オブジェクト は:
%Symbol.prototype% です。
通常オブジェクト です。
Symbol インスタンスではなく、[[SymbolData]] 内部スロットを持ちません。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
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 アクセサー関数は、呼び出されたときに次の手順を実行します。
symbol を ? ThisSymbolValue (this 値) とする。symbol .[[Description]] を返す。
20.4.3.3 Symbol.prototype.toString ( )
このメソッドは呼び出されたとき、次の手順を実行します。
symbol を ? ThisSymbolValue (this 値) とする。SymbolDescriptiveString (symbol ) を返す。
20.4.3.3.1 SymbolDescriptiveString ( symbol )
抽象操作 SymbolDescriptiveString。引数 symbol (Symbol)。戻り値:String。 呼び出されると、次の手順を実行する。
description を symbol .[[Description]] とする。description が undefined である場合、description を空の String に設定する。表明 : description は String である。"Symbol(" 、description 、および ")" の文字列連結 を返す。
20.4.3.4 Symbol.prototype.valueOf ( )
このメソッドは呼び出されたとき、次の手順を実行します。
? ThisSymbolValue (this 値) を返す。
20.4.3.4.1 ThisSymbolValue ( arg )
抽象操作 ThisSymbolValue。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:Symbol) または throw 完了 )。 呼び出されると、次の手順を実行する。
arg が Symbol である場合、arg を返す。arg が Object であり、arg が [[SymbolData]] 内部スロットを持つ場合、symbol を arg .[[SymbolData]] とする。表明 : symbol は Symbol である。symbol を返す。TypeError 例外をスローする。
20.4.3.5 Symbol.prototype [ %Symbol.toPrimitive% ] ( hint )
このメソッドは、Symbol オブジェクトをプリミティブ値へ変換するために ECMAScript 言語演算子によって呼び出されます。
呼び出されたとき、次の手順を実行します。
? ThisSymbolValue (this 値) を返す。
注
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
このメソッドの "name" プロパティの値は "[Symbol.toPrimitive]" です。
20.4.3.6 Symbol.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "Symbol" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
20.4.4 Symbol インスタンスのプロパティ
Symbol インスタンスは、Symbol prototype オブジェクト からプロパティを継承する通常オブジェクト です。Symbol インスタンスは [[SymbolData]] 内部スロットを持ちます。[[SymbolData]] 内部スロットは、この Symbol オブジェクトによって表される Symbol 値です。
20.4.5 Symbol の抽象操作
20.4.5.1 GlobalSymbolRegistry Record
GlobalSymbolRegistry Record は、String キーを Symbol.for を介して登録された Symbol 値と関連付けるために使用される Record です。
GlobalSymbolRegistry Record は 表 59 に列挙されるフィールドを持ちます。
表 59: GlobalSymbolRegistry Record のフィールド
フィールド名
値
用途
[[Key]]
a String
Symbol をグローバルに識別するために使用される文字列キー。
[[Symbol]]
a Symbol
任意の realm から取得できる symbol。
20.4.5.2 KeyForSymbol ( symbol )
抽象操作 KeyForSymbol。引数 symbol (Symbol)。戻り値:(String または undefined )。 symbol が周囲の agent の [[GlobalSymbolRegistry]] List 内にある場合、symbol を登録するために使用された String が返されます。 呼び出されると、次の手順を実行する。
agentRecord を周囲の agent の Agent Record とする。globalSymbolRegistry を agentRecord .[[GlobalSymbolRegistry]] とする。globalSymbolRegistry の各要素 element について、次を行う。SameValue (element .[[Symbol]] , symbol ) が true である場合、element .[[Key]] を返す。表明 : globalSymbolRegistry は現在 symbol の項目を含まない。undefined を返す。
20.5 Error オブジェクト
実行時エラーが発生すると、Error オブジェクトのインスタンスが例外としてスローされます。Error オブジェクトは、ユーザー定義の例外クラスの基底オブジェクトとしても使用できます。
ECMAScript 実装が実行時エラーを検出すると、20.5.5 で定義される NativeError オブジェクトのいずれかの新しいインスタンス、20.5.7 で定義される AggregateError オブジェクトの新しいインスタンス、または 20.5.8 で定義される SuppressedError オブジェクトの新しいインスタンスをスローします。これらの各オブジェクトは、以下で説明される構造を持ち、NativeError の代わりにコンストラクター 名として使用される名前、prototype オブジェクトの "name" プロパティ、prototype オブジェクトの実装定義 の "message" プロパティ、および %AggregateError% 固有の "errors" プロパティまたは %SuppressedError% 固有の "error" および "suppressed" プロパティの有無だけが異なります。
20.5.1 Error コンストラクター
Error コンストラクター は:
%Error% です。
グローバルオブジェクト の "Error" プロパティの初期値です。
コンストラクター としてではなく関数として呼び出されたとき、新しい Error オブジェクトを作成して初期化します。したがって、関数呼出し Error(…) は、同じ引数を持つオブジェクト作成式 new Error(…) と同等です。
クラス定義の extends 節の値として使用できます。規定された Error の動作を継承しようとするサブクラスコンストラクター は、[[ErrorData]] 内部スロットを持つサブクラスインスタンスを作成して初期化するために、Error コンストラクター への super 呼出しを含まなければなりません。
20.5.1.1 Error ( message [ , options ] )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、newTarget をアクティブな関数オブジェクト とする。そうでない場合、newTarget を NewTarget とする。 obj を ? OrdinaryCreateFromConstructor (newTarget , "%Error.prototype%" , « [[ErrorData]] ») とする。message が undefined でない場合、messageString を ? ToString (message ) とする。CreateNonEnumerableDataPropertyOrThrow (obj , "message" , messageString ) を実行する。? InstallErrorCause (obj , options ) を実行する。 obj を返す。
20.5.2 Error コンストラクターのプロパティ
Error コンストラクター は:
20.5.2.1 Error.isError ( arg )
この関数は呼び出されたとき、次の手順を実行します。
arg が Object でない場合、false を返す。arg が [[ErrorData]] 内部スロットを持たない場合、false を返す。true を返す。
20.5.2.2 Error.prototype
Error.prototype の初期値は Error prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.5.3 Error Prototype オブジェクトのプロパティ
Error prototype オブジェクト は:
%Error.prototype% です。
通常オブジェクト です。
Error インスタンスではなく、[[ErrorData]] 内部スロットを持ちません。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
20.5.3.1 Error.prototype.constructor
Error.prototype.constructor の初期値は %Error% です。
20.5.3.2 Error.prototype.message
Error.prototype.message の初期値は空の String です。
20.5.3.3 Error.prototype.name
Error.prototype.name の初期値は "Error" です。
20.5.3.4 Error.prototype.toString ( )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。obj が Object でない場合、TypeError 例外をスローする。name を ? Get (obj , "name" ) とする。name が undefined である場合、name を "Error" に設定する。そうでない場合、name を ? ToString (name ) に設定する。message を ? Get (obj , "message" ) とする。message が undefined である場合、message を空の String に設定する。そうでない場合、message を ? ToString (message ) に設定する。name が空の String である場合、message を返す。message が空の String である場合、name を返す。name 、コード単位 0x003A (COLON)、コード単位 0x0020 (SPACE)、および message の文字列連結 を返す。
20.5.4 Error インスタンスのプロパティ
Error インスタンスは、Error prototype オブジェクト からプロパティを継承し、値が undefined である [[ErrorData]] 内部スロットを持つ通常オブジェクト です。[[ErrorData]] の唯一の規定された用途は、Object.prototype.toString および Error.isError 内で Error、AggregateError、SuppressedError、および NativeError のインスタンスを Error オブジェクトとして識別することです。
20.5.5 この標準で使用されるネイティブエラー型
実行時エラーが検出されると、以下の NativeError オブジェクトのいずれかの新しいインスタンス、または AggregateError オブジェクトもしくは SuppressedError オブジェクトのいずれかの新しいインスタンスがスローされます。すべての NativeError オブジェクトは、20.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% です。
TypeError は、他の NativeError オブジェクトのいずれも失敗原因を示すものとして適切でない場合に、操作が失敗したことを示すために使用されます。
20.5.5.6 URIError
URIError コンストラクター は %URIError% です。
グローバル URI 処理関数のいずれかが、その定義と互換性のない方法で使用されたことを示します。
20.5.6 NativeError オブジェクトの構造
これらの各オブジェクトは以下で説明される構造を持ち、コンストラクター 名として使用される名前と、prototype オブジェクトの "name" プロパティだけが異なります。
各エラーオブジェクトについて、定義内の NativeError への参照は、20.5.5 にある適切なエラーオブジェクト名に置き換えるものとします。
20.5.6.1 NativeError コンストラクター
各 NativeError コンストラクター は:
コンストラクター としてではなく関数として呼び出されたとき、新しい NativeError オブジェクトを作成して初期化します。オブジェクトを関数として呼び出すことは、同じ引数でコンストラクター として呼び出すことと同等です。したがって、関数呼出し NativeError (…) は、同じ引数を持つオブジェクト作成式 new NativeError (…) と同等です。
クラス定義の extends 節の値として使用できます。規定された NativeError の動作を継承しようとするサブクラスコンストラクター は、[[ErrorData]] 内部スロットを持つサブクラスインスタンスを作成して初期化するために、NativeError コンストラクター への super 呼出しを含まなければなりません。
20.5.6.1.1 NativeError ( message [ , options ] )
各 NativeError 関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、newTarget をアクティブな関数オブジェクト とする。そうでない場合、newTarget を NewTarget とする。 obj を ? OrdinaryCreateFromConstructor (newTarget , "%NativeError .prototype%" , « [[ErrorData]] ») とする。message が undefined でない場合、messageString を ? ToString (message ) とする。CreateNonEnumerableDataPropertyOrThrow (obj , "message" , messageString ) を実行する。? InstallErrorCause (obj , options ) を実行する。 obj を返す。
手順 2 で渡される文字列の実際の値は、定義されている NativeError コンストラクター に応じて、"%EvalError.prototype%" 、"%RangeError.prototype%" 、"%ReferenceError.prototype%" 、"%SyntaxError.prototype%" 、"%TypeError.prototype%" 、または "%URIError.prototype%" のいずれかです。
20.5.6.2 NativeError コンストラクターのプロパティ
各 NativeError コンストラクター は:
値が %Error% である [[Prototype]] 内部スロットを持ちます。
値が String 値 "NativeError " である "name" プロパティを持ちます。
次のプロパティを持ちます。
20.5.6.2.1 NativeError .prototype
NativeError .prototype の初期値は NativeError prototype オブジェクト(20.5.6.3 )です。各 NativeError コンストラクター は個別の prototype オブジェクトを持ちます。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.5.6.3 NativeError Prototype オブジェクトのプロパティ
各 NativeError prototype オブジェクト は:
20.5.6.3.1 NativeError .prototype.constructor
特定の NativeError コンストラクター に対する prototype の "constructor" プロパティの初期値は、そのコンストラクター 自身です。
20.5.6.3.2 NativeError .prototype.message
特定の NativeError コンストラクター に対する prototype の "message" プロパティの初期値は空の String です。
20.5.6.3.3 NativeError .prototype.name
特定の NativeError コンストラクター に対する prototype の "name" プロパティの初期値は、そのコンストラクター の名前(NativeError の代わりに使用される名前)からなる String 値です。
20.5.6.4 NativeError インスタンスのプロパティ
NativeError インスタンスは、それぞれの NativeError prototype オブジェクトからプロパティを継承し、値が undefined である [[ErrorData]] 内部スロットを持つ通常オブジェクト です。[[ErrorData]] の唯一の規定された用途は、Object.prototype.toString(20.1.3.6 )および Error.isError(20.5.2.1 )によって Error、AggregateError、SuppressedError、または NativeError のインスタンスを識別することです。
20.5.7 AggregateError オブジェクト
20.5.7.1 AggregateError コンストラクター
AggregateError コンストラクター は:
%AggregateError% です。
グローバルオブジェクト の "AggregateError" プロパティの初期値です。
コンストラクター としてではなく関数として呼び出されたとき、新しい AggregateError オブジェクトを作成して初期化します。したがって、関数呼出し AggregateError(…) は、同じ引数を持つオブジェクト作成式 new AggregateError(…) と同等です。
クラス定義の extends 節の値として使用できます。規定された AggregateError の動作を継承しようとするサブクラスコンストラクター は、[[ErrorData]] 内部スロットを持つサブクラスインスタンスを作成して初期化するために、AggregateError コンストラクター への super 呼出しを含まなければなりません。
20.5.7.1.1 AggregateError ( errors , message [ , options ] )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、newTarget をアクティブな関数オブジェクト とする。そうでない場合、newTarget を NewTarget とする。 obj を ? OrdinaryCreateFromConstructor (newTarget , "%AggregateError.prototype%" , « [[ErrorData]] ») とする。message が undefined でない場合、messageString を ? ToString (message ) とする。CreateNonEnumerableDataPropertyOrThrow (obj , "message" , messageString ) を実行する。? InstallErrorCause (obj , options ) を実行する。 errorsList を ? IteratorToList (? GetIterator (errors , sync )) とする。! DefinePropertyOrThrow (obj , "errors" , PropertyDescriptor { [[Configurable]] : true , [[Enumerable]] : false , [[Writable]] : true , [[Value]] : CreateArrayFromList (errorsList ) }) を実行する。 obj を返す。
20.5.7.2 AggregateError コンストラクターのプロパティ
AggregateError コンストラクター は:
値が %Error% である [[Prototype]] 内部スロットを持ちます。
次のプロパティを持ちます。
20.5.7.2.1 AggregateError.prototype
AggregateError.prototype の初期値は %AggregateError.prototype% です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.5.7.3 AggregateError Prototype オブジェクトのプロパティ
AggregateError prototype オブジェクト は:
%AggregateError.prototype% です。
通常オブジェクト です。
Error インスタンスでも AggregateError インスタンスでもなく、[[ErrorData]] 内部スロットを持ちません。
値が %Error.prototype% である [[Prototype]] 内部スロットを持ちます。
20.5.7.3.1 AggregateError.prototype.constructor
AggregateError.prototype.constructor の初期値は %AggregateError% です。
20.5.7.3.2 AggregateError.prototype.message
AggregateError.prototype.message の初期値は空の String です。
20.5.7.3.3 AggregateError.prototype.name
AggregateError.prototype.name の初期値は "AggregateError" です。
20.5.7.4 AggregateError インスタンスのプロパティ
AggregateError インスタンスは、それぞれの AggregateError prototype オブジェクト からプロパティを継承し、値が undefined である [[ErrorData]] 内部スロットを持つ通常オブジェクト です。[[ErrorData]] の唯一の規定された用途は、Object.prototype.toString(20.1.3.6 )および Error.isError(20.5.2.1 )によって Error、AggregateError、SuppressedError、または NativeError のインスタンスを識別することです。
20.5.8 SuppressedError オブジェクト
20.5.8.1 SuppressedError コンストラクター
SuppressedError コンストラクター は:
%SuppressedError% です。
グローバルオブジェクト の "SuppressedError" プロパティの初期値です。
コンストラクター としてではなく関数として呼び出されたとき、新しい SuppressedError オブジェクトを作成して初期化します。したがって、関数呼出し SuppressedError(…) は、同じ引数を持つオブジェクト作成式 new SuppressedError(…) と同等です。
クラス定義の extends 節の値として使用できます。規定された SuppressedError の動作を継承しようとするサブクラスコンストラクター は、[[ErrorData]] 内部スロットを持つサブクラスインスタンスを作成して初期化するために、SuppressedError コンストラクター への super 呼出しを含まなければなりません。
20.5.8.1.1 SuppressedError ( error , suppressed , message )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、newTarget をアクティブな関数オブジェクト とする。そうでない場合、newTarget を NewTarget とする。 obj を ? OrdinaryCreateFromConstructor (newTarget , "%SuppressedError.prototype%" , « [[ErrorData]] ») とする。message が undefined でない場合、messageString を ? ToString (message ) とする。CreateNonEnumerableDataPropertyOrThrow (obj , "message" , messageString ) を実行する。CreateNonEnumerableDataPropertyOrThrow (obj , "error" , error ) を実行する。CreateNonEnumerableDataPropertyOrThrow (obj , "suppressed" , suppressed ) を実行する。obj を返す。
20.5.8.2 SuppressedError コンストラクターのプロパティ
SuppressedError コンストラクター は:
値が %Error% である [[Prototype]] 内部スロットを持ちます。
次のプロパティを持ちます。
20.5.8.2.1 SuppressedError.prototype
SuppressedError.prototype の初期値は SuppressedError prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
20.5.8.3 SuppressedError Prototype オブジェクトのプロパティ
SuppressedError prototype オブジェクト は:
%SuppressedError.prototype% です。
通常オブジェクト です。
Error インスタンスでも SuppressedError インスタンスでもなく、[[ErrorData]] 内部スロットを持ちません。
値が %Error.prototype% である [[Prototype]] 内部スロットを持ちます。
20.5.8.3.1 SuppressedError.prototype.constructor
SuppressedError.prototype.constructor の初期値は %SuppressedError% です。
20.5.8.3.2 SuppressedError.prototype.message
SuppressedError.prototype.message の初期値は空の String です。
20.5.8.3.3 SuppressedError.prototype.name
SuppressedError.prototype.name の初期値は "SuppressedError" です。
20.5.8.4 SuppressedError インスタンスのプロパティ
SuppressedError インスタンスは、それぞれの SuppressedError prototype オブジェクト からプロパティを継承し、値が undefined である [[ErrorData]] 内部スロットを持つ通常オブジェクト です。[[ErrorData]] の唯一の規定された用途は、Object.prototype.toString および Error.isError 内で Error、AggregateError、SuppressedError、および NativeError のインスタンスを Error オブジェクトとして識別することです。
20.5.9 Error オブジェクトの抽象操作
20.5.9.1 InstallErrorCause ( obj , options )
抽象操作 InstallErrorCause。引数 obj (Object) および options (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 options に "cause" プロパティが存在する場合に、obj 上に "cause" プロパティを作成するために使用されます。 呼び出されると、次の手順を実行する。
options が Object であり、? HasProperty (options , "cause" ) が true である場合、cause を ? Get (options , "cause" ) とする。CreateNonEnumerableDataPropertyOrThrow (obj , "cause" , cause ) を実行する。unused を返す。
21 数値と日付
21.1 Number オブジェクト
21.1.1 Number コンストラクター
Number コンストラクター は:
%Number% です。
グローバルオブジェクト の "Number" プロパティの初期値です。
コンストラクター として呼び出されたとき、新しい Number オブジェクトを作成して初期化します。
コンストラクター としてではなく関数として呼び出されたとき、型変換を実行します。
クラス定義の extends 節の値として使用できます。規定された Number の動作を継承しようとするサブクラスコンストラクター は、[[NumberData]] 内部スロットを持つサブクラスインスタンスを作成して初期化するために、Number コンストラクター への super 呼出しを含まなければなりません。
21.1.1.1 Number ( value )
この関数は呼び出されたとき、次の手順を実行します。
value が存在する場合、primitive を ? ToNumeric (value ) とする。primitive が BigInt である場合、n を 𝔽 (ℝ (primitive )) とする。そうでない場合、n を primitive とする。 そうでない場合、n を +0 𝔽 とする。 NewTarget が undefined である場合、n を返す。 obj を ? OrdinaryCreateFromConstructor (NewTarget, "%Number.prototype%" , « [[NumberData]] ») とする。obj .[[NumberData]] を n に設定する。obj を返す。
21.1.2 Number コンストラクターのプロパティ
Number コンストラクター は:
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 )
この関数は、呼び出されたときに次の手順を実行する。
number が有限 Number である場合、true を返す。false を返す。
21.1.2.3 Number.isInteger ( number )
この関数は、呼び出されたときに次の手順を実行する。
number が整数 Number である場合、true を返す。false を返す。
21.1.2.4 Number.isNaN ( number )
この関数は、呼び出されたときに次の手順を実行する。
number が Number でない場合、false を返す。number が NaN である場合、true を返す。false を返す。
注
この関数は、引数が NaN であるかどうかを判定する前に引数を Number に変換しないという点で、グローバル isNaN 関数(19.2.3 )とは異なる。
21.1.2.5 Number.isSafeInteger ( number )
注
整数 n が「安全な整数 」であるのは、n に対する Number 値 が他のいかなる整数 に対する Number 値 でもない場合に限る。
この関数は、呼び出されたときに次の手順を実行する。
number が整数 Number である場合、abs (ℝ (number )) ≤ 253 - 1 である場合、true を返す。false を返す。
21.1.2.6 Number.MAX_SAFE_INTEGER
注
IEEE 754-2019 の精度制限によって必要となる丸め動作により、Number.MAX_SAFE_INTEGER より大きいすべての整数 に対する Number 値 は、少なくとも 1 つの別の整数 と共有される。したがって、そのような絶対値の大きい整数 は安全 ではなく、Number 値 として正確に表現できることも、互いに区別できることさえも保証されない。たとえば、9007199254740992 と 9007199254740993 はどちらも 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
注
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 倍精度二進表現では、可能な最小値は非正規化数である。実装が非正規化値をサポートしない場合、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]] 内部スロットを持つオブジェクトでなければならない。
メソッドの仕様内における「この Number 値 」という語句は、そのメソッド呼び出しの this 値を引数として抽象演算 ThisNumberValue を呼び出すことによって返される結果を指す。
21.1.3.1 Number.prototype.constructor
Number.prototype.constructor の初期値は %Number% である。
21.1.3.2 Number.prototype.toExponential ( fractionDigits )
このメソッドは、この Number 値 を、仮数の小数点の前に 1 桁、仮数の小数点の後に fractionDigits 桁を持つ 10 進指数表記で表した String を返す。fractionDigits が undefined の場合、Number を一意に特定するために必要なだけの仮数桁を含む(この場合 Number が常に指数表記で出力されることを除けば ToString と同様である)。
呼び出されたとき、次の手順を実行する。
number を ? ThisNumberValue (this 値) とする。fractionCount を ? ToIntegerOrInfinity (fractionDigits ) とする。表明 : fractionDigits が undefined である場合、fractionCount は 0 である。number が有限 Number でない場合、Number::toString (number , 10) を返す。fractionCount が整数 でない場合、RangeError 例外を投げる。fractionCount < 0 または fractionCount > 100 である場合、RangeError 例外を投げる。number を ℝ (number ) に設定する。sign を空の String とする。number < 0 である場合、sign を "-" に設定する。number を -number に設定する。number = 0 である場合、significand を、コード単位 0x0030 (DIGIT ZERO) が fractionCount + 1 個並んだ String 値とする。exponent を 0 とする。それ以外の場合、fractionDigits が undefined でない場合、10fractionCount ≤ intSignificand < 10fractionCount + 1 であり、intSignificand × 10exponent - fractionCount - number が可能な限り 0 に近くなるような整数 exponent および intSignificand とする。そのような exponent と intSignificand の組が 2 つある場合、intSignificand × 10exponent - fractionCount が大きい方の exponent と intSignificand を選ぶ。 それ以外の場合、ff ≥ 0、10ff ≤ intSignificand < 10ff + 1 、𝔽 (intSignificand × 10exponent - ff ) が 𝔽 (number ) であり、ff が可能な限り小さくなるような整数 exponent 、intSignificand 、および ff とする。intSignificand の 10 進表現は ff + 1 桁を持ち、intSignificand は 10 で割り切れず、intSignificand の最下位桁はこれらの基準によって必ずしも一意に決定されないことに注意。fractionCount を ff に設定する。 significand を、intSignificand の 10 進表現の数字からなる String 値(順番どおりで、先頭のゼロを含まない)とする。 fractionCount ≠ 0 である場合、intPart を significand の最初のコード単位とする。fractionalPart を significand の残りの fractionCount 個のコード単位とする。significand を intPart 、"." 、および fractionalPart の文字列連結 に設定する。exponent = 0 である場合、exponentSign を "+" とする。exponentDigits を "0" とする。それ以外の場合、exponent > 0 である場合、exponentSign を "+" とする。それ以外の場合、表明 : exponent < 0 である。exponentSign を "-" とする。exponent を -exponent に設定する。 exponentDigits を、exponent の 10 進表現の数字からなる String 値(順番どおりで、先頭のゼロを含まない)とする。 significand を significand 、"e" 、exponentSign 、および exponentDigits の文字列連結 に設定する。sign と significand の文字列連結 を返す。
注
上記の規則で要求されるよりも正確な変換を提供する実装については、手順 11.b.i の次の代替版を指針として使用することを推奨する。
ff ≥ 0、10ff ≤ intSignificand < 10ff + 1 、𝔽 (intSignificand × 10exponent - ff ) が 𝔽 (number ) であり、ff が可能な限り小さくなるような整数 exponent 、intSignificand 、および ff とする。intSignificand に複数の可能性がある場合、𝔽 (intSignificand × 10exponent - ff ) が 𝔽 (number ) に最も近くなる intSignificand を選択する。そのような intSignificand の値が 2 つある場合、偶数である方を選択する。
21.1.3.3 Number.prototype.toFixed ( fractionDigits )
注 1
このメソッドは、この Number 値 を、小数点の後に fractionDigits 桁を持つ 10 進固定小数点表記で表した String を返す。fractionDigits が undefined の場合、0 が仮定される。
呼び出されたとき、次の手順を実行する。
number を ? ThisNumberValue (this 値) とする。fractionCount を ? ToIntegerOrInfinity (fractionDigits ) とする。表明 : fractionDigits が undefined である場合、fractionCount は 0 である。fractionCount が整数 でない場合、RangeError 例外を投げる。fractionCount < 0 または fractionCount > 100 である場合、RangeError 例外を投げる。number が有限 Number でない場合、Number::toString (number , 10) を返す。number を ℝ (number ) に設定する。sign を空の String とする。number < 0 である場合、sign を "-" に設定する。number を -number に設定する。number ≥ 1021 である場合、digitString を ! ToString (𝔽 (number )) とする。それ以外の場合、intValue / 10fractionCount - number が可能な限り 0 に近くなる整数 intValue とする。そのような intValue が 2 つある場合、大きい方の intValue を選ぶ。intValue = 0 である場合、digitString を "0" とする。それ以外の場合、digitString を intValue の 10 進表現の数字からなる String 値(順番どおりで、先頭のゼロを含まない)とする。fractionCount ≠ 0 である場合、digitCount を digitString の長さとする。digitCount ≤ fractionCount である場合、zeroPad を、コード単位 0x0030 (DIGIT ZERO) が fractionCount + 1 - digitCount 個並んだ String 値とする。digitString を zeroPad と digitString の文字列連結 に設定する。digitCount を fractionCount + 1 に設定する。intPart を digitString の最初の digitCount - fractionCount 個のコード単位とする。fractionalPart を digitString の残りの fractionCount 個のコード単位とする。digitString を intPart 、"." 、および fractionalPart の文字列連結 に設定する。 sign と digitString の文字列連結 を返す。
注 2
toString は数を隣接する Number 値 と区別するために十分な有効数字だけを出力するため、一部の値については toFixed の出力の方が toString より精密になる場合がある。たとえば、
(1000000000000000128).toString() は "1000000000000000100" を返す一方、
(1000000000000000128).toFixed(0) は "1000000000000000128" を返す。
21.1.3.4 Number.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 国際化 API を含む ECMAScript 実装は、ECMA-402 で規定されているとおりにこのメソッドを実装しなければならない。それ以外の場合、このメソッドについて次の仕様が使用される。
このメソッドは、ホスト環境 の現在のロケールの慣例に従って書式設定された、この Number 値 を表す String 値を生成する。このメソッドは実装定義 であり、toString と同じものを返すことも許容されるが、推奨されない。
このメソッドの省略可能なパラメータの意味は ECMA-402 で定義される。ECMA-402 のサポートを含まない実装は、それらのパラメータ位置を他の目的に使用してはならない。
21.1.3.5 Number.prototype.toPrecision ( precision )
このメソッドは、この Number 値 を、仮数の小数点の前に 1 桁、仮数の小数点の後に precision - 1 桁を持つ 10 進指数表記、または precision 桁の有効数字を持つ 10 進固定表記のいずれかで表した String を返す。precision が undefined の場合、代わりに ToString を呼び出す。
呼び出されたとき、次の手順を実行する。
number を ? ThisNumberValue (this 値) とする。precision が undefined である場合、! ToString (number ) を返す。precisionCount を ? ToIntegerOrInfinity (precision ) とする。number が有限 Number でない場合、Number::toString (number , 10) を返す。precisionCount が整数 でない場合、RangeError 例外を投げる。precisionCount < 1 または precisionCount > 100 である場合、RangeError 例外を投げる。number を ℝ (number ) に設定する。sign を空の String とする。number < 0 である場合、sign をコード単位 0x002D (HYPHEN-MINUS) に設定する。number を -number に設定する。number = 0 である場合、significand を、コード単位 0x0030 (DIGIT ZERO) が precisionCount 個並んだ String 値とする。exponent を 0 とする。それ以外の場合、10precisionCount - 1 ≤ intSignificand < 10precisionCount であり、intSignificand × 10exponent - precisionCount + 1 - number が可能な限り 0 に近くなるような整数 exponent および intSignificand とする。そのような exponent と intSignificand の組が 2 つある場合、intSignificand × 10exponent - precisionCount + 1 が大きい方の exponent と intSignificand を選ぶ。 significand を、intSignificand の 10 進表現の数字からなる String 値(順番どおりで、先頭のゼロを含まない)とする。exponent < -6 または exponent ≥ precisionCount である場合、表明 : exponent ≠ 0 である。precisionCount ≠ 1 である場合、intPart を significand の最初のコード単位とする。fractionalPart を significand の残りの precisionCount - 1 個のコード単位とする。significand を intPart 、"." 、および fractionalPart の文字列連結 に設定する。exponent > 0 である場合、exponentSign をコード単位 0x002B (PLUS SIGN) とする。それ以外の場合、表明 : exponent < 0 である。exponentSign をコード単位 0x002D (HYPHEN-MINUS) とする。exponent を -exponent に設定する。 exponentDigits を、exponent の 10 進表現の数字からなる String 値(順番どおりで、先頭のゼロを含まない)とする。sign 、significand 、コード単位 0x0065 (LATIN SMALL LETTER E)、exponentSign 、および exponentDigits の文字列連結 を返す。 exponent = precisionCount - 1 である場合、sign と significand の文字列連結 を返す。exponent ≥ 0 である場合、significand を、significand の最初の exponent + 1 個のコード単位、コード単位 0x002E (FULL STOP)、および significand の残りの precisionCount - (exponent + 1) 個のコード単位の文字列連結 に設定する。それ以外の場合、significand を、コード単位 0x0030 (DIGIT ZERO)、コード単位 0x002E (FULL STOP)、コード単位 0x0030 (DIGIT ZERO) の -(exponent + 1) 個の繰り返し、および String significand の文字列連結 に設定する。 sign と significand の文字列連結 を返す。
21.1.3.6 Number.prototype.toString ( [ radix ] )
注
省略可能な radix は、2 𝔽 から 36 𝔽 までの両端を含む区間 にある整数 Number 値 であるべきである。radix が undefined の場合、10 𝔽 が radix の値として使用される。
このメソッドは、呼び出されたときに次の手順を実行する。
x を ? ThisNumberValue (this 値) とする。radix が undefined である場合、radixMV を 10 とする。それ以外の場合、radixMV を ? SnapToInteger (radix , truncate , 2, 36) とする。 Number::toString (x , radixMV ) を返す。
このメソッドは汎用ではなく、その this 値が Number または Number オブジェクトでない場合、TypeError 例外を投げる。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことはできない。
このメソッドの "length" プロパティは 1 𝔽 である。
21.1.3.7 Number.prototype.valueOf ( )
? ThisNumberValue (this 値) を返す。
21.1.3.7.1 ThisNumberValue ( arg )
抽象操作 ThisNumberValue。引数 arg (ECMAScript 言語値 )。戻り値:Number を含む通常完了または throw 完了 のいずれか。 呼び出されると、次の手順を実行する。
arg が Number である場合、arg を返す。arg が Object であり、arg が [[NumberData]] 内部スロットを持つ場合、number を arg .[[NumberData]] とする。表明 : number は Number である。number を返す。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 )
この関数は、呼び出されたときに次の手順を実行する。
NewTarget が undefined でない場合、TypeError 例外を投げる。 primitive を ? ToPrimitive (value , number ) とする。primitive が Number である場合、? NumberToBigInt (primitive ) を返す。? ToBigInt (primitive ) を返す。
21.2.1.1.1 NumberToBigInt ( number )
抽象操作 NumberToBigInt。引数 number (Number)。戻り値:BigInt を含む通常完了または throw 完了 のいずれか。 呼び出されると、次の手順を実行する。
number が整数 Number でない場合、RangeError 例外を投げる。ℤ (ℝ (number )) を返す。
21.2.2 BigInt コンストラクタのプロパティ
BigInt コンストラクタは、次のとおりである。
21.2.2.1 BigInt.asIntN ( bits , bigint )
この関数は、呼び出されたときに次の手順を実行する。
bits を ? ToIndex (bits ) に設定する。bigint を ? ToBigInt (bigint ) に設定する。remainder を ℝ (bigint ) modulo 2bits とする。remainder ≥ 2bits - 1 である場合、ℤ (remainder - 2bits ) を返す。ℤ (remainder ) を返す。
21.2.2.2 BigInt.asUintN ( bits , bigint )
この関数は、呼び出されたときに次の手順を実行する。
bits を ? ToIndex (bits ) に設定する。bigint を ? ToBigInt (bigint ) に設定する。ℤ (ℝ (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]] 内部スロットを持たない。
値が %Object.prototype% である [[Prototype]] 内部スロットを持つ。
メソッドの仕様内における「この BigInt 値 」という語句は、そのメソッド呼び出しの 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 で規定されているとおりにこのメソッドを実装しなければならない。それ以外の場合、このメソッドについて次の仕様が使用される。
このメソッドは、ホスト環境 の現在のロケールの慣例に従って書式設定された、この BigInt 値 を表す String 値を生成する。このメソッドは実装定義 であり、toString と同じものを返すことも許容されるが、推奨されない。
このメソッドの省略可能なパラメータの意味は ECMA-402 で定義される。ECMA-402 のサポートを含まない実装は、それらのパラメータ位置を他の目的に使用してはならない。
21.2.3.3 BigInt.prototype.toString ( [ radix ] )
注
省略可能な radix は、2 𝔽 から 36 𝔽 までの両端を含む区間 にある整数 Number 値 であるべきである。radix が undefined の場合、10 𝔽 が radix の値として使用される。
このメソッドは、呼び出されたときに次の手順を実行する。
x を ? ThisBigIntValue (this 値) とする。radix が undefined である場合、radixMV を 10 とする。それ以外の場合、radixMV を ? SnapToInteger (radix , truncate , 2, 36) とする。 BigInt::toString (x , radixMV ) を返す。
このメソッドは汎用ではなく、その this 値が BigInt または BigInt オブジェクトでない場合、TypeError 例外を投げる。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことはできない。
21.2.3.4 BigInt.prototype.valueOf ( )
? ThisBigIntValue (this 値) を返す。
21.2.3.4.1 ThisBigIntValue ( arg )
抽象操作 ThisBigIntValue。引数 arg (ECMAScript 言語値 )。戻り値:BigInt を含む通常完了または throw 完了 のいずれか。 呼び出されると、次の手順を実行する。
arg が BigInt である場合、arg を返す。arg が Object であり、arg が [[BigIntData]] 内部スロットを持つ場合、表明 : arg .[[BigIntData]] は BigInt である。arg .[[BigIntData]] を返す。TypeError 例外を投げる。
21.2.3.5 BigInt.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "BigInt" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
21.2.4 BigInt インスタンスのプロパティ
BigInt インスタンスは、BigInt プロトタイプオブジェクト からプロパティを継承する通常のオブジェクトである。BigInt インスタンスは [[BigIntData]] 内部スロットも持つ。[[BigIntData]] 内部スロットは、この BigInt オブジェクトによって表される BigInt 値 である。
21.3 Math オブジェクト
Math オブジェクトは、次のとおりである。
%Math% である。
グローバルオブジェクト の "Math" プロパティの初期値である。
通常のオブジェクトである。
値が %Object.prototype% である [[Prototype]] 内部スロットを持つ。
関数オブジェクト ではない。
[[Construct]] 内部メソッドを持たず、new 演算子を使用してコンストラクタとして使用することはできない。
[[Call]] 内部メソッドを持たず、関数として呼び出すことはできない。
注
この仕様において、「x に対する Number 値 」という語句は、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 } を持つ。
注
Math.LOG10E の値は、Math.LN10 の値の逆数におよそ等しい。
21.3.1.5 Math.LOG2E
自然対数の底である e の底 2 の対数に対する Number 値 であり、この値はおよそ 1.4426950408889634 である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
注
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
½ の平方根に対する Number 値 であり、およそ 0.7071067811865476 である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
注
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% プロパティの初期値は String 値 "Math" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
21.3.2 Math オブジェクトの関数プロパティ
注
acos、acosh、asin、asinh、atan、atanh、atan2、cbrt、cos、cosh、exp、expm1、hypot、log、log1p、log2、log10、pow、random、sin、sinh、tan、および tanh の各関数の動作は、対象となる境界ケースを表す特定の引数値に対して特定の結果を要求することを除き、ここでは厳密には規定されない。他の引数値について、これらの関数はよく知られた数学関数の結果の近似値を計算することを意図しているが、近似アルゴリズムの選択にはある程度の自由が認められる。一般的な意図は、実装者が、あるハードウェアプラットフォーム上の ECMAScript に対して、そのプラットフォーム上の C プログラマが利用できるものと同じ数学ライブラリを使用できるようにすることである。
アルゴリズムの選択は実装に委ねられているが、実装では Sun Microsystems の自由に配布可能な数学ライブラリ fdlibm(http://www.netlib.org/fdlibm )に含まれる IEEE 754-2019 算術用の近似アルゴリズムを使用することが推奨される(ただし、この標準では規定されない)。
21.3.2.1 Math.abs ( x )
この関数は x の絶対値を返す。結果は x と同じ大きさを持つが、符号は正である。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN である場合、NaN を返す。n が -0 𝔽 である場合、+0 𝔽 を返す。n が -∞ 𝔽 である場合、+∞ 𝔽 を返す。n < -0 𝔽 である場合、-n を返す。n を返す。
21.3.2.2 Math.acos ( x )
この関数は x の逆余弦を返す。結果はラジアンで表され、+0 𝔽 から 𝔽 (π) までの両端を含む区間 にある。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN 、n > 1 𝔽 、または n < -1 𝔽 である場合、NaN を返す。n が 1 𝔽 である場合、+0 𝔽 を返す。ℝ (n ) の逆余弦を表す、実装によって近似された Number 値 を返す。
21.3.2.3 Math.acosh ( x )
この関数は x の逆双曲線余弦を返す。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN または +∞ 𝔽 のいずれかである場合、n を返す。n が 1 𝔽 である場合、+0 𝔽 を返す。n < 1 𝔽 である場合、NaN を返す。ℝ (n ) の逆双曲線余弦を表す、実装によって近似された Number 値 を返す。
21.3.2.4 Math.asin ( x )
この関数は x の逆正弦を返す。結果はラジアンで表され、𝔽 (-π / 2) から 𝔽 (π / 2) までの両端を含む区間 にある。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN 、+0 𝔽 、または -0 𝔽 のいずれかである場合、n を返す。n > 1 𝔽 または n < -1 𝔽 である場合、NaN を返す。ℝ (n ) の逆正弦を表す、実装によって近似された Number 値 を返す。
21.3.2.5 Math.asinh ( x )
この関数は x の逆双曲線正弦を返す。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が有限 Number でないか、または n が +0 𝔽 または -0 𝔽 のいずれかである場合、n を返す。ℝ (n ) の逆双曲線正弦を表す、実装によって近似された Number 値 を返す。
21.3.2.6 Math.atan ( x )
この関数は x の逆正接を返す。結果はラジアンで表され、𝔽 (-π / 2) から 𝔽 (π / 2) までの両端を含む区間 にある。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN 、+0 𝔽 、または -0 𝔽 のいずれかである場合、n を返す。n が +∞ 𝔽 である場合、π / 2 を表す、実装によって近似された Number 値 を返す。n が -∞ 𝔽 である場合、-π / 2 を表す、実装によって近似された Number 値 を返す。ℝ (n ) の逆正接を表す、実装によって近似された Number 値 を返す。
21.3.2.7 Math.atanh ( x )
この関数は x の逆双曲線正接を返す。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN 、+0 𝔽 、または -0 𝔽 のいずれかである場合、n を返す。n > 1 𝔽 または n < -1 𝔽 である場合、NaN を返す。n が 1 𝔽 である場合、+∞ 𝔽 を返す。n が -1 𝔽 である場合、-∞ 𝔽 を返す。ℝ (n ) の逆双曲線正接を表す、実装によって近似された Number 値 を返す。
21.3.2.8 Math.atan2 ( y , x )
この関数は引数 y と x の商 y / x の逆正接を返し、y と x の符号を使用して結果の象限を決定する。2 引数の逆正接関数では、y という名前の引数が最初で、x という名前の引数が 2 番目であることは意図的かつ伝統的であることに注意。結果はラジアンで表され、-π から +π までの両端を含む区間 にある。
呼び出されたとき、次の手順を実行する。
ny を ? ToNumber (y ) とする。nx を ? ToNumber (x ) とする。ny が NaN または nx が NaN である場合、NaN を返す。ny が +∞ 𝔽 である場合、nx が +∞ 𝔽 である場合、π / 4 を表す、実装によって近似された Number 値 を返す。nx が -∞ 𝔽 である場合、3π / 4 を表す、実装によって近似された Number 値 を返す。π / 2 を表す、実装によって近似された Number 値 を返す。 ny が -∞ 𝔽 である場合、nx が +∞ 𝔽 である場合、-π / 4 を表す、実装によって近似された Number 値 を返す。nx が -∞ 𝔽 である場合、-3π / 4 を表す、実装によって近似された Number 値 を返す。-π / 2 を表す、実装によって近似された Number 値 を返す。 ny が +0 𝔽 である場合、nx > +0 𝔽 または nx が +0 𝔽 である場合、+0 𝔽 を返す。π を表す、実装によって近似された Number 値 を返す。 ny が -0 𝔽 である場合、nx > +0 𝔽 または nx が +0 𝔽 である場合、-0 𝔽 を返す。-π を表す、実装によって近似された Number 値 を返す。 表明 : ny は有限 Number であり、+0 𝔽 でも -0 𝔽 でもない。ny > +0 𝔽 である場合、nx が +∞ 𝔽 である場合、+0 𝔽 を返す。nx が -∞ 𝔽 である場合、π を表す、実装によって近似された Number 値 を返す。nx が +0 𝔽 または -0 𝔽 のいずれかである場合、π / 2 を表す、実装によって近似された Number 値 を返す。ny < -0 𝔽 である場合、nx が +∞ 𝔽 である場合、-0 𝔽 を返す。nx が -∞ 𝔽 である場合、-π を表す、実装によって近似された Number 値 を返す。nx が +0 𝔽 または -0 𝔽 のいずれかである場合、-π / 2 を表す、実装によって近似された Number 値 を返す。表明 : nx は有限 Number であり、+0 𝔽 でも -0 𝔽 でもない。result を abs (ℝ (ny ) / ℝ (nx )) の逆正接とする。nx < -0 𝔽 である場合、ny > +0 𝔽 である場合、result を π - result に設定する。それ以外の場合、result を -π + result に設定する。 それ以外の場合、ny < -0 𝔽 である場合、result を -result に設定する。 result を表す、実装によって近似された Number 値 を返す。
21.3.2.9 Math.cbrt ( x )
この関数は x の立方根を返す。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が有限 Number でないか、または n が +0 𝔽 または -0 𝔽 のいずれかである場合、n を返す。ℝ (n ) の立方根を表す、実装によって近似された Number 値 を返す。
21.3.2.10 Math.ceil ( x )
この関数は、x 以上である最小の(-∞ に最も近い)整数 Number 値 を返す。x がすでに整数 Number である場合、結果は x である。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が有限 Number でないか、または n が +0 𝔽 または -0 𝔽 のいずれかである場合、n を返す。n < -0 𝔽 かつ n > -1 𝔽 である場合、-0 𝔽 を返す。n が整数 Number である場合、n を返す。n 以上である最小の(-∞ に最も近い)整数 Number 値 を返す。
注
Math.ceil(x) の値は -Math.floor(-x) の値と同じである。
21.3.2.11 Math.clz32 ( x )
この関数は、呼び出されたときに次の手順を実行する。
n を ? ToUint32 (x ) とする。p を n の符号なし 32 ビット二進表現における先頭のゼロビットの数とする。𝔽 (p ) を返す。
注
n が +0 𝔽 または -0 𝔽 のいずれかである場合、このメソッドは 32 𝔽 を返す。n の 32 ビット二進符号化の最上位ビットが 1 である場合、このメソッドは +0 𝔽 を返す。
21.3.2.12 Math.cos ( x )
この関数は x の余弦を返す。引数はラジアンで表される。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が有限 Number でない場合、NaN を返す。n が +0 𝔽 または -0 𝔽 のいずれかである場合、1 𝔽 を返す。ℝ (n ) の余弦を表す、実装によって近似された Number 値 を返す。
21.3.2.13 Math.cosh ( x )
この関数は x の双曲線余弦を返す。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN である場合、NaN を返す。n が +∞ 𝔽 または -∞ 𝔽 のいずれかである場合、+∞ 𝔽 を返す。n が +0 𝔽 または -0 𝔽 のいずれかである場合、1 𝔽 を返す。ℝ (n ) の双曲線余弦を表す、実装によって近似された Number 値 を返す。
注
Math.cosh(x) の値は (Math.exp(x) + Math.exp(-x)) / 2 の値と同じである。
21.3.2.14 Math.exp ( x )
この関数は x の指数関数(自然対数の底である e を x 乗したもの)を返す。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN または +∞ 𝔽 のいずれかである場合、n を返す。n が +0 𝔽 または -0 𝔽 のいずれかである場合、1 𝔽 を返す。n が -∞ 𝔽 である場合、+0 𝔽 を返す。ℝ (n ) の指数関数を表す、実装によって近似された Number 値 を返す。
21.3.2.15 Math.expm1 ( x )
この関数は、x の指数関数(自然対数の底である e を x 乗したもの)から 1 を引いた結果を返す。結果は、x の値が 0 に近い場合でも正確になるような方法で計算される。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN 、+0 𝔽 、-0 𝔽 、または +∞ 𝔽 のいずれかである場合、n を返す。n が -∞ 𝔽 である場合、-1 𝔽 を返す。exp を ℝ (n ) の指数関数とする。exp - 1 を表す、実装によって近似された Number 値 を返す。
21.3.2.16 Math.floor ( x )
この関数は、x 以下である最大の(+∞ に最も近い)整数 Number 値 を返す。x がすでに整数 Number である場合、結果は x である。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が有限 Number でないか、または n が +0 𝔽 または -0 𝔽 のいずれかである場合、n を返す。n < 1 𝔽 かつ n > +0 𝔽 である場合、+0 𝔽 を返す。n が整数 Number である場合、n を返す。n 以下である最大の(+∞ に最も近い)整数 Number 値 を返す。
注
Math.floor(x) の値は -Math.ceil(-x) の値と同じである。
21.3.2.17 Math.fround ( x )
この関数は、呼び出されたときに次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN である場合、NaN を返す。n が +0 𝔽 、-0 𝔽 、+∞ 𝔽 、または -∞ 𝔽 のいずれかである場合、n を返す。n32 を、roundTiesToEven モードを使用して n を IEEE 754-2019 binary32 形式に変換した結果とする。n64 を、n32 を IEEE 754-2019 binary64 形式に変換した結果とする。n64 に対応する ECMAScript Number 値 を返す。
21.3.2.18 Math.f16round ( x )
この関数は、呼び出されたときに次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN である場合、NaN を返す。n が +0 𝔽 、-0 𝔽 、+∞ 𝔽 、または -∞ 𝔽 のいずれかである場合、n を返す。n16 を、roundTiesToEven モードを使用して n を IEEE 754-2019 binary16 形式に変換した結果とする。n64 を、n16 を IEEE 754-2019 binary64 形式に変換した結果とする。n64 に対応する ECMAScript Number 値 を返す。
注
二重丸めの可能性があるため、この演算は 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 の下で実行した場合に生成される値になるようにすることで、明示的に処理できる。調整された値を roundTiesToEven の下で binary16 にキャストすると、正しい値が生成される。
21.3.2.19 Math.hypot ( ...args )
0 個以上の引数を与えると、この関数はその引数の平方の総和の平方根を返す。
呼び出されたとき、次の手順を実行する。
coerced を新しい空の List とする。args の各要素 arg について、n を ? ToNumber (arg ) とする。n を coerced に追加する。coerced の各要素 number について、number が +∞ 𝔽 または -∞ 𝔽 のいずれかである場合、+∞ 𝔽 を返す。onlyZero を true とする。coerced の各要素 number について、number が NaN である場合、NaN を返す。number が +0 𝔽 でも -0 𝔽 でもない場合、onlyZero を false に設定する。onlyZero が true である場合、+0 𝔽 を返す。coerced の各要素の数学値 の平方の総和の平方根を表す、実装によって近似された Number 値 を返す。
この関数の "length" プロパティは 2 𝔽 である。
注
この関数が 2 個以上の引数で呼び出されたときに素朴な実装で発生しやすいオーバーフローおよびアンダーフローによる精度損失を避けるよう、実装では注意すべきである。
21.3.2.20 Math.imul ( x , y )
この関数は、呼び出されたときに次の手順を実行する。
a を ℝ (? ToUint32 (x )) とする。b を ℝ (? ToUint32 (y )) とする。product を (a × b ) modulo 232 とする。product ≥ 231 である場合、𝔽 (product - 232 ) を返す。𝔽 (product ) を返す。
21.3.2.21 Math.log ( x )
この関数は x の自然対数を返す。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN または +∞ 𝔽 のいずれかである場合、n を返す。n が 1 𝔽 である場合、+0 𝔽 を返す。n が +0 𝔽 または -0 𝔽 のいずれかである場合、-∞ 𝔽 を返す。n < -0 𝔽 である場合、NaN を返す。ln (ℝ (n )) を表す、実装によって近似された Number 値 を返す。
21.3.2.22 Math.log1p ( x )
この関数は 1 + x の自然対数を返す。結果は、x の値が 0 に近い場合でも正確になるような方法で計算される。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN 、+0 𝔽 、-0 𝔽 、または +∞ 𝔽 のいずれかである場合、n を返す。n が -1 𝔽 である場合、-∞ 𝔽 を返す。n < -1 𝔽 である場合、NaN を返す。ln (1 + ℝ (n )) を表す、実装によって近似された Number 値 を返す。
21.3.2.23 Math.log10 ( x )
この関数は x の底 10 の対数を返す。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN または +∞ 𝔽 のいずれかである場合、n を返す。n が 1 𝔽 である場合、+0 𝔽 を返す。n が +0 𝔽 または -0 𝔽 のいずれかである場合、-∞ 𝔽 を返す。n < -0 𝔽 である場合、NaN を返す。log10 (ℝ (n )) を表す、実装によって近似された Number 値 を返す。
21.3.2.24 Math.log2 ( x )
この関数は x の底 2 の対数を返す。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN または +∞ 𝔽 のいずれかである場合、n を返す。n が 1 𝔽 である場合、+0 𝔽 を返す。n が +0 𝔽 または -0 𝔽 のいずれかである場合、-∞ 𝔽 を返す。n < -0 𝔽 である場合、NaN を返す。log2 (ℝ (n )) を表す、実装によって近似された Number 値 を返す。
21.3.2.25 Math.max ( ...args )
0 個以上の引数を与えると、この関数は各引数に対して ToNumber を呼び出し、その結果の値のうち最大のものを返す。
呼び出されたとき、次の手順を実行する。
coerced を新しい空の List とする。args の各要素 arg について、n を ? ToNumber (arg ) とする。n を coerced に追加する。highest を -∞ 𝔽 とする。coerced の各要素 number について、number が NaN である場合、NaN を返す。number が +0 𝔽 であり、highest が -0 𝔽 である場合、highest を +0 𝔽 に設定する。number > highest である場合、highest を number に設定する。highest を返す。
注
最大値を決定するための値の比較は、+0 𝔽 が -0 𝔽 より大きいとみなされることを除き、IsLessThan アルゴリズムを使用して行われる。
この関数の "length" プロパティは 2 𝔽 である。
21.3.2.26 Math.min ( ...args )
0 個以上の引数を与えると、この関数は各引数に対して ToNumber を呼び出し、その結果の値のうち最小のものを返す。
呼び出されたとき、次の手順を実行する。
coerced を新しい空の List とする。args の各要素 arg について、n を ? ToNumber (arg ) とする。n を coerced に追加する。lowest を +∞ 𝔽 とする。coerced の各要素 number について、number が NaN である場合、NaN を返す。number が -0 𝔽 であり、lowest が +0 𝔽 である場合、lowest を -0 𝔽 に設定する。number < lowest である場合、lowest を number に設定する。lowest を返す。
注
最小値を決定するための値の比較は、+0 𝔽 が -0 𝔽 より大きいとみなされることを除き、IsLessThan アルゴリズムを使用して行われる。
この関数の "length" プロパティは 2 𝔽 である。
21.3.2.27 Math.pow ( base , exponent )
この関数は、呼び出されたときに次の手順を実行する。
base を ? ToNumber (base ) に設定する。exponent を ? ToNumber (exponent ) に設定する。Number::exponentiate (base , exponent ) を返す。
21.3.2.28 Math.random ( )
この関数は、正の符号を持ち、+0 𝔽 以上かつ 1 𝔽 未満である Number 値 を返す。この値は、実装定義 のアルゴリズムまたは方式を使用し、その範囲にわたってほぼ一様な分布となるようにランダムまたは擬似ランダムに選択される。
異なる realm のために作成された各 Math.random 関数は、連続する呼び出しから異なる値のシーケンスを生成しなければならない。
21.3.2.29 Math.round ( x )
この関数は、x に最も近い整数 Number 値 を返す。2 つの整数 Number が x に等しく近い場合、結果は +∞ に近い方の Number 値 となる。x がすでに整数 である場合、結果は x である。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が有限 Number でないか、または n が整数 Number である場合、n を返す。n < 0.5 𝔽 かつ n > +0 𝔽 である場合、+0 𝔽 を返す。n < -0 𝔽 かつ n ≥ -0.5 𝔽 である場合、-0 𝔽 を返す。n に最も近い整数 Number を返し、同距離の場合は +∞ に近い Number を優先する。
注 1
Math.round(3.5) は 4 を返すが、Math.round(-3.5) は -3 を返す。
注 2
Math.round(x) の値は、Math.floor(x + 0.5) の値と常に同じであるとは限らない。x が -0 𝔽 である場合、または x が -0 𝔽 より小さいが -0.5 𝔽 以上である場合、Math.round(x) は -0 𝔽 を返すが、Math.floor(x + 0.5) は +0 𝔽 を返す。Math.round(x) は、x + 0.5 を計算するときの内部丸めのために Math.floor(x + 0.5) の値と異なる場合もある。
21.3.2.30 Math.sign ( x )
この関数は x の符号を返し、x が正、負、またはゼロのいずれであるかを示す。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN 、+0 𝔽 、または -0 𝔽 のいずれかである場合、n を返す。n < -0 𝔽 である場合、-1 𝔽 を返す。1 𝔽 を返す。
21.3.2.31 Math.sin ( x )
この関数は x の正弦を返す。引数はラジアンで表される。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN 、+0 𝔽 、または -0 𝔽 のいずれかである場合、n を返す。n が +∞ 𝔽 または -∞ 𝔽 のいずれかである場合、NaN を返す。ℝ (n ) の正弦を表す、実装によって近似された Number 値 を返す。
21.3.2.32 Math.sinh ( x )
この関数は x の双曲線正弦を返す。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が有限 Number でないか、または n が +0 𝔽 または -0 𝔽 のいずれかである場合、n を返す。ℝ (n ) の双曲線正弦を表す、実装によって近似された Number 値 を返す。
注
Math.sinh(x) の値は (Math.exp(x) - Math.exp(-x)) / 2 の値と同じである。
21.3.2.33 Math.sqrt ( x )
この関数は x の平方根を返す。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN 、+0 𝔽 、-0 𝔽 、または +∞ 𝔽 のいずれかである場合、n を返す。n < -0 𝔽 である場合、NaN を返す。𝔽 (ℝ (n ) の平方根) を返す。
21.3.2.34 Math.sumPrecise ( items )
Numbers の iterable を与えると、この関数は iterable 内の各値を合計し、その総和を返す。いずれかの値が Number でない場合、TypeError 例外を投げる。
呼び出されたとき、次の手順を実行する。
? RequireObjectCoercible (items ) を実行する。 iteratorRecord を ? GetIterator (items , sync ) とする。state を minus-zero とする。sum を 0 とする。count を 0 とする。next を not-started とする。next が done でない間、繰り返す。next を ? IteratorStepValue (iteratorRecord ) に設定する。next が done でない場合、count ≥ 253 - 1 である場合、注記 : この手順は実際には到達しないことが想定されており、実装がこの仕様に違反することなく入力が「妥当な大きさ」であることに依存できるようにするためだけに含まれている。error を ThrowCompletion (新たに作成された RangeError オブジェクト) とする。? IteratorClose (iteratorRecord , error ) を返す。 next が Number でない場合、error を ThrowCompletion (新たに作成された TypeError オブジェクト) とする。? IteratorClose (iteratorRecord , error ) を返す。 n を next とする。state が not-a-number でない場合、n が NaN である場合、state を not-a-number に設定する。それ以外で n が +∞ 𝔽 である場合、state が minus-infinity である場合、state を not-a-number に設定する。それ以外の場合、state を plus-infinity に設定する。 それ以外で n が -∞ 𝔽 である場合、state が plus-infinity である場合、state を not-a-number に設定する。それ以外の場合、state を minus-infinity に設定する。 それ以外で n が -0 𝔽 でなく、state が minus-zero または finite のいずれかである場合、state を finite に設定する。sum を sum + ℝ (n ) に設定する。 count を count + 1 に設定する。state が not-a-number である場合、NaN を返す。state が plus-infinity である場合、+∞ 𝔽 を返す。state が minus-infinity である場合、-∞ 𝔽 を返す。state が minus-zero である場合、-0 𝔽 を返す。𝔽 (sum ) を返す。
注
sum の値は、さまざまなアルゴリズムによって任意精度算術を使用せずに計算できる。その一つが、Jonathan Richard Shewchuk による 適応精度浮動小数点算術と高速で堅牢な幾何学的述語 で示されている「Grow-Expansion」アルゴリズムである。より新しいアルゴリズムは「小型および大型スーパーアキュムレータを使用した高速な正確総和 」で示されており、そのコードは https://gitlab.com/radfordneal/xsum で入手できる。
21.3.2.35 Math.tan ( x )
この関数は x の正接を返す。引数はラジアンで表される。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN 、+0 𝔽 、または -0 𝔽 のいずれかである場合、n を返す。n が +∞ 𝔽 または -∞ 𝔽 のいずれかである場合、NaN を返す。ℝ (n ) の正接を表す、実装によって近似された Number 値 を返す。
21.3.2.36 Math.tanh ( x )
この関数は x の双曲線正接を返す。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が NaN 、+0 𝔽 、または -0 𝔽 のいずれかである場合、n を返す。n が +∞ 𝔽 である場合、1 𝔽 を返す。n が -∞ 𝔽 である場合、-1 𝔽 を返す。ℝ (n ) の双曲線正接を表す、実装によって近似された Number 値 を返す。
注
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 である。
呼び出されたとき、次の手順を実行する。
n を ? ToNumber (x ) とする。n が有限 Number でないか、または n が +0 𝔽 または -0 𝔽 のいずれかである場合、n を返す。n < 1 𝔽 かつ n > +0 𝔽 である場合、+0 𝔽 を返す。n < -0 𝔽 かつ n > -1 𝔽 である場合、-0 𝔽 を返す。+0 𝔽 の方向で n に最も近い整数 Number を返す。
21.4 Date オブジェクト
21.4.1 Date オブジェクトの概要と抽象操作の定義
次の抽象操作 は時間値(21.4.1.1 で定義)を操作します。いずれの場合でも、これらの関数のいずれかに対する任意の引数が NaN である場合、結果は NaN になることに注意してください。
21.4.1.1 時間値と時間範囲
ECMAScript における時間の測定は POSIX における時間の測定に類似しており、特に先発グレゴリオ暦、1970年1月1日 UTC の開始時の真夜中をエポック とする定義、および各日を正確に 86,400 秒(各秒は 1000 ミリ秒)から構成されるものとして扱う点を共有しています。
ECMAScript の時刻値 は Number であり、ミリ秒精度で時点を表す整数 Number(有限時刻値 と呼ばれる)、または特定の時点を表さない NaN のいずれかである。MillisecondsPerDay の整数 倍(すなわち、ある整数 d に対する MillisecondsPerDay × d )である有限時刻値は、エポック から d 日の完全な UTC 日数だけ後(d が負の場合はエポック より前)の UTC 日の開始時点を表す。その他の各有限時刻値 tv は、そのような倍数である直前の最大の有限時刻値 s を基準として定義され、s と同じ UTC 日内にありながら、それより (tv - 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 𝔽 で表されます。
注
先発グレゴリオ暦では、うるう年は 4 で割り切れ、かつ 400 で割り切れるか 100 で割り切れない年です。
先発グレゴリオ暦の400年周期には97のうるう年が含まれます。これにより1年あたり平均 365.2425 日、すなわち 31,556,952,000 ミリ秒となります。したがって、Number がミリ秒精度で正確に表現できる最大範囲は、1970年を基準として約 -285,426 年から 285,426 年です。この節で規定される時間値がサポートするより小さい範囲は、1970年を基準として約 -273,790 年から 273,790 年です。
21.4.1.2 時間関連の定数
これらの定数は、以下の節のアルゴリズムから参照されます。
HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
MillisecondsPerSecond = 1000
NanosecondsPerMillisecond = 106
NanosecondsPerMicrosecond = 103
21.4.1.3 Day ( tv )
抽象操作 Day。引数 tv (a finite time value)。戻り値:整数 。 tv が属する日の日番号を返します。 呼び出されると、次の手順を実行する。
floor (ℝ (tv ) / MillisecondsPerDay ) を返す。
21.4.1.4 TimeWithinDay ( tv )
抽象操作 TimeWithinDay。引数 tv (a finite time value)。戻り値:an integer in the interval from 0 (inclusive) to MillisecondsPerDay (exclusive)。 tv が属する日の開始からのミリ秒数を返します。 呼び出されると、次の手順を実行する。
ℝ (tv ) modulo MillisecondsPerDay を返す。
21.4.1.5 DayFromYear ( y )
抽象操作 DayFromYear。引数 y (整数 )。戻り値:整数 。 年 y の最初の日の日番号を返します。 呼び出されると、次の手順を実行する。
注記 : 次の手順で、numberYears1 、numberYears4 、numberYears100 、および numberYears400 は、それぞれエポック から年 y の開始までに現れる、1、4、100、および400で割り切れる年の数を表す。y がエポック より前である場合、その数は負である。numberYears1 を (y - 1970) とする。numberYears4 を floor ((y - 1969) / 4) とする。numberYears100 を floor ((y - 1901) / 100) とする。numberYears400 を floor ((y - 1601) / 400) とする。365 × numberYears1 + numberYears4 - numberYears100 + numberYears400 を返す。
21.4.1.6 TimeFromYear ( y )
抽象操作 TimeFromYear。引数 y (整数 )。戻り値:a time value。 年 y の開始の時間値を返します。 呼び出されると、次の手順を実行する。
𝔽 (MillisecondsPerDay × DayFromYear (y )) を返す。
21.4.1.7 YearFromTime ( tv )
抽象操作 YearFromTime。引数 tv (a finite time value)。戻り値:整数 。 tv が属する年を返します。 呼び出されると、次の手順を実行する。
TimeFromYear (y ) ≤ tv を満たす最大の整数 y (+∞ に最も近いもの)を返す。
21.4.1.8 DayWithinYear ( tv )
抽象操作 DayWithinYear。引数 tv (a finite time value)。戻り値:an integer in the inclusive interval from 0 to 365。 呼び出されると、次の手順を実行する。
Day (tv ) - DayFromYear (YearFromTime (tv )) を返す。
21.4.1.9 InLeapYear ( tv )
抽象操作 InLeapYear。引数 tv (a finite time value)。戻り値:(0 または 1)。 tv がうるう年内にある場合は 1 を、それ以外の場合は 0 を返します。 呼び出されると、次の手順を実行する。
y を YearFromTime (tv ) とする。(y modulo 400) = 0 である場合、1 を返す。 (y modulo 100) = 0 である場合、0 を返す。 (y modulo 4) = 0 である場合、1 を返す。 0 を返す。
21.4.1.10 MonthFromTime ( tv )
抽象操作 MonthFromTime。引数 tv (a finite time value)。戻り値:an integer in the inclusive interval from 0 to 11。 tv が属する月を識別する整数 を返します。月の値 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日木曜日に対応することに注意してください。 呼び出されると、次の手順を実行する。
inLeapYear を InLeapYear (tv ) とする。dayWithinYear を DayWithinYear (tv ) とする。dayWithinYear < 31 である場合、0 を返す。dayWithinYear < 59 + inLeapYear である場合、1 を返す。dayWithinYear < 90 + inLeapYear である場合、2 を返す。dayWithinYear < 120 + inLeapYear である場合、3 を返す。dayWithinYear < 151 + inLeapYear である場合、4 を返す。dayWithinYear < 181 + inLeapYear である場合、5 を返す。dayWithinYear < 212 + inLeapYear である場合、6 を返す。dayWithinYear < 243 + inLeapYear である場合、7 を返す。dayWithinYear < 273 + inLeapYear である場合、8 を返す。dayWithinYear < 304 + inLeapYear である場合、9 を返す。dayWithinYear < 334 + inLeapYear である場合、10 を返す。表明 : dayWithinYear < 365 + inLeapYear 。11 を返す。
21.4.1.11 DateFromTime ( tv )
抽象操作 DateFromTime。引数 tv (a finite time value)。戻り値:an integer in the inclusive interval from 1 to 31。 tv が属する月の日を返します。 呼び出されると、次の手順を実行する。
inLeapYear を InLeapYear (tv ) とする。dayWithinYear を DayWithinYear (tv ) とする。month を MonthFromTime (tv ) とする。month = 0 である場合、dayWithinYear + 1 を返す。month = 1 である場合、dayWithinYear - 30 を返す。month = 2 である場合、dayWithinYear - 58 - inLeapYear を返す。month = 3 である場合、dayWithinYear - 89 - inLeapYear を返す。month = 4 である場合、dayWithinYear - 119 - inLeapYear を返す。month = 5 である場合、dayWithinYear - 150 - inLeapYear を返す。month = 6 である場合、dayWithinYear - 180 - inLeapYear を返す。month = 7 である場合、dayWithinYear - 211 - inLeapYear を返す。month = 8 である場合、dayWithinYear - 242 - inLeapYear を返す。month = 9 である場合、dayWithinYear - 272 - inLeapYear を返す。month = 10 である場合、dayWithinYear - 303 - inLeapYear を返す。表明 : month = 11。dayWithinYear - 333 - inLeapYear を返す。
21.4.1.12 WeekDay ( tv )
抽象操作 WeekDay。引数 tv (a finite time value)。戻り値:an integer in the inclusive interval from 0 to 6。 tv が属する曜日を識別する整数 を返します。曜日値 0 は日曜日、1 は月曜日、2 は火曜日、3 は水曜日、4 は木曜日、5 は金曜日、6 は土曜日を指定します。WeekDay(+0 𝔽 ) = 4 であり、1970年1月1日木曜日に対応することに注意してください。 呼び出されると、次の手順を実行する。
(Day (tv ) + 4) modulo 7 を返す。
21.4.1.13 HourFromTime ( tv )
抽象操作 HourFromTime。引数 tv (a finite time value)。戻り値:an integer in the inclusive interval from 0 to 23。 tv が属する日の時を返します。 呼び出されると、次の手順を実行する。
floor (ℝ (tv ) / MillisecondsPerHour ) modulo HoursPerDay を返す。
21.4.1.14 MinuteFromTime ( tv )
抽象操作 MinuteFromTime。引数 tv (a finite time value)。戻り値:an integer in the inclusive interval from 0 to 59。 tv が属する時の分を返します。 呼び出されると、次の手順を実行する。
floor (ℝ (tv ) / MillisecondsPerMinute ) modulo MinutesPerHour を返す。
21.4.1.15 SecondFromTime ( tv )
抽象操作 SecondFromTime。引数 tv (a finite time value)。戻り値:an integer in the inclusive interval from 0 to 59。 tv が属する分の秒を返します。 呼び出されると、次の手順を実行する。
floor (ℝ (tv ) / MillisecondsPerSecond ) modulo SecondsPerMinute を返す。
21.4.1.16 MillisecondFromTime ( tv )
抽象操作 MillisecondFromTime。引数 tv (a finite time value)。戻り値:an integer in the inclusive interval from 0 to 999。 tv が属する秒のミリ秒を返します。 呼び出されると、次の手順を実行する。
ℝ (tv ) modulo MillisecondsPerSecond を返す。
21.4.1.17 エポックナノ秒と範囲
エポックナノ秒カウント は、ナノ秒精度で時点を表す整数 です。時間値と同じ範囲をナノ秒で表したもの、すなわち MinEpochNanoseconds から MaxEpochNanoseconds までをサポートします。時間値 NaN に相当するナノ秒値は存在せず、特定の時点がないことを表す表現はありません。
1970年1月1日 UTC の開始時の真夜中の正確な瞬間は値 0 で表されます。最大値は MaxEpochNanoseconds 、最小値は MinEpochNanoseconds です。
21.4.1.18 GetUTCEpochNanoseconds ( year , month , day , hour , minute , second , millisecond , microsecond , nanosecond )
抽象操作 GetUTCEpochNanoseconds。引数 year (整数 )、month (an integer in the inclusive interval from 1 to 12)、day (an integer in the inclusive interval from 1 to 31)、hour (an integer in the inclusive interval from 0 to 23)、minute (an integer in the inclusive interval from 0 to 59)、second (an integer in the inclusive interval from 0 to 59)、millisecond (an integer in the inclusive interval from 0 to 999)、microsecond (an integer in the inclusive interval from 0 to 999) および nanosecond (an integer in the inclusive interval from 0 to 999)。戻り値:an epoch nanoseconds count。 返される値は、UTC における指定された ISO 8601 暦日付および壁時計時刻に対応するエポックナノ秒カウント です。 呼び出されると、次の手順を実行する。
date を MakeDay (𝔽 (year ), 𝔽 (month - 1), 𝔽 (day )) とする。time を MakeTime (𝔽 (hour ), 𝔽 (minute ), 𝔽 (second ), 𝔽 (millisecond )) とする。epochMilliseconds を MakeDate (date , time ) とする。表明 : epochMilliseconds は整数 Number である。ℝ (epochMilliseconds ) × NanosecondsPerMillisecond + microsecond × NanosecondsPerMicrosecond + nanosecond を返す。
21.4.1.19 タイムゾーン識別子
ECMAScript のタイムゾーンはタイムゾーン識別子 によって表されます。これは、0x0000 から 0x007F までの閉区間 内のコード単位だけで構成される String です。
ECMAScript 実装がサポートするタイムゾーンは、AvailableNamedTimeZoneIdentifiers によって返される Time Zone Identifier Record の [[Identifier]] フィールドで表される利用可能な名前付きタイムゾーン 、または IsTimeZoneOffsetString が true を返す String で表されるオフセットタイムゾーン である場合があります。
プライマリタイムゾーン識別子 は、利用可能な名前付きタイムゾーンの優先識別子です。
非プライマリタイムゾーン識別子 は、プライマリタイムゾーン識別子ではない、利用可能な名前付きタイムゾーンの識別子です。
利用可能な名前付きタイムゾーン識別子 は、プライマリタイムゾーン識別子または非プライマリタイムゾーン識別子のいずれかです。
各利用可能な名前付きタイムゾーン識別子は、正確に1つの利用可能な名前付きタイムゾーンに関連付けられます。
各利用可能な名前付きタイムゾーンは、正確に1つのプライマリタイムゾーン識別子と、0個以上の非プライマリタイムゾーン識別子に関連付けられます。
ECMAScript 実装は、識別子 "UTC" を持つ利用可能な名前付きタイムゾーンをサポートしなければならず、これは UTC タイムゾーンのプライマリタイムゾーン識別子でなければなりません。
さらに、実装は任意の数のその他の利用可能な名前付きタイムゾーンをサポートしてもかまいません。
ECMA-402 Internationalization API 仕様で説明されるタイムゾーンの要件に従う実装は、タイムゾーン対応 と呼ばれます。
タイムゾーン対応実装は、IANA Time Zone Database の「Zone」および「Link 」名に対応する利用可能な名前付きタイムゾーンをサポートしなければならず、そのような名前だけをサポートしなければなりません。
タイムゾーン対応実装では、ECMA-402 で規定される AvailableNamedTimeZoneIdentifiers によって明示的に上書きされる場合を除き、プライマリタイムゾーン識別子は IANA Time Zone Database の「Zone」名であり、非プライマリタイムゾーン識別子はそれぞれ「Link 」名です。
IANA Time Zone Database 全体をサポートしない実装にも、タイムゾーンを表す識別子として IANA Time Zone Database の名前を使用することが推奨されます。
21.4.1.20 GetNamedTimeZoneEpochNanoseconds ( timeZoneIdentifier , year , month , day , hour , minute , second , millisecond , microsecond , nanosecond )
実装定義の抽象操作 GetNamedTimeZoneEpochNanoseconds。引数 timeZoneIdentifier (String)、year (整数 )、month (an integer in the inclusive interval from 1 to 12)、day (an integer in the inclusive interval from 1 to 31)、hour (an integer in the inclusive interval from 0 to 23)、minute (an integer in the inclusive interval from 0 to 59)、second (an integer in the inclusive interval from 0 to 59)、millisecond (an integer in the inclusive interval from 0 to 999)、microsecond (an integer in the inclusive interval from 0 to 999) および nanosecond (an integer in the inclusive interval from 0 to 999)。戻り値:リスト (要素:epoch nanoseconds counts )。
返される List 内の各値は、timeZoneIdentifier で識別される名前付きタイムゾーンにおける、指定された ISO 8601 暦日付および壁時計時刻に対応するエポックナノ秒カウント を表します。
入力が負のタイムゾーン遷移(たとえば、夏時間が終了する場合や、タイムゾーン規則の変更によってタイムゾーンオフセットが減少する場合)のため複数回発生するローカル時刻を表す場合、返される List は複数の要素を持ち、数値の昇順で並べ替えられます。
入力が正のタイムゾーン遷移(たとえば、夏時間が開始する場合や、タイムゾーン規則の変更によってタイムゾーンオフセットが増加する場合)のため飛ばされるローカル時刻を表す場合、返される List は空です。
それ以外の場合、返される List は1つの要素を持ちます。
いかなるタイムゾーンについてもローカルな政治的規則を含まない ECMAScript 実装で使用される、GetNamedTimeZoneEpochNanoseconds の既定の実装は、呼び出されたときに次の手順を実行します。
表明 : timeZoneIdentifier は "UTC" である。epochNanoseconds を GetUTCEpochNanoseconds (year , month , day , hour , minute , second , millisecond , microsecond , nanosecond ) とする。« epochNanoseconds » を返す。
注
タイムゾーン対応 実装には、IANA Time Zone Database のタイムゾーン情報を使用することが要求されます(その他のすべての実装にも推奨されます)。
America/New_York における2017年11月5日午前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 に対応)を表し、2番目の要素は 06:30 UTC(UTC オフセット -05:00 の米国東部標準時 01:30 に対応)を表します。
America/New_York における2017年3月12日午前2時30分は存在しないため、GetNamedTimeZoneEpochNanoseconds("America/New_York" , 2017, 3, 12, 2, 30, 0, 0, 0, 0) は空の List を返します。
21.4.1.21 GetNamedTimeZoneOffsetNanoseconds ( timeZoneIdentifier , epochNanoseconds )
実装定義の抽象操作 GetNamedTimeZoneOffsetNanoseconds。引数 timeZoneIdentifier (String) および epochNanoseconds (an epoch nanoseconds count)。戻り値:整数 。
返される整数 は、エポックナノ秒カウント epochNanoseconds に対応する時点における、timeZoneIdentifier で識別される名前付きタイムゾーンの UTC からのオフセットをナノ秒単位で表します。
いかなるタイムゾーンについてもローカルな政治的規則を含まない ECMAScript 実装で使用される、GetNamedTimeZoneOffsetNanoseconds の既定の実装は、呼び出されたときに次の手順を実行します。
表明 : timeZoneIdentifier は "UTC" である。0 を返す。
注
タイムゾーンオフセット値は正または負である場合があります。
21.4.1.22 Time Zone Identifier Record
Time Zone Identifier Record は、利用可能な名前付きタイムゾーン識別子 と、それに対応するプライマリタイムゾーン識別子 を説明するために使用される Record です。
Time Zone Identifier Record は 表 60 に列挙されるフィールドを持ちます。
表 60: Time Zone Identifier Record のフィールド
注
[[Identifier]] がプライマリタイムゾーン識別子 である場合、[[Identifier]] は [[PrimaryIdentifier]] です。
21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )
実装定義の抽象操作 AvailableNamedTimeZoneIdentifiers。引数なし。戻り値:リスト (要素:Time Zone Identifierレコード )。
その結果は、この実装で利用可能なすべての名前付きタイムゾーン識別子 と、それぞれの利用可能な名前付きタイムゾーン識別子 に対応するプライマリタイムゾーン識別子 を説明します。
List は、各 Time Zone Identifier Record の [[Identifier]] フィールドに従って順序付けられます。
ECMA-402 Internationalization API を実装するすべての実装を含むタイムゾーン対応 実装は、ECMA-402 で規定されるとおりに AvailableNamedTimeZoneIdentifiers 抽象操作 を実装しなければなりません。
それ以外の場合、AvailableNamedTimeZoneIdentifiers は呼び出されたときに次の手順を実行します。
実装がいかなるタイムゾーンについてもローカルな政治的規則を含まない場合、« Time Zone Identifier Record { [[Identifier]] : "UTC" , [[PrimaryIdentifier]] : "UTC" } » を返す。 identifiers を、一意な利用可能な名前付きタイムゾーン識別子 を辞書式コード単位順 で並べ替えた List とする。result を新しい空の List とする。identifiers の各要素 identifier について、次を行う。primary を identifier とする。identifier がこの実装における非プライマリタイムゾーン識別子 であり、identifier が "UTC" でない場合、primary を identifier に関連付けられたプライマリタイムゾーン識別子 に設定する。注記 : 実装は、プライマリタイムゾーン識別子 を取得するために identifier を反復的に解決する必要がある場合がある。record を Time Zone Identifier Record { [[Identifier]] : identifier , [[PrimaryIdentifier]] : primary } とする。record を result に追加する。表明 : result は、record .[[Identifier]] が "UTC" であり、record .[[PrimaryIdentifier]] が "UTC" である Time Zone Identifier Record record を含む。result を返す。
21.4.1.24 SystemTimeZoneIdentifier ( )
実装定義の抽象操作 SystemTimeZoneIdentifier。引数なし。戻り値:String。
ホスト環境 の現在のタイムゾーンを表す String を返します。これは、IsTimeZoneOffsetString が true を返す UTC オフセットを表す String、またはプライマリタイムゾーン識別子 のいずれかです。
呼び出されると、次の手順を実行する。
実装が UTC タイムゾーンだけをサポートする場合、"UTC" を返す。 systemTimeZoneString を、ホスト環境 の現在のタイムゾーンを表す String、すなわちプライマリタイムゾーン識別子 またはオフセットタイムゾーン 識別子のいずれかとする。systemTimeZoneString を返す。
注
Date オブジェクトのメソッドで実装が一般に提供する機能水準を保証するため、そのようなものが存在する場合、SystemTimeZoneIdentifier はホスト環境 のタイムゾーン設定に対応する IANA タイムゾーン名を返すことが推奨されます。
GetNamedTimeZoneEpochNanoseconds および GetNamedTimeZoneOffsetNanoseconds は、そのような規則が存在する場合、そのタイムゾーンにおける標準時および夏時間のローカルな政治的規則を反映しなければなりません。
たとえば、ホスト環境 が、ユーザーがタイムゾーンとして米国東部時間を選択したシステム上のブラウザーである場合、SystemTimeZoneIdentifier は "America/New_York" を返します。
21.4.1.25 LocalTime ( tv )
抽象操作 LocalTime。引数 tv (a finite time value)。戻り値:整数の Number 。
tv を UTC からローカル時刻へ変換します。
tv において有効な標準時および夏時間に関するローカルな政治的規則を使用して、この節で規定される方法で結果を決定するべきです。
呼び出されると、次の手順を実行する。
systemTimeZoneIdentifier を SystemTimeZoneIdentifier () とする。IsTimeZoneOffsetString (systemTimeZoneIdentifier ) が true である場合、offsetNanoseconds を ParseTimeZoneOffsetString (systemTimeZoneIdentifier ) とする。そうでない場合、offsetNanoseconds を GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier , ℝ (tv ) × NanosecondsPerMillisecond ) とする。 offsetMilliseconds を truncate (offsetNanoseconds / NanosecondsPerMillisecond ) とする。tv + 𝔽 (offsetMilliseconds ) を返す。
注 1
ローカル時刻 tv に対する政治的規則が実装内で利用できない場合、SystemTimeZoneIdentifier は "UTC" を返し、GetNamedTimeZoneOffsetNanoseconds は 0 を返すため、結果は tv です。
注 2
タイムゾーン対応 実装には、IANA Time Zone Database https://www.iana.org/time-zones/ のタイムゾーン情報を使用することが要求されます(その他のすべての実装にも推奨されます)。
注 3
時刻が繰り返される負のタイムゾーン遷移(たとえば、夏時間が終了する場合や、タイムゾーン調整が減少する場合)では、2つの異なる入力時間値 tv UTC が同じローカル時刻 tlocal に変換されます。
LocalTime(UTC (tv local )) は必ずしも常に tv local と等しいとは限りません。同様に、UTC (LocalTime(tv UTC )) も必ずしも常に tv UTC と等しいとは限りません。
21.4.1.26 UTC ( t )
抽象操作 UTC。引数 t (Number)。戻り値:a time value。
t をローカル時刻から UTC 時間値へ変換します。
t において有効な標準時および夏時間に関するローカルな政治的規則を使用して、この節で規定される方法で結果を決定するべきです。
呼び出されると、次の手順を実行する。
t が有限 Number でない場合、NaN を返す。systemTimeZoneIdentifier を SystemTimeZoneIdentifier () とする。IsTimeZoneOffsetString (systemTimeZoneIdentifier ) が true である場合、offsetNanoseconds を ParseTimeZoneOffsetString (systemTimeZoneIdentifier ) とする。そうでない場合、possibleInstants を GetNamedTimeZoneEpochNanoseconds (systemTimeZoneIdentifier , YearFromTime (t ), MonthFromTime (t ) + 1, DateFromTime (t ), HourFromTime (t ), MinuteFromTime (t ), SecondFromTime (t ), MillisecondFromTime (t ), 0, 0) とする。注記 : 次の手順は、t が負のタイムゾーン遷移(たとえば、夏時間が終了する場合や、タイムゾーン規則の変更によってタイムゾーンオフセットが減少する場合)で複数回繰り返されるローカル時刻、または正のタイムゾーン遷移(たとえば、夏時間が開始する場合や、タイムゾーン規則の変更によってタイムゾーンオフセットが増加する場合)で飛ばされるローカル時刻を表す場合に、遷移前のタイムゾーンオフセットを使用して t が解釈されることを保証する。possibleInstants が空でない場合、disambiguatedInstant を possibleInstants [0] とする。そうでない場合、注記 : t は正のタイムゾーン遷移(たとえば、夏時間の開始または UTC オフセットを増加させるタイムゾーン規則の変更による)で飛ばされたローカル時刻を表す。possibleInstantsBefore を GetNamedTimeZoneEpochNanoseconds (systemTimeZoneIdentifier , YearFromTime (tBefore ), MonthFromTime (tBefore ) + 1, DateFromTime (tBefore ), HourFromTime (tBefore ), MinuteFromTime (tBefore ), SecondFromTime (tBefore ), MillisecondFromTime (tBefore ), 0, 0) とする。ここで tBefore は possibleInstantsBefore が空でない最大の整数 Number < t である(すなわち、tBefore は遷移前の最後のローカル時刻を表す)。disambiguatedInstant を possibleInstantsBefore の最後の要素とする。 offsetNanoseconds を GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier , disambiguatedInstant ) とする。 offsetMilliseconds を truncate (offsetNanoseconds / NanosecondsPerMillisecond ) とする。t - 𝔽 (offsetMilliseconds ) を返す。
入力 t は名目上は時間値ですが、任意の Number 値 であってもかまいません。
ローカル UTC オフセットに関係なく時間値範囲の境界に対応する入力をサポートできるようにするため、アルゴリズムは t を時間値範囲に制限してはなりません。
たとえば、最大時間値は 8.64 × 1015 であり、"+275760-09-13T00:00:00Z" に対応します。
その瞬間にローカルタイムゾーンオフセットが UTC より1時間進んでいる環境では、これは "+275760-09-13T01:00:00+01:00" に対応する、より大きい入力 8.64 × 1015 + 3.6 × 106 で表されます。
ローカル時刻 t に対する政治的規則が実装内で利用できない場合、SystemTimeZoneIdentifier は "UTC" を返し、GetNamedTimeZoneOffsetNanoseconds は 0 を返すため、結果は t です。
注 1
タイムゾーン対応 実装には、IANA Time Zone Database のタイムゾーン情報を使用することが要求されます(その他のすべての実装にも推奨されます)。
America/New_York における2017年11月5日午前1時30分は2回繰り返されます(時計が戻る)が、午前1時30分 UTC-05 ではなく、午前1時30分 UTC-04 として解釈されなければなりません。
UTC(TimeClip (MakeDate (MakeDay (2017, 10, 5), MakeTime (1, 30, 0, 0)))) において、offsetMilliseconds の値は -4 × MillisecondsPerHour です。
America/New_York における2017年3月12日午前2時30分は存在しませんが、午前2時30分 UTC-05(午前3時30分 UTC-04 と同等)として解釈されなければなりません。
UTC(TimeClip (MakeDate (MakeDay (2017, 2, 12), MakeTime (2, 30, 0, 0)))) において、offsetMilliseconds の値は -5 × MillisecondsPerHour です。
注 2
UTC(LocalTime (t UTC )) は必ずしも常に t UTC と等しいとは限りません。同様に、LocalTime (UTC(t local )) も必ずしも常に t local と等しいとは限りません。
21.4.1.27 MakeTime ( hour , minute , second , millisecond )
抽象操作 MakeTime。引数 hour (Number)、minute (Number)、second (Number) および millisecond (Number)。戻り値:Number。 ミリ秒数を計算します。 呼び出されると、次の手順を実行する。
hour が有限 Number でない、minute が有限 Number でない、second が有限 Number でない、または millisecond が有限 Number でない場合、NaN を返す。hourMV を ! ToIntegerOrInfinity (hour ) とする。minuteMV を ! ToIntegerOrInfinity (minute ) とする。secondMV を ! ToIntegerOrInfinity (second ) とする。millisecondMV を ! ToIntegerOrInfinity (millisecond ) とする。((𝔽 (hourMV ) × 𝔽 (MillisecondsPerHour ) + 𝔽 (minuteMV ) × 𝔽 (MillisecondsPerMinute )) + 𝔽 (secondMV ) × 𝔽 (MillisecondsPerSecond )) + 𝔽 (millisecondMV ) を返す。
注
MakeTime 内の算術は浮動小数点算術であり、結合則が成り立たないため、演算は正しい順序で実行しなければなりません。
21.4.1.28 MakeDay ( year , month , day )
抽象操作 MakeDay。引数 year (Number)、month (Number) および day (Number)。戻り値:(a finite Number または NaN )。 日数を計算します。 呼び出されると、次の手順を実行する。
year が有限 Number でない、month が有限 Number でない、または day が有限 Number でない場合、NaN を返す。yearMV を ! ToIntegerOrInfinity (year ) とする。monthMV を ! ToIntegerOrInfinity (month ) とする。dayMV を ! ToIntegerOrInfinity (day ) とする。balancedYear を 𝔽 (yearMV ) + 𝔽 (floor (monthMV / 12)) とする。balancedYear が有限 Number でない場合、NaN を返す。balancedMonthMV を monthMV modulo 12 とする。YearFromTime (tv ) = ℝ (balancedYear )、MonthFromTime (tv ) = balancedMonthMV 、かつ DateFromTime (tv ) = 1 を満たす有限の時刻値 tv を見つける。ただし、これが不可能な場合(いずれかの引数が範囲外であるため)、NaN を返す。𝔽 (Day (tv )) + 𝔽 (dayMV ) - 1 𝔽 を返す。
21.4.1.29 MakeDate ( day , time )
抽象操作 MakeDate。引数 day (Number) および time (Number)。戻り値:(a finite Number または NaN )。 ミリ秒数を計算します。 呼び出されると、次の手順を実行する。
day が有限 Number でない、または time が有限 Number でない場合、NaN を返す。tv を day × 𝔽 (MillisecondsPerDay ) + time とする。tv が有限 Number でない場合、NaN を返す。tv を返す。
21.4.1.30 MakeFullYear ( year )
抽象操作 MakeFullYear。引数 year (Number)。戻り値:(整数の Number または NaN )。 year の整数 部分に関連付けられた完全な年を返し、0 から 99 までの閉区間 内の任意の値を 1900 年の開始からの年数として解釈します。先発グレゴリオ暦との整合のため、「完全な年」は年 0(紀元前1年)の開始からの完了した年数を符号付きで数えたものとして定義されます。 呼び出されると、次の手順を実行する。
year が NaN 、+∞ 𝔽 、または -∞ 𝔽 のいずれかである場合、NaN を返す。truncated を ! ToIntegerOrInfinity (year ) とする。truncated が 0 から 99 までの閉区間 内にある場合、1900 𝔽 + 𝔽 (truncated ) を返す。𝔽 (truncated ) を返す。
21.4.1.31 TimeClip ( time )
抽象操作 TimeClip。引数 time (Number)。戻り値:a time value。 ミリ秒数を計算します。 呼び出されると、次の手順を実行する。
time が有限 Number でない場合、NaN を返す。abs (ℝ (time )) > 8.64 × 1015 である場合、NaN を返す。𝔽 (! 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 オフセット表現が付加された「日付時刻」形式も含まれます。
THH:mm
THH:mm:ss
THH:mm:ss.sss
範囲外または形式に適合しない要素を含む文字列は、この形式の有効なインスタンスではありません。
注 1
毎日は真夜中に始まり真夜中に終わるため、1つの日付に関連付けられる2つの真夜中を区別するために、00:00 と 24:00 の2つの表記を使用できます。これは、次の2つの表記がまったく同じ時点を指すことを意味します。1995-02-04T24:00 と 1995-02-05T00:00。
注 2
この形式は、RFC 9557 で定義されるタイムゾーン名による注釈をサポートせず、タイムゾーンオフセットの数値表現だけをサポートします。
21.4.1.32.1 拡張年
1970年1月1日から前後約273,790年にわたる時間値の全範囲(21.4.1.1 )を網羅するには、0 より前または 9999 より後の年を表現する必要があります。ISO 8601 は年表現の拡張を許可していますが、情報交換を行う当事者間の相互合意がある場合に限られます。簡略化された ECMAScript 形式では、このような拡張年 表現は6桁でなければならず、常に + または - の符号を接頭辞として付けます。年 0 は正とみなされ、+ 符号を接頭辞として付けなければなりません。年 0 を -000000 と表現することは無効です。時間値の範囲外の時点を表す拡張年を持つ 日付時刻文字列形式 に一致する文字列は、Date.parse によって認識不能として扱われ、実装固有の動作またはヒューリスティックへフォールバックすることなく、その関数は NaN を返します。
注
拡張年を持つ日付時刻値 の例:
-271821-04-20T00:00:00Z
紀元前271822年
-000001-01-01T00:00:00Z
紀元前2年
+000000-01-01T00:00:00Z
紀元前1年
+000001-01-01T00:00:00Z
西暦1年
+001970-01-01T00:00:00Z
西暦1970年
+002009-12-15T00:00:00Z
西暦2009年
+275760-09-13T00:00:00Z
西暦275760年
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
TemporalDecimalFraction opt
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 )
抽象操作 IsTimeZoneOffsetString。引数 offsetString (String)。戻り値:Boolean。 戻り値は、offsetString が UTCOffset によって与えられる文法に適合するかどうかを示します。 呼び出されると、次の手順を実行する。
parseResult を ParseText (offsetString , UTCOffset ) とする。parseResult がエラーの List である場合、false を返す。true を返す。
21.4.1.33.2 ParseTimeZoneOffsetString ( offsetString )
抽象操作 ParseTimeZoneOffsetString。引数 offsetString (String)。戻り値:整数 。 戻り値は String offsetString に対応する UTC オフセットをナノ秒数として表します。 呼び出されると、次の手順を実行する。
parseResult を ParseText (offsetString , UTCOffset ) とする。表明 : parseResult はエラーの List ではない。表明 : parseResult は ASCIISign Parse Node を含む。parsedSign を parseResult 内に含まれる ASCIISign Parse Node に一致したソーステキストとする。parsedSign が単一のコードポイント U+002D (HYPHEN-MINUS) である場合、sign を -1 とする。そうでない場合、sign を 1 とする。 注記 : 以下の StringToNumber の適用では、構文解析された各値が十分短い10進数字の文字列であることが保証されているため、精度は失われない。表明 : parseResult は Hour Parse Node を含む。parsedHours を parseResult 内に含まれる Hour Parse Node に一致したソーステキストとする。hours を ℝ (StringToNumber (CodePointsToString (parsedHours ))) とする。parseResult が MinuteSecond Parse Node を含まない場合、minutes を 0 とする。そうでない場合、parsedMinutes を parseResult 内に含まれる最初の MinuteSecond Parse Node に一致したソーステキストとする。minutes を ℝ (StringToNumber (CodePointsToString (parsedMinutes ))) とする。 parseResult が2つの MinuteSecond Parse Node を含まない場合、seconds を 0 とする。そうでない場合、parsedSeconds を parseResult 内に含まれる2番目の MinuteSecond Parse Node に一致したソーステキストとする。seconds を ℝ (StringToNumber (CodePointsToString (parsedSeconds ))) とする。 parseResult が TemporalDecimalFraction Parse Node を含まない場合、nanoseconds を 0 とする。そうでない場合、parsedFraction を parseResult 内に含まれる TemporalDecimalFraction Parse Node に一致したソーステキストとする。fraction を CodePointsToString (parsedFraction ) と "000000000" の文字列連結 とする。nanosecondsString を fraction の 1 から 10 までの部分文字列 とする。nanoseconds を ℝ (StringToNumber (nanosecondsString )) とする。 sign × (((hours × MinutesPerHour + minutes ) × SecondsPerMinute + seconds ) × NanosecondsPerSecond + nanoseconds ) を返す。
21.4.2 Date コンストラクター
Date コンストラクター は:
%Date% です。
グローバルオブジェクト の "Date" プロパティの初期値です。
コンストラクター として呼び出されたとき、新しい Date を作成して初期化します。
コンストラクター としてではなく関数として呼び出されたとき、現在の時刻(UTC)を表す String を返します。
引数の数および型に基づいて動作が異なる関数です。
クラス定義の extends 節の値として使用できます。規定された Date の動作を継承しようとするサブクラスコンストラクター は、[[DateValue]] 内部スロットを持つサブクラスインスタンスを作成して初期化するために、Date コンストラクター への super 呼出しを含まなければなりません。
21.4.2.1 Date ( ...values )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、now を現在の時刻を識別する時間値(UTC)とする。ToDateString (now ) を返す。 numberOfArgs を values の要素数とする。numberOfArgs = 0 である場合、dv を現在の時刻を識別する時間値(UTC)とする。そうでなく、numberOfArgs = 1 である場合、value を values [0] とする。value が Object であり、value が [[DateValue]] 内部スロットを持つ場合、tv を value .[[DateValue]] とする。そうでない場合、primitive を ? ToPrimitive (value ) とする。primitive が String である場合、表明 : primitive は String であるため、次の手順は中断完了 を返さない。tv を、parse メソッド(21.4.3.2 )の場合とまったく同じ方法で primitive を日付として構文解析した結果とする。そうでない場合、tv を ? ToNumber (primitive ) とする。 dv を TimeClip (tv ) とする。 そうでない場合、表明 : numberOfArgs ≥ 2。yearNumber を ? ToNumber (values [0]) とする。monthNumber を ? ToNumber (values [1]) とする。numberOfArgs > 2 である場合、dayNumber を ? ToNumber (values [2]) とする。そうでない場合、dayNumber を 1 𝔽 とする。numberOfArgs > 3 である場合、hourNumber を ? ToNumber (values [3]) とする。そうでない場合、hourNumber を +0 𝔽 とする。numberOfArgs > 4 である場合、minuteNumber を ? ToNumber (values [4]) とする。そうでない場合、minuteNumber を +0 𝔽 とする。numberOfArgs > 5 である場合、secondNumber を ? ToNumber (values [5]) とする。そうでない場合、secondNumber を +0 𝔽 とする。numberOfArgs > 6 である場合、millisecondNumber を ? ToNumber (values [6]) とする。そうでない場合、millisecondNumber を +0 𝔽 とする。yearNumber を MakeFullYear (yearNumber ) に設定する。finalDate を MakeDate (MakeDay (yearNumber , monthNumber , dayNumber ), MakeTime (hourNumber , minuteNumber , secondNumber , millisecondNumber )) とする。dv を TimeClip (UTC (finalDate )) とする。 obj を ? OrdinaryCreateFromConstructor (NewTarget, "%Date.prototype%" , « [[DateValue]] ») とする。obj .[[DateValue]] を dv に設定する。obj を返す。
21.4.3 Date コンストラクターのプロパティ
Date コンストラクター は:
21.4.3.1 Date.now ( )
この関数は、呼び出された時点の UTC 日付および時刻を示す時間値を返します。
21.4.3.2 Date.parse ( string )
この関数は引数に ToString 演算子を適用します。ToString が中断完了 となった場合、その Completion Record が直ちに返されます。それ以外の場合、この関数は得られた String を日付および時刻として解釈し、その日付および時刻に対応する UTC 時間値である Number を返します。String の内容に応じて、ローカル時刻、UTC 時刻、または他のタイムゾーンの時刻として解釈される場合があります。関数はまず、拡張年 を含め、日付時刻文字列形式(21.4.1.32 )で説明される形式に従って String の構文解析を試みます。String がその形式に適合しない場合、関数は任意の実装固有のヒューリスティックまたは実装固有の日付形式へフォールバックしてもかまいません。認識不能な文字列、または範囲外の形式要素値を含む文字列では、この関数は NaN を返さなければなりません。
String が日付時刻文字列形式 に適合する場合、存在しない形式要素は代替値で置き換えられます。MM または DD 要素が存在しない場合、"01" が使用されます。HH、mm、または ss 要素が存在しない場合、"00" が使用されます。sss 要素が存在しない場合、"000" が使用されます。UTC オフセット表現が存在しない場合、日付のみの形式は UTC 時刻として解釈され、日付時刻形式はローカル時刻として解釈されます。
x が、特定の ECMAScript 実装においてミリ秒部分がゼロである任意の Date である場合、参照されるすべてのプロパティが初期値を持っていれば、次のすべての式はその実装で同じ数値を生成するべきです。
x.valueOf ()
Date .parse (x.toString ())
Date .parse (x.toUTCString ())
Date .parse (x.toISOString ())
ただし、式
Date .parse (x.toLocaleString ())
は、前の3つの式と同じ Number 値 を生成する必要はありません。一般に、この関数に、日付時刻文字列形式(21.4.1.32 )に適合せず、その実装の toString または toUTCString メソッドによって生成することもできない任意の String 値が渡された場合、この関数によって生成される値は実装定義 です。
21.4.3.3 Date.prototype
Date.prototype の初期値は Date prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
21.4.3.4 Date.UTC ( year [ , month [ , day [ , hour [ , minute [ , second [ , millisecond ] ] ] ] ] ] )
この関数は呼び出されたとき、次の手順を実行します。
yearNumber を ? ToNumber (year ) とする。month が存在する場合、monthNumber を ? ToNumber (month ) とする。そうでない場合、monthNumber を +0 𝔽 とする。day が存在する場合、dayNumber を ? ToNumber (day ) とする。そうでない場合、dayNumber を 1 𝔽 とする。hour が存在する場合、hourNumber を ? ToNumber (hour ) とする。そうでない場合、hourNumber を +0 𝔽 とする。minute が存在する場合、minuteNumber を ? ToNumber (minute ) とする。そうでない場合、minuteNumber を +0 𝔽 とする。second が存在する場合、secondNumber を ? ToNumber (second ) とする。そうでない場合、secondNumber を +0 𝔽 とする。millisecond が存在する場合、millisecondNumber を ? ToNumber (millisecond ) とする。そうでない場合、millisecondNumber を +0 𝔽 とする。yearNumber を MakeFullYear (yearNumber ) に設定する。TimeClip (MakeDate (MakeDay (yearNumber , monthNumber , dayNumber ), MakeTime (hourNumber , minuteNumber , secondNumber , millisecondNumber ))) を返す。
この関数の "length" プロパティは 7 𝔽 です。
注
この関数は Date コンストラクター と2つの点で異なります。Date を作成するのではなく Number として時間値を返すことと、引数をローカル時刻ではなく UTC として解釈することです。
21.4.4 Date Prototype オブジェクトのプロパティ
Date prototype オブジェクト は:
%Date.prototype% です。
それ自体が通常オブジェクト です。
Date インスタンスではなく、[[DateValue]] 内部スロットを持ちません。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
明示的に別段の定義がない限り、以下で定義される Date prototype オブジェクトのメソッドは汎用ではなく、それらに渡される this 値は、時間値に初期化された [[DateValue]] 内部スロットを持つオブジェクトでなければなりません。
21.4.4.1 Date.prototype.constructor
Date.prototype.constructor の初期値は %Date% です。
21.4.4.2 Date.prototype.getDate ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (DateFromTime (LocalTime (tv ))) を返す。
21.4.4.3 Date.prototype.getDay ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (WeekDay (LocalTime (tv ))) を返す。
21.4.4.4 Date.prototype.getFullYear ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (YearFromTime (LocalTime (tv ))) を返す。
21.4.4.5 Date.prototype.getHours ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (HourFromTime (LocalTime (tv ))) を返す。
21.4.4.6 Date.prototype.getMilliseconds ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (MillisecondFromTime (LocalTime (tv ))) を返す。
21.4.4.7 Date.prototype.getMinutes ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (MinuteFromTime (LocalTime (tv ))) を返す。
21.4.4.8 Date.prototype.getMonth ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (MonthFromTime (LocalTime (tv ))) を返す。
21.4.4.9 Date.prototype.getSeconds ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (SecondFromTime (LocalTime (tv ))) を返す。
21.4.4.10 Date.prototype.getTime ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 dateObj .[[DateValue]] を返す。
21.4.4.11 Date.prototype.getTimezoneOffset ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。(tv - LocalTime (tv )) / 𝔽 (MillisecondsPerMinute ) を返す。
21.4.4.12 Date.prototype.getUTCDate ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (DateFromTime (tv )) を返す。
21.4.4.13 Date.prototype.getUTCDay ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (WeekDay (tv )) を返す。
21.4.4.14 Date.prototype.getUTCFullYear ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (YearFromTime (tv )) を返す。
21.4.4.15 Date.prototype.getUTCHours ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (HourFromTime (tv )) を返す。
21.4.4.16 Date.prototype.getUTCMilliseconds ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (MillisecondFromTime (tv )) を返す。
21.4.4.17 Date.prototype.getUTCMinutes ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (MinuteFromTime (tv )) を返す。
21.4.4.18 Date.prototype.getUTCMonth ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (MonthFromTime (tv )) を返す。
21.4.4.19 Date.prototype.getUTCSeconds ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (SecondFromTime (tv )) を返す。
21.4.4.20 Date.prototype.setDate ( day )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。dayNumber を ? ToNumber (day ) とする。tv が NaN である場合、NaN を返す。tv を LocalTime (tv ) に設定する。newDate を MakeDate (MakeDay (𝔽 (YearFromTime (tv )), 𝔽 (MonthFromTime (tv )), dayNumber ), 𝔽 (TimeWithinDay (tv ))) とする。u を TimeClip (UTC (newDate )) とする。dateObj .[[DateValue]] を u に設定する。u を返す。
21.4.4.21 Date.prototype.setFullYear ( year [ , month [ , day ] ] )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。yearNumber を ? ToNumber (year ) とする。tv が NaN である場合、tv を +0 𝔽 に設定する。そうでない場合、tv を LocalTime (tv ) に設定する。month が存在する場合、monthNumber を ? ToNumber (month ) とする。そうでない場合、monthNumber を 𝔽 (MonthFromTime (tv )) とする。day が存在する場合、dayNumber を ? ToNumber (day ) とする。そうでない場合、dayNumber を 𝔽 (DateFromTime (tv )) とする。newDate を MakeDate (MakeDay (yearNumber , monthNumber , dayNumber ), 𝔽 (TimeWithinDay (tv ))) とする。u を TimeClip (UTC (newDate )) とする。dateObj .[[DateValue]] を u に設定する。u を返す。
このメソッドの "length" プロパティは 3 𝔽 です。
注
month が存在しない場合、このメソッドは month が値 getMonth() で存在したかのように動作します。day が存在しない場合、day が値 getDate() で存在したかのように動作します。
21.4.4.22 Date.prototype.setHours ( hour [ , minute [ , second [ , millisecond ] ] ] )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。hourNumber を ? ToNumber (hour ) とする。minute が存在する場合、minuteNumber を ? ToNumber (minute ) とする。second が存在する場合、secondNumber を ? ToNumber (second ) とする。millisecond が存在する場合、millisecondNumber を ? ToNumber (millisecond ) とする。tv が NaN である場合、NaN を返す。tv を LocalTime (tv ) に設定する。minute が存在しない場合、minuteNumber を 𝔽 (MinuteFromTime (tv )) とする。second が存在しない場合、secondNumber を 𝔽 (SecondFromTime (tv )) とする。millisecond が存在しない場合、millisecondNumber を 𝔽 (MillisecondFromTime (tv )) とする。date を MakeDate (𝔽 (Day (tv )), MakeTime (hourNumber , minuteNumber , secondNumber , millisecondNumber )) とする。u を TimeClip (UTC (date )) とする。dateObj .[[DateValue]] を u に設定する。u を返す。
このメソッドの "length" プロパティは 4 𝔽 です。
注
minute が存在しない場合、このメソッドは minute が値 getMinutes() で存在したかのように動作します。second が存在しない場合、second が値 getSeconds() で存在したかのように動作します。millisecond が存在しない場合、millisecond が値 getMilliseconds() で存在したかのように動作します。
21.4.4.23 Date.prototype.setMilliseconds ( millisecond )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。millisecondNumber を ? ToNumber (millisecond ) とする。tv が NaN である場合、NaN を返す。tv を LocalTime (tv ) に設定する。time を MakeTime (𝔽 (HourFromTime (tv )), 𝔽 (MinuteFromTime (tv )), 𝔽 (SecondFromTime (tv )), millisecondNumber ) とする。u を TimeClip (UTC (MakeDate (𝔽 (Day (tv )), time ))) とする。dateObj .[[DateValue]] を u に設定する。u を返す。
21.4.4.24 Date.prototype.setMinutes ( minute [ , second [ , millisecond ] ] )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。minuteNumber を ? ToNumber (minute ) とする。second が存在する場合、secondNumber を ? ToNumber (second ) とする。millisecond が存在する場合、millisecondNumber を ? ToNumber (millisecond ) とする。tv が NaN である場合、NaN を返す。tv を LocalTime (tv ) に設定する。second が存在しない場合、secondNumber を 𝔽 (SecondFromTime (tv )) とする。millisecond が存在しない場合、millisecondNumber を 𝔽 (MillisecondFromTime (tv )) とする。date を MakeDate (𝔽 (Day (tv )), MakeTime (𝔽 (HourFromTime (tv )), minuteNumber , secondNumber , millisecondNumber )) とする。u を TimeClip (UTC (date )) とする。dateObj .[[DateValue]] を u に設定する。u を返す。
このメソッドの "length" プロパティは 3 𝔽 です。
注
second が存在しない場合、このメソッドは second が値 getSeconds() で存在したかのように動作します。millisecond が存在しない場合、millisecond が値 getMilliseconds() で存在したかのように動作します。
21.4.4.25 Date.prototype.setMonth ( month [ , day ] )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。monthNumber を ? ToNumber (month ) とする。day が存在する場合、dayNumber を ? ToNumber (day ) とする。tv が NaN である場合、NaN を返す。tv を LocalTime (tv ) に設定する。day が存在しない場合、dayNumber を 𝔽 (DateFromTime (tv )) とする。newDate を MakeDate (MakeDay (𝔽 (YearFromTime (tv )), monthNumber , dayNumber ), 𝔽 (TimeWithinDay (tv ))) とする。u を TimeClip (UTC (newDate )) とする。dateObj .[[DateValue]] を u に設定する。u を返す。
このメソッドの "length" プロパティは 2 𝔽 です。
注
day が存在しない場合、このメソッドは day が値 getDate() で存在したかのように動作します。
21.4.4.26 Date.prototype.setSeconds ( second [ , millisecond ] )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。secondNumber を ? ToNumber (second ) とする。millisecond が存在する場合、millisecondNumber を ? ToNumber (millisecond ) とする。tv が NaN である場合、NaN を返す。tv を LocalTime (tv ) に設定する。millisecond が存在しない場合、millisecondNumber を 𝔽 (MillisecondFromTime (tv )) とする。date を MakeDate (𝔽 (Day (tv )), MakeTime (𝔽 (HourFromTime (tv )), 𝔽 (MinuteFromTime (tv )), secondNumber , millisecondNumber )) とする。u を TimeClip (UTC (date )) とする。dateObj .[[DateValue]] を u に設定する。u を返す。
このメソッドの "length" プロパティは 2 𝔽 です。
注
millisecond が存在しない場合、このメソッドは millisecond が値 getMilliseconds() で存在したかのように動作します。
21.4.4.27 Date.prototype.setTime ( time )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 t を ? ToNumber (time ) とする。v を TimeClip (t ) とする。dateObj .[[DateValue]] を v に設定する。v を返す。
21.4.4.28 Date.prototype.setUTCDate ( day )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。dayNumber を ? ToNumber (day ) とする。tv が NaN である場合、NaN を返す。newDate を MakeDate (MakeDay (𝔽 (YearFromTime (tv )), 𝔽 (MonthFromTime (tv )), dayNumber ), 𝔽 (TimeWithinDay (tv ))) とする。v を TimeClip (newDate ) とする。dateObj .[[DateValue]] を v に設定する。v を返す。
21.4.4.29 Date.prototype.setUTCFullYear ( year [ , month [ , day ] ] )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、tv を +0 𝔽 に設定する。yearNumber を ? ToNumber (year ) とする。month が存在する場合、monthNumber を ? ToNumber (month ) とする。そうでない場合、monthNumber を 𝔽 (MonthFromTime (tv )) とする。day が存在する場合、dayNumber を ? ToNumber (day ) とする。そうでない場合、dayNumber を 𝔽 (DateFromTime (tv )) とする。newDate を MakeDate (MakeDay (yearNumber , monthNumber , dayNumber ), 𝔽 (TimeWithinDay (tv ))) とする。v を TimeClip (newDate ) とする。dateObj .[[DateValue]] を v に設定する。v を返す。
このメソッドの "length" プロパティは 3 𝔽 です。
注
month が存在しない場合、このメソッドは month が値 getUTCMonth() で存在したかのように動作します。day が存在しない場合、day が値 getUTCDate() で存在したかのように動作します。
21.4.4.30 Date.prototype.setUTCHours ( hour [ , minute [ , second [ , millisecond ] ] ] )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。hourNumber を ? ToNumber (hour ) とする。minute が存在する場合、minuteNumber を ? ToNumber (minute ) とする。second が存在する場合、secondNumber を ? ToNumber (second ) とする。millisecond が存在する場合、millisecondNumber を ? ToNumber (millisecond ) とする。tv が NaN である場合、NaN を返す。minute が存在しない場合、minuteNumber を 𝔽 (MinuteFromTime (tv )) とする。second が存在しない場合、secondNumber を 𝔽 (SecondFromTime (tv )) とする。millisecond が存在しない場合、millisecondNumber を 𝔽 (MillisecondFromTime (tv )) とする。date を MakeDate (𝔽 (Day (tv )), MakeTime (hourNumber , minuteNumber , secondNumber , millisecondNumber )) とする。v を TimeClip (date ) とする。dateObj .[[DateValue]] を v に設定する。v を返す。
このメソッドの "length" プロパティは 4 𝔽 です。
注
minute が存在しない場合、このメソッドは minute が値 getUTCMinutes() で存在したかのように動作します。second が存在しない場合、second が値 getUTCSeconds() で存在したかのように動作します。millisecond が存在しない場合、millisecond が値 getUTCMilliseconds() で存在したかのように動作します。
21.4.4.31 Date.prototype.setUTCMilliseconds ( millisecond )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。millisecondNumber を ? ToNumber (millisecond ) とする。tv が NaN である場合、NaN を返す。time を MakeTime (𝔽 (HourFromTime (tv )), 𝔽 (MinuteFromTime (tv )), 𝔽 (SecondFromTime (tv )), millisecondNumber ) とする。v を TimeClip (MakeDate (𝔽 (Day (tv )), time )) とする。dateObj .[[DateValue]] を v に設定する。v を返す。
21.4.4.32 Date.prototype.setUTCMinutes ( minute [ , second [ , millisecond ] ] )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。minuteNumber を ? ToNumber (minute ) とする。second が存在する場合、secondNumber を ? ToNumber (second ) とする。millisecond が存在する場合、millisecondNumber を ? ToNumber (millisecond ) とする。tv が NaN である場合、NaN を返す。second が存在しない場合、secondNumber を 𝔽 (SecondFromTime (tv )) とする。millisecond が存在しない場合、millisecondNumber を 𝔽 (MillisecondFromTime (tv )) とする。date を MakeDate (𝔽 (Day (tv )), MakeTime (𝔽 (HourFromTime (tv )), minuteNumber , secondNumber , millisecondNumber )) とする。v を TimeClip (date ) とする。dateObj .[[DateValue]] を v に設定する。v を返す。
このメソッドの "length" プロパティは 3 𝔽 です。
注
second が存在しない場合、このメソッドは second が値 getUTCSeconds() で存在したかのように動作します。millisecond が存在しない場合、millisecond が getUTCMilliseconds() によって返される値で存在したかのように動作します。
21.4.4.33 Date.prototype.setUTCMonth ( month [ , day ] )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。monthNumber を ? ToNumber (month ) とする。day が存在する場合、dayNumber を ? ToNumber (day ) とする。tv が NaN である場合、NaN を返す。day が存在しない場合、dayNumber を 𝔽 (DateFromTime (tv )) とする。newDate を MakeDate (MakeDay (𝔽 (YearFromTime (tv )), monthNumber , dayNumber ), 𝔽 (TimeWithinDay (tv ))) とする。v を TimeClip (newDate ) とする。dateObj .[[DateValue]] を v に設定する。v を返す。
このメソッドの "length" プロパティは 2 𝔽 です。
注
day が存在しない場合、このメソッドは day が値 getUTCDate() で存在したかのように動作します。
21.4.4.34 Date.prototype.setUTCSeconds ( second [ , millisecond ] )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。secondNumber を ? ToNumber (second ) とする。millisecond が存在する場合、millisecondNumber を ? ToNumber (millisecond ) とする。tv が NaN である場合、NaN を返す。millisecond が存在しない場合、millisecondNumber を 𝔽 (MillisecondFromTime (tv )) とする。date を MakeDate (𝔽 (Day (tv )), MakeTime (𝔽 (HourFromTime (tv )), 𝔽 (MinuteFromTime (tv )), secondNumber , millisecondNumber )) とする。v を TimeClip (date ) とする。dateObj .[[DateValue]] を v に設定する。v を返す。
このメソッドの "length" プロパティは 2 𝔽 です。
注
millisecond が存在しない場合、このメソッドは millisecond が値 getUTCMilliseconds() で存在したかのように動作します。
21.4.4.35 Date.prototype.toDateString ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、"Invalid Date" を返す。t を LocalTime (tv ) とする。DateString (t ) を返す。
21.4.4.36 Date.prototype.toISOString ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、RangeError 例外をスローする。表明 : tv は整数 Number である。tv が日付時刻文字列形式 で表現できない年に対応する場合、RangeError 例外をスローする。UTC 時間尺度上で、すべての形式要素と UTC オフセット表現 "Z" を含む、日付時刻文字列形式 による tv の String 表現を返す。
21.4.4.37 Date.prototype.toJSON ( key )
このメソッドは JSON.stringify(25.5.4 )で使用するための Date の String 表現を提供します。
呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。tv を ? ToPrimitive (obj , number ) とする。tv が Number であり、かつ tv が有限 Number でない場合、null を返す。? Invoke (obj , "toISOString" ) を返す。
注 1
注 2
このメソッドは意図的に汎用です。this 値が Date であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。ただし、そのようなオブジェクトは toISOString メソッドを持つ必要があります。
21.4.4.38 Date.prototype.toLocaleDateString ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 Internationalization API を含む ECMAScript 実装は、ECMA-402 で規定されるとおりにこのメソッドを実装しなければなりません。それ以外の場合、このメソッドには次の仕様が使用されます。
このメソッドは String 値を返します。String の内容は実装定義 ですが、ホスト環境 の現在のロケールの慣例に対応する、便利で人間が読みやすい形式で、現在のタイムゾーンにおける Date の「日付」部分を表すことを意図しています。
このメソッドの省略可能なパラメーターの意味は ECMA-402 で定義されます。ECMA-402 のサポートを含まない実装は、それらのパラメーター位置を他の目的に使用してはなりません。
21.4.4.39 Date.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 Internationalization API を含む ECMAScript 実装は、ECMA-402 で規定されるとおりにこのメソッドを実装しなければなりません。それ以外の場合、このメソッドには次の仕様が使用されます。
このメソッドは String 値を返します。String の内容は実装定義 ですが、ホスト環境 の現在のロケールの慣例に対応する、便利で人間が読みやすい形式で、現在のタイムゾーンにおける Date を表すことを意図しています。
このメソッドの省略可能なパラメーターの意味は ECMA-402 で定義されます。ECMA-402 のサポートを含まない実装は、それらのパラメーター位置を他の目的に使用してはなりません。
21.4.4.40 Date.prototype.toLocaleTimeString ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 Internationalization API を含む ECMAScript 実装は、ECMA-402 で規定されるとおりにこのメソッドを実装しなければなりません。それ以外の場合、このメソッドには次の仕様が使用されます。
このメソッドは String 値を返します。String の内容は実装定義 ですが、ホスト環境 の現在のロケールの慣例に対応する、便利で人間が読みやすい形式で、現在のタイムゾーンにおける Date の「時刻」部分を表すことを意図しています。
このメソッドの省略可能なパラメーターの意味は ECMA-402 で定義されます。ECMA-402 のサポートを含まない実装は、それらのパラメーター位置を他の目的に使用してはなりません。
21.4.4.41 Date.prototype.toString ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。ToDateString (tv ) を返す。
注 1
d.[[DateValue]] が 1000 で割り切れる任意の Date d について、Date.parse(d.toString()) の結果は d.valueOf() と等しくなります。21.4.3.2 を参照してください。
注 2
このメソッドは汎用ではありません。this 値が Date でない場合、TypeError 例外をスローします。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことはできません。
21.4.4.41.1 TimeString ( tv )
抽象操作 TimeString。引数 tv (a Number, but not NaN )。戻り値:String。 呼び出されると、次の手順を実行する。
hour を ToZeroPaddedDecimalString (HourFromTime (tv ), 2) とする。minute を ToZeroPaddedDecimalString (MinuteFromTime (tv ), 2) とする。second を ToZeroPaddedDecimalString (SecondFromTime (tv ), 2) とする。hour 、":" 、minute 、":" 、second 、コード単位 0x0020 (SPACE)、および "GMT" の文字列連結 を返す。
21.4.4.41.2 DateString ( tv )
抽象操作 DateString。引数 tv (a Number, but not NaN )。戻り値:String。 呼び出されると、次の手順を実行する。
weekday を、表 61 内で WeekDay Index = WeekDay (tv ) である項目の Name とする。month を、表 62 内で Month Index = MonthFromTime (tv ) である項目の Name とする。day を ToZeroPaddedDecimalString (DateFromTime (tv ), 2) とする。yv を YearFromTime (tv ) とする。yv ≥ 0 である場合、yearSign を空の String とする。そうでない場合、yearSign を "-" とする。paddedYear を ToZeroPaddedDecimalString (abs (yv ), 4) とする。weekday 、コード単位 0x0020 (SPACE)、month 、コード単位 0x0020 (SPACE)、day 、コード単位 0x0020 (SPACE)、yearSign 、および paddedYear の文字列連結 を返す。
表 61: 曜日の名前
WeekDay インデックス
名前
0
"Sun"
1
"Mon"
2
"Tue"
3
"Wed"
4
"Thu"
5
"Fri"
6
"Sat"
表 62: 年の月の名前
Month インデックス
名前
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 )
抽象操作 TimeZoneString。引数 tv (整数の Number )。戻り値:String。 呼び出されると、次の手順を実行する。
systemTimeZoneIdentifier を SystemTimeZoneIdentifier () とする。IsTimeZoneOffsetString (systemTimeZoneIdentifier ) が true である場合、offsetNanoseconds を ParseTimeZoneOffsetString (systemTimeZoneIdentifier ) とする。そうでない場合、offsetNanoseconds を GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier , ℝ (tv ) × NanosecondsPerMillisecond ) とする。 offsetMilliseconds を truncate (offsetNanoseconds / NanosecondsPerMillisecond ) とする。offsetMilliseconds ≥ 0 である場合、offsetSign を "+" とする。absOffsetMilliseconds を offsetMilliseconds とする。そうでない場合、offsetSign を "-" とする。absOffsetMilliseconds を -offsetMilliseconds とする。 offsetMinute を ToZeroPaddedDecimalString (MinuteFromTime (𝔽 (absOffsetMilliseconds )), 2) とする。offsetHour を ToZeroPaddedDecimalString (HourFromTime (𝔽 (absOffsetMilliseconds )), 2) とする。timeZoneName を、空の String、またはコード単位 0x0020 (SPACE)、コード単位 0x0028 (LEFT PARENTHESIS)、実装定義 のタイムゾーン名、およびコード単位 0x0029 (RIGHT PARENTHESIS) の文字列連結 のいずれかである実装定義 の文字列とする。offsetSign 、offsetHour 、offsetMinute 、および timeZoneName の文字列連結 を返す。
21.4.4.41.4 ToDateString ( tv )
抽象操作 ToDateString。引数 tv ((整数の Number または NaN ))。戻り値:String。 呼び出されると、次の手順を実行する。
tv が NaN である場合、"Invalid Date" を返す。localTime を LocalTime (tv ) とする。DateString (localTime )、コード単位 0x0020 (SPACE)、TimeString (localTime )、および TimeZoneString (tv ) の文字列連結 を返す。
21.4.4.42 Date.prototype.toTimeString ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、"Invalid Date" を返す。localTime を LocalTime (tv ) とする。TimeString (localTime ) と TimeZoneString (tv ) の文字列連結 を返す。
21.4.4.43 Date.prototype.toUTCString ( )
このメソッドは、this 値に対応する時点を表す String 値を返します。String の形式は RFC 7231 の HTTP-date に基づいており、ECMAScript Date がサポートする時間の全範囲をサポートするよう一般化されています。
呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、"Invalid Date" を返す。weekday を、表 61 内で WeekDay Index = WeekDay (tv ) である項目の Name とする。month を、表 62 内で Month Index = MonthFromTime (tv ) である項目の Name とする。day を ToZeroPaddedDecimalString (DateFromTime (tv ), 2) とする。yv を YearFromTime (tv ) とする。yv ≥ 0 である場合、yearSign を空の String とする。そうでない場合、yearSign を "-" とする。paddedYear を ToZeroPaddedDecimalString (abs (yv ), 4) とする。weekday 、"," 、コード単位 0x0020 (SPACE)、day 、コード単位 0x0020 (SPACE)、month 、コード単位 0x0020 (SPACE)、yearSign 、paddedYear 、コード単位 0x0020 (SPACE)、および TimeString (tv ) の文字列連結 を返す。
21.4.4.44 Date.prototype.valueOf ( )
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 dateObj .[[DateValue]] を返す。
21.4.4.45 Date.prototype [ %Symbol.toPrimitive% ] ( hint )
このメソッドは、Date をプリミティブ値へ変換するために ECMAScript 言語演算子によって呼び出されます。hint に許される値は "default" 、"number" 、および "string" です。Date は、"default" を "string" と同等に扱うという点で組込み ECMAScript オブジェクトの中で固有です。その他のすべての組込み ECMAScript オブジェクトは "default" を "number" と同等に扱います。
呼び出されたとき、次の手順を実行します。
obj を this 値とする。obj が Object でない場合、TypeError 例外をスローする。hint が "string" または "default" のいずれかである場合、tryFirst を string とする。そうでなく、hint が "number" である場合、tryFirst を number とする。 そうでない場合、TypeError 例外をスローする。 ? OrdinaryToPrimitive (obj , tryFirst ) を返す。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
このメソッドの "name" プロパティの値は "[Symbol.toPrimitive]" です。
21.4.5 Date インスタンスのプロパティ
Date インスタンスは、Date prototype オブジェクト からプロパティを継承する通常オブジェクト です。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 )
この関数は呼び出されたとき、次の手順を実行します。
value が存在しない場合、string を空の String とする。そうでない場合、NewTarget が undefined であり、value が Symbol である場合、SymbolDescriptiveString (value ) を返す。 string を ? ToString (value ) とする。 NewTarget が undefined である場合、string を返す。 StringCreate (string , ? GetPrototypeFromConstructor (NewTarget, "%String.prototype%" )) を返す。
22.1.2 String コンストラクターのプロパティ
String コンストラクター は:
22.1.2.1 String.fromCharCode ( ...codeUnits )
この関数は、rest パラメーター codeUnits を構成する任意の数の引数で呼び出すことができます。
呼び出されたとき、次の手順を実行します。
result を空の String とする。codeUnits の各要素 next について、次を行う。nextCU を、数値が ℝ (? ToUint16 (next )) であるコード単位とする。result を result と nextCU の文字列連結 に設定する。result を返す。
この関数の "length" プロパティは 1 𝔽 です。
22.1.2.2 String.fromCodePoint ( ...codePoints )
この関数は、rest パラメーター codePoints を構成する任意の数の引数で呼び出すことができます。
呼び出されたとき、次の手順を実行します。
result を空の String とする。codePoints の各要素 next について、次を行う。nextCP を ? ToNumber (next ) とする。nextCP が整数 Number でない場合、RangeError 例外をスローする。ℝ (nextCP ) < 0 または ℝ (nextCP ) > 0x10FFFF である場合、RangeError 例外をスローする。result を result と UTF16EncodeCodePoint (ℝ (nextCP )) の文字列連結 に設定する。表明 : codePoints が空である場合、result は空の String である。result を返す。
この関数の "length" プロパティは 1 𝔽 です。
22.1.2.3 String.prototype
String.prototype の初期値は String prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
22.1.2.4 String.raw ( template , ...substitutions )
この関数は可変個の引数で呼び出すことができます。最初の引数は template であり、残りの引数が List substitutions を構成します。
呼び出されたとき、次の手順を実行します。
substitutionCount を substitutions の要素数とする。cooked を ? ToObject (template ) とする。literals を ? ToObject (? Get (cooked , "raw" )) とする。literalCount を ? LengthOfArrayLike (literals ) とする。literalCount ≤ 0 である場合、空の String を返す。result を空の String とする。nextIndex を 0 とする。次を繰り返す。nextLiteralValue を ? Get (literals , ! ToString (𝔽 (nextIndex ))) とする。nextLiteral を ? ToString (nextLiteralValue ) とする。result を result と nextLiteral の文字列連結 に設定する。nextIndex + 1 = literalCount である場合、result を返す。nextIndex < substitutionCount である場合、nextSubValue を substitutions [nextIndex ] とする。nextSub を ? ToString (nextSubValue ) とする。result を result と nextSub の文字列連結 に設定する。nextIndex を nextIndex + 1 に設定する。
注
この関数は Tagged Template(13.3.11 )のタグ関数として使用することを意図しています。そのように呼び出された場合、最初の引数は well-formed な template オブジェクトとなり、rest パラメーターには置換値が含まれます。
22.1.3 String Prototype オブジェクトのプロパティ
String prototype オブジェクト は:
%String.prototype% です。
String 特殊オブジェクト であり、そのようなオブジェクトに対して規定された内部メソッドを持ちます。
値が空の String である [[StringData]] 内部スロットを持ちます。
初期値が +0 𝔽 であり、属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ "length" プロパティを持ちます。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
明示的に別段の規定がない限り、以下で定義される String prototype オブジェクトのメソッドは汎用ではなく、それらに渡される this 値は String 値、または String 値に初期化された [[StringData]] 内部スロットを持つオブジェクトのいずれかでなければなりません。
22.1.3.1 String.prototype.at ( index )
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。length を string の長さとする。k を ? ToAbsoluteIndex (index , length ) とする。k < 0 または k ≥ length である場合、undefined を返す。string の k から k + 1 までの部分文字列 を返す。
22.1.3.2 String.prototype.charAt ( position )
注 1
このメソッドは、このオブジェクトを String に変換した結果の String 値内のインデックス position にあるコード単位を含む、単一要素の String を返します。そのインデックスに要素がない場合、結果は空の String です。結果は String オブジェクトではなく String 値です。
pos が整数 Number である場合、x.charAt(pos) の結果は x.substring(pos, pos + 1) の結果と同等です。
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。position を ? ToIntegerOrInfinity (position ) に設定する。size を string の長さとする。position < 0 または position ≥ size である場合、空の String を返す。string の position から position + 1 までの部分文字列 を返す。
注 2
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.3 String.prototype.charCodeAt ( position )
注 1
このメソッドは、このオブジェクトを String に変換した結果の String 内のインデックス position にあるコード単位の数値である Number(216 未満の非負の整数 Number)を返します。そのインデックスに要素がない場合、結果は NaN です。
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。position を ? ToIntegerOrInfinity (position ) に設定する。size を string の長さとする。position < 0 または position ≥ size である場合、NaN を返す。String string 内のインデックス position にあるコード単位の数値に対する Number 値 を返す。
注 2
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.4 String.prototype.codePointAt ( position )
注 1
このメソッドは、このオブジェクトを String に変換した結果の String 内のインデックス position にある文字列要素から始まる UTF-16 エンコードされたコードポイント(6.1.4 )の数値である、0x10FFFF 𝔽 以下の非負の整数 Number を返します。そのインデックスに要素がない場合、結果は undefined です。有効な UTF-16 サロゲートペア が position から始まらない場合、結果は position にあるコード単位です。
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。position を ? ToIntegerOrInfinity (position ) に設定する。size を string の長さとする。position < 0 または position ≥ size である場合、undefined を返す。codePoint を CodePointAt (string , position ) とする。𝔽 (codePoint .[[CodePoint]] ) を返す。
注 2
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.5 String.prototype.concat ( ...args )
注 1
このメソッドが呼び出されると、this 値(String に変換されたもの)のコード単位に続いて、それぞれ String に変換された各引数のコード単位からなる String 値を返します。結果は String オブジェクトではなく String 値です。
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。result を string とする。args の各要素 next について、次を行う。nextString を ? ToString (next ) とする。result を result と nextString の文字列連結 に設定する。result を返す。
このメソッドの "length" プロパティは 1 𝔽 です。
注 2
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.6 String.prototype.constructor
String.prototype.constructor の初期値は %String% です。
22.1.3.7 String.prototype.endsWith ( searchString [ , endPosition ] )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。isRegexp を ? IsRegExp (searchString ) とする。isRegexp が true である場合、TypeError 例外をスローする。searchString を ? ToString (searchString ) に設定する。length を string の長さとする。endPosition が undefined である場合、end を length とする。そうでない場合、end を ? ToIntegerOrInfinity (endPosition ) を 0 と length の間にクランプした結果とする。searchLength を searchString の長さとする。searchLength = 0 である場合、true を返す。start を end - searchLength とする。start < 0 である場合、false を返す。substring を string の start から end までの部分文字列 とする。substring が searchString である場合、true を返す。false を返す。
注 1
将来の版でこのような引数値を許可する拡張を定義できるようにするため、第1引数が RegExp である場合に例外をスローすることが規定されています。
注 2
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.8 String.prototype.includes ( searchString [ , position ] )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。isRegexp を ? IsRegExp (searchString ) とする。isRegexp が true である場合、TypeError 例外をスローする。searchString を ? ToString (searchString ) に設定する。length を string の長さとする。start を ? ToIntegerOrInfinity (position ) を 0 と length の間にクランプした結果とする。表明 : position が undefined である場合、start は 0 である。index を StringIndexOf (string , searchString , start ) とする。index が not-found である場合、false を返す。true を返す。
注 1
searchString が、このオブジェクトを String に変換した結果の部分文字列 として、position 以上の1つ以上のインデックスに現れる場合、この関数は true を返します。そうでない場合、false を返します。position が undefined である場合、String 全体を検索するために 0 とみなされます。
注 2
将来の版でこのような引数値を許可する拡張を定義できるようにするため、第1引数が RegExp である場合に例外をスローすることが規定されています。
注 3
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.9 String.prototype.indexOf ( searchString [ , position ] )
注 1
searchString が、このオブジェクトを String に変換した結果の部分文字列 として、position 以上の1つ以上のインデックスに現れる場合、そのような最小のインデックスが返されます。そうでない場合、-1 𝔽 が返されます。position が undefined である場合、String 全体を検索するために +0 𝔽 とみなされます。
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。searchString を ? ToString (searchString ) に設定する。length を string の長さとする。start を ? ToIntegerOrInfinity (position ) を 0 と length の間にクランプした結果とする。表明 : position が undefined である場合、start は 0 である。result を StringIndexOf (string , searchString , start ) とする。result が not-found である場合、-1 𝔽 を返す。𝔽 (result ) を返す。
注 2
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.10 String.prototype.isWellFormed ( )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。IsStringWellFormedUnicode (string ) を返す。
22.1.3.11 String.prototype.lastIndexOf ( searchString [ , position ] )
注 1
searchString が、このオブジェクトを String に変換した結果の部分文字列 として、position 以下の1つ以上のインデックスに現れる場合、そのような最大のインデックスが返されます。そうでない場合、-1 𝔽 が返されます。position が undefined である場合、String 全体を検索するために String 値の長さが使用されます。
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。searchString を ? ToString (searchString ) に設定する。numberPosition を ? ToNumber (position ) とする。length を string の長さとする。searchLength を searchString の長さとする。maxStart を length - searchLength とする。maxStart < 0 である場合、-1 𝔽 を返す。numberPosition が NaN である場合、start を maxStart とする。そうでない場合、start を ! ToIntegerOrInfinity (numberPosition ) を 0 と maxStart の間にクランプした結果とする。表明 : position が undefined である場合、start は maxStart である。result を StringLastIndexOf (string , searchString , start ) とする。result が not-found である場合、-1 𝔽 を返す。𝔽 (result ) を返す。
注 2
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.12 String.prototype.localeCompare ( that [ , reserved1 [ , reserved2 ] ] )
ECMA-402 Internationalization API を含む ECMAScript 実装は、ECMA-402 で規定されるとおりにこのメソッドを実装しなければなりません。それ以外の場合、このメソッドには次の仕様が使用されます。
このメソッドは、this 値(String string に変換されたもの)と that (String thatValue に変換されたもの)との実装定義 のロケール依存 String 比較の結果を表す、NaN 以外の Number を返します。結果はホスト環境 の現在のロケールの慣例に従う String 値のソート順に対応することを意図し、string が thatValue より前に並ぶ場合は負、string が thatValue より後に並ぶ場合は正、それ以外のすべての場合(string と thatValue の間に相対的な順序がないことを表す)はゼロになります。
比較を実行する前に、このメソッドは String を準備するために次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。thatValue を ? ToString (that ) とする。
このメソッドの省略可能な第2および第3パラメーターの意味は ECMA-402 で定義されます。ECMA-402 のサポートを含まない実装は、それらのパラメーター位置に他の解釈を割り当ててはなりません。
追加情報をエンコードできるようにするため、実際の戻り値は実装定義 ですが、このメソッドを2引数のメソッドとして考えた場合、すべての String の集合上で全順序を定義する一貫した比較器 であることが要求されます。このメソッドはまた、Unicode 標準に従う正準等価性を認識して尊重することも要求され、区別可能であるが正準等価な String を比較する場合には +0 𝔽 を返すことを含みます。
注 1
このメソッド自体は、後者が2引数の関数を要求するため、Array.prototype.sort への引数として直接使用するには適していません。
注 2
このメソッドは、ホスト環境 から ECMAScript 環境で利用可能な任意の言語依存および/またはロケール依存の比較機能に依存してもよく、ホスト環境 の現在のロケールの慣例に従って比較することを意図しています。ただし、比較能力に関係なく、このメソッドは Unicode 標準に従う正準等価性を認識して尊重しなければなりません。たとえば、次の比較はすべて +0 𝔽 を返さなければなりません。
"\u212B" .localeCompare ("A\u030A" )
"\u2126" .localeCompare ("\u03A9" )
"\u1E69" .localeCompare ("s\u0307\u0323" )
"\u1E0B\u0323" .localeCompare ("\u1E0D\u0307" )
"\u1100\u1161" .localeCompare ("\uAC00" )
正準等価性の定義および解説については Unicode 標準の第2章および第3章、ならびに Unicode Standard Annex #15, Unicode Normalization Forms と Unicode Technical Note #5, Canonical Equivalence in Applications を参照してください。また、Unicode Technical Standard #10, Unicode Collation Algorithm も参照してください。
このメソッドは、Unicode 標準の第3章3.7節で定義される Unicode 互換等価または互換分解を尊重しないことが推奨されます。
注 3
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.13 String.prototype.match ( regexpOrPattern )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 regexpOrPattern が Object である場合、matcher を ? GetMethod (regexpOrPattern , %Symbol.match% ) とする。matcher が undefined でない場合、? Call (matcher , regexpOrPattern , « thisValue ») を返す。 string を ? ToString (thisValue ) とする。regexp を ? RegExpCreate (regexpOrPattern , undefined ) とする。? Invoke (regexp , %Symbol.match% , « string ») を返す。
注
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.14 String.prototype.matchAll ( regexpOrPattern )
このメソッドは、this 値を表す String と regexpOrPattern との正規表現マッチを実行し、マッチ結果を生成する iterator を返します。各マッチ結果は、String の一致部分を最初の要素として含み、その後に各キャプチャグループによって一致した部分が続く Array です。正規表現が一度も一致しない場合、返される iterator はマッチ結果を何も生成しません。
呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 regexpOrPattern が Object である場合、isRegexp を ? IsRegExp (regexpOrPattern ) とする。isRegexp が true である場合、flags を ? Get (regexpOrPattern , "flags" ) とする。? RequireObjectCoercible (flags ) を実行する。 ? ToString (flags ) が "g" を含まない場合、TypeError 例外をスローする。 matcher を ? GetMethod (regexpOrPattern , %Symbol.matchAll% ) とする。matcher が undefined でない場合、? Call (matcher , regexpOrPattern , « thisValue ») を返す。 string を ? ToString (thisValue ) とする。regexp を ? RegExpCreate (regexpOrPattern , "g" ) とする。? Invoke (regexp , %Symbol.matchAll% , « string ») を返す。
注 1 このメソッドは意図的に汎用であり、this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
注 2 String.prototype.split と同様に、String.prototype.matchAll は通常、その入力を変更せずに動作するよう設計されています。
22.1.3.15 String.prototype.normalize ( [ form ] )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。form が undefined である場合、form を "NFC" に設定する。そうでない場合、form を ? ToString (form ) に設定する。 form が "NFC" 、"NFD" 、"NFKC" 、または "NFKD" のいずれでもない場合、RangeError 例外をスローする。normal を、最新の Unicode 標準の Normalization Forms で規定されるとおり、string を form で指定された正規化形式へ正規化した結果である String 値とする。normal を返す。
注
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.16 String.prototype.padEnd ( maxLength [ , fillString ] )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 ? StringPaddingBuiltinsImpl (thisValue , maxLength , fillString , end ) を返す。
22.1.3.17 String.prototype.padStart ( maxLength [ , fillString ] )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 ? StringPaddingBuiltinsImpl (thisValue , maxLength , fillString , start ) を返す。
22.1.3.17.1 StringPaddingBuiltinsImpl ( thisValue , maxLength , fillString , placement )
抽象操作 StringPaddingBuiltinsImpl。引数 thisValue (ECMAScript 言語値 )、maxLength (ECMAScript 言語値 )、fillString (ECMAScript 言語値 ) および placement ((start または end ))。戻り値:(正常完了 (値:String) または throw 完了 )。 呼び出されると、次の手順を実行する。
string を ? ToString (thisValue ) とする。intMaxLength を ℝ (? ToLength (maxLength )) とする。stringLength を string の長さとする。intMaxLength ≤ stringLength である場合、string を返す。fillString が undefined である場合、fillString をコード単位 0x0020 (SPACE) のみからなる String 値に設定する。そうでない場合、fillString を ? ToString (fillString ) に設定する。 StringPad (string , intMaxLength , fillString , placement ) を返す。
22.1.3.17.2 StringPad ( string , maxLength , fillString , placement )
抽象操作 StringPad。引数 string (String)、maxLength (非負整数)、fillString (String) および placement ((start または end ))。戻り値:String。 呼び出されると、次の手順を実行する。
stringLength を string の長さとする。maxLength ≤ stringLength である場合、string を返す。fillString が空の String である場合、string を返す。fillLength を maxLength - stringLength とする。truncatedStringFiller を、fillString を繰り返し連結し、長さ fillLength に切り詰めた String 値とする。placement が start である場合、truncatedStringFiller と string の文字列連結 を返す。string と truncatedStringFiller の文字列連結 を返す。
注 1
引数 maxLength は、string の長さより小さくならないようにクランプされます。
注 2
引数 fillString の既定値は " " (コード単位 0x0020 SPACE からなる String 値)です。
22.1.3.17.3 ToZeroPaddedDecimalString ( n , minLength )
抽象操作 ToZeroPaddedDecimalString。引数 n (非負整数) および minLength (非負整数)。戻り値:String。 呼び出されると、次の手順を実行する。
string を、n を10進数として整形した String 表現とする。StringPad (string , minLength , "0" , start ) を返す。
22.1.3.18 String.prototype.repeat ( count )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。n を ? ToIntegerOrInfinity (count ) とする。n < 0 または n = +∞ である場合、RangeError 例外をスローする。n = 0 である場合、空の String を返す。string の n 個のコピーを連結して作られた String 値を返す。
注 1
このメソッドは、this 値(String に変換されたもの)のコード単位を count 回繰り返した String 値を作成します。
注 2
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.19 String.prototype.replace ( searchValue , replaceValue )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 searchValue が Object である場合、replacer を ? GetMethod (searchValue , %Symbol.replace% ) とする。replacer が undefined でない場合、? Call (replacer , searchValue , « thisValue , replaceValue ») を返す。 string を ? ToString (thisValue ) とする。searchString を ? ToString (searchValue ) とする。functionalReplace を IsCallable (replaceValue ) とする。functionalReplace が false である場合、replaceValue を ? ToString (replaceValue ) に設定する。searchLength を searchString の長さとする。position を StringIndexOf (string , searchString , 0) とする。position が not-found である場合、string を返す。preceding を string の 0 から position までの部分文字列 とする。following を string の position + searchLength から始まる部分文字列 とする。functionalReplace が true である場合、replacement を ? ToString (? Call (replaceValue , undefined , « searchString , 𝔽 (position ), string »)) とする。そうでない場合、表明 : replaceValue は String である。captures を新しい空の List とする。replacement を ! GetSubstitution (searchString , string , position , captures , undefined , replaceValue ) とする。 preceding 、replacement 、および following の文字列連結 を返す。
注
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.19.1 GetSubstitution ( matched , string , position , captures , namedCaptures , replacementTemplate )
抽象操作 GetSubstitution。引数 matched (String)、string (String)、position (非負整数)、captures (リスト (要素:(String または undefined )))、namedCaptures ((Object または undefined )) および replacementTemplate (String)。戻り値:(正常完了 (値:String) または throw 完了 )。 この抽象操作 の目的において、10進数字 とは 0x0030 (DIGIT ZERO) から 0x0039 (DIGIT NINE) までの閉区間 内のコード単位です。 呼び出されると、次の手順を実行する。
stringLength を string の長さとする。表明 : position ≤ stringLength 。result を空の String とする。templateRemainder を replacementTemplate とする。templateRemainder が空の String でない間、次を繰り返す。注記 : 次の手順では、ref (templateRemainder の接頭辞)を分離し、refReplacement (その置換)を決定し、その置換を result に追加する。templateRemainder が "$$" で始まる場合、ref を "$$" とする。refReplacement を "$" とする。そうでなく、templateRemainder が "$`" で始まる場合、ref を "$`" とする。refReplacement を string の 0 から position までの部分文字列 とする。 そうでなく、templateRemainder が "$&" で始まる場合、ref を "$&" とする。refReplacement を matched とする。 そうでなく、templateRemainder が "$'" (0x0024 (DOLLAR SIGN) に 0x0027 (APOSTROPHE) が続くもの)で始まる場合、ref を "$'" とする。matchLength を matched の長さとする。tailPosition を position + matchLength とする。refReplacement を string の min (tailPosition , stringLength ) から始まる部分文字列 とする。注記 : tailPosition が stringLength を超えることができるのは、この抽象操作 が、"exec" プロパティが組込み %RegExp.prototype.exec% でないオブジェクトに対する %RegExp.prototype% の組込み %Symbol.replace% メソッドの呼出しによって起動された場合だけである。 そうでなく、templateRemainder が "$" に1個以上の10進数字が続く形で始まる場合、templateRemainder が "$" に2個以上の10進数字が続く形で始まる場合、digitCount を 2 とする。そうでない場合、digitCount を 1 とする。digits を templateRemainder の 1 から 1 + digitCount までの部分文字列 とする。index を ℝ (StringToNumber (digits )) とする。表明 : 0 ≤ index ≤ 99。captureLength を captures の要素数とする。index > captureLength かつ digitCount = 2 である場合、注記 : 2桁の置換パターンがキャプチャグループ数を超えるインデックスを指定する場合、1桁の置換パターンにリテラル数字が続くものとして扱われる。digitCount を 1 に設定する。digits を digits の 0 から 1 までの部分文字列 に設定する。index を ℝ (StringToNumber (digits )) に設定する。ref を templateRemainder の 0 から 1 + digitCount までの部分文字列 とする。1 ≤ index ≤ captureLength である場合、capture を captures [index - 1] とする。capture が undefined である場合、refReplacement を空の String とする。そうでない場合、refReplacement を capture とする。 そうでない場合、refReplacement を ref とする。 そうでなく、templateRemainder が "$<" で始まる場合、gtPosition を StringIndexOf (templateRemainder , ">" , 0) とする。gtPosition が not-found であるか、namedCaptures が undefined である場合、ref を "$<" とする。refReplacement を ref とする。そうでない場合、ref を templateRemainder の 0 から gtPosition + 1 までの部分文字列 とする。groupName を templateRemainder の 2 から gtPosition までの部分文字列 とする。表明 : namedCaptures は Object である。capture を ? Get (namedCaptures , groupName ) とする。capture が undefined である場合、refReplacement を空の String とする。そうでない場合、refReplacement を ? ToString (capture ) とする。 そうでない場合、ref を templateRemainder の 0 から 1 までの部分文字列 とする。refReplacement を ref とする。 refLength を ref の長さとする。templateRemainder を templateRemainder の refLength から始まる部分文字列 に設定する。result を result と refReplacement の文字列連結 に設定する。result を返す。
22.1.3.20 String.prototype.replaceAll ( searchValue , replaceValue )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 searchValue が Object である場合、isRegexp を ? IsRegExp (searchValue ) とする。isRegexp が true である場合、flags を ? Get (searchValue , "flags" ) とする。? RequireObjectCoercible (flags ) を実行する。 ? ToString (flags ) が "g" を含まない場合、TypeError 例外をスローする。 replacer を ? GetMethod (searchValue , %Symbol.replace% ) とする。replacer が undefined でない場合、? Call (replacer , searchValue , « thisValue , replaceValue ») を返す。 string を ? ToString (thisValue ) とする。searchString を ? ToString (searchValue ) とする。functionalReplace を IsCallable (replaceValue ) とする。functionalReplace が false である場合、replaceValue を ? ToString (replaceValue ) に設定する。searchLength を searchString の長さとする。advanceBy を max (1, searchLength ) とする。matchPositions を新しい空の List とする。position を StringIndexOf (string , searchString , 0) とする。position が not-found でない間、次を繰り返す。position を matchPositions に追加する。position を StringIndexOf (string , searchString , position + advanceBy ) に設定する。endOfLastMatch を 0 とする。result を空の String とする。matchPositions の各要素 matchPosition について、次を行う。preserved を string の endOfLastMatch から matchPosition までの部分文字列 とする。functionalReplace が true である場合、replacement を ? ToString (? Call (replaceValue , undefined , « searchString , 𝔽 (matchPosition ), string »)) とする。そうでない場合、表明 : replaceValue は String である。captures を新しい空の List とする。replacement を ! GetSubstitution (searchString , string , matchPosition , captures , undefined , replaceValue ) とする。 result を result 、preserved 、および replacement の文字列連結 に設定する。endOfLastMatch を matchPosition + searchLength に設定する。endOfLastMatch < string の長さである場合、result を result と string の endOfLastMatch から始まる部分文字列 の文字列連結 に設定する。result を返す。
22.1.3.21 String.prototype.search ( regexpOrPattern )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 regexpOrPattern が Object である場合、searcher を ? GetMethod (regexpOrPattern , %Symbol.search% ) とする。searcher が undefined でない場合、? Call (searcher , regexpOrPattern , « thisValue ») を返す。 string を ? ToString (thisValue ) とする。regexp を ? RegExpCreate (regexpOrPattern , undefined ) とする。? Invoke (regexp , %Symbol.search% , « string ») を返す。
注
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.22 String.prototype.slice ( start , end )
このメソッドは、このオブジェクトを String に変換した結果の部分文字列 を返します。これはインデックス start から始まり、インデックス end の直前まで続きます(end が undefined の場合は String の末尾まで)。start が負の場合、String の長さを sourceLength として sourceLength + start として扱われます。end が負の場合、String の長さを sourceLength として sourceLength + end として扱われます。結果は String オブジェクトではなく String 値です。
呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。length を string の長さとする。from を ? ToClampedIndex (start , length ) とする。end が undefined である場合、to を length とする。そうでない場合、to を ? ToClampedIndex (end , length ) とする。from ≥ to である場合、空の String を返す。string の from から to までの部分文字列 を返す。
注
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.23 String.prototype.split ( separator , limit )
このメソッドは、このオブジェクトを String に変換した結果の部分文字列 を格納した Array を返します。部分文字列 は、separator の出現を左から右へ検索することによって決定されます。これらの出現自体は返される配列内のどの String にも含まれず、String 値を分割する役割を果たします。separator の値は任意の長さの String であっても、%Symbol.split% メソッドを持つ RegExp などのオブジェクトであってもかまいません。
呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 separator が Object である場合、splitter を ? GetMethod (separator , %Symbol.split% ) とする。splitter が undefined でない場合、? Call (splitter , separator , « thisValue , limit ») を返す。 string を ? ToString (thisValue ) とする。limit が undefined である場合、lim を 232 - 1 とする。そうでない場合、lim を ℝ (? ToUint32 (limit )) とする。separatorString を ? ToString (separator ) とする。lim = 0 である場合、CreateArrayFromList (« ») を返す。separator が undefined である場合、CreateArrayFromList (« string ») を返す。separatorLength を separatorString の長さとする。separatorLength = 0 である場合、stringLength を string の長さとする。outLength を lim を 0 と stringLength の間にクランプした結果とする。head を string の 0 から outLength までの部分文字列 とする。codeUnits を、head の要素であるコード単位の列からなる List とする。CreateArrayFromList (codeUnits ) を返す。string が空の String である場合、CreateArrayFromList (« string ») を返す。substrings を新しい空の List とする。searchStart を 0 とする。matchIndex を StringIndexOf (string , separatorString , 0) とする。matchIndex が not-found でない間、次を繰り返す。substring を string の searchStart から matchIndex までの部分文字列 とする。substring を substrings に追加する。substrings の要素数が lim である場合、CreateArrayFromList (substrings ) を返す。searchStart を matchIndex + separatorLength に設定する。matchIndex を StringIndexOf (string , separatorString , searchStart ) に設定する。substring を string の searchStart から始まる部分文字列 とする。substring を substrings に追加する。CreateArrayFromList (substrings ) を返す。
注 1
separator の値は空の String であってもかまいません。この場合、separator は入力 String の先頭または末尾の空の部分文字列 にも、前の separator マッチの末尾の空の部分文字列 にも一致しません。separator が空の String である場合、String は個々のコード単位要素に分割されます。結果配列の長さは String の長さと等しく、各部分文字列 は1つのコード単位を含みます。
this 値が空の String である(または空の String に変換される)場合、結果は separator が空の String に一致できるかどうかに依存します。一致できる場合、結果配列は要素を含みません。そうでない場合、結果配列は空の String である1つの要素を含みます。
separator が undefined である場合、結果配列は this 値(String に変換されたもの)である1つの String だけを含みます。limit が undefined でない場合、出力配列は limit 個を超える要素を含まないよう切り詰められます。
注 2
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.24 String.prototype.startsWith ( searchString [ , position ] )
このメソッドは呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。isRegexp を ? IsRegExp (searchString ) とする。isRegexp が true である場合、TypeError 例外をスローする。searchString を ? ToString (searchString ) に設定する。length を string の長さとする。start を ? ToIntegerOrInfinity (position ) を 0 と length の間にクランプした結果とする。表明 : position が undefined である場合、start は 0 である。searchLength を searchString の長さとする。searchLength = 0 である場合、true を返す。end を start + searchLength とする。end > length である場合、false を返す。substring を string の start から end までの部分文字列 とする。substring が searchString である場合、true を返す。false を返す。
注 1
将来の版でこのような引数値を許可する拡張を定義できるようにするため、第1引数が RegExp である場合に例外をスローすることが規定されています。
注 2
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.25 String.prototype.substring ( start , end )
このメソッドは、このオブジェクトを String に変換した結果の部分文字列 を返します。これはインデックス start から始まり、String のインデックス end の直前まで続きます(end が undefined の場合は String の末尾まで)。結果は String オブジェクトではなく String 値です。
いずれかの引数が NaN または負である場合、その引数はゼロに置き換えられます。いずれかの引数が String の長さより厳密に大きい場合、その引数は String の長さに置き換えられます。
start が end より厳密に大きい場合、両者は入れ替えられます。
呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。length を string の長さとする。finalStart を ? ToIntegerOrInfinity (start ) を 0 と length の間にクランプした結果とする。表明 : start が undefined である場合、finalStart は 0 である。end が undefined である場合、finalEnd を length とする。そうでない場合、finalEnd を ? ToIntegerOrInfinity (end ) を 0 と length の間にクランプした結果とする。from を min (finalStart , finalEnd ) とする。to を max (finalStart , finalEnd ) とする。string の from から to までの部分文字列 を返す。
注
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.26 String.prototype.toLocaleLowerCase ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 Internationalization API を含む ECMAScript 実装は、ECMA-402 で規定されるとおりにこのメソッドを実装しなければなりません。それ以外の場合、このメソッドには次の仕様が使用されます。
このメソッドは、6.1.4 で説明されるように、String 値を UTF-16 エンコードされたコードポイントの列として解釈します。
ホスト環境 の現在のロケールの慣例に対応するロケール依存の結果を生成することを意図している点を除き、toLowerCase とまったく同じように動作します。その言語の規則が通常の Unicode 大文字小文字マッピングと競合 する少数の場合(トルコ語など)にだけ違いが生じます。
このメソッドの省略可能なパラメーターの意味は ECMA-402 で定義されます。ECMA-402 のサポートを含まない実装は、それらのパラメーター位置を他の目的に使用してはなりません。
注
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.27 String.prototype.toLocaleUpperCase ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 Internationalization API を含む ECMAScript 実装は、ECMA-402 で規定されるとおりにこのメソッドを実装しなければなりません。それ以外の場合、このメソッドには次の仕様が使用されます。
このメソッドは、6.1.4 で説明されるように、String 値を UTF-16 エンコードされたコードポイントの列として解釈します。
ホスト環境 の現在のロケールの慣例に対応するロケール依存の結果を生成することを意図している点を除き、toUpperCase とまったく同じように動作します。その言語の規則が通常の Unicode 大文字小文字マッピングと競合 する少数の場合(トルコ語など)にだけ違いが生じます。
このメソッドの省略可能なパラメーターの意味は ECMA-402 で定義されます。ECMA-402 のサポートを含まない実装は、それらのパラメーター位置を他の目的に使用してはなりません。
注
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.28 String.prototype.toLowerCase ( )
このメソッドは、6.1.4 で説明されるように、String 値を UTF-16 エンコードされたコードポイントの列として解釈します。
呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。sText を StringToCodePoints (string ) とする。lowerText を Unicode Default Case Conversion アルゴリズムに従った toLowercase(sText ) とする。lowercaseString を CodePointsToString (lowerText ) とする。lowercaseString を返す。
結果は Unicode Character Database のロケール非依存の大文字小文字マッピングに従って導出されなければなりません(これには UnicodeData.txt ファイルだけでなく、それに付随する SpecialCasing.txt ファイル内のすべてのロケール非依存マッピングも明示的に含まれます)。
注 1
一部のコードポイントの大文字小文字マッピングは複数のコードポイントを生成する場合があります。この場合、結果の String は元の String と同じ長さでない場合があります。toUpperCase と toLowerCase はどちらも文脈依存の動作を持つため、これらのメソッドは対称ではありません。言い換えると、s.toUpperCase().toLowerCase() は必ずしも s.toLowerCase() と等しくありません。
注 2
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.29 String.prototype.toString ( )
このメソッドは呼び出されたとき、次の手順を実行します。
? ThisStringValue (this 値) を返す。
注
String オブジェクトについて、このメソッドは結果として valueOf メソッドと同じものを返します。
22.1.3.30 String.prototype.toUpperCase ( )
このメソッドは、6.1.4 で説明されるように、String 値を UTF-16 エンコードされたコードポイントの列として解釈します。
String が Unicode Default Case Conversion の toUppercase アルゴリズムを使用してマッピングされる点を除き、String.prototype.toLowerCase とまったく同じように動作します。
注
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.31 String.prototype.toWellFormed ( )
このメソッドは、このオブジェクトの String 表現を返します。サロゲートペア の一部ではないすべての先行サロゲート および後続サロゲート は U+FFFD (REPLACEMENT CHARACTER) に置き換えられます。
呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? RequireObjectCoercible (thisValue ) を実行する。 string を ? ToString (thisValue ) とする。stringLength を string の長さとする。k を 0 とする。result を空の String とする。k < stringLength の間、次を繰り返す。codePoint を CodePointAt (string , k ) とする。codePoint .[[IsUnpairedSurrogate]] が true である場合、result を result と 0xFFFD (REPLACEMENT CHARACTER) の文字列連結 に設定する。そうでない場合、result を result と UTF16EncodeCodePoint (codePoint .[[CodePoint]] ) の文字列連結 に設定する。 k を k + codePoint .[[CodeUnitCount]] に設定する。result を返す。
22.1.3.32 String.prototype.trim ( )
このメソッドは、6.1.4 で説明されるように、String 値を UTF-16 エンコードされたコードポイントの列として解釈します。
呼び出されたとき、次の手順を実行します。
thisValue を this 値とする。? TrimString (thisValue , start+end ) を返す。
注
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.32.1 TrimString ( arg , where )
抽象操作 TrimString。引数 arg (ECMAScript 言語値 ) および where ((start 、end または start+end ))。戻り値:(正常完了 (値:String) または throw 完了 )。 6.1.4 で説明されるように、arg を UTF-16 エンコードされたコードポイントの列として解釈します。 呼び出されると、次の手順を実行する。
? RequireObjectCoercible (arg ) を実行する。 string を ? ToString (arg ) とする。where が start である場合、trimmedString を、string の先頭の空白を除去したコピーである String 値とする。そうでなく、where が end である場合、trimmedString を、string の末尾の空白を除去したコピーである String 値とする。 そうでない場合、表明 : where は start+end である。trimmedString を、string の先頭および末尾の両方の空白を除去したコピーである String 値とする。 trimmedString を返す。
空白の定義は WhiteSpace と LineTerminator の和集合です。Unicode コードポイントが Unicode 一般カテゴリ「Space_Separator」(「Zs」)に属するかどうかを判定するとき、コード単位列は 6.1.4 で規定される UTF-16 エンコードされたコードポイント列として解釈されます。
22.1.3.33 String.prototype.trimEnd ( )
このメソッドは、6.1.4 で説明されるように、String 値を UTF-16 エンコードされたコードポイントの列として解釈します。
呼び出されたとき、次の手順を実行します。
string を this 値とする。? TrimString (string , end ) を返す。
注
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.34 String.prototype.trimStart ( )
このメソッドは、6.1.4 で説明されるように、String 値を UTF-16 エンコードされたコードポイントの列として解釈します。
呼び出されたとき、次の手順を実行します。
string を this 値とする。? TrimString (string , start ) を返す。
注
このメソッドは意図的に汎用です。this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
22.1.3.35 String.prototype.valueOf ( )
このメソッドは呼び出されたとき、次の手順を実行します。
? ThisStringValue (this 値) を返す。
22.1.3.35.1 ThisStringValue ( arg )
抽象操作 ThisStringValue。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:String) または throw 完了 )。 呼び出されると、次の手順を実行する。
arg が String である場合、arg を返す。arg が Object であり、arg が [[StringData]] 内部スロットを持つ場合、string を arg .[[StringData]] とする。表明 : string は String である。string を返す。TypeError 例外をスローする。
22.1.3.36 String.prototype [ %Symbol.iterator% ] ( )
このメソッドは String 値のコードポイントを反復し、各コードポイントを String 値として返す iterator オブジェクトを返します。
呼び出されたとき、次の手順を実行します。
string を this 値とする。? RequireObjectCoercible (string ) を実行する。 string を ? ToString (string ) に設定する。closure を、パラメーターを持たず、string を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。length を string の長さとする。position を 0 とする。position < length の間、次を繰り返す。codePoint を CodePointAt (string , position ) とする。nextIndex を position + codePoint .[[CodeUnitCount]] とする。resultString を string の position から nextIndex までの部分文字列 とする。position を nextIndex に設定する。? GeneratorYield (CreateIteratorResultObject (resultString , false )) を実行する。 NormalCompletion (unused ) を返す。CreateIteratorFromClosure (closure , "%StringIteratorPrototype%" , %StringIteratorPrototype% ) を返す。
このメソッドの "name" プロパティの値は "[Symbol.iterator]" です。
22.1.4 String インスタンスのプロパティ
String インスタンスは String 特殊オブジェクト であり、そのようなオブジェクトに対して規定された内部メソッドを持ちます。String インスタンスは String prototype オブジェクト からプロパティを継承します。String インスタンスは [[StringData]] 内部スロットも持ちます。[[StringData]] 内部スロットは、この String オブジェクトによって表される String 値です。
String インスタンスは "length" プロパティと、整数インデックス 名を持つ列挙可能なプロパティの集合を持ちます。
22.1.4.1 length
この String オブジェクトによって表される String 値内の要素数です。
String オブジェクトが初期化されると、このプロパティは変化しません。属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
22.1.5 String Iterator オブジェクト
String Iterator は、特定の String インスタンスオブジェクトに対する特定の反復を表すオブジェクトです。String Iterator オブジェクトには名前付きコンストラクター はありません。代わりに、String Iterator オブジェクトは String インスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。
22.1.5.1 %StringIteratorPrototype% オブジェクト
%StringIteratorPrototype% オブジェクトは:
22.1.5.1.1 %StringIteratorPrototype%.next ( )
? GeneratorResume (this 値, empty , "%StringIteratorPrototype%" ) を返す。
22.1.5.1.2 %StringIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "String Iterator" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
22.2 RegExp(正規表現)オブジェクト
RegExp オブジェクトは正規表現と、それに関連付けられたフラグを含みます。
注
正規表現の形式と機能は、Perl 5 プログラミング言語の正規表現機能をモデルにしています。
22.2.1 パターン
RegExp コンストラクター は、入力 pattern String に次の文法を適用します。文法が String を 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
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
UnicodePropertyNameCharacters opt
UnicodePropertyValue ::
UnicodePropertyValueCharacters
LoneUnicodePropertyNameOrValue ::
UnicodePropertyValueCharacters
UnicodePropertyValueCharacters ::
UnicodePropertyValueCharacter
UnicodePropertyValueCharacters opt
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
ClassUnion opt
ClassSetOperand
ClassUnion opt
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]
注 1
ここでの最初の2行は CharacterClass と同等です。
ClassStringDisjunction ::
\q{
ClassStringDisjunctionContents
}
ClassStringDisjunctionContents ::
ClassString
ClassString
|
ClassStringDisjunctionContents
ClassString ::
[empty]
NonEmptyClassString
NonEmptyClassString ::
ClassSetCharacter
NonEmptyClassString opt
ClassSetCharacter ::
[lookahead ∉ ClassSetReservedDoublePunctuator ]
SourceCharacter but not ClassSetSyntaxCharacter
\
CharacterEscape [+UnicodeMode]
\
ClassSetReservedPunctuator
\b
ClassSetReservedDoublePunctuator :: one of && !! ## $$ %% ** ++ ,, .. :: ;; << == >> ?? @@ ^^ `` ~~
ClassSetSyntaxCharacter :: one of ( ) [ ] { } / - \ |
ClassSetReservedPunctuator :: one of & - ! # % , : ; < = > @ ` ~
注 2
この節のいくつかの生成規則には、B.1.2 で代替定義が与えられています。
22.2.1.1 Static Semantics: 早期エラー
注
Pattern :: Disjunction
QuantifierPrefix ::
{
DecimalDigits
,
DecimalDigits
}
Atom ::
(?
RegularExpressionModifiers
:
Disjunction
)
Atom ::
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction
)
AtomEscape ::
k
GroupName
AtomEscape :: DecimalEscape
NonemptyClassRanges ::
ClassAtom
-
ClassAtom
ClassContents
NonemptyClassRangesNoDash ::
ClassAtomNoDash
-
ClassAtom
ClassContents
RegExpIdentifierStart ::
\
RegExpUnicodeEscapeSequence
RegExpIdentifierStart ::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart ::
\
RegExpUnicodeEscapeSequence
RegExpIdentifierPart ::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
UnicodePropertyValueExpression ::
UnicodePropertyName
=
UnicodePropertyValue
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
CharacterClassEscape ::
P{
UnicodePropertyValueExpression
}
CharacterClass ::
[^
ClassContents
]
NestedClass ::
[^
ClassContents
]
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
22.2.1.2 Static Semantics: CountLeftCapturingParensWithin ( parseNode )
抽象操作 CountLeftCapturingParensWithin。引数 parseNode (構文解析ノード )。戻り値:非負整数。 parseNode 内の左キャプチャ括弧の数を返します。左キャプチャ括弧 とは、
Atom ::
(
GroupSpecifier opt
Disjunction
)
生成規則の ( 終端記号に一致する任意の ( パターン文字です。
注
呼び出されると、次の手順を実行する。
表明 : parseNode は RegExp Pattern 文法 内の生成規則のインスタンスである。parseNode 内に含まれる
Atom ::
(
GroupSpecifier opt
Disjunction
)
Parse Node の数を返す。
22.2.1.3 Static Semantics: CountLeftCapturingParensBefore ( parseNode )
抽象操作 CountLeftCapturingParensBefore。引数 parseNode (構文解析ノード )。戻り値:非負整数。 包含する pattern 内で parseNode の左側に現れる左キャプチャ括弧 の数を返します。
注
呼び出されると、次の手順を実行する。
表明 : parseNode は RegExp Pattern 文法 内の生成規則のインスタンスである。pattern を parseNode を含む Pattern とする。pattern 内に含まれ、parseNode より前に現れるか、parseNode を含む
Atom ::
(
GroupSpecifier opt
Disjunction
)
Parse Node の数を返す。
22.2.1.4 Static Semantics: MightBothParticipate ( x , y )
抽象操作 MightBothParticipate。引数 x (構文解析ノード ) および y (構文解析ノード )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
表明 : x と y は同じ包含する Pattern を持つ。包含する Pattern が
Disjunction ::
Alternative
|
Disjunction
Parse Node を含み、x が Alternative 内に含まれ、y が派生した Disjunction 内に含まれるか、または x が派生した Disjunction 内に含まれ、y が Alternative 内に含まれる場合、false を返す。 true を返す。
22.2.1.5 Static Semantics: CapturingGroupNumber
構文指向操作 CapturingGroupNumber。引数なし。戻り値:正の整数。
注
次の生成規則ごとに定義される。
DecimalEscape :: NonZeroDigit
NonZeroDigit の MV を返す。
DecimalEscape ::
NonZeroDigit
DecimalDigits
n を DecimalDigits 内のコードポイント数とする。(NonZeroDigit の MV × 10n に DecimalDigits の MV を加えたもの)を返す。
「NonZeroDigit の MV」および「DecimalDigits の MV」の定義は 12.9.3 にあります。
22.2.1.6 Static Semantics: IsCharacterClass
構文指向操作 IsCharacterClass。引数なし。戻り値:Boolean。
注
次の生成規則ごとに定義される。
ClassAtom ::
-
ClassAtomNoDash ::
SourceCharacter but not one of \ or ] or -
ClassEscape ::
b
-
CharacterEscape
false を返す。
ClassEscape :: CharacterClassEscape
true を返す。
22.2.1.7 Static Semantics: CharacterValue
構文指向操作 CharacterValue。引数なし。戻り値:非負整数。
注 1
次の生成規則ごとに定義される。
ClassAtom :: -
U+002D (HYPHEN-MINUS) の数値を返す。
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
codePoint を SourceCharacter に一致したコードポイントとする。codePoint の数値を返す。
ClassEscape :: b
U+0008 (BACKSPACE) の数値を返す。
ClassEscape ::
U+002D (HYPHEN-MINUS) の数値を返す。
CharacterEscape :: ControlEscape
表 63 に従う数値を返す。
表 63: ControlEscape コードポイント値
ControlEscape
数値
コードポイント
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
codePoint を AsciiLetter に一致したコードポイントとする。i を codePoint の数値とする。i を 32 で除算した余りを返す。
CharacterEscape ::
0
[lookahead ∉ DecimalDigit ]
U+0000 (NULL) の数値を返す。
注 2
\0 は <NUL> 文字を表し、その後に10進数字を続けることはできません。
CharacterEscape :: HexEscapeSequence
HexEscapeSequence の MV を返す。
RegExpUnicodeEscapeSequence ::
u
HexLeadSurrogate
\u
HexTrailSurrogate
lead を HexLeadSurrogate の CharacterValue とする。trail を HexTrailSurrogate の CharacterValue とする。codePoint を UTF16SurrogatePairToCodePoint (lead , trail ) とする。codePoint の数値を返す。
RegExpUnicodeEscapeSequence ::
u
Hex4Digits
Hex4Digits の MV を返す。
RegExpUnicodeEscapeSequence ::
u{
CodePoint
}
CodePoint の MV を返す。
HexLeadSurrogate :: Hex4Digits
HexTrailSurrogate :: Hex4Digits
HexNonSurrogate :: Hex4Digits
Hex4Digits の MV を返す。
CharacterEscape :: IdentityEscape
codePoint を IdentityEscape に一致したコードポイントとする。codePoint の数値を返す。
ClassSetCharacter :: SourceCharacter but not ClassSetSyntaxCharacter
codePoint を SourceCharacter に一致したコードポイントとする。codePoint の数値を返す。
ClassSetCharacter ::
\
ClassSetReservedPunctuator
codePoint を ClassSetReservedPunctuator に一致したコードポイントとする。codePoint の数値を返す。
ClassSetCharacter :: \b
U+0008 (BACKSPACE) の数値を返す。
22.2.1.8 Static Semantics: MayContainStrings
構文指向操作 MayContainStrings。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。
CharacterClassEscape ::
d
D
s
S
w
W
P{
UnicodePropertyValueExpression
}
UnicodePropertyValueExpression ::
UnicodePropertyName
=
UnicodePropertyValue
NestedClass ::
[^
ClassContents
]
ClassContents ::
[empty]
NonemptyClassRanges
ClassSetOperand ::
ClassSetCharacter
false を返す。
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
LoneUnicodePropertyNameOrValue に一致したソーステキストが 表 67 の「Property name 」列に列挙された文字列のバイナリプロパティである場合、true を返す。false を返す。
ClassUnion ::
ClassSetRange
ClassUnion opt
ClassUnion が存在する場合、ClassUnion の MayContainStrings を返す。false を返す。
ClassUnion ::
ClassSetOperand
ClassUnion opt
ClassSetOperand の MayContainStrings が true である場合、true を返す。ClassUnion が存在する場合、ClassUnion の MayContainStrings を返す。false を返す。
ClassIntersection ::
ClassSetOperand
&&
ClassSetOperand
最初の ClassSetOperand の MayContainStrings が false である場合、false を返す。 2番目の ClassSetOperand の MayContainStrings が false である場合、false を返す。 true を返す。
ClassIntersection ::
ClassIntersection
&&
ClassSetOperand
ClassIntersection の MayContainStrings が false である場合、false を返す。ClassSetOperand の MayContainStrings が false である場合、false を返す。true を返す。
ClassSubtraction ::
ClassSetOperand
--
ClassSetOperand
最初の ClassSetOperand の MayContainStrings を返す。
ClassSubtraction ::
ClassSubtraction
--
ClassSetOperand
ClassSubtraction の MayContainStrings を返す。
ClassStringDisjunctionContents ::
ClassString
|
ClassStringDisjunctionContents
ClassString の MayContainStrings が true である場合、true を返す。ClassStringDisjunctionContents の MayContainStrings を返す。
ClassString :: [empty]
true を返す。
ClassString :: NonEmptyClassString
NonEmptyClassString の MayContainStrings を返す。
NonEmptyClassString ::
ClassSetCharacter
NonEmptyClassString opt
NonEmptyClassString が存在する場合、true を返す。false を返す。
22.2.1.9 Static Semantics: GroupSpecifiersThatMatch ( thisGroupName )
抽象操作 GroupSpecifiersThatMatch。引数 thisGroupName (a GroupName Parse Node )。戻り値:リスト (要素:GroupSpecifier Parse Nodes )。 呼び出されると、次の手順を実行する。
name を thisGroupName の CapturingGroupName とする。pattern を thisGroupName を含む Pattern とする。result を新しい空の List とする。pattern が含む各 GroupSpecifier groupSpecifier について、次を行う。groupSpecifier の CapturingGroupName が name である場合、groupSpecifier を result に追加する。result を返す。
22.2.1.10 Static Semantics: CapturingGroupName
構文指向操作 CapturingGroupName。引数なし。戻り値:String。 次の生成規則ごとに定義される。
GroupName ::
<
RegExpIdentifierName
>
nameUnescaped を RegExpIdentifierName の RegExpIdentifierCodePoints とする。CodePointsToString (nameUnescaped ) を返す。
22.2.1.11 Static Semantics: RegExpIdentifierCodePoints
構文指向操作 RegExpIdentifierCodePoints。引数なし。戻り値:リスト (要素:コードポイント)。 次の生成規則ごとに定義される。
RegExpIdentifierName :: RegExpIdentifierStart
codePoint を RegExpIdentifierStart の RegExpIdentifierCodePoint とする。« codePoint » を返す。
RegExpIdentifierName ::
RegExpIdentifierName
RegExpIdentifierPart
codePoints を派生した RegExpIdentifierName の RegExpIdentifierCodePoints とする。codePoint を RegExpIdentifierPart の RegExpIdentifierCodePoint とする。codePoints と « codePoint » のリスト連結 を返す。
22.2.1.12 Static Semantics: RegExpIdentifierCodePoint
構文指向操作 RegExpIdentifierCodePoint。引数なし。戻り値:コードポイント。 次の生成規則ごとに定義される。
RegExpIdentifierStart :: IdentifierStartChar
IdentifierStartChar に一致したコードポイントを返す。
RegExpIdentifierPart :: IdentifierPartChar
IdentifierPartChar に一致したコードポイントを返す。
RegExpIdentifierStart ::
\
RegExpUnicodeEscapeSequence
RegExpIdentifierPart ::
\
RegExpUnicodeEscapeSequence
数値が RegExpUnicodeEscapeSequence の CharacterValue であるコードポイントを返す。
RegExpIdentifierStart ::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart ::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
lead を、数値が UnicodeLeadSurrogate に一致したコードポイントの数値であるコード単位とする。trail を、数値が UnicodeTrailSurrogate に一致したコードポイントの数値であるコード単位とする。UTF16SurrogatePairToCodePoint (lead , trail ) を返す。
22.2.2 パターンの意味論
正規表現パターンは、以下で説明する処理を使用して Abstract Closure に変換されます。結果が同じである限り、実装には以下に列挙されたものより効率的なアルゴリズムを使用することが推奨されます。Abstract Closure は RegExp オブジェクトの [[RegExpMatcher]] 内部スロットの値として使用されます。
Pattern は、その関連フラグが u も v も含まない場合、BMP pattern です。それ以外の場合は Unicode pattern です。BMP pattern は、基本多言語面の範囲内にある Unicode コードポイントである16ビット値の列からなるものとして解釈された String に対してマッチします。Unicode pattern は、UTF-16 を使用してエンコードされた Unicode コードポイントからなるものとして解釈された String に対してマッチします。BMP pattern の動作を説明する文脈では、「文字」は単一の16ビット Unicode BMP コードポイントを意味します。Unicode pattern の動作を説明する文脈では、「文字」は UTF-16 エンコードされたコードポイント(6.1.4 )を意味します。どちらの文脈でも、「文字値」は対応する未エンコードのコードポイントの数値を意味します。
Pattern の構文と意味論は、Pattern のソーステキストが SourceCharacter 値の List であり、各 SourceCharacter が Unicode コードポイントに対応するものとして定義されます。BMP pattern が非 BMP の SourceCharacter を含む場合、パターン全体が UTF-16 を使用してエンコードされ、そのエンコーディングの個々のコード単位が List の要素として使用されます。
注
たとえば、ソーステキスト内で単一の非 BMP 文字 U+1D11E (MUSICAL SYMBOL G CLEF) として表された pattern を考えます。Unicode pattern として解釈した場合、これは単一のコードポイント U+1D11E からなる1要素(文字)の List になります。ただし、BMP pattern として解釈した場合、まず UTF-16 エンコードされ、コード単位 0xD834 と 0xDD1E からなる2要素の List が生成されます。
Pattern は、非 BMP 文字が UTF-16 エンコードされている ECMAScript String 値として RegExp コンストラクター に渡されます。たとえば、単一文字 MUSICAL SYMBOL G CLEF の pattern は、String 値として表現されると、要素がコード単位 0xD834 と 0xDD1E である長さ2の String です。したがって、2つの pattern 文字からなる BMP pattern として処理するために String をさらに変換する必要はありません。ただし、Unicode pattern として処理するには、唯一の要素が単一の pattern 文字、すなわちコードポイント U+1D11E である List を生成する際に UTF16SurrogatePairToCodePoint を使用しなければなりません。
実装は実際には UTF-16 への、または UTF-16 からのこのような変換を実行しなくてもかまいませんが、この仕様の意味論は、pattern matching の結果がそのような変換が実行されたかのようになることを要求します。
22.2.2.1 表記法
以下の説明では、次の内部データ構造を使用します。
22.2.2.1.1 RegExp Record
RegExp Record は、コンパイル中、および場合によってはマッチング中に必要となる RegExp に関する情報を保存するために使用される Record です。
次のフィールドを持ちます。
表 64: RegExp Record のフィールド
フィールド名
値
意味
[[IgnoreCase]]
a Boolean
RegExp の flags に "i" が現れるかどうかを示します
[[Multiline]]
a Boolean
RegExp の flags に "m" が現れるかどうかを示します
[[DotAll]]
a Boolean
RegExp の flags に "s" が現れるかどうかを示します
[[Unicode]]
a Boolean
RegExp の flags に "u" が現れるかどうかを示します
[[UnicodeSets]]
a Boolean
RegExp の flags に "v" が現れるかどうかを示します
[[CapturingGroupsCount]]
a non-negative integer
RegExp の pattern 内の左キャプチャ括弧 の数
22.2.2.2 Runtime Semantics: CompilePattern
構文指向操作 CompilePattern。引数 regexpRecord (RegExpレコード )。戻り値:an Abstract Closure that takes a List of characters and a non-negative integer and returns either a MatchState or failure 。 次の生成規則ごとに定義される。
Pattern :: Disjunction
m を、引数 regexpRecord および forward を指定した Disjunction の CompileSubpattern とする。regexpRecord と m を捕捉し、パラメーター (input , index ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure を返す。表明 : input は文字の List である。表明 : 0 ≤ index ≤ input の要素数。c を、何も捕捉せず、パラメーター (y ) を持ち、呼び出されたときに次の手順を実行する新しい MatcherContinuation とする。表明 : y は MatchState である。y を返す。capability を、1 から regexpRecord .[[CapturingGroupsCount]] までのインデックスを持つ、regexpRecord .[[CapturingGroupsCount]] 個の undefined 値からなる List とする。x を MatchState { [[Input]] : input , [[EndIndex]] : index , [[Captures]] : capability } とする。m (x , c ) を返す。
注
Pattern は Abstract Closure 値にコンパイルされます。RegExpBuiltinExec は、この手続きを文字の List とその List 内のオフセットに適用して、パターンがその List 内の正確にそのオフセットから始まって一致するかどうか、および一致する場合にキャプチャ括弧の値がどうなるかを判定できます。22.2.2 のアルゴリズムは、パターンのコンパイルが SyntaxError 例外をスローする可能性があるように設計されています。一方、パターンが正常にコンパイルされた後、得られた Abstract Closure を適用して文字の List 内の一致を検索することは例外をスローできません(メモリ不足など、どこでも発生し得る実装定義 の例外を除く)。
22.2.2.3 Runtime Semantics: CompileSubpattern
構文指向操作 CompileSubpattern。引数 regexpRecord (RegExpレコード ) および direction ((forward または backward ))。戻り値:Matcher 。
注 1
次の生成規則ごとに定義される。
Disjunction ::
Alternative
|
Disjunction
m1 を、引数 regexpRecord および direction を指定した Alternative の CompileSubpattern とする。m2 を、引数 regexpRecord および direction を指定した Disjunction の CompileSubpattern とする。MatchTwoAlternatives (m1 , m2 ) を返す。
注 2
| 正規表現演算子は2つの選択肢を分離します。パターンはまず左の Alternative (その後に正規表現の後続部分が続く)をマッチさせようとします。失敗した場合、右の Disjunction (その後に正規表現の後続部分が続く)をマッチさせようとします。左の Alternative 、右の Disjunction 、および後続部分のすべてに選択点がある場合、左の Alternative の次の選択肢へ進む前に、後続部分内のすべての選択肢が試されます。左の Alternative 内の選択肢を使い果たした場合、左の Alternative の代わりに右の Disjunction が試されます。| によってスキップされたパターン部分内のキャプチャ括弧は、String の代わりに undefined 値を生成します。したがって、たとえば、
/a|ab/.exec ("abc" )
は "ab" ではなく "a" という結果を返します。さらに、
/((a)|(ab))((c)|(bc))/.exec ("abc" )
は次の配列を返します。
["abc" , "a" , "a" , undefined , "bc" , undefined , "bc" ]
次の配列ではありません。
["abc" , "ab" , undefined , "ab" , "c" , "c" , undefined ]
2つの選択肢が試される順序は direction の値に依存しません。
Alternative :: [empty]
EmptyMatcher () を返す。
Alternative ::
Alternative
Term
m1 を、引数 regexpRecord および direction を指定した Alternative の CompileSubpattern とする。m2 を、引数 regexpRecord および direction を指定した Term の CompileSubpattern とする。MatchSequence (m1 , m2 , direction ) を返す。
注 3
連続する Term は input の連続する部分を同時にマッチさせようとします。direction が forward であり、左の Alternative 、右の Term 、および正規表現の後続部分のすべてに選択点がある場合、右の Term の次の選択肢へ進む前に後続部分内のすべての選択肢が試され、左の Alternative の次の選択肢へ進む前に右の Term 内のすべての選択肢が試されます。direction が backward である場合、Alternative と Term の評価順序は逆になります。
Term :: Assertion
引数 regexpRecord を指定した Assertion の CompileAssertion を返す。
注 4
得られる Matcher は direction に依存しません。
Term :: Atom
引数 regexpRecord および direction を指定した Atom の CompileAtom を返す。
Term ::
Atom
Quantifier
m を、引数 regexpRecord および direction を指定した Atom の CompileAtom とする。q を Quantifier の CompileQuantifier とする。表明 : q .[[Min]] ≤ q .[[Max]] 。parenIndex を CountLeftCapturingParensBefore (Term ) とする。parenCount を CountLeftCapturingParensWithin (Atom ) とする。m 、q 、parenIndex 、および parenCount を捕捉し、パラメーター (x , c ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : x は MatchState である。表明 : c は MatcherContinuation である。RepeatMatcher (m , q .[[Min]] , q .[[Max]] , q .[[Greedy]] , x , c , parenIndex , parenCount ) を返す。
22.2.2.3.1 RepeatMatcher ( m , min , max , greedy , matchState , continue , parenIndex , parenCount )
抽象操作 RepeatMatcher。引数 m (Matcher )、min (非負整数)、max ((非負整数 または +∞))、greedy (Boolean)、matchState (MatchState )、continue (MatcherContinuation )、parenIndex (非負整数) および parenCount (非負整数)。戻り値:(MatchState または failure )。 呼び出されると、次の手順を実行する。
max = 0 である場合、continue (matchState ) を返す。d を、m 、min 、max 、greedy 、matchState 、continue 、parenIndex 、および parenCount を捕捉し、パラメーター (y ) を持ち、呼び出されたときに次の手順を実行する新しい MatcherContinuation とする。表明 : y は MatchState である。min = 0 かつ y .[[EndIndex]] = matchState .[[EndIndex]] である場合、failure を返す。min = 0 である場合、min2 を 0 とする。そうでない場合、min2 を min - 1 とする。max = +∞ である場合、max2 を +∞ とする。そうでない場合、max2 を max - 1 とする。RepeatMatcher (m , min2 , max2 , greedy , y , continue , parenIndex , parenCount ) を返す。capability を matchState .[[Captures]] のコピーとする。parenIndex + 1 から parenIndex + parenCount までの閉区間 内の各整数 k について、capability [k ] を undefined に設定する。input を matchState .[[Input]] とする。e を matchState .[[EndIndex]] とする。xr を MatchState { [[Input]] : input , [[EndIndex]] : e , [[Captures]] : capability } とする。min ≠ 0 である場合、m (xr , d ) を返す。greedy が false である場合、z を continue (matchState ) とする。z が failure でない場合、z を返す。m (xr , d ) を返す。z を m (xr , d ) とする。z が failure でない場合、z を返す。continue (matchState ) を返す。
注 1
Atom の後に Quantifier が続く場合、Atom は Quantifier によって指定された回数だけ繰り返されます。Quantifier は非貪欲である場合があり、その場合 Atom pattern は後続部分に依然として一致しながら可能な限り少ない回数繰り返されます。または貪欲である場合があり、その場合 Atom pattern は後続部分に依然として一致しながら可能な限り多い回数繰り返されます。一致する入力文字列ではなく Atom pattern 自体が繰り返されるため、Atom の異なる繰返しは異なる入力部分文字列 に一致できます。
注 2
Atom と正規表現の後続部分のすべてに選択点がある場合、まず Atom が可能な限り多い(非貪欲の場合は可能な限り少ない)回数マッチされます。後続部分内のすべての選択肢は、Atom の最後の繰返しの次の選択肢へ進む前に試されます。Atom の最後(nth )の繰返し内のすべての選択肢は、Atom の最後から2番目(n - 1)st の繰返し内の次の選択肢へ進む前に試されます。その時点で、Atom のより多い、または少ない繰返しが可能になっていることが判明する場合があります。これらは、(再び、可能な限り少ないか多い回数から開始して)(n - 1)st の Atom の繰返し内の次の選択肢へ進む前に使い果たされ、以下同様です。
次を比較してください。
/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つの数(単項表記で表される)の最大公約数を計算する正規表現を書くために使用できます。次の例は 10 と 15 の gcd を計算します。
"aaaaaaaaaa,aaaaaaaaaaaaaaa" .replace (/^(a+)\1*,\1+$/ , "$1" )
これは単項表記の gcd "aaaaa" を返します。
注 3
RepeatMatcher の手順 4 は、Atom が繰り返されるたびに Atom の capture をクリアします。その動作は正規表現
/(z)((a+)?(b+)?(c))*/.exec ("zaacbbbcac" )
で確認でき、これは次の配列を返します。
["zaacbbbcac" , "z" , "ac" , "a" , undefined , "c" ]
次ではありません。
["zaacbbbcac" , "z" , "ac" , "a" , "bbb" , "c" ]
これは、最外側の * の各反復が、量指定された Atom に含まれるすべてのキャプチャ String をクリアするためです。この場合、番号 2、3、4、および5のキャプチャ String が含まれます。
注 4
RepeatMatcher の手順 2.b は、最小繰返し回数が満たされると、空の文字列に一致する Atom のそれ以上の展開は、さらなる繰返しについて考慮されないと規定しています。これにより、正規表現エンジンが次のような pattern で無限ループに陥ることを防ぎます。
/(a*)*/.exec ("b" )
または、やや複雑な次の例:
/(a*)b\1 +/.exec ("baaaac" )
これは次の配列を返します。
["b" , "" ]
22.2.2.3.2 EmptyMatcher ( )
抽象操作 EmptyMatcher。引数なし。戻り値:Matcher 。 呼び出されると、次の手順を実行する。
何も捕捉せず、パラメーター (matchState , continue ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : matchState は MatchState である。表明 : continue は MatcherContinuation である。continue (matchState ) を返す。
22.2.2.3.3 MatchTwoAlternatives ( m1 , m2 )
抽象操作 MatchTwoAlternatives。引数 m1 (Matcher ) および m2 (Matcher )。戻り値:Matcher 。 呼び出されると、次の手順を実行する。
m1 と m2 を捕捉し、パラメーター (matchState , continue ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : matchState は MatchState である。表明 : continue は MatcherContinuation である。result を m1 (matchState , continue ) とする。result が failure でない場合、result を返す。m2 (matchState , continue ) を返す。
22.2.2.3.4 MatchSequence ( m1 , m2 , direction )
抽象操作 MatchSequence。引数 m1 (Matcher )、m2 (Matcher ) および direction ((forward または backward ))。戻り値:Matcher 。 呼び出されると、次の手順を実行する。
direction が forward である場合、m1 と m2 を捕捉し、パラメーター (matchState , continue ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : matchState は MatchState である。表明 : continue は MatcherContinuation である。d を、continue と m2 を捕捉し、パラメーター (y ) を持ち、呼び出されたときに次の手順を実行する新しい MatcherContinuation とする。表明 : y は MatchState である。m2 (y , continue ) を返す。m1 (matchState , d ) を返す。表明 : direction は backward である。m1 と m2 を捕捉し、パラメーター (matchState , continue ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : matchState は MatchState である。表明 : continue は MatcherContinuation である。d を、continue と m1 を捕捉し、パラメーター (y ) を持ち、呼び出されたときに次の手順を実行する新しい MatcherContinuation とする。表明 : y は MatchState である。m1 (y , continue ) を返す。m2 (matchState , d ) を返す。
22.2.2.4 Runtime Semantics: CompileAssertion
構文指向操作 CompileAssertion。引数 regexpRecord (RegExpレコード )。戻り値:Matcher 。
注 1
次の生成規則ごとに定義される。
Assertion :: ^
regexpRecord を捕捉し、パラメーター (matchState , continue ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : matchState は MatchState である。表明 : continue は MatcherContinuation である。input を matchState .[[Input]] とする。e を matchState .[[EndIndex]] とする。e = 0 であるか、regexpRecord .[[Multiline]] が true であり文字 input [e - 1] が LineTerminator に一致する場合、continue (matchState ) を返す。failure を返す。
注 2
pattern とともに y フラグが使用される場合でも、^ は常に input の先頭、または(regexpRecord .[[Multiline]] が true の場合)行の先頭でのみ一致します。
Assertion :: $
regexpRecord を捕捉し、パラメーター (matchState , continue ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : matchState は MatchState である。表明 : continue は MatcherContinuation である。input を matchState .[[Input]] とする。e を matchState .[[EndIndex]] とする。inputLength を input の要素数とする。e = inputLength であるか、regexpRecord .[[Multiline]] が true であり文字 input [e ] が LineTerminator に一致する場合、continue (matchState ) を返す。failure を返す。
Assertion :: \b
regexpRecord を捕捉し、パラメーター (matchState , continue ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : matchState は MatchState である。表明 : continue は MatcherContinuation である。input を matchState .[[Input]] とする。e を matchState .[[EndIndex]] とする。a を IsWordChar (regexpRecord , input , e - 1) とする。b を IsWordChar (regexpRecord , input , e ) とする。a が true かつ b が false であるか、a が false かつ b が true である場合、continue (matchState ) を返す。failure を返す。
Assertion :: \B
regexpRecord を捕捉し、パラメーター (matchState , continue ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : matchState は MatchState である。表明 : continue は MatcherContinuation である。input を matchState .[[Input]] とする。e を matchState .[[EndIndex]] とする。a を IsWordChar (regexpRecord , input , e - 1) とする。b を IsWordChar (regexpRecord , input , e ) とする。a が true かつ b が true であるか、a が false かつ b が false である場合、continue (matchState ) を返す。failure を返す。
Assertion ::
(?=
Disjunction
)
m を、引数 regexpRecord および forward を指定した Disjunction の CompileSubpattern とする。m を捕捉し、パラメーター (matchState , continue ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : matchState は MatchState である。表明 : continue は MatcherContinuation である。d を、何も捕捉せず、パラメーター (y ) を持ち、呼び出されたときに次の手順を実行する新しい MatcherContinuation とする。表明 : y は MatchState である。y を返す。result を m (matchState , d ) とする。result が failure である場合、failure を返す。表明 : result は MatchState である。capability を result .[[Captures]] とする。input を matchState .[[Input]] とする。xe を matchState .[[EndIndex]] とする。z を MatchState { [[Input]] : input , [[EndIndex]] : xe , [[Captures]] : capability } とする。continue (z ) を返す。
注 3
(?= Disjunction ) という形式はゼロ幅の肯定先読みを指定します。成功するためには、Disjunction 内の pattern が現在位置で一致しなければなりませんが、後続部分を一致させる前に現在位置は進みません。Disjunction が現在位置で複数の方法で一致できる場合、最初のものだけが試されます。他の正規表現演算子とは異なり、(?= 形式の内部へバックトラッキングすることはありません(この特殊な動作は Perl から継承されています)。これは、Disjunction がキャプチャ括弧を含み、pattern の後続部分がそれらの capture への後方参照を含む場合にだけ重要です。
たとえば、
/(?=(a+))/.exec ("baaabac" )
は最初の b の直後の空の String に一致するため、次の配列を返します。
["" , "aaa" ]
先読み内へのバックトラッキングがないことを示すために、次を考えます。
/(?=(a+))a*b\1 /.exec ("baaabac" )
この式は
["aba" , "a" ]
を返し、次ではありません。
["aaaba" , "a" ]
Assertion ::
(?!
Disjunction
)
m を、引数 regexpRecord および forward を指定した Disjunction の CompileSubpattern とする。m を捕捉し、パラメーター (matchState , continue ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : matchState は MatchState である。表明 : continue は MatcherContinuation である。d を、何も捕捉せず、パラメーター (y ) を持ち、呼び出されたときに次の手順を実行する新しい MatcherContinuation とする。表明 : y は MatchState である。y を返す。result を m (matchState , d ) とする。result が failure でない場合、failure を返す。continue (matchState ) を返す。
注 4
(?! Disjunction ) という形式はゼロ幅の否定先読みを指定します。成功するためには、Disjunction 内の pattern が現在位置で一致に失敗しなければなりません。後続部分を一致させる前に現在位置は進みません。Disjunction はキャプチャ括弧を含むことができますが、それらへの後方参照は Disjunction 自身の内部からだけ意味を持ちます。pattern の他の場所からこれらのキャプチャ括弧への後方参照は常に undefined を返します。これは、pattern が成功するには否定先読みが失敗しなければならないためです。たとえば、
/(.*?)a (?!(a+)b\2c)\2 (.*)/.exec ("baaabaac" )
は、直後に正の数 n 個の a、b、さらに n 個の a(最初の \2 で指定)、および c が続かない a を探します。2番目の \2 は否定先読みの外側にあるため、undefined に対して一致し、したがって常に成功します。式全体は次の配列を返します。
["baaabaac" , "ba" , undefined , "abaac" ]
Assertion ::
(?<=
Disjunction
)
m を、引数 regexpRecord および backward を指定した Disjunction の CompileSubpattern とする。m を捕捉し、パラメーター (matchState , continue ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : matchState は MatchState である。表明 : continue は MatcherContinuation である。d を、何も捕捉せず、パラメーター (y ) を持ち、呼び出されたときに次の手順を実行する新しい MatcherContinuation とする。表明 : y は MatchState である。y を返す。result を m (matchState , d ) とする。result が failure である場合、failure を返す。表明 : result は MatchState である。capability を result .[[Captures]] とする。input を matchState .[[Input]] とする。xe を matchState .[[EndIndex]] とする。z を MatchState { [[Input]] : input , [[EndIndex]] : xe , [[Captures]] : capability } とする。continue (z ) を返す。
Assertion ::
(?<!
Disjunction
)
m を、引数 regexpRecord および backward を指定した Disjunction の CompileSubpattern とする。m を捕捉し、パラメーター (matchState , continue ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : matchState は MatchState である。表明 : continue は MatcherContinuation である。d を、何も捕捉せず、パラメーター (y ) を持ち、呼び出されたときに次の手順を実行する新しい MatcherContinuation とする。表明 : y は MatchState である。y を返す。result を m (matchState , d ) とする。result が failure でない場合、failure を返す。continue (matchState ) を返す。
22.2.2.4.1 IsWordChar ( regexpRecord , input , e )
抽象操作 IsWordChar。引数 regexpRecord (RegExpレコード )、input (リスト (要素:文字)) および e (整数 )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
inputLength を input の要素数とする。e = -1 または e = inputLength である場合、false を返す。char を文字 input [e ] とする。WordCharacters (regexpRecord ) が char を含む場合、true を返す。false を返す。
22.2.2.5 Runtime Semantics: CompileQuantifier
構文指向操作 CompileQuantifier。引数なし。戻り値:レコード (フィールド:[[Min]] (非負整数), [[Max]] ((非負整数 または +∞)), [[Greedy]] (Boolean))。 次の生成規則ごとに定義される。
Quantifier :: QuantifierPrefix
qp を QuantifierPrefix の CompileQuantifierPrefix とする。Record { [[Min]] : qp .[[Min]] , [[Max]] : qp .[[Max]] , [[Greedy]] : true } を返す。
Quantifier ::
QuantifierPrefix
?
qp を QuantifierPrefix の CompileQuantifierPrefix とする。Record { [[Min]] : qp .[[Min]] , [[Max]] : qp .[[Max]] , [[Greedy]] : false } を返す。
22.2.2.6 Runtime Semantics: CompileQuantifierPrefix
構文指向操作 CompileQuantifierPrefix。引数なし。戻り値:レコード (フィールド:[[Min]] (非負整数), [[Max]] ((非負整数 または +∞)))。 次の生成規則ごとに定義される。
QuantifierPrefix :: *
Record { [[Min]] : 0, [[Max]] : +∞ } を返す。
QuantifierPrefix :: +
Record { [[Min]] : 1, [[Max]] : +∞ } を返す。
QuantifierPrefix :: ?
Record { [[Min]] : 0, [[Max]] : 1 } を返す。
QuantifierPrefix ::
{
DecimalDigits
}
i を DecimalDigits の MV とする(12.9.3 を参照)。Record { [[Min]] : i , [[Max]] : i } を返す。
QuantifierPrefix ::
{
DecimalDigits
,}
i を DecimalDigits の MV とする。Record { [[Min]] : i , [[Max]] : +∞ } を返す。
QuantifierPrefix ::
{
DecimalDigits
,
DecimalDigits
}
i を最初の DecimalDigits の MV とする。j を2番目の DecimalDigits の MV とする。Record { [[Min]] : i , [[Max]] : j } を返す。
22.2.2.7 Runtime Semantics: CompileAtom
構文指向操作 CompileAtom。引数 regexpRecord (RegExpレコード ) および direction ((forward または backward ))。戻り値:Matcher 。
注 1
次の生成規則ごとに定義される。
Atom :: PatternCharacter
char を PatternCharacter に一致した文字とする。charSet を文字 char を含む1要素の CharSet とする。CharacterSetMatcher (regexpRecord , charSet , false , direction ) を返す。
Atom :: .
charSet を AllCharacters (regexpRecord ) とする。regexpRecord .[[DotAll]] が true でない場合、LineTerminator 生成規則の右辺にあるコードポイントに対応するすべての文字を charSet から削除する。CharacterSetMatcher (regexpRecord , charSet , false , direction ) を返す。
Atom :: CharacterClass
cc を、引数 regexpRecord を指定した CharacterClass の CompileCharacterClass とする。cs を cc .[[CharSet]] とする。regexpRecord .[[UnicodeSets]] が false であるか、cs のすべての CharSetElement が単一の文字からなる場合(cs が空の場合を含む)、CharacterSetMatcher (regexpRecord , cs , cc .[[Invert]] , direction ) を返す。表明 : cc .[[Invert]] は false である。listOfMatchers を Matchers の空の List とする。csSequences を新しい空の List とする。cs の各 CharSetElement s について、次を行う。s の長さ > 1 である場合、s を csSequences に追加する。csSequences を、各 CharSetElement の長さに従って降順に並べ替える。csSequences の各 CharSetElement s について、次を行う。表明 : s は2個以上のコードポイントの列である。remaining を s のコードポイントからなる List とする。cs2 を remaining の最後の要素を含む1要素の CharSet とする。m2 を CharacterSetMatcher (regexpRecord , cs2 , false , direction ) とする。remaining の最後の要素を削除する。remaining の各コードポイント c1 について、List の逆順で次を行う。cs1 を c1 を含む1要素の CharSet とする。m1 を CharacterSetMatcher (regexpRecord , cs1 , false , direction ) とする。m2 を MatchSequence (m1 , m2 , direction ) に設定する。m2 を listOfMatchers に追加する。singles を、単一の文字からなる cs のすべての CharSetElement を含む CharSet とする。CharacterSetMatcher (regexpRecord , singles , false , direction ) を listOfMatchers に追加する。cs が空の文字列を含む場合、EmptyMatcher () を listOfMatchers に追加する。m2 を listOfMatchers 内の最後の Matcher とする。listOfMatchers の各 Matcher m1 について、最後から2番目の要素から逆方向に反復して次を行う。m2 を MatchTwoAlternatives (m1 , m2 ) に設定する。m2 を返す。
Atom ::
(
GroupSpecifier opt
Disjunction
)
m を、引数 regexpRecord および direction を指定した Disjunction の CompileSubpattern とする。parenIndex を CountLeftCapturingParensBefore (Atom ) とする。direction 、m 、および parenIndex を捕捉し、パラメーター (x , c ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : x は MatchState である。表明 : c は MatcherContinuation である。d を、x 、c 、direction 、および parenIndex を捕捉し、パラメーター (y ) を持ち、呼び出されたときに次の手順を実行する新しい MatcherContinuation とする。表明 : y は MatchState である。capability を y .[[Captures]] のコピーとする。input を x .[[Input]] とする。xe を x .[[EndIndex]] とする。ye を y .[[EndIndex]] とする。direction が forward である場合、表明 : xe ≤ ye 。r を CaptureRange { [[StartIndex]] : xe , [[EndIndex]] : ye } とする。そうでない場合、表明 : direction は backward である。表明 : ye ≤ xe 。r を CaptureRange { [[StartIndex]] : ye , [[EndIndex]] : xe } とする。 capability [parenIndex + 1] を r に設定する。z を MatchState { [[Input]] : input , [[EndIndex]] : ye , [[Captures]] : capability } とする。c (z ) を返す。m (x , d ) を返す。
注 2
( Disjunction ) 形式の括弧は、Disjunction pattern の構成要素をまとめることと、マッチ結果を保存することの両方に使用されます。結果は、後方参照(\ にゼロでない10進数が続くもの)、replace String 内での参照、または正規表現マッチング Abstract Closure から配列の一部として返される形のいずれかで使用できます。括弧のキャプチャ動作を抑止するには、代わりに (?: Disjunction ) 形式を使用します。
Atom ::
(?
RegularExpressionModifiers
:
Disjunction
)
addModifiers を RegularExpressionModifiers に一致したソーステキストとする。removeModifiers を空の String とする。modifiedRer を UpdateModifiers (regexpRecord , CodePointsToString (addModifiers ), removeModifiers ) とする。引数 modifiedRer および direction を指定した Disjunction の CompileSubpattern を返す。
Atom ::
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction
)
addModifiers を最初の RegularExpressionModifiers に一致したソーステキストとする。removeModifiers を2番目の RegularExpressionModifiers に一致したソーステキストとする。modifiedRer を UpdateModifiers (regexpRecord , CodePointsToString (addModifiers ), CodePointsToString (removeModifiers )) とする。引数 modifiedRer および direction を指定した Disjunction の CompileSubpattern を返す。
AtomEscape :: DecimalEscape
n を DecimalEscape の CapturingGroupNumber とする。表明 : n ≤ regexpRecord .[[CapturingGroupsCount]] 。BackreferenceMatcher (regexpRecord , « n », direction ) を返す。
注 3
\ の後にゼロでない10進数 n が続く形式のエスケープシーケンスは、n th のキャプチャ括弧集合(22.2.2.1 )の結果に一致します。正規表現が n 個未満のキャプチャ括弧しか持たない場合はエラーです。正規表現が n 個以上のキャプチャ括弧を持つものの、n th のものが何もキャプチャしていないため undefined である場合、後方参照は常に成功します。
AtomEscape :: CharacterEscape
charValue を CharacterEscape の CharacterValue とする。char を文字値が charValue である文字とする。charSet を文字 char を含む1要素の CharSet とする。CharacterSetMatcher (regexpRecord , charSet , false , direction ) を返す。
AtomEscape :: CharacterClassEscape
cs を、引数 regexpRecord を指定した CharacterClassEscape の CompileToCharSet とする。regexpRecord .[[UnicodeSets]] が false であるか、cs のすべての CharSetElement が単一の文字からなる場合(cs が空の場合を含む)、CharacterSetMatcher (regexpRecord , cs , false , direction ) を返す。listOfMatchers を Matchers の空の List とする。csSequences を新しい空の List とする。cs の各 CharSetElement s について、次を行う。s の長さ > 1 である場合、s を csSequences に追加する。csSequences を、各 CharSetElement の長さに従って降順に並べ替える。csSequences の各 CharSetElement s について、次を行う。表明 : s は2個以上のコードポイントの列である。remaining を s のコードポイントからなる List とする。cs2 を remaining の最後の要素を含む1要素の CharSet とする。m2 を CharacterSetMatcher (regexpRecord , cs2 , false , direction ) とする。remaining の最後の要素を削除する。remaining の各コードポイント c1 について、List の逆順で次を行う。cs1 を c1 を含む1要素の CharSet とする。m1 を CharacterSetMatcher (regexpRecord , cs1 , false , direction ) とする。m2 を MatchSequence (m1 , m2 , direction ) に設定する。m2 を listOfMatchers に追加する。singles を、単一の文字からなる cs のすべての CharSetElement を含む CharSet とする。CharacterSetMatcher (regexpRecord , singles , false , direction ) を listOfMatchers に追加する。cs が空の文字列を含む場合、EmptyMatcher () を listOfMatchers に追加する。m2 を listOfMatchers 内の最後の Matcher とする。listOfMatchers の各 Matcher m1 について、最後から2番目の要素から逆方向に反復して次を行う。m2 を MatchTwoAlternatives (m1 , m2 ) に設定する。m2 を返す。
AtomEscape ::
k
GroupName
matchingGroupSpecifiers を GroupSpecifiersThatMatch (GroupName ) とする。parenIndices を新しい空の List とする。matchingGroupSpecifiers の各 GroupSpecifier groupSpecifier について、次を行う。parenIndex を CountLeftCapturingParensBefore (groupSpecifier ) とする。parenIndex を parenIndices に追加する。BackreferenceMatcher (regexpRecord , parenIndices , direction ) を返す。
22.2.2.7.1 CharacterSetMatcher ( regexpRecord , charSet , invert , direction )
抽象操作 CharacterSetMatcher。引数 regexpRecord (RegExpレコード )、charSet (CharSet )、invert (Boolean) および direction ((forward または backward ))。戻り値:Matcher 。 呼び出されると、次の手順を実行する。
regexpRecord .[[UnicodeSets]] が true である場合、表明 : invert は false である。表明 : charSet のすべての CharSetElement は単一の文字からなる。regexpRecord 、charSet 、invert 、および direction を捕捉し、パラメーター (x , c ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : x は MatchState である。表明 : c は MatcherContinuation である。input を x .[[Input]] とする。endIndex を x .[[EndIndex]] とする。direction が forward である場合、f を endIndex + 1 とする。そうでない場合、f を endIndex - 1 とする。 inputLength を input の要素数とする。f < 0 または f > inputLength である場合、failure を返す。index を min (endIndex , f ) とする。char を文字 input [index ] とする。cc を Canonicalize (regexpRecord , char ) とする。Canonicalize (regexpRecord , a ) が cc であるような、正確に1文字 a を含む CharSetElement が charSet 内に存在する場合、found を true とする。そうでない場合、found を false とする。invert が false かつ found が false である場合、failure を返す。invert が true かつ found が true である場合、failure を返す。capability を x .[[Captures]] とする。y を MatchState { [[Input]] : input , [[EndIndex]] : f , [[Captures]] : capability } とする。c (y ) を返す。
22.2.2.7.2 BackreferenceMatcher ( regexpRecord , ns , direction )
抽象操作 BackreferenceMatcher。引数 regexpRecord (RegExpレコード )、ns (リスト (要素:正の整数 )) および direction ((forward または backward ))。戻り値:Matcher 。 呼び出されると、次の手順を実行する。
regexpRecord 、ns 、および direction を捕捉し、パラメーター (x , c ) を持ち、呼び出されたときに次の手順を実行する新しい Matcher を返す。表明 : x は MatchState である。表明 : c は MatcherContinuation である。input を x .[[Input]] とする。capability を x .[[Captures]] とする。r を undefined とする。ns の各整数 n について、次を行う。capability [n ] が undefined でない場合、表明 : r は undefined である。r を capability [n ] に設定する。r が undefined である場合、c (x ) を返す。endIndex を x .[[EndIndex]] とする。rs を r .[[StartIndex]] とする。re を r .[[EndIndex]] とする。length を re - rs とする。direction が forward である場合、f を endIndex + length とする。そうでない場合、f を endIndex - length とする。 inputLength を input の要素数とする。f < 0 または f > inputLength である場合、failure を返す。g を min (endIndex , f ) とする。0(含む)から length (含まない)までの区間 内に、Canonicalize (regexpRecord , input [rs + i ]) が Canonicalize (regexpRecord , input [g + i ]) でない整数 i が存在する場合、failure を返す。 y を MatchState { [[Input]] : input , [[EndIndex]] : f , [[Captures]] : capability } とする。c (y ) を返す。
22.2.2.7.3 Canonicalize ( regexpRecord , char )
抽象操作 Canonicalize。引数 regexpRecord (RegExpレコード ) および char (文字)。戻り値:文字。 呼び出されると、次の手順を実行する。
HasEitherUnicodeFlag (regexpRecord ) が true であり、regexpRecord .[[IgnoreCase]] が true である場合、Unicode Character Database の CaseFolding.txt ファイルが char に対する simple または common case folding マッピングを提供する場合、そのマッピングを char に適用した結果を返す。 char を返す。regexpRecord .[[IgnoreCase]] が false である場合、char を返す。表明 : char は UTF-16 コード単位である。codePoint を、数値が char の数値であるコードポイントとする。mappedCodePoints を Unicode Default Case Conversion アルゴリズムに従った toUppercase(« codePoint ») とする。CodePointsToString (mappedCodePoints ) の長さ ≠ 1 である場合、char を返す。表明 : mappedCodePoints の要素数は 1 である。mappedCodePoint を mappedCodePoints の唯一のコードポイント要素とする。char の数値 ≥ 128 かつ mappedCodePoint の数値 < 128 である場合、char を返す。数値が mappedCodePoint の数値であるコード単位を返す。
注
HasEitherUnicodeFlag (regexpRecord ) が true である大文字小文字を区別しないマッチでは、すべての文字は比較の直前に Unicode 標準が提供する simple mapping を使用して暗黙に case-fold されます。simple mapping は常に単一のコードポイントへマッピングするため、たとえば ß (U+00DF LATIN SMALL LETTER SHARP S) を ss または SS にはマッピングしません。ただし、基本ラテンブロック外のコードポイントをその内部のコードポイントへマッピングする場合があります。たとえば、ſ (U+017F LATIN SMALL LETTER LONG S) は s (U+0073 LATIN SMALL LETTER S) に case-fold され、K (U+212A KELVIN SIGN) は k (U+006B LATIN SMALL LETTER K) に case-fold されます。これらのコードポイントを含む String は /[a-z]/ui のような正規表現によって一致します。
HasEitherUnicodeFlag (regexpRecord ) が false である大文字小文字を区別しないマッチでは、マッピングは toCasefold ではなく Unicode Default Case Conversion アルゴリズム toUppercase に基づくため、微妙な違いが生じます。たとえば、Ω (U+2126 OHM SIGN) は toUppercase によって自身へマッピングされますが、toCasefold では Ω (U+03A9 GREEK CAPITAL LETTER OMEGA) とともに ω (U+03C9 GREEK SMALL LETTER OMEGA) へマッピングされます。そのため、"\u2126" は /[ω]/ui および /[\u03A9]/ui によって一致しますが、/[ω]/i または /[\u03A9]/i には一致しません。また、基本ラテンブロック外のコードポイントがその内部のコードポイントへマッピングされることはないため、"\u017F ſ" や "\u212A K" のような String は /[a-z]/i によって一致しません。
22.2.2.7.4 UpdateModifiers ( regexpRecord , add , remove )
抽象操作 UpdateModifiers。引数 regexpRecord (RegExpレコード )、add (String) および remove (String)。戻り値:RegExpレコード 。 呼び出されると、次の手順を実行する。
表明 : add と remove に共通の要素はない。ignoreCase を regexpRecord .[[IgnoreCase]] とする。multiline を regexpRecord .[[Multiline]] とする。dotAll を regexpRecord .[[DotAll]] とする。unicode を regexpRecord .[[Unicode]] とする。unicodeSets を regexpRecord .[[UnicodeSets]] とする。capturingGroupsCount を regexpRecord .[[CapturingGroupsCount]] とする。remove が "i" を含む場合、ignoreCase を false に設定する。そうでなく、add が "i" を含む場合、ignoreCase を true に設定する。 remove が "m" を含む場合、multiline を false に設定する。そうでなく、add が "m" を含む場合、multiline を true に設定する。 remove が "s" を含む場合、dotAll を false に設定する。そうでなく、add が "s" を含む場合、dotAll を true に設定する。 RegExp Record { [[IgnoreCase]] : ignoreCase , [[Multiline]] : multiline , [[DotAll]] : dotAll , [[Unicode]] : unicode , [[UnicodeSets]] : unicodeSets , [[CapturingGroupsCount]] : capturingGroupsCount } を返す。
22.2.2.8 Runtime Semantics: CompileCharacterClass
構文指向操作 CompileCharacterClass。引数 regexpRecord (RegExpレコード )。戻り値:レコード (フィールド:[[CharSet]] (CharSet ), [[Invert]] (Boolean))。 次の生成規則ごとに定義される。
CharacterClass ::
[
ClassContents
]
charSet を、引数 regexpRecord を指定した ClassContents の CompileToCharSet とする。Record { [[CharSet]] : charSet , [[Invert]] : false } を返す。
CharacterClass ::
[^
ClassContents
]
charSet を、引数 regexpRecord を指定した ClassContents の CompileToCharSet とする。regexpRecord .[[UnicodeSets]] が true である場合、Record { [[CharSet]] : CharacterComplement (regexpRecord , charSet ), [[Invert]] : false } を返す。Record { [[CharSet]] : charSet , [[Invert]] : true } を返す。
22.2.2.9 Runtime Semantics: CompileToCharSet
構文指向操作 CompileToCharSet。引数 regexpRecord (RegExpレコード )。戻り値:CharSet 。
注 1
次の生成規則ごとに定義される。
ClassContents :: [empty]
空の CharSet を返す。
NonemptyClassRanges ::
ClassAtom
NonemptyClassRangesNoDash
charSet を、引数 regexpRecord を指定した ClassAtom の CompileToCharSet とする。otherSet を、引数 regexpRecord を指定した NonemptyClassRangesNoDash の CompileToCharSet とする。CharSet charSet と otherSet の和集合を返す。
NonemptyClassRanges ::
ClassAtom
-
ClassAtom
ClassContents
charSet を、引数 regexpRecord を指定した最初の ClassAtom の CompileToCharSet とする。otherSet を、引数 regexpRecord を指定した2番目の ClassAtom の CompileToCharSet とする。remainingSet を、引数 regexpRecord を指定した ClassContents の CompileToCharSet とする。rangeSet を CharacterRange (charSet , otherSet ) とする。rangeSet と remainingSet の和集合を返す。
NonemptyClassRangesNoDash ::
ClassAtomNoDash
NonemptyClassRangesNoDash
charSet を、引数 regexpRecord を指定した ClassAtomNoDash の CompileToCharSet とする。otherSet を、引数 regexpRecord を指定した NonemptyClassRangesNoDash の CompileToCharSet とする。CharSet charSet と otherSet の和集合を返す。
NonemptyClassRangesNoDash ::
ClassAtomNoDash
-
ClassAtom
ClassContents
charSet を、引数 regexpRecord を指定した ClassAtomNoDash の CompileToCharSet とする。otherSet を、引数 regexpRecord を指定した ClassAtom の CompileToCharSet とする。remainingSet を、引数 regexpRecord を指定した ClassContents の CompileToCharSet とする。rangeSet を CharacterRange (charSet , otherSet ) とする。rangeSet と remainingSet の和集合を返す。
注 2
ClassContents は単一の ClassAtom および/またはダッシュで区切られた2つの ClassAtom の範囲へ展開できます。後者の場合、ClassContents は最初の ClassAtom と2番目の ClassAtom の間のすべての文字を両端を含めて含みます。どちらかの ClassAtom が単一の文字を表さない場合(たとえば、一方が \w の場合)、または最初の ClassAtom の文字値が2番目の ClassAtom の文字値より厳密に大きい場合、エラーが発生します。
注 3
pattern が大文字小文字を無視する場合でも、範囲の両端の大文字小文字は、どの文字がその範囲に属するかを決定するうえで重要です。したがって、たとえば pattern /[E-F]/i は E、F、e、f の文字だけに一致しますが、pattern /[E-f]/i は Unicode 基本ラテンブロック内のすべての大文字および小文字と、記号 [, \, ], ^, _, および ` に一致します。
注 4
- 文字はリテラルとして扱うことも、範囲を表すこともできます。ClassContents の最初または最後の文字である場合、範囲指定の開始または終了境界である場合、または範囲指定の直後にある場合は、リテラルとして扱われます。
ClassAtom :: -
単一文字 - U+002D (HYPHEN-MINUS) を含む CharSet を返す。
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
SourceCharacter に一致した文字を含む CharSet を返す。
ClassEscape ::
b
-
CharacterEscape
charValue をこの ClassEscape の CharacterValue とする。char を文字値が charValue である文字とする。単一文字 char を含む CharSet を返す。
注 5
ClassAtom は、\b、\B、および後方参照を除き、正規表現の残りの部分で許可されている任意のエスケープシーケンスを使用できます。CharacterClass 内では、\b はバックスペース文字を意味し、\B および後方参照はエラーを発生させます。ClassAtom 内で後方参照を使用するとエラーになります。
CharacterClassEscape :: d
文字 0、1、2、3、4、5、6、7、8、および 9 を含む10要素の CharSet を返す。
CharacterClassEscape :: D
charSet を
CharacterClassEscape :: d
によって返される CharSet とする。CharacterComplement (regexpRecord , charSet ) を返す。
CharacterClassEscape :: s
WhiteSpace または LineTerminator 生成規則の右辺にあるコードポイントに対応するすべての文字を含む CharSet を返す。
CharacterClassEscape :: S
charSet を
CharacterClassEscape :: s
によって返される CharSet とする。CharacterComplement (regexpRecord , charSet ) を返す。
CharacterClassEscape :: w
MaybeSimpleCaseFolding (regexpRecord , WordCharacters (regexpRecord )) を返す。
CharacterClassEscape :: W
charSet を
CharacterClassEscape :: w
によって返される CharSet とする。CharacterComplement (regexpRecord , charSet ) を返す。
CharacterClassEscape ::
p{
UnicodePropertyValueExpression
}
引数 regexpRecord を指定した UnicodePropertyValueExpression の CompileToCharSet を返す。
CharacterClassEscape ::
P{
UnicodePropertyValueExpression
}
charSet を、引数 regexpRecord を指定した UnicodePropertyValueExpression の CompileToCharSet とする。表明 : charSet は単一のコードポイントだけを含む。CharacterComplement (regexpRecord , charSet ) を返す。
UnicodePropertyValueExpression ::
UnicodePropertyName
=
UnicodePropertyValue
ps を UnicodePropertyName に一致したソーステキストとする。p を UnicodeMatchProperty (regexpRecord , ps ) とする。表明 : p は 表 65 の「Property name and aliases 」列に列挙されたUnicode プロパティ名 またはプロパティ別名である。vs を UnicodePropertyValue に一致したソーステキストとする。v を UnicodeMatchPropertyValue (p , vs ) とする。charSet を、character database 定義が値 v のプロパティ p を含むすべての Unicode コードポイントを含む CharSet とする。MaybeSimpleCaseFolding (regexpRecord , charSet ) を返す。
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
s を LoneUnicodePropertyNameOrValue に一致したソーステキストとする。UnicodeMatchPropertyValue (General_Category, s ) が、PropertyValueAliases.txt に列挙された General_Category (gc) プロパティの Unicode プロパティ値またはプロパティ値別名である場合、character database 定義が値 s のプロパティ「General_Category」を含むすべての Unicode コードポイントを含む CharSet を返す。 p を UnicodeMatchProperty (regexpRecord , s ) とする。表明 : p は 表 66 の「Property name and aliases 」列に列挙されたバイナリ Unicode プロパティまたはバイナリプロパティ別名、あるいは 表 67 の「Property name 」列に列挙された文字列のバイナリ Unicode プロパティである。charSet を、character database 定義が値「True」のプロパティ p を含むすべての CharSetElement を含む CharSet とする。MaybeSimpleCaseFolding (regexpRecord , charSet ) を返す。
ClassUnion ::
ClassSetRange
ClassUnion opt
charSet を、引数 regexpRecord を指定した ClassSetRange の CompileToCharSet とする。ClassUnion が存在する場合、otherSet を、引数 regexpRecord を指定した ClassUnion の CompileToCharSet とする。CharSet charSet と otherSet の和集合を返す。charSet を返す。
ClassUnion ::
ClassSetOperand
ClassUnion opt
charSet を、引数 regexpRecord を指定した ClassSetOperand の CompileToCharSet とする。ClassUnion が存在する場合、otherSet を、引数 regexpRecord を指定した ClassUnion の CompileToCharSet とする。CharSet charSet と otherSet の和集合を返す。charSet を返す。
ClassIntersection ::
ClassSetOperand
&&
ClassSetOperand
charSet を、引数 regexpRecord を指定した最初の ClassSetOperand の CompileToCharSet とする。otherSet を、引数 regexpRecord を指定した2番目の ClassSetOperand の CompileToCharSet とする。CharSet charSet と otherSet の共通部分を返す。
ClassIntersection ::
ClassIntersection
&&
ClassSetOperand
charSet を、引数 regexpRecord を指定した ClassIntersection の CompileToCharSet とする。otherSet を、引数 regexpRecord を指定した ClassSetOperand の CompileToCharSet とする。CharSet charSet と otherSet の共通部分を返す。
ClassSubtraction ::
ClassSetOperand
--
ClassSetOperand
charSet を、引数 regexpRecord を指定した最初の ClassSetOperand の CompileToCharSet とする。otherSet を、引数 regexpRecord を指定した2番目の ClassSetOperand の CompileToCharSet とする。otherSet の CharSetElement でもあるものを除いた、charSet の CharSetElement を含む CharSet を返す。
ClassSubtraction ::
ClassSubtraction
--
ClassSetOperand
charSet を、引数 regexpRecord を指定した ClassSubtraction の CompileToCharSet とする。otherSet を、引数 regexpRecord を指定した ClassSetOperand の CompileToCharSet とする。otherSet の CharSetElement でもあるものを除いた、charSet の CharSetElement を含む CharSet を返す。
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
charSet を、引数 regexpRecord を指定した最初の ClassSetCharacter の CompileToCharSet とする。otherSet を、引数 regexpRecord を指定した2番目の ClassSetCharacter の CompileToCharSet とする。MaybeSimpleCaseFolding (regexpRecord , CharacterRange (charSet , otherSet )) を返す。
注 6
結果はしばしば2つ以上の範囲から構成されます。UnicodeSets が true で IgnoreCase が true である場合、MaybeSimpleCaseFolding (regexpRecord , [Ā-č]) にはその範囲の奇数番号のコードポイントだけが含まれます。
ClassSetOperand :: ClassSetCharacter
charSet を、引数 regexpRecord を指定した ClassSetCharacter の CompileToCharSet とする。MaybeSimpleCaseFolding (regexpRecord , charSet ) を返す。
ClassSetOperand :: ClassStringDisjunction
charSet を、引数 regexpRecord を指定した ClassStringDisjunction の CompileToCharSet とする。MaybeSimpleCaseFolding (regexpRecord , charSet ) を返す。
ClassSetOperand :: NestedClass
引数 regexpRecord を指定した NestedClass の CompileToCharSet を返す。
NestedClass ::
[
ClassContents
]
引数 regexpRecord を指定した ClassContents の CompileToCharSet を返す。
NestedClass ::
[^
ClassContents
]
charSet を、引数 regexpRecord を指定した ClassContents の CompileToCharSet とする。CharacterComplement (regexpRecord , charSet ) を返す。
NestedClass ::
\
CharacterClassEscape
引数 regexpRecord を指定した CharacterClassEscape の CompileToCharSet を返す。
ClassStringDisjunction ::
\q{
ClassStringDisjunctionContents
}
引数 regexpRecord を指定した ClassStringDisjunctionContents の CompileToCharSet を返す。
ClassStringDisjunctionContents :: ClassString
s を、引数 regexpRecord を指定した ClassString の CompileClassSetString とする。唯一の文字列 s を含む CharSet を返す。
ClassStringDisjunctionContents ::
ClassString
|
ClassStringDisjunctionContents
s を、引数 regexpRecord を指定した ClassString の CompileClassSetString とする。charSet を唯一の文字列 s を含む CharSet とする。otherSet を、引数 regexpRecord を指定した ClassStringDisjunctionContents の CompileToCharSet とする。CharSet charSet と otherSet の和集合を返す。
ClassSetCharacter ::
SourceCharacter but not ClassSetSyntaxCharacter
\
CharacterEscape
\
ClassSetReservedPunctuator
charValue をこの ClassSetCharacter の CharacterValue とする。char を文字値が charValue である文字とする。単一文字 char を含む CharSet を返す。
ClassSetCharacter :: \b
単一文字 U+0008 (BACKSPACE) を含む CharSet を返す。
22.2.2.9.1 CharacterRange ( charSet , otherSet )
抽象操作 CharacterRange。引数 charSet (CharSet ) および otherSet (CharSet )。戻り値:CharSet 。 呼び出されると、次の手順を実行する。
表明 : charSet と otherSet はそれぞれ正確に1文字を含む。a を CharSet charSet 内の唯一の文字とする。b を CharSet otherSet 内の唯一の文字とする。i を文字 a の文字値とする。j を文字 b の文字値とする。表明 : i ≤ j 。i から j までの閉区間 内の文字値を持つすべての文字を含む CharSet を返す。
22.2.2.9.2 HasEitherUnicodeFlag ( regexpRecord )
抽象操作 HasEitherUnicodeFlag。引数 regexpRecord (RegExpレコード )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
regexpRecord .[[Unicode]] が true または regexpRecord .[[UnicodeSets]] が true である場合、true を返す。false を返す。
22.2.2.9.3 WordCharacters ( regexpRecord )
抽象操作 WordCharacters。引数 regexpRecord (RegExpレコード )。戻り値:CharSet 。 \b、\B、\w、および \W の目的において「word characters」とみなされる文字を含む CharSet を返します。 呼び出されると、次の手順を実行する。
basicWordChars を ASCII word characters 内のすべての文字を含む CharSet とする。extraWordChars を、basicWordChars 内にはないが Canonicalize (regexpRecord , c ) が basicWordChars 内にある、すべての文字 c を含む CharSet とする。表明 : HasEitherUnicodeFlag (regexpRecord ) が true であり、regexpRecord .[[IgnoreCase]] が true でない限り、extraWordChars は空である。basicWordChars と extraWordChars の和集合を返す。
22.2.2.9.4 AllCharacters ( regexpRecord )
抽象操作 AllCharacters。引数 regexpRecord (RegExpレコード )。戻り値:CharSet 。 正規表現フラグに従う「すべての文字」の集合を返します。 呼び出されると、次の手順を実行する。
regexpRecord .[[UnicodeSets]] が true であり、regexpRecord .[[IgnoreCase]] が true である場合、Simple Case Folding マッピングを持たない(すなわち、scf (c )=c )すべての Unicode コードポイント c を含む CharSet を返す。HasEitherUnicodeFlag (regexpRecord ) が true である場合、すべてのコードポイント値を含む CharSet を返す。 すべてのコード単位値を含む CharSet を返す。
22.2.2.9.5 MaybeSimpleCaseFolding ( regexpRecord , charSet )
抽象操作 MaybeSimpleCaseFolding。引数 regexpRecord (RegExpレコード ) および charSet (CharSet )。戻り値:CharSet 。 regexpRecord .[[UnicodeSets]] が false であるか、regexpRecord .[[IgnoreCase]] が false である場合、charSet を返します。それ以外の場合、Unicode Character Database の CaseFolding.txt ファイル内の Simple Case Folding (scf(codePoint ) )定義(それぞれが単一のコードポイントを別の単一のコードポイントへマッピングする)を使用して、charSet の各 CharSetElement を文字ごとに正準形式へマッピングし、結果の CharSet を返します。 呼び出されると、次の手順を実行する。
regexpRecord .[[UnicodeSets]] が false であるか、regexpRecord .[[IgnoreCase]] が false である場合、charSet を返す。otherSet を新しい空の CharSet とする。charSet の各 CharSetElement s について、次を行う。t を空の文字列とする。s の各単一コードポイント codePoint について、次を行う。scf (codePoint ) を t に追加する。t を otherSet に追加する。otherSet を返す。
22.2.2.9.6 CharacterComplement ( regexpRecord , complement )
抽象操作 CharacterComplement。引数 regexpRecord (RegExpレコード ) および complement (CharSet )。戻り値:CharSet 。 呼び出されると、次の手順を実行する。
charSet を AllCharacters (regexpRecord ) とする。complement の CharSetElement でもあるものを除いた、charSet の CharSetElement を含む CharSet を返す。
22.2.2.9.7 UnicodeMatchProperty ( regexpRecord , p )
抽象操作 UnicodeMatchProperty。引数 regexpRecord (RegExpレコード ) および p (ECMAScript ソーステキスト )。戻り値:a Unicode property name 。 呼び出されると、次の手順を実行する。
regexpRecord .[[UnicodeSets]] が true であり、p が 表 67 の「Property name 」列に列挙されたUnicode プロパティ名 である場合、Unicode コードポイントの List p を返す。 表明 : p は 表 65 または 表 66 の「Property name and aliases 」列に列挙されたUnicode プロパティ名 またはプロパティ別名である。c を、対応する行の「Canonical property name 」列に示される p の正準プロパティ名 とする。Unicode コードポイントの List c を返す。
実装は、表 65 、表 66 、および 表 67 に列挙されたUnicode プロパティ名 および別名をサポートしなければなりません。相互運用性を保証するため、実装は他のプロパティ名 または別名をサポートしてはなりません。
注 1
たとえば、Script_Extensions(プロパティ名 )および scx(プロパティ別名)は有効ですが、script_extensions または Scx は有効ではありません。
注 2
列挙されたプロパティは、UTS18 RL1.2 が要求するものの上位集合を形成します。
注 3
これらの表の項目の綴り(大文字小文字を含む)は、Unicode Character Database の PropertyAliases.txt ファイルで使用される綴りと一致します。そのファイル内の正確な綴りは安定していることが保証されています 。
表 65: Non-binary Unicode property aliases and their canonical property names
表 66: Binary Unicode property aliases and their canonical property names
表 67: 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 )
抽象操作 UnicodeMatchPropertyValue。引数 p (ECMAScript ソーステキスト ) および v (ECMAScript ソーステキスト )。戻り値:a Unicode property value。 呼び出されると、次の手順を実行する。
表明 : p は 表 65 の「Canonical property name 」列に列挙された、正準で別名でないUnicode プロパティ名 である。表明 : v は PropertyValueAliases.txt に列挙された Unicode プロパティ p のプロパティ値またはプロパティ値別名である。value を対応する行の「Canonical property value」列に示される v の正準プロパティ値とする。Unicode コードポイントの List value を返す。
実装は、表 65 に列挙されたプロパティについて、PropertyValueAliases.txt に列挙された Unicode プロパティ値およびプロパティ値別名をサポートしなければなりません。相互運用性を保証するため、実装は他のプロパティ値またはプロパティ値別名をサポートしてはなりません。
注 1
たとえば、Xpeo および Old_Persian は有効な Script_Extensions 値ですが、xpeo および Old Persian は有効ではありません。
注 2
このアルゴリズムは UAX44 に列挙された symbolic value のマッチング規則 とは異なります。大文字小文字、空白 、U+002D (HYPHEN-MINUS)、および U+005F (LOW LINE) は無視されず、Is 接頭辞はサポートされません。
22.2.2.10 Runtime Semantics: CompileClassSetString
構文指向操作 CompileClassSetString。引数 regexpRecord (RegExpレコード )。戻り値:a sequence of characters。 次の生成規則ごとに定義される。
ClassString :: [empty]
空の文字列を返す。
ClassString :: NonEmptyClassString
引数 regexpRecord を指定した NonEmptyClassString の CompileClassSetString を返す。
NonEmptyClassString ::
ClassSetCharacter
NonEmptyClassString opt
cs を、引数 regexpRecord を指定した ClassSetCharacter の CompileToCharSet とする。s1 を cs の唯一の CharSetElement である文字列とする。NonEmptyClassString が存在する場合、s2 を、引数 regexpRecord を指定した NonEmptyClassString の CompileClassSetString とする。s1 と s2 の連結を返す。s1 を返す。
22.2.3 RegExp 作成のための抽象操作
22.2.3.1 RegExpCreate ( pattern , flags )
抽象操作 RegExpCreate。引数 pattern (ECMAScript 言語値 ) および flags ((String または undefined ))。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
obj を ! RegExpAlloc (%RegExp% ) とする。? RegExpInitialize (obj , pattern , flags ) を返す。
22.2.3.2 RegExpAlloc ( newTarget )
抽象操作 RegExpAlloc。引数 newTarget (コンストラクター )。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
obj を ? OrdinaryCreateFromConstructor (newTarget , "%RegExp.prototype%" , « [[OriginalSource]] , [[OriginalFlags]] , [[RegExpRecord]] , [[RegExpMatcher]] ») とする。! DefinePropertyOrThrow (obj , "lastIndex" , PropertyDescriptor { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 obj を返す。
22.2.3.3 RegExpInitialize ( obj , pattern , flags )
抽象操作 RegExpInitialize。引数 obj (Object)、pattern (ECMAScript 言語値 ) および flags (ECMAScript 言語値 )。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
pattern が undefined である場合、pattern を空の String に設定する。そうでない場合、pattern を ? ToString (pattern ) に設定する。 flags が undefined である場合、flags を空の String に設定する。そうでない場合、flags を ? ToString (flags ) に設定する。 flags が "d" 、"g" 、"i" 、"m" 、"s" 、"u" 、"v" 、または "y" 以外のコード単位を含む場合、SyntaxError 例外をスローする。flags が同じコード単位を複数回含む場合、SyntaxError 例外をスローする。flags が "i" を含む場合、i を true とする。そうでない場合、i を false とする。flags が "m" を含む場合、m を true とする。そうでない場合、m を false とする。flags が "s" を含む場合、s を true とする。そうでない場合、s を false とする。flags が "u" を含む場合、u を true とする。そうでない場合、u を false とする。flags が "v" を含む場合、v を true とする。そうでない場合、v を false とする。u が true または v が true である場合、patternText を StringToCodePoints (pattern ) とする。そうでない場合、patternText を、pattern の各16ビット要素を Unicode BMP コードポイントとして解釈した結果とする。要素には UTF-16 デコードを適用しない。 parseResult を ParsePattern (patternText , u , v ) とする。parseResult が空でない SyntaxError オブジェクトの List である場合、SyntaxError 例外をスローする。表明 : parseResult は Pattern Parse Node である。obj .[[OriginalSource]] を pattern に設定する。obj .[[OriginalFlags]] を flags に設定する。capturingGroupsCount を CountLeftCapturingParensWithin (parseResult ) とする。regexpRecord を RegExp Record { [[IgnoreCase]] : i , [[Multiline]] : m , [[DotAll]] : s , [[Unicode]] : u , [[UnicodeSets]] : v , [[CapturingGroupsCount]] : capturingGroupsCount } とする。obj .[[RegExpRecord]] を regexpRecord に設定する。obj .[[RegExpMatcher]] を、引数 regexpRecord を指定した parseResult の CompilePattern に設定する。? Set (obj , "lastIndex" , +0 𝔽 , true ) を実行する。 obj を返す。
22.2.3.4 Static Semantics: ParsePattern ( patternText , u , v )
抽象操作 ParsePattern。引数 patternText (a sequence of Unicode code points)、u (Boolean) および v (Boolean)。戻り値:(構文解析ノード または a non-empty List of SyntaxError objects)。
注
呼び出されると、次の手順を実行する。
v が true かつ u が true である場合、parseResult を1つ以上の SyntaxError オブジェクトを含む List とする。そうでなく、v が true である場合、parseResult を ParseText (patternText , Pattern [+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups] ) とする。 そうでなく、u が true である場合、parseResult を ParseText (patternText , Pattern [+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups] ) とする。 そうでない場合、parseResult を ParseText (patternText , Pattern [~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups] ) とする。 parseResult を返す。
22.2.4 RegExp コンストラクター
RegExp コンストラクター は:
%RegExp% です。
グローバルオブジェクト の "RegExp" プロパティの初期値です。
コンストラクター として呼び出されたとき、新しい RegExp オブジェクトを作成して初期化します。
コンストラクター としてではなく関数として呼び出されたとき、新しい RegExp オブジェクトを返すか、唯一の引数が RegExp オブジェクトである場合はその引数自身を返します。
クラス定義の extends 節の値として使用できます。規定された RegExp の動作を継承しようとするサブクラスコンストラクター は、必要な内部スロットを持つサブクラスインスタンスを作成して初期化するために、RegExp コンストラクター への super 呼出しを含まなければなりません。
22.2.4.1 RegExp ( patternOrRegexp , flags )
この関数は呼び出されたとき、次の手順を実行します。
patternIsRegExp を ? IsRegExp (patternOrRegexp ) とする。NewTarget が undefined である場合、newTarget をアクティブな関数オブジェクト とする。patternIsRegExp が true であり、flags が undefined である場合、patternCtor を ? Get (patternOrRegexp , "constructor" ) とする。SameValue (newTarget , patternCtor ) が true である場合、patternOrRegexp を返す。 そうでない場合、newTarget を NewTarget とする。 patternOrRegexp が Object であり、patternOrRegexp が [[RegExpMatcher]] 内部スロットを持つ場合、patternSource を patternOrRegexp .[[OriginalSource]] とする。flags が undefined である場合、flags を patternOrRegexp .[[OriginalFlags]] に設定する。そうでなく、patternIsRegExp が true である場合、patternSource を ? Get (patternOrRegexp , "source" ) とする。flags が undefined である場合、flags を ? Get (patternOrRegexp , "flags" ) に設定する。 そうでない場合、patternSource を patternOrRegexp とする。 obj を ? RegExpAlloc (newTarget ) とする。? RegExpInitialize (obj , patternSource , flags ) を返す。
注
pattern が StringLiteral を使用して指定される場合、この関数によって String が処理される前に、通常のエスケープシーケンス置換が実行されます。pattern がこの関数によって認識されるためにエスケープシーケンスを含む必要がある場合、StringLiteral の内容が形成されるときに削除されないよう、すべての U+005C (REVERSE SOLIDUS) コードポイントは StringLiteral 内でエスケープされなければなりません。
22.2.5 RegExp コンストラクターのプロパティ
RegExp コンストラクター は:
22.2.5.1 RegExp.escape ( string )
この関数は、正規表現 Pattern 内で特殊となる可能性がある文字を等価なエスケープシーケンスに置き換えた string のコピーを返します。
呼び出されたとき、次の手順を実行します。
string が String でない場合、TypeError 例外をスローする。escaped を空の String とする。codePointList を StringToCodePoints (string ) とする。codePointList の各コードポイント codePoint について、次を行う。escaped が空の String であり、codePoint が DecimalDigit または AsciiLetter のいずれかに一致する場合、注記 : 先頭の数字をエスケープすると、出力が \0 文字エスケープまたは \1 のような DecimalEscape の後で使用される可能性のある pattern text に対応し、それでも前のエスケープシーケンスの拡張として解釈されるのではなく string に一致することが保証される。先頭の ASCII 文字をエスケープすることは、\c の後の文脈について同じ役割を果たす。numericValue を codePoint の数値とする。hex を Number::toString (𝔽 (numericValue ), 16) とする。表明 : hex の長さは 2 である。escaped をコード単位 0x005C (REVERSE SOLIDUS)、"x" 、および hex の文字列連結 に設定する。そうでない場合、escaped を escaped と EncodeForRegExpEscape (codePoint ) の文字列連結 に設定する。 escaped を返す。
注
名前は似ていますが、EscapeRegExpPattern と RegExp.escape は同様の処理を実行しません。前者は pattern を文字列として表現するためにエスケープし、この関数は文字列を pattern 内で表現するためにエスケープします。
22.2.5.1.1 EncodeForRegExpEscape ( codePoint )
抽象操作 EncodeForRegExpEscape。引数 codePoint (コードポイント)。戻り値:String。 codePoint に一致する Pattern を表す String を返します。codePoint が空白または ASCII punctuator である場合、返される値はエスケープシーケンスです。それ以外の場合、返される値は codePoint 自身の String 表現です。 呼び出されると、次の手順を実行する。
codePoint が SyntaxCharacter に一致するか、codePoint が U+002F (SOLIDUS) である場合、0x005C (REVERSE SOLIDUS) と UTF16EncodeCodePoint (codePoint ) の文字列連結 を返す。 codePoint が 表 63 の「Code Point」列に列挙されたコードポイントである場合、0x005C (REVERSE SOLIDUS) と、「Code Point」列が codePoint を含む行の「ControlEscape」列の文字列との文字列連結 を返す。 otherPunctuators を ",-=<>#&!%:;@~'`" とコード単位 0x0022 (QUOTATION MARK) の文字列連結 とする。toEscape を StringToCodePoints (otherPunctuators ) とする。toEscape が codePoint を含むか、codePoint が WhiteSpace または LineTerminator のいずれかに一致するか、codePoint が先行サロゲート または後続サロゲート と同じ数値を持つ場合、codePointNumber を codePoint の数値とする。codePointNumber ≤ 0xFF である場合、hex を Number::toString (𝔽 (codePointNumber ), 16) とする。コード単位 0x005C (REVERSE SOLIDUS)、"x" 、および StringPad (hex , 2, "0" , start ) の文字列連結 を返す。 escaped を空の String とする。codeUnits を UTF16EncodeCodePoint (codePoint ) とする。codeUnits の各コード単位 codeUnit について、次を行う。escaped を escaped と UnicodeEscape (codeUnit ) の文字列連結 に設定する。escaped を返す。UTF16EncodeCodePoint (codePoint ) を返す。
22.2.5.2 RegExp.prototype
RegExp.prototype の初期値は RegExp prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
22.2.5.3 get RegExp [ %Symbol.species% ]
RegExp[%Symbol.species%] は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
this 値を返す。
この関数の "name" プロパティの値は "get [Symbol.species]" です。
注
RegExp prototype メソッドは通常、this 値のコンストラクター を使用して派生オブジェクトを作成します。ただし、サブクラスコンストラクター は %Symbol.species% プロパティを再定義することによって、その既定の動作を上書きできます。
22.2.6 RegExp Prototype オブジェクトのプロパティ
RegExp prototype オブジェクト は:
%RegExp.prototype% です。
通常オブジェクト です。
RegExp インスタンスではなく、[[RegExpMatcher]] 内部スロットまたは RegExp インスタンスオブジェクトのその他の内部スロットを持ちません。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
注
RegExp prototype オブジェクトは独自の "valueOf" プロパティを持ちません。ただし、Object prototype オブジェクト から "valueOf" プロパティを継承します。
22.2.6.1 RegExp.prototype.constructor
RegExp.prototype.constructor の初期値は %RegExp% です。
22.2.6.2 RegExp.prototype.exec ( string )
このメソッドは、string 内で正規表現 pattern の出現を検索し、マッチ結果を含む Array を返します。string が一致しなかった場合は null を返します。
呼び出されたとき、次の手順を実行します。
regexp を this 値とする。? RequireInternalSlot (regexp , [[RegExpMatcher]] ) を実行する。 string を ? ToString (string ) に設定する。? RegExpBuiltinExec (regexp , string ) を返す。
22.2.6.3 get RegExp.prototype.dotAll
RegExp.prototype.dotAll は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
regexp を this 値とする。codeUnit をコード単位 0x0073 (LATIN SMALL LETTER S) とする。? RegExpHasFlag (regexp , codeUnit ) を返す。
22.2.6.4 get RegExp.prototype.flags
RegExp.prototype.flags は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
regexp を this 値とする。regexp が Object でない場合、TypeError 例外をスローする。codeUnits を新しい空の List とする。hasIndices を ToBoolean (? Get (regexp , "hasIndices" )) とする。hasIndices が true である場合、コード単位 0x0064 (LATIN SMALL LETTER D) を codeUnits に追加する。global を ToBoolean (? Get (regexp , "global" )) とする。global が true である場合、コード単位 0x0067 (LATIN SMALL LETTER G) を codeUnits に追加する。ignoreCase を ToBoolean (? Get (regexp , "ignoreCase" )) とする。ignoreCase が true である場合、コード単位 0x0069 (LATIN SMALL LETTER I) を codeUnits に追加する。multiline を ToBoolean (? Get (regexp , "multiline" )) とする。multiline が true である場合、コード単位 0x006D (LATIN SMALL LETTER M) を codeUnits に追加する。dotAll を ToBoolean (? Get (regexp , "dotAll" )) とする。dotAll が true である場合、コード単位 0x0073 (LATIN SMALL LETTER S) を codeUnits に追加する。unicode を ToBoolean (? Get (regexp , "unicode" )) とする。unicode が true である場合、コード単位 0x0075 (LATIN SMALL LETTER U) を codeUnits に追加する。unicodeSets を ToBoolean (? Get (regexp , "unicodeSets" )) とする。unicodeSets が true である場合、コード単位 0x0076 (LATIN SMALL LETTER V) を codeUnits に追加する。sticky を ToBoolean (? Get (regexp , "sticky" )) とする。sticky が true である場合、コード単位 0x0079 (LATIN SMALL LETTER Y) を codeUnits に追加する。コード単位が List codeUnits の要素である String 値を返す。codeUnits が要素を持たない場合、空の String が返される。
22.2.6.4.1 RegExpHasFlag ( regexp , codeUnit )
抽象操作 RegExpHasFlag。引数 regexp (ECMAScript 言語値 ) および codeUnit (コード単位)。戻り値:(正常完了 (値:(Boolean または undefined )) または throw 完了 )。 呼び出されると、次の手順を実行する。
regexp が Object でない場合、TypeError 例外をスローする。regexp が [[OriginalFlags]] 内部スロットを持たない場合、SameValue (regexp , %RegExp.prototype% ) が true である場合、undefined を返す。TypeError 例外をスローする。flags を regexp .[[OriginalFlags]] とする。flags が codeUnit を含む場合、true を返す。false を返す。
22.2.6.5 get RegExp.prototype.global
RegExp.prototype.global は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
regexp を this 値とする。codeUnit をコード単位 0x0067 (LATIN SMALL LETTER G) とする。? RegExpHasFlag (regexp , codeUnit ) を返す。
22.2.6.6 get RegExp.prototype.hasIndices
RegExp.prototype.hasIndices は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
regexp を this 値とする。codeUnit をコード単位 0x0064 (LATIN SMALL LETTER D) とする。? RegExpHasFlag (regexp , codeUnit ) を返す。
22.2.6.7 get RegExp.prototype.ignoreCase
RegExp.prototype.ignoreCase は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
regexp を this 値とする。codeUnit をコード単位 0x0069 (LATIN SMALL LETTER I) とする。? RegExpHasFlag (regexp , codeUnit ) を返す。
22.2.6.8 RegExp.prototype [ %Symbol.match% ] ( string )
このメソッドは呼び出されたとき、次の手順を実行します。
regexp を this 値とする。regexp が Object でない場合、TypeError 例外をスローする。string を ? ToString (string ) に設定する。flags を ? ToString (? Get (regexp , "flags" )) とする。flags が "g" を含まない場合、? RegExpExec (regexp , string ) を返す。flags が "u" を含むか、flags が "v" を含む場合、fullUnicode を true とする。そうでない場合、fullUnicode を false とする。? Set (regexp , "lastIndex" , +0 𝔽 , true ) を実行する。 array を ! ArrayCreate (0) とする。matchCount を 0 とする。次を繰り返す。result を ? RegExpExec (regexp , string ) とする。result が null である場合、matchCount = 0 である場合、null を返す。array を返す。matchString を ? ToString (? Get (result , "0" )) とする。! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (matchCount )), matchString ) を実行する。 matchString が空の String である場合、thisIndex を ℝ (? ToLength (? Get (regexp , "lastIndex" ))) とする。nextIndex を AdvanceStringIndex (string , thisIndex , fullUnicode ) とする。? Set (regexp , "lastIndex" , 𝔽 (nextIndex ), true ) を実行する。 matchCount を matchCount + 1 に設定する。
このメソッドの "name" プロパティの値は "[Symbol.match]" です。
注
%Symbol.match% プロパティは、正規表現の基本的な動作を持つオブジェクトを識別するために IsRegExp 抽象操作 によって使用されます。%Symbol.match% プロパティが存在しないこと、またはその値を Boolean に型強制しても true にならないそのようなプロパティが存在することは、そのオブジェクトが正規表現オブジェクトとして使用されることを意図していないことを示します。
22.2.6.9 RegExp.prototype [ %Symbol.matchAll% ] ( string )
このメソッドは呼び出されたとき、次の手順を実行します。
regexp を this 値とする。regexp が Object でない場合、TypeError 例外をスローする。string を ? ToString (string ) に設定する。speciesCtor を ? SpeciesConstructor (regexp , %RegExp% ) とする。flags を ? ToString (? Get (regexp , "flags" )) とする。matcher を ? Construct (speciesCtor , « regexp , flags ») とする。lastIndex を ? ToLength (? Get (regexp , "lastIndex" )) とする。? Set (matcher , "lastIndex" , lastIndex , true ) を実行する。 flags が "g" を含む場合、global を true とする。そうでない場合、global を false とする。 flags が "u" を含むか、flags が "v" を含む場合、fullUnicode を true とする。そうでない場合、fullUnicode を false とする。 CreateRegExpStringIterator (matcher , string , global , fullUnicode ) を返す。
このメソッドの "name" プロパティの値は "[Symbol.matchAll]" です。
22.2.6.10 get RegExp.prototype.multiline
RegExp.prototype.multiline は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
regexp を this 値とする。codeUnit をコード単位 0x006D (LATIN SMALL LETTER M) とする。? RegExpHasFlag (regexp , codeUnit ) を返す。
22.2.6.11 RegExp.prototype [ %Symbol.replace% ] ( string , replaceValue )
このメソッドは呼び出されたとき、次の手順を実行します。
regexp を this 値とする。regexp が Object でない場合、TypeError 例外をスローする。string を ? ToString (string ) に設定する。stringLength を string の長さとする。functionalReplace を IsCallable (replaceValue ) とする。functionalReplace が false である場合、replaceValue を ? ToString (replaceValue ) に設定する。flags を ? ToString (? Get (regexp , "flags" )) とする。flags が "g" を含む場合、global を true とする。そうでない場合、global を false とする。global が true である場合、? Set (regexp , "lastIndex" , +0 𝔽 , true ) を実行する。 results を新しい空の List とする。done を false とする。done が false である間、次を繰り返す。result を ? RegExpExec (regexp , string ) とする。result が null である場合、done を true に設定する。そうでない場合、result を results に追加する。global が false である場合、done を true に設定する。そうでない場合、matchString を ? ToString (? Get (result , "0" )) とする。matchString が空の String である場合、thisIndex を ℝ (? ToLength (? Get (regexp , "lastIndex" ))) とする。flags が "u" を含むか、flags が "v" を含む場合、fullUnicode を true とする。そうでない場合、fullUnicode を false とする。nextIndex を AdvanceStringIndex (string , thisIndex , fullUnicode ) とする。? Set (regexp , "lastIndex" , 𝔽 (nextIndex ), true ) を実行する。 accumulatedResult を空の String とする。nextSourcePosition を 0 とする。results の各要素 result について、次を行う。resultLength を ? LengthOfArrayLike (result ) とする。capturesCount を max (resultLength - 1, 0) とする。matched を ? ToString (? Get (result , "0" )) とする。matchLength を matched の長さとする。position を ? ToIntegerOrInfinity (? Get (result , "index" )) とする。position を position を 0 と stringLength の間にクランプした結果に設定する。captures を新しい空の List とする。captureNumber を 1 とする。captureNumber ≤ capturesCount の間、次を繰り返す。capture を ? Get (result , ! ToString (𝔽 (captureNumber ))) とする。capture が undefined でない場合、capture を ? ToString (capture ) に設定する。capture を captures に追加する。注記 : captureNumber = 1 の場合、前の手順は最初の要素を captures (インデックス0)に置く。より一般には、captureNumber th capture(captureNumber th のキャプチャ括弧集合によってキャプチャされた文字)は captures [captureNumber - 1] にある。captureNumber を captureNumber + 1 に設定する。namedCaptures を ? Get (result , "groups" ) とする。functionalReplace が true である場合、replacerArgs を « matched »、captures 、および « 𝔽 (position ), string » のリスト連結 とする。namedCaptures が undefined でない場合、namedCaptures を replacerArgs に追加する。replacementValue を ? Call (replaceValue , undefined , replacerArgs ) とする。replacementString を ? ToString (replacementValue ) とする。そうでない場合、namedCaptures が undefined でない場合、namedCaptures を ? ToObject (namedCaptures ) に設定する。replacementString を ? GetSubstitution (matched , string , position , captures , namedCaptures , replaceValue ) とする。 position ≥ nextSourcePosition である場合、注記 : 通常、position が後方へ移動するべきではない。後方へ移動する場合、それは不適切に動作する RegExp サブクラス、またはアクセスによって引き起こされる副作用を使用して regexp の global flag やその他の特性を変更したことを示す。そのような場合、対応する置換は無視される。accumulatedResult を accumulatedResult 、string の nextSourcePosition から position までの部分文字列 、および replacementString の文字列連結 に設定する。nextSourcePosition を position + matchLength に設定する。nextSourcePosition ≥ stringLength である場合、accumulatedResult を返す。accumulatedResult と string の nextSourcePosition から始まる部分文字列 の文字列連結 を返す。
このメソッドの "name" プロパティの値は "[Symbol.replace]" です。
22.2.6.12 RegExp.prototype [ %Symbol.search% ] ( string )
このメソッドは呼び出されたとき、次の手順を実行します。
regexp を this 値とする。regexp が Object でない場合、TypeError 例外をスローする。string を ? ToString (string ) に設定する。previousLastIndex を ? Get (regexp , "lastIndex" ) とする。previousLastIndex が +0 𝔽 でない場合、? Set (regexp , "lastIndex" , +0 𝔽 , true ) を実行する。 result を ? RegExpExec (regexp , string ) とする。currentLastIndex を ? Get (regexp , "lastIndex" ) とする。SameValue (currentLastIndex , previousLastIndex ) が false である場合、? Set (regexp , "lastIndex" , previousLastIndex , true ) を実行する。 result が null である場合、-1 𝔽 を返す。? Get (result , "index" ) を返す。
このメソッドの "name" プロパティの値は "[Symbol.search]" です。
注
検索を実行するとき、この RegExp オブジェクトの "lastIndex" および "global" プロパティは無視されます。"lastIndex" プロパティは変更されません。
22.2.6.13 get RegExp.prototype.source
RegExp.prototype.source は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
regexp を this 値とする。regexp が Object でない場合、TypeError 例外をスローする。regexp が [[OriginalSource]] 内部スロットを持たない場合、SameValue (regexp , %RegExp.prototype% ) が true である場合、"(?:)" を返す。TypeError 例外をスローする。表明 : regexp は [[OriginalFlags]] 内部スロットを持つ。source を regexp .[[OriginalSource]] とする。flags を regexp .[[OriginalFlags]] とする。EscapeRegExpPattern (source , flags ) を返す。
22.2.6.13.1 EscapeRegExpPattern ( pattern , flags )
抽象操作 EscapeRegExpPattern。引数 pattern (String) および flags (String)。戻り値:String。 呼び出されると、次の手順を実行する。
flags が "v" を含む場合、patternSymbol を Pattern [+UnicodeMode, +UnicodeSetsMode] とする。そうでなく、flags が "u" を含む場合、patternSymbol を Pattern [+UnicodeMode, ~UnicodeSetsMode] とする。 そうでない場合、patternSymbol を Pattern [~UnicodeMode, ~UnicodeSetsMode] とする。 escapedPattern を、UTF-16 エンコードされた Unicode コードポイント(6.1.4 )として解釈された pattern と等価な patternSymbol 形式の String とし、その中では以下で説明されるように特定のコードポイントがエスケープされているものとする。escapedPattern は pattern と異なる場合も異ならない場合もある。ただし、escapedPattern を patternSymbol として評価することによって得られる Abstract Closure は、構築されたオブジェクトの [[RegExpMatcher]] 内部スロットによって与えられる Abstract Closure と同一に動作しなければならない。同じ pattern および flags の値を使用してこの抽象操作 を複数回呼び出した場合、同一の結果を生成しなければならない。pattern 内に現れるコードポイント / または任意の LineTerminator は、"\/" 、escapedPattern 、"/" 、および flags の文字列連結 が(適切な字句文脈において)構築された正規表現と同一に動作する RegularExpressionLiteral として構文解析できることを保証するために必要に応じて escapedPattern 内でエスケープされなければならない。たとえば、pattern が "/" である場合、escapedPattern は "\/" または "\u002F" などであってもよいが、"/" ではいけない。これは、flags が後続する /// は RegularExpressionLiteral ではなく SingleLineComment として構文解析されるためである。pattern が空の String である場合、この仕様は escapedPattern を "(?:)" とすることで満たすことができる。 escapedPattern を返す。
注
名前は似ていますが、RegExp.escape と EscapeRegExpPattern は同様の処理を実行しません。前者は文字列を pattern 内で表現するためにエスケープし、この関数は pattern を文字列として表現するためにエスケープします。
22.2.6.14 RegExp.prototype [ %Symbol.split% ] ( string , limit )
注 1
このメソッドは、string を String に変換した結果の部分文字列 を格納した Array を返します。部分文字列 は、this 値の正規表現との一致を左から右へ検索することによって決定されます。これらの出現自体は返される配列内のどの String にも含まれず、String 値を分割する役割を果たします。
this 値は空の正規表現、または空の String に一致できる正規表現であってもかまいません。この場合、正規表現は入力 String の先頭または末尾の空の部分文字列 にも、前の separator マッチの末尾の空の部分文字列 にも一致しません。(たとえば、正規表現が空の String に一致する場合、String は個々のコード単位要素に分割されます。結果配列の長さは String の長さと等しく、各部分文字列 は1つのコード単位を含みます。)バックトラッキングによってそのインデックスで空でない部分文字列 マッチが得られる場合でも、String の特定のインデックスでの最初のマッチだけが考慮されます。(たとえば、/a*?/[Symbol.split]("ab") は配列 ["a", "b"] に評価される一方、/a*/[Symbol.split]("ab") は配列 ["","b"] に評価されます。)
string が空の String である(または空の String に変換される)場合、結果は正規表現が空の String に一致できるかどうかに依存します。一致できる場合、結果配列は要素を含みません。そうでない場合、結果配列は空の String である1つの要素を含みます。
正規表現がキャプチャ括弧を含む場合、separator が一致するたびに、キャプチャ括弧の結果(undefined の結果を含む)が出力配列へ挿入されます。たとえば、
/<(\/)?([^<> ]+)>/[Symbol.split]("A<B > bold</B > and<CODE > coded</CODE > ")
は次の配列に評価されます。
["A" , undefined , "B" , "bold" , "/" , "B" , "and" , undefined , "CODE" , "coded" , "/" , "CODE" , "" ]
limit が undefined でない場合、出力配列は limit 個を超える要素を含まないよう切り詰められます。
このメソッドは呼び出されたとき、次の手順を実行します。
regexp を this 値とする。regexp が Object でない場合、TypeError 例外をスローする。string を ? ToString (string ) に設定する。speciesCtor を ? SpeciesConstructor (regexp , %RegExp% ) とする。flags を ? ToString (? Get (regexp , "flags" )) とする。flags が "u" を含むか、flags が "v" を含む場合、unicodeMatching を true とする。そうでない場合、unicodeMatching を false とする。 flags が "y" を含む場合、newFlags を flags とする。そうでない場合、newFlags を flags と "y" の文字列連結 とする。 splitter を ? Construct (speciesCtor , « regexp , newFlags ») とする。array を ! ArrayCreate (0) とする。lengthA を 0 とする。limit が undefined である場合、lim を 232 - 1 とする。そうでない場合、lim を ℝ (? ToUint32 (limit )) とする。lim = 0 である場合、array を返す。string が空の String である場合、matchResult を ? RegExpExec (splitter , string ) とする。matchResult が null でない場合、array を返す。! CreateDataPropertyOrThrow (array , "0" , string ) を実行する。 array を返す。size を string の長さとする。lastMatchEnd を 0 とする。searchIndex を lastMatchEnd とする。searchIndex < size の間、次を繰り返す。? Set (splitter , "lastIndex" , 𝔽 (searchIndex ), true ) を実行する。 matchResult を ? RegExpExec (splitter , string ) とする。matchResult が null である場合、searchIndex を AdvanceStringIndex (string , searchIndex , unicodeMatching ) に設定する。そうでない場合、matchEnd を ℝ (? ToLength (? Get (splitter , "lastIndex" ))) とする。matchEnd を min (matchEnd , size ) に設定する。matchEnd = lastMatchEnd である場合、searchIndex を AdvanceStringIndex (string , searchIndex , unicodeMatching ) に設定する。そうでない場合、substring を string の lastMatchEnd から searchIndex までの部分文字列 とする。! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (lengthA )), substring ) を実行する。 lengthA を lengthA + 1 に設定する。lengthA = lim である場合、array を返す。lastMatchEnd を matchEnd に設定する。numberOfCaptures を ? LengthOfArrayLike (matchResult ) とする。numberOfCaptures を max (numberOfCaptures - 1, 0) に設定する。captureIndex を 1 とする。captureIndex ≤ numberOfCaptures の間、次を繰り返す。nextCapture を ? Get (matchResult , ! ToString (𝔽 (captureIndex ))) とする。! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (lengthA )), nextCapture ) を実行する。 captureIndex を captureIndex + 1 に設定する。lengthA を lengthA + 1 に設定する。lengthA = lim である場合、array を返す。searchIndex を lastMatchEnd に設定する。 substring を string の lastMatchEnd から size までの部分文字列 とする。! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (lengthA )), substring ) を実行する。 array を返す。
このメソッドの "name" プロパティの値は "[Symbol.split]" です。
注 2
このメソッドは、この RegExp オブジェクトの "global" および "sticky" プロパティの値を無視します。
22.2.6.15 get RegExp.prototype.sticky
RegExp.prototype.sticky は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
regexp を this 値とする。codeUnit をコード単位 0x0079 (LATIN SMALL LETTER Y) とする。? RegExpHasFlag (regexp , codeUnit ) を返す。
22.2.6.16 RegExp.prototype.test ( string )
このメソッドは呼び出されたとき、次の手順を実行します。
regexp を this 値とする。regexp が Object でない場合、TypeError 例外をスローする。string を ? ToString (string ) に設定する。match を ? RegExpExec (regexp , string ) とする。match が null である場合、false を返す。true を返す。
22.2.6.17 RegExp.prototype.toString ( )
regexp を this 値とする。regexp が Object でない場合、TypeError 例外をスローする。pattern を ? ToString (? Get (regexp , "source" )) とする。flags を ? ToString (? Get (regexp , "flags" )) とする。result を "/" 、pattern 、"/" 、および flags の文字列連結 とする。result を返す。
注
返される String は、このオブジェクトと同じ動作を持つ別の RegExp オブジェクトに評価される RegularExpressionLiteral の形式を持ちます。
22.2.6.18 get RegExp.prototype.unicode
RegExp.prototype.unicode は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
regexp を this 値とする。codeUnit をコード単位 0x0075 (LATIN SMALL LETTER U) とする。? RegExpHasFlag (regexp , codeUnit ) を返す。
22.2.6.19 get RegExp.prototype.unicodeSets
RegExp.prototype.unicodeSets は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
regexp を this 値とする。codeUnit をコード単位 0x0076 (LATIN SMALL LETTER V) とする。? RegExpHasFlag (regexp , codeUnit ) を返す。
22.2.7 RegExp マッチングのための抽象操作
22.2.7.1 RegExpExec ( regexp , string )
抽象操作 RegExpExec。引数 regexp (Object) および string (String)。戻り値:(正常完了 (値:(Object または null )) または throw 完了 )。 呼び出されると、次の手順を実行する。
exec を ? Get (regexp , "exec" ) とする。IsCallable (exec ) が true である場合、result を ? Call (exec , regexp , « string ») とする。result が Object でなく、result が null でもない場合、TypeError 例外をスローする。result を返す。? RequireInternalSlot (regexp , [[RegExpMatcher]] ) を実行する。 ? RegExpBuiltinExec (regexp , string ) を返す。
注
呼出し可能な "exec" プロパティが見つからない場合、このアルゴリズムは組込み RegExp マッチングアルゴリズムの使用を試みるようフォールバックします。これは、正規表現を使用するほとんどの組込みアルゴリズムが "exec" の動的プロパティ検索を実行しなかった以前の版向けに書かれたコードと互換性のある動作を提供します。
22.2.7.2 RegExpBuiltinExec ( regexp , string )
抽象操作 RegExpBuiltinExec。引数 regexp (an initialized RegExp instance) および string (String)。戻り値:(正常完了 (値:(Arrayエキゾチックオブジェクト または null )) または throw 完了 )。 呼び出されると、次の手順を実行する。
length を string の長さとする。lastIndex を ℝ (? ToLength (! Get (regexp , "lastIndex" ))) とする。flags を regexp .[[OriginalFlags]] とする。flags が "g" を含む場合、global を true とする。そうでない場合、global を false とする。flags が "y" を含む場合、sticky を true とする。そうでない場合、sticky を false とする。flags が "d" を含む場合、hasIndices を true とする。そうでない場合、hasIndices を false とする。global が false かつ sticky が false である場合、lastIndex を 0 に設定する。matcher を regexp .[[RegExpMatcher]] とする。flags が "u" を含むか、flags が "v" を含む場合、fullUnicode を true とする。そうでない場合、fullUnicode を false とする。matchSucceeded を false とする。fullUnicode が true である場合、input を StringToCodePoints (string ) とする。そうでない場合、input を string の要素であるコード単位を要素とする List とする。注記 : input の各要素は文字とみなされる。matchSucceeded が false である間、次を繰り返す。lastIndex > length である場合、global が true または sticky が true である場合、? Set (regexp , "lastIndex" , +0 𝔽 , true ) を実行する。 null を返す。inputIndex を、string の要素 lastIndex から取得された文字の input 内のインデックスとする。result を matcher (input , inputIndex ) とする。result が failure である場合、sticky が true である場合、? Set (regexp , "lastIndex" , +0 𝔽 , true ) を実行する。 null を返す。lastIndex を AdvanceStringIndex (string , lastIndex , fullUnicode ) に設定する。そうでない場合、表明 : result は MatchState である。matchSucceeded を true に設定する。 endIndex を result .[[EndIndex]] とする。fullUnicode が true である場合、endIndex を GetStringIndex (string , endIndex ) に設定する。global が true または sticky が true である場合、? Set (regexp , "lastIndex" , 𝔽 (endIndex ), true ) を実行する。 capturingGroupsCount を result .[[Captures]] の要素数とする。表明 : capturingGroupsCount = regexp .[[RegExpRecord]] .[[CapturingGroupsCount]] 。表明 : capturingGroupsCount < 232 - 1。array を ! ArrayCreate (capturingGroupsCount + 1) とする。表明 : array の "length" プロパティの数学値 は capturingGroupsCount + 1 である。! CreateDataPropertyOrThrow (array , "index" , 𝔽 (lastIndex )) を実行する。 ! CreateDataPropertyOrThrow (array , "input" , string ) を実行する。 match を Match Record { [[StartIndex]] : lastIndex , [[EndIndex]] : endIndex } とする。indices を新しい空の List とする。groupNames を新しい空の List とする。match を indices に追加する。matchedSubstring を GetMatchString (string , match ) とする。! CreateDataPropertyOrThrow (array , "0" , matchedSubstring ) を実行する。 regexp がいずれかの GroupName を含む場合、groups を OrdinaryObjectCreate (null ) とする。hasGroups を true とする。そうでない場合、groups を undefined とする。hasGroups を false とする。 ! CreateDataPropertyOrThrow (array , "groups" , groups ) を実行する。 matchedGroupNames を新しい空の List とする。1 ≤ i ≤ capturingGroupsCount を満たす各整数 i について、昇順で次を行う。capture を result .[[Captures]] の i th 要素とする。capture が undefined である場合、capturedValue を undefined とする。undefined を indices に追加する。そうでない場合、captureStart を capture .[[StartIndex]] とする。captureEnd を capture .[[EndIndex]] とする。fullUnicode が true である場合、captureStart を GetStringIndex (string , captureStart ) に設定する。captureEnd を GetStringIndex (string , captureEnd ) に設定する。captureRecord を Match Record { [[StartIndex]] : captureStart , [[EndIndex]] : captureEnd } とする。capturedValue を GetMatchString (string , captureRecord ) とする。captureRecord を indices に追加する。 ! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (i )), capturedValue ) を実行する。 regexp の i th capture が GroupName を使用して定義されていた場合、groupName をその GroupName の CapturingGroupName とする。matchedGroupNames が groupName を含む場合、表明 : capturedValue は undefined である。undefined を groupNames に追加する。そうでない場合、capturedValue が undefined でない場合、groupName を matchedGroupNames に追加する。注記 : groupName という名前のグループが複数存在する場合、この時点で groups はすでに groupName プロパティを持っている場合がある。ただし、groups はすべてのプロパティが書込み可能なデータプロパティ である通常オブジェクト なので、CreateDataPropertyOrThrow の呼出しはそれでも成功することが保証される。! CreateDataPropertyOrThrow (groups , groupName , capturedValue ) を実行する。 groupName を groupNames に追加する。 そうでない場合、undefined を groupNames に追加する。 hasIndices が true である場合、indicesArray を MakeMatchIndicesIndexPairArray (string , indices , groupNames , hasGroups ) とする。! CreateDataPropertyOrThrow (array , "indices" , indicesArray ) を実行する。 array を返す。
22.2.7.3 AdvanceStringIndex ( string , index , unicode )
抽象操作 AdvanceStringIndex。引数 string (String)、index (非負整数) および unicode (Boolean)。戻り値:非負整数。 呼び出されると、次の手順を実行する。
表明 : index ≤ 253 - 1。unicode が false である場合、index + 1 を返す。length を string の長さとする。index + 1 ≥ length である場合、index + 1 を返す。codePoint を CodePointAt (string , index ) とする。index + codePoint .[[CodeUnitCount]] を返す。
22.2.7.4 GetStringIndex ( string , codePointIndex )
抽象操作 GetStringIndex。引数 string (String) および codePointIndex (非負整数)。戻り値:非負整数。 6.1.4 で説明されるように string を UTF-16 エンコードされたコードポイントの列として解釈し、そのようなインデックスが存在する場合、コードポイントインデックス codePointIndex に対応するコード単位インデックスを返します。それ以外の場合、string の長さを返します。 呼び出されると、次の手順を実行する。
string が空の String である場合、0 を返す。length を string の長さとする。codeUnitCount を 0 とする。codePointCount を 0 とする。codeUnitCount < length の間、次を繰り返す。codePointCount = codePointIndex である場合、codeUnitCount を返す。codePoint を CodePointAt (string , codeUnitCount ) とする。codeUnitCount を codeUnitCount + codePoint .[[CodeUnitCount]] に設定する。codePointCount を codePointCount + 1 に設定する。length を返す。
22.2.7.5 Match Record
Match Record は、正規表現の match または capture の開始および終了インデックスをカプセル化するために使用される Record です。
Match Record は 表 68 に列挙されるフィールドを持ちます。
表 68: Match Record のフィールド
フィールド名
値
意味
[[StartIndex]]
a non-negative integer
match が開始する(含む)文字列先頭からのコード単位数。
[[EndIndex]]
an integer ≥ [[StartIndex]]
match が終了する(含まない)文字列先頭からのコード単位数。
22.2.7.6 GetMatchString ( string , match )
抽象操作 GetMatchString。引数 string (String) および match (Matchレコード )。戻り値:String。 呼び出されると、次の手順を実行する。
表明 : match .[[StartIndex]] ≤ match .[[EndIndex]] ≤ string の長さ。string の match .[[StartIndex]] から match .[[EndIndex]] までの部分文字列 を返す。
22.2.7.7 GetMatchIndexPair ( string , match )
抽象操作 GetMatchIndexPair。引数 string (String) および match (Matchレコード )。戻り値:Array。 呼び出されると、次の手順を実行する。
表明 : match .[[StartIndex]] ≤ match .[[EndIndex]] ≤ string の長さ。CreateArrayFromList (« 𝔽 (match .[[StartIndex]] ), 𝔽 (match .[[EndIndex]] ) ») を返す。
22.2.7.8 MakeMatchIndicesIndexPairArray ( string , indices , groupNames , hasGroups )
抽象操作 MakeMatchIndicesIndexPairArray。引数 string (String)、indices (リスト (要素:(Matchレコード または undefined )))、groupNames (リスト (要素:(String または undefined ))) および hasGroups (Boolean)。戻り値:Array。 呼び出されると、次の手順を実行する。
n を indices の要素数とする。表明 : n < 232 - 1。表明 : groupNames は n - 1 個の要素を持つ。注記 : groupNames List は indices [1] から始まる indices List と整列した要素を含む。array を ! ArrayCreate (n ) とする。hasGroups が true である場合、groups を OrdinaryObjectCreate (null ) とする。そうでない場合、groups を undefined とする。 ! CreateDataPropertyOrThrow (array , "groups" , groups ) を実行する。 0 ≤ i < n を満たす各整数 i について、昇順で次を行う。matchIndices を indices [i ] とする。matchIndices が undefined でない場合、matchIndexPair を GetMatchIndexPair (string , matchIndices ) とする。そうでない場合、matchIndexPair を undefined とする。 ! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (i )), matchIndexPair ) を実行する。 i > 0 である場合、name を groupNames [i - 1] とする。name が undefined でない場合、表明 : groups は undefined ではない。注記 : name という名前のグループが複数存在する場合、この時点で groups はすでに name プロパティを持っている場合がある。ただし、groups はすべてのプロパティが書込み可能なデータプロパティ である通常オブジェクト なので、CreateDataPropertyOrThrow の呼出しはそれでも成功することが保証される。! CreateDataPropertyOrThrow (groups , name , matchIndexPair ) を実行する。 array を返す。
22.2.8 RegExp インスタンスのプロパティ
RegExp インスタンスは、RegExp prototype オブジェクト からプロパティを継承する通常オブジェクト です。RegExp インスタンスは内部スロット [[OriginalSource]] 、[[OriginalFlags]] 、[[RegExpRecord]] 、および [[RegExpMatcher]] を持ちます。[[RegExpMatcher]] 内部スロットの値は、RegExp オブジェクトの Pattern の Abstract Closure 表現です。
注
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 String Iterator オブジェクト
RegExp String Iterator は、特定の RegExp インスタンスオブジェクトに対してマッチングしながら、特定の String インスタンスオブジェクトに対する特定の反復を表すオブジェクトです。RegExp String Iterator オブジェクトには名前付きコンストラクター はありません。代わりに、RegExp String Iterator オブジェクトは RegExp インスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。
22.2.9.1 CreateRegExpStringIterator ( regexp , string , global , fullUnicode )
抽象操作 CreateRegExpStringIterator。引数 regexp (Object)、string (String)、global (Boolean) および fullUnicode (Boolean)。戻り値:Object。 呼び出されると、次の手順を実行する。
iterator を OrdinaryObjectCreate (%RegExpStringIteratorPrototype% , « [[IteratingRegExp]] , [[IteratedString]] , [[Global]] , [[Unicode]] , [[Done]] ») とする。iterator .[[IteratingRegExp]] を regexp に設定する。iterator .[[IteratedString]] を string に設定する。iterator .[[Global]] を global に設定する。iterator .[[Unicode]] を fullUnicode に設定する。iterator .[[Done]] を false に設定する。iterator を返す。
22.2.9.2 %RegExpStringIteratorPrototype% オブジェクト
%RegExpStringIteratorPrototype% オブジェクトは:
22.2.9.2.1 %RegExpStringIteratorPrototype%.next ( )
iteratorObj を this 値とする。iteratorObj が Object でない場合、TypeError 例外をスローする。iteratorObj が RegExp String Iterator Object Instance のすべての内部スロット(22.2.9.3 を参照)を持たない場合、TypeError 例外をスローする。iteratorObj .[[Done]] が true である場合、CreateIteratorResultObject (undefined , true ) を返す。regexp を iteratorObj .[[IteratingRegExp]] とする。string を iteratorObj .[[IteratedString]] とする。global を iteratorObj .[[Global]] とする。fullUnicode を iteratorObj .[[Unicode]] とする。match を ? RegExpExec (regexp , string ) とする。match が null である場合、iteratorObj .[[Done]] を true に設定する。CreateIteratorResultObject (undefined , true ) を返す。global が false である場合、iteratorObj .[[Done]] を true に設定する。CreateIteratorResultObject (match , false ) を返す。matchString を ? ToString (? Get (match , "0" )) とする。matchString が空の String である場合、thisIndex を ℝ (? ToLength (? Get (regexp , "lastIndex" ))) とする。nextIndex を AdvanceStringIndex (string , thisIndex , fullUnicode ) とする。? Set (regexp , "lastIndex" , 𝔽 (nextIndex ), true ) を実行する。 CreateIteratorResultObject (match , false ) を返す。
22.2.9.2.2 %RegExpStringIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "RegExp String Iterator" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
22.2.9.3 RegExp String Iterator インスタンスのプロパティ
RegExp String Iterator インスタンスは、%RegExpStringIteratorPrototype% イントリンシックオブジェクトからプロパティを継承する通常オブジェクト です。RegExp String Iterator インスタンスは、表 69 に列挙される内部スロットを持つ状態で最初に作成されます。
表 69: RegExp String Iterator インスタンスの内部スロット
内部スロット
型
説明
[[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 )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、newTarget をアクティブな関数オブジェクト とする。そうでない場合、newTarget を NewTarget とする。 proto を ? GetPrototypeFromConstructor (newTarget , "%Array.prototype%" ) とする。numberOfArgs を values の要素数とする。numberOfArgs = 0 である場合、! ArrayCreate (0, proto ) を返す。numberOfArgs = 1 である場合、length を values [0] とする。array を ! ArrayCreate (0, proto ) とする。length が Number でない場合、! CreateDataPropertyOrThrow (array , "0" , length ) を実行する。 intLength を 1 𝔽 とする。そうでない場合、intLength を ! ToUint32 (length ) とする。SameValueZero (intLength , length ) が false である場合、RangeError 例外をスローする。 ! Set (array , "length" , intLength , true ) を実行する。 array を返す。表明 : numberOfArgs ≥ 2。array を ? ArrayCreate (numberOfArgs , proto ) とする。k を 0 とする。k < numberOfArgs の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。itemK を values [k ] とする。! CreateDataPropertyOrThrow (array , propertyKey , itemK ) を実行する。 k を k + 1 に設定する。表明 : array の "length" プロパティの数学値 は numberOfArgs である。array を返す。
23.1.2 Array コンストラクターのプロパティ
Array コンストラクター は:
23.1.2.1 Array.from ( items [ , mapper [ , thisArg ] ] )
この関数は呼び出されたとき、次の手順を実行します。
ctor を this 値とする。mapper が undefined である場合、mapping を false とする。そうでない場合、IsCallable (mapper ) が false である場合、TypeError 例外をスローする。mapping を true とする。 usingIterator を ? GetMethod (items , %Symbol.iterator% ) とする。usingIterator が undefined でない場合、IsConstructor (ctor ) が true である場合、array を ? Construct (ctor ) とする。そうでない場合、array を ! ArrayCreate (0) とする。 iteratorRecord を ? GetIteratorFromMethod (items , usingIterator ) とする。k を 0 とする。次を繰り返す。k ≥ 253 - 1 である場合、error を ThrowCompletion (新しく作成された TypeError オブジェクト) とする。? IteratorClose (iteratorRecord , error ) を返す。 propertyKey を ! ToString (𝔽 (k )) とする。next を ? IteratorStepValue (iteratorRecord ) とする。next が done である場合、? Set (array , "length" , 𝔽 (k ), true ) を実行する。 array を返す。mapping が true である場合、mappedValue を Completion (Call (mapper , thisArg , « next , 𝔽 (k ) »)) とする。IfAbruptCloseIterator (mappedValue , iteratorRecord )。そうでない場合、mappedValue を next とする。 defineStatus を Completion (CreateDataPropertyOrThrow (array , propertyKey , mappedValue )) とする。IfAbruptCloseIterator (defineStatus , iteratorRecord )。k を k + 1 に設定する。 注記 : items は iterable ではないため、array-like オブジェクトであると仮定する。arrayLike を ! ToObject (items ) とする。length を ? LengthOfArrayLike (arrayLike ) とする。IsConstructor (ctor ) が true である場合、array を ? Construct (ctor , « 𝔽 (length ) ») とする。そうでない場合、array を ? ArrayCreate (length ) とする。 k を 0 とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kValue を ? Get (arrayLike , propertyKey ) とする。mapping が true である場合、mappedValue を ? Call (mapper , thisArg , « kValue , 𝔽 (k ) ») とする。そうでない場合、mappedValue を kValue とする。 ? CreateDataPropertyOrThrow (array , propertyKey , mappedValue ) を実行する。 k を k + 1 に設定する。? Set (array , "length" , 𝔽 (length ), true ) を実行する。 array を返す。
注
このメソッドは意図的に汎用的なファクトリーメソッドです。this 値が Array コンストラクター であることを要求しません。したがって、単一の数値引数で呼び出すことができる任意の他のコンストラクター へ移したり、それらに継承させたりできます。
23.1.2.2 Array.fromAsync ( items [ , mapper [ , thisArg ] ] )
この async 関数は呼び出されたとき、次の手順を実行します。
ctor を this 値とする。mapping を false とする。mapper が undefined でない場合、IsCallable (mapper ) が false である場合、TypeError 例外をスローする。mapping を true に設定する。iteratorRecord を undefined とする。usingAsyncIterator を ? GetMethod (items , %Symbol.asyncIterator% ) とする。usingAsyncIterator が undefined である場合、usingSyncIterator を ? GetMethod (items , %Symbol.iterator% ) とする。usingSyncIterator が undefined でない場合、iteratorRecord を CreateAsyncFromSyncIterator (? GetIteratorFromMethod (items , usingSyncIterator )) に設定する。そうでない場合、iteratorRecord を ? GetIteratorFromMethod (items , usingAsyncIterator ) に設定する。 iteratorRecord が undefined でない場合、IsConstructor (ctor ) が true である場合、array を ? Construct (ctor ) とする。そうでない場合、array を ! ArrayCreate (0) とする。 k を 0 とする。次を繰り返す。k ≥ 253 - 1 である場合、error を ThrowCompletion (新しく作成された TypeError オブジェクト) とする。? AsyncIteratorClose (iteratorRecord , error ) を返す。 propertyKey を ! ToString (𝔽 (k )) とする。nextResult を ? Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] ) とする。nextResult を ? Await (nextResult ) に設定する。nextResult が Object でない場合、TypeError 例外をスローする。done を ? IteratorComplete (nextResult ) とする。done が true である場合、? Set (array , "length" , 𝔽 (k ), true ) を実行する。 array を返す。nextValue を ? IteratorValue (nextResult ) とする。mapping が true である場合、mappedValue を Completion (Call (mapper , thisArg , « nextValue , 𝔽 (k ) »)) とする。IfAbruptCloseAsyncIterator (mappedValue , iteratorRecord )。mappedValue を Completion (Await (mappedValue )) に設定する。IfAbruptCloseAsyncIterator (mappedValue , iteratorRecord )。そうでない場合、mappedValue を nextValue とする。 defineStatus を Completion (CreateDataPropertyOrThrow (array , propertyKey , mappedValue )) とする。IfAbruptCloseAsyncIterator (defineStatus , iteratorRecord )。k を k + 1 に設定する。 そうでない場合、注記 : items は async iterable でも iterable でもないため、array-like オブジェクトであると仮定する。arrayLike を ! ToObject (items ) とする。length を ? LengthOfArrayLike (arrayLike ) とする。IsConstructor (ctor ) が true である場合、array を ? Construct (ctor , « 𝔽 (length ) ») とする。そうでない場合、array を ? ArrayCreate (length ) とする。 k を 0 とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kValue を ? Get (arrayLike , propertyKey ) とする。kValue を ? Await (kValue ) に設定する。mapping が true である場合、mappedValue を ? Call (mapper , thisArg , « kValue , 𝔽 (k ) ») とする。mappedValue を ? Await (mappedValue ) に設定する。そうでない場合、mappedValue を kValue とする。 ? CreateDataPropertyOrThrow (array , propertyKey , mappedValue ) を実行する。 k を k + 1 に設定する。? Set (array , "length" , 𝔽 (length ), true ) を実行する。 array を返す。
注
このメソッドは意図的に汎用的なファクトリーメソッドです。this 値が Array コンストラクター であることを要求しません。したがって、単一の数値引数で呼び出すことができる任意の他のコンストラクター へ移したり、それらに継承させたりできます。
23.1.2.3 Array.isArray ( arg )
この関数は呼び出されたとき、次の手順を実行します。
? IsArray (arg ) を返す。
23.1.2.4 Array.of ( ...items )
このメソッドは呼び出されたとき、次の手順を実行します。
length を items の要素数とする。lengthNumber を 𝔽 (length ) とする。ctor を this 値とする。IsConstructor (ctor ) が true である場合、array を ? Construct (ctor , « lengthNumber ») とする。そうでない場合、array を ? ArrayCreate (length ) とする。 k を 0 とする。k < length の間、次を繰り返す。kValue を items [k ] とする。propertyKey を ! ToString (𝔽 (k )) とする。? CreateDataPropertyOrThrow (array , propertyKey , kValue ) を実行する。 k を k + 1 に設定する。? Set (array , "length" , lengthNumber , true ) を実行する。 array を返す。
注
このメソッドは意図的に汎用的なファクトリーメソッドです。this 値が Array コンストラクター であることを要求しません。したがって、単一の数値引数で呼び出すことができる他のコンストラクター へ移したり、それらに継承させたりできます。
23.1.2.5 Array.prototype
Array.prototype の値は Array prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
23.1.2.6 get Array [ %Symbol.species% ]
Array[%Symbol.species%] は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
this 値を返す。
この関数の "name" プロパティの値は "get [Symbol.species]" です。
注
Array prototype メソッドは通常、this 値のコンストラクター を使用して派生オブジェクトを作成します。ただし、サブクラスコンストラクター は %Symbol.species% プロパティを再定義することによって、その既定の動作を上書きできます。
23.1.3 Array Prototype オブジェクトのプロパティ
Array prototype オブジェクト は:
%Array.prototype% です。
Array 特殊オブジェクト であり、そのようなオブジェクトに対して規定された内部メソッドを持ちます。
初期値が +0 𝔽 であり、属性 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false } を持つ "length" プロパティを持ちます。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
注
Array prototype オブジェクトは、ECMAScript 2015 仕様より前に作成された ECMAScript コードとの互換性を保証するため、Array 特殊オブジェクト であると規定されています。
23.1.3.1 Array.prototype.at ( index )
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。k を ? ToAbsoluteIndex (index , length ) とする。k < 0 または k ≥ length である場合、undefined を返す。? Get (obj , ! ToString (𝔽 (k ))) を返す。
23.1.3.2 Array.prototype.concat ( ...items )
このメソッドは、このオブジェクトの配列要素に続いて、各引数の配列要素を含む配列を返します。
呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。array を ? ArraySpeciesCreate (obj , 0) とする。nextIndex を 0 とする。obj を items の先頭に追加する。items の各要素 item について、次を行う。spreadable を ? IsConcatSpreadable (item ) とする。spreadable が true である場合、length を ? LengthOfArrayLike (item ) とする。nextIndex + length > 253 - 1 である場合、TypeError 例外をスローする。sourceIndex を 0 とする。sourceIndex < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (sourceIndex )) とする。exists を ? HasProperty (item , propertyKey ) とする。exists が true である場合、subElement を ? Get (item , propertyKey ) とする。? CreateDataPropertyOrThrow (array , ! ToString (𝔽 (nextIndex )), subElement ) を実行する。 nextIndex を nextIndex + 1 に設定する。sourceIndex を sourceIndex + 1 に設定する。そうでない場合、注記 : item は展開されるのではなく、単一の項目として追加される。nextIndex ≥ 253 - 1 である場合、TypeError 例外をスローする。? CreateDataPropertyOrThrow (array , ! ToString (𝔽 (nextIndex )), item ) を実行する。 nextIndex を nextIndex + 1 に設定する。 ? Set (array , "length" , 𝔽 (nextIndex ), true ) を実行する。 array を返す。
このメソッドの "length" プロパティは 1 𝔽 です。
注 1
手順 6 で "length" プロパティを明示的に設定するのは、items の最後の空でない要素に末尾の hole がある場合や、array が組込み Array でない場合でも、長さが正しいことを保証することを意図しています。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.2.1 IsConcatSpreadable ( obj )
抽象操作 IsConcatSpreadable。引数 obj (ECMAScript 言語値 )。戻り値:(正常完了 (値:Boolean) または throw 完了 )。 呼び出されると、次の手順を実行する。
obj が Object でない場合、false を返す。spreadable を ? Get (obj , %Symbol.isConcatSpreadable% ) とする。spreadable が undefined でない場合、ToBoolean (spreadable ) を返す。? IsArray (obj ) を返す。
23.1.3.3 Array.prototype.constructor
Array.prototype.constructor の初期値は %Array% です。
23.1.3.4 Array.prototype.copyWithin ( target , start [ , end ] )
注 1
end 引数は省略可能です。指定されていない場合、this 値の長さが使用されます。
注 2
target が負である場合、length を配列の長さとして length + target として扱われます。start が負である場合、length + start として扱われます。end が負である場合、length + end として扱われます。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。to を ? ToClampedIndex (target , length ) とする。from を ? ToClampedIndex (start , length ) とする。end が undefined である場合、final を length とする。そうでない場合、final を ? ToClampedIndex (end , length ) とする。count を min (final - from , length - to ) とする。from < to かつ to < from + count である場合、direction を -1 とする。from を from + count - 1 に設定する。to を to + count - 1 に設定する。そうでない場合、direction を 1 とする。 count > 0 の間、次を繰り返す。fromKey を ! ToString (𝔽 (from )) とする。toKey を ! ToString (𝔽 (to )) とする。fromPresent を ? HasProperty (obj , fromKey ) とする。fromPresent が true である場合、fromValue を ? Get (obj , fromKey ) とする。? Set (obj , toKey , fromValue , true ) を実行する。 そうでない場合、表明 : fromPresent は false である。? DeletePropertyOrThrow (obj , toKey ) を実行する。 from を from + direction に設定する。to を to + direction に設定する。count を count - 1 に設定する。obj を返す。
注 3
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.5 Array.prototype.entries ( )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。CreateArrayIterator (obj , key+value ) を返す。
23.1.3.6 Array.prototype.every ( callback [ , thisArg ] )
注 1
callback は3つの引数を受け取り、Boolean 値へ型強制できる値を返す関数であるべきです。every は、callback が false を返す要素を見つけるまで、配列に存在する各要素について昇順に callback を1回ずつ呼び出します。そのような要素が見つかった場合、every は直ちに false を返します。そうでない場合、every は true を返します。callback は実際に存在する配列要素についてのみ呼び出され、存在しない配列要素については呼び出されません。
thisArg パラメーターが指定された場合、callback の各呼出しで this 値として使用されます。指定されていない場合は、代わりに undefined が使用されます。
callback は、要素の値、要素のインデックス、および走査中のオブジェクトという3つの引数で呼び出されます。
every は呼び出されたオブジェクトを直接変更しませんが、callback の呼出しによってそのオブジェクトが変更される場合があります。
every によって処理される要素の範囲は、callback の最初の呼出しより前に設定されます。every の呼出し開始後に配列へ追加された要素は callback によって訪問されません。配列の既存要素が変更された場合、callback に渡される値は every がその要素を訪問した時点の値になります。every の呼出し開始後、訪問される前に削除された要素は訪問されません。every は数学における「すべてに対して」量化子のように動作します。特に、空の配列については true を返します。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。k を 0 とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ? HasProperty (obj , propertyKey ) とする。kPresent が true である場合、kValue を ? Get (obj , propertyKey ) とする。testResult を ToBoolean (? Call (callback , thisArg , « kValue , 𝔽 (k ), obj »)) とする。testResult が false である場合、false を返す。k を k + 1 に設定する。true を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.7 Array.prototype.fill ( value [ , start [ , end ] ] )
注 1
start 引数は省略可能です。指定されていない場合、+0 𝔽 が使用されます。
end 引数は省略可能です。指定されていない場合、this 値の長さが使用されます。
注 2
start が負である場合、length を配列の長さとして length + start として扱われます。end が負である場合、length + end として扱われます。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。k を ? ToClampedIndex (start , length ) とする。end が undefined である場合、final を length とする。そうでない場合、final を ? ToClampedIndex (end , length ) とする。k < final の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。? Set (obj , propertyKey , value , true ) を実行する。 k を k + 1 に設定する。obj を返す。
注 3
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.8 Array.prototype.filter ( callback [ , thisArg ] )
注 1
callback は3つの引数を受け取り、Boolean 値へ型強制できる値を返す関数であるべきです。filter は、配列の各要素について昇順に callback を1回ずつ呼び出し、callback が true を返すすべての値から新しい配列を構築します。callback は実際に存在する配列要素についてのみ呼び出され、存在しない配列要素については呼び出されません。
thisArg パラメーターが指定された場合、callback の各呼出しで this 値として使用されます。指定されていない場合は、代わりに undefined が使用されます。
callback は、要素の値、要素のインデックス、および走査中のオブジェクトという3つの引数で呼び出されます。
filter は呼び出されたオブジェクトを直接変更しませんが、callback の呼出しによってそのオブジェクトが変更される場合があります。
filter によって処理される要素の範囲は、callback の最初の呼出しより前に設定されます。filter の呼出し開始後に配列へ追加された要素は callback によって訪問されません。配列の既存要素が変更された場合、callback に渡される値は filter がその要素を訪問した時点の値になります。filter の呼出し開始後、訪問される前に削除された要素は訪問されません。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。array を ? ArraySpeciesCreate (obj , 0) とする。k を 0 とする。to を 0 とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ? HasProperty (obj , propertyKey ) とする。kPresent が true である場合、kValue を ? Get (obj , propertyKey ) とする。selected を ToBoolean (? Call (callback , thisArg , « kValue , 𝔽 (k ), obj »)) とする。selected が true である場合、? CreateDataPropertyOrThrow (array , ! ToString (𝔽 (to )), kValue ) を実行する。 to を to + 1 に設定する。k を k + 1 に設定する。array を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.9 Array.prototype.find ( predicate [ , thisArg ] )
注 1
このメソッドは、predicate が true に型強制される値を返す要素を見つけるまで、配列の各要素についてインデックスの昇順に predicate を1回ずつ呼び出します。そのような要素が見つかった場合、find は直ちにその要素値を返します。そうでない場合、find は undefined を返します。
追加情報については FindViaPredicate を参照してください。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。findRecord を ? FindViaPredicate (obj , length , ascending , predicate , thisArg ) とする。findRecord .[[Value]] を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.10 Array.prototype.findIndex ( predicate [ , thisArg ] )
注 1
このメソッドは、predicate が true に型強制される値を返す要素を見つけるまで、配列の各要素についてインデックスの昇順に predicate を1回ずつ呼び出します。そのような要素が見つかった場合、findIndex は直ちにその要素値のインデックスを返します。そうでない場合、findIndex は -1 を返します。
追加情報については FindViaPredicate を参照してください。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。findRecord を ? FindViaPredicate (obj , length , ascending , predicate , thisArg ) とする。findRecord .[[Index]] を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.11 Array.prototype.findLast ( predicate [ , thisArg ] )
注 1
このメソッドは、predicate が true に型強制される値を返す要素を見つけるまで、配列の各要素についてインデックスの降順に predicate を1回ずつ呼び出します。そのような要素が見つかった場合、findLast は直ちにその要素値を返します。そうでない場合、findLast は undefined を返します。
追加情報については FindViaPredicate を参照してください。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。findRecord を ? FindViaPredicate (obj , length , descending , predicate , thisArg ) とする。findRecord .[[Value]] を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.12 Array.prototype.findLastIndex ( predicate [ , thisArg ] )
注 1
このメソッドは、predicate が true に型強制される値を返す要素を見つけるまで、配列の各要素についてインデックスの降順に predicate を1回ずつ呼び出します。そのような要素が見つかった場合、findLastIndex は直ちにその要素値のインデックスを返します。そうでない場合、findLastIndex は -1 を返します。
追加情報については FindViaPredicate を参照してください。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。findRecord を ? FindViaPredicate (obj , length , descending , predicate , thisArg ) とする。findRecord .[[Index]] を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.12.1 FindViaPredicate ( obj , length , direction , predicate , thisArg )
抽象操作 FindViaPredicate。引数 obj (Object)、length (非負整数)、direction ((ascending または descending ))、predicate (ECMAScript 言語値 ) および thisArg (ECMAScript 言語値 )。戻り値:(正常完了 (値:レコード (フィールド:[[Index]] (整数の Number ), [[Value]] (ECMAScript 言語値 ))) または throw 完了 )。
obj は array-like オブジェクトまたは TypedArray であるべきです。この操作は、predicate が true に型強制される値を返す要素を見つけるまで、obj の各要素について、direction によって示されるインデックスの昇順または降順で predicate を1回ずつ呼び出します。その時点で、この操作は見つかった要素のインデックスと値を示す Record を返します。そのような要素が見つからない場合、この操作はインデックスに -1 𝔽 、値に undefined を指定する Record を返します。
predicate は関数であるべきです。配列の要素について呼び出されるとき、要素の値、要素のインデックス、および走査中のオブジェクトという3つの引数が渡されます。その戻り値は Boolean 値へ型強制されます。
thisArg は predicate の各呼出しに対する this 値として使用されます。
この操作は呼び出されたオブジェクトを直接変更しませんが、predicate の呼出しによってそのオブジェクトが変更される場合があります。
処理される要素の範囲は、走査の開始直前、predicate の最初の呼出しより前に設定されます。その後に配列へ追加された要素は predicate によって訪問されません。配列の既存要素が変更された場合、predicate に渡される値は、この操作がその要素を訪問した時点の値になります。走査開始後、訪問される前に削除された要素も訪問され、prototype から検索されるか、undefined になります。
呼び出されると、次の手順を実行する。
IsCallable (predicate ) が false である場合、TypeError 例外をスローする。direction が ascending である場合、indices を、0(含む)から length (含まない)までの区間 内の整数 を昇順に並べた List とする。そうでない場合、indices を、0(含む)から length (含まない)までの区間 内の整数 を降順に並べた List とする。 indices の各整数 k について、次を行う。propertyKey を ! ToString (𝔽 (k )) とする。注記 : obj が TypedArray である場合、次の Get の呼出しは正常完了 を返す。kValue を ? Get (obj , propertyKey ) とする。testResult を ? Call (predicate , thisArg , « kValue , 𝔽 (k ), obj ») とする。ToBoolean (testResult ) が true である場合、Record { [[Index]] : 𝔽 (k ), [[Value]] : kValue } を返す。Record { [[Index]] : -1 𝔽 , [[Value]] : undefined } を返す。
23.1.3.13 Array.prototype.flat ( [ depth ] )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。sourceLength を ? LengthOfArrayLike (obj ) とする。depthNumber を 1 とする。depth が undefined でない場合、depthNumber を ? ToIntegerOrInfinity (depth ) に設定する。depthNumber < 0 である場合、depthNumber を 0 に設定する。array を ? ArraySpeciesCreate (obj , 0) とする。? FlattenIntoArray (array , obj , sourceLength , 0, depthNumber ) を実行する。 array を返す。
23.1.3.13.1 FlattenIntoArray ( target , source , sourceLength , start , depth [ , mapperFunc [ , thisArg ] ] )
抽象操作 FlattenIntoArray。引数 target (Object)、source (Object)、sourceLength (非負整数)、start (非負整数) および depth ((非負整数 または +∞))および省略可能な引数 mapperFunc (関数オブジェクト ) および thisArg (ECMAScript 言語値 )。戻り値:(正常完了 (値:非負整数) または throw 完了 )。 呼び出されると、次の手順を実行する。
表明 : mapperFunc が存在する場合、IsCallable (mapperFunc ) は true であり、thisArg が存在し、depth は 1 である。targetIndex を start とする。sourceIndex を 0 とする。sourceIndex < sourceLength の間、次を繰り返す。propertyKey を ! ToString (𝔽 (sourceIndex )) とする。exists を ? HasProperty (source , propertyKey ) とする。exists が true である場合、element を ? Get (source , propertyKey ) とする。mapperFunc が存在する場合、element を ? Call (mapperFunc , thisArg , « element , 𝔽 (sourceIndex ), source ») に設定する。shouldFlatten を false とする。depth > 0 である場合、shouldFlatten を ? IsArray (element ) に設定する。shouldFlatten が true である場合、depth = +∞ である場合、newDepth を +∞ とする。そうでない場合、newDepth を depth - 1 とする。 elementLength を ? LengthOfArrayLike (element ) とする。targetIndex を ? FlattenIntoArray (target , element , elementLength , targetIndex , newDepth ) に設定する。そうでない場合、targetIndex ≥ 253 - 1 である場合、TypeError 例外をスローする。? CreateDataPropertyOrThrow (target , ! ToString (𝔽 (targetIndex )), element ) を実行する。 targetIndex を targetIndex + 1 に設定する。 sourceIndex を sourceIndex + 1 に設定する。targetIndex を返す。
23.1.3.14 Array.prototype.flatMap ( mapperFunc [ , thisArg ] )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。sourceLength を ? LengthOfArrayLike (obj ) とする。IsCallable (mapperFunc ) が false である場合、TypeError 例外をスローする。array を ? ArraySpeciesCreate (obj , 0) とする。? FlattenIntoArray (array , obj , sourceLength , 0, 1, mapperFunc , thisArg ) を実行する。 array を返す。
23.1.3.15 Array.prototype.forEach ( callback [ , thisArg ] )
注 1
callback は3つの引数を受け取る関数であるべきです。forEach は配列に存在する各要素について昇順に callback を1回ずつ呼び出します。callback は実際に存在する配列要素についてのみ呼び出され、存在しない配列要素については呼び出されません。
thisArg パラメーターが指定された場合、callback の各呼出しで this 値として使用されます。指定されていない場合は、代わりに undefined が使用されます。
callback は、要素の値、要素のインデックス、および走査中のオブジェクトという3つの引数で呼び出されます。
forEach は呼び出されたオブジェクトを直接変更しませんが、callback の呼出しによってそのオブジェクトが変更される場合があります。
forEach によって処理される要素の範囲は、callback の最初の呼出しより前に設定されます。forEach の呼出し開始後に配列へ追加された要素は callback によって訪問されません。配列の既存要素が変更された場合、callback に渡される値は forEach がその要素を訪問した時点の値になります。forEach の呼出し開始後、訪問される前に削除された要素は訪問されません。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。k を 0 とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ? HasProperty (obj , propertyKey ) とする。kPresent が true である場合、kValue を ? Get (obj , propertyKey ) とする。? Call (callback , thisArg , « kValue , 𝔽 (k ), obj ») を実行する。 k を k + 1 に設定する。undefined を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.16 Array.prototype.includes ( searchElement [ , fromIndex ] )
注 1
このメソッドは SameValueZero アルゴリズムを使用して searchElement と配列の要素を昇順に比較し、いずれかの位置で見つかった場合は true を返します。そうでない場合は false を返します。
省略可能な第2引数 fromIndex の既定値は +0 𝔽 です(すなわち、配列全体が検索されます)。配列の長さ以上である場合、false が返され、配列は検索されません。-0 𝔽 より小さい場合、配列の末尾からのオフセットとして使用され、fromIndex が計算されます。計算されたインデックスが +0 𝔽 以下である場合、配列全体が検索されます。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。length = 0 である場合、false を返す。k を ? ToClampedIndex (fromIndex , length ) とする。k < length の間、次を繰り返す。elementK を ? Get (obj , ! ToString (𝔽 (k ))) とする。SameValueZero (searchElement , elementK ) が true である場合、true を返す。k を k + 1 に設定する。false を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
注 3
このメソッドは、類似する indexOf メソッドと意図的に2つの点で異なります。第1に、IsStrictlyEqual ではなく SameValueZero アルゴリズムを使用するため、NaN の配列要素を検出できます。第2に、存在しない配列要素をスキップせず、代わりに undefined として扱います。
23.1.3.17 Array.prototype.indexOf ( searchElement [ , fromIndex ] )
このメソッドは IsStrictlyEqual アルゴリズムを使用して searchElement と配列の要素を昇順に比較し、1つ以上のインデックスで見つかった場合、そのような最小のインデックスを返します。そうでない場合、-1 𝔽 を返します。
注 1
省略可能な第2引数 fromIndex の既定値は +0 𝔽 です(すなわち、配列全体が検索されます)。配列の長さ以上である場合、-1 𝔽 が返され、配列は検索されません。-0 𝔽 より小さい場合、配列の末尾からのオフセットを計算するために使用されます。計算されたインデックスが +0 𝔽 以下である場合、配列全体が検索されます。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。length = 0 である場合、-1 𝔽 を返す。k を ? ToClampedIndex (fromIndex , length ) とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ? HasProperty (obj , propertyKey ) とする。kPresent が true である場合、elementK を ? Get (obj , propertyKey ) とする。IsStrictlyEqual (searchElement , elementK ) が true である場合、𝔽 (k ) を返す。k を k + 1 に設定する。-1 𝔽 を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.18 Array.prototype.join ( separator )
このメソッドは配列の要素を String に変換し、その後、それらの String を separator の出現で区切って連結します。separator が指定されていない場合、単一のコンマが separator として使用されます。
呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。separator が undefined である場合、separatorString を "," とする。そうでない場合、separatorString を ? ToString (separator ) とする。 result を空の String とする。k を 0 とする。k < length の間、次を繰り返す。k > 0 である場合、result を result と separatorString の文字列連結 に設定する。element を ? Get (obj , ! ToString (𝔽 (k ))) とする。element が undefined でも null でもない場合、elementString を ? ToString (element ) とする。result を result と elementString の文字列連結 に設定する。k を k + 1 に設定する。result を返す。
注
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.19 Array.prototype.keys ( )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。CreateArrayIterator (obj , key ) を返す。
23.1.3.20 Array.prototype.lastIndexOf ( searchElement [ , fromIndex ] )
注 1
このメソッドは IsStrictlyEqual アルゴリズムを使用して searchElement と配列の要素を降順に比較し、1つ以上のインデックスで見つかった場合、そのような最大のインデックスを返します。そうでない場合、-1 𝔽 を返します。
省略可能な第2引数 fromIndex の既定値は配列の長さから1を引いた値です(すなわち、配列全体が検索されます)。配列の長さ以上である場合、配列全体が検索されます。-0 𝔽 より小さい場合、配列の末尾からのオフセットを計算するために使用されます。計算されたインデックスが -0 𝔽 より小さい場合、-1 𝔽 が返されます。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。length = 0 である場合、-1 𝔽 を返す。fromIndex が存在しない場合、k を length - 1 とする。そうでない場合、k を min (? ToAbsoluteIndex (fromIndex , length ), length - 1) とする。k ≥ 0 の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ? HasProperty (obj , propertyKey ) とする。kPresent が true である場合、elementK を ? Get (obj , propertyKey ) とする。IsStrictlyEqual (searchElement , elementK ) が true である場合、𝔽 (k ) を返す。k を k - 1 に設定する。-1 𝔽 を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.21 Array.prototype.map ( callback [ , thisArg ] )
注 1
callback は3つの引数を受け取る関数であるべきです。map は配列の各要素について昇順に callback を1回ずつ呼び出し、その結果から新しい Array を構築します。callback は実際に存在する配列要素についてのみ呼び出され、存在しない配列要素については呼び出されません。
thisArg パラメーターが指定された場合、callback の各呼出しで this 値として使用されます。指定されていない場合は、代わりに undefined が使用されます。
callback は、要素の値、要素のインデックス、および走査中のオブジェクトという3つの引数で呼び出されます。
map は呼び出されたオブジェクトを直接変更しませんが、callback の呼出しによってそのオブジェクトが変更される場合があります。
map によって処理される要素の範囲は、callback の最初の呼出しより前に設定されます。map の呼出し開始後に配列へ追加された要素は callback によって訪問されません。配列の既存要素が変更された場合、callback に渡される値は map がその要素を訪問した時点の値になります。map の呼出し開始後、訪問される前に削除された要素は訪問されません。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。array を ? ArraySpeciesCreate (obj , length ) とする。k を 0 とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ? HasProperty (obj , propertyKey ) とする。kPresent が true である場合、kValue を ? Get (obj , propertyKey ) とする。mappedValue を ? Call (callback , thisArg , « kValue , 𝔽 (k ), obj ») とする。? CreateDataPropertyOrThrow (array , propertyKey , mappedValue ) を実行する。 k を k + 1 に設定する。array を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.22 Array.prototype.pop ( )
注 1
このメソッドは配列の最後の要素を削除して返します。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。length = 0 である場合、? Set (obj , "length" , +0 𝔽 , true ) を実行する。 undefined を返す。表明 : length > 0。newLength を 𝔽 (length - 1) とする。index を ! ToString (newLength ) とする。element を ? Get (obj , index ) とする。? DeletePropertyOrThrow (obj , index ) を実行する。 ? Set (obj , "length" , newLength , true ) を実行する。 element を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.23 Array.prototype.push ( ...items )
注 1
このメソッドは、引数を現れる順序で配列の末尾に追加します。配列の新しい長さを返します。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。argCount を items の要素数とする。length + argCount > 253 - 1 である場合、TypeError 例外をスローする。items の各要素 item について、次を行う。? Set (obj , ! ToString (𝔽 (length )), item , true ) を実行する。 length を length + 1 に設定する。? Set (obj , "length" , 𝔽 (length ), true ) を実行する。 𝔽 (length ) を返す。
このメソッドの "length" プロパティは 1 𝔽 です。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.24 Array.prototype.reduce ( callback [ , initialValue ] )
注 1
callback は4つの引数を受け取る関数であるべきです。reduce は、initialValue が指定されていない限り最初の要素をスキップして、配列に存在する各要素について昇順に callback を1回ずつ呼び出します。
callback は4つの引数で呼び出されます。previousValue (前回の callback 呼出しからの値)、currentValue (現在の要素の値)、currentIndex 、および走査中のオブジェクトです。callback が最初に呼び出されるとき、previousValue と currentValue は2通りの値のいずれかになります。reduce の呼出しで initialValue が指定された場合、previousValue は initialValue となり、currentValue は配列の最初の値となります。initialValue が指定されていない場合、previousValue は配列の最初の値となり、currentValue は2番目の値となります。配列が要素を含まず、initialValue が指定されていない場合は TypeError です。
reduce は呼び出されたオブジェクトを直接変更しませんが、callback の呼出しによってそのオブジェクトが変更される場合があります。
reduce によって処理される要素の範囲は、callback の最初の呼出しより前に設定されます。reduce の呼出し開始後に配列へ追加された要素は callback によって訪問されません。配列の既存要素が変更された場合、callback に渡される値は reduce がその要素を訪問した時点の値になります。reduce の呼出し開始後、訪問される前に削除された要素は訪問されません。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。length = 0 かつ initialValue が存在しない場合、TypeError 例外をスローする。k を 0 とする。accumulator を undefined とする。initialValue が存在する場合、accumulator を initialValue に設定する。そうでない場合、kPresent を false とする。kPresent が false かつ k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ? HasProperty (obj , propertyKey ) に設定する。kPresent が true である場合、accumulator を ? Get (obj , propertyKey ) に設定する。k を k + 1 に設定する。kPresent が false である場合、TypeError 例外をスローする。 k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ? HasProperty (obj , propertyKey ) とする。kPresent が true である場合、kValue を ? Get (obj , propertyKey ) とする。accumulator を ? Call (callback , undefined , « accumulator , kValue , 𝔽 (k ), obj ») に設定する。k を k + 1 に設定する。accumulator を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.25 Array.prototype.reduceRight ( callback [ , initialValue ] )
注 1
callback は4つの引数を受け取る関数であるべきです。reduceRight は、initialValue が指定されていない限り最初の呼出しをスキップして、配列に存在する各要素について降順に callback を1回ずつ呼び出します。
callback は4つの引数で呼び出されます。previousValue (前回の callback 呼出しからの値)、currentValue (現在の要素の値)、currentIndex 、および走査中のオブジェクトです。関数が最初に呼び出されるとき、previousValue と currentValue は2通りの値のいずれかになります。reduceRight の呼出しで initialValue が指定された場合、previousValue は initialValue となり、currentValue は配列の最後の値となります。initialValue が指定されていない場合、previousValue は配列の最後の値となり、currentValue は最後から2番目の値となります。配列が要素を含まず、initialValue が指定されていない場合は TypeError です。
reduceRight は呼び出されたオブジェクトを直接変更しませんが、callback の呼出しによってそのオブジェクトが変更される場合があります。
reduceRight によって処理される要素の範囲は、callback の最初の呼出しより前に設定されます。reduceRight の呼出し開始後に配列へ追加された要素は callback によって訪問されません。配列の既存要素が callback によって変更された場合、callback に渡される値は reduceRight がその要素を訪問した時点の値になります。reduceRight の呼出し開始後、訪問される前に削除された要素は訪問されません。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。length = 0 かつ initialValue が存在しない場合、TypeError 例外をスローする。k を length - 1 とする。accumulator を undefined とする。initialValue が存在する場合、accumulator を initialValue に設定する。そうでない場合、kPresent を false とする。kPresent が false かつ k ≥ 0 の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ? HasProperty (obj , propertyKey ) に設定する。kPresent が true である場合、accumulator を ? Get (obj , propertyKey ) に設定する。k を k - 1 に設定する。kPresent が false である場合、TypeError 例外をスローする。 k ≥ 0 の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ? HasProperty (obj , propertyKey ) とする。kPresent が true である場合、kValue を ? Get (obj , propertyKey ) とする。accumulator を ? Call (callback , undefined , « accumulator , kValue , 𝔽 (k ), obj ») に設定する。k を k - 1 に設定する。accumulator を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.26 Array.prototype.reverse ( )
注 1
このメソッドは配列の要素を並べ替えて順序を反転します。反転された配列を返します。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。middle を floor (length / 2) とする。lower を 0 とする。lower ≠ middle の間、次を繰り返す。upper を length - lower - 1 とする。upperP を ! ToString (𝔽 (upper )) とする。lowerP を ! ToString (𝔽 (lower )) とする。lowerExists を ? HasProperty (obj , lowerP ) とする。lowerExists が true である場合、lowerValue を ? Get (obj , lowerP ) とする。upperExists を ? HasProperty (obj , upperP ) とする。upperExists が true である場合、upperValue を ? Get (obj , upperP ) とする。lowerExists が true かつ upperExists が true である場合、? Set (obj , lowerP , upperValue , true ) を実行する。 ? Set (obj , upperP , lowerValue , true ) を実行する。 そうでなく、lowerExists が false かつ upperExists が true である場合、? Set (obj , lowerP , upperValue , true ) を実行する。 ? DeletePropertyOrThrow (obj , upperP ) を実行する。 そうでなく、lowerExists が true かつ upperExists が false である場合、? DeletePropertyOrThrow (obj , lowerP ) を実行する。 ? Set (obj , upperP , lowerValue , true ) を実行する。 そうでない場合、表明 : lowerExists と upperExists はともに false である。注記 : 操作は不要である。 lower を lower + 1 に設定する。obj を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.27 Array.prototype.shift ( )
このメソッドは配列の最初の要素を削除して返します。
呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。length = 0 である場合、? Set (obj , "length" , +0 𝔽 , true ) を実行する。 undefined を返す。first を ? Get (obj , "0" ) とする。k を 1 とする。k < length の間、次を繰り返す。from を ! ToString (𝔽 (k )) とする。to を ! ToString (𝔽 (k - 1)) とする。fromPresent を ? HasProperty (obj , from ) とする。fromPresent が true である場合、fromValue を ? Get (obj , from ) とする。? Set (obj , to , fromValue , true ) を実行する。 そうでない場合、表明 : fromPresent は false である。? DeletePropertyOrThrow (obj , to ) を実行する。 k を k + 1 に設定する。? DeletePropertyOrThrow (obj , ! ToString (𝔽 (length - 1))) を実行する。 ? Set (obj , "length" , 𝔽 (length - 1), true ) を実行する。 first を返す。
注
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.28 Array.prototype.slice ( start , end )
このメソッドは、要素 start から要素 end の直前まで(end が undefined の場合は配列の末尾まで)の配列要素を含む配列を返します。start が負である場合、length を配列の長さとして length + start として扱われます。end が負である場合、length を配列の長さとして length + end として扱われます。
呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。k を ? ToClampedIndex (start , length ) とする。end が undefined である場合、final を length とする。そうでない場合、final を ? ToClampedIndex (end , length ) とする。count を max (final - k , 0) とする。array を ? ArraySpeciesCreate (obj , count ) とする。resultIndex を 0 とする。k < final の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ? HasProperty (obj , propertyKey ) とする。kPresent が true である場合、kValue を ? Get (obj , propertyKey ) とする。? CreateDataPropertyOrThrow (array , ! ToString (𝔽 (resultIndex )), kValue ) を実行する。 k を k + 1 に設定する。resultIndex を resultIndex + 1 に設定する。? Set (array , "length" , 𝔽 (resultIndex ), true ) を実行する。 array を返す。
注 1
手順 9 で "length" プロパティを明示的に設定するのは、array が組込み Array でない場合でも長さが正しいことを保証することを意図しています。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.29 Array.prototype.some ( callback [ , thisArg ] )
注 1
callback は3つの引数を受け取り、Boolean 値へ型強制できる値を返す関数であるべきです。some は、callback が true を返す要素を見つけるまで、配列に存在する各要素について昇順に callback を1回ずつ呼び出します。そのような要素が見つかった場合、some は直ちに true を返します。そうでない場合、some は false を返します。callback は実際に存在する配列要素についてのみ呼び出され、存在しない配列要素については呼び出されません。
thisArg パラメーターが指定された場合、callback の各呼出しで this 値として使用されます。指定されていない場合は、代わりに undefined が使用されます。
callback は、要素の値、要素のインデックス、および走査中のオブジェクトという3つの引数で呼び出されます。
some は呼び出されたオブジェクトを直接変更しませんが、callback の呼出しによってそのオブジェクトが変更される場合があります。
some によって処理される要素の範囲は、callback の最初の呼出しより前に設定されます。some の呼出し開始後に配列へ追加された要素は callback によって訪問されません。配列の既存要素が変更された場合、callback に渡される値は some がその要素を訪問した時点の値になります。some の呼出し開始後、訪問される前に削除された要素は訪問されません。some は数学における「存在する」量化子のように動作します。特に、空の配列については false を返します。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。k を 0 とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ? HasProperty (obj , propertyKey ) とする。kPresent が true である場合、kValue を ? Get (obj , propertyKey ) とする。testResult を ToBoolean (? Call (callback , thisArg , « kValue , 𝔽 (k ), obj »)) とする。testResult が true である場合、true を返す。k を k + 1 に設定する。false を返す。
注 2
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.30 Array.prototype.sort ( comparator )
このメソッドはこの配列の要素を並べ替えます。comparator が undefined でない場合、2つの引数 x と y を受け取り、x < y である場合は負の Number、x > y である場合は正の Number、それ以外の場合はゼロを返す関数であるべきです。
呼び出されたとき、次の手順を実行します。
comparator が undefined でなく、IsCallable (comparator ) が false である場合、TypeError 例外をスローする。obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。sortCompare を、comparator を捕捉し、パラメーター (x , y ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。? CompareArrayElements (x , y , comparator ) を返す。 sortedList を ? SortIndexedProperties (obj , length , sortCompare , skip-holes ) とする。itemCount を sortedList の要素数とする。j を 0 とする。j < itemCount の間、次を繰り返す。? Set (obj , ! ToString (𝔽 (j )), sortedList [j ], true ) を実行する。 j を j + 1 に設定する。注記 : 手順 5 の SortIndexedProperties の呼出しは skip-holes を使用する。残りのインデックスは、検出されてソートから除外された hole の数を保持するために削除される。j < length の間、次を繰り返す。? DeletePropertyOrThrow (obj , ! ToString (𝔽 (j ))) を実行する。 j を j + 1 に設定する。obj を返す。
注 1
存在しないプロパティ値は常に undefined プロパティ値より大きいものとして比較され、undefined は常に他の任意の値より大きいものとして比較されるため(CompareArrayElements を参照)、undefined プロパティ値は常に結果の末尾にソートされ、その後に存在しないプロパティ値が続きます。
注 2
手順 5 および 6 の ToString 抽象操作 によって実行されるメソッド呼出しは、sortCompare が一貫した比較器 として動作しなくなる可能性があります。
注 3
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.30.1 SortIndexedProperties ( obj , length , sortCompare , holes )
抽象操作 SortIndexedProperties。引数 obj (Object)、length (非負整数)、sortCompare (2 つのパラメーターを持つ抽象クロージャ ) および holes ((skip-holes または read-through-holes ))。戻り値:(正常完了 (値:リスト (要素:ECMAScript 言語値 )) または throw 完了 )。 呼び出されると、次の手順を実行する。
items を新しい空の List とする。k を 0 とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。holes が skip-holes である場合、kRead を ? HasProperty (obj , propertyKey ) とする。そうでない場合、表明 : holes は read-through-holes である。kRead を true とする。 kRead が true である場合、kValue を ? Get (obj , propertyKey ) とする。kValue を items に追加する。k を k + 1 に設定する。実装定義 の順序の sortCompare の呼出し を使用して items をソートする。そのような呼出しのいずれかが中断完了 を返した場合、それ以降の sortCompare 呼出しを実行する前に停止し、その Completion Record を返す。items を返す。
ソート順序 とは、上記アルゴリズムの手順 4 完了後の items の順序です。sortCompare が items の要素に対する一貫した比較器 でない場合、ソート順序 は実装定義 です。SortIndexedProperties が Array.prototype.sort または Array.prototype.toSorted によって呼び出される場合、comparator が undefined であり、sortCompare へ引数として渡される特定の値に対する ToString のすべての適用が同じ結果を生成しない場合にも、ソート順序 は実装定義 です。
ソート順序 が実装定義 であると規定されていない限り、次の条件をすべて満たさなければなりません。
itemCount 未満の非負整数 の数学的置換 π が存在し、itemCount 未満のすべての非負整数 j について、要素 old[j ] が new[π(j )] と完全に同じでなければなりません。
そして、itemCount 未満のすべての非負整数 j および k について、ℝ (sortCompare (old[j ], old[k ])) < 0 である場合、π(j ) < π(k ) でなければなりません。
また、j < k < itemCount を満たすすべての非負整数 j および k について、ℝ (sortCompare (old[j ], old[k ])) = 0 である場合、π(j ) < π(k ) でなければなりません。すなわち、ソートは安定です。
ここでは、表記 old[j ] は手順 4 が実行される前の items [j ] を参照するために使用され、表記 new[j ] は手順 4 が実行された後の items [j ] を参照するために使用されます。
Abstract Closure または関数 comparator は、集合 values 内のすべての値 a 、b 、および c (同じ値であってもよい)について、以下の要件がすべて満たされる場合、値の集合 values に対する一貫した比較器 です。表記 a <C b は ℝ (comparator (a , b )) < 0 を意味し、a =C b は ℝ (comparator (a , b )) = 0 を意味し、a >C b は ℝ (comparator (a , b )) > 0 を意味します。
comparator (a , b ) を呼び出すと、2つの引数として特定の値の組 a と b が与えられたとき、常に同じ値 v が返されます。さらに、v は Number であり、NaN ではありません。これは、特定の a と b の組について、a <C b 、a =C b 、および a >C b のうち正確に1つが真になることを意味します。
comparator (a , b ) の呼出しは obj または obj の prototype chain 上のいかなるオブジェクトも変更しません。
a =C a (反射性)
a =C b である場合、b =C a (対称性)
a =C b かつ b =C c である場合、a =C c (=C の推移性)
a <C b かつ b <C c である場合、a <C c (<C の推移性)
a >C b かつ b >C c である場合、a >C c (>C の推移性)
注
上記の条件は、comparator が集合 values を同値類に分割し、それらの同値類が全順序付けされることを保証するために必要十分です。
23.1.3.30.2 CompareArrayElements ( x , y , comparator )
抽象操作 CompareArrayElements。引数 x (ECMAScript 言語値 )、y (ECMAScript 言語値 ) および comparator ((関数オブジェクト または undefined ))。戻り値:(正常完了 (値:Number) または 中途完了)。 呼び出されると、次の手順を実行する。
x が undefined かつ y が undefined である場合、+0 𝔽 を返す。x が undefined である場合、1 𝔽 を返す。y が undefined である場合、-1 𝔽 を返す。comparator が undefined でない場合、result を ? ToNumber (? Call (comparator , undefined , « x , y »)) とする。result が NaN である場合、+0 𝔽 を返す。result を返す。xString を ? ToString (x ) とする。yString を ? ToString (y ) とする。xSmaller を ! IsLessThan (xString , yString , true ) とする。xSmaller が true である場合、-1 𝔽 を返す。ySmaller を ! IsLessThan (yString , xString , true ) とする。ySmaller が true である場合、1 𝔽 を返す。+0 𝔽 を返す。
23.1.3.31 Array.prototype.splice ( start , deleteCount , ...items )
注 1
このメソッドは整数インデックス start から始まる配列の deleteCount 個の要素を削除し、それらを items の要素で置き換えます。削除された要素(存在する場合)を含む Array を返します。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。actualStart を ? ToClampedIndex (start , length ) とする。itemCount を items の要素数とする。start が存在しない場合、actualDeleteCount を 0 とする。そうでなく、deleteCount が存在しない場合、actualDeleteCount を length - actualStart とする。表明 : actualDeleteCount ≥ 0。 そうでない場合、dc を ? ToIntegerOrInfinity (deleteCount ) とする。actualDeleteCount を dc を 0 と length - actualStart の間にクランプした結果とする。 length + itemCount - actualDeleteCount > 253 - 1 である場合、TypeError 例外をスローする。deletedArray を ? ArraySpeciesCreate (obj , actualDeleteCount ) とする。k を 0 とする。k < actualDeleteCount の間、次を繰り返す。from を ! ToString (𝔽 (actualStart + k )) とする。? HasProperty (obj , from ) が true である場合、fromValue を ? Get (obj , from ) とする。? CreateDataPropertyOrThrow (deletedArray , ! ToString (𝔽 (k )), fromValue ) を実行する。 k を k + 1 に設定する。? Set (deletedArray , "length" , 𝔽 (actualDeleteCount ), true ) を実行する。 itemCount < actualDeleteCount である場合、k を actualStart に設定する。k < (length - actualDeleteCount ) の間、次を繰り返す。from を ! ToString (𝔽 (k + actualDeleteCount )) とする。to を ! ToString (𝔽 (k + itemCount )) とする。? HasProperty (obj , from ) が true である場合、fromValue を ? Get (obj , from ) とする。? Set (obj , to , fromValue , true ) を実行する。 そうでない場合、? DeletePropertyOrThrow (obj , to ) を実行する。 k を k + 1 に設定する。k を length に設定する。k > (length - actualDeleteCount + itemCount ) の間、次を繰り返す。? DeletePropertyOrThrow (obj , ! ToString (𝔽 (k - 1))) を実行する。 k を k - 1 に設定する。そうでなく、itemCount > actualDeleteCount である場合、k を (length - actualDeleteCount ) に設定する。k > actualStart の間、次を繰り返す。from を ! ToString (𝔽 (k + actualDeleteCount - 1)) とする。to を ! ToString (𝔽 (k + itemCount - 1)) とする。? HasProperty (obj , from ) が true である場合、fromValue を ? Get (obj , from ) とする。? Set (obj , to , fromValue , true ) を実行する。 そうでない場合、? DeletePropertyOrThrow (obj , to ) を実行する。 k を k - 1 に設定する。 k を actualStart に設定する。items の各要素 item について、次を行う。? Set (obj , ! ToString (𝔽 (k )), item , true ) を実行する。 k を k + 1 に設定する。? Set (obj , "length" , 𝔽 (length - actualDeleteCount + itemCount ), true ) を実行する。 deletedArray を返す。
注 2
手順 12 および 17 で "length" プロパティを明示的に設定するのは、オブジェクトが組込み Array でない場合でも長さが正しいことを保証することを意図しています。
注 3
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.32 Array.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 Internationalization API を含む ECMAScript 実装は、ECMA-402 で規定されるとおりにこのメソッドを実装しなければなりません。それ以外の場合、このメソッドには次の仕様が使用されます。
注 1
ECMA-402 の第1版には、このメソッドの代替仕様は含まれていませんでした。
このメソッドの省略可能なパラメーターの意味は ECMA-402 で定義されます。ECMA-402 のサポートを含まない実装は、それらのパラメーター位置を他の目的に使用してはなりません。
このメソッドは呼び出されたとき、次の手順を実行します。
array を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (array ) とする。separator を、ホスト環境 の現在のロケールに適した実装定義 のリスト区切り String 値(" , " など)とする。result を空の String とする。k を 0 とする。k < length の間、次を繰り返す。k > 0 である場合、result を result と separator の文字列連結 に設定する。element を ? Get (array , ! ToString (𝔽 (k ))) とする。element が undefined でも null でもない場合、elementString を ? ToString (? Invoke (element , "toLocaleString" )) とする。result を result と elementString の文字列連結 に設定する。k を k + 1 に設定する。result を返す。
注 2
このメソッドは配列の要素をそれぞれの toLocaleString メソッドを使用して String に変換し、その後、それらの String を実装定義 のロケール依存 separator String の出現で区切って連結します。このメソッドは toString に類似していますが、ホスト環境 の現在のロケールの慣例に対応するロケール依存の結果を生成することを意図しています。
注 3
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.33 Array.prototype.toReversed ( )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。array を ? ArrayCreate (length ) とする。k を 0 とする。k < length の間、次を繰り返す。from を ! ToString (𝔽 (length - k - 1)) とする。propertyKey を ! ToString (𝔽 (k )) とする。fromValue を ? Get (obj , from ) とする。! CreateDataPropertyOrThrow (array , propertyKey , fromValue ) を実行する。 k を k + 1 に設定する。array を返す。
23.1.3.34 Array.prototype.toSorted ( comparator )
このメソッドは呼び出されたとき、次の手順を実行します。
comparator が undefined でなく、IsCallable (comparator ) が false である場合、TypeError 例外をスローする。obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。array を ? ArrayCreate (length ) とする。sortCompare を、comparator を捕捉し、パラメーター (x , y ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。? CompareArrayElements (x , y , comparator ) を返す。 sortedList を ? SortIndexedProperties (obj , length , sortCompare , read-through-holes ) とする。j を 0 とする。j < length の間、次を繰り返す。! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (j )), sortedList [j ]) を実行する。 j を j + 1 に設定する。array を返す。
23.1.3.35 Array.prototype.toSpliced ( start , skipCount , ...items )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。actualStart を ? ToClampedIndex (start , length ) とする。insertCount を items の要素数とする。maxSkipCount を length - actualStart とする。start が存在しない場合、actualSkipCount を 0 とする。そうでなく、skipCount が存在しない場合、actualSkipCount を maxSkipCount とする。 そうでない場合、actualSkipCount を ? ToIntegerOrInfinity (skipCount ) を 0 と maxSkipCount の間にクランプした結果とする。 newLength を length + insertCount - actualSkipCount とする。表明 : newLength ≥ 0。newLength > 253 - 1 である場合、TypeError 例外をスローする。newArray を ? ArrayCreate (newLength ) とする。writeIndex を 0 とする。readIndex を actualStart + actualSkipCount とする。writeIndex < actualStart の間、次を繰り返す。propertyKey を ! ToString (𝔽 (writeIndex )) とする。iValue を ? Get (obj , propertyKey ) とする。! CreateDataPropertyOrThrow (newArray , propertyKey , iValue ) を実行する。 writeIndex を writeIndex + 1 に設定する。items の各要素 item について、次を行う。propertyKey を ! ToString (𝔽 (writeIndex )) とする。! CreateDataPropertyOrThrow (newArray , propertyKey , item ) を実行する。 writeIndex を writeIndex + 1 に設定する。writeIndex < newLength の間、次を繰り返す。propertyKey を ! ToString (𝔽 (writeIndex )) とする。from を ! ToString (𝔽 (readIndex )) とする。fromValue を ? Get (obj , from ) とする。! CreateDataPropertyOrThrow (newArray , propertyKey , fromValue ) を実行する。 writeIndex を writeIndex + 1 に設定する。readIndex を readIndex + 1 に設定する。newArray を返す。
23.1.3.36 Array.prototype.toString ( )
このメソッドは呼び出されたとき、次の手順を実行します。
array を ? ToObject (this 値) とする。func を ? Get (array , "join" ) とする。IsCallable (func ) が false である場合、func をイントリンシック関数 %Object.prototype.toString% に設定する。? Call (func , array ) を返す。
注
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.37 Array.prototype.unshift ( ...items )
このメソッドは、引数リスト内で現れる順序と配列内での順序が同じになるよう、引数を配列の先頭に追加します。
呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。argCount を items の要素数とする。argCount > 0 である場合、length + argCount > 253 - 1 である場合、TypeError 例外をスローする。k を length とする。k > 0 の間、次を繰り返す。from を ! ToString (𝔽 (k - 1)) とする。to を ! ToString (𝔽 (k + argCount - 1)) とする。fromPresent を ? HasProperty (obj , from ) とする。fromPresent が true である場合、fromValue を ? Get (obj , from ) とする。? Set (obj , to , fromValue , true ) を実行する。 そうでない場合、表明 : fromPresent は false である。? DeletePropertyOrThrow (obj , to ) を実行する。 k を k - 1 に設定する。j を 0 とする。items の各要素 item について、次を行う。? Set (obj , ! ToString (𝔽 (j )), item , true ) を実行する。 j を j + 1 に設定する。? Set (obj , "length" , 𝔽 (length + argCount ), true ) を実行する。 𝔽 (length + argCount ) を返す。
このメソッドの "length" プロパティは 1 𝔽 です。
注
このメソッドは意図的に汎用です。this 値が Array であることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
23.1.3.38 Array.prototype.values ( )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。CreateArrayIterator (obj , value ) を返す。
23.1.3.39 Array.prototype.with ( index , value )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を ? ToObject (this 値) とする。length を ? LengthOfArrayLike (obj ) とする。actualIndex を ? ToAbsoluteIndex (index , length ) とする。actualIndex < 0 または actualIndex ≥ length である場合、RangeError 例外をスローする。array を ? ArrayCreate (length ) とする。k を 0 とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。k = actualIndex である場合、fromValue を value とする。そうでない場合、fromValue を ? Get (obj , propertyKey ) とする。 ! CreateDataPropertyOrThrow (array , propertyKey , fromValue ) を実行する。 k を k + 1 に設定する。array を返す。
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% データプロパティ の初期値は、次の手順によって作成されるオブジェクトです。
unscopableList を OrdinaryObjectCreate (null ) とする。! CreateDataPropertyOrThrow (unscopableList , "at" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "copyWithin" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "entries" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "fill" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "find" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "findIndex" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "findLast" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "findLastIndex" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "flat" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "flatMap" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "includes" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "keys" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "toReversed" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "toSorted" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "toSpliced" , true ) を実行する。 ! CreateDataPropertyOrThrow (unscopableList , "values" , true ) を実行する。 unscopableList を返す。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
注
このオブジェクト自身のプロパティ名 は、ECMAScript 2015 仕様より前には Array.prototype の標準プロパティとして含まれていなかったプロパティ名 です。これらの名前は、外側のスコープでこれらの名前のいずれかを binding として使用し、その binding が binding object が Array である with 文によって隠される既存コードの動作を保持するため、with 文の binding の目的では無視されます。
"with" が unscopableList に含まれていない理由は、すでに予約語 だからです。
23.1.4 Array インスタンスのプロパティ
Array インスタンスは Array 特殊オブジェクト であり、そのようなオブジェクトに対して規定された内部メソッドを持ちます。Array インスタンスは Array prototype オブジェクト からプロパティを継承します。
Array インスタンスは "length" プロパティと、配列インデックス 名を持つ列挙可能なプロパティの集合を持ちます。
23.1.4.1 length
Array インスタンスの "length" プロパティはデータプロパティ であり、その値は、名前が配列インデックス であるすべての configurable な独自プロパティの名前より常に数値的に大きくなります。
"length" プロパティは初期状態で属性 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
注
"length" プロパティの値を減少させると、配列インデックス が古い長さの値と新しい長さの値の間にある独自配列要素が削除されるという副作用があります。ただし、non-configurable プロパティは削除できません。Array の "length" プロパティを、その配列に存在する non-configurable な配列インデックス付き プロパティの最大の数値独自プロパティ名 以下の数値に設定しようとすると、length はその non-configurable な数値独自プロパティ名 より1大きい数値に設定されます。10.4.2.1 を参照してください。
23.1.5 Array Iterator オブジェクト
Array Iterator は、特定の Array インスタンスオブジェクトに対する特定の反復を表すオブジェクトです。Array Iterator オブジェクトには名前付きコンストラクター はありません。代わりに、Array Iterator オブジェクトは Array インスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。
23.1.5.1 CreateArrayIterator ( array , kind )
抽象操作 CreateArrayIterator。引数 array (Object) および kind ((key+value 、key または value ))。戻り値:Object。 そのような iterator を返す Array メソッドの iterator オブジェクトを作成するために使用されます。 呼び出されると、次の手順を実行する。
iterator を OrdinaryObjectCreate (%ArrayIteratorPrototype% , « [[IteratedArrayLike]] , [[ArrayLikeNextIndex]] , [[ArrayLikeIterationKind]] ») とする。iterator .[[IteratedArrayLike]] を array に設定する。iterator .[[ArrayLikeNextIndex]] を 0 に設定する。iterator .[[ArrayLikeIterationKind]] を kind に設定する。iterator を返す。
23.1.5.2 %ArrayIteratorPrototype% オブジェクト
%ArrayIteratorPrototype% オブジェクトは:
23.1.5.2.1 %ArrayIteratorPrototype%.next ( )
iteratorObj を this 値とする。iteratorObj が Object でない場合、TypeError 例外をスローする。iteratorObj が Array Iterator Instance(23.1.5.3 )のすべての内部スロットを持たない場合、TypeError 例外をスローする。array を iteratorObj .[[IteratedArrayLike]] とする。array が undefined である場合、CreateIteratorResultObject (undefined , true ) を返す。index を iteratorObj .[[ArrayLikeNextIndex]] とする。kind を iteratorObj .[[ArrayLikeIterationKind]] とする。array が [[TypedArrayName]] 内部スロットを持つ場合、taRecord を ? ValidateTypedArrayBounds (array , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。そうでない場合、length を ? LengthOfArrayLike (array ) とする。 index ≥ length である場合、iteratorObj .[[IteratedArrayLike]] を undefined に設定する。CreateIteratorResultObject (undefined , true ) を返す。iteratorObj .[[ArrayLikeNextIndex]] を index + 1 に設定する。indexNumber を 𝔽 (index ) とする。kind が key である場合、result を indexNumber とする。そうでない場合、elementKey を ! ToString (indexNumber ) とする。elementValue を ? Get (array , elementKey ) とする。kind が value である場合、result を elementValue とする。そうでない場合、表明 : kind は key+value である。result を CreateArrayFromList (« indexNumber , elementValue ») とする。 CreateIteratorResultObject (result , false ) を返す。
23.1.5.2.2 %ArrayIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "Array Iterator" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
23.1.5.3 Array Iterator インスタンスのプロパティ
Array Iterator インスタンスは、%ArrayIteratorPrototype% イントリンシックオブジェクトからプロパティを継承する通常オブジェクト です。Array Iterator インスタンスは、表 70 に列挙される内部スロットを持つ状態で最初に作成されます。
表 70: Array Iterator インスタンスの内部スロット
内部スロット
型
説明
[[IteratedArrayLike]]
an Object or undefined
反復対象となっている array-like オブジェクト。
[[ArrayLikeNextIndex]]
a non-negative integer
この iterator によって次に検査される要素の整数インデックス 。
[[ArrayLikeIterationKind]]
key+value , key , or value
反復の各要素について何が返されるかを識別する値。
23.2 TypedArray オブジェクト
TypedArray は、基礎となるバイナリデータバッファ(25.1 )の array-like なビューを提供します。TypedArray 要素型 とは、TypedArray インスタンスのすべての要素が持つ基礎となるバイナリスカラーデータ型です。サポートされる各要素型について、表 71 に列挙される個別の TypedArray コンストラクター があります。表 71 内の各コンストラクター には、それぞれ対応する個別の prototype オブジェクトがあります。
表 71: 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% ( )
この関数は呼び出されたとき、次の手順を実行します。
TypeError 例外をスローする。
この関数の "length" プロパティは +0 𝔽 です。
23.2.2 %TypedArray% イントリンシックオブジェクトのプロパティ
%TypedArray% イントリンシックオブジェクトは:
値が %Function.prototype% である [[Prototype]] 内部スロットを持ちます。
値が "TypedArray" である "name" プロパティを持ちます。
次のプロパティを持ちます。
23.2.2.1 %TypedArray%.from ( source [ , mapper [ , thisArg ] ] )
このメソッドは呼び出されたとき、次の手順を実行します。
ctor を this 値とする。IsConstructor (ctor ) が false である場合、TypeError 例外をスローする。mapper が undefined である場合、mapping を false とする。そうでない場合、IsCallable (mapper ) が false である場合、TypeError 例外をスローする。mapping を true とする。 usingIterator を ? GetMethod (source , %Symbol.iterator% ) とする。usingIterator が undefined でない場合、values を ? IteratorToList (? GetIteratorFromMethod (source , usingIterator )) とする。length を values の要素数とする。targetObj を ? TypedArrayCreateFromConstructor (ctor , « 𝔽 (length ) ») とする。k を 0 とする。k < length の間、次を繰り返す。kValue を values [k ] とする。mapping が true である場合、mappedValue を ? Call (mapper , thisArg , « kValue , 𝔽 (k ) ») とする。そうでない場合、mappedValue を kValue とする。 ? TypedArraySetElement (targetObj , 𝔽 (k ), mappedValue ) を実行する。 k を k + 1 に設定する。targetObj を返す。注記 : source は iterable オブジェクトではないため、すでに array-like オブジェクトであると仮定する。arrayLike を ! ToObject (source ) とする。length を ? LengthOfArrayLike (arrayLike ) とする。targetObj を ? TypedArrayCreateFromConstructor (ctor , « 𝔽 (length ) ») とする。k を 0 とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kValue を ? Get (arrayLike , propertyKey ) とする。mapping が true である場合、mappedValue を ? Call (mapper , thisArg , « kValue , 𝔽 (k ) ») とする。そうでない場合、mappedValue を kValue とする。 ? TypedArraySetElement (targetObj , 𝔽 (k ), mappedValue ) を実行する。 k を k + 1 に設定する。targetObj を返す。
23.2.2.2 %TypedArray%.of ( ...items )
このメソッドは呼び出されたとき、次の手順を実行します。
length を items の要素数とする。ctor を this 値とする。IsConstructor (ctor ) が false である場合、TypeError 例外をスローする。newObj を ? TypedArrayCreateFromConstructor (ctor , « 𝔽 (length ) ») とする。k を 0 とする。k < length の間、次を繰り返す。kValue を items [k ] とする。? TypedArraySetElement (newObj , 𝔽 (k ), kValue ) を実行する。 k を k + 1 に設定する。newObj を返す。
23.2.2.3 %TypedArray%.prototype
%TypedArray% .prototype の初期値は %TypedArray% prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
23.2.2.4 get %TypedArray% [ %Symbol.species% ]
%TypedArray% [%Symbol.species%] は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
this 値を返す。
この関数の "name" プロパティの値は "get [Symbol.species]" です。
注
%TypedArray.prototype% メソッドは通常、this 値のコンストラクター を使用して派生オブジェクトを作成します。ただし、サブクラスコンストラクター は %Symbol.species% プロパティを再定義することによって、その既定の動作を上書きできます。
23.2.3 %TypedArray% Prototype オブジェクトのプロパティ
%TypedArray% prototype オブジェクト は:
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
%TypedArray.prototype% です。
通常オブジェクト です。
[[ViewedArrayBuffer]] または TypedArray インスタンスオブジェクトに固有のその他の内部スロットを持ちません。
23.2.3.1 %TypedArray%.prototype.at ( index )
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。k を ? ToAbsoluteIndex (index , length ) とする。k < 0 または k ≥ length である場合、undefined を返す。TypedArrayGetElement (obj , 𝔽 (k )) を返す。
23.2.3.2 get %TypedArray%.prototype.buffer
%TypedArray% .prototype.buffer は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[TypedArrayName]] ) を実行する。 表明 : obj は [[ViewedArrayBuffer]] 内部スロットを持つ。buffer を obj .[[ViewedArrayBuffer]] とする。buffer を返す。
23.2.3.3 get %TypedArray%.prototype.byteLength
%TypedArray% .prototype.byteLength は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[TypedArrayName]] ) を実行する。 表明 : obj は [[ViewedArrayBuffer]] 内部スロットを持つ。taRecord を MakeTypedArrayWithBufferWitnessRecord (obj , seq-cst ) とする。IsTypedArrayOutOfBounds (taRecord ) が true である場合、+0 𝔽 を返す。size を TypedArrayByteLength (taRecord ) とする。𝔽 (size ) を返す。
23.2.3.4 get %TypedArray%.prototype.byteOffset
%TypedArray% .prototype.byteOffset は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[TypedArrayName]] ) を実行する。 表明 : obj は [[ViewedArrayBuffer]] 内部スロットを持つ。taRecord を MakeTypedArrayWithBufferWitnessRecord (obj , seq-cst ) とする。IsTypedArrayOutOfBounds (taRecord ) が true である場合、+0 𝔽 を返す。offset を obj .[[ByteOffset]] とする。𝔽 (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 と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。targetIndex を ? ToClampedIndex (target , length ) とする。startIndex を ? ToClampedIndex (start , length ) とする。end が undefined である場合、endIndex を length とする。そうでない場合、endIndex を ? ToClampedIndex (end , length ) とする。count を min (endIndex - startIndex , length - targetIndex ) とする。count > 0 である場合、注記 : コピーは、元データのビットレベルのエンコーディングを保持する方法で実行されなければならない。buffer を obj .[[ViewedArrayBuffer]] とする。taRecord を ? ValidateTypedArrayBounds (obj , seq-cst ) に設定する。length を TypedArrayLength (taRecord ) に設定する。注記 : 上記手順の副作用によって obj のサイズが縮小されている場合があり、その場合、依然として適用可能な最長の接頭部分でコピーを続行するべきである。count を min (count , length - startIndex , length - targetIndex ) に設定する。elementSize を TypedArrayElementSize (obj ) とする。byteOffset を obj .[[ByteOffset]] とする。toByteIndex を (targetIndex × elementSize ) + byteOffset とする。fromByteIndex を (startIndex × elementSize ) + byteOffset とする。countBytes を count × elementSize とする。fromByteIndex < toByteIndex かつ toByteIndex < fromByteIndex + countBytes である場合、direction を -1 とする。fromByteIndex を fromByteIndex + countBytes - 1 に設定する。toByteIndex を toByteIndex + countBytes - 1 に設定する。そうでない場合、direction を 1 とする。 countBytes > 0 の間、次を繰り返す。表明 : fromByteIndex ≥ 0 かつ toByteIndex ≥ 0。value を GetValueFromBuffer (buffer , fromByteIndex , uint8 , true , unordered ) とする。SetValueInBuffer (buffer , toByteIndex , uint8 , value , true , unordered ) を実行する。fromByteIndex を fromByteIndex + direction に設定する。toByteIndex を toByteIndex + direction に設定する。countBytes を countBytes - 1 に設定する。obj を返す。
23.2.3.7 %TypedArray%.prototype.entries ( )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。? ValidateTypedArray (obj , seq-cst ) を実行する。 CreateArrayIterator (obj , key+value ) を返す。
23.2.3.8 %TypedArray%.prototype.every ( callback [ , thisArg ] )
このメソッドの引数の解釈と使用法は、23.1.3.6 で定義される Array.prototype.every と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。k を 0 とする。k < length の間、次を繰り返す。kValue を TypedArrayGetElement (obj , 𝔽 (k )) とする。testResult を ToBoolean (? Call (callback , thisArg , « kValue , 𝔽 (k ), obj »)) とする。testResult が false である場合、false を返す。k を k + 1 に設定する。true を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.9 %TypedArray%.prototype.fill ( value [ , start [ , end ] ] )
このメソッドの引数の解釈と使用法は、23.1.3.7 で定義される Array.prototype.fill と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。obj .[[ContentType]] が bigint である場合、value を ? ToBigInt (value ) に設定する。そうでない場合、value を ? ToNumber (value ) に設定する。 startIndex を ? ToClampedIndex (start , length ) とする。end が undefined である場合、endIndex を length とする。そうでない場合、endIndex を ? ToClampedIndex (end , length ) とする。taRecord を ? ValidateTypedArrayBounds (obj , seq-cst ) に設定する。length を TypedArrayLength (taRecord ) に設定する。endIndex を min (endIndex , length ) に設定する。k を startIndex とする。k < endIndex の間、次を繰り返す。! TypedArraySetElement (obj , 𝔽 (k ), value ) を実行する。 k を k + 1 に設定する。obj を返す。
23.2.3.10 %TypedArray%.prototype.filter ( callback [ , thisArg ] )
このメソッドの引数の解釈と使用法は、23.1.3.8 で定義される Array.prototype.filter と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。kept を新しい空の List とする。captured を 0 とする。k を 0 とする。k < length の間、次を繰り返す。kValue を TypedArrayGetElement (obj , 𝔽 (k )) とする。selected を ToBoolean (? Call (callback , thisArg , « kValue , 𝔽 (k ), obj »)) とする。selected が true である場合、kValue を kept に追加する。captured を captured + 1 に設定する。k を k + 1 に設定する。result を ? TypedArraySpeciesCreate (obj , « 𝔽 (captured ) ») とする。n を 0 とする。kept の各要素 element について、次を行う。! TypedArraySetElement (result , 𝔽 (n ), element ) を実行する。 n を n + 1 に設定する。result を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.11 %TypedArray%.prototype.find ( predicate [ , thisArg ] )
このメソッドの引数の解釈と使用法は、23.1.3.9 で定義される Array.prototype.find と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。findRecord を ? FindViaPredicate (obj , length , ascending , predicate , thisArg ) とする。findRecord .[[Value]] を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.12 %TypedArray%.prototype.findIndex ( predicate [ , thisArg ] )
このメソッドの引数の解釈と使用法は、23.1.3.10 で定義される Array.prototype.findIndex と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。findRecord を ? FindViaPredicate (obj , length , ascending , predicate , thisArg ) とする。findRecord .[[Index]] を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.13 %TypedArray%.prototype.findLast ( predicate [ , thisArg ] )
このメソッドの引数の解釈と使用法は、23.1.3.11 で定義される Array.prototype.findLast と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。findRecord を ? FindViaPredicate (obj , length , descending , predicate , thisArg ) とする。findRecord .[[Value]] を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.14 %TypedArray%.prototype.findLastIndex ( predicate [ , thisArg ] )
このメソッドの引数の解釈と使用法は、23.1.3.12 で定義される Array.prototype.findLastIndex と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。findRecord を ? FindViaPredicate (obj , length , descending , predicate , thisArg ) とする。findRecord .[[Index]] を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.15 %TypedArray%.prototype.forEach ( callback [ , thisArg ] )
このメソッドの引数の解釈と使用法は、23.1.3.15 で定義される Array.prototype.forEach と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。k を 0 とする。k < length の間、次を繰り返す。kValue を TypedArrayGetElement (obj , 𝔽 (k )) とする。? Call (callback , thisArg , « kValue , 𝔽 (k ), obj ») を実行する。 k を k + 1 に設定する。undefined を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.16 %TypedArray%.prototype.includes ( searchElement [ , fromIndex ] )
このメソッドの引数の解釈と使用法は、23.1.3.16 で定義される Array.prototype.includes と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。length = 0 である場合、false を返す。k を ? ToClampedIndex (fromIndex , length ) とする。k < length の間、次を繰り返す。elementK を TypedArrayGetElement (obj , 𝔽 (k )) とする。SameValueZero (searchElement , elementK ) が true である場合、true を返す。k を k + 1 に設定する。false を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.17 %TypedArray%.prototype.indexOf ( searchElement [ , fromIndex ] )
このメソッドの引数の解釈と使用法は、23.1.3.17 で定義される Array.prototype.indexOf と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。length = 0 である場合、-1 𝔽 を返す。k を ? ToClampedIndex (fromIndex , length ) とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ! HasProperty (obj , propertyKey ) とする。kPresent が true である場合、elementK を TypedArrayGetElement (obj , 𝔽 (k )) とする。IsStrictlyEqual (searchElement , elementK ) が true である場合、𝔽 (k ) を返す。k を k + 1 に設定する。-1 𝔽 を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.18 %TypedArray%.prototype.join ( separator )
このメソッドの引数の解釈と使用法は、23.1.3.18 で定義される Array.prototype.join と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。separator が undefined である場合、separatorString を "," とする。そうでない場合、separatorString を ? ToString (separator ) とする。 result を空の String とする。k を 0 とする。k < length の間、次を繰り返す。k > 0 である場合、result を result と separatorString の文字列連結 に設定する。element を TypedArrayGetElement (obj , 𝔽 (k )) とする。element が undefined でない場合、elementString を ! ToString (element ) とする。result を result と elementString の文字列連結 に設定する。k を k + 1 に設定する。result を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.19 %TypedArray%.prototype.keys ( )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。? ValidateTypedArray (obj , seq-cst ) を実行する。 CreateArrayIterator (obj , key ) を返す。
23.2.3.20 %TypedArray%.prototype.lastIndexOf ( searchElement [ , fromIndex ] )
このメソッドの引数の解釈と使用法は、23.1.3.20 で定義される Array.prototype.lastIndexOf と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。length = 0 である場合、-1 𝔽 を返す。fromIndex が存在しない場合、k を length - 1 とする。そうでない場合、k を min (? ToAbsoluteIndex (fromIndex , length ), length - 1) とする。k ≥ 0 の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kPresent を ! HasProperty (obj , propertyKey ) とする。kPresent が true である場合、elementK を TypedArrayGetElement (obj , 𝔽 (k )) とする。IsStrictlyEqual (searchElement , elementK ) が true である場合、𝔽 (k ) を返す。k を k - 1 に設定する。-1 𝔽 を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.21 get %TypedArray%.prototype.length
%TypedArray% .prototype.length は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[TypedArrayName]] ) を実行する。 表明 : obj は [[ViewedArrayBuffer]] および [[ArrayLength]] 内部スロットを持つ。taRecord を MakeTypedArrayWithBufferWitnessRecord (obj , seq-cst ) とする。IsTypedArrayOutOfBounds (taRecord ) が true である場合、+0 𝔽 を返す。length を TypedArrayLength (taRecord ) とする。𝔽 (length ) を返す。
この関数は汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.22 %TypedArray%.prototype.map ( callback [ , thisArg ] )
このメソッドの引数の解釈と使用法は、23.1.3.21 で定義される Array.prototype.map と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。result を ? TypedArraySpeciesCreate (obj , « 𝔽 (length ) ») とする。k を 0 とする。k < length の間、次を繰り返す。kValue を TypedArrayGetElement (obj , 𝔽 (k )) とする。mappedValue を ? Call (callback , thisArg , « kValue , 𝔽 (k ), obj ») とする。? TypedArraySetElement (result , 𝔽 (k ), mappedValue ) を実行する。 k を k + 1 に設定する。result を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.23 %TypedArray%.prototype.reduce ( callback [ , initialValue ] )
このメソッドの引数の解釈と使用法は、23.1.3.24 で定義される Array.prototype.reduce と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。length = 0 かつ initialValue が存在しない場合、TypeError 例外をスローする。k を 0 とする。accumulator を undefined とする。initialValue が存在する場合、accumulator を initialValue に設定する。そうでない場合、accumulator を TypedArrayGetElement (obj , 𝔽 (k )) に設定する。k を k + 1 に設定する。 k < length の間、次を繰り返す。kValue を TypedArrayGetElement (obj , 𝔽 (k )) とする。accumulator を ? Call (callback , undefined , « accumulator , kValue , 𝔽 (k ), obj ») に設定する。k を k + 1 に設定する。accumulator を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.24 %TypedArray%.prototype.reduceRight ( callback [ , initialValue ] )
このメソッドの引数の解釈と使用法は、23.1.3.25 で定義される Array.prototype.reduceRight と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。length = 0 かつ initialValue が存在しない場合、TypeError 例外をスローする。k を length - 1 とする。accumulator を undefined とする。initialValue が存在する場合、accumulator を initialValue に設定する。そうでない場合、accumulator を TypedArrayGetElement (obj , 𝔽 (k )) に設定する。k を k - 1 に設定する。 k ≥ 0 の間、次を繰り返す。kValue を TypedArrayGetElement (obj , 𝔽 (k )) とする。accumulator を ? Call (callback , undefined , « accumulator , kValue , 𝔽 (k ), obj ») に設定する。k を k - 1 に設定する。accumulator を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.25 %TypedArray%.prototype.reverse ( )
このメソッドの引数の解釈と使用法は、23.1.3.26 で定義される Array.prototype.reverse と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。middle を floor (length / 2) とする。lower を 0 とする。lower ≠ middle の間、次を繰り返す。upper を length - lower - 1 とする。lowerValue を TypedArrayGetElement (obj , 𝔽 (lower )) とする。upperValue を TypedArrayGetElement (obj , 𝔽 (upper )) とする。! TypedArraySetElement (obj , 𝔽 (lower ), upperValue ) を実行する。 ! TypedArraySetElement (obj , 𝔽 (upper ), lowerValue ) を実行する。 lower を lower + 1 に設定する。obj を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.26 %TypedArray%.prototype.set ( source [ , offset ] )
このメソッドは、source から値を読み取り、この TypedArray 内に複数の値を設定します。詳細は source の型に基づいて異なります。省略可能な offset 値は、この TypedArray 内で値の書込みを開始する最初の要素インデックスを示します。省略された場合、0 であるとみなされます。
呼び出されたとき、次の手順を実行します。
target を this 値とする。? RequireInternalSlot (target , [[TypedArrayName]] ) を実行する。 表明 : target は [[ViewedArrayBuffer]] 内部スロットを持つ。targetOffset を ? ToIntegerOrInfinity (offset ) とする。targetOffset < 0 である場合、RangeError 例外をスローする。source が [[TypedArrayName]] 内部スロットを持つ Object である場合、? SetTypedArrayFromTypedArray (target , targetOffset , source ) を実行する。 そうでない場合、? SetTypedArrayFromArrayLike (target , targetOffset , source ) を実行する。 undefined を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.26.1 SetTypedArrayFromArrayLike ( target , targetOffset , source )
抽象操作 SetTypedArrayFromArrayLike。引数 target (TypedArray )、targetOffset ((非負整数 または +∞)) および source (an ECMAScript language value, but not a TypedArray )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 source から値を読み取り、インデックス targetOffset から開始して target 内に複数の値を設定します。 呼び出されると、次の手順を実行する。
targetRecord を ? ValidateTypedArrayBounds (target , seq-cst ) とする。targetLength を TypedArrayLength (targetRecord ) とする。source を ? ToObject (source ) に設定する。sourceLength を ? LengthOfArrayLike (source ) とする。targetOffset = +∞ である場合、RangeError 例外をスローする。sourceLength + targetOffset > targetLength である場合、RangeError 例外をスローする。k を 0 とする。k < sourceLength の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。value を ? Get (source , propertyKey ) とする。targetIndex を 𝔽 (targetOffset + k ) とする。? TypedArraySetElement (target , targetIndex , value ) を実行する。 k を k + 1 に設定する。unused を返す。
23.2.3.26.2 SetTypedArrayFromTypedArray ( target , targetOffset , source )
抽象操作 SetTypedArrayFromTypedArray。引数 target (TypedArray )、targetOffset ((非負整数 または +∞)) および source (TypedArray )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 source から値を読み取り、インデックス targetOffset から開始して target 内に複数の値を設定します。 呼び出されると、次の手順を実行する。
targetBuffer を target .[[ViewedArrayBuffer]] とする。targetRecord を ? ValidateTypedArrayBounds (target , seq-cst ) とする。targetLength を TypedArrayLength (targetRecord ) とする。sourceBuffer を source .[[ViewedArrayBuffer]] とする。sourceRecord を ? ValidateTypedArrayBounds (source , seq-cst ) とする。sourceLength を TypedArrayLength (sourceRecord ) とする。targetType を TypedArrayElementType (target ) とする。targetElementSize を TypedArrayElementSize (target ) とする。targetByteOffset を target .[[ByteOffset]] とする。sourceType を TypedArrayElementType (source ) とする。sourceElementSize を TypedArrayElementSize (source ) とする。sourceByteOffset を source .[[ByteOffset]] とする。targetOffset = +∞ である場合、RangeError 例外をスローする。sourceLength + targetOffset > targetLength である場合、RangeError 例外をスローする。target .[[ContentType]] が source .[[ContentType]] でない場合、TypeError 例外をスローする。IsSharedArrayBuffer (sourceBuffer ) が true 、IsSharedArrayBuffer (targetBuffer ) が true 、かつ sourceBuffer .[[ArrayBufferData]] が targetBuffer .[[ArrayBufferData]] である場合、sameSharedArrayBuffer を true とする。そうでない場合、sameSharedArrayBuffer を false とする。SameValue (sourceBuffer , targetBuffer ) が true または sameSharedArrayBuffer が true である場合、sourceByteLength を TypedArrayByteLength (sourceRecord ) とする。sourceBuffer を ? CloneArrayBuffer (sourceBuffer , sourceByteOffset , sourceByteLength ) に設定する。sourceByteIndex を 0 とする。そうでない場合、sourceByteIndex を sourceByteOffset とする。 targetByteIndex を (targetOffset × targetElementSize ) + targetByteOffset とする。limit を targetByteIndex + (targetElementSize × sourceLength ) とする。sourceType が targetType である場合、注記 : 転送は、元データのビットレベルのエンコーディングを保持する方法で実行されなければならない。targetByteIndex < limit の間、次を繰り返す。value を GetValueFromBuffer (sourceBuffer , sourceByteIndex , uint8 , true , unordered ) とする。SetValueInBuffer (targetBuffer , targetByteIndex , uint8 , value , true , unordered ) を実行する。sourceByteIndex を sourceByteIndex + 1 に設定する。targetByteIndex を targetByteIndex + 1 に設定する。そうでない場合、targetByteIndex < limit の間、次を繰り返す。value を GetValueFromBuffer (sourceBuffer , sourceByteIndex , sourceType , true , unordered ) とする。SetValueInBuffer (targetBuffer , targetByteIndex , targetType , value , true , unordered ) を実行する。sourceByteIndex を sourceByteIndex + sourceElementSize に設定する。targetByteIndex を targetByteIndex + targetElementSize に設定する。 unused を返す。
23.2.3.27 %TypedArray%.prototype.slice ( start , end )
このメソッドの引数の解釈と使用法は、23.1.3.28 で定義される Array.prototype.slice と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。sourceArrayLength を TypedArrayLength (taRecord ) とする。startIndex を ? ToClampedIndex (start , sourceArrayLength ) とする。end が undefined である場合、endIndex を sourceArrayLength とする。そうでない場合、endIndex を ? ToClampedIndex (end , sourceArrayLength ) とする。countBytes を max (endIndex - startIndex , 0) とする。resultArray を ? TypedArraySpeciesCreate (obj , « 𝔽 (countBytes ) ») とする。countBytes > 0 である場合、taRecord を ? ValidateTypedArrayBounds (obj , seq-cst ) に設定する。endIndex を min (endIndex , TypedArrayLength (taRecord )) に設定する。countBytes を max (endIndex - startIndex , 0) に設定する。sourceType を TypedArrayElementType (obj ) とする。targetType を TypedArrayElementType (resultArray ) とする。sourceType が targetType である場合、注記 : 転送は、元データのビットレベルのエンコーディングを保持する方法で実行されなければならない。sourceBuffer を obj .[[ViewedArrayBuffer]] とする。targetBuffer を resultArray .[[ViewedArrayBuffer]] とする。elementSize を TypedArrayElementSize (obj ) とする。sourceByteOffset を obj .[[ByteOffset]] とする。sourceByteIndex を (startIndex × elementSize ) + sourceByteOffset とする。targetByteIndex を resultArray .[[ByteOffset]] とする。endByteIndex を targetByteIndex + (countBytes × elementSize ) とする。targetByteIndex < endByteIndex の間、次を繰り返す。value を GetValueFromBuffer (sourceBuffer , sourceByteIndex , uint8 , true , unordered ) とする。SetValueInBuffer (targetBuffer , targetByteIndex , uint8 , value , true , unordered ) を実行する。sourceByteIndex を sourceByteIndex + 1 に設定する。targetByteIndex を targetByteIndex + 1 に設定する。そうでない場合、n を 0 とする。k を startIndex とする。k < endIndex の間、次を繰り返す。kValue を TypedArrayGetElement (obj , 𝔽 (k )) とする。! TypedArraySetElement (resultArray , 𝔽 (n ), kValue ) を実行する。 k を k + 1 に設定する。n を n + 1 に設定する。 resultArray を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.28 %TypedArray%.prototype.some ( callback [ , thisArg ] )
このメソッドの引数の解釈と使用法は、23.1.3.29 で定義される Array.prototype.some と同じです。
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。k を 0 とする。k < length の間、次を繰り返す。kValue を TypedArrayGetElement (obj , 𝔽 (k )) とする。testResult を ToBoolean (? Call (callback , thisArg , « kValue , 𝔽 (k ), obj »)) とする。testResult が true である場合、true を返す。k を k + 1 に設定する。false を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.29 %TypedArray%.prototype.sort ( comparator )
これは個別のメソッドであり、以下で説明する点を除き、23.1.3.30 で定義される Array.prototype.sort と同じ要件を実装します。このメソッドの実装は、this 値が固定長を持ち、整数インデックス 付きプロパティが疎でないオブジェクトであることを利用して最適化してもかまいません。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
呼び出されたとき、次の手順を実行します。
comparator が undefined でなく、IsCallable (comparator ) が false である場合、TypeError 例外をスローする。obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。注記 : 次の closure は 23.1.3.30 で使用される文字列比較ではなく、数値比較を実行する。sortCompare を、comparator を捕捉し、パラメーター (x , y ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。? CompareTypedArrayElements (x , y , comparator ) を返す。 sortedList を ? SortIndexedProperties (obj , length , sortCompare , read-through-holes ) とする。j を 0 とする。j < length の間、次を繰り返す。! TypedArraySetElement (obj , 𝔽 (j ), sortedList [j ]) を実行する。 j を j + 1 に設定する。obj を返す。
注
NaN は常に他の任意の値より大きいものとして比較されるため(CompareTypedArrayElements を参照)、comparator が指定されていない場合、NaN プロパティ値は常に結果の末尾にソートされます。
23.2.3.30 %TypedArray%.prototype.subarray ( start , end )
このメソッドは、要素型がこの TypedArray の要素型であり、ArrayBuffer がこの TypedArray の ArrayBuffer であり、start (含む)から end (含まない)までの区間 の要素を参照する新しい TypedArray を返します。start または end のいずれかが負である場合、配列の先頭からではなく、末尾からのインデックスを参照します。
呼び出されたとき、次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[TypedArrayName]] ) を実行する。 表明 : obj は [[ViewedArrayBuffer]] 内部スロットを持つ。buffer を obj .[[ViewedArrayBuffer]] とする。sourceRecord を MakeTypedArrayWithBufferWitnessRecord (obj , seq-cst ) とする。IsTypedArrayOutOfBounds (sourceRecord ) が true である場合、sourceLength を 0 とする。そうでない場合、sourceLength を TypedArrayLength (sourceRecord ) とする。 startIndex を ? ToClampedIndex (start , sourceLength ) とする。elementSize を TypedArrayElementSize (obj ) とする。sourceByteOffset を obj .[[ByteOffset]] とする。beginByteOffset を sourceByteOffset + (startIndex × elementSize ) とする。obj .[[ArrayLength]] が auto であり、end が undefined である場合、? TypedArraySpeciesCreate (obj , « buffer , 𝔽 (beginByteOffset ) ») を返す。 end が undefined である場合、endIndex を sourceLength とする。そうでない場合、endIndex を ? ToClampedIndex (end , sourceLength ) とする。newLength を max (endIndex - startIndex , 0) とする。? TypedArraySpeciesCreate (obj , « buffer , 𝔽 (beginByteOffset ), 𝔽 (newLength ) ») を返す。
このメソッドは汎用ではありません。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。
23.2.3.31 %TypedArray%.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
これは個別のメソッドであり、"length" の [[Get]] を実行する代わりに TypedArrayLength が呼び出される点を除き、23.1.3.32 で定義される Array.prototype.toLocaleString と同じアルゴリズムを実装します。基礎となるバッファが resizable でない場合に this 値が固定長を持ち、整数インデックス 付きプロパティが疎でないことを利用して、アルゴリズムの実装を最適化してもかまいません。ただし、そのような最適化は、規定されたアルゴリズムの動作に観測可能な変更を導入してはなりません。
このメソッドは汎用ではありません。アルゴリズムを評価する前に、this 値および seq-cst を引数として ValidateTypedArray が呼び出されます。その結果が中断完了 である場合、アルゴリズムを評価する代わりにその例外がスローされます。
注
ECMAScript 実装が ECMA-402 Internationalization API を含む場合、このメソッドは ECMA-402 内の Array.prototype.toLocaleString のアルゴリズムに基づきます。
23.2.3.32 %TypedArray%.prototype.toReversed ( )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。resultArray を ? TypedArrayCreateSameType (obj , length ) とする。k を 0 とする。k < length の間、次を繰り返す。from を length - k - 1 とする。fromValue を TypedArrayGetElement (obj , 𝔽 (from )) とする。! TypedArraySetElement (resultArray , 𝔽 (k ), fromValue ) を実行する。 k を k + 1 に設定する。resultArray を返す。
23.2.3.33 %TypedArray%.prototype.toSorted ( comparator )
このメソッドは呼び出されたとき、次の手順を実行します。
comparator が undefined でなく、IsCallable (comparator ) が false である場合、TypeError 例外をスローする。obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。resultArray を ? TypedArrayCreateSameType (obj , length ) とする。注記 : 次の closure は 23.1.3.34 で使用される文字列比較ではなく、数値比較を実行する。sortCompare を、comparator を捕捉し、パラメーター (x , y ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。? CompareTypedArrayElements (x , y , comparator ) を返す。 sortedList を ? SortIndexedProperties (obj , length , sortCompare , read-through-holes ) とする。j を 0 とする。j < length の間、次を繰り返す。! TypedArraySetElement (resultArray , 𝔽 (j ), sortedList [j ]) を実行する。 j を j + 1 に設定する。resultArray を返す。
23.2.3.34 %TypedArray%.prototype.toString ( )
"toString" プロパティの初期値は、23.1.3.36 で定義される %Array.prototype.toString% です。
23.2.3.35 %TypedArray%.prototype.values ( )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。? ValidateTypedArray (obj , seq-cst ) を実行する。 CreateArrayIterator (obj , value ) を返す。
23.2.3.36 %TypedArray%.prototype.with ( index , value )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。taRecord を ? ValidateTypedArray (obj , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。actualIndex を ? ToAbsoluteIndex (index , length ) とする。obj .[[ContentType]] が bigint である場合、numericValue を ? ToBigInt (value ) とする。そうでない場合、numericValue を ? ToNumber (value ) とする。 IsValidIntegerIndex (obj , 𝔽 (actualIndex )) が false である場合、RangeError 例外をスローする。resultArray を ? TypedArrayCreateSameType (obj , length ) とする。k を 0 とする。k < length の間、次を繰り返す。k = actualIndex である場合、fromValue を numericValue とする。そうでない場合、fromValue を TypedArrayGetElement (obj , 𝔽 (k )) とする。 ! TypedArraySetElement (resultArray , 𝔽 (k ), fromValue ) を実行する。 k を k + 1 に設定する。resultArray を返す。
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 アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。obj が Object でない場合、undefined を返す。obj が [[TypedArrayName]] 内部スロットを持たない場合、undefined を返す。name を obj .[[TypedArrayName]] とする。表明 : name は String である。name を返す。
このプロパティは属性 { [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
この関数の "name" プロパティの初期値は "get [Symbol.toStringTag]" です。
23.2.4 TypedArray オブジェクトのための抽象操作
23.2.4.1 TypedArrayCreateFromConstructor ( ctor , argList )
抽象操作 TypedArrayCreateFromConstructor。引数 ctor (コンストラクター ) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(正常完了 (値:TypedArray ) または throw 完了 )。 コンストラクター 関数を使用して新しい TypedArray を作成することを規定するために使用されます。 呼び出されると、次の手順を実行する。
ta を ? Construct (ctor , argList ) とする。taRecord を ? ValidateTypedArray (ta , seq-cst ) とする。表明 : ta は TypedArray インスタンスのプロパティ で言及されるすべての内部スロットを持つ。argList の要素数が 1 であり、argList [0] が Number である場合、IsTypedArrayOutOfBounds (taRecord ) が true である場合、TypeError 例外をスローする。length を TypedArrayLength (taRecord ) とする。length < ℝ (argList [0]) である場合、TypeError 例外をスローする。ta を返す。
23.2.4.2 TypedArrayCreateSameType ( exemplar , length )
抽象操作 TypedArrayCreateSameType。引数 exemplar (TypedArray ) および length (非負整数)。戻り値:(正常完了 (値:TypedArray ) または throw 完了 )。 exemplar から派生したコンストラクター 関数を使用して新しい TypedArray を作成することを規定するために使用されます。%Symbol.species% の使用によってカスタム TypedArray サブクラスを構築できる TypedArraySpeciesCreate とは異なり、この操作は常に組込み TypedArray コンストラクター のいずれかを使用します。 呼び出されると、次の手順を実行する。
ctor を、表 71 内のコンストラクター 名 exemplar .[[TypedArrayName]] に関連付けられたイントリンシックオブジェクトとする。result を ? TypedArrayCreateFromConstructor (ctor , « 𝔽 (length ) ») とする。表明 : result は [[TypedArrayName]] および [[ContentType]] 内部スロットを持つ。表明 : result .[[ContentType]] は exemplar .[[ContentType]] である。result を返す。
23.2.4.3 TypedArraySpeciesCreate ( exemplar , argList )
抽象操作 TypedArraySpeciesCreate。引数 exemplar (TypedArray ) および argList (リスト (要素:ECMAScript 言語値 ))。戻り値:(正常完了 (値:TypedArray ) または throw 完了 )。 exemplar から派生したコンストラクター 関数を使用して新しい TypedArray を作成することを規定するために使用されます。%Symbol.species% の使用によって Array ではないオブジェクトを作成できる ArraySpeciesCreate とは異なり、この操作はコンストラクター 関数が実際の TypedArray を作成することを強制します。 呼び出されると、次の手順を実行する。
defaultCtor を、表 71 内のコンストラクター 名 exemplar .[[TypedArrayName]] に関連付けられたイントリンシックオブジェクトとする。ctor を ? SpeciesConstructor (exemplar , defaultCtor ) とする。result を ? TypedArrayCreateFromConstructor (ctor , argList ) とする。result .[[ContentType]] が exemplar .[[ContentType]] でない場合、TypeError 例外をスローする。result を返す。
23.2.4.4 ValidateTypedArray ( obj , order )
抽象操作 ValidateTypedArray。引数 obj (ECMAScript 言語値 ) および order ((seq-cst または unordered ))。戻り値:(正常完了 (値:TypedArray With Buffer Witnessレコード ) または throw 完了 )。 呼び出されると、次の手順を実行する。
? RequireInternalSlot (obj , [[TypedArrayName]] ) を実行する。 表明 : obj は [[ViewedArrayBuffer]] 内部スロットを持つ。? ValidateTypedArrayBounds (obj , order ) を返す。
23.2.4.5 ValidateTypedArrayBounds ( ta , order )
抽象操作 ValidateTypedArrayBounds。引数 ta (TypedArray ) および order ((seq-cst または unordered ))。戻り値:(正常完了 (値:TypedArray With Buffer Witnessレコード ) または throw 完了 )。 ta が基礎となるバッファの範囲を超えていないことを検証します。 呼び出されると、次の手順を実行する。
taRecord を MakeTypedArrayWithBufferWitnessRecord (ta , order ) とする。IsTypedArrayOutOfBounds (taRecord ) が true である場合、TypeError 例外をスローする。taRecord を返す。
23.2.4.6 TypedArrayElementSize ( obj )
抽象操作 TypedArrayElementSize。引数 obj (TypedArray )。戻り値:非負整数。 呼び出されると、次の手順を実行する。
obj .[[TypedArrayName]] について 表 71 で規定される Element Size 値を返す。
23.2.4.7 TypedArrayElementType ( obj )
抽象操作 TypedArrayElementType。引数 obj (TypedArray )。戻り値:TypedArray 要素型 。 呼び出されると、次の手順を実行する。
obj .[[TypedArrayName]] について 表 71 で規定される Element Type 値を返す。
23.2.4.8 CompareTypedArrayElements ( x , y , comparator )
抽象操作 CompareTypedArrayElements。引数 x ((Number または BigInt))、y ((Number または BigInt)) および comparator ((関数オブジェクト または undefined ))。戻り値:(正常完了 (値:Number) または 中途完了)。 呼び出されると、次の手順を実行する。
表明 : x が Number かつ y が Number、または x が BigInt かつ y が BigInt である。comparator が undefined でない場合、result を ? ToNumber (? Call (comparator , undefined , « x , y »)) とする。result が NaN である場合、+0 𝔽 を返す。result を返す。x が NaN かつ y が NaN である場合、+0 𝔽 を返す。x が NaN である場合、1 𝔽 を返す。y が NaN である場合、-1 𝔽 を返す。x < y である場合、-1 𝔽 を返す。x > y である場合、1 𝔽 を返す。x が -0 𝔽 かつ y が +0 𝔽 である場合、-1 𝔽 を返す。x が +0 𝔽 かつ y が -0 𝔽 である場合、1 𝔽 を返す。+0 𝔽 を返す。
注
これは
23.1.3.30.2 で使用される文字列比較ではなく、数値比較を実行します。
23.2.5 TypedArray コンストラクター
各 TypedArray コンストラクター は:
特に別段の規定がある場合を除き、表 71 において、コンストラクター 名として TypedArray の代わりに使用される名前だけが異なる、以下で説明する構造を持つイントリンシックオブジェクトです。
引数の数と型に基づいて動作が異なる関数です。TypedArray の呼出しの実際の動作は、それに渡される引数の数と種類に依存します。
関数として呼び出されることを意図しておらず、そのように呼び出されると例外をスローします。
クラス定義の extends 節の値として使用できます。規定された TypedArray の動作を継承しようとするサブクラスコンストラクター は、%TypedArray% .prototype の組込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するため、TypedArray コンストラクター への super 呼出しを含まなければなりません。
23.2.5.1 TypedArray ( ...args )
各 TypedArray コンストラクター は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 ctorName を、この TypedArray コンストラクター について 表 71 で規定される Constructor Name 値の String 値とする。proto を "%TypedArray .prototype%" とする。numberOfArgs を args の要素数とする。numberOfArgs = 0 である場合、? AllocateTypedArray (ctorName , NewTarget, proto , 0) を返す。firstArg を args [0] とする。firstArg が Object である場合、obj を ? AllocateTypedArray (ctorName , NewTarget, proto ) とする。firstArg が [[TypedArrayName]] 内部スロットを持つ場合、? InitializeTypedArrayFromTypedArray (obj , firstArg ) を実行する。 そうでなく、firstArg が [[ArrayBufferData]] 内部スロットを持つ場合、numberOfArgs > 1 である場合、byteOffset を args [1] とする。そうでない場合、byteOffset を undefined とする。numberOfArgs > 2 である場合、length を args [2] とする。そうでない場合、length を undefined とする。? InitializeTypedArrayFromArrayBuffer (obj , firstArg , byteOffset , length ) を実行する。 そうでない場合、表明 : firstArg は Object であり、[[TypedArrayName]] または [[ArrayBufferData]] 内部スロットのいずれも持たない。usingIterator を ? GetMethod (firstArg , %Symbol.iterator% ) とする。usingIterator が undefined でない場合、values を ? IteratorToList (? GetIteratorFromMethod (firstArg , usingIterator )) とする。? InitializeTypedArrayFromList (obj , values ) を実行する。 そうでない場合、注記 : firstArg は iterable オブジェクトではないため、すでに array-like オブジェクトであると仮定する。? InitializeTypedArrayFromArrayLike (obj , firstArg ) を実行する。 obj を返す。表明 : firstArg は Object ではない。elementLength を ? ToIndex (firstArg ) とする。? AllocateTypedArray (ctorName , NewTarget, proto , elementLength ) を返す。
23.2.5.1.1 AllocateTypedArray ( ctorName , newTarget , defaultProto [ , length ] )
抽象操作 AllocateTypedArray。引数 ctorName (a String which is the name of a TypedArray constructor in 表 71 )、newTarget (コンストラクター ) および defaultProto (String)および省略可能な引数 length (非負整数)。戻り値:(正常完了 (値:TypedArray ) または throw 完了 )。 TypedArray コンストラクター のインスタンスを検証して作成するために使用されます。length 引数が渡された場合、その長さの ArrayBuffer も割り当てられ、新しい TypedArray インスタンスに関連付けられます。AllocateTypedArray は TypedArray によって使用される共通の意味論を提供します。 呼び出されると、次の手順を実行する。
proto を ? GetPrototypeFromConstructor (newTarget , defaultProto ) とする。obj を TypedArrayCreate (proto ) とする。表明 : obj .[[ViewedArrayBuffer]] は undefined である。obj .[[TypedArrayName]] を ctorName に設定する。ctorName が "BigInt64Array" または "BigUint64Array" のいずれかである場合、obj .[[ContentType]] を bigint に設定する。そうでない場合、obj .[[ContentType]] を number に設定する。 length が存在しない場合、obj .[[ByteLength]] を 0 に設定する。obj .[[ByteOffset]] を 0 に設定する。obj .[[ArrayLength]] を 0 に設定する。そうでない場合、? AllocateTypedArrayBuffer (obj , length ) を実行する。 obj を返す。
23.2.5.1.2 InitializeTypedArrayFromTypedArray ( obj , sourceArray )
抽象操作 InitializeTypedArrayFromTypedArray。引数 obj (TypedArray ) および sourceArray (TypedArray )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
sourceData を sourceArray .[[ViewedArrayBuffer]] とする。elementType を TypedArrayElementType (obj ) とする。elementSize を TypedArrayElementSize (obj ) とする。sourceType を TypedArrayElementType (sourceArray ) とする。sourceElementSize を TypedArrayElementSize (sourceArray ) とする。sourceByteOffset を sourceArray .[[ByteOffset]] とする。sourceRecord を ? ValidateTypedArrayBounds (sourceArray , seq-cst ) とする。elementLength を TypedArrayLength (sourceRecord ) とする。byteLength を elementSize × elementLength とする。elementType が sourceType である場合、data を ? CloneArrayBuffer (sourceData , sourceByteOffset , byteLength ) とする。そうでない場合、data を ? AllocateArrayBuffer (%ArrayBuffer% , byteLength ) とする。sourceArray .[[ContentType]] が obj .[[ContentType]] でない場合、TypeError 例外をスローする。sourceByteIndex を sourceByteOffset とする。targetByteIndex を 0 とする。count を elementLength とする。count > 0 の間、次を繰り返す。value を GetValueFromBuffer (sourceData , sourceByteIndex , sourceType , true , unordered ) とする。SetValueInBuffer (data , targetByteIndex , elementType , value , true , unordered ) を実行する。sourceByteIndex を sourceByteIndex + sourceElementSize に設定する。targetByteIndex を targetByteIndex + elementSize に設定する。count を count - 1 に設定する。 obj .[[ViewedArrayBuffer]] を data に設定する。obj .[[ByteLength]] を byteLength に設定する。obj .[[ByteOffset]] を 0 に設定する。obj .[[ArrayLength]] を elementLength に設定する。unused を返す。
23.2.5.1.3 InitializeTypedArrayFromArrayBuffer ( obj , buffer , byteOffset , length )
抽象操作 InitializeTypedArrayFromArrayBuffer。引数 obj (TypedArray )、buffer ((ArrayBuffer または SharedArrayBuffer))、byteOffset (ECMAScript 言語値 ) および length (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
elementSize を TypedArrayElementSize (obj ) とする。offset を ? ToIndex (byteOffset ) とする。offset modulo elementSize ≠ 0 である場合、RangeError 例外をスローする。bufferIsFixedLength を IsFixedLengthArrayBuffer (buffer ) とする。length が undefined でない場合、newLength を ? ToIndex (length ) とする。IsDetachedBuffer (buffer ) が true である場合、TypeError 例外をスローする。bufferByteLength を ArrayBufferByteLength (buffer , seq-cst ) とする。length が undefined かつ bufferIsFixedLength が false である場合、offset > bufferByteLength である場合、RangeError 例外をスローする。obj .[[ByteLength]] を auto に設定する。obj .[[ArrayLength]] を auto に設定する。そうでない場合、length が undefined である場合、bufferByteLength modulo elementSize ≠ 0 である場合、RangeError 例外をスローする。newByteLength を bufferByteLength - offset とする。newByteLength < 0 である場合、RangeError 例外をスローする。そうでない場合、newByteLength を newLength × elementSize とする。offset + newByteLength > bufferByteLength である場合、RangeError 例外をスローする。 obj .[[ByteLength]] を newByteLength に設定する。obj .[[ArrayLength]] を newByteLength / elementSize に設定する。 obj .[[ViewedArrayBuffer]] を buffer に設定する。obj .[[ByteOffset]] を offset に設定する。unused を返す。
23.2.5.1.4 InitializeTypedArrayFromList ( obj , values )
抽象操作 InitializeTypedArrayFromList。引数 obj (TypedArray ) および values (リスト (要素:ECMAScript 言語値 ))。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
length を values の要素数とする。? AllocateTypedArrayBuffer (obj , length ) を実行する。 k を 0 とする。k < length の間、次を繰り返す。kValue を values [k ] とする。? TypedArraySetElement (obj , 𝔽 (k ), kValue ) を実行する。 k を k + 1 に設定する。unused を返す。
23.2.5.1.5 InitializeTypedArrayFromArrayLike ( obj , arrayLike )
抽象操作 InitializeTypedArrayFromArrayLike。引数 obj (TypedArray ) および arrayLike (an Object, but not a TypedArray or an ArrayBuffer)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
length を ? LengthOfArrayLike (arrayLike ) とする。? AllocateTypedArrayBuffer (obj , length ) を実行する。 k を 0 とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。kValue を ? Get (arrayLike , propertyKey ) とする。? TypedArraySetElement (obj , 𝔽 (k ), kValue ) を実行する。 k を k + 1 に設定する。unused を返す。
23.2.5.1.6 AllocateTypedArrayBuffer ( obj , length )
抽象操作 AllocateTypedArrayBuffer。引数 obj (TypedArray ) および length (非負整数)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 ArrayBuffer を割り当てて obj に関連付けます。 呼び出されると、次の手順を実行する。
表明 : obj .[[ViewedArrayBuffer]] は undefined である。elementSize を TypedArrayElementSize (obj ) とする。byteLength を elementSize × length とする。data を ? AllocateArrayBuffer (%ArrayBuffer% , byteLength ) とする。obj .[[ViewedArrayBuffer]] を data に設定する。obj .[[ByteLength]] を byteLength に設定する。obj .[[ByteOffset]] を 0 に設定する。obj .[[ArrayLength]] を length に設定する。unused を返す。
23.2.6 TypedArray コンストラクターのプロパティ
各 TypedArray コンストラクター は:
値が %TypedArray% である [[Prototype]] 内部スロットを持ちます。
値が 3 𝔽 である "length" プロパティを持ちます。
値が 表 71 でそのコンストラクター に対して規定されたコンストラクター 名の String 値である "name" プロパティを持ちます。
次のプロパティを持ちます。
23.2.6.1 TypedArray .BYTES_PER_ELEMENT
TypedArray .BYTES_PER_ELEMENT の値は、TypedArray について 表 71 で規定される Element Size 値です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
23.2.6.2 TypedArray .prototype
TypedArray .prototype の初期値は、対応する TypedArray prototype イントリンシックオブジェクト(23.2.7 )です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
23.2.7 TypedArray Prototype オブジェクトのプロパティ
各 TypedArray prototype オブジェクトは:
23.2.7.1 TypedArray .prototype.BYTES_PER_ELEMENT
TypedArray .prototype.BYTES_PER_ELEMENT の値は、TypedArray について 表 71 で規定される Element Size 値です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
23.2.7.2 TypedArray .prototype.constructor
特定の TypedArray コンストラクター に対する prototype の "constructor" プロパティの初期値は、そのコンストラクター 自身です。
23.2.8 TypedArray インスタンスのプロパティ
TypedArray インスタンスは TypedArray です。各 TypedArray インスタンスは、対応する TypedArray prototype オブジェクトからプロパティを継承します。各 TypedArray インスタンスは、次の内部スロットを持ちます: [[ViewedArrayBuffer]] 、[[TypedArrayName]] 、[[ContentType]] 、[[ByteLength]] 、[[ByteOffset]] 、および [[ArrayLength]] 。
23.3 Uint8Array オブジェクト
Uint8Array は、上記で説明した特定の種類の TypedArray です。さらに、Uint8Array コンストラクター (23.3.1 )および Uint8Array prototype オブジェクト(23.3.2 )には追加のメソッドがあります。
23.3.1 Uint8Array コンストラクターの追加プロパティ
23.3.1.1 Uint8Array.fromBase64 ( string [ , options ] )
string が String でない場合、TypeError 例外をスローする。optionsObj を ? GetOptionsObject (options ) とする。alphabet を ? Get (optionsObj , "alphabet" ) とする。alphabet が undefined である場合、alphabet を "base64" に設定する。alphabet が "base64" でも "base64url" でもない場合、TypeError 例外をスローする。lastChunkHandling を ? Get (optionsObj , "lastChunkHandling" ) とする。lastChunkHandling が undefined である場合、lastChunkHandling を "loose" に設定する。lastChunkHandling が "loose" 、"strict" 、または "stop-before-partial" のいずれでもない場合、TypeError 例外をスローする。result を FromBase64 (string , alphabet , lastChunkHandling ) とする。result .[[Error]] が none でない場合、result .[[Error]] をスローする。resultLength を result .[[Bytes]] の要素数とする。ta を ? AllocateTypedArray ("Uint8Array" , %Uint8Array% , "%Uint8Array.prototype%" , resultLength ) とする。表明 : ta .[[ViewedArrayBuffer]] .[[ArrayBufferByteLength]] は result .[[Bytes]] の要素数である。ta .[[ViewedArrayBuffer]] .[[ArrayBufferData]] の各インデックスの値を、result .[[Bytes]] の対応するインデックスの値に設定する。ta を返す。
23.3.1.2 Uint8Array.fromHex ( string )
string が String でない場合、TypeError 例外をスローする。result を FromHex (string ) とする。result .[[Error]] が none でない場合、result .[[Error]] をスローする。resultLength を result .[[Bytes]] の要素数とする。ta を ? AllocateTypedArray ("Uint8Array" , %Uint8Array% , "%Uint8Array.prototype%" , resultLength ) とする。表明 : ta .[[ViewedArrayBuffer]] .[[ArrayBufferByteLength]] は result .[[Bytes]] の要素数である。ta .[[ViewedArrayBuffer]] .[[ArrayBufferData]] の各インデックスの値を、result .[[Bytes]] の対応するインデックスの値に設定する。ta を返す。
23.3.2 Uint8Array Prototype オブジェクトの追加プロパティ
23.3.2.1 Uint8Array.prototype.setFromBase64 ( string [ , options ] )
into を this 値とする。? ValidateUint8Array (into ) を実行する。 string が String でない場合、TypeError 例外をスローする。optionsObj を ? GetOptionsObject (options ) とする。alphabet を ? Get (optionsObj , "alphabet" ) とする。alphabet が undefined である場合、alphabet を "base64" に設定する。alphabet が "base64" でも "base64url" でもない場合、TypeError 例外をスローする。lastChunkHandling を ? Get (optionsObj , "lastChunkHandling" ) とする。lastChunkHandling が undefined である場合、lastChunkHandling を "loose" に設定する。lastChunkHandling が "loose" 、"strict" 、または "stop-before-partial" のいずれでもない場合、TypeError 例外をスローする。taRecord を ? ValidateTypedArrayBounds (into , seq-cst ) とする。byteLength を TypedArrayLength (taRecord ) とする。result を FromBase64 (string , alphabet , lastChunkHandling , byteLength ) とする。bytes を result .[[Bytes]] とする。written を bytes の要素数とする。注記 : FromBase64 はユーザーコードを呼び出さないため、into を基礎とする ArrayBuffer が detached または縮小されることはない。表明 : written ≤ byteLength 。SetUint8ArrayBytes (into , bytes ) を実行する。result .[[Error]] が none でない場合、result .[[Error]] をスローする。resultObj を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (resultObj , "read" , 𝔽 (result .[[Read]] )) を実行する。 ! CreateDataPropertyOrThrow (resultObj , "written" , 𝔽 (written )) を実行する。 resultObj を返す。
23.3.2.2 Uint8Array.prototype.setFromHex ( string )
into を this 値とする。? ValidateUint8Array (into ) を実行する。 string が String でない場合、TypeError 例外をスローする。taRecord を ? ValidateTypedArrayBounds (into , seq-cst ) とする。byteLength を TypedArrayLength (taRecord ) とする。result を FromHex (string , byteLength ) とする。bytes を result .[[Bytes]] とする。written を bytes の要素数とする。注記 : FromHex はユーザーコードを呼び出さないため、into を基礎とする ArrayBuffer が detached または縮小されることはない。表明 : written ≤ byteLength 。SetUint8ArrayBytes (into , bytes ) を実行する。result .[[Error]] が none でない場合、result .[[Error]] をスローする。resultObj を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (resultObj , "read" , 𝔽 (result .[[Read]] )) を実行する。 ! CreateDataPropertyOrThrow (resultObj , "written" , 𝔽 (written )) を実行する。 resultObj を返す。
23.3.2.3 Uint8Array.prototype.toBase64 ( [ options ] )
obj を this 値とする。? ValidateUint8Array (obj ) を実行する。 optionsObj を ? GetOptionsObject (options ) とする。alphabet を ? Get (optionsObj , "alphabet" ) とする。alphabet が undefined である場合、alphabet を "base64" に設定する。alphabet が "base64" でも "base64url" でもない場合、TypeError 例外をスローする。omitPadding を ToBoolean (? Get (optionsObj , "omitPadding" )) とする。toEncode を ? GetUint8ArrayBytes (obj ) とする。alphabet が "base64" である場合、outAscii を、RFC 4648 の4節で規定される base64 エンコーディングに従って toEncode をエンコードした結果のコードポイント列とする。omitPadding が false である場合に限り、padding を含める。そうでない場合、表明 : alphabet は "base64url" である。outAscii を、RFC 4648 の5節で規定される base64url エンコーディングに従って toEncode をエンコードした結果のコードポイント列とする。omitPadding が false である場合に限り、padding を含める。 CodePointsToString (outAscii ) を返す。
23.3.2.4 Uint8Array.prototype.toHex ( )
obj を this 値とする。? ValidateUint8Array (obj ) を実行する。 toEncode を ? GetUint8ArrayBytes (obj ) とする。out を空の String とする。toEncode の各 byte byte について、次を行う。hex を Number::toString (𝔽 (byte ), 16) とする。hex を StringPad (hex , 2, "0" , start ) に設定する。out を out と hex の文字列連結 に設定する。out を返す。
23.3.3 Uint8Array オブジェクトのための抽象操作
23.3.3.1 ValidateUint8Array ( ta )
抽象操作 ValidateUint8Array。引数 ta (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
? RequireInternalSlot (ta , [[TypedArrayName]] ) を実行する。 ta .[[TypedArrayName]] が "Uint8Array" でない場合、TypeError 例外をスローする。unused を返す。
23.3.3.2 GetUint8ArrayBytes ( ta )
抽象操作 GetUint8ArrayBytes。引数 ta (Uint8Array)。戻り値:(正常完了 (値:リスト (要素:バイト値 )) または throw 完了 )。 呼び出されると、次の手順を実行する。
buffer を ta .[[ViewedArrayBuffer]] とする。taRecord を ? ValidateTypedArrayBounds (ta , seq-cst ) とする。length を TypedArrayLength (taRecord ) とする。byteOffset を ta .[[ByteOffset]] とする。bytes を新しい空の List とする。index を 0 とする。index < length の間、次を繰り返す。byteIndex を byteOffset + index とする。byte を ℝ (GetValueFromBuffer (buffer , byteIndex , uint8 , true , unordered )) とする。byte を bytes に追加する。index を index + 1 に設定する。bytes を返す。
23.3.3.3 SetUint8ArrayBytes ( into , bytes )
抽象操作 SetUint8ArrayBytes。引数 into (Uint8Array) および bytes (リスト (要素:バイト値 ))。戻り値:unused 。 呼び出されると、次の手順を実行する。
offset を into .[[ByteOffset]] とする。length を bytes の要素数とする。index を 0 とする。index < length の間、次を繰り返す。byte を bytes [index ] とする。byteIndexInBuffer を index + offset とする。SetValueInBuffer (into .[[ViewedArrayBuffer]] , byteIndexInBuffer , uint8 , 𝔽 (byte ), true , unordered ) を実行する。index を index + 1 に設定する。unused を返す。
23.3.3.4 SkipAsciiWhitespace ( string , index )
抽象操作 SkipAsciiWhitespace。引数 string (String) および index (非負整数)。戻り値:非負整数。 呼び出されると、次の手順を実行する。
length を string の長さとする。index < length の間、次を繰り返す。char を string 内のインデックス index にあるコード単位とする。char が 0x0009 (TAB)、0x000A (LF)、0x000C (FF)、0x000D (CR)、または 0x0020 (SPACE) のいずれでもない場合、index を返す。index を index + 1 に設定する。index を返す。
23.3.3.5 DecodeFinalBase64Chunk ( chunk , throwOnExtraBits )
抽象操作 DecodeFinalBase64Chunk。引数 chunk ((a String of length 2 または 3)) および throwOnExtraBits (Boolean)。戻り値:(正常完了 (値:リスト (要素:バイト値 )) または throw 完了 )。 呼び出されると、次の手順を実行する。
chunkLength を chunk の長さとする。chunkLength = 2 である場合、chunk を chunk と "AA" の文字列連結 に設定する。そうでない場合、表明 : chunkLength は 3 である。chunk を chunk と "A" の文字列連結 に設定する。 bytes を DecodeFullLengthBase64Chunk (chunk ) とする。chunkLength = 2 である場合、throwOnExtraBits が true かつ bytes [1] ≠ 0 である場合、SyntaxError 例外をスローする。« bytes [0] » を返す。 throwOnExtraBits が true かつ bytes [2] ≠ 0 である場合、SyntaxError 例外をスローする。« bytes [0], bytes [1] » を返す。
23.3.3.6 DecodeFullLengthBase64Chunk ( chunk )
抽象操作 DecodeFullLengthBase64Chunk。引数 chunk (a String of length 4)。戻り値:リスト (要素:byte values of length 3)。
標準 base64 alphabet は "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" 、すなわち Unicode 基本ラテンブロック内のすべての文字と数字に対応するコード単位に "+" および "/" を加えたものを要素とする String です。
byteSequence を、chunk を base64 としてデコードした結果の一意な3バイトの列とする(すなわち、byteSequence に RFC 4648 の4節で規定される base64 エンコーディングを適用すると chunk が生成されるような列)。byteSequence の要素を順番に要素とする List を返す。
23.3.3.7 FromBase64 ( string , alphabet , lastChunkHandling [ , maxLength ] )
抽象操作 FromBase64。引数 string (String)、alphabet (("base64" または "base64url" )) および lastChunkHandling (("loose" 、"strict" または "stop-before-partial" ))および省略可能な引数 maxLength (非負整数)。戻り値:レコード (フィールド:[[Read]] (整数 ), [[Bytes]] (リスト (要素:バイト値 )), [[Error]] ((a SyntaxError object または none )))。 呼び出されると、次の手順を実行する。
maxLength が存在しない場合、maxLength を 253 - 1 に設定する。注記 : 入力は String であるため、String の長さは 253 - 1 文字に制限され、出力に必要な byte 数は入力の文字数を超えないので、この制限に達することは決してない。ただし、編集上、maxLength に有限値を使用する方が便利である。注記 : 以下のアルゴリズムにおける検証とデコードの順序は観測できない。実装には、最も効率的な順序で実行し、場合によっては検証とデコードを交互に行うことが推奨される。maxLength = 0 である場合、Record { [[Read]] : 0, [[Bytes]] : « », [[Error]] : none } を返す。read を 0 とする。bytes を新しい空の List とする。chunk を空の String とする。chunkLength を 0 とする。index を 0 とする。length を string の長さとする。次を繰り返す。表明 : bytes の要素数は 3 で割り切れる。index を SkipAsciiWhitespace (string , index ) に設定する。index = length である場合、chunkLength > 0 である場合、lastChunkHandling が "stop-before-partial" である場合、Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : none } を返す。lastChunkHandling が "strict" である場合、error を新しく作成された SyntaxError オブジェクトとする。Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : error } を返す。表明 : lastChunkHandling は "loose" である。chunkLength = 1 である場合、error を新しく作成された SyntaxError オブジェクトとする。Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : error } を返す。bytes を bytes と ! DecodeFinalBase64Chunk (chunk , false ) のリスト連結 に設定する。Record { [[Read]] : length , [[Bytes]] : bytes , [[Error]] : none } を返す。char を string の index から index + 1 までの部分文字列 とする。index を index + 1 に設定する。char が "=" である場合、chunkLength < 2 である場合、error を新しく作成された SyntaxError オブジェクトとする。Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : error } を返す。index を SkipAsciiWhitespace (string , index ) に設定する。chunkLength = 2 である場合、index = length である場合、lastChunkHandling が "stop-before-partial" である場合、Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : none } を返す。error を新しく作成された SyntaxError オブジェクトとする。Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : error } を返す。char を string の index から index + 1 までの部分文字列 に設定する。char が "=" である場合、index を SkipAsciiWhitespace (string , index + 1) に設定する。index < length である場合、error を新しく作成された SyntaxError オブジェクトとする。Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : error } を返す。lastChunkHandling が "strict" である場合、throwOnExtraBits を true とする。そうでない場合、throwOnExtraBits を false とする。decodeResult を Completion (DecodeFinalBase64Chunk (chunk , throwOnExtraBits )) とする。decodeResult が中断完了 である場合、error を decodeResult .[[Value]] とする。Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : error } を返す。bytes を bytes と ! decodeResult のリスト連結 に設定する。Record { [[Read]] : length , [[Bytes]] : bytes , [[Error]] : none } を返す。alphabet が "base64url" である場合、char が "+" または "/" のいずれかである場合、error を新しく作成された SyntaxError オブジェクトとする。Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : error } を返す。そうでなく、char が "-" である場合、char を "+" に設定する。 そうでなく、char が "_" である場合、char を "/" に設定する。 char の唯一のコード単位が標準 base64 alphabet の要素でない場合、error を新しく作成された SyntaxError オブジェクトとする。Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : error } を返す。remaining を maxLength - bytes の要素数とする。remaining = 1 かつ chunkLength = 2 であるか、remaining = 2 かつ chunkLength = 3 である場合、Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : none } を返す。chunk を chunk と char の文字列連結 に設定する。chunkLength を chunk の長さに設定する。chunkLength = 4 である場合、bytes を bytes と DecodeFullLengthBase64Chunk (chunk ) のリスト連結 に設定する。chunk を空の String に設定する。chunkLength を 0 に設定する。read を index に設定する。bytes の要素数 = maxLength である場合、Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : none } を返す。
23.3.3.8 FromHex ( string [ , maxLength ] )
抽象操作 FromHex。引数 string (String)および省略可能な引数 maxLength (非負整数)。戻り値:レコード (フィールド:[[Read]] (整数 ), [[Bytes]] (リスト (要素:バイト値 )), [[Error]] ((a SyntaxError object または none )))。 呼び出されると、次の手順を実行する。
maxLength が存在しない場合、maxLength を 253 - 1 に設定する。length を string の長さとする。bytes を新しい空の List とする。read を 0 とする。length modulo 2 ≠ 0 である場合、error を新しく作成された SyntaxError オブジェクトとする。Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : error } を返す。read < length かつ bytes の要素数 < maxLength の間、次を繰り返す。hexits を string の read から read + 2 までの部分文字列 とする。hexits が "0123456789abcdefABCDEF" に含まれないコード単位を含む場合、error を新しく作成された SyntaxError オブジェクトとする。Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : error } を返す。read を read + 2 に設定する。byte を、16進表記で hexits によって表される整数 値とする。値 10 から 15 の数字には文字 A から F および a から f を使用する。byte を bytes に追加する。Record { [[Read]] : read , [[Bytes]] : bytes , [[Error]] : none } を返す。
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 ] )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 map を ? OrdinaryCreateFromConstructor (NewTarget, "%Map.prototype%" , « [[MapData]] ») とする。map .[[MapData]] を新しい空の List に設定する。iterable が undefined または null のいずれかである場合、map を返す。adder を ? Get (map , "set" ) とする。IsCallable (adder ) が false である場合、TypeError 例外をスローする。? AddEntriesFromIterable (map , iterable , adder ) を返す。
注
パラメーター iterable が存在する場合、最初の要素が Map のキーとして使用される値で、2番目の要素がそのキーに関連付ける値である2要素の array-like オブジェクトを生成する iterator オブジェクトを返す %Symbol.iterator% メソッドを実装するオブジェクトであることが期待されます。
24.1.1.2 AddEntriesFromIterable ( target , iterable , adder )
抽象操作 AddEntriesFromIterable。引数 target (Object)、iterable (an ECMAScript language value, but not undefined or null ) および adder (関数オブジェクト )。戻り値:(正常完了 (値:Object) または throw 完了 )。 adder は target を receiver として呼び出されます。 呼び出されると、次の手順を実行する。
iteratorRecord を ? GetIterator (iterable , sync ) とする。次を繰り返す。next を ? IteratorStepValue (iteratorRecord ) とする。next が done である場合、target を返す。next が Object でない場合、error を ThrowCompletion (新しく作成された TypeError オブジェクト) とする。? IteratorClose (iteratorRecord , error ) を返す。 key を Completion (Get (next , "0" )) とする。IfAbruptCloseIterator (key , iteratorRecord )。value を Completion (Get (next , "1" )) とする。IfAbruptCloseIterator (value , iteratorRecord )。status を Completion (Call (adder , target , « key , value »)) とする。IfAbruptCloseIterator (status , iteratorRecord )。
注
パラメーター iterable は、最初の要素が Map のキーとして使用される値で、2番目の要素がそのキーに関連付ける値である2要素の array-like オブジェクトを生成する iterator オブジェクトを返す %Symbol.iterator% メソッドを実装するオブジェクトであることが期待されます。
24.1.2 Map コンストラクターのプロパティ
Map コンストラクター は:
24.1.2.1 Map.groupBy ( items , callback )
注
callback は2つの引数を受け取る関数であるべきです。groupBy は items 内の各要素について昇順に callback を1回ずつ呼び出し、新しい Map を構築します。callback が返す各値は Map のキーとして使用されます。そのような各キーについて、結果の Map は、そのキーをキーとし、callback がそのキーを返したすべての要素を含む配列を値とするエントリを持ちます。
callback は、要素の値と要素のインデックスという2つの引数で呼び出されます。
groupBy の戻り値は Map です。
この関数は呼び出されたとき、次の手順を実行します。
groups を ? GroupBy (items , callback , collection ) とする。map を ! Construct (%Map% ) とする。groups の各 Record { [[Key]] , [[Elements]] } group について、次を行う。elements を CreateArrayFromList (group .[[Elements]] ) とする。entry を Record { [[Key]] : group .[[Key]] , [[Value]] : elements } とする。entry を map .[[MapData]] に追加する。map を返す。
24.1.2.2 Map.prototype
Map.prototype の初期値は Map prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
24.1.2.3 get Map [ %Symbol.species% ]
Map[%Symbol.species%] は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
this 値を返す。
この関数の "name" プロパティの値は "get [Symbol.species]" です。
注
派生コレクションオブジェクトを作成するメソッドは、派生オブジェクトの作成に使用するコンストラクター を決定するために %Symbol.species% を呼び出すべきです。サブクラスコンストラクター は %Symbol.species% を上書きして、既定のコンストラクター 割当てを変更できます。
24.1.3 Map Prototype オブジェクトのプロパティ
Map prototype オブジェクト は:
24.1.3.1 Map.prototype.clear ( )
このメソッドは呼び出されたとき、次の手順を実行します。
map を this 値とする。? RequireInternalSlot (map , [[MapData]] ) を実行する。 map .[[MapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] を empty に設定する。entry .[[Value]] を empty に設定する。undefined を返す。
注
既存の [[MapData]] List は保持されます。これは、その List の反復の途中で一時停止している既存の Map Iterator オブジェクトが存在する可能性があるためです。
24.1.3.2 Map.prototype.constructor
Map.prototype.constructor の初期値は %Map% です。
24.1.3.3 Map.prototype.delete ( key )
このメソッドは呼び出されたとき、次の手順を実行します。
map を this 値とする。? RequireInternalSlot (map , [[MapData]] ) を実行する。 key を CanonicalizeKeyedCollectionKey (key ) に設定する。map .[[MapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、entry .[[Key]] を empty に設定する。entry .[[Value]] を empty に設定する。true を返す。false を返す。
注
値 empty は、エントリが削除されたことを示すための仕様上の手段として使用されます。実際の実装では、内部データ構造からエントリを物理的に削除するなど、別の処理を行ってもかまいません。
24.1.3.4 Map.prototype.entries ( )
このメソッドは呼び出されたとき、次の手順を実行します。
map を this 値とする。? CreateMapIterator (map , key+value ) を返す。
24.1.3.5 Map.prototype.forEach ( callback [ , thisArg ] )
このメソッドは呼び出されたとき、次の手順を実行します。
map を this 値とする。? RequireInternalSlot (map , [[MapData]] ) を実行する。 IsCallable (callback ) が false である場合、TypeError 例外をスローする。entries を map .[[MapData]] とする。entriesCount を entries の要素数とする。index を 0 とする。index < entriesCount の間、次を繰り返す。entry を entries [index ] とする。index を index + 1 に設定する。entry .[[Key]] が empty でない場合、? Call (callback , thisArg , « entry .[[Value]] , entry .[[Key]] , map ») を実行する。 注記 : callback の実行中に entries の要素数が増加している可能性がある。entriesCount を entries の要素数に設定する。undefined を返す。
注
callback は3つの引数を受け取る関数であるべきです。forEach は Map に存在する各キーと値のペアについて、キーの挿入順に callback を1回ずつ呼び出します。callback は実際に存在する Map のキーについてのみ呼び出され、Map から削除されたキーについては呼び出されません。
thisArg パラメーターが指定された場合、callback の各呼出しで this 値として使用されます。指定されていない場合は、代わりに undefined が使用されます。
callback は、項目の値、項目のキー、および走査中の Map という3つの引数で呼び出されます。
forEach は呼び出されたオブジェクトを直接変更しませんが、callback の呼出しによってそのオブジェクトが変更される場合があります。Map の [[MapData]] の各エントリは1回だけ訪問されます。forEach の呼出し開始後に追加された新しいキーは訪問されます。訪問後に削除され、forEach 呼出しが完了する前に再び追加されたキーは再訪問されます。forEach の呼出し開始後、訪問される前に削除されたキーは、forEach 呼出しが完了する前にそのキーが再び追加されない限り訪問されません。
24.1.3.6 Map.prototype.get ( key )
このメソッドは呼び出されたとき、次の手順を実行します。
map を this 値とする。? RequireInternalSlot (map , [[MapData]] ) を実行する。 key を CanonicalizeKeyedCollectionKey (key ) に設定する。map .[[MapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、entry .[[Value]] を返す。undefined を返す。
24.1.3.7 Map.prototype.getOrInsert ( key , value )
このメソッドは呼び出されたとき、次の手順を実行します。
map を this 値とする。? RequireInternalSlot (map , [[MapData]] ) を実行する。 key を CanonicalizeKeyedCollectionKey (key ) に設定する。map .[[MapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、entry .[[Value]] を返す。entry を Record { [[Key]] : key , [[Value]] : value } とする。entry を map .[[MapData]] に追加する。value を返す。
24.1.3.8 Map.prototype.getOrInsertComputed ( key , callback )
このメソッドは呼び出されたとき、次の手順を実行します。
map を this 値とする。? RequireInternalSlot (map , [[MapData]] ) を実行する。 IsCallable (callback ) が false である場合、TypeError 例外をスローする。key を CanonicalizeKeyedCollectionKey (key ) に設定する。map .[[MapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、entry .[[Value]] を返す。value を ? Call (callback , undefined , « key ») とする。注記 : callback の実行中に Map が変更されている可能性がある。map .[[MapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、entry .[[Value]] を value に設定する。value を返す。entry を Record { [[Key]] : key , [[Value]] : value } とする。entry を map .[[MapData]] に追加する。value を返す。
24.1.3.9 Map.prototype.has ( key )
このメソッドは呼び出されたとき、次の手順を実行します。
map を this 値とする。? RequireInternalSlot (map , [[MapData]] ) を実行する。 key を CanonicalizeKeyedCollectionKey (key ) に設定する。map .[[MapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、true を返す。false を返す。
24.1.3.10 Map.prototype.keys ( )
このメソッドは呼び出されたとき、次の手順を実行します。
map を this 値とする。? CreateMapIterator (map , key ) を返す。
24.1.3.11 Map.prototype.set ( key , value )
このメソッドは呼び出されたとき、次の手順を実行します。
map を this 値とする。? RequireInternalSlot (map , [[MapData]] ) を実行する。 key を CanonicalizeKeyedCollectionKey (key ) に設定する。map .[[MapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、entry .[[Value]] を value に設定する。map を返す。entry を Record { [[Key]] : key , [[Value]] : value } とする。entry を map .[[MapData]] に追加する。map を返す。
24.1.3.12 get Map.prototype.size
Map.prototype.size は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
map を this 値とする。? RequireInternalSlot (map , [[MapData]] ) を実行する。 count を 0 とする。map .[[MapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でない場合、count を count + 1 に設定する。𝔽 (count ) を返す。
24.1.3.13 Map.prototype.values ( )
このメソッドは呼び出されたとき、次の手順を実行します。
map を this 値とする。? CreateMapIterator (map , value ) を返す。
24.1.3.14 Map.prototype [ %Symbol.iterator% ] ( )
%Symbol.iterator% プロパティの初期値は、24.1.3.4 で定義される %Map.prototype.entries% です。
24.1.3.15 Map.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "Map" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
24.1.4 Map インスタンスのプロパティ
Map インスタンスは Map prototype オブジェクト からプロパティを継承する通常オブジェクト です。Map インスタンスは [[MapData]] 内部スロットも持ちます。
24.1.5 Map Iterator オブジェクト
Map Iterator は、特定の Map インスタンスオブジェクトに対する特定の反復を表すオブジェクトです。Map Iterator オブジェクトには名前付きコンストラクター はありません。代わりに、Map Iterator オブジェクトは Map インスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。
24.1.5.1 CreateMapIterator ( map , kind )
抽象操作 CreateMapIterator。引数 map (ECMAScript 言語値 ) および kind ((key+value 、key または value ))。戻り値:(正常完了 (値:Generator) または throw 完了 )。 そのような iterator を返す Map メソッドの iterator オブジェクトを作成するために使用されます。 呼び出されると、次の手順を実行する。
? RequireInternalSlot (map , [[MapData]] ) を実行する。 closure を、map と kind を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。entries を map .[[MapData]] とする。index を 0 とする。entriesCount を entries の要素数とする。index < entriesCount の間、次を繰り返す。entry を entries [index ] とする。index を index + 1 に設定する。entry .[[Key]] が empty でない場合、kind が key である場合、result を entry .[[Key]] とする。そうでなく、kind が value である場合、result を entry .[[Value]] とする。 そうでない場合、表明 : kind は key+value である。result を CreateArrayFromList (« entry .[[Key]] , entry .[[Value]] ») とする。 ? GeneratorYield (CreateIteratorResultObject (result , false )) を実行する。 注記 : GeneratorYield によってこの抽象操作 の実行が一時停止している間に、entries の要素数が増加している可能性がある。entriesCount を entries の要素数に設定する。NormalCompletion (unused ) を返す。CreateIteratorFromClosure (closure , "%MapIteratorPrototype%" , %MapIteratorPrototype% ) を返す。
24.1.5.2 %MapIteratorPrototype% オブジェクト
%MapIteratorPrototype% オブジェクトは:
24.1.5.2.1 %MapIteratorPrototype%.next ( )
? GeneratorResume (this 値, empty , "%MapIteratorPrototype%" ) を返す。
24.1.5.2.2 %MapIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "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 は 表 72 に列挙されるフィールドを持ちます。
表 72: 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 )
抽象操作 GetSetRecord。引数 obj (ECMAScript 言語値 )。戻り値:(正常完了 (値:Setレコード ) または throw 完了 )。 呼び出されると、次の手順を実行する。
obj が Object でない場合、TypeError 例外をスローする。rawSize を ? Get (obj , "size" ) とする。numberSize を ? ToNumber (rawSize ) とする。注記 : rawSize が undefined である場合、numberSize は NaN になる。numberSize が NaN である場合、TypeError 例外をスローする。intSize を ! ToIntegerOrInfinity (numberSize ) とする。intSize < 0 である場合、RangeError 例外をスローする。has を ? Get (obj , "has" ) とする。IsCallable (has ) が false である場合、TypeError 例外をスローする。keys を ? Get (obj , "keys" ) とする。IsCallable (keys ) が false である場合、TypeError 例外をスローする。新しい Set Record { [[SetObject]] : obj , [[Size]] : intSize , [[Has]] : has , [[Keys]] : keys } を返す。
24.2.1.3 SetDataHas ( setData , value )
抽象操作 SetDataHas。引数 setData (リスト (要素:(ECMAScript 言語値 または empty ))) および value (ECMAScript 言語値 )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
SetDataIndex (setData , value ) が not-found である場合、false を返す。true を返す。
24.2.1.4 SetDataIndex ( setData , value )
抽象操作 SetDataIndex。引数 setData (リスト (要素:(ECMAScript 言語値 または empty ))) および value (ECMAScript 言語値 )。戻り値:(非負整数 または not-found )。 呼び出されると、次の手順を実行する。
value を CanonicalizeKeyedCollectionKey (value ) に設定する。size を setData の要素数とする。index を 0 とする。index < size の間、次を繰り返す。element を setData [index ] とする。element が empty でなく、element が value である場合、index を返す。index を index + 1 に設定する。not-found を返す。
24.2.1.5 SetDataSize ( setData )
抽象操作 SetDataSize。引数 setData (リスト (要素:(ECMAScript 言語値 または empty )))。戻り値:非負整数。 呼び出されると、次の手順を実行する。
count を 0 とする。setData の各要素 element について、次を行う。element が empty でない場合、count を count + 1 に設定する。count を返す。
24.2.2 Set コンストラクター
Set コンストラクター は:
%Set% です。
グローバルオブジェクト の "Set" プロパティの初期値です。
コンストラクター として呼び出されたとき、新しい Set オブジェクト を作成して初期化します。
関数として呼び出されることを意図しておらず、そのように呼び出されると例外をスローします。
クラス定義の extends 節の値として使用できます。規定された Set の動作を継承しようとするサブクラスコンストラクター は、Set.prototype の組込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するため、Set コンストラクター への super 呼出しを含まなければなりません。
24.2.2.1 Set ( [ iterable ] )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 set を ? OrdinaryCreateFromConstructor (NewTarget, "%Set.prototype%" , « [[SetData]] ») とする。set .[[SetData]] を新しい空の List に設定する。iterable が undefined または null のいずれかである場合、set を返す。adder を ? Get (set , "add" ) とする。IsCallable (adder ) が false である場合、TypeError 例外をスローする。iteratorRecord を ? GetIterator (iterable , sync ) とする。次を繰り返す。next を ? IteratorStepValue (iteratorRecord ) とする。next が done である場合、set を返す。status を Completion (Call (adder , set , « next »)) とする。IfAbruptCloseIterator (status , iteratorRecord )。
24.2.3 Set コンストラクターのプロパティ
Set コンストラクター は:
24.2.3.1 Set.prototype
Set.prototype の初期値は Set prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
24.2.3.2 get Set [ %Symbol.species% ]
Set[%Symbol.species%] は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
this 値を返す。
この関数の "name" プロパティの値は "get [Symbol.species]" です。
注
派生コレクションオブジェクトを作成するメソッドは、派生オブジェクトの作成に使用するコンストラクター を決定するために %Symbol.species% を呼び出すべきです。サブクラスコンストラクター は %Symbol.species% を上書きして、既定のコンストラクター 割当てを変更できます。
24.2.4 Set Prototype オブジェクトのプロパティ
Set prototype オブジェクト は:
24.2.4.1 Set.prototype.add ( value )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? RequireInternalSlot (set , [[SetData]] ) を実行する。 value を CanonicalizeKeyedCollectionKey (value ) に設定する。set .[[SetData]] の各要素 entry について、次を行う。entry が empty でなく、SameValue (entry , value ) が true である場合、set を返す。value を set .[[SetData]] に追加する。set を返す。
24.2.4.2 Set.prototype.clear ( )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? RequireInternalSlot (set , [[SetData]] ) を実行する。 set .[[SetData]] の各要素 entry について、次を行う。値が entry である set .[[SetData]] の要素を、値が empty である要素に置き換える。 undefined を返す。
注
既存の [[SetData]] List は保持されます。これは、その List の反復の途中で一時停止している既存の Set Iterator オブジェクトが存在する可能性があるためです。
24.2.4.3 Set.prototype.constructor
Set.prototype.constructor の初期値は %Set% です。
24.2.4.4 Set.prototype.delete ( value )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? RequireInternalSlot (set , [[SetData]] ) を実行する。 value を CanonicalizeKeyedCollectionKey (value ) に設定する。set .[[SetData]] の各要素 entry について、次を行う。entry が empty でなく、SameValue (entry , value ) が true である場合、値が entry である set .[[SetData]] の要素を、値が empty である要素に置き換える。 true を返す。false を返す。
注
値 empty は、エントリが削除されたことを示すための仕様上の手段として使用されます。実際の実装では、内部データ構造からエントリを物理的に削除するなど、別の処理を行ってもかまいません。
24.2.4.5 Set.prototype.difference ( other )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? RequireInternalSlot (set , [[SetData]] ) を実行する。 otherRecord を ? GetSetRecord (other ) とする。resultSetData を set .[[SetData]] のコピーとする。SetDataSize (set .[[SetData]] ) ≤ otherRecord .[[Size]] である場合、thisSize を set .[[SetData]] の要素数とする。index を 0 とする。index < thisSize の間、次を繰り返す。entry を resultSetData [index ] とする。entry が empty でない場合、inOther を ToBoolean (? Call (otherRecord .[[Has]] , otherRecord .[[SetObject]] , « entry »)) とする。inOther が true である場合、resultSetData [index ] を empty に設定する。index を index + 1 に設定する。そうでない場合、keysIterator を ? GetIteratorFromMethod (otherRecord .[[SetObject]] , otherRecord .[[Keys]] ) とする。next を not-started とする。next が done でない間、次を繰り返す。next を ? IteratorStepValue (keysIterator ) に設定する。next が done でない場合、next を CanonicalizeKeyedCollectionKey (next ) に設定する。valueIndex を SetDataIndex (resultSetData , next ) とする。valueIndex が not-found でない場合、resultSetData [valueIndex ] を empty に設定する。 result を OrdinaryObjectCreate (%Set.prototype% , « [[SetData]] ») とする。result .[[SetData]] を resultSetData に設定する。result を返す。
24.2.4.6 Set.prototype.entries ( )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? CreateSetIterator (set , key+value ) を返す。
注
反復の目的では、Set は各エントリのキーと値が同じ値である Map に似たものとして見えます。
24.2.4.7 Set.prototype.forEach ( callback [ , thisArg ] )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? RequireInternalSlot (set , [[SetData]] ) を実行する。 IsCallable (callback ) が false である場合、TypeError 例外をスローする。entries を set .[[SetData]] とする。entriesCount を entries の要素数とする。index を 0 とする。index < entriesCount の間、次を繰り返す。entry を entries [index ] とする。index を index + 1 に設定する。entry が empty でない場合、? Call (callback , thisArg , « entry , entry , set ») を実行する。 注記 : callback の実行中に entries の要素数が増加している可能性がある。entriesCount を entries の要素数に設定する。undefined を返す。
注
callback は3つの引数を受け取る関数であるべきです。forEach は Set オブジェクト に存在する各値について、値の挿入順に callback を1回ずつ呼び出します。callback は実際に存在する Set の値についてのみ呼び出され、Set から削除されたキーについては呼び出されません。
thisArg パラメーターが指定された場合、callback の各呼出しで this 値として使用されます。指定されていない場合は、代わりに undefined が使用されます。
callback は3つの引数で呼び出されます。最初の2つの引数は Set に含まれる値です。両方の引数には同じ値が渡されます。走査中の Set オブジェクト が第3引数として渡されます。
callback が3つの引数で呼び出されるのは、Map および Array の forEach メソッドで使用される callback 関数との一貫性を保つためです。Set では、各項目の値はキーと値の両方であるとみなされます。
forEach は呼び出されたオブジェクトを直接変更しませんが、callback の呼出しによってそのオブジェクトが変更される場合があります。
各値は通常1回だけ訪問されます。ただし、訪問後に削除され、forEach 呼出しが完了する前に再び追加された値は再訪問されます。forEach の呼出し開始後、訪問される前に削除された値は、forEach 呼出しが完了する前にその値が再び追加されない限り訪問されません。forEach の呼出し開始後に追加された新しい値は訪問されます。
24.2.4.8 Set.prototype.has ( value )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? RequireInternalSlot (set , [[SetData]] ) を実行する。 value を CanonicalizeKeyedCollectionKey (value ) に設定する。set .[[SetData]] の各要素 entry について、次を行う。entry が empty でなく、SameValue (entry , value ) が true である場合、true を返す。false を返す。
24.2.4.9 Set.prototype.intersection ( other )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? RequireInternalSlot (set , [[SetData]] ) を実行する。 otherRecord を ? GetSetRecord (other ) とする。resultSetData を新しい空の List とする。SetDataSize (set .[[SetData]] ) ≤ otherRecord .[[Size]] である場合、thisSize を set .[[SetData]] の要素数とする。index を 0 とする。index < thisSize の間、次を繰り返す。entry を set .[[SetData]] [index ] とする。index を index + 1 に設定する。entry が empty でない場合、inOther を ToBoolean (? Call (otherRecord .[[Has]] , otherRecord .[[SetObject]] , « entry »)) とする。inOther が true である場合、注記 : 以前の otherRecord .[[Has]] 呼出しが set .[[SetData]] の要素を削除して再追加する可能性があり、それによってこの反復中に同じ要素が2回訪問される場合がある。SetDataHas (resultSetData , entry ) が false である場合、entry を resultSetData に追加する。注記 : otherRecord .[[Has]] の実行中に set .[[SetData]] の要素数が増加している可能性がある。thisSize を set .[[SetData]] の要素数に設定する。そうでない場合、keysIterator を ? GetIteratorFromMethod (otherRecord .[[SetObject]] , otherRecord .[[Keys]] ) とする。next を not-started とする。next が done でない間、次を繰り返す。next を ? IteratorStepValue (keysIterator ) に設定する。next が done でない場合、next を CanonicalizeKeyedCollectionKey (next ) に設定する。inThis を SetDataHas (set .[[SetData]] , next ) とする。inThis が true である場合、注記 : other は任意のオブジェクトであるため、その "keys" iterator が同じ値を複数回生成する可能性がある。SetDataHas (resultSetData , next ) が false である場合、next を resultSetData に追加する。 result を OrdinaryObjectCreate (%Set.prototype% , « [[SetData]] ») とする。result .[[SetData]] を resultSetData に設定する。result を返す。
24.2.4.10 Set.prototype.isDisjointFrom ( other )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? RequireInternalSlot (set , [[SetData]] ) を実行する。 otherRecord を ? GetSetRecord (other ) とする。SetDataSize (set .[[SetData]] ) ≤ otherRecord .[[Size]] である場合、thisSize を set .[[SetData]] の要素数とする。index を 0 とする。index < thisSize の間、次を繰り返す。entry を set .[[SetData]] [index ] とする。index を index + 1 に設定する。entry が empty でない場合、inOther を ToBoolean (? Call (otherRecord .[[Has]] , otherRecord .[[SetObject]] , « entry »)) とする。inOther が true である場合、false を返す。注記 : otherRecord .[[Has]] の実行中に set .[[SetData]] の要素数が増加している可能性がある。thisSize を set .[[SetData]] の要素数に設定する。そうでない場合、keysIterator を ? GetIteratorFromMethod (otherRecord .[[SetObject]] , otherRecord .[[Keys]] ) とする。next を not-started とする。next が done でない間、次を繰り返す。next を ? IteratorStepValue (keysIterator ) に設定する。next が done でない場合、SetDataHas (set .[[SetData]] , next ) が true である場合、? IteratorClose (keysIterator , NormalCompletion (unused )) を実行する。 false を返す。 true を返す。
24.2.4.11 Set.prototype.isSubsetOf ( other )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? RequireInternalSlot (set , [[SetData]] ) を実行する。 otherRecord を ? GetSetRecord (other ) とする。SetDataSize (set .[[SetData]] ) > otherRecord .[[Size]] である場合、false を返す。thisSize を set .[[SetData]] の要素数とする。index を 0 とする。index < thisSize の間、次を繰り返す。entry を set .[[SetData]] [index ] とする。index を index + 1 に設定する。entry が empty でない場合、inOther を ToBoolean (? Call (otherRecord .[[Has]] , otherRecord .[[SetObject]] , « entry »)) とする。inOther が false である場合、false を返す。注記 : otherRecord .[[Has]] の実行中に set .[[SetData]] の要素数が増加している可能性がある。thisSize を set .[[SetData]] の要素数に設定する。true を返す。
24.2.4.12 Set.prototype.isSupersetOf ( other )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? RequireInternalSlot (set , [[SetData]] ) を実行する。 otherRecord を ? GetSetRecord (other ) とする。SetDataSize (set .[[SetData]] ) < otherRecord .[[Size]] である場合、false を返す。keysIterator を ? GetIteratorFromMethod (otherRecord .[[SetObject]] , otherRecord .[[Keys]] ) とする。next を not-started とする。next が done でない間、次を繰り返す。next を ? IteratorStepValue (keysIterator ) に設定する。next が done でない場合、SetDataHas (set .[[SetData]] , next ) が false である場合、? IteratorClose (keysIterator , NormalCompletion (unused )) を実行する。 false を返す。true を返す。
24.2.4.13 Set.prototype.keys ( )
"keys" プロパティの初期値は、24.2.4.17 で定義される %Set.prototype.values% です。
注
反復の目的では、Set は各エントリのキーと値が同じ値である Map に似たものとして見えます。
24.2.4.14 get Set.prototype.size
Set.prototype.size は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
set を this 値とする。? RequireInternalSlot (set , [[SetData]] ) を実行する。 size を SetDataSize (set .[[SetData]] ) とする。𝔽 (size ) を返す。
24.2.4.15 Set.prototype.symmetricDifference ( other )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? RequireInternalSlot (set , [[SetData]] ) を実行する。 otherRecord を ? GetSetRecord (other ) とする。keysIterator を ? GetIteratorFromMethod (otherRecord .[[SetObject]] , otherRecord .[[Keys]] ) とする。resultSetData を set .[[SetData]] のコピーとする。next を not-started とする。next が done でない間、次を繰り返す。next を ? IteratorStepValue (keysIterator ) に設定する。next が done でない場合、next を CanonicalizeKeyedCollectionKey (next ) に設定する。resultIndex を SetDataIndex (resultSetData , next ) とする。resultIndex が not-found である場合、alreadyInResult を false とする。そうでない場合、alreadyInResult を true とする。SetDataHas (set .[[SetData]] , next ) が true である場合、alreadyInResult が true である場合、resultSetData [resultIndex ] を empty に設定する。そうでない場合、alreadyInResult が false である場合、next を resultSetData に追加する。 result を OrdinaryObjectCreate (%Set.prototype% , « [[SetData]] ») とする。result .[[SetData]] を resultSetData に設定する。result を返す。
24.2.4.16 Set.prototype.union ( other )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? RequireInternalSlot (set , [[SetData]] ) を実行する。 otherRecord を ? GetSetRecord (other ) とする。keysIterator を ? GetIteratorFromMethod (otherRecord .[[SetObject]] , otherRecord .[[Keys]] ) とする。resultSetData を set .[[SetData]] のコピーとする。next を not-started とする。next が done でない間、次を繰り返す。next を ? IteratorStepValue (keysIterator ) に設定する。next が done でない場合、next を CanonicalizeKeyedCollectionKey (next ) に設定する。SetDataHas (resultSetData , next ) が false である場合、next を resultSetData に追加する。result を OrdinaryObjectCreate (%Set.prototype% , « [[SetData]] ») とする。result .[[SetData]] を resultSetData に設定する。result を返す。
24.2.4.17 Set.prototype.values ( )
このメソッドは呼び出されたとき、次の手順を実行します。
set を this 値とする。? CreateSetIterator (set , 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% プロパティの初期値は String 値 "Set" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
24.2.5 Set インスタンスのプロパティ
Set インスタンスは Set prototype オブジェクト からプロパティを継承する通常オブジェクト です。Set インスタンスは [[SetData]] 内部スロットも持ちます。
24.2.6 Set Iterator オブジェクト
Set Iterator は、以下で定義される構造を持ち、特定の Set インスタンスオブジェクトに対する特定の反復を表す通常オブジェクト です。Set Iterator オブジェクトには名前付きコンストラクター はありません。代わりに、Set Iterator オブジェクトは Set インスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。
24.2.6.1 CreateSetIterator ( set , kind )
抽象操作 CreateSetIterator。引数 set (ECMAScript 言語値 ) および kind ((key+value または value ))。戻り値:(正常完了 (値:Generator) または throw 完了 )。 そのような iterator を返す Set メソッドの iterator オブジェクトを作成するために使用されます。 呼び出されると、次の手順を実行する。
? RequireInternalSlot (set , [[SetData]] ) を実行する。 closure を、set と kind を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。index を 0 とする。entries を set .[[SetData]] とする。entriesCount を entries の要素数とする。index < entriesCount の間、次を繰り返す。entry を entries [index ] とする。index を index + 1 に設定する。entry が empty でない場合、kind が key+value である場合、result を CreateArrayFromList (« entry , entry ») とする。? GeneratorYield (CreateIteratorResultObject (result , false )) を実行する。 そうでない場合、表明 : kind は value である。? GeneratorYield (CreateIteratorResultObject (entry , false )) を実行する。 注記 : GeneratorYield によってこの抽象操作 の実行が一時停止している間に、entries の要素数が増加している可能性がある。entriesCount を entries の要素数に設定する。NormalCompletion (unused ) を返す。CreateIteratorFromClosure (closure , "%SetIteratorPrototype%" , %SetIteratorPrototype% ) を返す。
24.2.6.2 %SetIteratorPrototype% オブジェクト
%SetIteratorPrototype% オブジェクトは:
24.2.6.2.1 %SetIteratorPrototype%.next ( )
? GeneratorResume (this 値, empty , "%SetIteratorPrototype%" ) を返す。
24.2.6.2.2 %SetIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "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 に要求される観測可能な意味論を説明することのみを意図しています。実用的な実装モデルであることを意図したものではありません。
注
WeakMap と WeakSet は、WeakMap または WeakSet インスタンスが存在しなければオブジェクトまたはシンボルがアクセス不能になり、実装のガベージコレクション機構による資源回収の対象になる場合に、メモリ資源を「リーク」しない方法で状態をオブジェクトまたはシンボルへ動的に関連付ける機構を提供することを意図しています。この特性は、WeakMap または WeakSet インスタンスからキーへの、オブジェクト/シンボルごとの逆引きマッピングを使用することで実現できます。代わりに、各 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 ] )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 map を ? OrdinaryCreateFromConstructor (NewTarget, "%WeakMap.prototype%" , « [[WeakMapData]] ») とする。map .[[WeakMapData]] を新しい空の List に設定する。iterable が undefined または null のいずれかである場合、map を返す。adder を ? Get (map , "set" ) とする。IsCallable (adder ) が false である場合、TypeError 例外をスローする。? AddEntriesFromIterable (map , iterable , adder ) を返す。
注
パラメーター iterable が存在する場合、最初の要素が WeakMap のキーとして使用される値で、2番目の要素がそのキーに関連付ける値である2要素の array-like オブジェクトを生成する iterator オブジェクトを返す %Symbol.iterator% メソッドを実装するオブジェクトであることが期待されます。
24.3.2 WeakMap コンストラクターのプロパティ
WeakMap コンストラクター は:
24.3.2.1 WeakMap.prototype
WeakMap.prototype の初期値は WeakMap prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
24.3.3 WeakMap Prototype オブジェクトのプロパティ
WeakMap prototype オブジェクト は:
24.3.3.1 WeakMap.prototype.constructor
WeakMap.prototype.constructor の初期値は %WeakMap% です。
24.3.3.2 WeakMap.prototype.delete ( key )
このメソッドは呼び出されたとき、次の手順を実行します。
weakMap を this 値とする。? RequireInternalSlot (weakMap , [[WeakMapData]] ) を実行する。 CanBeHeldWeakly (key ) が false である場合、false を返す。weakMap .[[WeakMapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、entry .[[Key]] を empty に設定する。entry .[[Value]] を empty に設定する。true を返す。false を返す。
注
値 empty は、エントリが削除されたことを示すための仕様上の手段として使用されます。実際の実装では、内部データ構造からエントリを物理的に削除するなど、別の処理を行ってもかまいません。
24.3.3.3 WeakMap.prototype.get ( key )
このメソッドは呼び出されたとき、次の手順を実行します。
weakMap を this 値とする。? RequireInternalSlot (weakMap , [[WeakMapData]] ) を実行する。 CanBeHeldWeakly (key ) が false である場合、undefined を返す。weakMap .[[WeakMapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、entry .[[Value]] を返す。undefined を返す。
24.3.3.4 WeakMap.prototype.getOrInsert ( key , value )
このメソッドは呼び出されたとき、次の手順を実行します。
weakMap を this 値とする。? RequireInternalSlot (weakMap , [[WeakMapData]] ) を実行する。 CanBeHeldWeakly (key ) が false である場合、TypeError 例外をスローする。weakMap .[[WeakMapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、entry .[[Value]] を返す。entry を Record { [[Key]] : key , [[Value]] : value } とする。entry を weakMap .[[WeakMapData]] に追加する。value を返す。
24.3.3.5 WeakMap.prototype.getOrInsertComputed ( key , callback )
このメソッドは呼び出されたとき、次の手順を実行します。
weakMap を this 値とする。? RequireInternalSlot (weakMap , [[WeakMapData]] ) を実行する。 CanBeHeldWeakly (key ) が false である場合、TypeError 例外をスローする。IsCallable (callback ) が false である場合、TypeError 例外をスローする。weakMap .[[WeakMapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、entry .[[Value]] を返す。value を ? Call (callback , undefined , « key ») とする。注記 : callback の実行中に WeakMap が変更されている可能性がある。weakMap .[[WeakMapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、entry .[[Value]] を value に設定する。value を返す。entry を Record { [[Key]] : key , [[Value]] : value } とする。entry を weakMap .[[WeakMapData]] に追加する。value を返す。
24.3.3.6 WeakMap.prototype.has ( key )
このメソッドは呼び出されたとき、次の手順を実行します。
weakMap を this 値とする。? RequireInternalSlot (weakMap , [[WeakMapData]] ) を実行する。 CanBeHeldWeakly (key ) が false である場合、false を返す。weakMap .[[WeakMapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、true を返す。false を返す。
24.3.3.7 WeakMap.prototype.set ( key , value )
このメソッドは呼び出されたとき、次の手順を実行します。
weakMap を this 値とする。? RequireInternalSlot (weakMap , [[WeakMapData]] ) を実行する。 CanBeHeldWeakly (key ) が false である場合、TypeError 例外をスローする。weakMap .[[WeakMapData]] の各 Record { [[Key]] , [[Value]] } entry について、次を行う。entry .[[Key]] が empty でなく、SameValue (entry .[[Key]] , key ) が true である場合、entry .[[Value]] を value に設定する。weakMap を返す。entry を Record { [[Key]] : key , [[Value]] : value } とする。entry を weakMap .[[WeakMapData]] に追加する。weakMap を返す。
24.3.3.8 WeakMap.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "WeakMap" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
24.3.4 WeakMap インスタンスのプロパティ
WeakMap インスタンスは WeakMap prototype オブジェクト からプロパティを継承する通常オブジェクト です。WeakMap インスタンスは [[WeakMapData]] 内部スロットも持ちます。
24.4 WeakSet オブジェクト
WeakSet はオブジェクトおよび/またはシンボルのコレクションです。異なるオブジェクトまたはシンボルは、WeakSet のコレクション内の要素として1回だけ出現できます。WeakSet に特定の値が含まれているかどうかを問い合わせることはできますが、保持している値を列挙する機構は提供されません。特定の条件では、9.9.3 で説明するように、生存していない値は WeakSet の要素から削除されます。
実装は、WeakSet に含まれる値がアクセス不能になってから、その値が WeakSet から削除されるまでの間に、任意に決定された遅延を設けてもかまいません。この遅延を ECMAScript プログラムから観測できると、プログラム実行に影響を与える不確定性の原因になります。そのため、ECMAScript 実装は、観測者が観測対象の値を提示することを必要とせずに WeakSet に特定の値が含まれるかどうかを判定する手段を提供してはなりません。
WeakSet は、平均してコレクション内の要素数に対して劣線形のアクセス時間を提供するハッシュテーブルまたはその他の機構を使用して実装されなければなりません。この仕様で使用されるデータ構造は、WeakSet に要求される観測可能な意味論を説明することのみを意図しています。実用的な実装モデルであることを意図したものではありません。
注
24.4.1 WeakSet コンストラクター
WeakSet コンストラクター は:
%WeakSet% です。
グローバルオブジェクト の "WeakSet" プロパティの初期値です。
コンストラクター として呼び出されたとき、新しい WeakSet を作成して初期化します。
関数として呼び出されることを意図しておらず、そのように呼び出されると例外をスローします。
クラス定義の extends 節の値として使用できます。規定された WeakSet の動作を継承しようとするサブクラスコンストラクター は、WeakSet.prototype の組込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するため、WeakSet コンストラクター への super 呼出しを含まなければなりません。
24.4.1.1 WeakSet ( [ iterable ] )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 set を ? OrdinaryCreateFromConstructor (NewTarget, "%WeakSet.prototype%" , « [[WeakSetData]] ») とする。set .[[WeakSetData]] を新しい空の List に設定する。iterable が undefined または null のいずれかである場合、set を返す。adder を ? Get (set , "add" ) とする。IsCallable (adder ) が false である場合、TypeError 例外をスローする。iteratorRecord を ? GetIterator (iterable , sync ) とする。次を繰り返す。next を ? IteratorStepValue (iteratorRecord ) とする。next が done である場合、set を返す。status を Completion (Call (adder , set , « next »)) とする。IfAbruptCloseIterator (status , iteratorRecord )。
24.4.2 WeakSet コンストラクターのプロパティ
WeakSet コンストラクター は:
24.4.2.1 WeakSet.prototype
WeakSet.prototype の初期値は WeakSet prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
24.4.3 WeakSet Prototype オブジェクトのプロパティ
WeakSet prototype オブジェクト は:
24.4.3.1 WeakSet.prototype.add ( value )
このメソッドは呼び出されたとき、次の手順を実行します。
weakSet を this 値とする。? RequireInternalSlot (weakSet , [[WeakSetData]] ) を実行する。 CanBeHeldWeakly (value ) が false である場合、TypeError 例外をスローする。weakSet .[[WeakSetData]] の各要素 entry について、次を行う。entry が empty でなく、SameValue (entry , value ) が true である場合、weakSet を返す。value を weakSet .[[WeakSetData]] に追加する。weakSet を返す。
24.4.3.2 WeakSet.prototype.constructor
WeakSet.prototype.constructor の初期値は %WeakSet% です。
24.4.3.3 WeakSet.prototype.delete ( value )
このメソッドは呼び出されたとき、次の手順を実行します。
weakSet を this 値とする。? RequireInternalSlot (weakSet , [[WeakSetData]] ) を実行する。 CanBeHeldWeakly (value ) が false である場合、false を返す。weakSet .[[WeakSetData]] の各要素 entry について、次を行う。entry が empty でなく、SameValue (entry , value ) が true である場合、値が entry である weakSet .[[WeakSetData]] の要素を、値が empty である要素に置き換える。 true を返す。false を返す。
注
値 empty は、エントリが削除されたことを示すための仕様上の手段として使用されます。実際の実装では、内部データ構造からエントリを物理的に削除するなど、別の処理を行ってもかまいません。
24.4.3.4 WeakSet.prototype.has ( value )
このメソッドは呼び出されたとき、次の手順を実行します。
weakSet を this 値とする。? RequireInternalSlot (weakSet , [[WeakSetData]] ) を実行する。 CanBeHeldWeakly (value ) が false である場合、false を返す。weakSet .[[WeakSetData]] の各要素 entry について、次を行う。entry が empty でなく、SameValue (entry , value ) が true である場合、true を返す。false を返す。
24.4.3.5 WeakSet.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "WeakSet" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
24.4.4 WeakSet インスタンスのプロパティ
WeakSet インスタンスは WeakSet prototype オブジェクト からプロパティを継承する通常オブジェクト です。WeakSet インスタンスは [[WeakSetData]] 内部スロットも持ちます。
24.5 キー付きコレクションのための抽象操作
24.5.1 CanonicalizeKeyedCollectionKey ( key )
抽象操作 CanonicalizeKeyedCollectionKey。引数 key (ECMAScript 言語値 )。戻り値:ECMAScript 言語値 。 呼び出されると、次の手順を実行する。
key が -0 𝔽 である場合、+0 𝔽 を返す。key を返す。
25 構造化データ
25.1 ArrayBuffer オブジェクト
25.1.1 表記法
この節、25.4 、および 29 における以下の説明では、read-modify-write modification function 内部データ構造を使用します。
read-modify-write modification function とは、byte 値の2つの List を引数として受け取り、byte 値の List を返す Abstract Closure として表現される数学関数です。これらの Abstract Closure は次のすべての性質を満たします。
すべてのアルゴリズム手順を不可分に実行します。
個々のアルゴリズム手順は観測できません。
注
read-modify-write modification function のアルゴリズム手順が純粋な数学関数を構成することの検証を助けるため、次の編集上の規約が推奨されます。
25.1.2 固定長およびサイズ変更可能な ArrayBuffer オブジェクト
固定長 ArrayBuffer とは、作成後に byte length を変更できない ArrayBuffer です。
サイズ変更可能な ArrayBuffer とは、ArrayBuffer.prototype.resize ( newLength ) の呼出しによって作成後に byte length を変更できる ArrayBuffer です。
作成される ArrayBuffer オブジェクトの種類は、ArrayBuffer ( length [ , options ] ) に渡される引数に依存します。
25.1.3 ArrayBuffer オブジェクトのための抽象操作
25.1.3.1 AllocateArrayBuffer ( ctor , byteLength [ , maxByteLength ] )
抽象操作 AllocateArrayBuffer。引数 ctor (コンストラクター ) および byteLength (非負整数)および省略可能な引数 maxByteLength ((非負整数 または empty ))。戻り値:(正常完了 (値:ArrayBuffer) または throw 完了 )。 ArrayBuffer を作成するために使用されます。 呼び出されると、次の手順を実行する。
slots を « [[ArrayBufferData]] , [[ArrayBufferByteLength]] , [[ArrayBufferDetachKey]] » とする。maxByteLength が存在し、かつ maxByteLength が empty でない場合、allocatingResizableBuffer を true とする。そうでない場合、allocatingResizableBuffer を false とする。allocatingResizableBuffer が true である場合、byteLength > maxByteLength である場合、RangeError 例外をスローする。slots に [[ArrayBufferMaxByteLength]] を追加する。obj を ? OrdinaryCreateFromConstructor (ctor , "%ArrayBuffer.prototype%" , slots ) とする。block を ? CreateByteDataBlock (byteLength ) とする。obj .[[ArrayBufferData]] を block に設定する。obj .[[ArrayBufferByteLength]] を byteLength に設定する。allocatingResizableBuffer が true である場合、maxByteLength バイトからなる Data Block block を作成できない場合、RangeError 例外をスローする。注記 : サイズ変更可能な ArrayBuffer は、インプレースで拡張できるように設計されている。たとえば、仮想メモリを事前に予約できない場合、実装は例外をスローしてもよい。obj .[[ArrayBufferMaxByteLength]] を maxByteLength に設定する。obj を返す。
25.1.3.2 ArrayBufferByteLength ( arrayBuffer , order )
抽象操作 ArrayBufferByteLength。引数 arrayBuffer ((ArrayBuffer または SharedArrayBuffer)) および order ((seq-cst または unordered ))。戻り値:非負整数。 呼び出されると、次の手順を実行する。
IsGrowableSharedArrayBuffer (arrayBuffer ) が true である場合、bufferByteLengthBlock を arrayBuffer .[[ArrayBufferByteLengthData]] とする。rawLength を GetRawBytesFromSharedBlock (bufferByteLengthBlock , 0, biguint64 , true , order ) とする。agentRecord を周囲の agent の Agent Record とする。isLittleEndian を agentRecord .[[LittleEndian]] とする。ℝ (RawBytesToNumeric (biguint64 , rawLength , isLittleEndian )) を返す。表明 : IsDetachedBuffer (arrayBuffer ) は false である。arrayBuffer .[[ArrayBufferByteLength]] を返す。
25.1.3.3 ArrayBufferCopyAndDetach ( arrayBuffer , newLength , preserveResizability )
抽象操作 ArrayBufferCopyAndDetach。引数 arrayBuffer (ECMAScript 言語値 )、newLength (ECMAScript 言語値 ) および preserveResizability ((preserve-resizability または fixed-length ))。戻り値:(正常完了 (値:ArrayBuffer) または throw 完了 )。 呼び出されると、次の手順を実行する。
? RequireInternalSlot (arrayBuffer , [[ArrayBufferData]] ) を実行する。 IsSharedArrayBuffer (arrayBuffer ) が true である場合、TypeError 例外をスローする。newLength が undefined である場合、newByteLength を arrayBuffer .[[ArrayBufferByteLength]] とする。そうでない場合、newByteLength を ? ToIndex (newLength ) とする。 IsDetachedBuffer (arrayBuffer ) が true である場合、TypeError 例外をスローする。preserveResizability が preserve-resizability であり、IsFixedLengthArrayBuffer (arrayBuffer ) が false である場合、newMaxByteLength を arrayBuffer .[[ArrayBufferMaxByteLength]] とする。そうでない場合、newMaxByteLength を empty とする。 arrayBuffer .[[ArrayBufferDetachKey]] が undefined でない場合、TypeError 例外をスローする。newBuffer を ? AllocateArrayBuffer (%ArrayBuffer% , newByteLength , newMaxByteLength ) とする。copyLength を min (newByteLength , arrayBuffer .[[ArrayBufferByteLength]] ) とする。fromBlock を arrayBuffer .[[ArrayBufferData]] とする。toBlock を newBuffer .[[ArrayBufferData]] とする。CopyDataBlockBytes (toBlock , 0, fromBlock , 0, copyLength ) を実行する。注記 : 新しい Data Block の作成も、古い Data Block からのコピーも観測できない。実装はこのメソッドをゼロコピー移動または realloc として実装してもよい。! DetachArrayBuffer (arrayBuffer ) を実行する。 newBuffer を返す。
25.1.3.4 IsDetachedBuffer ( arrayBuffer )
抽象操作 IsDetachedBuffer。引数 arrayBuffer ((ArrayBuffer または SharedArrayBuffer))。戻り値:Boolean。 呼び出されると、次の手順を実行する。
arrayBuffer .[[ArrayBufferData]] が null である場合、true を返す。false を返す。
25.1.3.5 DetachArrayBuffer ( arrayBuffer [ , key ] )
抽象操作 DetachArrayBuffer。引数 arrayBuffer (ArrayBuffer)および省略可能な引数 key (任意の値)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
表明 : IsSharedArrayBuffer (arrayBuffer ) は false である。key が存在しない場合、key を undefined に設定する。arrayBuffer .[[ArrayBufferDetachKey]] が key でない場合、TypeError 例外をスローする。arrayBuffer .[[ArrayBufferData]] を null に設定する。arrayBuffer .[[ArrayBufferByteLength]] を 0 に設定する。unused を返す。
注
ArrayBuffer インスタンスを detach すると、その backing store として使用される Data Block がインスタンスから切り離され、バッファの byte length が 0 に設定されます。
25.1.3.6 CloneArrayBuffer ( sourceBuffer , sourceByteOffset , sourceLength )
抽象操作 CloneArrayBuffer。引数 sourceBuffer ((ArrayBuffer または SharedArrayBuffer))、sourceByteOffset (非負整数) および sourceLength (非負整数)。戻り値:(正常完了 (値:ArrayBuffer) または throw 完了 )。 sourceByteOffset から始まり sourceLength byte 続く範囲の sourceBuffer のデータのコピーをデータとして持つ新しい ArrayBuffer を作成します。 呼び出されると、次の手順を実行する。
表明 : IsDetachedBuffer (sourceBuffer ) は false である。targetBuffer を ? AllocateArrayBuffer (%ArrayBuffer% , sourceLength ) とする。sourceBlock を sourceBuffer .[[ArrayBufferData]] とする。targetBlock を targetBuffer .[[ArrayBufferData]] とする。CopyDataBlockBytes (targetBlock , 0, sourceBlock , sourceByteOffset , sourceLength ) を実行する。targetBuffer を返す。
25.1.3.7 GetArrayBufferMaxByteLengthOption ( options )
抽象操作 GetArrayBufferMaxByteLengthOption。引数 options (ECMAScript 言語値 )。戻り値:(正常完了 (値:(非負整数 または empty )) または throw 完了 )。 呼び出されると、次の手順を実行する。
options が Object でない場合、empty を返す。maxByteLength を ? Get (options , "maxByteLength" ) とする。maxByteLength が undefined である場合、empty を返す。? ToIndex (maxByteLength ) を返す。
25.1.3.8 HostResizeArrayBuffer ( buffer , newByteLength )
ホスト定義の抽象操作 HostResizeArrayBuffer。引数 buffer (ArrayBuffer) および newByteLength (非負整数)。戻り値:(正常完了 (値:(handled または unhandled )) または throw 完了 )。 ホスト に buffer の実装定義 のサイズ変更を実行する機会を与えます。ホスト が buffer のサイズ変更を処理しないことを選択した場合、既定の動作を使用するため unhandled を返してもかまいません。
HostResizeArrayBuffer の実装は次の要件に適合しなければなりません。
この抽象操作 は buffer を detach しません。
この抽象操作 が handled で正常に完了した場合、buffer .[[ArrayBufferByteLength]] は newByteLength です。
HostResizeArrayBuffer の既定の実装は NormalCompletion (unhandled ) を返します。
25.1.3.9 IsFixedLengthArrayBuffer ( arrayBuffer )
抽象操作 IsFixedLengthArrayBuffer。引数 arrayBuffer ((ArrayBuffer または SharedArrayBuffer))。戻り値:Boolean。 呼び出されると、次の手順を実行する。
arrayBuffer が [[ArrayBufferMaxByteLength]] 内部スロットを持つ場合、false を返す。true を返す。
25.1.3.10 IsUnsignedElementType ( type )
抽象操作 IsUnsignedElementType。引数 type (TypedArray 要素型 )。戻り値:Boolean。 引数 type が符号なし TypedArray 要素型 であるかどうかを検証します。 呼び出されると、次の手順を実行する。
type が uint8 、uint8clamped 、uint16 、uint32 、または biguint64 のいずれかである場合、true を返す。false を返す。
25.1.3.11 IsUnclampedIntegerElementType ( type )
抽象操作 IsUnclampedIntegerElementType。引数 type (TypedArray 要素型 )。戻り値:Boolean。 引数 type が uint8clamped を除く Integer TypedArray 要素型 であるかどうかを検証します。 呼び出されると、次の手順を実行する。
type が int8 、uint8 、int16 、uint16 、int32 、または uint32 のいずれかである場合、true を返す。false を返す。
25.1.3.12 IsBigIntElementType ( type )
抽象操作 IsBigIntElementType。引数 type (TypedArray 要素型 )。戻り値:Boolean。 引数 type が BigInt TypedArray 要素型 であるかどうかを検証します。 呼び出されると、次の手順を実行する。
type が biguint64 または bigint64 のいずれかである場合、true を返す。false を返す。
25.1.3.13 IsNoTearConfiguration ( type , order )
抽象操作 IsNoTearConfiguration。引数 type (TypedArray 要素型 ) および order ((seq-cst 、unordered または init ))。戻り値:Boolean。 呼び出されると、次の手順を実行する。
IsUnclampedIntegerElementType (type ) が true である場合、true を返す。IsBigIntElementType (type ) が true かつ order が seq-cst である場合、true を返す。false を返す。
25.1.3.14 RawBytesToNumeric ( type , rawBytes , isLittleEndian )
抽象操作 RawBytesToNumeric。引数 type (TypedArray 要素型 )、rawBytes (リスト (要素:バイト値 )) および isLittleEndian (Boolean)。戻り値:(Number または BigInt)。 呼び出されると、次の手順を実行する。
elementSize を Element Type type について 表 71 で規定される Element Size 値とする。isLittleEndian が false である場合、rawBytes の要素の順序を反転する。type が float16 である場合、value を、rawBytes の byte 要素を連結し、IEEE 754-2019 binary16 値の little-endian ビット文字列エンコーディングとして解釈したものとする。value が NaN である場合、NaN を返す。value に対応する Number 値 を返す。type が float32 である場合、value を、rawBytes の byte 要素を連結し、IEEE 754-2019 binary32 値の little-endian ビット文字列エンコーディングとして解釈したものとする。value が NaN である場合、NaN を返す。value に対応する Number 値 を返す。type が float64 である場合、value を、rawBytes の byte 要素を連結し、IEEE 754-2019 binary64 値の little-endian ビット文字列エンコーディングとして解釈したものとする。value が NaN である場合、NaN を返す。value に対応する Number 値 を返す。IsUnsignedElementType (type ) が true である場合、intValue を、rawBytes の byte 要素を連結し、符号なし little-endian 2進数のビット文字列エンコーディングとして解釈したものとする。そうでない場合、intValue を、rawBytes の byte 要素を連結し、ビット長 elementSize × 8 の little-endian 2の補数2進数のビット文字列エンコーディングとして解釈したものとする。 IsBigIntElementType (type ) が true である場合、intValue に対応する BigInt 値 を返す。intValue に対応する Number 値 を返す。
25.1.3.15 GetRawBytesFromSharedBlock ( block , byteIndex , type , isTypedArray , order )
抽象操作 GetRawBytesFromSharedBlock。引数 block (共有データブロック )、byteIndex (非負整数)、type (TypedArray 要素型 )、isTypedArray (Boolean) および order ((seq-cst または unordered ))。戻り値:リスト (要素:バイト値 )。 呼び出されると、次の手順を実行する。
elementSize を Element Type type について 表 71 で規定される Element Size 値とする。agentRecord を周囲の agent の Agent Record とする。execution を agentRecord .[[CandidateExecution]] とする。eventsRecord を、[[AgentSignifier]] が AgentSignifier () である execution .[[EventsRecords]] の Agent Events Record とする。isTypedArray が true かつ IsNoTearConfiguration (type , order ) が true である場合、noTear を true とする。そうでない場合、noTear を false とする。rawValue を、要素が非決定的に選択された byte 値である長さ elementSize の List とする。注記 : 実装では、rawValue は基礎となるハードウェア上の非 atomic または atomic read 命令の結果である。この非決定性は、弱い一貫性を持つハードウェアの観測可能な動作を記述するためのメモリモデル の意味論的規定である。readEvent を ReadSharedMemory { [[Order]] : order , [[NoTear]] : noTear , [[Block]] : block , [[ByteIndex]] : byteIndex , [[ElementSize]] : elementSize } とする。readEvent を eventsRecord .[[EventList]] に追加する。Chosen Value Record { [[Event]] : readEvent , [[ChosenValue]] : rawValue } を execution .[[ChosenValues]] に追加する。rawValue を返す。
25.1.3.16 GetValueFromBuffer ( arrayBuffer , byteIndex , type , isTypedArray , order [ , isLittleEndian ] )
抽象操作 GetValueFromBuffer。引数 arrayBuffer ((ArrayBuffer または SharedArrayBuffer))、byteIndex (非負整数)、type (TypedArray 要素型 )、isTypedArray (Boolean) および order ((seq-cst または unordered ))および省略可能な引数 isLittleEndian (Boolean)。戻り値:(Number または BigInt)。 呼び出されると、次の手順を実行する。
表明 : IsDetachedBuffer (arrayBuffer ) は false である。表明 : arrayBuffer には byteIndex から始まり type の値を表現するのに十分な byte が存在する。block を arrayBuffer .[[ArrayBufferData]] とする。elementSize を Element Type type について 表 71 で規定される Element Size 値とする。IsSharedArrayBuffer (arrayBuffer ) が true である場合、表明 : block は Shared Data Block である。rawValue を GetRawBytesFromSharedBlock (block , byteIndex , type , isTypedArray , order ) とする。そうでない場合、rawValue を、byteIndex (含む)から byteIndex + elementSize (含まない)までの区間 のインデックスにある block の byte を要素とする List とする。 表明 : rawValue の要素数は elementSize である。isLittleEndian が存在しない場合、agentRecord を周囲の agent の Agent Record とする。isLittleEndian を agentRecord .[[LittleEndian]] に設定する。RawBytesToNumeric (type , rawValue , isLittleEndian ) を返す。
25.1.3.17 NumericToRawBytes ( type , value , isLittleEndian )
抽象操作 NumericToRawBytes。引数 type (TypedArray 要素型 )、value ((Number または BigInt)) および isLittleEndian (Boolean)。戻り値:リスト (要素:バイト値 )。 呼び出されると、次の手順を実行する。
type が float16 である場合、rawBytes を、roundTiesToEven モードを使用して value を IEEE 754-2019 binary16 形式へ変換した結果である2 byte を要素とする List とする。byte は little endian 順に並べる。value が NaN である場合、rawBytes は実装が選択した任意の IEEE 754-2019 binary16 形式 NaN エンコーディングに設定してもよい。実装は、実装上区別可能な各 NaN 値について常に同じエンコーディングを選択しなければならない。そうでなく、type が float32 である場合、rawBytes を、roundTiesToEven モードを使用して value を IEEE 754-2019 binary32 形式へ変換した結果である4 byte を要素とする List とする。byte は little endian 順に並べる。value が NaN である場合、rawBytes は実装が選択した任意の IEEE 754-2019 binary32 形式 NaN エンコーディングに設定してもよい。実装は、実装上区別可能な各 NaN 値について常に同じエンコーディングを選択しなければならない。 そうでなく、type が float64 である場合、rawBytes を、value の IEEE 754-2019 binary64 形式エンコーディングである8 byte を要素とする List とする。byte は little endian 順に並べる。value が NaN である場合、rawBytes は実装が選択した任意の IEEE 754-2019 binary64 形式 NaN エンコーディングに設定してもよい。実装は、実装上区別可能な各 NaN 値について常に同じエンコーディングを選択しなければならない。 そうでない場合、n を Element Type type について 表 71 で規定される Element Size 値とする。conversionOperation を Element Type type について 表 71 の「Conversion Operation」列で名前が示される抽象操作 とする。intValue を ℝ (! conversionOperation (value )) とする。intValue ≥ 0 である場合、rawBytes を intValue の n -byte 2進エンコーディングを要素とする List とする。byte は little endian 順に並べる。そうでない場合、rawBytes を intValue の n -byte 2進2の補数エンコーディングを要素とする List とする。byte は little endian 順に並べる。 isLittleEndian が false である場合、rawBytes の要素の順序を反転する。rawBytes を返す。
25.1.3.18 SetValueInBuffer ( arrayBuffer , byteIndex , type , value , isTypedArray , order [ , isLittleEndian ] )
抽象操作 SetValueInBuffer。引数 arrayBuffer ((ArrayBuffer または SharedArrayBuffer))、byteIndex (非負整数)、type (TypedArray 要素型 )、value ((Number または BigInt))、isTypedArray (Boolean) および order ((seq-cst 、unordered または init ))および省略可能な引数 isLittleEndian (Boolean)。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : IsDetachedBuffer (arrayBuffer ) は false である。表明 : arrayBuffer には byteIndex から始まり type の値を表現するのに十分な byte が存在する。表明 : IsBigIntElementType (type ) が true である場合、value は BigInt である。そうでない場合、value は Number である。block を arrayBuffer .[[ArrayBufferData]] とする。elementSize を Element Type type について 表 71 で規定される Element Size 値とする。agentRecord を周囲の agent の Agent Record とする。isLittleEndian が存在しない場合、isLittleEndian を agentRecord .[[LittleEndian]] に設定する。rawBytes を NumericToRawBytes (type , value , isLittleEndian ) とする。IsSharedArrayBuffer (arrayBuffer ) が true である場合、execution を agentRecord .[[CandidateExecution]] とする。eventsRecord を、[[AgentSignifier]] が AgentSignifier () である execution .[[EventsRecords]] の Agent Events Record とする。isTypedArray が true かつ IsNoTearConfiguration (type , order ) が true である場合、noTear を true とする。そうでない場合、noTear を false とする。WriteSharedMemory { [[Order]] : order , [[NoTear]] : noTear , [[Block]] : block , [[ByteIndex]] : byteIndex , [[ElementSize]] : elementSize , [[Payload]] : rawBytes } を eventsRecord .[[EventList]] に追加する。そうでない場合、rawBytes の個々の byte を block [byteIndex ] から開始して block に保存する。 unused を返す。
25.1.3.19 GetModifySetValueInBuffer ( arrayBuffer , byteIndex , type , value , op )
抽象操作 GetModifySetValueInBuffer。引数 arrayBuffer ((ArrayBuffer または SharedArrayBuffer))、byteIndex (非負整数)、type (TypedArray 要素型 )、value ((Number または BigInt)) および op (a read-modify-write modification function )。戻り値:(Number または BigInt)。 呼び出されると、次の手順を実行する。
表明 : IsDetachedBuffer (arrayBuffer ) は false である。表明 : arrayBuffer には byteIndex から始まり type の値を表現するのに十分な byte が存在する。表明 : IsBigIntElementType (type ) が true である場合、value は BigInt である。そうでない場合、value は Number である。block を arrayBuffer .[[ArrayBufferData]] とする。elementSize を Element Type type について 表 71 で規定される Element Size 値とする。agentRecord を周囲の agent の Agent Record とする。isLittleEndian を agentRecord .[[LittleEndian]] とする。rawBytes を NumericToRawBytes (type , value , isLittleEndian ) とする。IsSharedArrayBuffer (arrayBuffer ) が true である場合、execution を agentRecord .[[CandidateExecution]] とする。eventsRecord を、[[AgentSignifier]] が AgentSignifier () である execution .[[EventsRecords]] の Agent Events Record とする。rawBytesRead を、要素が非決定的に選択された byte 値である長さ elementSize の List とする。注記 : 実装では、rawBytesRead は基礎となるハードウェア上の load-link、load-exclusive、または read-modify-write 命令のオペランドの結果である。この非決定性は、弱い一貫性を持つハードウェアの観測可能な動作を記述するためのメモリモデル の意味論的規定である。rmwEvent を ReadModifyWriteSharedMemory { [[Order]] : seq-cst , [[NoTear]] : true , [[Block]] : block , [[ByteIndex]] : byteIndex , [[ElementSize]] : elementSize , [[Payload]] : rawBytes , [[ModifyOp]] : op } とする。rmwEvent を eventsRecord .[[EventList]] に追加する。Chosen Value Record { [[Event]] : rmwEvent , [[ChosenValue]] : rawBytesRead } を execution .[[ChosenValues]] に追加する。そうでない場合、rawBytesRead を、block [byteIndex ] から始まる elementSize byte の列を要素とする長さ elementSize の List とする。rawBytesModified を op (rawBytesRead , rawBytes ) とする。rawBytesModified の個々の byte を block [byteIndex ] から開始して block に保存する。 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 ] )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 byteLength を ? ToIndex (length ) とする。requestedMaxByteLength を ? GetArrayBufferMaxByteLengthOption (options ) とする。? AllocateArrayBuffer (NewTarget, byteLength , requestedMaxByteLength ) を返す。
25.1.5 ArrayBuffer コンストラクターのプロパティ
ArrayBuffer コンストラクター は:
25.1.5.1 ArrayBuffer.isView ( arg )
この関数は呼び出されたとき、次の手順を実行します。
arg が Object でない場合、false を返す。arg が [[ViewedArrayBuffer]] 内部スロットを持つ場合、true を返す。false を返す。
25.1.5.2 ArrayBuffer.prototype
ArrayBuffer.prototype の初期値は ArrayBuffer prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
25.1.5.3 get ArrayBuffer [ %Symbol.species% ]
ArrayBuffer[%Symbol.species%] は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
this 値を返す。
この関数の "name" プロパティの値は "get [Symbol.species]" です。
注
25.1.6 ArrayBuffer Prototype オブジェクトのプロパティ
ArrayBuffer prototype オブジェクト は:
%ArrayBuffer.prototype% です。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
通常オブジェクト です。
[[ArrayBufferData]] または [[ArrayBufferByteLength]] 内部スロットを持ちません。
25.1.6.1 get ArrayBuffer.prototype.byteLength
ArrayBuffer.prototype.byteLength は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[ArrayBufferData]] ) を実行する。 IsSharedArrayBuffer (obj ) が true である場合、TypeError 例外をスローする。IsDetachedBuffer (obj ) が true である場合、+0 𝔽 を返す。length を obj .[[ArrayBufferByteLength]] とする。𝔽 (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 アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[ArrayBufferData]] ) を実行する。 IsSharedArrayBuffer (obj ) が true である場合、TypeError 例外をスローする。IsDetachedBuffer (obj ) を返す。
25.1.6.4 get ArrayBuffer.prototype.maxByteLength
ArrayBuffer.prototype.maxByteLength は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[ArrayBufferData]] ) を実行する。 IsSharedArrayBuffer (obj ) が true である場合、TypeError 例外をスローする。IsDetachedBuffer (obj ) が true である場合、+0 𝔽 を返す。IsFixedLengthArrayBuffer (obj ) が true である場合、length を obj .[[ArrayBufferByteLength]] とする。そうでない場合、length を obj .[[ArrayBufferMaxByteLength]] とする。 𝔽 (length ) を返す。
25.1.6.5 get ArrayBuffer.prototype.resizable
ArrayBuffer.prototype.resizable は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[ArrayBufferData]] ) を実行する。 IsSharedArrayBuffer (obj ) が true である場合、TypeError 例外をスローする。IsFixedLengthArrayBuffer (obj ) が false である場合、true を返す。false を返す。
25.1.6.6 ArrayBuffer.prototype.resize ( newLength )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[ArrayBufferMaxByteLength]] ) を実行する。 IsSharedArrayBuffer (obj ) が true である場合、TypeError 例外をスローする。newByteLength を ? ToIndex (newLength ) とする。IsDetachedBuffer (obj ) が true である場合、TypeError 例外をスローする。newByteLength > obj .[[ArrayBufferMaxByteLength]] である場合、RangeError 例外をスローする。hostHandled を ? HostResizeArrayBuffer (obj , newByteLength ) とする。hostHandled が handled である場合、undefined を返す。oldBlock を obj .[[ArrayBufferData]] とする。newBlock を ? CreateByteDataBlock (newByteLength ) とする。copyLength を min (newByteLength , obj .[[ArrayBufferByteLength]] ) とする。CopyDataBlockBytes (newBlock , 0, oldBlock , 0, copyLength ) を実行する。注記 : 新しい Data Block の作成も、古い Data Block からのコピーも観測できない。実装はこのメソッドをインプレースの拡張または縮小として実装してもよい。obj .[[ArrayBufferData]] を newBlock に設定する。obj .[[ArrayBufferByteLength]] を newByteLength に設定する。undefined を返す。
25.1.6.7 ArrayBuffer.prototype.slice ( start , end )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[ArrayBufferData]] ) を実行する。 IsSharedArrayBuffer (obj ) が true である場合、TypeError 例外をスローする。IsDetachedBuffer (obj ) が true である場合、TypeError 例外をスローする。length を obj .[[ArrayBufferByteLength]] とする。first を ? ToClampedIndex (start , length ) とする。end が undefined である場合、final を length とする。そうでない場合、final を ? ToClampedIndex (end , length ) とする。newLength を max (final - first , 0) とする。ctor を ? SpeciesConstructor (obj , %ArrayBuffer% ) とする。new を ? Construct (ctor , « 𝔽 (newLength ) ») とする。? RequireInternalSlot (new , [[ArrayBufferData]] ) を実行する。 IsSharedArrayBuffer (new ) が true である場合、TypeError 例外をスローする。IsDetachedBuffer (new ) が true である場合、TypeError 例外をスローする。SameValue (new , obj ) が true である場合、TypeError 例外をスローする。new .[[ArrayBufferByteLength]] < newLength である場合、TypeError 例外をスローする。注記 : 上記手順の副作用によって obj が detach またはサイズ変更されている可能性がある。IsDetachedBuffer (obj ) が true である場合、TypeError 例外をスローする。fromBlock を obj .[[ArrayBufferData]] とする。toBlock を new .[[ArrayBufferData]] とする。currentLength を obj .[[ArrayBufferByteLength]] とする。maxCount を currentLength - first とする。maxCount > 0 である場合、count を min (newLength , maxCount ) とする。CopyDataBlockBytes (toBlock , 0, fromBlock , first , count ) を実行する。new を返す。
25.1.6.8 ArrayBuffer.prototype.transfer ( [ newLength ] )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。? ArrayBufferCopyAndDetach (obj , newLength , preserve-resizability ) を返す。
25.1.6.9 ArrayBuffer.prototype.transferToFixedLength ( [ newLength ] )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。? ArrayBufferCopyAndDetach (obj , newLength , fixed-length ) を返す。
25.1.6.10 ArrayBuffer.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "ArrayBuffer" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
25.1.7 ArrayBuffer インスタンスのプロパティ
ArrayBuffer インスタンスは ArrayBuffer prototype オブジェクト からプロパティを継承します。各 ArrayBuffer インスタンスは [[ArrayBufferData]] 内部スロット、[[ArrayBufferByteLength]] 内部スロット、および [[ArrayBufferDetachKey]] 内部スロットを持ちます。サイズ変更可能な ArrayBuffer インスタンスはそれぞれ [[ArrayBufferMaxByteLength]] 内部スロットを持ちます。
[[ArrayBufferData]] が null である ArrayBuffer インスタンスは detached であるとみなされ、ArrayBuffer インスタンスに含まれるデータへアクセスまたは変更するすべての演算子は失敗します。
[[ArrayBufferDetachKey]] が undefined 以外の値に設定されている ArrayBuffer インスタンスでは、すべての DetachArrayBuffer 呼出しが同じ「detach key」を引数として渡す必要があり、そうでなければ TypeError になります。この内部スロットは、この仕様のアルゴリズムによってではなく、特定の埋込み環境によってのみ設定されます。
25.1.8 サイズ変更可能な ArrayBuffer のガイドライン
注 1
以下は、サイズ変更可能な ArrayBuffer を扱う ECMAScript プログラマー向けのガイドラインです。
可能な場合、プログラムは配備環境でテストすることを推奨します。利用可能な物理メモリ量はハードウェアデバイス間で大きく異なります。同様に、仮想メモリサブシステムもハードウェアデバイス間およびオペレーティングシステム間で大きく異なります。64ビットのデスクトップ Web ブラウザーで out-of-memory エラーなしに実行できるアプリケーションでも、32ビットのモバイル Web ブラウザーではメモリ不足になる可能性があります。
サイズ変更可能な ArrayBuffer の "maxByteLength" オプションの値を選択する場合、アプリケーションに必要な最小のサイズを選択することを推奨します。"maxByteLength" は 1,073,741,824(230 byte、すなわち 1GiB)を超えないことを推奨します。
特定の最大サイズでサイズ変更可能な ArrayBuffer を正常に構築できたとしても、将来のサイズ変更が成功することを保証するものではないことに注意してください。
注 2
以下は、サイズ変更可能な ArrayBuffer を実装する ECMAScript 実装者向けのガイドラインです。
サイズ変更可能な ArrayBuffer は、サイズ変更時にコピーする方法、仮想メモリを事前に予約することによるインプレース拡張、またはコンストラクター の "maxByteLength" オプションの値に応じて両方を組み合わせる方法で実装できます。
Web ブラウザーのようにホスト がマルチテナントである(すなわち、多数の ECMAScript アプリケーションを同時に実行する)場合で、その実装が仮想メモリを予約してインプレース拡張を実装することを選択する場合、32ビット実装と64ビット実装の両方で "maxByteLength" ≥ 1GiB から 1.5GiB の値に対してスローすることを推奨します。これは、単一のアプリケーションが仮想メモリアドレス空間を使い果たす可能性を低減し、相互運用性のリスクを低減するためです。
MMU のない組込みデバイス上で動作するものなど、ホスト に仮想メモリがない場合、またはホスト がコピーによるサイズ変更のみを実装する場合、"maxByteLength" オプションには任意の Number 値 を受け入れてもかまいません。ただし、要求されたサイズのメモリブロックを決して割り当てられない場合は RangeError をスローすることを推奨します。たとえば、要求されたサイズがデバイス上で使用可能な最大メモリ量を超える場合です。
25.2 SharedArrayBuffer オブジェクト
25.2.1 固定長および拡張可能な SharedArrayBuffer オブジェクト
固定長 SharedArrayBuffer とは、作成後に byte length を変更できない SharedArrayBuffer です。
拡張可能な SharedArrayBuffer とは、SharedArrayBuffer.prototype.grow ( newLength ) の呼出しによって作成後に byte length を増加できる SharedArrayBuffer です。
作成される SharedArrayBuffer オブジェクトの種類は、SharedArrayBuffer ( length [ , options ] ) に渡される引数に依存します。
25.2.2 SharedArrayBuffer オブジェクトのための抽象操作
25.2.2.1 AllocateSharedArrayBuffer ( ctor , byteLength [ , maxByteLength ] )
抽象操作 AllocateSharedArrayBuffer。引数 ctor (コンストラクター ) および byteLength (非負整数)および省略可能な引数 maxByteLength ((非負整数 または empty ))。戻り値:(正常完了 (値:SharedArrayBuffer) または throw 完了 )。 SharedArrayBuffer を作成するために使用されます。 呼び出されると、次の手順を実行する。
slots を « [[ArrayBufferData]] » とする。maxByteLength が存在し、かつ maxByteLength が empty でない場合、allocatingGrowableBuffer を true とする。そうでない場合、allocatingGrowableBuffer を false とする。allocatingGrowableBuffer が true である場合、byteLength > maxByteLength である場合、RangeError 例外をスローする。slots に [[ArrayBufferByteLengthData]] および [[ArrayBufferMaxByteLength]] を追加する。そうでない場合、slots に [[ArrayBufferByteLength]] を追加する。 obj を ? OrdinaryCreateFromConstructor (ctor , "%SharedArrayBuffer.prototype%" , slots ) とする。allocatingGrowableBuffer が true である場合、allocationLength を maxByteLength とする。そうでない場合、allocationLength を byteLength とする。block を ? CreateSharedByteDataBlock (allocationLength ) とする。obj .[[ArrayBufferData]] を block に設定する。allocatingGrowableBuffer が true である場合、表明 : byteLength ≤ maxByteLength 。byteLengthBlock を ? CreateSharedByteDataBlock (8) とする。SetValueInBuffer (byteLengthBlock , 0, biguint64 , ℤ (byteLength ), true , seq-cst ) を実行する。obj .[[ArrayBufferByteLengthData]] を byteLengthBlock に設定する。obj .[[ArrayBufferMaxByteLength]] を maxByteLength に設定する。そうでない場合、obj .[[ArrayBufferByteLength]] を byteLength に設定する。 obj を返す。
25.2.2.2 IsSharedArrayBuffer ( obj )
抽象操作 IsSharedArrayBuffer。引数 obj ((ArrayBuffer または SharedArrayBuffer))。戻り値:Boolean。 オブジェクトが SharedArrayBuffer であるかどうかを判定します。 呼び出されると、次の手順を実行する。
obj .[[ArrayBufferData]] が Shared Data Block である場合、true を返す。false を返す。
25.2.2.3 IsGrowableSharedArrayBuffer ( obj )
抽象操作 IsGrowableSharedArrayBuffer。引数 obj ((ArrayBuffer または SharedArrayBuffer))。戻り値:Boolean。 オブジェクトが拡張可能な SharedArrayBuffer であるかどうかを判定します。 呼び出されると、次の手順を実行する。
IsSharedArrayBuffer (obj ) が true であり、obj が [[ArrayBufferByteLengthData]] 内部スロットを持つ場合、true を返す。false を返す。
25.2.2.4 HostGrowSharedArrayBuffer ( buffer , newByteLength )
ホスト定義の抽象操作 HostGrowSharedArrayBuffer。引数 buffer (SharedArrayBuffer) および newByteLength (非負整数)。戻り値:(正常完了 (値:(handled または unhandled )) または throw 完了 )。 ホスト に buffer の実装定義 の拡張を実行する機会を与えます。ホスト が buffer の拡張を処理しないことを選択した場合、既定の動作を使用するため unhandled を返してもかまいません。
HostGrowSharedArrayBuffer の実装は次の要件に適合しなければなりません。
注
上記の第2要件は、buffer の現在の byte length をどのように、またいつ読み取るかについて意図的に曖昧にしています。byte length は基礎となるハードウェア上の atomic read-modify-write 操作を介して更新されなければならないため、load-link/store-conditional または load-exclusive/store-exclusive 命令ペアを使用するアーキテクチャでは、対となる命令を命令ストリーム内で近接させたい場合があります。そのため、SharedArrayBuffer.prototype.grow ( newLength ) 自体は HostGrowSharedArrayBuffer を呼び出す前に newByteLength の境界検査を行わず、現在の byte length をいつ読み取るかについての要件もありません。
これは、0 ≤ newByteLength ≤ buffer .[[ArrayBufferMaxByteLength]] が保証される HostResizeArrayBuffer とは対照的です。
HostGrowSharedArrayBuffer の既定の実装は NormalCompletion (unhandled ) を返します。
25.2.3 SharedArrayBuffer コンストラクター
SharedArrayBuffer コンストラクター は:
%SharedArrayBuffer% です。
そのプロパティが存在する場合(以下を参照)、グローバルオブジェクト の "SharedArrayBuffer" プロパティの初期値です。
コンストラクター として呼び出されたとき、新しい SharedArrayBuffer を作成して初期化します。
関数として呼び出されることを意図しておらず、そのように呼び出されると例外をスローします。
クラス定義の extends 節の値として使用できます。規定された SharedArrayBuffer の動作を継承しようとするサブクラスコンストラクター は、SharedArrayBuffer.prototype の組込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するため、SharedArrayBuffer コンストラクター への super 呼出しを含まなければなりません。
ホスト が SharedArrayBuffer への並行アクセスを提供しない場合、グローバルオブジェクト の "SharedArrayBuffer" プロパティを省略してもかまいません。
注
ArrayBuffer とは異なり、SharedArrayBuffer は detached になることがなく、その内部 [[ArrayBufferData]] スロットが null になることもありません。
25.2.3.1 SharedArrayBuffer ( length [ , options ] )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 byteLength を ? ToIndex (length ) とする。requestedMaxByteLength を ? GetArrayBufferMaxByteLengthOption (options ) とする。? AllocateSharedArrayBuffer (NewTarget, byteLength , requestedMaxByteLength ) を返す。
25.2.4 SharedArrayBuffer コンストラクターのプロパティ
SharedArrayBuffer コンストラクター は:
25.2.4.1 SharedArrayBuffer.prototype
SharedArrayBuffer.prototype の初期値は SharedArrayBuffer prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
25.2.4.2 get SharedArrayBuffer [ %Symbol.species% ]
SharedArrayBuffer[%Symbol.species%] は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
this 値を返す。
この関数の "name" プロパティの値は "get [Symbol.species]" です。
25.2.5 SharedArrayBuffer Prototype オブジェクトのプロパティ
SharedArrayBuffer prototype オブジェクト は:
%SharedArrayBuffer.prototype% です。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
通常オブジェクト です。
[[ArrayBufferData]] または [[ArrayBufferByteLength]] 内部スロットを持ちません。
25.2.5.1 get SharedArrayBuffer.prototype.byteLength
SharedArrayBuffer.prototype.byteLength は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[ArrayBufferData]] ) を実行する。 IsSharedArrayBuffer (obj ) が false である場合、TypeError 例外をスローする。length を ArrayBufferByteLength (obj , seq-cst ) とする。𝔽 (length ) を返す。
25.2.5.2 SharedArrayBuffer.prototype.constructor
SharedArrayBuffer.prototype.constructor の初期値は %SharedArrayBuffer% です。
25.2.5.3 SharedArrayBuffer.prototype.grow ( newLength )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[ArrayBufferMaxByteLength]] ) を実行する。 IsSharedArrayBuffer (obj ) が false である場合、TypeError 例外をスローする。newByteLength を ? ToIndex (newLength ) とする。hostHandled を ? HostGrowSharedArrayBuffer (obj , newByteLength ) とする。hostHandled が handled である場合、undefined を返す。agentRecord を周囲の agent の Agent Record とする。isLittleEndian を agentRecord .[[LittleEndian]] とする。byteLengthBlock を obj .[[ArrayBufferByteLengthData]] とする。currentByteLengthRawBytes を GetRawBytesFromSharedBlock (byteLengthBlock , 0, biguint64 , true , seq-cst ) とする。newByteLengthRawBytes を NumericToRawBytes (biguint64 , ℤ (newByteLength ), isLittleEndian ) とする。次を繰り返す。注記 : これは、同じバッファに対する並列で競合 する拡張が全順序付けされ、失われず、黙って何もしないことがないようにするための compare-and-exchange ループである。競合 なしに拡張を試行できた場合、ループは終了する。currentByteLength を ℝ (RawBytesToNumeric (biguint64 , currentByteLengthRawBytes , isLittleEndian )) とする。newByteLength = currentByteLength である場合、undefined を返す。newByteLength < currentByteLength または newByteLength > obj .[[ArrayBufferMaxByteLength]] である場合、RangeError 例外をスローする。byteLengthDelta を newByteLength - currentByteLength とする。byteLengthDelta byte からなる新しい Shared Data Block 値を作成できない場合、RangeError 例外をスローする。注記 : ここでは新しい Shared Data Block は構築も使用もされない。拡張可能な SharedArrayBuffer の観測可能な動作は、構築時に最大サイズの Shared Data Block を割り当てることで規定され、この手順はメモリ不足となった実装が RangeError をスローしなければならないという要件を表現している。readByteLengthRawBytes を AtomicCompareExchangeInSharedBlock (byteLengthBlock , 0, 8, currentByteLengthRawBytes , newByteLengthRawBytes ) とする。ByteListEqual (readByteLengthRawBytes , currentByteLengthRawBytes ) が true である場合、undefined を返す。currentByteLengthRawBytes を readByteLengthRawBytes に設定する。
注
長さを更新する compare-exchange の偽の失敗は禁止されています。新しい長さの境界検査に合格し、実装がメモリ不足でない場合、ReadModifyWriteSharedMemory イベント(すなわち成功した compare-exchange)は常に candidate execution に追加されます。
SharedArrayBuffer.prototype.grow の並列呼出しは全順序付けされます。たとえば、sab.grow(10) と sab.grow(20) という2つの競合 する呼出しを考えます。2つの呼出しのいずれか一方が必ず競争に勝ちます。sab.grow(20) が先に発生した場合でも、sab.grow(10) の呼出しが sab を縮小することは決してなく、その場合は代わりに RangeError をスローします。
25.2.5.4 get SharedArrayBuffer.prototype.growable
SharedArrayBuffer.prototype.growable は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[ArrayBufferData]] ) を実行する。 IsSharedArrayBuffer (obj ) が false である場合、TypeError 例外をスローする。IsFixedLengthArrayBuffer (obj ) が false である場合、true を返す。false を返す。
25.2.5.5 get SharedArrayBuffer.prototype.maxByteLength
SharedArrayBuffer.prototype.maxByteLength は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[ArrayBufferData]] ) を実行する。 IsSharedArrayBuffer (obj ) が false である場合、TypeError 例外をスローする。IsFixedLengthArrayBuffer (obj ) が true である場合、length を obj .[[ArrayBufferByteLength]] とする。そうでない場合、length を obj .[[ArrayBufferMaxByteLength]] とする。 𝔽 (length ) を返す。
25.2.5.6 SharedArrayBuffer.prototype.slice ( start , end )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[ArrayBufferData]] ) を実行する。 IsSharedArrayBuffer (obj ) が false である場合、TypeError 例外をスローする。length を ArrayBufferByteLength (obj , seq-cst ) とする。first を ? ToClampedIndex (start , length ) とする。end が undefined である場合、final を length とする。そうでない場合、final を ? ToClampedIndex (end , length ) とする。newLength を max (final - first , 0) とする。ctor を ? SpeciesConstructor (obj , %SharedArrayBuffer% ) とする。new を ? Construct (ctor , « 𝔽 (newLength ) ») とする。? RequireInternalSlot (new , [[ArrayBufferData]] ) を実行する。 IsSharedArrayBuffer (new ) が false である場合、TypeError 例外をスローする。new .[[ArrayBufferData]] が obj .[[ArrayBufferData]] である場合、TypeError 例外をスローする。ArrayBufferByteLength (new , seq-cst ) < newLength である場合、TypeError 例外をスローする。fromBlock を obj .[[ArrayBufferData]] とする。toBlock を new .[[ArrayBufferData]] とする。CopyDataBlockBytes (toBlock , 0, fromBlock , first , newLength ) を実行する。new を返す。
25.2.5.7 SharedArrayBuffer.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "SharedArrayBuffer" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
25.2.6 SharedArrayBuffer インスタンスのプロパティ
SharedArrayBuffer インスタンスは SharedArrayBuffer prototype オブジェクト からプロパティを継承します。各 SharedArrayBuffer インスタンスは [[ArrayBufferData]] 内部スロットを持ちます。拡張可能でない SharedArrayBuffer インスタンスはそれぞれ [[ArrayBufferByteLength]] 内部スロットを持ちます。拡張可能な SharedArrayBuffer インスタンスはそれぞれ [[ArrayBufferByteLengthData]] 内部スロットおよび [[ArrayBufferMaxByteLength]] 内部スロットを持ちます。
注
SharedArrayBuffer インスタンスは ArrayBuffer インスタンスとは異なり、決して detached になりません。
25.2.7 拡張可能な SharedArrayBuffer のガイドライン
注 1
以下は、拡張可能な SharedArrayBuffer を扱う ECMAScript プログラマー向けのガイドラインです。
可能な場合、プログラムは配備環境でテストすることを推奨します。利用可能な物理メモリ量はハードウェアデバイス間で大きく異なります。同様に、仮想メモリサブシステムもハードウェアデバイス間およびオペレーティングシステム間で大きく異なります。64ビットのデスクトップ Web ブラウザーで out-of-memory エラーなしに実行できるアプリケーションでも、32ビットのモバイル Web ブラウザーではメモリ不足になる可能性があります。
拡張可能な SharedArrayBuffer の "maxByteLength" オプションの値を選択する場合、アプリケーションに必要な最小のサイズを選択することを推奨します。"maxByteLength" は 1073741824、すなわち 1GiB を超えないことを推奨します。
特定の最大サイズで拡張可能な SharedArrayBuffer を正常に構築できたとしても、将来の拡張が成功することを保証するものではないことに注意してください。
拡張可能な SharedArrayBuffer の長さに対するすべての load が同期を伴う seq-cst load であるわけではありません。たとえば u8[idx] のような整数インデックス 付きプロパティアクセスの境界検査のための長さの load は同期を伴いません。一般に、明示的な同期がない場合、あるプロパティアクセスが境界内であることは、同じ agent 内の後続のプロパティアクセスも境界内であることを意味しません。これに対して、SharedArrayBuffer、%TypedArray% .prototype、および DataView.prototype の length および byteLength getter を介した長さの明示的な load は同期を伴います。TypedArray が完全に境界外かどうかを検査するために組込みメソッドによって実行される長さの load も同期を伴います。
注 2
以下は、拡張可能な SharedArrayBuffer を実装する ECMAScript 実装者向けのガイドラインです。
拡張可能な SharedArrayBuffer は、仮想メモリを事前に予約することによるインプレース拡張として実装することを推奨します。
拡張操作は拡張可能な SharedArrayBuffer へのメモリアクセスと並列に発生し得るため、メモリモデル の制約により、unordered アクセスであっても「tear」(値のビットが混在すること)してはなりません。実際には、これは拡張可能な SharedArrayBuffer の基礎となる data block を、world を停止せずにコピーして拡張することはできないことを意味します。world の停止は直列化点を導入し低速であるため、実装戦略として推奨しません。
拡張されたメモリは、その作成時点から、並列の競合 アクセスに対してもゼロで初期化されているように見えなければなりません。これは、ゼロ充填オンデマンドの仮想メモリページを使用するか、メモリを手動でゼロ初期化する場合には慎重な同期を行うことで実現できます。
拡張可能な SharedArrayBuffer の TypedArray view に対する整数インデックス 付きプロパティアクセスは、拡張不可能な SharedArrayBuffer の TypedArray view に対するアクセスと同様に最適化可能であることを意図しています。これは、整数インデックス 付きプロパティの load が基礎となるバッファの長さに対して同期を伴わないためです(上記のプログラマー向けガイドラインを参照)。たとえば、プロパティアクセスの境界検査をループの外へ hoist することもできます。
MMU のない組込みデバイス上で動作するものなど、仮想メモリを持たないホスト では、拡張可能な SharedArrayBuffer をコピーによって実装することは実際には困難です。そのようなホスト における拡張可能な SharedArrayBuffer のメモリ使用動作は、仮想メモリを持つホスト とは大きく異なる可能性があります。そのようなホスト は、メモリ使用量に関する想定をユーザーへ明確に伝えるべきです。
25.3 DataView オブジェクト
25.3.1 DataView オブジェクトのための抽象操作
25.3.1.1 DataView With Buffer Witness Record
DataView With Buffer Witness Record は、DataView と、view しているバッファのキャッシュされた byte length をともにカプセル化するために使用される Record です。view しているバッファが拡張可能な SharedArrayBuffer である場合に、byte length data block に対して単一の ReadSharedMemory イベントしか発生しないことを保証するのに役立ちます。
DataView With Buffer Witness Record は 表 73 に列挙されるフィールドを持ちます。
表 73: DataView With Buffer Witness Record のフィールド
フィールド名
値
意味
[[Object]]
a DataView
バッファの byte length が読み込まれる DataView オブジェクト。
[[CachedBufferByteLength]]
a non-negative integer or detached
Record が作成された時点におけるオブジェクトの [[ViewedArrayBuffer]] の byte length。
25.3.1.2 MakeDataViewWithBufferWitnessRecord ( obj , order )
抽象操作 MakeDataViewWithBufferWitnessRecord。引数 obj (DataView) および order ((seq-cst または unordered ))。戻り値:DataView With Buffer Witnessレコード 。 呼び出されると、次の手順を実行する。
buffer を obj .[[ViewedArrayBuffer]] とする。IsDetachedBuffer (buffer ) が true である場合、byteLength を detached とする。そうでない場合、byteLength を ArrayBufferByteLength (buffer , order ) とする。 DataView With Buffer Witness Record { [[Object]] : obj , [[CachedBufferByteLength]] : byteLength } を返す。
25.3.1.3 GetViewByteLength ( viewRecord )
抽象操作 GetViewByteLength。引数 viewRecord (DataView With Buffer Witnessレコード )。戻り値:非負整数。 呼び出されると、次の手順を実行する。
表明 : IsViewOutOfBounds (viewRecord ) は false である。view を viewRecord .[[Object]] とする。view .[[ByteLength]] が auto でない場合、view .[[ByteLength]] を返す。表明 : IsFixedLengthArrayBuffer (view .[[ViewedArrayBuffer]] ) は false である。byteOffset を view .[[ByteOffset]] とする。byteLength を viewRecord .[[CachedBufferByteLength]] とする。表明 : byteLength は detached でない。byteLength - byteOffset を返す。
25.3.1.4 IsViewOutOfBounds ( viewRecord )
抽象操作 IsViewOutOfBounds。引数 viewRecord (DataView With Buffer Witnessレコード )。戻り値:Boolean。 呼び出されると、次の手順を実行する。
view を viewRecord .[[Object]] とする。bufferByteLength を viewRecord .[[CachedBufferByteLength]] とする。IsDetachedBuffer (view .[[ViewedArrayBuffer]] ) が true である場合、表明 : bufferByteLength は detached である。true を返す。表明 : bufferByteLength は非負整数 である。byteOffsetStart を view .[[ByteOffset]] とする。view .[[ByteLength]] が auto である場合、byteOffsetEnd を bufferByteLength とする。そうでない場合、byteOffsetEnd を byteOffsetStart + view .[[ByteLength]] とする。 注記 : [[ByteOffset]] が bufferByteLength である長さ0の DataView は境界外とはみなされない。byteOffsetStart > bufferByteLength または byteOffsetEnd > bufferByteLength である場合、true を返す。false を返す。
25.3.1.5 GetViewValue ( view , requestIndex , isLittleEndian , type )
抽象操作 GetViewValue。引数 view (ECMAScript 言語値 )、requestIndex (ECMAScript 言語値 )、isLittleEndian (ECMAScript 言語値 ) および type (TypedArray 要素型 )。戻り値:(正常完了 (値:(Number または BigInt)) または throw 完了 )。 DataView インスタンス上の関数が view のバッファから値を取得するために使用されます。 呼び出されると、次の手順を実行する。
? RequireInternalSlot (view , [[DataView]] ) を実行する。 表明 : view は [[ViewedArrayBuffer]] 内部スロットを持つ。getIndex を ? ToIndex (requestIndex ) とする。isLittleEndian を ToBoolean (isLittleEndian ) に設定する。viewOffset を view .[[ByteOffset]] とする。viewRecord を MakeDataViewWithBufferWitnessRecord (view , unordered ) とする。注記 : view の backing buffer が拡張可能な SharedArrayBuffer である場合、境界検査は同期操作ではない。IsViewOutOfBounds (viewRecord ) が true である場合、TypeError 例外をスローする。viewSize を GetViewByteLength (viewRecord ) とする。elementSize を Element Type type について 表 71 で規定される Element Size 値とする。getIndex + elementSize > viewSize である場合、RangeError 例外をスローする。bufferIndex を getIndex + viewOffset とする。GetValueFromBuffer (view .[[ViewedArrayBuffer]] , bufferIndex , type , false , unordered , isLittleEndian ) を返す。
25.3.1.6 SetViewValue ( view , requestIndex , isLittleEndian , type , value )
抽象操作 SetViewValue。引数 view (ECMAScript 言語値 )、requestIndex (ECMAScript 言語値 )、isLittleEndian (ECMAScript 言語値 )、type (TypedArray 要素型 ) および value (ECMAScript 言語値 )。戻り値:(正常完了 (値:unused ) または throw 完了 )。 DataView インスタンス上の関数が view のバッファへ値を保存するために使用されます。 呼び出されると、次の手順を実行する。
? RequireInternalSlot (view , [[DataView]] ) を実行する。 表明 : view は [[ViewedArrayBuffer]] 内部スロットを持つ。getIndex を ? ToIndex (requestIndex ) とする。IsBigIntElementType (type ) が true である場合、number を ? ToBigInt (value ) とする。そうでない場合、number を ? ToNumber (value ) とする。 isLittleEndian を ToBoolean (isLittleEndian ) に設定する。viewOffset を view .[[ByteOffset]] とする。viewRecord を MakeDataViewWithBufferWitnessRecord (view , unordered ) とする。注記 : view の backing buffer が拡張可能な SharedArrayBuffer である場合、境界検査は同期操作ではない。IsViewOutOfBounds (viewRecord ) が true である場合、TypeError 例外をスローする。viewSize を GetViewByteLength (viewRecord ) とする。elementSize を Element Type type について 表 71 で規定される Element Size 値とする。getIndex + elementSize > viewSize である場合、RangeError 例外をスローする。bufferIndex を getIndex + viewOffset とする。SetValueInBuffer (view .[[ViewedArrayBuffer]] , bufferIndex , type , number , false , unordered , isLittleEndian ) を実行する。unused を返す。
25.3.2 DataView コンストラクター
DataView コンストラクター は:
%DataView% です。
グローバルオブジェクト の "DataView" プロパティの初期値です。
コンストラクター として呼び出されたとき、新しい DataView を作成して初期化します。
関数として呼び出されることを意図しておらず、そのように呼び出されると例外をスローします。
クラス定義の extends 節の値として使用できます。規定された DataView の動作を継承しようとするサブクラスコンストラクター は、DataView.prototype の組込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するため、DataView コンストラクター への super 呼出しを含まなければなりません。
25.3.2.1 DataView ( buffer [ , byteOffset [ , byteLength ] ] )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 ? RequireInternalSlot (buffer , [[ArrayBufferData]] ) を実行する。 offset を ? ToIndex (byteOffset ) とする。IsDetachedBuffer (buffer ) が true である場合、TypeError 例外をスローする。bufferByteLength を ArrayBufferByteLength (buffer , seq-cst ) とする。offset > bufferByteLength である場合、RangeError 例外をスローする。bufferIsFixedLength を IsFixedLengthArrayBuffer (buffer ) とする。byteLength が undefined である場合、bufferIsFixedLength が true である場合、viewByteLength を bufferByteLength - offset とする。そうでない場合、viewByteLength を auto とする。 そうでない場合、viewByteLength を ? ToIndex (byteLength ) とする。offset + viewByteLength > bufferByteLength である場合、RangeError 例外をスローする。 obj を ? OrdinaryCreateFromConstructor (NewTarget, "%DataView.prototype%" , « [[DataView]] , [[ViewedArrayBuffer]] , [[ByteLength]] , [[ByteOffset]] ») とする。IsDetachedBuffer (buffer ) が true である場合、TypeError 例外をスローする。bufferByteLength を ArrayBufferByteLength (buffer , seq-cst ) に設定する。offset > bufferByteLength である場合、RangeError 例外をスローする。byteLength が undefined でない場合、offset + viewByteLength > bufferByteLength である場合、RangeError 例外をスローする。obj .[[ViewedArrayBuffer]] を buffer に設定する。obj .[[ByteLength]] を viewByteLength に設定する。obj .[[ByteOffset]] を offset に設定する。obj を返す。
25.3.3 DataView コンストラクターのプロパティ
DataView コンストラクター は:
25.3.3.1 DataView.prototype
DataView.prototype の初期値は DataView prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
25.3.4 DataView Prototype オブジェクトのプロパティ
DataView prototype オブジェクト は:
%DataView.prototype% です。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
通常オブジェクト です。
[[DataView]] 、[[ViewedArrayBuffer]] 、[[ByteLength]] 、または [[ByteOffset]] 内部スロットを持ちません。
25.3.4.1 get DataView.prototype.buffer
DataView.prototype.buffer は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[DataView]] ) を実行する。 表明 : obj は [[ViewedArrayBuffer]] 内部スロットを持つ。buffer を obj .[[ViewedArrayBuffer]] とする。buffer を返す。
25.3.4.2 get DataView.prototype.byteLength
DataView.prototype.byteLength は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[DataView]] ) を実行する。 表明 : obj は [[ViewedArrayBuffer]] 内部スロットを持つ。viewRecord を MakeDataViewWithBufferWitnessRecord (obj , seq-cst ) とする。IsViewOutOfBounds (viewRecord ) が true である場合、TypeError 例外をスローする。size を GetViewByteLength (viewRecord ) とする。𝔽 (size ) を返す。
25.3.4.3 get DataView.prototype.byteOffset
DataView.prototype.byteOffset は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[DataView]] ) を実行する。 表明 : obj は [[ViewedArrayBuffer]] 内部スロットを持つ。viewRecord を MakeDataViewWithBufferWitnessRecord (obj , seq-cst ) とする。IsViewOutOfBounds (viewRecord ) が true である場合、TypeError 例外をスローする。offset を obj .[[ByteOffset]] とする。𝔽 (offset ) を返す。
25.3.4.4 DataView.prototype.constructor
DataView.prototype.constructor の初期値は %DataView% です。
25.3.4.5 DataView.prototype.getBigInt64 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。? GetViewValue (view , byteOffset , littleEndian , bigint64 ) を返す。
25.3.4.6 DataView.prototype.getBigUint64 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。? GetViewValue (view , byteOffset , littleEndian , biguint64 ) を返す。
25.3.4.7 DataView.prototype.getFloat16 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? GetViewValue (view , byteOffset , littleEndian , float16 ) を返す。
25.3.4.8 DataView.prototype.getFloat32 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? GetViewValue (view , byteOffset , littleEndian , float32 ) を返す。
25.3.4.9 DataView.prototype.getFloat64 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? GetViewValue (view , byteOffset , littleEndian , float64 ) を返す。
25.3.4.10 DataView.prototype.getInt8 ( byteOffset )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。? GetViewValue (view , byteOffset , true , int8 ) を返す。
25.3.4.11 DataView.prototype.getInt16 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? GetViewValue (view , byteOffset , littleEndian , int16 ) を返す。
25.3.4.12 DataView.prototype.getInt32 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? GetViewValue (view , byteOffset , littleEndian , int32 ) を返す。
25.3.4.13 DataView.prototype.getUint8 ( byteOffset )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。? GetViewValue (view , byteOffset , true , uint8 ) を返す。
25.3.4.14 DataView.prototype.getUint16 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? GetViewValue (view , byteOffset , littleEndian , uint16 ) を返す。
25.3.4.15 DataView.prototype.getUint32 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? GetViewValue (view , byteOffset , littleEndian , uint32 ) を返す。
25.3.4.16 DataView.prototype.setBigInt64 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。? SetViewValue (view , byteOffset , littleEndian , bigint64 , value ) を実行する。 undefined を返す。
25.3.4.17 DataView.prototype.setBigUint64 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。? SetViewValue (view , byteOffset , littleEndian , biguint64 , value ) を実行する。 undefined を返す。
25.3.4.18 DataView.prototype.setFloat16 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? SetViewValue (view , byteOffset , littleEndian , float16 , value ) を実行する。 undefined を返す。
25.3.4.19 DataView.prototype.setFloat32 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? SetViewValue (view , byteOffset , littleEndian , float32 , value ) を実行する。 undefined を返す。
25.3.4.20 DataView.prototype.setFloat64 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? SetViewValue (view , byteOffset , littleEndian , float64 , value ) を実行する。 undefined を返す。
25.3.4.21 DataView.prototype.setInt8 ( byteOffset , value )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。? SetViewValue (view , byteOffset , true , int8 , value ) を実行する。 undefined を返す。
25.3.4.22 DataView.prototype.setInt16 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? SetViewValue (view , byteOffset , littleEndian , int16 , value ) を実行する。 undefined を返す。
25.3.4.23 DataView.prototype.setInt32 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? SetViewValue (view , byteOffset , littleEndian , int32 , value ) を実行する。 undefined を返す。
25.3.4.24 DataView.prototype.setUint8 ( byteOffset , value )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。? SetViewValue (view , byteOffset , true , uint8 , value ) を実行する。 undefined を返す。
25.3.4.25 DataView.prototype.setUint16 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? SetViewValue (view , byteOffset , littleEndian , uint16 , value ) を実行する。 undefined を返す。
25.3.4.26 DataView.prototype.setUint32 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出されたとき、次の手順を実行します。
view を this 値とする。littleEndian が存在しない場合、littleEndian を false に設定する。? SetViewValue (view , byteOffset , littleEndian , uint32 , value ) を実行する。 undefined を返す。
25.3.4.27 DataView.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "DataView" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
25.3.5 DataView インスタンスのプロパティ
DataView インスタンスは DataView prototype オブジェクト からプロパティを継承する通常オブジェクト です。各 DataView インスタンスは [[DataView]] 、[[ViewedArrayBuffer]] 、[[ByteLength]] 、および [[ByteOffset]] 内部スロットを持ちます。
注
[[DataView]] 内部スロットの値はこの仕様内では使用されません。その内部スロットが存在すること自体が、DataView コンストラクター を使用して作成されたオブジェクトを識別するために仕様内で使用されます。
25.4 Atomics オブジェクト
Atomics オブジェクトは:
Atomics オブジェクトは、共有メモリ配列セルに対して不可分(atomic)に動作する関数と、agent がプリミティブイベントを待機および通知できる関数を提供します。規律を守って使用することで、Atomics 関数は、共有メモリを介して通信するマルチ agent プログラムが、並列 CPU 上であっても十分に理解可能な順序で実行されるようにできます。共有メモリ通信を支配する規則は、以下で定義されるメモリモデル によって提供されます。
注
ECMAScript で共有メモリをプログラミングおよび実装するための参考ガイドラインについては、メモリモデル 節の末尾にある注記 を参照してください。
25.4.1 Waiter Record
Waiter Record は、Atomics.wait または Atomics.waitAsync の特定の呼出しを表すために使用される Record です。
Waiter Record は 表 74 に列挙されるフィールドを持ちます。
表 74: Waiter Record のフィールド
フィールド名
値
意味
[[AgentSignifier]]
an agent signifier
Atomics.wait または Atomics.waitAsync を呼び出した agent。
[[PromiseCapability]]
a PromiseCapability Record or blocking
Atomics.waitAsync の呼出しを表す場合は結果の promise、それ以外の場合は blocking 。
[[TimeoutTime]]
a non-negative extended mathematical value
timeout が発生し得る最も早い時刻。time value を使用して計算されます。
[[Result]]
"ok" or "timed-out"
呼出しの戻り値。
25.4.2 WaiterList Record
WaiterList Record は、Atomics.wait、Atomics.waitAsync、および Atomics.notify を介した agent の待機と通知を説明するために使用されます。
WaiterList Record は 表 75 に列挙されるフィールドを持ちます。
表 75: WaiterList Record のフィールド
同じ agent signifier を持つ複数の Waiter Record が WaiterList 内に存在する場合があります。
agent cluster は WaiterList Record の保存領域を持ちます。この保存領域は (block , i ) によって索引付けされます。ここで block は Shared Data Block 、i は block のメモリ内の byte offset です。WaiterList Record は agent 非依存です。(block , i ) によって WaiterList Record の保存領域を検索すると、agent cluster 内のどの agent でも同じ WaiterList Record が得られます。
各 WaiterList Record は、評価中にその WaiterList Record への排他的アクセスを制御するcritical section を持ちます。一度に1つの agent だけが WaiterList Record の critical section に入ることができます。WaiterList Record の critical section への進入および退出は、抽象操作 EnterCriticalSection および LeaveCriticalSection によって制御されます。WaiterList Record に対する操作、すなわち待機中 agent の追加と削除、agent リストの走査、リスト上の agent の一時停止と通知、Synchronize イベント の設定と取得は、WaiterList Record の critical section に入った agent のみが実行できます。
25.4.3 Atomics のための抽象操作
25.4.3.1 ValidateIntegerTypedArray ( ta , waitable )
抽象操作 ValidateIntegerTypedArray。引数 ta (ECMAScript 言語値 ) および waitable (Boolean)。戻り値:(正常完了 (値:TypedArray With Buffer Witnessレコード ) または throw 完了 )。 %Atomics% 関数で使用できる TypedArray 、特に共有メモリとの atomic な相互作用を保証できるものを制限する ために使用されます。 呼び出されると、次の手順を実行する。
注記 : ta の backing buffer が拡張可能な SharedArrayBuffer である場合、境界検査は同期操作ではない。taRecord を ? ValidateTypedArray (ta , unordered ) とする。elementType を TypedArrayElementType (ta ) とする。IsNoTearConfiguration (elementType , seq-cst ) が false である場合、TypeError 例外をスローする。waitable が true であり、elementType が int32 でも bigint64 でもない場合、TypeError 例外をスローする。taRecord を返す。
25.4.3.2 ValidateAtomicAccess ( taRecord , requestIndex )
抽象操作 ValidateAtomicAccess。引数 taRecord (TypedArray With Buffer Witnessレコード ) および requestIndex (ECMAScript 言語値 )。戻り値:(正常完了 (値:非負整数) または throw 完了 )。 呼び出されると、次の手順を実行する。
length を TypedArrayLength (taRecord ) とする。accessIndex を ? ToIndex (requestIndex ) とする。表明 : accessIndex ≥ 0。accessIndex ≥ length である場合、RangeError 例外をスローする。ta を taRecord .[[Object]] とする。elementSize を TypedArrayElementSize (ta ) とする。offset を ta .[[ByteOffset]] とする。(accessIndex × elementSize ) + offset を返す。
25.4.3.3 ValidateAtomicAccessOnIntegerTypedArray ( ta , requestIndex )
抽象操作 ValidateAtomicAccessOnIntegerTypedArray。引数 ta (ECMAScript 言語値 ) および requestIndex (ECMAScript 言語値 )。戻り値:(正常完了 (値:非負整数) または throw 完了 )。 呼び出されると、次の手順を実行する。
taRecord を ? ValidateIntegerTypedArray (ta , false ) とする。? ValidateAtomicAccess (taRecord , requestIndex ) を返す。
25.4.3.4 RevalidateAtomicAccess ( ta , byteIndexInBuffer )
抽象操作 RevalidateAtomicAccess。引数 ta (TypedArray ) および byteIndexInBuffer (非負整数)。戻り値:(正常完了 (値:unused ) または throw 完了 )。 この操作は、Atomics メソッドですべての引数の型強制が実行された後、atomic 操作のために backing buffer 内のインデックスを再検証します。引数の型強制には任意の副作用があり得て、それによってバッファが境界外になる可能性があるためです。ta の backing buffer が SharedArrayBuffer である場合、この操作はスローしません。 呼び出されると、次の手順を実行する。
注記 : ta の backing buffer が拡張可能な SharedArrayBuffer である場合、境界検査は同期操作ではない。taRecord を ? ValidateTypedArrayBounds (ta , unordered ) とする。表明 : byteIndexInBuffer ≥ ta .[[ByteOffset]] 。byteIndexInBuffer ≥ taRecord .[[CachedBufferByteLength]] である場合、RangeError 例外をスローする。unused を返す。
25.4.3.5 GetWaiterList ( block , i )
抽象操作 GetWaiterList。引数 block (共有データブロック ) および i (a non-negative integer that is evenly divisible by 4)。戻り値:WaiterListレコード 。 呼び出されると、次の手順を実行する。
表明 : i および i + 3 は block のメモリ内の有効な byte offset である。組 (block , i ) によって参照される WaiterList Record を返す。
25.4.3.6 EnterCriticalSection ( waiterList )
抽象操作 EnterCriticalSection。引数 waiterList (WaiterListレコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : 周囲の agent はいずれの WaiterList Record の critical section 内にもいない。waiterList の critical section 内に agent がいなくなるまで待機し、その後 waiterList の critical section に入る(他のいかなる agent にも入ることを許可しない)。waiterList .[[MostRecentLeaveEvent]] が empty でない場合、注記 : critical section に少なくとも1回入った waiterList には、LeaveCriticalSection によって設定された Synchronize イベント がある。agentRecord を周囲の agent の Agent Record とする。execution を agentRecord .[[CandidateExecution]] とする。eventsRecord を、[[AgentSignifier]] が AgentSignifier () である execution .[[EventsRecords]] の Agent Events Record とする。enterEvent を新しい Synchronize イベント とする。enterEvent を eventsRecord .[[EventList]] に追加する。(waiterList .[[MostRecentLeaveEvent]] , enterEvent ) を eventsRecord .[[AgentSynchronizesWith]] に追加する。 unused を返す。
EnterCriticalSection は、critical section に入ろうとする agent が、別の agent がそこから出るのを待たなければならない場合に競合 を持ちます。競合がない場合、EnterCriticalSection 呼出しの FIFO 順序は観測可能です。競合がある場合、実装は任意の順序を選択できますが、agent を無期限に待機させてはなりません。
25.4.3.7 LeaveCriticalSection ( waiterList )
抽象操作 LeaveCriticalSection。引数 waiterList (WaiterListレコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : 周囲の agent は waiterList の critical section 内にいる。agentRecord を周囲の agent の Agent Record とする。execution を agentRecord .[[CandidateExecution]] とする。eventsRecord を、[[AgentSignifier]] が AgentSignifier () である execution .[[EventsRecords]] の Agent Events Record とする。leaveEvent を新しい Synchronize イベント とする。leaveEvent を eventsRecord .[[EventList]] に追加する。waiterList .[[MostRecentLeaveEvent]] を leaveEvent に設定する。waiterList の critical section から退出する。unused を返す。
25.4.3.8 AddWaiter ( waiterList , waiterRecord )
抽象操作 AddWaiter。引数 waiterList (WaiterListレコード ) および waiterRecord (Waiterレコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : 周囲の agent は waiterList の critical section 内にいる。表明 : [[PromiseCapability]] フィールドが waiterRecord .[[PromiseCapability]] であり、[[AgentSignifier]] フィールドが waiterRecord .[[AgentSignifier]] である Waiter Record は waiterList .[[Waiters]] 内に存在しない。waiterRecord を waiterList .[[Waiters]] に追加する。unused を返す。
25.4.3.9 RemoveWaiter ( waiterList , waiterRecord )
抽象操作 RemoveWaiter。引数 waiterList (WaiterListレコード ) および waiterRecord (Waiterレコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : 周囲の agent は waiterList の critical section 内にいる。表明 : waiterList .[[Waiters]] は waiterRecord を含む。waiterList .[[Waiters]] から waiterRecord を削除する。unused を返す。
25.4.3.10 RemoveWaiters ( waiterList , count )
抽象操作 RemoveWaiters。引数 waiterList (WaiterListレコード ) および count ((非負整数 または +∞))。戻り値:リスト (要素:Waiterレコード )。 呼び出されると、次の手順を実行する。
表明 : 周囲の agent は waiterList の critical section 内にいる。length を waiterList .[[Waiters]] の要素数とする。count を min (count , length ) に設定する。waiters を、waiterList .[[Waiters]] の先頭 count 個の要素を要素とする List とする。waiterList .[[Waiters]] の先頭 count 個の要素を削除する。waiters を返す。
25.4.3.11 SuspendThisAgent ( waiterList , waiterRecord )
抽象操作 SuspendThisAgent。引数 waiterList (WaiterListレコード ) および waiterRecord (Waiterレコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : 周囲の agent は waiterList の critical section 内にいる。表明 : waiterList .[[Waiters]] は waiterRecord を含む。thisAgent を AgentSignifier () とする。表明 : waiterRecord .[[AgentSignifier]] は thisAgent である。表明 : waiterRecord .[[PromiseCapability]] は blocking である。表明 : AgentCanSuspend () は true である。LeaveCriticalSection (waiterList ) を実行し、時刻が waiterRecord .[[TimeoutTime]] になるまで周囲の agent を一時停止する。この複合操作は、critical section から退出した後、一時停止が有効になる前に到着した通知が失われない方法で実行する。周囲の agent は、timeout または別の agent が引数 waiterList と thisAgent で NotifyWaiter を呼び出すこと(すなわち Atomics.notify の呼出し)によってのみ一時停止から復帰できる。EnterCriticalSection (waiterList ) を実行する。unused を返す。
25.4.3.12 NotifyWaiter ( waiterList , waiterRecord )
抽象操作 NotifyWaiter。引数 waiterList (WaiterListレコード ) および waiterRecord (Waiterレコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : 周囲の agent は waiterList の critical section 内にいる。waiterRecord .[[PromiseCapability]] が blocking である場合、signifier が waiterRecord .[[AgentSignifier]] である agent を一時停止から復帰させる。 注記 : これにより agent は SuspendThisAgent 内で実行を再開する。そうでなく、AgentSignifier () が waiterRecord .[[AgentSignifier]] である場合、promiseCapability を waiterRecord .[[PromiseCapability]] とする。! Call (promiseCapability .[[Resolve]] , undefined , « waiterRecord .[[Result]] ») を実行する。 そうでない場合、EnqueueResolveInAgentJob (waiterRecord .[[AgentSignifier]] , waiterRecord .[[PromiseCapability]] , waiterRecord .[[Result]] ) を実行する。 unused を返す。
注
agent は、別の agent の promise capability をホスト へ渡すこと以外のいかなる目的でもアクセスしてはなりません。
25.4.3.13 EnqueueResolveInAgentJob ( agentSignifier , promiseCapability , resolution )
抽象操作 EnqueueResolveInAgentJob。引数 agentSignifier (an agent signifier)、promiseCapability (PromiseCapabilityレコード ) および resolution (("ok" または "timed-out" ))。戻り値:unused 。 呼び出されると、次の手順を実行する。
resolveJob を、agentSignifier 、promiseCapability 、および resolution を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Job Abstract Closure とする。表明 : AgentSignifier () は agentSignifier である。! Call (promiseCapability .[[Resolve]] , undefined , « resolution ») を実行する。 unused を返す。realmInTargetAgent を ! GetFunctionRealm (promiseCapability .[[Resolve]] ) とする。表明 : agentSignifier は realmInTargetAgent .[[AgentSignifier]] である。HostEnqueueGenericJob (resolveJob , realmInTargetAgent ) を実行する。unused を返す。
25.4.3.14 DoWait ( mode , ta , index , value , timeout )
抽象操作 DoWait。引数 mode ((sync または async ))、ta (ECMAScript 言語値 )、index (ECMAScript 言語値 )、value (ECMAScript 言語値 ) および timeout (ECMAScript 言語値 )。戻り値:(正常完了 (値:(Object、"not-equal" 、"timed-out" または "ok" )) または throw 完了 )。 呼び出されると、次の手順を実行する。
taRecord を ? ValidateIntegerTypedArray (ta , true ) とする。buffer を taRecord .[[Object]] .[[ViewedArrayBuffer]] とする。IsSharedArrayBuffer (buffer ) が false である場合、TypeError 例外をスローする。byteIndexInBuffer を ? ValidateAtomicAccess (taRecord , index ) とする。elementType を TypedArrayElementType (ta ) とする。表明 : elementType は bigint64 または int32 のいずれかである。elementType が bigint64 である場合、expected を ? ToBigInt64 (value ) とする。そうでない場合、expected を ? ToInt32 (value ) とする。timeoutNumber を ? ToNumber (timeout ) とする。timeoutNumber が NaN または +∞ 𝔽 のいずれかである場合、realTimeout を +∞ とする。そうでなく、timeoutNumber が -∞ 𝔽 である場合、realTimeout を 0 とする。 そうでない場合、realTimeout を max (ℝ (timeoutNumber ), 0) とする。 mode が sync であり、AgentCanSuspend () が false である場合、TypeError 例外をスローする。block を buffer .[[ArrayBufferData]] とする。waiterList を GetWaiterList (block , byteIndexInBuffer ) とする。mode が sync である場合、promiseCapability を blocking とする。resultObj を undefined とする。そうでない場合、promiseCapability を ! NewPromiseCapability (%Promise% ) とする。resultObj を OrdinaryObjectCreate (%Object.prototype% ) とする。 EnterCriticalSection (waiterList ) を実行する。witness を GetValueFromBuffer (buffer , byteIndexInBuffer , elementType , true , seq-cst ) とする。expected ≠ witness である場合、LeaveCriticalSection (waiterList ) を実行する。mode が sync である場合、"not-equal" を返す。! CreateDataPropertyOrThrow (resultObj , "async" , false ) を実行する。 ! CreateDataPropertyOrThrow (resultObj , "value" , "not-equal" ) を実行する。 resultObj を返す。realTimeout = 0 かつ mode が async である場合、注記 : 同期的な即時 timeout に対する特別な処理はない。非同期の即時 timeout には、迅速に失敗して不要な Promise job を回避するための特別な処理がある。LeaveCriticalSection (waiterList ) を実行する。! CreateDataPropertyOrThrow (resultObj , "async" , false ) を実行する。 ! CreateDataPropertyOrThrow (resultObj , "value" , "timed-out" ) を実行する。 resultObj を返す。thisAgent を AgentSignifier () とする。now を現在時刻を識別する time value (UTC) とする。additionalTimeout を実装定義 の非負数学値 とする。timeoutTime を ℝ (now ) + realTimeout + additionalTimeout とする。注記 : realTimeout が +∞ である場合、timeoutTime も +∞ である。waiterRecord を新しい Waiter Record { [[AgentSignifier]] : thisAgent , [[PromiseCapability]] : promiseCapability , [[TimeoutTime]] : timeoutTime , [[Result]] : "ok" } とする。AddWaiter (waiterList , waiterRecord ) を実行する。mode が sync である場合、SuspendThisAgent (waiterList , waiterRecord ) を実行する。そうでなく、timeoutTime が有限である場合、EnqueueAtomicsWaitAsyncTimeoutJob (waiterList , waiterRecord ) を実行する。 LeaveCriticalSection (waiterList ) を実行する。mode が sync である場合、waiterRecord .[[Result]] を返す。! CreateDataPropertyOrThrow (resultObj , "async" , true ) を実行する。 ! CreateDataPropertyOrThrow (resultObj , "value" , promiseCapability .[[Promise]] ) を実行する。 resultObj を返す。
注
additionalTimeout により、実装は消費電力の削減やタイミング攻撃を緩和するためのタイマー分解能の粗粒度化など、必要に応じて timeout を延長できます。この値は DoWait の呼出しごとに異なってもかまいません。
25.4.3.15 EnqueueAtomicsWaitAsyncTimeoutJob ( waiterList , waiterRecord )
抽象操作 EnqueueAtomicsWaitAsyncTimeoutJob。引数 waiterList (WaiterListレコード ) および waiterRecord (Waiterレコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
timeoutJob を、waiterList と waiterRecord を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Job Abstract Closure とする。EnterCriticalSection (waiterList ) を実行する。waiterList .[[Waiters]] が waiterRecord を含む場合、timeOfJobExecution を現在時刻を識別する time value (UTC) とする。表明 : ℝ (timeOfJobExecution ) ≥ waiterRecord .[[TimeoutTime]] (time value の潜在的な非単調性を無視する)。waiterRecord .[[Result]] を "timed-out" に設定する。RemoveWaiter (waiterList , waiterRecord ) を実行する。NotifyWaiter (waiterList , waiterRecord ) を実行する。LeaveCriticalSection (waiterList ) を実行する。unused を返す。now を現在時刻を識別する time value (UTC) とする。currentRealm を現在の Realm Record とする。HostEnqueueTimeoutJob (timeoutJob , currentRealm , 𝔽 (waiterRecord .[[TimeoutTime]] ) - now ) を実行する。unused を返す。
25.4.3.16 AtomicCompareExchangeInSharedBlock ( block , byteIndexInBuffer , elementSize , expectedBytes , replacementBytes )
抽象操作 AtomicCompareExchangeInSharedBlock。引数 block (共有データブロック )、byteIndexInBuffer (整数 )、elementSize (非負整数)、expectedBytes (リスト (要素:バイト値 )) および replacementBytes (リスト (要素:バイト値 ))。戻り値:リスト (要素:バイト値 )。 呼び出されると、次の手順を実行する。
agentRecord を周囲の agent の Agent Record とする。execution を agentRecord .[[CandidateExecution]] とする。eventsRecord を、[[AgentSignifier]] が AgentSignifier () である execution .[[EventsRecords]] の Agent Events Record とする。rawBytesRead を、要素が非決定的に選択された byte 値である長さ elementSize の List とする。注記 : 実装では、rawBytesRead は基礎となるハードウェア上の load-link、load-exclusive、または read-modify-write 命令のオペランドの結果である。この非決定性は、弱い一貫性を持つハードウェアの観測可能な動作を記述するためのメモリモデル の意味論的規定である。注記 : 期待値と読み取った値の比較は、期待値と読み取った値が等しくない場合に不必要に強い同期を避けるため、read-modify-write modification function の外部で実行される。ByteListEqual (rawBytesRead , expectedBytes ) が true である場合、second を、何も捕捉せず、パラメーター (oldBytes , newBytes ) を持ち、呼び出されたときに次の手順を atomic に実行する新しい read-modify-write modification function とする。newBytes を返す。event を ReadModifyWriteSharedMemory { [[Order]] : seq-cst , [[NoTear]] : true , [[Block]] : block , [[ByteIndex]] : byteIndexInBuffer , [[ElementSize]] : elementSize , [[Payload]] : replacementBytes , [[ModifyOp]] : second } とする。そうでない場合、event を ReadSharedMemory { [[Order]] : seq-cst , [[NoTear]] : true , [[Block]] : block , [[ByteIndex]] : byteIndexInBuffer , [[ElementSize]] : elementSize } とする。 event を eventsRecord .[[EventList]] に追加する。Chosen Value Record { [[Event]] : event , [[ChosenValue]] : rawBytesRead } を execution .[[ChosenValues]] に追加する。rawBytesRead を返す。
25.4.3.17 AtomicReadModifyWrite ( ta , index , value , op )
抽象操作 AtomicReadModifyWrite。引数 ta (ECMAScript 言語値 )、index (ECMAScript 言語値 )、value (ECMAScript 言語値 ) および op (a read-modify-write modification function )。戻り値:(正常完了 (値:(Number または BigInt)) または throw 完了 )。 op は byte 値の List である2つの引数を受け取り、byte 値の List を返します。この操作は値を atomic に読み込み、別の値と結合し、その結合結果を保存します。読み込んだ値を返します。 呼び出されると、次の手順を実行する。
byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray (ta , index ) とする。ta .[[ContentType]] が bigint である場合、coerced を ? ToBigInt (value ) とする。そうでない場合、coerced を 𝔽 (? ToIntegerOrInfinity (value )) とする。 ? RevalidateAtomicAccess (ta , byteIndexInBuffer ) を実行する。 buffer を ta .[[ViewedArrayBuffer]] とする。elementType を TypedArrayElementType (ta ) とする。GetModifySetValueInBuffer (buffer , byteIndexInBuffer , elementType , coerced , op ) を返す。
25.4.3.18 ByteListBitwiseOp ( op , xBytes , yBytes )
抽象操作 ByteListBitwiseOp。引数 op ((&、^ または |))、xBytes (リスト (要素:バイト値 )) および yBytes (リスト (要素:バイト値 ))。戻り値:リスト (要素:バイト値 )。 この操作は引数のすべての byte 値に対してビット単位演算を atomic に実行し、byte 値の List を返します。 呼び出されると、次の手順を実行する。
表明 : xBytes と yBytes は同じ要素数を持つ。result を新しい空の List とする。i を 0 とする。xBytes の各要素 xByte について、次を行う。yByte を yBytes [i ] とする。op が & である場合、resultByte を xByte と yByte にビット単位 AND 演算を適用した結果とする。そうでなく、op が ^ である場合、resultByte を xByte と yByte にビット単位排他的 OR (XOR) 演算を適用した結果とする。 そうでない場合、表明 : op は | である。resultByte を xByte と yByte にビット単位包含 OR 演算を適用した結果とする。 i を i + 1 に設定する。resultByte を result に追加する。result を返す。
25.4.3.19 ByteListEqual ( xBytes , yBytes )
抽象操作 ByteListEqual。引数 xBytes (リスト (要素:バイト値 )) および yBytes (リスト (要素:バイト値 ))。戻り値:Boolean。 呼び出されると、次の手順を実行する。
xBytes と yBytes が同じ要素数を持たない場合、false を返す。i を 0 とする。xBytes の各要素 xByte について、次を行う。yByte を yBytes [i ] とする。xByte ≠ yByte である場合、false を返す。i を i + 1 に設定する。true を返す。
25.4.4 Atomics.add ( ta , index , value )
この関数は呼び出されたとき、次の手順を実行します。
add を、ta を捕捉し、パラメーター (xBytes , yBytes ) を持ち、呼び出されたときに次の手順を atomic に実行する新しい read-modify-write modification function とする。type を TypedArrayElementType (ta ) とする。agentRecord を周囲の agent の Agent Record とする。isLittleEndian を agentRecord .[[LittleEndian]] とする。x を RawBytesToNumeric (type , xBytes , isLittleEndian ) とする。y を RawBytesToNumeric (type , yBytes , isLittleEndian ) とする。x が Number である場合、sum を Number::add (x , y ) とする。そうでない場合、表明 : x は BigInt である。sum を BigInt::add (x , y ) とする。 sumBytes を NumericToRawBytes (type , sum , isLittleEndian ) とする。表明 : sumBytes 、xBytes 、および yBytes は同じ要素数を持つ。sumBytes を返す。? AtomicReadModifyWrite (ta , index , value , add ) を返す。
25.4.5 Atomics.and ( ta , index , value )
この関数は呼び出されたとき、次の手順を実行します。
and を、何も捕捉せず、パラメーター (xBytes , yBytes ) を持ち、呼び出されたときに次の手順を atomic に実行する新しい read-modify-write modification function とする。ByteListBitwiseOp (&, xBytes , yBytes ) を返す。? AtomicReadModifyWrite (ta , index , value , and ) を返す。
25.4.6 Atomics.compareExchange ( ta , index , expectedValue , replacementValue )
この関数は呼び出されたとき、次の手順を実行します。
byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray (ta , index ) とする。buffer を ta .[[ViewedArrayBuffer]] とする。block を buffer .[[ArrayBufferData]] とする。ta .[[ContentType]] が bigint である場合、expected を ? ToBigInt (expectedValue ) とする。replacement を ? ToBigInt (replacementValue ) とする。そうでない場合、expected を 𝔽 (? ToIntegerOrInfinity (expectedValue )) とする。replacement を 𝔽 (? ToIntegerOrInfinity (replacementValue )) とする。 ? RevalidateAtomicAccess (ta , byteIndexInBuffer ) を実行する。 elementType を TypedArrayElementType (ta ) とする。elementSize を TypedArrayElementSize (ta ) とする。agentRecord を周囲の agent の Agent Record とする。isLittleEndian を agentRecord .[[LittleEndian]] とする。expectedBytes を NumericToRawBytes (elementType , expected , isLittleEndian ) とする。replacementBytes を NumericToRawBytes (elementType , replacement , isLittleEndian ) とする。IsSharedArrayBuffer (buffer ) が true である場合、rawBytesRead を AtomicCompareExchangeInSharedBlock (block , byteIndexInBuffer , elementSize , expectedBytes , replacementBytes ) とする。そうでない場合、rawBytesRead を、block [byteIndexInBuffer ] から始まる elementSize byte の列を要素とする長さ elementSize の List とする。ByteListEqual (rawBytesRead , expectedBytes ) が true である場合、replacementBytes の個々の byte を block [byteIndexInBuffer ] から開始して block に保存する。 RawBytesToNumeric (elementType , rawBytesRead , isLittleEndian ) を返す。
25.4.7 Atomics.exchange ( ta , index , value )
この関数は呼び出されたとき、次の手順を実行します。
second を、何も捕捉せず、パラメーター (oldBytes , newBytes ) を持ち、呼び出されたときに次の手順を atomic に実行する新しい read-modify-write modification function とする。newBytes を返す。? AtomicReadModifyWrite (ta , index , value , second ) を返す。
25.4.8 Atomics.isLockFree ( size )
この関数は呼び出されたとき、次の手順を実行します。
n を ? ToIntegerOrInfinity (size ) とする。agentRecord を周囲の agent の Agent Record とする。n = 1 である場合、agentRecord .[[IsLockFree1]] を返す。n = 2 である場合、agentRecord .[[IsLockFree2]] を返す。n = 4 である場合、true を返す。n = 8 である場合、agentRecord .[[IsLockFree8]] を返す。false を返す。
注
この関数は最適化用プリミティブです。直感的には、サイズ n byte のデータに対する atomic プリミティブ(compareExchange、load、store、add、sub、and、or、xor、または exchange)の atomic な手順が、そのデータを構成する n byte の外側にあるロックを周囲の agent が取得することなく実行される場合、Atomics.isLockFree(n ) は true を返します。高性能アルゴリズムは、この関数を使用して critical section でロックを使うか atomic 操作を使うかを判断します。atomic プリミティブが lock-free でない場合、アルゴリズム自身がロックを提供する方が効率的であることがよくあります。
Atomics.isLockFree(4) は、既知のすべての関連ハードウェアでサポートできるため、常に true を返します。これを仮定できることで、一般にプログラムを簡素化できます。
この関数が返す値に関係なく、すべての atomic 操作は atomic であることが保証されます。たとえば、操作の途中で観測可能な操作が発生する(例:「tearing」)ことは決してありません。
25.4.9 Atomics.load ( ta , index )
この関数は呼び出されたとき、次の手順を実行します。
byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray (ta , index ) とする。? RevalidateAtomicAccess (ta , byteIndexInBuffer ) を実行する。 buffer を ta .[[ViewedArrayBuffer]] とする。elementType を TypedArrayElementType (ta ) とする。GetValueFromBuffer (buffer , byteIndexInBuffer , elementType , true , seq-cst ) を返す。
25.4.10 Atomics.notify ( ta , index , count )
この関数は、wait queue 内でスリープしているいくつかの agent に通知します。
呼び出されたとき、次の手順を実行します。
taRecord を ? ValidateIntegerTypedArray (ta , true ) とする。byteIndexInBuffer を ? ValidateAtomicAccess (taRecord , index ) とする。count が undefined である場合、count を +∞ に設定する。そうでない場合、intCount を ? ToIntegerOrInfinity (count ) とする。count を max (intCount , 0) に設定する。 buffer を ta .[[ViewedArrayBuffer]] とする。block を buffer .[[ArrayBufferData]] とする。IsSharedArrayBuffer (buffer ) が false である場合、+0 𝔽 を返す。waiterList を GetWaiterList (block , byteIndexInBuffer ) とする。EnterCriticalSection (waiterList ) を実行する。waiters を RemoveWaiters (waiterList , count ) とする。waiters の各要素 waiterRecord について、次を行う。NotifyWaiter (waiterList , waiterRecord ) を実行する。LeaveCriticalSection (waiterList ) を実行する。waitersCount を waiters の要素数とする。𝔽 (waitersCount ) を返す。
25.4.11 Atomics.or ( ta , index , value )
この関数は呼び出されたとき、次の手順を実行します。
or を、何も捕捉せず、パラメーター (xBytes , yBytes ) を持ち、呼び出されたときに次の手順を atomic に実行する新しい read-modify-write modification function とする。ByteListBitwiseOp (|, xBytes , yBytes ) を返す。? AtomicReadModifyWrite (ta , index , value , or ) を返す。
25.4.12 Atomics.pause ( )
この関数は、プログラムが値を待ちながらスピンループしていることを CPU に示すヒントを提供します。
呼び出されたとき、次の手順を実行します。
ECMAScript 実装の実行環境が、現在実行中のコードがスピン待機ループ内にあることをオペレーティングシステムまたは CPU に通知することをサポートしている場合、その通知を送る。 undefined を返す。
注 1
このメソッドは、mutex 内の spinlock fast path など、スピン待機ループを実装するプログラムが、値を待ちながらスピンしていることを CPU に示すヒントを提供するために設計されています。タイミング以外の観測可能な動作はありません。
基礎となるアーキテクチャのベストプラクティスがスピンループ内で pause または yield 命令を推奨している場合、実装はそのような命令を実装することが期待されます。たとえば、Intel Optimization Manual は pause 命令を推奨しています。
実装には、一時停止する最大時間について、数十から数百ナノ秒程度の内部上限を設けることが推奨されます。
注 2
関数呼出しのオーバーヘッドにより、最適化コンパイラー内でインライン化されたこのメソッドの呼出しが、インライン化されていない呼出しとは異なる時間待機することは合理的です。
25.4.13 Atomics.store ( ta , index , value )
この関数は呼び出されたとき、次の手順を実行します。
byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray (ta , index ) とする。ta .[[ContentType]] が bigint である場合、coerced を ? ToBigInt (value ) とする。そうでない場合、coerced を 𝔽 (? ToIntegerOrInfinity (value )) とする。 ? RevalidateAtomicAccess (ta , byteIndexInBuffer ) を実行する。 buffer を ta .[[ViewedArrayBuffer]] とする。elementType を TypedArrayElementType (ta ) とする。SetValueInBuffer (buffer , byteIndexInBuffer , elementType , coerced , true , seq-cst ) を実行する。coerced を返す。
25.4.14 Atomics.sub ( ta , index , value )
この関数は呼び出されたとき、次の手順を実行します。
subtract を、ta を捕捉し、パラメーター (xBytes , yBytes ) を持ち、呼び出されたときに次の手順を atomic に実行する新しい read-modify-write modification function とする。type を TypedArrayElementType (ta ) とする。agentRecord を周囲の agent の Agent Record とする。isLittleEndian を agentRecord .[[LittleEndian]] とする。x を RawBytesToNumeric (type , xBytes , isLittleEndian ) とする。y を RawBytesToNumeric (type , yBytes , isLittleEndian ) とする。x が Number である場合、difference を Number::subtract (x , y ) とする。そうでない場合、表明 : x は BigInt である。difference を BigInt::subtract (x , y ) とする。 differenceBytes を NumericToRawBytes (type , difference , isLittleEndian ) とする。表明 : differenceBytes 、xBytes 、および yBytes は同じ要素数を持つ。differenceBytes を返す。? AtomicReadModifyWrite (ta , index , value , subtract ) を返す。
25.4.15 Atomics.wait ( ta , index , value , timeout )
この関数は周囲の agent を wait queue に入れて、通知されるか待機が timeout するまで一時停止し、それらのケースを区別する String を返します。
呼び出されたとき、次の手順を実行します。
? DoWait (sync , ta , index , value , timeout ) を返す。
25.4.16 Atomics.waitAsync ( ta , index , value , timeout )
この関数は、呼出し元の agent が通知されるか timeout に達したときに解決される Promise を返します。
呼び出されたとき、次の手順を実行します。
? DoWait (async , ta , index , value , timeout ) を返す。
25.4.17 Atomics.xor ( ta , index , value )
この関数は呼び出されたとき、次の手順を実行します。
xor を、何も捕捉せず、パラメーター (xBytes , yBytes ) を持ち、呼び出されたときに次の手順を atomic に実行する新しい read-modify-write modification function とする。ByteListBitwiseOp (^, xBytes , yBytes ) を返す。? AtomicReadModifyWrite (ta , index , value , xor ) を返す。
25.4.18 Atomics [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "Atomics" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
25.5 JSON オブジェクト
JSON オブジェクトは:
%JSON% です。
グローバルオブジェクト の "JSON" プロパティの初期値です。
通常オブジェクト です。
JSON テキストを解析および構築するために使用される2つの関数、parse および stringify を含みます。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
[[Construct]] 内部メソッドを持ちません。new 演算子でコンストラクター として使用することはできません。
[[Call]] 内部メソッドを持ちません。関数として呼び出すことはできません。
JSON Data Interchange Format は ECMA-404 で定義されています。この仕様で使用される JSON interchange format は、ECMA-404 で説明されるものと正確に同じです。JSON.parse および JSON.stringify の適合実装は、形式への削除または拡張を行うことなく、ECMA-404 で説明される正確な interchange format をサポートしなければなりません。
25.5.1 JSON.isRawJSON ( obj )
この関数は呼び出されたとき、次の手順を実行します。
obj が Object であり、obj が [[IsRawJSON]] 内部スロットを持つ場合、true を返す。false を返す。
25.5.2 JSON.parse ( text [ , reviver ] )
この関数は JSON テキスト(JSON 形式の String)を解析し、ECMAScript 言語値 を生成します。JSON 形式は、ECMAScript のリテラル、Array Initializer、および Object Initializer の構文に似た構文で、リテラル、配列、およびオブジェクトを表します。解析後、JSON オブジェクトは ECMAScript オブジェクトとして実体化されます。JSON 配列は ECMAScript Array インスタンスとして実体化されます。JSON の文字列、数値、真偽値、および null は、それぞれ ECMAScript の String、Number、Boolean、および null として実体化されます。
省略可能な reviver パラメーターは、結果をフィルターおよび変換できる関数です。解析によって生成された各値について、reviver は3つの引数(関連付けられたプロパティキー 、値、および context オブジェクト)で呼び出されます。プロパティが変更されておらず、その値がプリミティブである場合、提供される context オブジェクトは、対応する Parse Node のソーステキストを含む "source" プロパティを持ちます。呼出しが undefined を返した場合、そのプロパティは削除されます。そうでない場合、そのプロパティは戻り値を使用するよう再定義されます。
jsonString を ? ToString (text ) とする。parseResult を ? ParseJSON (jsonString ) とする。unfiltered を parseResult .[[Value]] とする。IsCallable (reviver ) が false である場合、unfiltered を返す。root を OrdinaryObjectCreate (%Object.prototype% ) とする。rootName を空の String とする。! CreateDataPropertyOrThrow (root , rootName , unfiltered ) を実行する。 snapshot を CreateJSONParseRecord (parseResult .[[ParseNode]] , rootName , unfiltered ) とする。? InternalizeJSONProperty (root , rootName , reviver , snapshot ) を返す。
この関数の "length" プロパティは 2 𝔽 です。
25.5.2.1 ParseJSON ( text )
抽象操作 ParseJSON。引数 text (String)。戻り値:(正常完了 (値:レコード (フィールド:[[ParseNode]] (構文解析ノード ), [[Value]] (ECMAScript 言語値 ))) または throw 完了 )。 呼び出されると、次の手順を実行する。
StringToCodePoints (text ) が ECMA-404 で規定される有効な JSON テキストでない場合、SyntaxError 例外をスローする。scriptString を "(" 、text 、および ");" の文字列連結 とする。script を ParseText (scriptString , Script ) とする。注記 : 13.2.5.1 で定義される early error 規則には、上記の ParseText 呼出しに対する特別な処理がある。表明 : script は Parse Node である。result を ! script の Evaluation とする。注記 : 13.2.5.6 で定義される PropertyDefinitionEvaluation の意味論には、上記の評価に対する特別な処理がある。表明 : result は String、Number、Boolean、ArrayLiteral または ObjectLiteral のいずれかによって定義される Object、または null のいずれかである。Record { [[ParseNode]] : script , [[Value]] : result } を返す。
JSON.parse の適合実装が JSON 文法を拡張することは許可されません。実装が変更または拡張された JSON interchange format をサポートしたい場合、別の parse 関数を定義することによって行わなければなりません。
注 1
有効な JSON テキストは ECMAScript PrimaryExpression 構文の部分集合です。手順 1 は jsonString がその部分集合に適合することを検証し、手順 8 は評価が適切な型の値を返すことを表明 します。
ただし、13.2.5.6 は ParseJSON の間では異なる動作をするため、同じソーステキストでも JSON としてではなく PrimaryExpression として評価した場合に異なる結果を生成する可能性があります。さらに、object literal における重複する "__proto__" プロパティに対する Early Error も ParseJSON の間には適用されないため、ParseJSON によって受理されるすべてのテキストが、文法に一致していても PrimaryExpression として有効とは限りません。
注 2
オブジェクト内に重複する名前の String が存在する場合、同じキーについて字句的に先行する値は上書きされなければなりません。
25.5.2.2 JSON Parse Record
JSON Parse Record は、JSON テキストから解析された値の初期状態を記述するために使用される Record です。
JSON Parse Record は 表 76 に列挙されるフィールドを持ちます。
表 76: JSON Parse Record のフィールド
25.5.2.3 CreateJSONParseRecord ( parseNode , key , value )
抽象操作 CreateJSONParseRecord。引数 parseNode (構文解析ノード )、key (プロパティ名 ) および value (ECMAScript 言語値 )。戻り値:JSON Parseレコード 。 JSON テキストから解析された parseNode と、その評価によって生成された value を再帰的に結合します。 呼び出されると、次の手順を実行する。
typedValueNode を ShallowestContainedJSONValue (parseNode ) とする。表明 : typedValueNode は empty でない。elements を新しい空の List とする。entries を新しい空の List とする。value が Object である場合、isArray を ! IsArray (value ) とする。isArray が true である場合、表明 : typedValueNode は ArrayLiteral Parse Node である。contentNodes を typedValueNode の JSONArrayLiteralContentNodes とする。length を contentNodes の要素数とする。valueLength を ! LengthOfArrayLike (value ) とする。表明 : valueLength は length である。index を 0 とする。index < length の間、次を繰り返す。propertyName を ! ToString (𝔽 (index )) とする。elementParseRecord を CreateJSONParseRecord (contentNodes [index ], propertyName , ! Get (value , propertyName )) とする。elementParseRecord を elements に追加する。index を index + 1 に設定する。そうでない場合、表明 : typedValueNode は ObjectLiteral Parse Node である。propertyNodes を typedValueNode の PropertyDefinitionNodes とする。注記 : value は JSON テキストから生成されており変更されていないため、そのすべてのプロパティキー は String であり、漏れなく列挙される。keys を ! EnumerableOwnProperties (value , key ) とする。keys の各 String propertyKey について、次を行う。注記 : JSON テキストが単一のオブジェクトについて同じ名前を持つ複数の名前と値のペアを指定する場合({"a":"lost","a":"kept"} など)、結果として得られる ECMAScript オブジェクトの対応するプロパティの値は、その名前を持つ最後のペアによって規定される。propertyDefinition を empty とする。propertyNodes の各 Parse Node propertyNode について、次を行う。propertyName を propertyNode の PropName とする。propertyName が propertyKey である場合、propertyDefinition を propertyNode に設定する。表明 : propertyDefinition は
PropertyDefinition :
PropertyName
:
AssignmentExpression
である。propertyValueNode を propertyDefinition の AssignmentExpression とする。entryParseRecord を CreateJSONParseRecord (propertyValueNode , propertyKey , ! Get (value , propertyKey )) とする。entryParseRecord を entries に追加する。 そうでない場合、表明 : typedValueNode は ArrayLiteral Parse Node でも ObjectLiteral Parse Node でもない。 JSON Parse Record { [[ParseNode]] : typedValueNode , [[Key]] : key , [[Value]] : value , [[Elements]] : elements , [[Entries]] : entries } を返す。
25.5.2.4 InternalizeJSONProperty ( holder , name , reviver , parseRecord )
抽象操作 InternalizeJSONProperty。引数 holder (Object)、name (String)、reviver (関数オブジェクト ) および parseRecord ((JSON Parseレコード または empty ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。
注
このアルゴリズムは、[[Delete]] または CreateDataProperty のいずれかが false を返しても、意図的に例外をスローしません。
呼び出されたとき、次の手順を実行します。
value を ? Get (holder , name ) とする。context を OrdinaryObjectCreate (%Object.prototype% ) とする。parseRecord が JSON Parse Record であり、SameValue (parseRecord .[[Value]] , value ) が true である場合、value が Object でない場合、parseNode を parseRecord .[[ParseNode]] とする。表明 : parseNode は ArrayLiteral Parse Node でも ObjectLiteral Parse Node でもない。sourceText を parseNode によってマッチされたソーステキストとする。! CreateDataPropertyOrThrow (context , "source" , CodePointsToString (sourceText )) を実行する。 elementRecords を parseRecord .[[Elements]] とする。entryRecords を parseRecord .[[Entries]] とする。そうでない場合、elementRecords を新しい空の List とする。entryRecords を新しい空の List とする。 value が Object である場合、isArray を ? IsArray (value ) とする。isArray が true である場合、elementRecordsLength を elementRecords の要素数とする。length を ? LengthOfArrayLike (value ) とする。index を 0 とする。index < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (index )) とする。index < elementRecordsLength である場合、elementRecord を elementRecords [index ] とする。そうでない場合、elementRecord を empty とする。newElement を ? InternalizeJSONProperty (value , propertyKey , reviver , elementRecord ) とする。newElement が undefined である場合、? value .[[Delete]] (propertyKey ) を実行する。 そうでない場合、? CreateDataProperty (value , propertyKey , newElement ) を実行する。 index を index + 1 に設定する。そうでない場合、keys を ? EnumerableOwnProperties (value , key ) とする。keys の各 String propertyKey について、次を行う。entryRecords に entry .[[Key]] が propertyKey である要素 entry が存在する場合、entryRecord を entry とする。そうでない場合、entryRecord を empty とする。newElement を ? InternalizeJSONProperty (value , propertyKey , reviver , entryRecord ) とする。newElement が undefined である場合、? value .[[Delete]] (propertyKey ) を実行する。 そうでない場合、? CreateDataProperty (value , propertyKey , newElement ) を実行する。 ? Call (reviver , holder , « name , value , context ») を返す。
25.5.2.5 Static Semantics: ShallowestContainedJSONValue ( root )
抽象操作 ShallowestContainedJSONValue。引数 root (構文解析ノード )。戻り値:(構文解析ノード または empty )。 root を根とする parse tree の幅優先探索を実行し、JSON 値に対応する nonterminal のインスタンスである最初のノードを返します。そのようなノードがない場合は empty を返します。 呼び出されると、次の手順を実行する。
activeFunc をアクティブな関数オブジェクト とする。表明 : activeFunc は JSON.parse 組込み関数オブジェクト である(JSON.parse を参照)。types を « NullLiteral , BooleanLiteral , NumericLiteral , StringLiteral , ArrayLiteral , ObjectLiteral , UnaryExpression » とする。unaryExpr を empty とする。queue を « root » とする。queue が空でない間、次を繰り返す。candidate を queue の最初の要素とする。queue から最初の要素を削除する。queuedChildren を false とする。types の各 nonterminal type について、次を行う。candidate が type のインスタンスである場合、注記 : JSON 文法では、number token は負の値を表す場合がある。ECMAScript では、否定は UnaryExpression が - に続いて派生 UnaryExpression を parse する単項操作として表される。type が UnaryExpression である場合、candidate の親が UnaryExpression Parse Node でない場合、unaryExpr を candidate に設定する。そうでなく、type が NumericLiteral である場合、表明 : candidate は unaryExpr 内に含まれる。unaryExpr を返す。 そうでない場合、candidate を返す。 queuedChildren が false 、candidate が nonterminal のインスタンス、かつ candidate Contains type が true である場合、children を candidate の各子ノードを順番に含む List とする。queue を queue と children のリスト連結 に設定する。queuedChildren を true に設定する。empty を返す。
25.5.2.6 Static Semantics: JSONArrayLiteralContentNodes
構文指向操作 JSONArrayLiteralContentNodes。引数なし。戻り値:リスト (要素:構文解析ノード )。 次の生成規則ごとに定義される。
ArrayLiteral :
[
Elision opt
]
[
ElementList
]
[
ElementList
,
Elision opt
]
表明 : Elision は存在しない。ElementList が存在しない場合、新しい空の List を返す。ElementList の JSONArrayLiteralContentNodes を返す。
ElementList :
Elision opt
AssignmentExpression
表明 : Elision は存在しない。« AssignmentExpression » を返す。
ElementList :
ElementList
,
Elision opt
AssignmentExpression
表明 : Elision は存在しない。elements を派生 ElementList の JSONArrayLiteralContentNodes とする。elements と « AssignmentExpression » のリスト連結 を返す。
ElementList :
Elision opt
SpreadElement
ElementList
,
Elision opt
SpreadElement
注記 : ECMA-404 で規定される JSON テキストには SpreadElement は含まれない。表明 : この手順には決して到達しない。
25.5.3 JSON.rawJSON ( text )
この関数は、文字列、数値、真偽値、または null 値の raw JSON テキストを表すオブジェクトを返します。
jsonString を ? ToString (text ) とする。jsonString が空の String である場合、SyntaxError 例外をスローする。jsonString の最初のコード単位が、ASCII 小文字コード単位(0x0061 から 0x007A まで、両端を含む)、ASCII 数字コード単位(0x0030 から 0x0039 まで、両端を含む)、0x0022 (QUOTATION MARK)、または 0x002D (HYPHEN-MINUS) のいずれでもない場合、SyntaxError 例外をスローする。jsonString の最後のコード単位が、ASCII 小文字コード単位(0x0061 から 0x007A まで、両端を含む)、ASCII 数字コード単位(0x0030 から 0x0039 まで、両端を含む)、または 0x0022 (QUOTATION MARK) のいずれでもない場合、SyntaxError 例外をスローする。parseResult を ? ParseJSON (jsonString ) とする。表明 : parseResult .[[Value]] は String、Number、Boolean、または null のいずれかである。internalSlotsList を « [[IsRawJSON]] » とする。obj を OrdinaryObjectCreate (null , internalSlotsList ) とする。! CreateDataPropertyOrThrow (obj , "rawJSON" , jsonString ) を実行する。 ! SetIntegrityLevel (obj , frozen ) を実行する。 obj を返す。
25.5.4 JSON.stringify ( value [ , replacer [ , space ] ] )
この関数は、ECMAScript 言語値 を表す UTF-16 エンコードされた JSON 形式の String、または undefined を返します。3つのパラメーターを取ることができます。value パラメーターは ECMAScript 言語値 であり、通常はオブジェクトまたは配列ですが、String、Boolean、Number、または null にすることもできます。省略可能な replacer パラメーターは、オブジェクトと配列が文字列化される方法を変更する関数、または文字列化するオブジェクトプロパティを選択する包含リストとして機能する String と Number の配列のいずれかです。省略可能な space パラメーターは String または Number であり、人間にとっての可読性を高めるために結果へ空白を挿入できます。
呼び出されたとき、次の手順を実行します。
stack を新しい空の List とする。indent を空の String とする。propertyList を undefined とする。replacerFunc を undefined とする。replacer が Object である場合、IsCallable (replacer ) が true である場合、replacerFunc を replacer に設定する。そうでない場合、isArray を ? IsArray (replacer ) とする。isArray が true である場合、propertyList を新しい空の List に設定する。length を ? LengthOfArrayLike (replacer ) とする。k を 0 とする。k < length の間、次を繰り返す。propertyKey を ! ToString (𝔽 (k )) とする。propertyValue を ? Get (replacer , propertyKey ) とする。item を undefined とする。propertyValue が String である場合、item を propertyValue に設定する。そうでなく、propertyValue が Number である場合、item を ! ToString (propertyValue ) に設定する。 そうでなく、propertyValue が Object である場合、propertyValue が [[StringData]] または [[NumberData]] 内部スロットを持つ場合、item を ? ToString (propertyValue ) に設定する。 item が undefined でなく、propertyList が item を含まない場合、item を propertyList に追加する。k を k + 1 に設定する。 space が Object である場合、space が [[NumberData]] 内部スロットを持つ場合、space を ? ToNumber (space ) に設定する。そうでなく、space が [[StringData]] 内部スロットを持つ場合、space を ? ToString (space ) に設定する。 space が Number である場合、spaceMV を ! ToIntegerOrInfinity (space ) とする。spaceMV を min (10, spaceMV ) に設定する。spaceMV < 1 である場合、gap を空の String とする。そうでない場合、gap をコード単位 0x0020 (SPACE) が spaceMV 回出現する String 値とする。そうでなく、space が String である場合、space の長さ ≤ 10 である場合、gap を space とする。そうでない場合、gap を space の 0 から 10 までの部分文字列 とする。 そうでない場合、gap を空の String とする。 wrapper を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (wrapper , 空の String, value ) を実行する。 state を JSON Serialization Record { [[ReplacerFunction]] : replacerFunc , [[Stack]] : stack , [[Indent]] : indent , [[Gap]] : gap , [[PropertyList]] : propertyList } とする。? SerializeJSONProperty (state , 空の String, wrapper ) を返す。
この関数の "length" プロパティは 3 𝔽 です。
注 1
JSON 構造は任意の深さまでネストできますが、非循環でなければなりません。value が循環構造であるか循環構造を含む場合、この関数は TypeError 例外をスローしなければなりません。次は文字列化できない値の例です。
a = [];
a[0 ] = a;
my_text = JSON .stringify (a);
注 2
記号的なプリミティブ値は次のように表現されます。
null 値は JSON テキスト内で String 値 "null" として表現されます。
undefined 値は表現されません。
true 値は JSON テキスト内で String 値 "true" として表現されます。
false 値は JSON テキスト内で String 値 "false" として表現されます。
注 3
String 値は QUOTATION MARK (") コード単位で囲まれます。コード単位 " および \ は \ 接頭辞によってエスケープされます。制御文字のコード単位はエスケープシーケンス \uHHHH、または短縮形 \b (BACKSPACE)、\f (FORM FEED)、\n (LINE FEED)、\r (CARRIAGE RETURN)、\t (CHARACTER TABULATION) に置き換えられます。
注 4
各有限 Number は、ToString (number ) を呼び出した場合と同様に文字列化される。NaN 、+∞ 𝔽 、および -∞ 𝔽 は、String 値 "null" として表される。
注 5
JSON 表現を持たない値(undefined や関数など)は String を生成しません。代わりに undefined 値を生成します。配列ではこれらの値は String 値 "null" として表現されます。オブジェクトでは、表現できない値を持つプロパティは文字列化から除外されます。
注 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.4.1 JSON Serialization Record
JSON Serialization Record は、JSON 形式へのシリアライズを可能にするために使用される Record です。
JSON Serialization Record は 表 77 に列挙されるフィールドを持ちます。
表 77: JSON Serialization Record のフィールド
フィールド名
値
意味
[[ReplacerFunction]]
a function object or undefined
オブジェクトプロパティの置換値を提供できる関数(JSON.stringify の replacer パラメーターから)。
[[PropertyList]]
either a List of Strings or undefined
非配列オブジェクトをシリアライズするときに含めるプロパティ名 (JSON.stringify の replacer パラメーターから)。
[[Gap]]
a String
インデントの単位(JSON.stringify の space パラメーターから)。
[[Stack]]
a List of Objects
シリアライズ処理中のネストされたオブジェクトの集合。循環構造を検出するために使用されます。
[[Indent]]
a String
現在のインデント。
25.5.4.2 SerializeJSONProperty ( state , key , holder )
抽象操作 SerializeJSONProperty。引数 state (JSON Serializationレコード )、key (String) および holder (Object)。戻り値:(正常完了 (値:(String または undefined )) または throw 完了 )。 呼び出されると、次の手順を実行する。
value を ? Get (holder , key ) とする。value が Object または BigInt である場合、toJSON を ? GetV (value , "toJSON" ) とする。IsCallable (toJSON ) が true である場合、value を ? Call (toJSON , value , « key ») に設定する。state .[[ReplacerFunction]] が undefined でない場合、value を ? Call (state .[[ReplacerFunction]] , holder , « key , value ») に設定する。value が Object である場合、value が [[IsRawJSON]] 内部スロットを持つ場合、rawJSON を ! Get (value , "rawJSON" ) とする。表明 : rawJSON は String である。rawJSON を返す。value が [[NumberData]] 内部スロットを持つ場合、value を ? ToNumber (value ) に設定する。それ以外で value が [[StringData]] 内部スロットを持つ場合、value を ? ToString (value ) に設定する。 それ以外で value が [[BooleanData]] 内部スロットを持つ場合、value を value .[[BooleanData]] に設定する。 それ以外で value が [[BigIntData]] 内部スロットを持つ場合、value を value .[[BigIntData]] に設定する。 value が null である場合、"null" を返す。value が true である場合、"true" を返す。value が false である場合、"false" を返す。value が String である場合、QuoteJSONString (value ) を返す。value が Number である場合、value が有限 Number である場合、! ToString (value ) を返す。"null" を返す。value が BigInt である場合、TypeError 例外を投げる。value が Object であり、IsCallable (value ) が false である場合、isArray を ? IsArray (value ) とする。isArray が true である場合、? SerializeJSONArray (state , value ) を返す。 ? SerializeJSONObject (state , value ) を返す。 undefined を返す。
25.5.4.3 QuoteJSONString ( value )
抽象操作 QuoteJSONString。引数 value (String)。戻り値:String。 value を 0x0022 (QUOTATION MARK) コード単位で囲み、その内部の特定のその他のコード単位をエスケープします。この操作は、6.1.4 で説明されるように、value を UTF-16 エンコードされたコードポイントの列として解釈します。 呼び出されると、次の手順を実行する。
product をコード単位 0x0022 (QUOTATION MARK) のみからなる String 値とする。StringToCodePoints (value ) の各コードポイント codePoint について、次を行う。codePoint が 表 78 の「Code Point」列に列挙されている場合、product を product と、対応する行の「Escape Sequence」列で規定される codePoint のエスケープシーケンスとの文字列連結 に設定する。そうでなく、codePoint の数値が 0x0020 (SPACE) より小さいか、codePoint が leading surrogate または trailing surrogate と同じ数値を持つ場合、unit を数値が codePoint の数値であるコード単位とする。product を product と UnicodeEscape (unit ) の文字列連結 に設定する。 そうでない場合、product を product と UTF16EncodeCodePoint (codePoint ) の文字列連結 に設定する。 product を product とコード単位 0x0022 (QUOTATION MARK) の文字列連結 に設定する。product を返す。
表 78: JSON 単一文字エスケープシーケンス
コードポイント
Unicode 文字名
エスケープシーケンス
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.4.4 UnicodeEscape ( codeUnit )
抽象操作 UnicodeEscape。引数 codeUnit (コード単位)。戻り値:String。 codeUnit を Unicode エスケープシーケンスとして表現します。 呼び出されると、次の手順を実行する。
n を codeUnit の数値とする。表明 : n ≤ 0xFFFF。hex を、小文字の16進数として書式設定された n の String 表現とする。コード単位 0x005C (REVERSE SOLIDUS)、"u" 、および StringPad (hex , 4, "0" , start ) の文字列連結 を返す。
25.5.4.5 SerializeJSONObject ( state , value )
抽象操作 SerializeJSONObject。引数 state (JSON Serializationレコード ) および value (Object)。戻り値:(正常完了 (値:String) または throw 完了 )。 オブジェクトをシリアライズします。 呼び出されると、次の手順を実行する。
state .[[Stack]] が value を含む場合、構造が循環しているため TypeError 例外をスローする。value を state .[[Stack]] に追加する。stepBack を state .[[Indent]] とする。state .[[Indent]] を state .[[Indent]] と state .[[Gap]] の文字列連結 に設定する。state .[[PropertyList]] が undefined でない場合、keys を state .[[PropertyList]] とする。そうでない場合、keys を ? EnumerableOwnProperties (value , key ) とする。 partial を新しい空の List とする。keys の各要素 propertyKey について、次を行う。stringP を ? SerializeJSONProperty (state , propertyKey , value ) とする。stringP が undefined でない場合、member を QuoteJSONString (propertyKey ) とする。member を member と ":" の文字列連結 に設定する。state .[[Gap]] が空の String でない場合、member を member とコード単位 0x0020 (SPACE) の文字列連結 に設定する。member を member と stringP の文字列連結 に設定する。member を partial に追加する。partial が空である場合、final を "{}" とする。そうでない場合、state .[[Gap]] が空の String である場合、properties を、partial のすべての要素 String を連結し、隣接する各 String の組の間をコード単位 0x002C (COMMA) で区切って形成される String 値とする。最初の String の前にも最後の String の後にもコンマは挿入されない。final を "{" 、properties 、および "}" の文字列連結 とする。そうでない場合、separator をコード単位 0x002C (COMMA)、コード単位 0x000A (LINE FEED)、および state .[[Indent]] の文字列連結 とする。properties を、partial のすべての要素 String を連結し、隣接する各 String の組の間を separator で区切って形成される String 値とする。separator String は最初の String の前にも最後の String の後にも挿入されない。final を "{" 、コード単位 0x000A (LINE FEED)、state .[[Indent]] 、properties 、コード単位 0x000A (LINE FEED)、stepBack 、および "}" の文字列連結 とする。 state .[[Stack]] の最後の要素を削除する。state .[[Indent]] を stepBack に設定する。final を返す。
25.5.4.6 SerializeJSONArray ( state , value )
抽象操作 SerializeJSONArray。引数 state (JSON Serializationレコード ) および value (Object)。戻り値:(正常完了 (値:String) または throw 完了 )。 配列をシリアライズします。 呼び出されると、次の手順を実行する。
state .[[Stack]] が value を含む場合、構造が循環しているため TypeError 例外をスローする。value を state .[[Stack]] に追加する。stepBack を state .[[Indent]] とする。state .[[Indent]] を state .[[Indent]] と state .[[Gap]] の文字列連結 に設定する。partial を新しい空の List とする。length を ? LengthOfArrayLike (value ) とする。index を 0 とする。index < length の間、次を繰り返す。stringP を ? SerializeJSONProperty (state , ! ToString (𝔽 (index )), value ) とする。stringP が undefined である場合、"null" を partial に追加する。そうでない場合、stringP を partial に追加する。 index を index + 1 に設定する。partial が空である場合、final を "[]" とする。そうでない場合、state .[[Gap]] が空の String である場合、properties を、partial のすべての要素 String を連結し、隣接する各 String の組の間をコード単位 0x002C (COMMA) で区切って形成される String 値とする。最初の String の前にも最後の String の後にもコンマは挿入されない。final を "[" 、properties 、および "]" の文字列連結 とする。そうでない場合、separator をコード単位 0x002C (COMMA)、コード単位 0x000A (LINE FEED)、および state .[[Indent]] の文字列連結 とする。properties を、partial のすべての要素 String を連結し、隣接する各 String の組の間を separator で区切って形成される String 値とする。separator String は最初の String の前にも最後の String の後にも挿入されない。final を "[" 、コード単位 0x000A (LINE FEED)、state .[[Indent]] 、properties 、コード単位 0x000A (LINE FEED)、stepBack 、および "]" の文字列連結 とする。 state .[[Stack]] の最後の要素を削除する。state .[[Indent]] を stepBack に設定する。final を返す。
注
配列の表現には、+0 𝔽 (含む)から array.length(含まない)までの区間 にある要素のみが含まれます。キーが配列インデックス でないプロパティは文字列化から除外されます。配列は開始 LEFT SQUARE BRACKET、COMMA で区切られた要素、および終了 RIGHT SQUARE BRACKET として文字列化されます。
25.5.5 JSON [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "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 )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 CanBeHeldWeakly (target ) が false である場合、TypeError 例外をスローする。weakRef を ? OrdinaryCreateFromConstructor (NewTarget, "%WeakRef.prototype%" , « [[WeakRefTarget]] ») とする。AddToKeptObjects (target ) を実行する。weakRef .[[WeakRefTarget]] を target に設定する。weakRef を返す。
26.1.2 WeakRef コンストラクターのプロパティ
WeakRef コンストラクター は:
26.1.2.1 WeakRef.prototype
WeakRef.prototype の初期値は WeakRef prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
26.1.3 WeakRef Prototype オブジェクトのプロパティ
WeakRef prototype オブジェクト は:
規定の任意機能
26.1.3.1 WeakRef.prototype.constructor
WeakRef.prototype.constructor の初期値は %WeakRef% です。
26.1.3.2 WeakRef.prototype.deref ( )
このメソッドは呼び出されたとき、次の手順を実行します。
weakRef を this 値とする。? RequireInternalSlot (weakRef , [[WeakRefTarget]] ) を実行する。 WeakRefDeref (weakRef ) を返す。
注
WeakRef が undefined でない 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% プロパティの初期値は String 値 "WeakRef" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
26.1.4 WeakRef の抽象操作
26.1.4.1 WeakRefDeref ( weakRef )
抽象操作 WeakRefDeref。引数 weakRef (WeakRef )。戻り値:ECMAScript 言語値 。 呼び出されると、次の手順を実行する。
target を weakRef .[[WeakRefTarget]] とする。target が empty でない場合、AddToKeptObjects (target ) を実行する。target を返す。undefined を返す。
注
この抽象操作 は、生存性を簡潔に定義できるようにするためだけに、WeakRef.prototype.deref とは別に定義されています。
26.1.5 WeakRef インスタンスのプロパティ
WeakRef インスタンスは WeakRef prototype オブジェクト からプロパティを継承する通常オブジェクト です。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 )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 IsCallable (cleanupCallback ) が false である場合、TypeError 例外をスローする。finalizationRegistry を ? OrdinaryCreateFromConstructor (NewTarget, "%FinalizationRegistry.prototype%" , « [[Realm]] , [[CleanupCallback]] , [[Cells]] ») とする。activeFunc をアクティブな関数オブジェクト とする。finalizationRegistry .[[Realm]] を activeFunc .[[Realm]] に設定する。finalizationRegistry .[[CleanupCallback]] を HostMakeJobCallback (cleanupCallback ) に設定する。finalizationRegistry .[[Cells]] を新しい空の List に設定する。finalizationRegistry を返す。
26.2.2 FinalizationRegistry コンストラクターのプロパティ
FinalizationRegistry コンストラクター は:
26.2.2.1 FinalizationRegistry.prototype
FinalizationRegistry.prototype の初期値は FinalizationRegistry prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
26.2.3 FinalizationRegistry Prototype オブジェクトのプロパティ
FinalizationRegistry prototype オブジェクト は:
%FinalizationRegistry.prototype% です。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
通常オブジェクト です。
[[Cells]] および [[CleanupCallback]] 内部スロットを持ちません。
26.2.3.1 FinalizationRegistry.prototype.constructor
FinalizationRegistry.prototype.constructor の初期値は %FinalizationRegistry% です。
26.2.3.2 FinalizationRegistry.prototype.register ( target , heldValue [ , unregisterToken ] )
このメソッドは呼び出されたとき、次の手順を実行します。
finalizationRegistry を this 値とする。? RequireInternalSlot (finalizationRegistry , [[Cells]] ) を実行する。 CanBeHeldWeakly (target ) が false である場合、TypeError 例外をスローする。SameValue (target , heldValue ) が true である場合、TypeError 例外をスローする。CanBeHeldWeakly (unregisterToken ) が false である場合、unregisterToken が undefined でない場合、TypeError 例外をスローする。unregisterToken を empty に設定する。cell を Record { [[WeakRefTarget]] : target , [[HeldValue]] : heldValue , [[UnregisterToken]] : unregisterToken } とする。cell を finalizationRegistry .[[Cells]] に追加する。undefined を返す。
注
この仕様のアルゴリズムおよび定義に基づけば、finalizationRegistry .[[Cells]] が cell を含むとき cell .[[HeldValue]] は生存しています。ただし、これは必ずしも cell .[[UnregisterToken]] または cell .[[Target]] が生存している ことを意味しません。たとえば、オブジェクト自身を unregister token として登録しても、そのオブジェクトが永久に生存し続けることにはなりません。
26.2.3.3 FinalizationRegistry.prototype.unregister ( unregisterToken )
このメソッドは呼び出されたとき、次の手順を実行します。
finalizationRegistry を this 値とする。? RequireInternalSlot (finalizationRegistry , [[Cells]] ) を実行する。 CanBeHeldWeakly (unregisterToken ) が false である場合、TypeError 例外をスローする。removed を false とする。finalizationRegistry .[[Cells]] の各 Record { [[WeakRefTarget]] , [[HeldValue]] , [[UnregisterToken]] } cell について、次を行う。cell .[[UnregisterToken]] が empty でなく、SameValue (cell .[[UnregisterToken]] , unregisterToken ) が true である場合、cell を finalizationRegistry .[[Cells]] から削除する。removed を true に設定する。removed を返す。
26.2.3.4 FinalizationRegistry.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "FinalizationRegistry" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
26.2.4 FinalizationRegistry インスタンスのプロパティ
FinalizationRegistry インスタンスは FinalizationRegistry prototype オブジェクト からプロパティを継承する通常オブジェクト です。FinalizationRegistry インスタンスは [[Cells]] および [[CleanupCallback]] 内部スロットも持ちます。
27 制御抽象化オブジェクト
27.1 反復
27.1.1 共通反復インターフェイス
インターフェイスとは、関連付けられた値が特定の仕様に一致するプロパティキー の集合です。インターフェイスの仕様で記述されるすべてのプロパティを提供するオブジェクトは、そのインターフェイスに適合する といいます。インターフェイスは独立したオブジェクトによって表現されるものではありません。任意のインターフェイスに適合する、個別に実装された多数のオブジェクトが存在する場合があります。1つのオブジェクトが複数のインターフェイスに適合する場合もあります。
27.1.1.1 Iterable インターフェイス
iterable インターフェイス には、表 79 で説明されるプロパティが含まれます。
表 79: Iterable インターフェイス の必須プロパティ
27.1.1.2 Iterator インターフェイス
iterator インターフェイス を実装するオブジェクトは、表 80 のプロパティを含まなければなりません。そのようなオブジェクトは、表 81 のプロパティも実装してよいものとします。
表 80: Iterator インターフェイス の必須プロパティ
プロパティ
値
要件
"next"
an IteratorResult object を返す関数
返されるオブジェクトは IteratorResult インターフェイス に適合しなければなりません。iterator の next メソッドの以前の呼出しが "done" プロパティが true である IteratorResult オブジェクトを返した場合、そのオブジェクトの next メソッドの以後のすべての呼出しも、"done" プロパティが true である IteratorResult オブジェクトを返すべきです。ただし、この要件は強制されません。
注 1
next 関数には引数を渡すことができますが、その解釈と有効性は対象の iterator に依存します。for-of 文および iterator のその他の一般的な利用者は引数を渡さないため、そのような方法で使用されることを想定する iterator オブジェクトは、引数なしで呼び出されることに対応できなければなりません。
表 81: Iterator インターフェイス の省略可能なプロパティ
プロパティ
値
要件
"return"
an IteratorResult object を返す関数
返されるオブジェクトは IteratorResult インターフェイス に適合しなければなりません。このメソッドを呼び出すと、呼出し元が iterator に対してこれ以上 next メソッドを呼び出す意図がないことを iterator オブジェクトへ通知します。返される IteratorResult オブジェクトは通常、値が true である "done" プロパティと、return メソッドの引数として渡された値を持つ "value" プロパティを持ちます。ただし、この要件は強制されません。
"throw"
an IteratorResult object を返す関数
返されるオブジェクトは IteratorResult インターフェイス に適合しなければなりません。このメソッドを呼び出すと、呼出し元がエラー状態を検出したことを iterator オブジェクトへ通知します。引数はエラー状態を識別するために使用でき、通常は例外オブジェクトです。典型的な応答は、引数として渡された値を throw することです。メソッドが throw しない場合、返される IteratorResult オブジェクトは通常、値が true である "done" プロパティを持ちます。
注 2
通常、これらのメソッドの呼出し元は、呼び出す前にその存在を確認するべきです。for-of、yield*、および配列分割代入を含む特定の ECMAScript 言語機能は、存在確認を行った後にこれらのメソッドを呼び出します。iterable オブジェクトを引数として受け取るほとんどの ECMAScript ライブラリ関数も、条件付きでこれらを呼び出します。
27.1.1.3 Async Iterable インターフェイス
async iterable インターフェイス には、表 82 で説明されるプロパティが含まれます。
表 82: Async Iterable インターフェイス の必須プロパティ
27.1.1.4 Async Iterator インターフェイス
async iterator インターフェイス を実装するオブジェクトは、表 83 のプロパティを含まなければなりません。そのようなオブジェクトは、表 84 のプロパティも実装してよいものとします。
表 83: Async Iterator インターフェイス の必須プロパティ
プロパティ
値
要件
"next"
IteratorResult オブジェクトの promise を返す関数
返される promise は、fulfilled されたとき、IteratorResult インターフェイス に適合するオブジェクトで fulfilled されなければなりません。async iterator の next メソッドの以前の呼出しが、"done" プロパティが true である IteratorResult オブジェクトの promise を返した場合、そのオブジェクトの next メソッドの以後のすべての呼出しも、"done" プロパティが true である IteratorResult オブジェクトの promise を返すべきです。ただし、この要件は強制されません。
さらに、fulfillment 値として機能する IteratorResult オブジェクトは、その値が promise(または「thenable 」)ではない "value" プロパティを持つべきです。ただし、この要件も強制されません。
注 1
next 関数には引数を渡すことができますが、その解釈と有効性は対象の async iterator に依存します。for-await-of 文および async iterator のその他の一般的な利用者は引数を渡さないため、そのような方法で使用されることを想定する async iterator オブジェクトは、引数なしで呼び出されることに対応できなければなりません。
表 84: Async Iterator インターフェイス の省略可能なプロパティ
プロパティ
値
要件
"return"
IteratorResult オブジェクトの promise を返す関数
返される promise は、fulfilled されたとき、IteratorResult インターフェイス に適合するオブジェクトで fulfilled されなければなりません。このメソッドを呼び出すと、呼出し元が async iterator に対してこれ以上 next メソッドを呼び出す意図がないことを async iterator オブジェクトへ通知します。返される promise は通常、値が true である "done" プロパティと、return メソッドの引数として渡された値を持つ "value" プロパティを持つ IteratorResult オブジェクトで fulfilled されます。ただし、この要件は強制されません。
さらに、fulfillment 値として機能する IteratorResult オブジェクトは、その値が promise(または「thenable 」)ではない "value" プロパティを持つべきです。引数値が典型的な方法で使用される場合、それが rejected promise であれば、同じ理由で reject された promise を返すべきです。fulfilled promise であれば、その fulfillment 値を、返される promise の IteratorResult オブジェクト fulfillment 値の "value" プロパティとして使用するべきです。ただし、これらの要件も強制されません。
"throw"
IteratorResult オブジェクトの promise を返す関数
返される promise は、fulfilled されたとき、IteratorResult インターフェイス に適合するオブジェクトで fulfilled されなければなりません。このメソッドを呼び出すと、呼出し元がエラー状態を検出したことを async iterator オブジェクトへ通知します。引数はエラー状態を識別するために使用でき、通常は例外オブジェクトです。典型的な応答は、引数として渡された値で reject される rejected promise を返すことです。
返される promise が fulfilled された場合、その IteratorResult オブジェクト fulfillment 値は通常、値が true である "done" プロパティを持ちます。さらに、値が promise(または「thenable 」)ではない "value" プロパティを持つべきですが、この要件は強制されません。
注 2
通常、これらのメソッドの呼出し元は、呼び出す前にその存在を確認するべきです。for-await-of および yield* を含む特定の ECMAScript 言語機能は、存在確認を行った後にこれらのメソッドを呼び出します。
27.1.1.5 IteratorResult インターフェイス
IteratorResult インターフェイス には、表 85 に列挙されるプロパティが含まれます。
表 85: IteratorResult インターフェイス のプロパティ
プロパティ
値
要件
"done"
a Boolean
これは iterator の next メソッド呼出しの結果状態です。iterator の終端に到達した場合、"done" は true です。終端に到達していない場合、"done" は false であり、値が利用可能です。"done" プロパティ(own または継承されたもの)が存在しない場合、その値は false であるとみなされます。
"value"
an ECMAScript language value
done が false である場合、これは現在の反復要素の値です。done が true である場合、iterator が戻り値を提供したなら、これはその戻り値です。iterator に戻り値がない場合、"value" は undefined です。その場合、適合オブジェクトが明示的な "value" プロパティを継承していなければ、"value" プロパティは存在しなくてもかまいません。
27.1.2 Iterator Helper オブジェクト
Iterator Helper オブジェクト は、特定の source iterator オブジェクトの遅延変換を表す通常オブジェクト です。Iterator Helper オブジェクトには名前付きコンストラクター はありません。代わりに、Iterator Helper オブジェクトは Iterator インスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。
27.1.2.1 %IteratorHelperPrototype% オブジェクト
%IteratorHelperPrototype% オブジェクトは:
27.1.2.1.1 %IteratorHelperPrototype%.next ( )
? GeneratorResume (this 値, undefined , "Iterator Helper" ) を返す。
27.1.2.1.2 %IteratorHelperPrototype%.return ( )
obj を this 値とする。? RequireInternalSlot (obj , [[UnderlyingIterators]] ) を実行する。 表明 : obj は [[GeneratorState]] 内部スロットを持つ。obj .[[GeneratorState]] が suspended-start である場合、obj .[[GeneratorState]] を completed に設定する。注記 : generator が completed 状態に入ると、その状態から離れることはなく、関連付けられた実行コンテキスト が再開されることもない。この時点で obj に関連付けられたすべての実行状態を破棄できる。? IteratorCloseAll (obj .[[UnderlyingIterators]] , NormalCompletion (unused )) を実行する。 CreateIteratorResultObject (undefined , true ) を返す。completion を ReturnCompletion (undefined ) とする。? GeneratorResumeAbrupt (obj , completion , "Iterator Helper" ) を返す。
27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "Iterator Helper" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.1.3 Iterator オブジェクト
27.1.3.1 Iterator コンストラクター
Iterator コンストラクター は:
%Iterator% です。
グローバルオブジェクト の "Iterator" プロパティの初期値です。
サブクラス化できるように設計されています。クラス定義の extends 節の値として使用できます。
27.1.3.1.1 Iterator ( )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined またはアクティブな関数オブジェクト のいずれかである場合、TypeError 例外をスローする。 ? OrdinaryCreateFromConstructor (NewTarget, "%Iterator.prototype%" ) を返す。
27.1.3.2 Iterator コンストラクターのプロパティ
Iterator コンストラクター は:
27.1.3.2.1 Iterator.concat ( ...items )
iterables を新しい空の List とする。items の各要素 item について、次を行う。item が Object でない場合、TypeError 例外をスローする。method を ? GetMethod (item , %Symbol.iterator% ) とする。method が undefined である場合、TypeError 例外をスローする。Record { [[OpenMethod]] : method , [[Iterable]] : item } を iterables に追加する。closure を、iterables を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。iterables の各 Record iterable について、次を行う。iterator を ? Call (iterable .[[OpenMethod]] , iterable .[[Iterable]] ) とする。iterator が Object でない場合、TypeError 例外をスローする。iteratorRecord を ? GetIteratorDirect (iterator ) とする。innerAlive を true とする。innerAlive が true の間、次を繰り返す。innerValue を ? IteratorStepValue (iteratorRecord ) とする。innerValue が done である場合、innerAlive を false に設定する。そうでない場合、completion を Completion (Yield (innerValue )) とする。completion が中断完了 である場合、? IteratorClose (iteratorRecord , completion ) を返す。 ReturnCompletion (undefined ) を返す。gen を CreateIteratorFromClosure (closure , "Iterator Helper" , %IteratorHelperPrototype% , « [[UnderlyingIterators]] ») とする。gen .[[UnderlyingIterators]] を新しい空の List に設定する。gen を返す。
27.1.3.2.2 Iterator.from ( obj )
iteratorRecord を ? GetIteratorFlattenable (obj , iterate-string-primitives ) とする。hasInstance を ? OrdinaryHasInstance (%Iterator% , iteratorRecord .[[Iterator]] ) とする。hasInstance が true である場合、iteratorRecord .[[Iterator]] を返す。wrapper を OrdinaryObjectCreate (%WrapForValidIteratorPrototype% , « [[Iterated]] ») とする。wrapper .[[Iterated]] を iteratorRecord に設定する。wrapper を返す。
27.1.3.2.2.1 %WrapForValidIteratorPrototype% オブジェクト
%WrapForValidIteratorPrototype% オブジェクトは:
27.1.3.2.2.1.1 %WrapForValidIteratorPrototype%.next ( )
obj を this 値とする。? RequireInternalSlot (obj , [[Iterated]] ) を実行する。 iteratorRecord を obj .[[Iterated]] とする。? Call (iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] ) を返す。
27.1.3.2.2.1.2 %WrapForValidIteratorPrototype%.return ( )
obj を this 値とする。? RequireInternalSlot (obj , [[Iterated]] ) を実行する。 iterator を obj .[[Iterated]] .[[Iterator]] とする。表明 : iterator は Object である。returnMethod を ? GetMethod (iterator , "return" ) とする。returnMethod が undefined である場合、CreateIteratorResultObject (undefined , true ) を返す。? Call (returnMethod , iterator ) を返す。
27.1.3.2.3 Iterator.prototype
Iterator.prototype の初期値は Iterator prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
27.1.3.2.4 Iterator.zip ( iterables [ , options ] )
この関数は呼び出されたとき、次の手順を実行します。
iterables が Object でない場合、TypeError 例外をスローする。options を ? GetOptionsObject (options ) に設定する。mode を ? Get (options , "mode" ) とする。mode が undefined である場合、mode を "shortest" に設定する。mode が "shortest" 、"longest" 、または "strict" のいずれでもない場合、TypeError 例外をスローする。paddingOption を undefined とする。mode が "longest" である場合、paddingOption を ? Get (options , "padding" ) に設定する。paddingOption が undefined でなく、かつ paddingOption が Object でない場合、TypeError 例外をスローする。iters を新しい空の List とする。padding を新しい空の List とする。inputIter を ? GetIterator (iterables , sync ) とする。next を not-started とする。next が done でない間、次を繰り返す。next を Completion (IteratorStepValue (inputIter )) に設定する。IfAbruptCloseIterators (next , iters )。next が done でない場合、iter を Completion (GetIteratorFlattenable (next , reject-primitives )) とする。needClosing を « inputIter » と iters のリスト連結 とする。IfAbruptCloseIterators (iter , needClosing )。iter を iters に追加する。iterCount を iters の要素数とする。mode が "longest" である場合、paddingOption が undefined である場合、iterCount 回繰り返す。undefined を padding に追加する。そうでない場合、paddingIter を Completion (GetIterator (paddingOption , sync )) とする。IfAbruptCloseIterators (paddingIter , iters )。usingIterator を true とする。iterCount 回繰り返す。usingIterator が true である場合、next を Completion (IteratorStepValue (paddingIter )) に設定する。IfAbruptCloseIterators (next , iters )。next が done である場合、usingIterator を false に設定する。そうでない場合、next を padding に追加する。 usingIterator が false である場合、undefined を padding に追加する。usingIterator が true である場合、completion を Completion (IteratorClose (paddingIter , NormalCompletion (unused ))) とする。IfAbruptCloseIterators (completion , iters )。 finishResults を、何も捕捉せず、パラメーター (results ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。CreateArrayFromList (results ) を返す。IteratorZip (iters , mode , padding , finishResults ) を返す。
27.1.3.2.5 Iterator.zipKeyed ( iterables [ , options ] )
この関数は呼び出されたとき、次の手順を実行します。
iterables が Object でない場合、TypeError 例外をスローする。options を ? GetOptionsObject (options ) に設定する。mode を ? Get (options , "mode" ) とする。mode が undefined である場合、mode を "shortest" に設定する。mode が "shortest" 、"longest" 、または "strict" のいずれでもない場合、TypeError 例外をスローする。paddingOption を undefined とする。mode が "longest" である場合、paddingOption を ? Get (options , "padding" ) に設定する。paddingOption が undefined でなく、かつ paddingOption が Object でない場合、TypeError 例外をスローする。iters を新しい空の List とする。padding を新しい空の List とする。allKeys を ? iterables .[[OwnPropertyKeys]] () とする。keys を新しい空の List とする。allKeys の各要素 key について、次を行う。propertyDesc を Completion (iterables .[[GetOwnProperty]] (key )) とする。IfAbruptCloseIterators (propertyDesc , iters )。propertyDesc が undefined でなく、かつ propertyDesc .[[Enumerable]] が true である場合、value を Completion (Get (iterables , key )) とする。IfAbruptCloseIterators (value , iters )。value が undefined でない場合、key を keys に追加する。iter を Completion (GetIteratorFlattenable (value , reject-primitives )) とする。IfAbruptCloseIterators (iter , iters )。iter を iters に追加する。iterCount を iters の要素数とする。mode が "longest" である場合、paddingOption が undefined である場合、iterCount 回繰り返す。undefined を padding に追加する。そうでない場合、keys の各要素 key について、次を行う。value を Completion (Get (paddingOption , key )) とする。IfAbruptCloseIterators (value , iters )。value を padding に追加する。 finishResults を、keys と iterCount を捕捉し、パラメーター (results ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。obj を OrdinaryObjectCreate (null ) とする。0 ≤ i < iterCount を満たす各整数 i について、昇順に次を行う。! CreateDataPropertyOrThrow (obj , keys [i ], results [i ]) を実行する。 obj を返す。IteratorZip (iters , mode , padding , finishResults ) を返す。
27.1.3.3 Iterator Prototype オブジェクトのプロパティ
Iterator prototype オブジェクト は:
注
この仕様で定義され、iterator インターフェイス を実装するすべてのオブジェクトは %Iterator.prototype% からも継承します。ECMAScript コードも %Iterator.prototype% から継承するオブジェクトを定義できます。%Iterator.prototype% は、すべての iterator オブジェクトに適用可能な追加メソッドを追加できる場所を提供します。
次の式は、ECMAScript コードが %Iterator.prototype% オブジェクトへアクセスする方法の1つです。
Object .getPrototypeOf (Object .getPrototypeOf ([][Symbol .iterator ]()))
27.1.3.3.1 Iterator.prototype.constructor
Iterator.prototype.constructor は属性 { [[Enumerable]] : false , [[Configurable]] : true } を持つアクセサープロパティ です。[[Getter]] および [[Setter]] 属性は次のように定義されます。
27.1.3.3.1.1 get Iterator.prototype.constructor
[[Getter]] 属性の値は引数を必要としない組込み関数です。呼び出されたとき、次の手順を実行します。
%Iterator% を返す。
27.1.3.3.1.2 set Iterator.prototype.constructor
[[Setter]] 属性の値は引数 v を取る組込み関数です。呼び出されたとき、次の手順を実行します。
? SetterThatIgnoresPrototypeProperties (this 値, %Iterator.prototype% , "constructor" , v ) を実行する。 undefined を返す。
注
ほとんどの組込み prototype 上の "constructor" プロパティとは異なり、Web 互換性上の理由から、このプロパティはアクセサーでなければなりません。
27.1.3.3.2 Iterator.prototype.drop ( limit )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。obj が Object でない場合、TypeError 例外をスローする。iterated を Iterator Record { [[Iterator]] : obj , [[NextMethod]] : undefined , [[Done]] : false } とする。numberLimit を Completion (ToNumber (limit )) とする。IfAbruptCloseIterator (numberLimit , iterated )。numberLimit が NaN である場合、error を ThrowCompletion (新しく作成された RangeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 numberLimit が有限であり、numberLimit > 𝔽 (253 - 1) である場合、error を ThrowCompletion (新しく作成された RangeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 intLimit を ! ToIntegerOrInfinity (numberLimit ) とする。intLimit < 0 である場合、error を ThrowCompletion (新しく作成された RangeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (obj ) に設定する。closure を、iterated と intLimit を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。remaining を 𝔽 (intLimit ) とする。remaining > +0 𝔽 の間、次を繰り返す。remaining を remaining - 1 𝔽 に設定する。next を ? IteratorStep (iterated ) とする。next が done である場合、ReturnCompletion (undefined ) を返す。次を繰り返す。value を ? IteratorStepValue (iterated ) とする。value が done である場合、ReturnCompletion (undefined ) を返す。completion を Completion (Yield (value )) とする。IfAbruptCloseIterator (completion , iterated )。 result を CreateIteratorFromClosure (closure , "Iterator Helper" , %IteratorHelperPrototype% , « [[UnderlyingIterators]] ») とする。result .[[UnderlyingIterators]] を « iterated » に設定する。result を返す。
27.1.3.3.3 Iterator.prototype.every ( predicate )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。obj が Object でない場合、TypeError 例外をスローする。iterated を Iterator Record { [[Iterator]] : obj , [[NextMethod]] : undefined , [[Done]] : false } とする。IsCallable (predicate ) が false である場合、error を ThrowCompletion (新しく作成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (obj ) に設定する。counter を +0 𝔽 とする。次を繰り返す。value を ? IteratorStepValue (iterated ) とする。value が done である場合、true を返す。result を Completion (Call (predicate , undefined , « value , counter »)) とする。IfAbruptCloseIterator (result , iterated )。ToBoolean (result ) が false である場合、? IteratorClose (iterated , NormalCompletion (false )) を返す。注記 : 次の手順は、counter が 253 𝔽 に達すると、それ以降 counter を変更しない。counter を counter + 1 𝔽 に設定する。
27.1.3.3.4 Iterator.prototype.filter ( predicate )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。obj が Object でない場合、TypeError 例外をスローする。iterated を Iterator Record { [[Iterator]] : obj , [[NextMethod]] : undefined , [[Done]] : false } とする。IsCallable (predicate ) が false である場合、error を ThrowCompletion (新しく作成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (obj ) に設定する。closure を、iterated と predicate を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。counter を +0 𝔽 とする。次を繰り返す。value を ? IteratorStepValue (iterated ) とする。value が done である場合、ReturnCompletion (undefined ) を返す。selected を Completion (Call (predicate , undefined , « value , counter »)) とする。IfAbruptCloseIterator (selected , iterated )。ToBoolean (selected ) が true である場合、completion を Completion (Yield (value )) とする。IfAbruptCloseIterator (completion , iterated )。注記 : 次の手順は、counter が 253 𝔽 に達すると、それ以降 counter を変更しない。counter を counter + 1 𝔽 に設定する。 result を CreateIteratorFromClosure (closure , "Iterator Helper" , %IteratorHelperPrototype% , « [[UnderlyingIterators]] ») とする。result .[[UnderlyingIterators]] を « iterated » に設定する。result を返す。
27.1.3.3.5 Iterator.prototype.find ( predicate )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。obj が Object でない場合、TypeError 例外をスローする。iterated を Iterator Record { [[Iterator]] : obj , [[NextMethod]] : undefined , [[Done]] : false } とする。IsCallable (predicate ) が false である場合、error を ThrowCompletion (新しく作成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (obj ) に設定する。counter を +0 𝔽 とする。次を繰り返す。value を ? IteratorStepValue (iterated ) とする。value が done である場合、undefined を返す。result を Completion (Call (predicate , undefined , « value , counter »)) とする。IfAbruptCloseIterator (result , iterated )。ToBoolean (result ) が true である場合、? IteratorClose (iterated , NormalCompletion (value )) を返す。注記 : 次の手順は、counter が 253 𝔽 に達すると、それ以降 counter を変更しない。counter を counter + 1 𝔽 に設定する。
27.1.3.3.6 Iterator.prototype.flatMap ( mapper )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。obj が Object でない場合、TypeError 例外をスローする。iterated を Iterator Record { [[Iterator]] : obj , [[NextMethod]] : undefined , [[Done]] : false } とする。IsCallable (mapper ) が false である場合、error を ThrowCompletion (新しく作成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (obj ) に設定する。closure を、iterated と mapper を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。counter を +0 𝔽 とする。次を繰り返す。value を ? IteratorStepValue (iterated ) とする。value が done である場合、ReturnCompletion (undefined ) を返す。mapped を Completion (Call (mapper , undefined , « value , counter »)) とする。IfAbruptCloseIterator (mapped , iterated )。innerIterator を Completion (GetIteratorFlattenable (mapped , reject-primitives )) とする。IfAbruptCloseIterator (innerIterator , iterated )。innerAlive を true とする。innerAlive が true の間、次を繰り返す。innerValue を Completion (IteratorStepValue (innerIterator )) とする。IfAbruptCloseIterator (innerValue , iterated )。innerValue が done である場合、innerAlive を false に設定する。そうでない場合、completion を Completion (Yield (innerValue )) とする。completion が中断完了 である場合、backupCompletion を Completion (IteratorClose (innerIterator , completion )) とする。IfAbruptCloseIterator (backupCompletion , iterated )。? IteratorClose (iterated , completion ) を返す。 注記 : 次の手順は、counter が 253 𝔽 に達すると、それ以降 counter を変更しない。counter を counter + 1 𝔽 に設定する。 result を CreateIteratorFromClosure (closure , "Iterator Helper" , %IteratorHelperPrototype% , « [[UnderlyingIterators]] ») とする。result .[[UnderlyingIterators]] を « iterated » に設定する。result を返す。
27.1.3.3.7 Iterator.prototype.forEach ( procedure )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。obj が Object でない場合、TypeError 例外をスローする。iterated を Iterator Record { [[Iterator]] : obj , [[NextMethod]] : undefined , [[Done]] : false } とする。IsCallable (procedure ) が false である場合、error を ThrowCompletion (新しく作成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (obj ) に設定する。counter を +0 𝔽 とする。次を繰り返す。value を ? IteratorStepValue (iterated ) とする。value が done である場合、undefined を返す。result を Completion (Call (procedure , undefined , « value , counter »)) とする。IfAbruptCloseIterator (result , iterated )。注記 : 次の手順は、counter が 253 𝔽 に達すると、それ以降 counter を変更しない。counter を counter + 1 𝔽 に設定する。
27.1.3.3.8 Iterator.prototype.map ( mapper )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。obj が Object でない場合、TypeError 例外をスローする。iterated を Iterator Record { [[Iterator]] : obj , [[NextMethod]] : undefined , [[Done]] : false } とする。IsCallable (mapper ) が false である場合、error を ThrowCompletion (新しく作成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (obj ) に設定する。closure を、iterated と mapper を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。counter を +0 𝔽 とする。次を繰り返す。value を ? IteratorStepValue (iterated ) とする。value が done である場合、ReturnCompletion (undefined ) を返す。mapped を Completion (Call (mapper , undefined , « value , counter »)) とする。IfAbruptCloseIterator (mapped , iterated )。completion を Completion (Yield (mapped )) とする。IfAbruptCloseIterator (completion , iterated )。注記 : 次の手順は、counter が 253 𝔽 に達すると、それ以降 counter を変更しない。counter を counter + 1 𝔽 に設定する。 result を CreateIteratorFromClosure (closure , "Iterator Helper" , %IteratorHelperPrototype% , « [[UnderlyingIterators]] ») とする。result .[[UnderlyingIterators]] を « iterated » に設定する。result を返す。
27.1.3.3.9 Iterator.prototype.reduce ( reducer [ , initialValue ] )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。obj が Object でない場合、TypeError 例外をスローする。iterated を Iterator Record { [[Iterator]] : obj , [[NextMethod]] : undefined , [[Done]] : false } とする。IsCallable (reducer ) が false である場合、error を ThrowCompletion (新しく作成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (obj ) に設定する。initialValue が存在しない場合、accumulator を ? IteratorStepValue (iterated ) とする。accumulator が done である場合、TypeError 例外をスローする。counter を 1 𝔽 とする。そうでない場合、accumulator を initialValue とする。counter を +0 𝔽 とする。 次を繰り返す。value を ? IteratorStepValue (iterated ) とする。value が done である場合、accumulator を返す。result を Completion (Call (reducer , undefined , « accumulator , value , counter »)) とする。IfAbruptCloseIterator (result , iterated )。accumulator を result に設定する。注記 : 次の手順は、counter が 253 𝔽 に達すると、それ以降 counter を変更しない。counter を counter + 1 𝔽 に設定する。
27.1.3.3.10 Iterator.prototype.some ( predicate )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。obj が Object でない場合、TypeError 例外をスローする。iterated を Iterator Record { [[Iterator]] : obj , [[NextMethod]] : undefined , [[Done]] : false } とする。IsCallable (predicate ) が false である場合、error を ThrowCompletion (新しく作成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (obj ) に設定する。counter を +0 𝔽 とする。次を繰り返す。value を ? IteratorStepValue (iterated ) とする。value が done である場合、false を返す。result を Completion (Call (predicate , undefined , « value , counter »)) とする。IfAbruptCloseIterator (result , iterated )。ToBoolean (result ) が true である場合、? IteratorClose (iterated , NormalCompletion (true )) を返す。注記 : 次の手順は、counter が 253 𝔽 に達すると、それ以降 counter を変更しない。counter を counter + 1 𝔽 に設定する。
27.1.3.3.11 Iterator.prototype.take ( limit )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。obj が Object でない場合、TypeError 例外をスローする。iterated を Iterator Record { [[Iterator]] : obj , [[NextMethod]] : undefined , [[Done]] : false } とする。numberLimit を Completion (ToNumber (limit )) とする。IfAbruptCloseIterator (numberLimit , iterated )。numberLimit が NaN である場合、error を ThrowCompletion (新しく作成された RangeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 numberLimit が有限であり、numberLimit > 𝔽 (253 - 1) である場合、error を ThrowCompletion (新しく作成された RangeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 intLimit を ! ToIntegerOrInfinity (numberLimit ) とする。intLimit < 0 である場合、error を ThrowCompletion (新しく作成された RangeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (obj ) に設定する。closure を、iterated と intLimit を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。remaining を 𝔽 (intLimit ) とする。次を繰り返す。remaining が +0 𝔽 である場合、? IteratorClose (iterated , ReturnCompletion (undefined )) を返す。 remaining を remaining - 1 𝔽 に設定する。value を ? IteratorStepValue (iterated ) とする。value が done である場合、ReturnCompletion (undefined ) を返す。completion を Completion (Yield (value )) とする。IfAbruptCloseIterator (completion , iterated )。 result を CreateIteratorFromClosure (closure , "Iterator Helper" , %IteratorHelperPrototype% , « [[UnderlyingIterators]] ») とする。result .[[UnderlyingIterators]] を « iterated » に設定する。result を返す。
27.1.3.3.12 Iterator.prototype.toArray ( )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。obj が Object でない場合、TypeError 例外をスローする。iterated を ? GetIteratorDirect (obj ) とする。items を新しい空の List とする。次を繰り返す。value を ? IteratorStepValue (iterated ) とする。value が done である場合、CreateArrayFromList (items ) を返す。value を items に追加する。
27.1.3.3.13 Iterator.prototype [ %Symbol.dispose% ] ( )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。return を ? GetMethod (obj , "return" ) とする。return が undefined でない場合、? Call (return , obj ) を実行する。 undefined を返す。
このメソッドの "name" プロパティの値は "[Symbol.dispose]" です。
27.1.3.3.14 Iterator.prototype [ %Symbol.iterator% ] ( )
この関数は呼び出されたとき、次の手順を実行します。
this 値を返す。
この関数の "name" プロパティの値は "[Symbol.iterator]" です。
27.1.3.3.15 Iterator.prototype [ %Symbol.toStringTag% ]
Iterator.prototype[%Symbol.toStringTag%] は属性 { [[Enumerable]] : false , [[Configurable]] : true } を持つアクセサープロパティ です。[[Getter]] および [[Setter]] 属性は次のように定義されます。
27.1.3.3.15.1 get Iterator.prototype [ %Symbol.toStringTag% ]
[[Getter]] 属性の値は引数を必要としない組込み関数です。呼び出されたとき、次の手順を実行します。
"Iterator" を返す。
27.1.3.3.15.2 set Iterator.prototype [ %Symbol.toStringTag% ]
[[Setter]] 属性の値は引数 v を取る組込み関数です。呼び出されたとき、次の手順を実行します。
? SetterThatIgnoresPrototypeProperties (this 値, %Iterator.prototype% , %Symbol.toStringTag% , v ) を実行する。 undefined を返す。
注
ほとんどの組込み prototype 上の %Symbol.toStringTag% プロパティとは異なり、Web 互換性上の理由から、このプロパティはアクセサーでなければなりません。
27.1.3.4 Iterator のための抽象操作
27.1.3.4.1 IteratorZip ( iters , mode , padding , finishResults )
抽象操作 IteratorZip。引数 iters (リスト (要素:Iteratorレコード ))、mode (("shortest" 、"longest" または "strict" ))、padding (リスト (要素:ECMAScript 言語値 )) および finishResults (an Abstract Closure that takes a List of ECMAScript language values and returns an ECMAScript language value)。戻り値:Generator。 呼び出されると、次の手順を実行する。
iterCount を iters の要素数とする。openIters を iters のコピーとする。closure を、iters 、iterCount 、openIters 、mode 、padding 、および finishResults を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。iterCount = 0 である場合、ReturnCompletion (undefined ) を返す。次を繰り返す。results を新しい空の List とする。表明 : openIters は空でない。0 ≤ i < iterCount を満たす各整数 i について、昇順に次を行う。iter を iters [i ] とする。iter が null である場合、表明 : mode は "longest" である。result を padding [i ] とする。そうでない場合、result を Completion (IteratorStepValue (iter )) とする。result が中断完了 である場合、iter を openIters から削除する。? IteratorCloseAll (openIters , result ) を返す。 result を ! result に設定する。result が done である場合、iter を openIters から削除する。mode が "shortest" である場合、? IteratorCloseAll (openIters , ReturnCompletion (undefined )) を返す。 そうでなく、mode が "strict" である場合、i ≠ 0 である場合、? IteratorCloseAll (openIters , ThrowCompletion (新しく作成された TypeError オブジェクト)) を返す。 1 ≤ k < iterCount を満たす各整数 k について、昇順に次を行う。表明 : iters [k ] は null でない。open を Completion (IteratorStep (iters [k ])) とする。open が中断完了 である場合、iters [k ] を openIters から削除する。? IteratorCloseAll (openIters , open ) を返す。 open を ! open に設定する。open が done である場合、iters [k ] を openIters から削除する。そうでない場合、? IteratorCloseAll (openIters , ThrowCompletion (新しく作成された TypeError オブジェクト)) を返す。 ReturnCompletion (undefined ) を返す。 そうでない場合、表明 : mode は "longest" である。openIters が空である場合、ReturnCompletion (undefined ) を返す。iters [i ] を null に設定する。result を padding [i ] に設定する。 result を results に追加する。 results を finishResults (results ) に設定する。completion を Completion (Yield (results )) とする。IfAbruptCloseIterators (completion , openIters )。 gen を CreateIteratorFromClosure (closure , "Iterator Helper" , %IteratorHelperPrototype% , « [[UnderlyingIterators]] ») とする。gen .[[UnderlyingIterators]] を openIters に設定する。gen を返す。
27.1.4 %AsyncIteratorPrototype% オブジェクト
%AsyncIteratorPrototype% オブジェクトは:
注
この仕様で定義され、async iterator インターフェイス を実装するすべてのオブジェクトは %AsyncIteratorPrototype% からも継承します。ECMAScript コードも %AsyncIteratorPrototype% から継承するオブジェクトを定義できます。%AsyncIteratorPrototype% オブジェクトは、すべての async iterator オブジェクトに適用可能な追加メソッドを追加できる場所を提供します。
27.1.4.1 %AsyncIteratorPrototype% [ %Symbol.asyncDispose% ] ( )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。return を Completion (GetMethod (obj , "return" )) とする。IfAbruptRejectPromise (return , promiseCapability )。return が undefined である場合、! Call (promiseCapability .[[Resolve]] , undefined , « undefined ») を実行する。 そうでない場合、result を Completion (Call (return , obj , « »)) とする。IfAbruptRejectPromise (result , promiseCapability )。resultWrapper を Completion (PromiseResolve (%Promise% , result )) とする。IfAbruptRejectPromise (resultWrapper , promiseCapability )。unwrap を、何も捕捉せず、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。undefined を返す。onFulfilled を CreateBuiltinFunction (unwrap , 1, "" , « ») とする。PerformPromiseThen (resultWrapper , onFulfilled , undefined , promiseCapability ) を実行する。 promiseCapability .[[Promise]] を返す。
このメソッドの "name" プロパティの値は "[Symbol.asyncDispose]" です。
27.1.4.2 %AsyncIteratorPrototype% [ %Symbol.asyncIterator% ] ( )
この関数は呼び出されたとき、次の手順を実行します。
this 値を返す。
この関数の "name" プロパティの値は "[Symbol.asyncIterator]" です。
27.1.5 Async-from-Sync Iterator オブジェクト
Async-from-Sync Iterator オブジェクト は、特定の同期 iterator を適応させる async iterator です。Async-from-Sync Iterator オブジェクトは ECMAScript コードから直接アクセスできません。Async-from-Sync Iterator オブジェクトには名前付きコンストラクター はありません。代わりに、Async-from-Sync Iterator オブジェクトは必要に応じて CreateAsyncFromSyncIterator 抽象操作 によって作成されます。
27.1.5.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )
抽象操作 CreateAsyncFromSyncIterator。引数 syncIteratorRecord (Iteratorレコード )。戻り値:Iteratorレコード 。 同期 Iterator Record から async Iterator Record を作成するために使用されます。 呼び出されると、次の手順を実行する。
asyncIterator を OrdinaryObjectCreate (%AsyncFromSyncIteratorPrototype% , « [[SyncIteratorRecord]] ») とする。asyncIterator .[[SyncIteratorRecord]] を syncIteratorRecord に設定する。nextMethod を ! Get (asyncIterator , "next" ) とする。iteratorRecord を Iterator Record { [[Iterator]] : asyncIterator , [[NextMethod]] : nextMethod , [[Done]] : false } とする。iteratorRecord を返す。
27.1.5.2 %AsyncFromSyncIteratorPrototype% オブジェクト
%AsyncFromSyncIteratorPrototype% オブジェクトは:
27.1.5.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )
obj を this 値とする。表明 : obj は [[SyncIteratorRecord]] 内部スロットを持つ Object である。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。syncIteratorRecord を obj .[[SyncIteratorRecord]] とする。value が存在する場合、result を Completion (IteratorNext (syncIteratorRecord , value )) とする。そうでない場合、result を Completion (IteratorNext (syncIteratorRecord )) とする。 IfAbruptRejectPromise (result , promiseCapability )。AsyncFromSyncIteratorContinuation (result , promiseCapability , syncIteratorRecord , true ) を返す。
27.1.5.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )
obj を this 値とする。表明 : obj は [[SyncIteratorRecord]] 内部スロットを持つ Object である。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。syncIteratorRecord を obj .[[SyncIteratorRecord]] とする。syncIterator を syncIteratorRecord .[[Iterator]] とする。return を Completion (GetMethod (syncIterator , "return" )) とする。IfAbruptRejectPromise (return , promiseCapability )。return が undefined である場合、iteratorResult を CreateIteratorResultObject (value , true ) とする。! Call (promiseCapability .[[Resolve]] , undefined , « iteratorResult ») を実行する。 promiseCapability .[[Promise]] を返す。value が存在する場合、result を Completion (Call (return , syncIterator , « value »)) とする。そうでない場合、result を Completion (Call (return , syncIterator )) とする。 IfAbruptRejectPromise (result , promiseCapability )。result が Object でない場合、! Call (promiseCapability .[[Reject]] , undefined , « 新しく作成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。AsyncFromSyncIteratorContinuation (result , promiseCapability , syncIteratorRecord , false ) を返す。
27.1.5.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [ value ] )
注
obj を this 値とする。表明 : obj は [[SyncIteratorRecord]] 内部スロットを持つ Object である。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。syncIteratorRecord を obj .[[SyncIteratorRecord]] とする。syncIterator を syncIteratorRecord .[[Iterator]] とする。throw を Completion (GetMethod (syncIterator , "throw" )) とする。IfAbruptRejectPromise (throw , promiseCapability )。throw が undefined である場合、注記 : syncIterator が throw メソッドを持たない場合、capability を reject する前にクリーンアップする機会を与えるため、それを close する。closeCompletion を NormalCompletion (empty ) とする。result を Completion (IteratorClose (syncIteratorRecord , closeCompletion )) とする。IfAbruptRejectPromise (result , promiseCapability )。注記 : 次の手順は、プロトコル違反があったこと、すなわち syncIterator が throw メソッドを持たないことを示すため TypeError をスローする。注記 : syncIterator の close がスローしない場合、その操作の結果は、たとえ rejected promise を生成しても無視される。! Call (promiseCapability .[[Reject]] , undefined , « 新しく作成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。value が存在する場合、result を Completion (Call (throw , syncIterator , « value »)) とする。そうでない場合、result を Completion (Call (throw , syncIterator )) とする。 IfAbruptRejectPromise (result , promiseCapability )。result が Object でない場合、! Call (promiseCapability .[[Reject]] , undefined , « 新しく作成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。AsyncFromSyncIteratorContinuation (result , promiseCapability , syncIteratorRecord , true ) を返す。
27.1.5.3 Async-from-Sync Iterator インスタンスのプロパティ
Async-from-Sync Iterator インスタンスは %AsyncFromSyncIteratorPrototype% intrinsic オブジェクトからプロパティを継承する通常オブジェクト です。Async-from-Sync Iterator インスタンスは、表 86 に列挙される内部スロットを持つ状態で最初に作成されます。
表 86: Async-from-Sync Iterator インスタンスの内部スロット
27.1.5.4 AsyncFromSyncIteratorContinuation ( result , promiseCapability , syncIteratorRecord , closeOnRejection )
抽象操作 AsyncFromSyncIteratorContinuation。引数 result (Object)、promiseCapability (a PromiseCapability Record for an intrinsic %Promise% )、syncIteratorRecord (Iteratorレコード ) および closeOnRejection (Boolean)。戻り値:Promise。 呼び出されると、次の手順を実行する。
注記 : promiseCapability は intrinsic %Promise% から派生しているため、以下で IfAbruptRejectPromise を使用することで伴う promiseCapability .[[Reject]] の呼出しはスローしないことが保証される。done を Completion (IteratorComplete (result )) とする。IfAbruptRejectPromise (done , promiseCapability )。value を Completion (IteratorValue (result )) とする。IfAbruptRejectPromise (value , promiseCapability )。valueWrapper を Completion (PromiseResolve (%Promise% , value )) とする。valueWrapper が中断完了 であり、done が false 、かつ closeOnRejection が true である場合、valueWrapper を Completion (IteratorClose (syncIteratorRecord , valueWrapper )) に設定する。IfAbruptRejectPromise (valueWrapper , promiseCapability )。unwrap を、done を捕捉し、パラメーター (value ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。CreateIteratorResultObject (value , done ) を返す。onFulfilled を CreateBuiltinFunction (unwrap , 1, "" , « ») とする。注記 : onFulfilled は IteratorResult オブジェクトの "value" プロパティを処理するとき、その値が promise であれば待機し、その結果を新しい「unwrapped」IteratorResult オブジェクトに再パッケージするために使用される。done が true または closeOnRejection が false である場合、onRejected を undefined とする。そうでない場合、closeIterator を、syncIteratorRecord を捕捉し、パラメーター (error ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。? IteratorClose (syncIteratorRecord , ThrowCompletion (error )) を返す。 onRejected を CreateBuiltinFunction (closeIterator , 1, "" , « ») とする。注記 : onRejected は Iterator が生成する IteratorResult オブジェクトの "value" プロパティが rejected promise である場合に、その Iterator を close するために使用される。 PerformPromiseThen (valueWrapper , onFulfilled , onRejected , promiseCapability ) を実行する。promiseCapability .[[Promise]] を返す。
27.2 リソース管理
27.2.1 共通リソース管理インターフェイス
27.2.1.1 Disposable インターフェイス
Disposable インターフェイスには、表 87 で説明されるプロパティが含まれます。
表 87: Disposable インターフェイスの必須プロパティ
プロパティ
値
要件
%Symbol.dispose%
a function object
このメソッドを呼び出すと、呼出し元がこのオブジェクトを引き続き使用する意図がないことを Disposable オブジェクトへ通知します。このメソッドは、ファイルシステムハンドル、ストリーム、ホスト オブジェクトなどを含むがこれらに限定されないリソースを明示的にクリーンアップするために必要なすべての処理を実行するべきです。このメソッドから例外がスローされた場合、通常はリソースを明示的に解放できなかったことを意味します。
同じオブジェクトに対してこのメソッドを複数回呼び出す場合、すでに dispose 済みのリソースに対するクリーンアップ処理の繰返しを避けるべきであり、最初の呼出しで例外がスローされた場合でも例外をスローするべきではありません。ただし、この要件は強制されません。
Disposable オブジェクトを using または await using 宣言で使用する場合、その宣言を直接含む Block または Module の評価が完了すると、リソースは自動的に dispose されます。
27.2.1.2 AsyncDisposable インターフェイス
AsyncDisposable インターフェイスには、表 88 で説明されるプロパティが含まれます。
表 88: AsyncDisposable インターフェイスの必須プロパティ
プロパティ
値
要件
%Symbol.asyncDispose%
promise を返す function object
このメソッドを呼び出すと、呼出し元がこのオブジェクトを引き続き使用する意図がないことを AsyncDisposable オブジェクトへ通知します。このメソッドは、ファイルシステムハンドル、ストリーム、ホスト オブジェクトなどを含むがこれらに限定されないリソースを明示的にクリーンアップするために必要なすべての処理を実行するべきです。このメソッドが返した promise が reject された場合、通常はリソースを明示的に解放できなかったことを意味します。AsyncDisposable オブジェクトは、結果として得られる Promise が fulfilled されるまで「disposed」とはみなされません。
同じオブジェクトに対してこのメソッドを複数回呼び出す場合、すでに dispose 済みのリソースに対するクリーンアップ処理の繰返しを避けるべきであり、最初の呼出しで例外がスローされた、または rejected promise が返された場合でも、例外をスローしたり rejected promise を返したりするべきではありません。ただし、この要件は強制されません。
AsyncDisposable オブジェクトを await using 宣言で使用する場合、その宣言を直接含む Block または Module の評価が完了すると、リソースは自動的に dispose されます。
27.3 DisposableStack オブジェクト
DisposableStack は、一緒に dispose されるべき1つ以上のリソースを保持するために使用できるオブジェクトです。
すべての DisposableStack オブジェクトは、相互排他的な2つの状態、disposed または pending のいずれかにあります。disposable stack d は、d に対して d.dispose() も d.move() も呼び出されていない場合に限り pending です。
27.3.1 DisposableStack コンストラクター
DisposableStack コンストラクター は:
%DisposableStack% です。
グローバルオブジェクト の "DisposableStack" プロパティの初期値です。
コンストラクター として呼び出されたとき、新しい DisposableStack を作成して初期化します。
関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローします。
クラス定義の extends 節の値として使用できます。規定された DisposableStack の動作を継承しようとするサブクラスコンストラクター は、DisposableStack.prototype の組込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するため、DisposableStack コンストラクター への super 呼出しを含まなければなりません。
27.3.1.1 DisposableStack ( )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 disposableStack を ? OrdinaryCreateFromConstructor (NewTarget, "%DisposableStack.prototype%" , « [[DisposableState]] , [[DisposableResourceStack]] ») とする。disposableStack .[[DisposableState]] を pending に設定する。disposableStack .[[DisposableResourceStack]] を新しい空の List に設定する。disposableStack を返す。
27.3.2 DisposableStack コンストラクターのプロパティ
DisposableStack コンストラクター は:
27.3.2.1 DisposableStack.prototype
DisposableStack.prototype の初期値は DisposableStack prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
27.3.3 DisposableStack Prototype オブジェクトのプロパティ
DisposableStack prototype オブジェクト は:
%DisposableStack.prototype% です。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
通常オブジェクト です。
[[DisposableState]] 内部スロットまたは DisposableStack インスタンスのその他の内部スロットを持ちません。
27.3.3.1 DisposableStack.prototype.adopt ( value , onDispose )
このメソッドは呼び出されたとき、次の手順を実行します。
disposableStack を this 値とする。? RequireInternalSlot (disposableStack , [[DisposableState]] ) を実行する。 disposableStack .[[DisposableState]] が disposed である場合、ReferenceError 例外をスローする。IsCallable (onDispose ) が false である場合、TypeError 例外をスローする。closure を、value と onDispose を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。? Call (onDispose , undefined , « value ») を返す。 func を CreateBuiltinFunction (closure , 0, "" , « ») とする。? AddDisposableResource (disposableStack .[[DisposableResourceStack]] , undefined , sync-dispose , func ) を実行する。 value を返す。
27.3.3.2 DisposableStack.prototype.constructor
DisposableStack.prototype.constructor の初期値は %DisposableStack% です。
27.3.3.3 DisposableStack.prototype.defer ( onDispose )
このメソッドは呼び出されたとき、次の手順を実行します。
disposableStack を this 値とする。? RequireInternalSlot (disposableStack , [[DisposableState]] ) を実行する。 disposableStack .[[DisposableState]] が disposed である場合、ReferenceError 例外をスローする。IsCallable (onDispose ) が false である場合、TypeError 例外をスローする。? AddDisposableResource (disposableStack .[[DisposableResourceStack]] , undefined , sync-dispose , onDispose ) を実行する。 undefined を返す。
27.3.3.4 DisposableStack.prototype.dispose ( )
このメソッドは呼び出されたとき、次の手順を実行します。
disposableStack を this 値とする。? RequireInternalSlot (disposableStack , [[DisposableState]] ) を実行する。 disposableStack .[[DisposableState]] が disposed である場合、undefined を返す。disposableStack .[[DisposableState]] を disposed に設定する。? DisposeResources (disposableStack .[[DisposableResourceStack]] , NormalCompletion (undefined )) を返す。
27.3.3.5 get DisposableStack.prototype.disposed
DisposableStack.prototype.disposed は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
disposableStack を this 値とする。? RequireInternalSlot (disposableStack , [[DisposableState]] ) を実行する。 disposableStack .[[DisposableState]] が disposed である場合、true を返す。false を返す。
27.3.3.6 DisposableStack.prototype.move ( )
このメソッドは呼び出されたとき、次の手順を実行します。
disposableStack を this 値とする。? RequireInternalSlot (disposableStack , [[DisposableState]] ) を実行する。 disposableStack .[[DisposableState]] が disposed である場合、ReferenceError 例外をスローする。newDisposableStack を ? OrdinaryCreateFromConstructor (%DisposableStack% , "%DisposableStack.prototype%" , « [[DisposableState]] , [[DisposableResourceStack]] ») とする。newDisposableStack .[[DisposableState]] を pending に設定する。newDisposableStack .[[DisposableResourceStack]] を disposableStack .[[DisposableResourceStack]] に設定する。disposableStack .[[DisposableResourceStack]] を新しい空の List に設定する。disposableStack .[[DisposableState]] を disposed に設定する。newDisposableStack を返す。
27.3.3.7 DisposableStack.prototype.use ( value )
このメソッドは呼び出されたとき、次の手順を実行します。
disposableStack を this 値とする。? RequireInternalSlot (disposableStack , [[DisposableState]] ) を実行する。 disposableStack .[[DisposableState]] が disposed である場合、ReferenceError 例外をスローする。? AddDisposableResource (disposableStack .[[DisposableResourceStack]] , value , sync-dispose ) を実行する。 value を返す。
27.3.3.8 DisposableStack.prototype [ %Symbol.dispose% ] ( )
%Symbol.dispose% プロパティの初期値は、27.3.3.4 で定義される %DisposableStack.prototype.dispose% です。
27.3.3.9 DisposableStack.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "DisposableStack" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.3.4 DisposableStack インスタンスのプロパティ
DisposableStack インスタンスは DisposableStack prototype オブジェクト (intrinsic %DisposableStack.prototype% )からプロパティを継承する通常オブジェクト です。DisposableStack インスタンスは、表 89 で説明される内部スロットを持つ状態で最初に作成されます。
表 89: DisposableStack インスタンスの内部スロット
内部スロット
型
説明
[[DisposableState]]
pending or disposed
disposable stack がその %Symbol.dispose% メソッドへの呼出しにどのように反応するかを制御します。
[[DisposableResourceStack]]
a List of DisposableResource Records
disposable stack が dispose されたときに dispose されるリソース。リソースは初期化された順序で追加され、逆順で dispose されます。
27.4 AsyncDisposableStack オブジェクト
AsyncDisposableStack は、非同期にまとめて dispose されるべき1つ以上のリソースを保持するために使用できるオブジェクトです。
すべての AsyncDisposableStack オブジェクトは、相互排他的な2つの状態、disposed または pending のいずれかにあります。async-disposable stack d は、d に対して d.disposeAsync() も d.move() も呼び出されていない場合に限り pending です。
27.4.1 AsyncDisposableStack コンストラクター
AsyncDisposableStack コンストラクター は:
%AsyncDisposableStack% です。
グローバルオブジェクト の "AsyncDisposableStack" プロパティの初期値です。
コンストラクター として呼び出されたとき、新しい AsyncDisposableStack を作成して初期化します。
関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローします。
クラス定義の extends 節の値として使用できます。規定された AsyncDisposableStack の動作を継承しようとするサブクラスコンストラクター は、AsyncDisposableStack.prototype の組込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するため、AsyncDisposableStack コンストラクター への super 呼出しを含まなければなりません。
27.4.1.1 AsyncDisposableStack ( )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 asyncDisposableStack を ? OrdinaryCreateFromConstructor (NewTarget, "%AsyncDisposableStack.prototype%" , « [[AsyncDisposableState]] , [[DisposableResourceStack]] ») とする。asyncDisposableStack .[[AsyncDisposableState]] を pending に設定する。asyncDisposableStack .[[DisposableResourceStack]] を新しい空の List に設定する。asyncDisposableStack を返す。
27.4.2 AsyncDisposableStack コンストラクターのプロパティ
AsyncDisposableStack コンストラクター は:
27.4.2.1 AsyncDisposableStack.prototype
AsyncDisposableStack.prototype の初期値は AsyncDisposableStack prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
27.4.3 AsyncDisposableStack Prototype オブジェクトのプロパティ
AsyncDisposableStack prototype オブジェクト は:
%AsyncDisposableStack.prototype% です。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
通常オブジェクト です。
[[AsyncDisposableState]] 内部スロットまたは AsyncDisposableStack インスタンスのその他の内部スロットを持ちません。
27.4.3.1 AsyncDisposableStack.prototype.adopt ( value , onDisposeAsync )
このメソッドは呼び出されたとき、次の手順を実行します。
asyncDisposableStack を this 値とする。? RequireInternalSlot (asyncDisposableStack , [[AsyncDisposableState]] ) を実行する。 asyncDisposableStack .[[AsyncDisposableState]] が disposed である場合、ReferenceError 例外をスローする。IsCallable (onDisposeAsync ) が false である場合、TypeError 例外をスローする。closure を、value と onDisposeAsync を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。? Call (onDisposeAsync , undefined , « value ») を返す。 func を CreateBuiltinFunction (closure , 0, "" , « ») とする。? AddDisposableResource (asyncDisposableStack .[[DisposableResourceStack]] , undefined , async-dispose , func ) を実行する。 value を返す。
27.4.3.2 AsyncDisposableStack.prototype.constructor
AsyncDisposableStack.prototype.constructor の初期値は %AsyncDisposableStack% です。
27.4.3.3 AsyncDisposableStack.prototype.defer ( onDisposeAsync )
このメソッドは呼び出されたとき、次の手順を実行します。
asyncDisposableStack を this 値とする。? RequireInternalSlot (asyncDisposableStack , [[AsyncDisposableState]] ) を実行する。 asyncDisposableStack .[[AsyncDisposableState]] が disposed である場合、ReferenceError 例外をスローする。IsCallable (onDisposeAsync ) が false である場合、TypeError 例外をスローする。? AddDisposableResource (asyncDisposableStack .[[DisposableResourceStack]] , undefined , async-dispose , onDisposeAsync ) を実行する。 undefined を返す。
27.4.3.4 AsyncDisposableStack.prototype.disposeAsync ( )
この async メソッドは呼び出されたとき、次の手順を実行します。
asyncDisposableStack を this 値とする。? RequireInternalSlot (asyncDisposableStack , [[AsyncDisposableState]] ) を実行する。 asyncDisposableStack .[[AsyncDisposableState]] が disposed である場合、undefined を返す。asyncDisposableStack .[[AsyncDisposableState]] を disposed に設定する。? DisposeResources (asyncDisposableStack .[[DisposableResourceStack]] , NormalCompletion (undefined )) を返す。
27.4.3.5 get AsyncDisposableStack.prototype.disposed
AsyncDisposableStack.prototype.disposed は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
asyncDisposableStack を this 値とする。? RequireInternalSlot (asyncDisposableStack , [[AsyncDisposableState]] ) を実行する。 asyncDisposableStack .[[AsyncDisposableState]] が disposed である場合、true を返す。false を返す。
27.4.3.6 AsyncDisposableStack.prototype.move ( )
このメソッドは呼び出されたとき、次の手順を実行します。
asyncDisposableStack を this 値とする。? RequireInternalSlot (asyncDisposableStack , [[AsyncDisposableState]] ) を実行する。 asyncDisposableStack .[[AsyncDisposableState]] が disposed である場合、ReferenceError 例外をスローする。newAsyncDisposableStack を ? OrdinaryCreateFromConstructor (%AsyncDisposableStack% , "%AsyncDisposableStack.prototype%" , « [[AsyncDisposableState]] , [[DisposableResourceStack]] ») とする。newAsyncDisposableStack .[[AsyncDisposableState]] を pending に設定する。newAsyncDisposableStack .[[DisposableResourceStack]] を asyncDisposableStack .[[DisposableResourceStack]] に設定する。asyncDisposableStack .[[DisposableResourceStack]] を新しい空の List に設定する。asyncDisposableStack .[[AsyncDisposableState]] を disposed に設定する。newAsyncDisposableStack を返す。
27.4.3.7 AsyncDisposableStack.prototype.use ( value )
このメソッドは呼び出されたとき、次の手順を実行します。
asyncDisposableStack を this 値とする。? RequireInternalSlot (asyncDisposableStack , [[AsyncDisposableState]] ) を実行する。 asyncDisposableStack .[[AsyncDisposableState]] が disposed である場合、ReferenceError 例外をスローする。? AddDisposableResource (asyncDisposableStack .[[DisposableResourceStack]] , value , async-dispose ) を実行する。 value を返す。
27.4.3.8 AsyncDisposableStack.prototype [ %Symbol.asyncDispose% ] ( )
%Symbol.asyncDispose% プロパティの初期値は、27.4.3.4 で定義される %AsyncDisposableStack.prototype.disposeAsync% です。
27.4.3.9 AsyncDisposableStack.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "AsyncDisposableStack" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.4.4 AsyncDisposableStack インスタンスのプロパティ
AsyncDisposableStack インスタンスは AsyncDisposableStack prototype オブジェクト (intrinsic %AsyncDisposableStack.prototype% )からプロパティを継承する通常オブジェクト です。AsyncDisposableStack インスタンスは、表 90 で説明される内部スロットを持つ状態で最初に作成されます。
表 90: AsyncDisposableStack インスタンスの内部スロット
内部スロット
型
説明
[[AsyncDisposableState]]
pending or disposed
disposable stack がその %Symbol.asyncDispose% メソッドへの呼出しにどのように反応するかを制御します。
[[DisposableResourceStack]]
a List of DisposableResource Records
disposable stack が dispose されたときに dispose されるリソース。リソースは初期化された順序で追加され、逆順で dispose されます。
27.5 Promise オブジェクト
Promise は、遅延された(場合によっては非同期の)計算の最終的な結果のプレースホルダーとして使用されるオブジェクトです。
すべての Promise は、相互排他的な3つの状態、fulfilled 、rejected 、および pending のいずれかにあります。
promise p は、p.then(f, r) が関数 f を呼び出す Job を直ちにキューに追加する場合、fulfilled です。
promise p は、p.then(f, r) が関数 r を呼び出す Job を直ちにキューに追加する場合、rejected です。
promise は、fulfilled でも rejected でもない場合、pending です。
promise は pending でない場合、すなわち fulfilled または rejected のいずれかである場合、settled であるといいます。
promise は、settled であるか、別の promise の状態と一致するように「固定」されている場合、resolved です。resolved promise を resolve または reject しようとしても効果はありません。promise は resolved でない場合、unresolved です。unresolved promise は常に pending 状態です。resolved promise は pending、fulfilled、または rejected のいずれかである可能性があります。
thenable とは、Get (obj , "then" ) が function object を返すオブジェクト obj です。
27.5.1 Promise の抽象操作
27.5.1.1 PromiseCapability Record
PromiseCapability Record は、Promise または promise-like オブジェクトを、その promise を resolve または reject できる関数とともにカプセル化するために使用される Record です。PromiseCapability Record は NewPromiseCapability 抽象操作 によって生成されます。
PromiseCapability Record は 表 91 に列挙されるフィールドを持ちます。
表 91: PromiseCapability Record のフィールド
フィールド名
値
意味
[[Promise]]
an Object
promise として使用可能なオブジェクト。
[[Resolve]]
a function object
与えられた promise を resolve するために使用される関数。
[[Reject]]
a function object
与えられた promise を reject するために使用される関数。
27.5.1.1.1 IfAbruptRejectPromise ( value , capability )
IfAbruptRejectPromise は、PromiseCapability Record を使用する一連のアルゴリズム手順の略記です。次の形式のアルゴリズム手順:
IfAbruptRejectPromise (value , capability ).
は、次と同じ意味です。
表明 : value は Completion Record である。value が中断完了 である場合、? Call (capability .[[Reject]] , undefined , « value .[[Value]] ») を実行する。 capability .[[Promise]] を返す。value を ! value に設定する。
27.5.1.2 PromiseReaction Record
PromiseReaction Record は、promise が特定の値で resolved または rejected になったときにどのように反応するべきかについての情報を保存するために使用される Record です。PromiseReaction Record は PerformPromiseThen 抽象操作 によって作成され、NewPromiseReactionJob が返す Abstract Closure によって使用されます。
PromiseReaction Record は 表 92 に列挙されるフィールドを持ちます。
表 92: PromiseReaction Record のフィールド
フィールド名
値
意味
[[Capability]]
a PromiseCapability Record or undefined
この Record が reaction handler を提供する promise の capability。
[[Type]]
fulfill or reject
[[Handler]] が empty の場合、settlement type に固有の動作を可能にするため [[Type]] が使用されます。
[[Handler]]
a JobCallback Record or empty
入力値に適用され、その戻り値が派生 promise に何が起こるかを決定する関数。[[Handler]] が empty の場合、代わりに [[Type]] の値に依存する関数が使用されます。
27.5.1.3 CreateResolvingFunctions ( toResolve )
抽象操作 CreateResolvingFunctions。引数 toResolve (Promise)。戻り値:レコード (フィールド:[[Resolve]] (関数オブジェクト ), [[Reject]] (関数オブジェクト ))。 呼び出されると、次の手順を実行する。
promiseOrEmpty を Record { [[Value]] : toResolve } とする。resolveSteps を、promiseOrEmpty を捕捉し、パラメーター (resolution ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。promiseOrEmpty .[[Value]] が empty である場合、undefined を返す。promise を promiseOrEmpty .[[Value]] とする。promiseOrEmpty .[[Value]] を empty に設定する。SameValue (resolution , promise ) が true である場合、selfResolutionError を新しく作成された TypeError オブジェクトとする。RejectPromise (promise , selfResolutionError ) を実行する。undefined を返す。resolution が Object でない場合、FulfillPromise (promise , resolution ) を実行する。undefined を返す。then を Completion (Get (resolution , "then" )) とする。then が中断完了 である場合、RejectPromise (promise , then .[[Value]] ) を実行する。undefined を返す。thenAction を then .[[Value]] とする。IsCallable (thenAction ) が false である場合、FulfillPromise (promise , resolution ) を実行する。undefined を返す。thenJobCallback を HostMakeJobCallback (thenAction ) とする。job を NewPromiseResolveThenableJob (promise , resolution , thenJobCallback ) とする。HostEnqueuePromiseJob (job .[[Job]] , job .[[Realm]] ) を実行する。undefined を返す。resolve を CreateBuiltinFunction (resolveSteps , 1, "" , « ») とする。rejectSteps を、promiseOrEmpty を捕捉し、パラメーター (reason ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。promiseOrEmpty .[[Value]] が empty である場合、undefined を返す。promise を promiseOrEmpty .[[Value]] とする。promiseOrEmpty .[[Value]] を empty に設定する。RejectPromise (promise , reason ) を実行する。undefined を返す。reject を CreateBuiltinFunction (rejectSteps , 1, "" , « ») とする。Record { [[Resolve]] : resolve , [[Reject]] : reject } を返す。
27.5.1.4 FulfillPromise ( promise , value )
抽象操作 FulfillPromise。引数 promise (Promise) および value (ECMAScript 言語値 )。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : promise .[[PromiseState]] は pending である。reactions を promise .[[PromiseFulfillReactions]] とする。promise .[[PromiseResult]] を value に設定する。promise .[[PromiseFulfillReactions]] を undefined に設定する。promise .[[PromiseRejectReactions]] を undefined に設定する。promise .[[PromiseState]] を fulfilled に設定する。TriggerPromiseReactions (reactions , value ) を実行する。unused を返す。
27.5.1.5 NewPromiseCapability ( ctor )
抽象操作 NewPromiseCapability。引数 ctor (ECMAScript 言語値 )。戻り値:(正常完了 (値:PromiseCapabilityレコード ) または throw 完了 )。 組込み Promise コンストラクター と同じ方法で ctor をコンストラクター として使用し、promise を作成してその resolve および reject 関数を抽出しようとします。promise と resolve および reject 関数は、新しい PromiseCapability Record を初期化するために使用されます。 呼び出されると、次の手順を実行する。
IsConstructor (ctor ) が false である場合、TypeError 例外をスローする。注記 : ctor は Promise コンストラクター のパラメーター規約をサポートするコンストラクター 関数であると仮定される(27.5.3.1 を参照)。resolvingFuncs を Record { [[Resolve]] : undefined , [[Reject]] : undefined } とする。executorClosure を、resolvingFuncs を捕捉し、パラメーター (resolve , reject ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。resolvingFuncs .[[Resolve]] が undefined でない場合、TypeError 例外をスローする。resolvingFuncs .[[Reject]] が undefined でない場合、TypeError 例外をスローする。resolvingFuncs .[[Resolve]] を resolve に設定する。resolvingFuncs .[[Reject]] を reject に設定する。NormalCompletion (undefined ) を返す。executor を CreateBuiltinFunction (executorClosure , 2, "" , « ») とする。promise を ? Construct (ctor , « executor ») とする。IsCallable (resolvingFuncs .[[Resolve]] ) が false である場合、TypeError 例外をスローする。IsCallable (resolvingFuncs .[[Reject]] ) が false である場合、TypeError 例外をスローする。PromiseCapability Record { [[Promise]] : promise , [[Resolve]] : resolvingFuncs .[[Resolve]] , [[Reject]] : resolvingFuncs .[[Reject]] } を返す。
注
この抽象操作 は、渡された executor 関数引数を Promise コンストラクター と同じ方法で呼び出すすべてのコンストラクター に対して汎用的であるため、Promise のサブクラス化をサポートします。Promise コンストラクター の static メソッドを任意のサブクラスへ一般化するために使用されます。
27.5.1.6 IsPromise ( arg )
抽象操作 IsPromise。引数 arg (ECMAScript 言語値 )。戻り値:Boolean。 オブジェクトに promise brand があるかどうかを確認します。 呼び出されると、次の手順を実行する。
arg が Object でない場合、false を返す。arg が [[PromiseState]] 内部スロットを持たない場合、false を返す。true を返す。
27.5.1.7 RejectPromise ( promise , reason )
抽象操作 RejectPromise。引数 promise (Promise) および reason (ECMAScript 言語値 )。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : promise .[[PromiseState]] は pending である。reactions を promise .[[PromiseRejectReactions]] とする。promise .[[PromiseResult]] を reason に設定する。promise .[[PromiseFulfillReactions]] を undefined に設定する。promise .[[PromiseRejectReactions]] を undefined に設定する。promise .[[PromiseState]] を rejected に設定する。promise .[[PromiseIsHandled]] が false である場合、HostPromiseRejectionTracker (promise , "reject" ) を実行する。TriggerPromiseReactions (reactions , reason ) を実行する。unused を返す。
27.5.1.8 TriggerPromiseReactions ( reactions , arg )
抽象操作 TriggerPromiseReactions。引数 reactions (リスト (要素:PromiseReactionレコード )) および arg (ECMAScript 言語値 )。戻り値:unused 。 reactions 内の各 Record について新しい Job をキューに追加します。その各 Job は PromiseReaction Record の [[Type]] および [[Handler]] を処理し、[[Handler]] が empty でない場合、指定された引数を渡してそれを呼び出します。[[Handler]] が empty である場合、動作は [[Type]] によって決定されます。 呼び出されると、次の手順を実行する。
reactions の各要素 reaction について、次を行う。job を NewPromiseReactionJob (reaction , arg ) とする。HostEnqueuePromiseJob (job .[[Job]] , job .[[Realm]] ) を実行する。unused を返す。
27.5.1.9 HostPromiseRejectionTracker ( promise , operation )
ホスト定義の抽象操作 HostPromiseRejectionTracker。引数 promise (Promise) および operation (("reject" または "handle" ))。戻り値:unused 。 ホスト環境 が promise の rejection を追跡できるようにします。
HostPromiseRejectionTracker の既定の実装は unused を返します。
注 1
HostPromiseRejectionTracker は次の2つの状況で呼び出されます。
promise が handler なしで reject された場合、operation 引数を "reject" に設定して呼び出されます。
rejected promise に初めて handler が追加された場合、operation 引数を "handle" に設定して呼び出されます。
HostPromiseRejectionTracker の典型的な実装では、未処理の rejection を開発者へ通知すると同時に、後から新しい handler が取り付けられて以前の通知が無効になった場合にも、それを通知するよう注意することが考えられます。
注 2
operation が "handle" である場合、実装はガベージコレクションを妨げる方法で promise への参照を保持するべきではありません。operation が "reject" である場合、rejection はまれであり hot code path には存在しないと想定されるため、実装は promise への参照を保持してもかまいません。
27.5.2 Promise Job
27.5.2.1 NewPromiseReactionJob ( reaction , arg )
抽象操作 NewPromiseReactionJob。引数 reaction (PromiseReactionレコード ) および arg (ECMAScript 言語値 )。戻り値:レコード (フィールド:[[Job]] (a Job Abstract Closure ), [[Realm]] ((Realmレコード または null )))。 入力値に適切な handler を適用し、その handler の戻り値を使用して、その handler に関連付けられた派生 promise を resolve または reject する新しい Job Abstract Closure を返します。 呼び出されると、次の手順を実行する。
job を、reaction と arg を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Job Abstract Closure とする。promiseCapability を reaction .[[Capability]] とする。type を reaction .[[Type]] とする。handler を reaction .[[Handler]] とする。handler が empty である場合、type が fulfill である場合、handlerResult を NormalCompletion (arg ) とする。そうでない場合、表明 : type は reject である。handlerResult を ThrowCompletion (arg ) とする。 そうでない場合、handlerResult を Completion (HostCallJobCallback (handler , undefined , « arg »)) とする。 promiseCapability が undefined である場合、表明 : handlerResult は中断完了 でない。empty を返す。表明 : promiseCapability は PromiseCapability Record である。handlerResult が中断完了 である場合、? Call (promiseCapability .[[Reject]] , undefined , « handlerResult .[[Value]] ») を返す。 ? Call (promiseCapability .[[Resolve]] , undefined , « handlerResult .[[Value]] ») を返す。 handlerRealm を null とする。reaction .[[Handler]] が empty でない場合、getHandlerRealmResult を Completion (GetFunctionRealm (reaction .[[Handler]] .[[Callback]] )) とする。getHandlerRealmResult が正常完了 である場合、handlerRealm を getHandlerRealmResult .[[Value]] に設定する。そうでない場合、handlerRealm を現在の Realm Record に設定する。 注記 : handler が undefined でない限り、handlerRealm が null になることはない。handler が revoke された Proxy であり ECMAScript コードが実行されない場合、handlerRealm はエラーオブジェクトを作成するために使用される。Record { [[Job]] : job , [[Realm]] : handlerRealm } を返す。
27.5.2.2 NewPromiseResolveThenableJob ( promiseToResolve , thenable , then )
抽象操作 NewPromiseResolveThenableJob。引数 promiseToResolve (Promise)、thenable (Object) および then (JobCallbackレコード )。戻り値:レコード (フィールド:[[Job]] (a Job Abstract Closure ), [[Realm]] (Realmレコード ))。 呼び出されると、次の手順を実行する。
job を、promiseToResolve 、thenable 、および then を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Job Abstract Closure とする。resolvingFuncs を CreateResolvingFunctions (promiseToResolve ) とする。thenCallResult を Completion (HostCallJobCallback (then , thenable , « resolvingFuncs .[[Resolve]] , resolvingFuncs .[[Reject]] »)) とする。thenCallResult が中断完了 である場合、? Call (resolvingFuncs .[[Reject]] , undefined , « thenCallResult .[[Value]] ») を返す。 ! thenCallResult を返す。 getThenRealmResult を Completion (GetFunctionRealm (then .[[Callback]] )) とする。getThenRealmResult が正常完了 である場合、thenRealm を getThenRealmResult .[[Value]] とする。そうでない場合、thenRealm を現在の Realm Record とする。 注記 : thenRealm が null になることはない。then .[[Callback]] が revoke された Proxy でありコードが実行されない場合、thenRealm はエラーオブジェクトを作成するために使用される。Record { [[Job]] : job , [[Realm]] : thenRealm } を返す。
注
この Job は、与えられた thenable とその then メソッドを使用して、与えられた promise を resolve します。この処理は、周囲のコードの評価がすべて完了した後に then メソッドの評価が行われることを保証するため、Job として実行されなければなりません。
27.5.3 Promise コンストラクター
Promise コンストラクター は:
%Promise% です。
グローバルオブジェクト の "Promise" プロパティの初期値です。
コンストラクター として呼び出されたとき、新しい Promise を作成して初期化します。
関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローします。
クラス定義の extends 節の値として使用できます。規定された Promise の動作を継承しようとするサブクラスコンストラクター は、Promise および Promise.prototype の組込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するため、Promise コンストラクター への super 呼出しを含まなければなりません。
27.5.3.1 Promise ( executor )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 IsCallable (executor ) が false である場合、TypeError 例外をスローする。promise を ? OrdinaryCreateFromConstructor (NewTarget, "%Promise.prototype%" , « [[PromiseState]] , [[PromiseResult]] , [[PromiseFulfillReactions]] , [[PromiseRejectReactions]] , [[PromiseIsHandled]] ») とする。promise .[[PromiseState]] を pending に設定する。promise .[[PromiseResult]] を empty に設定する。promise .[[PromiseFulfillReactions]] を新しい空の List に設定する。promise .[[PromiseRejectReactions]] を新しい空の List に設定する。promise .[[PromiseIsHandled]] を false に設定する。resolvingFuncs を CreateResolvingFunctions (promise ) とする。completion を Completion (Call (executor , undefined , « resolvingFuncs .[[Resolve]] , resolvingFuncs .[[Reject]] »)) とする。completion が中断完了 である場合、? Call (resolvingFuncs .[[Reject]] , undefined , « completion .[[Value]] ») を実行する。 promise を返す。
注
executor 引数は function object でなければなりません。この Promise によって表される、場合によっては遅延される処理の開始および完了の報告のために呼び出されます。executor は2つの引数、resolve と reject で呼び出されます。これらは、遅延計算の最終的な完了または失敗を報告するために executor 関数が使用できる関数です。executor 関数から戻ることは、遅延処理が完了したことを意味するのではなく、遅延処理を最終的に実行する要求が受け付けられたことだけを意味します。
executor 関数へ渡される resolve 関数は単一の引数を受け取ります。executor コードは最終的に resolve 関数を呼び出して、関連付けられた Promise を resolve したいことを示すことができます。resolve 関数へ渡される引数は遅延処理の最終的な値を表し、実際の fulfillment 値でも、fulfilled された場合に値を提供する別の promise でもかまいません。
executor 関数へ渡される reject 関数は単一の引数を受け取ります。executor コードは最終的に reject 関数を呼び出して、関連付けられた Promise が reject され、決して fulfill されないことを示すことができます。reject 関数へ渡される引数は promise の rejection 値として使用されます。通常は Error オブジェクトです。
Promise コンストラクター によって executor 関数へ渡される resolve および reject 関数は、関連付けられた promise を実際に resolve および reject する能力を持ちます。サブクラスは、resolve および reject にカスタマイズされた値を渡す異なるコンストラクター 動作を持つ場合があります。
27.5.4 Promise コンストラクターのプロパティ
Promise コンストラクター は:
27.5.4.1 Promise.all ( iterable )
この関数は、渡された promise の fulfillment 値の配列で fulfilled される新しい promise を返すか、渡された promise のうち最初に reject されたものの理由で reject されます。このアルゴリズムの実行中、渡された iterable のすべての要素を promise に resolve します。
ctor を this 値とする。promiseCapability を ? NewPromiseCapability (ctor ) とする。promiseResolve を Completion (GetPromiseResolve (ctor )) とする。IfAbruptRejectPromise (promiseResolve , promiseCapability )。iteratorRecord を Completion (GetIterator (iterable , sync )) とする。IfAbruptRejectPromise (iteratorRecord , promiseCapability )。result を Completion (PerformPromiseAll (iteratorRecord , ctor , promiseCapability , promiseResolve )) とする。result が中断完了 である場合、iteratorRecord .[[Done]] が false である場合、result を Completion (IteratorClose (iteratorRecord , result )) に設定する。IfAbruptRejectPromise (result , promiseCapability )。! result を返す。
注
この関数では、その this 値が Promise コンストラクター のパラメーター規約をサポートするコンストラクター 関数である必要があります。
27.5.4.1.1 GetPromiseResolve ( promiseCtor )
抽象操作 GetPromiseResolve。引数 promiseCtor (コンストラクター )。戻り値:(正常完了 (値:関数オブジェクト ) または throw 完了 )。 呼び出されると、次の手順を実行する。
promiseResolve を ? Get (promiseCtor , "resolve" ) とする。IsCallable (promiseResolve ) が false である場合、TypeError 例外をスローする。promiseResolve を返す。
27.5.4.1.2 PerformPromiseAll ( iteratorRecord , ctor , resultCapability , promiseResolve )
抽象操作 PerformPromiseAll。引数 iteratorRecord (Iteratorレコード )、ctor (コンストラクター )、resultCapability (PromiseCapabilityレコード ) および promiseResolve (関数オブジェクト )。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
values を新しい空の List とする。注記 : remainingElementsCount は 0 ではなく 1 から開始する。これは、入力 iterator が使い切られる前に渡された callback を呼び出す不正な "then" が存在しても、resultCapability .[[Resolve]] が1回だけ呼び出されることを保証するためである。remainingElementsCount を Record { [[Value]] : 1 } とする。index を 0 とする。次を繰り返す。next を ? IteratorStepValue (iteratorRecord ) とする。next が done である場合、remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。remainingElementsCount .[[Value]] = 0 である場合、valuesArray を CreateArrayFromList (values ) とする。? Call (resultCapability .[[Resolve]] , undefined , « valuesArray ») を実行する。 resultCapability .[[Promise]] を返す。undefined を values に追加する。nextPromise を ? Call (promiseResolve , ctor , « next ») とする。fulfilledSteps を、values 、resultCapability 、および remainingElementsCount を捕捉し、パラメーター (value ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。activeFunc をアクティブな関数オブジェクト とする。activeFunc .[[AlreadyCalled]] が true である場合、undefined を返す。activeFunc .[[AlreadyCalled]] を true に設定する。thisIndex を activeFunc .[[Index]] とする。values [thisIndex ] を value に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。remainingElementsCount .[[Value]] = 0 である場合、valuesArray を CreateArrayFromList (values ) とする。? Call (resultCapability .[[Resolve]] , undefined , « valuesArray ») を返す。 undefined を返す。onFulfilled を CreateBuiltinFunction (fulfilledSteps , 1, "" , « [[AlreadyCalled]] , [[Index]] ») とする。onFulfilled .[[AlreadyCalled]] を false に設定する。onFulfilled .[[Index]] を index に設定する。index を index + 1 に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] + 1 に設定する。? Invoke (nextPromise , "then" , « onFulfilled , resultCapability .[[Reject]] ») を実行する。
27.5.4.2 Promise.allSettled ( iterable )
この関数は、元のすべての promise が settled、すなわち fulfilled または rejected のいずれかになった後にのみ、promise 状態のスナップショットの配列で fulfilled される promise を返します。このアルゴリズムの実行中、渡された iterable のすべての要素を promise に resolve します。
ctor を this 値とする。promiseCapability を ? NewPromiseCapability (ctor ) とする。promiseResolve を Completion (GetPromiseResolve (ctor )) とする。IfAbruptRejectPromise (promiseResolve , promiseCapability )。iteratorRecord を Completion (GetIterator (iterable , sync )) とする。IfAbruptRejectPromise (iteratorRecord , promiseCapability )。result を Completion (PerformPromiseAllSettled (iteratorRecord , ctor , promiseCapability , promiseResolve )) とする。result が中断完了 である場合、iteratorRecord .[[Done]] が false である場合、result を Completion (IteratorClose (iteratorRecord , result )) に設定する。IfAbruptRejectPromise (result , promiseCapability )。! result を返す。
注
この関数では、その this 値が Promise コンストラクター のパラメーター規約をサポートするコンストラクター 関数である必要があります。
27.5.4.2.1 PerformPromiseAllSettled ( iteratorRecord , ctor , resultCapability , promiseResolve )
抽象操作 PerformPromiseAllSettled。引数 iteratorRecord (Iteratorレコード )、ctor (コンストラクター )、resultCapability (PromiseCapabilityレコード ) および promiseResolve (関数オブジェクト )。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
values を新しい空の List とする。注記 : remainingElementsCount は 0 ではなく 1 から開始する。これは、入力 iterator が使い切られる前に渡された callback のいずれかを呼び出す不正な "then" が存在しても、resultCapability .[[Resolve]] が1回だけ呼び出されることを保証するためである。remainingElementsCount を Record { [[Value]] : 1 } とする。index を 0 とする。次を繰り返す。next を ? IteratorStepValue (iteratorRecord ) とする。next が done である場合、remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。remainingElementsCount .[[Value]] = 0 である場合、valuesArray を CreateArrayFromList (values ) とする。? Call (resultCapability .[[Resolve]] , undefined , « valuesArray ») を実行する。 resultCapability .[[Promise]] を返す。undefined を values に追加する。nextPromise を ? Call (promiseResolve , ctor , « next ») とする。alreadyCalled を Record { [[Value]] : false } とする。fulfilledSteps を、values 、resultCapability 、および remainingElementsCount を捕捉し、パラメーター (value ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。activeFunc をアクティブな関数オブジェクト とする。activeFunc .[[AlreadyCalled]] .[[Value]] が true である場合、undefined を返す。activeFunc .[[AlreadyCalled]] .[[Value]] を true に設定する。obj を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (obj , "status" , "fulfilled" ) を実行する。 ! CreateDataPropertyOrThrow (obj , "value" , value ) を実行する。 thisIndex を activeFunc .[[Index]] とする。values [thisIndex ] を obj に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。remainingElementsCount .[[Value]] = 0 である場合、valuesArray を CreateArrayFromList (values ) とする。? Call (resultCapability .[[Resolve]] , undefined , « valuesArray ») を返す。 undefined を返す。onFulfilled を CreateBuiltinFunction (fulfilledSteps , 1, "" , « [[AlreadyCalled]] , [[Index]] ») とする。onFulfilled .[[AlreadyCalled]] を alreadyCalled に設定する。onFulfilled .[[Index]] を index に設定する。rejectedSteps を、values 、resultCapability 、および remainingElementsCount を捕捉し、パラメーター (error ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。activeFunc をアクティブな関数オブジェクト とする。activeFunc .[[AlreadyCalled]] .[[Value]] が true である場合、undefined を返す。activeFunc .[[AlreadyCalled]] .[[Value]] を true に設定する。obj を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (obj , "status" , "rejected" ) を実行する。 ! CreateDataPropertyOrThrow (obj , "reason" , error ) を実行する。 thisIndex を activeFunc .[[Index]] とする。values [thisIndex ] を obj に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。remainingElementsCount .[[Value]] = 0 である場合、valuesArray を CreateArrayFromList (values ) とする。? Call (resultCapability .[[Resolve]] , undefined , « valuesArray ») を返す。 undefined を返す。onRejected を CreateBuiltinFunction (rejectedSteps , 1, "" , « [[AlreadyCalled]] , [[Index]] ») とする。onRejected .[[AlreadyCalled]] を alreadyCalled に設定する。onRejected .[[Index]] を index に設定する。index を index + 1 に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] + 1 に設定する。? Invoke (nextPromise , "then" , « onFulfilled , onRejected ») を実行する。
27.5.4.3 Promise.any ( iterable )
この関数は、与えられた promise のうち最初に fulfill された promise によって fulfilled される promise を返すか、与えられたすべての promise が reject された場合は、rejection の理由を保持する AggregateError で reject される promise を返します。このアルゴリズムの実行中、渡された iterable のすべての要素を promise に resolve します。
ctor を this 値とする。promiseCapability を ? NewPromiseCapability (ctor ) とする。promiseResolve を Completion (GetPromiseResolve (ctor )) とする。IfAbruptRejectPromise (promiseResolve , promiseCapability )。iteratorRecord を Completion (GetIterator (iterable , sync )) とする。IfAbruptRejectPromise (iteratorRecord , promiseCapability )。result を Completion (PerformPromiseAny (iteratorRecord , ctor , promiseCapability , promiseResolve )) とする。result が中断完了 である場合、iteratorRecord .[[Done]] が false である場合、result を Completion (IteratorClose (iteratorRecord , result )) に設定する。IfAbruptRejectPromise (result , promiseCapability )。! result を返す。
注
この関数では、その this 値が Promise コンストラクター のパラメーター規約をサポートするコンストラクター 関数である必要があります。
27.5.4.3.1 PerformPromiseAny ( iteratorRecord , ctor , resultCapability , promiseResolve )
抽象操作 PerformPromiseAny。引数 iteratorRecord (Iteratorレコード )、ctor (コンストラクター )、resultCapability (PromiseCapabilityレコード ) および promiseResolve (関数オブジェクト )。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
errors を新しい空の List とする。注記 : remainingElementsCount は 0 ではなく 1 から開始する。これは、入力 iterator が使い切られる前に渡された callback を呼び出す不正な "then" が存在しても、resultCapability .[[Reject]] が1回だけ呼び出されることを保証するためである。remainingElementsCount を Record { [[Value]] : 1 } とする。index を 0 とする。次を繰り返す。next を ? IteratorStepValue (iteratorRecord ) とする。next が done である場合、remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。remainingElementsCount .[[Value]] = 0 である場合、aggregateError を新しく作成された AggregateError オブジェクトとする。! DefinePropertyOrThrow (aggregateError , "errors" , PropertyDescriptor { [[Configurable]] : true , [[Enumerable]] : false , [[Writable]] : true , [[Value]] : CreateArrayFromList (errors ) }) を実行する。 ? Call (resultCapability .[[Reject]] , undefined , « aggregateError ») を実行する。 resultCapability .[[Promise]] を返す。undefined を errors に追加する。nextPromise を ? Call (promiseResolve , ctor , « next ») とする。rejectedSteps を、errors 、resultCapability 、および remainingElementsCount を捕捉し、パラメーター (error ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。activeFunc をアクティブな関数オブジェクト とする。activeFunc .[[AlreadyCalled]] が true である場合、undefined を返す。activeFunc .[[AlreadyCalled]] を true に設定する。thisIndex を activeFunc .[[Index]] とする。errors [thisIndex ] を error に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。remainingElementsCount .[[Value]] = 0 である場合、aggregateError を新しく作成された AggregateError オブジェクトとする。! DefinePropertyOrThrow (aggregateError , "errors" , PropertyDescriptor { [[Configurable]] : true , [[Enumerable]] : false , [[Writable]] : true , [[Value]] : CreateArrayFromList (errors ) }) を実行する。 ? Call (resultCapability .[[Reject]] , undefined , « aggregateError ») を返す。 undefined を返す。onRejected を CreateBuiltinFunction (rejectedSteps , 1, "" , « [[AlreadyCalled]] , [[Index]] ») とする。onRejected .[[AlreadyCalled]] を false に設定する。onRejected .[[Index]] を index に設定する。index を index + 1 に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] + 1 に設定する。? Invoke (nextPromise , "then" , « resultCapability .[[Resolve]] , onRejected ») を実行する。
27.5.4.4 Promise.prototype
Promise.prototype の初期値は Promise prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
27.5.4.5 Promise.race ( iterable )
この関数は、渡された promise のうち最初に settle した promise と同じ方法で settle される新しい promise を返します。このアルゴリズムの実行中、渡された iterable のすべての要素を promise に resolve します。
ctor を this 値とする。promiseCapability を ? NewPromiseCapability (ctor ) とする。promiseResolve を Completion (GetPromiseResolve (ctor )) とする。IfAbruptRejectPromise (promiseResolve , promiseCapability )。iteratorRecord を Completion (GetIterator (iterable , sync )) とする。IfAbruptRejectPromise (iteratorRecord , promiseCapability )。result を Completion (PerformPromiseRace (iteratorRecord , ctor , promiseCapability , promiseResolve )) とする。result が中断完了 である場合、iteratorRecord .[[Done]] が false である場合、result を Completion (IteratorClose (iteratorRecord , result )) に設定する。IfAbruptRejectPromise (result , promiseCapability )。! result を返す。
注 1
iterable 引数が値を生成しない場合、または iterable が生成する promise のいずれも決して settle しない場合、このメソッドが返す pending promise は決して settle しません。
注 2
この関数では、その this 値が Promise コンストラクター のパラメーター規約をサポートするコンストラクター 関数であることが期待されます。また、その this 値が resolve メソッドを提供することも期待されます。
27.5.4.5.1 PerformPromiseRace ( iteratorRecord , ctor , resultCapability , promiseResolve )
抽象操作 PerformPromiseRace。引数 iteratorRecord (Iteratorレコード )、ctor (コンストラクター )、resultCapability (PromiseCapabilityレコード ) および promiseResolve (関数オブジェクト )。戻り値:(正常完了 (値:Object) または throw 完了 )。 呼び出されると、次の手順を実行する。
次を繰り返す。next を ? IteratorStepValue (iteratorRecord ) とする。next が done である場合、resultCapability .[[Promise]] を返す。nextPromise を ? Call (promiseResolve , ctor , « next ») とする。? Invoke (nextPromise , "then" , « resultCapability .[[Resolve]] , resultCapability .[[Reject]] ») を実行する。
27.5.4.6 Promise.reject ( reason )
この関数は、渡された引数で reject された新しい promise を返します。
ctor を this 値とする。promiseCapability を ? NewPromiseCapability (ctor ) とする。? Call (promiseCapability .[[Reject]] , undefined , « reason ») を実行する。 promiseCapability .[[Promise]] を返す。
注
この関数では、その this 値が Promise コンストラクター のパラメーター規約をサポートするコンストラクター 関数であることが期待されます。
27.5.4.7 Promise.resolve ( resolution )
この関数は、渡された引数で resolve された新しい promise、または引数がこのコンストラクター によって生成された promise である場合はその引数自体を返します。
ctor を this 値とする。ctor が Object でない場合、TypeError 例外をスローする。? PromiseResolve (ctor , resolution ) を返す。
注
この関数では、その this 値が Promise コンストラクター のパラメーター規約をサポートするコンストラクター 関数であることが期待されます。
27.5.4.7.1 PromiseResolve ( ctor , resolution )
抽象操作 PromiseResolve。引数 ctor (Object) および resolution (ECMAScript 言語値 )。戻り値:(正常完了 (値:Object) または throw 完了 )。 resolution で resolve された新しい promise を返します。 呼び出されると、次の手順を実行する。
IsPromise (resolution ) が true である場合、resolutionCtor を ? Get (resolution , "constructor" ) とする。SameValue (resolutionCtor , ctor ) が true である場合、resolution を返す。promiseCapability を ? NewPromiseCapability (ctor ) とする。? Call (promiseCapability .[[Resolve]] , undefined , « resolution ») を実行する。 promiseCapability .[[Promise]] を返す。
27.5.4.8 Promise.try ( callback , ...args )
この関数は呼び出されたとき、次の手順を実行します。
ctor を this 値とする。ctor が Object でない場合、TypeError 例外をスローする。status を Completion (Call (callback , undefined , args )) とする。status が中断完了 である場合、promiseCapability を ? NewPromiseCapability (ctor ) とする。? Call (promiseCapability .[[Reject]] , undefined , « status .[[Value]] ») を実行する。 promiseCapability .[[Promise]] を返す。そうでない場合、? PromiseResolve (ctor , ! status ) を返す。
注
この関数では、その this 値が Promise コンストラクター のパラメーター規約をサポートするコンストラクター 関数であることが期待されます。
27.5.4.9 Promise.withResolvers ( )
この関数は3つのプロパティを持つオブジェクト、すなわち新しい promise と、それに関連付けられた resolve および reject 関数を返します。
ctor を this 値とする。promiseCapability を ? NewPromiseCapability (ctor ) とする。obj を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (obj , "promise" , promiseCapability .[[Promise]] ) を実行する。 ! CreateDataPropertyOrThrow (obj , "resolve" , promiseCapability .[[Resolve]] ) を実行する。 ! CreateDataPropertyOrThrow (obj , "reject" , promiseCapability .[[Reject]] ) を実行する。 obj を返す。
27.5.4.10 get Promise [ %Symbol.species% ]
Promise[%Symbol.species%] は、set アクセサー関数が undefined であるアクセサープロパティ です。その get アクセサー関数は、呼び出されたときに次の手順を実行します。
this 値を返す。
この関数の "name" プロパティの値は "get [Symbol.species]" です。
注
Promise prototype メソッドは通常、その this 値のコンストラクター を使用して派生オブジェクトを作成します。ただし、サブクラスコンストラクター は %Symbol.species% プロパティを再定義することによって、その既定の動作を上書きできます。
27.5.5 Promise Prototype オブジェクトのプロパティ
Promise prototype オブジェクト は:
%Promise.prototype% です。
値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
通常オブジェクト です。
[[PromiseState]] 内部スロットまたは Promise インスタンスのその他の内部スロットを持ちません。
27.5.5.1 Promise.prototype.catch ( onRejected )
このメソッドは呼び出されたとき、次の手順を実行します。
promise を this 値とする。? Invoke (promise , "then" , « undefined , onRejected ») を返す。
27.5.5.2 Promise.prototype.constructor
Promise.prototype.constructor の初期値は %Promise% です。
27.5.5.3 Promise.prototype.finally ( onFinally )
このメソッドは呼び出されたとき、次の手順を実行します。
promise を this 値とする。promise が Object でない場合、TypeError 例外をスローする。ctor を ? SpeciesConstructor (promise , %Promise% ) とする。表明 : IsConstructor (ctor ) は true である。IsCallable (onFinally ) が false である場合、thenFinally を onFinally とする。catchFinally を onFinally とする。そうでない場合、thenFinallyClosure を、onFinally と ctor を捕捉し、パラメーター (value ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。result を ? Call (onFinally , undefined ) とする。p を ? PromiseResolve (ctor , result ) とする。returnValue を、value を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。NormalCompletion (value ) を返す。valueThunk を CreateBuiltinFunction (returnValue , 0, "" , « ») とする。? Invoke (p , "then" , « valueThunk ») を返す。 thenFinally を CreateBuiltinFunction (thenFinallyClosure , 1, "" , « ») とする。catchFinallyClosure を、onFinally と ctor を捕捉し、パラメーター (reason ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。result を ? Call (onFinally , undefined ) とする。p を ? PromiseResolve (ctor , result ) とする。throwReason を、reason を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。reason をスローする。thrower を CreateBuiltinFunction (throwReason , 0, "" , « ») とする。? Invoke (p , "then" , « thrower ») を返す。 catchFinally を CreateBuiltinFunction (catchFinallyClosure , 1, "" , « ») とする。 ? Invoke (promise , "then" , « thenFinally , catchFinally ») を返す。
27.5.5.4 Promise.prototype.then ( onFulfilled , onRejected )
このメソッドは呼び出されたとき、次の手順を実行します。
promise を this 値とする。IsPromise (promise ) が false である場合、TypeError 例外をスローする。ctor を ? SpeciesConstructor (promise , %Promise% ) とする。resultCapability を ? NewPromiseCapability (ctor ) とする。PerformPromiseThen (promise , onFulfilled , onRejected , resultCapability ) を返す。
27.5.5.4.1 PerformPromiseThen ( promise , onFulfilled , onRejected [ , resultCapability ] )
抽象操作 PerformPromiseThen。引数 promise (Promise)、onFulfilled (ECMAScript 言語値 ) および onRejected (ECMAScript 言語値 )および省略可能な引数 resultCapability (PromiseCapabilityレコード )。戻り値:(Object または undefined )。 onFulfilled および onRejected を settlement action として使用し、promise に対する「then」操作を実行します。resultCapability が渡された場合、結果は resultCapability の promise を更新することで保存されます。渡されていない場合、PerformPromiseThen は結果が重要でない仕様内部の操作から呼び出されています。 呼び出されると、次の手順を実行する。
表明 : IsPromise (promise ) は true である。resultCapability が存在しない場合、resultCapability を undefined に設定する。IsCallable (onFulfilled ) が false である場合、onFulfilledJobCallback を empty とする。そうでない場合、onFulfilledJobCallback を HostMakeJobCallback (onFulfilled ) とする。 IsCallable (onRejected ) が false である場合、onRejectedJobCallback を empty とする。そうでない場合、onRejectedJobCallback を HostMakeJobCallback (onRejected ) とする。 fulfillReaction を PromiseReaction Record { [[Capability]] : resultCapability , [[Type]] : fulfill , [[Handler]] : onFulfilledJobCallback } とする。rejectReaction を PromiseReaction Record { [[Capability]] : resultCapability , [[Type]] : reject , [[Handler]] : onRejectedJobCallback } とする。promise .[[PromiseState]] が pending である場合、fulfillReaction を promise .[[PromiseFulfillReactions]] に追加する。rejectReaction を promise .[[PromiseRejectReactions]] に追加する。そうでなく、promise .[[PromiseState]] が fulfilled である場合、value を promise .[[PromiseResult]] とする。fulfillJob を NewPromiseReactionJob (fulfillReaction , value ) とする。HostEnqueuePromiseJob (fulfillJob .[[Job]] , fulfillJob .[[Realm]] ) を実行する。 そうでない場合、表明 : promise .[[PromiseState]] は rejected である。reason を promise .[[PromiseResult]] とする。promise .[[PromiseIsHandled]] が false である場合、HostPromiseRejectionTracker (promise , "handle" ) を実行する。rejectJob を NewPromiseReactionJob (rejectReaction , reason ) とする。HostEnqueuePromiseJob (rejectJob .[[Job]] , rejectJob .[[Realm]] ) を実行する。 promise .[[PromiseIsHandled]] を true に設定する。resultCapability が undefined である場合、undefined を返す。resultCapability .[[Promise]] を返す。
27.5.5.5 Promise.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "Promise" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.5.6 Promise インスタンスのプロパティ
Promise インスタンスは Promise prototype オブジェクト (intrinsic %Promise.prototype% )からプロパティを継承する通常オブジェクト です。Promise インスタンスは、表 93 で説明される内部スロットを持つ状態で最初に作成されます。
表 93: Promise インスタンスの内部スロット
内部スロット
型
説明
[[PromiseState]]
pending , fulfilled , or rejected
promise がその then メソッドへの呼出しにどのように反応するかを制御します。
[[PromiseResult]]
an ECMAScript language value or empty
promise が fulfilled または rejected された値(存在する場合)。[[PromiseState]] が pending である場合に限り empty です。
[[PromiseFulfillReactions]]
a List of PromiseReaction Records
promise が pending 状態から fulfilled 状態へ遷移するとき/した場合に処理される Record 。
[[PromiseRejectReactions]]
a List of PromiseReaction Records
promise が pending 状態から rejected 状態へ遷移するとき/した場合に処理される Record 。
[[PromiseIsHandled]]
a Boolean
promise に fulfillment または rejection handler がこれまでに設定されたことがあるかどうかを示します。未処理の rejection の追跡に使用されます。
27.6 GeneratorFunction オブジェクト
GeneratorFunction は通常、GeneratorDeclaration 、GeneratorExpression 、および GeneratorMethod を評価することによって作成される関数です。%GeneratorFunction% intrinsic を呼び出すことによって作成することもできます。
図 6 (参考): Generator オブジェクトの関係
27.6.1 GeneratorFunction コンストラクター
GeneratorFunction コンストラクター は:
%GeneratorFunction% です。
Function のサブクラスです。
コンストラクター としてではなく関数として呼び出されたとき、新しい GeneratorFunction を作成して初期化します。したがって、関数呼出し GeneratorFunction (…) は、同じ引数を持つオブジェクト作成式 new GeneratorFunction (…) と等価です。
クラス定義の extends 節の値として使用できます。規定された GeneratorFunction の動作を継承しようとするサブクラスコンストラクター は、組込み GeneratorFunction の動作に必要な内部スロットを持つサブクラスインスタンスを作成して初期化するため、GeneratorFunction コンストラクター への super 呼出しを含まなければなりません。generator function オブジェクトを定義するすべての ECMAScript 構文形式は GeneratorFunction の直接インスタンスを作成します。GeneratorFunction サブクラスのインスタンスを作成する構文上の手段はありません。
27.6.1.1 GeneratorFunction ( ...paramArgs , bodyArg )
最後の引数(存在する場合)は generator function の本体(実行可能コード)を指定し、それより前の引数は仮引数を指定します。
この関数は呼び出されたとき、次の手順を実行します。
activeFunc をアクティブな関数オブジェクト とする。bodyArg が存在しない場合、bodyArg を空の String に設定する。? CreateDynamicFunction (activeFunc , NewTarget, generator , paramArgs , bodyArg ) を返す。
注
27.6.2 GeneratorFunction コンストラクターのプロパティ
GeneratorFunction コンストラクター は:
Function コンストラクター から継承する標準組込み関数オブジェクト です。
値が %Function% である [[Prototype]] 内部スロットを持ちます。
値が 1 𝔽 である "length" プロパティを持ちます。
値が "GeneratorFunction" である "name" プロパティを持ちます。
次のプロパティを持ちます。
27.6.2.1 GeneratorFunction.prototype
GeneratorFunction.prototype の初期値は GeneratorFunction prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
27.6.3 GeneratorFunction Prototype オブジェクトのプロパティ
GeneratorFunction prototype オブジェクト は:
27.6.3.1 GeneratorFunction.prototype.constructor
GeneratorFunction.prototype.constructor の初期値は %GeneratorFunction% です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.6.3.2 GeneratorFunction.prototype.prototype
GeneratorFunction.prototype.prototype の初期値は %GeneratorPrototype% です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.6.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "GeneratorFunction" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.6.4 GeneratorFunction インスタンス
すべての GeneratorFunction インスタンスは ECMAScript 関数オブジェクト であり、表 26 に列挙される内部スロットを持ちます。そのようなすべてのインスタンスについて、[[IsClassConstructor]] 内部スロットの値は false です。
各 GeneratorFunction インスタンスは次の own プロパティを持ちます。
27.6.4.1 length
20.2.4.1 で与えられる Function インスタンスの "length" プロパティの仕様は、GeneratorFunction インスタンスにも適用されます。
27.6.4.2 name
20.2.4.2 で与えられる Function インスタンスの "name" プロパティの仕様は、GeneratorFunction インスタンスにも適用されます。
27.6.4.3 prototype
GeneratorFunction インスタンスが作成されるたびに、別の通常オブジェクト も作成され、それが generator function の "prototype" プロパティの初期値になります。prototype プロパティの値は、generator function オブジェクトが [[Call]] を使用して呼び出されたとき、新しく作成される Generator の [[Prototype]] 内部スロットを初期化するために使用されます。
このプロパティは属性 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
注
Function インスタンスとは異なり、GeneratorFunction の "prototype" プロパティの値であるオブジェクトは、その値が GeneratorFunction インスタンスである "constructor" プロパティを持ちません。
27.7 AsyncGeneratorFunction オブジェクト
AsyncGeneratorFunction は通常、AsyncGeneratorDeclaration 、AsyncGeneratorExpression 、および AsyncGeneratorMethod 構文生成規則を評価することによって作成される関数です。%AsyncGeneratorFunction% intrinsic を呼び出すことによって作成することもできます。
27.7.1 AsyncGeneratorFunction コンストラクター
AsyncGeneratorFunction コンストラクター は:
%AsyncGeneratorFunction% です。
Function のサブクラスです。
コンストラクター としてではなく関数として呼び出されたとき、新しい AsyncGeneratorFunction を作成して初期化します。したがって、関数呼出し AsyncGeneratorFunction (...) は、同じ引数を持つオブジェクト作成式 new AsyncGeneratorFunction (...) と等価です。
クラス定義の extends 節の値として使用できます。規定された AsyncGeneratorFunction の動作を継承しようとするサブクラスコンストラクター は、組込み AsyncGeneratorFunction の動作に必要な内部スロットを持つサブクラスインスタンスを作成して初期化するため、AsyncGeneratorFunction コンストラクター への super 呼出しを含まなければなりません。async generator function オブジェクトを定義するすべての ECMAScript 構文形式は AsyncGeneratorFunction の直接インスタンスを作成します。AsyncGeneratorFunction サブクラスのインスタンスを作成する構文上の手段はありません。
27.7.1.1 AsyncGeneratorFunction ( ...paramArgs , bodyArg )
最後の引数(存在する場合)は async generator function の本体(実行可能コード)を指定し、それより前の引数は仮引数を指定します。
この関数は呼び出されたとき、次の手順を実行します。
activeFunc をアクティブな関数オブジェクト とする。bodyArg が存在しない場合、bodyArg を空の String に設定する。? CreateDynamicFunction (activeFunc , NewTarget, async-generator , paramArgs , bodyArg ) を返す。
注
27.7.2 AsyncGeneratorFunction コンストラクターのプロパティ
AsyncGeneratorFunction コンストラクター は:
Function コンストラクター から継承する標準組込み関数オブジェクト です。
値が %Function% である [[Prototype]] 内部スロットを持ちます。
値が 1 𝔽 である "length" プロパティを持ちます。
値が "AsyncGeneratorFunction" である "name" プロパティを持ちます。
次のプロパティを持ちます。
27.7.2.1 AsyncGeneratorFunction.prototype
AsyncGeneratorFunction.prototype の初期値は AsyncGeneratorFunction prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
27.7.3 AsyncGeneratorFunction Prototype オブジェクトのプロパティ
AsyncGeneratorFunction prototype オブジェクト は:
27.7.3.1 AsyncGeneratorFunction.prototype.constructor
AsyncGeneratorFunction.prototype.constructor の初期値は %AsyncGeneratorFunction% です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.7.3.2 AsyncGeneratorFunction.prototype.prototype
AsyncGeneratorFunction.prototype.prototype の初期値は %AsyncGeneratorPrototype% です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.7.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "AsyncGeneratorFunction" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.7.4 AsyncGeneratorFunction インスタンス
すべての AsyncGeneratorFunction インスタンスは ECMAScript 関数オブジェクト であり、表 26 に列挙される内部スロットを持ちます。そのようなすべてのインスタンスについて、[[IsClassConstructor]] 内部スロットの値は false です。
各 AsyncGeneratorFunction インスタンスは次の own プロパティを持ちます。
27.7.4.1 length
"length" プロパティの値は、AsyncGeneratorFunction が通常期待する引数の数を示す整数 Number です。ただし、言語は異なる数の引数で関数を呼び出すことも許可します。"length" プロパティで指定された数以外の引数で呼び出されたときの AsyncGeneratorFunction の動作は、その関数に依存します。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.7.4.2 name
20.2.4.2 で与えられる Function インスタンスの "name" プロパティの仕様は、AsyncGeneratorFunction インスタンスにも適用されます。
27.7.4.3 prototype
AsyncGeneratorFunction インスタンスが作成されるたびに、別の通常オブジェクト も作成され、それが async generator function の "prototype" プロパティの初期値になります。prototype プロパティの値は、generator function オブジェクトが [[Call]] を使用して呼び出されたとき、新しく作成される AsyncGenerator の [[Prototype]] 内部スロットを初期化するために使用されます。
このプロパティは属性 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
注
function インスタンスとは異なり、AsyncGeneratorFunction の "prototype" プロパティの値であるオブジェクトは、その値が AsyncGeneratorFunction インスタンスである "constructor" プロパティを持ちません。
27.8 Generator オブジェクト
Generator は generator function を呼び出すことによって作成され、iterator インターフェイス と iterable インターフェイス の両方に適合します。
Generator インスタンスは、そのインスタンスを作成した generator function の "prototype" プロパティの初期値から直接プロパティを継承します。Generator インスタンスは %GeneratorPrototype% から間接的にプロパティを継承します。
27.8.1 %GeneratorPrototype% オブジェクト
%GeneratorPrototype% オブジェクトは:
%GeneratorFunction.prototype.prototype% です。
通常オブジェクト です。
Generator インスタンスではなく、[[GeneratorState]] 内部スロットを持ちません。
値が %Iterator.prototype% である [[Prototype]] 内部スロットを持ちます。
すべての Generator インスタンスによって間接的に継承されるプロパティを持ちます。
27.8.1.1 %GeneratorPrototype%.constructor
%GeneratorPrototype% .constructor の初期値は %GeneratorFunction.prototype% です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.8.1.2 %GeneratorPrototype%.next ( value )
? GeneratorResume (this 値, value , empty ) を返す。
27.8.1.3 %GeneratorPrototype%.return ( value )
このメソッドは呼び出されたとき、次の手順を実行します。
gen を this 値とする。completion を ReturnCompletion (value ) とする。? GeneratorResumeAbrupt (gen , completion , empty ) を返す。
27.8.1.4 %GeneratorPrototype%.throw ( exception )
このメソッドは呼び出されたとき、次の手順を実行します。
gen を this 値とする。completion を ThrowCompletion (exception ) とする。? GeneratorResumeAbrupt (gen , completion , empty ) を返す。
27.8.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "Generator" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.8.2 Generator インスタンスのプロパティ
Generator インスタンスは、表 94 で説明される内部スロットを持つ状態で最初に作成されます。
表 94: Generator インスタンスの内部スロット
内部スロット
型
説明
[[GeneratorState]]
suspended-start , suspended-yield , executing , or completed
generator の現在の実行状態。
[[GeneratorContext]]
an execution context
この generator のコードを実行するときに使用される実行コンテキスト 。
[[GeneratorBrand]]
a String or empty
異なる種類の generator を区別するために使用される brand。ECMAScript ソーステキスト によって宣言された generator の [[GeneratorBrand]] は常に empty です。
27.8.3 Generator の抽象操作
27.8.3.1 GeneratorStart ( gen , genBody )
抽象操作 GeneratorStart。引数 gen (Generator) および genBody ((a FunctionBody Parse Node または パラメーターを持たない抽象クロージャ ))。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : gen .[[GeneratorState]] は suspended-start である。genContext を実行中の実行コンテキスト とする。genContext の Generator component を gen に設定する。closure を、genBody を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。acGenContext を実行中の実行コンテキスト とする。acGen を acGenContext の Generator component とする。genBody が Parse Node である場合、result を Completion (genBody の Evaluation ) とする。そうでない場合、表明 : genBody はパラメーターを持たない Abstract Closure である。result を Completion (genBody ()) とする。 表明 : ここへ戻ってきた場合、generator は例外をスローしたか、暗黙または明示的な return のいずれかを実行した。acGenContext を実行コンテキストスタック から削除し、実行コンテキストスタック の先頭にある実行コンテキスト を実行中の実行コンテキスト として復元する。acGen .[[GeneratorState]] を completed に設定する。注記 : generator が completed 状態に入ると、その状態から離れることはなく、関連付けられた実行コンテキスト が再開されることもない。この時点で acGen に関連付けられたすべての実行状態を破棄できる。result がスロー完了である場合、resumption を result とする。そうでない場合、result が正常完了 である場合、resultValue を undefined とする。そうでなく、result が return 完了 である場合、resultValue を result .[[Value]] とする。 resumption を NormalCompletion (CreateIteratorResultObject (resultValue , true )) とする。 callerContext を実行中の実行コンテキスト とする。resumption を渡して callerContext を再開する。表明 : この手順には決して到達しない。genContext のコード評価状態を、この実行コンテキスト について評価が再開されたとき、closure が引数なしで呼び出されるように設定する。gen .[[GeneratorContext]] を genContext に設定する。unused を返す。
27.8.3.2 GeneratorValidate ( gen , genBrand )
抽象操作 GeneratorValidate。引数 gen (ECMAScript 言語値 ) および genBrand ((String または empty ))。戻り値:(正常完了 (値:(suspended-start 、suspended-yield または completed )) または throw 完了 )。 呼び出されると、次の手順を実行する。
? RequireInternalSlot (gen , [[GeneratorState]] ) を実行する。 ? RequireInternalSlot (gen , [[GeneratorBrand]] ) を実行する。 gen .[[GeneratorBrand]] が genBrand でない場合、TypeError 例外をスローする。表明 : gen は [[GeneratorContext]] 内部スロットを持つ。state を gen .[[GeneratorState]] とする。state が executing である場合、TypeError 例外をスローする。state を返す。
27.8.3.3 GeneratorResume ( gen , value , genBrand )
抽象操作 GeneratorResume。引数 gen (ECMAScript 言語値 )、value ((ECMAScript 言語値 または empty )) および genBrand ((String または empty ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
state を ? GeneratorValidate (gen , genBrand ) とする。state が completed である場合、CreateIteratorResultObject (undefined , true ) を返す。表明 : state は suspended-start または suspended-yield のいずれかである。genContext を gen .[[GeneratorContext]] とする。gen .[[GeneratorState]] を executing に設定する。? RunSuspendedContext (genContext , NormalCompletion (value )) を返す。
27.8.3.4 GeneratorResumeAbrupt ( gen , abruptCompletion , genBrand )
抽象操作 GeneratorResumeAbrupt。引数 gen (ECMAScript 言語値 )、abruptCompletion ((return 完了 または throw 完了 )) および genBrand ((String または empty ))。戻り値:(正常完了 (値:ECMAScript 言語値 ) または throw 完了 )。 呼び出されると、次の手順を実行する。
state を ? GeneratorValidate (gen , genBrand ) とする。state が suspended-start である場合、gen .[[GeneratorState]] を completed に設定する。注記 : generator が completed 状態に入ると、その状態から離れることはなく、関連付けられた実行コンテキスト が再開されることもない。この時点で gen に関連付けられたすべての実行状態を破棄できる。state を completed に設定する。state が completed である場合、abruptCompletion が return 完了 である場合、CreateIteratorResultObject (abruptCompletion .[[Value]] , true ) を返す。? abruptCompletion を返す。 表明 : state は suspended-yield である。genContext を gen .[[GeneratorContext]] とする。gen .[[GeneratorState]] を executing に設定する。? RunSuspendedContext (genContext , abruptCompletion ) を返す。
27.8.3.5 GetGeneratorKind ( )
抽象操作 GetGeneratorKind。引数なし。戻り値:(non-generator 、sync または async )。 呼び出されると、次の手順を実行する。
genContext を実行中の実行コンテキスト とする。genContext が Generator component を持たない場合、non-generator を返す。gen を genContext の Generator component とする。gen が [[AsyncGeneratorState]] 内部スロットを持つ場合、async を返す。sync を返す。
27.8.3.6 GeneratorYield ( iteratorResult )
抽象操作 GeneratorYield。引数 iteratorResult (an Object that conforms to the IteratorResult interface)。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 呼び出されると、次の手順を実行する。
genContext を実行中の実行コンテキスト とする。表明 : genContext は generator の実行コンテキスト である。gen を genContext の Generator component の値とする。表明 : GetGeneratorKind () は sync である。gen .[[GeneratorState]] を suspended-yield に設定する。? RunCallerContext (iteratorResult ) を返す。
27.8.3.7 Yield ( arg )
抽象操作 Yield。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 呼び出されると、次の手順を実行する。
genKind を GetGeneratorKind () とする。genKind が async である場合、? AsyncGeneratorYield (? Await (arg )) を返す。? GeneratorYield (CreateIteratorResultObject (arg , false )) を返す。
27.8.3.8 CreateIteratorFromClosure ( closure , genBrand , genProto [ , extraSlots ] )
抽象操作 CreateIteratorFromClosure。引数 closure (パラメーターを持たない抽象クロージャ )、genBrand ((String または empty )) および genProto (Object)および省略可能な引数 extraSlots (リスト (要素:内部スロット名))。戻り値:Generator。 呼び出されると、次の手順を実行する。
注記 : closure は IteratorResult オブジェクトを yield するための Yield 操作の使用を含むことができる。extraSlots が存在しない場合、extraSlots を新しい空の List に設定する。internalSlotsList を extraSlots と « [[GeneratorState]] , [[GeneratorContext]] , [[GeneratorBrand]] » のリスト連結 とする。gen を OrdinaryObjectCreate (genProto , internalSlotsList ) とする。gen .[[GeneratorBrand]] を genBrand に設定する。gen .[[GeneratorState]] を suspended-start に設定する。callerContext を実行中の実行コンテキスト とする。calleeContext を新しい実行コンテキスト とする。calleeContext の Function を null に設定する。calleeContext の Realm を現在の Realm Record に設定する。calleeContext の ScriptOrModule を callerContext の ScriptOrModule に設定する。callerContext がまだ一時停止されていない場合、callerContext を一時停止する。calleeContext を実行コンテキストスタック へ push する。calleeContext が実行中の実行コンテキスト になる。GeneratorStart (gen , closure ) を実行する。calleeContext を実行コンテキストスタック から削除し、callerContext を実行中の実行コンテキスト として復元する。gen を返す。
27.9 AsyncGenerator オブジェクト
AsyncGenerator は async generator function を呼び出すことによって作成され、async iterator インターフェイス と async iterable インターフェイス の両方に適合します。
AsyncGenerator インスタンスは、そのインスタンスを作成した async generator function の "prototype" プロパティの初期値から直接プロパティを継承します。AsyncGenerator インスタンスは %AsyncGeneratorPrototype% から間接的にプロパティを継承します。
27.9.1 %AsyncGeneratorPrototype% オブジェクト
%AsyncGeneratorPrototype% オブジェクトは:
%AsyncGeneratorFunction.prototype.prototype% です。
通常オブジェクト です。
AsyncGenerator インスタンスではなく、[[AsyncGeneratorState]] 内部スロットを持ちません。
値が %AsyncIteratorPrototype% である [[Prototype]] 内部スロットを持ちます。
すべての AsyncGenerator インスタンスによって間接的に継承されるプロパティを持ちます。
27.9.1.1 %AsyncGeneratorPrototype%.constructor
%AsyncGeneratorPrototype% .constructor の初期値は %AsyncGeneratorFunction.prototype% です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.9.1.2 %AsyncGeneratorPrototype%.next ( value )
gen を this 値とする。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。result を Completion (AsyncGeneratorValidate (gen , empty )) とする。IfAbruptRejectPromise (result , promiseCapability )。state を gen .[[AsyncGeneratorState]] とする。state が completed である場合、iteratorResult を CreateIteratorResultObject (undefined , true ) とする。! Call (promiseCapability .[[Resolve]] , undefined , « iteratorResult ») を実行する。 promiseCapability .[[Promise]] を返す。completion を NormalCompletion (value ) とする。AsyncGeneratorEnqueue (gen , completion , promiseCapability ) を実行する。state が suspended-start または suspended-yield のいずれかである場合、AsyncGeneratorResume (gen , completion ) を実行する。そうでない場合、表明 : state は executing または draining-queue のいずれかである。 promiseCapability .[[Promise]] を返す。
27.9.1.3 %AsyncGeneratorPrototype%.return ( value )
gen を this 値とする。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。result を Completion (AsyncGeneratorValidate (gen , empty )) とする。IfAbruptRejectPromise (result , promiseCapability )。completion を ReturnCompletion (value ) とする。AsyncGeneratorEnqueue (gen , completion , promiseCapability ) を実行する。state を gen .[[AsyncGeneratorState]] とする。state が suspended-start または completed のいずれかである場合、gen .[[AsyncGeneratorState]] を draining-queue に設定する。AsyncGeneratorAwaitReturn (gen ) を実行する。そうでなく、state が suspended-yield である場合、AsyncGeneratorResume (gen , completion ) を実行する。 そうでない場合、表明 : state は executing または draining-queue のいずれかである。 promiseCapability .[[Promise]] を返す。
27.9.1.4 %AsyncGeneratorPrototype%.throw ( exception )
gen を this 値とする。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。result を Completion (AsyncGeneratorValidate (gen , empty )) とする。IfAbruptRejectPromise (result , promiseCapability )。state を gen .[[AsyncGeneratorState]] とする。state が suspended-start である場合、gen .[[AsyncGeneratorState]] を completed に設定する。state を completed に設定する。state が completed である場合、! Call (promiseCapability .[[Reject]] , undefined , « exception ») を実行する。 promiseCapability .[[Promise]] を返す。completion を ThrowCompletion (exception ) とする。AsyncGeneratorEnqueue (gen , completion , promiseCapability ) を実行する。state が suspended-yield である場合、AsyncGeneratorResume (gen , completion ) を実行する。そうでない場合、表明 : state は executing または draining-queue のいずれかである。 promiseCapability .[[Promise]] を返す。
27.9.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "AsyncGenerator" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.9.2 AsyncGenerator インスタンスのプロパティ
AsyncGenerator インスタンスは、以下で説明される内部スロットを持つ状態で最初に作成されます。
表 95: AsyncGenerator インスタンスの内部スロット
内部スロット
型
説明
[[AsyncGeneratorState]]
suspended-start , suspended-yield , executing , draining-queue , or completed
async generator の現在の実行状態。
[[AsyncGeneratorContext]]
an execution context
この async generator のコードを実行するときに使用される実行コンテキスト 。
[[AsyncGeneratorQueue]]
a List of AsyncGeneratorRequest Records
async generator を再開する要求を表す Record 。状態遷移中を除き、[[AsyncGeneratorState]] が executing または draining-queue のいずれかである場合に限り空ではありません。
[[GeneratorBrand]]
a String or empty
異なる種類の async generator を区別するために使用される brand。ECMAScript ソーステキスト によって宣言された async generator の [[GeneratorBrand]] は常に empty です。
27.9.3 AsyncGenerator の抽象操作
27.9.3.1 AsyncGeneratorRequest Record
AsyncGeneratorRequest は、async generator をどのように再開するべきかについての情報を保存するために使用され、対応する promise を fulfill または reject するための capability を含む Record です。
次のフィールドを持ちます。
表 96: AsyncGeneratorRequest Record のフィールド
27.9.3.2 AsyncGeneratorStart ( gen , genBody )
抽象操作 AsyncGeneratorStart。引数 gen (AsyncGenerator) および genBody ((a FunctionBody Parse Node または パラメーターを持たない抽象クロージャ ))。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : gen .[[AsyncGeneratorState]] は suspended-start である。genContext を実行中の実行コンテキスト とする。genContext の Generator component を gen に設定する。closure を、genBody を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。acGenContext を実行中の実行コンテキスト とする。acGen を acGenContext の Generator component とする。genBody が Parse Node である場合、result を Completion (genBody の Evaluation ) とする。そうでない場合、表明 : genBody はパラメーターを持たない Abstract Closure である。result を Completion (genBody ()) とする。 表明 : ここへ戻ってきた場合、async generator は例外をスローしたか、暗黙または明示的な return のいずれかを実行した。acGenContext を実行コンテキストスタック から削除し、実行コンテキストスタック の先頭にある実行コンテキスト を実行中の実行コンテキスト として復元する。acGen .[[AsyncGeneratorState]] を draining-queue に設定する。result が正常完了 である場合、result を NormalCompletion (undefined ) に設定する。result が return 完了 である場合、result を NormalCompletion (result .[[Value]] ) に設定する。AsyncGeneratorCompleteStep (acGen , result , true ) を実行する。AsyncGeneratorDrainQueue (acGen ) を実行する。callerContext を実行中の実行コンテキスト とする。NormalCompletion (undefined ) を渡して callerContext を再開する。表明 : この手順には決して到達しない。genContext のコード評価状態を、この実行コンテキスト について評価が再開されたとき、closure が引数なしで呼び出されるように設定する。gen .[[AsyncGeneratorContext]] を genContext に設定する。gen .[[AsyncGeneratorQueue]] を新しい空の List に設定する。unused を返す。
27.9.3.3 AsyncGeneratorValidate ( gen , genBrand )
抽象操作 AsyncGeneratorValidate。引数 gen (ECMAScript 言語値 ) および genBrand ((String または empty ))。戻り値:(正常完了 (値:unused ) または throw 完了 )。 呼び出されると、次の手順を実行する。
? RequireInternalSlot (gen , [[AsyncGeneratorContext]] ) を実行する。 ? RequireInternalSlot (gen , [[AsyncGeneratorState]] ) を実行する。 ? RequireInternalSlot (gen , [[AsyncGeneratorQueue]] ) を実行する。 gen .[[GeneratorBrand]] が genBrand でない場合、TypeError 例外をスローする。unused を返す。
27.9.3.4 AsyncGeneratorEnqueue ( gen , completion , promiseCapability )
抽象操作 AsyncGeneratorEnqueue。引数 gen (AsyncGenerator)、completion (完了レコード ) および promiseCapability (PromiseCapabilityレコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
request を AsyncGeneratorRequest { [[Completion]] : completion , [[Capability]] : promiseCapability } とする。request を gen .[[AsyncGeneratorQueue]] に追加する。unused を返す。
27.9.3.5 AsyncGeneratorCompleteStep ( gen , completion , done [ , realm ] )
抽象操作 AsyncGeneratorCompleteStep。引数 gen (AsyncGenerator)、completion (完了レコード ) および done (Boolean)および省略可能な引数 realm (Realmレコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : gen .[[AsyncGeneratorQueue]] は空でない。next を gen .[[AsyncGeneratorQueue]] の最初の要素とする。gen .[[AsyncGeneratorQueue]] から最初の要素を削除する。promiseCapability を next .[[Capability]] とする。value を completion .[[Value]] とする。completion がスロー完了である場合、! Call (promiseCapability .[[Reject]] , undefined , « value ») を実行する。 そうでない場合、表明 : completion は正常完了 である。realm が存在する場合、oldRealm を実行中の実行コンテキスト の Realm とする。実行中の実行コンテキスト の Realm を realm に設定する。iteratorResult を CreateIteratorResultObject (value , done ) とする。実行中の実行コンテキスト の Realm を oldRealm に設定する。そうでない場合、iteratorResult を CreateIteratorResultObject (value , done ) とする。 ! Call (promiseCapability .[[Resolve]] , undefined , « iteratorResult ») を実行する。 unused を返す。
27.9.3.6 AsyncGeneratorResume ( gen , completion )
抽象操作 AsyncGeneratorResume。引数 gen (AsyncGenerator) および completion (完了レコード )。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : gen .[[AsyncGeneratorState]] は suspended-start または suspended-yield のいずれかである。genContext を gen .[[AsyncGeneratorContext]] とする。gen .[[AsyncGeneratorState]] を executing に設定する。! RunSuspendedContext (genContext , completion ) を実行する。 unused を返す。
27.9.3.7 AsyncGeneratorUnwrapYieldResumption ( resumptionValue )
抽象操作 AsyncGeneratorUnwrapYieldResumption。引数 resumptionValue (完了レコード )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 呼び出されると、次の手順を実行する。
resumptionValue が return 完了 でない場合、? resumptionValue を返す。awaited を Completion (Await (resumptionValue .[[Value]] )) とする。awaited がスロー完了である場合、? awaited を返す。表明 : awaited は正常完了 である。ReturnCompletion (awaited .[[Value]] ) を返す。
27.9.3.8 AsyncGeneratorYield ( arg )
抽象操作 AsyncGeneratorYield。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:ECMAScript 言語値 ) または 中途完了)。 呼び出されると、次の手順を実行する。
genContext を実行中の実行コンテキスト とする。表明 : genContext は generator の実行コンテキスト である。gen を genContext の Generator component の値とする。表明 : GetGeneratorKind () は async である。completion を NormalCompletion (arg ) とする。表明 : 実行コンテキストスタック は少なくとも2つの要素を持つ。previousContext を実行コンテキストスタック の上から2番目の要素とする。previousRealm を previousContext の Realm とする。AsyncGeneratorCompleteStep (gen , completion , false , previousRealm ) を実行する。queue を gen .[[AsyncGeneratorQueue]] とする。queue が空でない場合、注記 : 実行は generator を一時停止せずに継続する。toYield を queue の最初の要素とする。resumptionValue を Completion (toYield .[[Completion]] ) とする。? AsyncGeneratorUnwrapYieldResumption (resumptionValue ) を返す。 gen .[[AsyncGeneratorState]] を suspended-yield に設定する。resumptionValue を Completion (RunCallerContext (undefined )) とする。? AsyncGeneratorUnwrapYieldResumption (resumptionValue ) を返す。
27.9.3.9 AsyncGeneratorAwaitReturn ( gen )
抽象操作 AsyncGeneratorAwaitReturn。引数 gen (AsyncGenerator)。戻り値:unused 。 呼び出されると、次の手順を実行する。
表明 : gen .[[AsyncGeneratorState]] は draining-queue である。queue を gen .[[AsyncGeneratorQueue]] とする。表明 : queue は空でない。next を queue の最初の要素とする。completion を Completion (next .[[Completion]] ) とする。表明 : completion は return 完了 である。promiseCompletion を Completion (PromiseResolve (%Promise% , completion .[[Value]] )) とする。promiseCompletion が中断完了 である場合、AsyncGeneratorCompleteStep (gen , promiseCompletion , true ) を実行する。AsyncGeneratorDrainQueue (gen ) を実行する。unused を返す。表明 : promiseCompletion は正常完了 である。promise を promiseCompletion .[[Value]] とする。fulfilledClosure を、gen を捕捉し、パラメーター (value ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。表明 : gen .[[AsyncGeneratorState]] は draining-queue である。result を NormalCompletion (value ) とする。AsyncGeneratorCompleteStep (gen , result , true ) を実行する。AsyncGeneratorDrainQueue (gen ) を実行する。NormalCompletion (undefined ) を返す。onFulfilled を CreateBuiltinFunction (fulfilledClosure , 1, "" , « ») とする。rejectedClosure を、gen を捕捉し、パラメーター (reason ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。表明 : gen .[[AsyncGeneratorState]] は draining-queue である。result を ThrowCompletion (reason ) とする。AsyncGeneratorCompleteStep (gen , result , true ) を実行する。AsyncGeneratorDrainQueue (gen ) を実行する。NormalCompletion (undefined ) を返す。onRejected を CreateBuiltinFunction (rejectedClosure , 1, "" , « ») とする。PerformPromiseThen (promise , onFulfilled , onRejected ) を実行する。unused を返す。
27.9.3.10 AsyncGeneratorDrainQueue ( gen )
抽象操作 AsyncGeneratorDrainQueue。引数 gen (AsyncGenerator)。戻り値:unused 。 return 完了 を保持する AsyncGeneratorRequest に遭遇するまで、generator の AsyncGeneratorQueue を空にしていきます。 呼び出されると、次の手順を実行する。
表明 : gen .[[AsyncGeneratorState]] は draining-queue である。queue を gen .[[AsyncGeneratorQueue]] とする。queue が空でない間、次を繰り返す。next を queue の最初の要素とする。completion を Completion (next .[[Completion]] ) とする。completion が return 完了 である場合、AsyncGeneratorAwaitReturn (gen ) を実行する。unused を返す。completion が正常完了 である場合、completion を NormalCompletion (undefined ) に設定する。AsyncGeneratorCompleteStep (gen , completion , true ) を実行する。gen .[[AsyncGeneratorState]] を completed に設定する。unused を返す。
27.10 AsyncFunction オブジェクト
AsyncFunction は通常、AsyncFunctionDeclaration 、AsyncFunctionExpression 、AsyncMethod 、および AsyncArrowFunction を評価することによって作成される関数です。%AsyncFunction% intrinsic を呼び出すことによって作成することもできます。
27.10.1 AsyncFunction コンストラクター
AsyncFunction コンストラクター は:
%AsyncFunction% です。
Function のサブクラスです。
コンストラクター としてではなく関数として呼び出されたとき、新しい AsyncFunction を作成して初期化します。したがって、関数呼出し AsyncFunction(…) は、同じ引数を持つオブジェクト作成式 new AsyncFunction(…) と等価です。
クラス定義の extends 節の値として使用できます。規定された AsyncFunction の動作を継承しようとするサブクラスコンストラクター は、組込み async function の動作に必要な内部スロットを持つサブクラスインスタンスを作成して初期化するため、AsyncFunction コンストラクター への super 呼出しを含まなければなりません。async function オブジェクトを定義するすべての ECMAScript 構文形式は AsyncFunction の直接インスタンスを作成します。AsyncFunction サブクラスのインスタンスを作成する構文上の手段はありません。
27.10.1.1 AsyncFunction ( ...paramArgs , bodyArg )
最後の引数(存在する場合)は async function の本体(実行可能コード)を指定します。それより前の引数は仮引数を指定します。
この関数は呼び出されたとき、次の手順を実行します。
activeFunc をアクティブな関数オブジェクト とする。bodyArg が存在しない場合、bodyArg を空の String に設定する。? CreateDynamicFunction (activeFunc , NewTarget, async , paramArgs , bodyArg ) を返す。
注
27.10.2 AsyncFunction コンストラクターのプロパティ
AsyncFunction コンストラクター は:
Function コンストラクター から継承する標準組込み関数オブジェクト です。
値が %Function% である [[Prototype]] 内部スロットを持ちます。
値が 1 𝔽 である "length" プロパティを持ちます。
値が "AsyncFunction" である "name" プロパティを持ちます。
次のプロパティを持ちます。
27.10.2.1 AsyncFunction.prototype
AsyncFunction.prototype の初期値は AsyncFunction prototype オブジェクト です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
27.10.3 AsyncFunction Prototype オブジェクトのプロパティ
AsyncFunction prototype オブジェクト は:
27.10.3.1 AsyncFunction.prototype.constructor
AsyncFunction.prototype.constructor の初期値は %AsyncFunction% です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.10.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "AsyncFunction" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
27.10.4 AsyncFunction インスタンス
すべての AsyncFunction インスタンスは ECMAScript 関数オブジェクト であり、表 26 に列挙される内部スロットを持ちます。そのようなすべてのインスタンスについて、[[IsClassConstructor]] 内部スロットの値は false です。AsyncFunction インスタンスはコンストラクター ではなく、[[Construct]] 内部メソッドを持ちません。AsyncFunction インスタンスは constructable ではないため、prototype プロパティを持ちません。
各 AsyncFunction インスタンスは次の own プロパティを持ちます。
27.10.4.1 length
20.2.4.1 で与えられる Function インスタンスの "length" プロパティの仕様は、AsyncFunction インスタンスにも適用されます。
27.10.4.2 name
20.2.4.2 で与えられる Function インスタンスの "name" プロパティの仕様は、AsyncFunction インスタンスにも適用されます。
27.10.5 Async Function の抽象操作
27.10.5.1 AsyncFunctionStart ( promiseCapability , asyncFuncBody )
抽象操作 AsyncFunctionStart。引数 promiseCapability (PromiseCapabilityレコード ) および asyncFuncBody ((a FunctionBody Parse Node 、an ExpressionBody Parse Node または パラメーターを持たない抽象クロージャ ))。戻り値:unused 。 呼び出されると、次の手順を実行する。
runningContext を実行中の実行コンテキスト とする。asyncContext を runningContext のコピーとする。注記 : 実行状態をコピーすることは、AsyncBlockStart がその実行を再開するために必要である。現在実行中のコンテキストを再開することは定義不十分である。AsyncBlockStart (promiseCapability , asyncFuncBody , asyncContext ) を実行する。unused を返す。
27.10.5.2 AsyncBlockStart ( promiseCapability , asyncBody , asyncContext )
抽象操作 AsyncBlockStart。引数 promiseCapability (PromiseCapabilityレコード )、asyncBody ((構文解析ノード または パラメーターを持たない抽象クロージャ )) および asyncContext (実行コンテキスト )。戻り値:unused 。 呼び出されると、次の手順を実行する。
closure を、promiseCapability と asyncBody を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。acAsyncContext を実行中の実行コンテキスト とする。asyncBody が Parse Node である場合、result を Completion (asyncBody の Evaluation ) とする。そうでない場合、表明 : asyncBody はパラメーターを持たない Abstract Closure である。result を Completion (asyncBody ()) とする。 表明 : ここへ戻ってきた場合、async function は例外をスローしたか、暗黙または明示的な return を実行した。すべての await は完了している。acAsyncContext を実行コンテキストスタック から削除し、実行コンテキストスタック の先頭にある実行コンテキスト を実行中の実行コンテキスト として復元する。result が正常完了 である場合、! Call (promiseCapability .[[Resolve]] , undefined , « undefined ») を実行する。 そうでなく、result が return 完了 である場合、! Call (promiseCapability .[[Resolve]] , undefined , « result .[[Value]] ») を実行する。 そうでない場合、表明 : result はスロー完了である。! Call (promiseCapability .[[Reject]] , undefined , « result .[[Value]] ») を実行する。 callerContext を実行中の実行コンテキスト とする。NormalCompletion (unused ) を渡して callerContext を再開する。表明 : この手順には決して到達しない。asyncContext のコード評価状態を、この実行コンテキスト について評価が再開されたとき、closure が引数なしで呼び出されるように設定する。result を ! RunSuspendedContext (asyncContext , NormalCompletion (empty )) とする。表明 : result は unused である。注記 : result 値の可能な発生源は Await 、または async function が何も await しない場合は上記の手順 1.j である。unused を返す。
27.10.5.3 Await ( arg )
抽象操作 Await。引数 arg (ECMAScript 言語値 )。戻り値:(正常完了 (値:(ECMAScript 言語値 または empty )) または throw 完了 )。 呼び出されると、次の手順を実行する。
asyncContext を実行中の実行コンテキスト とする。promise を ? PromiseResolve (%Promise% , arg ) とする。fulfilledClosure を、asyncContext を捕捉し、パラメーター (value ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。Completion (RunSuspendedContext (asyncContext , NormalCompletion (value ))) を実行する。注記 : RunSuspendedContext が返す Completion Record は意図的に無視される。NormalCompletion (undefined ) を返す。onFulfilled を CreateBuiltinFunction (fulfilledClosure , 1, "" , « ») とする。rejectedClosure を、asyncContext を捕捉し、パラメーター (reason ) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。Completion (RunSuspendedContext (asyncContext , ThrowCompletion (reason ))) を実行する。注記 : RunSuspendedContext が返す Completion Record は意図的に無視される。NormalCompletion (undefined ) を返す。onRejected を CreateBuiltinFunction (rejectedClosure , 1, "" , « ») とする。PerformPromiseThen (promise , onFulfilled , onRejected ) を実行する。? RunCallerContext (empty ) を返す。
28 リフレクション
28.1 Reflect オブジェクト
Reflect オブジェクトは:
28.1.1 Reflect.apply ( target , thisArg , args )
この関数は呼び出されたとき、次の手順を実行します。
IsCallable (target ) が false である場合、TypeError 例外をスローする。argList を ? CreateListFromArrayLike (args ) とする。PrepareForTailCall () を実行する。? Call (target , thisArg , argList ) を返す。
28.1.2 Reflect.construct ( target , args [ , newTarget ] )
この関数は呼び出されたとき、次の手順を実行します。
IsConstructor (target ) が false である場合、TypeError 例外をスローする。newTarget が存在しない場合、newTarget を target に設定する。そうでなく、IsConstructor (newTarget ) が false である場合、TypeError 例外をスローする。 argList を ? CreateListFromArrayLike (args ) とする。? Construct (target , argList , newTarget ) を返す。
28.1.3 Reflect.defineProperty ( target , key , attrs )
この関数は呼び出されたとき、次の手順を実行します。
target が Object でない場合、TypeError 例外をスローする。propertyKey を ? ToPropertyKey (key ) とする。propertyDesc を ? ToPropertyDescriptor (attrs ) とする。? target .[[DefineOwnProperty]] (propertyKey , propertyDesc ) を返す。
28.1.4 Reflect.deleteProperty ( target , key )
この関数は呼び出されたとき、次の手順を実行します。
target が Object でない場合、TypeError 例外をスローする。propertyKey を ? ToPropertyKey (key ) とする。? target .[[Delete]] (propertyKey ) を返す。
28.1.5 Reflect.get ( target , key [ , receiver ] )
この関数は呼び出されたとき、次の手順を実行します。
target が Object でない場合、TypeError 例外をスローする。propertyKey を ? ToPropertyKey (key ) とする。receiver が存在しない場合、receiver を target に設定する。? target .[[Get]] (propertyKey , receiver ) を返す。
28.1.6 Reflect.getOwnPropertyDescriptor ( target , key )
この関数は呼び出されたとき、次の手順を実行します。
target が Object でない場合、TypeError 例外をスローする。propertyKey を ? ToPropertyKey (key ) とする。propertyDesc を ? target .[[GetOwnProperty]] (propertyKey ) とする。FromPropertyDescriptor (propertyDesc ) を返す。
28.1.7 Reflect.getPrototypeOf ( target )
この関数は呼び出されたとき、次の手順を実行します。
target が Object でない場合、TypeError 例外をスローする。? target .[[GetPrototypeOf]] () を返す。
28.1.8 Reflect.has ( target , key )
この関数は呼び出されたとき、次の手順を実行します。
target が Object でない場合、TypeError 例外をスローする。propertyKey を ? ToPropertyKey (key ) とする。? target .[[HasProperty]] (propertyKey ) を返す。
28.1.9 Reflect.isExtensible ( target )
この関数は呼び出されたとき、次の手順を実行します。
target が Object でない場合、TypeError 例外をスローする。? target .[[IsExtensible]] () を返す。
28.1.10 Reflect.ownKeys ( target )
この関数は呼び出されたとき、次の手順を実行します。
target が Object でない場合、TypeError 例外をスローする。keys を ? target .[[OwnPropertyKeys]] () とする。CreateArrayFromList (keys ) を返す。
28.1.11 Reflect.preventExtensions ( target )
この関数は呼び出されたとき、次の手順を実行します。
target が Object でない場合、TypeError 例外をスローする。? target .[[PreventExtensions]] () を返す。
28.1.12 Reflect.set ( target , key , value [ , receiver ] )
この関数は呼び出されたとき、次の手順を実行します。
target が Object でない場合、TypeError 例外をスローする。propertyKey を ? ToPropertyKey (key ) とする。receiver が存在しない場合、receiver を target に設定する。? target .[[Set]] (propertyKey , value , receiver ) を返す。
28.1.13 Reflect.setPrototypeOf ( target , proto )
この関数は呼び出されたとき、次の手順を実行します。
target が Object でない場合、TypeError 例外をスローする。proto が Object でなく、かつ proto が null でない場合、TypeError 例外をスローする。? target .[[SetPrototypeOf]] (proto ) を返す。
28.1.14 Reflect [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は String 値 "Reflect" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持ちます。
28.2 Proxy オブジェクト
28.2.1 Proxy コンストラクター
Proxy コンストラクター は:
%Proxy% です。
グローバルオブジェクト の "Proxy" プロパティの初期値です。
コンストラクター として呼び出されたとき、新しい Proxy オブジェクトを作成して初期化します。
関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローします。
28.2.1.1 Proxy ( target , handler )
この関数は呼び出されたとき、次の手順を実行します。
NewTarget が undefined である場合、TypeError 例外をスローする。 ? ProxyCreate (target , handler ) を返す。
28.2.2 Proxy コンストラクターのプロパティ
Proxy コンストラクター は:
値が %Function.prototype% である [[Prototype]] 内部スロットを持ちます。
Proxy オブジェクトは初期化を必要とする [[Prototype]] 内部スロットを持たないため、"prototype" プロパティを持ちません。
次のプロパティを持ちます。
28.2.2.1 Proxy.revocable ( target , handler )
この関数は revoke 可能な Proxy オブジェクトを作成します。
呼び出されたとき、次の手順を実行します。
proxy を ? ProxyCreate (target , handler ) とする。revokerClosure を、何も捕捉せず、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。activeFunc をアクティブな関数オブジェクト とする。revocableProxy を activeFunc .[[RevocableProxy]] とする。revocableProxy が null である場合、NormalCompletion (undefined ) を返す。activeFunc .[[RevocableProxy]] を null に設定する。表明 : revocableProxy は Proxy 特殊オブジェクト である。revocableProxy .[[ProxyTarget]] を null に設定する。revocableProxy .[[ProxyHandler]] を null に設定する。NormalCompletion (undefined ) を返す。revoker を CreateBuiltinFunction (revokerClosure , 0, "" , « [[RevocableProxy]] ») とする。revoker .[[RevocableProxy]] を proxy に設定する。result を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (result , "proxy" , proxy ) を実行する。 ! CreateDataPropertyOrThrow (result , "revoke" , revoker ) を実行する。 result を返す。
28.3 Module Namespace オブジェクト
Module Namespace Object は、モジュールがエクスポートした束縛への実行時のプロパティベースのアクセスを提供する module namespace 特殊オブジェクト です。Module Namespace Object にはコンストラクター 関数はありません。代わりに、NameSpaceImport を含む ImportDeclaration によってインポートされる各モジュールについて、そのようなオブジェクトが作成されます。
10.4.6 で指定されるプロパティに加えて、各 Module Namespace Object は次の own プロパティを持ちます。
28.3.1 %Symbol.toStringTag%
%Symbol.toStringTag% プロパティの初期値は String 値 "Module" です。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持ちます。
29 メモリモデル
メモリ一貫性モデル、またはメモリモデル は、SharedArrayBuffer を基盤とする TypedArray インスタンスへのアクセス、および Atomics オブジェクトのメソッドを介して発生する Shared Data Block イベント の取り得る順序を規定します。プログラムにデータ競合 (以下で定義)がない場合、イベントの順序は逐次一貫しているように見えます。すなわち、各 agent の動作を交互に配置したものとして見えます。プログラムにデータ競合 がある場合、共有メモリ操作は逐次一貫していないように見えることがあります。たとえば、プログラムが因果関係に反する動作やその他の驚くべき動作を示す場合があります。これらの驚くべき動作は、コンパイラー変換や CPU の設計(たとえばアウト・オブ・オーダー実行や投機実行)から生じます。メモリモデルは、プログラムが逐次一貫した動作を示す正確な条件と、データ競合 から読み取られ得る値の両方を定義します。つまり、未定義動作はありません。
メモリモデルは、評価中に SharedArrayBuffer 上の抽象操作 または Atomics オブジェクトのメソッドによって導入される Memory イベント に対する関係制約として定義されます。
注
この節では、SharedArrayBuffer 上の抽象操作 によって導入される Memory イベント について公理的モデルを提供します。このモデルは、この仕様の他の部分とは異なり、アルゴリズムとして表現できないことを強調しておく必要があります。抽象操作 によるイベントの非決定的な導入が、ECMAScript 評価の操作的意味論とメモリモデルの公理的意味論とのインターフェイスになります。これらのイベントの意味論は、1回の評価におけるすべてのイベントのグラフを考慮することで定義されます。これらは静的意味論 でも実行時意味論 でもありません。実証されたアルゴリズム実装は存在せず、代わりに特定のイベントグラフが許可されるか許可されないかを決定する一連の制約があります。
29.1 メモリモデルの基礎
共有メモリアクセス(読み取りおよび書き込み)は、以下で定義する atomic アクセスと data アクセスの2つのグループに分けられます。Atomic アクセスは逐次一貫しており、すなわち agent cluster 内のすべての agent が合意するイベントの厳密な全順序があります。非 atomic アクセスには、すべての agent が合意する厳密な全順序はなく、すなわち順序付けされていません。
注 1
release-acquire のような、逐次一貫性より弱く unordered より強い順序付けはサポートされません。
Shared Data Block イベント は、ReadSharedMemory 、WriteSharedMemory 、または ReadModifyWriteSharedMemory Record のいずれかです。read イベント は ReadSharedMemory または ReadModifyWriteSharedMemory のいずれかです。write イベント は WriteSharedMemory または ReadModifyWriteSharedMemory のいずれかです。
表 97: ReadSharedMemory イベントのフィールド
フィールド名
値
意味
[[Order]]
seq-cst or unordered
イベントについてメモリモデル によって保証される最も弱い順序付け。
[[NoTear]]
a Boolean
このイベントと等しいメモリ範囲 を持つ複数の write イベント から、このイベントが読み取ることを許可されるかどうか。
[[Block]]
a Shared Data Block
イベントが操作するブロック。
[[ByteIndex]]
a non-negative integer
[[Block]] 内の読み取りのバイトアドレス。
[[ElementSize]]
a non-negative integer
読み取りのサイズ。
表 98: WriteSharedMemory イベントのフィールド
フィールド名
値
意味
[[Order]]
seq-cst , unordered , or init
イベントについてメモリモデル によって保証される最も弱い順序付け。
[[NoTear]]
a Boolean
このイベントと等しいメモリ範囲 を持つ複数の read イベント から、このイベントが読み取られることを許可されるかどうか。
[[Block]]
a Shared Data Block
イベントが操作するブロック。
[[ByteIndex]]
a non-negative integer
[[Block]] 内の書き込みのバイトアドレス。
[[ElementSize]]
a non-negative integer
書き込みのサイズ。
[[Payload]]
a List of byte values
他のイベントによって読み取られるバイト値 の List 。
表 99: ReadModifyWriteSharedMemory イベントのフィールド
Shared Data Block イベントは、抽象操作 または Atomics オブジェクトのメソッドによって候補実行 の Agent Events Record に導入されます。一部の操作は、フィールドを持たず、他のイベントの許可される順序を直接制約するためだけに存在する Synchronize イベント も導入します。そして最後に、ホスト 固有のイベントがあります。Memory イベント は、Shared Data Block イベント、Synchronize イベント、またはそのようなホスト 固有イベントのいずれかです。
Shared Data Block イベント e のメモリ範囲 を、e .[[ByteIndex]] (含む)から e .[[ByteIndex]] + e .[[ElementSize]] (含まない)までの区間 内のすべての整数 の Set とします。2つのイベントの [[Block]] 、[[ByteIndex]] 、および [[ElementSize]] が同じ場合、それらのイベントのメモリ範囲は等しいものとします。2つのイベントの [[Block]] が同じで、範囲が等しくなく、かつその積集合が空でない場合、それらのイベントのメモリ範囲は重なっているものとします。2つのイベントの [[Block]] が同じでないか、またはその範囲が等しくも重なってもいない場合、それらのイベントのメモリ範囲は互いに素であるものとします。
注 2
考慮されるべきホスト 固有の同期イベントの例としては、SharedArrayBuffer をある agent から別の agent へ送信すること(たとえばブラウザーでの postMessage)、agent の開始と停止、および共有メモリ以外のチャネルを介した agent cluster 内の通信があります。特定の実行 execution について、これらのイベントは host-synchronizes-with 厳密半順序 を介してホスト から提供されます。さらに、ホスト は is-agent-order-before Relation に参加させるため、ホスト 固有の同期イベントを execution .[[EventList]] に追加できます。
イベントは、以下で定義される関係によって候補実行 内で順序付けされます。
29.2 Agent Events Record
Agent Events Record は次のフィールドを持つ Record です。
表 100: Agent Events Record のフィールド
フィールド名
値
意味
[[AgentSignifier]]
an agent signifier
その評価によってこの順序付けが生じた agent。
[[EventList]]
a List of Memory events
イベントは評価中にこの List へ追加されます。
[[AgentSynchronizesWith]]
a List of pairs of Synchronize events
操作的意味論によって導入される Synchronize 関係。
29.3 Chosen Value Record
Chosen Value Record は次のフィールドを持つ Record です。
表 101: Chosen Value Record のフィールド
29.4 候補実行
agent cluster の評価の候補実行 は、次のフィールドを持つ Record です。
表 102: 候補実行 Record のフィールド
空の候補実行 とは、そのフィールドが空の List である候補実行 Record です。
29.5 メモリモデルのための抽象操作
29.5.1 EventSet ( execution )
抽象操作 EventSet。引数 execution (a candidate execution)。戻り値:a Set of Memory events 。 呼び出されると、次の手順を実行する。
events を空の Set とする。execution .[[EventsRecords]] の各 Agent Events Record eventsRecord について、次を行う。eventsRecord .[[EventList]] の各 Memory event event について、次を行う。event を events に追加する。events を返す。
29.5.2 SharedDataBlockEventSet ( execution )
抽象操作 SharedDataBlockEventSet。引数 execution (a candidate execution)。戻り値:a Set of Shared Data Block events 。 呼び出されると、次の手順を実行する。
events を空の Set とする。EventSet (execution ) の各 Memory event event について、次を行う。event が Shared Data Block event である場合、event を events に追加する。events を返す。
29.5.3 HostEventSet ( execution )
抽象操作 HostEventSet。引数 execution (a candidate execution)。戻り値:a Set of Memory events 。 呼び出されると、次の手順を実行する。
EventSet (execution ) の要素のうち SharedDataBlockEventSet (execution ) に含まれないすべての要素を含む新しい Set を返す。
29.5.4 ComposeWriteEventBytes ( execution , byteIndex , writes )
抽象操作 ComposeWriteEventBytes。引数 execution (a candidate execution)、byteIndex (非負整数) および writes (リスト (要素:(WriteSharedMemory または ReadModifyWriteSharedMemory events)))。戻り値:リスト (要素:バイト値 )。 呼び出されると、次の手順を実行する。
byteLocation を byteIndex とする。bytesRead を新しい空の List とする。writes の各要素 writeEvent について、次を行う。表明 : writeEvent のメモリ範囲 には byteLocation が含まれる。payloadIndex を byteLocation - writeEvent .[[ByteIndex]] とする。writeEvent が WriteSharedMemory event である場合、byte を writeEvent .[[Payload]] [payloadIndex ] とする。そうでない場合、表明 : writeEvent は ReadModifyWriteSharedMemory event である。bytes を ValueOfReadEvent (execution , writeEvent ) とする。bytesModified を writeEvent .[[ModifyOp]] (bytes , writeEvent .[[Payload]] ) とする。byte を bytesModified [payloadIndex ] とする。 byte を bytesRead に追加する。byteLocation を byteLocation + 1 に設定する。bytesRead を返す。
注 1
read-modify-write の変更 [[ModifyOp]] は、ReadModifyWriteSharedMemory イベントを導入する Atomics オブジェクト上の関数プロパティによって与えられます。
注 2
29.5.5 ValueOfReadEvent ( execution , readEvent )
抽象操作 ValueOfReadEvent。引数 execution (a candidate execution) および readEvent ((a ReadSharedMemory または ReadModifyWriteSharedMemory event))。戻り値:リスト (要素:バイト値 )。 呼び出されると、次の手順を実行する。
writes を execution における reads-bytes-from (readEvent ) とする。表明 : writes は、長さが readEvent .[[ElementSize]] と等しい WriteSharedMemory または ReadModifyWriteSharedMemory イベントの List である。ComposeWriteEventBytes (execution , readEvent .[[ByteIndex]] , writes ) を返す。
29.6 候補実行の関係
次の関係および数学関数は、特定の候補実行 をパラメーターとして取り、その Memory イベント を順序付けます。
29.6.1 is-agent-order-before
候補実行 execution について、その is-agent-order-before Relation は、次を満たす Memory イベント 上の最小の Relation です。
イベント eventA および eventB について、execution .[[EventsRecords]] 内に eventA と eventB の両方を含む [[EventList]] を持つ Agent Events Record eventsRecord が存在し、eventsRecord .[[EventList]] の List 順序で eventA が eventB より前にある場合、execution において eventA is-agent-order-before eventB です。
注
各 agent は、評価中に agent ごとの厳密な全順序でイベントを導入します。これは、それらの厳密な全順序の和集合です。
29.6.2 reads-bytes-from
候補実行 execution について、その reads-bytes-from 関数は、SharedDataBlockEventSet (execution ) 内の Memory イベント を SharedDataBlockEventSet (execution ) 内のイベントの List に写像し、次の条件を満たす数学関数です。
候補実行 は常に reads-bytes-from 関数を認めます。
29.6.3 reads-from
候補実行 execution について、その reads-from Relation は、次を満たす Memory イベント 上の最小の Relation です。
イベント readEvent および writeEvent について、SharedDataBlockEventSet (execution ) が readEvent と writeEvent の両方を含み、かつ execution における reads-bytes-from (readEvent ) が writeEvent を含む場合、execution において readEvent reads-from writeEvent です。
29.6.4 host-synchronizes-with
候補実行 execution について、その host-synchronizes-with Relation は、ホスト 固有の Memory イベント 上のホスト 提供の厳密半順序 であり、少なくとも次を満たします。
execution において eventA host-synchronizes-with eventB である場合、HostEventSet (execution ) は eventA と eventB を含みます。
execution における host-synchronizes-with と is-agent-order-before の和集合には循環がありません。
注 1
候補実行 execution 内の2つのホスト 固有イベント eventA および eventB について、execution における eventA host-synchronizes-with eventB は、execution における eventA happens-before eventB を意味します。
注 2
この Relation により、ホスト は HTML worker 間の postMessage などの追加の同期機構を提供できます。
29.6.5 synchronizes-with
候補実行 execution について、その synchronizes-with Relation は、次を満たす Memory イベント 上の最小の Relation です。
イベント readEvent および writeEvent について、execution において readEvent reads-from writeEvent であり、readEvent .[[Order]] が seq-cst 、writeEvent .[[Order]] が seq-cst 、かつ readEvent と writeEvent のメモリ範囲 が等しい場合、execution において writeEvent synchronizes-with readEvent です。
execution .[[EventsRecords]] の各要素 eventsRecord について、次が成り立ちます。
イベント eventA および eventB について、eventsRecord .[[AgentSynchronizesWith]] が (eventA , eventB ) を含む場合、execution において eventA synchronizes-with eventB です。
イベント eventA および eventB について、execution において eventA host-synchronizes-with eventB である場合、execution において eventA synchronizes-with eventB です。
注 1
メモリモデル 文献における慣例により、候補実行 execution では、read イベント synchronizes-with write イベント ではなく、write イベント synchronizes-with read イベント となります。
注 2
候補実行 execution では、init イベントはこの Relation に参加せず、代わりに happens-before によって直接制約されます。
注 3
候補実行 execution では、reads-from によって関連付けられるすべての seq-cst イベントが synchronizes-with によって関連付けられるわけではありません。メモリ範囲 も等しいイベントだけが synchronizes-with によって関連付けられます。
注 4
候補実行 execution 内の Shared Data Block イベント readEvent および writeEvent について、writeEvent synchronizes-with readEvent である場合でも、readEvent は writeEvent 以外の write から reads-from する場合があります。
29.6.6 happens-before
候補実行 execution について、その happens-before Relation は、次を満たす Memory イベント 上の最小の Relation です。
注
happens-before は agent-order の上位集合であるため、候補実行 は ECMAScript の単一スレッド評価意味論と一貫しています。
29.7 有効な実行の性質
29.7.1 有効な Chosen Read
候補実行 execution は、次のアルゴリズムが true を返す場合、有効な chosen read を持ちます。
SharedDataBlockEventSet (execution ) の各 ReadSharedMemory または ReadModifyWriteSharedMemory イベント readEvent について、次を行う。chosenValueRecord を、その [[Event]] フィールドが readEvent である execution .[[ChosenValues]] の要素とする。chosenValue を chosenValueRecord .[[ChosenValue]] とする。readValue を ValueOfReadEvent (execution , readEvent ) とする。chosenLength を chosenValue の要素数とする。readLength を readValue の要素数とする。chosenLength ≠ readLength である場合、false を返す。0(含む)から chosenLength (含まない)までの区間 内のある整数 i について chosenValue [i ] ≠ readValue [i ] である場合、false を返す。 true を返す。
29.7.2 一貫した Read
候補実行 execution は、次のアルゴリズムが true を返す場合、一貫した read を持ちます。
SharedDataBlockEventSet (execution ) の各 ReadSharedMemory または ReadModifyWriteSharedMemory イベント readEvent について、次を行う。writes を execution における reads-bytes-from (readEvent ) とする。byteLocation を readEvent .[[ByteIndex]] とする。writes の各要素 writeEvent について、次を行う。execution において readEvent happens-before writeEvent である場合、false を返す。byteLocation をメモリ範囲 に含み、execution において writeEvent happens-before value かつ value happens-before readEvent となる WriteSharedMemory または ReadModifyWriteSharedMemory イベント value が存在する場合、false を返す。byteLocation を byteLocation + 1 に設定する。true を返す。
29.7.3 Tear しない Read
候補実行 execution は、次のアルゴリズムが true を返す場合、tear しない read を持ちます。
SharedDataBlockEventSet (execution ) の各 ReadSharedMemory または ReadModifyWriteSharedMemory イベント readEvent について、次を行う。readEvent .[[NoTear]] が true である場合、表明 : readEvent .[[ByteIndex]] を readEvent .[[ElementSize]] で除算した余りは 0 である。execution において readEvent reads-from writeEvent かつ writeEvent .[[NoTear]] が true となる各 Memory event writeEvent について、次を行う。readEvent と writeEvent のメモリ範囲 が等しく、value と writeEvent のメモリ範囲 が等しく、value .[[NoTear]] が true 、writeEvent と value が同じ Shared Data Block event ではなく、かつ execution において readEvent reads-from value となる Memory event value が存在する場合、false を返す。true を返す。
注
Shared Data Block イベント の [[NoTear]] フィールドは、そのイベントが整数 TypedArray へのアクセスによって導入された場合は true 、浮動小数点 TypedArray または DataView へのアクセスによって導入された場合は false です。
直感的には、この要件は、整数 TypedArray を介してメモリ範囲 へアラインされた方法でアクセスする場合、等しい範囲を持つ他の write イベント とのデータ競合 において、その範囲上の単一の write イベント が「勝たなければならない」ことを意味します。より正確には、この要件は、アラインされた read イベント が、すべて等しい範囲を持つ複数の異なる write イベント からのバイトで構成された値を読み取ることはできないことを意味します。ただし、アラインされた read イベント が、重なり合う範囲を持つ複数の write イベント から読み取ることは可能です。
29.7.4 逐次一貫した Atomic
候補実行 execution について、is-memory-order-before は、EventSet (execution ) 内のすべての Memory イベント の厳密な全順序であり、次を満たします。
候補実行 は、is-memory-order-before Relation を認める場合、逐次一貫した atomic を持ちます。
注 3
is-memory-order-before は EventSet (execution ) 内のすべてのイベントを含みますが、execution における happens-before または synchronizes-with によって制約されないイベントは、その順序の任意の位置で発生することが許可されます。
29.7.5 有効な実行
候補実行 execution は、次のすべてが真である場合、有効な実行(または単に実行)です。
すべてのプログラムは少なくとも1つの有効な実行を持ちます。
29.8 競合
SharedDataBlockEventSet (execution ) に含まれる実行 execution とイベント eventA および eventB について、次のアルゴリズムが true を返す場合、eventA と eventB は競合 しています。
eventA と eventB が同じ Shared Data Block event でない場合、execution において eventA happens-before eventB と eventB happens-before eventA の両方が成り立つわけではない場合、eventA が WriteSharedMemory または ReadModifyWriteSharedMemory イベントのいずれかであり、eventB が WriteSharedMemory または ReadModifyWriteSharedMemory イベントのいずれかであり、かつ eventA と eventB のメモリ範囲 が互いに素でない場合、true を返す。execution において eventA reads-from eventB または eventB reads-from eventA である場合、true を返す。false を返す。
29.9 データ競合
SharedDataBlockEventSet (execution ) に含まれる実行 execution とイベント eventA および eventB について、次のアルゴリズムが true を返す場合、eventA と eventB はデータ競合 しています。
execution において eventA と eventB が race にある場合、eventA .[[Order]] が seq-cst でないか、または eventB .[[Order]] が seq-cst でない場合、true を返す。eventA と eventB のメモリ範囲 が重なっている場合、true を返す。false を返す。
29.10 データ競合からの自由
実行 execution は、SharedDataBlockEventSet (execution ) 内にデータ競合 する2つのイベントが存在しない場合、データ競合がない ものとします。
プログラムは、そのすべての実行にデータ競合がない場合、データ競合 がありません。
メモリモデル は、データ競合 のないプログラムについて、すべてのイベントの逐次一貫性を保証します。
29.11 共有メモリのガイドライン
注 1
以下は、共有メモリを扱う ECMAScript プログラマー向けのガイドラインです。
プログラムをデータ競合 のない状態に保つ、すなわち同じメモリ位置に対する非 atomic 操作が同時に行われることを不可能にすることを推奨します。データ競合 のないプログラムは、各 agent の評価意味論における各手順が互いに交互に配置される interleaving semantics を持ちます。データ競合 のないプログラムでは、メモリモデル の詳細を理解する必要はありません。その詳細を理解しても、ECMAScript をより適切に記述するのに役立つ直感が得られる可能性は低いでしょう。
より一般的には、プログラムにデータ競合 があっても、atomic 操作がいずれのデータ競合 にも関与せず、競合 する操作がすべて同じアクセスサイズを持つ限り、予測可能な動作を持つことがあります。atomic が競合 に関与しないようにする最も単純な方法は、atomic 操作と非 atomic 操作で異なるメモリセルを使用し、異なるサイズの atomic アクセスが同時に同じセルへアクセスしないようにすることです。実質的には、プログラムは共有メモリを可能な限り強く型付けされたものとして扱うべきです。それでも競合 する非 atomic アクセスの順序やタイミングに依存することはできませんが、メモリを強く型付けされたものとして扱えば、競合 するアクセスが「tear」することはありません(それらの値のビットが混在することはありません)。
注 2
以下は、共有メモリを使用するプログラム向けにコンパイラー変換を記述する ECMAScript 実装者向けのガイドラインです。
各 agent の性能を単一 agent 環境と同等に良好に保つため、単一 agent 環境で有効なほとんどのプログラム変換を複数 agent 環境でも許可することが望まれます。多くの場合、これらの変換を判断することは困難です。ここでは、規範的なものとして扱われることを意図した(すなわちメモリモデル によって含意されるか、メモリモデル が含意するものより強い)が、おそらく網羅的ではないプログラム変換に関するいくつかの規則を概説します。これらの規則は、is-agent-order-before Relation を構成する Memory イベント が導入される前のプログラム変換に適用されることを意図しています。
agent-order slice を、単一 agent に関係する is-agent-order-before Relation の部分集合とします。
read イベント の可能な read 値 を、すべての有効な実行にわたるそのイベントの ValueOfReadEvent のすべての値の集合とします。
共有メモリがない場合に有効な agent-order slice の変換は、次の例外を除き、共有メモリが存在する場合にも有効です。
Atomic は不変である : プログラム変換は、[[Order]] が seq-cst である Shared Data Block イベント を is-agent-order-before Relation から削除させてはならず、それらを互いに対して並べ替えてはならず、また agent-order slice 内で [[Order]] が unordered であるイベントに対して並べ替えてはなりません。
(実際には、この並べ替え禁止により、コンパイラーはすべての seq-cst 操作が同期であり、最終的な is-memory-order-before Relation に含まれると仮定することを強制されます。これは agent 間のプログラム解析がない場合には、いずれにせよ通常仮定しなければならないことです。また、callee の memory-order への影響が不明なすべての呼出しが seq-cst 操作を含み得ると仮定することも強制されます。)
Read は安定していなければならない : 任意の共有メモリ read は、1回の実行において単一の値だけを観測しなければなりません。
(たとえば、プログラム内で意味論的には単一の read であるものが複数回実行された場合、その後プログラムが観測できるのは読み取られた値のうち1つだけです。rematerialization と呼ばれる変換はこの規則に違反する可能性があります。)
Write は安定していなければならない : 共有メモリへの観測可能なすべての write は、1回の実行におけるプログラム意味論に由来しなければなりません。
(たとえば、より小さいデータを書き込むためにより大きな位置に対する read-modify-write 操作を使用する、プログラムが書き込めなかった値をメモリへ書き込む、または読み取った直後の値を読み取った位置へ書き戻す、といった特定の観測可能な write を変換によって導入してはなりません。特に、その位置が read 後に別の agent によって上書きされ得る場合です。)
可能な read 値は空であってはならない : プログラム変換は、共有メモリ read の可能な read 値を空にしてはなりません。
(直感に反して、この規則は実質的には write に対する変換を制限します。メモリモデル において write は read イベント から読み取られることによって効力を持つからです。たとえば、2つの seq-cst 操作の間で write を移動、統合、場合によっては並べ替えることはできますが、ある位置を更新するすべての write を変換によって削除してはならず、何らかの write を保持しなければなりません。)
引き続き有効な変換の例として、同じ位置からの複数の非 atomic read の統合、非 atomic read の並べ替え、投機的な非 atomic read の導入、同じ位置への複数の非 atomic write の統合、異なる位置への非 atomic write の並べ替え、およびそれが終了性に影響する場合でもループ外へ非 atomic read を hoist することがあります。一般に、alias された TypedArray により位置が異なることを証明するのは困難であることに注意してください。
注 3
以下は、共有メモリアクセス用の機械語コードを生成する ECMAScript 実装者向けのガイドラインです。
ARM または Power のメモリモデル 以上に弱くないメモリモデル を持つアーキテクチャでは、非 atomic store および load は、対象アーキテクチャ上の単純な store および load にコンパイルできます。Atomic store および load は、逐次一貫性を保証する命令へコンパイルできます。そのような命令が存在しない場合、単純な store または load の両側に barrier を配置するなど、メモリ barrier を使用します。read-modify-write 操作は、x86 の LOCK プレフィックス付き命令、ARM の load-exclusive/store-exclusive 命令、Power の load-link/store-conditional 命令など、対象アーキテクチャ上の read-modify-write 命令へコンパイルできます。
具体的には、メモリモデル は次のようなコード生成を許可することを意図しています。
プログラム内のすべての atomic 操作は必要であると仮定されます。
Atomic 操作は、互いに対しても非 atomic 操作に対しても決して並べ替えられません。
関数は常に atomic 操作を実行すると仮定されます。
Atomic 操作は、より大きなデータ上の read-modify-write 操作として実装されることはなく、プラットフォームが適切なサイズの atomic 操作を持たない場合は、lock-free ではない atomic として実装されます。(すでに、すべてのプラットフォームが対象となるすべてのサイズの通常のメモリアクセス操作を持つと仮定しています。)
単純なコード生成では次のパターンを使用します。
通常の load および store は、単一の load 命令および store 命令にコンパイルされます。
lock-free atomic load および store は、完全な(逐次一貫した)fence、通常の load または store、および完全な fence にコンパイルされます。
lock-free atomic read-modify-write アクセスは、完全な fence、atomic read-modify-write 命令列、および完全な fence にコンパイルされます。
lock-free でない atomic は、spinlock の取得、完全な fence、一連の非 atomic load および store 命令、完全な fence、および spinlock の解放にコンパイルされます。
この対応付けは、あるメモリ範囲 上の atomic 操作が非 atomic write または異なるサイズの atomic 操作と競合 しない限り正しいものです。しかし、必要なのはそれだけです。メモリモデル は、競合 に関与する atomic 操作を実質的に非 atomic 状態へ降格させます。一方、単純な対応付けはかなり強力です。atomic 操作を逐次一貫した fence として使用できますが、これはメモリモデル が実際には保証していないことです。
メモリモデル の制約に従う限り、これらの基本パターンに対する局所的な改善も許可されます。たとえば:
冗長な fence を削除する、明らかなプラットフォーム依存の改善があります。たとえば x86 では、lock-free atomic load および store の周囲の fence は、store の後に続く fence を除いて常に省略でき、lock-free read-modify-write 命令では、これらがすべて LOCK プレフィックス付き命令を使用するため fence は不要です。多くのプラットフォームには複数の強度の fence があり、逐次一貫性を損なわずに特定の文脈でより弱い fence を使用できます。
ほとんどの現代的なプラットフォームは、ECMAScript atomic に必要なすべてのデータサイズについて lock-free atomic をサポートします。lock-free でない atomic が必要な場合、atomic 操作の本体を囲む fence は通常、lock および unlock の手順へ折り込むことができます。lock-free でない atomic に対する最も単純な解決策は、SharedArrayBuffer ごとに単一の lock word を持つことです。
一部のコード解析を必要とする、より複雑なプラットフォーム依存の局所的改善もあります。たとえば、連続する2つの fence はしばしば単一の fence と同じ効果を持つため、2つの atomic 操作用のコードが連続して生成される場合、それらを分離する fence は1つだけで済みます。x86 では、store の後の fence は store を後続の load から分離するためだけに必要であるため、atomic store を分離する単一の fence さえ省略できます。
附属書 A (参考) 文法の概要
A.1 字句文法
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 ::
/*
MultiLineCommentChars opt
*/
MultiLineCommentChars ::
MultiLineNotAsteriskChar
MultiLineCommentChars opt
*
PostAsteriskCommentChars opt
PostAsteriskCommentChars ::
MultiLineNotForwardSlashOrAsteriskChar
MultiLineCommentChars opt
*
PostAsteriskCommentChars opt
MultiLineNotAsteriskChar ::
SourceCharacter but not *
MultiLineNotForwardSlashOrAsteriskChar ::
SourceCharacter but not one of / or *
SingleLineComment ::
//
SingleLineCommentChars opt
SingleLineCommentChars ::
SingleLineCommentChar
SingleLineCommentChars opt
SingleLineCommentChar ::
SourceCharacter but not LineTerminator
HashbangComment ::
#!
SingleLineCommentChars opt
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
NumericLiteralSeparator opt
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 ::
"
DoubleStringCharacters opt
"
'
SingleStringCharacters opt
'
DoubleStringCharacters ::
DoubleStringCharacter
DoubleStringCharacters opt
SingleStringCharacters ::
SingleStringCharacter
SingleStringCharacters opt
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 ::
`
TemplateCharacters opt
`
TemplateHead ::
`
TemplateCharacters opt
${
TemplateSubstitutionTail ::
TemplateMiddle
TemplateTail
TemplateMiddle ::
}
TemplateCharacters opt
${
TemplateTail ::
}
TemplateCharacters opt
`
TemplateCharacters ::
TemplateCharacter
TemplateCharacters opt
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 式
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]
,opt
)
(
...
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] :
[
Elision opt
]
[
ElementList [?Yield, ?Await]
]
[
ElementList [?Yield, ?Await]
,
Elision opt
]
ElementList [Yield, Await] :
Elision opt
AssignmentExpression [+In, ?Yield, ?Await]
Elision opt
SpreadElement [?Yield, ?Await]
ElementList [?Yield, ?Await]
,
Elision opt
AssignmentExpression [+In, ?Yield, ?Await]
ElementList [?Yield, ?Await]
,
Elision opt
SpreadElement [?Yield, ?Await]
Elision :
,
Elision
,
SpreadElement [Yield, Await] :
...
AssignmentExpression [+In, ?Yield, ?Await]
ObjectLiteral [Yield, Await] :
{
}
{
PropertyDefinitionList [?Yield, ?Await]
,opt
}
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]
SubstitutionTemplate [Yield, Await] :
TemplateHead
Expression [+In, ?Yield, ?Await]
TemplateSpans [?Yield, ?Await]
TemplateSpans [Yield, Await] :
TemplateTail
TemplateMiddleList [?Yield, ?Await]
TemplateTail
TemplateMiddleList [Yield, Await] :
TemplateMiddle
Expression [+In, ?Yield, ?Await]
TemplateMiddleList [?Yield, ?Await]
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]
,opt
)
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]
CoverAwaitExpressionAndAwaitUsingDeclarationHead [?Yield]
CoverAwaitExpressionAndAwaitUsingDeclarationHead [Yield] :
await
UnaryExpression [?Yield, +Await]
次の生成規則のインスタンスを処理するとき、
UnaryExpression [Yield, Await] : [+Await]
CoverAwaitExpressionAndAwaitUsingDeclarationHead [?Yield]
CoverAwaitExpressionAndAwaitUsingDeclarationHead の解釈は、次の文法を使用して詳細化されます。
AwaitExpression [Yield] :
await
UnaryExpression [?Yield, +Await]
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]
,opt
}
{
AssignmentPropertyList [?Yield, ?Await]
,
AssignmentRestProperty [?Yield, ?Await]
}
ArrayAssignmentPattern [Yield, Await] :
[
Elision opt
AssignmentRestElement [?Yield, ?Await] opt
]
[
AssignmentElementList [?Yield, ?Await]
]
[
AssignmentElementList [?Yield, ?Await]
,
Elision opt
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] :
Elision opt
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 文
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, +Pattern]
;
UsingDeclaration [?In, ?Yield, ?Await]
[+Await]
AwaitUsingDeclaration [?In, ?Yield]
LetOrConst :
let
const
UsingDeclaration [In, Yield, Await] :
using
[no LineTerminator here]
BindingList [?In, ?Yield, ?Await, ~Pattern]
;
AwaitUsingDeclaration [In, Yield] :
CoverAwaitExpressionAndAwaitUsingDeclarationHead [?Yield]
[no LineTerminator here]
BindingList [?In, ?Yield, +Await, ~Pattern]
;
BindingList [In, Yield, Await, Pattern] :
LexicalBinding [?In, ?Yield, ?Await, ?Pattern]
BindingList [?In, ?Yield, ?Await, ?Pattern]
,
LexicalBinding [?In, ?Yield, ?Await, ?Pattern]
LexicalBinding [In, Yield, Await, Pattern] :
BindingIdentifier [?Yield, ?Await]
Initializer [?In, ?Yield, ?Await] opt
[+Pattern]
BindingPattern [?Yield, ?Await]
Initializer [?In, ?Yield, ?Await]
次の生成規則のインスタンスを処理するとき、
AwaitUsingDeclaration [In, Yield] :
CoverAwaitExpressionAndAwaitUsingDeclarationHead [?Yield]
[no LineTerminator here]
BindingList [?In, ?Yield, +Await, ~Pattern]
;
CoverAwaitExpressionAndAwaitUsingDeclarationHead の解釈は、次の文法を使用して詳細化されます。
AwaitUsingDeclarationHead :
await
[no LineTerminator here]
using
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]
,opt
}
{
BindingPropertyList [?Yield, ?Await]
,
BindingRestProperty [?Yield, ?Await]
}
ArrayBindingPattern [Yield, Await] :
[
Elision opt
BindingRestElement [?Yield, ?Await] opt
]
[
BindingElementList [?Yield, ?Await]
]
[
BindingElementList [?Yield, ?Await]
,
Elision opt
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] :
Elision opt
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, +Pattern]
in
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
ForDeclaration [?Yield, ?Await, ~Using]
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, +Pattern]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
[lookahead ≠ using
of ]
ForDeclaration [?Yield, ?Await, +Using]
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, +Pattern]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
[+Await]
for
await
(
[lookahead ≠ using
of ]
ForDeclaration [?Yield, ?Await, +Using]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
ForDeclaration [Yield, Await, Using] :
LetOrConst
ForBinding [?Yield, ?Await, +Pattern]
[+Using]
using
[no LineTerminator here]
ForBinding [?Yield, ?Await, ~Pattern]
[+Using, +Await]
await
[no LineTerminator here]
using
[no LineTerminator here]
ForBinding [?Yield, +Await, ~Pattern]
ForBinding [Yield, Await, Pattern] :
BindingIdentifier [?Yield, ?Await]
[+Pattern]
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 関数とクラス
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 スクリプトとモジュール
Script :
ScriptBody opt
ScriptBody :
StatementList [~Yield, ~Await, ~Return]
Module :
ModuleBody opt
ModuleBody :
ModuleItemList
ModuleItemList :
ModuleItem
ModuleItemList
ModuleItem
ModuleItem :
ImportDeclaration
ExportDeclaration
StatementListItem [~Yield, +Await, ~Return]
ModuleExportName :
IdentifierName
StringLiteral
ImportDeclaration :
import
ImportClause
FromClause
WithClause opt
;
import
ModuleSpecifier
WithClause opt
;
ImportClause :
ImportedDefaultBinding
NameSpaceImport
NamedImports
ImportedDefaultBinding
,
NameSpaceImport
ImportedDefaultBinding
,
NamedImports
ImportedDefaultBinding :
ImportedBinding
NameSpaceImport :
*
as
ImportedBinding
NamedImports :
{
}
{
ImportsList
,opt
}
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
WithClause opt
;
export
NamedExports
;
export
VariableStatement [~Yield, +Await]
export
[lookahead ∉ { using , await }]
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
,opt
}
ExportsList :
ExportSpecifier
ExportsList
,
ExportSpecifier
ExportSpecifier :
ModuleExportName
ModuleExportName
as
ModuleExportName
A.6 Number 変換
StringNumericLiteral :::
StrWhiteSpace opt
StrWhiteSpace opt
StrNumericLiteral
StrWhiteSpace opt
StrWhiteSpace :::
StrWhiteSpaceChar
StrWhiteSpace opt
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 :::
StrWhiteSpace opt
StrWhiteSpace opt
StrIntegerLiteral
StrWhiteSpace opt
StrIntegerLiteral :::
SignedInteger [~Sep]
NonDecimalIntegerLiteral [~Sep]
A.7 タイムゾーンオフセット String 形式
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
TemporalDecimalFraction opt
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 正規表現
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
UnicodePropertyNameCharacters opt
UnicodePropertyValue ::
UnicodePropertyValueCharacters
LoneUnicodePropertyNameOrValue ::
UnicodePropertyValueCharacters
UnicodePropertyValueCharacters ::
UnicodePropertyValueCharacter
UnicodePropertyValueCharacters opt
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
ClassUnion opt
ClassSetOperand
ClassUnion opt
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
NonEmptyClassString opt
ClassSetCharacter ::
[lookahead ∉ ClassSetReservedDoublePunctuator ]
SourceCharacter but not ClassSetSyntaxCharacter
\
CharacterEscape [+UnicodeMode]
\
ClassSetReservedPunctuator
\b
ClassSetReservedDoublePunctuator :: one of && !! ## $$ %% ** ++ ,, .. :: ;; << == >> ?? @@ ^^ `` ~~
ClassSetSyntaxCharacter :: one of ( ) [ ] { } / - \ |
ClassSetReservedPunctuator :: one of & - ! # % , : ; < = > @ ` ~
附属書 B (規定) Web ブラウザー向けの追加 ECMAScript 機能
この附属書で定義される ECMAScript 言語の構文および意味論は、ECMAScript ホスト が Web ブラウザーである場合に必要です。ECMAScript ホスト が Web ブラウザーでない場合、この附属書の内容は規範的ですが省略可能です。
この附属書で定義される一部の機能はこの附属書で規定され、一部はこの文書の本文で規定されます。
機能が本文で規定される場合、その機能が文書に影響する各箇所は、色付きのボックス内の「Normative Optional」という語で示されます。さらに、その機能がアルゴリズムまたは早期エラー規則 内の特定の文言を含む場合、その箇所は関連する機能を「ホストがサポートする 」という条件によって保護されます。Web ブラウザーは、そのようなすべての機能をサポートする必要があります。
注
この附属書では、Web ブラウザーの ECMAScript ホスト におけるさまざまな legacy 機能およびその他の特性について説明します。この附属書で規定されるすべての言語機能および動作には、1つ以上の望ましくない特性があり、legacy な使用がなければこの仕様から削除されるものです。しかし、多数の既存 Web ページがこれらの機能を使用しているため、Web ブラウザーはこれらを引き続きサポートしなければなりません。この附属書の仕様は、これらの legacy 機能を相互運用可能に実装するための要件を定義します。
これらの機能は、ECMAScript コア言語の一部とはみなされません。プログラマーは、新しい ECMAScript コードを記述するとき、これらの機能および動作を使用したり、その存在を前提としたりするべきではありません。ECMAScript 実装は、その実装が Web ブラウザーの一部である場合、または Web ブラウザーが遭遇するものと同じ legacy ECMAScript コードを実行する必要がある場合を除き、これらの機能を実装しないことが推奨されます。
B.1 追加の構文
B.1.2 正規表現パターン
22.2.1 の構文は、次のように変更および拡張されます。これらの変更によって曖昧性が生じますが、文法生成規則の順序および文脈情報によって解消されます。次の文法を使用して解析する場合、各選択肢は、それ以前の生成規則の選択肢が一致しない場合にのみ考慮されます。
この代替パターン文法および意味論は、BMP パターンの構文および意味論だけを変更します。次の文法拡張には、[UnicodeMode] パラメーターでパラメーター化された生成規則が含まれます。ただし、これらの拡張はいずれも、goal symbol に [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
_
注
同じ左辺が [+UnicodeMode] と [~UnicodeMode] の両方の guard で現れる場合、それは曖昧性解消の優先順位を制御するためです。
B.1.2.1 Static Semantics: 早期エラー
22.2.1.1 の意味論は、次のように拡張されます。
ExtendedAtom :: InvalidBracedQuantifier
この生成規則によって何らかのソーステキストが一致する場合、Syntax Error です。
さらに、次の生成規則のルールは、強調表示された テキストを追加することで変更されます。
NonemptyClassRanges ::
ClassAtom
-
ClassAtom
ClassContents
NonemptyClassRangesNoDash ::
ClassAtomNoDash
-
ClassAtom
ClassContents
B.1.2.2 Static Semantics: CountLeftCapturingParensWithin および CountLeftCapturingParensBefore
CountLeftCapturingParensWithin および CountLeftCapturingParensBefore の定義では、「
Atom ::
(
GroupSpecifier opt
Disjunction
)
」への参照は、「
Atom ::
(
GroupSpecifier opt
Disjunction
)
」または「
ExtendedAtom ::
(
GroupSpecifier opt
Disjunction
)
」を意味するものとして解釈されます。
B.1.2.3 Static Semantics: IsCharacterClass
IsCharacterClass の意味論は、次のように拡張されます。
ClassAtomNoDash ::
\
[lookahead = c ]
false を返す。
B.1.2.4 Static Semantics: CharacterValue
CharacterValue の意味論は、次のように拡張されます。
ClassAtomNoDash ::
\
[lookahead = c ]
U+005C (REVERSE SOLIDUS) の数値を返す。
ClassEscape ::
c
ClassControlLetter
codePoint を ClassControlLetter に一致したコードポイントとする。i を codePoint の数値とする。i を 32 で除算した余りを返す。
CharacterEscape :: LegacyOctalEscapeSequence
LegacyOctalEscapeSequence の MV を返す(12.9.4.3 を参照)。
B.1.2.5 Runtime Semantics: CompileSubpattern
引数 regexpRecord および direction を持つ CompileSubpattern の意味論は、次のように拡張されます。
Term ::
QuantifiableAssertion
Quantifier
のルールは、Atom の代わりに QuantifiableAssertion を使用することを除き、
Term ::
Atom
Quantifier
と同じです。
Term ::
ExtendedAtom
Quantifier
のルールは、Atom の代わりに ExtendedAtom を使用することを除き、
Term ::
Atom
Quantifier
と同じです。
Term :: ExtendedAtom
のルールは、Atom の代わりに ExtendedAtom を使用することを除き、
Term :: Atom
と同じです。
B.1.2.6 Runtime Semantics: CompileAssertion
引数 regexpRecord を持つ CompileAssertion の意味論は、次のように拡張されます。
QuantifiableAssertion ::
(?=
Disjunction
)
のルールは、Atom の代わりに QuantifiableAssertion を使用することを除き、
Assertion ::
(?=
Disjunction
)
と同じです。
QuantifiableAssertion ::
(?!
Disjunction
)
のルールは、Atom の代わりに QuantifiableAssertion を使用することを除き、
Assertion ::
(?!
Disjunction
)
と同じです。
B.1.2.7 Runtime Semantics: CompileAtom
引数 regexpRecord および direction を持つ CompileAtom の意味論は、次のように拡張されます。
Atom :: PatternCharacter
を除く Atom の生成規則のルールは、Atom の代わりに ExtendedAtom を使用して ExtendedAtom の生成規則にも使用されます。
次のルールも追加されます。
ExtendedAtom ::
\
[lookahead = c ]
charSet を単一の文字 \ U+005C (REVERSE SOLIDUS) を含む CharSet とする。CharacterSetMatcher (regexpRecord , charSet , false , direction ) を返す。
ExtendedAtom :: ExtendedPatternCharacter
char を ExtendedPatternCharacter によって表される文字とする。charSet を文字 char を含む1要素の CharSet とする。CharacterSetMatcher (regexpRecord , charSet , false , direction ) を返す。
B.1.2.8 Runtime Semantics: CompileToCharSet
引数 regexpRecord を持つ CompileToCharSet の意味論は、次のように拡張されます。
2つのルールが置き換えられます。
NonemptyClassRanges ::
ClassAtom
-
ClassAtom
ClassContents
charSet を、引数 regexpRecord を持つ最初の ClassAtom の CompileToCharSet とする。otherSet を、引数 regexpRecord を持つ2番目の ClassAtom の CompileToCharSet とする。remainingSet を、引数 regexpRecord を持つ ClassContents の CompileToCharSet とする。rangeSet を CharacterRangeOrUnion (regexpRecord , charSet , otherSet ) とする。rangeSet と remainingSet の和集合を返す。
NonemptyClassRangesNoDash ::
ClassAtomNoDash
-
ClassAtom
ClassContents
charSet を、引数 regexpRecord を持つ ClassAtomNoDash の CompileToCharSet とする。otherSet を、引数 regexpRecord を持つ ClassAtom の CompileToCharSet とする。remainingSet を、引数 regexpRecord を持つ ClassContents の CompileToCharSet とする。rangeSet を CharacterRangeOrUnion (regexpRecord , charSet , otherSet ) とする。rangeSet と remainingSet の和集合を返す。
次のルールも追加されます。
ClassEscape ::
c
ClassControlLetter
charValue をこの ClassEscape の CharacterValue とする。char を文字値が charValue である文字とする。単一の文字 char を含む CharSet を返す。
ClassAtomNoDash ::
\
[lookahead = c ]
単一の文字 \ U+005C (REVERSE SOLIDUS) を含む CharSet を返す。
注 この生成規則には、文字クラス内の \c というシーケンスからのみ到達でき、その後に許容される制御文字が続かない場合に限られます。
B.1.2.8.1 CharacterRangeOrUnion ( regexpRecord , charSet , otherSet )
抽象操作 CharacterRangeOrUnion。引数 regexpRecord (RegExpレコード )、charSet (CharSet ) および otherSet (CharSet )。戻り値:CharSet 。 呼び出されると、次の手順を実行する。
HasEitherUnicodeFlag (regexpRecord ) が false である場合、charSet がちょうど1文字を含まないか、または otherSet がちょうど1文字を含まない場合、remainingSet を単一の文字 - U+002D (HYPHEN-MINUS) を含む CharSet とする。CharSet charSet 、otherSet 、および remainingSet の和集合を返す。CharacterRange (charSet , otherSet ) を返す。
B.1.2.9 Static Semantics: ParsePattern ( patternText , u , v )
引数 patternText 、u 、および v を持つ ParsePattern の意味論は、強調表示された 変更を伴って次のように拡張されます。
v が true かつ u が true である場合、parseResult を1つ以上の SyntaxError オブジェクトを含む List とする。そうでなく、v が true である場合、parseResult を ParseText (patternText , Pattern [+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups] ) とする。 そうでなく、u が true である場合、parseResult を ParseText (patternText , Pattern [+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups] ) とする。 そうでない場合、parseResult を ParseText (patternText , Pattern [~UnicodeMode, ~UnicodeSetsMode, ~NamedCaptureGroups] ) とする。parseResult が Parse Node であり、かつ parseResult が GroupName を含む場合、parseResult を ParseText (patternText , Pattern [~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups] ) に設定する。 parseResult を返す。
B.2 追加の組込みプロパティ
ECMAScript ホスト が Web ブラウザーである場合、標準組込みオブジェクトについて次の追加プロパティが定義されます。
B.2.1 グローバルオブジェクトの追加プロパティ
表 103 の項目が 表 6 に追加されます。
表 103: 追加の Well-known Intrinsic オブジェクト
B.2.1.1 escape ( string )
この関数はグローバルオブジェクト のプロパティです。特定の code unit が16進エスケープシーケンスに置き換えられた、新しい String 値を計算します。
数値が 0x00FF 以下の code unit を置き換える場合、%xx 形式の2桁エスケープシーケンスが使用されます。数値が 0x00FF より厳密に大きい code unit を置き換える場合、%uxxxx 形式の4桁エスケープシーケンスが使用されます。
これは %escape% intrinsic オブジェクトです。
呼び出されたとき、次の手順を実行します。
string を ? ToString (string ) に設定する。length を string の長さとする。result を空の String とする。unescapedSet を ASCII word character と "@*+-./" の文字列連結 とする。k を 0 とする。k < length の間、次を繰り返す。codeUnit を string 内のインデックス k にある code unit とする。unescapedSet が codeUnit を含む場合、nextPart を codeUnit とする。そうでない場合、codeUnitNumber を codeUnit の数値とする。codeUnitNumber < 256 である場合、hex を、大文字の16進数として整形された codeUnitNumber の String 表現とする。nextPart を "%" と StringPad (hex , 2, "0" , start ) の文字列連結 とする。そうでない場合、hex を、大文字の16進数として整形された codeUnitNumber の String 表現とする。nextPart を "%u" と StringPad (hex , 4, "0" , start ) の文字列連結 とする。 result を result と nextPart の文字列連結 に設定する。k を k + 1 に設定する。result を返す。
注
このエンコーディングは部分的に RFC 1738 で説明されるエンコーディングに基づいていますが、この標準で指定されるエンコーディング全体は RFC 1738 の内容にかかわらず上記で説明されています。このエンコーディングは、RFC 3986 によって RFC 1738 に加えられた変更を反映していません。
B.2.1.2 unescape ( string )
この関数はグローバルオブジェクト のプロパティです。escape 関数によって導入され得る種類の各エスケープシーケンスを、それが表す code unit に置き換えた新しい String 値を計算します。
これは %unescape% intrinsic オブジェクトです。
呼び出されたとき、次の手順を実行します。
string を ? ToString (string ) に設定する。length を string の長さとする。result を空の String とする。k を 0 とする。k < length の間、次を繰り返す。codeUnit を string 内のインデックス k にある code unit とする。codeUnit が code unit 0x0025 (PERCENT SIGN) である場合、hexDigits を空の String とする。optionalAdvance を 0 とする。k + 5 < length であり、かつ string 内のインデックス k + 1 にある code unit が code unit 0x0075 (LATIN SMALL LETTER U) である場合、hexDigits を string の k + 2 から k + 6 までの substring に設定する。optionalAdvance を 5 に設定する。そうでなく、k + 3 ≤ length である場合、hexDigits を string の k + 1 から k + 3 までの substring に設定する。optionalAdvance を 2 に設定する。 parseResult を ParseText (hexDigits , HexDigits [~Sep] ) とする。parseResult が Parse Node である場合、codeUnitNumber を parseResult の MV とする。codeUnit を数値が codeUnitNumber である code unit に設定する。k を k + optionalAdvance に設定する。result を result と codeUnit の文字列連結 に設定する。k を k + 1 に設定する。result を返す。
B.2.2 String.prototype オブジェクトの追加プロパティ
B.2.2.1 String.prototype.substr ( start , length )
このメソッドは、this 値を String に変換した結果のsubstring を、インデックス start から開始し、length code unit 分(または length が undefined の場合は String の末尾まで)返します。start が負の場合、sourceLength を String の長さとして sourceLength + start として扱われます。結果は String オブジェクトではなく String 値です。
呼び出されたとき、次の手順を実行します。
obj を this 値とする。? RequireObjectCoercible (obj ) を実行する。 string を ? ToString (obj ) とする。size を string の長さとする。intStart を ? ToClampedIndex (start , size ) とする。length が undefined である場合、intLength を size とする。そうでない場合、intLength を ? ToIntegerOrInfinity (length ) を 0 と size の間に clamp した結果とする。intEnd を min (intStart + intLength , size ) とする。string の intStart から intEnd までの substring を返す。
注
このメソッドは意図的に汎用的です。その this 値が String オブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
B.2.2.2 String.prototype.anchor ( name )
このメソッドは呼び出されたとき、次の手順を実行します。
string を this 値とする。? CreateHTML (string , "a" , "name" , name ) を返す。
B.2.2.2.1 CreateHTML ( contents , tag , attr , attrValue )
抽象操作 CreateHTML。引数 contents (ECMAScript 言語値 )、tag (String)、attr (String) および attrValue (ECMAScript 言語値 )。戻り値:(正常完了 (値:String) または throw 完了 )。 呼び出されると、次の手順を実行する。
? RequireObjectCoercible (contents ) を実行する。 contentsString を ? ToString (contents ) とする。part1 を "<" と tag の文字列連結 とする。attr が空の String でない場合、attrValueString を ? ToString (attrValue ) とする。escapedAttrValue を、attrValueString 内の code unit 0x0022 (QUOTATION MARK) の各出現を6 code unit のシーケンス "&quot;" に置き換えたことを除き attrValueString と同じ String 値とする。part1 を次の文字列連結 に設定する。part1 code unit 0x0020 (SPACE) attr code unit 0x003D (EQUALS SIGN) code unit 0x0022 (QUOTATION MARK) escapedAttrValue code unit 0x0022 (QUOTATION MARK) part2 を part1 と ">" の文字列連結 とする。part3 を part2 と contentsString の文字列連結 とする。part4 を part3 、"</" 、tag 、および ">" の文字列連結 とする。part4 を返す。
B.2.2.3 String.prototype.big ( )
このメソッドは呼び出されたとき、次の手順を実行します。
string を this 値とする。? CreateHTML (string , "big" , "" , "" ) を返す。
B.2.2.4 String.prototype.blink ( )
このメソッドは呼び出されたとき、次の手順を実行します。
string を this 値とする。? CreateHTML (string , "blink" , "" , "" ) を返す。
B.2.2.5 String.prototype.bold ( )
このメソッドは呼び出されたとき、次の手順を実行します。
string を this 値とする。? CreateHTML (string , "b" , "" , "" ) を返す。
B.2.2.6 String.prototype.fixed ( )
このメソッドは呼び出されたとき、次の手順を実行します。
string を this 値とする。? CreateHTML (string , "tt" , "" , "" ) を返す。
B.2.2.7 String.prototype.fontcolor ( colour )
このメソッドは呼び出されたとき、次の手順を実行します。
string を this 値とする。? CreateHTML (string , "font" , "color" , colour ) を返す。
B.2.2.8 String.prototype.fontsize ( size )
このメソッドは呼び出されたとき、次の手順を実行します。
string を this 値とする。? CreateHTML (string , "font" , "size" , size ) を返す。
B.2.2.9 String.prototype.italics ( )
このメソッドは呼び出されたとき、次の手順を実行します。
string を this 値とする。? CreateHTML (string , "i" , "" , "" ) を返す。
B.2.2.10 String.prototype.link ( url )
このメソッドは呼び出されたとき、次の手順を実行します。
string を this 値とする。? CreateHTML (string , "a" , "href" , url ) を返す。
B.2.2.11 String.prototype.small ( )
このメソッドは呼び出されたとき、次の手順を実行します。
string を this 値とする。? CreateHTML (string , "small" , "" , "" ) を返す。
B.2.2.12 String.prototype.strike ( )
このメソッドは呼び出されたとき、次の手順を実行します。
string を this 値とする。? CreateHTML (string , "strike" , "" , "" ) を返す。
B.2.2.13 String.prototype.sub ( )
このメソッドは呼び出されたとき、次の手順を実行します。
string を this 値とする。? CreateHTML (string , "sub" , "" , "" ) を返す。
B.2.2.14 String.prototype.sup ( )
このメソッドは呼び出されたとき、次の手順を実行します。
string を this 値とする。? CreateHTML (string , "sup" , "" , "" ) を返す。
B.2.2.15 String.prototype.trimLeft ( )
注
"trimStart" プロパティが推奨されます。"trimLeft" プロパティは主に古いコードとの互換性のために提供されています。新しい ECMAScript コードでは "trimStart" プロパティを使用することが推奨されます。
"trimLeft" プロパティの初期値は、22.1.3.34 で定義される %String.prototype.trimStart% です。
B.2.2.16 String.prototype.trimRight ( )
注
"trimEnd" プロパティが推奨されます。"trimRight" プロパティは主に古いコードとの互換性のために提供されています。新しい ECMAScript コードでは "trimEnd" プロパティを使用することが推奨されます。
"trimRight" プロパティの初期値は、22.1.3.33 で定義される %String.prototype.trimEnd% です。
B.2.3 Date.prototype オブジェクトの追加プロパティ
B.2.3.1 Date.prototype.getYear ( )
注
getFullYear メソッドは「2000年問題」を回避するため、ほぼすべての用途で推奨されます。
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 tv を dateObj .[[DateValue]] とする。tv が NaN である場合、NaN を返す。𝔽 (YearFromTime (LocalTime (tv ))) - 1900 𝔽 を返す。
B.2.3.2 Date.prototype.setYear ( year )
注
setFullYear メソッドは「2000年問題」を回避するため、ほぼすべての用途で推奨されます。
このメソッドは呼び出されたとき、次の手順を実行します。
dateObj を this 値とする。? RequireInternalSlot (dateObj , [[DateValue]] ) を実行する。 time を dateObj .[[DateValue]] とする。time が NaN である場合、time を +0 𝔽 に設定する。そうでない場合、time を LocalTime (time ) に設定する。fullYear を MakeFullYear (? ToNumber (year )) とする。day を MakeDay (fullYear , 𝔽 (MonthFromTime (time )), 𝔽 (DateFromTime (time ))) とする。date を MakeDate (day , 𝔽 (TimeWithinDay (time ))) とする。utcTimestamp を TimeClip (UTC (date )) とする。dateObj .[[DateValue]] を utcTimestamp に設定する。utcTimestamp を返す。
B.2.3.3 Date.prototype.toGMTString ( )
注
toUTCString メソッドが推奨されます。このメソッドは主に古いコードとの互換性のために提供されています。
"toGMTString" プロパティの初期値は、21.4.4.43 で定義される %Date.prototype.toUTCString% です。
B.2.4 RegExp.prototype オブジェクトの追加プロパティ
B.2.4.1 RegExp.prototype.compile ( pattern , flags )
このメソッドは呼び出されたとき、次の手順を実行します。
obj を this 値とする。? RequireInternalSlot (obj , [[RegExpMatcher]] ) を実行する。 pattern が Object であり、かつ pattern が [[RegExpMatcher]] 内部スロットを持つ場合、flags が undefined でない場合、TypeError 例外をスローする。flags を pattern .[[OriginalFlags]] に設定する。pattern を pattern .[[OriginalSource]] に設定する。? RegExpInitialize (obj , pattern , flags ) を返す。
注
このメソッドは this 値の RegExp を、新しいパターンとフラグで完全に再初期化します。実装は、このメソッドの使用を、結果の RegExp オブジェクトが複数回使用されるため追加最適化の候補であるという表明 として解釈してもかまいません。
B.3 その他の追加機能
B.3.1 ラベル付き関数宣言
ECMAScript 2015 より前は、LabelledStatement の仕様では、文ラベルを FunctionDeclaration と関連付けることは許可されていませんでした。ただし、ラベル付き FunctionDeclaration は非 strict コード に対して許容される拡張であり、ブラウザーでホスト されるほとんどの ECMAScript 実装がその拡張をサポートしていました。ECMAScript 2015 以降では、LabelledStatement の文法生成規則は FunctionDeclaration を LabelledItem として使用することを許可しますが、14.13.1 には、それが発生した場合に Syntax Error を生成する早期エラー規則 が含まれています。その規則は、この機能をホストがサポートする 場合に、非 strict コード では Syntax Error を抑制するよう変更されます。
注
B.3.2 ブロックレベル関数宣言の Web Legacy 互換性意味論
ECMAScript 2015 より前は、ECMAScript 仕様は Block 文の StatementList の要素として FunctionDeclaration が現れることを定義していませんでした。ただし、その形式の FunctionDeclaration のサポートは許容される拡張であり、ブラウザーでホスト されるほとんどの ECMAScript 実装がこれを許可していました。残念ながら、そのような宣言の意味論は実装ごとに異なります。これらの意味論の違いのため、Block レベルの関数宣言を使用する既存の Web ECMAScript ソーステキスト がブラウザー実装間で移植可能なのは、その使用がそのような宣言に対するすべてのブラウザー実装の意味論の共通部分だけに依存する場合に限られます。以下は、その共通意味論に含まれる使用例です。
関数が宣言され、単一のブロック内でのみ参照される。
関数が単一の Block 内で宣言され、場合によっては使用されるが、同じ Block 内には含まれない内側の関数定義からも参照される。
関数が単一のブロック内で宣言され、場合によっては使用されるが、その後のブロック内からも参照される。
最初の使用例は、ECMAScript 2015 によって提供される Block レベル関数宣言の意味論と相互運用可能です。その使用例を採用する既存の ECMAScript ソーステキスト は、10 、14 、および 15 で定義されるブロックレベル関数宣言の意味論を使用して動作します。
2番目および3番目の使用例について ECMAScript 2015 との相互運用性を実現するには、節 10 、節 15 、節 19.2.1 、および節 16.1.7 の意味論に次の拡張が必要です。
ECMAScript 実装が診断警告メッセージを報告する機構を持つ場合、これらの互換性意味論が適用され、非互換性意味論から観測可能な差異が生じる FunctionDeclaration をコードが含む場合には警告を生成するべきです。たとえば、var 束縛の導入が早期エラー を引き起こすため導入されない場合、警告メッセージを生成するべきではありません。
この機能は、次の箇所で特別な意味論を伴います。
B.3.3 IfStatement の Statement 節内の FunctionDeclaration
次は 14.6 の IfStatement 生成規則を拡張します。
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] の出現が、ソーステキスト内のその位置を占める BlockStatement の唯一の StatementListItem であるかのように処理されます。そのような合成 BlockStatement の意味論には、B.3.2 で規定される Web legacy 互換性意味論が含まれます。
B.3.4 Catch ブロック内の VariableStatement
この機能では、Catch 節の Block は、CatchParameter によって束縛される名前と同じ名前を束縛する var 宣言を含むことができます。これは、14.15.1 の
Catch :
catch
(
CatchParameter
)
Block
に対する早期エラー規則 を変更することで実現されます。
注
実行時、そのような束縛は VariableDeclarationEnvironment 内でインスタンス化されます。それらは CatchParameter によって導入された同名の束縛を shadow しないため、そのような var 宣言の Initializer は var 束縛ではなく対応する catch parameter へ代入します。
この変更された動作は、Catch 節の Block 内に含まれる direct eval 呼出しによって導入された var および function 宣言にも適用されます。この変更は、EvalDeclarationInstantiation の手順 3.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 コード を解析する場合にのみ適用されます。
引数 labelSet を持つ ContainsDuplicateLabels の静的意味論 は、次によって拡張されます。
ForInOfStatement :
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
引数 labelSet を持つ Statement の ContainsDuplicateLabels を返す。
引数 labelSet を持つ ContainsUndefinedBreakTarget の静的意味論 は、次によって拡張されます。
ForInOfStatement :
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
引数 labelSet を持つ Statement の ContainsUndefinedBreakTarget を返す。
引数 iterationSet および labelSet を持つ ContainsUndefinedContinueTarget の静的意味論 は、次によって拡張されます。
ForInOfStatement :
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
引数 iterationSet および « » を持つ Statement の ContainsUndefinedContinueTarget を返す。
IsDestructuring の静的意味論 は、次によって拡張されます。
BindingIdentifier :
Identifier
yield
await
false を返す。
VarDeclaredNames の静的意味論 は、次によって拡張されます。
ForInOfStatement :
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
names1 を BindingIdentifier の BoundNames とする。names2 を Statement の VarDeclaredNames とする。names1 と names2 のリスト連結 を返す。
VarScopedDeclarations の静的意味論 は、次によって拡張されます。
ForInOfStatement :
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
decls1 を « BindingIdentifier » とする。decls2 を Statement の VarScopedDeclarations とする。decls1 と decls2 のリスト連結 を返す。
引数 labelSet を持つ ForInOfLoopEvaluation の実行時意味論 は、次によって拡張されます。
ForInOfStatement :
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
name を BindingIdentifier の StringValue とする。lhs を ? ResolveBinding (name ) とする。IsAnonymousFunctionDefinition (Initializer ) が true である場合、value を、引数 name を持つ Initializer の ? NamedEvaluation とする。そうでない場合、rhs を Initializer の ? Evaluation とする。value を ? GetValue (rhs ) とする。 ? PutValue (lhs , value ) を実行する。 keyResult を ? ForIn/OfHeadEvaluation (« », Expression , enumerate ) とする。? ForIn/OfBodyEvaluation (BindingIdentifier , Statement , keyResult , enumerate , var-binding , labelSet ) を返す。
B.3.6 [[IsHTMLDDA]] 内部スロット
[[IsHTMLDDA]] 内部スロット はホスト定義 オブジェクト上に存在する場合があります。[[IsHTMLDDA]] 内部スロットを持つオブジェクトは、ToBoolean および IsLooselyEqual 抽象操作 、ならびに typeof 演算子 のオペランドとして使用された場合、undefined のように動作します。
注
[[IsHTMLDDA]] 内部スロットを持つオブジェクトは、この仕様によって作成されることはありません。ただし、Web ブラウザーの document.all オブジェクト は、Web 互換性のために存在する、このスロットを持つホスト定義 特殊オブジェクト です。この種類のオブジェクトの既知の例は他になく、実装は document.all を除いてこのようなオブジェクトを作成するべきではありません。
この機能は、次の箇所で特別な意味論を伴います。
B.3.7 HostMakeJobCallback における既定でない動作
HostMakeJobCallback 抽象操作 により、Web ブラウザーであるホスト は既定でない動作を指定できます。
B.3.8 HostEnsureCanAddPrivateElement における既定でない動作
HostEnsureCanAddPrivateElement 抽象操作 により、Web ブラウザーであるホスト は既定でない動作を指定できます。
B.3.9 関数呼出し代入ターゲットの実行時エラー
関数呼出し(13.3.6 )が非 strict コード 内で代入ターゲットとして使用された場合、早期エラー を生成する代わりに、代入の評価中に ReferenceError 例外がスローされます。
注
代入ターゲットが AssignmentExpression の LeftHandSideExpression である場合、代入演算子は = または AssignmentOperator でなければなりません。特に、ここでの許可は論理代入演算子(??=、&&=、||=)には適用されません。
CallExpression : CoverCallExpressionAndAsyncArrowHead
および
CallExpression :
CallExpression
Arguments
について、AssignmentTargetType の手順 1 を参照してください。
附属書 C (参考) ECMAScript の Strict モード
strict モードの制約と例外
附属書 D (参考) ホストのレイヤリングポイント
host の定義については 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]] : 表 20 を参照。
Script Record 上の [[HostDefined]] : 表 35 を参照。
Module Record 上の [[HostDefined]] : 表 39 を参照。
JobCallback Record 上の [[HostDefined]] : 表 24 を参照。
[[IsHTMLDDA]] : B.3.6 を参照。
D.3 ホスト定義オブジェクト
グローバルオブジェクト : 節 19 を参照。
D.4 Job の実行
Job Abstract Closure を呼び出す前の準備手順、および呼出し後のクリーンアップ手順。9.5 を参照。
D.5 特殊オブジェクトの内部メソッド
この仕様内で規定されていない任意の特殊オブジェクト について、表 4 の必須内部メソッドのいずれか。
D.6 組込みオブジェクトとメソッド
17.1 で制限される場合を除き、この仕様内で定義されていない任意の組込みオブジェクトおよびメソッド。
附属書 E (参考) 互換性に影響する可能性のある ECMAScript 2015 の修正と明確化
9.1.1.4.14 -9.1.1.4.17 Edition 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 𝔽 を返すと規定します。これは、ECMAScript 2015 では Date の時刻値 が観測可能な -0 𝔽 になることはなく、時刻値 を返すメソッドも -0 𝔽 を返さないことを意味します。
21.4.1.32 : UTC オフセット表現が存在しない場合、ローカルタイムゾーンが使用されます。Edition 5.1 は、欠落したタイムゾーンを "z" として解釈するべきであると誤って記述していました。
21.4.4.36 : 年を 21.4.1.32 で規定される Date Time String Format を使用して表現できない場合、RangeError 例外がスローされます。以前の版では、その場合の動作を規定していませんでした。
21.4.4.41 : 以前の版では、時刻値 が NaN の場合に Date.prototype.toString が返す値を規定していませんでした。ECMAScript 2015 は結果を String 値 "Invalid Date" と規定します。
22.2.4.1 、22.2.6.13.1 : RegExp インスタンスの "source" プロパティの値に含まれるすべての LineTerminator コードポイントは、エスケープシーケンスを使用して表現されなければなりません。Edition 5.1 では / のエスケープだけを要求していました。
22.2.6.8 、22.2.6.11 : 以前の版では、pattern 引数が global フラグを設定した RegExp 値である場合について、String.prototype.match および String.prototype.replace の仕様が誤っていました。以前の仕様では、パターンへの各一致試行について lastIndex が変化しなかった場合、1 増加させるべきだとしていました。正しい動作は、パターンが空の String に一致した場合にのみ lastIndex を 1 増加させることです。
23.1.3.30 : 以前の版では、comparator が返した NaN 値を Array.prototype.sort がどのように解釈するかを規定していませんでした。ECMAScript 2015 は、そのような値を comparator が +0 𝔽 を返したかのように扱うと規定します。ECMAScript 2015 はまた、comparator が返した結果に ToNumber が適用されることも規定します。以前の版では、Number 値 でない comparator の結果の効果は実装定義 でした。実際には、実装は ToNumber を呼び出しています。
附属書 F (参考) 以前の版との非互換性を導入する追加および変更
6.2.5 : ECMAScript 2015 では、Function 呼出しは Reference Record を返すことを許可されていません。
7.1.4.1 : ECMAScript 2015 では、String 値に適用される ToNumber が BinaryIntegerLiteral および OctalIntegerLiteral の数値文字列を認識して変換するようになりました。以前の版では、そのような文字列は NaN に変換されていました。
9.3 : ECMAScript 2018 では、Template オブジェクトは、以前の版のように Realm 内のその template literal または tagged template のすべての出現に基づくのではなく、Parse Node (ソース位置)に基づいて canonicalize されます。
12.2 : ECMAScript 2016 では、Unicode 5.1 を必須としていた ECMAScript 2015 とは異なり、Unicode 8.0.0 以降が必須となりました。特に、これにより ECMAScript 2015 では Space_Separator(Zs)カテゴリにあり空白として扱われていた U+180E MONGOLIAN VOWEL SEPARATOR が、(Unicode 6.3.0 以降)Format(Cf)カテゴリへ移動しました。これにより、空白に依存するメソッドの動作が異なるようになります。たとえば、以前の版では "\u180E".trim().length は 0 でしたが、ECMAScript 2016 以降では 1 です。さらに、ECMAScript 2017 は常に Unicode Standard の最新バージョンを使用することを必須としました。
12.7 : ECMAScript 2015 では、IdentifierName に有効なコードポイントは Unicode プロパティ「ID_Start」および「ID_Continue」を用いて規定されます。以前の版では、有効な IdentifierName または Identifier コードポイントは、さまざまな Unicode コードポイントカテゴリを列挙することによって規定されていました。
12.10.1 : ECMAScript 2015 では、セミコロンが欠落している場合、Automatic Semicolon Insertion は do-while 文の末尾にセミコロンを追加します。この変更により、仕様が既存のほとんどの実装の実際の動作と一致します。
13.2.5.1 : ECMAScript 2015 では、Object Initializer に重複するプロパティ名 があることは、もはや早期エラー ではありません。
13.15.1 : ECMAScript 2015 では、FunctionExpression の関数名のような不変束縛への代入を含む strict モードコード は早期エラー を生成しません。代わりに実行時エラーを生成します。
14.2 : ECMAScript 2015 では、token let で始まり、その後に入力要素 LineTerminator 、次に Identifier が続く StatementList は LexicalDeclaration の開始です。以前の版では、automatic semicolon insertion は常に Identifier 入力要素の前にセミコロンを挿入していました。
14.5 : ECMAScript 2015 では、token let で始まり、その後に token [ が続く StatementListItem は LexicalDeclaration の開始です。以前の版では、そのようなシーケンスは ExpressionStatement の開始でした。
14.6.2 : ECMAScript 2015 では、IfStatement の正常結果が値 empty になることはありません。Statement 部分が評価されない場合、または評価された Statement 部分が empty を含む正常完了 を生成した場合、IfStatement の結果は undefined です。
14.7 : ECMAScript 2015 では、for 文の ( token の直後に token シーケンス let [ が続く場合、let は LexicalDeclaration の開始として扱われます。以前の版では、そのような token シーケンスは Expression の開始でした。
14.7 : ECMAScript 2015 では、for-in 文の ( token の直後に token シーケンス let [ が続く場合、let は ForDeclaration の開始として扱われます。以前の版では、そのような token シーケンスは LeftHandSideExpression の開始でした。
14.7 : ECMAScript 2015 より前は、初期化式が in キーワード より前の VariableDeclaration の一部として現れることができました。ECMAScript 2015 では、同じ位置の ForBinding にそのような initializer が現れることは許可されません。ECMAScript 2017 では、そのような initializer は非 strict コード でのみ許可されます。
14.7 : ECMAScript 2015 では、IterationStatement の評価結果が [[Value]] に empty を持つ正常完了 になることはありません。IterationStatement の Statement 部分が評価されない場合、または Statement 部分の最終評価が [[Value]] に empty を持つ正常完了 を生成する場合、IterationStatement の評価結果は [[Value]] に undefined を持つ正常完了 です。
14.11.2 : ECMAScript 2015 では、WithStatement の評価結果が [[Value]] に empty を持つ正常完了 になることはありません。WithStatement の Statement 部分の評価が [[Value]] に empty を持つ正常完了 を生成する場合、WithStatement の評価結果は [[Value]] に undefined を持つ正常完了 です。
14.12.4 : ECMAScript 2015 では、SwitchStatement の評価結果が [[Value]] に empty を持つ正常完了 になることはありません。SwitchStatement の CaseBlock 部分の評価が [[Value]] に empty を持つ正常完了 を生成する場合、SwitchStatement の評価結果は [[Value]] に undefined を持つ正常完了 です。
14.15 : ECMAScript 2015 では、Catch 節が Catch 節のパラメーターに現れるものと同じ Identifier に対する var 宣言を含むことは早期エラー です。以前の版では、そのような変数宣言は外側の変数環境でインスタンス化されますが、その宣言の Initializer 値は Catch パラメーターへ代入されていました。
14.15 、19.2.1.3 : ECMAScript 2015 では、Catch 節が、eval コード内に Catch 節のパラメーターに現れるものと同じ Identifier を束縛する var または FunctionDeclaration 宣言を含む非 strict の direct eval を評価した場合、実行時 SyntaxError がスローされます。
14.15.3 : ECMAScript 2015 では、TryStatement の結果が値 empty になることはありません。TryStatement の Block 部分が empty を含む正常完了 に評価される場合、TryStatement の結果は undefined です。TryStatement の Block 部分がスロー完了に評価され、かつ empty を含む正常完了 に評価される Catch 部分を持つ場合、Finally 節がないか、その Finally 節が empty の正常完了 に評価される場合、TryStatement の結果は undefined です。
15.4.5 ECMAScript 2015 では、ObjectLiteral 内のアクセサープロパティ の [[Getter]] または [[Setter]] 属性の値として作成される関数オブジェクト はコンストラクター 関数ではなく、"prototype" own プロパティを持ちません。以前の版では、それらはコンストラクター であり、"prototype" プロパティを持っていました。
20.1.2.6 : ECMAScript 2015 では、Object.freeze の引数がオブジェクトでない場合、own プロパティを持たない非拡張可能な通常オブジェクト であるかのように扱われます。以前の版では、オブジェクトでない引数は常に TypeError をスローさせていました。
20.1.2.8 : ECMAScript 2015 では、Object.getOwnPropertyDescriptor の引数がオブジェクトでない場合、ToObject を使用して引数を強制変換しようとします。強制変換に成功した場合、その結果が元の引数値の代わりに使用されます。以前の版では、オブジェクトでない引数は常に TypeError をスローさせていました。
20.1.2.10 : ECMAScript 2015 では、Object.getOwnPropertyNames の引数がオブジェクトでない場合、ToObject を使用して引数を強制変換しようとします。強制変換に成功した場合、その結果が元の引数値の代わりに使用されます。以前の版では、オブジェクトでない引数は常に TypeError をスローさせていました。
20.1.2.12 : ECMAScript 2015 では、Object.getPrototypeOf の引数がオブジェクトでない場合、ToObject を使用して引数を強制変換しようとします。強制変換に成功した場合、その結果が元の引数値の代わりに使用されます。以前の版では、オブジェクトでない引数は常に TypeError をスローさせていました。
20.1.2.16 : ECMAScript 2015 では、Object.isExtensible の引数がオブジェクトでない場合、own プロパティを持たない非拡張可能な通常オブジェクト であるかのように扱われます。以前の版では、オブジェクトでない引数は常に TypeError をスローさせていました。
20.1.2.17 : ECMAScript 2015 では、Object.isFrozen の引数がオブジェクトでない場合、own プロパティを持たない非拡張可能な通常オブジェクト であるかのように扱われます。以前の版では、オブジェクトでない引数は常に TypeError をスローさせていました。
20.1.2.18 : ECMAScript 2015 では、Object.isSealed の引数がオブジェクトでない場合、own プロパティを持たない非拡張可能な通常オブジェクト であるかのように扱われます。以前の版では、オブジェクトでない引数は常に TypeError をスローさせていました。
20.1.2.19 : ECMAScript 2015 では、Object.keys の引数がオブジェクトでない場合、ToObject を使用して引数を強制変換しようとします。強制変換に成功した場合、その結果が元の引数値の代わりに使用されます。以前の版では、オブジェクトでない引数は常に TypeError をスローさせていました。
20.1.2.20 : ECMAScript 2015 では、Object.preventExtensions の引数がオブジェクトでない場合、own プロパティを持たない非拡張可能な通常オブジェクト であるかのように扱われます。以前の版では、オブジェクトでない引数は常に TypeError をスローさせていました。
20.1.2.22 : ECMAScript 2015 では、Object.seal の引数がオブジェクトでない場合、own プロパティを持たない非拡張可能な通常オブジェクト であるかのように扱われます。以前の版では、オブジェクトでない引数は常に TypeError をスローさせていました。
20.2.3.2 : ECMAScript 2015 では、bound function の [[Prototype]] 内部スロットは、そのターゲット関数の [[GetPrototypeOf]] 値に設定されます。以前の版では、[[Prototype]] は常に %Function.prototype% に設定されていました。
20.2.4.1 : ECMAScript 2015 では、関数インスタンスの "length" プロパティは configurable です。以前の版では configurable ではありませんでした。
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 Standard に従って正準等価な String を同一として扱わなければなりません。以前の版では、実装は正準等価性を無視し、代わりにビット単位比較を使用することが許可されていました。
22.1.3.28 および 22.1.3.30 ECMAScript 2015 では、小文字/大文字変換処理はコードポイントに対して動作します。以前の版では、その変換処理は個々の code unit にのみ適用されていました。影響を受けるコードポイントは Unicode の Deseret ブロック内のものだけです。
22.1.3.32 ECMAScript 2015 では、String.prototype.trim メソッドは Unicode BMP の外部に存在し得る空白コードポイントを認識するよう定義されています。ただし、Unicode 7 時点ではそのようなコードポイントは定義されていません。以前の版では、そのようなコードポイントは空白として認識されませんでした。
22.2.4.1 ECMAScript 2015 では、pattern 引数が RegExp インスタンスであり、flags 引数が undefined でない場合、pattern と同様だが pattern のフラグを引数 flags で置き換えた新しい RegExp インスタンスが作成されます。以前の版では、pattern が RegExp インスタンスで flags が undefined でない場合、TypeError 例外がスローされていました。
22.2.6 ECMAScript 2015 では、RegExp prototype オブジェクト は RegExp インスタンスではありません。以前の版では、パターンが空の String である RegExp インスタンスでした。
22.2.6 ECMAScript 2015 では、"source" 、"global" 、"ignoreCase" 、および "multiline" は RegExp prototype オブジェクト 上に定義されるアクセサープロパティ です。以前の版では、RegExp インスタンス上に定義されるデータプロパティ でした。
25.4.10 : ECMAScript 2019 では、Atomics.wait との混同を防ぐため、Atomics.wake は Atomics.notify に改名されました。
27.1.5.4 、27.9.3.6 : ECMAScript 2019 では、await によってキューに追加される Job の数が削減され、then() 呼出しと await 式との間の resolve 順序に観測可能な差異が生じる可能性があります。
参考文献
IEEE 754-2019 : IEEE Standard for Floating-Point Arithmetic . Institute of Electrical and Electronic Engineers, New York (2019)
注
IEEE 754-2008 と IEEE 754-2019 の間には、ECMA-262 仕様に影響する規範的変更はありません。
The Unicode Standard 、<https://unicode.org/versions/latest > で入手可能
Unicode Technical Note #5: Canonical Equivalence in Applications 、<https://unicode.org/notes/tn5/ > で入手可能
Unicode Technical Standard #10: Unicode Collation Algorithm 、<https://unicode.org/reports/tr10/ > で入手可能
Unicode Standard Annex #15, Unicode Normalization Forms 、<https://unicode.org/reports/tr15/ > で入手可能
Unicode Standard Annex #18: Unicode Regular Expressions 、<https://unicode.org/reports/tr18/ > で入手可能
Unicode Standard Annex #24: Unicode Script Property 、<https://unicode.org/reports/tr24/ > で入手可能
Unicode Standard Annex #31, Unicode Identifiers and Pattern Syntax 、<https://unicode.org/reports/tr31/ > で入手可能
Unicode Standard Annex #44: Unicode Character Database 、<https://unicode.org/reports/tr44/ > で入手可能
Unicode Technical Standard #51: Unicode Emoji 、<https://unicode.org/reports/tr51/ > で入手可能
IANA Time Zone Database 、<https://www.iana.org/time-zones > で入手可能
ISO 8601-1:2019(E) Date and time — Representations for information interchange — Part 1: Basic rules および Amendment 1:2022。
RFC 1738 “Uniform Resource Locators (URL)” 、<https://rfc-editor.org/info/rfc1738 > で入手可能
RFC 2396 “Uniform Resource Identifiers (URI): Generic Syntax” 、<https://rfc-editor.org/info/rfc2396 > で入手可能
RFC 3629 “UTF-8, a transformation format of ISO 10646” 、<https://rfc-editor.org/info/rfc3629 > で入手可能
RFC 7231 “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content” 、<https://rfc-editor.org/info/rfc7231 > で入手可能
RFC 9557 “Date and Time on the Internet: Timestamps with Additional Information” 、<https://rfc-editor.org/info/rfc9557 > で入手可能
奥付
この仕様は、GitHub 上で、Ecmarkup と呼ばれるプレーンテキストソース形式を使用して執筆されています。Ecmarkup は HTML および Markdown の方言であり、Ecma 仕様をプレーンテキストで執筆し、その仕様をこの文書の編集規約に従う高機能な HTML レンダリングへ処理するためのフレームワークとツールセットを提供します。Ecmarkup は、構文を定義するための Grammarkdown やアルゴリズム手順を記述するための Ecmarkdown を含む、多数の他の形式および技術の上に構築され、それらを統合しています。この仕様の PDF レンダリングは CSS Paged Media 仕様を活用した印刷スタイルシートを使用して生成され、PrinceXML を使用して変換されます。
この仕様の以前の版は Word を使用して執筆されていました。この版の基礎となった Ecmarkup ソーステキストは、自動変換ツールを使用して ECMAScript 2015 Word 文書を Ecmarkup へ変換することで生成されました。
著作権およびソフトウェアライセンス
Ecma International
Rue du Rhone 114
CH-1204 Geneva
Tel: +41 22 849 6000
Fax: +41 22 849 6001
Web: https://ecma-international.org/
著作権表示
ALTERNATIVE COPYRIGHT NOTICE AND COPYRIGHT LICENSE
© 2026 Ecma International
By obtaining and/or copying this work, you (the licensee) agree that you
have read, understood, and will comply with the following terms and
conditions.
Permission under Ecma’s copyright to copy, modify, prepare derivative works
of, and distribute this work, with or without modification, for any purpose
and without fee or royalty is hereby granted, provided that you include the
following on ALL copies of the work or portions thereof, including
modifications:
(i) The full text of this COPYRIGHT NOTICE AND COPYRIGHT LICENSE in a location
viewable to users of the redistributed or derivative work.
(ii) Any pre-existing intellectual property disclaimers, notices, or terms and
conditions. If none exist, the Ecma alternative copyright notice should be
included.
(iii) Notice of any changes or modifications, through a copyright statement on
the document such as “This document includes material copied from or
derived from ECMAScript® 2027 言語 仕様 https://tc39.es/ecma262/.
Copyright © Ecma International.”
Disclaimers
THIS WORK IS PROVIDED “AS IS,” AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS
OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES
OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF
THE DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS,
TRADEMARKS OR OTHER RIGHTS.
COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT.
The name and trademarks of copyright holders may NOT be used in advertising
or publicity pertaining to the work without specific, written prior
permission. Title to copyright in this work will at all times remain with
copyright holders.
ソフトウェアライセンス
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:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
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.
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.