Draft ECMA-262 / May 7, 2026

ECMAScript® 2027 Language Specification

この仕様について

https://tc39.es/ecma262/ にあるドキュメントは、最も正確で最新のECMAScript仕様書です。最新の年次スナップショットの内容と、提案プロセスでステージ4に到達し、いくつかの実装ですでに実装され、次回の年次スナップショットに含まれる完了した提案も含まれています。過去のスナップショットは https://ecma-international.org/publications-and-standards/standards/ecma-262/ で入手できます。

このドキュメントは単一ページおよび複数ページとして利用できます。

この仕様への貢献

この仕様は、ECMAScriptコミュニティの協力のもとGitHub上で開発されています。以下のような方法で本仕様の開発に貢献できます:

このドキュメントの作成方法の詳細はコロフォンを参照してください。

はじめに

このEcma規格はECMAScript 2027言語を定義します。これはECMAScript言語仕様の第18版です。ECMAScriptは、最もよく知られているものとしてJavaScript(Netscape)やJScript(Microsoft)など、いくつかの起源技術を基にしています。この言語はNetscapeのBrendan Eichによって考案され、最初は同社のNavigator 2.0ブラウザに登場しました。ウェブブラウザに組み込まれた言語として有名ですが、サーバや組込み用途などブラウザ以外でも幅広く採用され、世界で最も広く使われている汎用プログラミング言語の一つとなりました。

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版が承認されました。第1版と第2版の間の変更点は編集上のものです。

標準の第3版では、強力な正規表現の導入、文字列処理の強化、新たな制御文、try/catch例外処理、エラーのより厳密な定義、数値出力の書式設定、将来の言語発展を見越した軽微な変更が加えられました。第3版は1999年12月のEcma総会で採択され、2002年6月にISO/IEC 16262:2002として発行されました。

第3版発行後、ECMAScriptはWorld Wide Webとともに爆発的に普及し、事実上すべてのウェブブラウザが対応するプログラミング言語となりました。ECMAScript第4版の開発にも大きな労力が注がれましたが、これは完成には至らず第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活用支援がありました。主な拡張には、モジュール、クラス宣言、レキシカルブロックスコープ、イテレータ・ジェネレータ、非同期プログラミングのためのPromise、分割代入パターン、適切な末尾呼び出しなどが含まれます。組み込みライブラリには、MapやSet、バイナリ数値配列などのデータ抽象サポート、文字列と正規表現のUnicode補助文字対応の拡張、サブクラス化による拡張性の向上が加わりました。第6版は、定期的かつ段階的な言語・ライブラリの改良の基盤となります。第6版は2015年6月の総会で採択されました。

ECMAScript 2016は、Ecma TC39の新しい年次リリースサイクルとオープンな開発プロセスによる最初の版です。ECMAScript 2015のソース文書をもとにプレーンテキストのソース文書が作成され、全てGitHub上で開発が進みました。この規格の開発期間中に数百件のプルリクエスト・イシューが提起され、数千件のバグ修正や編集修正、改善がなされました。さらに、Ecmarkup、Ecmarkdown、Grammarkdownなど多数の支援ツールも開発されました。ES2016では新たにべき乗演算子を導入し、Array.prototypeincludes メソッドを追加しました。

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

ECMAScript 2018では、asyncイテレータープロトコルとasyncジェネレータによる非同期反復のサポートが導入されました。また、dotAllフラグ、名前付きキャプチャグループ、Unicodeプロパティエスケープ、後方参照といった4つの正規表現新機能、さらにオブジェクトのレスト・スプレッドプロパティも追加されました。

ECMAScript 2019では、配列の平坦化を行うArray.prototype.flatflatMapObject.entriesの戻り値を直接新しいオブジェクトへ変換するObject.fromEntries、より適切な名前のString.prototype.trimStarttrimEndが導入されました(従来の非標準組み込みString.prototype.trimLeft trimRightの代替)。その他、構文・意味論の小規模な更新として、catchパラメータの省略と、JSONと整合するようにU+2028(行区切り)・U+2029(段落区切り)も文字列リテラルで許容されました。さらには、Array.prototype.sortの安定ソートの義務化、JSON.stringifyの常に整形式なUTF-8返却、Function.prototype.toStringのソースまたは標準的プレースホルダ返却要件が明確化されました。

第11版であるECMAScript 2020では、グローバルな正規表現で生成される全マッチオブジェクトを反復できるmatchAll(String)、動的指定子で非同期的にモジュールをインポートするimport()構文、任意精度整数を扱う新プリミティブ型BigInt、短絡しないPromise結合子Promise.allSettled、グローバルthis参照のためのglobalThis、モジュール専用のexport * as ns from 'module'構文、for-in列挙順序の規格化、import.meta(ホストが与えるモジュール情報オブジェクト)、nullish値への対応を強化するnull合体(??)演算子およびオプショナルチェイン(?.)も追加されました。

第12版であるECMAScript 2021では、replaceAll(String)、Promise.any(いずれか1つがfulfilled時に短絡するPromise結合子)、複数エラー同時表現の新しいエラー型AggregateError、論理代入演算子(??=, &&=, ||=)、ガベージコレクション抑止なし参照用WeakRef、クリーンアップ処理管理のFinalizationRegistry、数値リテラルのセパレータ(1_000)、Array.prototype.sortの仕様上より明確な定義などが導入されました。

第13版であるECMAScript 2022では、モジュールのトップレベルでawaitが使用可能になり、新しいクラス要素(パブリック/プライベートのインスタンスフィールドや静的フィールド、プライベートインスタンスメソッド・アクセサ、プライベート静的メソッド・アクセサ)、クラス内のstaticブロック、#x in obj構文、正規表現の/dフラグ(インデックス情報の取得)、Errorオブジェクトのcauseプロパティ、文字列・配列・TypedArrayatメソッド、Object.hasOwnが追加されました。

第14版であるECMAScript 2023では、Array.prototypeTypedArray.prototypetoSortedtoReversedwithfindLastfindLastIndexメソッド、Array.prototypetoSplicedが追加され、実行可能ECMAScriptファイル支援のため先頭の#!コメント対応、大半のSymbolがWeakコレクションのキーで使用可能となりました。

第15版であるECMAScript 2024では、ArrayBufferやSharedArrayBufferのリサイズ・転送機能、より高度な文字列集合操作に利用できる新しい正規表現/vフラグ、Promise構築のためのPromise.withResolvers、データ集約用のObject.groupByMap.groupBy、共有メモリの非同期監視Atomics.waitAsync、文字列のUnicode整形式チェック/修正String.prototype.isWellFormedtoWellFormedが導入されました。

第16版であるECMAScript 2025では、イテレータ操作用の新たなグローバルIteratorと関連静的・プロトタイプメソッド、Setの共通操作追加、JSONモジュールのimportやimport属性宣言構文、正規表現で安全に使えるように文字列をエスケープするRegExp.escape、フラグのインライン切替構文、Promise化を保証するPromise.try、新しい型付き配列Float16Array、およびDataView.prototype.getFloat16setFloat16Math.f16roundメソッドが追加されました。

第17版であるECMAScript 2026では、さまざまな大きさの数値を精度落としを抑えて合計するMath.sumPrecise、イテレータ連結のIterator.concat、asyncイテラブルなどから非同期でArrayを構築するArray.fromAsync、エラー判定のError.isError、MapとWeakMap取得時のデフォルト値提供メソッド、Uint8Arrayによる16進・base64文字列変換、JSON.parseのreviverにJSONソース断片を受けるパラメータ、プリミティブ値の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 Standard および ISO/IEC 10646 の最新版に適合するように解釈しなければならない。

異なる人間言語および国で用いられる言語的・文化的慣習に適応する必要があるプログラムを支援するアプリケーションプログラミングインターフェース(API)を提供する ECMAScript の適合実装は、この仕様と互換性のある ECMA-402 の最新版で定義されたインターフェースを実装しなければならない。

ECMAScript の適合実装は、この仕様に記述されているものを超える追加の型、値、オブジェクト、プロパティ、および関数を提供してもよい。特に、ECMAScript の適合実装は、この仕様に記述されているオブジェクトについて、この仕様に記述されていないプロパティおよびそれらの値を提供してもよい。

ECMAScript の適合実装は、この仕様に記述されていないプログラム構文および正規表現構文をサポートしてもよい。特に、ECMAScript の適合実装は、この仕様の節 12.7.2 に記載された「将来予約語」のいずれかを利用するプログラム構文をサポートしてもよい。

ECMAScript の適合実装は、節 17.1 に禁止拡張として列挙されている拡張を実装してはならない。

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

ECMAScript の適合実装は、別段の указ示がない限り、Normative Optional 節を実装するか否かを選択してよい。ウェブブラウザは一般に、すべての Normative Optional 節を実装することが要求される。(付録 B を参照。)いずれかの Normative Optional の振る舞いが実装される場合、その包含する Normative Optional 節内のすべての振る舞いを実装しなければならない。Normative Optional 節は、この仕様では以下に示すように色付きのボックス内に "Normative Optional" という語で示される。

2.1 Normative Optional 節見出しの例

節内容の例。

ECMAScript の適合実装は、Legacy 節を実装しなければならない。ただし、それらが Normative Optional としてもマークされている場合を除く。Legacy 節内で規定される言語機能および振る舞いはすべて、1 つ以上の望ましくない特性を持つ。しかし、既存のアプリケーションで継続して使用されているため、それらをこの仕様から削除することはできない。これらの機能は ECMAScript 言語の中核部分とはみなされない。プログラマは、新しい ECMAScript コードを書く際に、これらの機能や振る舞いを使用したり、その存在を前提としたりすべきではない。

2.2 Legacy 節見出しの例

節内容の例。

2.3 Legacy Normative Optional 節見出しの例

節内容の例。

3 引用規格

以下に示す参照文書は、この文書の適用に不可欠である。日付付き参照については、引用された版のみが適用される。日付なし参照については、参照文書の最新版(あらゆる改訂を含む)が適用される。

IEEE 754-2019, IEEE Standard for Floating-Point Arithmetic.

Unicode Standard.
https://unicode.org/versions/latest

ISO/IEC 10646, Information Technology — Universal Multiple-Octet Coded Character Set (UCS) および Amendment 1:2005, Amendment 2:2006, Amendment 3:2008, Amendment 4:2008, ならびに追加の改訂および訂正、または後継規格。

ECMA-402, ECMAScript Internationalization API Specification, 特にこの仕様のこの版に対応する年次版。
https://www.ecma-international.org/publications-and-standards/standards/ecma-402/

ECMA-404, The JSON Data Interchange Format.
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 スクリプティング

ウェブブラウザは ECMAScript のクライアント側計算のためのホスト環境を提供する。これには、たとえばウィンドウ、メニュー、ポップアップ、ダイアログボックス、テキストエリア、アンカー、フレーム、履歴、クッキー、および入出力を表すオブジェクトが含まれる。さらに、ホスト環境は、フォーカスの変更、ページや画像の読み込み、アンロード、エラーや中断、選択、フォーム送信、およびマウス操作といったイベントにスクリプトコードを関連付ける手段を提供する。スクリプトコードは HTML 内に現れ、表示されるページはユーザーインターフェース要素と固定または計算によるテキストおよび画像の組合せとなる。スクリプトコードはユーザー操作に反応し、メインプログラムは不要である。

ウェブサーバは、リクエスト、クライアント、およびファイルを表すオブジェクト、ならびにデータをロックし共有する仕組みを含む、サーバ側計算のための別のホスト環境を提供する。ブラウザ側とサーバ側のスクリプティングを組み合わせることで、Web ベースのアプリケーション向けにカスタマイズされたユーザーインターフェースを提供しつつ、計算をクライアントとサーバの間で分散することが可能になる。

ECMAScript をサポートする各ウェブブラウザおよびサーバは、それぞれ独自のホスト環境を提供し、ECMAScript 実行環境を完成させる。

4.2 ホストと実装

ECMAScript をホスト環境へ統合することを助けるために、この仕様は、特定の機能(たとえば抽象操作)の定義を、この仕様の外部の情報源に、全体または一部について委ねている。編集上、この仕様では以下の種類の委譲を区別する。

implementation とは、付録 D に列挙された機能、または implementation-defined もしくは implementation-approximated とマークされた機能をさらに定義する外部情報源である。非形式的な用法では、implementation は特定のウェブブラウザのような具体的成果物を指す。

implementation-defined 機能とは、追加の限定なしにその定義を外部情報源に委ねる機能である。この仕様は特定の振る舞いを推奨せず、適合実装はこの仕様が課す制約の範囲内で自由に任意の振る舞いを選択できる。

implementation-approximated 機能とは、理想的な振る舞いを推奨しつつ、その定義を外部情報源に委ねる機能である。適合実装はこの仕様が課す制約の範囲内で任意の振る舞いを選択できるが、理想に近づくよう努めることが推奨される。Math.exp のようないくつかの数学演算は implementation-approximated である。

host とは、付録 D に列挙された機能をさらに定義するが、他の implementation-defined または implementation-approximated 機能はさらに定義しない外部情報源である。非形式的な用法では、host は、付録 D を通じて同じ方法でこの仕様と接続する、すべてのウェブブラウザの集合のような、すべての実装の集合を指す。host はしばしば WHATWG HTML(https://html.spec.whatwg.org/)のような外部仕様である。言い換えれば、host-defined な機能はしばしば外部仕様でさらに定義される。

host hook とは、外部情報源によって全体または一部が定義される抽象操作である。すべての host hook は付録 D に列挙されなければならない。host hook は少なくとも次の要件に適合しなければならない。

host-defined 機能とは、追加の限定なしにその定義を外部情報源に委ね、かつ付録 D に列挙されている機能である。host でない実装も host-defined 機能に対する定義を提供してよい。

host environment とは、すべての host-defined 機能に対する定義の特定の選択である。host environment には通常、グローバルオブジェクトhost-defined プロパティとして入力取得および出力提供を可能にするオブジェクトまたは関数が含まれる。

この仕様は、常に最も具体的な用語を使うという編集上の慣例に従う。たとえば、ある機能が host-defined であるなら、それを implementation-defined と呼ぶべきではない。

host と implementation の双方は、ここで定義される言語型、仕様型、抽象操作、文法生成規則、intrinsic object、および intrinsic symbol を通じてこの仕様と接続してよい。

4.3 ECMAScript の概要

以下は ECMAScript の非形式的な概要であり、言語のすべての部分が記述されているわけではない。この概要は標準本文の一部ではない。

ECMAScript はオブジェクトベースである。すなわち、基本言語機能およびホスト機能はオブジェクトによって提供され、ECMAScript プログラムは相互に通信するオブジェクト群から成る。ECMAScript において、object は 0 個以上の property の集合であり、各 property はその利用方法を決定する attribute を持つ。たとえば、ある property の Writable attribute が false に設定されていると、その property に別の値を代入しようとする実行中の ECMAScript コードの試みは失敗する。property は、他のオブジェクト、primitive value、または function を保持するコンテナである。primitive value は以下の組込み型のいずれかのメンバである:Undefined, Null, Boolean, Number, BigInt, String, および Symbol; object は組込み型 Object のメンバであり、function は呼出し可能オブジェクトである。property を通じて object に関連付けられた function は method と呼ばれる。

ECMAScript は、ECMAScript 実体の定義を補完する built-in object の集合を定義する。これらの built-in object には、global object、ObjectFunctionBooleanSymbol、およびさまざまな Error object を含む言語の実行時意味論に不可欠な object、MathNumber、および Date を含む数値を表現および操作する object、テキスト処理 object である StringRegExpArray と、すべての要素が特定の数値データ表現を持つ 9 種類の Typed Array を含むインデックス付き値コレクションを表す object、Map および Set object を含むキー付きコレクション、JSON object、ArrayBufferSharedArrayBuffer、および DataView を含む構造化データを支援する object、generator function および Promise object を含む制御抽象を支援する object、ならびに ProxyReflect を含む reflection object がある。

ECMAScript はまた、組込み operator の集合も定義する。ECMAScript の operator には、さまざまな単項演算、乗法演算子、加法演算子、ビット単位シフト演算子、関係演算子、等値演算子、二項ビット演算子、二項論理演算子、代入演算子、およびコンマ演算子が含まれる。

大規模な ECMAScript プログラムは、プログラムを複数の文および宣言の列に分割できるようにする module によって支えられる。各 module は、他の module から提供される必要がある使用宣言と、自身の宣言のうち他の module から利用可能なものを明示的に識別する。

ECMAScript の構文は意図的に Java の構文に似せてある。ECMAScript の構文は、使いやすいスクリプト言語として機能できるように緩やかにされている。たとえば、変数には宣言は不要であり、型は property に関連付けられず、定義された function は、その呼出しより前にテキスト上で宣言が現れる必要もない。

4.3.1 オブジェクト

ECMAScript にはクラス定義のための構文が含まれているが、ECMAScript の object は、C++、Smalltalk、Java におけるそれらのように、本質的にクラスベースではない。代わりに object は、リテラル記法や、object を生成した後で property に初期値を代入してその全部または一部を初期化するコードを実行する constructor を介するなど、さまざまな方法で生成されうる。各 constructor"prototype" という名前の property を持つ function であり、これは prototype-based inheritanceshared properties を実装するために用いられる。object は new 式で constructor を用いて生成される。たとえば new Date(2009, 11) は新しい Date object を生成する。new を使わずに constructor を呼び出した場合の結果は、その constructor に依存する。たとえば Date() は object ではなく現在の日付と時刻の文字列表現を生成する。

constructor によって生成されたすべての object は、自身の constructor"prototype" property の値への暗黙参照(その object の prototype と呼ばれる)を持つ。さらに、prototype はその prototype への非 null の暗黙参照を持っていてもよく、以下同様に連鎖する。これを prototype chain と呼ぶ。object 内の property が参照されるとき、その参照は、その名前の property を含む prototype chain 上で最初の object にあるその名前の property を指す。言い換えれば、まず直接言及された object がそのような property を持つか調べられ、その object がその名前の property を持っていれば、その property が参照先となる。持っていなければ、その object の prototype が次に調べられ、以下同様である。

Figure 1: Object/Prototype Relationships
多数のボックスと矢印からなる画像。

クラスベースのオブジェクト指向言語では、一般に状態はインスタンスが保持し、メソッドはクラスが保持し、継承されるのは構造と振る舞いのみである。ECMAScript では、状態とメソッドは object が保持し、構造、振る舞い、および状態のすべてが継承される。

自身の prototype が持つ特定の property を直接含まないすべての object は、その property とその値を共有する。図 1 はこれを示している。

CFconstructor(であり、同時に object でもある)である。new 式を用いて 5 個の object が生成されている:cf1, cf2, cf3, cf4, および cf5。これらの各 object は "q1" および "q2" という名前の property を含む。破線は暗黙の prototype 関係を表す。したがって、たとえば cf3 の prototype は CFp である。constructor である CF 自身は "P1" および "P2" という 2 つの property を持つが、これらは CFp, cf1, cf2, cf3, cf4, または cf5 からは見えない。CFp 内の "CFP1" という名前の property は、cf1, cf2, cf3, cf4, および cf5 によって共有される(ただし CF には共有されない)。同様に、CFp の暗黙 prototype chain 内で "q1""q2"、または "CFP1" 以外の名前を持つ property は共有される。CFCFp の間には暗黙の prototype link が存在しないことに注意。

ほとんどのクラスベース object 言語とは異なり、property は値を代入することによって動的に object に追加できる。すなわち constructor は、生成される object の property のすべて、またはいずれかに名前を付けたり値を代入したりする必要はない。上図では、CFp の property に新しい値を代入することで、cf1, cf2, cf3, cf4, および cf5 のための新たな共有 property を追加できる。

ECMAScript の object は本質的にはクラスベースではないが、constructor function、prototype object、および method の共通パターンに基づくクラス様抽象を定義すると便利なことが多い。ECMAScript の built-in object 自身もそのようなクラス様パターンに従う。ECMAScript 2015 以降、ECMAScript 言語には、プログラマが built-in object に使われるのと同じクラス様抽象パターンに適合する object を簡潔に定義できる構文的クラス定義が含まれている。

4.3.2 ECMAScript の strict 変種

ECMAScript 言語は、この言語の利用者の中に、言語で利用可能な機能の一部の使用を制限したいと望む者がいる可能性を認識している。彼らは、安全性の観点から、エラーを起こしやすいとみなす機能を避けるため、強化されたエラーチェックを得るため、あるいはその他自身が選ぶ理由のためにそうするかもしれない。この可能性を支援するために、ECMAScript は言語の strict 変種を定義する。言語の strict 変種は、通常の ECMAScript 言語における特定の構文的・意味論的機能の一部を除外し、一部の機能の詳細な意味論を変更する。また strict 変種は、言語の非 strict 形式ではエラーと規定されていない状況においても、エラー例外を投げることで報告しなければならない追加のエラー条件を規定する。

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

この仕様に適合するためには、ECMAScript 実装は、この仕様で定義される完全な無制限 ECMAScript 言語と、ECMAScript 言語の strict 変種の両方を実装しなければならない。さらに、実装は、無制限および strict mode のソーステキスト単位を単一の複合プログラムに組み合わせることをサポートしなければならない。

4.4 用語及び定義

この文書の目的上、以下の用語及び定義を適用する。

4.4.1 implementation-approximated

implementation-approximated 機能とは、この仕様において推奨される理想的な振る舞いを持つが、その全体または一部が外部情報源によって定義される機能である

4.4.2 implementation-defined

implementation-defined 機能とは、その全体または一部がこの仕様の外部情報源によって定義される機能である

4.4.3 host-defined

implementation-defined と同じ

Note

編集上は、節 4.2 を参照。

4.4.4 type

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

4.4.5 primitive value

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

Note

primitive value は、言語実装の最下位レベルで直接表現されるデータである。

4.4.6 object

Object 型のメンバ

Note

object は property の集合であり、単一の prototype object を持つ。prototype は null であってよい。

4.4.7 constructor

object を生成し初期化する function object

Note

constructor"prototype" property の値は、継承および共有 property を実装するために用いられる prototype object である。

4.4.8 prototype

他の object のために共有 property を提供する object

Note

constructor が object を生成するとき、その object は property 参照を解決する目的で constructor"prototype" property を暗黙に参照する。constructor"prototype" property は、プログラム式 constructor.prototype によって参照でき、object の prototype に追加された property は、継承を通じて、その prototype を共有するすべての object によって共有される。あるいは、新しい object は、組込み関数 Object.create を用いて、明示的に指定された prototype を持つように生成してもよい。

4.4.9 ordinary object

すべての object がサポートしなければならない本質的内部メソッドについて、既定の振る舞いを持つ object

4.4.10 exotic object

1 つ以上の本質的内部メソッドについて既定の振る舞いを持たない object

Note

ordinary object でない object はすべて exotic object である。

4.4.11 standard object

意味論がこの仕様によって定義される object

4.4.12 built-in object

ECMAScript 実装によって規定され、提供される object

Note

標準 built-in object はこの仕様で定義される。ECMAScript 実装は、追加の種類の built-in object を規定し提供してもよい。

4.4.13 undefined value

変数に値が代入されていないときに使用される primitive value

4.4.14 Undefined type

唯一の値が undefined value である型

4.4.15 null value

いかなる object 値も意図的に存在しないことを表す primitive value

4.4.16 Null type

唯一の値が null value である型

4.4.17 Boolean value

Boolean 型のメンバ

Note

Boolean value は truefalse の 2 つだけである。

4.4.18 Boolean type

primitive value truefalse から成る型

4.4.19 Boolean object

標準 built-in Boolean constructor の instance である Object 型のメンバ

Note

Boolean object は new 式で Boolean constructor を用い、引数として Boolean value を与えることで生成される。結果の object は、その値が Boolean value である内部スロットを持つ。Boolean object は Boolean value に強制変換できる。

4.4.20 String value

0 個以上の 16 ビット符号なし整数値からなる有限順序列である primitive value

Note

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

4.4.21 String type

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

4.4.22 String object

標準 built-in String constructor の instance である Object 型のメンバ

Note

String object は new 式で String constructor を用い、引数として String value を与えることで生成される。結果の object は、その値が String value である内部スロットを持つ。String object は、String constructor を function として呼び出すことで String value に強制変換できる(22.1.1.1)。

4.4.23 Number value

倍精度 64 ビット二進形式 IEEE 754-2019 値に対応する primitive value

Note

Number value は Number 型のメンバであり、数の直接表現である。

4.4.24 Number type

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

4.4.25 Number object

標準 built-in Number constructor の instance である Object 型のメンバ

Note

Number object は new 式で Number constructor を用い、引数として Number value を与えることで生成される。結果の object は、その値が Number value である内部スロットを持つ。Number object は、Number constructor を function として呼び出すことで Number value に強制変換できる(21.1.1.1)。

4.4.26 Infinity

正の無限 Number value である Number value

4.4.27 NaN

IEEE 754-2019 NaN(“not a number”)値である Number value

4.4.28 BigInt value

任意精度整数値に対応する primitive value

4.4.29 BigInt type

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

4.4.30 BigInt object

標準 built-in BigInt constructor の instance である Object 型のメンバ

4.4.31 Symbol value

一意で、String ではない Object property key を表す primitive value

4.4.32 Symbol type

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

4.4.33 Symbol object

標準 built-in Symbol constructor の instance である Object 型のメンバ

4.4.34 function

サブルーチンとして呼び出されうる Object 型のメンバ

Note

function は、その property に加えて、呼び出されたときの振る舞いを決定する実行可能コードおよび状態を含む。function のコードは ECMAScript で書かれていてもいなくてもよい。

4.4.35 built-in function

function である built-in object

Note

built-in function の例には parseIntMath.exp がある。host または implementation は、この仕様に記述されていない追加の built-in function を提供してもよい。

4.4.36 built-in constructor

constructor である built-in function

Note

built-in constructor の例には ObjectFunction がある。host または implementation は、この仕様に記述されていない追加の built-in constructor を提供してもよい。

4.4.37 property

key(String value または Symbol value のいずれか)と値を関連付ける object の一部

Note

property の形式に応じて、値はデータ値(primitive value、object、または function object)として直接表現される場合もあれば、アクセサ関数の対によって間接的に表現される場合もある。

4.4.38 method

property の値である function

Note

function が object の method として呼び出されるとき、その object はその function に this 値として渡される。

4.4.39 built-in method

built-in function である method

Note

標準 built-in method はこの仕様で定義される。host または implementation は、この仕様に記述されていない追加の built-in method を提供してもよい。

4.4.40 attribute

property の何らかの特性を定義する内部値

4.4.41 own property

その object に直接含まれる property

4.4.42 inherited property

own property ではないが、その object の prototype の property(own または inherited のいずれか)である object の property

4.5 この仕様の構成

この仕様の残りは以下のように構成される。

5 は、この仕様全体で用いられる記法規約を定義する。

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

11 から 17 までは、その構文符号化およびすべての言語機能の実行意味論を含む、実際の ECMAScript プログラミング言語を定義する。

18 から 28 までは、ECMAScript 標準ライブラリを定義する。そこには、ECMAScript プログラムが実行中に利用できるすべての標準 object の定義が含まれる。

29 は、SharedArrayBuffer を基盤とするメモリへのアクセスおよび Atomics object のメソッドに関するメモリ一貫性モデルを記述する。

5 記法規約

5.1 構文文法と字句文法

5.1.1 文脈自由文法

文脈自由文法は複数の production から成る。各 production は、その left-hand side として nonterminal と呼ばれる抽象記号を持ち、その right-hand side として 0 個以上の nonterminal 記号および terminal 記号の列を持つ。各文法において、terminal 記号は指定されたアルファベットから取られる。

chain production とは、その右辺に terminal 記号が 0 個以上付随し、かつちょうど 1 個の nonterminal 記号を持つ production である。

goal symbol と呼ばれる、単一の特別な nonterminal から成る文から出発して、与えられた文脈自由文法は 1 つの language、すなわち、その列の中の任意の nonterminal を、その nonterminal を左辺とする production の右辺で繰り返し置き換えることにより得られる、terminal 記号列の(おそらく無限の)集合を規定する。

5.1.2 字句文法と RegExp 文法

ECMAScript の lexical grammar は節 12 に与えられている。この文法は、11.1 で定義される SourceCharacter の規則に適合する Unicode コードポイントを terminal 記号として持つ。この文法は、goal symbol InputElementDivInputElementTemplateTailInputElementRegExpInputElementRegExpOrTemplateTail、または InputElementHashbangOrRegExp から始まる複数の production を定義し、そのようなコードポイント列がどのように入力要素列へ変換されるかを記述する。

空白およびコメント以外の入力要素は、ECMAScript の構文文法の terminal 記号を成し、ECMAScript の token と呼ばれる。これらの token は、ECMAScript 言語の予約語、識別子、リテラル、および区切り記号である。さらに、行終端子は token とはみなされないが、入力要素ストリームの一部となり、自動セミコロン挿入(12.10)の処理を導く。単純な空白と単一行コメントは破棄され、構文文法の入力要素ストリームには現れない。MultiLineComment(すなわち /**/ 形式のコメントで、複数行にまたがるかどうかを問わない)も、行終端子を含まなければ同様に単に破棄される。しかし、MultiLineComment が 1 個以上の行終端子を含む場合、それは単一の行終端子に置き換えられ、それが構文文法の入力要素ストリームの一部となる。

ECMAScript の RegExp grammar22.2.1 に与えられている。この文法も SourceCharacter によって定義されるコードポイントを terminal 記号として持つ。この文法は、goal symbol Pattern から始まる複数の production を定義し、コードポイント列がどのように正規表現パターンへ変換されるかを記述する。

字句文法および RegExp 文法の production は、区切り記号として 2 つのコロン “::” を持つことで区別される。字句文法と RegExp 文法は一部の production を共有する。

5.1.3 数値文字列文法

numeric string grammar7.1.4.1 に現れる。これは SourceCharacter を terminal 記号として持ち、goal symbol StringNumericLiteral から始めて String を数値へ変換するために用いられる(これは 数値リテラルの字句文法 に似ているが別物である)。

numeric string grammar の production は、句読点として 3 つのコロン “:::” を持つことで区別され、ソーステキストの解析には決して用いられない。

5.1.4 構文文法

ECMAScript の syntactic grammar は、節 13 から 16 に与えられている。この文法は、その terminal 記号として字句文法で定義される ECMAScript token を持つ(5.1.2)。この文法は、2 つの代替 goal symbol Script および Module から始まる複数の production を定義し、token 列がどのように ECMAScript プログラムの構文的に正しい独立構成要素を形成するかを記述する。

コードポイントのストリームが ECMAScript の Script または Module として解析されるとき、まず字句文法の反復適用により入力要素のストリームへ変換される。その後、この入力要素ストリームは構文文法の単一適用によって解析される。入力要素ストリーム内の token が、余り token を残さず単一の goal nonterminal(Script または Module)の instance として解析できない場合、その入力ストリームは構文的に誤りである。

解析が成功すると、parse tree、すなわち各 node が Parse Node である根付き木構造が構築される。各 Parse Node は文法中の記号の instance であり、その記号から導出できるソーステキストの範囲を表す。ソーステキスト全体を表す parse tree の根 node は、解析の goal symbol の instance である。Parse Node が nonterminal の instance である場合、それはまた、その nonterminal を左辺に持ついずれかの production の instance でもある。さらに、その right-hand side 上の各記号に 1 つずつ対応する 0 個以上の children を持ち、各 child は対応する記号の instance である Parse Node である。

新しい Parse Node は parser の各呼出しごとに生成され、たとえ同一のソーステキストであっても解析間で再利用されることはない。Parse Node は、同じソーステキスト範囲を表し、同じ文法記号の instance であり、かつ同じ parser 呼出しから生じた場合に限り、同じ Parse Node とみなされる。

Note 1

同じ String を複数回解析すると、異なる Parse Node が生じる。たとえば、次を考える。

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

eval の各呼出しは、str の値を ECMAScript ソーステキストへ変換し、独立した解析を行って、それぞれ独自の別個の Parse Node 木を生成する。各解析は同じ String 値から導出されたソーステキストに対して行われるが、それらの木は別個である。

Note 2
Parse Node は仕様上の人工物であり、実装が類似のデータ構造を用いることは要求されない。

構文文法の production は、句読点としてただ 1 つのコロン “:” を持つことで区別される。

13 から 16 に示される構文文法は、どの token 列が正しい ECMAScript Script または Module として受理されるかについての完全な説明ではない。追加の token 列も受理される。すなわち、特定の箇所(たとえば行終端文字の前)にセミコロンを追加した場合にのみ、その列が文法によって記述されるものがそれに当たる。さらに、文法により記述される token 列のうち、特定の「扱いにくい」位置に行終端文字が現れる場合には、受理可能とみなされないものもある。

場合によっては、曖昧さを避けるために、構文文法は、有効な ECMAScript Script または Module を構成しない token 列を許す一般化された production を用いる。たとえば、この技法は object literal や object destructuring pattern に用いられる。そのような場合、受理可能な token 列をさらに制限する、より制約の強い supplemental grammar が提供される。通常、その後に early error rule が、特定の文脈において「p must cover an n」と述べる。ここで p は Parse Node(一般化された production の instance)であり、n は supplemental grammar の nonterminal である。これは次を意味する。

  1. もともと p に一致した token 列は、goal symbol として n を用いて再度解析される。n が文法パラメータを取るなら、p が最初に解析されたときと同じ値に設定される。
  2. その token 列が、余り token を残さず、単一の n の instance として解析できる場合、次が成り立つ。
    1. その n の instance(与えられた p に対して一意な Parse Node)を、「p によって covered される n」と呼ぶ。
    2. n およびその導出 production に対するすべての Early Error rule は、p によって covered される n にも適用される。
  3. それ以外の場合(解析に失敗した場合)、それは early Syntax Error である。

5.1.5 文法記法

5.1.5.1 終端記号

ECMAScript 文法では、一部の terminal 記号が fixed-width フォントで示される。これらは、ソーステキスト中に書かれたとおり正確に現れなければならない。この方法で指定されるすべての terminal 記号コードポイントは、他の Unicode 範囲の似た見た目のコードポイントではなく、Basic Latin ブロックの適切な Unicode コードポイントとして理解される。terminal 記号中のコードポイントは、\ UnicodeEscapeSequence で表現することはできない。

terminal 記号が個々の Unicode コードポイントである文法(すなわち、字句文法、RegExp 文法、および numeric string grammar)では、production 中に現れる複数の fixed-width コードポイントの連続列は、その同じコードポイント列を単独の terminal 記号として書いたものの単純な略記である。

たとえば、production:

HexIntegerLiteral :: 0x HexDigits

は、次の略記である。

HexIntegerLiteral :: 0 x HexDigits

これに対して、構文文法では、fixed-width コードポイントの連続列は単一の terminal 記号である。

terminal 記号にはさらに 2 つの形式がある。

  • 字句文法および RegExp 文法では、通常の印字表現を持たない Unicode コードポイントは、代わりに "<ABBREV>" の形式で示される。ここで "ABBREV" はそのコードポイントまたはコードポイント集合のニーモニックである。これらの形式は Unicode 書式制御文字White Space、および Line Terminator で定義される。
  • 構文文法では、特定の terminal 記号(たとえば IdentifierNameRegularExpressionLiteral)はイタリック体で示される。これは、それらが字句文法における同名の nonterminal を参照するためである。

5.1.5.2 非終端記号と生成規則

nonterminal 記号は italic 体で示される。nonterminal の定義(“production” とも呼ばれる)は、定義される nonterminal の名前に続いて 1 個以上のコロンを付けることで導入される。(コロンの数は、その production がどの文法に属するかを示す。)その後、nonterminal の 1 つ以上の代替 right-hand side が続く行に現れる。たとえば、構文定義:

WhileStatement : while ( Expression ) Statement

は、nonterminal WhileStatement が、token while、左括弧 token、Expression、右括弧 token、Statement の順に続くものを表すことを述べている。Expression および Statement の出現は、それ自体 nonterminal である。別の例として、構文定義:

ArgumentList : AssignmentExpression ArgumentList , AssignmentExpression

は、ArgumentList が、単一の AssignmentExpression か、あるいは ArgumentList に続けてコンマと AssignmentExpression が続くもののいずれかを表してよいことを述べている。この ArgumentList の定義は再帰的であり、すなわちそれ自体を用いて定義される。その結果、ArgumentList は、各引数式が AssignmentExpression である任意の正の個数の引数を、コンマ区切りで含んでよい。このような nonterminal の再帰的定義は一般的である。

5.1.5.3 オプション記号

terminal または nonterminal の後ろに現れることがある下付き接尾辞 “opt” は、省略可能な記号を示す。省略可能記号を含む選択肢は、実際には 2 つの right-hand side、すなわち省略可能要素を省いたものと含むものを指定している。これは次を意味する。

VariableDeclaration : BindingIdentifier Initializeropt

は、次の便利な略記である。

VariableDeclaration : BindingIdentifier BindingIdentifier Initializer

また、次も同様である。

ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement

は、次の便利な略記である。

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

これはさらに次の略記である。

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

したがって、この例では nonterminal ForStatement は実際には 4 つの代替 right-hand side を持つ。

5.1.5.4 文法パラメータ

production は、定義される nonterminal 記号の接尾辞として現れる “[parameters]” 形式の下付き注記によってパラメータ化されてよい。“parameters” は単一の名前でも、コンマ区切りの名前列でもよい。パラメータ化された production は、パラメータ化された nonterminal 記号に、パラメータ名の前にアンダースコアを付けて追加した、パラメータ名のすべての組合せを定義する production 群の略記である。これは次を意味する。

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

複数パラメータは組合せ的な数の production を生み、そのすべてが完全な文法内で実際に参照されるとは限らない。

production の right-hand side 上の nonterminal 参照もパラメータ化できる。たとえば、

StatementList : ReturnStatement ExpressionStatement[+In]

は、次と等価である。

StatementList : ReturnStatement ExpressionStatement_In

また、

StatementList : ReturnStatement ExpressionStatement[~In]

は、次と等価である。

StatementList : ReturnStatement ExpressionStatement

nonterminal 参照は、パラメータリストと “opt” 接尾辞の両方を持ってよい。たとえば、

VariableDeclaration : BindingIdentifier Initializer[+In]opt

は、次の略記である。

VariableDeclaration : BindingIdentifier BindingIdentifier Initializer_In

right-hand side の nonterminal 参照において、パラメータ名の前に “?” を付けると、そのパラメータ値は、現在の production の left-hand side 記号への参照におけるそのパラメータ名の有無に依存する。たとえば、

VariableDeclaration[In] : BindingIdentifier Initializer[?In]

は、次の略記である。

VariableDeclaration : BindingIdentifier Initializer VariableDeclaration_In : BindingIdentifier Initializer_In

right-hand side の選択肢の前に “[+parameter]” が付く場合、その選択肢は、その production の nonterminal 記号を参照する際に指定された parameter が用いられた場合にのみ利用可能である。right-hand side の選択肢の前に “[~parameter]” が付く場合、その選択肢は、その production の nonterminal 記号を参照する際に、その 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” という語が続く場合、それは次行または次行群にある各 terminal 記号が代替定義であることを示す。たとえば、ECMAScript の字句文法には次の production が含まれる。

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]

production の right-hand side として “[empty]” という句が現れる場合、それはその production の right-hand side に terminal も nonterminal も含まれないことを示す。

5.1.5.7 先読み制約

production の right-hand side に “[lookahead = seq]” という句が現れる場合、それは、直後の入力 token 列の接頭辞が token 列 seq である場合にのみ、その production を使用できることを示す。同様に、“[lookahead ∈ set]” で、set が有限非空の token 列集合である場合、その production は、set のいずれかの要素が直後の token 列の接頭辞である場合にのみ使用できる。便宜上、その集合は nonterminal として書かれてもよく、その場合それは、その nonterminal が展開しうるすべての token 列の集合を表す。その nonterminal が無限に多くの異なる token 列へ展開しうる場合、それは編集上の誤りとみなされる。

これらの条件は否定されてもよい。“[lookahead ≠ seq]” は、包含する production が、seq が直後の入力 token 列の接頭辞 ではない 場合にのみ使用できることを示し、“[lookahead ∉ set]” は、set のどの要素も直後の token 列の接頭辞 ではない 場合にのみ、その production を使用できることを示す。

例として、次の定義が与えられているとする。

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

このとき、定義:

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

は、文字 n に続いて最初の 1 文字が偶数である 1 個以上の 10 進数字が続くもの、または別の 10 進数字が後続しない単一の 10 進数字、のいずれかに一致する。

これらの句が構文文法で用いられる場合、後の位置でどの字句 goal symbol を用いるかを知る必要があるため、直後の token 列を曖昧さなく特定できないことがありうることに注意。そのため、これらが構文文法で用いられるとき、ある token 列 seq が先読み制約(列集合の一部として現れる場合を含む)に現れ、その結果の token 列において seq が接頭辞であるかどうかを字句 goal symbol の選択が変えうるならば、それは編集上の誤りとみなされる。

5.1.5.8 [no LineTerminator here]

構文文法の production の right-hand side に “[no LineTerminator here]” という句が現れる場合、それはその production が 制限付き production であることを示す。すなわち、示された位置で入力ストリーム中に LineTerminator が出現する場合、その production は使用できない。たとえば、production:

ThrowStatement : throw [no LineTerminator here] Expression ;

は、スクリプト中で throw token と Expression の間に LineTerminator が現れる場合、その production は使用できないことを示す。

LineTerminator の存在が制限付き production によって禁止されていない限り、入力要素ストリーム中の任意の 2 つの連続する token の間には、スクリプトの構文的受理可能性に影響を与えることなく、任意個の LineTerminator が現れてよい。

5.1.5.9 but not

production の right-hand side は、“but not” という句を用い、その後に除外される展開を示すことで、特定の展開が許されないことを指定してよい。たとえば、production:

Identifier :: IdentifierName but not ReservedWord

は、nonterminal Identifier が、IdentifierName を置き換えうる任意のコードポイント列で置き換えられてよいが、同じコードポイント列が ReservedWord を置き換えうる場合を除く、という意味である。

5.1.5.10 記述句

最後に、いくつかの nonterminal 記号は、すべての選択肢を列挙するのが実際的でない場合に、サンセリフ体の記述句によって説明される。

SourceCharacter :: 任意の Unicode コードポイント

5.2 アルゴリズム規約

この仕様では、アルゴリズムの手順を指定するために番号付きリストをしばしば用いる。これらのアルゴリズムは、ECMAScript 言語構成要素に要求される意味論を正確に規定するために用いられる。これらのアルゴリズムは、特定の実装技法の使用を示唆することを意図していない。実際には、ある機能を実装するために、より効率的なアルゴリズムが利用可能な場合がある。

アルゴリズムは、その位置で渡された引数を参照するためにアルゴリズム手順内で用いることができる別名の、順序付きかつコンマ区切りの列によって、明示的にパラメータ化されてよい。省略可能パラメータは、角括弧で囲むことで表される([ , name ])が、アルゴリズム手順内では必須パラメータと何ら異ならない。可変長パラメータはパラメータリストの末尾に現れてよく、先頭の省略記号(, ...name)によって示される。可変長パラメータは、必須および省略可能パラメータの後に与えられたすべての引数を List に取り込む。そのような追加引数が存在しない場合、その List は空である。

アルゴリズム手順は、順次的な下位手順に分割されてよい。下位手順はインデントされ、さらにその内部でより深い下位手順へ分割されてよい。アウトライン番号規約により、下位手順の第 1 レベルは小文字アルファベット、第 2 レベルは小文字ローマ数字で識別される。3 レベルを超える場合には、これらの規則が繰り返され、第 4 レベルでは数値ラベルが用いられる。たとえば、

  1. 最上位手順
    1. 下位手順。
    2. 下位手順。
      1. 下下位手順。
        1. 下下下位手順
          1. 下下下下位手順
            1. 下下下下下位手順

手順または下位手順は、その下位手順の適用条件となる “if” 述語として書かれてよい。この場合、その述語が真であるときにのみ下位手順が適用される。手順または下位手順が “else” という語で始まる場合、それは同じレベルにある直前の “if” 述語手順の否定である述語となる。

手順は “For each” または “Repeat” で始まり、その下位手順の反復適用を指定してよい。

Assert:” で始まる手順は、そのアルゴリズムの不変条件を表明する。そのような表明は、そうでなければ暗黙となるアルゴリズム上の不変条件を明示するために用いられる。同様に、“NOTE:” で始まる手順は、近接する手順に関連する文脈を提供する。Assert 手順および NOTE 手順は厳密には参考情報であり、追加の意味論的要件を加えないため、実装がそれらを検査する必要はない。

アルゴリズム手順は、“Let x be someValue” という形式を用いて任意の値に対する名前付き別名を宣言してよい。これらの別名は参照に似ており、xsomeValue の両方が同じ基底データを参照し、どちらへの変更も双方から見える。こうした参照的挙動を避けたいアルゴリズム手順は、右辺のコピーを明示的に作るべきである。“Let x be a copy of someValue” は someValue の浅いコピーを生成する。

一度宣言された別名は、それ以降の任意の手順で参照してよく、別名の宣言より前の手順から参照してはならない。別名は “Set x to someOtherValue” という形式で変更してよい。

5.2.1 評価順序

複雑な式がアルゴリズム手順に現れる場合、それらは左から右へ、内側から外側への順に評価されるものと理解される。たとえば、手順

  1. Return A(B(), C.[[D]]) + E(F()).

は、次と等価である。

  1. Let tmp1 be B().
  2. Let tmp2 be C.[[D]].
  3. Let tmp3 be A(tmp1, tmp2).
  4. Let tmp4 be F().
  5. Let tmp5 be E(tmp4).
  6. Let tmp6 be tmp3 + tmp5.
  7. Return tmp6.

ここで、各種 tmpN 別名は一時的なものであり、これらの手順内でのみ可視である。

5.2.2 抽象操作

この仕様の複数箇所での利用を容易にするために、一部のアルゴリズムは、abstract operation と呼ばれ、名前付きかつパラメータ化された関数形式で書かれる。これにより、他のアルゴリズム内から名前で参照できる。abstract operation は通常、OperationName(arg1, arg2) のような関数適用スタイルで参照される。一部の abstract operation は、クラス様の仕様抽象の多相ディスパッチされるメソッドとして扱われる。そのようなメソッド様 abstract operation は通常、someValue.OperationName(arg1, arg2) のようなメソッド適用スタイルで参照される。

5.2.3 構文指向操作

syntax-directed operation とは、その定義が ECMAScript 文法のいずれかの 1 つ以上の production に関連付けられたアルゴリズム群から成る名前付き操作である。複数の代替定義を持つ production には、通常、各代替ごとに別個のアルゴリズムがある。アルゴリズムが文法 production に関連付けられている場合、それはその production 代替の terminal 記号および nonterminal 記号を、あたかもアルゴリズムのパラメータであるかのように参照してよい。このように用いられるとき、nonterminal 記号は、ソーステキスト解析時に一致した実際の代替定義を参照する。文法 production、またはそれから導出された Parse Node一致するソーステキスト とは、その一致に関与した最初の terminal の先頭から、最後の terminal の末尾までのソーステキスト部分である。

アルゴリズムが production の代替に関連付けられている場合、その代替は通常、いかなる “[ ]” 文法注釈も付けずに示される。そのような注釈は代替の構文的認識にのみ影響し、代替に関連付けられた意味論には影響しない。

syntax-directed operation は、parse node と、任意でその他のパラメータを用いて、以下のアルゴリズムの手順 13、および 4 にある規約により呼び出される。

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

明示的に別段の指定がない限り、すべての chain production は、その production の left-hand side nonterminal に適用されうるあらゆる operation について暗黙の定義を持つ。暗黙の定義は、同じ operation を、同じパラメータがあるならそれとともに、その chain production の唯一の right-hand side nonterminal に再適用し、その結果を返すだけである。たとえば、あるアルゴリズムに “Return Evaluation of Block” という形式の手順があり、かつ次の production があるとする。

Block : { StatementList }

しかし Evaluation operation がその production にアルゴリズムを関連付けていない場合、そのとき Evaluation operation には暗黙的に次のような関連付けが含まれる。

Runtime Semantics: Evaluation

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

5.2.4 実行時意味論

実行時に呼び出されなければならない意味論を規定するアルゴリズムは、runtime semantics と呼ばれる。runtime semantics は、abstract operation または syntax-directed operation によって定義される。

5.2.4.1 Completion ( completionRecord )

The abstract operation Completion takes argument completionRecord (a Completion Record) and returns a Completion Record. Completion Record が返されることを強調するために用いられる。 It performs the following steps when called:

  1. Assert: completionRecord is a Completion Record.
  2. Return completionRecord.

5.2.4.2 Throw

アルゴリズム手順において、"throw" という語は ThrowCompletion を呼び出した結果を返すことの略記である。たとえば、

  1. If result.[[Error]] is not none, throw result.[[Error]].

は、次と等価である。

  1. If result.[[Error]] is not none, return ThrowCompletion(result.[[Error]]).

特定の型の例外を投げるよう述べるアルゴリズム手順は、その型の例外を構築して投げる。たとえば、

  1. Throw a TypeError exception.

は、次と等価である。

  1. Return ThrowCompletion(a newly created TypeError object).

5.2.4.3 Completion Record を展開するための略記

接頭辞 ? および ! は、Completion Record を展開する略記として用いられる。?abrupt completion を呼出し元へ伝播するか、そうでなければ normal completion を展開するために用いられる。!Completion Record が normal であることを表明して展開するために用いられる。形式的には、手順

  1. Let result be ? record.

は、次と等価である。

  1. Assert: record is a Completion Record.
  2. If record is an abrupt completion, return record.
  3. Let result be record.[[Value]].

同様に、手順

  1. Let result be ! record.

は、次と等価である。

  1. Assert: record is a normal completion.
  2. Let result be record.[[Value]].

? または ! が他の文脈で用いられる場合、まず 評価順序 で与えられる書き換えを、この規則が適用できるようになるまで適用し、その後この規則を適用する。たとえば、手順

  1. Perform AO(? Other()).

は、次のように書き換えられる。

  1. Let tmp1 be Other().
  2. Let tmp2 be ? tmp1.
  3. Perform AO(tmp2).

これはさらに次のように展開される。

  1. Let tmp1 be Other().
  2. Assert: tmp1 is a Completion Record.
  3. If tmp1 is an abrupt completion, return tmp1.
  4. Let tmp2 be tmp1.[[Value]].
  5. Perform AO(tmp2).

5.2.4.4 暗黙の Normal Completion

Completion Record を返すと宣言された abstract operation 内のアルゴリズム、およびすべての built-in function 内では、返される値はまず NormalCompletion に渡され、その結果が代わりに用いられる。この規則は Completion アルゴリズム内では適用されず、またその手順で返される値が明らかに Completion Record として印付けされている場合にも適用されない。そのような場合とは次である。

そのような abstract operation から、他のいかなる手段によっても Completion Record が返される場合、それは編集上の誤りである。たとえば、これらの abstract operation 内では、

  1. Return true.

は、次のいずれとも同じ意味である。

  1. Return NormalCompletion(true).

または

  1. Let completion be NormalCompletion(true).
  2. Return Completion(completion).

または

  1. Return Completion Record { [[Type]]: normal, [[Value]]: true, [[Target]]: empty }.

? 略記の展開 によって、次の例は許容されることに注意。というのも、展開後の手順では abrupt の場合に Completion を適用した結果が直接返され、normal の場合には展開後に暗黙の NormalCompletion 適用が起こるからである。

  1. Return ? completion.

次の例は、その手順において注記されることなく Completion Record が返されているため、編集上の誤りである。

  1. Let completion be NormalCompletion(true).
  2. Return completion.

5.2.5 静的意味論

文脈自由文法は、入力要素ストリームが評価可能な有効な ECMAScript Script または Module を形成するかどうかを定義するすべての規則を表現するには十分に強力ではない。状況によっては、ECMAScript のアルゴリズム規約または文章による要件のいずれかを用いて表現できる追加規則が必要である。そのような規則は常に文法の production に関連付けられ、その production の static semantics と呼ばれる。

Static Semantic Rule には名前があり、通常はアルゴリズムを用いて定義される。名前付き Static Semantic Rule は文法 production に関連付けられ、複数の代替定義を持つ production では、通常、適用可能な各名前付き static semantic rule について、各代替ごとに別個のアルゴリズムがある。

static semantic rule の特別な種類として Early Error Rule がある。early error rule は、特定の文法 production に関連付けられる early error 条件(節 17 を参照)を定義する。ほとんどの early error rule の評価は、この仕様のアルゴリズム内で明示的に呼び出されない。適合実装は、Script または Module の最初の評価に先立ち、その Script または Module の解析に用いられた production のすべての early error rule を検証しなければならない。いずれかの early error rule に違反している場合、その Script または Module は無効であり、評価できない。

5.2.6 数学的演算

この仕様は、以下の種類の数値を参照する。

  • Mathematical values: デフォルトの数値型として用いられる任意の実数。
  • Extended mathematical values: Mathematical values に +∞ および -∞ を加えたもの。
  • Numbers: IEEE 754-2019 binary64(倍精度浮動小数点)値。
  • BigInts: 任意の整数を 1 対 1 に対応させて表す ECMAScript 言語値

この仕様の言語では、数値は下付き接尾辞を用いて異なる数値種別の間で区別される。下付き 𝔽 は Number を指し、下付き は BigInt を指す。下付き接尾辞のない数値は mathematical value を指す。この仕様は大半の数値を 10 進で表記するが、0x に続いて 0-9 または A-F の数字が現れる形式の数値も 16 進値として用いる。

一般に、この仕様が、たとえば “the length of y” や “the integer represented by the four hexadecimal digits ...” のように、数値の種別を明示せずに数値を参照する場合、その句は mathematical value を指す。Number または BigInt 値を参照する句は、明示的にその旨が注記される。たとえば “the Number value for the number of code points in …” や “the BigInt value for …” のように。

この仕様で integer という用語が用いられる場合、別段の記述がない限り、それは整数集合に属する mathematical value を指す。この仕様で integral Number という用語が用いられる場合、それはその mathematical value が整数集合に属する有限の Number 値を指す。

+, ×, =, ≥ のような数値演算子は、オペランドの型によって決定される演算を指す。mathematical value に適用されるとき、これらの演算子は通常の数学演算を指す。extended mathematical value に適用されるとき、これらの演算子は拡張実数上の通常の数学演算を指し、不定形は定義されず、この仕様におけるその使用は編集上の誤りとみなされる。Number に適用されるとき、これらの演算子は IEEE 754-2019 における対応する演算を指す。BigInt に適用されるとき、これらの演算子は BigInt の mathematical value に適用される通常の数学演算を指す。異なる型のオペランド(たとえば Number と mathematical value)に適用される数値演算子は定義されず、この仕様では編集上の誤りとみなされる。

mathematical value と Number または BigInt の間の変換は、この文書では常に明示的である。mathematical value または extended mathematical value x から Number への変換は、“the Number value for x” または 𝔽(x) と表され、6.1.6.1 で定義される。integer x から BigInt への変換は、“the BigInt value for x” または ℤ(x) と表される。Number または BigInt x から mathematical value への変換は、“the mathematical value of x” または ℝ(x) と表される。+0𝔽 および -0𝔽mathematical valuemathematical value 0 である。非有限値の mathematical value は定義されない。xextended mathematical value of とは、有限値については xmathematical value であり、+∞𝔽 および -∞𝔽 についてはそれぞれ +∞ および -∞ である。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 までのうち数学的に最大のものを生成する。これらの数学関数の定義域および値域は extended mathematical value である。

記法 “x modulo y”(y は有限かつ非零でなければならない)は、y と同符号(または零)の値 k を計算する。ここで abs(k) < abs(y) and x - k = q × y を満たす integer q が存在する。

“the result of clamping x between lower and upper” という句(ここで xextended mathematical valuelower および upperlowerupper を満たす mathematical value である)は、x < lower なら lower を、x > upper なら upper を、それ以外なら x を生成する。

数学関数 floor(x) は、x を超えない最大の integer(+∞ に最も近いもの)を生成する。

Note

floor(x) = x - (x modulo 1).

数学関数 truncate(x) は、0 方向への丸めによって x の小数部分を除去する。x < 0 のときは -floor(-x) を生成し、それ以外では floor(x) を生成する。

数学関数 minmaxabsfloor、および truncate は Number や BigInt に対しては定義されず、数学的値でない引数にそれらのメソッドを用いるいかなる使用も、この仕様では編集上の誤りである。

下限 a から上限 b までの interval とは、同じ数値型の数値の、無限である場合も空である場合もある集合である。各境界は inclusive または exclusive のいずれかとして記述され、両方ではない。interval には次の 4 種類がある。

  • a(inclusive)から b(inclusive)までの interval は、a から b までの inclusive interval とも呼ばれ、同じ数値型の値 x のうち axb を満たすすべての値を含み、それ以外を含まない。
  • a(inclusive)から b(exclusive)までの interval は、同じ数値型の値 x のうち ax < b を満たすすべての値を含み、それ以外を含まない。
  • a(exclusive)から b(inclusive)までの interval は、同じ数値型の値 x のうち a < xb を満たすすべての値を含み、それ以外を含まない。
  • a(exclusive)から b(exclusive)までの interval は、同じ数値型の値 x のうち a < x < b を満たすすべての値を含み、それ以外を含まない。

たとえば、1(inclusive)から 2(exclusive)までの interval は、1 を含み 2 を含まない、1 と 2 の間のすべての mathematical value から成る。interval を定義する目的では、-0𝔽 < +0𝔽 である。したがって、たとえば下限が +0𝔽inclusive interval+0𝔽 を含むが -0𝔽 は含まない。NaNinterval に決して含まれない。

5.2.7 値の記法

この仕様では、ECMAScript 言語値bold で表示される。例には nulltrue、または "hello" がある。これらは Function.prototype.applylet n = 42; のような ECMAScript ソーステキストと区別される。

5.2.8 同一性

この仕様では、仕様値と ECMAScript 言語値の両方について等価性比較が行われる。等価性比較において、値は 2 つのカテゴリのいずれかに属する。同一性を持たない値 は、その本来的特性がすべて同じであるなら、他の同一性を持たない値と等しい。本来的特性とは、整数の大きさや列の長さのような特性である。同一性を持たない値は、その特性を完全に記述することによって、事前参照なしに顕現させることができる。これに対し、各 同一性を持つ値 は一意であり、したがって自分自身としか等しくない。同一性を持つ値は、同一性を持たない値に似ているが、さらに identity と呼ばれる、推測不可能・不変・普遍的一意の追加特性を持つ。既存の同一性を持つ値への参照は、その同一性自体が記述不可能であるため、単に記述するだけでは顕現できない。代わりに、それらの値への参照は、ある場所から別の場所へ明示的に渡されなければならない。同一性を持つ値の中には可変なものがあり、その場合、その特性(同一性を除く)はその場で変更されうるため、その値の保持者全員が新しい特性を観測することになる。同一性を持たない値が、同一性を持つ値と等しくなることは決してない。

この仕様の観点からは、“is” という語は 2 つの値を等価性比較するために用いられる。たとえば “If bool is true, then ...” のように。“contains” という語は、等価性比較を用いて list の中から値を探すために用いられる。たとえば "If list contains a Record r such that r.[[Foo]] is true, then ..." のように。値の specification identity がこれらの比較結果を決定し、それはこの仕様における公理である。

ECMAScript 言語の観点からは、言語値は SameValue 抽象操作およびそれが推移的に呼び出す抽象操作を用いて等価性比較される。これらの比較抽象操作のアルゴリズムが、ECMAScript 言語値language identity を決定する。

仕様値について、specification identity を持たない値の例には、これに限られないが、mathematical value および extended mathematical valueECMAScript ソーステキストsurrogate pairDirective Prologue など、UTF-16 code unit、Unicode コードポイント、enumsyntax-directed operationhost hook などを含む abstract operation、そして ordered pair がある。specification identity を持つ仕様値の例には、これに限られないが、Property DescriptorPrivateElement などを含むあらゆる種類の RecordParse NodeListSetRelationAbstract ClosureData BlockPrivate Nameexecution contextexecution context stackagent signifier、および WaiterList Record がある。

specification identity は、Symbol.for によって生成される Symbol 値を除くすべての ECMAScript 言語値について language identity と一致する。specification identity も language identity も持たない ECMAScript 言語値は、undefinednullBooleanStringNumber、および BigInt である。specification identity と language identity の両方を持つ ECMAScript 言語値は、Symbol のうち Symbol.for によって生成されないものと、Object である。Symbol.for によって生成される Symbol 値は specification identity を持つが、language identity は持たない。

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 型は、truefalse と呼ばれる 2 つの値を持つ論理的実体を表す。

6.1.4 String 型

String 型は、0 個以上の 16 ビット符号なし整数値(“elements”)の順序付き列すべての集合であり、その最大長は 253 - 1 要素である。String 型は一般に、実行中の ECMAScript プログラムにおけるテキストデータを表現するために用いられ、その場合、String 内の各要素は UTF-16 コードユニット値として扱われる。各要素は、その列の中の位置を占めるものとみなされる。これらの位置には非負整数で添字が付けられる。最初の要素(存在する場合)は添字 0 にあり、次の要素(存在する場合)は添字 1 にあり、以下同様である。String の長さは、その中に含まれる要素(すなわち 16 ビット値)の個数である。空文字列の長さは 0 であり、したがって要素を含まない。

String の内容を解釈しない ECMAScript の操作は、それ以上の意味づけを行わない。String 値を解釈する操作は、各要素を単一の UTF-16 コードユニットとして扱う。しかし ECMAScript は、これらのコードユニットの値や相互関係を制限しないため、String の内容を UTF-16 で符号化された Unicode コードポイント列としてさらに解釈する操作は、不正な形式の部分列を考慮しなければならない。そのような操作は、数値が 0xD800 から 0xDBFF までの包含区間にある各コードユニット(Unicode Standard では leading surrogate、より正式には high-surrogate code unit と定義される)と、数値が 0xDC00 から 0xDFFF までの包含区間にある各コードユニット(trailing surrogate、より正式には low-surrogate code unit と定義される)に対して、次の規則に従って特別な取り扱いを適用する。

  • leading surrogate でも trailing surrogate でもないコードユニットは、同じ値を持つコードポイントとして解釈される。
  • 最初のコードユニット c1leading surrogate で、2 番目のコードユニット c2trailing surrogate である 2 つのコードユニット列は、surrogate pair であり、値 (c1 - 0xD800) × 0x400 + (c2 - 0xDC00) + 0x10000 を持つコードポイントとして解釈される。(11.1.3 を参照)
  • leading surrogate または trailing surrogate であるが、surrogate pair の一部ではないコードユニットは、同じ値を持つコードポイントとして解釈される。

関数 String.prototype.normalize22.1.3.15 を参照)は、String 値を明示的に正規化するために使用できる。String.prototype.localeCompare22.1.3.12 を参照)は内部で String 値を正規化するが、他のいかなる操作も、対象となる文字列を暗黙に正規化しない。特に明記されない限り、操作結果は言語依存および/またはロケール依存ではない。

Note

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

この仕様において、“A, B, ... の string-concatenation” という句(各引数は String 値、コードユニット、またはコードユニット列である)は、各引数のコードユニットを(順に)連結したコードユニット列を持つ String 値を表す。

inclusiveStart から exclusiveEnd までの strsubstring” という句(str は String 値またはコードユニット列であり、inclusiveStart および exclusiveEnd は整数である)は、str のうち添字 inclusiveStart から始まり、添字 exclusiveEnd の直前で終わる連続したコードユニットから成る String 値を表す(inclusiveStart = exclusiveEnd のときは空文字列である)。“to” の接尾辞が省略された場合、str の長さが exclusiveEnd の値として用いられる。

the ASCII word characters” という句は、Unicode Basic Latin ブロック内のすべての英字と数字、および U+005F(LOW LINE)のみから成る次の String 値を表す。
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_".
歴史的な理由により、これはさまざまなアルゴリズムにおいて意味を持つ。

6.1.4.1 StringIndexOf ( string, searchValue, fromIndex )

The abstract operation StringIndexOf takes arguments string (a String), searchValue (a String), and fromIndex (a non-negative integer) and returns a non-negative integer or not-found. It performs the following steps when called:

  1. lenstring の長さとする。
  2. searchValue が空文字列であり、かつ fromIndexlen なら、fromIndex を返す。
  3. searchLensearchValue の長さとする。
  4. fromIndexilen - searchLen を満たす各整数 i について、昇順で次を行う
    1. candidatestringi から i + searchLen までの substring とする。
    2. candidatesearchValue なら、i を返す。
  5. not-found を返す。
Note 1

searchValue が空文字列であり、かつ fromIndexstring の長さである場合、このアルゴリズムは fromIndex を返す。空文字列は、最後のコードユニットの後を含め、文字列内のあらゆる位置で見つかるものとして実質的に扱われる。

Note 2

このアルゴリズムは、fromIndex + searchValue の長さ > string の長さ である場合、常に not-found を返す。

6.1.4.2 StringLastIndexOf ( string, searchValue, fromIndex )

The abstract operation StringLastIndexOf takes arguments string (a String), searchValue (a String), and fromIndex (a non-negative integer) and returns a non-negative integer or not-found. It performs the following steps when called:

  1. lenstring の長さとする。
  2. searchLensearchValue の長さとする。
  3. Assert: fromIndex + searchLenlen
  4. 0 ≤ ifromIndex を満たす各整数 i について、降順で次を行う
    1. candidatestringi から i + searchLen までの substring とする。
    2. candidatesearchValue なら、i を返す。
  5. not-found を返す。
Note

searchValue が空文字列である場合、このアルゴリズムは fromIndex を返す。空文字列は、最後のコードユニットの後を含め、文字列内のあらゆる位置で見つかるものとして実質的に扱われる。

6.1.5 Symbol 型

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

各 Symbol は一意であり、不変である。

各 Symbol は不変の [[Description]] 内部スロットを持ち、その値は String または undefined のいずれかである。

6.1.5.1 Well-Known Symbol

well-known symbol は、この仕様のアルゴリズムによって明示的に参照される組込み Symbol 値である。これらは通常、その値が仕様アルゴリズムの拡張ポイントとして機能するプロパティのキーとして使用される。特に指定がない限り、well-known symbol 値はすべての realm で共有される(9.3)。

この仕様では、well-known symbol は、intrinsic notation の標準記法を用いて参照される。このとき intrinsic は Table 1 に列挙された値のいずれかである。

Note
この仕様の以前の版では @@name という形式の記法が使用されていたが、現行版では %Symbol.name% を使用する。特に、次の名前が使用されていた: @@asyncIterator, @@hasInstance, @@isConcatSpreadable, @@iterator, @@match, @@matchAll, @@replace, @@search, @@species, @@split, @@toPrimitive, @@toStringTag, and @@unscopables.
Table 1: Well-known Symbols
仕様名 [[Description]] 値と目的
%Symbol.asyncIterator% "Symbol.asyncIterator" オブジェクトの既定の async iterator を返すメソッド。for-await-of 文の意味論によって呼び出される。
%Symbol.hasInstance% "Symbol.hasInstance" constructor オブジェクトが、あるオブジェクトをその constructor のインスタンスの 1 つとして認識するかどうかを決定するメソッド。instanceof 演算子の意味論によって呼び出される。
%Symbol.isConcatSpreadable% "Symbol.isConcatSpreadable" true の場合、そのオブジェクトを Array.prototype.concat によって配列要素へ平坦化すべきことを示す Boolean 値プロパティ。
%Symbol.iterator% "Symbol.iterator" オブジェクトの既定の iterator を返すメソッド。for-of 文の意味論によって呼び出される。
%Symbol.match% "Symbol.match" 正規表現を文字列に対して照合する正規表現メソッド。String.prototype.match メソッドによって呼び出される。
%Symbol.matchAll% "Symbol.matchAll" 正規表現を文字列に対して照合したマッチ結果を yield する iterator を返す正規表現メソッド。String.prototype.matchAll メソッドによって呼び出される。
%Symbol.replace% "Symbol.replace" 文字列中の一致した部分文字列を置換する正規表現メソッド。String.prototype.replace メソッドによって呼び出される。
%Symbol.search% "Symbol.search" 文字列内で正規表現に一致する位置の添字を返す正規表現メソッド。String.prototype.search メソッドによって呼び出される。
%Symbol.species% "Symbol.species" 派生オブジェクトの生成に使用される constructor 関数である function 値プロパティ。
%Symbol.split% "Symbol.split" 正規表現に一致する位置で文字列を分割する正規表現メソッド。String.prototype.split メソッドによって呼び出される。
%Symbol.toPrimitive% "Symbol.toPrimitive" オブジェクトを対応する primitive 値へ変換するメソッド。ToPrimitive 抽象操作によって呼び出される。
%Symbol.toStringTag% "Symbol.toStringTag" オブジェクトの既定の文字列表現の生成に用いられる String 値プロパティ。組込みメソッド Object.prototype.toString によって参照される。
%Symbol.unscopables% "Symbol.unscopables" その own および継承プロパティ名が、関連付けられたオブジェクトの with 環境バインディングから除外されるプロパティ名である object 値プロパティ。

6.1.6 数値型

ECMAScript には 2 つの組込み数値型がある: Number と BigInt。以下の抽象操作は、これらの数値型に対して定義される。“Result” 列には戻り値の型が示され、さらにその操作の一部の呼出しにおいて abrupt completion を返す可能性があるかどうかも示される。

Table 2: Numeric Type Operations
Operation ソース例 ... の Evaluation 意味論によって呼び出される 結果
Number::unaryMinus -x Unary - Operator Number
BigInt::unaryMinus BigInt
Number::bitwiseNOT ~x Bitwise NOT Operator ( ~ ) Number
BigInt::bitwiseNOT BigInt
Number::exponentiate x ** y Exponentiation Operator and Math.pow ( base, exponent ) Number
BigInt::exponentiate either a normal completion containing a BigInt or a throw completion
Number::multiply x * y Multiplicative Operator Number
BigInt::multiply BigInt
Number::divide x / y Multiplicative Operator Number
BigInt::divide either a normal completion containing a BigInt or a throw completion
Number::remainder x % y Multiplicative Operator Number
BigInt::remainder either a normal completion containing a BigInt or a throw completion
Number::add x ++
++ x
x + y
Postfix Increment Operator, Prefix Increment Operator, and Addition Operator ( + ) Number
BigInt::add BigInt
Number::subtract x --
-- x
x - y
Postfix Decrement Operator, Prefix Decrement Operator, and Subtraction Operator ( - ) Number
BigInt::subtract BigInt
Number::leftShift x << y Left Shift Operator ( << ) Number
BigInt::leftShift BigInt
Number::signedRightShift x >> y Signed Right Shift Operator ( >> ) Number
BigInt::signedRightShift BigInt
Number::unsignedRightShift x >>> y Unsigned Right Shift Operator ( >>> ) Number
BigInt::unsignedRightShift a throw completion
Number::lessThan x < y
x > y
x <= y
x >= y
Relational Operator, via IsLessThan ( x, y, leftFirst ) Boolean or undefined(順序付け不能な入力に対して)
BigInt::lessThan Boolean
Number::equal x == y
x != y
x === y
x !== y
Equality Operator, via IsStrictlyEqual ( x, y ) Boolean
BigInt::equal
Number::sameValue Object.is(x, y) オブジェクト内部メソッド、 via SameValue ( x, y ), 厳密な値の等価性を検査するため Boolean
Number::sameValueZero [x].includes(y) via SameValueZero ( x, y ), +0𝔽-0𝔽 の違いを無視して値の等価性を検査するため。Array、Map、Set のメソッドなどで用いられる Boolean
Number::bitwiseAND x & y Binary Bitwise Operator Number
BigInt::bitwiseAND BigInt
Number::bitwiseXOR x ^ y Number
BigInt::bitwiseXOR BigInt
Number::bitwiseOR x | y Number
BigInt::bitwiseOR BigInt
Number::toString String(x) 多くの式および組込み関数。ToString ( argument ) を介する String
BigInt::toString

数値型は一般に、精度の喪失または切り捨てなしには相互変換できないため、ECMAScript 言語はこれらの型の間で暗黙変換を提供しない。プログラマは、別の型を必要とする関数を呼び出す際には、Number および BigInt 関数を明示的に呼び出して型変換しなければならない。

Note

ECMAScript の初版およびその後の各版は、特定の演算子について、精度を失うか切り捨てる可能性のある暗黙の数値変換を提供してきた。これらのレガシーな暗黙変換は後方互換性のために維持されているが、BigInt には提供されない。これは、プログラマの誤りの機会を最小化し、将来の版において一般化された value types の選択肢を残すためである。

6.1.6.1 Number 型

Number 型は、正確に 18,437,736,874,454,810,627 個(すなわち 264 - 253 + 3)の値を持ち、IEEE Standard for Binary Floating-Point Arithmetic に規定された IEEE 754-2019 binary64 倍精度浮動小数点値を表す。ただし、IEEE Standard における 9,007,199,254,740,990 個(すなわち 253 - 2)の異なる NaN 値は、ECMAScript では単一の特別な NaN 値として表現される。(NaN 値はプログラム式 NaN によって生成されることに注意。)一部の実装では、外部コードがさまざまな NaN 値の違いを検出できる場合があるが、そのような挙動は implementation-defined である。ECMAScript コードにとって、すべての NaN 値は互いに区別不能である。

Note

Number 値が格納された後に ArrayBuffer(25.1 を参照)または SharedArrayBuffer(25.2 を参照)で観測される可能性のあるビットパターンは、ECMAScript 実装が内部的に使用するその Number 値の表現と必ずしも同じではない。

これ以外に、positive Infinity および negative Infinity と呼ばれる 2 つの特別な値がある。簡潔さのため、これらの値は説明上、それぞれ記号 +∞𝔽 および -∞𝔽 でも参照される。(これら 2 つの無限 Number 値は、プログラム式 +Infinity(または単に Infinity)および -Infinity によって生成されることに注意。)

残りの 18,437,736,874,454,810,624 個(すなわち 264 - 253)の値は finite numbers と呼ばれる。これらの半分は正の数であり、半分は負の数である。各有限の正の Number 値に対して、同じ大きさを持つ対応する負の値が存在する。

positive zeronegative zero の両方が存在することに注意。簡潔さのため、これらの値は説明上、それぞれ記号 +0𝔽 および -0𝔽 でも参照される。(この 2 つの異なる zero 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(inclusive)から 253(exclusive)までの区間にある整数、e は -1074 から 971 までの包含区間にある整数である。

残りの 9,007,199,254,740,990 個(すなわち 253 - 2)の値は非正規化されており、次の形を持つ。

s × m × 2e

ここで s は 1 または -1、m は 0(exclusive)から 252(exclusive)までの区間にある整数、e は -1074 である。

大きさが 253 以下のすべての正負整数は Number 型で表現可能であることに注意。整数 0 は Number 型において 2 つの表現を持つ: +0𝔽-0𝔽 である。

有限数は、それが非ゼロであり、(上に示した 2 つの形式のいずれかで)それを表すために用いられる整数 m が奇数である場合、odd significand を持つ。それ以外の場合、それは even significand を持つ。

この仕様において、“xNumber value for” という句は、x が正確な実数の数学的量(π のような無理数である場合もある)を表すとき、次の方法で選ばれた Number 値を意味する。Number 型の有限値すべての集合を考え、そこから -0𝔽 を除き、さらに Number 型では表現できない 2 つの追加値、すなわち 21024(これは +1 × 253 × 2971)および -21024(これは -1 × 253 × 2971)を加える。この集合の中から、値として x に最も近い要素を選ぶ。集合の 2 つの値が同じだけ近い場合は、even significand を持つ方が選ばれる。この目的のために、追加された 2 つの値 21024 および -21024 は even significand を持つものとみなされる。最後に、21024 が選ばれた場合はそれを +∞𝔽 に置き換え、-21024 が選ばれた場合はそれを -∞𝔽 に置き換える。+0𝔽 が選ばれた場合は、x < 0 のときに限り -0𝔽 に置き換える。それ以外に選ばれた値は変更せずに用いる。結果が x の Number value である。(この手続きは IEEE 754-2019 の roundTiesToEven モードの挙動と正確に一致する。)

+∞ の Number value は +∞𝔽 であり、-∞ の Number value は -∞𝔽 である。

一部の ECMAScript 演算子は、-231 から 231 - 1 までの包含区間や、0 から 216 - 1 までの包含区間のような、特定の範囲の整数のみを扱う。これらの演算子は Number 型の任意の値を受け入れるが、まずそのような各値を期待される範囲内の整数値に変換する。7.1 における数値変換操作の説明を参照。

6.1.6.1.1 Number::unaryMinus ( x )

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

  1. xNaN なら、NaN を返す。
  2. x の negation を返す。すなわち、同じ大きさで符号が反対の Number を計算する。

6.1.6.1.2 Number::bitwiseNOT ( x )

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

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

6.1.6.1.3 Number::exponentiate ( base, exponent )

The abstract operation Number::exponentiate takes arguments base (a Number) and exponent (a Number) and returns a Number. baseexponent 乗した結果を表す implementation-approximated な値を返す。 It performs the following steps when called:

  1. exponentNaN なら、NaN を返す。
  2. exponent+0𝔽 または -0𝔽 のいずれかであるなら、1𝔽 を返す。
  3. baseNaN なら、NaN を返す。
  4. base+∞𝔽 なら、
    1. exponent > +0𝔽 なら、+∞𝔽 を返す。
    2. +0𝔽 を返す。
  5. base-∞𝔽 なら、
    1. exponent > +0𝔽 なら、
      1. exponent が奇数の integral Number なら、-∞𝔽 を返す。
      2. +∞𝔽 を返す。
    2. exponent が奇数の integral Number なら、-0𝔽 を返す。
    3. +0𝔽 を返す。
  6. base+0𝔽 なら、
    1. exponent > +0𝔽 なら、+0𝔽 を返す。
    2. +∞𝔽 を返す。
  7. base-0𝔽 なら、
    1. exponent > +0𝔽 なら、
      1. exponent が奇数の integral Number なら、-0𝔽 を返す。
      2. +0𝔽 を返す。
    2. exponent が奇数の integral Number なら、-∞𝔽 を返す。
    3. +∞𝔽 を返す。
  8. Assert: basefinite であり、+0𝔽 でも -0𝔽 でもない。
  9. exponent+∞𝔽 なら、
    1. abs((base)) > 1 なら、+∞𝔽 を返す。
    2. abs((base)) = 1 なら、NaN を返す。
    3. +0𝔽 を返す。
  10. exponent-∞𝔽 なら、
    1. abs((base)) > 1 なら、+0𝔽 を返す。
    2. abs((base)) = 1 なら、NaN を返す。
    3. +∞𝔽 を返す。
  11. Assert: exponentfinite であり、+0𝔽 でも -0𝔽 でもない。
  12. base < -0𝔽 かつ exponentintegral Number でないなら、NaN を返す。
  13. (base) を (exponent) 乗した結果を表す implementation-approximated な Number 値を返す。
Note

base1𝔽 または -1𝔽exponent+∞𝔽 または -∞𝔽 の場合、または base1𝔽exponentNaN の場合の base ** exponent の結果は、IEEE 754-2019 と異なる。ECMAScript 初版はこの演算に対して NaN を結果として規定したが、その後の IEEE 754 の改訂では 1𝔽 が規定された。歴史的な ECMAScript の挙動は互換性の理由から維持されている。

6.1.6.1.4 Number::multiply ( x, y )

The abstract operation Number::multiply takes arguments x (a Number) and y (a Number) and returns a Number. IEEE 754-2019 binary double-precision arithmetic の規則に従って乗算を行い、xy の積を生成する。 It performs the following steps when called:

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

有限精度の乗算は可換であるが、常に結合的とは限らない。

6.1.6.1.5 Number::divide ( x, y )

The abstract operation Number::divide takes arguments x (a Number) and y (a Number) and returns a Number. IEEE 754-2019 binary double-precision arithmetic の規則に従って除算を行い、x を被除数、y を除数として、その商を生成する。 It performs the following steps when called:

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

6.1.6.1.6 Number::remainder ( n, d )

The abstract operation Number::remainder takes arguments n (a Number) and d (a Number) and returns a Number. オペランドの暗黙の除算から得られる剰余を返す。ここで n は被除数、d は除数である。 It performs the following steps when called:

  1. nNaN または dNaN なら、NaN を返す。
  2. n+∞𝔽 または -∞𝔽 のいずれかなら、NaN を返す。
  3. d+∞𝔽 または -∞𝔽 のいずれかなら、n を返す。
  4. d+0𝔽 または -0𝔽 のいずれかなら、NaN を返す。
  5. n+0𝔽 または -0𝔽 のいずれかなら、n を返す。
  6. Assert: n および dfinite かつ非ゼロである。
  7. quotient(n) / (d) とする。
  8. qtruncate(quotient) とする。
  9. r(n) - ((d) × q) とする。
  10. r = 0 かつ n < -0𝔽 なら、-0𝔽 を返す。
  11. 𝔽(r) を返す。
Note 1

C および C++ では、remainder 演算子は整数オペランドのみを受け付ける。ECMAScript では浮動小数点オペランドも受け付ける。

Note 2
% 演算子によって計算される浮動小数点 remainder 演算の結果は、IEEE 754-2019 で定義される “remainder” 演算と同じではない。IEEE 754-2019 の “remainder” 演算は、切り捨て除算ではなく丸め除算から remainder を計算するため、その挙動は通常の integer remainder 演算子の挙動とは類似しない。その代わり、ECMAScript 言語は浮動小数点演算における % を、Java の integer remainder 演算子と類似した形で振る舞うよう定義している。これは C ライブラリ関数 fmod と比較できる。

6.1.6.1.7 Number::add ( x, y )

The abstract operation Number::add takes arguments x (a Number) and y (a Number) and returns a Number. IEEE 754-2019 binary double-precision arithmetic の規則に従って加算を行い、引数の和を生成する。 It performs the following steps when called:

  1. xNaN または yNaN なら、NaN を返す。
  2. x+∞𝔽y-∞𝔽 なら、NaN を返す。
  3. x-∞𝔽y+∞𝔽 なら、NaN を返す。
  4. x+∞𝔽 または -∞𝔽 のいずれかなら、x を返す。
  5. y+∞𝔽 または -∞𝔽 のいずれかなら、y を返す。
  6. Assert: xy はどちらも finite である。
  7. x-0𝔽y-0𝔽 なら、-0𝔽 を返す。
  8. 𝔽((x) + (y)) を返す。
Note

有限精度の加算は可換であるが、常に結合的とは限らない。

6.1.6.1.8 Number::subtract ( x, y )

The abstract operation Number::subtract takes arguments x (a Number) and y (a Number) and returns a Number. 減算を行い、オペランドの差を生成する。x は被減数であり、y は減数である。 It performs the following steps when called:

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

x - yx + (-y) と同じ結果を生成することは常に成り立つ。

6.1.6.1.9 Number::leftShift ( x, y )

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

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

6.1.6.1.10 Number::signedRightShift ( x, y )

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

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

6.1.6.1.11 Number::unsignedRightShift ( x, y )

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

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

6.1.6.1.12 Number::lessThan ( x, y )

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

  1. xNaN なら、undefined を返す。
  2. yNaN なら、undefined を返す。
  3. xy なら、false を返す。
  4. x+0𝔽y-0𝔽 なら、false を返す。
  5. x-0𝔽y+0𝔽 なら、false を返す。
  6. x+∞𝔽 なら、false を返す。
  7. y+∞𝔽 なら、true を返す。
  8. y-∞𝔽 なら、false を返す。
  9. x-∞𝔽 なら、true を返す。
  10. Assert: xyfinite である。
  11. (x) < (y) なら、true を返す。
  12. false を返す。

6.1.6.1.13 Number::equal ( x, y )

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

  1. xNaN なら、false を返す。
  2. yNaN なら、false を返す。
  3. xy なら、true を返す。
  4. x+0𝔽y-0𝔽 なら、true を返す。
  5. x-0𝔽y+0𝔽 なら、true を返す。
  6. false を返す。

6.1.6.1.14 Number::sameValue ( x, y )

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

  1. xNaNyNaN なら、true を返す。
  2. x+0𝔽y-0𝔽 なら、false を返す。
  3. x-0𝔽y+0𝔽 なら、false を返す。
  4. xy なら、true を返す。
  5. false を返す。

6.1.6.1.15 Number::sameValueZero ( x, y )

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

  1. xNaNyNaN なら、true を返す。
  2. x+0𝔽y-0𝔽 なら、true を返す。
  3. x-0𝔽y+0𝔽 なら、true を返す。
  4. xy なら、true を返す。
  5. false を返す。

6.1.6.1.16 NumberBitwiseOp ( op, x, y )

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

  1. lNum を ! ToInt32(x) とする。
  2. rNum を ! ToInt32(y) とする。
  3. lBits(lNum) を表す 32 ビット 2 の補数ビット列とする。
  4. rBits(rNum) を表す 32 ビット 2 の補数ビット列とする。
  5. op& の場合、
    1. resultlBitsrBits にビット単位の AND 演算を適用した結果とする。
  6. Else if op^ の場合、
    1. resultlBitsrBits にビット単位の排他的 OR(XOR)演算を適用した結果とする。
  7. Else,
    1. Assert: op| である。
    2. resultlBitsrBits にビット単位の包含的 OR 演算を適用した結果とする。
  8. 32 ビット 2 の補数ビット列 result が表す整数の Number value を返す。

6.1.6.1.17 Number::bitwiseAND ( x, y )

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

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

6.1.6.1.18 Number::bitwiseXOR ( x, y )

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

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

6.1.6.1.19 Number::bitwiseOR ( x, y )

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

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

6.1.6.1.20 Number::toString ( x, radix )

The abstract operation Number::toString takes arguments x (a Number) and radix (an integer in the inclusive interval from 2 to 36) and returns a String. x を基数 radix の位取り記数法を用いた String として表す。基数 r による数の表現で使用される数字は、"0123456789abcdefghijklmnopqrstuvwxyz" の先頭 r 個のコードユニットから順に取られる。大きさが 1𝔽 以上の数の表現には、先頭のゼロは決して含まれない。 It performs the following steps when called:

  1. xNaN なら、"NaN" を返す。
  2. x+0𝔽 または -0𝔽 のいずれかなら、"0" を返す。
  3. x < -0𝔽 なら、"-"Number::toString(-x, radix) の string-concatenation を返す。
  4. x+∞𝔽 なら、"Infinity" を返す。
  5. n, k, s を、k ≥ 1、radixk - 1s < radixk𝔽(s × radixn - k) が x であり、かつ k が可能な限り小さくなるような整数とする。k は基数 radix による s の表現における桁数であり、sradix で割り切れず、また s の最下位桁はこれらの条件によって必ずしも一意に決まらないことに注意。
  6. radix ≠ 10 または n が -5 から 21 までの包含区間にあるなら、
    1. nk なら、
      1. 次の string-concatenation を返す:
        • 基数 radix による s の表現の k 桁のコードユニット
        • コードユニット 0x0030(DIGIT ZERO)の n - k 回の出現
    2. n > 0 なら、
      1. 次の string-concatenation を返す:
        • 基数 radix による s の表現の上位 n 桁のコードユニット
        • コードユニット 0x002E(FULL STOP)
        • 基数 radix による s の表現の残り k - n 桁のコードユニット
    3. Assert: n ≤ 0。
    4. 次の string-concatenation を返す:
      • コードユニット 0x0030(DIGIT ZERO)
      • コードユニット 0x002E(FULL STOP)
      • コードユニット 0x0030(DIGIT ZERO)の -n 回の出現
      • 基数 radix による s の表現の k 桁のコードユニット
  7. NOTE: この場合、入力は 1.2e+3 のような科学的 E 記法で表される。
  8. Assert: radix は 10 である。
  9. n < 0 なら、
    1. exponentSign をコードユニット 0x002D(HYPHEN-MINUS)とする。
  10. Else,
    1. exponentSign をコードユニット 0x002B(PLUS SIGN)とする。
  11. k = 1 なら、
    1. 次の string-concatenation を返す:
      • s の単一桁のコードユニット
      • コードユニット 0x0065(LATIN SMALL LETTER E)
      • exponentSign
      • abs(n - 1) の十進表現のコードユニット
  12. 次の string-concatenation を返す:
    • s の十進表現の最上位桁のコードユニット
    • コードユニット 0x002E(FULL STOP)
    • s の十進表現の残り k - 1 桁のコードユニット
    • コードユニット 0x0065(LATIN SMALL LETTER E)
    • exponentSign
    • abs(n - 1) の十進表現のコードユニット
Note 1

以下の観察は、実装にとって有用な指針となりうるが、この Standard の規範的要件の一部ではない。

  • x が -0𝔽 以外の任意の Number 値であるなら、ToNumber(ToString(x)) は x である。
  • s の最下位桁は、手順 5 に列挙された要件によって常に一意に決まるわけではない。
Note 2

上記の規則で要求されるより高精度な変換を提供する実装については、手順 5 の次の代替版を指針として用いることが推奨される。

  1. n, k, s を、k ≥ 1、radixk - 1s < radixk𝔽(s × radixn - k) が x であり、かつ k が可能な限り小さくなるような整数とする。s に複数の候補がある場合、s × radixn - k(x) に最も近くなるような s を選ぶ。そのような s が 2 つある場合は、偶数である方を選ぶ。k は基数 radix による s の表現における桁数であり、sradix で割り切れないことに注意。
Note 3

ECMAScript の実装者にとって、浮動小数点数の二進数から十進数への変換に関して 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. Available as
https://ampl.com/_archive/first-website/REFS/rounding.pdf. Associated code available as
http://netlib.sandia.gov/fp/dtoa.c and as
http://netlib.sandia.gov/fp/g_fmt.c and may also be found at the various netlib mirror sites.

6.1.6.2 BigInt 型

BigInt 型は整数値を表す。その値は任意の大きさを取りうるものであり、特定のビット幅には制限されない。一般に、特に注記がない限り、各演算は数学的に正確な答えを返すよう設計されている。二項演算において、BigInt は 2 の補数の二進文字列として振る舞い、負数は左側に無限にビットが立っているものとして扱われる。

6.1.6.2.1 BigInt::unaryMinus ( x )

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

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

6.1.6.2.2 BigInt::bitwiseNOT ( x )

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

  1. -x - 1 を返す。

6.1.6.2.3 BigInt::exponentiate ( base, exponent )

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

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

6.1.6.2.4 BigInt::multiply ( x, y )

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

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

6.1.6.2.5 BigInt::divide ( x, y )

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

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

6.1.6.2.6 BigInt::remainder ( n, d )

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

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

6.1.6.2.7 BigInt::add ( x, y )

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

  1. x + y を返す。

6.1.6.2.8 BigInt::subtract ( x, y )

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

  1. x - y を返す。

6.1.6.2.9 BigInt::leftShift ( x, y )

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

  1. y < 0 の場合、
    1. (floor((x) / 2-(y))) を返す。
  2. x × 2y を返す。
Note
ここでの意味論は、BigInt を無限長の 2 の補数二進数字列として扱う bitwise shift と等価であるべきである。

6.1.6.2.10 BigInt::signedRightShift ( x, y )

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

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

6.1.6.2.11 BigInt::unsignedRightShift ( x, y )

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

  1. TypeError 例外を投げる。

6.1.6.2.12 BigInt::lessThan ( x, y )

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

  1. (x) < (y) なら、true を返す。
  2. false を返す。

6.1.6.2.13 BigInt::equal ( x, y )

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

  1. (x) = (y) なら、true を返す。
  2. false を返す。

6.1.6.2.14 BinaryAnd ( x, y )

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

  1. x = 1 かつ y = 1 なら、1 を返す。
  2. 0 を返す。

6.1.6.2.15 BinaryOr ( x, y )

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

  1. x = 1 または y = 1 なら、1 を返す。
  2. 0 を返す。

6.1.6.2.16 BinaryXor ( x, y )

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

  1. x = 1 かつ y = 0 なら、1 を返す。
  2. x = 0 かつ y = 1 なら、1 を返す。
  3. 0 を返す。

6.1.6.2.17 BigIntBitwiseOp ( op, x, y )

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

  1. x(x) に設定する。
  2. y(y) に設定する。
  3. result を 0 とする。
  4. shift を 0 とする。
  5. (x = 0 または x = -1) かつ (y = 0 または y = -1) になるまで繰り返す。
    1. xDigitx modulo 2 とする。
    2. yDigity modulo 2 とする。
    3. op& の場合、
      1. resultresult + 2shift × BinaryAnd(xDigit, yDigit) に設定する。
    4. Else if op| の場合、
      1. resultresult + 2shift × BinaryOr(xDigit, yDigit) に設定する。
    5. Else,
      1. Assert: op^ である。
      2. resultresult + 2shift × BinaryXor(xDigit, yDigit) に設定する。
    6. shiftshift + 1 に設定する。
    7. x を (x - xDigit) / 2 に設定する。
    8. y を (y - yDigit) / 2 に設定する。
  6. op& の場合、
    1. tmpBinaryAnd(x modulo 2, y modulo 2) とする。
  7. Else if op| の場合、
    1. tmpBinaryOr(x modulo 2, y modulo 2) とする。
  8. Else,
    1. Assert: op^ である。
    2. tmpBinaryXor(x modulo 2, y modulo 2) とする。
  9. tmp ≠ 0 の場合、
    1. resultresult - 2shift に設定する。
    2. NOTE: これにより符号が拡張される。
  10. result の BigInt value を返す。

6.1.6.2.18 BigInt::bitwiseAND ( x, y )

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

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

6.1.6.2.19 BigInt::bitwiseXOR ( x, y )

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

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

6.1.6.2.20 BigInt::bitwiseOR ( x, y )

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

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

6.1.6.2.21 BigInt::toString ( x, radix )

The abstract operation BigInt::toString takes arguments x (a BigInt) and radix (an integer in the inclusive interval from 2 to 36) and returns a String. x を基数 radix の位取り記数法を用いた String として表す。基数 r による BigInt の表現に使われる数字は、"0123456789abcdefghijklmnopqrstuvwxyz" の先頭 r 個のコードユニットから順に取られる。0 以外の BigInt の表現には先頭のゼロは決して含まれない。 It performs the following steps when called:

  1. x < 0 なら、"-"BigInt::toString(-x, radix) の string-concatenation を返す。
  2. 基数 radix による x の表現から成る String 値を返す。

6.1.7 Object 型

Object 型の各インスタンスは、単に “an Object” とも呼ばれ、プロパティの集合を表す。各プロパティは、data property または accessor property のいずれかである。

  • data property は、キー値を ECMAScript 言語値および Boolean 属性の集合と関連付ける。
  • accessor property は、キー値を 1 つまたは 2 つの accessor function および Boolean 属性の集合と関連付ける。accessor function は、そのプロパティに関連付けられた ECMAScript 言語値を格納または取得するために使用される。

オブジェクトのプロパティは、property key を用いて一意に識別される。property key は String または Symbol のいずれかである。空文字列を含むすべての String および Symbol は property key として有効である。property name は、String である property key である。

integer index とは、CanonicalNumericIndexString(n) が +0𝔽 から 𝔽(253 - 1) までの包含区間にある integral Number を返すような property name n である。array index とは、CanonicalNumericIndexString(n) が +0𝔽 から 𝔽(232 - 2) までの包含区間にある integral Number を返すような integer index n である。

Note

すべての非負 safe integer は対応する integer index を持つ。232 - 1 を除くすべての 32 ビット符号なし整数は対応する array index を持つ。"-0"integer index でも array index でもない。

property key は、プロパティおよびその値へアクセスするために用いられる。プロパティへのアクセスには 2 種類あり、それぞれ値の取得と代入に対応する get および set である。get および set によってアクセス可能なプロパティには、オブジェクトに直接属する own properties と、プロパティ継承関係を通じて関連する別のオブジェクトから提供される inherited properties の両方が含まれる。継承されたプロパティは、その関連オブジェクトの own property でも inherited property でもありうる。オブジェクトの各 own property は、それぞれ、そのオブジェクトの他の own property のキー値と異なるキー値を持たなければならない。

すべてのオブジェクトは論理的にはプロパティの集合であるが、プロパティへのアクセスおよび操作に関する意味論が異なる複数の形式のオブジェクトが存在する。オブジェクトの複数の形式の定義については 6.1.7.2 を参照。

さらに、一部のオブジェクトは callable であり、これらは functions または function objects と呼ばれ、以下でさらに説明される。ECMAScript におけるすべての function は Object 型のメンバである。

6.1.7.1 プロパティ属性

属性は、この仕様において、Table 3 に記述される Object プロパティの状態を定義および説明するために使用される。明示的に指定されない限り、各属性の初期値はその Default Value である。

Table 3: Attributes of an Object property
属性名 その属性が存在するプロパティの種類 値域 既定値 説明
[[Value]] data property an ECMAScript language value undefined そのプロパティに対する get アクセスによって取得される値。
[[Writable]] data property a Boolean false false の場合、[[Set]] を用いてそのプロパティの [[Value]] 属性を変更しようとする ECMAScript コードの試みは成功しない。
[[Get]] accessor property an Object or undefined undefined 値が Object であるなら、それは function object でなければならない。その function の [[Call]] 内部メソッド(Table 5)は、そのプロパティに対して get アクセスが行われるたびに、空の引数リストで呼び出され、プロパティ値を取得する。
[[Set]] accessor property an Object or undefined undefined 値が Object であるなら、それは function object でなければならない。その function の [[Call]] 内部メソッド(Table 5)は、そのプロパティに対して set アクセスが行われるたびに、代入された値を唯一の引数とする引数リストで呼び出される。プロパティの [[Set]] 内部メソッドの効果は、その後のそのプロパティの [[Get]] 内部メソッド呼出しによって返される値に影響してもよいし、影響しなくてもよい。
[[Enumerable]] data property or accessor property a Boolean false true の場合、そのプロパティは for-in 列挙(14.7.5 を参照)によって列挙される。そうでない場合、そのプロパティは non-enumerable であると言われる。
[[Configurable]] data property or accessor property a Boolean false false の場合、そのプロパティの削除、そのプロパティを data property から accessor property に変更すること、または accessor property から data property に変更すること、あるいは属性に対する変更(既存の [[Value]] を置き換えるか [[Writable]]false に設定すること以外)は失敗する。

6.1.7.2 Object 内部メソッドと内部スロット

ECMAScript におけるオブジェクトの実際の意味論は、internal methods と呼ばれるアルゴリズムによって規定される。ECMAScript エンジン内の各オブジェクトは、その実行時の挙動を定義する内部メソッドの集合と関連付けられている。これらの内部メソッドは ECMAScript 言語の一部ではない。これらは純粋に説明のためにこの仕様で定義される。しかし、ECMAScript の実装内の各オブジェクトは、それに関連付けられた内部メソッドに従って振る舞わなければならない。これをどのように正確に達成するかは、実装によって決定される。

内部メソッド名は多相的である。これは、共通の内部メソッド名が適用されたときに、異なるオブジェクト値が異なるアルゴリズムを実行しうることを意味する。内部メソッドが呼び出される実際のオブジェクトは、その呼出しの “target” である。実行時に、あるアルゴリズムの実装が、そのオブジェクトがサポートしていない内部メソッドを使用しようとした場合、TypeError 例外が投げられる。

内部スロットは、オブジェクト、Symbol、または Private Name に関連付けられ、さまざまな ECMAScript 仕様アルゴリズムで使用される内部状態に対応する。内部スロットはオブジェクトプロパティではなく、継承もされない。特定の内部スロット仕様に応じて、そのような状態は任意の ECMAScript 言語型の値、または特定の ECMAScript 仕様型の値から成ってよい。明示的に特に指定されない限り、内部スロットはオブジェクト、Symbol、または Private Name を生成する過程の一部として割り当てられ、動的に追加することはできない。特に指定されない限り、内部スロットの初期値は値 undefined である。この仕様内のさまざまなアルゴリズムは、内部スロットを持つ値を生成する。しかし、ECMAScript 言語は内部スロットを直接操作する方法を提供しない。

すべてのオブジェクトは [[PrivateElements]] という名前の内部スロットを持ち、これは PrivateElementsList である。この List は、そのオブジェクトの private field、method、および accessor の値を表す。初期状態では空の List である。

内部メソッドおよび内部スロットは、この仕様の中では二重角括弧 [[ ]] で囲まれた名前を用いて識別される。

Table 4 は、この仕様で使用される essential internal methods を要約したものであり、ECMAScript コードによって生成または操作されるすべてのオブジェクトに適用される。すべてのオブジェクトは、すべての essential internal method に対するアルゴリズムを持たなければならない。しかし、すべてのオブジェクトがそれらのメソッドに対して同じアルゴリズムを使う必要はない。

ordinary object とは、次の基準をすべて満たすオブジェクトである。

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

exotic object とは、ordinary object ではないオブジェクトである。

この仕様は、異なる種類の exotic object を、それらのオブジェクトの内部メソッドによって認識する。ある特定の種類の exotic object(Array exotic object や bound function exotic object など)と挙動上等価であっても、その種類に対して規定されたのと同じ内部メソッドの集合を持たないオブジェクトは、その種類の exotic object としては認識されない。

Table 4 および他の同様の表における “Signature” 列は、各内部メソッドの呼出しパターンを記述する。呼出しパターンは常に、説明的なパラメータ名を括弧で囲んだリストを含む。パラメータ名が ECMAScript 型名と同じである場合、その名前はパラメータ値に要求される型を記述する。内部メソッドが明示的に値を返す場合、そのパラメータリストの後には記号 “→” と、返される値の型名が続く。signature に使用される型名は、節 6 で定義された型に、以下の追加名を加えたものを指す。“any” は、その値が任意の ECMAScript 言語型でありうることを意味する。

内部メソッドは、そのパラメータに加えて、常にメソッド呼出しの target であるオブジェクトへアクセスできる。

内部メソッドは暗黙に Completion Record を返す。これは、その呼出しパターンに示された戻り型の値を包む normal completion、または throw completion のいずれかである。

Table 4: Essential Internal Methods
Internal Method Signature 説明
[[GetPrototypeOf]] ( ) Object | Null このオブジェクトに継承プロパティを提供するオブジェクトを決定する。null 値は継承プロパティが存在しないことを示す。
[[SetPrototypeOf]] (Object | Null) Boolean このオブジェクトを、継承プロパティを提供する別のオブジェクトと関連付ける。null を渡すことは、継承プロパティが存在しないことを示す。操作が正常に完了したことを示す true、または成功しなかったことを示す false を返す。
[[IsExtensible]] ( ) Boolean このオブジェクトに追加のプロパティを加えることが許可されているかどうかを判定する。
[[PreventExtensions]] ( ) Boolean このオブジェクトに新しいプロパティを追加できるかどうかを制御する。操作が成功した場合は true、失敗した場合は false を返す。
[[GetOwnProperty]] (propertyKey) Undefined | Property Descriptor キーが propertyKey であるこのオブジェクトの own property に対する Property Descriptor を返す。そのようなプロパティが存在しない場合は undefined を返す。
[[DefineOwnProperty]] (propertyKey, propertyDescriptor) Boolean キーが propertyKey である own property を作成または変更し、propertyDescriptor によって記述される状態を持たせる。そのプロパティが正常に作成/更新された場合は true を、そのプロパティを作成または更新できなかった場合は false を返す。
[[HasProperty]] (propertyKey) Boolean キーが propertyKey である own property または inherited property のいずれかをこのオブジェクトがすでに持っているかどうかを示す Boolean 値を返す。
[[Get]] (propertyKey, receiver) any キーが propertyKey であるプロパティの値をこのオブジェクトから返す。プロパティ値を取得するために ECMAScript コードを実行しなければならない場合、receiver はそのコードを評価するときの this 値として使用される。
[[Set]] (propertyKey, value, receiver) Boolean キーが propertyKey であるプロパティの値を value に設定する。プロパティ値を設定するために ECMAScript コードを実行しなければならない場合、receiver はそのコードを評価するときの this 値として使用される。プロパティ値が設定された場合は true、設定できなかった場合は false を返す。
[[Delete]] (propertyKey) Boolean キーが propertyKey である own property をこのオブジェクトから削除する。プロパティが削除されず、なお存在している場合は false を返す。プロパティが削除された場合、または存在しない場合は true を返す。
[[OwnPropertyKeys]] ( ) List of property keys そのオブジェクトのすべての own property key を要素として持つ List を返す。

Table 5 は、関数として呼び出されうるオブジェクトによってサポートされる追加の essential internal method を要約したものである。function object とは、[[Call]] 内部メソッドをサポートするオブジェクトである。constructor とは、[[Construct]] 内部メソッドをサポートするオブジェクトである。[[Construct]] をサポートするすべてのオブジェクトは [[Call]] もサポートしなければならない。すなわち、すべての constructorfunction object でなければならない。したがって、constructorconstructor function または constructor function object とも呼ばれる。

Table 5: Additional Essential Internal Methods of Function Objects
Internal Method Signature 説明
[[Call]] (any, a List of any) any このオブジェクトに関連付けられたコードを実行する。関数呼出し式を介して起動される。内部メソッドへの引数は this 値と、その要素が呼出し式によって関数に渡された引数である List である。この内部メソッドを実装するオブジェクトは callable である。
[[Construct]] (a List of any, Object) Object オブジェクトを生成する。new 演算子または super 呼出しを介して起動される。内部メソッドへの第 1 引数は、constructor 呼出しまたは super 呼出しの引数を要素とする List である。第 2 引数は、最初に new 演算子が適用されたオブジェクトである。この内部メソッドを実装するオブジェクトは constructors と呼ばれる。function object は必ずしも constructor ではなく、そのような非 constructor function object[[Construct]] 内部メソッドを持たない。

ordinary object および標準 exotic object に対する essential internal method の意味論は、節 10 で規定される。exotic object の内部メソッドの指定された使用が実装でサポートされていない場合、その使用は試みられた際に TypeError 例外を投げなければならない。

6.1.7.3 Essential Internal Methods の不変条件

ECMAScript エンジンの Object の Internal Methods は、以下に規定される不変条件の一覧に適合しなければならない。この仕様における ordinary ECMAScript Object およびすべての標準 exotic object は、これらの不変条件を維持する。ECMAScript Proxy object は、[[ProxyHandler]] object 上で起動された trap の結果に対する実行時検査によって、これらの不変条件を維持する。

実装によって提供される exotic object も、それらのオブジェクトに対してこれらの不変条件を維持しなければならない。これらの不変条件に違反すると、ECMAScript コードが予測不能な挙動を示したり、セキュリティ上の問題を生じさせたりする可能性がある。しかし、これらの不変条件に違反しても、実装のメモリ安全性が損なわれることは決してあってはならない。

実装は、これらの不変条件を強制することなく essential internal methods の機能を実装する代替インターフェースを提供するなどして、これらの不変条件がいかなる方法によっても回避されることを許してはならない。

定義:

  • 内部メソッドの target とは、その内部メソッドが呼び出されるオブジェクトである。
  • target は、その [[IsExtensible]] 内部メソッドから false を返すこと、またはその [[PreventExtensions]] 内部メソッドから true を返すことが観測されている場合、non-extensible である。
  • non-existent property とは、non-extensible target 上に own property として存在しないプロパティである。
  • SameValue へのすべての参照は、SameValue アルゴリズムの定義に従う。

戻り値:

任意の内部メソッドによって返される値は、次のいずれかを持つ Completion Record でなければならない。

  • [[Type]] = normal, [[Target]] = empty, および [[Value]] = その内部メソッドについて以下に示される “normal return type” の値、または
  • [[Type]] = throw, [[Target]] = empty, および [[Value]] = 任意の ECMAScript 言語値
Note 1

内部メソッドは continue completionbreak completion、または return completion を返してはならない。

[[GetPrototypeOf]] ( )

  • normal return type は Object または Null のいずれかである。
  • target が non-extensible であり、[[GetPrototypeOf]] が値 proto を返した場合、その後の [[GetPrototypeOf]] の呼出しはすべて protoSameValue である値を返すべきである。
Note 2

オブジェクトの prototype chain は有限長であるべきである(すなわち、任意のオブジェクトから始めて、その結果に [[GetPrototypeOf]] 内部メソッドを再帰的に適用すると、最終的に値 null に到達するべきである)。しかし、prototype chain に ordinary object における [[GetPrototypeOf]] の定義を使用しない exotic object が含まれている場合、この要件はオブジェクトレベルの不変条件としては強制できない。そのような循環 prototype chain は、オブジェクトプロパティへのアクセス時に無限ループを引き起こす可能性がある。

[[SetPrototypeOf]] ( proto )

  • normal return type は Boolean である。
  • target が non-extensible である場合、proto が target の観測された [[GetPrototypeOf]] 値と SameValue でない限り、[[SetPrototypeOf]]false を返さなければならない。

[[IsExtensible]] ( )

  • normal return type は Boolean である。
  • [[IsExtensible]]false を返した場合、その後の target に対するすべての [[IsExtensible]] 呼出しは false を返さなければならない。

[[PreventExtensions]] ( )

  • normal return type は Boolean である。
  • [[PreventExtensions]]true を返した場合、その後の target に対するすべての [[IsExtensible]] 呼出しは false を返さなければならず、その target は以後 non-extensible とみなされる。

[[GetOwnProperty]] ( propertyKey )

  • normal return type は Property Descriptor または Undefined のいずれかである。
  • 戻り値が Property Descriptor である場合、それは fully populated Property Descriptor でなければならない。
  • propertyKey が non-configurable かつ non-writable な own data property として記述されている場合、その後のすべての [[GetOwnProperty]] ( propertyKey ) 呼出しは、その [[Value]]propertyKey[[Value]] 属性と SameValue である Property Descriptor を返さなければならない。
  • propertyKey[[Writable]] および [[Value]] 以外の属性が時間とともに変化しうる場合、またはそのプロパティが削除されうる場合、propertyKey[[Configurable]] 属性は true でなければならない。
  • [[Writable]] 属性が false から true に変化しうる場合、[[Configurable]] 属性は true でなければならない。
  • target が non-extensible であり、かつ propertyKey が non-existent である場合、その後の target に対するすべての [[GetOwnProperty]] (propertyKey) 呼出しは propertyKey を non-existent として記述しなければならない(すなわち [[GetOwnProperty]] (propertyKey) は undefined を返さなければならない)。
Note 3

第 3 の不変条件の帰結として、あるプロパティが data property として記述され、かつ時間とともに異なる値を返しうる場合、その値を変更する仕組みが他の essential internal methods を通じて公開されていないとしても、[[Writable]] および [[Configurable]] 属性のいずれか一方または両方が true でなければならない。

[[DefineOwnProperty]] ( propertyKey, desc )

  • normal return type は Boolean である。
  • [[DefineOwnProperty]] は、propertyKey が以前に target の non-configurable own property として観測されていた場合、次のいずれかに当てはまらない限り false を返さなければならない。
    1. propertyKey が writable data property である。non-configurable な writable data property は、non-configurable な non-writable data property に変更できる。
    2. desc のすべての属性が propertyKey の属性と SameValue である。
  • [[DefineOwnProperty]] (propertyKey, desc) は、target が non-extensible であり、かつ propertyKey が non-existent own property である場合、false を返さなければならない。すなわち、non-extensible target object は新しいプロパティによって拡張できない。

[[HasProperty]] ( propertyKey )

  • normal return type は Boolean である。
  • propertyKey が以前に target の non-configurable own data property または accessor property として観測されていた場合、[[HasProperty]]true を返さなければならない。

[[Get]] ( propertyKey, receiver )

  • normal return type は任意の ECMAScript 言語型である。
  • propertyKey が以前に、値 value を持つ target の non-configurable かつ non-writable own data property として観測されていた場合、[[Get]]valueSameValue である値を返さなければならない。
  • propertyKey が以前に、[[Get]] 属性が undefined である target の non-configurable own accessor property として観測されていた場合、[[Get]] 操作は undefined を返さなければならない。

[[Set]] ( propertyKey, value, receiver )

  • normal return type は Boolean である。
  • propertyKey が以前に target の non-configurable かつ non-writable own data property として観測されていた場合、valuepropertyKey[[Value]] 属性と SameValue である場合を除き、[[Set]]false を返さなければならない。
  • propertyKey が以前に、[[Set]] 属性が undefined である target の non-configurable own accessor property として観測されていた場合、[[Set]] 操作は false を返さなければならない。

[[Delete]] ( propertyKey )

  • normal return type は Boolean である。
  • propertyKey が以前に target の non-configurable own data property または accessor property として観測されていた場合、[[Delete]]false を返さなければならない。

[[OwnPropertyKeys]] ( )

  • normal return type は List である。
  • 返される List には重複する項目が含まれていてはならない。
  • 返される List の各要素は property key でなければならない。
  • 返される List には、以前に観測されたすべての non-configurable own property のキーが少なくとも含まれていなければならない。
  • target が non-extensible である場合、返される List[[GetOwnProperty]] を用いて観測可能な target のすべての own property のキーのみを含まなければならない。

[[Call]] ( )

[[Construct]] ( )

  • normal return type は Object である。
  • target は [[Call]] 内部メソッドも持たなければならない。

6.1.7.4 Well-Known Intrinsic Object

well-known intrinsic は、この仕様のアルゴリズムによって明示的に参照され、通常 realm 固有の identity を持つ組込みオブジェクトである。特に指定がない限り、各 intrinsic object は実際には、realm ごとに 1 つずつ存在する類似オブジェクトの集合に対応する。

この仕様において、%name% のような参照は、その名前に対応する現在の realm に関連付けられた intrinsic object を意味する。%name.a.b% のような参照は、あたかも ECMAScript コードが評価される前に intrinsic object %name% の "a" プロパティの値の "b" プロパティへアクセスしたかのように意味する。現在の realm およびその intrinsic の決定方法は 9.4 に記述されている。well-known intrinsic は Table 6 に列挙されている。

Table 6: Well-Known Intrinsic Objects
Intrinsic 名 グローバル名 ECMAScript 言語との関連
%AggregateError% AggregateError AggregateError constructor20.5.7.1
%Array% Array Array constructor23.1.1
%ArrayBuffer% ArrayBuffer ArrayBuffer constructor25.1.4
%ArrayIteratorPrototype% Array Iterator object の prototype(23.1.5
%AsyncFromSyncIteratorPrototype% Async-from-Sync Iterator object の prototype(27.1.5
%AsyncFunction% async function objectconstructor27.7.1
%AsyncGeneratorFunction% async generator function objectconstructor27.4.1
%AsyncGeneratorPrototype% async generator object の prototype(27.6
%AsyncIteratorPrototype% すべての標準組込み async iterator object が間接的に継承するオブジェクト
%Atomics% Atomics Atomics object(25.4
%BigInt% BigInt BigInt constructor21.2.1
%BigInt64Array% BigInt64Array BigInt64Array constructor23.2
%BigUint64Array% BigUint64Array BigUint64Array constructor23.2
%Boolean% Boolean Boolean constructor20.3.1
%DataView% DataView DataView constructor25.3.2
%Date% Date Date constructor21.4.2
%decodeURI% decodeURI decodeURI function(19.2.6.1
%decodeURIComponent% decodeURIComponent decodeURIComponent function(19.2.6.2
%encodeURI% encodeURI encodeURI function(19.2.6.3
%encodeURIComponent% encodeURIComponent encodeURIComponent function(19.2.6.4
%Error% Error Error constructor20.5.1
%eval% eval eval function(19.2.1
%EvalError% EvalError EvalError constructor20.5.5.1
%FinalizationRegistry% FinalizationRegistry FinalizationRegistry constructor26.2.1
%Float16Array% Float16Array Float16Array constructor23.2
%Float32Array% Float32Array Float32Array constructor23.2
%Float64Array% Float64Array Float64Array constructor23.2
%ForInIteratorPrototype% For-In Iterator object の prototype(14.7.5.10
%Function% Function Function constructor20.2.1
%GeneratorFunction% generator function objectconstructor27.3.1
%GeneratorPrototype% generator object の prototype(27.5
%Int8Array% Int8Array Int8Array constructor23.2
%Int16Array% Int16Array Int16Array constructor23.2
%Int32Array% Int32Array Int32Array constructor23.2
%isFinite% isFinite isFinite function(19.2.2
%isNaN% isNaN isNaN function(19.2.3
%Iterator% Iterator Iterator constructor27.1.3.1
%IteratorHelperPrototype% Iterator Helper object の prototype(27.1.2.1
%JSON% JSON JSON object(25.5
%Map% Map Map constructor24.1.1
%MapIteratorPrototype% Map Iterator object の prototype(24.1.5
%Math% Math Math object(21.3
%Number% Number Number constructor21.1.1
%Object% Object Object constructor20.1.1
%parseFloat% parseFloat parseFloat function(19.2.4
%parseInt% parseInt parseInt function(19.2.5
%Promise% Promise Promise constructor27.2.3
%Proxy% Proxy Proxy constructor28.2.1
%RangeError% RangeError RangeError constructor20.5.5.2
%ReferenceError% ReferenceError ReferenceError constructor20.5.5.3
%Reflect% Reflect Reflect object(28.1
%RegExp% RegExp RegExp constructor22.2.4
%RegExpStringIteratorPrototype% RegExp String Iterator object の prototype(22.2.9
%Set% Set Set constructor24.2.2
%SetIteratorPrototype% Set Iterator object の prototype(24.2.6
%SharedArrayBuffer% SharedArrayBuffer SharedArrayBuffer constructor25.2.3
%String% String String constructor22.1.1
%StringIteratorPrototype% String Iterator object の prototype(22.1.5
%Symbol% Symbol Symbol constructor20.4.1
%SyntaxError% SyntaxError SyntaxError constructor20.5.5.4
%ThrowTypeError% 無条件に %TypeError% の新しいインスタンスを投げる function object
%TypedArray% すべての typed Array constructor の super class(23.2.1
%TypeError% TypeError TypeError constructor20.5.5.5
%Uint8Array% Uint8Array Uint8Array constructor23.2
%Uint8ClampedArray% Uint8ClampedArray Uint8ClampedArray constructor23.2
%Uint16Array% Uint16Array Uint16Array constructor23.2
%Uint32Array% Uint32Array Uint32Array constructor23.2
%URIError% URIError URIError constructor20.5.5.6
%WeakMap% WeakMap WeakMap constructor24.3.1
%WeakRef% WeakRef WeakRef constructor26.1.1
%WeakSet% WeakSet WeakSet constructor24.4.1
%WrapForValidIteratorPrototype% Iterator.from が返す wrapped iterator object の prototype(27.1.3.2.2.1
Note

Table 98 に追加の項目がある。

6.2 ECMAScript 仕様型

仕様型は、ECMAScript 言語構成要素および ECMAScript 言語型の意味論を記述するためにアルゴリズム内で使用されるメタ値に対応する。仕様型には、Reference RecordListCompletion RecordProperty DescriptorEnvironment RecordAbstract Closure、および Data Block が含まれる。仕様型の値は仕様上の人工物であり、ECMAScript 実装内の特定の実体に必ずしも対応しない。仕様型の値は ECMAScript 式評価の中間結果を記述するために使用されることがあるが、そのような値はオブジェクトのプロパティや ECMAScript 言語変数の値として格納することはできない。

6.2.1 Enum 仕様型

Enum は、仕様内部の値であり、ECMAScript コードから直接観測することはできない。Enum は、sans-serif 書体を用いた upper kebab case で表記される。たとえば、Completion Record[[Type]] フィールドは normalreturn、または throw のような値を取る。Enum はその名前以外の性質を持たない。enum の名前は、他の enum と区別するため以外の目的を持たず、その使用法や文脈上の意味について何も含意しない。

6.2.2 List および Record 仕様型

List 型は、new 式、関数呼出し、および単純な順序付き値リストが必要な他のアルゴリズムにおける引数リストの評価(13.3.8 を参照)を説明するために使用される。List 型の値は、個々の値を含む list 要素の単なる順序付き列である。これらの列は任意の長さを取りうる。list の要素には 0 始まりの添字を用いてランダムアクセスできる。表記上の便宜のため、配列風の構文を用いて List 要素へアクセスできる。たとえば、arguments[2] は List arguments の 3rd 要素を意味する略記である。

アルゴリズムが順序を明示せずに List の要素を反復するとき、用いられる順序は List 内の要素の順序である。

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

この仕様において、“A, B, ... の list-concatenation” という句(各引数は空であってよい List である)は、各引数の要素を(順に)連結した要素を持つ新しい List 値を表す。

String の List に適用される “lexicographic code unit order に従って sorted される” という句は、短い方の文字列の長さまで各コードユニットの数値で比較し、すべて等しい場合には短い文字列を長い文字列より前に並べることを意味し、これは抽象操作 IsLessThan に記述される。

Record 型は、この仕様のアルゴリズム内におけるデータ集約を記述するために使用される。Record 型の値は、1 つ以上の名前付きフィールドから成る。各フィールドの値は ECMAScript 言語値または仕様値である。フィールド名は常に二重角括弧で囲まれる。たとえば [[Value]] である。

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

仕様本文およびアルゴリズムでは、ドット記法を用いて Record 値の特定フィールドを参照できる。たとえば、R が前段落で示した record であるなら、R.[[Field2]] は “R の [[Field2]] という名前のフィールド” の略記である。

よく使用される Record フィールドの組合せに対する schema には名前を付けることができ、その名前はリテラル Record 値の接頭辞として使用され、記述されている集約の具体的な種類を識別できる。たとえば: PropertyDescriptor { [[Value]]: 42, [[Writable]]: false, [[Configurable]]: true }。

6.2.3 Set および Relation 仕様型

Set 型は、メモリモデルで使用するための順序を持たない要素の集合を説明するために使用される。これは同名の ECMAScript コレクション型とは異なる。曖昧さを避けるため、この仕様では ECMAScript のコレクションのインスタンスは一貫して “Set objects” と呼ばれる。Set 型の値は単純な要素の集合であり、同一要素は 2 回以上現れない。要素は Set に追加したり、Set から削除したりできる。Set 同士は和、積、差を取ることができる。

Relation 型は、Set 上の制約を説明するために使用される。Relation 型の値は、その値域から取られた値の順序対の Set である。たとえば、Memory events 上の Relation は Memory events の順序対の集合である。Relation R と、その値域に属する 2 つの値 a および b に対して、a R b は、順序対 (a, b) が R のメンバであることを意味する略記である。ある条件に関して least Relation である Relation とは、その条件を満たす最小の Relation である。

strict partial order は、次を満たす Relation 値 R である。

  • R の定義域に属するすべての a, b, および c について:

    • a R a は成り立たず、かつ
    • a R b かつ b R c なら、a R c である。
Note 1

上の 2 つの性質は、それぞれ irreflexivity および transitivity と呼ばれる。

strict total order は、次を満たす Relation 値 R である。

  • R の定義域に属するすべての a, b, および c について:

    • ab であるか、a R b であるか、または b R a であり、かつ
    • a R a は成り立たず、かつ
    • a R b かつ b R c なら、a R c である。
Note 2

上の 3 つの性質は、それぞれ totality、irreflexivity、および transitivity と呼ばれる。

6.2.4 Completion Record 仕様型

Completion Record 仕様型は、値の実行時伝播および、非局所的な制御移動を行う文(breakcontinuereturnthrow)の挙動のような制御フローを説明するために使用される。

Completion Record は Table 7 で定義されるフィールドを持つ。

Table 7: Completion Record Fields
フィールド名 意味
[[Type]] normal, break, continue, return, or throw 発生した completion の種類。
[[Value]] Completion Record を除く任意の値 生成された値。
[[Target]] a String or empty 指向的な制御移動の target ラベル。

次の略記用語は、ときどき Completion Record を参照するために使用される。

  • normal completion は、[[Type]] の値が normal である任意の Completion Record を指す。
  • break completion は、[[Type]] の値が break である任意の Completion Record を指す。
  • continue completion は、[[Type]] の値が continue である任意の Completion Record を指す。
  • return completion は、[[Type]] の値が return である任意の Completion Record を指す。
  • throw completion は、[[Type]] の値が throw である任意の Completion Record を指す。
  • abrupt completion は、[[Type]] の値が normal 以外である任意の Completion Record を指す。
  • a normal completion containing some type of value は、その型の値を [[Value]] フィールドに持つ normal completion を指す。

この仕様で定義される callable object は、normal completion または throw completion のみを返す。他の種類の Completion Record を返すことは編集上の誤りとみなされる。

implementation-defined callable object は、normal completion または throw completion のいずれかを返さなければならない。

6.2.4.1 NormalCompletion ( value )

The abstract operation NormalCompletion takes argument value (any value except a Completion Record) and returns a normal completion. It performs the following steps when called:

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

6.2.4.2 ThrowCompletion ( value )

The abstract operation ThrowCompletion takes argument value (an ECMAScript language value) and returns a throw completion. It performs the following steps when called:

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

6.2.4.3 ReturnCompletion ( value )

The abstract operation ReturnCompletion takes argument value (an ECMAScript language value) and returns a return completion. It performs the following steps when called:

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

6.2.4.4 UpdateEmpty ( completionRecord, value )

The abstract operation UpdateEmpty takes arguments completionRecord (a Completion Record) and value (any value except a Completion Record) and returns a Completion Record. It performs the following steps when called:

  1. Assert: completionRecordreturn completion または throw completion のいずれかである場合、completionRecord.[[Value]]empty ではない。
  2. completionRecord.[[Value]]empty でない場合、? completionRecord を返す。
  3. Completion Record { [[Type]]: completionRecord.[[Type]], [[Value]]: value, [[Target]]: completionRecord.[[Target]] } を返す。

6.2.5 Reference Record 仕様型

Reference Record 型は、deletetypeof、代入演算子、super キーワード、およびその他の言語機能のような演算子の挙動を説明するために使用される。たとえば、代入の左側オペランドは Reference Record を生成することが期待される。

Reference Record は解決済みの名前、または(まだ解決されていない可能性のある)プロパティバインディングであり、そのフィールドは Table 8 によって定義される。

Table 8: Reference Record Fields
フィールド名 意味
[[Base]] an ECMAScript language value, an Environment Record, or unresolvable バインディングを保持する値または Environment Record[[Base]]unresolvable であることは、そのバインディングを解決できなかったことを示す。
[[ReferencedName]] an ECMAScript language value or a Private Name そのバインディングの名前。[[Base]] の値が Environment Record である場合は常に String。それ以外の場合、ToPropertyKey が実行されるまでは、String や Symbol 以外の ECMAScript 言語値である場合がある。
[[Strict]] a Boolean Reference Recordstrict mode code に由来する場合は true、そうでない場合は false
[[ThisValue]] an ECMAScript language value or empty empty でない場合、その Reference Recordsuper キーワードを用いて表現されたプロパティバインディングを表し、Super Reference Record と呼ばれる。その [[Base]] 値が Environment Record であることは決してない。その場合、[[ThisValue]] フィールドは、その Reference Record が作成された時点の this 値を保持する。

以下の抽象操作が、この仕様において Reference Record を操作するために使用される。

6.2.5.1 IsPropertyReference ( referenceRecord )

The abstract operation IsPropertyReference takes argument referenceRecord (a Reference Record) and returns a Boolean. It performs the following steps when called:

  1. referenceRecord.[[Base]]unresolvable なら、false を返す。
  2. referenceRecord.[[Base]]Environment Record なら、false を返す。
  3. true を返す。

6.2.5.2 IsUnresolvableReference ( referenceRecord )

The abstract operation IsUnresolvableReference takes argument referenceRecord (a Reference Record) and returns a Boolean. It performs the following steps when called:

  1. referenceRecord.[[Base]]unresolvable なら、true を返す。
  2. false を返す。

6.2.5.3 IsSuperReference ( referenceRecord )

The abstract operation IsSuperReference takes argument referenceRecord (a Reference Record) and returns a Boolean. It performs the following steps when called:

  1. referenceRecord.[[ThisValue]]empty なら、false を返す。
  2. true を返す。

6.2.5.4 IsPrivateReference ( referenceRecord )

The abstract operation IsPrivateReference takes argument referenceRecord (a Reference Record) and returns a Boolean. It performs the following steps when called:

  1. referenceRecord.[[ReferencedName]]Private Name なら、true を返す。
  2. false を返す。

6.2.5.5 GetValue ( referenceRecord )

The abstract operation GetValue takes argument referenceRecord (a Reference Record or an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

  1. referenceRecordReference Record でないなら、referenceRecord を返す。
  2. IsUnresolvableReference(referenceRecord) が true なら、ReferenceError 例外を投げる。
  3. IsPropertyReference(referenceRecord) が true なら、
    1. baseObj を ? ToObject(referenceRecord.[[Base]]) とする。
    2. IsPrivateReference(referenceRecord) が true なら、
      1. PrivateGet(baseObj, referenceRecord.[[ReferencedName]]) を返す。
    3. referenceRecord.[[ReferencedName]]property key でないなら、
      1. referenceRecord.[[ReferencedName]] を ? ToPropertyKey(referenceRecord.[[ReferencedName]]) に設定する。
    4. baseObj.[[Get]](referenceRecord.[[ReferencedName]], GetThisValue(referenceRecord)) を返す。
  4. basereferenceRecord.[[Base]] とする。
  5. Assert: baseEnvironment Record である。
  6. base.GetBindingValue(referenceRecord.[[ReferencedName]], referenceRecord.[[Strict]]) を返す(9.1 を参照)。
Note

手順 3.a で生成されうるオブジェクトは、上記抽象操作および ordinary object[[Get]] 内部メソッドの外側からはアクセスできない。実装は、そのオブジェクトを実際には生成しないことを選んでもよい。

6.2.5.6 PutValue ( referenceRecord, value )

The abstract operation PutValue takes arguments referenceRecord (a Reference Record or an ECMAScript language value) and value (an ECMAScript language value) and returns either a normal completion containing unused or an abrupt completion. It performs the following steps when called:

  1. referenceRecordReference Record でないなら、ReferenceError 例外を投げる。
  2. IsUnresolvableReference(referenceRecord) が true なら、
    1. referenceRecord.[[Strict]]true なら、ReferenceError 例外を投げる。
    2. globalObjGetGlobalObject() とする。
    3. Set(globalObj, referenceRecord.[[ReferencedName]], value, false) を実行する。
    4. unused を返す。
  3. IsPropertyReference(referenceRecord) が true なら、
    1. baseObj を ? ToObject(referenceRecord.[[Base]]) とする。
    2. IsPrivateReference(referenceRecord) が true なら、
      1. PrivateSet(baseObj, referenceRecord.[[ReferencedName]], value) を返す。
    3. referenceRecord.[[ReferencedName]]property key でないなら、
      1. referenceRecord.[[ReferencedName]] を ? ToPropertyKey(referenceRecord.[[ReferencedName]]) に設定する。
    4. succeeded を ? baseObj.[[Set]](referenceRecord.[[ReferencedName]], value, GetThisValue(referenceRecord)) とする。
    5. succeededfalse かつ referenceRecord.[[Strict]]true なら、TypeError 例外を投げる。
    6. unused を返す。
  4. basereferenceRecord.[[Base]] とする。
  5. Assert: baseEnvironment Record である。
  6. base.SetMutableBinding(referenceRecord.[[ReferencedName]], value, referenceRecord.[[Strict]]) を返す(9.1 を参照)。
Note

手順 3.a で生成されうるオブジェクトは、上記抽象操作および ordinary object[[Set]] 内部メソッドの外側からはアクセスできない。実装は、そのオブジェクトを実際には生成しないことを選んでもよい。

6.2.5.7 GetThisValue ( referenceRecord )

The abstract operation GetThisValue takes argument referenceRecord (a Reference Record) and returns an ECMAScript language value. It performs the following steps when called:

  1. Assert: IsPropertyReference(referenceRecord) is true.
  2. IsSuperReference(referenceRecord) が true なら、referenceRecord.[[ThisValue]] を返す。
  3. referenceRecord.[[Base]] を返す。

6.2.5.8 InitializeReferencedBinding ( referenceRecord, value )

The abstract operation InitializeReferencedBinding takes arguments referenceRecord (a Reference Record) and value (an ECMAScript language value) and returns either a normal completion containing unused or an abrupt completion. It performs the following steps when called:

  1. Assert: IsUnresolvableReference(referenceRecord) is false.
  2. basereferenceRecord.[[Base]] とする。
  3. Assert: baseEnvironment Record である。
  4. base.InitializeBinding(referenceRecord.[[ReferencedName]], value) を返す。

6.2.5.9 MakePrivateReference ( baseValue, privateIdentifier )

The abstract operation MakePrivateReference takes arguments baseValue (an ECMAScript language value) and privateIdentifier (a String) and returns a Reference Record. It performs the following steps when called:

  1. privateEnv を、実行中の execution context の PrivateEnvironment とする。
  2. Assert: privateEnvnull ではない。
  3. privateNameResolvePrivateIdentifier(privateEnv, privateIdentifier) とする。
  4. 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 のリテラル記述にタグ付けするために使用される schema 名は “PropertyDescriptor” である。

Property Descriptor 値は、特定のフィールドの存在または使用に基づいて、data Property Descriptor と accessor Property Descriptor にさらに分類できる。data Property Descriptor とは、[[Value]] または [[Writable]] のいずれかのフィールドを含むものである。accessor Property Descriptor とは、[[Get]] または [[Set]] のいずれかのフィールドを含むものである。任意の Property Descriptor は [[Enumerable]] および [[Configurable]] という名前のフィールドを持っていてよい。Property Descriptor 値は、data Property Descriptor と accessor Property Descriptor の両方であることはできないが、そのいずれでもないことはありうる(この場合、それは generic Property Descriptor である)。fully populated Property Descriptor とは、accessor Property Descriptor または data Property Descriptor のいずれかであり、かつ Table 3 に定義された対応するすべてのフィールドを持つものである。

以下の抽象操作は、この仕様において Property Descriptor 値を操作するために使用される。

6.2.6.1 IsAccessorDescriptor ( desc )

The abstract operation IsAccessorDescriptor takes argument desc (a Property Descriptor) and returns a Boolean. It performs the following steps when called:

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

6.2.6.2 IsDataDescriptor ( desc )

The abstract operation IsDataDescriptor takes argument desc (a Property Descriptor) and returns a Boolean. It performs the following steps when called:

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

6.2.6.3 IsGenericDescriptor ( desc )

The abstract operation IsGenericDescriptor takes argument desc (a Property Descriptor) and returns a Boolean. It performs the following steps when called:

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

6.2.6.4 FromPropertyDescriptor ( desc )

The abstract operation FromPropertyDescriptor takes argument desc (a Property Descriptor or undefined) and returns an Object or undefined. It performs the following steps when called:

  1. descundefined なら、undefined を返す。
  2. objOrdinaryObjectCreate(%Object.prototype%) とする。
  3. Assert: obj は own property を持たない extensible な ordinary object である。
  4. desc[[Value]] フィールドを持つ場合、
    1. CreateDataPropertyOrThrow(obj, "value", desc.[[Value]]) を実行する。
  5. desc[[Writable]] フィールドを持つ場合、
    1. CreateDataPropertyOrThrow(obj, "writable", desc.[[Writable]]) を実行する。
  6. desc[[Get]] フィールドを持つ場合、
    1. CreateDataPropertyOrThrow(obj, "get", desc.[[Get]]) を実行する。
  7. desc[[Set]] フィールドを持つ場合、
    1. CreateDataPropertyOrThrow(obj, "set", desc.[[Set]]) を実行する。
  8. desc[[Enumerable]] フィールドを持つ場合、
    1. CreateDataPropertyOrThrow(obj, "enumerable", desc.[[Enumerable]]) を実行する。
  9. desc[[Configurable]] フィールドを持つ場合、
    1. CreateDataPropertyOrThrow(obj, "configurable", desc.[[Configurable]]) を実行する。
  10. obj を返す。

6.2.6.5 ToPropertyDescriptor ( obj )

The abstract operation ToPropertyDescriptor takes argument obj (an ECMAScript language value) and returns either a normal completion containing a Property Descriptor or a throw completion. It performs the following steps when called:

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

6.2.6.6 CompletePropertyDescriptor ( desc )

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

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

6.2.7 Environment Record 仕様型

Environment Record 型は、ネストした関数やブロックにおける名前解決の挙動を説明するために使用される。この型とその操作は 9.1 で定義される。

6.2.8 Abstract Closure 仕様型

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

Abstract Closure を作成するアルゴリズム手順では、値は “capture” という動詞に続く別名のリストを用いて捕捉される。Abstract Closure が作成されるとき、その時点で各別名に関連付けられている値を捕捉する。Abstract Closure が呼び出されたときに実行されるアルゴリズムを規定する手順では、各捕捉値は、その値を捕捉するために使用された別名によって参照される。

Abstract Closure が Completion Record を返す場合、その Completion Recordnormal completion または throw completion のいずれかでなければならない。

Abstract Closure は、他のアルゴリズムの一部としてインラインで作成される。次の例に示す。

  1. addend を 41 とする。
  2. closure を、新しい Abstract Closure とする。この Closure はパラメータ (x) を持ち、addend を捕捉し、呼び出されたときに次の手順を実行する:
    1. x + addend を返す。
  3. valclosure(1) とする。
  4. Assert: val は 42 である。

6.2.9 Data Block

Data Block 仕様型は、バイト単位(8 ビット)の数値の、独立した可変の列を記述するために使用される。byte value とは、0 から 255 までの包含区間にある整数である。Data Block 値は、各バイトの初期値が 0 である固定個数のバイトで作成される。

この仕様内での記法上の便宜のため、配列風の構文を用いて Data Block 値の個々のバイトへアクセスできる。この記法は、Data Block 値を 0 始まりの integer-indexed なバイト列として表す。たとえば、db が 5 バイトの Data Block 値である場合、db[2] を用いてその 3rd バイトへアクセスできる。

複数の agent から同時に参照可能なメモリ上に存在する data block は、Shared Data Block として指定される。Shared Data Block は、(Shared Data Block 値の等価性判定の目的において)address-free な identity を持つ。すなわち、その identity は任意のプロセスにおいてその block がマップされる仮想アドレスには結び付かず、その block が表すメモリ位置の集合に結び付く。2 つの data block が等しいのは、それらが含む位置集合が等しい場合に限られる。そうでない場合、それらは等しくなく、それらが含む位置集合の共通部分は空である。さらに、Shared Data Block は Data Block と区別できる。

Shared Data Block の意味論は、メモリモデルによって Shared Data Block event を用いて定義される。以下の抽象操作は Shared Data Block event を導入し、評価意味論とメモリモデルの event 意味論との間のインターフェースとして機能する。これらの event は候補 execution を形成し、それに対してメモリモデルがフィルタとして作用する。完全な意味論についてはメモリモデルを参照されたい。

Shared Data Block event は、メモリモデルで定義される Record によってモデル化される。

以下の抽象操作は、この仕様において Data Block 値を操作するために使用される。

6.2.9.1 CreateByteDataBlock ( size )

The abstract operation CreateByteDataBlock takes argument size (a non-negative integer) and returns either a normal completion containing a Data Block or a throw completion. It performs the following steps when called:

  1. size > 253 - 1 なら、RangeError 例外を投げる。
  2. size バイトから成る新しい Data Blockdb を作る。そのような Data Block を作成できない場合、RangeError 例外を投げる。
  3. db のすべてのバイトを 0 に設定する。
  4. db を返す。

6.2.9.2 CreateSharedByteDataBlock ( size )

The abstract operation CreateSharedByteDataBlock takes argument size (a non-negative integer) and returns either a normal completion containing a Shared Data Block or a throw completion. It performs the following steps when called:

  1. size バイトから成る新しい Shared Data Blockdb を作る。そのような Shared Data Block を作成できない場合、RangeError 例外を投げる。
  2. agentRecord を、周囲の agentAgent Record とする。
  3. executionagentRecord.[[CandidateExecution]] とする。
  4. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() である Agent Events Record とする。
  5. zero を « 0 » とする。
  6. db の各添字 i について、次を行う
    1. WriteSharedMemory { [[Order]]: init, [[NoTear]]: true, [[Block]]: db, [[ByteIndex]]: i, [[ElementSize]]: 1, [[Payload]]: zero } を eventsRecord.[[EventList]] に追加する。
  7. db を返す。

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

The abstract operation CopyDataBlockBytes takes arguments toBlock (a Data Block or a Shared Data Block), toIndex (a non-negative integer), fromBlock (a Data Block or a Shared Data Block), fromIndex (a non-negative integer), and count (a non-negative integer) and returns unused. It performs the following steps when called:

  1. Assert: fromBlocktoBlock は異なる値である。
  2. fromSizefromBlock 内のバイト数とする。
  3. Assert: fromIndex + countfromSize
  4. toSizetoBlock 内のバイト数とする。
  5. Assert: toIndex + counttoSize
  6. count > 0 の間、繰り返す
    1. fromBlockShared Data Block の場合、
      1. agentRecord を、周囲の agentAgent Record とする。
      2. executionagentRecord.[[CandidateExecution]] とする。
      3. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() である Agent Events Record とする。
      4. bytes を、唯一の要素として非決定的に選ばれた byte value を持つ List とする。
      5. NOTE: 実装において、bytes は基盤ハードウェア上の非アトミック read 命令の結果である。非決定性は、弱い一貫性を持つハードウェアの観測可能な挙動を記述するための、メモリモデルによる意味論的規定である。
      6. readEventReadSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: fromBlock, [[ByteIndex]]: fromIndex, [[ElementSize]]: 1 } とする。
      7. readEventeventsRecord.[[EventList]] に追加する。
      8. Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: bytes } を execution.[[ChosenValues]] に追加する。
      9. toBlockShared Data Block の場合、
        1. WriteSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: toBlock, [[ByteIndex]]: toIndex, [[ElementSize]]: 1, [[Payload]]: bytes } を eventsRecord.[[EventList]] に追加する。
      10. Else,
        1. toBlock[toIndex] を bytes[0] に設定する。
    2. Else,
      1. Assert: toBlockShared Data Block ではない。
      2. toBlock[toIndex] を fromBlock[fromIndex] に設定する。
    3. toIndextoIndex + 1 に設定する。
    4. fromIndexfromIndex + 1 に設定する。
    5. countcount - 1 に設定する。
  7. unused を返す。

6.2.10 PrivateElement 仕様型

PrivateElement 型は、private class field、method、および accessor の仕様において使用される Record である。Property Descriptor は private element には使用されないが、private field は non-configurable で non-enumerable、かつ writable な data property に類似して振る舞い、private method は non-configurable で non-enumerable、かつ non-writable な data property に類似して振る舞い、private accessor は non-configurable で non-enumerable な accessor property に類似して振る舞う。

PrivateElement 型の値は、Table 9 に定義されるフィールドを持つ Record 値である。そのような値は PrivateElements と呼ばれる。

Table 9: PrivateElement Fields
フィールド名 そのフィールドが存在する [[Kind]] フィールドの値 意味
[[Key]] All a Private Name field、method、または accessor の名前。
[[Kind]] All field, method, or accessor 要素の種類。
[[Value]] field and method an ECMAScript language value field の値。
[[Get]] accessor a function object or undefined private accessor の getter。
[[Set]] accessor a function object or undefined private accessor の setter。

6.2.11 ClassFieldDefinition Record 仕様型

ClassFieldDefinition 型は、class field の仕様において使用される Record である。

ClassFieldDefinition 型の値は、Table 10 に定義されるフィールドを持つ Record 値である。そのような値は ClassFieldDefinition Records と呼ばれる。

Table 10: ClassFieldDefinition Record Fields
フィールド名 意味
[[Name]] a Private Name, a String, or a Symbol field の名前。
[[Initializer]] an ECMAScript function object or empty 存在する場合、その field の initializer。

6.2.12 Private Name

Private Name 仕様型は、private class element(field、method、または accessor)のキーを表す、グローバルに一意な値(たとえ他の点で区別不能であっても、他のあらゆる Private Name と異なる値)を記述するために使用される。各 Private Name は、不変の [[Description]] 内部スロットを持ち、その値は String である。Private Name は、任意の ECMAScript object に対して PrivateFieldAdd または PrivateMethodOrAccessorAdd によって取り付けることができ、その後 PrivateGet および PrivateSet によって読み書きできる。

6.2.13 ClassStaticBlockDefinition Record 仕様型

ClassStaticBlockDefinition Record は、class static initialization block の実行可能コードをカプセル化するために使用される Record 値である。

ClassStaticBlockDefinition Record は、Table 11 に列挙されるフィールドを持つ。

Table 11: ClassStaticBlockDefinition Record Fields
フィールド名 意味
[[BodyFunction]] an ECMAScript function object class の static 初期化中に呼び出される function object

7 抽象操作

これらの操作は ECMAScript 言語の一部ではない。これらは、ECMAScript 言語の意味論を仕様化するのを補助するためだけに、ここで定義される。この仕様全体を通して、他にもより特殊化された抽象操作が定義されている。

7.1 型変換

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

BigInt 型には ECMAScript 言語における暗黙変換は存在しない。プログラマは、他の型から値を変換するために BigInt を明示的に呼び出さなければならない。

7.1.1 ToPrimitive ( input [ , preferredType ] )

The abstract operation ToPrimitive takes argument input (an ECMAScript language value) and optional argument preferredType (string or number) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは input 引数を非 Object 型へ変換する。あるオブジェクトが複数の primitive 型へ変換可能な場合、任意のヒント preferredType を用いてその型を優先してよい。 It performs the following steps when called:

  1. input が Object である場合、
    1. exoticToPrim を ? GetMethod(input, %Symbol.toPrimitive%) とする。
    2. exoticToPrimundefined でない場合、
      1. preferredType が存在しない場合、
        1. hint"default" とする。
      2. Else if preferredTypestring である場合、
        1. hint"string" とする。
      3. Else,
        1. Assert: preferredTypenumber である。
        2. hint"number" とする。
      4. result を ? Call(exoticToPrim, input, « hint ») とする。
      5. result が Object でないなら、result を返す。
      6. TypeError 例外を throw する。
    3. preferredType が存在しないなら、preferredTypenumber に設定する。
    4. OrdinaryToPrimitive(input, preferredType) を返す。
  2. input を返す。
Note

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

7.1.1.1 OrdinaryToPrimitive ( obj, hint )

The abstract operation OrdinaryToPrimitive takes arguments obj (an Object) and hint (string or number) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. hintstring の場合、
    1. methodNames を « "toString", "valueOf" » とする。
  2. Else,
    1. methodNames を « "valueOf", "toString" » とする。
  3. methodNames の各要素 name について、次を行う
    1. method を ? Get(obj, name) とする。
    2. IsCallable(method) が true なら、
      1. result を ? Call(method, obj) とする。
      2. result が Object でないなら、result を返す。
  4. TypeError 例外を throw する。

7.1.2 ToBoolean ( argument )

The abstract operation ToBoolean takes argument argument (an ECMAScript language value) and returns a Boolean. これは argumentBoolean 型の値へ変換する。 It performs the following steps when called:

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

7.1.3 ToNumeric ( value )

The abstract operation ToNumeric takes argument value (an ECMAScript language value) and returns either a normal completion containing either a Number or a BigInt, or a throw completion. これは value を Number または BigInt に変換して返す。 It performs the following steps when called:

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

7.1.4 ToNumber ( argument )

The abstract operation ToNumber takes argument argument (an ECMAScript language value) and returns either a normal completion containing a Number or a throw completion. これは argumentNumber 型の値へ変換する。 It performs the following steps when called:

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

7.1.4.1 String 型に適用される ToNumber

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

構文

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

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

Note

StringNumericLiteralNumericLiteral の構文の間には、いくつかの相違点があることに注意すべきである。

7.1.4.1.1 StringToNumber ( str )

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

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

7.1.4.1.2 Runtime Semantics: StringNumericValue

The syntax-directed operation StringNumericValue takes no arguments and returns a Number.

Note

StringNumericLiteral から Number 値への変換は、全体としては NumericLiteralNumericValue の決定(12.9.3 を参照)に似ているが、細部の一部は異なる。

It is defined piecewise over the following productions:

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

7.1.4.1.3 RoundMVResult ( n )

The abstract operation RoundMVResult takes argument n (a mathematical value) and returns a Number. これは nimplementation-defined な方法で Number に変換する。この抽象操作において、ある桁は、それが 0 でないか、またはその左側に非 0 の桁が存在し、かつその右側にも非 0 の桁が存在する場合に significant である。この抽象操作において、数学的値の表現によって “表される数学的値” とは、数学的値の “10 進表現” の逆である。 It performs the following steps when called:

  1. n の 10 進表現が 20 桁以下の significant digits を持つなら、𝔽(n) を返す。
  2. option1 を、n の 10 進表現において 20 桁目より後の各 significant digit を 0 桁で置き換えた結果によって表される数学的値とする。
  3. option2 を、n の 10 進表現において 20 桁目より後の各 significant digit を 0 桁で置き換え、その後 20 桁目でインクリメントした結果(必要に応じて桁上がりを行う)によって表される数学的値とする。
  4. chosen を、option1 または option2 のいずれかを選ぶ implementation-defined な選択とする。
  5. 𝔽(chosen) を返す。

7.1.5 ToIntegerOrInfinity ( argument )

The abstract operation ToIntegerOrInfinity takes argument argument (an ECMAScript language value) and returns either a normal completion containing either an integer, +∞, or -∞, or a throw completion. これは argument を、その Number 値の小数部分を切り捨てた整数へ変換する。また、その Number 値が無限大である場合には +∞ または -∞ へ変換する。 It performs the following steps when called:

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

7.1.6 ToFixedSizeInteger ( int, signed, bitWidth )

The abstract operation ToFixedSizeInteger takes arguments int (整数、+∞、または -∞), signed (unsigned または signed), and bitWidth (正の整数) and returns 整数. これは、int を、0 から 2bitWidth - 1 までの両端を含む区間にある 2bitWidth 個の整数のうちの 1 つ(signedunsigned の場合)、または -2bitWidth - 1 から 2bitWidth - 1 - 1 まで(signedsigned の場合)に写像する。 It performs the following steps when called:

  1. int = +∞ または int = -∞ である場合、0 を返す。
  2. fixedIntint modulo 2bitWidth とする。
  3. NOTE: 次のステップは fixedInt の 2 の補数表現を変更しない。
  4. signedsigned であり、かつ fixedInt ≥ 2bitWidth - 1 である場合、fixedIntfixedInt - 2bitWidth に設定する。
  5. fixedInt を返す。
Note

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.7 ToInt32 ( argument )

The abstract operation ToInt32 takes argument argument (ECMAScript 言語値) and returns 整数の Number を含む正常完了、または throw 完了. これは、argument を、𝔽(-231) から 𝔽(231 - 1) までの両端を含む区間にある、-0𝔽 を除く 232 個の整数の Number 値のうちの 1 つに変換する。 It performs the following steps when called:

  1. int を ? ToIntegerOrInfinity(argument) とする。
  2. 𝔽(ToFixedSizeInteger(int, signed, 32)) を返す。

7.1.8 ToUint32 ( argument )

The abstract operation ToUint32 takes argument argument (ECMAScript 言語値) and returns 整数の Number を含む正常完了、または throw 完了. これは、argument を、+0𝔽 から 𝔽(232 - 1) までの両端を含む区間にある 232 個の整数の Number 値のうちの 1 つに変換する。 It performs the following steps when called:

  1. int を ? ToIntegerOrInfinity(argument) とする。
  2. 𝔽(ToFixedSizeInteger(int, unsigned, 32)) を返す。

7.1.9 ToInt16 ( argument )

The abstract operation ToInt16 takes argument argument (ECMAScript 言語値) and returns 整数の Number を含む正常完了、または throw 完了. これは、argument を、𝔽(-215) から 𝔽(215 - 1) までの両端を含む区間にある、-0𝔽 を除く 216 個の整数の Number 値のうちの 1 つに変換する。 It performs the following steps when called:

  1. int を ? ToIntegerOrInfinity(argument) とする。
  2. 𝔽(ToFixedSizeInteger(int, signed, 16)) を返す。

7.1.10 ToUint16 ( argument )

The abstract operation ToUint16 takes argument argument (ECMAScript 言語値) and returns 整数の Number を含む正常完了、または throw 完了. これは、argument を、+0𝔽 から 𝔽(216 - 1) までの両端を含む区間にある 216 個の整数の Number 値のうちの 1 つに変換する。 It performs the following steps when called:

  1. int を ? ToIntegerOrInfinity(argument) とする。
  2. 𝔽(ToFixedSizeInteger(int, unsigned, 16)) を返す。

7.1.11 ToInt8 ( argument )

The abstract operation ToInt8 takes argument argument (ECMAScript 言語値) and returns 整数の Number を含む正常完了、または throw 完了. これは、argument を、-128𝔽 から 127𝔽 までの両端を含む区間にある、-0𝔽 を除く 28 個の整数の Number 値のうちの 1 つに変換する。 It performs the following steps when called:

  1. int を ? ToIntegerOrInfinity(argument) とする。
  2. 𝔽(ToFixedSizeInteger(int, signed, 8)) を返す。

7.1.12 ToUint8 ( argument )

The abstract operation ToUint8 takes argument argument (ECMAScript 言語値) and returns 整数の Number を含む正常完了、または throw 完了. これは、argument を、+0𝔽 から 255𝔽 までの両端を含む区間にある 28 個の整数の Number 値のうちの 1 つに変換する。 It performs the following steps when called:

  1. int を ? ToIntegerOrInfinity(argument) とする。
  2. 𝔽(ToFixedSizeInteger(int, unsigned, 8)) を返す。

7.1.13 ToUint8Clamp ( argument )

The abstract operation ToUint8Clamp takes argument argument (ECMAScript 言語値) and returns 整数の Number を含む正常完了、または throw 完了. これは、argument+0𝔽 から 255𝔽 までの両端を含む区間にある 28 個の整数の Number 値のうちの 1 つにクランプし、丸める。 It performs the following steps when called:

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

他のほとんどの ECMAScript 整数変換操作とは異なり、ToUint8Clamp は非整数値を切り捨てるのではなく丸める。また、これは「最近接偶数丸め」の同値分岐を使用し、これは Math.round の「最近接切り上げ」の同値分岐とは異なる。

7.1.14 ToBigInt ( argument )

The abstract operation ToBigInt takes argument argument (ECMAScript 言語値) and returns BigInt を含む正常完了、または throw 完了. これは、argument を BigInt 値に変換する、または Number からの暗黙の変換が必要となる場合は throw する。 It performs the following steps when called:

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

7.1.15 StringToBigInt ( str )

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

  1. literalParseText(str, StringIntegerLiteral) とする。
  2. literal がエラーの List である場合、undefined を返す。
  3. mvliteral の MV とする。
  4. Assert: mv は整数である。
  5. (mv) を返す。

7.1.15.1 StringIntegerLiteral 文法

StringToBigInt は次の文法を使用する。

構文

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

7.1.15.2 実行時セマンティクス: MV

7.1.16 ToBigInt64 ( argument )

The abstract operation ToBigInt64 takes argument argument (ECMAScript 言語値) and returns BigInt を含む正常完了、または throw 完了. これは、argument を、(-263) から (263 - 1) までの両端を含む区間にある 264 個の BigInt 値のうちの 1 つに変換する。 It performs the following steps when called:

  1. int(? ToBigInt(argument)) とする。
  2. (ToFixedSizeInteger(int, signed, 64)) を返す。

7.1.17 ToBigUint64 ( argument )

The abstract operation ToBigUint64 takes argument argument (ECMAScript 言語値) and returns BigInt を含む正常完了、または throw 完了. これは、argument を、0 から (264 - 1) までの両端を含む区間にある 264 個の BigInt 値のうちの 1 つに変換する。 It performs the following steps when called:

  1. int(? ToBigInt(argument)) とする。
  2. (ToFixedSizeInteger(int, unsigned, 64)) を返す。

7.1.18 ToString ( argument )

The abstract operation ToString takes argument argument (ECMAScript 言語値) and returns String を含む正常完了、または throw 完了. これは、argumentString 型の値に変換する。 It performs the following steps when called:

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

7.1.19 ToObject ( argument )

The abstract operation ToObject takes argument argument (ECMAScript 言語値) and returns Object を含む正常完了、または throw 完了. これは、argumentObject 型の値に変換する。 It performs the following steps when called:

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

7.1.20 ToPropertyKey ( argument )

The abstract operation ToPropertyKey takes argument argument (ECMAScript 言語値) and returns プロパティキーを含む正常完了、または throw 完了. これは、argument をプロパティキーとして使用できる値に変換する。 It performs the following steps when called:

  1. key を ? ToPrimitive(argument, string) とする。
  2. key が Symbol である場合、
    1. key を返す。
  3. ToString(key) を返す。

7.1.21 ToLength ( argument )

The abstract operation ToLength takes argument argument (ECMAScript 言語値) and returns 非負の整数の Number を含む正常完了、または throw 完了. これは、argument を、配列風オブジェクトの長さとして使用するのに適した非負の整数の Number にクランプし、切り捨てる。 It performs the following steps when called:

  1. len を ? ToIntegerOrInfinity(argument) とする。
  2. len ≤ 0 である場合、+0𝔽 を返す。
  3. 𝔽(min(len, 253 - 1)) を返す。

7.1.22 CanonicalNumericIndexString ( argument )

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

  1. argument"-0" である場合、-0𝔽 を返す。
  2. n を ! ToNumber(argument) とする。
  3. ToString(n) が argument である場合、n を返す。
  4. undefined を返す。

正準数値文字列とは、CanonicalNumericIndexString 抽象操作が undefined を返さない任意の String である。

7.1.23 ToIndex ( value )

The abstract operation ToIndex takes argument value (an ECMAScript language value) and returns either a normal completion containing a non-negative integer or a throw completion. これは value を整数へ変換し、その整数が非負であり、かつ integer index に対応するならその整数を返す。そうでなければ例外を throw する。 It performs the following steps when called:

  1. integer を ? ToIntegerOrInfinity(value) とする。
  2. integer が 0 から 253 - 1 までの包含区間にないなら、RangeError 例外を throw する。
  3. integer を返す。

7.2 判定および比較操作

7.2.1 RequireObjectCoercible ( argument )

The abstract operation RequireObjectCoercible takes argument argument (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. これは argumentToObject を用いて Object に変換できない値である場合、エラーを throw する。 It performs the following steps when called:

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

7.2.2 IsArray ( argument )

The abstract operation IsArray takes argument argument (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. argument が Object でないなら、false を返す。
  2. argument が Array exotic object なら、true を返す。
  3. argument が Proxy exotic object なら、
    1. ValidateNonRevokedProxy(argument) を実行する。
    2. proxyTargetargument.[[ProxyTarget]] とする。
    3. IsArray(proxyTarget) を返す。
  4. false を返す。

7.2.3 IsCallable ( argument )

The abstract operation IsCallable takes argument argument (an ECMAScript language value) and returns a Boolean. これは argument[[Call]] 内部メソッドを持つ callable function であるかどうかを判定する。 It performs the following steps when called:

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

7.2.4 IsConstructor ( argument )

The abstract operation IsConstructor takes argument argument (an ECMAScript language value) and returns a Boolean. これは argument[[Construct]] 内部メソッドを持つ function object であるかどうかを判定する。 It performs the following steps when called:

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

7.2.5 IsExtensible ( obj )

The abstract operation IsExtensible takes argument obj (an Object) and returns either a normal completion containing a Boolean or a throw completion. これは obj に追加のプロパティを加えることができるかどうかを判定するために用いられる。 It performs the following steps when called:

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

7.2.6 IsRegExp ( argument )

The abstract operation IsRegExp takes argument argument (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

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

7.2.7 Static Semantics: IsStringWellFormedUnicode ( string )

The abstract operation IsStringWellFormedUnicode takes argument string (a String) and returns a Boolean. これは 6.1.4 に記述されるように string を UTF-16 で符号化されたコードポイント列として解釈し、それが well formed な UTF-16 列であるかどうかを判定する。 It performs the following steps when called:

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

7.2.8 SameType ( x, y )

The abstract operation SameType takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns a Boolean. これは 2 つの引数が同じ型であるかどうかを判定する。 It performs the following steps when called:

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

7.2.9 SameValue ( x, y )

The abstract operation SameValue takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns a Boolean. これは 2 つの引数が同じ値であるかどうかを判定する。 It performs the following steps when called:

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

このアルゴリズムは、すべての NaN 値を等価として扱い、かつ +0𝔽-0𝔽 を区別する点で IsStrictlyEqual Algorithm と異なる。

7.2.10 SameValueZero ( x, y )

The abstract operation SameValueZero takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns a Boolean. これは 2 つの引数が同じ値であるかどうかを判定する(+0𝔽-0𝔽 の違いは無視する)。 It performs the following steps when called:

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

SameValueZero は、+0𝔽-0𝔽 を等価として扱う点だけが SameValue と異なる。

7.2.11 SameValueNonNumber ( x, y )

The abstract operation SameValueNonNumber takes arguments x (an ECMAScript language value, but not a Number) and y (an ECMAScript language value, but not a Number) and returns a Boolean. It performs the following steps when called:

  1. Assert: SameType(x, y) is true.
  2. xundefined または null のいずれかなら、true を返す。
  3. x が BigInt なら、
    1. BigInt::equal(x, y) を返す。
  4. x が String なら、
    1. xy の長さが同じであり、かつ同じ位置に同じコードユニットを持つなら、true を返す。
    2. false を返す。
  5. x が Boolean なら、
    1. xtrue かつ ytrue なら、true を返す。
    2. xfalse かつ yfalse なら、true を返す。
    3. false を返す。
  6. NOTE: 他のすべての ECMAScript 言語値は identity によって比較される。
  7. x is y なら、true を返す。
  8. false を返す。
Note 1
説明上の目的から、このアルゴリズムの中では、そうする必要がない場合であっても、いくつかのケースが個別に扱われている。
Note 2
x is y” の意味の詳細は 5.2.8 に記述されている。

7.2.12 IsLessThan ( x, y, leftFirst )

The abstract operation IsLessThan takes arguments x (an ECMAScript language value), y (an ECMAScript language value), and leftFirst (a Boolean) and returns either a normal completion containing either a Boolean or undefined, or a throw completion. これは比較 x < y のセマンティクスを提供し、truefalse、または undefined(これは、オペランドを同じ数値型の比較可能な値へ強制変換できなかったことを示す)を返す。leftFirst フラグは、潜在的に可視の副作用を伴う操作が x および y に対して実行される順序を制御するために使用される。ECMAScript は式の左から右への評価を規定しているため、これは必要である。leftFirsttrue の場合、x パラメータは、y パラメータに対応する式の左側に現れる式に対応する。leftFirstfalse の場合、その逆であり、操作は x より前に y に対して実行されなければならない。 It performs the following steps when called:

  1. leftFirsttrue の場合、
    1. px を ? ToPrimitive(x, number) とする。
    2. py を ? ToPrimitive(y, number) とする。
  2. Else,
    1. NOTE: 左から右への評価を保つために、評価順序を逆転させる必要がある。
    2. py を ? ToPrimitive(y, number) とする。
    3. px を ? ToPrimitive(x, number) とする。
  3. px が String かつ py が String なら、
    1. lxpx の長さとする。
    2. lypy の長さとする。
    3. 0 ≤ i < min(lx, ly) を満たす各整数 i について、昇順で次を行う
      1. cxpx 内の添字 i にあるコードユニットの数値とする。
      2. cypy 内の添字 i にあるコードユニットの数値とする。
      3. cx < cy なら、true を返す。
      4. cx > cy なら、false を返す。
    4. lx < ly なら、true を返す。
    5. false を返す。
  4. px が BigInt かつ py が String なら、
    1. nyStringToBigInt(py) とする。
    2. nyundefined なら、undefined を返す。
    3. BigInt::lessThan(px, ny) を返す。
  5. px が String かつ py が BigInt なら、
    1. nxStringToBigInt(px) とする。
    2. nxundefined なら、undefined を返す。
    3. BigInt::lessThan(nx, py) を返す。
  6. NOTE: pxpy は primitive 値なので、評価順序は重要ではない。
  7. nx を ? ToNumeric(px) とする。
  8. ny を ? ToNumeric(py) とする。
  9. SameType(nx, ny) が true なら、
    1. nx が Number なら、Number::lessThan(nx, ny) を返す。
    2. Assert: nx は BigInt である。
    3. BigInt::lessThan(nx, ny) を返す。
  10. Assert: nx は BigInt かつ ny は Number、または nx は Number かつ ny は BigInt である。
  11. nxNaN または nyNaN なら、undefined を返す。
  12. nx-∞𝔽 または ny+∞𝔽 なら、true を返す。
  13. nx+∞𝔽 または ny-∞𝔽 なら、false を返す。
  14. (nx) < (ny) なら、true を返す。
  15. false を返す。
Note 1

手順 3 は、加算演算子 + を扱うアルゴリズム(13.15.3)における手順 1.c と、論理和ではなく論理積を使用する点で異なる。

Note 2

String の比較では、UTF-16 コードユニット値の列に対する単純な辞書式順序を用いる。Unicode 仕様で定義される、より複雑で意味論指向の文字または文字列の等価性や照合順序の定義を使おうとはしない。したがって、Unicode Standard に従えば正準的に等しいが同じ正規化形式にない String 値は、不等と判定されうる。また、code unit による辞書式順序は、surrogate pair を含む String に対しては code point による順序とは異なることにも注意。

7.2.13 IsLooselyEqual ( x, y )

The abstract operation IsLooselyEqual takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. これは == 演算子の意味論を与える。 It performs the following steps when called:

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

7.2.14 IsStrictlyEqual ( x, y )

The abstract operation IsStrictlyEqual takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns a Boolean. これは === 演算子の意味論を与える。 It performs the following steps when called:

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

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

7.3 Object に対する操作

7.3.1 MakeBasicObject ( internalSlotsList )

The abstract operation MakeBasicObject takes argument internalSlotsList (a List of internal slot names) and returns an Object. これは、ordinary objectexotic object の両方を含め、アルゴリズム的に生成されるすべての ECMAScript object の源である。これは、すべての object の生成で用いられる共通手順を切り出し、object 生成を一元化する。 It performs the following steps when called:

  1. internalSlotsList を、internalSlotsList と « [[PrivateElements]] » の list-concatenation に設定する。
  2. obj を、internalSlotsList 内の各名前に対応する内部スロットを持つ新しく生成された object とする。
  3. NOTE: Object 内部メソッドと内部スロット に記述されるとおり、特に規定されない限り、そのような各内部スロットの初期値は undefined である。
  4. obj.[[PrivateElements]] を新しい空の List に設定する。
  5. obj の essential internal methods を、10.1 で規定される既定の ordinary object 定義に設定する。
  6. Assert: 呼び出し元が obj[[GetPrototypeOf]] および [[SetPrototypeOf]] の両 essential internal method を上書きしないなら、internalSlotsList[[Prototype]] を含む。
  7. Assert: 呼び出し元が obj[[SetPrototypeOf]][[IsExtensible]][[PreventExtensions]] の essential internal methods をすべて上書きしないなら、internalSlotsList[[Extensible]] を含む。
  8. internalSlotsList[[Extensible]] を含むなら、obj.[[Extensible]]true に設定する。
  9. obj を返す。
Note

この仕様において、exotic object は、ArrayCreateBoundFunctionCreate のような抽象操作内で、まず MakeBasicObject を呼び出して基本的で土台となる object を得てから、その object の内部メソッドの一部または全部を上書きすることで生成される。exotic object の生成をカプセル化するために、その object の essential internal methods はそれらの操作の外では決して変更されない。

7.3.2 Get ( obj, propertyKey )

The abstract operation Get takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは object の特定のプロパティの値を取得するために用いられる。 It performs the following steps when called:

  1. obj.[[Get]](propertyKey, obj) を返す。

7.3.3 GetV ( value, propertyKey )

The abstract operation GetV takes arguments value (an ECMAScript language value) and propertyKey (a property key) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは ECMAScript 言語値の特定のプロパティの値を取得するために用いられる。値が object でない場合、プロパティ探索はその値の型に応じた wrapper object を用いて行われる。 It performs the following steps when called:

  1. obj を ? ToObject(value) とする。
  2. obj.[[Get]](propertyKey, value) を返す。

7.3.4 Set ( obj, propertyKey, value, throw )

The abstract operation Set takes arguments obj (an Object), propertyKey (a property key), value (an ECMAScript language value), and throw (a Boolean) and returns either a normal completion containing unused or a throw completion. これは object の特定のプロパティの値を設定するために用いられる。value はそのプロパティの新しい値である。 It performs the following steps when called:

  1. success を ? obj.[[Set]](propertyKey, value, obj) とする。
  2. successfalse かつ throwtrue なら、TypeError 例外を throw する。
  3. unused を返す。

7.3.5 CreateDataProperty ( obj, propertyKey, value )

The abstract operation CreateDataProperty takes arguments obj (an Object), propertyKey (a property key), and value (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. これは object の新しい own property を生成するために用いられる。 It performs the following steps when called:

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

この抽象操作は、その属性が ECMAScript 言語の代入演算子によって生成されるプロパティと同じ既定値に設定されたプロパティを生成する。通常、そのプロパティはまだ存在しない。もし存在していて configurable でないか、または obj が extensible でないなら、[[DefineOwnProperty]]false を返す。

7.3.6 CreateDataPropertyOrThrow ( obj, propertyKey, value )

The abstract operation CreateDataPropertyOrThrow takes arguments obj (an Object), propertyKey (a property key), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. これは object の新しい own property を生成するために用いられる。要求されたプロパティ更新を実行できない場合、TypeError 例外を throw する。 It performs the following steps when called:

  1. success を ? CreateDataProperty(obj, propertyKey, value) とする。
  2. successfalse なら、TypeError 例外を throw する。
  3. unused を返す。
Note

この抽象操作は、その属性が ECMAScript 言語の代入演算子によって生成されるプロパティと同じ既定値に設定されたプロパティを生成する。通常、そのプロパティはまだ存在しない。もし存在していて configurable でないか、または obj が extensible でないなら、[[DefineOwnProperty]]false を返し、その結果この操作は TypeError 例外を throw する。

7.3.7 CreateNonEnumerableDataPropertyOrThrow ( obj, propertyKey, value )

The abstract operation CreateNonEnumerableDataPropertyOrThrow takes arguments obj (an Object), propertyKey (a property key), and value (an ECMAScript language value) and returns unused. これは ordinary object の新しい non-enumerable な own property を生成するために用いられる。 It performs the following steps when called:

  1. Assert: obj は ordinary で extensible な object であり、non-configurable なプロパティを持たない。
  2. newDesc を PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true } とする。
  3. DefinePropertyOrThrow(obj, propertyKey, newDesc) を実行する。
  4. unused を返す。
Note

この抽象操作は、その属性が ECMAScript 言語の代入演算子によって生成されるプロパティと同じ既定値に設定されるが、enumerable ではないプロパティを生成する。通常、そのプロパティはまだ存在しない。もし存在していたとしても、DefinePropertyOrThrow は正常完了することが保証される。

7.3.8 DefinePropertyOrThrow ( obj, propertyKey, desc )

The abstract operation DefinePropertyOrThrow takes arguments obj (an Object), propertyKey (a property key), and desc (a Property Descriptor) and returns either a normal completion containing unused or a throw completion. これは object の [[DefineOwnProperty]] 内部メソッドを、要求されたプロパティ更新を実行できない場合に TypeError 例外を throw する形で呼び出すために用いられる。 It performs the following steps when called:

  1. success を ? obj.[[DefineOwnProperty]](propertyKey, desc) とする。
  2. successfalse なら、TypeError 例外を throw する。
  3. unused を返す。

7.3.9 DeletePropertyOrThrow ( obj, propertyKey )

The abstract operation DeletePropertyOrThrow takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing unused or a throw completion. これは object の特定の own property を削除するために用いられる。そのプロパティが configurable でない場合は例外を throw する。 It performs the following steps when called:

  1. success を ? obj.[[Delete]](propertyKey) とする。
  2. successfalse なら、TypeError 例外を throw する。
  3. unused を返す。

7.3.10 GetMethod ( value, propertyKey )

The abstract operation GetMethod takes arguments value (an ECMAScript language value) and propertyKey (a property key) and returns either a normal completion containing either a function object or undefined, or a throw completion. これは、ECMAScript 言語値の特定のプロパティの値を取得するために用いられる。そのプロパティの値は function であることが期待されている。 It performs the following steps when called:

  1. func を ? GetV(value, propertyKey) とする。
  2. funcundefined または null のいずれかであるなら、undefined を返す。
  3. IsCallable(func) が false なら、TypeError 例外を throw する。
  4. func を返す。

7.3.11 HasProperty ( obj, propertyKey )

The abstract operation HasProperty takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. これは、指定された property key を持つプロパティを object が持つかどうかを判定するために用いられる。そのプロパティは own でも inherited でもよい。 It performs the following steps when called:

  1. obj.[[HasProperty]](propertyKey) を返す。

7.3.12 HasOwnProperty ( obj, propertyKey )

The abstract operation HasOwnProperty takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. これは、指定された property key を持つ own property を object が持つかどうかを判定するために用いられる。 It performs the following steps when called:

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

7.3.13 Call ( func, thisValue [ , argumentsList ] )

The abstract operation Call takes arguments func (an ECMAScript language value) and thisValue (an ECMAScript language value) and optional argument argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは function object[[Call]] 内部メソッドを呼び出すために用いられる。funcfunction objectthisValue[[Call]]this 値となる ECMAScript 言語値argumentsList はその内部メソッドの対応する引数に渡される値である。argumentsList が存在しない場合、その値として新しい空の List が用いられる。 It performs the following steps when called:

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

7.3.14 Construct ( constructor [ , argumentsList [ , newTarget ] ] )

The abstract operation Construct takes argument constructor (a constructor) and optional arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns either a normal completion containing an Object or a throw completion. これは function object[[Construct]] 内部メソッドを呼び出すために用いられる。argumentsList および newTarget は、その内部メソッドの対応する引数として渡される値である。argumentsList が存在しない場合、その値として新しい空の List が用いられる。newTarget が存在しない場合、その値として constructor が用いられる。 It performs the following steps when called:

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

newTarget が存在しない場合、この操作は new F(...argumentsList) と等価である。

7.3.15 SetIntegrityLevel ( obj, level )

The abstract operation SetIntegrityLevel takes arguments obj (an Object) and level (sealed or frozen) and returns either a normal completion containing a Boolean or a throw completion. これは object の own property の集合を固定するために用いられる。 It performs the following steps when called:

  1. status を ? obj.[[PreventExtensions]]() とする。
  2. statusfalse なら、false を返す。
  3. keys を ? obj.[[OwnPropertyKeys]]() とする。
  4. levelsealed の場合、
    1. keys の各要素 key について、次を行う
      1. DefinePropertyOrThrow(obj, key, PropertyDescriptor { [[Configurable]]: false }) を実行する。
  5. Else,
    1. Assert: levelfrozen である。
    2. keys の各要素 key について、次を行う
      1. currentDesc を ? obj.[[GetOwnProperty]](key) とする。
      2. currentDescundefined でないなら、
        1. IsAccessorDescriptor(currentDesc) が true なら、
          1. desc を PropertyDescriptor { [[Configurable]]: false } とする。
        2. Else,
          1. desc を PropertyDescriptor { [[Configurable]]: false, [[Writable]]: false } とする。
        3. DefinePropertyOrThrow(obj, key, desc) を実行する。
  6. true を返す。

7.3.16 TestIntegrityLevel ( obj, level )

The abstract operation TestIntegrityLevel takes arguments obj (an Object) and level (sealed or frozen) and returns either a normal completion containing a Boolean or a throw completion. これは object の own property の集合が固定されているかどうかを判定するために用いられる。 It performs the following steps when called:

  1. extensible を ? IsExtensible(obj) とする。
  2. extensibletrue なら、false を返す。
  3. NOTE: object が extensible である場合、そのプロパティは一切検査されない。
  4. keys を ? obj.[[OwnPropertyKeys]]() とする。
  5. keys の各要素 key について、次を行う
    1. currentDesc を ? obj.[[GetOwnProperty]](key) とする。
    2. currentDescundefined でないなら、
      1. currentDesc.[[Configurable]]true なら、false を返す。
      2. levelfrozen かつ IsDataDescriptor(currentDesc) が true なら、
        1. currentDesc.[[Writable]]true なら、false を返す。
  6. true を返す。

7.3.17 CreateArrayFromList ( elements )

The abstract operation CreateArrayFromList takes argument elements (a List of ECMAScript language values) and returns an Array. これは elements によって与えられる要素を持つ Array を生成するために用いられる。 It performs the following steps when called:

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

7.3.18 LengthOfArrayLike ( obj )

The abstract operation LengthOfArrayLike takes argument obj (an Object) and returns either a normal completion containing a non-negative integer or a throw completion. これは array-like object の "length" プロパティの値を返す。 It performs the following steps when called:

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

array-like object とは、この操作が normal completion を返す任意の object である。

Note 1
通常、array-like object は integer index 名を持ついくつかのプロパティも持つだろう。しかし、それはこの定義の要件ではない。
Note 2
Array と String object は array-like object の例である。

7.3.19 CreateListFromArrayLike ( obj [ , validElementTypes ] )

The abstract operation CreateListFromArrayLike takes argument obj (an ECMAScript language value) and optional argument validElementTypes (all or property-key) and returns either a normal completion containing a List of ECMAScript language values or a throw completion. これは obj の添字付きプロパティによって与えられる要素を持つ List 値を生成するために用いられる。validElementTypes は、要素として許可される値の型を示す。 It performs the following steps when called:

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

7.3.20 Invoke ( value, propertyKey [ , argumentsList ] )

The abstract operation Invoke takes arguments value (an ECMAScript language value) and propertyKey (a property key) and optional argument argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは ECMAScript 言語値の method property を呼び出すために用いられる。value はプロパティ探索の起点であると同時に、呼出し時の this 値でもある。argumentsList は、その method に渡される引数値のリストである。argumentsList が存在しない場合、その値として新しい空の List が用いられる。 It performs the following steps when called:

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

7.3.21 OrdinaryHasInstance ( constructor, instance )

The abstract operation OrdinaryHasInstance takes arguments constructor (an ECMAScript language value) and instance (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. これは、instanceconstructor によって提供されるインスタンス object 継承経路を継承しているかどうかを判定する既定アルゴリズムを実装する。 It performs the following steps when called:

  1. IsCallable(constructor) が false なら、false を返す。
  2. constructor[[BoundTargetFunction]] 内部スロットを持つなら、
    1. boundConstructorconstructor.[[BoundTargetFunction]] とする。
    2. InstanceofOperator(instance, boundConstructor) を返す。
  3. instance が Object でないなら、false を返す。
  4. proto を ? Get(constructor, "prototype") とする。
  5. proto が Object でないなら、TypeError 例外を throw する。
  6. 繰り返す
    1. instance を ? instance.[[GetPrototypeOf]]() に設定する。
    2. instancenull なら、false を返す。
    3. SameValue(proto, instance) が true なら、true を返す。

7.3.22 SpeciesConstructor ( obj, defaultConstructor )

The abstract operation SpeciesConstructor takes arguments obj (an Object) and defaultConstructor (a constructor) and returns either a normal completion containing a constructor or a throw completion. これは obj から派生する新しい object を生成するのに使うべき constructor を取得するために用いられる。defaultConstructor は、obj から始めて constructor%Symbol.species% プロパティを見つけられない場合に使用する constructor である。 It performs the following steps when called:

  1. constructor を ? Get(obj, "constructor") とする。
  2. constructorundefined なら、defaultConstructor を返す。
  3. constructor が Object でないなら、TypeError 例外を throw する。
  4. species を ? Get(constructor, %Symbol.species%) とする。
  5. speciesundefined または null のいずれかなら、defaultConstructor を返す。
  6. IsConstructor(species) が true なら、species を返す。
  7. TypeError 例外を throw する。

7.3.23 EnumerableOwnProperties ( obj, kind )

The abstract operation EnumerableOwnProperties takes arguments obj (an Object) and kind (key, value, or key+value) and returns either a normal completion containing a List of ECMAScript language values or a throw completion. It performs the following steps when called:

  1. ownKeys を ? obj.[[OwnPropertyKeys]]() とする。
  2. results を新しい空の List とする。
  3. ownKeys の各要素 key について、次を行う
    1. key が String であるなら、
      1. desc を ? obj.[[GetOwnProperty]](key) とする。
      2. descundefined でなく、かつ desc.[[Enumerable]]true であるなら、
        1. kindkey なら、
          1. keyresults に追加する。
        2. Else,
          1. value を ? Get(obj, key) とする。
          2. kindvalue なら、
            1. valueresults に追加する。
          3. Else,
            1. Assert: kindkey+value である。
            2. entryCreateArrayFromListkey, value ») とする。
            3. entryresults に追加する。
  4. results を返す。

7.3.24 GetFunctionRealm ( func )

The abstract operation GetFunctionRealm takes argument func (a function object) and returns either a normal completion containing a Realm Record or a throw completion. It performs the following steps when called:

  1. func[[Realm]] 内部スロットを持つなら、
    1. func.[[Realm]] を返す。
  2. func が bound function exotic object なら、
    1. boundTargetFunctionfunc.[[BoundTargetFunction]] とする。
    2. GetFunctionRealm(boundTargetFunction) を返す。
  3. func が Proxy exotic object なら、
    1. ValidateNonRevokedProxy(func) を実行する。
    2. proxyTargetfunc.[[ProxyTarget]] とする。
    3. Assert: proxyTargetfunction object である。
    4. GetFunctionRealm(proxyTarget) を返す。
  4. 現在の Realm Record を返す。
Note

手順 4 に到達するのは、func[[Realm]] 内部スロットを持たない非標準の function exotic object である場合に限られる。

7.3.25 CopyDataProperties ( target, source, excludedItems )

The abstract operation CopyDataProperties takes arguments target (an Object), source (an ECMAScript language value), and excludedItems (a List of property keys) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

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

ここで渡される target は、エラーが throw された場合に直接アクセスできない、新しく生成された object である。

7.3.26 PrivateElementFind ( obj, privateName )

The abstract operation PrivateElementFind takes arguments obj (an Object) and privateName (a Private Name) and returns a PrivateElement or empty. It performs the following steps when called:

  1. obj.[[PrivateElements]] が、pe.[[Key]] is privateName である PrivateElement pe を含むなら、
    1. pe を返す。
  2. empty を返す。

7.3.27 PrivateFieldAdd ( obj, privateName, value )

The abstract operation PrivateFieldAdd takes arguments obj (an Object), privateName (a Private Name), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

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

7.3.28 PrivateMethodOrAccessorAdd ( obj, method )

The abstract operation PrivateMethodOrAccessorAdd takes arguments obj (an Object) and method (a PrivateElement) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. Assert: method.[[Kind]]method または accessor のいずれかである。
  2. ホストがウェブブラウザであるなら、
    1. HostEnsureCanAddPrivateElement(obj) を実行する。
  3. entryPrivateElementFind(obj, method.[[Key]]) とする。
  4. entryempty でないなら、TypeError 例外を throw する。
  5. methodobj.[[PrivateElements]] に追加する。
  6. unused を返す。
Note

private method と accessor の値はインスタンス間で共有される。この操作は method または accessor の新しいコピーを生成しない。

7.3.29 HostEnsureCanAddPrivateElement ( obj )

The host-defined abstract operation HostEnsureCanAddPrivateElement takes argument obj (an Object) and returns either a normal completion containing unused or a throw completion. これは、ホスト環境が特定の host-defined exotic object への private element の追加を防げるようにする。

HostEnsureCanAddPrivateElement の実装は、次の要件に適合しなければならない。

  • objhost-defined exotic object でないなら、この抽象操作は NormalCompletion(unused) を返し、他の手順を一切実行してはならない。
  • 同じ引数でこの抽象操作を 2 回呼び出した場合、その両方は同じ種類の Completion Record を返さなければならない。

HostEnsureCanAddPrivateElement の既定実装は NormalCompletion(unused) を返すことである。

この抽象操作は、ウェブブラウザである ECMAScript ホストによってのみ呼び出される。

7.3.30 PrivateGet ( obj, privateName )

The abstract operation PrivateGet takes arguments obj (an Object) and privateName (a Private Name) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. entryPrivateElementFind(obj, privateName) とする。
  2. entryempty なら、TypeError 例外を throw する。
  3. entry.[[Kind]]field または method のいずれかなら、
    1. entry.[[Value]] を返す。
  4. Assert: entry.[[Kind]]accessor である。
  5. entry.[[Get]]undefined なら、TypeError 例外を throw する。
  6. getterentry.[[Get]] とする。
  7. Call(getter, obj) を返す。

7.3.31 PrivateSet ( obj, privateName, value )

The abstract operation PrivateSet takes arguments obj (an Object), privateName (a Private Name), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. entryPrivateElementFind(obj, privateName) とする。
  2. entryempty なら、TypeError 例外を throw する。
  3. entry.[[Kind]]method なら、TypeError 例外を throw する。
  4. entry.[[Kind]]field なら、
    1. entry.[[Value]]value に設定する。
  5. Else,
    1. Assert: entry.[[Kind]]accessor である。
    2. entry.[[Set]]undefined なら、TypeError 例外を throw する。
    3. setterentry.[[Set]] とする。
    4. Call(setter, obj, « value ») を実行する。
  6. unused を返す。

7.3.32 DefineField ( receiver, fieldRecord )

The abstract operation DefineField takes arguments receiver (an Object) and fieldRecord (a ClassFieldDefinition Record) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. fieldNamefieldRecord.[[Name]] とする。
  2. initializerfieldRecord.[[Initializer]] とする。
  3. initializerempty でない場合、
    1. initValue を ? Call(initializer, receiver) とする。
  4. Else,
    1. initValueundefined とする。
  5. fieldNamePrivate Name なら、
    1. PrivateFieldAdd(receiver, fieldName, initValue) を実行する。
  6. Else,
    1. Assert: fieldNameproperty key である。
    2. CreateDataPropertyOrThrow(receiver, fieldName, initValue) を実行する。
  7. unused を返す。

7.3.33 InitializeInstanceElements ( obj, constructor )

The abstract operation InitializeInstanceElements takes arguments obj (an Object) and constructor (an ECMAScript function object or a built-in function object) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

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

7.3.34 AddValueToKeyedGroup ( groups, key, value )

The abstract operation AddValueToKeyedGroup takes arguments groups (a List of Records with fields [[Key]] (an ECMAScript language value) and [[Elements]] (a List of ECMAScript language values)), key (an ECMAScript language value), and value (an ECMAScript language value) and returns unused. It performs the following steps when called:

  1. groups 内の各 Record { [[Key]], [[Elements]] } group について、次を行う
    1. SameValue(group.[[Key]], key) が true なら、
      1. Assert: groups の要素のうち、この条件を満たすものはちょうど 1 つである。
      2. valuegroup.[[Elements]] に追加する。
      3. unused を返す。
  2. groupRecord { [[Key]]: key, [[Elements]]: « value » } とする。
  3. groupgroups に追加する。
  4. unused を返す。

7.3.35 GroupBy ( items, callback, keyCoercion )

The abstract operation GroupBy takes arguments items (an ECMAScript language value), callback (an ECMAScript language value), and keyCoercion (property or collection) and returns either a normal completion containing a List of Records with fields [[Key]] (an ECMAScript language value) and [[Elements]] (a List of ECMAScript language values), or a throw completion. It performs the following steps when called:

  1. RequireObjectCoercible(items) を実行する。
  2. IsCallable(callback) が false なら、TypeError 例外を throw する。
  3. groups を新しい空の List とする。
  4. iteratorRecord を ? GetIterator(items, sync) とする。
  5. k を 0 とする。
  6. 繰り返す
    1. k ≥ 253 - 1 の場合、
      1. errorThrowCompletion(a newly created TypeError object) とする。
      2. IteratorClose(iteratorRecord, error) を返す。
    2. next を ? IteratorStepValue(iteratorRecord) とする。
    3. nextdone の場合、
      1. groups を返す。
    4. valuenext とする。
    5. keyCompletion(Call(callback, undefined, « value, 𝔽(k) »)) とする。
    6. IfAbruptCloseIterator(key, iteratorRecord)。
    7. keyCoercionproperty の場合、
      1. keyCompletion(ToPropertyKey(key)) に設定する。
      2. IfAbruptCloseIterator(key, iteratorRecord)。
    8. Else,
      1. Assert: keyCoercioncollection である。
      2. keyCanonicalizeKeyedCollectionKey(key) に設定する。
    9. AddValueToKeyedGroup(groups, key, value) を実行する。
    10. kk + 1 に設定する。

7.3.36 GetOptionsObject ( options )

The abstract operation GetOptionsObject takes argument options (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. optionsundefined の場合、
    1. OrdinaryObjectCreate(null) を返す。
  2. options が Object である場合、
    1. options を返す。
  3. TypeError 例外を throw する。

7.3.37 SetterThatIgnoresPrototypeProperties ( thisValue, home, propertyKey, value )

The abstract operation SetterThatIgnoresPrototypeProperties takes arguments thisValue (an ECMAScript language value), home (an Object), propertyKey (a property key), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. thisValue が Object でない場合、
    1. TypeError 例外を throw する。
  2. SameValue(thisValue, home) が true の場合、
    1. NOTE: ここで throw することは、strict mode code における home object 上の non-writable data property への代入を模倣する。
    2. TypeError 例外を throw する。
  3. desc を ? thisValue.[[GetOwnProperty]](propertyKey) とする。
  4. descundefined の場合、
    1. CreateDataPropertyOrThrow(thisValue, propertyKey, value) を実行する。
  5. Else,
    1. Set(thisValue, propertyKey, value, true) を実行する。
  6. unused を返す。

7.4 Iterator Object に対する操作

Common Iteration Interfaces(27.1)を参照。

7.4.1 Iterator Record

Iterator Record は、iterator または async iterator とその next メソッドを一緒にカプセル化するために用いられる Record 値である。

Iterator Record は Table 13 に列挙されるフィールドを持つ。

Table 13: Iterator Record Fields
フィールド名 意味
[[Iterator]] an Object iterator interface または async iterator interface に適合する object。
[[NextMethod]] an ECMAScript language value [[Iterator]] object の next メソッド。
[[Done]] a Boolean その iterator が完了したか、または close されたかどうか。

7.4.2 GetIteratorDirect ( obj )

The abstract operation GetIteratorDirect takes argument obj (an Object) and returns either a normal completion containing an Iterator Record or a throw completion. It performs the following steps when called:

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

7.4.3 GetIteratorFromMethod ( obj, method )

The abstract operation GetIteratorFromMethod takes arguments obj (an ECMAScript language value) and method (a function object) and returns either a normal completion containing an Iterator Record or a throw completion. It performs the following steps when called:

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

7.4.4 GetIterator ( obj, kind )

The abstract operation GetIterator takes arguments obj (an ECMAScript language value) and kind (sync or async) and returns either a normal completion containing an Iterator Record or a throw completion. It performs the following steps when called:

  1. kindasync の場合、
    1. method を ? GetMethod(obj, %Symbol.asyncIterator%) とする。
    2. methodundefined である場合、
      1. syncMethod を ? GetMethod(obj, %Symbol.iterator%) とする。
      2. syncMethodundefined なら、TypeError 例外を throw する。
      3. syncIteratorRecord を ? GetIteratorFromMethod(obj, syncMethod) とする。
      4. CreateAsyncFromSyncIterator(syncIteratorRecord) を返す。
  2. Else,
    1. method を ? GetMethod(obj, %Symbol.iterator%) とする。
  3. methodundefined なら、TypeError 例外を throw する。
  4. GetIteratorFromMethod(obj, method) を返す。

7.4.5 GetIteratorFlattenable ( obj, primitiveHandling )

The abstract operation GetIteratorFlattenable takes arguments obj (an ECMAScript language value) and primitiveHandling (iterate-string-primitives or reject-primitives) and returns either a normal completion containing an Iterator Record or a throw completion. It performs the following steps when called:

  1. obj が Object でない場合、
    1. primitiveHandlingreject-primitives なら、TypeError 例外を throw する。
    2. Assert: primitiveHandlingiterate-string-primitives である。
    3. obj が String でないなら、TypeError 例外を throw する。
  2. method を ? GetMethod(obj, %Symbol.iterator%) とする。
  3. methodundefined である場合、
    1. iteratorobj とする。
  4. Else,
    1. iterator を ? Call(method, obj) とする。
  5. iterator が Object でないなら、TypeError 例外を throw する。
  6. GetIteratorDirect(iterator) を返す。

7.4.6 IteratorNext ( iteratorRecord [ , value ] )

The abstract operation IteratorNext takes argument iteratorRecord (an Iterator Record) and optional argument value (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. value が存在しない場合、
    1. resultCompletion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]])) とする。
  2. Else,
    1. resultCompletion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « value »)) とする。
  3. resultthrow completion である場合、
    1. iteratorRecord.[[Done]]true に設定する。
    2. result を返す。
  4. result を ! result に設定する。
  5. result が Object でない場合、
    1. iteratorRecord.[[Done]]true に設定する。
    2. TypeError 例外を throw する。
  6. result を返す。

7.4.7 IteratorComplete ( iteratorResult )

The abstract operation IteratorComplete takes argument iteratorResult (an Object) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

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

7.4.8 IteratorValue ( iteratorResult )

The abstract operation IteratorValue takes argument iteratorResult (an Object) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

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

7.4.9 IteratorStep ( iteratorRecord )

The abstract operation IteratorStep takes argument iteratorRecord (an Iterator Record) and returns either a normal completion containing either an Object or done, or a throw completion. これは iteratorRecord.[[Iterator]] から次の値を要求するために iteratorRecord.[[NextMethod]] を呼び出し、iterator が終端に到達したことを示す done、または次の値が利用可能な場合には IteratorResult object を返す。 It performs the following steps when called:

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

7.4.10 IteratorStepValue ( iteratorRecord )

The abstract operation IteratorStepValue takes argument iteratorRecord (an Iterator Record) and returns either a normal completion containing either an ECMAScript language value or done, or a throw completion. これは iteratorRecord.[[Iterator]] から次の値を要求するために iteratorRecord.[[NextMethod]] を呼び出し、iterator が終端に到達したことを示す done、または次の値が利用可能な場合には IteratorResult object の value を返す。 It performs the following steps when called:

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

7.4.11 IteratorClose ( iteratorRecord, completion )

The abstract operation IteratorClose takes arguments iteratorRecord (an Iterator Record) and completion (a Completion Record) and returns a Completion Record. これは iterator に対して、それが完了状態に達したとき通常行うべきあらゆる動作を実行するよう通知するために用いられる。 It performs the following steps when called:

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

7.4.12 IteratorCloseAll ( iters, completion )

The abstract operation IteratorCloseAll takes arguments iters (a List of Iterator Records) and completion (a Completion Record) and returns a Completion Record. It performs the following steps when called:

  1. iters の各要素 iter について、逆順の List 順序で次を行う
    1. completionCompletion(IteratorClose(iter, completion)) に設定する。
  2. completion を返す。

7.4.13 IfAbruptCloseIterator ( value, iteratorRecord )

IfAbruptCloseIterator は、Iterator Record を使用する一連のアルゴリズム手順の略記である。次の形式のアルゴリズム手順:

  1. IfAbruptCloseIterator(value, iteratorRecord)。

は、次と同じ意味である:

  1. Assert: valueCompletion Record である。
  2. valueabrupt completion なら、? IteratorClose(iteratorRecord, value) を返す。
  3. value を ! value に設定する。

7.4.14 AsyncIteratorClose ( iteratorRecord, completion )

The abstract operation AsyncIteratorClose takes arguments iteratorRecord (an Iterator Record) and completion (a Completion Record) and returns a Completion Record. これは async iterator に対して、それが完了状態に達したとき通常行うべきあらゆる動作を実行するよう通知するために用いられる。 It performs the following steps when called:

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

7.4.15 IfAbruptCloseAsyncIterator ( value, iteratorRecord )

IfAbruptCloseAsyncIterator は、Iterator Record を使用する一連のアルゴリズム手順の略記である。次の形式のアルゴリズム手順:

  1. IfAbruptCloseAsyncIterator(value, iteratorRecord)。

は、次と同じ意味である:

  1. Assert: valueCompletion Record である。
  2. valueabrupt completion なら、? AsyncIteratorClose(iteratorRecord, value) を返す。
  3. value を ! value に設定する。

7.4.16 CreateIteratorResultObject ( value, done )

The abstract operation CreateIteratorResultObject takes arguments value (an ECMAScript language value) and done (a Boolean) and returns an Object that conforms to the IteratorResult interface. これは IteratorResult interface に適合する object を生成する。 It performs the following steps when called:

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

7.4.17 CreateListIteratorRecord ( list )

The abstract operation CreateListIteratorRecord takes argument list (a List of ECMAScript language values) and returns an Iterator Record. これは [[NextMethod]]list の連続する要素を返す Iterator Record を生成する。 It performs the following steps when called:

  1. closure を、新しい Abstract Closure とする。この Closure はパラメータを持たず、list を捕捉し、呼び出されたときに次の手順を実行する:
    1. list の各要素 value について、次を行う
      1. GeneratorYield(CreateIteratorResultObject(value, false)) を実行する。
    2. NormalCompletion(undefined) を返す。
  2. iteratorCreateIteratorFromClosure(closure, empty, %Iterator.prototype%) とする。
  3. Iterator Record { [[Iterator]]: iterator, [[NextMethod]]: %GeneratorPrototype.next%, [[Done]]: false } を返す。
Note

list iterator object は ECMAScript コードから直接アクセス可能になることはない。

7.4.18 IteratorToList ( iteratorRecord )

The abstract operation IteratorToList takes argument iteratorRecord (an Iterator Record) and returns either a normal completion containing a List of ECMAScript language values or a throw completion. It performs the following steps when called:

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

8 構文指向操作

この節で定義されるものに加えて、特殊化された構文指向操作がこの仕様全体を通じて定義される。

8.1 Runtime Semantics: Evaluation

The syntax-directed operation Evaluation takes no arguments and returns a Completion Record.

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

8.2 スコープ解析

8.2.1 Static Semantics: BoundNames

The syntax-directed operation BoundNames takes no arguments and returns a List of Strings.

Note

"*default*" は、この仕様の中では、他の名前を持たないモジュールのデフォルトエクスポートに対する合成名として使われる。モジュールの [[Environment]] 内にはその名前でエントリが作成され、対応する値を保持する。そして、モジュールに対して ResolveExport ( exportName [ , resolveSet ] ) を呼び出して "default" という名前のエクスポートを解決すると、[[BindingName]]"*default*" である ResolvedBinding Record が返され、その後それはモジュールの [[Environment]] 内で上記の値に解決される。これは匿名のデフォルトエクスポートを他の任意のエクスポートと同様に解決できるようにするための、仕様記述上の便宜のためだけに行われる。この "*default*" という文字列は、ECMAScript コードからもモジュールリンクアルゴリズムからも決してアクセス不能である。

It is defined piecewise over the following productions:

BindingIdentifier : Identifier
  1. 唯一の要素として IdentifierStringValue を持つ List を返す。
BindingIdentifier : yield
  1. « "yield" » を返す。
BindingIdentifier : await
  1. « "await" » を返す。
LexicalDeclaration : LetOrConst BindingList ;
  1. BindingListBoundNames を返す。
BindingList : BindingList , LexicalBinding
  1. names1BindingListBoundNames とする。
  2. names2LexicalBindingBoundNames とする。
  3. names1names2list-concatenation を返す。
LexicalBinding : BindingIdentifier Initializeropt
  1. BindingIdentifierBoundNames を返す。
LexicalBinding : BindingPattern Initializer
  1. BindingPatternBoundNames を返す。
VariableDeclarationList : VariableDeclarationList , VariableDeclaration
  1. names1VariableDeclarationListBoundNames とする。
  2. names2VariableDeclarationBoundNames とする。
  3. names1names2list-concatenation を返す。
VariableDeclaration : BindingIdentifier Initializeropt
  1. BindingIdentifierBoundNames を返す。
VariableDeclaration : BindingPattern Initializer
  1. BindingPatternBoundNames を返す。
ObjectBindingPattern : { }
  1. 新しい空の List を返す。
ObjectBindingPattern : { BindingPropertyList , BindingRestProperty }
  1. names1BindingPropertyListBoundNames とする。
  2. names2BindingRestPropertyBoundNames とする。
  3. names1names2list-concatenation を返す。
ArrayBindingPattern : [ Elisionopt ]
  1. 新しい空の List を返す。
ArrayBindingPattern : [ Elisionopt BindingRestElement ]
  1. BindingRestElementBoundNames を返す。
ArrayBindingPattern : [ BindingElementList , Elisionopt ]
  1. BindingElementListBoundNames を返す。
ArrayBindingPattern : [ BindingElementList , Elisionopt BindingRestElement ]
  1. names1BindingElementListBoundNames とする。
  2. names2BindingRestElementBoundNames とする。
  3. names1names2list-concatenation を返す。
BindingPropertyList : BindingPropertyList , BindingProperty
  1. names1BindingPropertyListBoundNames とする。
  2. names2BindingPropertyBoundNames とする。
  3. names1names2list-concatenation を返す。
BindingElementList : BindingElementList , BindingElisionElement
  1. names1BindingElementListBoundNames とする。
  2. names2BindingElisionElementBoundNames とする。
  3. names1names2list-concatenation を返す。
BindingElisionElement : Elisionopt BindingElement
  1. BindingElementBoundNames を返す。
BindingProperty : PropertyName : BindingElement
  1. BindingElementBoundNames を返す。
SingleNameBinding : BindingIdentifier Initializeropt
  1. BindingIdentifierBoundNames を返す。
BindingElement : BindingPattern Initializeropt
  1. BindingPatternBoundNames を返す。
ForDeclaration : LetOrConst ForBinding
  1. ForBindingBoundNames を返す。
FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody }
  1. BindingIdentifierBoundNames を返す。
FunctionDeclaration : function ( FormalParameters ) { FunctionBody }
  1. « "*default*" » を返す。
FormalParameters : [empty]
  1. 新しい空の List を返す。
FormalParameters : FormalParameterList , FunctionRestParameter
  1. names1FormalParameterListBoundNames とする。
  2. names2FunctionRestParameterBoundNames とする。
  3. names1names2list-concatenation を返す。
FormalParameterList : FormalParameterList , FormalParameter
  1. names1FormalParameterListBoundNames とする。
  2. names2FormalParameterBoundNames とする。
  3. names1names2list-concatenation を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formals を、CoverParenthesizedExpressionAndArrowParameterList によって包摂される ArrowFormalParameters とする。
  2. formalsBoundNames を返す。
GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody }
  1. BindingIdentifierBoundNames を返す。
GeneratorDeclaration : function * ( FormalParameters ) { GeneratorBody }
  1. « "*default*" » を返す。
AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }
  1. BindingIdentifierBoundNames を返す。
AsyncGeneratorDeclaration : async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. « "*default*" » を返す。
ClassDeclaration : class BindingIdentifier ClassTail
  1. BindingIdentifierBoundNames を返す。
ClassDeclaration : class ClassTail
  1. « "*default*" » を返す。
AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
  1. BindingIdentifierBoundNames を返す。
AsyncFunctionDeclaration : async function ( FormalParameters ) { AsyncFunctionBody }
  1. « "*default*" » を返す。
CoverCallExpressionAndAsyncArrowHead : MemberExpression Arguments
  1. head を、CoverCallExpressionAndAsyncArrowHead によって包摂される AsyncArrowHead とする。
  2. headBoundNames を返す。
ImportDeclaration : import ImportClause FromClause WithClauseopt ;
  1. ImportClauseBoundNames を返す。
ImportDeclaration : import ModuleSpecifier WithClauseopt ;
  1. 新しい空の List を返す。
ImportClause : ImportedDefaultBinding , NameSpaceImport
  1. names1ImportedDefaultBindingBoundNames とする。
  2. names2NameSpaceImportBoundNames とする。
  3. names1names2list-concatenation を返す。
ImportClause : ImportedDefaultBinding , NamedImports
  1. names1ImportedDefaultBindingBoundNames とする。
  2. names2NamedImportsBoundNames とする。
  3. names1names2list-concatenation を返す。
NamedImports : { }
  1. 新しい空の List を返す。
ImportsList : ImportsList , ImportSpecifier
  1. names1ImportsListBoundNames とする。
  2. names2ImportSpecifierBoundNames とする。
  3. names1names2list-concatenation を返す。
ImportSpecifier : ModuleExportName as ImportedBinding
  1. ImportedBindingBoundNames を返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ;
  1. 新しい空の List を返す。
ExportDeclaration : export VariableStatement
  1. VariableStatementBoundNames を返す。
ExportDeclaration : export Declaration
  1. DeclarationBoundNames を返す。
ExportDeclaration : export default HoistableDeclaration
  1. declarationNamesHoistableDeclarationBoundNames とする。
  2. declarationNames"*default*" という要素を含まない場合、"*default*"declarationNames に追加する。
  3. declarationNames を返す。
ExportDeclaration : export default ClassDeclaration
  1. declarationNamesClassDeclarationBoundNames とする。
  2. declarationNames"*default*" という要素を含まない場合、"*default*"declarationNames に追加する。
  3. declarationNames を返す。
ExportDeclaration : export default AssignmentExpression ;
  1. « "*default*" » を返す。

8.2.2 Static Semantics: DeclarationPart

The syntax-directed operation DeclarationPart takes no arguments and returns a Parse Node. It is defined piecewise over the following productions:

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

8.2.3 Static Semantics: IsConstantDeclaration

The syntax-directed operation IsConstantDeclaration takes no arguments and returns a Boolean. It is defined piecewise over the following productions:

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

export default AssignmentExpression を定数宣言として扱う必要はない。なぜなら、モジュールのデフォルトオブジェクトを参照するために使われる内部束縛名への代入を許す構文が存在しないからである。

8.2.4 Static Semantics: LexicallyDeclaredNames

The syntax-directed operation LexicallyDeclaredNames takes no arguments and returns a List of Strings. It is defined piecewise over the following productions:

Block : { }
  1. 新しい空の List を返す。
StatementList : StatementList StatementListItem
  1. names1StatementListLexicallyDeclaredNames とする。
  2. names2StatementListItemLexicallyDeclaredNames とする。
  3. names1names2list-concatenation を返す。
StatementListItem : Statement
  1. Statement Statement : LabelledStatement であるなら、LabelledStatementLexicallyDeclaredNames を返す。
  2. 新しい空の List を返す。
StatementListItem : Declaration
  1. DeclarationBoundNames を返す。
CaseBlock : { }
  1. 新しい空の List を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら、names1 を最初の CaseClausesLexicallyDeclaredNames とする。
  2. Else, names1 を新しい空の List とする。
  3. names2DefaultClauseLexicallyDeclaredNames とする。
  4. 2 番目の CaseClauses が存在するなら、names3 を 2 番目の CaseClausesLexicallyDeclaredNames とする。
  5. Else, names3 を新しい空の List とする。
  6. names1, names2, および names3list-concatenation を返す。
CaseClauses : CaseClauses CaseClause
  1. names1CaseClausesLexicallyDeclaredNames とする。
  2. names2CaseClauseLexicallyDeclaredNames とする。
  3. names1names2list-concatenation を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するなら、StatementListLexicallyDeclaredNames を返す。
  2. 新しい空の List を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するなら、StatementListLexicallyDeclaredNames を返す。
  2. 新しい空の List を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. LabelledItemLexicallyDeclaredNames を返す。
LabelledItem : Statement
  1. 新しい空の List を返す。
LabelledItem : FunctionDeclaration
  1. FunctionDeclarationBoundNames を返す。
FunctionStatementList : [empty]
  1. 新しい空の List を返す。
FunctionStatementList : StatementList
  1. StatementListTopLevelLexicallyDeclaredNames を返す。
ClassStaticBlockStatementList : [empty]
  1. 新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
  1. StatementListTopLevelLexicallyDeclaredNames を返す。
ConciseBody : ExpressionBody
  1. 新しい空の List を返す。
AsyncConciseBody : ExpressionBody
  1. 新しい空の List を返す。
Script : [empty]
  1. 新しい空の List を返す。
ScriptBody : StatementList
  1. StatementListTopLevelLexicallyDeclaredNames を返す。
Note 1

Script のトップレベルでは、function 宣言は lexical 宣言ではなく var 宣言のように扱われる。

Note 2

Module の LexicallyDeclaredNames には、その import 束縛のすべての名前が含まれる。

ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemListLexicallyDeclaredNames とする。
  2. names2ModuleItemLexicallyDeclaredNames とする。
  3. names1names2list-concatenation を返す。
ModuleItem : ImportDeclaration
  1. ImportDeclarationBoundNames を返す。
ModuleItem : ExportDeclaration
  1. ExportDeclarationexport VariableStatement であるなら、新しい空の List を返す。
  2. ExportDeclarationBoundNames を返す。
ModuleItem : StatementListItem
  1. StatementListItemLexicallyDeclaredNames を返す。
Note 3

Module のトップレベルでは、function 宣言は var 宣言ではなく lexical 宣言のように扱われる。

8.2.5 Static Semantics: LexicallyScopedDeclarations

The syntax-directed operation LexicallyScopedDeclarations takes no arguments and returns a List of Parse Nodes. It is defined piecewise over the following productions:

StatementList : StatementList StatementListItem
  1. declarations1StatementListLexicallyScopedDeclarations とする。
  2. declarations2StatementListItemLexicallyScopedDeclarations とする。
  3. declarations1declarations2list-concatenation を返す。
StatementListItem : Statement
  1. Statement Statement : LabelledStatement であるなら、LabelledStatementLexicallyScopedDeclarations を返す。
  2. 新しい空の List を返す。
StatementListItem : Declaration
  1. 唯一の要素として DeclarationDeclarationPart を持つ List を返す。
CaseBlock : { }
  1. 新しい空の List を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら、declarations1 を最初の CaseClausesLexicallyScopedDeclarations とする。
  2. Else, declarations1 を新しい空の List とする。
  3. declarations2DefaultClauseLexicallyScopedDeclarations とする。
  4. 2 番目の CaseClauses が存在するなら、declarations3 を 2 番目の CaseClausesLexicallyScopedDeclarations とする。
  5. Else, declarations3 を新しい空の List とする。
  6. declarations1, declarations2, および declarations3list-concatenation を返す。
CaseClauses : CaseClauses CaseClause
  1. declarations1CaseClausesLexicallyScopedDeclarations とする。
  2. declarations2CaseClauseLexicallyScopedDeclarations とする。
  3. declarations1declarations2list-concatenation を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するなら、StatementListLexicallyScopedDeclarations を返す。
  2. 新しい空の List を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するなら、StatementListLexicallyScopedDeclarations を返す。
  2. 新しい空の List を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. LabelledItemLexicallyScopedDeclarations を返す。
LabelledItem : Statement
  1. 新しい空の List を返す。
LabelledItem : FunctionDeclaration
  1. « FunctionDeclaration » を返す。
FunctionStatementList : [empty]
  1. 新しい空の List を返す。
FunctionStatementList : StatementList
  1. StatementListTopLevelLexicallyScopedDeclarations を返す。
ClassStaticBlockStatementList : [empty]
  1. 新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
  1. StatementListTopLevelLexicallyScopedDeclarations を返す。
ConciseBody : ExpressionBody
  1. 新しい空の List を返す。
AsyncConciseBody : ExpressionBody
  1. 新しい空の List を返す。
Script : [empty]
  1. 新しい空の List を返す。
ScriptBody : StatementList
  1. StatementListTopLevelLexicallyScopedDeclarations を返す。
Module : [empty]
  1. 新しい空の List を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. declarations1ModuleItemListLexicallyScopedDeclarations とする。
  2. declarations2ModuleItemLexicallyScopedDeclarations とする。
  3. declarations1declarations2list-concatenation を返す。
ModuleItem : ImportDeclaration
  1. 新しい空の List を返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ; export VariableStatement
  1. 新しい空の List を返す。
ExportDeclaration : export Declaration
  1. 唯一の要素として DeclarationDeclarationPart を持つ List を返す。
ExportDeclaration : export default HoistableDeclaration
  1. 唯一の要素として HoistableDeclarationDeclarationPart を持つ List を返す。
ExportDeclaration : export default ClassDeclaration
  1. 唯一の要素として ClassDeclaration を持つ List を返す。
ExportDeclaration : export default AssignmentExpression ;
  1. 唯一の要素としてこの ExportDeclaration を持つ List を返す。

8.2.6 Static Semantics: VarDeclaredNames

The syntax-directed operation VarDeclaredNames takes no arguments and returns a List of Strings. It is defined piecewise over the following productions:

Statement : EmptyStatement ExpressionStatement ContinueStatement BreakStatement ReturnStatement ThrowStatement DebuggerStatement
  1. 新しい空の List を返す。
Block : { }
  1. 新しい空の List を返す。
StatementList : StatementList StatementListItem
  1. names1StatementListVarDeclaredNames とする。
  2. names2StatementListItemVarDeclaredNames とする。
  3. names1names2list-concatenation を返す。
StatementListItem : Declaration
  1. 新しい空の List を返す。
VariableStatement : var VariableDeclarationList ;
  1. VariableDeclarationListBoundNames を返す。
IfStatement : if ( Expression ) Statement else Statement
  1. names1 を最初の StatementVarDeclaredNames とする。
  2. names2 を 2 番目の StatementVarDeclaredNames とする。
  3. names1names2list-concatenation を返す。
IfStatement : if ( Expression ) Statement
  1. StatementVarDeclaredNames を返す。
DoWhileStatement : do Statement while ( Expression ) ;
  1. StatementVarDeclaredNames を返す。
WhileStatement : while ( Expression ) Statement
  1. StatementVarDeclaredNames を返す。
ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
  1. StatementVarDeclaredNames を返す。
ForStatement : for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
  1. names1VariableDeclarationListBoundNames とする。
  2. names2StatementVarDeclaredNames とする。
  3. names1names2list-concatenation を返す。
ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. StatementVarDeclaredNames を返す。
ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  1. StatementVarDeclaredNames を返す。
ForInOfStatement : for ( var ForBinding in Expression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement
  1. names1ForBindingBoundNames とする。
  2. names2StatementVarDeclaredNames とする。
  3. names1names2list-concatenation を返す。
Note

この節は Annex B.3.5 によって拡張される。

WithStatement : with ( Expression ) Statement
  1. StatementVarDeclaredNames を返す。
SwitchStatement : switch ( Expression ) CaseBlock
  1. CaseBlockVarDeclaredNames を返す。
CaseBlock : { }
  1. 新しい空の List を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら、names1 を最初の CaseClausesVarDeclaredNames とする。
  2. Else, names1 を新しい空の List とする。
  3. names2DefaultClauseVarDeclaredNames とする。
  4. 2 番目の CaseClauses が存在するなら、names3 を 2 番目の CaseClausesVarDeclaredNames とする。
  5. Else, names3 を新しい空の List とする。
  6. names1, names2, および names3list-concatenation を返す。
CaseClauses : CaseClauses CaseClause
  1. names1CaseClausesVarDeclaredNames とする。
  2. names2CaseClauseVarDeclaredNames とする。
  3. names1names2list-concatenation を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するなら、StatementListVarDeclaredNames を返す。
  2. 新しい空の List を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するなら、StatementListVarDeclaredNames を返す。
  2. 新しい空の List を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. LabelledItemVarDeclaredNames を返す。
LabelledItem : FunctionDeclaration
  1. 新しい空の List を返す。
TryStatement : try Block Catch
  1. names1BlockVarDeclaredNames とする。
  2. names2CatchVarDeclaredNames とする。
  3. names1names2list-concatenation を返す。
TryStatement : try Block Finally
  1. names1BlockVarDeclaredNames とする。
  2. names2FinallyVarDeclaredNames とする。
  3. names1names2list-concatenation を返す。
TryStatement : try Block Catch Finally
  1. names1BlockVarDeclaredNames とする。
  2. names2CatchVarDeclaredNames とする。
  3. names3FinallyVarDeclaredNames とする。
  4. names1, names2, および names3list-concatenation を返す。
Catch : catch ( CatchParameter ) Block
  1. BlockVarDeclaredNames を返す。
FunctionStatementList : [empty]
  1. 新しい空の List を返す。
FunctionStatementList : StatementList
  1. StatementListTopLevelVarDeclaredNames を返す。
ClassStaticBlockStatementList : [empty]
  1. 新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
  1. StatementListTopLevelVarDeclaredNames を返す。
ConciseBody : ExpressionBody
  1. 新しい空の List を返す。
AsyncConciseBody : ExpressionBody
  1. 新しい空の List を返す。
Script : [empty]
  1. 新しい空の List を返す。
ScriptBody : StatementList
  1. StatementListTopLevelVarDeclaredNames を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemListVarDeclaredNames とする。
  2. names2ModuleItemVarDeclaredNames とする。
  3. names1names2list-concatenation を返す。
ModuleItem : ImportDeclaration
  1. 新しい空の List を返す。
ModuleItem : ExportDeclaration
  1. ExportDeclarationexport VariableStatement であるなら、ExportDeclarationBoundNames を返す。
  2. 新しい空の List を返す。

8.2.7 Static Semantics: VarScopedDeclarations

The syntax-directed operation VarScopedDeclarations takes no arguments and returns a List of Parse Nodes. It is defined piecewise over the following productions:

Statement : EmptyStatement ExpressionStatement ContinueStatement BreakStatement ReturnStatement ThrowStatement DebuggerStatement
  1. 新しい空の List を返す。
Block : { }
  1. 新しい空の List を返す。
StatementList : StatementList StatementListItem
  1. declarations1StatementListVarScopedDeclarations とする。
  2. declarations2StatementListItemVarScopedDeclarations とする。
  3. declarations1declarations2list-concatenation を返す。
StatementListItem : Declaration
  1. 新しい空の List を返す。
VariableDeclarationList : VariableDeclaration
  1. « VariableDeclaration » を返す。
VariableDeclarationList : VariableDeclarationList , VariableDeclaration
  1. declarations1VariableDeclarationListVarScopedDeclarations とする。
  2. declarations1 と « VariableDeclaration » の list-concatenation を返す。
IfStatement : if ( Expression ) Statement else Statement
  1. declarations1 を最初の StatementVarScopedDeclarations とする。
  2. declarations2 を 2 番目の StatementVarScopedDeclarations とする。
  3. declarations1declarations2list-concatenation を返す。
IfStatement : if ( Expression ) Statement
  1. StatementVarScopedDeclarations を返す。
DoWhileStatement : do Statement while ( Expression ) ;
  1. StatementVarScopedDeclarations を返す。
WhileStatement : while ( Expression ) Statement
  1. StatementVarScopedDeclarations を返す。
ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
  1. StatementVarScopedDeclarations を返す。
ForStatement : for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
  1. declarations1VariableDeclarationListVarScopedDeclarations とする。
  2. declarations2StatementVarScopedDeclarations とする。
  3. declarations1declarations2list-concatenation を返す。
ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. StatementVarScopedDeclarations を返す。
ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  1. StatementVarScopedDeclarations を返す。
ForInOfStatement : for ( var ForBinding in Expression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement
  1. declarations1 を « ForBinding » とする。
  2. declarations2StatementVarScopedDeclarations とする。
  3. declarations1declarations2list-concatenation を返す。
Note

この節は Annex B.3.5 によって拡張される。

WithStatement : with ( Expression ) Statement
  1. StatementVarScopedDeclarations を返す。
SwitchStatement : switch ( Expression ) CaseBlock
  1. CaseBlockVarScopedDeclarations を返す。
CaseBlock : { }
  1. 新しい空の List を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら、declarations1 を最初の CaseClausesVarScopedDeclarations とする。
  2. Else, declarations1 を新しい空の List とする。
  3. declarations2DefaultClauseVarScopedDeclarations とする。
  4. 2 番目の CaseClauses が存在するなら、declarations3 を 2 番目の CaseClausesVarScopedDeclarations とする。
  5. Else, declarations3 を新しい空の List とする。
  6. declarations1, declarations2, および declarations3list-concatenation を返す。
CaseClauses : CaseClauses CaseClause
  1. declarations1CaseClausesVarScopedDeclarations とする。
  2. declarations2CaseClauseVarScopedDeclarations とする。
  3. declarations1declarations2list-concatenation を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するなら、StatementListVarScopedDeclarations を返す。
  2. 新しい空の List を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するなら、StatementListVarScopedDeclarations を返す。
  2. 新しい空の List を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. LabelledItemVarScopedDeclarations を返す。
LabelledItem : FunctionDeclaration
  1. 新しい空の List を返す。
TryStatement : try Block Catch
  1. declarations1BlockVarScopedDeclarations とする。
  2. declarations2CatchVarScopedDeclarations とする。
  3. declarations1declarations2list-concatenation を返す。
TryStatement : try Block Finally
  1. declarations1BlockVarScopedDeclarations とする。
  2. declarations2FinallyVarScopedDeclarations とする。
  3. declarations1declarations2list-concatenation を返す。
TryStatement : try Block Catch Finally
  1. declarations1BlockVarScopedDeclarations とする。
  2. declarations2CatchVarScopedDeclarations とする。
  3. declarations3FinallyVarScopedDeclarations とする。
  4. declarations1, declarations2, および declarations3list-concatenation を返す。
Catch : catch ( CatchParameter ) Block
  1. BlockVarScopedDeclarations を返す。
FunctionStatementList : [empty]
  1. 新しい空の List を返す。
FunctionStatementList : StatementList
  1. StatementListTopLevelVarScopedDeclarations を返す。
ClassStaticBlockStatementList : [empty]
  1. 新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
  1. StatementListTopLevelVarScopedDeclarations を返す。
ConciseBody : ExpressionBody
  1. 新しい空の List を返す。
AsyncConciseBody : ExpressionBody
  1. 新しい空の List を返す。
Script : [empty]
  1. 新しい空の List を返す。
ScriptBody : StatementList
  1. StatementListTopLevelVarScopedDeclarations を返す。
Module : [empty]
  1. 新しい空の List を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. declarations1ModuleItemListVarScopedDeclarations とする。
  2. declarations2ModuleItemVarScopedDeclarations とする。
  3. declarations1declarations2list-concatenation を返す。
ModuleItem : ImportDeclaration
  1. 新しい空の List を返す。
ModuleItem : ExportDeclaration
  1. ExportDeclarationexport VariableStatement であるなら、VariableStatementVarScopedDeclarations を返す。
  2. 新しい空の List を返す。

8.2.8 Static Semantics: TopLevelLexicallyDeclaredNames

The syntax-directed operation TopLevelLexicallyDeclaredNames takes no arguments and returns a List of Strings. It is defined piecewise over the following productions:

StatementList : StatementList StatementListItem
  1. names1StatementListTopLevelLexicallyDeclaredNames とする。
  2. names2StatementListItemTopLevelLexicallyDeclaredNames とする。
  3. names1names2list-concatenation を返す。
StatementListItem : Statement
  1. 新しい空の List を返す。
StatementListItem : Declaration
  1. Declaration Declaration : HoistableDeclaration であるなら、
    1. 新しい空の List を返す。
  2. DeclarationBoundNames を返す。
Note

function または script のトップレベルでは、function 宣言は lexical 宣言ではなく var 宣言のように扱われる。

8.2.9 Static Semantics: TopLevelLexicallyScopedDeclarations

The syntax-directed operation TopLevelLexicallyScopedDeclarations takes no arguments and returns a List of Parse Nodes. It is defined piecewise over the following productions:

StatementList : StatementList StatementListItem
  1. declarations1StatementListTopLevelLexicallyScopedDeclarations とする。
  2. declarations2StatementListItemTopLevelLexicallyScopedDeclarations とする。
  3. declarations1declarations2list-concatenation を返す。
StatementListItem : Statement
  1. 新しい空の List を返す。
StatementListItem : Declaration
  1. Declaration Declaration : HoistableDeclaration であるなら、
    1. 新しい空の List を返す。
  2. « Declaration » を返す。

8.2.10 Static Semantics: TopLevelVarDeclaredNames

The syntax-directed operation TopLevelVarDeclaredNames takes no arguments and returns a List of Strings. It is defined piecewise over the following productions:

StatementList : StatementList StatementListItem
  1. names1StatementListTopLevelVarDeclaredNames とする。
  2. names2StatementListItemTopLevelVarDeclaredNames とする。
  3. names1names2list-concatenation を返す。
StatementListItem : Declaration
  1. Declaration Declaration : HoistableDeclaration であるなら、
    1. HoistableDeclarationBoundNames を返す。
  2. 新しい空の List を返す。
StatementListItem : Statement
  1. Statement Statement : LabelledStatement であるなら、StatementTopLevelVarDeclaredNames を返す。
  2. StatementVarDeclaredNames を返す。
Note

function または script のトップレベルでは、内側の function 宣言は var 宣言のように扱われる。

LabelledStatement : LabelIdentifier : LabelledItem
  1. LabelledItemTopLevelVarDeclaredNames を返す。
LabelledItem : Statement
  1. Statement Statement : LabelledStatement であるなら、StatementTopLevelVarDeclaredNames を返す。
  2. StatementVarDeclaredNames を返す。
LabelledItem : FunctionDeclaration
  1. FunctionDeclarationBoundNames を返す。

8.2.11 Static Semantics: TopLevelVarScopedDeclarations

The syntax-directed operation TopLevelVarScopedDeclarations takes no arguments and returns a List of Parse Nodes. It is defined piecewise over the following productions:

StatementList : StatementList StatementListItem
  1. declarations1StatementListTopLevelVarScopedDeclarations とする。
  2. declarations2StatementListItemTopLevelVarScopedDeclarations とする。
  3. declarations1declarations2list-concatenation を返す。
StatementListItem : Statement
  1. Statement Statement : LabelledStatement であるなら、StatementTopLevelVarScopedDeclarations を返す。
  2. StatementVarScopedDeclarations を返す。
StatementListItem : Declaration
  1. Declaration Declaration : HoistableDeclaration であるなら、
    1. declarationHoistableDeclarationDeclarationPart とする。
    2. « declaration » を返す。
  2. 新しい空の List を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. LabelledItemTopLevelVarScopedDeclarations を返す。
LabelledItem : Statement
  1. Statement Statement : LabelledStatement であるなら、StatementTopLevelVarScopedDeclarations を返す。
  2. StatementVarScopedDeclarations を返す。
LabelledItem : FunctionDeclaration
  1. « FunctionDeclaration » を返す。

8.3 ラベル

8.3.1 Static Semantics: ContainsDuplicateLabels

The syntax-directed operation ContainsDuplicateLabels takes argument labelSet (a List of Strings) and returns a Boolean. It is defined piecewise over the following productions:

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

この節は Annex B.3.5 によって拡張される。

WithStatement : with ( Expression ) Statement
  1. 引数 labelSet を伴う StatementContainsDuplicateLabels を返す。
SwitchStatement : switch ( Expression ) CaseBlock
  1. 引数 labelSet を伴う CaseBlockContainsDuplicateLabels を返す。
CaseBlock : { }
  1. false を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら、
    1. 引数 labelSet を伴う最初の CaseClausesContainsDuplicateLabelstrue なら、true を返す。
  2. 引数 labelSet を伴う DefaultClauseContainsDuplicateLabelstrue なら、true を返す。
  3. 2 番目の CaseClauses が存在しないなら、false を返す。
  4. 引数 labelSet を伴う 2 番目の CaseClausesContainsDuplicateLabels を返す。
CaseClauses : CaseClauses CaseClause
  1. hasDuplicates を、引数 labelSet を伴う CaseClausesContainsDuplicateLabels とする。
  2. hasDuplicatestrue なら、true を返す。
  3. 引数 labelSet を伴う CaseClauseContainsDuplicateLabels を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するなら、引数 labelSet を伴う StatementListContainsDuplicateLabels を返す。
  2. false を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するなら、引数 labelSet を伴う StatementListContainsDuplicateLabels を返す。
  2. false を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. labelLabelIdentifierStringValue とする。
  2. labelSetlabel を含むなら、true を返す。
  3. newLabelSetlabelSet と « label » の list-concatenation とする。
  4. 引数 newLabelSet を伴う LabelledItemContainsDuplicateLabels を返す。
LabelledItem : FunctionDeclaration
  1. false を返す。
TryStatement : try Block Catch
  1. hasDuplicates を、引数 labelSet を伴う BlockContainsDuplicateLabels とする。
  2. hasDuplicatestrue なら、true を返す。
  3. 引数 labelSet を伴う CatchContainsDuplicateLabels を返す。
TryStatement : try Block Finally
  1. hasDuplicates を、引数 labelSet を伴う BlockContainsDuplicateLabels とする。
  2. hasDuplicatestrue なら、true を返す。
  3. 引数 labelSet を伴う FinallyContainsDuplicateLabels を返す。
TryStatement : try Block Catch Finally
  1. 引数 labelSet を伴う BlockContainsDuplicateLabelstrue なら、true を返す。
  2. 引数 labelSet を伴う CatchContainsDuplicateLabelstrue なら、true を返す。
  3. 引数 labelSet を伴う FinallyContainsDuplicateLabels を返す。
Catch : catch ( CatchParameter ) Block
  1. 引数 labelSet を伴う BlockContainsDuplicateLabels を返す。
FunctionStatementList : [empty]
  1. false を返す。
ClassStaticBlockStatementList : [empty]
  1. false を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. hasDuplicates を、引数 labelSet を伴う ModuleItemListContainsDuplicateLabels とする。
  2. hasDuplicatestrue なら、true を返す。
  3. 引数 labelSet を伴う ModuleItemContainsDuplicateLabels を返す。
ModuleItem : ImportDeclaration ExportDeclaration
  1. false を返す。

8.3.2 Static Semantics: ContainsUndefinedBreakTarget

The syntax-directed operation ContainsUndefinedBreakTarget takes argument labelSet (a List of Strings) and returns a Boolean. It is defined piecewise over the following productions:

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

この節は Annex B.3.5 によって拡張される。

BreakStatement : break ;
  1. false を返す。
BreakStatement : break LabelIdentifier ;
  1. labelSetLabelIdentifierStringValue を含むなら、false を返す。
  2. true を返す。
WithStatement : with ( Expression ) Statement
  1. 引数 labelSet を伴う StatementContainsUndefinedBreakTarget を返す。
SwitchStatement : switch ( Expression ) CaseBlock
  1. 引数 labelSet を伴う CaseBlockContainsUndefinedBreakTarget を返す。
CaseBlock : { }
  1. false を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら、
    1. 引数 labelSet を伴う最初の CaseClausesContainsUndefinedBreakTargettrue なら、true を返す。
  2. 引数 labelSet を伴う DefaultClauseContainsUndefinedBreakTargettrue なら、true を返す。
  3. 2 番目の CaseClauses が存在しないなら、false を返す。
  4. 引数 labelSet を伴う 2 番目の CaseClausesContainsUndefinedBreakTarget を返す。
CaseClauses : CaseClauses CaseClause
  1. hasUndefinedLabels を、引数 labelSet を伴う CaseClausesContainsUndefinedBreakTarget とする。
  2. hasUndefinedLabelstrue なら、true を返す。
  3. 引数 labelSet を伴う CaseClauseContainsUndefinedBreakTarget を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するなら、引数 labelSet を伴う StatementListContainsUndefinedBreakTarget を返す。
  2. false を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するなら、引数 labelSet を伴う StatementListContainsUndefinedBreakTarget を返す。
  2. false を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. labelLabelIdentifierStringValue とする。
  2. newLabelSetlabelSet と « label » の list-concatenation とする。
  3. 引数 newLabelSet を伴う LabelledItemContainsUndefinedBreakTarget を返す。
LabelledItem : FunctionDeclaration
  1. false を返す。
TryStatement : try Block Catch
  1. hasUndefinedLabels を、引数 labelSet を伴う BlockContainsUndefinedBreakTarget とする。
  2. hasUndefinedLabelstrue なら、true を返す。
  3. 引数 labelSet を伴う CatchContainsUndefinedBreakTarget を返す。
TryStatement : try Block Finally
  1. hasUndefinedLabels を、引数 labelSet を伴う BlockContainsUndefinedBreakTarget とする。
  2. hasUndefinedLabelstrue なら、true を返す。
  3. 引数 labelSet を伴う FinallyContainsUndefinedBreakTarget を返す。
TryStatement : try Block Catch Finally
  1. 引数 labelSet を伴う BlockContainsUndefinedBreakTargettrue なら、true を返す。
  2. 引数 labelSet を伴う CatchContainsUndefinedBreakTargettrue なら、true を返す。
  3. 引数 labelSet を伴う FinallyContainsUndefinedBreakTarget を返す。
Catch : catch ( CatchParameter ) Block
  1. 引数 labelSet を伴う BlockContainsUndefinedBreakTarget を返す。
FunctionStatementList : [empty]
  1. false を返す。
ClassStaticBlockStatementList : [empty]
  1. false を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. hasUndefinedLabels を、引数 labelSet を伴う ModuleItemListContainsUndefinedBreakTarget とする。
  2. hasUndefinedLabelstrue なら、true を返す。
  3. 引数 labelSet を伴う ModuleItemContainsUndefinedBreakTarget を返す。
ModuleItem : ImportDeclaration ExportDeclaration
  1. false を返す。

8.3.3 Static Semantics: ContainsUndefinedContinueTarget

The syntax-directed operation ContainsUndefinedContinueTarget takes arguments iterationSet (a List of Strings) and labelSet (a List of Strings) and returns a Boolean. It is defined piecewise over the following productions:

Statement : VariableStatement EmptyStatement ExpressionStatement BreakStatement ReturnStatement ThrowStatement DebuggerStatement Block : { } StatementListItem : Declaration
  1. false を返す。
Statement : BlockStatement
  1. 引数 iterationSet および « » を伴う BlockStatementContainsUndefinedContinueTarget を返す。
BreakableStatement : IterationStatement
  1. newIterationSetiterationSetlabelSetlist-concatenation とする。
  2. 引数 newIterationSet および « » を伴う IterationStatementContainsUndefinedContinueTarget を返す。
StatementList : StatementList StatementListItem
  1. hasUndefinedLabels を、引数 iterationSet および « » を伴う StatementListContainsUndefinedContinueTarget とする。
  2. hasUndefinedLabelstrue なら、true を返す。
  3. 引数 iterationSet および « » を伴う StatementListItemContainsUndefinedContinueTarget を返す。
IfStatement : if ( Expression ) Statement else Statement
  1. hasUndefinedLabels を、引数 iterationSet および « » を伴う最初の StatementContainsUndefinedContinueTarget とする。
  2. hasUndefinedLabelstrue なら、true を返す。
  3. 引数 iterationSet および « » を伴う 2 番目の StatementContainsUndefinedContinueTarget を返す。
IfStatement : if ( Expression ) Statement
  1. 引数 iterationSet および « » を伴う StatementContainsUndefinedContinueTarget を返す。
DoWhileStatement : do Statement while ( Expression ) ;
  1. 引数 iterationSet および « » を伴う StatementContainsUndefinedContinueTarget を返す。
WhileStatement : while ( Expression ) Statement
  1. 引数 iterationSet および « » を伴う StatementContainsUndefinedContinueTarget を返す。
ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. 引数 iterationSet および « » を伴う StatementContainsUndefinedContinueTarget を返す。
ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( var ForBinding in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  1. 引数 iterationSet および « » を伴う StatementContainsUndefinedContinueTarget を返す。
Note

この節は Annex B.3.5 によって拡張される。

ContinueStatement : continue ;
  1. false を返す。
ContinueStatement : continue LabelIdentifier ;
  1. iterationSetLabelIdentifierStringValue を含むなら、false を返す。
  2. true を返す。
WithStatement : with ( Expression ) Statement
  1. 引数 iterationSet および « » を伴う StatementContainsUndefinedContinueTarget を返す。
SwitchStatement : switch ( Expression ) CaseBlock
  1. 引数 iterationSet および « » を伴う CaseBlockContainsUndefinedContinueTarget を返す。
CaseBlock : { }
  1. false を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 最初の CaseClauses が存在するなら、
    1. 引数 iterationSet および « » を伴う最初の CaseClausesContainsUndefinedContinueTargettrue なら、true を返す。
  2. 引数 iterationSet および « » を伴う DefaultClauseContainsUndefinedContinueTargettrue なら、true を返す。
  3. 2 番目の CaseClauses が存在しないなら、false を返す。
  4. 引数 iterationSet および « » を伴う 2 番目の CaseClausesContainsUndefinedContinueTarget を返す。
CaseClauses : CaseClauses CaseClause
  1. hasUndefinedLabels を、引数 iterationSet および « » を伴う CaseClausesContainsUndefinedContinueTarget とする。
  2. hasUndefinedLabelstrue なら、true を返す。
  3. 引数 iterationSet および « » を伴う CaseClauseContainsUndefinedContinueTarget を返す。
CaseClause : case Expression : StatementListopt
  1. StatementList が存在するなら、引数 iterationSet および « » を伴う StatementListContainsUndefinedContinueTarget を返す。
  2. false を返す。
DefaultClause : default : StatementListopt
  1. StatementList が存在するなら、引数 iterationSet および « » を伴う StatementListContainsUndefinedContinueTarget を返す。
  2. false を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. labelLabelIdentifierStringValue とする。
  2. newLabelSetlabelSet と « label » の list-concatenation とする。
  3. 引数 iterationSet および newLabelSet を伴う LabelledItemContainsUndefinedContinueTarget を返す。
LabelledItem : FunctionDeclaration
  1. false を返す。
TryStatement : try Block Catch
  1. hasUndefinedLabels を、引数 iterationSet および « » を伴う BlockContainsUndefinedContinueTarget とする。
  2. hasUndefinedLabelstrue なら、true を返す。
  3. 引数 iterationSet および « » を伴う CatchContainsUndefinedContinueTarget を返す。
TryStatement : try Block Finally
  1. hasUndefinedLabels を、引数 iterationSet および « » を伴う BlockContainsUndefinedContinueTarget とする。
  2. hasUndefinedLabelstrue なら、true を返す。
  3. 引数 iterationSet および « » を伴う FinallyContainsUndefinedContinueTarget を返す。
TryStatement : try Block Catch Finally
  1. 引数 iterationSet および « » を伴う BlockContainsUndefinedContinueTargettrue なら、true を返す。
  2. 引数 iterationSet および « » を伴う CatchContainsUndefinedContinueTargettrue なら、true を返す。
  3. 引数 iterationSet および « » を伴う FinallyContainsUndefinedContinueTarget を返す。
Catch : catch ( CatchParameter ) Block
  1. 引数 iterationSet および « » を伴う BlockContainsUndefinedContinueTarget を返す。
FunctionStatementList : [empty]
  1. false を返す。
ClassStaticBlockStatementList : [empty]
  1. false を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. hasUndefinedLabels を、引数 iterationSet および « » を伴う ModuleItemListContainsUndefinedContinueTarget とする。
  2. hasUndefinedLabelstrue なら、true を返す。
  3. 引数 iterationSet および « » を伴う ModuleItemContainsUndefinedContinueTarget を返す。
ModuleItem : ImportDeclaration ExportDeclaration
  1. false を返す。

8.4 関数名推論

8.4.1 Static Semantics: HasName

The syntax-directed operation HasName takes no arguments and returns a Boolean. It is defined piecewise over the following productions:

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

8.4.2 Static Semantics: IsFunctionDefinition

The syntax-directed operation IsFunctionDefinition takes no arguments and returns a Boolean. It is defined piecewise over the following productions:

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

8.4.3 Static Semantics: IsAnonymousFunctionDefinition ( expr )

The abstract operation IsAnonymousFunctionDefinition takes argument expr (an AssignmentExpression Parse Node, an Initializer Parse Node, or an Expression Parse Node) and returns a Boolean. これは、その引数が名前を束縛しない関数定義であるかどうかを判定する。 It performs the following steps when called:

  1. exprIsFunctionDefinitionfalse なら、false を返す。
  2. hasNameexprHasName とする。
  3. hasNametrue なら、false を返す。
  4. true を返す。

8.4.4 Static Semantics: IsIdentifierRef

The syntax-directed operation IsIdentifierRef takes no arguments and returns a Boolean. It is defined piecewise over the following productions:

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

8.4.5 Runtime Semantics: NamedEvaluation

The syntax-directed operation NamedEvaluation takes argument name (a property key or a Private Name) and returns either a normal completion containing a function object or an abrupt completion. It is defined piecewise over the following productions:

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. expr を、CoverParenthesizedExpressionAndArrowParameterList によって包摂される ParenthesizedExpression とする。
  2. 引数 name を伴う exprNamedEvaluation を ? 返す。
ParenthesizedExpression : ( Expression )
  1. Assert: IsAnonymousFunctionDefinition(Expression) is true.
  2. 引数 name を伴う ExpressionNamedEvaluation を ? 返す。
FunctionExpression : function ( FormalParameters ) { FunctionBody }
  1. 引数 name を伴う FunctionExpressionInstantiateOrdinaryFunctionExpression を返す。
GeneratorExpression : function * ( FormalParameters ) { GeneratorBody }
  1. 引数 name を伴う GeneratorExpressionInstantiateGeneratorFunctionExpression を返す。
AsyncGeneratorExpression : async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. 引数 name を伴う AsyncGeneratorExpressionInstantiateAsyncGeneratorFunctionExpression を返す。
AsyncFunctionExpression : async function ( FormalParameters ) { AsyncFunctionBody }
  1. 引数 name を伴う AsyncFunctionExpressionInstantiateAsyncFunctionExpression を返す。
ArrowFunction : ArrowParameters => ConciseBody
  1. 引数 name を伴う ArrowFunctionInstantiateArrowFunctionExpression を返す。
AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
  1. 引数 name を伴う AsyncArrowFunctionInstantiateAsyncArrowFunctionExpression を返す。
ClassExpression : class ClassTail
  1. sourceTextClassExpression に一致したソーステキストとする。
  2. 引数 undefined, name, および sourceText を伴う ClassTailClassDefinitionEvaluation を ? 返す。

8.5 Contains

8.5.1 Static Semantics: Contains

The syntax-directed operation Contains takes argument symbol (a grammar symbol) and returns a Boolean.

この仕様において、以下に列挙されていないすべての文法生成規則の選択肢は、暗黙に次の既定の Contains 定義を持つ:

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

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

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

部分構造に依存する静的意味規則は、一般に PropertyName を除いて class body の内部を見ない。

ClassStaticBlock : static { ClassStaticBlockBody }
  1. false を返す。
Note 3

部分構造に依存する静的意味規則は、一般に static 初期化ブロックの内部を見ない。

ArrowFunction : ArrowParameters => ConciseBody
  1. symbolNewTarget, SuperProperty, SuperCall, super, または this のいずれでもないなら、false を返す。
  2. ArrowParameters Contains symboltrue なら、true を返す。
  3. ConciseBody Contains symbol を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formals を、CoverParenthesizedExpressionAndArrowParameterList によって包摂される ArrowFormalParameters とする。
  2. formals Contains symbol を返す。
AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody
  1. symbolNewTarget, SuperProperty, SuperCall, super, または this のいずれでもないなら、false を返す。
  2. AsyncConciseBody Contains symbol を返す。
AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
  1. symbolNewTarget, SuperProperty, SuperCall, super, または this のいずれでもないなら、false を返す。
  2. head を、CoverCallExpressionAndAsyncArrowHead によって包摂される AsyncArrowHead とする。
  3. head Contains symboltrue なら、true を返す。
  4. AsyncConciseBody Contains symbol を返す。
Note 4

Contains は、ArrowFunction または AsyncArrowFunction 内での new.target, this, および super の使用を検出するために使われる。

PropertyDefinition : MethodDefinition
  1. symbolMethodDefinition なら、true を返す。
  2. 引数 symbol を伴う MethodDefinitionComputedPropertyContains の結果を返す。
LiteralPropertyName : IdentifierName
  1. false を返す。
MemberExpression : MemberExpression . IdentifierName
  1. MemberExpression Contains symboltrue なら、true を返す。
  2. false を返す。
SuperProperty : super . IdentifierName
  1. symbolReservedWord super なら、true を返す。
  2. false を返す。
CallExpression : CallExpression . IdentifierName
  1. CallExpression Contains symboltrue なら、true を返す。
  2. false を返す。
OptionalChain : ?. IdentifierName
  1. false を返す。
OptionalChain : OptionalChain . IdentifierName
  1. OptionalChain Contains symboltrue なら、true を返す。
  2. false を返す。

8.5.2 Static Semantics: ComputedPropertyContains

The syntax-directed operation ComputedPropertyContains takes argument symbol (a grammar symbol) and returns a Boolean. It is defined piecewise over the following productions:

ClassElementName : PrivateIdentifier PropertyName : LiteralPropertyName
  1. false を返す。
PropertyName : ComputedPropertyName
  1. ComputedPropertyName Contains symbol の結果を返す。
MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. 引数 symbol を伴う ClassElementNameComputedPropertyContains の結果を返す。
GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }
  1. 引数 symbol を伴う ClassElementNameComputedPropertyContains の結果を返す。
AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. 引数 symbol を伴う ClassElementNameComputedPropertyContains の結果を返す。
ClassElementList : ClassElementList ClassElement
  1. inList を、引数 symbol を伴う ClassElementListComputedPropertyContains とする。
  2. inListtrue なら、true を返す。
  3. 引数 symbol を伴う ClassElementComputedPropertyContains の結果を返す。
ClassElement : ClassStaticBlock
  1. false を返す。
ClassElement : ;
  1. false を返す。
AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. 引数 symbol を伴う ClassElementNameComputedPropertyContains の結果を返す。
FieldDefinition : ClassElementName Initializeropt
  1. 引数 symbol を伴う ClassElementNameComputedPropertyContains の結果を返す。

8.6 その他

これらの操作は仕様全体の複数の箇所で使用される。

8.6.1 Runtime Semantics: InstantiateFunctionObject

The syntax-directed operation InstantiateFunctionObject takes arguments env (an Environment Record) and privateEnv (a PrivateEnvironment Record or null) and returns an ECMAScript function object. It is defined piecewise over the following productions:

FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody } function ( FormalParameters ) { FunctionBody }
  1. 引数 env および privateEnv を伴う FunctionDeclarationInstantiateOrdinaryFunctionObject を返す。
GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } function * ( FormalParameters ) { GeneratorBody }
  1. 引数 env および privateEnv を伴う GeneratorDeclarationInstantiateGeneratorFunctionObject を返す。
AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. 引数 env および privateEnv を伴う AsyncGeneratorDeclarationInstantiateAsyncGeneratorFunctionObject を返す。
AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } async function ( FormalParameters ) { AsyncFunctionBody }
  1. 引数 env および privateEnv を伴う AsyncFunctionDeclarationInstantiateAsyncFunctionObject を返す。

8.6.2 Runtime Semantics: BindingInitialization

The syntax-directed operation BindingInitialization takes arguments value (an ECMAScript language value) and environment (an Environment Record or undefined) and returns either a normal completion containing unused or an abrupt completion.

Note

environmentundefined が渡されるのは、初期化値の代入に PutValue 操作を使用すべきことを示すためである。これは var 文や、一部の非 strict 関数の仮引数リストの場合に該当する(10.2.11 を参照)。これらの場合、初期化子の評価に先立って lexical binding が hoist され、事前初期化される。

It is defined piecewise over the following productions:

BindingIdentifier : Identifier
  1. nameIdentifierStringValue とする。
  2. InitializeBoundName(name, value, environment) を返す。
BindingIdentifier : yield
  1. InitializeBoundName("yield", value, environment) を返す。
BindingIdentifier : await
  1. InitializeBoundName("await", value, environment) を返す。
BindingPattern : ObjectBindingPattern
  1. RequireObjectCoercible(value) を実行する。
  2. 引数 value および environment を伴う ObjectBindingPatternBindingInitialization を ? 返す。
BindingPattern : ArrayBindingPattern
  1. iteratorRecord を ? GetIterator(value, sync) とする。
  2. result を、引数 iteratorRecord および environment を伴う ArrayBindingPatternIteratorBindingInitializationCompletion とする。
  3. iteratorRecord.[[Done]]false なら、? IteratorClose(iteratorRecord, result) を返す。
  4. result を返す。
ObjectBindingPattern : { }
  1. unused を返す。
ObjectBindingPattern : { BindingPropertyList } { BindingPropertyList , }
  1. 引数 value および environment を伴う BindingPropertyListPropertyBindingInitialization を ? 実行する。
  2. unused を返す。
ObjectBindingPattern : { BindingRestProperty }
  1. excludedNames を新しい空の List とする。
  2. 引数 value, environment, および excludedNames を伴う BindingRestPropertyRestBindingInitialization を ? 返す。
ObjectBindingPattern : { BindingPropertyList , BindingRestProperty }
  1. excludedNames を、引数 value および environment を伴う BindingPropertyListPropertyBindingInitialization の ? とする。
  2. 引数 value, environment, および excludedNames を伴う BindingRestPropertyRestBindingInitialization を ? 返す。

8.6.2.1 InitializeBoundName ( name, value, environment )

The abstract operation InitializeBoundName takes arguments name (a String), value (an ECMAScript language value), and environment (an Environment Record or undefined) and returns either a normal completion containing unused or an abrupt completion. It performs the following steps when called:

  1. environmentundefined でない場合、
    1. environment.InitializeBinding(name, value) を実行する。
    2. unused を返す。
  2. lhs を ? ResolveBinding(name) とする。
  3. PutValue(lhs, value) を返す。

8.6.3 Runtime Semantics: IteratorBindingInitialization

The syntax-directed operation IteratorBindingInitialization takes arguments iteratorRecord (an Iterator Record) and environment (an Environment Record or undefined) and returns either a normal completion containing unused or an abrupt completion.

Note

environmentundefined が渡される場合、それは初期化値の代入に PutValue 操作を使用すべきことを示す。これは非 strict 関数の仮引数リストの場合に該当する。その場合、同じ名前を持つ複数の引数が存在する可能性に対処するため、仮引数束縛は事前初期化される。

It is defined piecewise over the following productions:

ArrayBindingPattern : [ ]
  1. unused を返す。
ArrayBindingPattern : [ Elision ]
  1. 引数 iteratorRecord を伴う ElisionIteratorDestructuringAssignmentEvaluation を ? 返す。
ArrayBindingPattern : [ Elisionopt BindingRestElement ]
  1. Elision が存在するなら、
    1. 引数 iteratorRecord を伴う ElisionIteratorDestructuringAssignmentEvaluation を ? 実行する。
  2. 引数 iteratorRecord および environment を伴う BindingRestElementIteratorBindingInitialization を ? 返す。
ArrayBindingPattern : [ BindingElementList , Elision ]
  1. 引数 iteratorRecord および environment を伴う BindingElementListIteratorBindingInitialization を ? 実行する。
  2. 引数 iteratorRecord を伴う ElisionIteratorDestructuringAssignmentEvaluation を ? 返す。
ArrayBindingPattern : [ BindingElementList , Elisionopt BindingRestElement ]
  1. 引数 iteratorRecord および environment を伴う BindingElementListIteratorBindingInitialization を ? 実行する。
  2. Elision が存在するなら、
    1. 引数 iteratorRecord を伴う ElisionIteratorDestructuringAssignmentEvaluation を ? 実行する。
  3. 引数 iteratorRecord および environment を伴う BindingRestElementIteratorBindingInitialization を ? 返す。
BindingElementList : BindingElementList , BindingElisionElement
  1. 引数 iteratorRecord および environment を伴う BindingElementListIteratorBindingInitialization を ? 実行する。
  2. 引数 iteratorRecord および environment を伴う BindingElisionElementIteratorBindingInitialization を ? 返す。
BindingElisionElement : Elision BindingElement
  1. 引数 iteratorRecord を伴う ElisionIteratorDestructuringAssignmentEvaluation を ? 実行する。
  2. 引数 iteratorRecord および environment を伴う BindingElementIteratorBindingInitialization を ? 返す。
SingleNameBinding : BindingIdentifier Initializeropt
  1. bindingIdBindingIdentifierStringValue とする。
  2. lhs を ? ResolveBinding(bindingId, environment) とする。
  3. vundefined とする。
  4. iteratorRecord.[[Done]]false なら、
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone でないなら、
      1. vnext に設定する。
  5. Initializer が存在し、かつ vundefined であるなら、
    1. IsAnonymousFunctionDefinition(Initializer) が true なら、
      1. 引数 bindingId を伴う InitializerNamedEvaluation を ? v に設定する。
    2. Else,
      1. defaultValueInitializer の ? Evaluation とする。
      2. v を ? GetValue(defaultValue) に設定する。
  6. environmentundefined なら、? PutValue(lhs, v) を返す。
  7. InitializeReferencedBinding(lhs, v) を返す。
BindingElement : BindingPattern Initializeropt
  1. vundefined とする。
  2. iteratorRecord.[[Done]]false なら、
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone でないなら、
      1. vnext に設定する。
  3. Initializer が存在し、かつ vundefined であるなら、
    1. defaultValueInitializer の ? Evaluation とする。
    2. v を ? GetValue(defaultValue) に設定する。
  4. 引数 v および environment を伴う BindingPatternBindingInitialization を ? 返す。
BindingRestElement : ... BindingIdentifier
  1. lhs を ? ResolveBinding(BindingIdentifierStringValue, environment) とする。
  2. array を ! ArrayCreate(0) とする。
  3. n を 0 とする。
  4. 繰り返す
    1. nextdone とする。
    2. iteratorRecord.[[Done]]false なら、
      1. next を ? IteratorStepValue(iteratorRecord) に設定する。
    3. nextdone なら、
      1. environmentundefined なら、? PutValue(lhs, array) を返す。
      2. InitializeReferencedBinding(lhs, array) を返す。
    4. CreateDataPropertyOrThrow(array, ! ToString(𝔽(n)), next) を実行する。
    5. nn + 1 に設定する。
BindingRestElement : ... BindingPattern
  1. array を ! ArrayCreate(0) とする。
  2. n を 0 とする。
  3. 繰り返す
    1. nextdone とする。
    2. iteratorRecord.[[Done]]false なら、
      1. next を ? IteratorStepValue(iteratorRecord) に設定する。
    3. nextdone なら、
      1. 引数 array および environment を伴う BindingPatternBindingInitialization を ? 返す。
    4. CreateDataPropertyOrThrow(array, ! ToString(𝔽(n)), next) を実行する。
    5. nn + 1 に設定する。
FormalParameters : [empty]
  1. unused を返す。
FormalParameters : FormalParameterList , FunctionRestParameter
  1. 引数 iteratorRecord および environment を伴う FormalParameterListIteratorBindingInitialization を ? 実行する。
  2. 引数 iteratorRecord および environment を伴う FunctionRestParameterIteratorBindingInitialization を ? 返す。
FormalParameterList : FormalParameterList , FormalParameter
  1. 引数 iteratorRecord および environment を伴う FormalParameterListIteratorBindingInitialization を ? 実行する。
  2. 引数 iteratorRecord および environment を伴う FormalParameterIteratorBindingInitialization を ? 返す。
ArrowParameters : BindingIdentifier
  1. vundefined とする。
  2. Assert: iteratorRecord.[[Done]] is false.
  3. next を ? IteratorStepValue(iteratorRecord) とする。
  4. nextdone でないなら、
    1. vnext に設定する。
  5. 引数 v および environment を伴う BindingIdentifierBindingInitialization を ? 返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formals を、CoverParenthesizedExpressionAndArrowParameterList によって包摂される ArrowFormalParameters とする。
  2. 引数 iteratorRecord および environment を伴う formalsIteratorBindingInitialization を ? 返す。
AsyncArrowBindingIdentifier : BindingIdentifier
  1. vundefined とする。
  2. Assert: iteratorRecord.[[Done]] is false.
  3. next を ? IteratorStepValue(iteratorRecord) とする。
  4. nextdone でないなら、
    1. vnext に設定する。
  5. 引数 v および environment を伴う BindingIdentifierBindingInitialization を ? 返す。

8.6.4 Static Semantics: AssignmentTargetType

The syntax-directed operation AssignmentTargetType takes no arguments and returns simple, web-compat, or invalid. It is defined piecewise over the following productions:

IdentifierReference : Identifier
  1. IsStrict(this IdentifierReference) が true であり、かつ IdentifierStringValue"eval" または "arguments" のいずれかであるなら、invalid を返す。
  2. simple を返す。
IdentifierReference : yield await CallExpression : CallExpression [ Expression ] CallExpression . IdentifierName CallExpression . PrivateIdentifier MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName SuperProperty MemberExpression . PrivateIdentifier
  1. simple を返す。
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. expr を、CoverParenthesizedExpressionAndArrowParameterList によって包摂される ParenthesizedExpression とする。
  2. exprAssignmentTargetType を返す。
CallExpression : CoverCallExpressionAndAsyncArrowHead CallExpression Arguments
  1. ホストがウェブブラウザであるか、または 関数呼び出し代入ターゲットに対する実行時エラー をサポートし、かつ IsStrict(this CallExpression) が false であるなら、
    1. web-compat を返す。
  2. invalid を返す。
PrimaryExpression : this Literal ArrayLiteral ObjectLiteral FunctionExpression ClassExpression GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral CallExpression : SuperCall ImportCall CallExpression TemplateLiteral NewExpression : new NewExpression MemberExpression : MemberExpression TemplateLiteral new MemberExpression Arguments NewTarget : new . target ImportMeta : import . meta LeftHandSideExpression : OptionalExpression UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- ++ UnaryExpression -- UnaryExpression UnaryExpression : delete UnaryExpression void UnaryExpression typeof UnaryExpression + UnaryExpression - UnaryExpression ~ UnaryExpression ! UnaryExpression AwaitExpression ExponentiationExpression : UpdateExpression ** ExponentiationExpression MultiplicativeExpression : MultiplicativeExpression MultiplicativeOperator ExponentiationExpression AdditiveExpression : AdditiveExpression + MultiplicativeExpression AdditiveExpression - MultiplicativeExpression ShiftExpression : ShiftExpression << AdditiveExpression ShiftExpression >> AdditiveExpression ShiftExpression >>> AdditiveExpression RelationalExpression : RelationalExpression < ShiftExpression RelationalExpression > ShiftExpression RelationalExpression <= ShiftExpression RelationalExpression >= ShiftExpression RelationalExpression instanceof ShiftExpression RelationalExpression in ShiftExpression PrivateIdentifier in ShiftExpression EqualityExpression : EqualityExpression == RelationalExpression EqualityExpression != RelationalExpression EqualityExpression === RelationalExpression EqualityExpression !== RelationalExpression BitwiseANDExpression : BitwiseANDExpression & EqualityExpression BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression LogicalANDExpression : LogicalANDExpression && BitwiseORExpression LogicalORExpression : LogicalORExpression || LogicalANDExpression CoalesceExpression : CoalesceExpressionHead ?? BitwiseORExpression ConditionalExpression : ShortCircuitExpression ? AssignmentExpression : AssignmentExpression AssignmentExpression : YieldExpression ArrowFunction AsyncArrowFunction LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression LeftHandSideExpression &&= AssignmentExpression LeftHandSideExpression ||= AssignmentExpression LeftHandSideExpression ??= AssignmentExpression Expression : Expression , AssignmentExpression
  1. invalid を返す。

8.6.5 Static Semantics: PropName

The syntax-directed operation PropName takes no arguments and returns a String or empty. It is defined piecewise over the following productions:

PropertyDefinition : IdentifierReference
  1. IdentifierReferenceStringValue を返す。
PropertyDefinition : ... AssignmentExpression
  1. empty を返す。
PropertyDefinition : PropertyName : AssignmentExpression
  1. PropertyNamePropName を返す。
LiteralPropertyName : IdentifierName AttributeKey : IdentifierName
  1. IdentifierNameStringValue を返す。
LiteralPropertyName : StringLiteral AttributeKey : StringLiteral
  1. StringLiteralSV を返す。
LiteralPropertyName : NumericLiteral
  1. nbrNumericLiteralNumericValue とする。
  2. ToString(nbr) を返す。
ComputedPropertyName : [ AssignmentExpression ]
  1. empty を返す。
MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. ClassElementNamePropName を返す。
GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }
  1. ClassElementNamePropName を返す。
AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. ClassElementNamePropName を返す。
ClassElement : ClassStaticBlock
  1. empty を返す。
ClassElement : ;
  1. empty を返す。
AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. ClassElementNamePropName を返す。
FieldDefinition : ClassElementName Initializeropt
  1. ClassElementNamePropName を返す。
ClassElementName : PrivateIdentifier
  1. empty を返す。

9 実行可能コードと実行コンテキスト

9.1 Environment Record

Environment Record は、ECMAScript コードのレキシカルな入れ子構造に基づいて、Identifier と特定の変数および関数との対応付けを定義するために用いられる仕様型である。通常、Environment Record は、FunctionDeclarationBlockStatement、または TryStatementCatch 節のような ECMAScript コードの特定の構文構造に関連付けられる。そのようなコードが評価されるたびに、そのコードによって生成される識別子束縛を記録するために、新しい Environment Record が作成される。

すべての Environment Record は [[OuterEnv]] フィールドを持ち、その値は null または外側の Environment Record への参照である。これは Environment Record 値の論理的な入れ子をモデル化するために用いられる。(内側の)Environment Record の外側参照は、その内側の Environment Record を論理的に取り囲む Environment Record への参照である。もちろん、外側の Environment Record 自身もさらに外側の Environment Record を持ち得る。1 つの Environment Record は、複数の内側の Environment Record にとって外側環境として機能し得る。例えば、ある FunctionDeclaration が 2 つの入れ子の FunctionDeclaration を含む場合、それぞれの入れ子関数の Environment Record は、周囲の関数の現在の評価における Environment Record を外側の Environment Record として持つ。

Environment Record は純粋に仕様上の仕組みであり、ECMAScript 実装のいかなる特定の実体にも対応する必要はない。ECMAScript プログラムがそのような値に直接アクセスしたり操作したりすることは不可能である。

9.1.1 Environment Record 型階層

Environment Record は、Environment Record を抽象クラスとし、Declarative Environment RecordObject Environment RecordGlobal Environment Record という 3 つの具象サブクラスを持つ単純なオブジェクト指向階層に存在すると考えることができる。Function Environment RecordModule Environment RecordDeclarative Environment Record のサブクラスである。

Environment Record 抽象クラスには、Table 14 で定義される抽象仕様メソッドが含まれる。これらの抽象メソッドは、それぞれの具象サブクラスごとに異なる具象アルゴリズムを持つ。

Table 14: Abstract Methods of Environment Records
メソッド 目的 定義
HasBinding ( name )

The abstract method HasBinding takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion.

これは Environment Recordname に対する束縛を持つかどうかを判定する。
これは次の型に具象定義を持つ:
CreateMutableBinding ( name, deletable )

The abstract method CreateMutableBinding takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion.

これは Environment Record に新しい未初期化の可変束縛を作成する。name は束縛される名前のテキストである。deletabletrue なら、その束縛は後で削除され得る。
これは次の型に具象定義を持つ:
CreateImmutableBinding ( name, strict )

The abstract method CreateImmutableBinding takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing unused or a throw completion.

これは Environment Record に新しい未初期化の不変束縛を作成する。name は束縛される名前のテキストである。stricttrue なら、それが初期化された後に値を設定しようとする試みは、その束縛を参照する操作の strict mode 設定に関わらず常に例外を送出する。
これは次の型に具象定義を持つ:
InitializeBinding ( name, value )

The abstract method InitializeBinding takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion.

これは Environment Record 内の、既に存在するが未初期化の束縛に値を設定する。name は束縛される名前のテキストである。value はその束縛に対する値である。
これは次の型に具象定義を持つ:
SetMutableBinding ( name, value, strict )

The abstract method SetMutableBinding takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion.

これは Environment Record 内の、既に存在する可変束縛に値を設定する。name は束縛される名前のテキストである。value はその束縛に対する値である。stricttrue で、その束縛に設定できない場合、TypeError 例外を送出する。
これは次の型に具象定義を持つ:
GetBindingValue ( name, strict )

The abstract method GetBindingValue takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion.

これは Environment Record から既に存在する束縛の値を返す。name は束縛される名前のテキストである。strict は、その参照が strict mode コードに由来するか、その他 strict mode の参照意味論を必要とするかを識別するために用いられる。stricttrue で束縛が存在しない場合、ReferenceError 例外を送出する。束縛が存在しても未初期化なら、strict の値に関わらず ReferenceError が送出される。
これは次の型に具象定義を持つ:
DeleteBinding ( name )

The abstract method DeleteBinding takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion.

これは Environment Record から束縛を削除する。name は束縛される名前のテキストである。name の束縛が存在する場合、その束縛を除去して true を返す。束縛が存在しても除去できない場合、false を返す。束縛が存在しない場合、true を返す。
これは次の型に具象定義を持つ:
HasThisBinding ( )

The abstract method HasThisBinding takes no arguments and returns a Boolean.

これは Environment Recordthis 束縛を確立するかを判定する。確立するなら true を、しないなら false を返す。
これは次の型に具象定義を持つ:
GetThisBinding ( )

The abstract method GetThisBinding takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion.

これはこの Environment Recordthis 束縛の値を返す。this 束縛が初期化されていなければ ReferenceError を送出する。
これは次の型に具象定義を持つ:
HasSuperBinding ( )

The abstract method HasSuperBinding takes no arguments and returns a Boolean.

これは Environment Recordsuper メソッド束縛を確立するかを判定する。確立するなら true を、しないなら false を返す。true を返す場合、それはその Environment RecordFunction Environment Record であることを含意するが、その逆は成り立たない。
これは次の型に具象定義を持つ:
WithBaseObject ( )

The abstract method WithBaseObject takes no arguments and returns an Object or undefined.

この Environment Recordwith 文に関連付けられているなら、with オブジェクトを返す。そうでなければ undefined を返す。
これは次の型に具象定義を持つ:

9.1.1.1 Declarative Environment Record

Declarative Environment Record は、変数、定数、let、class、module、import、および/または function 宣言を含む ECMAScript プログラムスコープに関連付けられる。Declarative Environment Record は、そのスコープ内に含まれる宣言によって定義される識別子の集合を束縛する。

9.1.1.1.1 HasBinding ( name )

The HasBinding concrete method of a Declarative Environment Record envRec takes argument name (a String) and returns a normal completion containing a Boolean. これは引数の識別子が、そのレコードによって束縛される識別子の 1 つであるかを判定する。 It performs the following steps when called:

  1. envRecname に対する束縛を持つなら、true を返す。
  2. false を返す。

9.1.1.1.2 CreateMutableBinding ( name, deletable )

The CreateMutableBinding concrete method of a Declarative Environment Record envRec takes arguments name (a String) and deletable (a Boolean) and returns a normal completion containing unused. これは name という名前に対する新しい可変束縛を未初期化の状態で作成する。この Environment Record 内に name に対する束縛が既に存在してはならない。deletabletrue なら、新しい束縛は削除可能として記録される。 It performs the following steps when called:

  1. Assert: envRecname に対する束縛をまだ持っていない。
  2. envRec 内に name に対する可変束縛を作成し、それが未初期化であることを記録する。deletabletrue なら、新たに作成された束縛が後続の DeleteBinding 呼出しによって削除され得ることを記録する。
  3. unused を返す。

9.1.1.1.3 CreateImmutableBinding ( name, strict )

The CreateImmutableBinding concrete method of a Declarative Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns a normal completion containing unused. これは name という名前に対する新しい不変束縛を未初期化の状態で作成する。この Environment Record 内に name に対する束縛が既に存在してはならない。stricttrue なら、新しい束縛は strict 束縛として記録される。 It performs the following steps when called:

  1. Assert: envRecname に対する束縛をまだ持っていない。
  2. envRec 内に name に対する不変束縛を作成し、それが未初期化であることを記録する。stricttrue なら、新たに作成された束縛が strict 束縛であることを記録する。
  3. unused を返す。

9.1.1.1.4 InitializeBinding ( name, value )

The InitializeBinding concrete method of a Declarative Environment Record envRec takes arguments name (a String) and value (an ECMAScript language value) and returns a normal completion containing unused. これは、名前が name である識別子の現在の束縛の束縛値を value に設定するために用いられる。name に対する未初期化束縛が既に存在していなければならない。 It performs the following steps when called:

  1. Assert: envRecname に対する未初期化束縛を持っていなければならない。
  2. envRec 内の name に対する束縛値を value に設定する。
  3. envRec 内の name に対する束縛が初期化済みになったことを 記録する
  4. unused を返す。

9.1.1.1.5 SetMutableBinding ( name, value, strict )

The SetMutableBinding concrete method of a Declarative Environment Record envRec takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、名前が name である識別子の現在の束縛の束縛値を value に変更しようとする。通常 name に対する束縛は既に存在するが、稀な場合には存在しないこともある。その束縛が不変束縛である場合、stricttrue なら TypeError が送出される。 It performs the following steps when called:

  1. envRecname に対する束縛を持たないなら、
    1. stricttrue なら、ReferenceError 例外を送出する。
    2. !envRec.CreateMutableBinding(name, true) を実行する。
    3. !envRec.InitializeBinding(name, value) を実行する。
    4. unused を返す。
  2. envRec 内の name に対する束縛が strict 束縛であるなら、stricttrue に設定する。
  3. envRec 内の name に対する束縛がまだ初期化されていないなら、
    1. ReferenceError 例外を送出する。
  4. Else if envRec 内の name に対する束縛が可変束縛であるなら、
    1. その束縛値を value に変更する。
  5. Else,
    1. Assert: これは不変束縛の値を変更しようとする試みである。
    2. stricttrue なら、TypeError 例外を送出する。
  6. unused を返す。
Note

手順 1 において束縛欠如を生じさせる ECMAScript コードの例は次のとおりである:

function f() { eval("var x; x = (delete x, 0);"); }

9.1.1.1.6 GetBindingValue ( name, strict )

The GetBindingValue concrete method of a Declarative Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは名前が name である束縛識別子の値を返す。束縛が存在しても未初期化なら、strict の値に関わらず ReferenceError が送出される。 It performs the following steps when called:

  1. Assert: envRecname に対する束縛を持つ。
  2. envRec 内の name に対する束縛が未初期化束縛であるなら、ReferenceError 例外を送出する。
  3. envRec 内で現在 name に束縛されている値を返す。

9.1.1.1.7 DeleteBinding ( name )

The DeleteBinding concrete method of a Declarative Environment Record envRec takes argument name (a String) and returns a normal completion containing a Boolean. これは、明示的に削除対象として指定された束縛だけを削除できる。 It performs the following steps when called:

  1. Assert: envRecname に対する束縛を持つ。
  2. envRec 内の name に対する束縛が削除できないなら、false を返す。
  3. envRec から name に対する束縛を除去する。
  4. true を返す。

9.1.1.1.8 HasThisBinding ( )

The HasThisBinding concrete method of a Declarative Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

通常の Declarative Environment Record(すなわち、Function Environment Record でも Module Environment Record でもないもの)は this 束縛を提供しない。

9.1.1.1.9 GetThisBinding ( )

Declarative Environment RecordGetThisBinding 具象メソッドは、この仕様内では決して使用されない。

9.1.1.1.10 HasSuperBinding ( )

The HasSuperBinding concrete method of a Declarative Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

通常の Declarative Environment Record(すなわち、Function Environment Record でも Module Environment Record でもないもの)は super 束縛を提供しない。

9.1.1.1.11 WithBaseObject ( )

The WithBaseObject concrete method of a Declarative Environment Record envRec takes no arguments and returns undefined. It performs the following steps when called:

  1. undefined を返す。

9.1.1.2 Object Environment Record

Object Environment Record は、その束縛オブジェクトと呼ばれるオブジェクトに関連付けられる。Object Environment Record は、その束縛オブジェクトのプロパティ名に直接対応する文字列識別子名の集合を束縛する。IdentifierName の形式を取らない文字列以外の property key は、束縛された識別子の集合には含まれない。own プロパティと継承プロパティの両方が、その [[Enumerable]] 属性の設定に関わらず集合に含まれる。オブジェクトにはプロパティを動的に追加・削除できるため、Object Environment Record によって束縛される識別子の集合は、プロパティを追加または削除する任意の操作の副作用として変化し得る。そのような副作用の結果として作成されるあらゆる束縛は、対応するプロパティの Writable 属性が false であっても可変束縛とみなされる。不変束縛は Object Environment Record には存在しない。

with 文(14.11)のために作成される Object Environment Record は、関数呼び出しで使用する暗黙の this 値としてその束縛オブジェクトを提供できる。この能力は Boolean の [[IsWithEnvironment]] フィールドによって制御される。

Object Environment Record は、Table 15 に列挙された追加状態フィールドを持つ。

Table 15: Additional Fields of Object Environment Records
フィールド名 意味
[[BindingObject]] an Object この Environment Record の束縛オブジェクト。
[[IsWithEnvironment]] a Boolean この Environment Recordwith 文のために作成されたかどうかを示す。

9.1.1.2.1 HasBinding ( name )

The HasBinding concrete method of an Object Environment Record envRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、その関連付けられた束縛オブジェクトが name という名前のプロパティを持つかどうかを判定する。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. foundBinding を ? HasProperty(bindingObject, name) とする。
  3. foundBindingfalse なら、false を返す。
  4. envRec.[[IsWithEnvironment]]false なら、true を返す。
  5. unscopables を ? Get(bindingObject, %Symbol.unscopables%) とする。
  6. unscopables が Object なら、
    1. blockedToBoolean(? Get(unscopables, name)) とする。
    2. blockedtrue なら、false を返す。
  7. true を返す。

9.1.1.2.2 CreateMutableBinding ( name, deletable )

The CreateMutableBinding concrete method of an Object Environment Record envRec takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、Environment Record に関連付けられた束縛オブジェクトに、名前が name で値が undefined に初期化されたプロパティを作成する。deletabletrue なら、新しいプロパティの [[Configurable]] 属性は true に設定され、そうでなければ false に設定される。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. DefinePropertyOrThrow(bindingObject, name, PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: deletable }) を実行する。
  3. unused を返す。
Note

通常、envRecname に対する束縛を持たないが、もし持っている場合、DefinePropertyOrThrow の意味論により既存の束縛が置き換えられたりシャドウされたり、あるいは abrupt completion が返される可能性がある。

9.1.1.2.3 CreateImmutableBinding ( name, strict )

Object Environment RecordCreateImmutableBinding 具象メソッドは、この仕様内では決して使用されない。

9.1.1.2.4 InitializeBinding ( name, value )

The InitializeBinding concrete method of an Object Environment Record envRec takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. これは、名前が name である識別子の現在の束縛の束縛値を value に設定するために用いられる。 It performs the following steps when called:

  1. envRec.SetMutableBinding(name, value, false) を実行する。
  2. unused を返す。
Note

この仕様では、Object Environment Record に対する CreateMutableBinding のすべての使用は、同じ名前に対する InitializeBinding 呼出しが直後に続く。したがって、この仕様では Object Environment Record 内の束縛の初期化状態を明示的には追跡しない。

9.1.1.2.5 SetMutableBinding ( name, value, strict )

The SetMutableBinding concrete method of an Object Environment Record envRec takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、Environment Record に関連付けられた束縛オブジェクトの、名前が name であるプロパティの値を value に設定しようとする。通常 name という名前のプロパティは既に存在するが、存在しないか現在書き込み可能でない場合、エラー処理は strict によって決定される。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. stillExists を ? HasProperty(bindingObject, name) とする。
  3. stillExistsfalse かつ stricttrue なら、ReferenceError 例外を送出する。
  4. Set(bindingObject, name, value, strict) を実行する。
  5. unused を返す。

9.1.1.2.6 GetBindingValue ( name, strict )

The GetBindingValue concrete method of an Object Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは、その関連付けられた束縛オブジェクトの、名前が name であるプロパティの値を返す。そのプロパティは既に存在しているべきだが、存在しない場合の結果は strict に依存する。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. value を ? HasProperty(bindingObject, name) とする。
  3. valuefalse なら、
    1. strictfalse なら、undefined を返す。
    2. ReferenceError 例外を送出する。
  4. Get(bindingObject, name) を返す。

9.1.1.2.7 DeleteBinding ( name )

The DeleteBinding concrete method of an Object Environment Record envRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、環境オブジェクトの [[Configurable]] 属性値が true であるプロパティに対応する束縛だけを削除できる。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. bindingObject.[[Delete]](name) を返す。

9.1.1.2.8 HasThisBinding ( )

The HasThisBinding concrete method of an Object Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

Object Environment Recordthis 束縛を提供しない。

9.1.1.2.9 GetThisBinding ( )

Object Environment RecordGetThisBinding 具象メソッドは、この仕様内では決して使用されない。

9.1.1.2.10 HasSuperBinding ( )

The HasSuperBinding concrete method of an Object Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

Object Environment Recordsuper 束縛を提供しない。

9.1.1.2.11 WithBaseObject ( )

The WithBaseObject concrete method of an Object Environment Record envRec takes no arguments and returns an Object or undefined. It performs the following steps when called:

  1. envRec.[[IsWithEnvironment]]true なら、envRec.[[BindingObject]] を返す。
  2. undefined を返す。

9.1.1.3 Function Environment Record

Function Environment Record は、関数のトップレベルスコープを表すために用いられる Declarative Environment Record であり、その関数が ArrowFunction でない場合には this 束縛を提供する。関数が ArrowFunction 関数でなく、かつ super を参照する場合、その Function Environment Record には、関数内からの super メソッド呼出しを実行するために使われる状態も含まれる。

Function Environment Record は、Table 16 に列挙された追加状態フィールドを持つ。

Table 16: Additional Fields of Function Environment Records
フィールド名 意味
[[ThisValue]] an ECMAScript language value これは、この関数呼出しに用いられる this 値である。
[[ThisBindingStatus]] lexical, initialized, or uninitialized 値が lexical の場合、これは ArrowFunction であり、ローカルな this 値を持たない。
[[FunctionObject]] an ECMAScript function object この Environment Record の作成原因となった呼出しの関数オブジェクト。
[[NewTarget]] a constructor or undefined この Environment Record[[Construct]] 内部メソッドによって作成された場合、[[NewTarget]][[Construct]]newTarget 引数の値である。そうでなければ、その値は undefined である。

Function Environment Record は、Table 14 に列挙されたすべての Declarative Environment Record メソッドをサポートし、それらのメソッドすべてについて、HasThisBindingGetThisBindingHasSuperBinding を除き同じ仕様を共有する。

9.1.1.3.1 BindThisValue ( envRec, value )

The abstract operation BindThisValue takes arguments envRec (a Function Environment Record) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. これは envRec.[[ThisValue]] を設定し、それが初期化済みになったことを記録する。 It performs the following steps when called:

  1. Assert: envRec.[[ThisBindingStatus]] is not lexical.
  2. envRec.[[ThisBindingStatus]]initialized なら、ReferenceError 例外を送出する。
  3. envRec.[[ThisValue]]value に設定する。
  4. envRec.[[ThisBindingStatus]]initialized に設定する。
  5. unused を返す。

9.1.1.3.2 HasThisBinding ( )

The HasThisBinding concrete method of a Function Environment Record envRec takes no arguments and returns a Boolean. It performs the following steps when called:

  1. envRec.[[ThisBindingStatus]]lexical なら、false を返す。
  2. true を返す。

9.1.1.3.3 GetThisBinding ( )

The GetThisBinding concrete method of a Function Environment Record envRec takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. Assert: envRec.[[ThisBindingStatus]] is not lexical.
  2. envRec.[[ThisBindingStatus]]uninitialized なら、ReferenceError 例外を送出する。
  3. envRec.[[ThisValue]] を返す。

9.1.1.3.4 HasSuperBinding ( )

The HasSuperBinding concrete method of a Function Environment Record envRec takes no arguments and returns a Boolean. It performs the following steps when called:

  1. envRec.[[ThisBindingStatus]]lexical なら、false を返す。
  2. envRec.[[FunctionObject]].[[HomeObject]]undefined なら、false を返す。
  3. true を返す。

9.1.1.3.5 GetSuperBase ( envRec )

The abstract operation GetSuperBase takes argument envRec (a Function Environment Record) and returns an Object, null, or undefined. これは envRec 内で束縛された super プロパティアクセスの基底となるオブジェクトを返す。値 undefined は、そのようなアクセスが実行時エラーを生じることを示す。 It performs the following steps when called:

  1. homeenvRec.[[FunctionObject]].[[HomeObject]] とする。
  2. homeundefined なら、undefined を返す。
  3. Assert: homeordinary object である。
  4. home.[[GetPrototypeOf]]() を返す。

9.1.1.4 Global Environment Record

Global Environment Record は、共通の realm 内で処理されるすべての ECMAScript Script 要素によって共有される最外スコープを表すために用いられる。Global Environment Record は、組込みグローバル(節 19)、グローバルオブジェクトのプロパティ、および Script 内に現れるすべてのトップレベル宣言(8.2.9, 8.2.11)に対する束縛を提供する。

Global Environment Record は論理的には単一のレコードだが、Object Environment RecordDeclarative Environment Record をカプセル化する複合体として仕様化される。Object Environment Record は、関連付けられた Realm Recordグローバルオブジェクトを基底オブジェクトとして持つ。このグローバルオブジェクトは、Global Environment Record の GetThisBinding 具象メソッドが返す値である。Global Environment Record の Object Environment Record 部分は、すべての組込みグローバル(節 19)と、グローバルコード内に含まれる FunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration、または VariableStatement によって導入されるすべての束縛を含む。グローバルコード内のその他すべての ECMAScript 宣言に対する束縛は、Global Environment Record の Declarative Environment Record 部分に含まれる。

プロパティはグローバルオブジェクト上に直接作成され得る。したがって、Global Environment Record の Object Environment Record 部分は、FunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration、または VariableDeclaration 宣言によって明示的に作成された束縛と、グローバルオブジェクトのプロパティとして暗黙に作成された束縛の両方を含み得る。

Global Environment Record は、Table 17 に列挙された追加フィールドを持つ。

Table 17: Additional Fields of Global Environment Records
フィールド名 意味
[[ObjectRecord]] an Object Environment Record 束縛オブジェクトはグローバルオブジェクトである。これは、関連する realmグローバルコード内におけるグローバル組込み束縛に加えて、FunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration、および VariableDeclaration の束縛を含む。
[[GlobalThisValue]] an Object グローバルスコープにおいて this が返す値。ホストは任意の ECMAScript Object 値を提供できる。
[[DeclarativeRecord]] a Declarative Environment Record 関連する realm code の global code における、FunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration、および VariableDeclaration の束縛を除くすべての宣言に対する束縛を 含む

9.1.1.4.1 HasBinding ( name )

The HasBinding concrete method of a Global Environment Record envRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは引数の識別子が、そのレコードによって束縛されている識別子の 1 つであるかを判定する。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、true を返す。
  3. objectRecordenvRec.[[ObjectRecord]] とする。
  4. objectRecord.HasBinding(name) を返す。

9.1.1.4.2 CreateMutableBinding ( name, deletable )

The CreateMutableBinding concrete method of a Global Environment Record envRec takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. これは name という名前に対する新しい可変束縛を未初期化で作成する。束縛は関連付けられた DeclarativeRecord 内に作成される。name に対する束縛は DeclarativeRecord 内に既に存在してはならない。deletabletrue なら、新しい束縛は削除対象として記録される。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、TypeError 例外を送出する。
  3. !declarativeRecord.CreateMutableBinding(name, deletable) を返す。

9.1.1.4.3 CreateImmutableBinding ( name, strict )

The CreateImmutableBinding concrete method of a Global Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. これは name という名前に対する新しい不変束縛を未初期化で作成する。この Environment Record 内に name に対する束縛が既に存在してはならない。stricttrue なら、新しい束縛は strict 束縛として記録される。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、TypeError 例外を送出する。
  3. !declarativeRecord.CreateImmutableBinding(name, strict) を返す。

9.1.1.4.4 InitializeBinding ( name, value )

The InitializeBinding concrete method of a Global Environment Record envRec takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. これは、名前が name である識別子の現在の束縛の束縛値を value に設定するために用いられる。name に対する未初期化束縛が既に存在していなければならない。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、
    1. !declarativeRecord.InitializeBinding(name, value) を返す。
  3. Assert: 束縛が存在するなら、それは Object Environment Record 内になければならない。
  4. objectRecordenvRec.[[ObjectRecord]] とする。
  5. objectRecord.InitializeBinding(name, value) を返す。

9.1.1.4.5 SetMutableBinding ( name, value, strict )

The SetMutableBinding concrete method of a Global Environment Record envRec takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、名前が name である識別子の現在の束縛の束縛値を value に変更しようとする。束縛が不変束縛であり、かつ stricttrue なら、TypeError が送出される。通常 name という名前の束縛は既に存在するが、存在しないか現在書込み可能でない場合、エラー処理は strict によって決定される。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、
    1. declarativeRecord.SetMutableBinding(name, value, strict) を返す。
  3. objectRecordenvRec.[[ObjectRecord]] とする。
  4. objectRecord.SetMutableBinding(name, value, strict) を返す。

9.1.1.4.6 GetBindingValue ( name, strict )

The GetBindingValue concrete method of a Global Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは名前が name である束縛識別子の値を返す。束縛が未初期化束縛なら、ReferenceError 例外を送出する。通常 name という名前の束縛は既に存在するが、存在しないか現在書込み可能でない場合、エラー処理は strict によって決定される。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、
    1. declarativeRecord.GetBindingValue(name, strict) を返す。
  3. objectRecordenvRec.[[ObjectRecord]] とする。
  4. objectRecord.GetBindingValue(name, strict) を返す。

9.1.1.4.7 DeleteBinding ( name )

The DeleteBinding concrete method of a Global Environment Record envRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、明示的に削除対象として指定された束縛のみを削除できる。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) が true なら、
    1. !declarativeRecord.DeleteBinding(name) を返す。
  3. objectRecordenvRec.[[ObjectRecord]] とする。
  4. globalObjectobjectRecord.[[BindingObject]] とする。
  5. existingProp を ? HasOwnProperty(globalObject, name) とする。
  6. existingProptrue なら、
    1. objectRecord.DeleteBinding(name) を返す。
  7. true を返す。

9.1.1.4.8 HasThisBinding ( )

The HasThisBinding concrete method of a Global Environment Record envRec takes no arguments and returns true. It performs the following steps when called:

  1. true を返す。
Note

Global Environment Record は常に this 束縛を提供する。

9.1.1.4.9 GetThisBinding ( )

The GetThisBinding concrete method of a Global Environment Record envRec takes no arguments and returns a normal completion containing an Object. It performs the following steps when called:

  1. envRec.[[GlobalThisValue]] を返す。

9.1.1.4.10 HasSuperBinding ( )

The HasSuperBinding concrete method of a Global Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false を返す。
Note

Global Environment Recordsuper 束縛を提供しない。

9.1.1.4.11 WithBaseObject ( )

The WithBaseObject concrete method of a Global Environment Record envRec takes no arguments and returns undefined. It performs the following steps when called:

  1. undefined を返す。

9.1.1.4.12 HasLexicalDeclaration ( envRec, name )

The abstract operation HasLexicalDeclaration takes arguments envRec (a Global Environment Record) and name (a String) and returns a Boolean. これは引数識別子が、LexicalDeclarationClassDeclaration のようなレキシカル宣言を用いて envRec に作成された束縛を持つかどうかを判定する。 It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]] とする。
  2. !declarativeRecord.HasBinding(name) を返す。

9.1.1.4.13 HasRestrictedGlobalProperty ( envRec, name )

The abstract operation HasRestrictedGlobalProperty takes arguments envRec (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは引数識別子が、グローバルレキシカル束縛によってシャドウされてはならないグローバルオブジェクトのプロパティ名であるかを判定する。 It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]] とする。
  2. globalObjectobjectRecord.[[BindingObject]] とする。
  3. existingProp を ? globalObject.[[GetOwnProperty]](name) とする。
  4. existingPropundefined なら、false を返す。
  5. existingProp.[[Configurable]]true なら、false を返す。
  6. true を返す。
Note

グローバルオブジェクト上には、var 宣言や function 宣言を用いて宣言されたのではなく、直接作成されたプロパティが存在し得る。グローバルオブジェクトの non-configurable なプロパティと同名のグローバルレキシカル束縛は作成されてはならない。グローバルプロパティ "undefined" はそのようなプロパティの一例である。

9.1.1.4.14 CanDeclareGlobalVar ( envRec, name )

The abstract operation CanDeclareGlobalVar takes arguments envRec (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、同じ引数 name に対して CreateGlobalVarBinding 呼出しを行った場合に成功するかどうかを判定する。冗長な var 宣言および既存のグローバルオブジェクトプロパティに対する var 宣言は許可される。 It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]] とする。
  2. globalObjectobjectRecord.[[BindingObject]] とする。
  3. hasProperty を ? HasOwnProperty(globalObject, name) とする。
  4. hasPropertytrue なら、true を返す。
  5. IsExtensible(globalObject) を返す。

9.1.1.4.15 CanDeclareGlobalFunction ( envRec, name )

The abstract operation CanDeclareGlobalFunction takes arguments envRec (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、同じ引数 name に対して CreateGlobalFunctionBinding 呼出しを行った場合に成功するかどうかを判定する。 It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]] とする。
  2. globalObjectobjectRecord.[[BindingObject]] とする。
  3. existingProp を ? globalObject.[[GetOwnProperty]](name) とする。
  4. existingPropundefined なら、? IsExtensible(globalObject) を返す。
  5. existingProp.[[Configurable]]true なら、true を返す。
  6. IsDataDescriptor(existingProp) が true で、かつ existingProp が属性値 { [[Writable]]: true, [[Enumerable]]: true } を持つなら、true を返す。
  7. false を返す。

9.1.1.4.16 CreateGlobalVarBinding ( envRec, name, deletable )

The abstract operation CreateGlobalVarBinding takes arguments envRec (a Global Environment Record), name (a String), and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、関連付けられた Object Environment Record 内に可変束縛を作成し初期化する。束縛が既に存在する場合は、それを再利用し、初期化済みであるとみなす。 It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]] とする。
  2. globalObjectobjectRecord.[[BindingObject]] とする。
  3. hasProperty を ? HasOwnProperty(globalObject, name) とする。
  4. extensible を ? IsExtensible(globalObject) とする。
  5. hasPropertyfalse かつ extensibletrue なら、
    1. objectRecord.CreateMutableBinding(name, deletable) を実行する。
    2. objectRecord.InitializeBinding(name, undefined) を実行する。
  6. unused を返す。

9.1.1.4.17 CreateGlobalFunctionBinding ( envRec, name, value, deletable )

The abstract operation CreateGlobalFunctionBinding takes arguments envRec (a Global Environment Record), name (a String), value (an ECMAScript function object), and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、関連付けられた Object Environment Record 内に可変束縛を作成し初期化する。束縛が既に存在する場合は、それを置き換える。 It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]] とする。
  2. globalObjectobjectRecord.[[BindingObject]] とする。
  3. existingProp を ? globalObject.[[GetOwnProperty]](name) とする。
  4. existingPropundefined または existingProp.[[Configurable]]true なら、
    1. desc を PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: deletable } とする。
  5. Else,
    1. desc を PropertyDescriptor { [[Value]]: value } とする。
  6. DefinePropertyOrThrow(globalObject, name, desc) を実行する。
  7. Set(globalObject, name, value, false) を実行する。
  8. unused を返す。
Note

グローバル関数宣言は常にグローバルオブジェクトの own プロパティとして表現される。可能であれば、既存の own プロパティは標準的な属性値の集合を持つように再構成される。手順 7 は、InitializeBinding 具象メソッドを呼び出した場合と等価であり、globalObject が Proxy である場合には同じ順序の Proxy trap 呼出しを生成する。

9.1.1.5 Module Environment Record

Module Environment Record は、ECMAScript Module の外側スコープを表すために用いられる Declarative Environment Record である。通常の可変束縛および不変束縛に加えて、Module Environment Record は不変 import 束縛も提供する。これは、別の Environment Record に存在するターゲット束縛への間接アクセスを提供する束縛である。

Module Environment Record は、Table 14 に列挙されたすべての Declarative Environment Record メソッドをサポートし、GetBindingValueDeleteBindingHasThisBindingGetThisBinding を除くそれらのメソッドすべてについて同じ仕様を共有する。

9.1.1.5.1 GetBindingValue ( name, strict )

The GetBindingValue concrete method of a Module Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは名前が name である束縛識別子の値を返す。ただし、その束縛が間接束縛である場合にはターゲット束縛の値が返される。束縛が存在しても未初期化であるなら ReferenceError が送出される。 It performs the following steps when called:

  1. Assert: strict is true.
  2. Assert: envRec has a binding for name.
  3. name に対する束縛が間接束縛であるなら、
    1. moduletargetName を、この name に対する束縛が作成されたときに与えられた間接参照値とする。
    2. targetEnvmodule.[[Environment]] とする。
    3. targetEnvempty なら、ReferenceError 例外を送出する。
    4. targetEnv.GetBindingValue(targetName, true) を返す。
  4. envRec 内の name に対する束縛が未初期化束縛であるなら、ReferenceError 例外を送出する。
  5. envRec 内で現在 name に束縛されている値を返す。
Note

Module は常に strict mode code であるため、strict は常に true である。

9.1.1.5.2 DeleteBinding ( name )

Module Environment RecordDeleteBinding 具象メソッドは、この仕様内では決して使用されない。

Note

Module Environment Record は strict code 内でのみ使用され、strict code において Module Environment Record 束縛に解決される Reference Record へ delete 演算子を適用することは early error 規則によって防止される。13.5.1.1 を参照。

9.1.1.5.3 HasThisBinding ( )

The HasThisBinding concrete method of a Module Environment Record envRec takes no arguments and returns true. It performs the following steps when called:

  1. true を返す。
Note

Module Environment Record は常に this 束縛を提供する。

9.1.1.5.4 GetThisBinding ( )

The GetThisBinding concrete method of a Module Environment Record envRec takes no arguments and returns a normal completion containing undefined. It performs the following steps when called:

  1. undefined を返す。

9.1.1.5.5 CreateImportBinding ( envRec, name, targetModule, targetName )

The abstract operation CreateImportBinding takes arguments envRec (a Module Environment Record), name (a String), targetModule (a Module Record), and targetName (a String) and returns unused. これは name に対する新しい初期化済みの不変間接束縛を作成する。envRec 内に name に対する束縛が既に存在してはならない。targetNametargetModuleModule Environment Record 内に存在する束縛の名前である。新しい束縛の値へのアクセスは、ターゲット束縛の束縛値へ間接的にアクセスすることになる。 It performs the following steps when called:

  1. Assert: envRecname に対する束縛をまだ持っていない。
  2. Assert: targetModule.[[Environment]] がインスタンス化されるとき、それは targetName に対する直接束縛を持つことになる。
  3. envRec 内に name に対する不変間接束縛を作成し、そのターゲット束縛として targetModule および targetName を参照し、その束縛が初期化済みであることを記録する。
  4. unused を返す。

9.1.2 Environment Record 操作

以下の抽象操作は、この仕様において Environment Record を操作するために用いられる:

9.1.2.1 GetIdentifierReference ( env, name, strict )

The abstract operation GetIdentifierReference takes arguments env (an Environment Record or null), name (a String), and strict (a Boolean) and returns either a normal completion containing a Reference Record or a throw completion. It performs the following steps when called:

  1. envnull なら、
    1. Reference Record { [[Base]]: unresolvable, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty } を返す。
  2. exists を ? env.HasBinding(name) とする。
  3. existstrue なら、
    1. Reference Record { [[Base]]: env, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty } を返す。
  4. outerenv.[[OuterEnv]] とする。
  5. GetIdentifierReference(outer, name, strict) を返す。

9.1.2.2 NewDeclarativeEnvironment ( outerEnv )

The abstract operation NewDeclarativeEnvironment takes argument outerEnv (an Environment Record or null) and returns a Declarative Environment Record. It performs the following steps when called:

  1. env を、束縛を含まない新しい Declarative Environment Record とする。
  2. env.[[OuterEnv]]outerEnv に設定する。
  3. env を返す。

9.1.2.3 NewObjectEnvironment ( obj, isWithEnvironment, outerEnv )

The abstract operation NewObjectEnvironment takes arguments obj (an Object), isWithEnvironment (a Boolean), and outerEnv (an Environment Record or null) and returns an Object Environment Record. It performs the following steps when called:

  1. env を新しい Object Environment Record とする。
  2. env.[[BindingObject]]obj に設定する。
  3. env.[[IsWithEnvironment]]isWithEnvironment に設定する。
  4. env.[[OuterEnv]]outerEnv に設定する。
  5. env を返す。

9.1.2.4 NewFunctionEnvironment ( func, newTarget )

The abstract operation NewFunctionEnvironment takes arguments func (an ECMAScript function object) and newTarget (an Object or undefined) and returns a Function Environment Record. It performs the following steps when called:

  1. env を、束縛を含まない新しい Function Environment Record とする。
  2. env.[[FunctionObject]]func に設定する。
  3. func.[[ThisMode]]lexical なら、env.[[ThisBindingStatus]]lexical に設定する。
  4. Else, env.[[ThisBindingStatus]]uninitialized に設定する。
  5. env.[[NewTarget]]newTarget に設定する。
  6. env.[[OuterEnv]]func.[[Environment]] に設定する。
  7. env を返す。

9.1.2.5 NewGlobalEnvironment ( obj, thisValue )

The abstract operation NewGlobalEnvironment takes arguments obj (an Object) and thisValue (an Object) and returns a Global Environment Record. It performs the following steps when called:

  1. objRecNewObjectEnvironment(obj, false, null) とする。
  2. dclRecNewDeclarativeEnvironment(null) とする。
  3. env を新しい Global Environment Record とする。
  4. env.[[ObjectRecord]]objRec に設定する。
  5. env.[[GlobalThisValue]]thisValue に設定する。
  6. env.[[DeclarativeRecord]]dclRec に設定する。
  7. env.[[OuterEnv]]null に設定する。
  8. env を返す。

9.1.2.6 NewModuleEnvironment ( outerEnv )

The abstract operation NewModuleEnvironment takes argument outerEnv (a Global Environment Record) and returns a Module Environment Record. It performs the following steps when called:

  1. env を、束縛を含まない新しい Module Environment Record とする。
  2. env.[[OuterEnv]]outerEnv に設定する。
  3. env を返す。

9.2 PrivateEnvironment Record

PrivateEnvironment Record は、ECMAScript コード内の ClassDeclaration および ClassExpression のレキシカルな入れ子構造に基づいて Private Name を追跡するために用いられる仕様上の仕組みである。これは Environment Record に似ているが、別物である。各 PrivateEnvironment RecordClassDeclaration または ClassExpression に関連付けられる。そのような class が評価されるたびに、その class によって宣言される Private Name を記録するために新しい PrivateEnvironment Record が作成される。

PrivateEnvironment Record は、Table 18 で定義されるフィールドを持つ。

Table 18: PrivateEnvironment Record Fields
フィールド名 値型 意味
[[OuterPrivateEnvironment]] a PrivateEnvironment Record or null 最も近い外側の class の PrivateEnvironment Record。この PrivateEnvironment Record に関連付けられた class が他の class の中に含まれていない場合は null
[[Names]] a List of Private Names この class によって宣言された Private Name

9.2.1 PrivateEnvironment Record 操作

以下の抽象操作は、この仕様において PrivateEnvironment Record を操作するために用いられる:

9.2.1.1 NewPrivateEnvironment ( outerPrivateEnv )

The abstract operation NewPrivateEnvironment takes argument outerPrivateEnv (a PrivateEnvironment Record or null) and returns a PrivateEnvironment Record. It performs the following steps when called:

  1. names を新しい空の List とする。
  2. PrivateEnvironment Record { [[OuterPrivateEnvironment]]: outerPrivateEnv, [[Names]]: names } を返す。

9.2.1.2 ResolvePrivateIdentifier ( privateEnv, identifier )

The abstract operation ResolvePrivateIdentifier takes arguments privateEnv (a PrivateEnvironment Record) and identifier (a String) and returns a Private Name. It performs the following steps when called:

  1. namesprivateEnv.[[Names]] とする。
  2. names の各 Private Name pn について、次を行う
    1. pn.[[Description]]identifier であるなら、
      1. pn を返す。
  3. outerPrivateEnvprivateEnv.[[OuterPrivateEnvironment]] とする。
  4. Assert: outerPrivateEnv is not null.
  5. ResolvePrivateIdentifier(outerPrivateEnv, identifier) を返す。

9.3 Realm

評価される前に、すべての ECMAScript コードは realm に関連付けられていなければならない。概念的には、realm は一組の intrinsic object、ECMAScript のグローバル環境、そのグローバル環境のスコープ内にロードされたすべての ECMAScript コード、およびその他の関連状態と資源から構成される。

realm は、この仕様では Table 19 に指定されたフィールドを持つ Realm Record として表現される:

Table 19: Realm Record Fields
フィールド名 意味
[[AgentSignifier]] an agent signifier この realm を所有する agent
[[Intrinsics]] a Record whose field names are intrinsic keys and whose values are objects この realm に関連付けられたコードが使用する intrinsic 値
[[GlobalObject]] an Object この realmグローバルオブジェクト
[[GlobalEnv]] a Global Environment Record この realm のグローバル環境
[[TemplateMap]] a List of Records with fields [[Site]] (a TemplateLiteral Parse Node) and [[Array]] (an Array)

テンプレートオブジェクトは、それぞれの realm ごとに、その Realm Record[[TemplateMap]] を用いて個別に正準化される。各 [[Site]] 値は TemplateLiteral である Parse Node である。関連する [[Array]] 値は、tag 関数に渡される対応するテンプレートオブジェクトである。

Note 1
Parse Node が到達不能になると、それに対応する [[Array]] も到達不能になるため、実装がその組を [[TemplateMap]] リストから削除しても観測不能である。
[[LoadedModules]] a List of LoadedModuleRequest Records

この realm が import した specifier 文字列から解決済み Module Record への写像。このリストには、ModuleRequestsEqual(r1, r2) が true となるような異なる 2 つの Record r1r2 は含まれない。

Note 2
HostLoadImportedModule16.2.1.10 Note 1)で述べられているように、Realm Record 内の [[LoadedModules]] は、アクティブな script も module も存在しない文脈で import() 式を実行するときにのみ使用される。
[[HostDefined]] anything (default value is undefined) Realm Record に追加情報を関連付ける必要のあるホストのために予約されたフィールド。

9.3.1 InitializeHostDefinedRealm ( )

The abstract operation InitializeHostDefinedRealm takes no arguments and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. realm を新しい Realm Record とする。
  2. CreateIntrinsics(realm) を実行する。
  3. realm.[[AgentSignifier]]AgentSignifier() に設定する。
  4. realm.[[TemplateMap]] を新しい空の List に設定する。
  5. newContext を新しい execution context とする。
  6. newContext の Function を null に設定する。
  7. newContextRealmrealm に設定する。
  8. newContext の ScriptOrModule を null に設定する。
  9. newContextexecution context stack に push する; newContext はいま running execution context である。
  10. ホストが realm の global object として機能する特定の object の使用を要求するなら、
    1. global を、そのような object でホスト定義の方法で作成されたものとする。
  11. Else,
    1. globalOrdinaryObjectCreate(realm.[[Intrinsics]].[[%Object.prototype%]]) とする。
  12. ホストが realm の global scope における this 束縛として global object 以外の object を返すことを要求するなら、
    1. thisValue を、そのような object でホスト定義の方法で作成されたものとする。
  13. Else,
    1. thisValueglobal とする。
  14. realm.[[GlobalObject]]global に設定する。
  15. realm.[[GlobalEnv]]NewGlobalEnvironment(global, thisValue) に設定する。
  16. SetDefaultGlobalBindings(realm) を実行する。
  17. global 上に任意の host-defined global object property を作成する。
  18. unused を返す。

9.3.2 CreateIntrinsics ( realmRec )

The abstract operation CreateIntrinsics takes argument realmRec (a Realm Record) and returns unused. It performs the following steps when called:

  1. realmRec.[[Intrinsics]] を新しい Record に設定する。
  2. realmRec.[[Intrinsics]] の各フィールドに、Table 6 に列挙された値を設定する。フィールド名は表の “Intrinsic Name” 列に列挙された名前である。各フィールドの値は、19 から 28 までの各節で定義される各 object の仕様に従って、プロパティ値で完全かつ再帰的に充填された新しい object 値である。すべての object property 値は新しく作成された object 値である。built-in function object であるすべての値は、CreateBuiltinFunction(steps, length, name, slots, realmRec, prototype, async) を実行することで作成される。ここで steps はこの仕様が提供するその関数の定義、name は関数の "name" プロパティの初期値、length は関数の "length" プロパティの初期値、slots はその関数に指定された内部スロット名の list(存在する場合)、prototype は関数の [[Prototype]] 内部スロットの指定値、そして async はその関数が “async” と記述されている場合は true、そうでなければ false である。intrinsics とそれらのプロパティの作成順序は、まだ作成されていない object への依存を避けるように定められなければならない。
  3. AddRestrictedFunctionProperties(realmRec.[[Intrinsics]].[[%Function.prototype%]], realmRec) を実行する。
  4. unused を返す。

9.3.3 SetDefaultGlobalBindings ( realmRec )

The abstract operation SetDefaultGlobalBindings takes argument realmRec (a Realm Record) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. globalrealmRec.[[GlobalObject]] とする。
  2. 19 節で指定される Global Object の各 property について、次を行う
    1. name をその property 名の String 値とする。
    2. desc を、その property に指定された属性を含む、完全に充填された data Property Descriptor とする。19.219.3、または 19.4 に列挙された property については、[[Value]] 属性の値は realmRec に対応する intrinsic object である。
    3. DefinePropertyOrThrow(global, name, desc) を実行する。
  3. unused を返す。

9.4 実行コンテキスト

execution context は、ECMAScript 実装によるコードの実行時評価を追跡するために用いられる仕様上の仕組みである。任意の時点において、実際にコードを実行している execution context は agent ごとに高々 1 つである。これはその agentrunning execution context として知られる。この仕様における running execution context へのすべての参照は、周囲の agentrunning execution context を指す。

execution context stack は execution context を追跡するために用いられる。running execution context は常にこの stack の最上位要素である。新しい execution context は、現在の running execution context に関連付けられた実行可能コードから、その execution context に関連付けられていない実行可能コードへ制御が移るたびに作成される。新たに作成された execution context は stack に push され、running execution context になる。

execution context は、関連付けられたコードの実行進行を追跡するために必要な、実装固有のあらゆる状態を含む。各 execution context は、少なくとも Table 20 に列挙された状態コンポーネントを持つ。

Table 20: State Components for All Execution Contexts
コンポーネント 目的
code evaluation state この execution context に関連付けられたコードの評価を実行、一時停止、および再開するために必要な任意の状態。
Function この execution context が関数オブジェクトのコードを評価しているなら、このコンポーネントの値はその関数オブジェクトである。context が Script または Module のコードを評価しているなら、その値は null である。
Realm 関連付けられたコードが ECMAScript 資源へアクセスする元となる Realm Record
ScriptOrModule 関連付けられたコードの出所である Module Record または Script Record。元となる script または module が存在しない場合、たとえば InitializeHostDefinedRealm で作成される最初の execution context の場合、その値は null である。

running execution context によるコード評価は、この仕様で定義されたさまざまな点で一時停止され得る。running execution context が一時停止されると、別の execution context が running execution context となってそのコードの評価を開始し得る。その後のある時点で、一時停止されていた execution context が再び running execution context となり、以前に一時停止された地点からそのコードの評価を続行し得る。execution context 間での running execution context 状態の遷移は、通常、stack 的な後入れ先出しの方式で起こる。しかし、一部の ECMAScript 機能では、running execution context の非 LIFO な遷移が必要となる。

running execution contextRealm コンポーネントの値は、current Realm Record とも呼ばれる。running execution context の Function コンポーネントの値は、active function object とも呼ばれる。

ECMAScript code execution contexts は、Table 21 に列挙された追加の状態コンポーネントを持つ。

Table 21: Additional State Components for ECMAScript Code Execution Contexts
コンポーネント 目的
LexicalEnvironment この execution context 内のコードによって行われる識別子参照を解決するために使われる Environment Record を識別する。
VariableEnvironment この execution context 内の VariableStatement によって作成された束縛を保持する Environment Record を識別する。
PrivateEnvironment 最も近い包含 class における ClassElement によって作成された Private Name を保持する PrivateEnvironment Record を識別する。包含 class が存在しない場合は null

execution context の LexicalEnvironment および VariableEnvironment コンポーネントは、常に Environment Record である。

Generator の評価を表す execution context は、Table 22 に列挙された追加の状態コンポーネントを持つ。

Table 22: Additional State Components for Generator Execution Contexts
コンポーネント 目的
Generator この execution context が評価している Generator。

ほとんどの状況では、running execution contextexecution context stack の先頭)だけが、この仕様内のアルゴリズムによって直接操作される。したがって、“LexicalEnvironment” および “VariableEnvironment” という用語が修飾なしに使われるとき、それらは running execution context のそれらのコンポーネントを指している。

execution context は純粋に仕様上の仕組みであり、ECMAScript 実装のいかなる特定の実体にも対応する必要はない。ECMAScript コードが execution context に直接アクセスしたり観測したりすることは不可能である。

9.4.1 GetActiveScriptOrModule ( )

The abstract operation GetActiveScriptOrModule takes no arguments and returns a Script Record, a Module Record, or null. これは、running execution context に基づいて、実行中の script または module を決定するために用いられる。 It performs the following steps when called:

  1. execution context stack が空なら、null を返す。
  2. ec を、execution context stack 上で ScriptOrModule コンポーネントが null でない最上位の execution context とする。
  3. そのような execution context が存在しないなら、null を返す。
  4. ec の ScriptOrModule を返す。

9.4.2 ResolveBinding ( name [ , env ] )

The abstract operation ResolveBinding takes argument name (a String) and optional argument env (an Environment Record or undefined) and returns either a normal completion containing a Reference Record or a throw completion. これは name の束縛を決定するために用いられる。env は、その束縛を探索すべき Environment Record を明示的に与えるために使える。 It performs the following steps when called:

  1. env が存在しないか、または envundefined なら、
    1. envrunning execution context の LexicalEnvironment に設定する。
  2. Assert: envEnvironment Record である。
  3. strict を、評価中の構文生成規則に対する IsStrict とする。
  4. GetIdentifierReference(env, name, strict) を返す。
Note

ResolveBinding の結果は常に、[[ReferencedName]] フィールドが name である Reference Record である。

9.4.3 GetThisEnvironment ( )

The abstract operation GetThisEnvironment takes no arguments and returns an Environment Record. これは、現在キーワード this の束縛を提供している Environment Record を見つける。 It performs the following steps when called:

  1. envrunning execution context の LexicalEnvironment とする。
  2. 繰り返す
    1. existsenv.HasThisBinding() とする。
    2. existstrue なら、env を返す。
    3. outerenv.[[OuterEnv]] とする。
    4. Assert: outer is not null.
    5. envouter に設定する。
Note

手順 2 の loop は常に終了する。なぜなら、環境の列は常に this 束縛を持つ global environment で終わるからである。

9.4.4 ResolveThisBinding ( )

The abstract operation ResolveThisBinding takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion. これは、running execution context の LexicalEnvironment を用いてキーワード this の束縛を決定する。 It performs the following steps when called:

  1. envRecGetThisEnvironment() とする。
  2. envRec.GetThisBinding() を返す。

9.4.5 GetNewTarget ( )

The abstract operation GetNewTarget takes no arguments and returns an Object or undefined. これは、running execution context の LexicalEnvironment を用いて NewTarget 値を決定する。 It performs the following steps when called:

  1. envRecGetThisEnvironment() とする。
  2. Assert: envRec[[NewTarget]] フィールドを持つ。
  3. envRec.[[NewTarget]] を返す。

9.4.6 GetGlobalObject ( )

The abstract operation GetGlobalObject takes no arguments and returns an Object. これは、現在の running execution context によって使用される global object を返す。 It performs the following steps when called:

  1. currentRealmcurrent Realm Record とする。
  2. currentRealm.[[GlobalObject]] を返す。

9.4.7 RunSuspendedContext ( context, completionRecord )

The abstract operation RunSuspendedContext takes arguments context (実行コンテキスト) and completionRecord (完了レコード) and returns ECMAScript 言語値または unused のいずれかを含む正常完了、または中途完了. これは context を再開し(再開値として completionRecord を送信し)、結果を待つ。 It performs the following steps when called:

  1. callerContext を実行中の実行コンテキストとする。
  2. callerContext を中断する。
  3. context を実行コンテキストスタックにプッシュする;context は今や実行中の実行コンテキストである。
  4. context の中断された評価を再開する。その際、それを中断させた操作の結果として completionRecord を用いる。再開された計算により返された完了レコードを result とする。
  5. Assert: このステップに到達した時点で、context はすでに実行コンテキストスタックから取り除かれており、callerContext が再び実行中の実行コンテキストである。
  6. Return Completion(result).

9.5 Job と Job を enqueue する Host Operation

Job は、他の ECMAScript 計算が現在進行中でないときに ECMAScript 計算を開始する、引数を持たない Abstract Closure である。

Job は、特定の agent において ECMAScript host environment によって実行のためにスケジュールされる。この仕様は、job をスケジュールするための host hook として HostEnqueueGenericJobHostEnqueueFinalizationRegistryCleanupJobHostEnqueuePromiseJob、および HostEnqueueTimeoutJob を記述する。この仕様における host hook は、job のスケジューリングに課される追加制約ごとに整理されている。host は job をスケジュールする追加の抽象操作を定義してよい。そのような操作は、Job Abstract ClosurerealmRealm Record または null)を引数として受け取る。Realm Record が与えられた場合、これらの操作は、その realm を所有する agent において、与えられた realm 内で、その job が将来のある時点で実行されるようスケジュールする。代わりに realmnull が与えられた場合、その job は ECMAScript コードを評価しない。それらの実装は次の要件に適合しなければならない:

  • 将来のある時点で、その job がスケジュールされた agent に running context が存在せず、かつその agentexecution context stack が空であるとき、実装は次を行わなければならない:
    1. 任意の host-defined preparation step を実行する。
    2. その Job Abstract Closure呼び出す
    3. 任意の host-defined cleanup step を実行し、その後 execution context stack は空でなければならない。
  • ある agent において、任意の時点で、評価中であり得る Job は 1 つだけである。
  • Job の評価が開始されたなら、その agent において他のいかなる Job の評価が開始される前にも、その Job は完了まで実行されなければならない。
  • その Abstract Closurenormal completion を返さなければならず、エラー処理は自身で実装しなければならない。
Note 1
Host environment は、スケジューリングに関して Job を一様に扱うことを要求されない。たとえば、web browser と Node.js は Promise 処理 Job を他の仕事より高い優先度で扱う; 将来の機能では、そのような高い優先度で扱われない Job が追加されるかもしれない。

任意の特定の時点で、scriptOrModule(Script Record、Module Record、または null)が active script or module であるのは、次のすべての条件が真である場合である:

任意の特定の時点で、ある execution が ECMAScript code を評価する準備ができている のは、次のすべての条件が真である場合である:

Note 2

host environment は、execution contextexecution context stack に push することで、code を評価する準備ができた execution を用意してよい。具体的な手順は implementation-defined である。

Realm の具体的な選択は host environment に委ねられる。この初期 execution contextRealm は、いかなる callback function も呼び出される前にのみ使用中である。Promise handler のように Job に関連する callback function が呼び出されるとき、その呼出しは自身の execution contextRealm を push する。

特定種別の Job には追加の適合要件がある。

9.5.1 JobCallback Record

JobCallback Record は、function objecthost-defined 値を格納するために用いられる Record 値である。host によって enqueue された Job を通じて呼び出される function object には、追加の host-defined context が存在する場合がある。その状態を伝播するため、Job Abstract Closurefunction object を直接 capture して呼び出すべきではない。代わりに HostMakeJobCallbackHostCallJobCallback を用いる。

Note

たとえば WHATWG HTML 仕様(https://html.spec.whatwg.org/)は、Promise callback に対する incumbent settings object を伝播するために host-defined 値を用いる。

JobCallback Record は、Table 23 に列挙されたフィールドを持つ。

Table 23: JobCallback Record Fields
フィールド名 意味
[[Callback]] a function object その Job が呼び出されるときに呼び出す関数。
[[HostDefined]] anything (default value is empty) host 用に予約されたフィールド。

9.5.2 HostMakeJobCallback ( callback )

The host-defined abstract operation HostMakeJobCallback takes argument callback (a function object) and returns a JobCallback Record.

HostMakeJobCallback の実装は次の要件に適合しなければならない:

  • [[Callback]] フィールドが callback である JobCallback Record を返さなければならない。

HostMakeJobCallback の既定実装は、呼び出されたとき次の手順を実行する:

  1. JobCallback Record { [[Callback]]: callback, [[HostDefined]]: empty } を返す。

web browser でない ECMAScript host は、HostMakeJobCallback の既定実装を使用しなければならない。

Note

これは、その callback が、最終的にスケジュールされ実行される責任を持つ関数へ渡される時点で呼び出される。たとえば promise.then(thenAction) は、reaction Job をスケジュールする時点ではなく、Promise.prototype.then を呼び出す時点で thenAction に対して MakeJobCallback を呼び出す。

9.5.3 HostCallJobCallback ( jobCallback, value, argumentsList )

The host-defined abstract operation HostCallJobCallback takes arguments jobCallback (a JobCallback Record), value (an ECMAScript language value), and argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion.

HostCallJobCallback の実装は次の要件に適合しなければならない:

  • Call(jobCallback.[[Callback]], value, argumentsList) の結果を実行し、その結果を返さなければならない。
Note

この要件は、host がこの仕様で定義された function object[[Call]] 振る舞いを変更できないことを意味する。

HostCallJobCallback の既定実装は、呼び出されたとき次の手順を実行する:

  1. Assert: IsCallable(jobCallback.[[Callback]]) is true.
  2. Call(jobCallback.[[Callback]], value, argumentsList) を返す。

web browser でない ECMAScript host は、HostCallJobCallback の既定実装を使用しなければならない。

9.5.4 HostEnqueueGenericJob ( job, realm )

The host-defined abstract operation HostEnqueueGenericJob takes arguments job (a Job Abstract Closure) and realm (a Realm Record) and returns unused. これは realm.[[AgentSignifier]] によって示される agent において、realm realm 内で job が将来のある時点で実行されるようスケジュールする。このアルゴリズムで用いられる Abstract Closure は、優先度や順序のような追加制約なしでスケジュールされることを意図している。

HostEnqueueGenericJob の実装は 9.5 の要件に適合しなければならない。

9.5.5 HostEnqueuePromiseJob ( job, realm )

The host-defined abstract operation HostEnqueuePromiseJob takes arguments job (a Job Abstract Closure) and realm (a Realm Record or null) and returns unused. これは job が将来のある時点で実行されるようスケジュールする。このアルゴリズムで用いられる Abstract Closure は、Promise の処理に関連するもの、またはその他、Promise 処理操作と同等の優先度でスケジュールされるものとして意図されている。

HostEnqueuePromiseJob の実装は 9.5 の要件に加えて、次の要件にも適合しなければならない:

  • realmnull でない場合、job が呼び出されるたびに、実装は job 呼出し時に execution が ECMAScript code を評価する準備ができているようにする implementation-defined な手順を実行しなければならない。
  • scriptOrModule を HostEnqueuePromiseJob が呼び出された時点の GetActiveScriptOrModule() とする。realmnull でない場合、job が呼び出されるたびに、実装は job 呼出し時に scriptOrModuleactive script or module であるようにする implementation-defined な手順を実行しなければならない。
  • Job は、それらをスケジュールした HostEnqueuePromiseJob 呼出しと同じ順序で実行されなければならない。
Note

NewPromiseResolveThenableJob が返す Job に対する realm は通常、then function object に対して GetFunctionRealm を呼び出した結果である。NewPromiseReactionJob が返す Job に対する realm は通常、handler が undefined でない場合、その handler に対して GetFunctionRealm を呼び出した結果である。handler が undefined の場合、realmnull である。どちらの種別の Job でも、GetFunctionRealm が異常完了した場合(すなわち revoked Proxy に対して呼び出された場合)、realmGetFunctionRealm 呼出し時点の current Realm Record である。realmnull のとき、ユーザ ECMAScript code は一切評価されず、新しい ECMAScript object(たとえば Error object)も一切作成されない。たとえば WHATWG HTML 仕様(https://html.spec.whatwg.org/)は、script を実行できるかどうかの確認や entry 概念のために realm を用いる。

9.5.6 HostEnqueueTimeoutJob ( timeoutJob, realm, milliseconds )

The host-defined abstract operation HostEnqueueTimeoutJob takes arguments timeoutJob (a Job Abstract Closure), realm (a Realm Record), and milliseconds (a non-negative finite Number) and returns unused. これは realm.[[AgentSignifier]] によって示される agent において、realm realm 内で timeoutJob が少なくとも milliseconds ミリ秒後に実行されるようスケジュールする。

HostEnqueueTimeoutJob の実装は 9.5 の要件に適合しなければならない。

9.6 Agent

agent は、一組の ECMAScript execution contextexecution context stackrunning execution contextAgent Record、および executing thread から構成される。executing thread を除き、agent の構成要素はその agent に専属する。

agentexecuting thread は、他の agent とは独立に、その agentexecution context 上でアルゴリズム的手順を実行する。ただし、その thread を共有するどの agent[[CanBlock]] フィールドが trueAgent Record を持たない場合に限り、1 つの executing thread が複数の agentexecuting thread として用いられてよい。

Note 1

たとえば一部の web browser では、browser window の無関係な複数の tab 間で単一の executing thread を共有する。

agentexecuting thread がアルゴリズム的手順を実行している間、その手順にとってその agentsurrounding agent である。その手順は、specification-level の実行オブジェクト、すなわち running execution contextexecution context stack、および Agent Record のフィールドにアクセスするために surrounding agent を用いる。

agent signifier は、Agent を識別するために用いられる、グローバルに一意な不透明値である。

Table 24: Agent Record Fields
フィールド名 意味
[[LittleEndian]] a Boolean アルゴリズム GetValueFromBuffer および SetValueInBufferisLittleEndian 引数が必要となったときに計算される既定値。選択は implementation-defined であり、実装にとって最も効率的な方であるべきである。
[[CanBlock]] a Boolean その agent が block できるかどうかを決定する。
[[Signifier]] an agent signifier その agentagent cluster 内で一意に識別する。
[[IsLockFree1]] a Boolean 1-byte 値に対する atomic operation が lock-free なら true、そうでなければ false
[[IsLockFree2]] a Boolean 2-byte 値に対する atomic operation が lock-free なら true、そうでなければ false
[[IsLockFree8]] a Boolean 8-byte 値に対する atomic operation が lock-free なら true、そうでなければ false
[[CandidateExecution]] a candidate execution Record memory model を参照。
[[KeptAlive]] a List of either Objects or Symbols 初期値は新しい空の List であり、現在の Job の終了まで生存維持される object および/または symbol の list を表す
[[ModuleAsyncEvaluationCount]] an integer 初期値は 0 であり、非同期である module または非同期依存を持つ module の [[AsyncEvaluationOrder]] フィールドに、一意な増加値を割り当てるために用いられる。

[[LittleEndian]][[Signifier]][[IsLockFree1]][[IsLockFree2]]、および [[IsLockFree8]] の値は変更できない。

Note 2

[[IsLockFree1]][[IsLockFree2]]、および [[IsLockFree8]] の値は、必ずしも hardware のみによって決まるわけではなく、時間の経過や ECMAScript 実装間で変化し得る実装上の選択も反映し得る。

[[IsLockFree4]] フィールドは存在しない: 4-byte atomic operation は常に lock-free である。

実際には、ある atomic operation が何らかの lock を用いて実装されているなら、その operation は lock-free ではない。lock-free は wait-free を含意しない: lock-free atomic operation の完了に必要な machine step 数には上限がない。

サイズ n の atomic access が lock-free であることは、サイズ n の非 atomic access の(知覚される)原子性について何も意味しない。特に、非 atomic access は依然として複数の独立した memory access の列として実行され得る。詳細は ReadSharedMemory および WriteSharedMemory を参照。

Note 3

agent は仕様上の仕組みであり、ECMAScript 実装のいかなる特定の実体にも対応する必要はない。

9.6.1 AgentSignifier ( )

The abstract operation AgentSignifier takes no arguments and returns an agent signifier. It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Record とする。
  2. agentRecord.[[Signifier]] を返す。

9.6.2 AgentCanSuspend ( )

The abstract operation AgentCanSuspend takes no arguments and returns a Boolean. It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Record とする。
  2. agentRecord.[[CanBlock]] を返す。
Note

一部の環境では、与えられた agent が suspend できることが妥当でない場合がある。たとえば web browser 環境では、document の main event handling thread の suspend を禁止しつつ、worker の event handling thread については suspend を許可するのが妥当であり得る。

9.6.3 IncrementModuleAsyncEvaluationCount ( )

The abstract operation IncrementModuleAsyncEvaluationCount takes no arguments and returns a non-negative integer. It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Record とする。
  2. countagentRecord.[[ModuleAsyncEvaluationCount]] とする。
  3. agentRecord.[[ModuleAsyncEvaluationCount]]count + 1 に設定する。
  4. count を返す。
Note

この値は、保留中の module 間の相対的な評価順序を追跡するためにのみ用いられる。実装は、保留中の module が存在しないときは 언제でも、観測不能な形で [[ModuleAsyncEvaluationCount]] を 0 に戻してよい。

9.7 Agent Cluster

agent cluster は、shared memory 上で操作することにより通信できる agent の極大集合である。

Note 1

異なる agent 内の program は、未規定の手段によって memory を共有し得る。少なくとも、SharedArrayBuffer の backing memory は cluster 内の agent 間で共有され得る。

message passing により通信できても memory を共有できない agent が存在し得る; それらが同じ agent cluster に属することは決してない。

すべての agent は、ちょうど 1 つの agent cluster に属する。

Note 2

cluster 内の agent が、ある特定時点ですべて生存している必要はない。agent A が別の agent B を生成し、その後 A が終了し、Bagent C を生成した場合、AB とある memory を共有でき、かつ BC とある memory を共有できるなら、その 3 つの agent は同じ cluster に属する。

cluster 内のすべての agent は、それぞれの Agent Record における [[LittleEndian]] フィールドについて同じ値を持たなければならない。

Note 3

agent cluster 内の異なる agent[[LittleEndian]] の異なる値を持つと、複数 byte データに shared memory を使うことが困難になる。

cluster 内のすべての agent は、それぞれの Agent Record における [[IsLockFree1]] フィールドについて同じ値を持たなければならない; [[IsLockFree2]] および [[IsLockFree8]] フィールドについても同様である。

cluster 内のすべての agent は、それぞれの Agent Record における [[Signifier]] フィールドについて異なる値を持たなければならない。

embedding は、agent の知識や協力なしに、agent を deactivate(前進を停止)または activate(前進を再開)してよい。embedding がそうする場合、cluster 内の一部の agent を active のままにして、他の agent を無期限に deactivated のままにしてはならない。

Note 4

前述の制約の目的は、別の agent が deactivate されたために agent が deadlock または starvation を起こす状況を避けることである。たとえば、任意の window の document から独立した寿命を持つ HTML shared worker が、そのような独立 document の dedicated worker と memory を共有することを許され、document とその dedicated worker が deactivate されている間に dedicated worker が lock を保持しており(たとえば document がその window の history に押し込まれたとする)、その後 shared worker がその lock を獲得しようとしたなら、shared worker は dedicated worker が再び activate されるまで、されるとしても、block される。その一方で、他の window から shared worker へアクセスしようとする他の worker は starvation を起こす。

この制約が意味するのは、embedding 内で同じ suspend/wake collective に属さない agent 間では memory を共有できないということである。

embedding は、その agent の cluster の他の agent の事前知識や協力なしに agent を terminate してよい。agent が、それ自身または cluster 内の別 agent の programmatic action によってではなく、cluster 外部の力によって terminate される場合、embedding は 2 つの戦略のいずれかを選ばなければならない。すなわち、cluster 内のすべての agent を terminate するか、または、cluster 内の agent が協調できる信頼性ある API を提供して、cluster に残る少なくとも 1 つの member が terminate を検出でき、その terminate data に terminate された agent を識別するのに十分な情報が含まれるようにするかである。

Note 5

この種の terminate の例としては、別 process で実行中の agent を operating system または user が terminate する場合; embedding 自身が、per-agent 資源 accounting により暴走していると示された agent を、他の agent と同一 process 内で実行中に terminate する場合がある。

次の仕様値およびそこから推移的に到達可能な値は、それぞれちょうど 1 つの agent cluster に属する。

cluster 内のいずれの agent によるいかなる ECMAScript code の評価より前にも、cluster 内のすべての agentAgent Record における [[CandidateExecution]] フィールドは、初期 candidate execution に設定される。初期 candidate execution空の candidate execution であり、その [[EventsRecords]] フィールドは、各 agent について、その agentagent signifier[[AgentSignifier]] フィールドに持ち、かつ [[EventList]][[AgentSynchronizesWith]] フィールドが空の List である Agent Events Record を含む List である。

Note 6

agent cluster 内のすべての agent は、その Agent Record[[CandidateExecution]] フィールドにおいて同じ candidate execution を共有する。candidate execution は memory model によって使用される仕様上の仕組みである。

Note 7

agent cluster は仕様上の仕組みであり、ECMAScript 実装のいかなる特定の実体にも対応する必要はない。

9.8 Forward Progress

agentforward progress を行う とは、この仕様に従って評価ステップを実行することである。

agent は、その running execution context が外部イベントを同期的かつ無期限に待つとき blocked になる。この意味で blocked になれるのは、その Agent Record[[CanBlock]] フィールドが true である agent だけである。unblockedagent とは、blocked でない agent である。

実装は次を保証しなければならない:

  • 専用の executing thread を持つすべての unblocked な agent は、最終的に forward progress を行う
  • 1 つの executing thread を共有する agent の集合においては、いずれか 1 つの agent が最終的に forward progress を行う
  • agent は、blocking を提供する明示的 API を通じる場合を除き、他の agent が blocked になる原因となってはならない。
Note

これは、memory model における liveness 保証とともに、すべての seq-cst write が最終的にすべての agent から観測可能になることを保証する。

9.9 WeakRef および FinalizationRegistry Target の Processing Model

9.9.1 目的

この仕様は、いかなる object や symbol も garbage collected されることを保証しない。live でない object や symbol は、長い時間の後に解放されることもあれば、まったく解放されないこともある。この理由により、この仕様では、garbage collection によって引き起こされる挙動を記述する際に "may" という語を用いる。

WeakRef および FinalizationRegistry の意味論は、特定の時点で起こる 2 つの操作に基づいている:

  • WeakRef.prototype.deref が呼び出されると、referent は(undefined が返されない場合)その後の同期的アクセスも同じ値を返すように生存維持される。この list は、ClearKeptObjects 抽象操作を用いた同期 work の完了時に reset される。
  • FinalizationRegistry に登録された object または symbol が到達不能になると、その FinalizationRegistry の cleanup callback の呼出しが、同期的 ECMAScript 実行の完了後、最終的に行われる場合がある。FinalizationRegistry cleanup は CleanupFinalizationRegistry 抽象操作によって実行される。

これら 2 つの action(ClearKeptObjects または CleanupFinalizationRegistry)のいずれも、同期的 ECMAScript 実行を中断してはならない。host はより長い同期的 ECMAScript 実行列を組み立て得るため、この仕様は ClearKeptObjects および CleanupFinalizationRegistry のスケジューリングを host environment に委ねる。

一部の ECMAScript 実装には、ECMAScript が idle のときも含めて background で動作する garbage collector 実装が含まれる。host environmentCleanupFinalizationRegistry のスケジューリングを許すことで、finalizer work を実行するために ECMAScript 実行を再開でき、それにより held value を解放して、全体の memory 使用量を削減できる。

9.9.2 Liveness

ある object および/または symbol の集合 objectSet に対して、objectSet に関する 仮想的 WeakRef-oblivious execution とは、referent が objectSet の要素である WeakRef に対する抽象操作 WeakRefDeref が常に undefined を返す execution のことである。

Note 1
WeakRef-obliviousness は、liveness とともに、2 つの概念を捉える。1 つは WeakRef 自身がその referent を生存維持しないということ。もう 1 つは、liveness における cycle が値の live 性を含意しないということである。具体的に言えば、v の liveness の決定が WeakRef referent r の liveness の決定に依存する場合、r の liveness は v の liveness を仮定してはならず、それは循環論法になる。
Note 2
WeakRef-obliviousness が個々の値ではなく object または symbol の集合に対して定義されるのは、cycle を考慮するためである。もし個々の値に対して定義されたなら、cycle 内の WeakRef referent は、その identity が cycle 内の他の WeakRef referent を通じてのみ観測されるにもかかわらず、live とみなされてしまう。
Note 3
慣用的には、ある個々の object または symbol は、それを含むすべての集合が live であるなら live であると言う。

評価中の任意の時点で、ある object および/または symbol の集合 objectSet は、次のいずれかの条件を満たすなら live とみなされる:

  • objectSet のいずれかの要素が、いずれかの agent[[KeptAlive]] List に含まれている。
  • objectSet に関する有効な将来の仮想的 WeakRef-oblivious execution が存在し、その execution が objectSet 内のいずれかの値の identity を観測する。
Note 4
上記 2 番目の条件は、値の identity が非 WeakRef の手段により観測可能であるならその値は live である、という直観を捉えることを意図している。値の identity は、strict equality 比較を観測すること、またはその値が Map の key として用いられていることを観測することで観測され得る。
Note 5

field、internal slot、または property の中に object または symbol が存在することは、その値が live であることを含意しない。たとえば、その値が program に一度も返されないなら、それは観測できない。

これは WeakMap の key、WeakSet の member、ならびに FinalizationRegistry Cell record の [[WeakRefTarget]] および [[UnregisterToken]] フィールドについて該当する。

上記の定義は、WeakMap 内の key が live でない場合、その対応する value も必ずしも live ではないことを含意する。

Note 6
Liveness は、engine が empty にしてはならない WeakRef を保証するための下限である。ここで定義される liveness は決定不能である。実際には、engine は reachability のような保守的近似を用いる。実装にはかなりの裁量があると期待される。

9.9.3 Execution

任意の時点で、ある object および/または symbol の集合 objectSetlive でないなら、ECMAScript 実装は次の手順を原子的に実行してよい:

  1. objectSet の各要素 value について、次を行う
    1. ref.[[WeakRefTarget]]value である各 WeakRef ref について、次を行う
      1. ref.[[WeakRefTarget]]empty に設定する。
    2. fg.[[Cells]]cell.[[WeakRefTarget]]value である Record cell を含む各 FinalizationRegistry fg について、次を行う
      1. cell.[[WeakRefTarget]]empty に設定する。
      2. 任意で、HostEnqueueFinalizationRegistryCleanupJob(fg) を実行する。
    3. map.[[WeakMapData]]r.[[Key]]value である Record r を含む各 WeakMap map について、次を行う
      1. r.[[Key]]empty に設定する。
      2. r.[[Value]]empty に設定する。
    4. set.[[WeakSetData]]value を含む各 WeakSet set について、次を行う
      1. set.[[WeakSetData]] において値が value である要素を、値が empty である要素で置き換える。
Note 1

liveness の定義とあわせて、この節は、WeakRef に関して実装が適用してよい最適化を規定する。

object の identity を観測せずにその object にアクセスすることは可能である。identity が観測されない非 escape object の property に対する dead variable elimination や scalar replacement のような最適化は許される。したがって、これらの最適化は、そのような object を指す WeakRef を観測可能に empty にしてよい。

一方で、object の identity が観測可能であり、かつその object が WeakRef[[WeakRefTarget]] internal slot に入っている場合、その WeakRef を観測可能に empty にする rematerialization のような最適化は禁止される。

HostEnqueueFinalizationRegistryCleanupJob の呼出しは optional であるため、FinalizationRegistry に登録された object がその FinalizationRegistry 自体を必ずしも live に保つわけではない。実装は、たとえば FinalizationRegistry 自体が dead になった場合や、application が shutdown 中である場合など、どのような理由でも FinalizationRegistry callback を省略してよい。

Note 2

実装は、非 live な object または symbol の極大集合に対して WeakRef を empty にする義務を負わない。

実装が WeakRef を empty にする対象として非 live 集合 objectSet を選んだ場合、この定義は、その objectSet に含まれるすべての値に対する WeakRef を同時に empty にすることを要求する。言い換えると、値 v を指す WeakRef を empty にする一方で、empty にしない場合に v の値を観測する execution が成立し得る他の WeakRef を empty にしないままにすることは、適合しない。

9.9.4 Host Hook

9.9.4.1 HostEnqueueFinalizationRegistryCleanupJob ( finalizationRegistry )

The host-defined abstract operation HostEnqueueFinalizationRegistryCleanupJob takes argument finalizationRegistry (a FinalizationRegistry) and returns unused.

cleanupJob を、引数を持たない新しい Job Abstract Closure であり、finalizationRegistry を capture し、呼び出されたとき次の手順を実行するものとする:

  1. cleanupResultCompletion(CleanupFinalizationRegistry(finalizationRegistry)) とする。
  2. cleanupResultabrupt completion なら、エラー報告のための任意の host-defined 手順を実行する。
  3. unused を返す。

HostEnqueueFinalizationRegistryCleanupJob の実装は、可能であれば cleanupJob が将来のある時点で実行されるようスケジュールする。また、9.5 の要件にも適合しなければならない。

9.10 ClearKeptObjects ( )

The abstract operation ClearKeptObjects takes no arguments and returns unused. ECMAScript 実装は、同期的な ECMAScript 実行列が完了したときに ClearKeptObjects を呼び出すことが期待される。 It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Record とする。
  2. agentRecord.[[KeptAlive]] を新しい空の List に設定する。
  3. unused を返す。

9.11 AddToKeptObjects ( value )

The abstract operation AddToKeptObjects takes argument value (an Object or a Symbol) and returns unused. It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Record とする。
  2. valueagentRecord.[[KeptAlive]] に append する。
  3. unused を返す。
Note
抽象操作 AddToKeptObjects が target object または symbol とともに呼び出されると、その target は、ClearKeptObjects が呼び出されるまでその target を強く参照する list に追加される。

9.12 CleanupFinalizationRegistry ( finalizationRegistry )

The abstract operation CleanupFinalizationRegistry takes argument finalizationRegistry (a FinalizationRegistry) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. Assert: finalizationRegistry[[Cells]] および [[CleanupCallback]] internal slot を持つ。
  2. callbackfinalizationRegistry.[[CleanupCallback]] とする。
  3. finalizationRegistry.[[Cells]]cell.[[WeakRefTarget]]empty である Record cell を含む間、実装は次の手順を実行してよい:
    1. そのような cell を任意に選ぶ。
    2. cellfinalizationRegistry.[[Cells]] から除去する。
    3. HostCallJobCallback(callback, undefined, « cell.[[HeldValue]] ») を実行する。
  4. unused を返す。

9.13 CanBeHeldWeakly ( v )

The abstract operation CanBeHeldWeakly takes argument v (an ECMAScript language value) and returns a Boolean. これは、v が weak reference として使うのに適している場合に限り true を返す。weak reference として使うのに適した値だけが、WeakMap の key、WeakSet の element、WeakRef の target、または FinalizationRegistry の target の 1 つになり得る。 It performs the following steps when called:

  1. v が Object なら、true を返す。
  2. v が Symbol であり、かつ KeyForSymbol(v) が undefined なら、true を返す。
  3. false を返す。
Note

language identity を持たない language value は、事前参照なしに出現し得るため、weak reference として使うには不適切である。Symbol.for によって生成された Symbol 値は、他の Symbol 値と異なり、language identity を持たず、weak reference として使うには不適切である。well-known symbol はおそらく決して collected されないが、数が限られており、したがって多様な実装手法で扱いやすいため、それでも weak reference として使うのに適しているものとして扱われる。しかし、live な WeakMap において well-known symbol に関連付けられた値は collected されにくく、実装において memory resource を “leak” し得る。

10 通常および特殊なオブジェクトの挙動

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

すべての通常オブジェクトは [[Prototype]] と呼ばれる内部 スロットを持つ。この内部スロットの値は null またはオ ブジェクトのいずれかであり、継承を実装するために用いられ る。通常オブジェクト obj から propertyKey という名 前のプロパティが欠けているが、その [[Prototype]] オブジ ェクト上には存在していると仮定する。propertyKey[[Prototype]] オブジェクト上のデータプロパティを参照す る場合、obj は get アクセスについてそれを継承し、 propertyKeyobj のプロパティであるかのように振 る舞う。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 は通常オブジェク ト、propertyKeyproperty key 値、value は任意 の ECMAScript 言語値、そして descProperty Descriptor レコードであると仮定する。

各通常オブジェクト内部メソッドは、同様の名前を持つ抽象操 作へ委譲する。そのような抽象操作が別の内部メソッドに依存 する場合、その内部メソッドは、同様の名前を持つ抽象操作を 直接呼び出すのではなく obj に対して呼び出される。これ らの意味論により、通常オブジェクト内部メソッドが特殊オブ ジェクトに適用されたとき、それらの上書きされた内部メソッ ドが呼び出されることが保証される。

10.1.1 [[GetPrototypeOf]] ( )

The [[GetPrototypeOf]] internal method of an ordinary object obj takes no arguments and returns a normal completion containing either an Object or null. It performs the following steps when called:

  1. OrdinaryGetPrototypeOf(obj) を返す。

10.1.1.1 OrdinaryGetPrototypeOf ( obj )

The abstract operation OrdinaryGetPrototypeOf takes argument obj (an Object) and returns an Object or null. It performs the following steps when called:

  1. obj.[[Prototype]] を返す。

10.1.2 [[SetPrototypeOf]] ( proto )

The [[SetPrototypeOf]] internal method of an ordinary object obj takes argument proto (an Object or null) and returns a normal completion containing a Boolean. It performs the following steps when called:

  1. OrdinarySetPrototypeOf(obj, proto) を返す。

10.1.2.1 OrdinarySetPrototypeOf ( obj, proto )

The abstract operation OrdinarySetPrototypeOf takes arguments obj (an Object) and proto (an Object or null) and returns a Boolean. It performs the following steps when called:

  1. currentobj.[[Prototype]] とする。
  2. SameValue(proto, current) が true なら、true を返す。
  3. extensibleobj.[[Extensible]] とする。
  4. extensiblefalse なら、false を返す。
  5. cursorproto とする。
  6. donefalse とする。
  7. donefalse の間、繰り返す
    1. cursornull なら、
      1. donetrue に設定する。
    2. Else if SameValue(cursor, obj) が true なら、
      1. false を返す。
    3. Else,
      1. cursor.[[GetPrototypeOf]]10.1.1 で定義された通常オブジェクト内部メソッドで なければ、donetrue に設定する。
      2. Else, cursorcursor.[[Prototype]] に設定 する。
  8. obj.[[Prototype]]proto に設定する。
  9. true を返す。
Note

手順 7 のループは、[[GetPrototypeOf]][[SetPrototypeOf]] に通常オブジェクト定義を用いるオ ブジェクトのみを含む prototype chain に循環が生じないこ とを保証する。

10.1.3 [[IsExtensible]] ( )

The [[IsExtensible]] internal method of an ordinary object obj takes no arguments and returns a normal completion containing a Boolean. It performs the following steps when called:

  1. OrdinaryIsExtensible(obj) を返す。

10.1.3.1 OrdinaryIsExtensible ( obj )

The abstract operation OrdinaryIsExtensible takes argument obj (an Object) and returns a Boolean. It performs the following steps when called:

  1. obj.[[Extensible]] を返す。

10.1.4 [[PreventExtensions]] ( )

The [[PreventExtensions]] internal method of an ordinary object obj takes no arguments and returns a normal completion containing true. It performs the following steps when called:

  1. OrdinaryPreventExtensions(obj) を返す。

10.1.4.1 OrdinaryPreventExtensions ( obj )

The abstract operation OrdinaryPreventExtensions takes argument obj (an Object) and returns true. It performs the following steps when called:

  1. obj.[[Extensible]]false に設定する。
  2. true を返す。

10.1.5 [[GetOwnProperty]] ( propertyKey )

The [[GetOwnProperty]] internal method of an ordinary object obj takes argument propertyKey (a property key) and returns a normal completion containing either a Property Descriptor or undefined. It performs the following steps when called:

  1. OrdinaryGetOwnProperty(obj, propertyKey) を返す。

10.1.5.1 OrdinaryGetOwnProperty ( obj, propertyKey )

The abstract operation OrdinaryGetOwnProperty takes arguments obj (an Object) and propertyKey (a property key) and returns a Property Descriptor or undefined. It performs the following steps when called:

  1. obj が key propertyKey を持つ own property を 持たないなら、undefined を返す。
  2. desc を、フィールドを持たない新しく作成された Property Descriptor とする。
  3. ownProperty を、key が propertyKey である obj の own property とする。
  4. ownPropertydata property なら、
    1. desc.[[Value]]ownProperty[[Value]] 属性の値に設定する。
    2. desc.[[Writable]]ownProperty[[Writable]] 属性の値に設定する。
  5. Else,
    1. Assert: ownPropertyaccessor property で ある。
    2. desc.[[Get]]ownProperty[[Get]] 属性の値に設定する。
    3. desc.[[Set]]ownProperty[[Set]] 属性の値に設定する。
  6. desc.[[Enumerable]]ownProperty[[Enumerable]] 属性の値に設定する。
  7. desc.[[Configurable]]ownProperty[[Configurable]] 属性の値に設定する。
  8. desc を返す。

10.1.6 [[DefineOwnProperty]] ( propertyKey, desc )

The [[DefineOwnProperty]] internal method of an ordinary object obj takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. OrdinaryDefineOwnProperty(obj, propertyKey, desc) を返す。

10.1.6.1 OrdinaryDefineOwnProperty ( obj, propertyKey, desc )

The abstract operation OrdinaryDefineOwnProperty takes arguments obj (an Object), propertyKey (a property key), and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. current を ? obj.[[GetOwnProperty]](propertyKey) とする。
  2. extensible を ? IsExtensible(obj) とする。
  3. ValidateAndApplyPropertyDescriptor(obj, propertyKey, extensible, desc, current) を 返す。

10.1.6.2 IsCompatiblePropertyDescriptor ( extensible, desc, current )

The abstract operation IsCompatiblePropertyDescriptor takes arguments extensible (a Boolean), desc (a Property Descriptor), and current (a Property Descriptor or undefined) and returns a Boolean. It performs the following steps when called:

  1. ValidateAndApplyPropertyDescriptor(undefined, "", extensible, desc, current) を返す。

10.1.6.3 ValidateAndApplyPropertyDescriptor ( obj, propertyKey, extensible, desc, current )

The abstract operation ValidateAndApplyPropertyDescriptor takes arguments obj (an Object or undefined), propertyKey (a property key), extensible (a Boolean), desc (a Property Descriptor), and current (a Property Descriptor or undefined) and returns a Boolean. これは、desc が、指定された extensibility と現 在のプロパティ current を持つオブジェクトのプロパティと して、不変条件を保ちながら 適用できる場合に限り true を返す。そのような適用が可能 であり、かつ objundefined でない場合、それは propertyKey という名前のプロパティ(必要であれば作成 される)に対して実行される。 It performs the following steps when called:

  1. Assert: propertyKeyproperty key である。
  2. currentundefined なら、
    1. extensiblefalse なら、false を返す。
    2. objundefined なら、true を返す。
    3. IsAccessorDescriptor(desc) が true なら、
      1. objpropertyKey という名前の own accessor property を作成し、その [[Get]][[Set]][[Enumerable]][[Configurable]] 属性を、desc がそのフィールドを持つ場合は 対応する値に、そうでなければその属性の 既定値 に設定する。
    4. Else,
      1. objpropertyKey という名前の own data property を作成し、その [[Value]][[Writable]][[Enumerable]][[Configurable]] 属性を、desc がそのフィ ールドを持つ場合は対応する値に、そうでなけれ ばその属性の 既定値 に設定 する。
    5. true を返す。
  3. Assert: current は fully populated な Property Descriptor である。
  4. desc がいかなるフィールドも持たないなら、 true を返す。
  5. current.[[Configurable]]false なら、
    1. desc[[Configurable]] フィールドを持ち、 かつ desc.[[Configurable]]true なら、 false を返す。
    2. desc[[Enumerable]] フィールドを持ち、 かつ desc.[[Enumerable]]current.[[Enumerable]] と異なるなら、false を返す。
    3. IsGenericDescriptor(desc) が false であり、 かつ IsAccessorDescriptor(desc) が IsAccessorDescriptor(current) と異なるなら、 false を返す。
    4. IsAccessorDescriptor(current) が true なら、
      1. desc[[Get]] フィールドを持ち、かつ SameValue(desc.[[Get]], current.[[Get]]) が false なら、false を返す。
      2. desc[[Set]] フィールドを持ち、かつ SameValue(desc.[[Set]], current.[[Set]]) が false なら、false を返す。
    5. Else if current.[[Writable]]false なら、
      1. desc[[Writable]] フィールドを持ち、かつ desc.[[Writable]]true なら、false を返す。
      2. NOTE: SameValueNaN 値に対して true を返すが、これは他の手段で区別できる場合があ る。ここで返ることにより、obj の既存プロパ ティが変更されないことが保証される。
      3. desc[[Value]] フィールドを持つなら、 SameValue(desc.[[Value]], current.[[Value]]) を返す。
  6. objundefined でないなら、
    1. IsDataDescriptor(current) が true であり、 かつ IsAccessorDescriptor(desc) が true なら、
      1. desc[[Configurable]] フィールドを持つ なら、configurabledesc.[[Configurable]] とする; そうでなけれ ば configurablecurrent.[[Configurable]] とする。
      2. desc[[Enumerable]] フィールドを持つな ら、enumerabledesc.[[Enumerable]] と する; そうでなければ enumerablecurrent.[[Enumerable]] とする。
      3. objpropertyKey という名前のプロパ ティを accessor property に置き換え、その [[Configurable]] および [[Enumerable]] 属性 をそれぞれ configurable および enumerable に設定し、[[Get]] および [[Set]] 属性を、desc がそのフィールドを持 つ場合は対応する値に、そうでなければその属性 の 既定値 に設定する。
    2. Else if IsAccessorDescriptor(current) が true であり、かつ IsDataDescriptor(desc) が true なら、
      1. desc[[Configurable]] フィールドを持つ なら、configurabledesc.[[Configurable]] とする; そうでなけれ ば configurablecurrent.[[Configurable]] とする。
      2. desc[[Enumerable]] フィールドを持つな ら、enumerabledesc.[[Enumerable]] と する; そうでなければ enumerablecurrent.[[Enumerable]] とする。
      3. objpropertyKey という名前のプロパ ティを data property に置き換え、その [[Configurable]] および [[Enumerable]] 属性 をそれぞれ configurable および enumerable に設定し、[[Value]] および [[Writable]] 属性を、desc がそのフィールド を持つ場合は対応する値に、そうでなければその 属性の 既定値 に設定する。
    3. Else,
      1. desc の各フィールド名 fieldName につい て、objpropertyKey という名前のプロ パティの fieldName という属性を、 descfieldName フィールドの値に設定 する。
  7. true を返す。

10.1.7 [[HasProperty]] ( propertyKey )

The [[HasProperty]] internal method of an ordinary object obj takes argument propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. OrdinaryHasProperty(obj, propertyKey) を返 す。

10.1.7.1 OrdinaryHasProperty ( obj, propertyKey )

The abstract operation OrdinaryHasProperty takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. hasOwn を ? obj.[[GetOwnProperty]](propertyKey) とする。
  2. hasOwnundefined でなければ、true を返 す。
  3. parent を ? obj.[[GetPrototypeOf]]() とする。
  4. parentnull でなければ、
    1. parent.[[HasProperty]](propertyKey) を返す。
  5. false を返す。

10.1.8 [[Get]] ( propertyKey, receiver )

The [[Get]] internal method of an ordinary object obj takes arguments propertyKey (a property key) and receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. OrdinaryGet(obj, propertyKey, receiver) を返 す。

10.1.8.1 OrdinaryGet ( obj, propertyKey, receiver )

The abstract operation OrdinaryGet takes arguments obj (an Object), propertyKey (a property key), and receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. desc を ? obj.[[GetOwnProperty]](propertyKey) とする。
  2. descundefined なら、
    1. parent を ? obj.[[GetPrototypeOf]]() とする。
    2. parentnull なら、undefined を返す。
    3. parent.[[Get]](propertyKey, receiver) を返す。
  3. IsDataDescriptor(desc) が true なら、 desc.[[Value]] を返す。
  4. Assert: IsAccessorDescriptor(desc) is true.
  5. getterdesc.[[Get]] とする。
  6. getterundefined なら、undefined を返す。
  7. Call(getter, receiver) を返す。

10.1.9 [[Set]] ( propertyKey, value, receiver )

The [[Set]] internal method of an ordinary object obj takes arguments propertyKey (a property key), value (an ECMAScript language value), and receiver (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. OrdinarySet(obj, propertyKey, value, receiver) を返す。

10.1.9.1 OrdinarySet ( obj, propertyKey, value, receiver )

The abstract operation OrdinarySet takes arguments obj (an Object), propertyKey (a property key), value (an ECMAScript language value), and receiver (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ownDesc を ? obj.[[GetOwnProperty]](propertyKey) とする。
  2. OrdinarySetWithOwnDescriptor(obj, propertyKey, value, receiver, ownDesc) を返す。

10.1.9.2 OrdinarySetWithOwnDescriptor ( obj, propertyKey, value, receiver, ownDesc )

The abstract operation OrdinarySetWithOwnDescriptor takes arguments obj (an Object), propertyKey (a property key), value (an ECMAScript language value), receiver (an ECMAScript language value), and ownDesc (a Property Descriptor or undefined) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ownDescundefined なら、
    1. parent を ? obj.[[GetPrototypeOf]]() とする。
    2. parentnull でなければ、 ? parent.[[Set]](propertyKey, value, receiver) を返す。
    3. ownDesc を PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } に設定する。
  2. IsDataDescriptor(ownDesc) が true なら、
    1. ownDesc.[[Writable]]false なら、false を返す。
    2. receiver が Object でなければ、false を返 す。
    3. existingDescriptor を ? receiver.[[GetOwnProperty]](propertyKey) とする。
    4. existingDescriptorundefined なら、
      1. Assert: receiver は現在 propertyKey という プロパティを持たない。
      2. CreateDataProperty(receiver, propertyKey, value) を返す。
    5. IsAccessorDescriptor(existingDescriptor) が true なら、false を返す。
    6. existingDescriptor.[[Writable]]false な ら、false を返す。
    7. valueDesc を PropertyDescriptor { [[Value]]: value } とする。
    8. receiver.[[DefineOwnProperty]](propertyKey, valueDesc) を返す。
  3. Assert: IsAccessorDescriptor(ownDesc) is true.
  4. setterownDesc.[[Set]] とする。
  5. setterundefined なら、false を返す。
  6. Call(setter, receiver, « value ») を実行す る。
  7. true を返す。

10.1.10 [[Delete]] ( propertyKey )

The [[Delete]] internal method of an ordinary object obj takes argument propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. OrdinaryDelete(obj, propertyKey) を返す。

10.1.10.1 OrdinaryDelete ( obj, propertyKey )

The abstract operation OrdinaryDelete takes arguments obj (an Object) and propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. desc を ? obj.[[GetOwnProperty]](propertyKey) とする。
  2. descundefined なら、true を返す。
  3. desc.[[Configurable]]true なら、
    1. obj から名前が propertyKey である own property を除去する。
    2. true を返す。
  4. false を返す。

10.1.11 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of an ordinary object obj takes no arguments and returns a normal completion containing a List of property keys. It performs the following steps when called:

  1. OrdinaryOwnPropertyKeys(obj) を返す。

10.1.11.1 OrdinaryOwnPropertyKeys ( obj )

The abstract operation OrdinaryOwnPropertyKeys takes argument obj (an Object) and returns a List of property keys. It performs the following steps when called:

  1. keys を新しい空の List とする。
  2. obj の各 own property key propertyKey につい て、propertyKeyarray index であるものを、 数値 index 昇順で処理し、
    1. propertyKeykeys に append する。
  3. obj の各 own property key propertyKey につい て、propertyKey が String であり、かつ array index ではないものを、プロパティ作成時刻の 昇順で処理し、
    1. propertyKeykeys に append する。
  4. obj の各 own property key propertyKey につい て、propertyKey が Symbol であるものを、プロ パティ作成時刻の昇順で処理し、
    1. propertyKeykeys に append する。
  5. keys を返す。

10.1.12 OrdinaryObjectCreate ( proto [ , additionalInternalSlotsList ] )

The abstract operation OrdinaryObjectCreate takes argument proto (an Object or null) and optional argument additionalInternalSlotsList (a List of names of internal slots) and returns an Object. これは、新しい通常オブジェクトの実行時作成を規定する ために用いられる。additionalInternalSlotsList は、 [[Prototype]][[Extensible]] に加えて、そのオブジェ クトの一部として定義されなければならない追加内部スロット の名前を含む。additionalInternalSlotsList が与えられ ない場合、新しい空の List が用いられる。 It performs the following steps when called:

  1. internalSlotsList を « [[Prototype]], [[Extensible]] » とする。
  2. additionalInternalSlotsList が存在する場合、 internalSlotsListinternalSlotsListadditionalInternalSlotsListlist-concatenation に設定する。
  3. objMakeBasicObject(internalSlotsList) と する。
  4. obj.[[Prototype]]proto に設定する。
  5. obj を返す。
Note

OrdinaryObjectCreate は MakeBasicObject を呼び出す以 上のことはほとんど行わないが、その使用は特殊オブジェクト ではなく通常オブジェクトを作成する意図を伝える。したがっ て、この仕様では、その後にオブジェクトの内部メソッドを変 更して結果を非通常なものにするようなアルゴリズムからは呼 び出されない。特殊オブジェクトを作成する操作は MakeBasicObject を直接呼び出す。

10.1.13 OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] )

The abstract operation OrdinaryCreateFromConstructor takes arguments constructor (a function object) and intrinsicDefaultProto (a String) and optional argument internalSlotsList (a List of names of internal slots) and returns either a normal completion containing an Object or a throw completion. これは、[[Prototype]] 値が constructor"prototype" プロパティから取得される通常オブジェクトを 作成する。存在しない場合は、intrinsicDefaultProto に よって指定された intrinsic が [[Prototype]] に用いられ る。internalSlotsList は、そのオブジェクトの一部とし て定義されなければならない追加内部スロットの名前を含む。 internalSlotsList が与えられない場合、新しい空の List が用いられる。 It performs the following steps when called:

  1. Assert: intrinsicDefaultProto は、この仕様にお ける intrinsic object の名前である。対応する object は、オブジェクトの [[Prototype]] 値として 使用されることが意図された intrinsic でなければ ならない。
  2. proto を ? GetPrototypeFromConstructor( constructor, intrinsicDefaultProto) とする。
  3. internalSlotsList が存在する場合、slotsListinternalSlotsList とする。
  4. Else, slotsList を新しい空の List とする。
  5. OrdinaryObjectCreate(proto, slotsList) を返 す。

10.1.14 GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto )

The abstract operation GetPrototypeFromConstructor takes arguments constructor (a function object) and intrinsicDefaultProto (a String) and returns either a normal completion containing an Object or a throw completion. これは、特定の constructor に対応するオブジェクト を作成する際に使用すべき [[Prototype]] 値を決定する。そ の値は、存在する場合、constructor"prototype" プロパティから取得される。そうでなければ、 intrinsicDefaultProto によって指定された intrinsic が [[Prototype]] に用いられる。 It performs the following steps when called:

  1. Assert: intrinsicDefaultProto は、この仕様にお ける intrinsic object の名前である。対応する object は、オブジェクトの [[Prototype]] 値として 使用されることが意図された intrinsic でなければ ならない。
  2. proto を ? Get(constructor, "prototype") と する。
  3. proto が Object でないなら、
    1. realm を ? GetFunctionRealm(constructor) とする。
    2. protorealmintrinsicDefaultProto という名前の intrinsic object に設定する。
  4. proto を返す。
Note

constructor[[Prototype]] 値を提供しない場 合、用いられる既定値は、running execution context か らではなく constructor 関数の realm から取得され る。

10.1.15 RequireInternalSlot ( obj, internalSlot )

The abstract operation RequireInternalSlot takes arguments obj (an ECMAScript language value) and internalSlot (an internal slot name) and returns either a normal completion containing unused or a throw completion. これは、obj が Object であり、かつ与えられた internal slot を持つのでない限り例外を送出する。 It performs the following steps when called:

  1. obj が Object でなければ、TypeError 例外を送 出する。
  2. objinternalSlot internal slot を持たなけ れば、TypeError 例外を送出する。
  3. unused を返す。

10.2 ECMAScript 関数オブジェクト

ECMAScript 関数オブジェクトは、レキシカル環境を閉包 した、パラメータ化された ECMAScript コードをカプセル化 し、そのコードの動的評価をサポートする。ECMAScript 関数 オブジェクトは通常オブジェクトであり、他の通常オブジェク トと同じ内部スロットおよび同じ内部メソッドを持つ。 ECMAScript 関数オブジェクトのコードは、strict mode code11.2.2) であっても non-strict code であってもよい。コードが strict mode code である ECMAScript 関数オブジェクト は、strict function と呼ばれる。コードが strict mode code でないものは、 non-strict function と呼ばれる。

[[Extensible]][[Prototype]] に加えて、 ECMAScript 関数オブジェクトは Table 25 に列挙された内部スロットも持つ。

Table 25: Internal Slots of ECMAScript Function Objects
内部スロット 説明
[[Environment]] an Environment Record 関数が閉包した Environment Record。関数のコード を評価する際に outer environment として用いら れる。
[[PrivateEnvironment]] a PrivateEnvironment Record or null 関数が閉包した Private Name のための PrivateEnvironment Record。この関数が構文上 class の内部に含まれていない場合は null。 関数のコードを評価する際、内側の class に対する outer PrivateEnvironment として用いられる。
[[FormalParameters]] a Parse Node 関数の仮引数リストを定義する source text の root parse node。
[[ECMAScriptCode]] a Parse Node 関数本体を定義する source text の root parse node。
[[ConstructorKind]] base or derived 関数が derived class constructor であるかど うか。
[[Realm]] a Realm Record 関数が作成された realm であり、関数評価時にア クセスされる任意の intrinsic object を提供す る。
[[ScriptOrModule]] a Script Record or a Module Record 関数が作成された script または module。
[[ThisMode]] lexical, strict, or global 関数の仮引数およびコード本体内で this 参照 がどのように解釈されるかを定義する。lexical は、this がレキシカルに外側の関数の this 値を参照することを意味する。strict は、 this 値が関数呼出しによって与えられたとおり に正確に使われることを意味する。global は、 undefined または nullthis 値が global object への参照として解釈され、それ以 外の this 値はまず ToObject に渡されること を意味する。
[[Strict]] a Boolean これが strict function であれば truenon-strict function であれば false
[[HomeObject]] an Object or undefined 関数が super を使用する場合、これは super プロパティ探索が開始されるオブジェク トを [[GetPrototypeOf]] が提供する、そのオブ ジェクトである。
[[SourceText]] a sequence of Unicode code points 関数を定義する source text
[[Fields]] a List of ClassFieldDefinition Records 関数が class である場合、これは class の非 static field と、それに対応する initializer を表す Record の list である。
[[PrivateMethods]] a List of PrivateElements 関数が class である場合、これは class の非 static private method および accessor を表 す list である。
[[ClassFieldInitializerName]] a String, a Symbol, a Private Name, or empty 関数が class field の initializer として作 成された場合、その field の NamedEvaluation に使用する名前; それ以外では empty
[[IsClassConstructor]] a Boolean 関数が class constructor であるかどうかを示 す。(true の場合、その関数の [[Call]] を呼 び出すと直ちに TypeError 例外が送出され る。)

すべての ECMAScript 関数オブジェクトは、ここで定義 される [[Call]] 内部メソッドを持つ。さらに constructor でもある ECMAScript 関数は、[[Construct]] 内部メソッ ドも持つ。

10.2.1 [[Call]] ( thisArgument, argumentsList )

The [[Call]] internal method of an ECMAScript function object func takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. callerContextrunning execution context とする。
  2. calleeContextPrepareForOrdinaryCall(func, undefined) とする。
  3. Assert: calleeContext はいま running execution context である。
  4. func.[[IsClassConstructor]]true なら、
    1. error を新しく作成された TypeError object とする。
    2. NOTE: errorcalleeContext において func に関連付けられた Realm Record を用い て作成される。
    3. calleeContextexecution context stack から取り除き、callerContextrunning execution context として復元する。
    4. error を送出する。
  5. OrdinaryCallBindThis(func, calleeContext, thisArgument) を実行する。
  6. resultCompletion( OrdinaryCallEvaluateBody(func, argumentsList)) とする。
  7. calleeContextexecution context stack から取り除き、 callerContextrunning execution context として復元する。
  8. resultreturn completion なら、 result.[[Value]] を返す。
  9. Assert: resultthrow completion であ る。
  10. result を返す。
Note

手順 7 において calleeContextexecution context stack から取り除かれるとき、それ が suspend され、後でアクセス可能な Generator による 再開のために保持されている場合には、破棄してはならな い。

10.2.1.1 PrepareForOrdinaryCall ( func, newTarget )

The abstract operation PrepareForOrdinaryCall takes arguments func (an ECMAScript function object) and newTarget (an Object or undefined) and returns an execution context. It performs the following steps when called:

  1. callerContextrunning execution context とする。
  2. calleeContext を新しい ECMAScript code execution context とする。
  3. calleeContext の Function を func に設 定する。
  4. calleeRealmfunc.[[Realm]] とする。
  5. calleeContextRealmcalleeRealm に 設定する。
  6. calleeContext の ScriptOrModule を func.[[ScriptOrModule]] に設定する。
  7. localEnvNewFunctionEnvironment(func, newTarget) とする。
  8. calleeContext の LexicalEnvironment を localEnv に設定する。
  9. calleeContext の VariableEnvironment を localEnv に設定する。
  10. calleeContext の PrivateEnvironment を func.[[PrivateEnvironment]] に設定する。
  11. callerContext がまだ suspend されていなけ れば、callerContext を suspend する。
  12. calleeContextexecution context stack に push する; calleeContext はいま running execution context である。
  13. NOTE: これ以降に生成されるいかなる exception object も calleeRealm に関連付けられる。
  14. calleeContext を返す。

10.2.1.2 OrdinaryCallBindThis ( func, calleeContext, thisArgument )

The abstract operation OrdinaryCallBindThis takes arguments func (an ECMAScript function object), calleeContext (an execution context), and thisArgument (an ECMAScript language value) and returns unused. It performs the following steps when called:

  1. thisModefunc.[[ThisMode]] とする。
  2. thisModelexical なら、unused を返す。
  3. calleeRealmfunc.[[Realm]] とする。
  4. localEnvcalleeContext の LexicalEnvironment とする。
  5. thisModestrict なら、
    1. thisValuethisArgument とする。
  6. Else,
    1. thisArgumentundefined または null のいずれかなら、
      1. globalEnvcalleeRealm.[[GlobalEnv]] とする。
      2. Assert: globalEnvGlobal Environment Record である。
      3. thisValueglobalEnv.[[GlobalThisValue]] とする。
    2. Else,
      1. thisValue を ! ToObject(thisArgument) とする。
      2. NOTE: ToObjectcalleeRealm を用いて wrapper object を生成する。
  7. Assert: localEnvFunction Environment Record である。
  8. Assert: 次の手順が abrupt completion を返す ことは決してない。なぜなら localEnv.[[ThisBindingStatus]]initialized ではないからである。
  9. BindThisValue(localEnv, thisValue) を 実行する。
  10. unused を返す。

10.2.1.3 Runtime Semantics: EvaluateBody

The syntax-directed operation EvaluateBody takes arguments func (an ECMAScript function object) and argumentsList (a List of ECMAScript language values) and returns a return completion or a throw completion. It is defined piecewise over the following productions:

FunctionBody : FunctionStatementList
  1. func および argumentsList を引数として FunctionBodyEvaluateFunctionBody を ? 返す。
ConciseBody : ExpressionBody
  1. func および argumentsList を引数として ConciseBodyEvaluateConciseBody を ? 返す。
GeneratorBody : FunctionBody
  1. func および argumentsList を引数として GeneratorBodyEvaluateGeneratorBody を ? 返す。
AsyncGeneratorBody : FunctionBody
  1. func および argumentsList を引数として AsyncGeneratorBodyEvaluateAsyncGeneratorBody を ? 返す。
AsyncFunctionBody : FunctionBody
  1. func および argumentsList を引数として AsyncFunctionBodyEvaluateAsyncFunctionBody を ? 返す。
AsyncConciseBody : ExpressionBody
  1. func および argumentsList を引数として AsyncConciseBodyEvaluateAsyncConciseBody を ? 返す。
Initializer : = AssignmentExpression
  1. Assert: argumentsList は空である。
  2. Assert: func.[[ClassFieldInitializerName]]empty ではない。
  3. IsAnonymousFunctionDefinition( AssignmentExpression) が true なら、
    1. value を、func.[[ClassFieldInitializerName]] を引数とする InitializerNamedEvaluation の ? とする。
  4. Else,
    1. rhsAssignmentExpression の ? Evaluation とする。
    2. value を ? GetValue(rhs) とする。
  5. ReturnCompletion(value) を返す。
Note

field initializer は関数境界を構成するが、 FunctionDeclarationInstantiation を呼び出しても観測 可能な効果はないため、省略される。

ClassStaticBlockBody : ClassStaticBlockStatementList
  1. Assert: argumentsList は空である。
  2. func を引数として ClassStaticBlockBodyEvaluateClassStaticBlockBody を ? 返す。

10.2.1.4 OrdinaryCallEvaluateBody ( func, argumentsList )

The abstract operation OrdinaryCallEvaluateBody takes arguments func (an ECMAScript function object) and argumentsList (a List of ECMAScript language values) and returns a return completion or a throw completion. It performs the following steps when called:

  1. func および argumentsList を引数として func.[[ECMAScriptCode]]EvaluateBody を ? 返す。

10.2.2 [[Construct]] ( argumentsList, newTarget )

The [[Construct]] internal method of an ECMAScript function object func takes arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. callerContextrunning execution context とする。
  2. kindfunc.[[ConstructorKind]] とする。
  3. kindbase なら、
    1. thisArgument を ? OrdinaryCreateFromConstructor(newTarget, "%Object.prototype%") とする。
  4. calleeContextPrepareForOrdinaryCall(func, newTarget) とす る。
  5. Assert: calleeContext はいま running execution context である。
  6. kindbase なら、
    1. OrdinaryCallBindThis(func, calleeContext, thisArgument) を実行する。
    2. initializeResultCompletion( InitializeInstanceElements(thisArgument, func)) とする。
    3. initializeResultabrupt completion なら、
      1. calleeContextexecution context stack から取り除き、callerContextrunning execution context として復元する。
      2. initializeResult を返す。
  7. constructorEnvcalleeContext の LexicalEnvironment とする。
  8. resultCompletion( OrdinaryCallEvaluateBody(func, argumentsList)) とする。
  9. calleeContextexecution context stack から取り除き、callerContextrunning execution context として復元する。
  10. resultthrow completion なら、
    1. result を返す。
  11. Assert: resultreturn completion であ る。
  12. result.[[Value]] が Object なら、 result.[[Value]] を返す。
  13. kindbase なら、thisArgument を返す。
  14. result.[[Value]]undefined でないなら、 TypeError 例外を送出する。
  15. thisBinding を ? constructorEnv.GetThisBinding() とする。
  16. Assert: thisBinding は Object である。
  17. thisBinding を返す。

10.2.3 OrdinaryFunctionCreate ( functionPrototype, sourceText, parameterList, body, thisMode, env, privateEnv )

The abstract operation OrdinaryFunctionCreate takes arguments functionPrototype (an Object), sourceText (a sequence of Unicode code points), parameterList (a Parse Node), body (a Parse Node), thisMode (lexical-this or non-lexical-this), env (an Environment Record), and privateEnv (a PrivateEnvironment Record or null) and returns an ECMAScript function object. これは、既定の [[Call]] 内部メソッドを持ち、 [[Construct]] 内部メソッドを持たない(ただし MakeConstructor のような操作によって後から追加される 場合はある)新しい関数の実行時作成を規定するために用いら れる。sourceText は、作成される関数の構文定義の source text である。 It performs the following steps when called:

  1. internalSlotsListTable 25 に列挙された内部スロットとする。
  2. funcOrdinaryObjectCreate( functionPrototype, internalSlotsList) とす る。
  3. func.[[Call]]10.2.1 で規定された定義に設定する。
  4. func.[[SourceText]]sourceText に設定す る。
  5. func.[[FormalParameters]]parameterList に設定する。
  6. func.[[ECMAScriptCode]]body に設定する。
  7. strictIsStrict(body) とする。
  8. func.[[Strict]]strict に設定する。
  9. thisModelexical-this なら、 func.[[ThisMode]]lexical に設定する。
  10. Else if stricttrue なら、 func.[[ThisMode]]strict に設定する。
  11. Else, func.[[ThisMode]]global に設定す る。
  12. func.[[IsClassConstructor]]false に設 定する。
  13. func.[[Environment]]env に設定する。
  14. func.[[PrivateEnvironment]]privateEnv に設定する。
  15. func.[[ScriptOrModule]]GetActiveScriptOrModule() に設定する。
  16. func.[[Realm]]current Realm Record に 設定する。
  17. func.[[HomeObject]]undefined に設定す る。
  18. func.[[Fields]] を新しい空の List に設定す る。
  19. func.[[PrivateMethods]] を新しい空の List に 設定する。
  20. func.[[ClassFieldInitializerName]]empty に設定する。
  21. lenparameterListExpectedArgumentCount とする。
  22. SetFunctionLength(func, len) を実行する。
  23. func を返す。

10.2.4 AddRestrictedFunctionProperties ( func, realm )

The abstract operation AddRestrictedFunctionProperties takes arguments func (a function object) and realm (a Realm Record) and returns unused. It performs the following steps when called:

  1. Assert: realm.[[Intrinsics]].[[%ThrowTypeError%]] は存在し、かつ初期化されている。
  2. throwerrealm.[[Intrinsics]].[[%ThrowTypeError%]] とす る。
  3. DefinePropertyOrThrow(func, "caller", PropertyDescriptor { [[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  4. DefinePropertyOrThrow(func, "arguments", PropertyDescriptor { [[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  5. unused を返す。

10.2.4.1 %ThrowTypeError% ( )

この関数は %ThrowTypeError% intrinsic object である。

これは、各 realm ごとに 1 度定義される匿名の built-in function object である。

呼び出されると、次の手順を実行する:

  1. TypeError 例外を送出する。

この関数の [[Extensible]] 内部スロットの値は false である。

この関数の "length" プロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } という属性を持つ。

この関数の "name" プロパティは { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } という属性を持つ。

10.2.5 MakeConstructor ( func [ , writablePrototype [ , prototype ] ] )

The abstract operation MakeConstructor takes argument func (an ECMAScript function object or a built-in function object) and optional arguments writablePrototype (a Boolean) and prototype (an Object) and returns unused. これは funcconstructor に変換する。 It performs the following steps when called:

  1. func が ECMAScript function object なら、
    1. Assert: IsConstructor(func) is false.
    2. Assert: func"prototype" own property を持たない拡張可能オブジェクトである。
    3. func.[[Construct]]10.2.2 で規定された定義に設定する。
  2. Else,
    1. func.[[Construct]]10.3.2 で規定された定義に設定する。
  3. func.[[ConstructorKind]]base に設定する。
  4. writablePrototype が存在しないなら、 writablePrototypetrue に設定する。
  5. prototype が存在しないなら、
    1. prototypeOrdinaryObjectCreate( %Object.prototype%) に設定する。
    2. DefinePropertyOrThrow(prototype, "constructor", PropertyDescriptor { [[Value]]: func, [[Writable]]: writablePrototype, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  6. DefinePropertyOrThrow(func, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: writablePrototype, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  7. unused を返す。

10.2.6 MakeClassConstructor ( func )

The abstract operation MakeClassConstructor takes argument func (an ECMAScript function object) and returns unused. It performs the following steps when called:

  1. Assert: func.[[IsClassConstructor]] is false.
  2. func.[[IsClassConstructor]]true に設定す る。
  3. unused を返す。

10.2.7 MakeMethod ( func, homeObject )

The abstract operation MakeMethod takes arguments func (an ECMAScript function object) and homeObject (an Object) and returns unused. これは func を method として構成する。 It performs the following steps when called:

  1. Assert: homeObject は通常オブジェクトである。
  2. func.[[HomeObject]]homeObject に設定す る。
  3. unused を返す。

10.2.8 DefineMethodProperty ( homeObject, key, closure, enumerable )

The abstract operation DefineMethodProperty takes arguments homeObject (an Object), key (a property key or Private Name), closure (a function object), and enumerable (a Boolean) and returns either a normal completion containing either a PrivateElement or unused, or an abrupt completion. It performs the following steps when called:

  1. Assert: homeObject は通常かつ拡張可能なオブジェ クトである。
  2. keyPrivate Name なら、 PrivateElement { [[Key]]: key, [[Kind]]: method, [[Value]]: closure } を返す。
  3. desc を PropertyDescriptor { [[Value]]: closure, [[Writable]]: true, [[Enumerable]]: enumerable, [[Configurable]]: true } とす る。
  4. DefinePropertyOrThrow(homeObject, key, desc) を実行する。
  5. NOTE: DefinePropertyOrThrowabrupt completion を返すのは、key"prototype" である class static method を定義しようとす る場合に限られる。
  6. unused を返す。

10.2.9 SetFunctionName ( func, name [ , prefix ] )

The abstract operation SetFunctionName takes arguments func (a function object) and name (a property key or Private Name) and optional argument prefix (a String) and returns unused. これは func"name" プロパティを追加する。 It performs the following steps when called:

  1. Assert: func"name" own property を持た ない拡張可能オブジェクトである。
  2. name が Symbol なら、
    1. descriptionname.[[Description]] とす る。
    2. descriptionundefined なら、name を 空の String に設定する。
    3. Else, name"["description"]"string-concatenation に設定す る。
  3. Else if namePrivate Name なら、
    1. namename.[[Description]] に設定す る。
  4. func[[InitialName]] internal slot を持つ なら、
    1. func.[[InitialName]]name に設定する。
  5. prefix が存在するなら、
    1. nameprefix と code unit 0x0020 (SPACE) と namestring-concatenation に設定する。
    2. func[[InitialName]] internal slot を持 つなら、
      1. NOTE: 次の手順における選択は、この抽象操作が 呼び出されるたびに独立して行われる。
      2. 任意で、func.[[InitialName]]name に 設定する。
  6. DefinePropertyOrThrow(func, "name", PropertyDescriptor { [[Value]]: name, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  7. unused を返す。

10.2.10 SetFunctionLength ( func, length )

The abstract operation SetFunctionLength takes arguments func (a function object) and length (a non-negative integer or +∞) and returns unused. これは func"length" プロパティを追加する。 It performs the following steps when called:

  1. Assert: func"length" own property を持 たない拡張可能オブジェクトである。
  2. DefinePropertyOrThrow(func, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  3. unused を返す。

10.2.11 FunctionDeclarationInstantiation ( func, argumentsList )

The abstract operation FunctionDeclarationInstantiation takes arguments func (an ECMAScript function object) and argumentsList (a List of ECMAScript language values) and returns either a normal completion containing unused or a throw completion. funcexecution context が確立される対象の 関数オブジェクトである。

Note

ECMAScript 関数を評価するための execution context が確立されると、新しい Function Environment Record が作成され、各仮引数に対する束縛がその Environment Record においてインスタンス化される。関 数本体内の各宣言もインスタンス化される。関数の仮引数に default value initializer が含まれない場合、本体の宣 言は仮引数と同じ Environment Record 内でインスタンス 化される。default value parameter initializer が 存在する場合、本体の宣言のために 2 つ目の Environment Record が作成される。仮引数および関数は FunctionDeclarationInstantiation の一部として初期 化される。他のすべての束縛は、関数本体の評価中に初期化 される。

呼び出されると、次の手順を実行する:

  1. calleeContextrunning execution context とする。
  2. codefunc.[[ECMAScriptCode]] とする。
  3. strictfunc.[[Strict]] とする。
  4. formalsfunc.[[FormalParameters]] とす る。
  5. parameterNamesformalsBoundNames とする。
  6. parameterNames が重複する要素を持つなら、 hasDuplicatestrue とする; そうでなけ れば hasDuplicatesfalse とする。
  7. simpleParameterListformalsIsSimpleParameterList とする。
  8. hasParameterExpressionsformalsContainsExpression とする。
  9. varNamescodeVarDeclaredNames と する。
  10. varDeclarationscodeVarScopedDeclarations とする。
  11. lexicalNamescodeLexicallyDeclaredNames とする。
  12. functionNames を新しい空の List とする。
  13. functionsToInitialize を新しい空の List とす る。
  14. varDeclarations の各要素 varDecl につい て、List の逆順で、次を行う
    1. varDeclVariableDeclaration でも ForBinding でも BindingIdentifier でも ないなら、
      1. Assert: varDeclFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration のいずれか である。
      2. fnvarDeclBoundNames の唯一の 要素とする。
      3. functionNamesfn を含まないなら、
        1. fnfunctionNames の先頭要素として 挿入する。
        2. NOTE: 同じ名前に対して複数の function declaration がある場合、最後の宣言が用い られる。
        3. varDeclfunctionsToInitialize の先頭要素として挿入する。
  15. argumentsObjectNeededtrue とする。
  16. func.[[ThisMode]]lexical なら、
    1. NOTE: Arrow function は決して arguments object を持たない。
    2. argumentsObjectNeededfalse に設定 する。
  17. Else if parameterNames"arguments" を 含むなら、
    1. argumentsObjectNeededfalse に設定 する。
  18. Else if hasParameterExpressionsfalse なら、
    1. functionNames"arguments" を含むか、 または lexicalNames"arguments" を 含むなら、
      1. argumentsObjectNeededfalse に設 定する。
  19. stricttrue または hasParameterExpressionsfalse なら、
    1. NOTE: strict mode code 内の eval 呼出し は eval の外から見える新しい束縛を作成で きないため、仮引数に対して必要な Environment Record は 1 つだけである。
    2. envcalleeContext の LexicalEnvironment とする。
  20. Else,
    1. NOTE: 仮引数リストにおける direct eval 呼 出しによって作成された束縛が、仮引数が宣言さ れる環境の外側になることを保証するために、別 の Environment Record が必要である。
    2. calleeEnvcalleeContext の LexicalEnvironment とする。
    3. envNewDeclarativeEnvironment( calleeEnv) とする。
    4. Assert: calleeContext の VariableEnvironment と calleeEnv は同 じ Environment Record である。
    5. calleeContext の LexicalEnvironment を env に設定する。
  21. parameterNames の各 String paramName に ついて、次を行う
    1. alreadyDeclared を ! env.HasBinding(paramName) とする。
    2. NOTE: early error により、重複仮引数名が 起こり得るのは、parameter default value や rest parameter を持たない non-strict function に限られる。
    3. alreadyDeclaredfalse なら、
      1. env.CreateMutableBinding(paramName, false) を実行する。
      2. hasDuplicatestrue なら、
        1. env.InitializeBinding(paramName, undefined) を実行する。
  22. argumentsObjectNeededtrue なら、
    1. stricttrue または simpleParameterListfalse なら、
      1. aoCreateUnmappedArgumentsObject( argumentsList) とする。
    2. Else,
      1. NOTE: mapped argument object は、rest parameter、parameter default value initializer、または destructured parameter を持たない non-strict function に対してのみ提供される。
      2. aoCreateMappedArgumentsObject( func, formals, argumentsList, env) とする。
    3. stricttrue なら、
      1. env.CreateImmutableBinding( "arguments", false) を実行する。
      2. NOTE: strict mode code では early error によりこの束縛への代入の試みは防が れるため、その可変性は観測不能である。
    4. Else,
      1. env.CreateMutableBinding( "arguments", false) を実行する。
    5. env.InitializeBinding("arguments", ao) を実行する。
    6. parameterBindingsparameterNames と « "arguments" » の list-concatenation とする。
  23. Else,
    1. parameterBindingsparameterNames とする。
  24. iteratorRecordCreateListIteratorRecord(argumentsList) とす る。
  25. hasDuplicatestrue なら、
    1. usedEnvundefined とする。
  26. Else,
    1. usedEnvenv とする。
  27. NOTE: 次の手順が ReturnCompletion を返すこと はない。なぜなら、式位置でそのような completion が生じる唯一の方法は YieldExpression の使用 によるが、これは 15.5.1 および 15.6.1early error 規則により parameter list では禁止されているからである。
  28. iteratorRecord および usedEnv を引数とす る formalsIteratorBindingInitialization を ? 実行する。
  29. hasParameterExpressionsfalse なら、
    1. NOTE: 仮引数および top-level var に必要な Environment Record は 1 つだけである。
    2. instantiatedVarNamesList parameterBindings の copy とする。
    3. varNames の各要素 n について、次を行う
      1. instantiatedVarNamesn を含まなけ れば、
        1. ninstantiatedVarNames に append する。
        2. env.CreateMutableBinding(n, false) を実行する。
        3. env.InitializeBinding(n, undefined) を実行する。
    4. varEnvenv とする。
  30. Else,
    1. NOTE: 仮引数リスト内の式によって作成された closure が、関数本体内の宣言を可視にしない ことを保証するために、別の Environment Record が必要である。
    2. varEnvNewDeclarativeEnvironment( env) とする。
    3. calleeContext の VariableEnvironment を varEnv に設定する。
    4. instantiatedVarNames を新しい空の List とする。
    5. varNames の各要素 n について、次を行う
      1. instantiatedVarNamesn を含まなけ れば、
        1. ninstantiatedVarNames に append する。
        2. varEnv.CreateMutableBinding(n, false) を実行する。
        3. parameterBindingsn を含まない か、または functionNamesn を 含むなら、
          1. initialValueundefined とする。
        4. Else,
          1. initialValue を ! env.GetBindingValue(n, false) とする。
        5. varEnv.InitializeBinding(n, initialValue) を実行する。
        6. NOTE: 仮引数と同名の var は、初期状態で 対応する初期化済み仮引数と同じ値を持つ。
  31. stricttrue なら、
    1. lexEnvvarEnv とする。
  32. Else,
    1. ホスト が web browser であるか、または ブロックレベル Function Declaration の Web レガシー互換性意味論 をサポートするなら、
      1. code Contains xtrue である 任意の BlockCaseClauseDefaultClause xStatementList に直接含まれる各 FunctionDeclaration fnDecl について、次を行う
        1. funcNamefnDeclBindingIdentifierStringValue と する。
        2. FunctionDeclaration fnDeclfuncNameBindingIdentifier と する VariableStatement に置き換えて も func に対していかなる early error も生じず、かつ parameterNamesfuncName を含まないなら、
          1. NOTE: funcName に対する var 束縛 は、それが VarDeclaredName でも、仮 引数名でも、別の FunctionDeclaration でもない場合に 限ってここでインスタンス化される。
          2. instantiatedVarNamesfuncName を含まず、かつ funcName"arguments" でないなら、
            1. varEnv.CreateMutableBinding( funcName, false) を実行する。
            2. varEnv.InitializeBinding( funcName, undefined) を実行す る。
            3. funcNameinstantiatedVarNames に append する。
          3. FunctionDeclaration fnDecl が評価されるとき、 15.2.6 で与えられる FunctionDeclaration Evaluation algorithm の代わりに、次 の手順を実行する:
            1. fEnvrunning execution context の VariableEnvironment とする。
            2. bEnvrunning execution context の LexicalEnvironment とする。
            3. fObj を ! bEnv.GetBindingValue(funcName, false) とする。
            4. fEnv.SetMutableBinding( funcName, fObj, false) を 実行する。
            5. unused を返す。
    2. lexEnvNewDeclarativeEnvironment( varEnv) とする。
    3. NOTE: non-strict function は、 direct eval が eval code によって導入さ れる var scoped declaration が、既存の top-level lexically scoped declaration と conflict するかどうかを判定できるよう に、top-level lexical declaration のた めに別の Environment Record を用いる。 strict function ではこれは不要である。な ぜなら strict な direct eval は常に、すべ ての declaration を新しい Environment Record に配置するからである。
  33. calleeContext の LexicalEnvironment を lexEnv に設定する。
  34. lexDeclarationscodeLexicallyScopedDeclarations とする。
  35. lexDeclarations の各要素 lexDecl につい て、次を行う
    1. NOTE: lexical に宣言された名前は、 function/generator declaration、仮引数、 または var 名と同じにはなり得ない。lexical に宣言された名前は、ここではインスタンス化の みが行われ、初期化は行われない。
    2. lexDeclBoundNames の各要素 dn につ いて、次を行う
      1. lexDeclIsConstantDeclarationtrue なら、
        1. lexEnv.CreateImmutableBinding( dn, true) を実行する。
      2. Else,
        1. lexEnv.CreateMutableBinding(dn, false) を実行する。
  36. privateEnvcalleeContext の PrivateEnvironment とする。
  37. functionsToInitialize の各 Parse Node fnDecl について、次を行う
    1. fnfnDeclBoundNames の唯一の要 素とする。
    2. folexEnv および privateEnv を引数 とする fnDeclInstantiateFunctionObject とする。
    3. varEnv.SetMutableBinding(fn, fo, false) を実行する。
  38. unused を返す。

10.3 組込み関数オブジェクト

組込み関数オブジェクトは通常オブジェクトである; それは 10.1 に定められた通常オブジェクトに対する要件を満たさなければ ならない。

すべての通常オブジェクトに要求される内部スロット (10.1 を参照)に加えて、組込み関数オブジェクトは次の内部スロッ トも持たなければならない:

  • [[Realm]]: 関数が作成された realm を表す Realm Record
  • [[InitialName]]: 関数の初期名である String。 20.2.3.5 により使用される。
  • [[Async]]: 関数が BuiltinCallOrConstruct にお いて async な関数呼出しおよび構築の振る舞いを持つかど うかを示す Boolean。

別段の指定がない限り、組込み関数オブジェクトの [[Prototype]] 内部スロットの初期値は %Function.prototype% である。

組込み関数オブジェクトは、 10.3.1 の定義に適合する [[Call]] 内部メソッドを持たなければなら ない。

組込み関数オブジェクトは、それが “constructor” と 記述されている場合、またはこの仕様内の何らかのアルゴリズ ムがその [[Construct]] 内部メソッドを明示的に設定する場 合に限り、[[Construct]] 内部メソッドを持つ。そのような [[Construct]] 内部メソッドは、 10.3.2 の定義に適合しなければならない。

実装は、この仕様で定義されていない追加の組込み関数オブ ジェクトを提供してよい。

10.3.1 [[Call]] ( thisArgument, argumentsList )

The [[Call]] internal method of a built-in function object func takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. BuiltinCallOrConstruct(func, thisArgument, argumentsList, undefined) を返す。

10.3.2 [[Construct]] ( argumentsList, newTarget )

The [[Construct]] internal method of a built-in function object func (when the method is present) takes arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. result を ? BuiltinCallOrConstruct(func, uninitialized, argumentsList, newTarget) と する。
  2. Assert: result は Object である。
  3. result を返す。

10.3.3 BuiltinCallOrConstruct ( func, thisArgument, argumentsList, newTarget )

The abstract operation BuiltinCallOrConstruct takes arguments func (a built-in function object), thisArgument (an ECMAScript language value or uninitialized), argumentsList (a List of ECMAScript language values), and newTarget (a constructor or undefined) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. callerContextrunning execution context とする。
  2. callerContext がまだ suspend されていなけれ ば、callerContext を suspend する。
  3. calleeContext を新しい execution context とする。
  4. calleeContext の Function を func に設定す る。
  5. calleeRealmfunc.[[Realm]] とする。
  6. calleeContextRealmcalleeRealm に 設定する。
  7. calleeContext の ScriptOrModule を null に設定する。
  8. calleeContext に対して必要な implementation-defined な初期化を実行する。
  9. calleeContextexecution context stack に push する; calleeContext はいま running execution context である。
  10. func.[[Async]]true なら、
    1. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
    2. resultsClosure を、引数を持たず、functhisArgumentargumentsList、および newTarget を capture し、呼び出されたとき 次の手順を実行する新しい Abstract Closure と する:
      1. result を、func の仕様に適合する方法で func評価した結果である Completion Record とする。 thisArgumentuninitialized なら、 this 値は uninitialized である; そうでな ければ thisArgumentthis 値を与え る。argumentsList が名前付き引数を与え る。newTarget が NewTarget 値を与える。
      2. NOTE: func がこの文書で定義されている場合、 “func の仕様” とは、algorithm step ま たはその他の手段により指定されたその振る舞い である。
      3. Completion(result) を返す。
    3. AsyncFunctionStart(promiseCapability, resultsClosure) を実行する。
    4. calleeContextexecution context stack から取り除き、callerContextrunning execution context として復元する。
    5. promiseCapability.[[Promise]] を返す。
  11. result を、func の仕様に適合する方法で func評価した結果である Completion Record とする。thisArgumentuninitialized なら、this 値は uninitialized である; そう でなければ thisArgumentthis 値を与え る。argumentsList が名前付き引数を与える。 newTarget が NewTarget 値を与える。
  12. NOTE: func がこの文書で定義されている場合、 “func の仕様” とは、algorithm step または その他の手段により指定されたその振る舞いである。
  13. calleeContextexecution context stack から取り除き、callerContextrunning execution context として復元する。
  14. result を返す。
Note

calleeContextexecution context stack から取り除かれるとき、それが suspend され、後で再開する ためにアクセス可能な Generator によって保持されている場 合には、破棄してはならない。

10.3.4 CreateBuiltinFunction ( behaviour, length, name, additionalInternalSlotsList [ , realm [ , prototype [ , prefix [ , async ] ] ] ] )

The abstract operation CreateBuiltinFunction takes arguments behaviour (an Abstract Closure, a set of algorithm steps, or some other definition of a function's behaviour provided in this specification), length (a non-negative integer or +∞), name (a property key or a Private Name), and additionalInternalSlotsList (a List of names of internal slots) and optional arguments realm (a Realm Record), prototype (an Object or null), prefix (a String), and async (a Boolean) and returns a built-in function object. additionalInternalSlotsList は、そのオブジェク トの一部として定義されなければならない追加内部スロットの 名前を含む。この操作は組込み関数オブジェクトを作成する。 It performs the following steps when called:

  1. realm が与えられていなければ、realmcurrent Realm Record に設定する。
  2. prototype が与えられていなければ、 prototyperealm.[[Intrinsics]].[[%Function.prototype%]] に設定する。
  3. async が与えられていなければ、asyncfalse に設定する。
  4. internalSlotsList を、これから作成される組 込み関数オブジェクトに 10.3 が要求するすべての内部スロットの名前を含む List とする。
  5. additionalInternalSlotsList の要素を internalSlotsList に append する。
  6. func を新しい組込み関数オブジェクトとする。こ の関数オブジェクトは、呼び出されると、 behaviour に記述された action を、与えられ た引数を behaviour により指定される対応する parameter の値として用いて実行する。新しい関 数オブジェクトは、その名前が internalSlotsList の要素である内部スロット と、[[InitialName]] internal slot を持つ。
  7. func.[[Async]]async に設定する。
  8. func.[[Prototype]]prototype に設定す る。
  9. func.[[Extensible]]true に設定する。
  10. func.[[Realm]]realm に設定する。
  11. func.[[InitialName]]null に設定する。
  12. SetFunctionLength(func, length) を実行す る。
  13. prefix が与えられていなければ、
    1. SetFunctionName(func, name) を実行す る。
  14. Else,
    1. SetFunctionName(func, name, prefix) を実行する。
  15. func を返す。

この仕様で定義される各組込み関数は、 CreateBuiltinFunction 抽象操作を呼び出すことによって 作成される。

10.4 組込み特殊オブジェクトの内部メソッドとスロット

この仕様は、数種類の組込み特殊オブジェクトを定義する。 これらのオブジェクトは、いくつかの特定状況を除いて、一般 に通常オブジェクトと類似した振る舞いをする。以下の特殊オ ブジェクトは、以下で明示的に別段の指定がある場合を除き、 通常オブジェクトの内部メソッドを用いる:

10.4.1 束縛関数特殊オブジェクト

束縛関数特殊オブジェクトは、別の関数オブジェクトを包む 特殊オブジェクトである。束縛関数特殊オブジェクトは呼出し 可能である([[Call]] 内部メソッドを持ち、[[Construct]] 内部メソッドを持つ場合もある)。束縛関数特殊オブジェクト を呼び出すと、通常はその包まれた関数の呼出しが結果として 生じる。

オブジェクトが 束縛関数特殊オブジェクト であるのは、その [[Call]] および(該当する場合) [[Construct]] 内部メソッドが次の実装を用い、かつ他の本質 的内部メソッドが 10.1 にある定義を用いる場合である。これらのメソッドは BoundFunctionCreate で設定される。

束縛関数特殊オブジェクトは、 Table 25 に列挙された ECMAScript 関数オブジェクトの内部スロット を持たない。代わりに、それらは [[Prototype]] および [[Extensible]] に加えて、 Table 26 に列挙された内部スロットを持つ。

Table 26: Internal Slots of Bound Function Exotic Objects
内部スロット 説明
[[BoundTargetFunction]] a callable Object 包まれている関数オブジェクト。
[[BoundThis]] an ECMAScript language value 包まれた関数を呼び出すときに、常に this 値 として渡される値。
[[BoundArguments]] a List of ECMAScript language values その要素が、包まれた関数へのあらゆる呼出しに おいて最初の引数として用いられる値の list。

10.4.1.1 [[Call]] ( thisArgument, argumentsList )

The [[Call]] internal method of a bound function exotic object func takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. targetfunc.[[BoundTargetFunction]] とす る。
  2. boundThisfunc.[[BoundThis]] とする。
  3. boundArgsfunc.[[BoundArguments]] とす る。
  4. argsboundArgsargumentsListlist-concatenation とする。
  5. Call(target, boundThis, args) を返 す。

10.4.1.2 [[Construct]] ( argumentsList, newTarget )

The [[Construct]] internal method of a bound function exotic object func takes arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. targetfunc.[[BoundTargetFunction]] とす る。
  2. Assert: IsConstructor(target) is true.
  3. boundArgsfunc.[[BoundArguments]] と する。
  4. argsboundArgsargumentsListlist-concatenation とする。
  5. SameValue(func, newTarget) が true なら、newTargettarget に設定する。
  6. Construct(target, args, newTarget) を返す。

10.4.1.3 BoundFunctionCreate ( targetFunction, boundThis, boundArgs )

The abstract operation BoundFunctionCreate takes arguments targetFunction (a function object), boundThis (an ECMAScript language value), and boundArgs (a List of ECMAScript language values) and returns either a normal completion containing a function object or a throw completion. これは、新しい束縛関数特殊オブジェクトの作成を規定 するために用いられる。 It performs the following steps when called:

  1. proto を ? targetFunction.[[GetPrototypeOf]]() とする。
  2. internalSlotsList を « [[Prototype]], [[Extensible]] » と Table 26 に列挙された内部スロットの list-concatenation とする。
  3. objMakeBasicObject(internalSlotsList) とする。
  4. obj.[[Prototype]]proto に設定する。
  5. obj.[[Call]]10.4.1.1 に規定されたとおりに設定する。
  6. IsConstructor(targetFunction) が true な ら、
    1. obj.[[Construct]]10.4.1.2 に規定されたとおりに設定する。
  7. obj.[[BoundTargetFunction]]targetFunction に設定する。
  8. obj.[[BoundThis]]boundThis に設定す る。
  9. obj.[[BoundArguments]]boundArgs に設 定する。
  10. obj を返す。

10.4.2 配列特殊オブジェクト

Array は、array index property key に特別な扱いを 与える特殊オブジェクトである( 6.1.7 を参照)。 property namearray index であるプロパティは element とも呼ばれる。すべての Array は、 non-configurable な "length" プロパティを持ち、そ の値は常に数学的に厳密に 232 未満である非負整 数 Number である。"length" プロパティの値は、名前が array index であるすべての own property の名前よりも 数値的に大きい; Array の own property が作成または変更 されるたびに、この不変条件を維持するため必要に応じて他の プロパティが調整される。具体的には、名前が array index である own property が追加されるたびに、必要に応じて "length" プロパティの値は、その array index の数値 に 1 を加えた値に変更される; また、"length" プロパ ティの値が変更されるたびに、その値が新しい length 以上で ある名前が array index のすべての own property は削除 される。この制約は Array の own property にのみ適用さ れ、その prototype から継承され得る "length" また は array index property の影響を受けない。

オブジェクトが Array 特殊オブジェクト (または単に Array)であるのは、その [[DefineOwnProperty]] 内部メソッドが次の実装を用い、かつ他の本質的内部メソッド が 10.1 にある定義を用いる場合である。これらのメソッドは ArrayCreate で設定される。

10.4.2.1 [[DefineOwnProperty]] ( propertyKey, desc )

The [[DefineOwnProperty]] internal method of an Array exotic object array takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. propertyKey"length" なら、 ? ArraySetLength(array, desc) を返す。
  2. propertyKeyarray index なら、
    1. lengthDescOrdinaryGetOwnProperty( array, "length") とする。
    2. Assert: lengthDescundefined では ない。
    3. Assert: IsDataDescriptor(lengthDesc) is true.
    4. Assert: lengthDesc.[[Configurable]] is false.
    5. lengthlengthDesc.[[Value]] とする。
    6. Assert: length は非負整数 Number である。
    7. index を ! ToUint32(propertyKey) とする。
    8. indexlength かつ lengthDesc.[[Writable]]false な ら、false を返す。
    9. succeeded を ! OrdinaryDefineOwnProperty(array, propertyKey, desc) とする。
    10. succeededfalse なら、false を 返す。
    11. indexlength なら、
      1. lengthDesc.[[Value]]index + 1𝔽 に設定する。
      2. succeeded を ! OrdinaryDefineOwnProperty(array, "length", lengthDesc) に設定する。
      3. Assert: succeeded is true.
    12. true を返す。
  3. OrdinaryDefineOwnProperty(array, propertyKey, desc) を返す。

10.4.2.2 ArrayCreate ( length [ , proto ] )

The abstract operation ArrayCreate takes argument length (a non-negative integer) and optional argument proto (an Object) and returns either a normal completion containing an Array exotic object or a throw completion. これは、新しい Array の作成を規定するために用い られる。 It performs the following steps when called:

  1. length > 232 - 1 なら、 RangeError 例外を送出する。
  2. proto が与えられていなければ、proto%Array.prototype% に設定する。
  3. arrayMakeBasicObject( « [[Prototype]], [[Extensible]] ») とす る。
  4. array.[[Prototype]]proto に設定す る。
  5. array.[[DefineOwnProperty]]10.4.2.1 に規定されたとおりに設定する。
  6. OrdinaryDefineOwnProperty(array, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  7. array を返す。

10.4.2.3 ArraySpeciesCreate ( originalArray, length )

The abstract operation ArraySpeciesCreate takes arguments originalArray (an Object) and length (a non-negative integer) and returns either a normal completion containing an Object or a throw completion. これは、originalArray から導出された constructor function を用いて、新しい Array または 類似オブジェクトの作成を規定するために用いられる。それ は、constructor function が Array を返すことまでは強 制しない。 It performs the following steps when called:

  1. isArray を ? IsArray(originalArray) とす る。
  2. isArrayfalse なら、 ? ArrayCreate(length) を返す。
  3. constructor を ? Get(originalArray, "constructor") とする。
  4. IsConstructor(constructor) が true な ら、
    1. thisRealmcurrent Realm Record とす る。
    2. constructorRealm を ? GetFunctionRealm(constructor) とす る。
    3. thisRealmconstructorRealm が同 じ Realm Record でないなら、
      1. SameValue(constructor, constructorRealm.[[Intrinsics]].[[%Array%]]) が true なら、constructorundefined に設定する。
  5. constructor が Object なら、
    1. constructor を ? Get(constructor, %Symbol.species%) に設定する。
    2. constructornull なら、 constructorundefined に設定する。
  6. constructorundefined なら、 ? ArrayCreate(length) を返す。
  7. IsConstructor(constructor) が false な ら、TypeError 例外を送出する。
  8. Construct(constructor, « 𝔽(length) ») を返す。
Note

originalArray が、running execution contextrealm ではない realm に属する標準組込み Array constructor を用いて作成されていた場合、新し い Array は running execution contextrealm を 用いて作成される。これにより、現在 ArraySpeciesCreate を用いて定義されている Array.prototype メソッドについて、歴史的にそのよう な挙動を持っていた Web browser との互換性が維持され る。

10.4.2.4 ArraySetLength ( array, desc )

The abstract operation ArraySetLength takes arguments array (an Array) and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. desc[[Value]] フィールドを持たないなら、
    1. OrdinaryDefineOwnProperty(array, "length", desc) を返す。
  2. newLenDescdesc の copy とする。
  3. newLen を ? ToUint32(desc.[[Value]]) とする。
  4. numberLen を ? ToNumber(desc.[[Value]]) とする。
  5. SameValueZero(newLen, numberLen) が false なら、RangeError 例外を送出す る。
  6. newLenDesc.[[Value]]newLen に設定す る。
  7. oldLenDescOrdinaryGetOwnProperty( array, "length") とする。
  8. Assert: oldLenDescundefined では ない。
  9. Assert: IsDataDescriptor(oldLenDesc) is true.
  10. Assert: oldLenDesc.[[Configurable]] is false.
  11. oldLenoldLenDesc.[[Value]] とする。
  12. newLenoldLen なら、
    1. OrdinaryDefineOwnProperty(array, "length", newLenDesc) を返す。
  13. oldLenDesc.[[Writable]]false な ら、false を返す。
  14. newLenDesc[[Writable]] フィールドを持 たないか、または newLenDesc.[[Writable]]true なら、
    1. newWritabletrue とする。
  15. Else,
    1. NOTE: いずれかの element を削除できない場 合に備えて、[[Writable]] 属性を false に設定するのは延期される。
    2. newWritablefalse とする。
    3. newLenDesc.[[Writable]]true に設 定する。
  16. succeeded を ! OrdinaryDefineOwnProperty(array, "length", newLenDesc) とする。
  17. succeededfalse なら、false を返 す。
  18. array の各 own property key propertyKey について、propertyKeyarray index であり、かつ ! ToUint32(propertyKey) ≥ newLen であ るものを、数値 index 降順で処理し、次を行う
    1. deleteSucceeded を ! array.[[Delete]](propertyKey) とす る。
    2. deleteSucceededfalse なら、
      1. newLenDesc.[[Value]] を ! ToUint32(propertyKey) + 1𝔽 に設定する。
      2. newWritablefalse なら、 newLenDesc.[[Writable]]false に設定する。
      3. OrdinaryDefineOwnProperty(array, "length", newLenDesc) を実行す る。
      4. false を返す。
  19. newWritablefalse なら、
    1. succeeded を ! OrdinaryDefineOwnProperty(array, "length", PropertyDescriptor { [[Writable]]: false }) に設定する。
    2. Assert: succeeded is true.
  20. true を返す。
Note

手順 3 および 4 において、desc.[[Value]] が object である場合、 その valueOf メソッドは 2 回呼び出される。これは、 この仕様の第 2 版以来、この効果を伴うものとして規定されて いる legacy な挙動である。

10.4.3 文字列特殊オブジェクト

String object は、String 値をカプセル化し、その String 値の個々の code unit 要素に対応する仮想的な整数 index 付き data property を公開する特殊オブジェクトであ る。String 特殊オブジェクトは、常に "length" とい う名前の data property を持ち、その値はカプセル化された String 値の長さである。code unit data property"length" プロパティの両方とも、書込み不可かつ configurable ではない。

オブジェクトが String 特殊オブジェクト (または単に String object)であるのは、その [[GetOwnProperty]][[DefineOwnProperty]][[OwnPropertyKeys]] 内部メソッドが次の実装を用い、かつ 他の本質的内部メソッドが 10.1 にある定義を用いる場合である。これらのメソッドは StringCreate において設定される。

String 特殊オブジェクトは通常オブジェクトと同じ内部ス ロットを持つ。さらに [[StringData]] 内部スロットを持 つ。

10.4.3.1 [[GetOwnProperty]] ( propertyKey )

The [[GetOwnProperty]] internal method of a String exotic object str takes argument propertyKey (a property key) and returns a normal completion containing either a Property Descriptor or undefined. It performs the following steps when called:

  1. descOrdinaryGetOwnProperty(str, propertyKey) とする。
  2. descundefined でなければ、 desc を返す。
  3. StringGetOwnProperty(str, propertyKey) を返す。

10.4.3.2 [[DefineOwnProperty]] ( propertyKey, desc )

The [[DefineOwnProperty]] internal method of a String exotic object str takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns a normal completion containing a Boolean. It performs the following steps when called:

  1. stringDescStringGetOwnProperty(str, propertyKey) とする。
  2. stringDescundefined でなければ、
    1. extensiblestr.[[Extensible]] とす る。
    2. IsCompatiblePropertyDescriptor( extensible, desc, stringDesc) を返 す。
  3. OrdinaryDefineOwnProperty(str, propertyKey, desc) を返す。

10.4.3.3 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of a String exotic object obj takes no arguments and returns a normal completion containing a List of property keys. It performs the following steps when called:

  1. keys を新しい空の List とする。
  2. strobj.[[StringData]] とする。
  3. Assert: str は String である。
  4. lenstr の長さとする。
  5. 0 ≤ i < len を満たす各整数 i につい て、昇順で、次を行う
    1. ToString(𝔽(i)) を keys に append する。
  6. obj の各 own property key propertyKey について、propertyKeyarray index で あり、かつ ! ToIntegerOrInfinity( propertyKey) ≥ len であるものを、数値 index 昇順で処理し、次を行う
    1. propertyKeykeys に append する。
  7. obj の各 own property key propertyKey について、propertyKey が String であり、 かつ array index ではないものを、プロパティ 作成時刻の昇順で処理し、次を行う
    1. propertyKeykeys に append する。
  8. obj の各 own property key propertyKey について、propertyKey が Symbol である ものを、プロパティ作成時刻の昇順で処理し、次を 行う
    1. propertyKeykeys に append する。
  9. keys を返す。

10.4.3.4 StringCreate ( value, prototype )

The abstract operation StringCreate takes arguments value (a String) and prototype (an Object) and returns a String exotic object. これは、新しい String 特殊オブジェクトの作成を 規定するために用いられる。 It performs the following steps when called:

  1. strMakeBasicObject( « [[Prototype]], [[Extensible]], [[StringData]] ») とする。
  2. str.[[Prototype]]prototype に設定す る。
  3. str.[[StringData]]value に設定する。
  4. str.[[GetOwnProperty]]10.4.3.1 に規定されたとおりに設定する。
  5. str.[[DefineOwnProperty]]10.4.3.2 に規定されたとおりに設定する。
  6. str.[[OwnPropertyKeys]]10.4.3.3 に規定されたとおりに設定する。
  7. lengthvalue の長さとする。
  8. DefinePropertyOrThrow(str, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  9. str を返す。

10.4.3.5 StringGetOwnProperty ( str, propertyKey )

The abstract operation StringGetOwnProperty takes arguments str (an Object that has a [[StringData]] internal slot) and propertyKey (a property key) and returns a Property Descriptor or undefined. It performs the following steps when called:

  1. propertyKey が String でなければ、 undefined を返す。
  2. indexCanonicalNumericIndexString(propertyKey) とする。
  3. index が整数 Number でなければ、 undefined を返す。
  4. index-0𝔽 であるか、また は index < -0𝔽 なら、 undefined を返す。
  5. stringDatastr.[[StringData]] とす る。
  6. Assert: stringData は String である。
  7. lenstringData の長さとする。
  8. (index) ≥ len なら、undefined を返 す。
  9. resultStr を、(index) から (index) + 1 までの stringDatasubstring とする。
  10. PropertyDescriptor { [[Value]]: resultStr, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false } を返す。

10.4.4 Arguments 特殊オブジェクト

ほとんどの ECMAScript 関数は、そのコードから利用可能 な arguments object を作成する。関数定義の特性に応じ て、その arguments object は通常オブジェクトまたは arguments 特殊オブジェクトのいずれかである。 arguments 特殊オブジェクトは、その array index property が、対応する ECMAScript 関数の呼出しにおける 仮引数束縛へ対応付けられる特殊オブジェクトである。

オブジェクトが arguments 特殊オブジェクト であるのは、その内部メソッドが次の実装を用い、ここで指定 されていないものは 10.1 にある定義を用いる場合である。これらのメソッドは CreateMappedArgumentsObject において設定される。

Note 1

CreateUnmappedArgumentsObject はこの節に含められ ているが、それが作成するのは通常オブジェクトであり、 arguments 特殊オブジェクトではない。

arguments 特殊オブジェクトは通常オブジェクトと同 じ内部スロットを持つ。さらに [[ParameterMap]] 内部スロ ットを持つ。通常の arguments object も [[ParameterMap]] 内部スロットを持つが、その値は常に undefined である。通常の arguments object におい て [[ParameterMap]] 内部スロットは、 Object.prototype.toString20.1.3.6) がそれらをそのようなものとして識別するためにのみ用いられ る。

Note 2

対応する関数オブジェクトの仮引数の数より小さい数値名を 持つ arguments 特殊オブジェクトの整数 index 付き data property は、初期状態では関数の execution context における対応する引数束縛と値を共有する。これ は、そのプロパティを変更すると対応する引数束縛の値も変わ り、逆もまた同様であることを意味する。この対応関係は、そ のようなプロパティが削除されてから再定義された場合、また はそのプロパティが accessor property に変更された場合 に壊れる。arguments object が通常オブジェクトである場 合、そのプロパティの値は関数に渡された引数の単なる copy であり、プロパティ値と仮引数値の間に動的な連結は存在しな い。

Note 3

ParameterMap object とその property 値は、 arguments object と引数束縛との対応を規定するための仕 組みとして用いられる。ParameterMap object と、そのプ ロパティの値であるオブジェクトは、ECMAScript code から 直接観測可能ではない。ECMAScript 実装は、指定された意味 論を実装するために、そのようなオブジェクトを実際に作成し たり使用したりする必要はない。

Note 4

通常の arguments object は、"callee" という 名前の non-configurable な accessor property を定 義し、そのアクセス時には TypeError 例外を送出する。 "callee" プロパティは、arguments 特殊オブジェクト においてはより具体的な意味を持つ。arguments 特殊オブ ジェクトは、non-strict function のある種のクラスに対 してのみ作成される。通常版におけるこのプロパティの定義 は、適合する ECMAScript 実装によってこれが他の方法で定 義されないことを保証するために存在する。

Note 5

ECMAScript 実装の arguments 特殊オブジェクトは、 歴史的に "caller" という名前の accessor property を含んでいた。ECMAScript 2017 より前、この仕様は通常 の arguments object に throwing な "caller" プロパティを定義していた。実装はもはやこの拡張を含まない ため、ECMAScript 2017 では throwing な "caller" accessor の要件が削除された。

10.4.4.1 [[GetOwnProperty]] ( propertyKey )

The [[GetOwnProperty]] internal method of an arguments exotic object args takes argument propertyKey (a property key) and returns a normal completion containing either a Property Descriptor or undefined. It performs the following steps when called:

  1. descOrdinaryGetOwnProperty(args, propertyKey) とする。
  2. descundefined なら、undefined を 返す。
  3. mapargs.[[ParameterMap]] とする。
  4. isMapped を ! HasOwnProperty(map, propertyKey) とする。
  5. isMappedtrue なら、
    1. desc.[[Value]] を ! Get(map, propertyKey) に設定する。
  6. desc を返す。

10.4.4.2 [[DefineOwnProperty]] ( propertyKey, desc )

The [[DefineOwnProperty]] internal method of an arguments exotic object args takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns a normal completion containing a Boolean. It performs the following steps when called:

  1. mapargs.[[ParameterMap]] とする。
  2. isMapped を ! HasOwnProperty(map, propertyKey) とする。
  3. newArgDescdesc とする。
  4. isMappedtrue かつ IsDataDescriptor(desc) が true なら、
    1. desc[[Value]] フィールドを持たず、 desc[[Writable]] フィールドを持ち、 かつ desc.[[Writable]]false な ら、
      1. newArgDescdesc の copy に設定 する。
      2. newArgDesc.[[Value]] を ! Get(map, propertyKey) に設定する。
  5. allowed を ! OrdinaryDefineOwnProperty(args, propertyKey, newArgDesc) とする。
  6. allowedfalse なら、false を返 す。
  7. isMappedtrue なら、
    1. IsAccessorDescriptor(desc) が true な ら、
      1. map.[[Delete]](propertyKey) を実 行する。
    2. Else,
      1. desc[[Value]] フィールドを持つな ら、
        1. Assert: 次の Set は成功する。なぜなら arguments object によって対応付け られる仮引数は常に書込み可能だからであ る。
        2. Set(map, propertyKey, desc.[[Value]], false) を実行す る。
      2. desc[[Writable]] フィールドを持 ち、かつ desc.[[Writable]]false なら、
        1. map.[[Delete]](propertyKey) を 実行する。
  8. true を返す。

10.4.4.3 [[Get]] ( propertyKey, receiver )

The [[Get]] internal method of an arguments exotic object args takes arguments propertyKey (a property key) and receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. mapargs.[[ParameterMap]] とする。
  2. isMapped を ! HasOwnProperty(map, propertyKey) とする。
  3. isMappedfalse なら、 ? OrdinaryGet(args, propertyKey, receiver) を返す。
  4. Assert: mappropertyKey に対する仮 引数対応付けを含む。
  5. Get(map, propertyKey) を返す。

10.4.4.4 [[Set]] ( propertyKey, value, receiver )

The [[Set]] internal method of an arguments exotic object args takes arguments propertyKey (a property key), value (an ECMAScript language value), and receiver (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. SameValue(args, receiver) が false な ら、
    1. isMappedfalse とする。
  2. Else,
    1. mapargs.[[ParameterMap]] とする。
    2. isMapped を ! HasOwnProperty(map, propertyKey) とする。
  3. isMappedtrue なら、
    1. Assert: 次の Set は成功する。なぜなら arguments object によって対応付けられ る仮引数は常に書込み可能だからである。
    2. Set(map, propertyKey, value, false) を実行する。
  4. OrdinarySet(args, propertyKey, value, receiver) を返す。

10.4.4.5 [[Delete]] ( propertyKey )

The [[Delete]] internal method of an arguments exotic object args takes argument propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. mapargs.[[ParameterMap]] とする。
  2. isMapped を ! HasOwnProperty(map, propertyKey) とする。
  3. result を ? OrdinaryDelete(args, propertyKey) とする。
  4. resulttrue かつ isMappedtrue なら、
    1. map.[[Delete]](propertyKey) を実行す る。
  5. result を返す。

10.4.4.6 CreateUnmappedArgumentsObject ( argumentsList )

The abstract operation CreateUnmappedArgumentsObject takes argument argumentsList (a List of ECMAScript language values) and returns an ordinary object. It performs the following steps when called:

  1. lenargumentsList の要素数とする。
  2. objOrdinaryObjectCreate(%Object.prototype%, « [[ParameterMap]] ») とする。
  3. obj.[[ParameterMap]]undefined に設 定する。
  4. DefinePropertyOrThrow(obj, "length", PropertyDescriptor { [[Value]]: 𝔽(len), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  5. index を 0 とする。
  6. index < len の間、繰り返す
    1. valargumentsList[index] とす る。
    2. CreateDataPropertyOrThrow(obj, ! ToString(𝔽(index)), val) を実行す る。
    3. indexindex + 1 に設定する。
  7. DefinePropertyOrThrow(obj, %Symbol.iterator%, PropertyDescriptor { [[Value]]: %Array.prototype.values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  8. DefinePropertyOrThrow(obj, "callee", PropertyDescriptor { [[Get]]: %ThrowTypeError%, [[Set]]: %ThrowTypeError%, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  9. obj を返す。

10.4.4.7 CreateMappedArgumentsObject ( func, formals, argumentsList, env )

The abstract operation CreateMappedArgumentsObject takes arguments func (an ECMAScript function object), formals (a Parse Node), argumentsList (a List of ECMAScript language values), and env (an Environment Record) and returns an arguments exotic object. It performs the following steps when called:

  1. Assert: formals は rest parameter、 binding pattern、またはいかなる initializer も含まない。重複識別子を含んでもよい。
  2. lenargumentsList の要素数とする。
  3. objMakeBasicObject( « [[Prototype]], [[Extensible]], [[ParameterMap]] ») とする。
  4. obj.[[GetOwnProperty]]10.4.4.1 に規定されたとおりに設定する。
  5. obj.[[DefineOwnProperty]]10.4.4.2 に規定されたとおりに設定する。
  6. obj.[[Get]]10.4.4.3 に規定されたとおりに設定する。
  7. obj.[[Set]]10.4.4.4 に規定されたとおりに設定する。
  8. obj.[[Delete]]10.4.4.5 に規定されたとおりに設定する。
  9. obj.[[Prototype]]%Object.prototype% に設定する。
  10. mapOrdinaryObjectCreate(null) とす る。
  11. obj.[[ParameterMap]]map に設定す る。
  12. parameterNamesformalsBoundNames とする。
  13. numberOfParametersparameterNames の要素数とする。
  14. index を 0 とする。
  15. index < len の間、繰り返す
    1. valargumentsList[index] とす る。
    2. CreateDataPropertyOrThrow(obj, ! ToString(𝔽(index)), val) を実行す る。
    3. indexindex + 1 に設定する。
  16. DefinePropertyOrThrow(obj, "length", PropertyDescriptor { [[Value]]: 𝔽(len), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  17. mappedNames を新しい空の List とする。
  18. indexnumberOfParameters - 1 に設定 する。
  19. index ≥ 0 の間、繰り返す
    1. nameparameterNames[index] とす る。
    2. mappedNamesname を含まないなら、
      1. namemappedNames に append す る。
      2. index < len なら、
        1. getterMakeArgGetter(name, env) とする。
        2. setterMakeArgSetter(name, env) とする。
        3. map.[[DefineOwnProperty]]( ! ToString(𝔽(index)), PropertyDescriptor { [[Set]]: setter, [[Get]]: getter, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
    3. indexindex - 1 に設定する。
  20. DefinePropertyOrThrow(obj, %Symbol.iterator%, PropertyDescriptor { [[Value]]: %Array.prototype.values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  21. DefinePropertyOrThrow(obj, "callee", PropertyDescriptor { [[Value]]: func, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  22. obj を返す。

10.4.4.7.1 MakeArgGetter ( name, env )

The abstract operation MakeArgGetter takes arguments name (a String) and env (an Environment Record) and returns a function object. これは、実行されると env において name に束 縛された値を返す built-in function object を作成す る。 It performs the following steps when called:

  1. getterClosure を、引数を持たず、nameenv を capture し、呼び出されたとき 次の手順を実行する新しい Abstract Closure とする:
    1. NormalCompletion( ! env.GetBindingValue(name, false)) を返す。
  2. getterCreateBuiltinFunction( getterClosure, 0, "", « ») とする。
  3. NOTE: getter は ECMAScript code から直 接アクセス可能になることはない。
  4. getter を返す。

10.4.4.7.2 MakeArgSetter ( name, env )

The abstract operation MakeArgSetter takes arguments name (a String) and env (an Environment Record) and returns a function object. これは、実行されると env において name に束 縛された値を設定する built-in function object を作成 する。 It performs the following steps when called:

  1. setterClosure を、(value) を引数とし、 nameenv を capture し、呼び出された とき次の手順を実行する新しい Abstract Closure とする:
    1. NormalCompletion( ! env.SetMutableBinding(name, value, false)) を返す。
  2. setterCreateBuiltinFunction( setterClosure, 1, "", « ») とす る。
  3. NOTE: setter は ECMAScript code から直 接アクセス可能になることはない。
  4. setter を返す。

10.4.5 TypedArray 特殊オブジェクト

TypedArray は、canonical numeric string であ る property key に特別な処理を行う特殊オブジェクトであ り、そのうち範囲内の整数 index である部分集合を用いて均 一な型の element を index し、残りが prototype chain の探索を生じさせることなく存在しないという不変条件 を強制する。

Note

任意の Number n に対する ToString(n) は canonical numeric string であるため、実装は実際に string 変換を行うことなく、TypedArray に対する property key として Number を扱ってよい。

TypedArray は通常オブジェクトと同じ内部スロットを持 ち、さらに [[ViewedArrayBuffer]][[TypedArrayName]][[ContentType]][[ByteLength]][[ByteOffset]]、および [[ArrayLength]] 内部スロットを持つ。

オブジェクトが TypedArray であるのは、その [[PreventExtensions]][[GetOwnProperty]][[HasProperty]][[DefineOwnProperty]][[Get]][[Set]][[Delete]]、および [[OwnPropertyKeys]] 内部メソッド がこの節の定義を用い、かつ他の本質的内部メソッドが 10.1 にある定義を用いる場合である。これらのメソッドは TypedArrayCreate によって設定される。

10.4.5.1 [[PreventExtensions]] ( )

The [[PreventExtensions]] internal method of a TypedArray obj takes no arguments and returns a normal completion containing a Boolean. It performs the following steps when called:

  1. NOTE: 6.1.7.3 に規定された拡張可能性関連の不変条件は、基底 buffer の resize によって整数 index 名の property が増える(または減ってから再び増え る)可能性があるとき、obj に対してこのメソ ッドが true を返すことを許さない。
  2. IsTypedArrayFixedLength(obj) が false なら、false を返す。
  3. OrdinaryPreventExtensions(obj) を返す。

10.4.5.2 [[GetOwnProperty]] ( propertyKey )

The [[GetOwnProperty]] internal method of a TypedArray obj takes argument propertyKey (a property key) and returns a normal completion containing either a Property Descriptor or undefined. It performs the following steps when called:

  1. propertyKey が String なら、
    1. numericIndexCanonicalNumericIndexString(propertyKey) とする。
    2. numericIndexundefined でなけれ ば、
      1. valueTypedArrayGetElement(obj, numericIndex) とする。
      2. valueundefined なら、 undefined を返す。
      3. PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } を返す。
  2. OrdinaryGetOwnProperty(obj, propertyKey) を返す。

10.4.5.3 [[HasProperty]] ( propertyKey )

The [[HasProperty]] internal method of a TypedArray obj takes argument propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. propertyKey が String なら、
    1. numericIndexCanonicalNumericIndexString(propertyKey) とする。
    2. numericIndexundefined でなけれ ば、 IsValidIntegerIndex(obj, numericIndex) を返す。
  2. OrdinaryHasProperty(obj, propertyKey) を返す。

10.4.5.4 [[DefineOwnProperty]] ( propertyKey, desc )

The [[DefineOwnProperty]] internal method of a TypedArray obj takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. propertyKey が String なら、
    1. numericIndexCanonicalNumericIndexString(propertyKey) とする。
    2. numericIndexundefined でなけれ ば、
      1. IsValidIntegerIndex(obj, numericIndex) が false なら、 false を返す。
      2. desc[[Configurable]] フィールド を持ち、かつ desc.[[Configurable]]false なら、false を返す。
      3. desc[[Enumerable]] フィールドを持 ち、かつ desc.[[Enumerable]]false なら、false を返す。
      4. IsAccessorDescriptor(desc) が true なら、false を返す。
      5. desc[[Writable]] フィールドを持 ち、かつ desc.[[Writable]]false なら、false を返す。
      6. desc[[Value]] フィールドを持つな ら、? TypedArraySetElement(obj, numericIndex, desc.[[Value]]) を 実行する。
      7. true を返す。
  2. OrdinaryDefineOwnProperty(obj, propertyKey, desc) を返す。

10.4.5.5 [[Get]] ( propertyKey, receiver )

The [[Get]] internal method of a TypedArray obj takes arguments propertyKey (a property key) and receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. propertyKey が String なら、
    1. numericIndexCanonicalNumericIndexString(propertyKey) とする。
    2. numericIndexundefined でなけれ ば、
      1. TypedArrayGetElement(obj, numericIndex) を返す。
  2. OrdinaryGet(obj, propertyKey, receiver) を返す。

10.4.5.6 [[Set]] ( propertyKey, value, receiver )

The [[Set]] internal method of a TypedArray obj takes arguments propertyKey (a property key), value (an ECMAScript language value), and receiver (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. propertyKey が String なら、
    1. numericIndexCanonicalNumericIndexString(propertyKey) とする。
    2. numericIndexundefined でなけれ ば、
      1. SameValue(obj, receiver) が true なら、
        1. TypedArraySetElement(obj, numericIndex, value) を実行する。
        2. true を返す。
      2. IsValidIntegerIndex(obj, numericIndex) が false なら、true を返す。
  2. OrdinarySet(obj, propertyKey, value, receiver) を返す。

10.4.5.7 [[Delete]] ( propertyKey )

The [[Delete]] internal method of a TypedArray obj takes argument propertyKey (a property key) and returns a normal completion containing a Boolean. It performs the following steps when called:

  1. propertyKey が String なら、
    1. numericIndexCanonicalNumericIndexString(propertyKey) とする。
    2. numericIndexundefined でなけれ ば、
      1. IsValidIntegerIndex(obj, numericIndex) が false なら、true を返す。
      2. false を返す。
  2. OrdinaryDelete(obj, propertyKey) を返 す。

10.4.5.8 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of a TypedArray obj takes no arguments and returns a normal completion containing a List of property keys. It performs the following steps when called:

  1. taRecordMakeTypedArrayWithBufferWitnessRecord(obj, seq-cst) とする。
  2. keys を新しい空の List とする。
  3. IsTypedArrayOutOfBounds(taRecord) が false なら、
    1. lengthTypedArrayLength(taRecord) とする。
    2. 0 ≤ i < length を満たす各整数 i に ついて、昇順で、次を行う
      1. ToString(𝔽(i)) を keys に append する。
  4. obj の各 own property key propertyKey について、propertyKey が String であり、 かつ integer index ではないものを、プロパテ ィ作成時刻の昇順で処理し、次を行う
    1. propertyKeykeys に append する。
  5. obj の各 own property key propertyKey について、propertyKey が Symbol であるも のを、プロパティ作成時刻の昇順で処理し、次を行 う
    1. propertyKeykeys に append す る。
  6. keys を返す。

10.4.5.9 TypedArray With Buffer Witness Record

TypedArray With Buffer Witness Record は、TypedArray と、その view された buffer の byte length の cache 値をあわせてカプセル化するために用いら れる Record 値である。これは、view された buffer が growable SharedArrayBuffer であるとき、byte length data block に対する ReadSharedMemory event が 1 回 だけになることを助けるために用いられる。

TypedArray With Buffer Witness Record は Table 27 に列挙されたフィールドを持つ。

Table 27: TypedArray With Buffer Witness Record Fields
フィールド名 意味
[[Object]] a TypedArray その buffer の byte length が読み込まれ る TypedArray
[[CachedBufferByteLength]] a non-negative integer or detached この Record が作成された時点における、オ ブジェクトの [[ViewedArrayBuffer]] の byte length。

10.4.5.10 MakeTypedArrayWithBufferWitnessRecord ( obj, order )

The abstract operation MakeTypedArrayWithBufferWitnessRecord takes arguments obj (a TypedArray) and order (seq-cst or unordered) and returns a TypedArray With Buffer Witness Record. It performs the following steps when called:

  1. bufferobj.[[ViewedArrayBuffer]] とす る。
  2. IsDetachedBuffer(buffer) が true な ら、
    1. byteLengthdetached とする。
  3. Else,
    1. byteLengthArrayBufferByteLength( buffer, order) とする。
  4. TypedArray With Buffer Witness Record { [[Object]]: obj, [[CachedBufferByteLength]]: byteLength } を返す。

10.4.5.11 TypedArrayCreate ( prototype )

The abstract operation TypedArrayCreate takes argument prototype (an Object) and returns a TypedArray. これは、新しい TypedArray の作成を規定するため に用いられる。 It performs the following steps when called:

  1. internalSlotsList を « [[Prototype]], [[Extensible]], [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] » とする。
  2. typedArrayMakeBasicObject(internalSlotsList) とす る。
  3. typedArray.[[PreventExtensions]]10.4.5.1 に規定されたとおりに設定する。
  4. typedArray.[[GetOwnProperty]]10.4.5.2 に規定されたとおりに設定する。
  5. typedArray.[[HasProperty]]10.4.5.3 に規定されたとおりに設定する。
  6. typedArray.[[DefineOwnProperty]]10.4.5.4 に規定されたとおりに設定する。
  7. typedArray.[[Get]]10.4.5.5 に規定されたとおりに設定する。
  8. typedArray.[[Set]]10.4.5.6 に規定されたとおりに設定する。
  9. typedArray.[[Delete]]10.4.5.7 に規定されたとおりに設定する。
  10. typedArray.[[OwnPropertyKeys]]10.4.5.8 に規定されたとおりに設定する。
  11. typedArray.[[Prototype]]prototype に 設定する。
  12. typedArray を返す。

10.4.5.12 TypedArrayByteLength ( taRecord )

The abstract operation TypedArrayByteLength takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a non-negative integer. It performs the following steps when called:

  1. Assert: IsTypedArrayOutOfBounds(taRecord) is false.
  2. objtaRecord.[[Object]] とする。
  3. obj.[[ByteLength]]auto でなけれ ば、obj.[[ByteLength]] を返す。
  4. lengthTypedArrayLength(taRecord) とする。
  5. elementSizeTypedArrayElementSize(obj) とする。
  6. NOTE: 返される byte length は、基底 buffer が非整数倍に resize されている場合でも、常 に elementSize の整数倍である。
  7. length × elementSize を返す。

10.4.5.13 TypedArrayLength ( taRecord )

The abstract operation TypedArrayLength takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a non-negative integer. It performs the following steps when called:

  1. Assert: IsTypedArrayOutOfBounds(taRecord) is false.
  2. objtaRecord.[[Object]] とする。
  3. obj.[[ArrayLength]]auto でなけれ ば、obj.[[ArrayLength]] を返す。
  4. Assert: IsFixedLengthArrayBuffer( obj.[[ViewedArrayBuffer]]) is false.
  5. byteOffsetobj.[[ByteOffset]] とす る。
  6. elementSizeTypedArrayElementSize(obj) とする。
  7. byteLengthtaRecord.[[CachedBufferByteLength]] とす る。
  8. Assert: byteLengthdetached ではな い。
  9. floor((byteLength - byteOffset) / elementSize) を返す。

10.4.5.14 IsTypedArrayOutOfBounds ( taRecord )

The abstract operation IsTypedArrayOutOfBounds takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a Boolean. これは、オブジェクトの数値プロパティのいずれかが、 基底 buffer の範囲内に含まれない index にある値を参 照しているかどうかを検査する。 It performs the following steps when called:

  1. objtaRecord.[[Object]] とする。
  2. bufferByteLengthtaRecord.[[CachedBufferByteLength]] とす る。
  3. IsDetachedBuffer(obj.[[ViewedArrayBuffer]]) が true なら、
    1. Assert: bufferByteLengthdetached である。
    2. true を返す。
  4. Assert: bufferByteLength は非負整数であ る。
  5. byteOffsetStartobj.[[ByteOffset]] とする。
  6. obj.[[ArrayLength]]auto なら、
    1. byteOffsetEndbufferByteLength とする。
  7. Else,
    1. elementSizeTypedArrayElementSize(obj) とする。
    2. arrayByteLengthobj.[[ArrayLength]] × elementSize とする。
    3. byteOffsetEndbyteOffsetStart + arrayByteLength とする。
  8. NOTE: [[ByteOffset]]bufferByteLength である長さ 0 の TypedArray は、範囲外とは みなされない。
  9. byteOffsetStart > bufferByteLength または byteOffsetEnd > bufferByteLength なら、true を返す。
  10. false を返す。

10.4.5.15 IsTypedArrayFixedLength ( obj )

The abstract operation IsTypedArrayFixedLength takes argument obj (a TypedArray) and returns a Boolean. It performs the following steps when called:

  1. obj.[[ArrayLength]]auto なら、 false を返す。
  2. bufferobj.[[ViewedArrayBuffer]] とする。
  3. IsFixedLengthArrayBuffer(buffer) が false かつ IsSharedArrayBuffer(buffer) が false なら、false を返す。
  4. true を返す。

10.4.5.16 IsValidIntegerIndex ( obj, index )

The abstract operation IsValidIntegerIndex takes arguments obj (a TypedArray) and index (a Number) and returns a Boolean. It performs the following steps when called:

  1. IsDetachedBuffer(obj.[[ViewedArrayBuffer]]) が true なら、false を返す。
  2. index が整数 Number でなければ、false を返す。
  3. index-0𝔽 であるか、また は index < -0𝔽 なら、 false を返す。
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(obj, unordered) とする。
  5. NOTE: obj の backing buffer が growable SharedArrayBuffer である場合、bounds checking は synchronizing operation では ない。
  6. IsTypedArrayOutOfBounds(taRecord) が true なら、false を返す。
  7. lengthTypedArrayLength(taRecord) とする。
  8. (index) ≥ length なら、false を返 す。
  9. true を返す。

10.4.5.17 TypedArrayGetElement ( obj, index )

The abstract operation TypedArrayGetElement takes arguments obj (a TypedArray) and index (a Number) and returns a Number, a BigInt, or undefined. It performs the following steps when called:

  1. IsValidIntegerIndex(obj, index) が false なら、undefined を返す。
  2. offsetobj.[[ByteOffset]] とする。
  3. elementSizeTypedArrayElementSize(obj) とする。
  4. byteIndexInBuffer を ((index) × elementSize) + offset とする。
  5. elementTypeTypedArrayElementType(obj) とする。
  6. GetValueFromBuffer(obj.[[ViewedArrayBuffer]], byteIndexInBuffer, elementType, true, unordered) を返す。

10.4.5.18 TypedArraySetElement ( obj, index, value )

The abstract operation TypedArraySetElement takes arguments obj (a TypedArray), index (a Number), and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. obj.[[ContentType]]bigint なら、 numValue を ? ToBigInt(value) とする。
  2. Else, numValue を ? ToNumber(value) とす る。
  3. IsValidIntegerIndex(obj, index) が true なら、
    1. offsetobj.[[ByteOffset]] とする。
    2. elementSizeTypedArrayElementSize(obj) とする。
    3. byteIndexInBuffer を ((index) × elementSize) + offset とする。
    4. elementTypeTypedArrayElementType(obj) とする。
    5. SetValueInBuffer(obj.[[ViewedArrayBuffer]], byteIndexInBuffer, elementType, numValue, true, unordered) を実行す る。
  4. unused を返す。
Note

この操作は常に成功したように見えるが、TypedArray の終端を越えて書き込もうとした場合、または detached ArrayBuffer に裏付けられた TypedArray に書き込もう とした場合には効果を持たない。

10.4.5.19 IsArrayBufferViewOutOfBounds ( obj )

The abstract operation IsArrayBufferViewOutOfBounds takes argument obj (a TypedArray or a DataView) and returns a Boolean. これは、TypedArray の数値プロパティのいずれか、 または DataView object のメソッドのいずれかが、基底 data block の範囲内に含まれない index にある値を参照 し得るかどうかを検査する。この抽象操作は、上流仕様の便宜 のために存在する。 It performs the following steps when called:

  1. obj[[DataView]] internal slot を持つ なら、
    1. viewRecordMakeDataViewWithBufferWitnessRecord( obj, seq-cst) とする。
    2. IsViewOutOfBounds(viewRecord) を返す。
  2. taRecordMakeTypedArrayWithBufferWitnessRecord(obj, seq-cst) とする。
  3. IsTypedArrayOutOfBounds(taRecord) を返す。

10.4.6 モジュール名前空間特殊オブジェクト

module namespace 特殊オブジェクトは、ECMAScript Module から export された束縛を公開する特殊オブジェ クトである(16.2.3 を参照)。module namespace 特殊オブジェクトの String key 付き own property と、Module によって export される束縛名との間には 1 対 1 の対応が存在する。export される束縛には、export * export item を用いて間接 的に export された束縛も含まれる。各 String 値の own property key は、対応する export 束縛名の StringValue である。これらが module namespace 特殊オ ブジェクトの唯一の String key 付き property である。 そのような各 property は { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false } という属性を持つ。module namespace 特殊オ ブジェクトは拡張可能ではない。

オブジェクトが module namespace 特殊オブジェクト であるのは、その [[GetPrototypeOf]][[SetPrototypeOf]][[IsExtensible]][[PreventExtensions]][[GetOwnProperty]][[DefineOwnProperty]][[HasProperty]][[Get]][[Set]][[Delete]]、および [[OwnPropertyKeys]] 内部メソッドがこの節の定義を用い、かつ他の本質的内部メソ ッドが 10.1 にある定義を用いる場合である。これらのメソッドは ModuleNamespaceCreate によって設定される。

module namespace 特殊オブジェクトは、 Table 28 で定義された内部スロットを持つ。

Table 28: Internal Slots of Module Namespace Exotic Objects
内部スロット 説明
[[Module]] a Module Record この namespace が公開する export を持つ Module Record
[[Exports]] a List of Strings このオブジェクトの own property として公 開される export 名の String 値を要素とす る List。list は code unit の辞書順に従 って整列される。

10.4.6.1 [[GetPrototypeOf]] ( )

The [[GetPrototypeOf]] internal method of a module namespace exotic object takes no arguments and returns a normal completion containing null. It performs the following steps when called:

  1. null を返す。

10.4.6.2 [[SetPrototypeOf]] ( proto )

The [[SetPrototypeOf]] internal method of a module namespace exotic object obj takes argument proto (an Object or null) and returns a normal completion containing a Boolean. It performs the following steps when called:

  1. SetImmutablePrototype(obj, proto) を返 す。

10.4.6.3 [[IsExtensible]] ( )

The [[IsExtensible]] internal method of a module namespace exotic object takes no arguments and returns a normal completion containing false. It performs the following steps when called:

  1. false を返す。

10.4.6.4 [[PreventExtensions]] ( )

The [[PreventExtensions]] internal method of a module namespace exotic object takes no arguments and returns a normal completion containing true. It performs the following steps when called:

  1. true を返す。

10.4.6.5 [[GetOwnProperty]] ( propertyKey )

The [[GetOwnProperty]] internal method of a module namespace exotic object obj takes argument propertyKey (a property key) and returns either a normal completion containing either a Property Descriptor or undefined, or a throw completion. It performs the following steps when called:

  1. propertyKey が Symbol なら、 OrdinaryGetOwnProperty(obj, propertyKey) を返す。
  2. exportsobj.[[Exports]] とする。
  3. exportspropertyKey を含まないなら、 undefined を返す。
  4. value を ? obj.[[Get]](propertyKey, obj) とする。
  5. PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false } を返す。

10.4.6.6 [[DefineOwnProperty]] ( propertyKey, desc )

The [[DefineOwnProperty]] internal method of a module namespace exotic object obj takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. propertyKey が Symbol なら、 ! OrdinaryDefineOwnProperty(obj, propertyKey, desc) を返す。
  2. current を ? obj.[[GetOwnProperty]]( propertyKey) とする。
  3. currentundefined なら、false を返す。
  4. desc[[Configurable]] フィールドを持ち、 かつ desc.[[Configurable]]true な ら、false を返す。
  5. desc[[Enumerable]] フィールドを持ち、 かつ desc.[[Enumerable]]false な ら、false を返す。
  6. IsAccessorDescriptor(desc) が true な ら、false を返す。
  7. desc[[Writable]] フィールドを持ち、 かつ desc.[[Writable]]false なら、 false を返す。
  8. desc[[Value]] フィールドを持つなら、 SameValue(desc.[[Value]], current.[[Value]]) を返す。
  9. true を返す。

10.4.6.7 [[HasProperty]] ( propertyKey )

The [[HasProperty]] internal method of a module namespace exotic object obj takes argument propertyKey (a property key) and returns a normal completion containing a Boolean. It performs the following steps when called:

  1. propertyKey が Symbol なら、 ! OrdinaryHasProperty(obj, propertyKey) を返す。
  2. exportsobj.[[Exports]] とする。
  3. exportspropertyKey を含むなら、 true を返す。
  4. false を返す。

10.4.6.8 [[Get]] ( propertyKey, receiver )

The [[Get]] internal method of a module namespace exotic object obj takes arguments propertyKey (a property key) and receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. propertyKey が Symbol なら、
    1. OrdinaryGet(obj, propertyKey, receiver) を返す。
  2. exportsobj.[[Exports]] とする。
  3. exportspropertyKey を含まないなら、 undefined を返す。
  4. moduleobj.[[Module]] とする。
  5. bindingmodule.ResolveExport( propertyKey) とする。
  6. Assert: bindingResolvedBinding Record である。
  7. targetModulebinding.[[Module]] とす る。
  8. Assert: targetModuleundefined では ない。
  9. binding.[[BindingName]]namespace な ら、
    1. GetModuleNamespace(targetModule) を返 す。
  10. targetEnvtargetModule.[[Environment]] とする。
  11. targetEnvempty なら、 ReferenceError 例外を送出する。
  12. targetEnv.GetBindingValue( binding.[[BindingName]], true) を返す。
Note

ResolveExport は副作用を持たない。この操作が特定の exportNameresolveSet の組を引数として呼び出さ れるたびに、同じ結果を返さなければならない。実装は、各 module namespace 特殊オブジェクト[[Exports]] に対 する ResolveExport の結果を事前計算または cache す ることを選んでもよい。

10.4.6.9 [[Set]] ( propertyKey, value, receiver )

The [[Set]] internal method of a module namespace exotic object takes arguments propertyKey (a property key), value (an ECMAScript language value), and receiver (an ECMAScript language value) and returns a normal completion containing false. It performs the following steps when called:

  1. false を返す。

10.4.6.10 [[Delete]] ( propertyKey )

The [[Delete]] internal method of a module namespace exotic object obj takes argument propertyKey (a property key) and returns a normal completion containing a Boolean. It performs the following steps when called:

  1. propertyKey が Symbol なら、
    1. OrdinaryDelete(obj, propertyKey) を返 す。
  2. exportsobj.[[Exports]] とする。
  3. exportspropertyKey を含むなら、 false を返す。
  4. true を返す。

10.4.6.11 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of a module namespace exotic object obj takes no arguments and returns a normal completion containing a List of property keys. It performs the following steps when called:

  1. exportsobj.[[Exports]] とする。
  2. symbolKeysOrdinaryOwnPropertyKeys(obj) とする。
  3. exportssymbolKeyslist-concatenation を返す。

10.4.6.12 ModuleNamespaceCreate ( module, exports )

The abstract operation ModuleNamespaceCreate takes arguments module (a Module Record) and exports (a List of Strings) and returns a module namespace exotic object. これは、新しい module namespace 特殊オブジェ クトの作成を規定するために用いられる。 It performs the following steps when called:

  1. Assert: module.[[Namespace]] is empty.
  2. internalSlotsListTable 28 に列挙された内部スロットとする。
  3. namespaceMakeBasicObject(internalSlotsList) とす る。
  4. namespace の本質的内部メソッドを 10.4.6 に規定された定義に設定する。
  5. namespace.[[Module]]module に設定す る。
  6. sortedExports を、exports の要素を code unit の辞書順に整列した List とする。
  7. namespace.[[Exports]]sortedExports に設定する。
  8. 28.3 の定義に対応する own property を namespace に作成する。
  9. module.[[Namespace]]namespace に設 定する。
  10. namespace を返す。

10.4.7 不変プロトタイプ特殊オブジェクト

不変プロトタイプ特殊オブジェクトは、一度初期化される と変更されない [[Prototype]] 内部スロットを持つ特殊オ ブジェクトである。

オブジェクトが 不変プロトタイプ特殊オブジェクト であるのは、その [[SetPrototypeOf]] 内部メソッドが次の 実装を用いる場合である。(そのほかの本質的内部メソッド は、対象となる具体的な不変プロトタイプ特殊オブジェクトに 応じて、任意の実装を用いてよい。)

Note

他の特殊オブジェクトと異なり、不変プロトタイプ特殊オ ブジェクトに対しては専用の作成抽象操作は提供されていな い。これは、それらが %Object.prototype% および host environment によってのみ使用され、host environment においては、関係するオブジェクトが他の点でも特殊であり得 るため、それら独自の専用作成操作を必要とするからである。

10.4.7.1 [[SetPrototypeOf]] ( proto )

The [[SetPrototypeOf]] internal method of an immutable prototype exotic object obj takes argument proto (an Object or null) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. SetImmutablePrototype(obj, proto) を返 す。

10.4.7.2 SetImmutablePrototype ( obj, proto )

The abstract operation SetImmutablePrototype takes arguments obj (an Object) and proto (an Object or null) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. current を ? obj.[[GetPrototypeOf]]() とする。
  2. SameValue(proto, current) が true なら、true を返す。
  3. false を返す。

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

Proxy オブジェクトは、その本質的内部メソッドが ECMAScript code を用いて部分的に実装される特殊オブジェ クトである。すべての Proxy オブジェクトは [[ProxyHandler]] と呼ばれる内部スロットを持つ。 [[ProxyHandler]] の値は、proxy の handler object と呼ばれる object、または null である。handler object のメソッド (Table 29 を参照)は、Proxy オブジェクトの 1 つ以上の内部メソッド の実装を補強するために用いられ得る。すべての Proxy オブ ジェクトはまた [[ProxyTarget]] と呼ばれる内部スロットを 持ち、その値は object または null のいずれかである。 この object は proxy の target object と呼ば れる。

オブジェクトが Proxy 特殊オブジェクト であるのは、その本質的内部メソッド(該当する場合、 [[Call]] および [[Construct]] を含む)がこの節の定義を 用いる場合である。これらの内部メソッドは ProxyCreate に おいて設定される。

Table 29: Proxy Handler Methods
内部メソッド handler メソッド
[[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

handler メソッドが Proxy オブジェクトの内部メソッ ド実装を提供するために呼び出されるとき、その handler メソッドには proxy の target object が引数として渡され る。proxy の handler object は、必ずしもすべての本質 的内部メソッドに対応するメソッドを持つわけではない。 handler object が内部 trap に対応するメソッドを持たな い場合、proxy 上で内部メソッドを起動すると、proxy の target object 上の対応する内部メソッドの起動が結果とし て生じる。

Proxy オブジェクトの [[ProxyHandler]] および [[ProxyTarget]] 内部スロットは、オブジェクトが作成される とき常に初期化され、通常は変更できない。いくつかの Proxy オブジェクトは、その後 revoked されることを許す 方法で作成される。proxy が revoked されると、その [[ProxyHandler]] および [[ProxyTarget]] 内部スロットは null に設定され、それによりその Proxy オブジェクト上 の内部メソッドの以後の起動は TypeError 例外を送出す るようになる。

Proxy オブジェクトは、任意の ECMAScript code によ って内部メソッドの実装を提供することを許すため、 6.1.7.3 で定義された不変条件に違反する handler メソッドを持つ Proxy オブジェクトを定義することが可能である。 6.1.7.3 で定義された内部メソッド不変条件のいくつかは、本質的完全 性不変条件である。これらの不変条件は、この節で規定される Proxy オブジェクト内部メソッドによって明示的に強制され る。ECMAScript 実装は、起こり得るすべての不変条件違反の 存在下でも堅牢でなければならない。

以下のアルゴリズム記述において、obj は ECMAScript Proxy object、propertyKeyproperty key 値、value は任意の ECMAScript 言語 値、そして descProperty Descriptor record であると仮定する。

10.5.1 [[GetPrototypeOf]] ( )

The [[GetPrototypeOf]] internal method of a Proxy exotic object obj takes no arguments and returns either a normal completion containing either an Object or null, or a throw completion. It performs the following steps when called:

  1. ValidateNonRevokedProxy(obj) を実行する。
  2. targetobj.[[ProxyTarget]] とする。
  3. handlerobj.[[ProxyHandler]] とする。
  4. Assert: handler は Object である。
  5. trap を ? GetMethod(handler, "getPrototypeOf") とする。
  6. trapundefined なら、
    1. target.[[GetPrototypeOf]]() を返す。
  7. handlerProto を ? Call(trap, handler, « target ») とする。
  8. handlerProto が Object でなく、かつ handlerProtonull でもないなら、 TypeError 例外を送出する。
  9. extensibleTarget を ? IsExtensible(target) とする。
  10. extensibleTargettrue なら、 handlerProto を返す。
  11. targetProto を ? target.[[GetPrototypeOf]]() とする。
  12. SameValue(handlerProto, targetProto) が false なら、TypeError 例外を送出する。
  13. handlerProto を返す。
Note

Proxy object に対する [[GetPrototypeOf]] は次 の不変条件を強制する:

  • [[GetPrototypeOf]] の結果は Object または null のいずれかでなければならない。
  • target object が拡張可能でない場合、 Proxy object に適用された [[GetPrototypeOf]] は、Proxy object の target object に適用 された [[GetPrototypeOf]] と同じ値を返さ なければならない。

10.5.2 [[SetPrototypeOf]] ( proto )

The [[SetPrototypeOf]] internal method of a Proxy exotic object obj takes argument proto (an Object or null) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ValidateNonRevokedProxy(obj) を実行する。
  2. targetobj.[[ProxyTarget]] とする。
  3. handlerobj.[[ProxyHandler]] とする。
  4. Assert: handler は Object である。
  5. trap を ? GetMethod(handler, "setPrototypeOf") とする。
  6. trapundefined なら、
    1. target.[[SetPrototypeOf]](proto) を返す。
  7. booleanTrapResultToBoolean(? Call( trap, handler, « target, proto »)) とする。
  8. booleanTrapResultfalse なら、 false を返す。
  9. extensibleTarget を ? IsExtensible(target) とする。
  10. extensibleTargettrue なら、 true を返す。
  11. targetProto を ? target.[[GetPrototypeOf]]() とする。
  12. SameValue(proto, targetProto) が false なら、TypeError 例外を送出する。
  13. true を返す。
Note

Proxy object に対する [[SetPrototypeOf]] は次 の不変条件を強制する:

  • [[SetPrototypeOf]] の結果は Boolean 値であ る。
  • target object が拡張可能でない場合、引数の 値は target object に適用された [[GetPrototypeOf]] の結果と同じでなければな らない。

10.5.3 [[IsExtensible]] ( )

The [[IsExtensible]] internal method of a Proxy exotic object obj takes no arguments and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ValidateNonRevokedProxy(obj) を実行する。
  2. targetobj.[[ProxyTarget]] とする。
  3. handlerobj.[[ProxyHandler]] とする。
  4. Assert: handler は Object である。
  5. trap を ? GetMethod(handler, "isExtensible") とする。
  6. trapundefined なら、
    1. IsExtensible(target) を返す。
  7. booleanTrapResultToBoolean(? Call( trap, handler, « target »)) とする。
  8. targetResult を ? IsExtensible(target) とする。
  9. booleanTrapResulttargetResult でない なら、TypeError 例外を送出する。
  10. booleanTrapResult を返す。
Note

Proxy object に対する [[IsExtensible]] は次 の不変条件を強制する:

  • [[IsExtensible]] の結果は Boolean 値であ る。
  • Proxy object に適用された [[IsExtensible]] は、同じ引数で Proxy object の target object に適用された [[IsExtensible]] と同 じ値を返さなければならない。

10.5.4 [[PreventExtensions]] ( )

The [[PreventExtensions]] internal method of a Proxy exotic object obj takes no arguments and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ValidateNonRevokedProxy(obj) を実行する。
  2. targetobj.[[ProxyTarget]] とする。
  3. handlerobj.[[ProxyHandler]] とする。
  4. Assert: handler は Object である。
  5. trap を ? GetMethod(handler, "preventExtensions") とする。
  6. trapundefined なら、
    1. target.[[PreventExtensions]]() を返す。
  7. booleanTrapResultToBoolean(? Call( trap, handler, « target »)) とする。
  8. booleanTrapResulttrue なら、
    1. extensibleTarget を ? IsExtensible(target) とする。
    2. extensibleTargettrue なら、 TypeError 例外を送出する。
  9. booleanTrapResult を返す。
Note

Proxy object に対する [[PreventExtensions]] は次の不変条件を強制する:

  • [[PreventExtensions]] の結果は Boolean 値で ある。
  • Proxy object に適用された [[PreventExtensions]] は、Proxy object の target object に適用された [[IsExtensible]]false である場合にのみ true を返 す。

10.5.5 [[GetOwnProperty]] ( propertyKey )

The [[GetOwnProperty]] internal method of a Proxy exotic object obj takes argument propertyKey (a property key) and returns either a normal completion containing either a Property Descriptor or undefined, or a throw completion. It performs the following steps when called:

  1. ValidateNonRevokedProxy(obj) を実行する。
  2. targetobj.[[ProxyTarget]] とする。
  3. handlerobj.[[ProxyHandler]] とする。
  4. Assert: handler は Object である。
  5. trap を ? GetMethod(handler, "getOwnPropertyDescriptor") とする。
  6. trapundefined なら、
    1. target.[[GetOwnProperty]](propertyKey) を返す。
  7. trapResultObj を ? Call(trap, handler, « target, propertyKey ») とする。
  8. trapResultObj が Object でなく、かつ undefined でもないなら、TypeError 例外 を送出する。
  9. targetDesc を ? target.[[GetOwnProperty]](propertyKey) とする。
  10. trapResultObjundefined なら、
    1. targetDescundefined なら、 undefined を返す。
    2. targetDesc.[[Configurable]]false な ら、TypeError 例外を送出する。
    3. extensibleTarget を ? IsExtensible(target) とする。
    4. extensibleTargetfalse なら、 TypeError 例外を送出する。
    5. undefined を返す。
  11. extensibleTarget を ? IsExtensible(target) とする。
  12. resultDesc を ? ToPropertyDescriptor(trapResultObj) とす る。
  13. CompletePropertyDescriptor(resultDesc) を実 行する。
  14. validIsCompatiblePropertyDescriptor( extensibleTarget, resultDesc, targetDesc) とする。
  15. validfalse なら、TypeError 例外 を送出する。
  16. resultDesc.[[Configurable]]false な ら、
    1. targetDescundefined または targetDesc.[[Configurable]]true なら、
      1. TypeError 例外を送出する。
    2. resultDesc[[Writable]] フィールドを持 ち、かつ resultDesc.[[Writable]]false なら、
      1. Assert: targetDesc[[Writable]] フィールドを持つ。
      2. targetDesc.[[Writable]]true な ら、TypeError 例外を送出する。
  17. resultDesc を返す。
Note

Proxy object に対する [[GetOwnProperty]] は 次の不変条件を強制する:

  • [[GetOwnProperty]] の結果は Property Descriptor または undefined のいずれか でなければならない。
  • property は、target object の non-configurable own property として存 在する場合、存在しないものとして報告されてはな らない。
  • property は、拡張可能でない target object の own property として存在する場合、存在し ないものとして報告されてはならない。
  • property は、target object の own property として存在せず、かつ target object が拡張可能でない場合、存在するものとして報告さ れてはならない。
  • property は、それが target object の non-configurable own property として存在 しない限り、non-configurable として報告さ れてはならない。
  • property は、それが target object の non-configurable かつ non-writable own property として存在しない限り、 non-configurable かつ non-writable の 両方として報告されてはならない。

10.5.6 [[DefineOwnProperty]] ( propertyKey, desc )

The [[DefineOwnProperty]] internal method of a Proxy exotic object obj takes arguments propertyKey (a property key) and desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ValidateNonRevokedProxy(obj) を実行する。
  2. targetobj.[[ProxyTarget]] とする。
  3. handlerobj.[[ProxyHandler]] とする。
  4. Assert: handler は Object である。
  5. trap を ? GetMethod(handler, "defineProperty") とする。
  6. trapundefined なら、
    1. target.[[DefineOwnProperty]](propertyKey, desc) を返す。
  7. descObjFromPropertyDescriptor(desc) と する。
  8. booleanTrapResultToBoolean(? Call( trap, handler, « target, propertyKey, descObj »)) とする。
  9. booleanTrapResultfalse なら、 false を返す。
  10. targetDesc を ? target.[[GetOwnProperty]](propertyKey) とする。
  11. extensibleTarget を ? IsExtensible(target) とする。
  12. desc[[Configurable]] フィールドを持ち、 かつ desc.[[Configurable]]false な ら、
    1. settingConfigFalsetrue とする。
  13. Else,
    1. settingConfigFalsefalse とする。
  14. targetDescundefined なら、
    1. extensibleTargetfalse なら、 TypeError 例外を送出する。
    2. settingConfigFalsetrue なら、 TypeError 例外を送出する。
  15. Else,
    1. IsCompatiblePropertyDescriptor( extensibleTarget, desc, targetDesc) が false なら、TypeError 例外を送出す る。
    2. settingConfigFalsetrue かつ targetDesc.[[Configurable]]true なら、TypeError 例外を送出する。
    3. IsDataDescriptor(targetDesc) が truetargetDesc.[[Configurable]]false、 かつ targetDesc.[[Writable]]true なら、
      1. desc[[Writable]] フィールドを持ち、 かつ desc.[[Writable]]false な ら、TypeError 例外を送出する。
  16. true を返す。
Note

Proxy object に対する [[DefineOwnProperty]] は次の不変条件を強制する:

  • [[DefineOwnProperty]] の結果は Boolean 値で ある。
  • target object が拡張可能でない場合、 property を追加することはできない。
  • target object に対応する non-configurable own property が存在しな い限り、property を non-configurable に することはできない。
  • target object に対応する non-configurable かつ non-writable own property が存在しない限り、 non-configurable property を non-writable にすることはできない。
  • property に対応する target object の property が存在する場合、その Property Descriptor[[DefineOwnProperty]] を用 いて target object に適用しても例外を送出 してはならない。

10.5.7 [[HasProperty]] ( propertyKey )

The [[HasProperty]] internal method of a Proxy exotic object obj takes argument propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ValidateNonRevokedProxy(obj) を実行する。
  2. targetobj.[[ProxyTarget]] とする。
  3. handlerobj.[[ProxyHandler]] とする。
  4. Assert: handler は Object である。
  5. trap を ? GetMethod(handler, "has") とする。
  6. trapundefined なら、
    1. target.[[HasProperty]](propertyKey) を返す。
  7. booleanTrapResultToBoolean(? Call( trap, handler, « target, propertyKey »)) とする。
  8. booleanTrapResultfalse なら、
    1. targetDesc を ? target.[[GetOwnProperty]](propertyKey) とする。
    2. targetDescundefined でなければ、
      1. targetDesc.[[Configurable]]false なら、TypeError 例外を送出する。
      2. extensibleTarget を ? IsExtensible(target) とする。
      3. extensibleTargetfalse なら、 TypeError 例外を送出する。
  9. booleanTrapResult を返す。
Note

Proxy object に対する [[HasProperty]] は次 の不変条件を強制する:

  • [[HasProperty]] の結果は Boolean 値である。
  • property は、target object の non-configurable own property として存 在する場合、存在しないものとして報告されてはな らない。
  • property は、target object の own property として存在し、かつ target object が拡張可能でない場合、存在しないものとして報告 されてはならない。

10.5.8 [[Get]] ( propertyKey, receiver )

The [[Get]] internal method of a Proxy exotic object obj takes arguments propertyKey (a property key) and receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. ValidateNonRevokedProxy(obj) を実行する。
  2. targetobj.[[ProxyTarget]] とする。
  3. handlerobj.[[ProxyHandler]] とする。
  4. Assert: handler は Object である。
  5. trap を ? GetMethod(handler, "get") とする。
  6. trapundefined なら、
    1. target.[[Get]](propertyKey, receiver) を返す。
  7. trapResult を ? Call(trap, handler, « target, propertyKey, receiver ») とする。
  8. targetDesc を ? target.[[GetOwnProperty]](propertyKey) とする。
  9. targetDescundefined でなく、かつ targetDesc.[[Configurable]]false なら、
    1. IsDataDescriptor(targetDesc) が true かつ targetDesc.[[Writable]]false なら、
      1. SameValue(trapResult, targetDesc.[[Value]]) が false な ら、TypeError 例外を送出する。
    2. IsAccessorDescriptor(targetDesc) が true かつ targetDesc.[[Get]]undefined なら、
      1. trapResultundefined でなけれ ば、TypeError 例外を送出する。
  10. trapResult を返す。
Note

Proxy object に対する [[Get]] は次の不変条 件を強制する:

  • target object の property が non-writable かつ non-configurable な own data property である場合、property に対して報告される値は、対応する target object property の値と同じでなければならな い。
  • 対応する target object property が、 [[Get]] 属性として undefined を持つ non-configurable own accessor property である場合、property に対して報告される値 は undefined でなければならない。

10.5.9 [[Set]] ( propertyKey, value, receiver )

The [[Set]] internal method of a Proxy exotic object obj takes arguments propertyKey (a property key), value (an ECMAScript language value), and receiver (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ValidateNonRevokedProxy(obj) を実行する。
  2. targetobj.[[ProxyTarget]] とする。
  3. handlerobj.[[ProxyHandler]] とする。
  4. Assert: handler は Object である。
  5. trap を ? GetMethod(handler, "set") とする。
  6. trapundefined なら、
    1. target.[[Set]](propertyKey, value, receiver) を返す。
  7. booleanTrapResultToBoolean(? Call( trap, handler, « target, propertyKey, value, receiver »)) とする。
  8. booleanTrapResultfalse なら、 false を返す。
  9. targetDesc を ? target.[[GetOwnProperty]](propertyKey) とする。
  10. targetDescundefined でなく、かつ targetDesc.[[Configurable]]false なら、
    1. IsDataDescriptor(targetDesc) が true かつ targetDesc.[[Writable]]false なら、
      1. SameValue(value, targetDesc.[[Value]]) が false なら、TypeError 例外を送 出する。
    2. IsAccessorDescriptor(targetDesc) が true なら、
      1. targetDesc.[[Set]]undefined なら、TypeError 例外を送出する。
  11. true を返す。
Note

Proxy object に対する [[Set]] は次の不変条件 を強制する:

  • [[Set]] の結果は Boolean 値である。
  • 対応する target object property が non-writable かつ non-configurable な own data property である場合、その property の値を対応する target object property の値と異なるものに変更することはで きない。
  • 対応する target object property が、 [[Set]] 属性として undefined を持つ non-configurable own accessor property である場合、その property の値を設定するこ とはできない。

10.5.10 [[Delete]] ( propertyKey )

The [[Delete]] internal method of a Proxy exotic object obj takes argument propertyKey (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ValidateNonRevokedProxy(obj) を実行する。
  2. targetobj.[[ProxyTarget]] とする。
  3. handlerobj.[[ProxyHandler]] とする。
  4. Assert: handler は Object である。
  5. trap を ? GetMethod(handler, "deleteProperty") とする。
  6. trapundefined なら、
    1. target.[[Delete]](propertyKey) を返す。
  7. booleanTrapResultToBoolean(? Call( trap, handler, « target, propertyKey »)) とする。
  8. booleanTrapResultfalse なら、 false を返す。
  9. targetDesc を ? target.[[GetOwnProperty]](propertyKey) とする。
  10. targetDescundefined なら、true を返す。
  11. targetDesc.[[Configurable]]false な ら、TypeError 例外を送出する。
  12. extensibleTarget を ? IsExtensible(target) とする。
  13. extensibleTargetfalse なら、 TypeError 例外を送出する。
  14. true を返す。
Note

Proxy object に対する [[Delete]] は次の不変 条件を強制する:

  • [[Delete]] の結果は Boolean 値である。
  • property は、target object の non-configurable own property として存 在する場合、削除されたものとして報告されてはな らない。
  • property は、target object の own property として存在し、かつ target object が non-extensible である場合、削除されたも のとして報告されてはならない。

10.5.11 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of a Proxy exotic object obj takes no arguments and returns either a normal completion containing a List of property keys or a throw completion. It performs the following steps when called:

  1. ValidateNonRevokedProxy(obj) を実行する。
  2. targetobj.[[ProxyTarget]] とする。
  3. handlerobj.[[ProxyHandler]] とする。
  4. Assert: handler は Object である。
  5. trap を ? GetMethod(handler, "ownKeys") とする。
  6. trapundefined なら、
    1. target.[[OwnPropertyKeys]]() を返す。
  7. trapResultArray を ? Call(trap, handler, « target ») とする。
  8. trapResult を ? CreateListFromArrayLike(trapResultArray, property-key) とする。
  9. trapResult に重複要素が含まれるなら、 TypeError 例外を送出する。
  10. extensibleTarget を ? IsExtensible(target) とする。
  11. targetKeys を ? target.[[OwnPropertyKeys]]() とする。
  12. Assert: targetKeysproperty keyList である。
  13. Assert: targetKeys は重複要素を含まない。
  14. targetConfigurableKeys を新しい空の List とする。
  15. targetNonconfigurableKeys を新しい空の List とする。
  16. targetKeys の各要素 key について、次を行う
    1. desc を ? target.[[GetOwnProperty]](key) とする。
    2. descundefined でなく、かつ desc.[[Configurable]]false なら、
      1. keytargetNonconfigurableKeys に append する。
    3. Else,
      1. keytargetConfigurableKeys に append する。
  17. extensibleTargettrue かつ targetNonconfigurableKeys が空なら、
    1. trapResult を返す。
  18. uncheckedResultKeys を、その要素が trapResult の要素である List とする。
  19. targetNonconfigurableKeys の各要素 key について、次を行う
    1. uncheckedResultKeyskey を含まなけ れば、TypeError 例外を送出する。
    2. uncheckedResultKeys から key を除去す る。
  20. extensibleTargettrue なら、 trapResult を返す。
  21. targetConfigurableKeys の各要素 key に ついて、次を行う
    1. uncheckedResultKeyskey を含まなけ れば、TypeError 例外を送出する。
    2. uncheckedResultKeys から key を除去す る。
  22. uncheckedResultKeys が空でなければ、 TypeError 例外を送出する。
  23. trapResult を返す。
Note

Proxy object に対する [[OwnPropertyKeys]] は 次の不変条件を強制する:

  • [[OwnPropertyKeys]] の結果は List である。
  • 返される List は重複要素を含まない。
  • 返される List の各要素は property key であ る。
  • 結果の List は、target object のすべての non-configurable own property の key を 含まなければならない。
  • target object が拡張可能でない場合、結果の List は target object の own property のすべての key を含み、かつそれ以外の値を含ん ではならない。

10.5.12 [[Call]] ( thisArgument, argumentsList )

The [[Call]] internal method of a Proxy exotic object obj takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. ValidateNonRevokedProxy(obj) を実行する。
  2. targetobj.[[ProxyTarget]] とする。
  3. handlerobj.[[ProxyHandler]] とする。
  4. Assert: handler は Object である。
  5. trap を ? GetMethod(handler, "apply") とする。
  6. trapundefined なら、
    1. Call(target, thisArgument, argumentsList) を返す。
  7. argArrayCreateArrayFromList(argumentsList) とする。
  8. Call(trap, handler, « target, thisArgument, argArray ») を返す。
Note

Proxy 特殊オブジェクト[[Call]] 内部メソッドを持 つのは、その [[ProxyTarget]] 内部スロットの初期値が [[Call]] 内部メソッドを持つ object である場合に限られ る。

10.5.13 [[Construct]] ( argumentsList, newTarget )

The [[Construct]] internal method of a Proxy exotic object obj takes arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. ValidateNonRevokedProxy(obj) を実行する。
  2. targetobj.[[ProxyTarget]] とする。
  3. Assert: IsConstructor(target) is true.
  4. handlerobj.[[ProxyHandler]] とする。
  5. Assert: handler は Object である。
  6. trap を ? GetMethod(handler, "construct") とする。
  7. trapundefined なら、
    1. Construct(target, argumentsList, newTarget) を返す。
  8. argArrayCreateArrayFromList(argumentsList) とする。
  9. newObj を ? Call(trap, handler, « target, argArray, newTarget ») とす る。
  10. newObj が Object でなければ、 TypeError 例外を送出する。
  11. newObj を返す。
Note 1

Proxy 特殊オブジェクト[[Construct]] 内部メソッ ドを持つのは、その [[ProxyTarget]] 内部スロットの初期値 が [[Construct]] 内部メソッドを持つ object である場合 に限られる。

Note 2

Proxy object に対する [[Construct]] は次の不 変条件を強制する:

  • [[Construct]] の結果は Object でなければなら ない。

10.5.14 ValidateNonRevokedProxy ( proxy )

The abstract operation ValidateNonRevokedProxy takes argument proxy (a Proxy exotic object) and returns either a normal completion containing unused or a throw completion. これは、proxy が revoked されている場合に TypeError 例外を送出する。 It performs the following steps when called:

  1. proxy.[[ProxyTarget]]null なら、 TypeError 例外を送出する。
  2. Assert: proxy.[[ProxyHandler]]null ではない。
  3. unused を返す。

10.5.15 ProxyCreate ( target, handler )

The abstract operation ProxyCreate takes arguments target (an ECMAScript language value) and handler (an ECMAScript language value) and returns either a normal completion containing a Proxy exotic object or a throw completion. これは、新しい Proxy object の作成を規定する ために用いられる。 It performs the following steps when called:

  1. target が Object でなければ、 TypeError 例外を送出する。
  2. handler が Object でなければ、 TypeError 例外を送出する。
  3. proxyMakeBasicObject( « [[ProxyHandler]], [[ProxyTarget]] ») とする。
  4. proxy の本質的内部メソッドのうち [[Call]] および [[Construct]] を除くものを、 10.5 に規定された定義に設定する。
  5. IsCallable(target) が true なら、
    1. proxy.[[Call]]10.5.12 に規定されたとおりに設定する。
    2. IsConstructor(target) が true なら、
      1. proxy.[[Construct]]10.5.13 に規定されたとおりに設定する。
  6. proxy.[[ProxyTarget]]target に設定す る。
  7. proxy.[[ProxyHandler]]handler に設定 する。
  8. proxy を返す。

11 ECMAScript 言語: ソーステキスト

11.1 ソーステキスト

構文

SourceCharacter :: 任意の Unicode 符号位置

ECMAScript ソーステキストは、Unicode 符号位置の並びである。ECMAScript の文法によって許可される箇所では、サロゲート符号位置を含め、U+0000 から U+10FFFF までのすべての Unicode 符号位置の値が ECMAScript ソーステキスト中に現れ得る。ECMAScript ソーステキストの保存および交換に用いられる実際のエンコーディングは、この仕様においては関係しない。外部のソーステキストのエンコーディングに関係なく、適合する ECMAScript 実装は、ソーステキストを、各 SourceCharacter が Unicode 符号位置である等価な SourceCharacter 値の並びであるかのように処理する。適合する ECMAScript 実装は、ソーステキストに対していかなる正規化も行う必要はなく、またソーステキストの正規化を行っているかのように振る舞う必要もない。

結合文字列の各構成要素は、利用者がその列全体を単一の文字と見なすかもしれない場合であっても、個別の Unicode 符号位置として扱われる。

Note

文字列リテラル、正規表現リテラル、テンプレートリテラル、および識別子においては、任意の 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 ( cp )

The abstract operation UTF16EncodeCodePoint takes argument cp (a Unicode code point) and returns a String. It performs the following steps when called:

  1. Assert: 0 ≤ cp ≤ 0x10FFFF.
  2. cp ≤ 0xFFFF なら、数値が cp である code unit からなる String 値を返す。
  3. cu1 を、数値が floor((cp - 0x10000) / 0x400) + 0xD800 である code unit とする。
  4. cu2 を、数値が ((cp - 0x10000) modulo 0x400) + 0xDC00 である code unit とする。
  5. cu1cu2string-concatenation を返す。

11.1.2 Static Semantics: CodePointsToString ( text )

The abstract operation CodePointsToString takes argument text (a sequence of Unicode code points) and returns a String. これは、6.1.4 に記述されるように、text を String 値へ変換する。 It performs the following steps when called:

  1. result を空の String とする。
  2. text の各 code point cp について、次を行う
    1. resultresultUTF16EncodeCodePoint(cp) の string-concatenation に設定する。
  3. result を返す。

11.1.3 Static Semantics: UTF16SurrogatePairToCodePoint ( lead, trail )

The abstract operation UTF16SurrogatePairToCodePoint takes arguments lead (a code unit) and trail (a code unit) and returns a code point. UTF-16 のサロゲート対を形成する 2 つの code unit は、1 つの code point に変換される。 It performs the following steps when called:

  1. Assert: lead は上位サロゲートであり、trail は下位サロゲートである。
  2. cp を (lead - 0xD800) × 0x400 + (trail - 0xDC00) + 0x10000 とする。
  3. code point cp を返す。

11.1.4 Static Semantics: CodePointAt ( string, position )

The abstract operation CodePointAt takes arguments string (a String) and position (a non-negative integer) and returns a Record with fields [[CodePoint]] (a code point), [[CodeUnitCount]] (a positive integer), and [[IsUnpairedSurrogate]] (a Boolean). これは、6.1.4 に記述されるように string を UTF-16 で符号化された code point の並びとして解釈し、その index position にある code unit から始まる 1 個の code point を読み取る。 It performs the following steps when called:

  1. sizestring の長さとする。
  2. Assert: position ≥ 0 and position < size.
  3. firststring 内の index position にある code unit とする。
  4. cp を、数値が first の数値である code point とする。
  5. first が上位サロゲートでも下位サロゲートでもないなら、
    1. Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false } を返す。
  6. first が下位サロゲートであるか、または position + 1 = size なら、
    1. Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true } を返す。
  7. secondstring 内の index position + 1 にある code unit とする。
  8. second が下位サロゲートでないなら、
    1. Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true } を返す。
  9. cpUTF16SurrogatePairToCodePoint(first, second) に設定する。
  10. Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false } を返す。

11.1.5 Static Semantics: StringToCodePoints ( string )

The abstract operation StringToCodePoints takes argument string (a String) and returns a List of code points. これは、6.1.4 に記述されるように、string を UTF-16 で符号化された Unicode テキストとして解釈した結果得られる Unicode code point の並びを返す。 It performs the following steps when called:

  1. codePoints を新しい空の List とする。
  2. sizestring の長さとする。
  3. position を 0 とする。
  4. position < size の間、繰り返す
    1. cpCodePointAt(string, position) とする。
    2. cp.[[CodePoint]]codePoints に append する。
    3. positionposition + cp.[[CodeUnitCount]] に設定する。
  5. codePoints を返す。

11.1.6 Static Semantics: ParseText ( sourceText, goalSymbol )

The abstract operation ParseText takes arguments sourceText (a String or a sequence of Unicode code points) and goalSymbol (a nonterminal in one of the ECMAScript grammars) and returns a Parse Node or a non-empty List of SyntaxError objects. It performs the following steps when called:

  1. sourceText が String なら、sourceTextStringToCodePoints(sourceText) に設定する。
  2. goalSymbol を目標記号として sourceText の parse を試み、その parse 結果について early error 条件を解析する。parse と early error 検出は、implementation-defined な方法で交互に行われてもよい。
  3. parse が成功し、かつ early error が見つからなかったなら、parse の結果得られた parse tree の根にある Parse NodegoalSymbol の instance)を返す。
  4. parse error および / または early error を表す 1 個以上の SyntaxError object の List を返す。複数の parse error または early error が存在する場合、List 中の error object の数および順序は implementation-defined であるが、少なくとも 1 個は存在しなければならない。
Note 1

あるテキストにおいて、ある地点に early error があり、さらに後の地点に syntax error もある場合を考える。parse の pass の後に early error の pass を行う実装は、syntax error を報告して early error の pass には進まないかもしれない。2 つの処理を交互に行う実装は、early error を報告して syntax error を見つける処理には進まないかもしれない。第三の実装は、両方の error を報告するかもしれない。これらの挙動はいずれも適合している。

Note 2

17 も参照。

11.2 ソースコードの種類

ECMAScript コードには 4 種類ある:

Note 1

関数コードは通常、関数定義(15.2)、Arrow 関数定義(15.3)、メソッド定義(15.4)、Generator 関数定義(15.5)、Async 関数定義(15.8)、Async Generator 関数定義(15.6)、および Async Arrow 関数(15.9)の本体として与えられる。関数コードはまた、Function constructor20.2.1.1)、GeneratorFunction constructor27.3.1.1)、AsyncFunction constructor27.7.1.1)、および AsyncGeneratorFunction constructor27.4.1.1)への引数からも導出される。

Note 2

BindingIdentifier を関数コードに含めることの実際上の効果は、strict mode code に対する Early Errors が、その本体に "use strict" directive を含む関数の名前である BindingIdentifier にも適用されるということであり、たとえ周囲のコードが strict mode code でなくてもそうである。

11.2.1 Directive Prologue と Use Strict Directive

Directive Prologue とは、FunctionBodyScriptBody、または ModuleBody の先頭の StatementListItem または ModuleItem として現れる ExpressionStatement のうち最長の列であって、その列中の各 ExpressionStatementStringLiteral token とそれに続くセミコロンだけから構成されるものをいう。セミコロンは明示的に現れてもよいし、自動セミコロン挿入(12.10)によって挿入されてもよい。Directive Prologue は空の列であってもよい。

Use Strict Directive とは、Directive Prologue 内の ExpressionStatement であって、その StringLiteral が正確に "use strict" または 'use strict' のいずれかの code point 列であるものをいう。Use Strict DirectiveEscapeSequence または LineContinuation を含んではならない。

Directive Prologue は複数の Use Strict Directive を含んでもよい。ただし、その場合、実装は警告を出してもよい。

Note

Directive PrologueExpressionStatement は、それを含む生成規則の評価中に通常どおり評価される。実装は、Use Strict Directive ではなく、かつ Directive Prologue 内に現れる ExpressionStatement に対して、実装固有の意味を定義してもよい。適切な通知機構が存在するなら、Directive Prologue 内で、Use Strict Directive ではなく、かつ実装によって意味が定義されていない ExpressionStatement に遭遇した場合、実装は警告を出すべきである。

11.2.2 Strict Mode Code

ECMAScript の構文単位は、制限なしまたは strict mode の構文および意味論(4.3.2)のいずれかを用いて処理され得る。コードは、次の状況では strict mode code として解釈される:

strict mode code でない ECMAScript code は、non-strict code と呼ばれる。

11.2.2.1 Static Semantics: IsStrict ( node )

The abstract operation IsStrict takes argument node (a Parse Node) and returns a Boolean. It performs the following steps when called:

  1. node に対応するソーステキストが strict mode code なら、true を返す。
  2. false を返す。

11.2.3 非 ECMAScript 関数

ECMAScript 実装は、その評価動作が ECMAScript ソーステキスト以外の、何らかの host-defined な実行可能コード形式で表現される関数特殊オブジェクトの評価をサポートしてもよい。関数オブジェクトが ECMAScript code 内で定義されたものであるか、あるいは組込み関数であるかは、そのような関数オブジェクトを呼び出す、またはそのような関数オブジェクトから呼び出される ECMAScript code の観点からは観測不能である。

12 ECMAScript 言語: 字句文法

ECMAScript Script または Module のソーステキス トは、まず入力要素の列へ変換される。これらは token、 line terminator、comment、または white space である。ソーステキストは左から右へ走査され、繰り返し、次 の入力要素として可能な限り最長の code point 列を取 る。

字句入力要素の識別が、それらの入力要素を消費する構文文 法コンテキストに依存する状況がいくつか存在する。そのた め、字句文法には複数の目標記号が必要となる。 InputElementHashbangOrRegExp 目標は Script または Module の開始時に用いられる。 InputElementRegExpOrTemplateTail 目標は、 RegularExpressionLiteralTemplateMiddle、 または TemplateTail が許可される構文文法コンテキス トで用いられる。InputElementRegExp 目標記号は、 RegularExpressionLiteral が許可されるが、 TemplateMiddleTemplateTail も許可されない すべての構文文法コンテキストで用いられる。 InputElementTemplateTail 目標は、 TemplateMiddle または TemplateTail が許可さ れるが、RegularExpressionLiteral は許可されない すべての構文文法コンテキストで用いられる。その他すべての コンテキストでは、InputElementDiv が字句目標記号と して用いられる。

Note

複数の字句目標を用いることにより、自動セミコロン挿入 に影響を与える字句上の曖昧性が存在しないことが保証され る。たとえば、先頭の除算または除算代入と、先頭の RegularExpressionLiteral の両方が許可される構文 文法コンテキストは存在しない。これはセミコロン挿入 (12.10 を参照)によって影響されない; 次のような例では:

a = b
/hi/g.exec(c).map(d);

ここで、LineTerminator の後にある最初の non-whitespace かつ non-comment code point が 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 の書式制御文字(すなわち、Unicode Character Database における “Cf” カテゴリの文 字。たとえば LEFT-TO-RIGHT MARK や RIGHT-TO-LEFT MARK)は、より高水準のプロトコル (markup language など)が存在しない場合に、ある範 囲のテキストの書式を制御するために用いられる制御 code である。

編集や表示を容易にするため、ソーステキストに書式制御文 字を許可することは有用である。すべての書式制御文字は comment の内部、および string literal、template literal、regular expression literal の内部で使 用してよい。

U+FEFF (ZERO WIDTH NO-BREAK SPACE) は、主 にテキストの先頭において、それが Unicode であること を示し、かつテキストのエンコーディングおよび byte 順 序を検出可能にするために用いられる書式制御文字である。こ の目的のための <ZWNBSP> 文字は、たとえば file の連 結の結果として、テキストの先頭以外にも現れることがある。 ECMAScript ソーステキストにおいて、<ZWNBSP> code point は、comment、string literal、 template literal、および regular expression literal の外側では white space 文字として扱われる (12.2 を参照)。

12.2 White Space

White space code point は、ソーステキストの可 読性を向上させ、token(分割不能な字句単位)同士を区切 るために用いられるが、それ以外では意味を持たない。 White space code point は、任意の 2 つの token の間、および入力の先頭または末尾に現れ得る。White space code point は、StringLiteralRegularExpressionLiteralTemplate、または TemplateSubstitutionTail の内部に現れ得る。そ こでは、それらは literal 値の一部を構成する意味のある code point と見なされる。また、Comment の内部に も現れ得るが、それ以外のいかなる種類の token の内部に も現れてはならない。

ECMAScript の white space code point は Table 30 に列挙されている。

Table 30: White Space Code Points
Code Points 名称 略称
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” に属する任意の code point <USP>
Note 1

U+0020 (SPACE) および U+00A0 (NO-BREAK SPACE) code point は <USP> の一部である。

Note 2

Table 30 に列挙された code point を除き、ECMAScript の WhiteSpace は、Unicode の “White_Space” property を持つが一般カテゴリ “Space_Separator” (“Zs”) に分類されないすべての code point を意図的 に除外している。

構文

WhiteSpace :: <TAB> <VT> <FF> <ZWNBSP> <USP>

12.3 Line Terminator

White space code point と同様に、line terminator code point もソーステキストの可読性を向 上させ、token(分割不能な字句単位)同士を区切るために 用いられる。しかし、white space code point とは異 なり、line terminator は構文文法の振る舞いにいくら か影響を与える。一般に、line terminator は任意の 2 つの token の間に現れ得るが、構文文法により禁止され ている箇所がいくつかある。line terminator は、自動 セミコロン挿入の処理にも影響する (12.10)。 line terminator は、StringLiteralTemplate、または TemplateSubstitutionTail を除くいかなる token の内部にも現れてはならない。 <LF> および <CR> line terminator は、 LineContinuation の一部である場合を除き、 StringLiteral token の内部に現れてはならない。

line terminator は MultiLineComment の内部 には現れ得るが、SingleLineComment の内部には現れて はならない。

line terminator は、正規表現における \s class で一致される white space code point の集合 に含まれる。

ECMAScript の line terminator code point は Table 31 に列挙されている。

Table 31: Line Terminator Code Points
Code Point Unicode 名 略称
U+000A LINE FEED (LF) <LF>
U+000D CARRIAGE RETURN (CR) <CR>
U+2028 LINE SEPARATOR <LS>
U+2029 PARAGRAPH SEPARATOR <PS>

Table 31 にある Unicode code point だけが line terminator として扱われる。その他の改行または改行区切り Unicode code point は line terminator としては扱われず、 Table 30 に列挙された要件を満たすなら white space として扱わ れる。<CR><LF> の並びは一般に line terminator として用いられる。これは、行番号を報告する 目的においては単一の SourceCharacter と見なされるべ きである。

構文

LineTerminator :: <LF> <CR> <LS> <PS> LineTerminatorSequence :: <LF> <CR> [lookahead ≠ <LF>] <LS> <PS> <CR> <LF>

12.4 Comment

Comment は、単一行でも複数行でもよい。複数行 comment は入れ子にできない。

単一行 comment は LineTerminator code point を除く任意の Unicode code point を含み得るこ と、そして token は常に可能な限り長く取られるという一 般規則のため、単一行 comment は常に // マーカーか ら行末までのすべての code point から構成される。しか し、行末の LineTerminator は単一行 comment の一部 とは見なされない; それは字句文法により別個に認識され、 構文文法のための入力要素列の一部となる。この点は非常に重 要である。なぜなら、単一行 comment の有無が自動セミコ ロン挿入の処理に影響を与えないことを意味するからである (12.10 を参照)。

Comment は white space のように振る舞い、捨てら れる。ただし、MultiLineComment が line terminator code point を含む場合、その comment 全体は、構文文法による parse の目的においては LineTerminator と見なされる。

構文

Comment :: MultiLineComment SingleLineComment MultiLineComment :: /* MultiLineCommentCharsopt */ MultiLineCommentChars :: MultiLineNotAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt PostAsteriskCommentChars :: MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt MultiLineNotAsteriskChar :: SourceCharacter but not * MultiLineNotForwardSlashOrAsteriskChar :: SourceCharacter but not one of / or * SingleLineComment :: // SingleLineCommentCharsopt SingleLineCommentChars :: SingleLineCommentChar SingleLineCommentCharsopt SingleLineCommentChar :: SourceCharacter but not LineTerminator

この節のいくつかの生成規則には、 B.1.1 で別の定義が与えられている。

12.5 Hashbang Comment

Hashbang Comment は位置依存であり、他の種類の comment と同様、構文文法のための入力要素列から捨てられ る。

構文

HashbangComment :: #! SingleLineCommentCharsopt

12.6 Token

構文

CommonToken :: IdentifierName PrivateIdentifier Punctuator NumericLiteral StringLiteral Template Note

DivPunctuatorRegularExpressionLiteralRightBracePunctuator、および TemplateSubstitutionTail の生成規則は、 CommonToken の生成規則には含まれない追加の token を導出する。

12.7 名前と予約語

IdentifierName および ReservedWord は、 Unicode Standard Annex #31, Identifier and Pattern Syntax で与えられる Default Identifier Syntax に従って解釈される token であり、ただし少数 の修正がある。ReservedWordIdentifierName の列挙された部分集合である。構文文法は、IdentifierReservedWord ではない IdentifierName とし て定義する。Unicode の識別子文法は、Unicode Standard により指定される文字 property に基づいてい る。Unicode Standard の最新版において指定されたカテ ゴリに含まれる Unicode code point は、すべての適合 ECMAScript 実装により、そのカテゴリに属するものとして 扱われなければならない。ECMAScript 実装は、Unicode Standard の後続版で定義された識別子 code point を 認識してもよい。

Note 1

この標準は特定の code point の追加を規定する: 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 :: Unicode property “ID_Start” を持つ任意の Unicode code point UnicodeIDContinue :: Unicode property “ID_Continue” を持つ任意の Unicode code point

非終端記号 UnicodeEscapeSequence の定義は 12.9.4 で与えられる。

Note 2

非終端記号 IdentifierPartUnicodeIDContinue を介して _ を導出する。

Note 3

Unicode property “ID_Start” および “ID_Continue” を持つ code point の集合は、それ ぞれ、Unicode property “Other_ID_Start” および “Other_ID_Continue” を持つ code point を含 む。

12.7.1 識別子名

Unicode エスケープシーケンスは IdentifierName 内で許可され、そこでは UnicodeEscapeSequenceIdentifierCodePoint に等しい単一の Unicode code point を与える。 UnicodeEscapeSequence に先行する \ はいかな る code point も与えない。UnicodeEscapeSequence は、そうでなければ不正となる code point を IdentifierName に与えるためには使用できない。言い換 えると、\ UnicodeEscapeSequence 列を、それが 与える SourceCharacter に置き換えた場合、その結果 は依然として妥当な IdentifierName でなければなら ず、かつ元の IdentifierName とまったく同じ SourceCharacter 要素列を持たなければならない。この 仕様における IdentifierName のすべての解釈は、特定 の code point を与えるために escape sequence が使 用されたかどうかに関係なく、その実際の code point に基 づいている。

Unicode Standard に従って正準同値である 2 つの IdentifierName は、それぞれの UnicodeEscapeSequence を置き換えた後で、まったく 同じ code point 列によって表現されていない限り、等し くない

12.7.1.1 Static Semantics: Early Errors

IdentifierStart :: \ UnicodeEscapeSequence IdentifierPart :: \ UnicodeEscapeSequence

12.7.1.2 Static Semantics: IdentifierCodePoints

The syntax-directed operation IdentifierCodePoints takes no arguments and returns a List of code points. It is defined piecewise over the following productions:

IdentifierName :: IdentifierStart
  1. cpIdentifierStartIdentifierCodePoint とする。
  2. « cp » を返す。
IdentifierName :: IdentifierName IdentifierPart
  1. cps を、導出された IdentifierNameIdentifierCodePoints とする。
  2. cpIdentifierPartIdentifierCodePoint とする。
  3. cps と « cp » の list-concatenation を返す。

12.7.1.3 Static Semantics: IdentifierCodePoint

The syntax-directed operation IdentifierCodePoint takes no arguments and returns a code point. It is defined piecewise over the following productions:

IdentifierStart :: IdentifierStartChar
  1. IdentifierStartChar に一致した code point を返す。
IdentifierPart :: IdentifierPartChar
  1. IdentifierPartChar に一致した code point を返す。
UnicodeEscapeSequence :: u Hex4Digits
  1. 数値が Hex4Digits の MV である code point を返す。
UnicodeEscapeSequence :: u{ CodePoint }
  1. 数値が CodePoint の MV である code point を返す。

12.7.2 キーワードと予約語

keyword と は、IdentifierName に一致する token であり、同時 に構文上の用法も持つものをいう; すなわち、それは何らかの 構文生成規則の中で、fixed width font により、文 字どおりに現れる。ECMAScript の keyword には ifwhileasyncawait など多数が含まれる。

reserved word とは、識別子として使用できない IdentifierName である。多くの keyword は reserved word だが、そうでないものもあり、また特定の 文脈でのみ予約されるものもある。if および while は reserved word である。await は async function および module の内部でのみ予約される。 async は予約されない; それは変数名または文ラベルと して制限なく使用できる。

この仕様は、文法生成規則と early error 規則を組み 合わせて、どの名前が妥当な識別子であり、どの名前が reserved word であるかを規定する。以下の ReservedWord list にある token のうち、await および yield を除くすべては、無条件に予約される。 await および yield に対する例外は、 13.1 において、parameterized された構文生成規則を用いて 規定される。さらに、いくつかの early error 規則が、 妥当な識別子の集合を制限する。 13.1.114.3.1.114.7.5.1、 および 15.7.1 を参照する。要約すると、識別子名には 5 つのカテゴリがある:

  • MathwindowtoString、および _ のように、常に識別子として許可され、keyword ではな いもの;

  • await および yield を除く、以下に列挙さ れる ReservedWord、すなわち、決して識別子として許 可されないもの;

  • await および yield、すなわち、文脈に応じ て識別子として許可されるもの;

  • strict mode code において文脈的に識別子とし て不許可となるもの: letstaticimplementsinterfacepackageprivateprotected、および public;

  • 常に識別子として許可されるが、Identifier が許 可されない特定の構文生成規則内では keyword としても 現れるもの: asasyncfromgetmetaofset、および target

conditional keyword または contextual keyword という用語は、最後の 3 つのカテゴリに 属する keyword、すなわち、ある文脈では識別子として使 用でき、別の文脈では keyword として使用されるものを指 して用いられることがある。

構文

ReservedWord :: one of await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield Note 1

5.1.5 によれば、文法中の keyword は、特定の SourceCharacter 要素の文字どおりの列に一致する。 keyword 中の code point は、\ UnicodeEscapeSequence により表現することはできな い。

IdentifierName\ UnicodeEscapeSequence を含み得るが、 els\u{65} と綴って "else" という名前の変数を宣言 することはできない。 13.1.1 における early error 規則が、reserved word と同じ StringValue を持つ識別子を排除する。

Note 2

enum は現在この仕様において keyword として 使用されていない。これは将来予約語であり、将来の言 語拡張における keyword としての使用のために確保されて いる。

同様に、implementsinterfacepackageprivateprotected、および publicstrict mode code における将来予約語 である。

Note 3

arguments および eval という名前は keyword ではないが、strict mode code においてはい くつかの制限を受ける。 13.1.18.6.415.2.115.5.115.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 NumericLiteralSeparatoropt DecimalDigits[+Sep] NonOctalDecimalIntegerLiteral DecimalDigits[Sep] :: DecimalDigit DecimalDigits[?Sep] DecimalDigit [+Sep] DecimalDigits[+Sep] NumericLiteralSeparator DecimalDigit DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9 NonZeroDigit :: one of 1 2 3 4 5 6 7 8 9 ExponentPart[Sep] :: ExponentIndicator SignedInteger[?Sep] ExponentIndicator :: one of e E SignedInteger[Sep] :: DecimalDigits[?Sep] + DecimalDigits[?Sep] - DecimalDigits[?Sep] BinaryIntegerLiteral[Sep] :: 0b BinaryDigits[?Sep] 0B BinaryDigits[?Sep] BinaryDigits[Sep] :: BinaryDigit BinaryDigits[?Sep] BinaryDigit [+Sep] BinaryDigits[+Sep] NumericLiteralSeparator BinaryDigit BinaryDigit :: one of 0 1 OctalIntegerLiteral[Sep] :: 0o OctalDigits[?Sep] 0O OctalDigits[?Sep] OctalDigits[Sep] :: OctalDigit OctalDigits[?Sep] OctalDigit [+Sep] OctalDigits[+Sep] NumericLiteralSeparator OctalDigit LegacyOctalIntegerLiteral :: 0 OctalDigit LegacyOctalIntegerLiteral OctalDigit NonOctalDecimalIntegerLiteral :: 0 NonOctalDigit LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit NonOctalDecimalIntegerLiteral DecimalDigit LegacyOctalLikeDecimalIntegerLiteral :: 0 OctalDigit LegacyOctalLikeDecimalIntegerLiteral OctalDigit OctalDigit :: one of 0 1 2 3 4 5 6 7 NonOctalDigit :: one of 8 9 HexIntegerLiteral[Sep] :: 0x HexDigits[?Sep] 0X HexDigits[?Sep] HexDigits[Sep] :: HexDigit HexDigits[?Sep] HexDigit [+Sep] HexDigits[+Sep] NumericLiteralSeparator HexDigit HexDigit :: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

NumericLiteral の直後に続く SourceCharacter は、IdentifierStart または DecimalDigit であ ってはならない。

Note

たとえば: 3in は error であり、2 つの入 力要素 3in ではない。

12.9.3.1 Static Semantics: Early Errors

NumericLiteral :: LegacyOctalIntegerLiteral DecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral
  • IsStrict(this production) が true なら、それは Syntax Error である。
Note
non-strict code において、この構文は Legacy である。

12.9.3.2 Static Semantics: MV

数値リテラルは Number 型または BigInt 型の値を表 す。

12.9.3.3 Static Semantics: NumericValue

The syntax-directed operation NumericValue takes no arguments and returns a Number or a BigInt. It is defined piecewise over the following productions:

NumericLiteral :: DecimalLiteral
  1. RoundMVResult(MV of DecimalLiteral) を返す。
NumericLiteral :: NonDecimalIntegerLiteral
  1. 𝔽(MV of NonDecimalIntegerLiteral) を返す。
NumericLiteral :: LegacyOctalIntegerLiteral
  1. 𝔽(MV of LegacyOctalIntegerLiteral) を返す。
NumericLiteral :: NonDecimalIntegerLiteral BigIntLiteralSuffix
  1. NonDecimalIntegerLiteral の MV に対応する BigInt 値を返す。
DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix
  1. 0 を返す。
DecimalBigIntegerLiteral :: NonZeroDigit BigIntLiteralSuffix
  1. NonZeroDigit の MV に対応する BigInt 値を返 す。
DecimalBigIntegerLiteral :: NonZeroDigit DecimalDigits BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits BigIntLiteralSuffix
  1. n を、DecimalDigits に含まれる code point 数から NumericLiteralSeparator の すべての出現を除いたものとする。
  2. mv を、(NonZeroDigit の MV × 10n) に DecimalDigits の MV を加えたものとす る。
  3. (mv) を返す。

12.9.4 文字列リテラル

Note 1

文字列リテラルは、単引用符または二重引用符で囲まれた 0 個以上の Unicode code point である。Unicode code point は escape sequence を用いて表現するこ ともできる。文字列リテラルには、閉じ引用符の code point、U+005C (REVERSE SOLIDUS)、U+000D (CARRIAGE RETURN)、および U+000A (LINE FEED) を除くすべての code point を文字どおりに現すことが できる。任意の code point は escape sequence の 形で現すことができる。文字列リテラルは ECMAScript String 値へ評価される。これらの String 値を生成する 際、Unicode code point は 11.1.1 で定義されるように UTF-16 エンコードされる。基本多言 語面に属する code point は、文字列の単一の code unit 要素としてエンコードされる。それ以外のすべての code point は、文字列の 2 個の code unit 要素 としてエンコードされる。

構文

StringLiteral :: " DoubleStringCharactersopt " ' SingleStringCharactersopt ' DoubleStringCharacters :: DoubleStringCharacter DoubleStringCharactersopt SingleStringCharacters :: SingleStringCharacter SingleStringCharactersopt DoubleStringCharacter :: SourceCharacter but not one of " or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation SingleStringCharacter :: SourceCharacter but not one of ' or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation LineContinuation :: \ LineTerminatorSequence EscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence HexEscapeSequence UnicodeEscapeSequence CharacterEscapeSequence :: SingleEscapeCharacter NonEscapeCharacter SingleEscapeCharacter :: one of ' " \ b f n r t v NonEscapeCharacter :: SourceCharacter but not one of EscapeCharacter or LineTerminator EscapeCharacter :: SingleEscapeCharacter DecimalDigit x u LegacyOctalEscapeSequence :: 0 [lookahead ∈ { 8, 9 }] NonZeroOctalDigit [lookahead ∉ OctalDigit] ZeroToThree OctalDigit [lookahead ∉ OctalDigit] FourToSeven OctalDigit ZeroToThree OctalDigit OctalDigit NonZeroOctalDigit :: OctalDigit but not 0 ZeroToThree :: one of 0 1 2 3 FourToSeven :: one of 4 5 6 7 NonOctalDecimalEscapeSequence :: one of 8 9 HexEscapeSequence :: x HexDigit HexDigit UnicodeEscapeSequence :: u Hex4Digits u{ CodePoint } Hex4Digits :: HexDigit HexDigit HexDigit HexDigit

非終端記号 HexDigit の定義は 12.9.3 に与えられる。SourceCharacter11.1 で定義される。

Note 2

<LF> および <CR> は、空の code point 列を生成する LineContinuation の一部である 場合を除き、文字列リテラル中に現れてはならない。これら のいずれかを文字列リテラルの String 値に含める正しい 方法は、\n\u000A のような escape sequence を用いることである。

12.9.4.1 Static Semantics: Early Errors

EscapeSequence :: LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence
  • IsStrict(this production) が true なら、それは Syntax Error である。
Note 1
non-strict code において、この構文は Legacy である。
Note 2

文字列リテラルが、その後に続く Use Strict Directive に先行し、それによって外側の code が strict mode になることはあり得る。実装は、そのような literal に対 して上記の規則を確実に適用しなければならない。たとえ ば、次のソーステキストは Syntax Error を含む:

function invalid() { "\7"; "use strict"; }

12.9.4.2 Static Semantics: SV

The syntax-directed operation SV takes no arguments and returns a String.

文字列リテラルは String 型の値を表す。SV は、文字 列リテラルのさまざまな部分に対して再帰的に適用することに より、文字列リテラルの String 値を生成する。この処理 の一部として、文字列リテラル内のいくつかの Unicode code point は、以下または 12.9.3 に記述されるように、数学的値を持つものとして解釈される。

Table 32: String Single Character Escape Sequences
Escape Sequence Code Unit Value Unicode Character Name Symbol
\b 0x0008 BACKSPACE <BS>
\t 0x0009 CHARACTER TABULATION <HT>
\n 0x000A LINE FEED (LF) <LF>
\v 0x000B LINE TABULATION <VT>
\f 0x000C FORM FEED (FF) <FF>
\r 0x000D CARRIAGE RETURN (CR) <CR>
\" 0x0022 QUOTATION MARK "
\' 0x0027 APOSTROPHE '
\\ 0x005C REVERSE SOLIDUS \

12.9.4.3 Static Semantics: MV

12.9.5 正規表現リテラル

Note 1

正規表現リテラルは、その literal が評価されるたび に RegExp object へ変換される入力要素である (22.2 を参照)。プログラム中の 2 つの正規表現リテラルは、たと えその内容が同一であっても、互いに === と比較して真 になることのない正規表現オブジェクトへ評価される。 RegExp object は、new RegExp によって、または RegExp constructor を関数として呼び出すことによって も、実行時に作成され得る (22.2.4 を参照)。

以下の生成規則は、正規表現リテラルの構文を記述し、入 力要素 scanner により正規表現リテラルの終端を見つけ るために用いられる。RegularExpressionBody およ び RegularExpressionFlags から成るソーステキスト は、その後、より厳密な ECMAScript 正規表現文法 (22.2.1) を用いて再び parse される。

実装は、 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 Note 2

正規表現リテラルは空であってはならない; 空の正規表現 リテラルを表す代わりに、code unit 列 // は単一行 comment を開始する。空の正規表現を指定するには、 /(?:)/ を用いる。

12.9.5.1 Static Semantics: BodyText

The syntax-directed operation BodyText takes no arguments and returns source text. It is defined piecewise over the following productions:

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags
  1. RegularExpressionBody として認識された source text を返す。

12.9.5.2 Static Semantics: FlagText

The syntax-directed operation FlagText takes no arguments and returns source text. It is defined piecewise over the following productions:

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags
  1. RegularExpressionFlags として認識された source text を返す。

12.9.6 Template Literal の字句構成要素

構文

Template :: NoSubstitutionTemplate TemplateHead NoSubstitutionTemplate :: ` TemplateCharactersopt ` TemplateHead :: ` TemplateCharactersopt ${ TemplateSubstitutionTail :: TemplateMiddle TemplateTail TemplateMiddle :: } TemplateCharactersopt ${ TemplateTail :: } TemplateCharactersopt ` TemplateCharacters :: TemplateCharacter TemplateCharactersopt TemplateCharacter :: $ [lookahead ≠ {] \ TemplateEscapeSequence \ NotEscapeSequence LineContinuation LineTerminatorSequence SourceCharacter but not one of ` or \ or $ or LineTerminator TemplateEscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] HexEscapeSequence UnicodeEscapeSequence NotEscapeSequence :: 0 DecimalDigit DecimalDigit but not 0 x [lookahead ∉ HexDigit] x HexDigit [lookahead ∉ HexDigit] u [lookahead ∉ HexDigit] [lookahead ≠ {] u HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit HexDigit [lookahead ∉ HexDigit] u { [lookahead ∉ HexDigit] u { NotCodePoint [lookahead ∉ HexDigit] u { CodePoint [lookahead ∉ HexDigit] [lookahead ≠ }] NotCodePoint :: HexDigits[~Sep] but only if the MV of HexDigits > 0x10FFFF CodePoint :: HexDigits[~Sep] but only if the MV of HexDigits ≤ 0x10FFFF Note

TemplateSubstitutionTail は、 InputElementTemplateTail という代替字句目標によっ て用いられる。

12.9.6.1 Static Semantics: TV

The syntax-directed operation TV takes no arguments and returns a String or undefined. A template literal component は、TV に より String 型の値として解釈される。TV は template object の index 付き構成要素(通称 template value)を構築するために用いられる。TV では、escape sequence は、その escape sequence が表す Unicode code point の UTF-16 code unit へ置き 換えられる。

12.9.6.2 Static Semantics: TRV

The syntax-directed operation TRV takes no arguments and returns a String. A template literal component は、TRV に より String 型の値として解釈される。TRV は template object の raw 構成要素(通称 template raw value) を構築するために用いられる。TRV は TV に似ているが、 TRV では escape sequence が literal 中に現れた ままの形で解釈される点が異なる。

Note

TVLineContinuation の code unit を除 外するが、TRV はそれを含む。<CR><LF> および <CR> の LineTerminatorSequence は、TV と TRV の両方において <LF> に正規化される。<CR> または <CR><LF> 列を含めるには、明示的な TemplateEscapeSequence が必要である。

12.10 自動セミコロン挿入

ほとんどの ECMAScript の文および宣言は、セミコロ ンで終端しなければならない。そのようなセミコロンは、ソー ステキスト中に常に明示的に現れてよい。しかし便宜のため、 特定の状況では、そのようなセミコロンはソーステキストから 省略してよい。これらの状況は、そのような状況においてセミ コロンがソースコード token 列に自動的に挿入される、と 述べることにより記述される。

12.10.1 自動セミコロン挿入の規則

以下の規則において、“token” とは、現在の字句目標 記号を用いて 12 に記述されるように決定される、実際に認識された字句 token を意味する。

セミコロン挿入には 3 つの基本規則がある:

  1. ソーステキストを左から右へ parse していると き、文法のいかなる生成規則によっても許可されない token (offending token と呼ぶ)に遭遇した場 合、次の条件の 1 つ以上が真であれば、その offending token の前にセミコロンが自動的に挿入される:

    • offending token が、直前の token から 少なくとも 1 個の LineTerminator によっ て分離されている。
    • offending token が } である。
    • 直前の token が ) であり、かつ挿入され たセミコロンが do-while 文 (14.7.2) の終端セミコロンとして parse される。
  2. ソーステキストを左から右へ parse していると き、token 列入力の末尾に到達し、parser が入 力 token 列を目標非終端記号の単一 instance として parse できない場合、入力列の末尾にセミ コロンが自動的に挿入される。
  3. ソーステキストを左から右へ parse していると き、ある token が文法上は何らかの生成規則に よって許可されるが、その生成規則が制限付き生成 規則であり、かつその token が、その制限付き 生成規則内の注記 “[no LineTerminator here]” の直後に現れる terminal または nonterminal の最初の token になる場合 (したがってその token は restricted token と呼ばれる)、そして restricted token が直 前の token から少なくとも 1 個の LineTerminator によって分離されている場 合、その restricted token の前にセミコロン が自動的に挿入される。

ただし、これらの規則には追加の最優先条件がある: そ のセミコロンが empty statement として parse され てしまう場合、またはそのセミコロンが for 文 (14.7.4) の header にある 2 つのセミコロンの 1 つになってしま う場合、セミコロンは決して自動挿入されない。

Note

文法における制限付き生成規則は、次のものだけである:

UpdateExpression[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++ LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] -- ContinueStatement[Yield, Await] : continue ; continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; BreakStatement[Yield, Await] : break ; break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; ReturnStatement[Yield, Await] : return ; return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; ThrowStatement[Yield, Await] : throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; YieldExpression[In, Await] : yield yield [no LineTerminator here] AssignmentExpression[?In, +Yield, ?Await] yield [no LineTerminator here] * AssignmentExpression[?In, +Yield, ?Await] ArrowFunction[In, Yield, Await] : ArrowParameters[?Yield, ?Await] [no LineTerminator here] => ConciseBody[?In] AsyncFunctionDeclaration[Yield, Await, Default] : async [no LineTerminator here] function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } [+Default] async [no LineTerminator here] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionExpression : async [no LineTerminator here] function BindingIdentifier[~Yield, +Await]opt ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncMethod[Yield, Await] : async [no LineTerminator here] ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncGeneratorDeclaration[Yield, Await, Default] : async [no LineTerminator here] function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } [+Default] async [no LineTerminator here] function * ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorExpression : async [no LineTerminator here] function * BindingIdentifier[+Yield, +Await]opt ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorMethod[Yield, Await] : async [no LineTerminator here] * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncArrowFunction[In, Yield, Await] : async [no LineTerminator here] AsyncArrowBindingIdentifier[?Yield] [no LineTerminator here] => AsyncConciseBody[?In] CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In] AsyncArrowHead : async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]

これらの制限付き生成規則の実際上の効果は次のとおりで ある:

  • parser が ++ または -- token を後置 演算子として扱う位置で、それに遭遇し、かつ直前の token と ++ または -- token の間 に少なくとも 1 個の LineTerminator がある 場合、++ または -- token の前にセミ コロンが自動的に挿入される。
  • continuebreakreturnthrow、または yield token に遭遇 し、次の token より前に LineTerminator に遭遇した場合、 continuebreakreturnthrow、または yield token の後 にセミコロンが自動的に挿入される。
  • arrow function の parameter(s) の後、 => token より前に LineTerminator がある場合、セミコロンが自動的に挿入され、その punctuator は syntax error を引き起こ す。
  • async token の後、functionIdentifierName、または ( token よ り前に LineTerminator がある場合、セミ コロンが自動的に挿入され、async token は後続 token と同じ式または class element の一部としては扱われない。
  • async token の後、* token より前に LineTerminator がある場合、セミコロンが 自動的に挿入され、その punctuator は syntax error を引き起こす。

ECMAScript プログラマへの実際上の助言は次のとお りである:

  • 後置 ++ または -- 演算子は、その被 演算子と同じ行に置くべきである。
  • return または throw 文における Expression、または yield 式におけ る AssignmentExpression は、 returnthrow、または yield token と同じ行で始めるべきである。
  • break または continue 文の LabelIdentifier は、break または continue token と同じ行に置くべきで ある。
  • arrow function の parameter(s) の終 わりとその => は同じ行に置くべきである。
  • async な function または method に先 行する async token は、その直後の token と同じ行に置くべきである。

12.10.2 自動セミコロン挿入の例

この節は非規範的である。

次のソース

{ 1 2 } 3

は、自動セミコロン挿入規則を考慮しても、 ECMAScript 文法における妥当な文ではない。これに対し、 次のソース

{ 1
2 } 3

もまた妥当な ECMAScript 文ではないが、自動セミコ ロン挿入によって次のように変換される:

{ 1
;2 ;} 3;

これは妥当な ECMAScript 文である。

次のソース

for (a; b
)

は妥当な ECMAScript 文ではなく、for 文の header に必要なセミコロンであるため、自動セミコロン挿 入によって変更もされない。自動セミコロン挿入は、for 文の header にある 2 つのセミコロンのいずれかを挿入 することは決してない。

次のソース

return
a + b

は、自動セミコロン挿入によって次のように変換される:

return;
a + b;
Note 1

a + breturn 文によって返される値 としては扱われない。なぜなら LineTerminator が token return とそれを分離しているからである。

次のソース

a = b
++c

は、自動セミコロン挿入によって次のように変換される:

a = b;
++c;
Note 2

token ++ は、変数 b に適用される後置演 算子としては扱われない。なぜなら b++ の間 に LineTerminator が存在するからである。

次のソース

if (a > b)
else c = d

は妥当な ECMAScript 文ではなく、else token の前で自動セミコロン挿入によって変更もされな い。たとえその地点で文法のいかなる生成規則も適用できな くても、自動挿入されたセミコロンは empty statement として parse されてしまうからである。

次のソース

a = b + c
(d + e).print()

は、自動セミコロン挿入によって変換されない。な ぜなら 2 行目の先頭にある括弧付き式は、関数呼出しの引数 list として解釈できるからである:

a = b + c(d + e).print()

代入文が左丸括弧で始まらなければならない状況では、プ ログラマは自動セミコロン挿入に頼るのではなく、先行する文 の末尾に明示的なセミコロンを与えるのがよい考えである。

12.10.3 自動セミコロン挿入の興味深い事例

この節は非規範的である。

ECMAScript プログラムは、自動セミコロン挿入に依存 することで、非常に少ないセミコロンを用いるスタイルでも記 述できる。上で述べたように、セミコロンはすべての改行位置 に挿入されるわけではなく、自動セミコロン挿入は line terminator をまたぐ複数 token に依存し得る。

新しい構文機能が ECMAScript に追加されると、その前 にある自動セミコロン挿入に依存する行について、parse 時 に文法生成規則が変化するような追加の文法生成規則が加えら れ得る。

この節の目的において、自動セミコロン挿入の事例が興味 深いと見なされるのは、それが、先行するソーステキストに応 じてセミコロンが挿入される場合とされない場合がある場所で ある場合である。この節の残りでは、このバージョンの ECMAScript における自動セミコロン挿入の興味深い事例を いくつか記述する。

12.10.3.1 Statement List における自動セミコロン挿入の興味深い事例

StatementList において、多くの StatementListItem はセミコロンで終わり、それは自 動セミコロン挿入によって省略できる。上記規則の結果、式 を終える行の末尾では、続く行が次のいずれかで始まる場合、 セミコロンが必要となる:

  • 左丸括弧 (()。セミコ ロンがない場合、2 行は together で CallExpression として扱われる。
  • 左角括弧 ([)。セミコ ロンがない場合、2 行は ArrayLiteral または ArrayAssignmentPattern ではなく、 property access として扱われる。
  • template literal (`)。 セミコロンがない場合、2 行は together でタグ付き Template(13.3.11) として解釈され、前の式が MemberExpression にな る。
  • 単項 + または -。 セミコロンがない場合、2 行は together で対応する二項 演算子の使用として解釈される。
  • RegExp literal。セミコロ ンがない場合、2 行は代わりに / MultiplicativeOperator として parse され得 る。たとえば RegExp が flag を持つ場合である。

12.10.3.2 自動セミコロン挿入と “[no LineTerminator here]” の事例

この節は非規範的である。

ECMAScript は “[no LineTerminator here]” を含む文法生成規則を持つ。これらの生成規則 は、文法に optional operand を持たせる手段であるこ とがある。これらの位置に LineTerminator を導入す ると、optional operand を持たない文法生成規則を使 用することで、ソーステキストの文法生成規則が変化すること になる。

この節の残りでは、このバージョンの ECMAScript に おいて “[no LineTerminator here]” を用いる生 成規則をいくつか記述する。

12.10.3.2.1 optional operand と “[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 Note

yield および await は、文法上は BindingIdentifier として許可され、以下の静的意味 論により禁止される。これは次のような場合に自動セミコロン 挿入を禁止するためである。

let
await 0;

13.1.1 Static Semantics: Early Errors

BindingIdentifier : Identifier
  • IsStrict(this production) が true であり、 かつ IdentifierStringValue"arguments" または "eval" のいずれか である場合、それは Syntax Error である。
IdentifierReference : yield BindingIdentifier : yield LabelIdentifier : yield
  • IsStrict(this production) が true なら、 それは Syntax Error である。
IdentifierReference : await BindingIdentifier : await LabelIdentifier : await
  • 構文文法の goal symbolModule である場 合、それは Syntax Error である。
BindingIdentifier[Yield, Await] : yield
  • この production が [Yield] parameter を持つ場合、それは Syntax Error である。
BindingIdentifier[Yield, Await] : await
  • この production が [Await] parameter を持つ場合、それは Syntax Error である。
IdentifierReference[Yield, Await] : Identifier BindingIdentifier[Yield, Await] : Identifier LabelIdentifier[Yield, Await] : Identifier
  • この production が [Yield] parameter を持ち、かつ IdentifierStringValue"yield" である場合、 それは Syntax Error である。
  • この production が [Await] parameter を持ち、かつ IdentifierStringValue"await" である場合、 それは Syntax Error である。
Identifier : IdentifierName but not ReservedWord Note

IdentifierNameStringValueIdentifierName 内の任意の Unicode escape sequence を正規化する。したがって、そのような escape は、code point 列が ReservedWord と 同じである Identifier を書くためには使用できない。

13.1.2 Static Semantics: StringValue

The syntax-directed operation StringValue takes no arguments and returns a String. It is defined piecewise over the following productions:

IdentifierName :: IdentifierStart IdentifierName IdentifierPart
  1. idTextUnescapedIdentifierNameIdentifierCodePoints とする。
  2. CodePointsToString(idTextUnescaped) を返す。
IdentifierReference : yield BindingIdentifier : yield LabelIdentifier : yield
  1. "yield" を返す。
IdentifierReference : await BindingIdentifier : await LabelIdentifier : await
  1. "await" を返す。
Identifier : IdentifierName but not ReservedWord
  1. IdentifierNameStringValue を返す。
PrivateIdentifier :: # IdentifierName
  1. 0x0023 (NUMBER SIGN) と IdentifierNameStringValuestring-concatenation を返す。
ModuleExportName : StringLiteral
  1. StringLiteralSV を返す。

13.1.3 Runtime Semantics: Evaluation

IdentifierReference : Identifier
  1. ResolveBinding(StringValue of Identifier) を返す。
IdentifierReference : yield
  1. ResolveBinding("yield") を返す。
IdentifierReference : await
  1. ResolveBinding("await") を返す。
Note 1

IdentifierReference を評価した結果は、常に Reference 型の値である。

Note 2

non-strict code において、keyword yield は識別子として使用できる。 IdentifierReference の評価は、それが Identifier であるかのように yield の束縛を解決 する。Early Error 制約により、そのような評価は non-strict code に対してのみ起こり得ることが保証さ れる。

13.2 Primary Expression

構文

PrimaryExpression[Yield, Await] : this IdentifierReference[?Yield, ?Await] Literal ArrayLiteral[?Yield, ?Await] ObjectLiteral[?Yield, ?Await] FunctionExpression ClassExpression[?Yield, ?Await] GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral[?Yield, ?Await, ~Tagged] CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] : ( Expression[+In, ?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ) ( ) ( ... BindingIdentifier[?Yield, ?Await] ) ( ... BindingPattern[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingIdentifier[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingPattern[?Yield, ?Await] )

補助構文

次の production の instance を処理するとき
PrimaryExpression[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList の解釈は、以下の文法を用いて精密化される:

ParenthesizedExpression[Yield, Await] : ( Expression[+In, ?Yield, ?Await] )

13.2.1 this Keyword

13.2.1.1 Runtime Semantics: Evaluation

PrimaryExpression : this
  1. ResolveThisBinding() を返す。

13.2.2 Identifier Reference

IdentifierReference については 13.1 を参照。

13.2.3 リテラル

構文

Literal : NullLiteral BooleanLiteral NumericLiteral StringLiteral

13.2.3.1 Runtime Semantics: Evaluation

Literal : NullLiteral
  1. null を返す。
Literal : BooleanLiteral
  1. BooleanLiteral が token false なら、 false を返す。
  2. BooleanLiteral が token true なら、 true を返す。
Literal : NumericLiteral
  1. 12.9.3 で定義される NumericLiteralNumericValue を返す。
Literal : StringLiteral
  1. 12.9.4.2 で定義される StringLiteralSV を返す。

13.2.4 Array Initializer

Note

ArrayLiteral は、Array の初期化を記述する式 であり、0 個以上の式の list を用いて記述される。各 式は array element を表し、全体は角括弧で囲まれ る。element は literal である必要はなく、array initializer が評価されるたびに評価される。

Array element は element list の先頭・中 間・末尾で省略され得る。element list 内の comma の直前に AssignmentExpression がない場合(すなわ ち、先頭の comma または別の comma の直後の comma)、その欠けた array element は Array の length に寄与し、後続 element の index を増やす。 省略された array element は定義されない。array の 末尾で element が省略された場合、その element は Array の length に寄与しない。

構文

ArrayLiteral[Yield, Await] : [ Elisionopt ] [ ElementList[?Yield, ?Await] ] [ ElementList[?Yield, ?Await] , Elisionopt ] ElementList[Yield, Await] : Elisionopt AssignmentExpression[+In, ?Yield, ?Await] Elisionopt SpreadElement[?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt AssignmentExpression[+In, ?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt SpreadElement[?Yield, ?Await] Elision : , Elision , SpreadElement[Yield, Await] : ... AssignmentExpression[+In, ?Yield, ?Await]

13.2.4.1 Runtime Semantics: ArrayAccumulation

The syntax-directed operation ArrayAccumulation takes arguments array (an Array) and nextIndex (an integer) and returns either a normal completion containing an integer or an abrupt completion. It is defined piecewise over the following productions:

Elision : ,
  1. lennextIndex + 1 とする。
  2. Set(array, "length", 𝔽(len), true) を実行する。
  3. NOTE: 上の手順は、len が 232 - 1 を超える場合 throw す る。
  4. len を返す。
Elision : Elision ,
  1. array および (nextIndex + 1) を引数と する ElisionArrayAccumulation を ? 返す。
ElementList : Elisionopt AssignmentExpression
  1. Elision が存在するなら、
    1. nextIndex を、array および nextIndex を引数とする ElisionArrayAccumulation の ? に設定する。
  2. initResult を ? Evaluation of AssignmentExpression とする。
  3. initValue を ? GetValue(initResult) とする。
  4. CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), initValue) を実行する。
  5. nextIndex + 1 を返す。
ElementList : Elisionopt SpreadElement
  1. Elision が存在するなら、
    1. nextIndex を、array および nextIndex を引数とする ElisionArrayAccumulation の ? に設定する。
  2. array および nextIndex を引数とする SpreadElementArrayAccumulation を ? 返す。
ElementList : ElementList , Elisionopt AssignmentExpression
  1. nextIndex を、array および nextIndex を引数とする、導出された ElementListArrayAccumulation の ? に設定する。
  2. Elision が存在するなら、
    1. nextIndex を、array および nextIndex を引数とする ElisionArrayAccumulation の ? に設定する。
  3. initResult を ? Evaluation of AssignmentExpression とする。
  4. initValue を ? GetValue(initResult) とする。
  5. CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), initValue) を実行する。
  6. nextIndex + 1 を返す。
ElementList : ElementList , Elisionopt SpreadElement
  1. nextIndex を、array および nextIndex を引数とする、導出された ElementListArrayAccumulation の ? に設定する。
  2. Elision が存在するなら、
    1. nextIndex を、array および nextIndex を引数とする ElisionArrayAccumulation の ? に設定する。
  3. array および nextIndex を引数とする SpreadElementArrayAccumulation を ? 返す。
SpreadElement : ... AssignmentExpression
  1. spreadRef を ? Evaluation of AssignmentExpression とする。
  2. spreadObj を ? GetValue(spreadRef) とする。
  3. iteratorRecord を ? GetIterator(spreadObj, sync) とす る。
  4. 繰り返す
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone なら、 nextIndex を返す。
    3. CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), next) を実 行する。
    4. nextIndexnextIndex + 1 に設 定する。
Note

CreateDataPropertyOrThrow は、標準組込み Array prototype object が、[[Set]] を用いて新し い own property を作成できないような形に変更されて いた場合でも、array に own property が定義される ことを確実にするために用いられる。

13.2.4.2 Runtime Semantics: Evaluation

ArrayLiteral : [ Elisionopt ]
  1. array を ! ArrayCreate(0) とする。
  2. Elision が存在するなら、
    1. array および 0 を引数とする ElisionArrayAccumulation を ? 実行する。
  3. array を返す。
ArrayLiteral : [ ElementList ]
  1. array を ! ArrayCreate(0) とする。
  2. array および 0 を引数とする ElementListArrayAccumulation を ? 実行する。
  3. array を返す。
ArrayLiteral : [ ElementList , Elisionopt ]
  1. array を ! ArrayCreate(0) とする。
  2. nextIndex を、array および 0 を引数 とする ElementListArrayAccumulation の ? とする。
  3. Elision が存在するなら、
    1. array および nextIndex を引数とす る ElisionArrayAccumulation を ? 実行する。
  4. array を返す。

13.2.5 Object Initializer

Note 1

object initializer は、literal に似た形 で記述される、Object の初期化を記述する式である。これ は、0 個以上の property key と、それに対応する値の 組の list を波括弧で囲んだものである。値は literal である必要はなく、object initializer が評価されるた びに評価される。

構文

ObjectLiteral[Yield, Await] : { } { PropertyDefinitionList[?Yield, ?Await] } { PropertyDefinitionList[?Yield, ?Await] , } PropertyDefinitionList[Yield, Await] : PropertyDefinition[?Yield, ?Await] PropertyDefinitionList[?Yield, ?Await] , PropertyDefinition[?Yield, ?Await] PropertyDefinition[Yield, Await] : IdentifierReference[?Yield, ?Await] CoverInitializedName[?Yield, ?Await] PropertyName[?Yield, ?Await] : AssignmentExpression[+In, ?Yield, ?Await] MethodDefinition[?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] PropertyName[Yield, Await] : LiteralPropertyName ComputedPropertyName[?Yield, ?Await] LiteralPropertyName : IdentifierName StringLiteral NumericLiteral ComputedPropertyName[Yield, Await] : [ AssignmentExpression[+In, ?Yield, ?Await] ] CoverInitializedName[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await] Initializer[In, Yield, Await] : = AssignmentExpression[?In, ?Yield, ?Await] Note 2

MethodDefinition15.4 で定義される。

Note 3

ある文脈では、ObjectLiteral は、より制限 された二次文法に対する cover grammar として用いられ る。CoverInitializedName 生成規則は、これらの二次 文法を完全に cover するために必要である。しかし、こ の生成規則を用いると、実際の ObjectLiteral が期待 される通常文脈では早期の Syntax Error を生じる。

13.2.5.1 Static Semantics: Early Errors

PropertyDefinition : MethodDefinition

実際の object initializer を記述することに加え て、ObjectLiteral 生成規則は ObjectAssignmentPattern に対する cover grammar としても用いられ、 CoverParenthesizedExpressionAndArrowParameterList の一部として認識されることがある。ObjectLiteralObjectAssignmentPattern を要求する文脈に現れる 場合、次の Early Error 規則は適用されない。ま た、CoverParenthesizedExpressionAndArrowParameterList または CoverCallExpressionAndAsyncArrowHead を 最初に parse するときにも適用されない。

PropertyDefinition : CoverInitializedName
  • この production に任意の source text が 一致する場合、それは Syntax Error である。
Note 1

この production は、ObjectLiteralObjectAssignmentPattern に対する cover grammar として機能できるように存在する。実際の object initializer では現れ得ない。

ObjectLiteral : { PropertyDefinitionList } { PropertyDefinitionList , } Note 2

PropertyNameList によって返される List は、 ComputedPropertyName を用いて定義された property 名を含まない。

13.2.5.2 Static Semantics: IsComputedPropertyKey

The syntax-directed operation IsComputedPropertyKey takes no arguments and returns a Boolean. It is defined piecewise over the following productions:

PropertyName : LiteralPropertyName
  1. false を返す。
PropertyName : ComputedPropertyName
  1. true を返す。

13.2.5.3 Static Semantics: PropertyDefinitionNodes

The syntax-directed operation PropertyDefinitionNodes takes no arguments and returns a List of Parse Nodes. It is defined piecewise over the following productions:

ObjectLiteral : { }
  1. 新しい空の List を返す。
PropertyDefinitionList : PropertyDefinition
  1. « PropertyDefinition » を返す。
PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition
  1. head を、導出された PropertyDefinitionListPropertyDefinitionNodes とする。
  2. head と « PropertyDefinition » の list-concatenation を返す。

13.2.5.4 Static Semantics: PropertyNameList

The syntax-directed operation PropertyNameList takes no arguments and returns a List of Strings. It is defined piecewise over the following productions:

PropertyDefinitionList : PropertyDefinition
  1. propNamePropertyDefinitionPropName とする。
  2. propNameempty なら、新しい空の List を返す。
  3. « propName » を返す。
PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition
  1. listPropertyDefinitionListPropertyNameList とする。
  2. propNamePropertyDefinitionPropName とする。
  3. propNameempty なら、list を返 す。
  4. list と « propName » の list-concatenation を返す。

13.2.5.5 Runtime Semantics: Evaluation

ObjectLiteral : { }
  1. OrdinaryObjectCreate(%Object.prototype%) を 返す。
ObjectLiteral : { PropertyDefinitionList } { PropertyDefinitionList , }
  1. objOrdinaryObjectCreate(%Object.prototype%) とする。
  2. obj を引数として PropertyDefinitionListPropertyDefinitionEvaluation を ? 実行す る。
  3. obj を返す。
LiteralPropertyName : IdentifierName
  1. IdentifierNameStringValue を返す。
LiteralPropertyName : StringLiteral
  1. StringLiteralSV を返す。
LiteralPropertyName : NumericLiteral
  1. nbrNumericLiteralNumericValue とする。
  2. ToString(nbr) を返す。
ComputedPropertyName : [ AssignmentExpression ]
  1. exprValue を ? Evaluation of AssignmentExpression とする。
  2. propName を ? GetValue(exprValue) とする。
  3. ToPropertyKey(propName) を返す。

13.2.5.6 Runtime Semantics: PropertyDefinitionEvaluation

The syntax-directed operation PropertyDefinitionEvaluation takes argument object (an Object) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:

PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition
  1. object を引数として PropertyDefinitionListPropertyDefinitionEvaluation を ? 実行す る。
  2. object を引数として PropertyDefinitionPropertyDefinitionEvaluation を ? 実 行する。
  3. unused を返す。
PropertyDefinition : ... AssignmentExpression
  1. exprValue を ? Evaluation of AssignmentExpression とする。
  2. fromValue を ? GetValue(exprValue) とする。
  3. excludedNames を新しい空の List とす る。
  4. CopyDataProperties(object, fromValue, excludedNames) を実行する。
  5. unused を返す。
PropertyDefinition : IdentifierReference
  1. propNameIdentifierReferenceStringValue とする。
  2. exprValue を ? Evaluation of IdentifierReference とする。
  3. propValue を ? GetValue(exprValue) とする。
  4. Assert: object は、non-configurable property を持たない、通常かつ拡張可能な object である。
  5. CreateDataPropertyOrThrow(object, propName, propValue) を実行する。
  6. unused を返す。
PropertyDefinition : PropertyName : AssignmentExpression
  1. propertyKey を ? Evaluation of PropertyName とする。
  2. この PropertyDefinitionParseJSON のために評価されている Script の内部に含 まれている場合 (ParseJSON の step 6 を参照)、
    1. isProtoSetterfalse とする。
  3. Else if propertyKey"__proto__" であり、かつ PropertyNameIsComputedPropertyKeyfalse なら、
    1. isProtoSettertrue とする。
  4. Else,
    1. isProtoSetterfalse とする。
  5. IsAnonymousFunctionDefinition( AssignmentExpression) が true かつ isProtoSetterfalse なら、
    1. propValue を、propertyKey を引数と する AssignmentExpressionNamedEvaluation の ? とする。
  6. Else,
    1. exprValueRef を ? Evaluation of AssignmentExpression とする。
    2. propValue を ? GetValue(exprValueRef) とする。
  7. isProtoSettertrue なら、
    1. propValue が Object または null な ら、
      1. object.[[SetPrototypeOf]](propValue) を実行する。
    2. unused を返す。
  8. Assert: object は、non-configurable property を持たない、通常かつ拡張可能な object である。
  9. CreateDataPropertyOrThrow(object, propertyKey, propValue) を実行する。
  10. unused を返す。
PropertyDefinition : MethodDefinition
  1. object および true を引数として MethodDefinitionMethodDefinitionEvaluation を ? 実行す る。
  2. 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: Early Errors

PrimaryExpression : RegularExpressionLiteral

13.2.7.2 Static Semantics: IsValidRegularExpressionLiteral ( literal )

The abstract operation IsValidRegularExpressionLiteral takes argument literal (a RegularExpressionLiteral Parse Node) and returns a Boolean. これは、その引数が妥当な正規表現リテラルかどうかを 判定する。 It performs the following steps when called:

  1. flagsliteralFlagText とする。
  2. flagsd, g, i, m, s, u, v, y 以外の code point を 含むなら、false を返す。
  3. flags に同じ code point が複数回含ま れるなら、false を返す。
  4. flagsu を含むなら、utrue とする; そうでなければ ufalse とする。
  5. flagsv を含むなら、vtrue とする; そうでなければ vfalse とする。
  6. patternTextliteralBodyText と する。
  7. ufalse かつ vfalse な ら、
    1. stringValueCodePointsToString(patternText) とす る。
    2. patternText を、stringValue の各 16-bit 要素を Unicode BMP code point として解釈した結果生じる code point 列 に設定する。要素には UTF-16 decoding は適 用しない。
  8. parseResultParsePattern(patternText, u, v) とする。
  9. parseResultParse Node なら、 true を返す。
  10. false を返す。

13.2.7.3 Runtime Semantics: Evaluation

PrimaryExpression : RegularExpressionLiteral
  1. patternCodePointsToString(BodyText of RegularExpressionLiteral) とする。
  2. flagsCodePointsToString(FlagText of RegularExpressionLiteral) とする。
  3. RegExpCreate(pattern, flags) を返 す。

13.2.8 Template Literal

構文

TemplateLiteral[Yield, Await, Tagged] : NoSubstitutionTemplate SubstitutionTemplate[?Yield, ?Await, ?Tagged] SubstitutionTemplate[Yield, Await, Tagged] : TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged] TemplateSpans[Yield, Await, Tagged] : TemplateTail TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateTail TemplateMiddleList[Yield, Await, Tagged] : TemplateMiddle Expression[+In, ?Yield, ?Await] TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await]

13.2.8.1 Static Semantics: Early Errors

TemplateLiteral[Yield, Await, Tagged] : NoSubstitutionTemplate TemplateLiteral[Yield, Await, Tagged] : SubstitutionTemplate[?Yield, ?Await, ?Tagged] SubstitutionTemplate[Yield, Await, Tagged] : TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged]
  • [Tagged] parameter が設定されて おらず、かつ TemplateHeadNotEscapeSequence を含む場合、それは Syntax Error である。
TemplateSpans[Yield, Await, Tagged] : TemplateTail
  • [Tagged] parameter が設定されて おらず、かつ TemplateTailNotEscapeSequence を含む場合、それは Syntax Error である。
TemplateMiddleList[Yield, Await, Tagged] : TemplateMiddle Expression[+In, ?Yield, ?Await] TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await]

13.2.8.2 Static Semantics: TemplateStrings

The syntax-directed operation TemplateStrings takes argument raw (a Boolean) and returns a List of either Strings or undefined. It is defined piecewise over the following productions:

TemplateLiteral : NoSubstitutionTemplate
  1. « TemplateString(NoSubstitutionTemplate, raw) » を返す。
SubstitutionTemplate : TemplateHead Expression TemplateSpans
  1. head を « TemplateString(TemplateHead, raw) » とする。
  2. tail を、raw を引数とする TemplateSpansTemplateStrings とす る。
  3. headtaillist-concatenation を返す。
TemplateSpans : TemplateTail
  1. « TemplateString(TemplateTail, raw) » を返す。
TemplateSpans : TemplateMiddleList TemplateTail
  1. middle を、raw を引数とする TemplateMiddleListTemplateStrings とする。
  2. tail を « TemplateString(TemplateTail, raw) » とする。
  3. middletaillist-concatenation を返す。
TemplateMiddleList : TemplateMiddle Expression
  1. « TemplateString(TemplateMiddle, raw) » を返す。
TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression
  1. front を、raw を引数とする TemplateMiddleListTemplateStrings とする。
  2. last を « TemplateString(TemplateMiddle, raw) » とする。
  3. frontlastlist-concatenation を返す。

13.2.8.3 Static Semantics: TemplateString ( templateToken, raw )

The abstract operation TemplateString takes arguments templateToken (a NoSubstitutionTemplate Parse Node, a TemplateHead Parse Node, a TemplateMiddle Parse Node, or a TemplateTail Parse Node) and raw (a Boolean) and returns a String or undefined. It performs the following steps when called:

  1. rawtrue なら、
    1. stringtemplateTokenTRV とす る。
  2. Else,
    1. stringtemplateTokenTV とす る。
  3. string を返す。
Note

この操作は、rawfalse であり、かつ templateTokenNotEscapeSequence を含む場 合は undefined を返す。それ以外のすべての場合には String を返す。

13.2.8.4 GetTemplateObject ( templateLiteral )

The abstract operation GetTemplateObject takes argument templateLiteral (a Parse Node) and returns an Array. It performs the following steps when called:

  1. realmcurrent Realm Record とする。
  2. templateRegistryrealm.[[TemplateMap]] とする。
  3. templateRegistry の各要素 e につい て、次を行う
    1. e.[[Site]]templateLiteral同じ Parse Node なら、
      1. e.[[Array]] を返す。
  4. rawStrings を、引数 true を伴う templateLiteralTemplateStrings とする。
  5. Assert: rawStrings は String の List である。
  6. cookedStrings を、引数 false を伴う templateLiteralTemplateStrings とする。
  7. countList cookedStrings の要素 数とする。
  8. Assert: count ≤ 232 - 1.
  9. template を ! ArrayCreate(count) とする。
  10. rawObj を ! ArrayCreate(count) とす る。
  11. index を 0 とする。
  12. index < count の間、繰り返す
    1. propertyKey を ! ToString(𝔽(index)) とする。
    2. cookedValuecookedStrings[index] とする。
    3. DefinePropertyOrThrow(template, propertyKey, PropertyDescriptor { [[Value]]: cookedValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false }) を実行す る。
    4. rawValue を String 値 rawStrings[index] とする。
    5. DefinePropertyOrThrow(rawObj, propertyKey, PropertyDescriptor { [[Value]]: rawValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false }) を実行す る。
    6. indexindex + 1 に設定する。
  13. SetIntegrityLevel(rawObj, frozen) を実行する。
  14. DefinePropertyOrThrow(template, "raw", PropertyDescriptor { [[Value]]: rawObj, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  15. SetIntegrityLevel(template, frozen) を実行する。
  16. Record { [[Site]]: templateLiteral, [[Array]]: template } を realm.[[TemplateMap]] に append する。
  17. template を返す。
Note 1

template object の作成は abrupt completion を生じ得ない。

Note 2

realm のプログラム code 中の各 TemplateLiteral は、一意な template object と 対応付けられており、これはタグ付き Template の評価 (13.2.8.6) において使用される。template object は凍結されてお り、特定のタグ付き Template が評価されるたびに同じ template object が使用される。template object が TemplateLiteral の最初の評価時に遅延生成される か、最初の評価前に eager に生成されるかは、ECMAScript code から観測不可能な実装選択である。

Note 3

この仕様の将来版では、template object の追 加の non-enumerable property が定義されることが ある。

13.2.8.5 Runtime Semantics: SubstitutionEvaluation

The syntax-directed operation SubstitutionEvaluation takes no arguments and returns either a normal completion containing a List of ECMAScript language values or an abrupt completion. It is defined piecewise over the following productions:

TemplateSpans : TemplateTail
  1. 新しい空の List を返す。
TemplateSpans : TemplateMiddleList TemplateTail
  1. TemplateMiddleListSubstitutionEvaluation を ? 返す。
TemplateMiddleList : TemplateMiddle Expression
  1. subRef を ? Evaluation of Expression とする。
  2. sub を ? GetValue(subRef) とする。
  3. « sub » を返す。
TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression
  1. precedingTemplateMiddleListSubstitutionEvaluation の ? とする。
  2. nextRef を ? Evaluation of Expression とする。
  3. next を ? GetValue(nextRef) とする。
  4. preceding と « next » の list-concatenation を返す。

13.2.8.6 Runtime Semantics: Evaluation

TemplateLiteral : NoSubstitutionTemplate
  1. 12.9.6 で定義される NoSubstitutionTemplateTV を返す。
SubstitutionTemplate : TemplateHead Expression TemplateSpans
  1. head12.9.6 で定義される TemplateHeadTV とす る。
  2. subRef を ? Evaluation of Expression とする。
  3. sub を ? GetValue(subRef) とする。
  4. middle を ? ToString(sub) とする。
  5. tail を ? Evaluation of TemplateSpans とする。
  6. head, middle, および tailstring-concatenation を返す。
Note 1

Expression 値に適用される文字列変換の意味論 は、+ 演算子というより String.prototype.concat に近い。

TemplateSpans : TemplateTail
  1. 12.9.6 で定義される TemplateTailTV を返 す。
TemplateSpans : TemplateMiddleList TemplateTail
  1. head を ? Evaluation of TemplateMiddleList とする。
  2. tail12.9.6 で定義される TemplateTailTV とす る。
  3. headtailstring-concatenation を返す。
TemplateMiddleList : TemplateMiddle Expression
  1. head12.9.6 で定義される TemplateMiddleTV とす る。
  2. subRef を ? Evaluation of Expression とする。
  3. sub を ? GetValue(subRef) とする。
  4. middle を ? ToString(sub) とする。
  5. headmiddlestring-concatenation を返す。
Note 2

Expression 値に適用される文字列変換の意味論 は、+ 演算子というより String.prototype.concat に近い。

TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression
  1. rest を ? Evaluation of TemplateMiddleList とする。
  2. middle12.9.6 で定義される TemplateMiddleTV とす る。
  3. subRef を ? Evaluation of Expression とする。
  4. sub を ? GetValue(subRef) とする。
  5. last を ? ToString(sub) とする。
  6. rest, middle, および laststring-concatenation を返す。
Note 3

Expression 値に適用される文字列変換の意味論 は、+ 演算子というより String.prototype.concat に近い。

13.2.9 Grouping Operator

13.2.9.1 Static Semantics: Early Errors

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList

13.2.9.2 Runtime Semantics: Evaluation

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprCoverParenthesizedExpressionAndArrowParameterList によって cover される ParenthesizedExpression とする。
  2. exprEvaluation を ? 返す。
ParenthesizedExpression : ( Expression )
  1. ExpressionEvaluation を ? 返す。これは Reference 型である場合がある。
Note

この algorithm は ExpressionEvaluationGetValue を適用しない。この主たる動機 は、deletetypeof のような演算子を括弧付き 式へ適用できるようにすることである。

13.3 Left-Hand-Side Expressions

構文

MemberExpression[Yield, Await] : PrimaryExpression[?Yield, ?Await] MemberExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] MemberExpression[?Yield, ?Await] . IdentifierName MemberExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] SuperProperty[?Yield, ?Await] MetaProperty new MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await] MemberExpression[?Yield, ?Await] . PrivateIdentifier SuperProperty[Yield, Await] : super [ Expression[+In, ?Yield, ?Await] ] super . IdentifierName MetaProperty : NewTarget ImportMeta NewTarget : new . target ImportMeta : import . meta NewExpression[Yield, Await] : MemberExpression[?Yield, ?Await] new NewExpression[?Yield, ?Await] CallExpression[Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] SuperCall[?Yield, ?Await] ImportCall[?Yield, ?Await] CallExpression[?Yield, ?Await] Arguments[?Yield, ?Await] CallExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] CallExpression[?Yield, ?Await] . IdentifierName CallExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] CallExpression[?Yield, ?Await] . PrivateIdentifier SuperCall[Yield, Await] : super Arguments[?Yield, ?Await] ImportCall[Yield, Await] : import ( AssignmentExpression[+In, ?Yield, ?Await] ,opt ) import ( AssignmentExpression[+In, ?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ,opt ) Arguments[Yield, Await] : ( ) ( ArgumentList[?Yield, ?Await] ) ( ArgumentList[?Yield, ?Await] , ) ArgumentList[Yield, Await] : AssignmentExpression[+In, ?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , ... AssignmentExpression[+In, ?Yield, ?Await] OptionalExpression[Yield, Await] : MemberExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalChain[Yield, Await] : ?. Arguments[?Yield, ?Await] ?. [ Expression[+In, ?Yield, ?Await] ] ?. IdentifierName ?. TemplateLiteral[?Yield, ?Await, +Tagged] ?. PrivateIdentifier OptionalChain[?Yield, ?Await] Arguments[?Yield, ?Await] OptionalChain[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] OptionalChain[?Yield, ?Await] . IdentifierName OptionalChain[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] OptionalChain[?Yield, ?Await] . PrivateIdentifier LeftHandSideExpression[Yield, Await] : NewExpression[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalExpression[?Yield, ?Await]

補助構文

次の production の instance を処理するとき
CallExpression : CoverCallExpressionAndAsyncArrowHead
CoverCallExpressionAndAsyncArrowHead の解釈 は、以下の文法を用いて精密化される:

CallMemberExpression[Yield, Await] : MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]

13.3.1 Static Semantics

13.3.1.1 Static Semantics: Early Errors

OptionalChain : ?. TemplateLiteral OptionalChain TemplateLiteral
  • 任意の source text がこの production に 一致する場合、それは Syntax Error である。
Note

この production は、次の code に対して自 動セミコロン挿入規則 (12.10) が適用されるのを防ぐために存在する:

a?.b
`c`

そうでなければ、それが 2 つの妥当な文として解釈さ れてしまうからである。目的は、optional chaining を 持たない類似 code との一貫性を維持することである:

a.b
`c`

これは妥当な文であり、自動セミコロン挿入は適用され ない。

ImportMeta : import . meta
  • syntactic goal symbolModule でない場合、それは Syntax Error である。

13.3.2 Property Accessors

Note

property は、名前によってアクセスされ、次のよう な dot notation を用いる:

または、次のような bracket notation を用い る:

dot notation は、次の構文変換によって説明され る:

これは、その振る舞いにおいて次と同一である:

MemberExpression [ <identifier-name-string> ]

同様に

これは、その振る舞いにおいて次と同一である:

CallExpression [ <identifier-name-string> ]

ここで <identifier-name-string> は IdentifierNameStringValue である。

13.3.2.1 Runtime Semantics: Evaluation

MemberExpression : MemberExpression [ Expression ]
  1. baseReference を ? Evaluation of MemberExpression とする。
  2. baseValue を ? GetValue(baseReference) とする。
  3. strictIsStrict(this MemberExpression) とする。
  4. EvaluatePropertyAccessWithExpressionKey( baseValue, Expression, strict) を返 す。
MemberExpression : MemberExpression . IdentifierName
  1. baseReference を ? Evaluation of MemberExpression とする。
  2. baseValue を ? GetValue(baseReference) とする。
  3. strictIsStrict(this MemberExpression) とする。
  4. EvaluatePropertyAccessWithIdentifierKey( baseValue, IdentifierName, strict) を 返す。
MemberExpression : MemberExpression . PrivateIdentifier
  1. baseReference を ? Evaluation of MemberExpression とする。
  2. baseValue を ? GetValue(baseReference) とする。
  3. fieldNameStringPrivateIdentifierStringValue とす る。
  4. MakePrivateReference(baseValue, fieldNameString) を返す。
CallExpression : CallExpression [ Expression ]
  1. baseReference を ? Evaluation of CallExpression とする。
  2. baseValue を ? GetValue(baseReference) とする。
  3. strictIsStrict(this CallExpression) とする。
  4. EvaluatePropertyAccessWithExpressionKey( baseValue, Expression, strict) を返 す。
CallExpression : CallExpression . IdentifierName
  1. baseReference を ? Evaluation of CallExpression とする。
  2. baseValue を ? GetValue(baseReference) とする。
  3. strictIsStrict(this CallExpression) とする。
  4. EvaluatePropertyAccessWithIdentifierKey( baseValue, IdentifierName, strict) を 返す。
CallExpression : CallExpression . PrivateIdentifier
  1. baseReference を ? Evaluation of CallExpression とする。
  2. baseValue を ? GetValue(baseReference) とする。
  3. fieldNameStringPrivateIdentifierStringValue とす る。
  4. MakePrivateReference(baseValue, fieldNameString) を返す。

13.3.3 EvaluatePropertyAccessWithExpressionKey ( baseValue, expression, strict )

The abstract operation EvaluatePropertyAccessWithExpressionKey takes arguments baseValue (an ECMAScript language value), expression (an Expression Parse Node), and strict (a Boolean) and returns either a normal completion containing a Reference Record or an abrupt completion. It performs the following steps when called:

  1. propertyNameReference を ? Evaluation of expression とする。
  2. propertyNameValue を ? GetValue(propertyNameReference) とす る。
  3. NOTE: ほとんどの場合、 ToPropertyKey はこの手順の直後に propertyNameValue に対して実行される。し かし a[b] = c の場合、それは c の評価後 まで実行されない。
  4. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyNameValue, [[Strict]]: strict, [[ThisValue]]: empty } を返す。

13.3.4 EvaluatePropertyAccessWithIdentifierKey ( baseValue, identifierName, strict )

The abstract operation EvaluatePropertyAccessWithIdentifierKey takes arguments baseValue (an ECMAScript language value), identifierName (an IdentifierName Parse Node), and strict (a Boolean) and returns a Reference Record. It performs the following steps when called:

  1. propertyNameStringidentifierNameStringValue とする。
  2. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyNameString, [[Strict]]: strict, [[ThisValue]]: empty } を返す。

13.3.5 new Operator

13.3.5.1 Runtime Semantics: Evaluation

NewExpression : new NewExpression
  1. EvaluateNew(NewExpression, empty) を返 す。
MemberExpression : new MemberExpression Arguments
  1. EvaluateNew(MemberExpression, Arguments) を返す。

13.3.5.1.1 EvaluateNew ( constructExpr, arguments )

The abstract operation EvaluateNew takes arguments constructExpr (a NewExpression Parse Node or a MemberExpression Parse Node) and arguments (empty or an Arguments Parse Node) and returns either a normal completion containing an Object or an abrupt completion. It performs the following steps when called:

  1. ref を ? Evaluation of constructExpr とする。
  2. constructor を ? GetValue(ref) とす る。
  3. argumentsempty なら、
    1. argList を新しい空の List とする。
  4. Else,
    1. argList を ? ArgumentListEvaluation of arguments とする。
  5. IsConstructor(constructor) が false なら、TypeError 例外を送出する。
  6. Construct(constructor, argList) を 返す。

13.3.6 関数呼出し

13.3.6.1 Runtime Semantics: Evaluation

CallExpression : CoverCallExpressionAndAsyncArrowHead
  1. exprCoverCallExpressionAndAsyncArrowHead に よって cover される CallMemberExpression とする。
  2. memberExprexprMemberExpression とする。
  3. argumentsexprArguments と する。
  4. ref を ? Evaluation of memberExpr とする。
  5. func を ? GetValue(ref) とする。
  6. refReference Record であり、 IsPropertyReference(ref) が false であ り、かつ ref.[[ReferencedName]]"eval" なら、
    1. SameValue(func, %eval%) が true なら、
      1. argList を ? ArgumentListEvaluation of arguments とする。
      2. argList が要素を持たないなら、 undefined を返す。
      3. evalArgargList の最初の要素 とする。
      4. IsStrict(this CallExpression) が true なら、strictCallertrue とする; そうでなければ strictCallerfalse とする。
      5. PerformEval(evalArg, strictCaller, true) を返す。
  7. thisCall を this CallExpression とす る。
  8. tailCallIsInTailPosition(thisCall) とする。
  9. EvaluateCall(func, ref, arguments, tailCall) を返す。

step 6.a.v を実行する CallExpression の評価は、 direct eval である。

CallExpression : CallExpression Arguments
  1. ref を ? Evaluation of CallExpression とする。
  2. func を ? GetValue(ref) とする。
  3. thisCall を this CallExpression とす る。
  4. tailCallIsInTailPosition(thisCall) とする。
  5. EvaluateCall(func, ref, Arguments, tailCall) を返す。

13.3.6.2 EvaluateCall ( func, ref, arguments, tailPosition )

The abstract operation EvaluateCall takes arguments func (an ECMAScript language value), ref (an ECMAScript language value or a Reference Record), arguments (a Parse Node), and tailPosition (a Boolean) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

  1. refReference Record なら、
    1. IsPropertyReference(ref) が true な ら、
      1. thisValueGetThisValue(ref) とする。
    2. Else,
      1. refEnvref.[[Base]] とする。
      2. Assert: refEnvEnvironment Record である。
      3. thisValuerefEnv.WithBaseObject() とする。
  2. Else,
    1. thisValueundefined とする。
  3. argList を ? ArgumentListEvaluation of arguments とする。
  4. func が Object でなければ、 TypeError 例外を送出する。
  5. IsCallable(func) が false なら、 TypeError 例外を送出する。
  6. tailPositiontrue なら、 PrepareForTailCall() を実行する。
  7. Call(func, thisValue, argList) を 返す。

13.3.7 super Keyword

13.3.7.1 Runtime Semantics: Evaluation

SuperProperty : super [ Expression ]
  1. envGetThisEnvironment() とする。
  2. actualThis を ? env.GetThisBinding() とする。
  3. propertyNameReference を ? Evaluation of Expression とする。
  4. propertyNameValue を ? GetValue(propertyNameReference) とす る。
  5. strictIsStrict(this SuperProperty) とする。
  6. NOTE: ほとんどの場合、 ToPropertyKey はこの手順の直後に propertyNameValue に対して実行される。し かし super[b] = c の場合、それは c の 評価後まで実行されない。
  7. MakeSuperPropertyReference(actualThis, propertyNameValue, strict) を返す。
SuperProperty : super . IdentifierName
  1. envGetThisEnvironment() とする。
  2. actualThis を ? env.GetThisBinding() とする。
  3. propertyKeyIdentifierNameStringValue とする。
  4. strictIsStrict(this SuperProperty) とする。
  5. MakeSuperPropertyReference(actualThis, propertyKey, strict) を返す。
SuperCall : super Arguments
  1. newTargetGetNewTarget() とする。
  2. Assert: newTargetconstructor であ る。
  3. superConstructorGetSuperConstructor() とする。
  4. argList を ? ArgumentListEvaluation of Arguments とする。
  5. IsConstructor(superConstructor) が false なら、TypeError 例外を送出 する。
  6. result を ? Construct(superConstructor, argList, newTarget) とする。
  7. thisERGetThisEnvironment() とす る。
  8. Assert: thisERFunction Environment Record である。
  9. BindThisValue(thisER, result) を 実行する。
  10. funcObjthisER.[[FunctionObject]] とする。
  11. Assert: funcObj は ECMAScript 関数 object である。
  12. InitializeInstanceElements(result, funcObj) を実行する。
  13. result を返す。

13.3.7.2 GetSuperConstructor ( )

The abstract operation GetSuperConstructor takes no arguments and returns an Object or null. It performs the following steps when called:

  1. envRecGetThisEnvironment() とする。
  2. Assert: envRecFunction Environment Record である。
  3. activeFunctionenvRec.[[FunctionObject]] とする。
  4. Assert: activeFunction は ECMAScript 関数 object である。
  5. superConstructor を ! activeFunction.[[GetPrototypeOf]]() とする。
  6. superConstructor を返す。

13.3.7.3 MakeSuperPropertyReference ( actualThis, propertyKey, strict )

The abstract operation MakeSuperPropertyReference takes arguments actualThis (an ECMAScript language value), propertyKey (an ECMAScript language value), and strict (a Boolean) and returns a Super Reference Record. It performs the following steps when called:

  1. envGetThisEnvironment() とする。
  2. Assert: env.HasSuperBinding() is true.
  3. Assert: envFunction Environment Record である。
  4. baseValueGetSuperBase(env) とす る。
  5. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyKey, [[Strict]]: strict, [[ThisValue]]: actualThis } を返す。

13.3.8 Argument List

Note

argument list の評価は、値の List を生成す る。

13.3.8.1 Runtime Semantics: ArgumentListEvaluation

The syntax-directed operation ArgumentListEvaluation takes no arguments and returns either a normal completion containing a List of ECMAScript language values or an abrupt completion. It is defined piecewise over the following productions:

Arguments : ( )
  1. 新しい空の List を返す。
ArgumentList : AssignmentExpression
  1. ref を ? Evaluation of AssignmentExpression とする。
  2. arg を ? GetValue(ref) とする。
  3. « arg » を返す。
ArgumentList : ... AssignmentExpression
  1. list を新しい空の List とする。
  2. spreadRef を ? Evaluation of AssignmentExpression とする。
  3. spreadObj を ? GetValue(spreadRef) とする。
  4. iteratorRecord を ? GetIterator(spreadObj, sync) とす る。
  5. 繰り返す
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone なら、list を返す。
    3. nextlist に append する。
ArgumentList : ArgumentList , AssignmentExpression
  1. precedingArgsArgumentListArgumentListEvaluation の ? とする。
  2. ref を ? Evaluation of AssignmentExpression とする。
  3. arg を ? GetValue(ref) とする。
  4. precedingArgs と « arg » の list-concatenation を返す。
ArgumentList : ArgumentList , ... AssignmentExpression
  1. precedingArgsArgumentListArgumentListEvaluation の ? とする。
  2. spreadRef を ? Evaluation of AssignmentExpression とする。
  3. iteratorRecord を ? GetIterator(? GetValue(spreadRef), sync) とする。
  4. 繰り返す
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone なら、 precedingArgs を返す。
    3. nextprecedingArgs に append する。
TemplateLiteral : NoSubstitutionTemplate
  1. templateLiteral を this TemplateLiteral とする。
  2. siteObjGetTemplateObject(templateLiteral) とす る。
  3. « siteObj » を返す。
TemplateLiteral : SubstitutionTemplate
  1. templateLiteral を this TemplateLiteral とする。
  2. siteObjGetTemplateObject(templateLiteral) とす る。
  3. remaining を ? ArgumentListEvaluation of SubstitutionTemplate とする。
  4. « siteObj » と remaininglist-concatenation を返す。
SubstitutionTemplate : TemplateHead Expression TemplateSpans
  1. firstSubRef を ? Evaluation of Expression とする。
  2. firstSub を ? GetValue(firstSubRef) とする。
  3. restSub を ? SubstitutionEvaluation of TemplateSpans とする。
  4. Assert: restSub は空である場合もある List である。
  5. « firstSub » と restSublist-concatenation を返す。

13.3.9 Optional Chain

Note
optional chain とは、1 個以上の property access および function call の連鎖で あり、その最初のものが token ?. で始まるものであ る。

13.3.9.1 Runtime Semantics: Evaluation

OptionalExpression : MemberExpression OptionalChain
  1. baseReference を ? Evaluation of MemberExpression とする。
  2. baseValue を ? GetValue(baseReference) とする。
  3. baseValueundefined または null のいずれかなら、
    1. undefined を返す。
  4. baseValue および baseReference を引数 とする OptionalChainChainEvaluation を ? 返す。
OptionalExpression : CallExpression OptionalChain
  1. baseReference を ? Evaluation of CallExpression とする。
  2. baseValue を ? GetValue(baseReference) とする。
  3. baseValueundefined または null のいずれかなら、
    1. undefined を返す。
  4. baseValue および baseReference を引数 とする OptionalChainChainEvaluation を ? 返す。
OptionalExpression : OptionalExpression OptionalChain
  1. baseReference を ? Evaluation of OptionalExpression とする。
  2. baseValue を ? GetValue(baseReference) とする。
  3. baseValueundefined または null のいずれかなら、
    1. undefined を返す。
  4. baseValue および baseReference を引数 とする OptionalChainChainEvaluation を ? 返す。

13.3.9.2 Runtime Semantics: ChainEvaluation

The syntax-directed operation ChainEvaluation takes arguments baseValue (an ECMAScript language value) and baseReference (an ECMAScript language value or a Reference Record) and returns either a normal completion containing either an ECMAScript language value or a Reference Record, or an abrupt completion. It is defined piecewise over the following productions:

OptionalChain : ?. Arguments
  1. thisChain を this OptionalChain とする。
  2. tailCallIsInTailPosition(thisChain) とする。
  3. EvaluateCall(baseValue, baseReference, Arguments, tailCall) を返す。
OptionalChain : ?. [ Expression ]
  1. strictIsStrict(this OptionalChain) とする。
  2. EvaluatePropertyAccessWithExpressionKey( baseValue, Expression, strict) を返 す。
OptionalChain : ?. IdentifierName
  1. strictIsStrict(this OptionalChain) とする。
  2. EvaluatePropertyAccessWithIdentifierKey( baseValue, IdentifierName, strict) を 返す。
OptionalChain : ?. PrivateIdentifier
  1. fieldNameStringPrivateIdentifierStringValue とする。
  2. MakePrivateReference(baseValue, fieldNameString) を返す。
OptionalChain : OptionalChain Arguments
  1. optionalChainOptionalChain とする。
  2. newReference を、baseValue および baseReference を引数とする optionalChainChainEvaluation の ? とする。
  3. newValue を ? GetValue(newReference) とする。
  4. thisChain を this OptionalChain とす る。
  5. tailCallIsInTailPosition(thisChain) とする。
  6. EvaluateCall(newValue, newReference, Arguments, tailCall) を返す。
OptionalChain : OptionalChain [ Expression ]
  1. optionalChainOptionalChain とする。
  2. newReference を、baseValue および baseReference を引数とする optionalChainChainEvaluation の ? とする。
  3. newValue を ? GetValue(newReference) とする。
  4. strictIsStrict(this OptionalChain) とする。
  5. EvaluatePropertyAccessWithExpressionKey( newValue, Expression, strict) を返 す。
OptionalChain : OptionalChain . IdentifierName
  1. optionalChainOptionalChain とする。
  2. newReference を、baseValue および baseReference を引数とする optionalChainChainEvaluation の ? とする。
  3. newValue を ? GetValue(newReference) とする。
  4. strictIsStrict(this OptionalChain) とする。
  5. EvaluatePropertyAccessWithIdentifierKey( newValue, IdentifierName, strict) を 返す。
OptionalChain : OptionalChain . PrivateIdentifier
  1. optionalChainOptionalChain とする。
  2. newReference を、baseValue および baseReference を引数とする optionalChainChainEvaluation の ? とする。
  3. newValue を ? GetValue(newReference) とする。
  4. fieldNameStringPrivateIdentifierStringValue とする。
  5. MakePrivateReference(newValue, fieldNameString) を返す。

13.3.10 Import Call

13.3.10.1 Runtime Semantics: Evaluation

ImportCall : import ( AssignmentExpression ,opt )
  1. EvaluateImportCall(AssignmentExpression) を返す。
ImportCall : import ( AssignmentExpression , AssignmentExpression ,opt )
  1. EvaluateImportCall(最初の AssignmentExpression, 2 番目の AssignmentExpression) を返す。

13.3.10.2 EvaluateImportCall ( specifierExpression [ , optionsExpression ] )

The abstract operation EvaluateImportCall takes argument specifierExpression (a Parse Node) and optional argument optionsExpression (a Parse Node) and returns either a normal completion containing a Promise or an abrupt completion. It performs the following steps when called:

  1. referrerGetActiveScriptOrModule() とする。
  2. referrernull なら、referrercurrent Realm Record に設定する。
  3. specifierRef を ? Evaluation of specifierExpression とする。
  4. specifier を ? GetValue(specifierRef) とする。
  5. optionsExpression が存在するなら、
    1. optionsRef を ? Evaluation of optionsExpression とする。
    2. options を ? GetValue(optionsRef) とする。
  6. Else,
    1. optionsundefined とする。
  7. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  8. specifierStringCompletion(ToString(specifier)) とする。
  9. IfAbruptRejectPromise(specifierString, promiseCapability).
  10. attributes を新しい空の List とする。
  11. optionsundefined でないなら、
    1. options が Object でないなら、
      1. Call(promiseCapability.[[Reject]], undefined, « 新たに作成された TypeError object ») を実行する。
      2. promiseCapability.[[Promise]] を返す。
    2. attributesObjCompletion(Get(options, "with")) とする。
    3. IfAbruptRejectPromise(attributesObj, promiseCapability).
    4. attributesObjundefined でない なら、
      1. attributesObj が Object でないな ら、
        1. Call(promiseCapability.[[Reject]], undefined, « 新たに作成された TypeError object ») を実行する。
        2. promiseCapability.[[Promise]] を返 す。
      2. entriesCompletion(EnumerableOwnProperties( attributesObj, key+value)) とす る。
      3. IfAbruptRejectPromise(entries, promiseCapability).
      4. entries の各要素 entry について、 次を行う
        1. key を ! Get(entry, "0") とする。
        2. value を ! Get(entry, "1") とする。
        3. key が String なら、
          1. value が String でないなら、
            1. Call(promiseCapability.[[Reject]], undefined, « 新たに作成された TypeError object ») を実行す る。
            2. promiseCapability.[[Promise]] を返す。
          2. ImportAttribute Record { [[Key]]: key, [[Value]]: value } を attributes に append する。
    5. AllImportAttributesSupported(attributes) が false なら、
      1. Call(promiseCapability.[[Reject]], undefined, « 新たに作成された TypeError object ») を実行する。
      2. promiseCapability.[[Promise]] を返 す。
    6. attributes を、それぞれの [[Key]] field の値を UTF-16 code unit 値列と して扱ったときの辞書順に従って sort す る。NOTE: この sorting は、host が attribute の列挙順序に基づいて挙動を変えて はならないという点においてのみ観測可能であ る。
  12. moduleRequest を新しい ModuleRequest Record { [[Specifier]]: specifierString, [[Attributes]]: attributes } とする。
  13. HostLoadImportedModule(referrer, moduleRequest, empty, promiseCapability) を実行する。
  14. promiseCapability.[[Promise]] を返す。

13.3.10.3 ContinueDynamicImport ( promiseCapability, moduleCompletion )

The abstract operation ContinueDynamicImport takes arguments promiseCapability (a PromiseCapability Record) and moduleCompletion (either a normal completion containing a Module Record or a throw completion) and returns unused. これは、 import() call によって元々開始された dynamic import の処理 を完了し、その call が返した promise を適切に resolve または reject する。 It performs the following steps when called:

  1. moduleCompletionabrupt completion なら、
    1. Call(promiseCapability.[[Reject]], undefined, « moduleCompletion.[[Value]]  ») を実行する。
    2. unused を返す。
  2. modulemoduleCompletion.[[Value]] とする。
  3. loadPromisemodule.LoadRequestedModules() とする。
  4. rejectedClosure を、(reason) を引数 とし、promiseCapability を capture し、呼び出されたとき次の手順を実行する新しい Abstract Closure とする:
    1. Call(promiseCapability.[[Reject]], undefined, « reason ») を実行す る。
    2. NormalCompletion(undefined) を返 す。
  5. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « ») とする。
  6. linkAndEvaluateClosure を、引数を持た ず、module, promiseCapability, およ び onRejected を capture し、呼び出 されたとき次の手順を実行する新しい Abstract Closure とする:
    1. linkCompletion(module.Link()) とする。
    2. linkabrupt completion なら、
      1. Call(promiseCapability.[[Reject]], undefined, « link.[[Value]] ») を実行する。
      2. NormalCompletion(undefined) を返 す。
    3. evaluatePromisemodule.Evaluate() とする。
    4. fulfilledClosure を、引数を持たず、 module および promiseCapability を capture し、呼び出されたとき次の手 順を実行する新しい Abstract Closure と する:
      1. namespaceGetModuleNamespace(module) とす る。
      2. Call(promiseCapability.[[Resolve]], undefined, « namespace ») を実行する。
      3. NormalCompletion(undefined) を返 す。
    5. onFulfilledCreateBuiltinFunction(fulfilledClosure, 0, "", « ») とする。
    6. PerformPromiseThen(evaluatePromise, onFulfilled, onRejected) を実行す る。
    7. unused を返す。
  7. linkAndEvaluateCreateBuiltinFunction( linkAndEvaluateClosure, 0, "", « ») とする。
  8. PerformPromiseThen(loadPromise, linkAndEvaluate, onRejected) を実行 する。
  9. unused を返す。

13.3.11 Tagged Template

Note

tagged template は function call であ り、その call の引数は TemplateLiteral13.2.8) から導出される。実際の引数には template object (13.2.8.4) と、TemplateLiteral 内に埋め込まれた式を評価する ことで生成される値が含まれる。

13.3.11.1 Runtime Semantics: Evaluation

MemberExpression : MemberExpression TemplateLiteral
  1. tagRef を ? Evaluation of MemberExpression とする。
  2. tagFunc を ? GetValue(tagRef) とす る。
  3. thisCall を this MemberExpression とする。
  4. tailCallIsInTailPosition(thisCall) とする。
  5. EvaluateCall(tagFunc, tagRef, TemplateLiteral, tailCall) を返す。
CallExpression : CallExpression TemplateLiteral
  1. tagRef を ? Evaluation of CallExpression とする。
  2. tagFunc を ? GetValue(tagRef) とす る。
  3. thisCall を this CallExpression とする。
  4. tailCallIsInTailPosition(thisCall) とする。
  5. EvaluateCall(tagFunc, tagRef, TemplateLiteral, tailCall) を返す。

13.3.12 Meta Property

13.3.12.1 Runtime Semantics: Evaluation

NewTarget : new . target
  1. GetNewTarget() を返す。
ImportMeta : import . meta
  1. moduleGetActiveScriptOrModule() とする。
  2. Assert: module は Source Text Module Record である。
  3. importMetamodule.[[ImportMeta]] とする。
  4. importMetaempty なら、
    1. importMetaOrdinaryObjectCreate(null) に設定す る。
    2. importMetaValuesHostGetImportMetaProperties(module) とする。
    3. importMetaValues の各 Record { [[Key]], [[Value]] } p につい て、次を行う
      1. CreateDataPropertyOrThrow( importMeta, p.[[Key]], p.[[Value]]) を実行する。
    4. HostFinalizeImportMeta(importMeta, module) を実行する。
    5. module.[[ImportMeta]]importMeta に設定する。
    6. importMeta を返す。
  5. Assert: importMeta は Object である。
  6. importMeta を返す。

13.3.12.1.1 HostGetImportMetaProperties ( moduleRecord )

The host-defined abstract operation HostGetImportMetaProperties takes argument moduleRecord (a Module Record) and returns a List of Records with fields [[Key]] (a property key) and [[Value]] (an ECMAScript language value). これは、hostimport.meta から返される object に対する property key および値を提供できるよ うにする。

HostGetImportMetaProperties の default implementation は、新しい空の List を返すことであ る。

13.3.12.1.2 HostFinalizeImportMeta ( importMeta, moduleRecord )

The host-defined abstract operation HostFinalizeImportMeta takes arguments importMeta (an Object) and moduleRecord (a Module Record) and returns unused. これは、hostimport.meta から返される object を準備するために、任意の特別な操作を実行できるよ うにする。

ほとんどの host は、単に HostGetImportMetaProperties を定義し、 HostFinalizeImportMeta は default の挙動のまま にしておけるだろう。しかし、 HostFinalizeImportMeta は、object が ECMAScript code に公開される前に直接操作する必要が ある host のための “escape hatch” を提供する。

HostFinalizeImportMeta の default implementation は unused を返すことである。

13.4 Update Expression

構文

UpdateExpression[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++ LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] -- ++ UnaryExpression[?Yield, ?Await] -- UnaryExpression[?Yield, ?Await]

13.4.1 Static Semantics: Early Errors

UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- UpdateExpression : ++ UnaryExpression -- UnaryExpression

13.4.2 Postfix Increment Operator

13.4.2.1 Runtime Semantics: Evaluation

UpdateExpression : LeftHandSideExpression ++
  1. lhs を ? Evaluation of LeftHandSideExpression とする。
  2. LeftHandSideExpressionAssignmentTargetTypeweb-compat な ら、ReferenceError 例外を送出する。
  3. oldValue を ? ToNumeric(? GetValue(lhs)) とする。
  4. oldValue が Number なら、
    1. newValueNumber::add(oldValue, 1𝔽) とする。
  5. Else,
    1. Assert: oldValue は BigInt である。
    2. newValueBigInt::add(oldValue, 1) とする。
  6. PutValue(lhs, newValue) を実行す る。
  7. oldValue を返す。

13.4.3 Postfix Decrement Operator

13.4.3.1 Runtime Semantics: Evaluation

UpdateExpression : LeftHandSideExpression --
  1. lhs を ? Evaluation of LeftHandSideExpression とする。
  2. LeftHandSideExpressionAssignmentTargetTypeweb-compat な ら、ReferenceError 例外を送出する。
  3. oldValue を ? ToNumeric(? GetValue(lhs)) とする。
  4. oldValue が Number なら、
    1. newValueNumber::subtract(oldValue, 1𝔽) とする。
  5. Else,
    1. Assert: oldValue は BigInt である。
    2. newValueBigInt::subtract(oldValue, 1) とする。
  6. PutValue(lhs, newValue) を実行す る。
  7. oldValue を返す。

13.4.4 Prefix Increment Operator

13.4.4.1 Runtime Semantics: Evaluation

UpdateExpression : ++ UnaryExpression
  1. expr を ? Evaluation of UnaryExpression とする。
  2. UnaryExpressionAssignmentTargetTypeweb-compat なら、 ReferenceError 例外を送出する。
  3. oldValue を ? ToNumeric(? GetValue(expr)) とする。
  4. oldValue が Number なら、
    1. newValueNumber::add(oldValue, 1𝔽) とする。
  5. Else,
    1. Assert: oldValue は BigInt である。
    2. newValueBigInt::add(oldValue, 1) とする。
  6. PutValue(expr, newValue) を実行す る。
  7. newValue を返す。

13.4.5 Prefix Decrement Operator

13.4.5.1 Runtime Semantics: Evaluation

UpdateExpression : -- UnaryExpression
  1. expr を ? Evaluation of UnaryExpression とする。
  2. UnaryExpressionAssignmentTargetTypeweb-compat なら、 ReferenceError 例外を送出する。
  3. oldValue を ? ToNumeric(? GetValue(expr)) とする。
  4. oldValue が Number なら、
    1. newValueNumber::subtract(oldValue, 1𝔽) とする。
  5. Else,
    1. Assert: oldValue は BigInt である。
    2. newValueBigInt::subtract(oldValue, 1) とする。
  6. PutValue(expr, newValue) を実行す る。
  7. newValue を返す。

13.5 Unary Operator

構文

UnaryExpression[Yield, Await] : UpdateExpression[?Yield, ?Await] delete UnaryExpression[?Yield, ?Await] void UnaryExpression[?Yield, ?Await] typeof UnaryExpression[?Yield, ?Await] + UnaryExpression[?Yield, ?Await] - UnaryExpression[?Yield, ?Await] ~ UnaryExpression[?Yield, ?Await] ! UnaryExpression[?Yield, ?Await] [+Await] AwaitExpression[?Yield]

13.5.1 delete Operator

13.5.1.1 Static Semantics: Early Errors

UnaryExpression : delete UnaryExpression Note

最後の規則は、delete (((foo))) のような式 が、最初の規則の再帰的適用により early error を生 じることを意味する。

13.5.1.2 Runtime Semantics: Evaluation

UnaryExpression : delete UnaryExpression
  1. ref を ? Evaluation of UnaryExpression とする。
  2. refReference Record でないなら、 true を返す。
  3. IsUnresolvableReference(ref) が true なら、
    1. Assert: ref.[[Strict]] is false.
    2. true を返す。
  4. IsPropertyReference(ref) が true な ら、
    1. Assert: IsPrivateReference(ref) is false.
    2. IsSuperReference(ref) が true な ら、ReferenceError 例外を送出する。
    3. baseObj を ? ToObject(ref.[[Base]]) とす る。
    4. ref.[[ReferencedName]]property key でないなら、
      1. ref.[[ReferencedName]] を ? ToPropertyKey(ref.[[ReferencedName]]) に設定する。
    5. deleteStatus を ? baseObj.[[Delete]](ref.[[ReferencedName]]) とする。
    6. deleteStatusfalse であり、 かつ ref.[[Strict]]true な ら、TypeError 例外を送出する。
    7. deleteStatus を返す。
  5. baseref.[[Base]] とする。
  6. Assert: baseEnvironment Record である。
  7. base.DeleteBinding(ref.[[ReferencedName]]) を返す。
Note 1

delete 演算子が strict mode code の中 に現れるとき、その UnaryExpression が変数、関数引 数、または関数名への直接参照である場合には SyntaxError 例外が送出される。さらに、delete 演算子が strict mode code の中に現れ、削除対象の property が { [[Configurable]]: false } とい う属性を持つ(またはその他の理由で削除できない)場合に は、TypeError 例外が送出される。

Note 2

step 4.c で作成され得る object は、上記の abstract operation および通常 object の [[Delete]] 内部メ ソッドの外部からはアクセス不能である。実装は、その object の実際の作成を避けることを選んでもよい。

13.5.2 void Operator

13.5.2.1 Runtime Semantics: Evaluation

UnaryExpression : void UnaryExpression
  1. expr を ? Evaluation of UnaryExpression とする。
  2. GetValue(expr) を実行する。
  3. undefined を返す。
Note

GetValue は、その値が使用されないとしても、観測 可能な副作用を持つことがあるため、呼び出されなければなら ない。

13.5.3 typeof Operator

13.5.3.1 Runtime Semantics: Evaluation

UnaryExpression : typeof UnaryExpression
  1. val を ? Evaluation of UnaryExpression とする。
  2. valReference Record なら、
    1. IsUnresolvableReference(val) が true なら、"undefined" を返 す。
  3. val を ? GetValue(val) に設定する。
  4. valundefined なら、 "undefined" を返す。
  5. valnull なら、"object" を返 す。
  6. val が String なら、"string" を返 す。
  7. val が Symbol なら、"symbol" を返 す。
  8. val が Boolean なら、"boolean" を 返す。
  9. val が Number なら、"number" を返 す。
  10. val が BigInt なら、"bigint" を返 す。
  11. Assert: val は Object である。
  12. host が web browser であるか、または [[IsHTMLDDA]] 内部スロット をサポートするなら、
    1. val[[IsHTMLDDA]] internal slot を持つなら、"undefined" を返す。
  13. val[[Call]] internal method を持 つなら、"function" を返す。
  14. "object" を返す。

13.5.4 Unary + Operator

Note

単項 + 演算子は、その operand を Number 型へ変換する。

13.5.4.1 Runtime Semantics: Evaluation

UnaryExpression : + UnaryExpression
  1. expr を ? Evaluation of UnaryExpression とする。
  2. ToNumber(? GetValue(expr)) を返す。

13.5.5 Unary - Operator

Note

単項 - 演算子は、その operand を数値へ変換 し、その後それを negate する。+0𝔽 を negate すると -0𝔽 が生成され、 -0𝔽 を negate すると +0𝔽 が生成される。

13.5.5.1 Runtime Semantics: Evaluation

UnaryExpression : - UnaryExpression
  1. expr を ? Evaluation of UnaryExpression とする。
  2. oldValue を ? ToNumeric(? GetValue(expr)) とする。
  3. oldValue が Number なら、 Number::unaryMinus(oldValue) を返す。
  4. Assert: oldValue は BigInt である。
  5. BigInt::unaryMinus(oldValue) を返す。

13.5.6 Bitwise NOT Operator ( ~ )

13.5.6.1 Runtime Semantics: Evaluation

UnaryExpression : ~ UnaryExpression
  1. expr を ? Evaluation of UnaryExpression とする。
  2. oldValue を ? ToNumeric(? GetValue(expr)) とする。
  3. oldValue が Number なら、 Number::bitwiseNOT(oldValue) を返す。
  4. Assert: oldValue は BigInt である。
  5. BigInt::bitwiseNOT(oldValue) を返す。

13.5.7 Logical NOT Operator ( ! )

13.5.7.1 Runtime Semantics: Evaluation

UnaryExpression : ! UnaryExpression
  1. expr を ? Evaluation of UnaryExpression とする。
  2. oldValueToBoolean(? GetValue(expr)) とする。
  3. oldValuetrue なら、false を返す。
  4. true を返す。

13.6 Exponentiation Operator

構文

ExponentiationExpression[Yield, Await] : UnaryExpression[?Yield, ?Await] UpdateExpression[?Yield, ?Await] ** ExponentiationExpression[?Yield, ?Await]

13.6.1 Runtime Semantics: Evaluation

ExponentiationExpression : UpdateExpression ** ExponentiationExpression
  1. EvaluateStringOrNumericBinaryExpression( UpdateExpression, **, ExponentiationExpression) を返す。

13.7 Multiplicative Operator

構文

MultiplicativeExpression[Yield, Await] : ExponentiationExpression[?Yield, ?Await] MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?Yield, ?Await] MultiplicativeOperator : one of * / % Note
  • * 演算子は乗算を行い、その operand の積 を生成する。
  • / 演算子は除算を行い、その operand の商 を生成する。
  • % 演算子は、暗黙の除算における operand の余りを生成する。

13.7.1 Runtime Semantics: Evaluation

MultiplicativeExpression : MultiplicativeExpression MultiplicativeOperator ExponentiationExpression
  1. opTextMultiplicativeOperator に 一致した source text とする。
  2. EvaluateStringOrNumericBinaryExpression( MultiplicativeExpression, opText, ExponentiationExpression) を返す。

13.8 Additive Operator

構文

AdditiveExpression[Yield, Await] : MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] + MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] - MultiplicativeExpression[?Yield, ?Await]

13.8.1 Addition Operator ( + )

Note

加算演算子は、文字列連結または数値加算のいずれかを行 う。

13.8.1.1 Runtime Semantics: Evaluation

AdditiveExpression : AdditiveExpression + MultiplicativeExpression
  1. EvaluateStringOrNumericBinaryExpression( AdditiveExpression, +, MultiplicativeExpression) を返す。

13.8.2 Subtraction Operator ( - )

Note

- 演算子は減算を行い、その operand の差 を生成する。

13.8.2.1 Runtime Semantics: Evaluation

AdditiveExpression : AdditiveExpression - MultiplicativeExpression
  1. EvaluateStringOrNumericBinaryExpression( AdditiveExpression, -, MultiplicativeExpression) を返す。

13.9 Bitwise Shift Operator

構文

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 Left Shift Operator ( << )

Note

左 operand に対して、右 operand によって指 定された量だけ bitwise left shift を行う。

13.9.1.1 Runtime Semantics: Evaluation

ShiftExpression : ShiftExpression << AdditiveExpression
  1. EvaluateStringOrNumericBinaryExpression( ShiftExpression, <<, AdditiveExpression) を返す。

13.9.2 Signed Right Shift Operator ( >> )

Note

左 operand に対して、右 operand によって指 定された量だけ、符号拡張を伴う bitwise right shift を行う。

13.9.2.1 Runtime Semantics: Evaluation

ShiftExpression : ShiftExpression >> AdditiveExpression
  1. EvaluateStringOrNumericBinaryExpression( ShiftExpression, >>, AdditiveExpression) を返す。

13.9.3 Unsigned Right Shift Operator ( >>> )

Note

左 operand に対して、右 operand によって指 定された量だけ、0 埋めの bitwise right shift を 行う。

13.9.3.1 Runtime Semantics: Evaluation

ShiftExpression : ShiftExpression >>> AdditiveExpression
  1. EvaluateStringOrNumericBinaryExpression( ShiftExpression, >>>, AdditiveExpression) を返す。

13.10 Relational Operator

Note 1

relational operator の評価結果は常に Boolean 型であり、その operator によって名前付けさ れた関係が 2 つの operand の間に成り立つかどうかを 反映する。

構文

RelationalExpression[In, Yield, Await] : ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] < ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] > ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] <= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] >= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] instanceof ShiftExpression[?Yield, ?Await] [+In] RelationalExpression[+In, ?Yield, ?Await] in ShiftExpression[?Yield, ?Await] [+In] PrivateIdentifier in ShiftExpression[?Yield, ?Await] Note 2

[In] 文法 parameter は、 relational expression における in 演算子と、 for 文における in 演算子とを混同しないために必 要である。

13.10.1 Runtime Semantics: Evaluation

RelationalExpression : RelationalExpression < ShiftExpression
  1. lRef を ? Evaluation of RelationalExpression とする。
  2. lVal を ? GetValue(lRef) とする。
  3. rRef を ? Evaluation of ShiftExpression とする。
  4. rVal を ? GetValue(rRef) とする。
  5. result を ? IsLessThan(lVal, rVal, true) とする。
  6. resultundefined なら、false を返す。
  7. result を返す。
RelationalExpression : RelationalExpression > ShiftExpression
  1. lRef を ? Evaluation of RelationalExpression とする。
  2. lVal を ? GetValue(lRef) とする。
  3. rRef を ? Evaluation of ShiftExpression とする。
  4. rVal を ? GetValue(rRef) とする。
  5. result を ? IsLessThan(rVal, lVal, false) とする。
  6. resultundefined なら、false を返す。
  7. result を返す。
RelationalExpression : RelationalExpression <= ShiftExpression
  1. lRef を ? Evaluation of RelationalExpression とする。
  2. lVal を ? GetValue(lRef) とする。
  3. rRef を ? Evaluation of ShiftExpression とする。
  4. rVal を ? GetValue(rRef) とする。
  5. result を ? IsLessThan(rVal, lVal, false) とする。
  6. resulttrue または undefined のいずれかなら、false を返す。
  7. true を返す。
RelationalExpression : RelationalExpression >= ShiftExpression
  1. lRef を ? Evaluation of RelationalExpression とする。
  2. lVal を ? GetValue(lRef) とする。
  3. rRef を ? Evaluation of ShiftExpression とする。
  4. rVal を ? GetValue(rRef) とする。
  5. result を ? IsLessThan(lVal, rVal, true) とする。
  6. resulttrue または undefined のいずれかなら、false を返す。
  7. true を返す。
RelationalExpression : RelationalExpression instanceof ShiftExpression
  1. lRef を ? Evaluation of RelationalExpression とする。
  2. lVal を ? GetValue(lRef) とする。
  3. rRef を ? Evaluation of ShiftExpression とする。
  4. rVal を ? GetValue(rRef) とする。
  5. InstanceofOperator(lVal, rVal) を返 す。
RelationalExpression : RelationalExpression in ShiftExpression
  1. lRef を ? Evaluation of RelationalExpression とする。
  2. lVal を ? GetValue(lRef) とする。
  3. rRef を ? Evaluation of ShiftExpression とする。
  4. rVal を ? GetValue(rRef) とする。
  5. rVal が Object でなければ、 TypeError 例外を送出する。
  6. HasProperty(rVal, ? ToPropertyKey(lVal)) を返す。
RelationalExpression : PrivateIdentifier in ShiftExpression
  1. privateIdentifierPrivateIdentifierStringValue とする。
  2. rRef を ? Evaluation of ShiftExpression とする。
  3. rVal を ? GetValue(rRef) とする。
  4. rVal が Object でなければ、 TypeError 例外を送出する。
  5. privateEnv を、running execution context の PrivateEnvironment とする。
  6. Assert: privateEnvnull ではな い。
  7. privateNameResolvePrivateIdentifier(privateEnv, privateIdentifier) とする。
  8. PrivateElementFind(rVal, privateName) が empty なら、false を返す。
  9. true を返す。

13.10.2 InstanceofOperator ( value, target )

The abstract operation InstanceofOperator takes arguments value (an ECMAScript language value) and target (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. これは、valuetarget の instance であるかどうかを判定する一般 algorithm を実装する。そ れは target%Symbol.hasInstance% method を 参照するか、もしそれが存在しなければ、target"prototype" property の値が value の prototype chain に存在するかどうかを判定する。 It performs the following steps when called:

  1. target が Object でなければ、TypeError 例外を送出する。
  2. instOfHandler を ? GetMethod(target, %Symbol.hasInstance%) とする。
  3. instOfHandlerundefined でなければ、
    1. ToBoolean(? Call(instOfHandler, target, « value »)) を返す。
  4. IsCallable(target) が false なら、TypeError 例外を送出する。
  5. OrdinaryHasInstance(target, value) を返す。
Note

steps 4 および 5 は、instanceof 演算子の意味論を定義するのに %Symbol.hasInstance% method を使用していなかっ た以前の ECMAScript 版との互換性を提供する。object が %Symbol.hasInstance% を定義も継承もしていない 場合、それは default の instanceof 意味論を用い る。

13.11 Equality Operator

Note

equality operator の評価結果は常に Boolean 型であり、その operator によって名前付けされた関係が 2 つの operand の間に成り立つかどうかを反映する。

構文

EqualityExpression[In, Yield, Await] : RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] == RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] != RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] === RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] !== RelationalExpression[?In, ?Yield, ?Await]

13.11.1 Runtime Semantics: Evaluation

EqualityExpression : EqualityExpression == RelationalExpression
  1. lRef を ? Evaluation of EqualityExpression とする。
  2. lVal を ? GetValue(lRef) とする。
  3. rRef を ? Evaluation of RelationalExpression とする。
  4. rVal を ? GetValue(rRef) とする。
  5. IsLooselyEqual(rVal, lVal) を返す。
EqualityExpression : EqualityExpression != RelationalExpression
  1. lRef を ? Evaluation of EqualityExpression とする。
  2. lVal を ? GetValue(lRef) とする。
  3. rRef を ? Evaluation of RelationalExpression とする。
  4. rVal を ? GetValue(rRef) とする。
  5. r を ? IsLooselyEqual(rVal, lVal) とする。
  6. rtrue なら、false を返す。
  7. true を返す。
EqualityExpression : EqualityExpression === RelationalExpression
  1. lRef を ? Evaluation of EqualityExpression とする。
  2. lVal を ? GetValue(lRef) とする。
  3. rRef を ? Evaluation of RelationalExpression とする。
  4. rVal を ? GetValue(rRef) とする。
  5. IsStrictlyEqual(rVal, lVal) を返す。
EqualityExpression : EqualityExpression !== RelationalExpression
  1. lRef を ? Evaluation of EqualityExpression とする。
  2. lVal を ? GetValue(lRef) とする。
  3. rRef を ? Evaluation of RelationalExpression とする。
  4. rVal を ? GetValue(rRef) とする。
  5. rIsStrictlyEqual(rVal, lVal) と する。
  6. rtrue なら、false を返す。
  7. true を返す。
Note 1

equality operator は次の不変条件を維持す る:

  • A != B!(A == B) と等価である。
  • A == B は、AB の評価順序を除け ば、B == A と等価である。
Note 2

equality operator は常に推移的であるわけ ではない。たとえば、同じ String 値を表す 2 つの異な る String object があり得る; それぞれの String object は == 演算子によりその String 値と等しい と見なされるが、2 つの String object 同士は互いに 等しくはない。たとえば:

  • new String("a") == "a" および "a" == new String("a") はどちらも true である。
  • new String("a") == new String("a")false である。
Note 3

String の比較は、code unit 値列に対する単純 な等値判定を用いる。Unicode 仕様で定義される、より複 雑で意味論指向の文字または文字列の等値性および照合順序の 定義を使用しようとはしない。したがって、Unicode Standard によれば正準同値である String 値が、不 等であると判定され得る。実質的に、この algorithm は 両方の String がすでに正規化済みであると仮定してい る。

13.12 Binary Bitwise Operator

構文

BitwiseANDExpression[In, Yield, Await] : EqualityExpression[?In, ?Yield, ?Await] BitwiseANDExpression[?In, ?Yield, ?Await] & EqualityExpression[?In, ?Yield, ?Await] BitwiseXORExpression[In, Yield, Await] : BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseXORExpression[?In, ?Yield, ?Await] ^ BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseORExpression[In, Yield, Await] : BitwiseXORExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] | BitwiseXORExpression[?In, ?Yield, ?Await]

13.12.1 Runtime Semantics: Evaluation

BitwiseANDExpression : BitwiseANDExpression & EqualityExpression
  1. EvaluateStringOrNumericBinaryExpression( BitwiseANDExpression, &, EqualityExpression) を返す。
BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression
  1. EvaluateStringOrNumericBinaryExpression( BitwiseXORExpression, ^, BitwiseANDExpression) を返す。
BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression
  1. EvaluateStringOrNumericBinaryExpression( BitwiseORExpression, |, BitwiseXORExpression) を返す。

13.13 Binary Logical Operator

構文

LogicalANDExpression[In, Yield, Await] : BitwiseORExpression[?In, ?Yield, ?Await] LogicalANDExpression[?In, ?Yield, ?Await] && BitwiseORExpression[?In, ?Yield, ?Await] LogicalORExpression[In, Yield, Await] : LogicalANDExpression[?In, ?Yield, ?Await] LogicalORExpression[?In, ?Yield, ?Await] || LogicalANDExpression[?In, ?Yield, ?Await] CoalesceExpression[In, Yield, Await] : CoalesceExpressionHead[?In, ?Yield, ?Await] ?? BitwiseORExpression[?In, ?Yield, ?Await] CoalesceExpressionHead[In, Yield, Await] : CoalesceExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] ShortCircuitExpression[In, Yield, Await] : LogicalORExpression[?In, ?Yield, ?Await] CoalesceExpression[?In, ?Yield, ?Await] Note

&& または || 演算子が生成する値は、 必ずしも Boolean 型ではない。生成される値は常に、2 つの operand 式のうちどちらか一方の値である。

13.13.1 Runtime Semantics: Evaluation

LogicalANDExpression : LogicalANDExpression && BitwiseORExpression
  1. lRef を ? Evaluation of LogicalANDExpression とする。
  2. lVal を ? GetValue(lRef) とする。
  3. ToBoolean(lVal) が false なら、 lVal を返す。
  4. rRef を ? Evaluation of BitwiseORExpression とする。
  5. GetValue(rRef) を返す。
LogicalORExpression : LogicalORExpression || LogicalANDExpression
  1. lRef を ? Evaluation of LogicalORExpression とする。
  2. lVal を ? GetValue(lRef) とする。
  3. ToBoolean(lVal) が true なら、 lVal を返す。
  4. rRef を ? Evaluation of LogicalANDExpression とする。
  5. GetValue(rRef) を返す。
CoalesceExpression : CoalesceExpressionHead ?? BitwiseORExpression
  1. lRef を ? Evaluation of CoalesceExpressionHead とする。
  2. lVal を ? GetValue(lRef) とする。
  3. lValundefined でも null でも ないなら、lVal を返す。
  4. rRef を ? Evaluation of BitwiseORExpression とする。
  5. GetValue(rRef) を返す。

13.14 Conditional Operator ( ? : )

構文

ConditionalExpression[In, Yield, Await] : ShortCircuitExpression[?In, ?Yield, ?Await] ShortCircuitExpression[?In, ?Yield, ?Await] ? AssignmentExpression[+In, ?Yield, ?Await] : AssignmentExpression[?In, ?Yield, ?Await] Note

ECMAScript における ConditionalExpression の 文法は、C や Java におけるそれとわずかに異なる。C や Java は 2 番目の部分式として Expression を許可す る一方、3 番目の式を ConditionalExpression に制 限している。ECMAScript におけるこの差異の動機は、代 入式が条件のどちらの枝にも支配され得るようにすること、お よび中央の式として comma expression を使うという混乱 を招きやすく、かつほとんど有用でない場合を排除することで ある。

13.14.1 Runtime Semantics: Evaluation

ConditionalExpression : ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
  1. lRef を ? Evaluation of ShortCircuitExpression とする。
  2. lValToBoolean(? GetValue(lRef)) とする。
  3. lValtrue なら、
    1. trueRef を、最初の AssignmentExpressionEvaluation の ? とする。
    2. GetValue(trueRef) を返す。
  4. falseRef を、2 番目の AssignmentExpressionEvaluation の ? とする。
  5. GetValue(falseRef) を返す。

13.15 Assignment Operator

構文

AssignmentExpression[In, Yield, Await] : ConditionalExpression[?In, ?Yield, ?Await] [+Yield] YieldExpression[?In, ?Await] ArrowFunction[?In, ?Yield, ?Await] AsyncArrowFunction[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] AssignmentOperator AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] &&= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ||= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ??= AssignmentExpression[?In, ?Yield, ?Await] AssignmentOperator : one of *= /= %= += -= <<= >>= >>>= &= ^= |= **=

13.15.1 Static Semantics: Early Errors

AssignmentExpression : LeftHandSideExpression = AssignmentExpression AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression LeftHandSideExpression ||= AssignmentExpression LeftHandSideExpression ??= AssignmentExpression

13.15.2 Runtime Semantics: Evaluation

AssignmentExpression : LeftHandSideExpression = AssignmentExpression
  1. LeftHandSideExpressionObjectLiteral でも ArrayLiteral でも ないなら、
    1. lRef を ? Evaluation of LeftHandSideExpression とする。
    2. LeftHandSideExpressionAssignmentTargetTypeweb-compat なら、ReferenceError 例外を送出す る。
    3. IsAnonymousFunctionDefinition( AssignmentExpression) が true であ り、かつ IsIdentifierRef of LeftHandSideExpressiontrue なら、
      1. lhsLeftHandSideExpressionStringValue とする。
      2. rVal を、lhs を引数とする AssignmentExpressionNamedEvaluation の ? とする。
    4. Else,
      1. rRef を ? Evaluation of AssignmentExpression とする。
      2. rVal を ? GetValue(rRef) とす る。
    5. PutValue(lRef, rVal) を実行する。
    6. rVal を返す。
  2. assignmentPattern を、 LeftHandSideExpression によって cover される AssignmentPattern とする。
  3. rRef を ? Evaluation of AssignmentExpression とする。
  4. rVal を ? GetValue(rRef) とする。
  5. rVal を引数として assignmentPatternDestructuringAssignmentEvaluation を ? 実行する。
  6. rVal を返す。
AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression
  1. lRef を ? Evaluation of LeftHandSideExpression とする。
  2. LeftHandSideExpressionAssignmentTargetTypeweb-compat なら、ReferenceError 例外を送出する。
  3. lVal を ? GetValue(lRef) とする。
  4. rRef を ? Evaluation of AssignmentExpression とする。
  5. rVal を ? GetValue(rRef) とする。
  6. assignmentOpTextAssignmentOperator に一致した source text とする。
  7. opText を、以下の表において assignmentOpText に対応付けられる Unicode code point 列とする:
    assignmentOpText opText
    **= **
    *= *
    /= /
    %= %
    += +
    -= -
    <<= <<
    >>= >>
    >>>= >>>
    &= &
    ^= ^
    |= |
  8. r を ? ApplyStringOrNumericBinaryOperator(lVal, opText, rVal) とする。
  9. PutValue(lRef, r) を実行す る。
  10. r を返す。
AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression
  1. lRef を ? Evaluation of LeftHandSideExpression とする。
  2. lVal を ? GetValue(lRef) と する。
  3. ToBoolean(lVal) が false なら、 lVal を返す。
  4. IsAnonymousFunctionDefinition( AssignmentExpression) が true であり、 かつ IsIdentifierRef of LeftHandSideExpressiontrue なら、
    1. lhsLeftHandSideExpressionStringValue とする。
    2. rVal を、lhs を引数とする AssignmentExpressionNamedEvaluation の ? とする。
  5. Else,
    1. rRef を ? Evaluation of AssignmentExpression とする。
    2. rVal を ? GetValue(rRef) とする。
  6. PutValue(lRef, rVal) を実 行する。
  7. rVal を返す。
AssignmentExpression : LeftHandSideExpression ||= AssignmentExpression
  1. lRef を ? Evaluation of LeftHandSideExpression とする。
  2. lVal を ? GetValue(lRef) とす る。
  3. ToBoolean(lVal) が true なら、 lVal を返す。
  4. IsAnonymousFunctionDefinition( AssignmentExpression) が true であり、 かつ IsIdentifierRef of LeftHandSideExpressiontrue なら、
    1. lhsLeftHandSideExpressionStringValue とする。
    2. rVal を、lhs を引数とする AssignmentExpressionNamedEvaluation の ? とする。
  5. Else,
    1. rRef を ? Evaluation of AssignmentExpression とする。
    2. rVal を ? GetValue(rRef) とする。
  6. PutValue(lRef, rVal) を実行 する。
  7. rVal を返す。
AssignmentExpression : LeftHandSideExpression ??= AssignmentExpression
  1. lRef を ? Evaluation of LeftHandSideExpression とする。
  2. lVal を ? GetValue(lRef) とする。
  3. lValundefined でも null でも ないなら、lVal を返す。
  4. IsAnonymousFunctionDefinition( AssignmentExpression) が true であり、 かつ IsIdentifierRef of LeftHandSideExpressiontrue なら、
    1. lhsLeftHandSideExpressionStringValue とする。
    2. rVal を、lhs を引数とする AssignmentExpressionNamedEvaluation の ? とする。
  5. Else,
    1. rRef を ? Evaluation of AssignmentExpression とする。
    2. rVal を ? GetValue(rRef) とする。
  6. PutValue(lRef, rVal) を 実行する。
  7. rVal を返す。
Note

この式が strict mode code の内部に現れると き、step 1.e3222 における lRef が unresolvable reference である 場合、それは runtime error である。その場合、 ReferenceError 例外が送出される。さらに、step 9666 における lRef が、 { [[Writable]]: false } という属性値を持つ data property への reference、{ [[Set]]: undefined } という属性値を持つ accessor property への reference、または IsExtensible predicate が false を返す object の存在しない property への reference である場合も runtime error である。これらの場合 には TypeError 例外が送出される。

13.15.3 ApplyStringOrNumericBinaryOperator ( lVal, opText, rVal )

The abstract operation ApplyStringOrNumericBinaryOperator takes arguments lVal (an ECMAScript language value), opText (**, *, /, %, +, -, <<, >>, >>>, &, ^, or |), and rVal (an ECMAScript language value) and returns either a normal completion containing either a String, a BigInt, or a Number, or a throw completion. It performs the following steps when called:

  1. opText+ なら、
    1. lPrim を ? ToPrimitive(lVal) とする。
    2. rPrim を ? ToPrimitive(rVal) とする。
    3. lPrim が String または rPrim が String な ら、
      1. lStr を ? ToString(lPrim) とす る。
      2. rStr を ? ToString(rPrim) とす る。
      3. lStrrStrstring-concatenation を返す。
    4. lVallPrim に設定する。
    5. rValrPrim に設定する。
  2. NOTE: この時点で、それは数値演算でなければなら ない。
  3. lNum を ? ToNumeric(lVal) とする。
  4. rNum を ? ToNumeric(rVal) とする。
  5. SameType(lNum, rNum) が false な ら、TypeError 例外を送出する。
  6. lNum が BigInt なら、
    1. opText** なら、 ? BigInt::exponentiate(lNum, rNum) を返す。
    2. opText/ なら、 ? BigInt::divide(lNum, rNum) を返 す。
    3. opText% なら、 ? BigInt::remainder(lNum, rNum) を返す。
    4. opText>>> なら、 ? BigInt::unsignedRightShift(lNum, rNum) を返す。
    5. operation を、以下の表において opText に対応付けられる abstract operation とする:
      opText operation
      * BigInt::multiply
      + BigInt::add
      - BigInt::subtract
      << BigInt::leftShift
      >> BigInt::signedRightShift
      & BigInt::bitwiseAND
      ^ BigInt::bitwiseXOR
      | BigInt::bitwiseOR
  7. Else,
    1. Assert: lNum は Number である。
    2. operation を、以下の表において opText に対応付けられる abstract operation とする:
      opText operation
      ** Number::exponentiate
      * Number::multiply
      / Number::divide
      % Number::remainder
      + Number::add
      - Number::subtract
      << Number::leftShift
      >> Number::signedRightShift
      >>> Number::unsignedRightShift
      & Number::bitwiseAND
      ^ Number::bitwiseXOR
      | Number::bitwiseOR
  8. operation(lNum, rNum) を返す。
Note 1

steps 1.a および 1.b における ToPrimitive の呼出しには hint は与えられ ない。Date を除くすべての標準 object は、hint が ない場合を number が与えられた場合と同様に扱う; Date は、hint がない場合を string が与えられた 場合と同様に扱う。特殊 object は、hint がない場合を 別の方法で扱ってもよい。

Note 2

step 1.c は、論理 and 演算の代わりに論理 or 演算を用いる点 で、IsLessThan algorithm の step 3 と異なる。

13.15.4 EvaluateStringOrNumericBinaryExpression ( leftOperand, opText, rightOperand )

The abstract operation EvaluateStringOrNumericBinaryExpression takes arguments leftOperand (a Parse Node), opText (**, *, /, %, +, -, <<, >>, >>>, &, ^, or |), and rightOperand (a Parse Node) and returns either a normal completion containing either a String, a BigInt, or a Number, or an abrupt completion. It performs the following steps when called:

  1. lRef を ? Evaluation of leftOperand とする。
  2. lVal を ? GetValue(lRef) とする。
  3. rRef を ? Evaluation of rightOperand とする。
  4. rVal を ? GetValue(rRef) とする。
  5. ApplyStringOrNumericBinaryOperator(lVal, opText, rVal) を返す。

13.15.5 Destructuring Assignment

補助構文

ある特定の状況において、次の production の instance を処理するとき
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression の解釈は、以下の文法を 用いて精密化される:

AssignmentPattern[Yield, Await] : ObjectAssignmentPattern[?Yield, ?Await] ArrayAssignmentPattern[?Yield, ?Await] ObjectAssignmentPattern[Yield, Await] : { } { AssignmentRestProperty[?Yield, ?Await] } { AssignmentPropertyList[?Yield, ?Await] } { AssignmentPropertyList[?Yield, ?Await] , AssignmentRestProperty[?Yield, ?Await]opt } ArrayAssignmentPattern[Yield, Await] : [ Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] [ AssignmentElementList[?Yield, ?Await] ] [ AssignmentElementList[?Yield, ?Await] , Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] AssignmentRestProperty[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] AssignmentPropertyList[Yield, Await] : AssignmentProperty[?Yield, ?Await] AssignmentPropertyList[?Yield, ?Await] , AssignmentProperty[?Yield, ?Await] AssignmentElementList[Yield, Await] : AssignmentElisionElement[?Yield, ?Await] AssignmentElementList[?Yield, ?Await] , AssignmentElisionElement[?Yield, ?Await] AssignmentElisionElement[Yield, Await] : Elisionopt AssignmentElement[?Yield, ?Await] AssignmentProperty[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt PropertyName[?Yield, ?Await] : AssignmentElement[?Yield, ?Await] AssignmentElement[Yield, Await] : DestructuringAssignmentTarget[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt AssignmentRestElement[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] DestructuringAssignmentTarget[Yield, Await] : LeftHandSideExpression[?Yield, ?Await]

13.15.5.1 Static Semantics: Early Errors

AssignmentProperty : IdentifierReference Initializeropt AssignmentRestProperty : ... DestructuringAssignmentTarget DestructuringAssignmentTarget : LeftHandSideExpression

13.15.5.2 Runtime Semantics: DestructuringAssignmentEvaluation

The syntax-directed operation DestructuringAssignmentEvaluation takes argument value (an ECMAScript language value) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:

ObjectAssignmentPattern : { }
  1. RequireObjectCoercible(value) を実行す る。
  2. unused を返す。
ObjectAssignmentPattern : { AssignmentPropertyList } { AssignmentPropertyList , }
  1. RequireObjectCoercible(value) を実行す る。
  2. value を引数として AssignmentPropertyListPropertyDestructuringAssignmentEvaluation を ? 実行する。
  3. unused を返す。
ObjectAssignmentPattern : { AssignmentRestProperty }
  1. RequireObjectCoercible(value) を実行す る。
  2. excludedNames を新しい空の List とす る。
  3. value および excludedNames を引数とす る AssignmentRestPropertyRestDestructuringAssignmentEvaluation を ? 返す。
ObjectAssignmentPattern : { AssignmentPropertyList , AssignmentRestProperty }
  1. RequireObjectCoercible(value) を実行す る。
  2. excludedNames を、value を引数とする AssignmentPropertyListPropertyDestructuringAssignmentEvaluation の ? とする。
  3. value および excludedNames を引数とす る AssignmentRestPropertyRestDestructuringAssignmentEvaluation を ? 返す。
ArrayAssignmentPattern : [ ]
  1. iteratorRecord を ? GetIterator(value, sync) とする。
  2. IteratorClose(iteratorRecord, NormalCompletion(unused)) を返す。
ArrayAssignmentPattern : [ Elision ]
  1. iteratorRecord を ? GetIterator(value, sync) とする。
  2. result を、 iteratorRecord を引数とする ElisionIteratorDestructuringAssignmentEvaluationCompletion とする。
  3. iteratorRecord.[[Done]]false なら、? IteratorClose(iteratorRecord, result) を返す。
  4. result を返す。
ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ]
  1. iteratorRecord を ? GetIterator(value, sync) とする。
  2. Elision が存在するなら、
    1. status を、iteratorRecord を引数 とする ElisionIteratorDestructuringAssignmentEvaluationCompletion とする。
    2. statusabrupt completion なら、
      1. Assert: iteratorRecord.[[Done]] is true.
      2. status を返す。
  3. result を、iteratorRecord を引数と する AssignmentRestElementIteratorDestructuringAssignmentEvaluationCompletion とする。
  4. iteratorRecord.[[Done]]false なら、? IteratorClose(iteratorRecord, result) を返す。
  5. result を返す。
ArrayAssignmentPattern : [ AssignmentElementList ]
  1. iteratorRecord を ? GetIterator(value, sync) とする。
  2. result を、iteratorRecord を引数と する AssignmentElementListIteratorDestructuringAssignmentEvaluationCompletion とする。
  3. iteratorRecord.[[Done]]false なら、? IteratorClose(iteratorRecord, result) を返す。
  4. result を返す。
ArrayAssignmentPattern : [ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
  1. iteratorRecord を ? GetIterator(value, sync) とする。
  2. status を、iteratorRecord を引数と する AssignmentElementListIteratorDestructuringAssignmentEvaluationCompletion とする。
  3. statusabrupt completion なら、
    1. iteratorRecord.[[Done]]false なら、? IteratorClose(iteratorRecord, status) を返す。
    2. status を返す。
  4. Elision が存在するなら、
    1. status を、iteratorRecord を引数 とする ElisionIteratorDestructuringAssignmentEvaluationCompletion に設定する。
    2. statusabrupt completion なら、
      1. Assert: iteratorRecord.[[Done]] is true.
      2. status を返す。
  5. AssignmentRestElement が存在するなら、
    1. status を、iteratorRecord を引数 とする AssignmentRestElementIteratorDestructuringAssignmentEvaluationCompletion に設定する。
  6. iteratorRecord.[[Done]]false なら、? IteratorClose(iteratorRecord, status) を返す。
  7. status を返す。

13.15.5.3 Runtime Semantics: PropertyDestructuringAssignmentEvaluation

The syntax-directed operation PropertyDestructuringAssignmentEvaluation takes argument value (an ECMAScript language value) and returns either a normal completion containing a List of property keys or an abrupt completion. これは、destructure されたすべての property key の list を収集する。 It is defined piecewise over the following productions:

AssignmentPropertyList : AssignmentPropertyList , AssignmentProperty
  1. propertyNames を、value を引数とす る AssignmentPropertyListPropertyDestructuringAssignmentEvaluation の ? とする。
  2. nextNames を、value を引数とする AssignmentPropertyPropertyDestructuringAssignmentEvaluation の ? とする。
  3. propertyNamesnextNameslist-concatenation を返す。
AssignmentProperty : IdentifierReference Initializeropt
  1. propertyNameIdentifierReferenceStringValue とする。
  2. lRef を ? ResolveBinding(propertyName) とする。
  3. v を ? GetV(value, propertyName) とする。
  4. Initializer が存在し、かつ vundefined なら、
    1. IsAnonymousFunctionDefinition( Initializer) が true なら、
      1. v を、propertyName を引数とする InitializerNamedEvaluation の ? に設定する。
    2. Else,
      1. defaultValue を ? Evaluation of Initializer とする。
      2. v を ? GetValue(defaultValue) に設定する。
  5. PutValue(lRef, v) を実行する。
  6. « propertyName » を返す。
AssignmentProperty : PropertyName : AssignmentElement
  1. name を ? Evaluation of PropertyName とする。
  2. value および name を引数として AssignmentElementKeyedDestructuringAssignmentEvaluation を ? 実行する。
  3. « name » を返す。

13.15.5.4 Runtime Semantics: RestDestructuringAssignmentEvaluation

The syntax-directed operation RestDestructuringAssignmentEvaluation takes arguments value (an ECMAScript language value) and excludedNames (a List of property keys) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:

AssignmentRestProperty : ... DestructuringAssignmentTarget
  1. lRef を ? Evaluation of DestructuringAssignmentTarget とする。
  2. restObjOrdinaryObjectCreate(%Object.prototype%) とする。
  3. CopyDataProperties(restObj, value, excludedNames) を実行する。
  4. PutValue(lRef, restObj) を返す。

13.15.5.5 Runtime Semantics: IteratorDestructuringAssignmentEvaluation

The syntax-directed operation IteratorDestructuringAssignmentEvaluation takes argument iteratorRecord (an Iterator Record) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:

AssignmentElementList : AssignmentElisionElement
  1. iteratorRecord を引数とする AssignmentElisionElementIteratorDestructuringAssignmentEvaluation を ? 返す。
AssignmentElementList : AssignmentElementList , AssignmentElisionElement
  1. iteratorRecord を引数とする AssignmentElementListIteratorDestructuringAssignmentEvaluation を ? 実行する。
  2. iteratorRecord を引数とする AssignmentElisionElementIteratorDestructuringAssignmentEvaluation を ? 返す。
AssignmentElisionElement : AssignmentElement
  1. iteratorRecord を引数とする AssignmentElementIteratorDestructuringAssignmentEvaluation を ? 返す。
AssignmentElisionElement : Elision AssignmentElement
  1. iteratorRecord を引数とする ElisionIteratorDestructuringAssignmentEvaluation を ? 実行する。
  2. iteratorRecord を引数とする AssignmentElementIteratorDestructuringAssignmentEvaluation を ? 返す。
Elision : ,
  1. iteratorRecord.[[Done]]false な ら、
    1. IteratorStep(iteratorRecord) を実 行する。
  2. unused を返す。
Elision : Elision ,
  1. iteratorRecord を引数とする ElisionIteratorDestructuringAssignmentEvaluation を ? 実行する。
  2. iteratorRecord.[[Done]]false な ら、
    1. IteratorStep(iteratorRecord) を実 行する。
  3. unused を返す。
AssignmentElement : DestructuringAssignmentTarget Initializeropt
  1. DestructuringAssignmentTargetObjectLiteral でも ArrayLiteral でもないなら、
    1. lRef を ? Evaluation of DestructuringAssignmentTarget とす る。
  2. valueundefined とする。
  3. iteratorRecord.[[Done]]false な ら、
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone でないなら、
      1. valuenext に設定する。
  4. Initializer が存在し、かつ valueundefined なら、
    1. IsAnonymousFunctionDefinition( Initializer) が true であり、か つ IsIdentifierRef of DestructuringAssignmentTargettrue なら、
      1. targetDestructuringAssignmentTargetStringValue とする。
      2. v を、target を引数とする InitializerNamedEvaluation の ? とする。
    2. Else,
      1. defaultValue を ? Evaluation of Initializer とする。
      2. v を ? GetValue(defaultValue) とする。
  5. Else,
    1. vvalue とする。
  6. DestructuringAssignmentTargetObjectLiteral または ArrayLiteral のいずれかなら、
    1. nestedAssignmentPattern を、 DestructuringAssignmentTarget によ って cover される AssignmentPattern とする。
    2. v を引数とする nestedAssignmentPatternDestructuringAssignmentEvaluation を ? 返す。
  7. PutValue(lRef, v) を返す。
Note

destructuring pattern ではない DestructuringAssignmentTargetiterator へ のアクセスまたは Initializer の評価より前に評価す ることにより、左から右への評価順序が維持される。

AssignmentRestElement : ... DestructuringAssignmentTarget
  1. DestructuringAssignmentTargetObjectLiteral でも ArrayLiteral でもないなら、
    1. lRef を ? Evaluation of DestructuringAssignmentTarget とす る。
  2. array を ! ArrayCreate(0) とする。
  3. n を 0 とする。
  4. iteratorRecord.[[Done]]false の間、繰り返す
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone でないなら、
      1. CreateDataPropertyOrThrow(array, ! ToString(𝔽(n)), next) を実行 する。
      2. nn + 1 に設定する。
  5. DestructuringAssignmentTargetObjectLiteral でも ArrayLiteral でもないなら、
    1. PutValue(lRef, array) を返す。
  6. nestedAssignmentPattern を、 DestructuringAssignmentTarget によっ て cover される AssignmentPattern と する。
  7. array を引数とする nestedAssignmentPatternDestructuringAssignmentEvaluation を ? 返す。

13.15.5.6 Runtime Semantics: KeyedDestructuringAssignmentEvaluation

The syntax-directed operation KeyedDestructuringAssignmentEvaluation takes arguments value (an ECMAScript language value) and propertyName (a property key) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:

AssignmentElement : DestructuringAssignmentTarget Initializeropt
  1. DestructuringAssignmentTargetObjectLiteral でも ArrayLiteral でもないなら、
    1. lRef を ? Evaluation of DestructuringAssignmentTarget とす る。
  2. v を ? GetV(value, propertyName) とする。
  3. Initializer が存在し、かつ vundefined なら、
    1. IsAnonymousFunctionDefinition( Initializer) が true であり、か つ IsIdentifierRef of DestructuringAssignmentTargettrue なら、
      1. targetDestructuringAssignmentTargetStringValue とする。
      2. rhsValue を、target を引数とす る InitializerNamedEvaluation の ? とする。
    2. Else,
      1. defaultValue を ? Evaluation of Initializer とする。
      2. rhsValue を ? GetValue(defaultValue) とする。
  4. Else,
    1. rhsValuev とする。
  5. DestructuringAssignmentTargetObjectLiteral または ArrayLiteral のいずれかなら、
    1. assignmentPattern を、 DestructuringAssignmentTarget によ って cover される AssignmentPattern とする。
    2. rhsValue を引数とする assignmentPatternDestructuringAssignmentEvaluation を ? 返す。
  6. PutValue(lRef, rhsValue) を返す。

13.16 Comma Operator ( , )

構文

Expression[In, Yield, Await] : AssignmentExpression[?In, ?Yield, ?Await] Expression[?In, ?Yield, ?Await] , AssignmentExpression[?In, ?Yield, ?Await]

13.16.1 Runtime Semantics: Evaluation

Expression : Expression , AssignmentExpression
  1. lRef を ? Evaluation of Expression とする。
  2. GetValue(lRef) を実行する。
  3. rRef を ? Evaluation of AssignmentExpression とする。
  4. GetValue(rRef) を返す。
Note

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
  1. empty を返す。
HoistableDeclaration : FunctionDeclaration
  1. Evaluation of FunctionDeclaration を返す。
BreakableStatement : IterationStatement SwitchStatement
  1. newLabelSet を新しい空の List とする。
  2. newLabelSet を引数として this BreakableStatementLabelledEvaluation を ? 返す。

14.2 Block

構文

BlockStatement[Yield, Await, Return] : Block[?Yield, ?Await, ?Return] Block[Yield, Await, Return] : { StatementList[?Yield, ?Await, ?Return]opt } StatementList[Yield, Await, Return] : StatementListItem[?Yield, ?Await, ?Return] StatementList[?Yield, ?Await, ?Return] StatementListItem[?Yield, ?Await, ?Return] StatementListItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] Declaration[?Yield, ?Await]

14.2.1 Static Semantics: Early Errors

Block : { StatementList }

14.2.2 Runtime Semantics: Evaluation

Block : { }
  1. empty を返す。
Block : { StatementList }
  1. oldEnv を、running execution context の LexicalEnvironment とする。
  2. blockEnvNewDeclarativeEnvironment(oldEnv) とす る。
  3. BlockDeclarationInstantiation( StatementList, blockEnv) を実行する。
  4. running execution context の LexicalEnvironment を blockEnv に設定す る。
  5. blockValueCompletion(Evaluation of StatementList) とする。
  6. running execution context の LexicalEnvironment を oldEnv に設定す る。
  7. blockValue を返す。
Note 1

どのように control が Block を離れても、 LexicalEnvironment は常に以前の状態に復元される。

StatementList : StatementList StatementListItem
  1. sl を ? Evaluation of StatementList とする。
  2. sCompletion(Evaluation of StatementListItem) とする。
  3. UpdateEmpty(s, sl) を返す。
Note 2

StatementList の値は、StatementList 内 の最後の値生成 item の値である。たとえば、次の eval 関数の呼出しはいずれも値 1 を返す:

eval("1;;;;;")
eval("1;{}")
eval("1;var a;")

14.2.3 BlockDeclarationInstantiation ( code, env )

The abstract operation BlockDeclarationInstantiation takes arguments code (a Parse Node) and env (a Declarative Environment Record) and returns unused. code は block の本体に対応する Parse Node である。env は束縛が作成される Environment Record である。

Note

Block または CaseBlock が評価されるとき、新 しい Declarative Environment Record が作成され、 block 内で宣言された各 block scoped variable、 constant、function、または class に対する束縛がそ の Environment Record 内に instantiate され る。

これは呼び出されると次の手順を実行する:

  1. declarationscodeLexicallyScopedDeclarations とする。
  2. privateEnv を、running execution context の PrivateEnvironment とする。
  3. declarations の各要素 decl について、 次を行う
    1. declBoundNames の各要素 dn に ついて、次を行う
      1. IsConstantDeclaration of decltrue なら、
        1. env.CreateImmutableBinding(dn, true) を実行する。
      2. Else,
        1. host が web browser であるか、または ブロックレベル Function Declaration の Web レガシー互換性意味論 をサポートするなら、
          1. env.HasBinding(dn) が false なら、
            1. env.CreateMutableBinding(dn, false) を実行する。
        2. Else,
          1. env.CreateMutableBinding(dn, false) を実行する。
    2. declFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclaration、または AsyncGeneratorDeclaration のいずれか なら、
      1. fndeclBoundNames の唯一 の要素とする。
      2. fo を、env および privateEnv を 引数とする declInstantiateFunctionObject とする。
      3. host が web browser であるか、または ブロックレベル Function Declaration の Web レガシー互換性意味論 をサポートするなら、
        1. env における fn の束縛が未初期化 の束縛なら、
          1. env.InitializeBinding(fn, fo) を実行する。
        2. Else,
          1. Assert: declFunctionDeclaration である。
          2. env.SetMutableBinding(fn, fo, false) を実行する。
      4. Else,
        1. env.InitializeBinding(fn, fo) を実行する。
  4. unused を返す。

14.3 宣言と Variable Statement

14.3.1 Let および Const 宣言

Note

let および const 宣言は、running execution context の LexicalEnvironment に scoped な variable を定義する。variable は、それ を含む Environment Record が instantiate され たときに作成されるが、その variable の LexicalBinding が評価されるまで、いかなる方法でも アクセスされてはならない。Initializer を伴う LexicalBinding によって定義される variable は、 その variable が作成されたときではなく、 LexicalBinding が評価されたときに、 InitializerAssignmentExpression の値を 代入される。let 宣言内の LexicalBindingInitializer を持たない場合、その variable は LexicalBinding が評価されたときに undefined を代入される。

構文

LexicalDeclaration[In, Yield, Await] : LetOrConst BindingList[?In, ?Yield, ?Await] ; LetOrConst : let const BindingList[In, Yield, Await] : LexicalBinding[?In, ?Yield, ?Await] BindingList[?In, ?Yield, ?Await] , LexicalBinding[?In, ?Yield, ?Await] LexicalBinding[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]

14.3.1.1 Static Semantics: Early Errors

LexicalDeclaration : LetOrConst BindingList ; LexicalBinding : BindingIdentifier Initializeropt

14.3.1.2 Runtime Semantics: Evaluation

LexicalDeclaration : LetOrConst BindingList ;
  1. Evaluation of BindingList を実行する。
  2. empty を返す。
BindingList : BindingList , LexicalBinding
  1. Evaluation of BindingList を実行する。
  2. Evaluation of LexicalBinding を返す。
LexicalBinding : BindingIdentifier
  1. lhs を ! ResolveBinding(StringValue of BindingIdentifier) とする。
  2. InitializeReferencedBinding(lhs, undefined) を実行する。
  3. empty を返す。
Note

静的意味論規則により、この形の LexicalBindingconst 宣言内には決して現れな いことが保証される。

LexicalBinding : BindingIdentifier Initializer
  1. bindingIdBindingIdentifierStringValue とする。
  2. lhs を ! ResolveBinding(bindingId) とする。
  3. IsAnonymousFunctionDefinition( Initializer) が true なら、
    1. value を、bindingId を引数とする InitializerNamedEvaluation の ? とする。
  4. Else,
    1. rhs を ? Evaluation of Initializer とする。
    2. value を ? GetValue(rhs) とする。
  5. InitializeReferencedBinding(lhs, value) を実行する。
  6. empty を返す。
LexicalBinding : BindingPattern Initializer
  1. rhs を ? Evaluation of Initializer とする。
  2. value を ? GetValue(rhs) とする。
  3. env を、running execution context の LexicalEnvironment とする。
  4. value および env を引数とする BindingPatternBindingInitialization を ? 返す。

14.3.2 Variable Statement

Note

var statement は、running execution context の VariableEnvironment に scoped な variable を宣言する。var variable は、それを含む Environment Record が instantiate されたときに 作成され、作成時に undefined に初期化される。任意 の VariableEnvironment の scope 内では、共通の BindingIdentifier が複数の VariableDeclaration に現れ得るが、それらの宣言は 集合的にただ 1 つの variable だけを定義する。 Initializer を伴う VariableDeclaration によっ て定義される variable は、その variable が作成され たときではなく、VariableDeclaration が実行された ときに、InitializerAssignmentExpression の値を代入される。

構文

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 ;
  1. Evaluation of VariableDeclarationList を実行する。
  2. empty を返す。
VariableDeclarationList : VariableDeclarationList , VariableDeclaration
  1. Evaluation of VariableDeclarationList を実行する。
  2. Evaluation of VariableDeclaration を返す。
VariableDeclaration : BindingIdentifier
  1. empty を返す。
VariableDeclaration : BindingIdentifier Initializer
  1. bindingIdBindingIdentifierStringValue とする。
  2. lhs を ? ResolveBinding(bindingId) とする。
  3. IsAnonymousFunctionDefinition(Initializer) が true なら、
    1. value を、bindingId を引数とする InitializerNamedEvaluation の ? とする。
  4. Else,
    1. rhs を ? Evaluation of Initializer とする。
    2. value を ? GetValue(rhs) とする。
  5. PutValue(lhs, value) を実行する。
  6. empty を返す。
Note

VariableDeclaration が with statement の内部に入れ子になっており、かつその VariableDeclaration 内の BindingIdentifier が with statement の Object Environment Record の binding object の property 名と同じである場合、step 5 は、Identifier の VariableEnvironment 束縛に代入する代わりに、その property に value を代入する。

VariableDeclaration : BindingPattern Initializer
  1. rhs を ? Evaluation of Initializer とする。
  2. rVal を ? GetValue(rhs) とする。
  3. rVal および undefined を引数とする BindingPatternBindingInitialization を ? 返す。

14.3.3 Destructuring Binding Pattern

構文

BindingPattern[Yield, Await] : ObjectBindingPattern[?Yield, ?Await] ArrayBindingPattern[?Yield, ?Await] ObjectBindingPattern[Yield, Await] : { } { BindingRestProperty[?Yield, ?Await] } { BindingPropertyList[?Yield, ?Await] } { BindingPropertyList[?Yield, ?Await] , BindingRestProperty[?Yield, ?Await]opt } ArrayBindingPattern[Yield, Await] : [ Elisionopt BindingRestElement[?Yield, ?Await]opt ] [ BindingElementList[?Yield, ?Await] ] [ BindingElementList[?Yield, ?Await] , Elisionopt BindingRestElement[?Yield, ?Await]opt ] BindingRestProperty[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] BindingPropertyList[Yield, Await] : BindingProperty[?Yield, ?Await] BindingPropertyList[?Yield, ?Await] , BindingProperty[?Yield, ?Await] BindingElementList[Yield, Await] : BindingElisionElement[?Yield, ?Await] BindingElementList[?Yield, ?Await] , BindingElisionElement[?Yield, ?Await] BindingElisionElement[Yield, Await] : Elisionopt BindingElement[?Yield, ?Await] BindingProperty[Yield, Await] : SingleNameBinding[?Yield, ?Await] PropertyName[?Yield, ?Await] : BindingElement[?Yield, ?Await] BindingElement[Yield, Await] : SingleNameBinding[?Yield, ?Await] BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt SingleNameBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt BindingRestElement[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] ... BindingPattern[?Yield, ?Await]

14.3.3.1 Runtime Semantics: PropertyBindingInitialization

The syntax-directed operation PropertyBindingInitialization takes arguments value (an ECMAScript language value) and environment (an Environment Record or undefined) and returns either a normal completion containing a List of property keys or an abrupt completion. これは、束縛されたすべての property 名の list を収集する。 It is defined piecewise over the following productions:

BindingPropertyList : BindingPropertyList , BindingProperty
  1. boundNames を、value および environment を引数とする BindingPropertyListPropertyBindingInitialization の ? とす る。
  2. nextNames を、value および environment を引数とする BindingPropertyPropertyBindingInitialization の ? とす る。
  3. boundNamesnextNameslist-concatenation を返す。
BindingProperty : SingleNameBinding
  1. nameSingleNameBindingBoundNames の唯一の要素とする。
  2. value, environment, および name を 引数として SingleNameBindingKeyedBindingInitialization を ? 実行す る。
  3. « name » を返す。
BindingProperty : PropertyName : BindingElement
  1. propertyKey を ? Evaluation of PropertyName とする。
  2. value, environment, および propertyKey を引数として BindingElementKeyedBindingInitialization を ? 実行す る。
  3. « propertyKey » を返す。

14.3.3.2 Runtime Semantics: RestBindingInitialization

The syntax-directed operation RestBindingInitialization takes arguments value (an ECMAScript language value), environment (an Environment Record or undefined), and excludedNames (a List of property keys) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:

BindingRestProperty : ... BindingIdentifier
  1. lhs を ? ResolveBinding(StringValue of BindingIdentifier, environment) とす る。
  2. restObjOrdinaryObjectCreate(%Object.prototype%) とする。
  3. CopyDataProperties(restObj, value, excludedNames) を実行する。
  4. environmentundefined なら、 ? PutValue(lhs, restObj) を返す。
  5. InitializeReferencedBinding(lhs, restObj) を返す。

14.3.3.3 Runtime Semantics: KeyedBindingInitialization

The syntax-directed operation KeyedBindingInitialization takes arguments value (an ECMAScript language value), environment (an Environment Record or undefined), and propertyName (a property key) and returns either a normal completion containing unused or an abrupt completion.

Note

undefinedenvironment として渡されると き、それは初期化値の代入に PutValue 操作を使用すべき ことを示す。これは non-strict function の仮引数 list の場合である。その場合、同名の複数 parameter の可能性に対処するため、仮引数束縛はあらかじめ初期化され る。

It is defined piecewise over the following productions:

BindingElement : BindingPattern Initializeropt
  1. v を ? GetV(value, propertyName) とする。
  2. Initializer が存在し、かつ vundefined なら、
    1. defaultValue を ? Evaluation of Initializer とする。
    2. v を ? GetValue(defaultValue) に設 定する。
  3. v および environment を引数とする BindingPatternBindingInitialization を ? 返す。
SingleNameBinding : BindingIdentifier Initializeropt
  1. bindingIdBindingIdentifierStringValue とする。
  2. lhs を ? ResolveBinding(bindingId, environment) とする。
  3. v を ? GetV(value, propertyName) とする。
  4. Initializer が存在し、かつ vundefined なら、
    1. IsAnonymousFunctionDefinition( Initializer) が true なら、
      1. v を、bindingId を引数とする InitializerNamedEvaluation の ? に設定する。
    2. Else,
      1. defaultValue を ? Evaluation of Initializer とする。
      2. v を ? GetValue(defaultValue) に設定する。
  5. environmentundefined なら、 ? PutValue(lhs, v) を返す。
  6. InitializeReferencedBinding(lhs, v) を返す。

14.4 Empty Statement

構文

EmptyStatement : ;

14.4.1 Runtime Semantics: Evaluation

EmptyStatement : ;
  1. empty を返す。

14.5 Expression Statement

構文

ExpressionStatement[Yield, Await] : [lookahead ∉ { {, function, async [no LineTerminator here] function, class, let [ }] Expression[+In, ?Yield, ?Await] ; Note

ExpressionStatement は U+007B (LEFT CURLY BRACKET) で始まってはならない。なぜなら、それにより Block と曖昧になる可能性があるからである。 ExpressionStatementfunction または class keyword で始まってはならない。なぜなら、 それにより FunctionDeclarationGeneratorDeclaration、または ClassDeclaration と曖昧になるからである。 ExpressionStatementasync function で始 まってはならない。なぜなら、それにより AsyncFunctionDeclaration または AsyncGeneratorDeclaration と曖昧になるからであ る。ExpressionStatement は 2 token 列 let [ で始まってはならない。なぜなら、それにより最 初の LexicalBindingArrayBindingPattern である let LexicalDeclaration と曖昧になるか らである。

14.5.1 Runtime Semantics: Evaluation

ExpressionStatement : Expression ;
  1. exprRef を ? Evaluation of Expression とする。
  2. GetValue(exprRef) を返す。

14.6 if Statement

構文

IfStatement[Yield, Await, Return] : if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] else Statement[?Yield, ?Await, ?Return] if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [lookahead ≠ else] Note
[lookahead ≠ else] という lookahead-restriction は、古典的な “dangling else” 問題を通常の方法で解決する。すなわち、関連付け られる if の選択が他の点では曖昧である場合、else は候補となる if のうち最も近い(最も内側の)ものに 関連付けられる。

14.6.1 Static Semantics: Early Errors

IfStatement : if ( Expression ) Statement else Statement IfStatement : if ( Expression ) Statement Note

この規則は、 B.3.1 で規定される拡張が実装されている場合にのみ適用する必要が ある。

14.6.2 Runtime Semantics: Evaluation

IfStatement : if ( Expression ) Statement else Statement
  1. exprRef を ? Evaluation of Expression とする。
  2. exprValueToBoolean(? GetValue(exprRef)) とする。
  3. exprValuetrue なら、
    1. stmtCompletion を、最初の StatementEvaluationCompletion とする。
  4. Else,
    1. stmtCompletion を、2 番目の StatementEvaluationCompletion とする。
  5. UpdateEmpty(stmtCompletion, undefined) を返す。
IfStatement : if ( Expression ) Statement
  1. exprRef を ? Evaluation of Expression とする。
  2. exprValueToBoolean(? GetValue(exprRef)) とする。
  3. exprValuefalse なら、 undefined を返す。
  4. stmtCompletion を、StatementEvaluationCompletion とする。
  5. UpdateEmpty(stmtCompletion, undefined) を返す。

14.7 Iteration Statement

構文

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 )

The abstract operation LoopContinues takes arguments completion (a Completion Record) and labelSet (a List of Strings) and returns a Boolean. It performs the following steps when called:

  1. completionnormal completion なら、 true を返す。
  2. completioncontinue completion でなければ、false を返す。
  3. completion.[[Target]]empty な ら、true を返す。
  4. labelSetcompletion.[[Target]] を含むなら、true を返す。
  5. false を返す。
Note

IterationStatementStatement 部分の 内部では、新しい iteration を開始するために ContinueStatement を使用してよい。

14.7.1.2 Runtime Semantics: LoopEvaluation

The syntax-directed operation LoopEvaluation takes argument labelSet (a List of Strings) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It is defined piecewise over the following productions:

IterationStatement : DoWhileStatement
  1. labelSet を引数とする DoWhileStatementDoWhileLoopEvaluation を ? 返す。
IterationStatement : WhileStatement
  1. labelSet を引数とする WhileStatementWhileLoopEvaluation を ? 返す。
IterationStatement : ForStatement
  1. labelSet を引数とする ForStatementForLoopEvaluation を ? 返す。
IterationStatement : ForInOfStatement
  1. labelSet を引数とする ForInOfStatementForInOfLoopEvaluation を ? 返す。

14.7.2 do-while Statement

構文

DoWhileStatement[Yield, Await, Return] : do Statement[?Yield, ?Await, ?Return] while ( Expression[+In, ?Yield, ?Await] ) ;

14.7.2.1 Static Semantics: Early Errors

DoWhileStatement : do Statement while ( Expression ) ; Note

この規則は、 B.3.1 で規定される拡張が実装されている場合にのみ適用する必要が ある。

14.7.2.2 Runtime Semantics: DoWhileLoopEvaluation

The syntax-directed operation DoWhileLoopEvaluation takes argument labelSet (a List of Strings) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It is defined piecewise over the following productions:

DoWhileStatement : do Statement while ( Expression ) ;
  1. iterationResultundefined とす る。
  2. 繰り返す
    1. stmtResultCompletion(Evaluation of Statement) とする。
    2. LoopContinues(stmtResult, labelSet) が false なら、 ? UpdateEmpty(stmtResult, iterationResult) を返す。
    3. stmtResult.[[Value]]empty で ないなら、iterationResultstmtResult.[[Value]] に設定する。
    4. exprRef を ? Evaluation of Expression とする。
    5. exprValue を ? GetValue(exprRef) とする。
    6. ToBoolean(exprValue) が false なら、iterationResult を返す。

14.7.3 while Statement

構文

WhileStatement[Yield, Await, Return] : while ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return]

14.7.3.1 Static Semantics: Early Errors

WhileStatement : while ( Expression ) Statement Note

この規則は、 B.3.1 で規定される拡張が実装されている場合にのみ適用する必要が ある。

14.7.3.2 Runtime Semantics: WhileLoopEvaluation

The syntax-directed operation WhileLoopEvaluation takes argument labelSet (a List of Strings) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It is defined piecewise over the following productions:

WhileStatement : while ( Expression ) Statement
  1. iterationResultundefined とす る。
  2. 繰り返す
    1. exprRef を ? Evaluation of Expression とする。
    2. exprValue を ? GetValue(exprRef) とする。
    3. ToBoolean(exprValue) が false なら、iterationResult を返す。
    4. stmtResultCompletion(Evaluation of Statement) とする。
    5. LoopContinues(stmtResult, labelSet) が false なら、 ? UpdateEmpty(stmtResult, iterationResult) を返す。
    6. stmtResult.[[Value]]empty で ないなら、iterationResultstmtResult.[[Value]] に設定する。

14.7.4 for Statement

構文

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: Early Errors

ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement Note

この規則は、 B.3.1 で規定される拡張が実装されている場合にのみ適用する必要が ある。

ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement

14.7.4.2 Runtime Semantics: ForLoopEvaluation

The syntax-directed operation ForLoopEvaluation takes argument labelSet (a List of Strings) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It is defined piecewise over the following productions:

ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
  1. 最初の Expression が存在するなら、
    1. exprRef を、最初の ExpressionEvaluation の ? とする。
    2. GetValue(exprRef) を実行する。
  2. 2 番目の Expression が存在するなら、 test を 2 番目の Expression とする; そうでなければ testempty とす る。
  3. 3 番目の Expression が存在するなら、 increment を 3 番目の Expression と する; そうでなければ incrementempty とする。
  4. test, increment, Statement, « », および labelSet を引数とする ForBodyEvaluation を ? 返す。
ForStatement : for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
  1. Evaluation of VariableDeclarationList を 実行する。
  2. 最初の Expression が存在するなら、 test を最初の Expression とする; そ うでなければ testempty とす る。
  3. 2 番目の Expression が存在するなら、 increment を 2 番目の Expression と する; そうでなければ incrementempty とする。
  4. test, increment, Statement, « », および labelSet を引数とする ForBodyEvaluation を ? 返す。
ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. oldEnv を、running execution context の LexicalEnvironment とす る。
  2. loopEnvNewDeclarativeEnvironment(oldEnv) と する。
  3. isConstLexicalDeclarationIsConstantDeclaration とする。
  4. boundNamesLexicalDeclarationBoundNames とする。
  5. boundNames の各要素 dn について、 次を行う
    1. isConsttrue なら、
      1. loopEnv.CreateImmutableBinding( dn, true) を実行する。
    2. Else,
      1. loopEnv.CreateMutableBinding(dn, false) を実行する。
  6. running execution context の LexicalEnvironment を loopEnv に設定 する。
  7. forDclCompletion(Evaluation of LexicalDeclaration) とする。
  8. forDclabrupt completion な ら、
    1. running execution context の LexicalEnvironment を oldEnv に設 定する。
    2. forDcl を返す。
  9. isConstfalse なら、 perIterationLetsboundNames と する; そうでなければ perIterationLets を新しい空の List とする。
  10. 最初の Expression が存在するなら、 test を最初の Expression とする; そ うでなければ testempty とす る。
  11. 2 番目の Expression が存在するなら、 increment を 2 番目の Expression と する; そうでなければ incrementempty とする。
  12. bodyResult を、test, increment, Statement, perIterationLets, およ び labelSet を引数とする ForBodyEvaluationCompletion とす る。
  13. running execution context の LexicalEnvironment を oldEnv に設定 する。
  14. bodyResult を返す。

14.7.4.3 ForBodyEvaluation ( test, increment, stmt, perIterationBindings, labelSet )

The abstract operation ForBodyEvaluation takes arguments test (an Expression Parse Node or empty), increment (an Expression Parse Node or empty), stmt (a Statement Parse Node), perIterationBindings (a List of Strings), and labelSet (a List of Strings) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

  1. iterationResultundefined とす る。
  2. CreatePerIterationEnvironment( perIterationBindings) を実行する。
  3. 繰り返す
    1. testempty でないなら、
      1. testRef を ? Evaluation of test とする。
      2. testValue を ? GetValue(testRef) とする。
      3. ToBoolean(testValue) が false なら、iterationResult を返す。
    2. resultCompletion(Evaluation of stmt) とする。
    3. LoopContinues(result, labelSet) が false なら、 ? UpdateEmpty(result, iterationResult) を返す。
    4. result.[[Value]]empty でない なら、iterationResultresult.[[Value]] に設定する。
    5. CreatePerIterationEnvironment( perIterationBindings) を実行する。
    6. incrementempty でないなら、
      1. incRef を ? Evaluation of increment とする。
      2. GetValue(incRef) を実行する。

14.7.4.4 CreatePerIterationEnvironment ( perIterationBindings )

The abstract operation CreatePerIterationEnvironment takes argument perIterationBindings (a List of Strings) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. perIterationBindings が何らかの要素を持つ なら、
    1. lastIterationEnv を、running execution context の LexicalEnvironment とする。
    2. outerlastIterationEnv.[[OuterEnv]] とす る。
    3. Assert: outernull ではな い。
    4. thisIterationEnvNewDeclarativeEnvironment(outer) とする。
    5. perIterationBindings の各要素 bn について、次を行う
      1. thisIterationEnv.CreateMutableBinding( bn, false) を実行する。
      2. lastValue を ? lastIterationEnv.GetBindingValue( bn, true) とする。
      3. thisIterationEnv.InitializeBinding( bn, lastValue) を実行する。
    6. running execution context の LexicalEnvironment を thisIterationEnv に設定する。
  2. unused を返す。

14.7.5 for-in, for-of, および for-await-of Statement

構文

ForInOfStatement[Yield, Await, Return] : for ( [lookahead ≠ let [] LeftHandSideExpression[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( ForDeclaration[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( [lookahead ∉ { let, async of }] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( ForDeclaration[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( [lookahead ≠ let] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( var ForBinding[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( ForDeclaration[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] ForDeclaration[Yield, Await] : LetOrConst ForBinding[?Yield, ?Await] ForBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] BindingPattern[?Yield, ?Await] Note

この節は、Annex B.3.5 によって拡張される。

14.7.5.1 Static Semantics: Early Errors

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 Note

この規則は、 B.3.1 で規定される拡張が実装されている場合にのみ適用する必要が ある。

ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement ForInOfStatement : for ( ForDeclaration in Expression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement

14.7.5.2 Static Semantics: IsDestructuring

The syntax-directed operation IsDestructuring takes no arguments and returns a Boolean. It is defined piecewise over the following productions:

MemberExpression : PrimaryExpression
  1. PrimaryExpressionObjectLiteral または ArrayLiteral のいずれかなら、 true を返す。
  2. false を返す。
MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName MemberExpression TemplateLiteral SuperProperty MetaProperty new MemberExpression Arguments MemberExpression . PrivateIdentifier NewExpression : new NewExpression LeftHandSideExpression : CallExpression OptionalExpression
  1. false を返す。
ForDeclaration : LetOrConst ForBinding
  1. ForBindingIsDestructuring を返す。
ForBinding : BindingIdentifier
  1. false を返す。
ForBinding : BindingPattern
  1. true を返す。
Note

この節は、Annex B.3.5 によって拡張される。

14.7.5.3 Runtime Semantics: ForDeclarationBindingInitialization

The syntax-directed operation ForDeclarationBindingInitialization takes arguments value (an ECMAScript language value) and environment (an Environment Record) and returns either a normal completion containing unused or an abrupt completion. It is defined piecewise over the following productions:

ForDeclaration : LetOrConst ForBinding
  1. value および environment を引数とす る ForBindingBindingInitialization を ? 返す。

14.7.5.4 Runtime Semantics: ForDeclarationBindingInstantiation

The syntax-directed operation ForDeclarationBindingInstantiation takes argument environment (a Declarative Environment Record) and returns unused. It is defined piecewise over the following productions:

ForDeclaration : LetOrConst ForBinding
  1. ForBindingBoundNames の各要素 name について、次を行う
    1. LetOrConstIsConstantDeclarationtrue なら、
      1. environment.CreateImmutableBinding( name, true) を実行する。
    2. Else,
      1. environment.CreateMutableBinding( name, false) を実行する。
  2. unused を返す。

14.7.5.5 Runtime Semantics: ForInOfLoopEvaluation

The syntax-directed operation ForInOfLoopEvaluation takes argument labelSet (a List of Strings) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It is defined piecewise over the following productions:

ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(« », Expression, enumerate) とする。
  2. ForIn/OfBodyEvaluation( LeftHandSideExpression, Statement, keyResult, enumerate, assignment, labelSet) を返す。
ForInOfStatement : for ( var ForBinding in Expression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(« », Expression, enumerate) とする。
  2. ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult, enumerate, var-binding, labelSet) を返す。
ForInOfStatement : for ( ForDeclaration in Expression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(BoundNames of ForDeclaration, Expression, enumerate) とする。
  2. ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, enumerate, lexical-binding, labelSet) を返す。
ForInOfStatement : for ( LeftHandSideExpression of AssignmentExpression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(« », AssignmentExpression, iterate) とす る。
  2. ForIn/OfBodyEvaluation( LeftHandSideExpression, Statement, keyResult, iterate, assignment, labelSet) を返す。
ForInOfStatement : for ( var ForBinding of AssignmentExpression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(« », AssignmentExpression, iterate) とす る。
  2. ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult, iterate, var-binding, labelSet) を返す。
ForInOfStatement : for ( ForDeclaration of AssignmentExpression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(BoundNames of ForDeclaration, AssignmentExpression, iterate) とする。
  2. ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, iterate, lexical-binding, labelSet) を返す。
ForInOfStatement : for await ( LeftHandSideExpression of AssignmentExpression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(« », AssignmentExpression, async-iterate) とする。
  2. ForIn/OfBodyEvaluation( LeftHandSideExpression, Statement, keyResult, iterate, assignment, labelSet, async) を返す。
ForInOfStatement : for await ( var ForBinding of AssignmentExpression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(« », AssignmentExpression, async-iterate) とする。
  2. ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult, iterate, var-binding, labelSet, async) を返す。
ForInOfStatement : for await ( ForDeclaration of AssignmentExpression ) Statement
  1. keyResult を ? ForIn/OfHeadEvaluation(BoundNames of ForDeclaration, AssignmentExpression, async-iterate) とする。
  2. ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, iterate, lexical-binding, labelSet, async) を返す。
Note

この節は、Annex B.3.5 によって拡張される。

14.7.5.6 ForIn/OfHeadEvaluation ( uninitializedBoundNames, expr, iterationKind )

The abstract operation ForIn/OfHeadEvaluation takes arguments uninitializedBoundNames (a List of Strings), expr (an Expression Parse Node or an AssignmentExpression Parse Node), and iterationKind (enumerate, iterate, or async-iterate) and returns either a normal completion containing an Iterator Record or an abrupt completion. It performs the following steps when called:

  1. oldEnv を、running execution context の LexicalEnvironment とす る。
  2. uninitializedBoundNames が空でないな ら、
    1. Assert: uninitializedBoundNames は重複する項目を持たない。
    2. newEnvNewDeclarativeEnvironment(oldEnv) とする。
    3. uninitializedBoundNames の各 String name について、次を行う
      1. newEnv.CreateMutableBinding(name, false) を実行する。
    4. running execution context の LexicalEnvironment を newEnv に設 定する。
  3. exprRefCompletion(Evaluation of expr) とする。
  4. running execution context の LexicalEnvironment を oldEnv に設定 する。
  5. exprValue を ? GetValue(? exprRef) とする。
  6. iterationKindenumerate な ら、
    1. exprValueundefined または null のいずれかなら、
      1. Completion Record { [[Type]]: break, [[Value]]: empty, [[Target]]: empty } を返す。
    2. obj を ! ToObject(exprValue) とす る。
    3. iteratorEnumerateObjectProperties(obj) とす る。
    4. nextMethod を ! GetV(iterator, "next") とする。
    5. Iterator Record { [[Iterator]]: iterator, [[NextMethod]]: nextMethod, [[Done]]: false } を返す。
  7. Assert: iterationKinditerate または async-iterate のい ずれかである。
  8. iterationKindasync-iterate なら、iteratorKindasync とす る。
  9. Else, iteratorKindsync とす る。
  10. GetIterator(exprValue, iteratorKind) を返す。

14.7.5.7 ForIn/OfBodyEvaluation ( lhs, stmt, iteratorRecord, iterationKind, lhsKind, labelSet [ , iteratorKind ] )

The abstract operation ForIn/OfBodyEvaluation takes arguments lhs (a Parse Node), stmt (a Statement Parse Node), iteratorRecord (an Iterator Record), iterationKind (enumerate or iterate), lhsKind (assignment, var-binding, or lexical-binding), and labelSet (a List of Strings) and optional argument iteratorKind (sync or async) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

  1. iteratorKind が存在しないなら、 iteratorKindsync に設定する。
  2. oldEnv を、running execution context の LexicalEnvironment とす る。
  3. iterationResultundefined とす る。
  4. destructuringlhsIsDestructuring とする。
  5. destructuringtrue であり、 かつ lhsKindassignment なら、
    1. Assert: lhsLeftHandSideExpression である。
    2. assignmentPattern を、lhs によっ て cover される AssignmentPattern とする。
  6. 繰り返す
    1. nextResult を ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]) とす る。
    2. iteratorKindasync なら、 nextResult を ? Await(nextResult) に設定する。
    3. nextResult が Object でなければ、 TypeError 例外を送出する。
    4. done を ? IteratorComplete( nextResult) とする。
    5. donetrue なら、 iterationResult を返す。
    6. nextValue を ? IteratorValue( nextResult) とする。
    7. lhsKindassignment または var-binding のいずれかなら、
      1. destructuringtrue なら、
        1. lhsKindassignment なら、
          1. status を、nextValue を引数 とする assignmentPatternDestructuringAssignmentEvaluationCompletion とする。
        2. Else,
          1. Assert: lhsKindvar-binding である。
          2. Assert: lhsForBinding である。
          3. status を、nextValue およ び undefined を引数とする lhsBindingInitializationCompletion とする。
      2. Else,
        1. lhsRefCompletion(Evaluation of lhs) とする。(それは繰り返し評 価され得る。)
        2. lhsKindassignment であ り、かつ lhsAssignmentTargetTypeweb-compat なら、 ReferenceError 例外を送出す る。
        3. lhsRefabrupt completion なら、
          1. statuslhsRef とする。
        4. Else,
          1. statusCompletion( PutValue(lhsRef.[[Value]], nextValue)) とする。
    8. Else,
      1. Assert: lhsKindlexical-binding である。
      2. Assert: lhsForDeclaration である。
      3. iterationEnvNewDeclarativeEnvironment(oldEnv) とする。
      4. iterationEnv を引数として lhsForDeclarationBindingInstantiation を実行する。
      5. running execution context の LexicalEnvironment を iterationEnv に設定する。
      6. destructuringtrue なら、
        1. status を、nextValue および iterationEnv を引数とする lhsForDeclarationBindingInitializationCompletion とする。
      7. Else,
        1. Assert: lhs は単一の名前を束縛す る。
        2. lhsNamelhsBoundNames の唯一の要素とする。
        3. lhsRef を ! ResolveBinding( lhsName) とする。
        4. statusCompletion( InitializeReferencedBinding(lhsRef, nextValue)) とする。
    9. statusabrupt completion な ら、
      1. running execution context の LexicalEnvironment を oldEnv に 設定する。
      2. iterationKindenumerate なら、? status を返す。
      3. Assert: iterationKinditerate である。
      4. iteratorKindasync なら、 ? AsyncIteratorClose(iteratorRecord, status) を返す。
      5. IteratorClose(iteratorRecord, status) を返す。
    10. resultCompletion(Evaluation of stmt) とする。
    11. running execution context の LexicalEnvironment を oldEnv に設 定する。
    12. LoopContinues(result, labelSet) が false なら、
      1. statusCompletion( UpdateEmpty(result, iterationResult)) に設定する。
      2. iterationKindenumerate なら、? status を返す。
      3. Assert: iterationKinditerate である。
      4. iteratorKindasync なら、 ? AsyncIteratorClose(iteratorRecord, status) を返す。
      5. IteratorClose(iteratorRecord, status) を返す。
    13. result.[[Value]]empty でない なら、iterationResultresult.[[Value]] に設定する。

14.7.5.8 Runtime Semantics: Evaluation

BindingIdentifier : Identifier yield await
  1. bindingIdBindingIdentifierStringValue とする。
  2. ResolveBinding(bindingId) を返す。

14.7.5.9 EnumerateObjectProperties ( obj )

The abstract operation EnumerateObjectProperties takes argument obj (an Object) and returns an iterator object. It performs the following steps when called:

  1. obj の enumerable property のすべての String 値 key を反復する next method を持つ iterator object を返 す。この iterator object は ECMAScript code から直接アクセス可能ではない。 property を列挙する仕組みおよび順序は規定さ れないが、以下で規定される規則には適合しなければな らない。

iteratorthrow および return method は null であり、決して呼び出されない。 iteratornext method は、property keyiterator 値として返すべきかどうかを決定するため に object property を処理する。返される property key には Symbol である key は含まれない。target object の property は列挙中に削除され得る。 iteratornext method によって処理される前に 削除された property は無視される。列挙中に target object に新しい property が追加された場合、新たに 追加された property が進行中の列挙で処理されることは 保証されない。任意の列挙において、property 名は iteratornext method によって高々 1 回し か返されない。

target object の property の列挙には、その prototype の property、その prototype の prototype の property、というように再帰的に含ま れる; ただし、prototype の property は、それがす でに iteratornext method によって処理済み の property と同じ名前を持つ場合には処理されない。 prototype object の property がすでに処理済み かどうかを判定する際には、[[Enumerable]] 属性値は考慮 されない。prototype object の enumerable property 名は、その prototype object を引数とし て渡して EnumerateObjectProperties を起動するこ とにより取得されなければならない。 EnumerateObjectProperties は、target object の own property key を、その [[OwnPropertyKeys]] 内部メソッドを呼び出すことにより取得しなければならない。 target object の property 属性は、その [[GetOwnProperty]] 内部メソッドを呼び出すことによ り取得しなければならない。

さらに、obj も、その prototype chain 上 のいずれの object も、Proxy 特殊オブジェクトTypedArray、module namespace 特殊オブジェク ト、または implementation により提供される特殊オブ ジェクトでない場合、iterator は以下のいずれかが起こ るまで、CreateForInIterator(obj) によって与えら れる iterator と同様に振る舞わなければならない:

  • obj またはその prototype chain 上の いずれかの object の [[Prototype]] internal slot の値が変化する、
  • obj またはその prototype chain 上の いずれかの object から property が削除される、
  • obj の prototype chain 上の object に property が追加される、または
  • obj またはその prototype chain 上の いずれかの object の property の [[Enumerable]] 属性の値が変化する。
Note 1

ECMAScript 実装は、 14.7.5.10.2.1 にある algorithm を直接実装することを要求されない。 前段落の制約のいずれかが破られない限り、その algorithm から挙動が逸脱しない任意の実装を選んでよ い。

以下は、これらの規則に適合する ECMAScript generator function の参考定義である:

function* EnumerateObjectProperties(obj) {
  const visited = new Set();
  for (const key of Reflect.ownKeys(obj)) {
    if (typeof key === "symbol") continue;
    const desc = Reflect.getOwnPropertyDescriptor(obj, key);
    if (desc) {
      visited.add(key);
      if (desc.enumerable) yield key;
    }
  }
  const proto = Reflect.getPrototypeOf(obj);
  if (proto === null) return;
  for (const protoKey of EnumerateObjectProperties(proto)) {
    if (!visited.has(protoKey)) yield protoKey;
  }
}
Note 2
implementation が CreateForInIterator に一 致することを要求されない特殊オブジェクトの list は、実 装が歴史的にそれらの事例について挙動が異なっており、その 他すべてでは一致していたために選ばれた。

14.7.5.10 For-In Iterator Object

For-In Iterator とは、ある特定の object に対する特定の iteration を表す object である。For-In Iterator object は ECMAScript code から直接アクセス可能ではなく、 EnumerateObjectProperties の挙動を説明するためだ けに存在する。

14.7.5.10.1 CreateForInIterator ( object )

The abstract operation CreateForInIterator takes argument object (an Object) and returns a For-In Iterator. これは、object の own および継承された enumerable string property を特定の順序で反復 する For-In Iterator object を作成するために用いら れる。 It performs the following steps when called:

  1. iteratorOrdinaryObjectCreate(%ForInIteratorPrototype%, « [[Object]], [[ObjectWasVisited]], [[VisitedKeys]], [[RemainingKeys]] ») とする。
  2. iterator.[[Object]]object に設定 する。
  3. iterator.[[ObjectWasVisited]]false に設定する。
  4. iterator.[[VisitedKeys]] を新しい空の List に設定する。
  5. iterator.[[RemainingKeys]] を新しい空 の List に設定する。
  6. iterator を返す。

14.7.5.10.2 %ForInIteratorPrototype% Object

%ForInIteratorPrototype% object は:

  • すべての For-In Iterator object に よって継承される property を持つ。
  • 通常 object である。
  • [[Prototype]] internal slot を持ち、 その値は %Iterator.prototype% である。
  • ECMAScript code から直接アクセス可能では ない。
  • 次の property を持つ:

14.7.5.10.2.1 %ForInIteratorPrototype%.next ( )

  1. iterthis 値とする。
  2. Assert: iter は Object である。
  3. Assert: iter は、For-In Iterator instance のすべての internal slot を持つ (14.7.5.10.3)。
  4. objectiter.[[Object]] とする。
  5. 繰り返す
    1. iter.[[ObjectWasVisited]]false なら、
      1. keys を ? object.[[OwnPropertyKeys]]() とする。
      2. keys の各要素 key について、次を 行う
        1. key が String なら、
          1. keyiter.[[RemainingKeys]] に append する。
      3. iter.[[ObjectWasVisited]]true に設定する。
    2. iter.[[RemainingKeys]] が空でな い間、繰り返す
      1. keyiter.[[RemainingKeys]] の最初 の要素とする。
      2. 最初の要素を iter.[[RemainingKeys]] から除 去する。
      3. iter.[[VisitedKeys]]key を 含まないなら、
        1. desc を ? object.[[GetOwnProperty]](key) とする。
        2. descundefined でなけれ ば、
          1. keyiter.[[VisitedKeys]] に append する。
          2. desc.[[Enumerable]]true なら、 CreateIteratorResultObject( key, false) を返す。
    3. object を ? object.[[GetPrototypeOf]]() に設定する。
    4. iter.[[Object]]object に設定 する。
    5. iter.[[ObjectWasVisited]]false に設定する。
    6. objectnull なら、 CreateIteratorResultObject( undefined, true) を返す。

14.7.5.10.3 For-In Iterator Instance の Property

For-In Iterator instance は、%ForInIteratorPrototype% intrinsic object から property を継承する通 常 object である。For-In Iterator instance は、 初期状態で Table 33 に列挙された internal slot を持つように作成され る。

Table 33: Internal Slots of For-In Iterator Instances
Internal Slot 説明
[[Object]] an Object その property が反復されている Object 値。
[[ObjectWasVisited]] a Boolean iterator[[Object]] に対して [[OwnPropertyKeys]] を呼び出した場合 は true、それ以外は false
[[VisitedKeys]] a List of Strings これまでにこの iterator によって emit された値。
[[RemainingKeys]] a List of Strings prototype の property を反復する前 に(その prototype が null でなけ れば)、現在の object に対してまだ emit されていない値。

14.8 continue Statement

構文

ContinueStatement[Yield, Await] : continue ; continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ;

14.8.1 Static Semantics: Early Errors

ContinueStatement : continue ; continue LabelIdentifier ;
  • この ContinueStatement が、 IterationStatement の内部に、直接または間 接に(ただし function または static initialization block の境界はまたがず に)入れ子になっていない場合、それは Syntax Error である。

14.8.2 Runtime Semantics: Evaluation

ContinueStatement : continue ;
  1. Completion Record { [[Type]]: continue, [[Value]]: empty, [[Target]]: empty } を返す。
ContinueStatement : continue LabelIdentifier ;
  1. labelLabelIdentifierStringValue とする。
  2. Completion Record { [[Type]]: continue, [[Value]]: empty, [[Target]]: label } を返す。

14.9 break Statement

構文

BreakStatement[Yield, Await] : break ; break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ;

14.9.1 Static Semantics: Early Errors

BreakStatement : break ;
  • この BreakStatement が、 IterationStatement または SwitchStatement の内部に、直接または間接 に(ただし function または static initialization block の境界はまたがず に)入れ子になっていない場合、それは Syntax Error である。

14.9.2 Runtime Semantics: Evaluation

BreakStatement : break ;
  1. Completion Record { [[Type]]: break, [[Value]]: empty, [[Target]]: empty } を返す。
BreakStatement : break LabelIdentifier ;
  1. labelLabelIdentifierStringValue とする。
  2. Completion Record { [[Type]]: break, [[Value]]: empty, [[Target]]: label } を返す。

14.10 return Statement

構文

ReturnStatement[Yield, Await] : return ; return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; Note

return statement は function の実行を 停止させ、ほとんどの場合、呼出し元へ値を返す。 Expression が省略された場合、返値は undefined である。そうでなければ、返値は Expression の値であ る。return statement は、周囲の文脈によっては実際 には呼出し元へ値を返さないことがある。たとえば try block では、return statement の Completion Record は、finally block の評価中に別の Completion Record に置き換えられ得る。

14.10.1 Runtime Semantics: Evaluation

ReturnStatement : return ;
  1. ReturnCompletion(undefined) を返す。
ReturnStatement : return Expression ;
  1. exprRef を ? Evaluation of Expression とする。
  2. exprValue を ? GetValue(exprRef) とする。
  3. GetGeneratorKind() が async なら、 exprValue を ? Await(exprValue) に設 定する。
  4. ReturnCompletion(exprValue) を返す。

14.11 with Statement

Note 1

Legacywith statement の使用は、新し い ECMAScript code では推奨されない。strict mode codenon-strict code の両方で許可され る代替手段、たとえば destructuring assignment を検討せよ。

構文

WithStatement[Yield, Await, Return] : with ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] Note 2

with statement は、計算された object に 対する Object Environment Record を、running execution context の lexical environment に 追加する。その後、この拡張された lexical environment を用いて statement を実行する。最後に、元の lexical environment を復元する。

14.11.1 Static Semantics: Early Errors

WithStatement : with ( Expression ) Statement Note

2 番目の規則は、 B.3.1 で規定される拡張が実装されている場合にのみ適用する必要が ある。

14.11.2 Runtime Semantics: Evaluation

WithStatement : with ( Expression ) Statement
  1. val を ? Evaluation of Expression とする。
  2. obj を ? ToObject(? GetValue(val)) とする。
  3. oldEnv を、running execution context の LexicalEnvironment とす る。
  4. newEnvNewObjectEnvironment(obj, true, oldEnv) とする。
  5. running execution context の LexicalEnvironment を newEnv に設定 する。
  6. stmtCompletionCompletion(Evaluation of Statement) とする。
  7. running execution context の LexicalEnvironment を oldEnv に設定 する。
  8. UpdateEmpty(stmtCompletion, undefined) を返す。
Note

embedded された Statement を control がどのように離れても、通常であれ、ある種の abrupt completion または exception によるものであれ、 LexicalEnvironment は常に以前の状態に復元される。

14.12 switch Statement

構文

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: Early Errors

SwitchStatement : switch ( Expression ) CaseBlock

14.12.2 Runtime Semantics: CaseBlockEvaluation

The syntax-directed operation CaseBlockEvaluation takes argument input (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It is defined piecewise over the following productions:

CaseBlock : { }
  1. undefined を返す。
CaseBlock : { CaseClauses }
  1. resultValueundefined とする。
  2. caseClauses を、source text 順の CaseClauses 内の CaseClause item の List とする。
  3. foundfalse とする。
  4. caseClauses の各 CaseClause clause について、次を行う
    1. foundfalse なら、
      1. found を ? CaseClauseIsSelected(clause, input) に設定する。
    2. foundtrue なら、
      1. completionCompletion(Evaluation of clause) とする。
      2. completion.[[Value]]empty でないなら、resultValuecompletion.[[Value]] に設定する。
      3. completionabrupt completion なら、 ? UpdateEmpty(completion, resultValue) を返す。
  5. resultValue を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. resultValueundefined とする。
  2. 最初の CaseClauses が存在するなら、
    1. caseClauses を、source text 順の最 初の CaseClauses 内の CaseClause item の List とする。
  3. Else,
    1. caseClauses を新しい空の List とする。
  4. foundfalse とする。
  5. caseClauses の各 CaseClause clause について、次を行う
    1. foundfalse なら、
      1. found を ? CaseClauseIsSelected(clause, input) に設定する。
    2. foundtrue なら、
      1. completionCompletion(Evaluation of clause) とする。
      2. completion.[[Value]]empty でないなら、resultValuecompletion.[[Value]] に設定する。
      3. completionabrupt completion なら、 ? UpdateEmpty(completion, resultValue) を返す。
  6. foundInBfalse とする。
  7. 2 番目の CaseClauses が存在するなら、
    1. secondCaseClauses を、source text 順の 2 番目の CaseClauses 内の CaseClause item の List とする。
  8. Else,
    1. secondCaseClauses を新しい空の List とする。
  9. foundfalse なら、
    1. secondCaseClauses の各 CaseClause clause について、次を行う
      1. foundInBfalse なら、
        1. foundInB を ? CaseClauseIsSelected(clause, input) に設定する。
      2. foundInBtrue なら、
        1. completionCompletion( Evaluation of CaseClause clause) とする。
        2. completion.[[Value]]empty でないなら、resultValuecompletion.[[Value]] に設定する。
        3. completionabrupt completion なら、 ? UpdateEmpty(completion, resultValue) を返す。
  10. foundInBtrue なら、 resultValue を返す。
  11. defaultRCompletion(Evaluation of DefaultClause) とする。
  12. defaultR.[[Value]]empty でない なら、resultValuedefaultR.[[Value]] に設定する。
  13. defaultRabrupt completion なら、 ? UpdateEmpty(defaultR, resultValue) を返す。
  14. NOTE: 以下は、2 番目の CaseClauses の もう 1 回の完全な iteration である。
  15. secondCaseClauses の各 CaseClause clause について、次を行う
    1. completionCompletion(Evaluation of CaseClause clause) とする。
    2. completion.[[Value]]empty で ないなら、resultValuecompletion.[[Value]] に設定する。
    3. completionabrupt completion なら、 ? UpdateEmpty(completion, resultValue) を返す。
  16. resultValue を返す。

14.12.3 CaseClauseIsSelected ( constructor, input )

The abstract operation CaseClauseIsSelected takes arguments constructor (a CaseClause Parse Node) and input (an ECMAScript language value) and returns either a normal completion containing a Boolean or an abrupt completion. これは、constructorinput に一致するかど うかを判定する。 It performs the following steps when called:

  1. Assert: constructor は production CaseClause : case Expression : StatementListopt の instance である。
  2. exprRefconstructorExpressionEvaluation の ? とす る。
  3. clauseSelector を ? GetValue(exprRef) とする。
  4. IsStrictlyEqual(input, clauseSelector) を返す。
Note

この操作は constructorStatementList (もしあれば)を実行しない。CaseBlock algorithm は、その返値を用いてどの StatementList の実行を開始するかを決定する。

14.12.4 Runtime Semantics: Evaluation

SwitchStatement : switch ( Expression ) CaseBlock
  1. exprRef を ? Evaluation of Expression とする。
  2. switchValue を ? GetValue(exprRef) とする。
  3. oldEnv を、running execution context の LexicalEnvironment とす る。
  4. blockEnvNewDeclarativeEnvironment(oldEnv) と する。
  5. BlockDeclarationInstantiation( CaseBlock, blockEnv) を実行する。
  6. running execution context の LexicalEnvironment を blockEnv に設定 する。
  7. blockResult を、switchValue を引数とす る CaseBlockCaseBlockEvaluationCompletion とする。
  8. running execution context の LexicalEnvironment を oldEnv に設定 する。
  9. blockResult を返す。
Note

どのように control が SwitchStatement を離れても、LexicalEnvironment は常に以前の状態 に復元される。

CaseClause : case Expression :
  1. empty を返す。
CaseClause : case Expression : StatementList
  1. Evaluation of StatementList を返す。
DefaultClause : default :
  1. empty を返す。
DefaultClause : default : StatementList
  1. Evaluation of StatementList を返す。

14.13 Labelled Statement

構文

LabelledStatement[Yield, Await, Return] : LabelIdentifier[?Yield, ?Await] : LabelledItem[?Yield, ?Await, ?Return] LabelledItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] FunctionDeclaration[?Yield, ?Await, ~Default] Note

Statement には label を前置してよい。 label 付き statement は、label 付き break お よび continue statement と組み合わせてのみ使 用される。ECMAScript には goto statement はな い。StatementLabelledStatement の一部とな り得て、それ自体がさらに LabelledStatement の一部 となり得る。このように導入された label は、個々の statement の意味論を記述するとき、まとめて “current label set” と呼ばれる。

14.13.1 Static Semantics: Early Errors

LabelledItem : FunctionDeclaration
  • 任意の source text がこの production に 一致する場合、それは Syntax Error である 。ただし、その source text が non-strict code であ り、かつ host が web browser であるか、 または ラベル付き Function Declaration をサポートしている場合を除く

14.13.2 Static Semantics: IsLabelledFunction ( stmt )

The abstract operation IsLabelledFunction takes argument stmt (a Statement Parse Node) and returns a Boolean. It performs the following steps when called:

  1. stmtLabelledStatement でなければ、 false を返す。
  2. itemstmtLabelledItem とす る。
  3. item LabelledItem : FunctionDeclaration なら、true を返す。
  4. subStmtitemStatement とする。
  5. IsLabelledFunction(subStmt) を返す。

14.13.3 Runtime Semantics: Evaluation

LabelledStatement : LabelIdentifier : LabelledItem
  1. « » を引数として this LabelledStatementLabelledEvaluation を ? 返す。

14.13.4 Runtime Semantics: LabelledEvaluation

The syntax-directed operation LabelledEvaluation takes argument labelSet (a List of Strings) and returns either a normal completion containing either an ECMAScript language value or empty, or an abrupt completion. It is defined piecewise over the following productions:

BreakableStatement : IterationStatement
  1. stmtResult を、labelSet を引数とする IterationStatementLoopEvaluationCompletion とする。
  2. stmtResultbreak completion な ら、
    1. stmtResult.[[Target]]empty な ら、
      1. stmtResult.[[Value]]empty なら、stmtResultNormalCompletion(undefined) に設 定する。
      2. Else, stmtResultNormalCompletion(stmtResult.[[Value]]) に設定する。
  3. stmtResult を返す。
BreakableStatement : SwitchStatement
  1. stmtResultCompletion(Evaluation of SwitchStatement) とする。
  2. stmtResultbreak completion な ら、
    1. stmtResult.[[Target]]empty な ら、
      1. stmtResult.[[Value]]empty なら、stmtResultNormalCompletion(undefined) に設 定する。
      2. Else, stmtResultNormalCompletion(stmtResult.[[Value]]) に設定する。
  3. stmtResult を返す。
Note 1

BreakableStatement とは、label のない BreakStatement によって脱出できるものである。

LabelledStatement : LabelIdentifier : LabelledItem
  1. labelLabelIdentifierStringValue とする。
  2. newLabelSetlabelSet と « label » の list-concatenation とする。
  3. stmtResult を、newLabelSet を引数とす る LabelledItemLabelledEvaluationCompletion とする。
  4. stmtResultbreak completion で あり、かつ stmtResult.[[Target]]label なら、
    1. stmtResultNormalCompletion(stmtResult.[[Value]]) に設定する。
  5. stmtResult を返す。
LabelledItem : FunctionDeclaration
  1. Evaluation of FunctionDeclaration を返 す。
Statement : BlockStatement VariableStatement EmptyStatement ExpressionStatement IfStatement ContinueStatement BreakStatement ReturnStatement WithStatement ThrowStatement TryStatement DebuggerStatement
  1. Evaluation of Statement を返す。
Note 2

Statement の生成規則のうち、 LabelledEvaluation に対して特別な意味論を持つのは BreakableStatementLabelledStatement だ けである。

14.14 throw Statement

構文

ThrowStatement[Yield, Await] : throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ;

14.14.1 Runtime Semantics: Evaluation

ThrowStatement : throw Expression ;
  1. exprRef を ? Evaluation of Expression とする。
  2. exprValue を ? GetValue(exprRef) とする。
  3. exprValue を throw する。

14.15 try Statement

構文

TryStatement[Yield, Await, Return] : try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] Catch[Yield, Await, Return] : catch ( CatchParameter[?Yield, ?Await] ) Block[?Yield, ?Await, ?Return] catch Block[?Yield, ?Await, ?Return] Finally[Yield, Await, Return] : finally Block[?Yield, ?Await, ?Return] CatchParameter[Yield, Await] : BindingIdentifier[?Yield, ?Await] BindingPattern[?Yield, ?Await] Note

try statement は、runtime error や throw statement のような例外的条件が発生し得る code block を囲む。catch clause は例外処理 code を提供する。catch clause が exception を捕 捉するとき、その CatchParameter はその exception に束縛される。

14.15.1 Static Semantics: Early Errors

Catch : catch ( CatchParameter ) Block

14.15.2 Runtime Semantics: CatchClauseEvaluation

The syntax-directed operation CatchClauseEvaluation takes argument thrownValue (an ECMAScript language value) and returns either a normal completion containing either an ECMAScript language value or empty, or an abrupt completion. It is defined piecewise over the following productions:

Catch : catch ( CatchParameter ) Block
  1. oldEnv を、running execution context の LexicalEnvironment とす る。
  2. catchEnvNewDeclarativeEnvironment(oldEnv) と する。
  3. CatchParameterBoundNames の各要素 argName について、次を行う
    1. catchEnv.CreateMutableBinding( argName, false) を実行する。
  4. running execution context の LexicalEnvironment を catchEnv に設定 する。
  5. status を、thrownValue および catchEnv を引数とする CatchParameterBindingInitializationCompletion とする。
  6. statusabrupt completion な ら、
    1. running execution context の LexicalEnvironment を oldEnv に設定 する。
    2. status を返す。
  7. blockCompletionCompletion( Evaluation of Block) とする。
  8. running execution context の LexicalEnvironment を oldEnv に設定 する。
  9. blockCompletion を返す。
Catch : catch Block
  1. Evaluation of Block を返す。
Note

どのように control が Block を離れても、 LexicalEnvironment は常に以前の状態に復元される。

14.15.3 Runtime Semantics: Evaluation

TryStatement : try Block Catch
  1. blockResultCompletion(Evaluation of Block) とする。
  2. blockResultthrow completion な ら、catchResult を、blockResult.[[Value]] を引数とする CatchCatchClauseEvaluationCompletion と する。
  3. Else, catchResultblockResult とする。
  4. UpdateEmpty(catchResult, undefined) を返す。
TryStatement : try Block Finally
  1. blockResultCompletion(Evaluation of Block) とする。
  2. finallyResultCompletion(Evaluation of Finally) とする。
  3. finallyResultnormal completion なら、finallyResultblockResult に設定する。
  4. UpdateEmpty(finallyResult, undefined) を返す。
TryStatement : try Block Catch Finally
  1. blockResultCompletion(Evaluation of Block) とする。
  2. blockResultthrow completion な ら、catchResult を、blockResult.[[Value]] を引数とする CatchCatchClauseEvaluationCompletion と する。
  3. Else, catchResultblockResult とする。
  4. finallyResultCompletion(Evaluation of Finally) とする。
  5. finallyResultnormal completion なら、finallyResultcatchResult に設定する。
  6. UpdateEmpty(finallyResult, undefined) を返す。

14.16 debugger Statement

構文

DebuggerStatement : debugger ;

14.16.1 Runtime Semantics: Evaluation

Note

DebuggerStatement の評価は、debugger の 下で実行されているときに implementation が breakpoint を発生させることを可能にし得る。 debugger が存在しないか active でない場合、この statement は観測可能な効果を持たない。

DebuggerStatement : debugger ;
  1. implementation-defined な debugging facility が利用可能かつ有効なら、
    1. implementation-defined な debugging action を実行する。
    2. 新しい implementation-definedCompletion Record を返す。
  2. empty を返す。

15 ECMAScript 言語: 関数とクラス

Note

さまざまな 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 Note

FormalParameterList 内で同一の BindingIdentifier が複数回出現することは、単純なパラメータリストを持ち、かつ strict モードコードで定義されていない関数にのみ許可される。

15.1.2 Static Semantics: ContainsExpression

The syntax-directed operation ContainsExpression takes no arguments and returns ブール値. It is defined piecewise over the following productions:

ObjectBindingPattern : { } { BindingRestProperty }
  1. false を返す。
ObjectBindingPattern : { BindingPropertyList , BindingRestProperty }
  1. BindingPropertyListContainsExpression を返す。
ArrayBindingPattern : [ Elisionopt ]
  1. false を返す。
ArrayBindingPattern : [ Elisionopt BindingRestElement ]
  1. BindingRestElementContainsExpression を返す。
ArrayBindingPattern : [ BindingElementList , Elisionopt ]
  1. BindingElementListContainsExpression を返す。
ArrayBindingPattern : [ BindingElementList , Elisionopt BindingRestElement ]
  1. hasBindingElementListContainsExpression とする。
  2. hastrue の場合、true を返す。
  3. BindingRestElementContainsExpression を返す。
BindingPropertyList : BindingPropertyList , BindingProperty
  1. hasBindingPropertyListContainsExpression とする。
  2. hastrue の場合、true を返す。
  3. BindingPropertyContainsExpression を返す。
BindingElementList : BindingElementList , BindingElisionElement
  1. hasBindingElementListContainsExpression とする。
  2. hastrue の場合、true を返す。
  3. BindingElisionElementContainsExpression を返す。
BindingElisionElement : Elisionopt BindingElement
  1. BindingElementContainsExpression を返す。
BindingProperty : PropertyName : BindingElement
  1. hasPropertyNameIsComputedPropertyKey とする。
  2. hastrue の場合、true を返す。
  3. BindingElementContainsExpression を返す。
BindingElement : BindingPattern Initializer
  1. true を返す。
SingleNameBinding : BindingIdentifier
  1. false を返す。
SingleNameBinding : BindingIdentifier Initializer
  1. true を返す。
BindingRestElement : ... BindingIdentifier
  1. false を返す。
BindingRestElement : ... BindingPattern
  1. BindingPatternContainsExpression を返す。
FormalParameters : [empty]
  1. false を返す。
FormalParameters : FormalParameterList , FunctionRestParameter
  1. FormalParameterListContainsExpressiontrue の場合、true を返す。
  2. FunctionRestParameterContainsExpression を返す。
FormalParameterList : FormalParameterList , FormalParameter
  1. FormalParameterListContainsExpressiontrue の場合、true を返す。
  2. FormalParameterContainsExpression を返す。
ArrowParameters : BindingIdentifier
  1. false を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsCoverParenthesizedExpressionAndArrowParameterList によってカバーされる ArrowFormalParameters とする。
  2. formalsContainsExpression を返す。
AsyncArrowBindingIdentifier : BindingIdentifier
  1. false を返す。

15.1.3 Static Semantics: IsSimpleParameterList

The syntax-directed operation IsSimpleParameterList takes no arguments and returns ブール値. It is defined piecewise over the following productions:

BindingElement : BindingPattern
  1. false を返す。
BindingElement : BindingPattern Initializer
  1. false を返す。
SingleNameBinding : BindingIdentifier
  1. true を返す。
SingleNameBinding : BindingIdentifier Initializer
  1. false を返す。
FormalParameters : [empty]
  1. true を返す。
FormalParameters : FunctionRestParameter
  1. false を返す。
FormalParameters : FormalParameterList , FunctionRestParameter
  1. false を返す。
FormalParameterList : FormalParameterList , FormalParameter
  1. FormalParameterListIsSimpleParameterListfalse の場合、false を返す。
  2. FormalParameterIsSimpleParameterList を返す。
FormalParameter : BindingElement
  1. BindingElementIsSimpleParameterList を返す。
ArrowParameters : BindingIdentifier
  1. true を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsCoverParenthesizedExpressionAndArrowParameterList によってカバーされる ArrowFormalParameters とする。
  2. formalsIsSimpleParameterList を返す。
AsyncArrowBindingIdentifier : BindingIdentifier
  1. true を返す。
CoverCallExpressionAndAsyncArrowHead : MemberExpression Arguments
  1. headCoverCallExpressionAndAsyncArrowHead によってカバーされる AsyncArrowHead とする。
  2. headIsSimpleParameterList を返す。

15.1.4 Static Semantics: HasInitializer

The syntax-directed operation HasInitializer takes no arguments and returns ブール値. It is defined piecewise over the following productions:

BindingElement : BindingPattern
  1. false を返す。
BindingElement : BindingPattern Initializer
  1. true を返す。
SingleNameBinding : BindingIdentifier
  1. false を返す。
SingleNameBinding : BindingIdentifier Initializer
  1. true を返す。
FormalParameterList : FormalParameterList , FormalParameter
  1. FormalParameterListHasInitializertrue の場合、true を返す。
  2. FormalParameterHasInitializer を返す。

15.1.5 Static Semantics: ExpectedArgumentCount

The syntax-directed operation ExpectedArgumentCount takes no arguments and returns 非負整数. It is defined piecewise over the following productions:

FormalParameters : [empty] FunctionRestParameter
  1. 0 を返す。
FormalParameters : FormalParameterList , FunctionRestParameter
  1. FormalParameterListExpectedArgumentCount を返す。
Note

FormalParameterList の ExpectedArgumentCount は、レストパラメータまたは Initializer を持つ最初の FormalParameter のいずれかの左側にある FormalParameters の数である。Initializer を持たない FormalParameter は、最初の Initializer を持つパラメータの後に現れることが許されるが、そのようなパラメータは既定値として undefined を持つオプションとして扱われる。

FormalParameterList : FormalParameter
  1. FormalParameterHasInitializertrue の場合、0 を返す。
  2. 1 を返す。
FormalParameterList : FormalParameterList , FormalParameter
  1. countFormalParameterListExpectedArgumentCount とする。
  2. FormalParameterListHasInitializertrue または FormalParameterHasInitializertrue の場合、count を返す。
  3. count + 1 を返す。
ArrowParameters : BindingIdentifier
  1. 1 を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsCoverParenthesizedExpressionAndArrowParameterList によってカバーされる ArrowFormalParameters とする。
  2. formalsExpectedArgumentCount を返す。
PropertySetParameterList : FormalParameter
  1. FormalParameterHasInitializertrue の場合、0 を返す。
  2. 1 を返す。
AsyncArrowBindingIdentifier : BindingIdentifier
  1. 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 BindingIdentifieropt ( FormalParameters ) { FunctionBody } Note

FunctionBodyLexicallyDeclaredNames には、var または関数宣言を用いて束縛された識別子は含まれない。

FunctionBody : FunctionStatementList

15.2.2 Static Semantics: FunctionBodyContainsUseStrict

The syntax-directed operation FunctionBodyContainsUseStrict takes no arguments and returns Boolean. It is defined piecewise over the following productions:

FunctionBody : FunctionStatementList
  1. FunctionBodyDirective PrologueUse Strict Directive を含む場合、true を返す。
  2. false を返す。

15.2.3 Runtime Semantics: EvaluateFunctionBody

The syntax-directed operation EvaluateFunctionBody takes arguments functionObject (ECMAScript function object) and argumentsList (ECMAScript language valuesList) and returns return completion または throw completion. It is defined piecewise over the following productions:

FunctionBody : FunctionStatementList
  1. FunctionDeclarationInstantiation(functionObject, argumentsList) を実行する。
  2. FunctionStatementListEvaluation を ? 実行する。
  3. NOTE: 前のステップが normal completion となった場合、評価は FunctionStatementList の末尾を越えて進むことで終了した。
  4. ReturnCompletion(undefined) を返す。

15.2.4 Runtime Semantics: InstantiateOrdinaryFunctionObject

The syntax-directed operation InstantiateOrdinaryFunctionObject takes arguments env (Environment Record) and privateEnv (PrivateEnvironment Record または null) and returns ECMAScript function object. It is defined piecewise over the following productions:

FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody }
  1. nameBindingIdentifierStringValue とする。
  2. sourceTextFunctionDeclaration に一致したソーステキストとする。
  3. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, env, privateEnv) とする。
  4. SetFunctionName(closure, name) を実行する。
  5. MakeConstructor(closure) を実行する。
  6. closure を返す。
FunctionDeclaration : function ( FormalParameters ) { FunctionBody }
  1. sourceTextFunctionDeclaration に一致したソーステキストとする。
  2. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, env, privateEnv) とする。
  3. SetFunctionName(closure, "default") を実行する。
  4. MakeConstructor(closure) を実行する。
  5. closure を返す。
Note

無名の FunctionDeclarationexport default 宣言の一部としてのみ現れることができ、その関数コードはしたがって常に strict mode code である。

15.2.5 Runtime Semantics: InstantiateOrdinaryFunctionExpression

The syntax-directed operation InstantiateOrdinaryFunctionExpression takes optional argument name (property key または Private Name) and returns ECMAScript function object. It is defined piecewise over the following productions:

FunctionExpression : function ( FormalParameters ) { FunctionBody }
  1. name が存在しない場合、name を空の String に設定する。
  2. env を実行中の実行コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  4. sourceTextFunctionExpression に一致したソーステキストとする。
  5. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, env, privateEnv) とする。
  6. SetFunctionName(closure, name) を実行する。
  7. MakeConstructor(closure) を実行する。
  8. closure を返す。
FunctionExpression : function BindingIdentifier ( FormalParameters ) { FunctionBody }
  1. Assert: name は存在しない。
  2. nameBindingIdentifierStringValue に設定する。
  3. outerEnv を実行中の実行コンテキストの LexicalEnvironment とする。
  4. funcEnvNewDeclarativeEnvironment(outerEnv) とする。
  5. funcEnv.CreateImmutableBinding(name, false) を実行する。
  6. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  7. sourceTextFunctionExpression に一致したソーステキストとする。
  8. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, funcEnv, privateEnv) とする。
  9. SetFunctionName(closure, name) を実行する。
  10. MakeConstructor(closure) を実行する。
  11. funcEnv.InitializeBinding(name, closure) を実行する。
  12. closure を返す。
Note

FunctionExpression 内の BindingIdentifier は、関数が再帰的に自分自身を呼び出せるようにするため、FunctionExpressionFunctionBody 内から参照できる。しかし、FunctionDeclaration の場合とは異なり、FunctionExpression 内の BindingIdentifierFunctionExpression を囲むスコープから参照できず、そのスコープに影響しない。

15.2.6 Runtime Semantics: Evaluation

FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody }
  1. empty を返す。
Note 1 FunctionDeclaration : function ( FormalParameters ) { FunctionBody }
  1. empty を返す。
FunctionExpression : function BindingIdentifieropt ( FormalParameters ) { FunctionBody }
  1. FunctionExpressionInstantiateOrdinaryFunctionExpression を返す。
Note 2

FunctionDeclaration または FunctionExpression を用いて定義されたすべての関数には、その関数がコンストラクタとして使用される可能性を許すため、"prototype" プロパティが自動的に作成される。

FunctionStatementList : [empty]
  1. undefined を返す。

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

The syntax-directed operation ConciseBodyContainsUseStrict takes no arguments and returns ブール値. It is defined piecewise over the following productions:

ConciseBody : ExpressionBody
  1. false を返す。
ConciseBody : { FunctionBody }
  1. FunctionBodyFunctionBodyContainsUseStrict を返す。

15.3.3 Runtime Semantics: EvaluateConciseBody

The syntax-directed operation EvaluateConciseBody takes arguments functionObject (ECMAScript 関数オブジェクト) and argumentsList (ECMAScript 言語値List) and returns return 完了または throw 完了. It is defined piecewise over the following productions:

ConciseBody : ExpressionBody
  1. FunctionDeclarationInstantiation(functionObject, argumentsList) を実行する。
  2. ExpressionBody の ? Evaluation を返す。

15.3.4 Runtime Semantics: InstantiateArrowFunctionExpression

The syntax-directed operation InstantiateArrowFunctionExpression takes optional argument name (property key または Private Name) and returns ECMAScript 関数オブジェクト. It is defined piecewise over the following productions:

ArrowFunction : ArrowParameters => ConciseBody
  1. name が存在しない場合、name を空の String に設定する。
  2. env を実行中の実行コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  4. sourceTextArrowFunction に一致したソーステキストとする。
  5. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, ArrowParameters, ConciseBody, lexical-this, env, privateEnv) とする。
  6. SetFunctionName(closure, name) を実行する。
  7. closure を返す。
Note

ArrowFunction は、argumentssuperthis、または new.target の局所束縛を定義しない。ArrowFunction 内の argumentssuperthis、または new.target への任意の参照は、レキシカルに包含する環境内の束縛に解決されなければならない。通常、これは直近で包含する関数の Function Environment である。ArrowFunctionsuper への参照を含む場合があっても、ステップ 5 で作成される関数オブジェクトは MakeMethod を実行することによってメソッドにはされない。super を参照する ArrowFunction は常に非-ArrowFunction の内部に含まれ、super を実装するために必要な状態は、ArrowFunction の関数オブジェクトによって捕捉された env を介してアクセス可能である。

15.3.5 Runtime Semantics: Evaluation

ArrowFunction : ArrowParameters => ConciseBody
  1. ArrowFunctionInstantiateArrowFunctionExpression を返す。
ExpressionBody : AssignmentExpression
  1. exprRefAssignmentExpression の ? Evaluation とする。
  2. exprValue を ? GetValue(exprRef) とする。
  3. 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

The syntax-directed operation HasDirectSuper takes no arguments and returns ブール値. It is defined piecewise over the following productions:

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
  1. UniqueFormalParameters Contains SuperCalltrue である場合、true を返す。
  2. FunctionBody Contains SuperCall を返す。
MethodDefinition : get ClassElementName ( ) { FunctionBody }
  1. FunctionBody Contains SuperCall を返す。
MethodDefinition : set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. PropertySetParameterList Contains SuperCalltrue である場合、true を返す。
  2. FunctionBody Contains SuperCall を返す。
GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }
  1. UniqueFormalParameters Contains SuperCalltrue である場合、true を返す。
  2. GeneratorBody Contains SuperCall を返す。
AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. UniqueFormalParameters Contains SuperCalltrue である場合、true を返す。
  2. AsyncGeneratorBody Contains SuperCall を返す。
AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. UniqueFormalParameters Contains SuperCalltrue である場合、true を返す。
  2. AsyncFunctionBody Contains SuperCall を返す。

15.4.3 Static Semantics: SpecialMethod

The syntax-directed operation SpecialMethod takes no arguments and returns ブール値. It is defined piecewise over the following productions:

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
  1. false を返す。
MethodDefinition : GeneratorMethod AsyncMethod AsyncGeneratorMethod get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. true を返す。

15.4.4 Runtime Semantics: DefineMethod

The syntax-directed operation DefineMethod takes argument object (Object) and optional argument functionPrototype (Object) and returns [[Key]] (property key) および [[Closure]] (ECMAScript 関数オブジェクト) フィールドを持つ Record を含む normal completion、または abrupt completion のいずれか. It is defined piecewise over the following productions:

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
  1. propertyKeyClassElementName の ? Evaluation とする。
  2. env を実行中の実行コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  4. functionPrototype が存在する場合、
    1. prototypefunctionPrototype とする。
  5. そうでなければ、
    1. prototype%Function.prototype% とする。
  6. sourceTextMethodDefinition に一致したソーステキストとする。
  7. closureOrdinaryFunctionCreate(prototype, sourceText, UniqueFormalParameters, FunctionBody, non-lexical-this, env, privateEnv) とする。
  8. MakeMethod(closure, object) を実行する。
  9. Record { [[Key]]: propertyKey, [[Closure]]: closure } を返す。

15.4.5 Runtime Semantics: MethodDefinitionEvaluation

The syntax-directed operation MethodDefinitionEvaluation takes arguments object (Object) and enumerable (Boolean) and returns PrivateElement または unused のいずれかを含む normal completion、または abrupt completion のいずれか. It is defined piecewise over the following productions:

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
  1. methodDef を、引数 objectMethodDefinition の ? DefineMethod とする。
  2. SetFunctionName(methodDef.[[Closure]], methodDef.[[Key]]) を実行する。
  3. DefineMethodProperty(object, methodDef.[[Key]], methodDef.[[Closure]], enumerable) を返す。
MethodDefinition : get ClassElementName ( ) { FunctionBody }
  1. propertyKeyClassElementName の ? Evaluation とする。
  2. env を実行中の実行コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  4. sourceTextMethodDefinition に一致したソーステキストとする。
  5. formalParameterList を生成規則 FormalParameters : [empty] のインスタンスとする。
  6. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, formalParameterList, FunctionBody, non-lexical-this, env, privateEnv) とする。
  7. MakeMethod(closure, object) を実行する。
  8. SetFunctionName(closure, propertyKey, "get") を実行する。
  9. propertyKeyPrivate Name である場合、
    1. PrivateElement { [[Key]]: propertyKey, [[Kind]]: accessor, [[Get]]: closure, [[Set]]: undefined } を返す。
  10. desc を PropertyDescriptor { [[Get]]: closure, [[Enumerable]]: enumerable, [[Configurable]]: true } とする。
  11. DefinePropertyOrThrow(object, propertyKey, desc) を実行する。
  12. unused を返す。
MethodDefinition : set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. propertyKeyClassElementName の ? Evaluation とする。
  2. env を実行中の実行コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  4. sourceTextMethodDefinition に一致したソーステキストとする。
  5. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, PropertySetParameterList, FunctionBody, non-lexical-this, env, privateEnv) とする。
  6. MakeMethod(closure, object) を実行する。
  7. SetFunctionName(closure, propertyKey, "set") を実行する。
  8. propertyKeyPrivate Name である場合、
    1. PrivateElement { [[Key]]: propertyKey, [[Kind]]: accessor, [[Get]]: undefined, [[Set]]: closure } を返す。
  9. desc を PropertyDescriptor { [[Set]]: closure, [[Enumerable]]: enumerable, [[Configurable]]: true } とする。
  10. DefinePropertyOrThrow(object, propertyKey, desc) を実行する。
  11. unused を返す。
GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }
  1. propertyKeyClassElementName の ? Evaluation とする。
  2. env を実行中の実行コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  4. sourceTextGeneratorMethod に一致したソーステキストとする。
  5. closureOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, UniqueFormalParameters, GeneratorBody, non-lexical-this, env, privateEnv) とする。
  6. MakeMethod(closure, object) を実行する。
  7. SetFunctionName(closure, propertyKey) を実行する。
  8. prototypeOrdinaryObjectCreate(%GeneratorPrototype%) とする。
  9. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  10. DefineMethodProperty(object, propertyKey, closure, enumerable) を返す。
AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. propertyKeyClassElementName の ? Evaluation とする。
  2. env を実行中の実行コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  4. sourceTextAsyncGeneratorMethod に一致したソーステキストとする。
  5. closureOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, UniqueFormalParameters, AsyncGeneratorBody, non-lexical-this, env, privateEnv) とする。
  6. MakeMethod(closure, object) を実行する。
  7. SetFunctionName(closure, propertyKey) を実行する。
  8. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%) とする。
  9. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  10. DefineMethodProperty(object, propertyKey, closure, enumerable) を返す。
AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. propertyKeyClassElementName の ? Evaluation とする。
  2. env を実行中の実行コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  4. sourceTextAsyncMethod に一致したソーステキストとする。
  5. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, UniqueFormalParameters, AsyncFunctionBody, non-lexical-this, env, privateEnv) とする。
  6. MakeMethod(closure, object) を実行する。
  7. SetFunctionName(closure, propertyKey) を実行する。
  8. DefineMethodProperty(object, 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] Note 1

yield の直後の構文コンテキストでは、InputElementRegExpOrTemplateTail 字句目標の使用が要求される。

Note 2

YieldExpression は、ジェネレータ関数の FormalParameters 内では使用できない。なぜなら、FormalParameters の一部である任意の式は、結果の Generator が再開可能状態になる前に評価されるからである。

Note 3

Generators に関係する抽象操作は 27.5.3 で定義される。

15.5.1 Static Semantics: 早期エラー

GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody } GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } function * ( FormalParameters ) { GeneratorBody } GeneratorExpression : function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody }

15.5.2 Runtime Semantics: EvaluateGeneratorBody

The syntax-directed operation EvaluateGeneratorBody takes arguments functionObject (ECMAScript 関数オブジェクト) and argumentsList (ECMAScript 言語値List) and returns throw 完了または return 完了. It is defined piecewise over the following productions:

GeneratorBody : FunctionBody
  1. FunctionDeclarationInstantiation(functionObject, argumentsList) を実行する。
  2. generator を ? OrdinaryCreateFromConstructor(functionObject, "%GeneratorPrototype%", « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] ») とする。
  3. generator.[[GeneratorBrand]]empty に設定する。
  4. generator.[[GeneratorState]]suspended-start に設定する。
  5. GeneratorStart(generator, FunctionBody) を実行する。
  6. ReturnCompletion(generator) を返す。

15.5.3 Runtime Semantics: InstantiateGeneratorFunctionObject

The syntax-directed operation InstantiateGeneratorFunctionObject takes arguments env (Environment Record) and privateEnv (PrivateEnvironment Record または null) and returns ECMAScript 関数オブジェクト. It is defined piecewise over the following productions:

GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody }
  1. nameBindingIdentifierStringValue とする。
  2. sourceTextGeneratorDeclaration に一致したソーステキストとする。
  3. closureOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, FormalParameters, GeneratorBody, non-lexical-this, env, privateEnv) とする。
  4. SetFunctionName(closure, name) を実行する。
  5. prototypeOrdinaryObjectCreate(%GeneratorPrototype%) とする。
  6. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  7. closure を返す。
GeneratorDeclaration : function * ( FormalParameters ) { GeneratorBody }
  1. sourceTextGeneratorDeclaration に一致したソーステキストとする。
  2. closureOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, FormalParameters, GeneratorBody, non-lexical-this, env, privateEnv) とする。
  3. SetFunctionName(closure, "default") を実行する。
  4. prototypeOrdinaryObjectCreate(%GeneratorPrototype%) とする。
  5. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  6. closure を返す。
Note

匿名 GeneratorDeclarationexport default 宣言の一部としてのみ現れることができ、その関数コードはしたがって常に strict mode コードである。

15.5.4 Runtime Semantics: InstantiateGeneratorFunctionExpression

The syntax-directed operation InstantiateGeneratorFunctionExpression takes optional argument name (property key または Private Name) and returns ECMAScript 関数オブジェクト. It is defined piecewise over the following productions:

GeneratorExpression : function * ( FormalParameters ) { GeneratorBody }
  1. name が存在しない場合、name を空の String に設定する。
  2. env を実行中の実行コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  4. sourceTextGeneratorExpression に一致したソーステキストとする。
  5. closureOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, FormalParameters, GeneratorBody, non-lexical-this, env, privateEnv) とする。
  6. SetFunctionName(closure, name) を実行する。
  7. prototypeOrdinaryObjectCreate(%GeneratorPrototype%) とする。
  8. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  9. closure を返す。
GeneratorExpression : function * BindingIdentifier ( FormalParameters ) { GeneratorBody }
  1. Assert: name は存在しない。
  2. nameBindingIdentifierStringValue に設定する。
  3. outerEnv を実行中の実行コンテキストの LexicalEnvironment とする。
  4. funcEnvNewDeclarativeEnvironment(outerEnv) とする。
  5. funcEnv.CreateImmutableBinding(name, false) を実行する。
  6. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  7. sourceTextGeneratorExpression に一致したソーステキストとする。
  8. closureOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, FormalParameters, GeneratorBody, non-lexical-this, funcEnv, privateEnv) とする。
  9. SetFunctionName(closure, name) を実行する。
  10. prototypeOrdinaryObjectCreate(%GeneratorPrototype%) とする。
  11. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  12. funcEnv.InitializeBinding(name, closure) を実行する。
  13. closure を返す。
Note

GeneratorExpression 内の BindingIdentifier は、ジェネレータコードが自身を再帰的に呼び出せるように、GeneratorExpressionFunctionBody 内から参照できる。しかし、GeneratorDeclaration の場合とは異なり、GeneratorExpression 内の BindingIdentifier は、GeneratorExpression を包含するスコープから参照できず、そのスコープに影響もしない。

15.5.5 Runtime Semantics: Evaluation

GeneratorExpression : function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody }
  1. GeneratorExpressionInstantiateGeneratorFunctionExpression を返す。
YieldExpression : yield
  1. Yield(undefined) を返す。
YieldExpression : yield AssignmentExpression
  1. exprRefAssignmentExpression の ? Evaluation とする。
  2. value を ? GetValue(exprRef) とする。
  3. Yield(value) を返す。
YieldExpression : yield * AssignmentExpression
  1. generatorKindGetGeneratorKind() とする。
  2. Assert: generatorKindsync または async のいずれかである。
  3. exprRefAssignmentExpression の ? Evaluation とする。
  4. value を ? GetValue(exprRef) とする。
  5. iteratorRecord を ? GetIterator(value, generatorKind) とする。
  6. iteratoriteratorRecord.[[Iterator]] とする。
  7. receivedNormalCompletion(undefined) とする。
  8. 繰り返し、
    1. receivednormal completion である場合、
      1. innerResult を ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « received.[[Value]] ») とする。
      2. generatorKindasync である場合、innerResult を ? Await(innerResult) に設定する。
      3. innerResult が Object でない場合、TypeError 例外を投げる。
      4. done を ? IteratorComplete(innerResult) とする。
      5. donetrue である場合、
        1. IteratorValue(innerResult) を返す。
      6. generatorKindasync である場合、receivedCompletion(AsyncGeneratorYield(? IteratorValue(innerResult))) に設定する。
      7. そうでなければ、receivedCompletion(GeneratorYield(innerResult)) に設定する。
    2. そうでなく、receivedthrow completion である場合、
      1. throw を ? GetMethod(iterator, "throw") とする。
      2. throwundefined でない場合、
        1. innerResult を ? Call(throw, iterator, « received.[[Value]] ») とする。
        2. generatorKindasync である場合、innerResult を ? Await(innerResult) に設定する。
        3. NOTE: 内側イテレータの throw メソッドからの例外は伝播される。内側の throw メソッドからの normal completion は、内側の next と同様に処理される。
        4. innerResult が Object でない場合、TypeError 例外を投げる。
        5. done を ? IteratorComplete(innerResult) とする。
        6. donetrue である場合、
          1. IteratorValue(innerResult) を返す。
        7. generatorKindasync である場合、receivedCompletion(AsyncGeneratorYield(? IteratorValue(innerResult))) に設定する。
        8. そうでなければ、receivedCompletion(GeneratorYield(innerResult)) に設定する。
      3. そうでなければ、
        1. NOTE: iteratorthrow メソッドを持たない場合、この throw は yield* ループを終了させる。しかし、その前に iterator にクリーンアップの機会を与える必要がある。
        2. closeCompletionNormalCompletion(empty) とする。
        3. generatorKindasync である場合、? AsyncIteratorClose(iteratorRecord, closeCompletion) を実行する。
        4. そうでなければ、? IteratorClose(iteratorRecord, closeCompletion) を実行する。
        5. NOTE: 次のステップは、iteratorthrow メソッドを持たないという yield* プロトコル違反を示すために TypeError を投げる。
        6. TypeError 例外を投げる。
    3. そうでなければ、
      1. Assert: receivedreturn completion である。
      2. return を ? GetMethod(iterator, "return") とする。
      3. returnundefined である場合、
        1. receivedValuereceived.[[Value]] とする。
        2. generatorKindasync である場合、
          1. receivedValue を ? Await(receivedValue) に設定する。
        3. ReturnCompletion(receivedValue) を返す。
      4. innerReturnResult を ? Call(return, iterator, « received.[[Value]] ») とする。
      5. generatorKindasync である場合、innerReturnResult を ? Await(innerReturnResult) に設定する。
      6. innerReturnResult が Object でない場合、TypeError 例外を投げる。
      7. done を ? IteratorComplete(innerReturnResult) とする。
      8. donetrue である場合、
        1. returnedValue を ? IteratorValue(innerReturnResult) とする。
        2. ReturnCompletion(returnedValue) を返す。
      9. generatorKindasync である場合、receivedCompletion(AsyncGeneratorYield(? IteratorValue(innerReturnResult))) に設定する。
      10. そうでなければ、receivedCompletion(GeneratorYield(innerReturnResult)) に設定する。

15.6 非同期ジェネレータ関数定義

構文

AsyncGeneratorDeclaration[Yield, Await, Default] : async [no LineTerminator here] function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } [+Default] async [no LineTerminator here] function * ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorExpression : async [no LineTerminator here] function * BindingIdentifier[+Yield, +Await]opt ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorMethod[Yield, Await] : async [no LineTerminator here] * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorBody : FunctionBody[+Yield, +Await] Note 1

YieldExpression および AwaitExpression は、非同期ジェネレータ関数の FormalParameters 内では使用できない。なぜなら、FormalParameters の一部である任意の式は、結果の AsyncGenerator が再開可能状態になる前に評価されるからである。

Note 2

AsyncGenerators に関係する抽象操作は 27.6.3 で定義される。

15.6.1 Static Semantics: 早期エラー

AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody } AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } async function * ( FormalParameters ) { AsyncGeneratorBody } AsyncGeneratorExpression : async function * BindingIdentifieropt ( FormalParameters ) { AsyncGeneratorBody }

15.6.2 Runtime Semantics: EvaluateAsyncGeneratorBody

The syntax-directed operation EvaluateAsyncGeneratorBody takes arguments functionObject (ECMAScript 関数オブジェクト) and argumentsList (ECMAScript 言語値List) and returns throw 完了または return 完了. It is defined piecewise over the following productions:

AsyncGeneratorBody : FunctionBody
  1. FunctionDeclarationInstantiation(functionObject, argumentsList) を実行する。
  2. generator を ? OrdinaryCreateFromConstructor(functionObject, "%AsyncGeneratorPrototype%", « [[AsyncGeneratorState]], [[AsyncGeneratorContext]], [[AsyncGeneratorQueue]], [[GeneratorBrand]] ») とする。
  3. generator.[[GeneratorBrand]]empty に設定する。
  4. generator.[[AsyncGeneratorState]]suspended-start に設定する。
  5. AsyncGeneratorStart(generator, FunctionBody) を実行する。
  6. ReturnCompletion(generator) を返す。

15.6.3 Runtime Semantics: InstantiateAsyncGeneratorFunctionObject

The syntax-directed operation InstantiateAsyncGeneratorFunctionObject takes arguments env (Environment Record) and privateEnv (PrivateEnvironment Record または null) and returns ECMAScript 関数オブジェクト. It is defined piecewise over the following productions:

AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }
  1. nameBindingIdentifierStringValue とする。
  2. sourceTextAsyncGeneratorDeclaration に一致したソーステキストとする。
  3. closureOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, env, privateEnv) とする。
  4. SetFunctionName(closure, name) を実行する。
  5. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%) とする。
  6. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  7. closure を返す。
AsyncGeneratorDeclaration : async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. sourceTextAsyncGeneratorDeclaration に一致したソーステキストとする。
  2. closureOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, env, privateEnv) とする。
  3. SetFunctionName(closure, "default") を実行する。
  4. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%) とする。
  5. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  6. closure を返す。
Note

匿名 AsyncGeneratorDeclaration は、export default 宣言の一部としてのみ現れることができる。

15.6.4 Runtime Semantics: InstantiateAsyncGeneratorFunctionExpression

The syntax-directed operation InstantiateAsyncGeneratorFunctionExpression takes optional argument name (property key または Private Name) and returns ECMAScript 関数オブジェクト. It is defined piecewise over the following productions:

AsyncGeneratorExpression : async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. name が存在しない場合、name を空の String に設定する。
  2. env を実行中の実行コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  4. sourceTextAsyncGeneratorExpression に一致したソーステキストとする。
  5. closureOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, env, privateEnv) とする。
  6. SetFunctionName(closure, name) を実行する。
  7. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%) とする。
  8. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  9. closure を返す。
AsyncGeneratorExpression : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }
  1. Assert: name は存在しない。
  2. nameBindingIdentifierStringValue に設定する。
  3. outerEnv を実行中の実行コンテキストの LexicalEnvironment とする。
  4. funcEnvNewDeclarativeEnvironment(outerEnv) とする。
  5. funcEnv.CreateImmutableBinding(name, false) を実行する。
  6. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  7. sourceTextAsyncGeneratorExpression に一致したソーステキストとする。
  8. closureOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, funcEnv, privateEnv) とする。
  9. SetFunctionName(closure, name) を実行する。
  10. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%) とする。
  11. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  12. funcEnv.InitializeBinding(name, closure) を実行する。
  13. closure を返す。
Note

AsyncGeneratorExpression 内の BindingIdentifier は、ジェネレータコードが自身を再帰的に呼び出せるように、AsyncGeneratorExpressionAsyncGeneratorBody 内から参照できる。しかし、AsyncGeneratorDeclaration の場合とは異なり、AsyncGeneratorExpression 内の BindingIdentifier は、AsyncGeneratorExpression を包含するスコープから参照できず、そのスコープに影響もしない。

15.6.5 Runtime Semantics: Evaluation

AsyncGeneratorExpression : async function * BindingIdentifieropt ( FormalParameters ) { AsyncGeneratorBody }
  1. AsyncGeneratorExpressionInstantiateAsyncGeneratorFunctionExpression を返す。

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 Note

クラス定義は常に strict mode コードである。

15.7.1 Static Semantics: 早期エラー

ClassTail : ClassHeritageopt { ClassBody }
  • ClassHeritage が存在せず、次のアルゴリズムが true を返す場合、これは構文エラーである:

    1. constructorClassBodyConstructorMethod とする。
    2. constructorempty である場合、false を返す。
    3. constructorHasDirectSuper を返す。
ClassBody : ClassElementList
  • ClassElementListPrototypePropertyNameList"constructor" の出現を複数含む場合、これは構文エラーである。
  • ClassElementListPrivateBoundIdentifiers が重複エントリを含む場合、これは構文エラーである。ただし、その名前が getter と setter にそれぞれ一度ずつ使用され、それ以外のエントリでは使用されず、かつ getter と setter がどちらも static であるか、どちらも非 static である場合を除く。
ClassElement : MethodDefinition ClassElement : static MethodDefinition ClassElement : FieldDefinition ; ClassElement : static FieldDefinition ;
  • FieldDefinitionPropName"prototype" または "constructor" のいずれかである場合、これは構文エラーである。
FieldDefinition : ClassElementName Initializeropt ClassElementName : PrivateIdentifier ClassStaticBlockBody : ClassStaticBlockStatementList

15.7.2 Static Semantics: ClassElementKind

The syntax-directed operation ClassElementKind takes no arguments and returns constructor-methodnon-constructor-method、または empty. It is defined piecewise over the following productions:

ClassElement : MethodDefinition
  1. MethodDefinitionPropName"constructor" である場合、constructor-method を返す。
  2. non-constructor-method を返す。
ClassElement : static MethodDefinition FieldDefinition ; static FieldDefinition ;
  1. non-constructor-method を返す。
ClassElement : ClassStaticBlock
  1. non-constructor-method を返す。
ClassElement : ;
  1. empty を返す。

15.7.3 Static Semantics: ConstructorMethod

The syntax-directed operation ConstructorMethod takes no arguments and returns ClassElement Parse Node または empty. It is defined piecewise over the following productions:

ClassElementList : ClassElement
  1. ClassElementClassElementKindconstructor-method である場合、ClassElement を返す。
  2. empty を返す。
ClassElementList : ClassElementList ClassElement
  1. headClassElementListConstructorMethod とする。
  2. headempty でない場合、head を返す。
  3. ClassElementClassElementKindconstructor-method である場合、ClassElement を返す。
  4. empty を返す。
Note

早期エラールールにより、"constructor" という名前のメソッド定義は一つだけであり、それがアクセサプロパティまたはジェネレータ定義ではないことが保証される。

15.7.4 Static Semantics: IsStatic

The syntax-directed operation IsStatic takes no arguments and returns ブール値. It is defined piecewise over the following productions:

ClassElement : MethodDefinition
  1. false を返す。
ClassElement : static MethodDefinition
  1. true を返す。
ClassElement : FieldDefinition ;
  1. false を返す。
ClassElement : static FieldDefinition ;
  1. true を返す。
ClassElement : ClassStaticBlock
  1. true を返す。
ClassElement : ;
  1. false を返す。

15.7.5 Static Semantics: NonConstructorElements

The syntax-directed operation NonConstructorElements takes no arguments and returns ClassElement Parse NodeList. It is defined piecewise over the following productions:

ClassElementList : ClassElement
  1. ClassElementClassElementKindnon-constructor-method である場合、
    1. « ClassElement » を返す。
  2. 新しい空の List を返す。
ClassElementList : ClassElementList ClassElement
  1. listClassElementListNonConstructorElements とする。
  2. ClassElementClassElementKindnon-constructor-method である場合、
    1. ClassElementlist に追加する。
  3. list を返す。

15.7.6 Static Semantics: PrototypePropertyNameList

The syntax-directed operation PrototypePropertyNameList takes no arguments and returns property keyList. It is defined piecewise over the following productions:

ClassElementList : ClassElement
  1. propNameClassElementPropName とする。
  2. propNameempty である場合、新しい空の List を返す。
  3. ClassElementIsStatictrue である場合、新しい空の List を返す。
  4. « propName » を返す。
ClassElementList : ClassElementList ClassElement
  1. listClassElementListPrototypePropertyNameList とする。
  2. propNameClassElementPropName とする。
  3. propNameempty である場合、list を返す。
  4. ClassElementIsStatictrue である場合、list を返す。
  5. list と « propName » の list-concatenation を返す。

15.7.7 Static Semantics: AllPrivateIdentifiersValid

The syntax-directed operation AllPrivateIdentifiersValid takes argument names (String の List) and returns ブール値.

この仕様において以下に列挙されていないすべての文法生成規則選択肢は、暗黙に AllPrivateIdentifiersValid の次のデフォルト定義を持つ:

  1. この Parse Node の各子ノード child について、次を行う。
    1. child が非終端記号のインスタンスである場合、
      1. 引数 names を伴う childAllPrivateIdentifiersValidfalse である場合、false を返す。
  2. true を返す。
MemberExpression : MemberExpression . PrivateIdentifier
  1. namesPrivateIdentifierStringValue を含む場合、
    1. 引数 names を伴う MemberExpressionAllPrivateIdentifiersValid を返す。
  2. false を返す。
CallExpression : CallExpression . PrivateIdentifier
  1. namesPrivateIdentifierStringValue を含む場合、
    1. 引数 names を伴う CallExpressionAllPrivateIdentifiersValid を返す。
  2. false を返す。
OptionalChain : ?. PrivateIdentifier
  1. namesPrivateIdentifierStringValue を含む場合、true を返す。
  2. false を返す。
OptionalChain : OptionalChain . PrivateIdentifier
  1. namesPrivateIdentifierStringValue を含む場合、
    1. 引数 names を伴う OptionalChainAllPrivateIdentifiersValid を返す。
  2. false を返す。
ClassBody : ClassElementList
  1. newNamesnamesClassBodyPrivateBoundIdentifierslist-concatenation とする。
  2. 引数 newNames を伴う ClassElementListAllPrivateIdentifiersValid を返す。
RelationalExpression : PrivateIdentifier in ShiftExpression
  1. namesPrivateIdentifierStringValue を含む場合、
    1. 引数 names を伴う ShiftExpressionAllPrivateIdentifiersValid を返す。
  2. false を返す。

15.7.8 Static Semantics: PrivateBoundIdentifiers

The syntax-directed operation PrivateBoundIdentifiers takes no arguments and returns String の List. It is defined piecewise over the following productions:

FieldDefinition : ClassElementName Initializeropt
  1. ClassElementNamePrivateBoundIdentifiers を返す。
ClassElementName : PrivateIdentifier
  1. PrivateIdentifierStringValue を唯一の要素とする List を返す。
ClassElementName : PropertyName ClassElement : ClassStaticBlock ;
  1. 新しい空の List を返す。
ClassElementList : ClassElementList ClassElement
  1. names1ClassElementListPrivateBoundIdentifiers とする。
  2. names2ClassElementPrivateBoundIdentifiers とする。
  3. names1names2list-concatenation を返す。
MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody } GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody } AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody } AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. ClassElementNamePrivateBoundIdentifiers を返す。

15.7.9 Static Semantics: ContainsArguments

The syntax-directed operation ContainsArguments takes no arguments and returns ブール値.

この仕様において以下に列挙されていないすべての文法生成規則選択肢は、暗黙に ContainsArguments の次のデフォルト定義を持つ:

  1. この Parse Node の各子ノード child について、次を行う。
    1. child が非終端記号のインスタンスである場合、
      1. childContainsArgumentstrue である場合、true を返す。
  2. false を返す。
IdentifierReference : Identifier
  1. IdentifierStringValue"arguments" である場合、true を返す。
  2. false を返す。
FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody } function ( FormalParameters ) { FunctionBody } FunctionExpression : function BindingIdentifieropt ( FormalParameters ) { FunctionBody } GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } function * ( FormalParameters ) { GeneratorBody } GeneratorExpression : function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody } AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } async function * ( FormalParameters ) { AsyncGeneratorBody } AsyncGeneratorExpression : async function * BindingIdentifieropt ( FormalParameters ) { AsyncGeneratorBody } AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } async function ( FormalParameters ) { AsyncFunctionBody } AsyncFunctionExpression : async function BindingIdentifieropt ( FormalParameters ) { AsyncFunctionBody }
  1. false を返す。
MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody } GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody } AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody } AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. ClassElementNameContainsArguments を返す。

15.7.10 Runtime Semantics: ClassFieldDefinitionEvaluation

The syntax-directed operation ClassFieldDefinitionEvaluation takes argument homeObject (Object) and returns ClassFieldDefinition Record を含む normal completion、または abrupt completion のいずれか. It is defined piecewise over the following productions:

FieldDefinition : ClassElementName Initializeropt
  1. nameClassElementName の ? Evaluation とする。
  2. Initializer が存在する場合、
    1. formalParameterList を生成規則 FormalParameters : [empty] のインスタンスとする。
    2. env を実行中の実行コンテキストの LexicalEnvironment とする。
    3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
    4. sourceText を Unicode 符号位置の空の列とする。
    5. initializerOrdinaryFunctionCreate(%Function.prototype%, sourceText, formalParameterList, Initializer, non-lexical-this, env, privateEnv) とする。
    6. MakeMethod(initializer, homeObject) を実行する。
    7. initializer.[[ClassFieldInitializerName]]name に設定する。
  3. そうでなければ、
    1. initializerempty とする。
  4. ClassFieldDefinition Record { [[Name]]: name, [[Initializer]]: initializer } を返す。
Note
initializer のために作成される関数は、ECMAScript コードから直接アクセス可能になることはない。

15.7.11 Runtime Semantics: ClassStaticBlockDefinitionEvaluation

The syntax-directed operation ClassStaticBlockDefinitionEvaluation takes argument homeObject (Object) and returns ClassStaticBlockDefinition Record. It is defined piecewise over the following productions:

ClassStaticBlock : static { ClassStaticBlockBody }
  1. lex を実行中の実行コンテキストの LexicalEnvironment とする。
  2. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  3. sourceText を Unicode 符号位置の空の列とする。
  4. formalParameters を生成規則 FormalParameters : [empty] のインスタンスとする。
  5. bodyFunctionOrdinaryFunctionCreate(%Function.prototype%, sourceText, formalParameters, ClassStaticBlockBody, non-lexical-this, lex, privateEnv) とする。
  6. MakeMethod(bodyFunction, homeObject) を実行する。
  7. ClassStaticBlockDefinition Record { [[BodyFunction]]: bodyFunction } を返す。
Note
関数 bodyFunction は、ECMAScript コードから直接アクセス可能になることはない。

15.7.12 Runtime Semantics: EvaluateClassStaticBlockBody

The syntax-directed operation EvaluateClassStaticBlockBody takes argument functionObject (ECMAScript 関数オブジェクト) and returns return 完了または throw 完了. It is defined piecewise over the following productions:

ClassStaticBlockBody : ClassStaticBlockStatementList
  1. Assert: functionObjectClassStaticBlockDefinitionEvaluation のステップ 5 によって作成された合成関数である。
  2. FunctionDeclarationInstantiation(functionObject, « ») を実行する。
  3. ClassStaticBlockStatementList の ? Evaluation を実行する。
  4. ReturnCompletion(undefined) を返す。

15.7.13 Runtime Semantics: ClassElementEvaluation

The syntax-directed operation ClassElementEvaluation takes argument object (Object) and returns ClassFieldDefinition RecordClassStaticBlockDefinition RecordPrivateElement、または unused のいずれかを含む normal completion、または abrupt completion のいずれか. It is defined piecewise over the following productions:

ClassElement : FieldDefinition ; static FieldDefinition ;
  1. 引数 object を伴う FieldDefinition の ? ClassFieldDefinitionEvaluation を返す。
ClassElement : MethodDefinition static MethodDefinition
  1. 引数 object および false を伴う MethodDefinition の ? MethodDefinitionEvaluation を返す。
ClassElement : ClassStaticBlock
  1. 引数 object を伴う ClassStaticBlockClassStaticBlockDefinitionEvaluation を返す。
ClassElement : ;
  1. unused を返す。

15.7.14 Runtime Semantics: ClassDefinitionEvaluation

The syntax-directed operation ClassDefinitionEvaluation takes arguments classBinding (String または undefined), className (property key または Private Name), and sourceText (ECMAScript ソーステキスト) and returns 関数オブジェクトを含む normal completion、または abrupt completion のいずれか.

Note

仕様を簡潔にするため、private メソッドおよびアクセサは、private フィールドとともに、クラスインスタンスの [[PrivateElements]] スロットに含まれる。しかし、任意のオブジェクトは、所与のクラスによって定義された private メソッドおよびアクセサのすべてを持つか、まったく持たないかのいずれかである。この機能は、実装が各メソッドまたはアクセサを個別に追跡する必要のない戦略を用いて private メソッドおよびアクセサを実装することを選択できるように設計されている。

例えば、実装はインスタンス private メソッドを対応する Private Name に直接関連付け、各オブジェクトについて、どのクラスコンストラクタがそのオブジェクトを this 値として実行されたかを追跡できる。その場合、オブジェクト上でインスタンス private メソッドを検索することは、そのメソッドを定義するクラスコンストラクタがそのオブジェクトを初期化するために使用されたことを確認し、その後 Private Name に関連付けられたメソッドを返すことから成る。

これは private フィールドとは異なる。フィールド初期化子はクラスのインスタンス化中に投げる可能性があるため、個々のオブジェクトは所与のクラスの private フィールドの適切な部分集合だけを持つ場合があり、したがって private フィールドは一般に個別に追跡されなければならない。

It is defined piecewise over the following productions:

ClassTail : ClassHeritageopt { ClassBodyopt }
  1. env を実行中の実行コンテキストの LexicalEnvironment とする。
  2. classEnvNewDeclarativeEnvironment(env) とする。
  3. classBindingundefined でない場合、
    1. classEnv.CreateImmutableBinding(classBinding, true) を実行する。
  4. outerPrivateEnvironment を実行中の実行コンテキストの PrivateEnvironment とする。
  5. classPrivateEnvironmentNewPrivateEnvironment(outerPrivateEnvironment) とする。
  6. ClassBody が存在する場合、
    1. ClassBodyPrivateBoundIdentifiers の各 String dn について、次を行う。
      1. classPrivateEnvironment.[[Names]] が、pn.[[Description]]dn である Private Name pn を含む場合、
        1. Assert: これは getter/setter ペアについてのみ可能である。
      2. そうでない場合、
        1. name を、[[Description]]dn である新しい Private Name とする。
        2. nameclassPrivateEnvironment.[[Names]] に追加する。
  7. ClassHeritage が存在しない場合、
    1. protoParent%Object.prototype% とする。
    2. constructorParent%Function.prototype% とする。
  8. そうでない場合、
    1. 実行中の実行コンテキストの LexicalEnvironment を classEnv に設定する。
    2. NOTE: ClassHeritage を評価するとき、実行中の実行コンテキストの PrivateEnvironment は outerPrivateEnvironment である。
    3. superclassRefClassHeritage の評価の Completion とする。
    4. 実行中の実行コンテキストの LexicalEnvironment を env に設定する。
    5. superclass を ? GetValue(? superclassRef) とする。
    6. superclassnull である場合、
      1. protoParentnull とする。
      2. constructorParent%Function.prototype% とする。
    7. そうでなく、IsConstructor(superclass) が false である場合、
      1. TypeError 例外を投げる。
    8. そうでない場合、
      1. protoParent を ? Get(superclass, "prototype") とする。
      2. protoParent が Object でなく、かつ protoParentnull でない場合、TypeError 例外を投げる。
      3. constructorParentsuperclass とする。
  9. protoOrdinaryObjectCreate(protoParent) とする。
  10. ClassBody が存在しない場合、constructorempty とする。
  11. そうでない場合、constructorClassBodyConstructorMethod とする。
  12. 実行中の実行コンテキストの LexicalEnvironment を classEnv に設定する。
  13. 実行中の実行コンテキストの PrivateEnvironment を classPrivateEnvironment に設定する。
  14. constructorempty である場合、
    1. defaultConstructor を、パラメータを持たず、何もキャプチャせず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
      1. args を、[[Call]] または [[Construct]] によりこの関数に渡された引数の List とする。
      2. NewTarget が undefined である場合、TypeError 例外を投げる。
      3. constructorFunction を現在アクティブな関数オブジェクトとする。
      4. constructorFunction.[[ConstructorKind]]derived である場合、
        1. NOTE: この分岐は constructor(...args) { super(...args); } と同様に振る舞う。最も注目すべき相違点は、前述の ECMAScript ソーステキスト%Array.prototype% 上の %Symbol.iterator% メソッドを観測可能に呼び出す一方で、この関数はそれを行わないことである。
        2. func を ! constructorFunction.[[GetPrototypeOf]]() とする。
        3. IsConstructor(func) が false である場合、TypeError 例外を投げる。
        4. result を ? Construct(func, args, NewTarget) とする。
      5. そうでない場合、
        1. NOTE: この分岐は constructor() {} と同様に振る舞う。
        2. result を ? OrdinaryCreateFromConstructor(NewTarget, "%Object.prototype%") とする。
      6. InitializeInstanceElements(result, constructorFunction) を実行する。
      7. NormalCompletion(result) を返す。
    2. constructorFunctionCreateBuiltinFunction(defaultConstructor, 0, className, « [[ConstructorKind]], [[SourceText]], [[PrivateMethods]], [[Fields]] », the current Realm Record, constructorParent) とする。
  15. そうでない場合、
    1. constructorInfo を、引数 proto および constructorParent での constructor の ! DefineMethod とする。
    2. constructorFunctionconstructorInfo.[[Closure]] とする。
    3. MakeClassConstructor(constructorFunction) を実行する。
    4. SetFunctionName(constructorFunction, className) を実行する。
  16. constructorFunction.[[SourceText]]sourceText に設定する。
  17. MakeConstructor(constructorFunction, false, proto) を実行する。
  18. ClassHeritage が存在する場合、constructorFunction.[[ConstructorKind]]derived に設定する。
  19. DefineMethodProperty(proto, "constructor", constructorFunction, false) を実行する。
  20. ClassBody が存在しない場合、elements を新しい空の List とする。
  21. そうでない場合、elementsClassBodyNonConstructorElements とする。
  22. instancePrivateMethods を新しい空の List とする。
  23. staticPrivateMethods を新しい空の List とする。
  24. instanceFields を新しい空の List とする。
  25. staticElements を新しい空の List とする。
  26. elements の各 ClassElement e について、次を行う。
    1. eIsStaticfalse である場合、
      1. element を、引数 proto での eClassElementEvaluationCompletion とする。
    2. そうでない場合、
      1. element を、引数 constructorFunction での eClassElementEvaluationCompletion とする。
    3. elementabrupt completion である場合、
      1. 実行中の実行コンテキストの LexicalEnvironment を env に設定する。
      2. 実行中の実行コンテキストの PrivateEnvironment を outerPrivateEnvironment に設定する。
      3. element を返す。
    4. element を ! element に設定する。
    5. elementPrivateElement である場合、
      1. Assert: element.[[Kind]]method または accessor のどちらかである。
      2. eIsStaticfalse である場合、containerinstancePrivateMethods とする。
      3. そうでない場合、containerstaticPrivateMethods とする。
      4. container が、pe.[[Key]]element.[[Key]] である PrivateElement pe を含む場合、
        1. Assert: element.[[Kind]]pe.[[Kind]] はともに accessor である。
        2. element.[[Get]]undefined である場合、
          1. combinedPrivateElement { [[Key]]: element.[[Key]], [[Kind]]: accessor, [[Get]]: pe.[[Get]], [[Set]]: element.[[Set]] } とする。
        3. そうでない場合、
          1. combinedPrivateElement { [[Key]]: element.[[Key]], [[Kind]]: accessor, [[Get]]: element.[[Get]], [[Set]]: pe.[[Set]] } とする。
        4. container 内の pecombined で置き換える。
      5. そうでない場合、
        1. elementcontainer に追加する。
    6. そうでなく、elementClassFieldDefinition Record である場合、
      1. eIsStaticfalse である場合、elementinstanceFields に追加する。
      2. そうでない場合、elementstaticElements に追加する。
    7. そうでなく、elementClassStaticBlockDefinition Record である場合、
      1. elementstaticElements に追加する。
  27. 実行中の実行コンテキストの LexicalEnvironment を env に設定する。
  28. classBindingundefined でない場合、
    1. classEnv.InitializeBinding(classBinding, constructorFunction) を実行する。
  29. constructorFunction.[[PrivateMethods]]instancePrivateMethods に設定する。
  30. constructorFunction.[[Fields]]instanceFields に設定する。
  31. staticPrivateMethods の各 PrivateElement method について、次を行う。
    1. PrivateMethodOrAccessorAdd(constructorFunction, method) を実行する。
  32. staticElements の各要素 elementRecord について、次を行う。
    1. elementRecordClassFieldDefinition Record である場合、
      1. resultCompletion(DefineField(constructorFunction, elementRecord)) とする。
    2. そうでない場合、
      1. Assert: elementRecordClassStaticBlockDefinition Record である。
      2. resultCompletion(Call(elementRecord.[[BodyFunction]], constructorFunction)) とする。
    3. resultabrupt completion である場合、
      1. 実行中の実行コンテキストの PrivateEnvironment を outerPrivateEnvironment に設定する。
      2. result を返す。
  33. 実行中の実行コンテキストの PrivateEnvironment を outerPrivateEnvironment に設定する。
  34. constructorFunction を返す。

15.7.15 Runtime Semantics: BindingClassDeclarationEvaluation

The syntax-directed operation BindingClassDeclarationEvaluation takes no arguments and returns 関数オブジェクトを含む normal completion、または abrupt completion のいずれか. It is defined piecewise over the following productions:

ClassDeclaration : class BindingIdentifier ClassTail
  1. classNameBindingIdentifierStringValue とする。
  2. sourceTextClassDeclaration に一致したソーステキストとする。
  3. value を、引数 classNameclassName、および sourceText を伴う ClassTail の ? ClassDefinitionEvaluation とする。
  4. env を実行中の実行コンテキストの LexicalEnvironment とする。
  5. InitializeBoundName(className, value, env) を実行する。
  6. value を返す。
ClassDeclaration : class ClassTail
  1. sourceTextClassDeclaration に一致したソーステキストとする。
  2. 引数 undefined"default"、および sourceText を伴う ClassTail の ? ClassDefinitionEvaluation を返す。
Note

ClassDeclaration : class ClassTail ExportDeclaration の一部としてのみ現れ、その束縛の確立は当該生成規則の評価アクションの一部として扱われる。16.2.3.7 を参照。

15.7.16 Runtime Semantics: Evaluation

ClassDeclaration : class BindingIdentifier ClassTail
  1. この ClassDeclaration の ? BindingClassDeclarationEvaluation を実行する。
  2. empty を返す。
Note

ClassDeclaration : class ClassTail ExportDeclaration の一部としてのみ現れ、直接評価されることはない。

ClassExpression : class ClassTail
  1. sourceTextClassExpression に一致したソーステキストとする。
  2. 引数 undefined、空の String、および sourceText を伴う ClassTail の ? ClassDefinitionEvaluation を返す。
ClassExpression : class BindingIdentifier ClassTail
  1. classNameBindingIdentifierStringValue とする。
  2. sourceTextClassExpression に一致したソーステキストとする。
  3. 引数 classNameclassName、および sourceText を伴う ClassTail の ? ClassDefinitionEvaluation を返す。
ClassElementName : PrivateIdentifier
  1. privateIdentifierPrivateIdentifierStringValue とする。
  2. privateEnvRec を実行中の実行コンテキストの PrivateEnvironment とする。
  3. namesprivateEnvRec.[[Names]] とする。
  4. Assert: names のうち正確に一つの要素が、[[Description]]privateIdentifier である Private Name である。
  5. privateName を、[[Description]]privateIdentifier である names 内の Private Name とする。
  6. privateName を返す。
ClassStaticBlockStatementList : [empty]
  1. undefined を返す。

15.8 非同期関数定義

構文

AsyncFunctionDeclaration[Yield, Await, Default] : async [no LineTerminator here] function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } [+Default] async [no LineTerminator here] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionExpression : async [no LineTerminator here] function BindingIdentifier[~Yield, +Await]opt ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncMethod[Yield, Await] : async [no LineTerminator here] ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionBody : FunctionBody[~Yield, +Await] AwaitExpression[Yield] : await UnaryExpression[?Yield, +Await] Note 1

[Await] パラメータが存在するとき、awaitAwaitExpression のキーワードとして解析される。[Await] パラメータは、次のコンテキストのトップレベルに存在する。ただし、FunctionBody などの非終端記号によっては、一部のコンテキストでこのパラメータが存在しない場合がある:

Script が構文目標記号であるとき、[Await] パラメータが存在しない場合、await は識別子として解析されてもよい。これには次のコンテキストが含まれる:

Note 2

YieldExpression とは異なり、AwaitExpression のオペランドを省略することは構文エラーである。何らかのものを await しなければならない。

15.8.1 Static Semantics: 早期エラー

AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody } AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } async function ( FormalParameters ) { AsyncFunctionBody } AsyncFunctionExpression : async function BindingIdentifieropt ( FormalParameters ) { AsyncFunctionBody }

15.8.2 Runtime Semantics: InstantiateAsyncFunctionObject

The syntax-directed operation InstantiateAsyncFunctionObject takes arguments env (Environment Record) and privateEnv (PrivateEnvironment Record または null) and returns ECMAScript 関数オブジェクト. It is defined piecewise over the following productions:

AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
  1. nameBindingIdentifierStringValue とする。
  2. sourceTextAsyncFunctionDeclaration に一致したソーステキストとする。
  3. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, env, privateEnv) とする。
  4. SetFunctionName(closure, name) を実行する。
  5. closure を返す。
AsyncFunctionDeclaration : async function ( FormalParameters ) { AsyncFunctionBody }
  1. sourceTextAsyncFunctionDeclaration に一致したソーステキストとする。
  2. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, env, privateEnv) とする。
  3. SetFunctionName(closure, "default") を実行する。
  4. closure を返す。

15.8.3 Runtime Semantics: InstantiateAsyncFunctionExpression

The syntax-directed operation InstantiateAsyncFunctionExpression takes optional argument name (property key または Private Name) and returns ECMAScript 関数オブジェクト. It is defined piecewise over the following productions:

AsyncFunctionExpression : async function ( FormalParameters ) { AsyncFunctionBody }
  1. name が存在しない場合、name を空の String に設定する。
  2. env を実行中の実行コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  4. sourceTextAsyncFunctionExpression に一致したソーステキストとする。
  5. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, env, privateEnv) とする。
  6. SetFunctionName(closure, name) を実行する。
  7. closure を返す。
AsyncFunctionExpression : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
  1. Assert: name は存在しない。
  2. nameBindingIdentifierStringValue に設定する。
  3. outerEnv を実行中の実行コンテキストの LexicalEnvironment とする。
  4. funcEnvNewDeclarativeEnvironment(outerEnv) とする。
  5. funcEnv.CreateImmutableBinding(name, false) を実行する。
  6. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  7. sourceTextAsyncFunctionExpression に一致したソーステキストとする。
  8. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, funcEnv, privateEnv) とする。
  9. SetFunctionName(closure, name) を実行する。
  10. funcEnv.InitializeBinding(name, closure) を実行する。
  11. closure を返す。
Note

AsyncFunctionExpression 内の BindingIdentifier は、関数が自身を再帰的に呼び出せるように、AsyncFunctionExpressionAsyncFunctionBody 内から参照できる。しかし、FunctionDeclaration の場合とは異なり、AsyncFunctionExpression 内の BindingIdentifier は、AsyncFunctionExpression を包含するスコープから参照できず、そのスコープに影響もしない。

15.8.4 Runtime Semantics: EvaluateAsyncFunctionBody

The syntax-directed operation EvaluateAsyncFunctionBody takes arguments functionObject (ECMAScript 関数オブジェクト) and argumentsList (ECMAScript 言語値List) and returns return 完了. It is defined piecewise over the following productions:

AsyncFunctionBody : FunctionBody
  1. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  2. completionCompletion(FunctionDeclarationInstantiation(functionObject, argumentsList)) とする。
  3. completionabrupt completion である場合、
    1. Call(promiseCapability.[[Reject]], undefined, « completion.[[Value]] ») を実行する。
  4. そうでなければ、
    1. AsyncFunctionStart(promiseCapability, FunctionBody) を実行する。
  5. ReturnCompletion(promiseCapability.[[Promise]]) を返す。

15.8.5 Runtime Semantics: Evaluation

AsyncFunctionExpression : async function BindingIdentifieropt ( FormalParameters ) { AsyncFunctionBody }
  1. AsyncFunctionExpressionInstantiateAsyncFunctionExpression を返す。
AwaitExpression : await UnaryExpression
  1. exprRefUnaryExpression の ? Evaluation とする。
  2. value を ? GetValue(exprRef) とする。
  3. Await(value) を返す。

15.9 非同期アロー関数定義

構文

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

The syntax-directed operation AsyncConciseBodyContainsUseStrict takes no arguments and returns ブール値. It is defined piecewise over the following productions:

AsyncConciseBody : ExpressionBody
  1. false を返す。
AsyncConciseBody : { AsyncFunctionBody }
  1. AsyncFunctionBodyFunctionBodyContainsUseStrict を返す。

15.9.3 Runtime Semantics: EvaluateAsyncConciseBody

The syntax-directed operation EvaluateAsyncConciseBody takes arguments functionObject (ECMAScript 関数オブジェクト) and argumentsList (ECMAScript 言語値List) and returns return 完了. It is defined piecewise over the following productions:

AsyncConciseBody : ExpressionBody
  1. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  2. completionCompletion(FunctionDeclarationInstantiation(functionObject, argumentsList)) とする。
  3. completionabrupt completion である場合、
    1. Call(promiseCapability.[[Reject]], undefined, « completion.[[Value]] ») を実行する。
  4. そうでなければ、
    1. AsyncFunctionStart(promiseCapability, ExpressionBody) を実行する。
  5. ReturnCompletion(promiseCapability.[[Promise]]) を返す。

15.9.4 Runtime Semantics: InstantiateAsyncArrowFunctionExpression

The syntax-directed operation InstantiateAsyncArrowFunctionExpression takes optional argument name (property key または Private Name) and returns ECMAScript 関数オブジェクト. It is defined piecewise over the following productions:

AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody
  1. name が存在しない場合、name を空の String に設定する。
  2. env を実行中の実行コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  4. sourceTextAsyncArrowFunction に一致したソーステキストとする。
  5. parametersAsyncArrowBindingIdentifier とする。
  6. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, parameters, AsyncConciseBody, lexical-this, env, privateEnv) とする。
  7. SetFunctionName(closure, name) を実行する。
  8. closure を返す。
AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
  1. name が存在しない場合、name を空の String に設定する。
  2. env を実行中の実行コンテキストの LexicalEnvironment とする。
  3. privateEnv を実行中の実行コンテキストの PrivateEnvironment とする。
  4. sourceTextAsyncArrowFunction に一致したソーステキストとする。
  5. head を、CoverCallExpressionAndAsyncArrowHead によってカバーされる AsyncArrowHead とする。
  6. parametersheadArrowFormalParameters とする。
  7. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, parameters, AsyncConciseBody, lexical-this, env, privateEnv) とする。
  8. SetFunctionName(closure, name) を実行する。
  9. closure を返す。

15.9.5 Runtime Semantics: Evaluation

AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
  1. AsyncArrowFunctionInstantiateAsyncArrowFunctionExpression を返す。

15.10 末尾位置呼び出し

15.10.1 Static Semantics: IsInTailPosition ( call )

The abstract operation IsInTailPosition takes argument call (CallExpression Parse NodeMemberExpression Parse Node、または OptionalChain Parse Node) and returns ブール値. It performs the following steps when called:

  1. IsStrict(call) が false である場合、false を返す。
  2. callFunctionBodyConciseBody、または AsyncConciseBody 内に含まれていない場合、false を返す。
  3. body を、call を最も近く含む FunctionBodyConciseBody、または AsyncConciseBody とする。
  4. bodyGeneratorBodyFunctionBody である場合、false を返す。
  5. bodyAsyncFunctionBodyFunctionBody である場合、false を返す。
  6. bodyAsyncGeneratorBodyFunctionBody である場合、false を返す。
  7. bodyAsyncConciseBody である場合、false を返す。
  8. 引数 call を伴う bodyHasCallInTailPosition の結果を返す。
Note

末尾位置呼び出しは、呼び出し元コンテキストの連鎖の観測を可能にする一般的な非標準言語拡張(10.2.4 参照)のため、strict mode コードでのみ定義される。

15.10.2 Static Semantics: HasCallInTailPosition

The syntax-directed operation HasCallInTailPosition takes argument call (CallExpression Parse NodeMemberExpression Parse Node、または OptionalChain Parse Node) and returns ブール値.

Note 1

call は、ソーステキストの特定の範囲を表す Parse Node である。以下のアルゴリズムが call を別の Parse Node と比較するとき、それはそれらが同じソーステキストを表すかどうかのテストである。

Note 2

呼び出し結果の GetValue を返す処理が直後に続く潜在的な末尾位置呼び出しも、末尾位置呼び出しであり得る。関数呼び出しは Reference Record を返せないため、そのような GetValue 操作は常に実際の関数呼び出し結果と同じ値を返す。

It is defined piecewise over the following productions:

StatementList : StatementList StatementListItem
  1. has を、引数 call を伴う StatementListHasCallInTailPosition とする。
  2. hastrue である場合、true を返す。
  3. 引数 call を伴う StatementListItemHasCallInTailPosition を返す。
FunctionStatementList : [empty] StatementListItem : Declaration Statement : VariableStatement EmptyStatement ExpressionStatement ContinueStatement BreakStatement ThrowStatement DebuggerStatement Block : { } ReturnStatement : return ; LabelledItem : FunctionDeclaration ForInOfStatement : for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement CaseBlock : { }
  1. false を返す。
IfStatement : if ( Expression ) Statement else Statement
  1. has を、引数 call を伴う最初の StatementHasCallInTailPosition とする。
  2. hastrue である場合、true を返す。
  3. 引数 call を伴う 2 番目の StatementHasCallInTailPosition を返す。
IfStatement : if ( Expression ) Statement DoWhileStatement : do Statement while ( Expression ) ; WhileStatement : while ( Expression ) Statement ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( var ForBinding in Expression ) Statement for ( ForDeclaration in Expression ) Statement WithStatement : with ( Expression ) Statement
  1. 引数 call を伴う StatementHasCallInTailPosition を返す。
LabelledStatement : LabelIdentifier : LabelledItem
  1. 引数 call を伴う LabelledItemHasCallInTailPosition を返す。
ReturnStatement : return Expression ;
  1. 引数 call を伴う ExpressionHasCallInTailPosition を返す。
SwitchStatement : switch ( Expression ) CaseBlock
  1. 引数 call を伴う CaseBlockHasCallInTailPosition を返す。
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. hasfalse とする。
  2. 最初の CaseClauses が存在する場合、has を引数 call を伴う最初の CaseClausesHasCallInTailPosition に設定する。
  3. hastrue である場合、true を返す。
  4. has を、引数 call を伴う DefaultClauseHasCallInTailPosition に設定する。
  5. hastrue である場合、true を返す。
  6. 2 番目の CaseClauses が存在する場合、has を引数 call を伴う 2 番目の CaseClausesHasCallInTailPosition に設定する。
  7. has を返す。
CaseClauses : CaseClauses CaseClause
  1. has を、引数 call を伴う CaseClausesHasCallInTailPosition とする。
  2. hastrue である場合、true を返す。
  3. 引数 call を伴う CaseClauseHasCallInTailPosition を返す。
CaseClause : case Expression : StatementListopt DefaultClause : default : StatementListopt
  1. StatementList が存在する場合、引数 call を伴う StatementListHasCallInTailPosition を返す。
  2. false を返す。
TryStatement : try Block Catch
  1. 引数 call を伴う CatchHasCallInTailPosition を返す。
TryStatement : try Block Finally try Block Catch Finally
  1. 引数 call を伴う FinallyHasCallInTailPosition を返す。
Catch : catch ( CatchParameter ) Block
  1. 引数 call を伴う BlockHasCallInTailPosition を返す。
AssignmentExpression : YieldExpression ArrowFunction AsyncArrowFunction LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression LeftHandSideExpression &&= AssignmentExpression LeftHandSideExpression ||= AssignmentExpression LeftHandSideExpression ??= AssignmentExpression BitwiseANDExpression : BitwiseANDExpression & EqualityExpression BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression EqualityExpression : EqualityExpression == RelationalExpression EqualityExpression != RelationalExpression EqualityExpression === RelationalExpression EqualityExpression !== RelationalExpression RelationalExpression : RelationalExpression < ShiftExpression RelationalExpression > ShiftExpression RelationalExpression <= ShiftExpression RelationalExpression >= ShiftExpression RelationalExpression instanceof ShiftExpression RelationalExpression in ShiftExpression PrivateIdentifier in ShiftExpression ShiftExpression : ShiftExpression << AdditiveExpression ShiftExpression >> AdditiveExpression ShiftExpression >>> AdditiveExpression AdditiveExpression : AdditiveExpression + MultiplicativeExpression AdditiveExpression - MultiplicativeExpression MultiplicativeExpression : MultiplicativeExpression MultiplicativeOperator ExponentiationExpression ExponentiationExpression : UpdateExpression ** ExponentiationExpression UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- ++ UnaryExpression -- UnaryExpression UnaryExpression : delete UnaryExpression void UnaryExpression typeof UnaryExpression + UnaryExpression - UnaryExpression ~ UnaryExpression ! UnaryExpression AwaitExpression CallExpression : SuperCall ImportCall CallExpression [ Expression ] CallExpression . IdentifierName CallExpression . PrivateIdentifier NewExpression : new NewExpression MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName SuperProperty MetaProperty new MemberExpression Arguments MemberExpression . PrivateIdentifier PrimaryExpression : this IdentifierReference Literal ArrayLiteral ObjectLiteral FunctionExpression ClassExpression GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral
  1. false を返す。
Expression : AssignmentExpression Expression , AssignmentExpression
  1. 引数 call を伴う AssignmentExpressionHasCallInTailPosition を返す。
ConditionalExpression : ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
  1. has を、引数 call を伴う最初の AssignmentExpressionHasCallInTailPosition とする。
  2. hastrue である場合、true を返す。
  3. 引数 call を伴う 2 番目の AssignmentExpressionHasCallInTailPosition を返す。
LogicalANDExpression : LogicalANDExpression && BitwiseORExpression
  1. 引数 call を伴う BitwiseORExpressionHasCallInTailPosition を返す。
LogicalORExpression : LogicalORExpression || LogicalANDExpression
  1. 引数 call を伴う LogicalANDExpressionHasCallInTailPosition を返す。
CoalesceExpression : CoalesceExpressionHead ?? BitwiseORExpression
  1. 引数 call を伴う BitwiseORExpressionHasCallInTailPosition を返す。
CallExpression : CoverCallExpressionAndAsyncArrowHead CallExpression Arguments CallExpression TemplateLiteral
  1. この CallExpressioncall である場合、true を返す。
  2. false を返す。
OptionalExpression : MemberExpression OptionalChain CallExpression OptionalChain OptionalExpression OptionalChain
  1. 引数 call を伴う OptionalChainHasCallInTailPosition を返す。
OptionalChain : ?. [ Expression ] ?. IdentifierName ?. PrivateIdentifier OptionalChain [ Expression ] OptionalChain . IdentifierName OptionalChain . PrivateIdentifier
  1. false を返す。
OptionalChain : ?. Arguments OptionalChain Arguments
  1. この OptionalChaincall である場合、true を返す。
  2. false を返す。
MemberExpression : MemberExpression TemplateLiteral
  1. この MemberExpressioncall である場合、true を返す。
  2. false を返す。
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprCoverParenthesizedExpressionAndArrowParameterList によってカバーされる ParenthesizedExpression とする。
  2. 引数 call を伴う exprHasCallInTailPosition を返す。
ParenthesizedExpression : ( Expression )
  1. 引数 call を伴う ExpressionHasCallInTailPosition を返す。

15.10.3 PrepareForTailCall ( )

The abstract operation PrepareForTailCall takes no arguments and returns unused. It performs the following steps when called:

  1. Assert: 現在の実行コンテキストは、その後 ECMAScript コードまたは組込み関数の評価に使用されない。この抽象操作の呼び出しに続く Call の呼び出しは、そのような評価を実行する前に新しい実行コンテキストを作成して push する。
  2. 現在の実行コンテキストに関連付けられたすべてのリソースを破棄する。
  3. unused を返す。

末尾位置呼び出しは、ターゲット関数を呼び出す前に、現在実行中の関数実行コンテキストに関連付けられた一時的な内部リソースを解放するか、ターゲット関数を支援するためにそれらのリソースを再利用しなければならない。

Note

例えば、末尾位置呼び出しは、ターゲット関数のアクティベーションレコードのサイズが呼び出し元関数のアクティベーションレコードのサイズを超える分だけ、実装のアクティベーションレコードスタックを増加させるべきである。ターゲット関数のアクティベーションレコードがより小さい場合、スタックの合計サイズは減少するべきである。

16 ECMAScript言語:スクリプトとモジュール

16.1 スクリプト

構文

Script : ScriptBodyopt ScriptBody : StatementList[~Yield, ~Await, ~Return]

16.1.1 Static Semantics: 早期エラー

Script : ScriptBody ScriptBody : StatementList

16.1.2 Static Semantics: ScriptIsStrict

The syntax-directed operation ScriptIsStrict takes no arguments and returns Boolean. It is defined piecewise over the following productions:

Script : ScriptBodyopt
  1. ScriptBody が存在し、かつその Directive PrologueUse Strict Directive が含まれている場合、true を返す。
  2. false を返す。

16.1.3 Runtime Semantics: Evaluation

Script : [empty]
  1. undefined を返す。

16.1.4 スクリプトレコード

スクリプトレコードは、評価されるスクリプトに関する情報をカプセル化する。各スクリプトレコードTable 34 に示されるフィールドを含む。

Table 34: スクリプトレコードのフィールド
フィールド名 値の型 意味
[[Realm]] Realm レコード このスクリプトが生成された Realm
[[ECMAScriptCode]] Script パースノード このスクリプトのソーステキストを解析した結果。
[[LoadedModules]] LoadedModuleRequest レコードのリスト このスクリプトによってインポートされた指定子文字列から解決済み Module Record へのマップ。このリストには ModuleRequestsEqual(r1, r2) が true となる異なるレコード r1r2 の組は含まれない。
[[HostDefined]] 任意(デフォルト値は empty ホスト環境がスクリプトに追加情報を関連付けるために予約されたフィールド。

16.1.5 ParseScript ( sourceText, realm, hostDefined )

The abstract operation ParseScript takes arguments sourceText (ECMAScript ソーステキスト), realm (Realm レコード), and hostDefined (任意) and returns Script Record または空でない SyntaxError オブジェクトのリスト. sourceTextScript として解析した結果に基づいて Script Record を生成する。 It performs the following steps when called:

  1. scriptParseText(sourceText, Script) とする。
  2. script がエラーのリストである場合、それを返す。
  3. Script Record { [[Realm]]: realm, [[ECMAScriptCode]]: script, [[LoadedModules]]: « », [[HostDefined]]: hostDefined } を返す。
Note

実装はスクリプトソーステキストを事前に解析し、ParseScript の評価前に Early Error 条件を検査してもよい。ただし、エラーの報告はこの仕様が実際にそのソーステキストに対して ParseScript を実行する時点まで遅延されなければならない。

16.1.6 ScriptEvaluation ( scriptRecord )

The abstract operation ScriptEvaluation takes argument scriptRecord (Script Record) and returns ECMAScript の値を含む通常完了または異常完了. It performs the following steps when called:

  1. globalEnvscriptRecord.[[Realm]].[[GlobalEnv]] とする。
  2. scriptContext を新しい ECMAScript コード実行コンテキストとする。
  3. scriptContext の Function を null に設定する。
  4. scriptContextRealmscriptRecord.[[Realm]] に設定する。
  5. scriptContext の ScriptOrModule を scriptRecord に設定する。
  6. scriptContext の VariableEnvironment を globalEnv に設定する。
  7. scriptContext の LexicalEnvironment を globalEnv に設定する。
  8. scriptContext の PrivateEnvironment を null に設定する。
  9. 実行中の実行コンテキストを一時停止する。
  10. scriptContext を実行コンテキストスタックにプッシュする;これが現在の実行コンテキストとなる。
  11. scriptscriptRecord.[[ECMAScriptCode]] とする。
  12. resultCompletion(GlobalDeclarationInstantiation(script, globalEnv)) とする。
  13. result が通常完了である場合、
    1. resultCompletion(scriptEvaluation) に設定する。
    2. result が通常完了であり、かつ result.[[Value]]empty の場合、
      1. resultNormalCompletion(undefined) に設定する。
  14. scriptContext を一時停止し、実行コンテキストスタックから削除する。
  15. Assert: 実行コンテキストスタックは空でない。
  16. スタックの最上位のコンテキストを再開し、それを現在の実行コンテキストとする。
  17. result を返す。

16.1.7 GlobalDeclarationInstantiation ( script, env )

The abstract operation GlobalDeclarationInstantiation takes arguments script (Script パースノード) and env (グローバル環境レコード) and returns 通常完了(unused)または throw 完了. script は実行コンテキストが確立される対象の Scriptenv はバインディングが作成されるグローバル環境である。

Note 1

スクリプト評価のための実行コンテキストが確立されるとき、宣言は現在のグローバル環境にインスタンス化される。コード内で宣言されたすべてのグローバルバインディングがインスタンス化される。

この操作は以下の手順を実行する:

  1. lexNamesscriptLexicallyDeclaredNames とする。
  2. varNamesscriptVarDeclaredNames とする。
  3. lexNames の各要素 name について、次を行う。
    1. HasLexicalDeclaration(env, name) が true である場合、SyntaxError 例外を投げる。
    2. hasRestrictedGlobal を ? HasRestrictedGlobalProperty(env, name) とする。
    3. NOTE: グローバル var および function 束縛(非 strict の direct eval によって導入されるものを除く)は構成不可であり、したがって制限されたグローバルプロパティである。
    4. hasRestrictedGlobaltrue である場合、SyntaxError 例外を投げる。
  4. varNames の各要素 name について、次を行う。
    1. HasLexicalDeclaration(env, name) が true である場合、SyntaxError 例外を投げる。
  5. varDeclarationsscriptVarScopedDeclarations とする。
  6. functionsToInitialize を新しい空の List とする。
  7. declaredFunctionNames を新しい空の List とする。
  8. varDeclarations の各要素 varDecl について、List の逆順で、次を行う。
    1. varDeclVariableDeclarationForBinding、または BindingIdentifier のいずれでもない場合、
      1. Assert: varDeclFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclaration、または AsyncGeneratorDeclaration のいずれかである。
      2. NOTE: 同じ名前に対して複数の関数宣言がある場合、最後の宣言が使用される。
      3. fnvarDeclBoundNames の唯一の要素とする。
      4. declaredFunctionNamesfn を含まない場合、
        1. fnDefinable を ? CanDeclareGlobalFunction(env, fn) とする。
        2. fnDefinablefalse である場合、TypeError 例外を投げる。
        3. fndeclaredFunctionNames に追加する。
        4. varDeclfunctionsToInitialize の先頭要素として挿入する。
  9. declaredVarNames を新しい空の List とする。
  10. varDeclarations の各要素 varDecl について、次を行う。
    1. varDeclVariableDeclarationForBinding、または BindingIdentifier のいずれかである場合、
      1. varDeclBoundNames の各 String vn について、次を行う。
        1. declaredFunctionNamesvn を含まない場合、
          1. vnDefinable を ? CanDeclareGlobalVar(env, vn) とする。
          2. vnDefinablefalse である場合、TypeError 例外を投げる。
          3. declaredVarNamesvn を含まない場合、
            1. vndeclaredVarNames に追加する。
  11. NOTE: グローバルオブジェクトordinary object である場合、このアルゴリズムステップ以降に異常終了は発生しない。しかし、グローバルオブジェクトが Proxy exotic object である場合、以降の一部のステップで異常終了を引き起こす振る舞いを示すことがある。
  12. ホストがウェブブラウザであるか、または ブロックレベル Function Declaration の Web レガシー互換性意味論 をサポートする場合、
    1. strictscriptScriptIsStrict とする。
    2. strictfalse である場合、
      1. declaredFunctionOrVarNamesdeclaredFunctionNamesdeclaredVarNameslist-concatenation とする。
      2. script Contains xtrue となるような任意の BlockCaseClause、または DefaultClause xStatementList に直接含まれる各 FunctionDeclaration f について、次を行う。
        1. funcNamefBindingIdentifierStringValue とする。
        2. FunctionDeclaration f を、funcNameBindingIdentifier として持つ VariableStatement に置き換えても script に Early Errors が一切発生しない場合、
          1. HasLexicalDeclaration(env, funcName) が false である場合、
            1. fnDefinable を ? CanDeclareGlobalVar(env, funcName) とする。
            2. fnDefinabletrue である場合、
              1. NOTE: funcName に対する var 束縛は、それが VarDeclaredName でも別の FunctionDeclaration の名前でもない場合にのみ、ここでインスタンス化される。
              2. declaredFunctionOrVarNamesfuncName を含まない場合、
                1. CreateGlobalVarBinding(env, funcName, false) を実行する。
                2. funcNamedeclaredFunctionOrVarNames に追加する。
              3. FunctionDeclaration f が評価されるとき、15.2.6 で与えられる FunctionDeclaration Evaluation アルゴリズムの代わりに、次の手順を実行する。
                1. gEnv を実行中の実行コンテキストの VariableEnvironment とする。
                2. bEnv を実行中の実行コンテキストの LexicalEnvironment とする。
                3. fObj を ! bEnv.GetBindingValue(funcName, false) とする。
                4. gEnv.SetMutableBinding(funcName, fObj, false) を実行する。
                5. unused を返す。
  13. lexDeclarationsscriptLexicallyScopedDeclarations とする。
  14. privateEnvnull とする。
  15. lexDeclarations の各要素 lexDecl について、次を行う。
    1. NOTE: 字句的に宣言された名前はここでインスタンス化されるだけで、初期化はされない。
    2. lexDeclBoundNames の各要素 dn について、次を行う。
      1. lexDeclIsConstantDeclarationtrue である場合、
        1. env.CreateImmutableBinding(dn, true) を実行する。
      2. そうでない場合、
        1. env.CreateMutableBinding(dn, false) を実行する。
  16. functionsToInitialize の各 Parse Node f について、次を行う。
    1. fnfBoundNames の唯一の要素とする。
    2. fo を、引数 env および privateEnv での fInstantiateFunctionObject とする。
    3. CreateGlobalFunctionBinding(env, fn, fo, false) を実行する。
  17. declaredVarNames の各 String vn について、次を行う。
    1. CreateGlobalVarBinding(env, vn, false) を実行する。
  18. unused を返す。
Note 2

Early Error は let/const/class と var/function の衝突を防ぐが、複数 Script 間の衝突はここで検出される。

16.2 モジュール

構文

Module : ModuleBodyopt ModuleBody : ModuleItemList ModuleItemList : ModuleItem ModuleItemList ModuleItem ModuleItem : ImportDeclaration ExportDeclaration StatementListItem[~Yield, +Await, ~Return] ModuleExportName : IdentifierName StringLiteral

16.2.1 モジュールのセマンティクス

16.2.1.1 Static Semantics: 早期エラー

ModuleBody : ModuleItemList Note

ExportedNames の重複規則は、ModuleBody 内に複数の export default ExportDeclaration が存在すると Syntax Error になることを意味する。競合または重複する宣言に関する追加のエラー条件は、Module の評価前のモジュールリンク時に検査される。これらのエラーが検出された場合、Module は評価されない。

ModuleExportName : StringLiteral

16.2.1.2 Static Semantics: ImportedLocalNames ( importEntries )

The abstract operation ImportedLocalNames takes argument importEntries (ImportEntry レコードのリスト) and returns 文字列のリスト. importEntries によって定義されるすべてのローカル名バインディングのリストを生成する。 It performs the following steps when called:

  1. localNames を新しい空のリストとする。
  2. importEntries の各 ImportEntry レコード i について、
    1. i.[[LocalName]]localNames に追加する。
  3. localNames を返す。

16.2.1.3 ModuleRequest レコード

ModuleRequest レコードは、指定されたインポート属性を持つモジュールのインポート要求を表す。以下のフィールドで構成される:

Table 35: ModuleRequest レコードのフィールド
フィールド名 値の型 意味
[[Specifier]] 文字列 モジュール指定子
[[Attributes]] ImportAttribute レコードのリスト インポート属性

LoadedModuleRequest レコードは、モジュールのインポート要求とそれに対応する Module Record を合わせて表す。テーブル Table 35 で定義された同じフィールドに加え、[[Module]] を含む:

Table 36: LoadedModuleRequest レコードのフィールド
フィールド名 値の型 意味
[[Specifier]] 文字列 モジュール指定子
[[Attributes]] ImportAttribute レコードのリスト インポート属性
[[Module]] Module Record このモジュール要求に対応する読み込まれたモジュール

ImportAttribute レコードは以下のフィールドで構成される:

Table 37: ImportAttribute レコードのフィールド
フィールド名 値の型 意味
[[Key]] 文字列 属性キー
[[Value]] 文字列 属性値

16.2.1.3.1 ModuleRequestsEqual ( left, right )

The abstract operation ModuleRequestsEqual takes arguments left (ModuleRequest レコードまたは LoadedModuleRequest レコード) and right (ModuleRequest レコードまたは LoadedModuleRequest レコード) and returns Boolean. It performs the following steps when called:

  1. left.[[Specifier]]right.[[Specifier]] と異なる場合、false を返す。
  2. leftAttrsleft.[[Attributes]] とする。
  3. rightAttrsright.[[Attributes]] とする。
  4. leftAttrsCountleftAttrs の要素数とする。
  5. rightAttrsCountrightAttrs の要素数とする。
  6. leftAttrsCountrightAttrsCount の場合、false を返す。
  7. leftAttrs の各 ImportAttribute レコード l について、
    1. rightAttrsl.[[Key]]r.[[Key]] と等しく、かつ l.[[Value]]r.[[Value]] と等しい ImportAttribute レコード r が存在しない場合、false を返す。
  8. true を返す。

16.2.1.4 Static Semantics: ModuleRequests

The syntax-directed operation ModuleRequests takes no arguments and returns ModuleRequest レコードのリスト. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空のリストを返す。
ModuleItemList : ModuleItem
  1. ModuleItemModuleRequests を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. requestsModuleItemListModuleRequests とする。
  2. additionalRequestsModuleItemModuleRequests とする。
  3. additionalRequests の各 ModuleRequest レコード mr について、
    1. requestsModuleRequestsEqual(mr, mr2) が true となる ModuleRequest レコード mr2 が含まれていない場合、
      1. mrrequests に追加する。
  4. requests を返す。
ModuleItem : StatementListItem
  1. 新しい空のリストを返す。
ImportDeclaration : import ImportClause FromClause ;
  1. specifierFromClauseSV とする。
  2. 唯一の要素が ModuleRequest レコード { [[Specifier]]: specifier, [[Attributes]]: « » } であるリストを返す。
ImportDeclaration : import ImportClause FromClause WithClause ;
  1. specifierFromClauseSV とする。
  2. attributesWithClauseWithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest レコード { [[Specifier]]: specifier, [[Attributes]]: attributes } であるリストを返す。
ImportDeclaration : import ModuleSpecifier ;
  1. specifierModuleSpecifierSV とする。
  2. 唯一の要素が ModuleRequest レコード { [[Specifier]]: specifier, [[Attributes]]: « » } であるリストを返す。
ImportDeclaration : import ModuleSpecifier WithClause ;
  1. specifierModuleSpecifierSV とする。
  2. attributesWithClauseWithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest レコード { [[Specifier]]: specifier, [[Attributes]]: attributes } であるリストを返す。
ExportDeclaration : export ExportFromClause FromClause ;
  1. specifierFromClauseSV とする。
  2. 唯一の要素が ModuleRequest レコード { [[Specifier]]: specifier, [[Attributes]]: « » } であるリストを返す。
ExportDeclaration : export ExportFromClause FromClause WithClause ;
  1. specifierFromClauseSV とする。
  2. attributesWithClauseWithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest レコード { [[Specifier]]: specifier, [[Attributes]]: attributes } であるリストを返す。
ExportDeclaration : export NamedExports ; export VariableStatement export Declaration export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. 新しい空のリストを返す。

16.2.1.5 抽象モジュールレコード

モジュールレコードは、単一のモジュールのインポートおよびエクスポートの構造情報をカプセル化します。この情報は、接続されたモジュール群のインポートとエクスポートを連結するために使用されます。モジュールレコードには、モジュールを評価するときのみ使用される4つのフィールドが含まれます。

仕様上、モジュールレコード値はRecord仕様型の値であり、モジュールレコード自体が抽象クラスとして、抽象サブクラス・具象サブクラスの両方を持つ単純なオブジェクト指向の階層に存在すると考えることができます。本仕様は、Cyclic Module Recordという名前の抽象サブクラスと、その具象サブクラスであるSource Text Module Recordを定義します。他の仕様や実装は、独自のモジュール定義機構に対応する追加のモジュールレコードサブクラスを定義しても構いません。

Module Recordは、Table 38に示されるフィールドを定義します。すべてのモジュール定義サブクラスには、少なくともそれらのフィールドが含まれます。Module Recordはまた、Table 39に示される抽象メソッドリストも定義します。すべてのモジュール定義サブクラスは、これらの抽象メソッドに対する具象実装を提供しなければなりません。

Table 38: Module Record Fields
フィールド名 値の型 意味
[[Realm]] Realm Record このモジュールが作成されたRealm
[[Environment]] Module Environment Record または empty このモジュールのトップレベルバインディングを含むEnvironment Record。このフィールドは、モジュールがリンクされた時にセットされます。
[[Namespace]] オブジェクト または empty このモジュールのために作成された場合のモジュール名前空間オブジェクト(28.3)。
[[HostDefined]] 任意(デフォルト値は undefined モジュールに追加情報を関連付ける必要があるホスト環境用に予約されたフィールドです。
Table 39: Abstract Methods of Module Records
メソッド 目的 定義
LoadRequestedModules ( [ hostDefined ] )

The abstract method LoadRequestedModules takes optional argument hostDefined (anything) and returns Promise.

依存関係を再帰的に全てロードすることで、モジュールのリンキング準備を行います。

本仕様では以下の型に定義があります。ホストは追加型に独自定義を持たせてもよい:
GetExportedNames ( [ exportStarSet ] )

The abstract method GetExportedNames takes optional argument exportStarSet (Source Text Module Recordのリスト) and returns 文字列のリスト.

このモジュールから直接あるいは間接的にエクスポートされるすべての名前のリストを返します。

このメソッドを呼び出す前にLoadRequestedModulesが正常終了している必要があります。

本仕様では以下の型に定義があります。ホストは追加型に独自定義を持たせてもよい:
ResolveExport ( exportName [ , resolveSet ] )

The abstract method ResolveExport takes argument exportName (a String) and optional argument resolveSet (a List of Records with fields [[Module]] (a Module Record) and [[ExportName]] (a String)) and returns a ResolvedBinding Record, null, or ambiguous.

このモジュールによってエクスポートされる名前のバインディングを返します。バインディングは ResolvedBinding Record の形式 { [[Module]]: Module Record, [[BindingName]]: 文字列 | namespace }で表されます。エクスポートがどのモジュールにも直接バインディングされていないモジュール名前空間オブジェクトの場合は[[BindingName]]namespaceに設定されます。名前が解決できない場合はnull、複数バインディングが見つかった場合はambiguousを返します。

この操作は特定のexportName, resolveSet組み合わせに対して常に同じ結果を返さなければなりません。

このメソッドを呼び出す前にLoadRequestedModulesが正常終了している必要があります。

本仕様では以下の型に定義があります。ホストは追加型に独自定義を持たせてもよい:
Evaluate ( )

The abstract method Evaluate takes no arguments and returns Promise.

このモジュールおよびその依存の評価Promiseを返します。評価が正常に終了した場合、またはすでに正常評価済みの場合には解決され、評価エラーの場合またはすでに評価失敗している場合には拒否されます。Promiseが拒否されるとホストはPromise拒否を処理し、評価エラーを再スローすることが期待されます。このモジュールがCyclic Module Recordでない場合、返されたPromiseはすでにsettledされていなければなりません。

このメソッドを呼び出す前にLinkが正常終了している必要があります。

本仕様では以下の型に定義があります。ホストは追加型に独自定義を持たせてもよい:

16.2.1.5.1 EvaluateModuleSync ( module )

The abstract operation EvaluateModuleSync takes argument module (a Module Record) and returns either a normal completion containing unused or a throw completion. 呼び出し側が module の評価が既に確定した Promise を返すことを保証する場合、module を同期的に評価する。 It performs the following steps when called:

  1. Assert: module は Cyclic Module Record ではないこと。
  2. promisemodule.Evaluate() とする。
  3. Assert: promise.[[PromiseState]]fulfilled または rejected である。
  4. もし promise.[[PromiseState]]rejected ならば、
    1. promise.[[PromiseIsHandled]]false の場合、HostPromiseRejectionTracker(promise, "handle") を実行する。
    2. promise.[[PromiseIsHandled]]true に設定する。
    3. promise.[[PromiseResult]] をスローする。
  5. unused を返す。

16.2.1.6 循環モジュールレコード

循環モジュールレコードは、Cyclic Module Record 型のサブクラスである他のモジュールと依存関係の循環に参加できるモジュールに関する情報を表すために使用される。Cyclic Module Record 型のサブクラスでない Module Record は、Source Text Module Record と依存関係の循環に参加してはならない。

Table 38で定義されたフィールドに加えて、循環モジュールレコードTable 40に示された追加フィールドを持つ。

Table 40: 循環モジュールレコードの追加フィールド
フィールド名 値の型 意味
[[Status]] new, unlinked, linking, linked, evaluating, evaluating-async, または evaluated 初期値は new。モジュールのライフサイクルの進行に応じて、unlinkedlinkinglinkedevaluating、場合によっては evaluating-asyncevaluated(この順序)へ遷移する。evaluating-async は、このモジュールが非同期依存の完了後に実行されるキューに入っているか、または [[HasTLA]] フィールドが true であり実行済みでトップレベル完了待ちであるモジュールであることを示す。
[[EvaluationError]] throw 完了 または empty 評価中に発生した例外を表す throw 完了。例外が発生していない場合、または [[Status]]evaluated でない場合は empty
[[DFSAncestorIndex]] 整数 または empty Link および Evaluate の間のみ使用される補助フィールド。[[Status]]linking または evaluating の場合、これはモジュールの深さ優先探索インデックス、または同じ強連結成分内の「より前」のモジュールのインデックスである。
[[RequestedModules]] ModuleRequest Record のリスト このモジュール内の import に関連付けられた ModuleRequest Record のリスト。リストはソーステキスト内での出現順である。
[[LoadedModules]] LoadedModuleRequest Record のリスト このレコードで表されるモジュールが、解決済み Module Record に対して相対的インポート属性とともにモジュールのインポートを要求するために使用した指定子文字列からのマップ。ModuleRequestsEqual(r1, r2) が true となる異なるレコード r1r2 を同時に含まない。
[[CycleRoot]] 循環モジュールレコード または empty 循環内で最初に訪問されたモジュール、すなわち強連結成分の DFS 祖先のルート。循環に含まれないモジュールの場合は、そのモジュール自身となる。Evaluate 完了後、モジュールの [[DFSAncestorIndex]] はその [[CycleRoot]] の深さ優先探索インデックスとなる。
[[HasTLA]] Boolean このモジュールが個別に非同期であるかどうか(例えば、トップレベル await を含む Source Text Module Record の場合)。非同期依存を持つことは、このフィールドが true であることを意味しない。このフィールドはモジュールの解析後に変更されてはならない。
[[AsyncEvaluationOrder]] unset, 整数, または done このフィールドは初期値が unset であり、完全に同期的なモジュールではそのまま維持される。自身が非同期であるか、または非同期依存を持つモジュールの場合、16.2.1.6.1.3.4 により保留中モジュールの実行順序を決定する整数に設定される。保留中モジュールが正常に実行されると、このフィールドは done に設定される。
[[TopLevelCapability]] PromiseCapability Record または empty このモジュールがある循環の [[CycleRoot]] であり、その循環内のいずれかのモジュールに対して Evaluate() が呼び出された場合、このフィールドにはその評価全体の PromiseCapability Record が含まれる。これは Evaluate() 抽象メソッドから返される Promise オブジェクトを確定するために使用される。このフィールドはそのモジュールの依存関係では empty のままであり、それらの依存関係のいずれかに対してトップレベルの Evaluate() が開始されない限り設定されない。
[[AsyncParentModules]] 循環モジュールレコードのリスト このモジュールまたは依存関係のいずれかが [[HasTLA]] true を持ち、実行が進行中である場合、トップレベル実行ジョブにおけるこのモジュールの親インポーターを追跡する。これらの親モジュールは、このモジュールの実行が正常に完了するまで実行を開始しない。
[[PendingAsyncDependencies]] 整数 または empty このモジュールが非同期依存を持つ場合、このモジュールの実行のために残っている非同期依存モジュールの数を追跡する。非同期依存を持つモジュールは、このフィールドが 0 になり、かつ実行エラーがないときに実行される。

Table 39で定義されたメソッドに加えて、循環モジュールレコードTable 41に示された追加メソッドを持つ:

Table 41: 循環モジュールレコードの追加抽象メソッド
メソッド 目的 定義
InitializeEnvironment ( )

The abstract method InitializeEnvironment takes no arguments and returns unused を含む通常完了 または throw 完了.

モジュールの Environment Record を初期化し、すべてのインポートバインディングの解決を含め、モジュールの実行コンテキストを生成する。
本仕様では以下の型で定義されている。ホストは独自の定義を持つ追加型を提供してもよい:
ExecuteModule ( [ capability ] )

The abstract method ExecuteModule takes optional argument capability (PromiseCapability Record) and returns unused を含む通常完了 または throw 完了.

モジュールのコードをその実行コンテキスト内で評価する。このモジュールの [[HasTLA]]true の場合、PromiseCapability Record が引数として渡され、このメソッドは与えられた capability を解決または拒否することが期待される。この場合、このメソッドは例外を投げてはならず、必要に応じて PromiseCapability Record を拒否する必要がある。
本仕様では以下の型で定義されている。ホストは独自の定義を持つ追加型を提供してもよい:

GraphLoadingState レコードは、モジュールグラフのロード処理に関する情報を含むレコードである。これは HostLoadImportedModule 呼び出し後のロード継続に使用される。各 GraphLoadingState レコードTable 42で定義されたフィールドを持つ:

Table 42: GraphLoadingState レコードのフィールド
フィールド名 値の型 意味
[[PromiseCapability]] PromiseCapability Record ロード処理完了時に解決される Promise。
[[IsLoading]] Boolean ロード処理がまだ完了していない場合(成功でもエラーでもない場合)に true。
[[PendingModulesCount]] 0以上の整数 保留中の HostLoadImportedModule 呼び出し数を追跡する。
[[Visited]] 循環モジュールレコードのリスト 現在のロード処理で既にロードされた循環モジュールレコードのリストであり、循環依存による無限ループを回避するために使用される。
[[HostDefined]] 任意(デフォルト値は empty LoadRequestedModules の呼び出し元から HostLoadImportedModule へ渡されるホスト定義データを含む。

16.2.1.6.1 モジュールレコード抽象メソッドの実装

以下は、Table 39で定義された、対応するモジュールレコード抽象メソッドを実装する循環モジュールレコードの具象メソッドである。

16.2.1.6.1.1 LoadRequestedModules ( [ hostDefined ] )

The LoadRequestedModules concrete method of a Cyclic Module Record module takes optional argument hostDefined (anything) and returns Promise. これは module の依存関係グラフ内にあるすべてのモジュールレコード[[LoadedModules]] を設定する(作業の大部分は補助関数 InnerModuleLoading によって行われる)。HostLoadImportedModule フックに渡される、省略可能な hostDefined パラメータを受け取る。 It performs the following steps when called:

  1. hostDefined が存在しない場合、hostDefinedempty に設定する。
  2. pc を ! NewPromiseCapability(%Promise%) とする。
  3. stateGraphLoadingState レコード { [[IsLoading]]: true, [[PendingModulesCount]]: 1, [[Visited]]: « », [[PromiseCapability]]: pc, [[HostDefined]]: hostDefined } とする。
  4. InnerModuleLoading(state, module) を実行する。
  5. pc.[[Promise]] を返す。
Note
hostDefined パラメータは、インポートされたモジュールを取得するために必要な追加情報を渡すために使用できる。例えば HTML では、<link rel="preload" as="..."> タグに対して正しい fetch destination を設定するために使用される。 import() 式は hostDefined パラメータを決して設定しない。

16.2.1.6.1.1.1 InnerModuleLoading ( state, module )

The abstract operation InnerModuleLoading takes arguments state (GraphLoadingState レコード) and module (モジュールレコード) and returns unused. これは LoadRequestedModules によって使用され、module の依存関係グラフについて実際の読み込み処理を再帰的に実行する。 It performs the following steps when called:

  1. Assert: state.[[IsLoading]]true である。
  2. module循環モジュールレコードであり、module.[[Status]]new であり、かつ state.[[Visited]]module を含まない場合、
    1. modulestate.[[Visited]] に追加する。
    2. requestedModulesCountmodule.[[RequestedModules]] 内の要素数とする。
    3. state.[[PendingModulesCount]]state.[[PendingModulesCount]] + requestedModulesCount に設定する。
    4. module.[[RequestedModules]] の各 ModuleRequest レコード request について、次を行う。
      1. AllImportAttributesSupported(request.[[Attributes]]) が false である場合、
        1. errorThrowCompletion(新しく作成された SyntaxError オブジェクト) とする。
        2. ContinueModuleLoading(state, error) を実行する。
      2. そうでなく、module.[[LoadedModules]] が、ModuleRequestsEqual(record, request) が true であるような LoadedModuleRequest レコード record を含む場合、
        1. InnerModuleLoading(state, record.[[Module]]) を実行する。
      3. それ以外の場合、
        1. HostLoadImportedModule(module, request, state.[[HostDefined]], state) を実行する。
        2. NOTE: HostLoadImportedModuleFinishLoadingImportedModule を呼び出し、これは ContinueModuleLoading を通じてグラフ読み込み処理に再入する。
      4. state.[[IsLoading]]false である場合、unused を返す。
  3. Assert: state.[[PendingModulesCount]] ≥ 1。
  4. state.[[PendingModulesCount]]state.[[PendingModulesCount]] - 1 に設定する。
  5. state.[[PendingModulesCount]] = 0 である場合、
    1. state.[[IsLoading]]false に設定する。
    2. state.[[Visited]] の各循環モジュールレコード loaded について、次を行う。
      1. loaded.[[Status]]new である場合、loaded.[[Status]]unlinked に設定する。
    3. Call(state.[[PromiseCapability]].[[Resolve]], undefined, « undefined ») を実行する。
  6. unused を返す。

16.2.1.6.1.1.2 ContinueModuleLoading ( state, moduleCompletion )

The abstract operation ContinueModuleLoading takes arguments state (GraphLoadingState レコード) and moduleCompletion (モジュールレコードを含む正常完了、または throw 完了) and returns unused. これは HostLoadImportedModule の呼び出し後に読み込み処理へ再入するために使用される。 It performs the following steps when called:

  1. state.[[IsLoading]]false である場合、unused を返す。
  2. moduleCompletion が正常完了である場合、
    1. InnerModuleLoading(state, moduleCompletion.[[Value]]) を実行する。
  3. それ以外の場合、
    1. state.[[IsLoading]]false に設定する。
    2. Call(state.[[PromiseCapability]].[[Reject]], undefined, « moduleCompletion.[[Value]] ») を実行する。
  4. unused を返す。

16.2.1.6.1.2 Link ( )

The Link concrete method of a Cyclic Module Record module takes no arguments and returns unused を含む正常完了、または throw 完了. 成功した場合、Link はこのモジュールの [[Status]]unlinked から linked へ遷移させる。失敗した場合、例外が投げられ、このモジュールの [[Status]]unlinked のままである。(作業の大部分は補助関数 InnerModuleLinking によって行われる。) It performs the following steps when called:

  1. Assert: module.[[Status]]unlinkedlinkedevaluating-async、または evaluated のいずれかである。
  2. stack を新しい空の List とする。
  3. resultCompletion(InnerModuleLinking(module, stack, 0)) とする。
  4. result が中途完了である場合、
    1. stack の各循環モジュールレコード m について、次を行う。
      1. Assert: m.[[Status]]linking である。
      2. m.[[Status]]unlinked に設定する。
    2. Assert: module.[[Status]]unlinked である。
    3. result を返す。
  5. Assert: module.[[Status]]linkedevaluating-async、または evaluated のいずれかである。
  6. Assert: stack は空である。
  7. unused を返す。

16.2.1.6.1.2.1 InnerModuleLinking ( module, stack, index )

The abstract operation InnerModuleLinking takes arguments module (モジュールレコード), stack (循環モジュールレコードList), and index (非負整数) and returns 非負整数を含む正常完了、または throw 完了. これは Link によって使用され、module に対する実際のリンク処理、および依存関係グラフ内の他のすべてのモジュールに対する再帰的な処理を実行する。stack および index パラメータ、ならびにモジュールの [[DFSAncestorIndex]] フィールドは、深さ優先探索(DFS)の走査を追跡する。特に、[[DFSAncestorIndex]] は強連結成分(SCC)を発見するために使用され、SCC 内のすべてのモジュールが一緒に linked へ遷移するようにする。 It performs the following steps when called:

  1. module循環モジュールレコードでない場合、
    1. module.Link() を実行する。
    2. index を返す。
  2. module.[[Status]]linkinglinkedevaluating-async、または evaluated のいずれかである場合、
    1. index を返す。
  3. Assert: module.[[Status]]unlinked である。
  4. module.[[Status]]linking に設定する。
  5. moduleIndexindex とする。
  6. module.[[DFSAncestorIndex]]index に設定する。
  7. indexindex + 1 に設定する。
  8. modulestack に追加する。
  9. module.[[RequestedModules]] の各 ModuleRequest レコード request について、次を行う。
    1. requiredModuleGetImportedModule(module, request) とする。
    2. index を ? InnerModuleLinking(requiredModule, stack, index) に設定する。
    3. requiredModule循環モジュールレコードである場合、
      1. Assert: requiredModule.[[Status]]linkinglinkedevaluating-async、または evaluated のいずれかである。
      2. Assert: requiredModule.[[Status]]linking であることと、stackrequiredModule を含むことは同値である。
      3. requiredModule.[[Status]]linking である場合、
        1. module.[[DFSAncestorIndex]]min(module.[[DFSAncestorIndex]], requiredModule.[[DFSAncestorIndex]]) に設定する。
  10. module.InitializeEnvironment() を実行する。
  11. Assert: modulestack 内にちょうど 1 回出現する。
  12. Assert: module.[[DFSAncestorIndex]]moduleIndex
  13. module.[[DFSAncestorIndex]] = moduleIndex である場合、
    1. donefalse とする。
    2. donefalse である間、繰り返す。
      1. requiredModulestack の最後の要素とする。
      2. stack の最後の要素を削除する。
      3. Assert: requiredModule循環モジュールレコードである。
      4. requiredModule.[[Status]]linked に設定する。
      5. requiredModulemodule が同じモジュールレコードである場合、donetrue に設定する。
  14. index を返す。

16.2.1.6.1.3 Evaluate ( )

The Evaluate concrete method of a Cyclic Module Record module takes no arguments and returns Promise. Evaluate はこのモジュールの [[Status]]linked から evaluating-async または evaluated へ遷移させる。与えられた強連結成分内のモジュールに対して初めて呼び出されたとき、Evaluate は、モジュールの評価が完了したときに解決される Promise を作成して返す。この Promise は、その成分の [[CycleRoot]][[TopLevelCapability]] フィールドに格納される。その成分内の任意のモジュールに対する将来の Evaluate の呼び出しは、同じ Promise を返す。(作業の大部分は補助関数 InnerModuleEvaluation によって行われる。) It performs the following steps when called:

  1. Assert: この Evaluate の呼び出しは、周囲のエージェント内で別の Evaluate の呼び出しと同時に発生していない。
  2. Assert: module.[[Status]]linkedevaluating-async、または evaluated のいずれかである。
  3. module.[[Status]]evaluating-async または evaluated のいずれかである場合、
    1. module.[[CycleRoot]]empty でない場合、
      1. modulemodule.[[CycleRoot]] に設定する。
    2. それ以外の場合、
      1. Assert: module.[[Status]]evaluated であり、module.[[EvaluationError]] は throw 完了である。
  4. module.[[TopLevelCapability]]empty でない場合、
    1. module.[[TopLevelCapability]].[[Promise]] を返す。
  5. stack を新しい空の List とする。
  6. capability を ! NewPromiseCapability(%Promise%) とする。
  7. module.[[TopLevelCapability]]capability に設定する。
  8. resultCompletion(InnerModuleEvaluation(module, stack, 0)) とする。
  9. result が中途完了である場合、
    1. stack の各循環モジュールレコード m について、次を行う。
      1. Assert: m.[[Status]]evaluating である。
      2. m.[[Status]]evaluated に設定する。
      3. m.[[EvaluationError]]result に設定する。
    2. Assert: module.[[Status]]evaluated である。
    3. Assert: module.[[EvaluationError]]result は同じ Completion レコードである。
    4. Call(capability.[[Reject]], undefined, « result.[[Value]] ») を実行する。
  10. それ以外の場合、
    1. Assert: module.[[Status]]evaluating-async または evaluated のいずれかである。
    2. Assert: module.[[EvaluationError]]empty である。
    3. module.[[Status]]evaluated である場合、
      1. Assert: module.[[AsyncEvaluationOrder]]unset または done のいずれかである。
      2. NOTE: module.[[AsyncEvaluationOrder]]done であることと、module がすでに評価済みであり、その評価が非同期であったことは同値である。
      3. Call(capability.[[Resolve]], undefined, « undefined ») を実行する。
    4. Assert: stack は空である。
  11. capability.[[Promise]] を返す。

16.2.1.6.1.3.1 InnerModuleEvaluation ( module, stack, index )

The abstract operation InnerModuleEvaluation takes arguments module (モジュールレコード), stack (循環モジュールレコードList), and index (非負整数) and returns 非負整数を含む正常完了、または throw 完了. これは Evaluate によって使用され、module に対する実際の評価処理、および依存関係グラフ内の他のすべてのモジュールに対する再帰的な処理を実行する。stack および index パラメータ、ならびに module[[DFSAncestorIndex]] フィールドは、InnerModuleLinking と同じ方法で使用される。 It performs the following steps when called:

  1. module循環モジュールレコードでない場合、
    1. EvaluateModuleSync(module) を実行する。
    2. index を返す。
  2. module.[[Status]]evaluating-async または evaluated のいずれかである場合、
    1. module.[[EvaluationError]]empty である場合、index を返す。
    2. module.[[EvaluationError]] を返す。
  3. module.[[Status]]evaluating である場合、index を返す。
  4. Assert: module.[[Status]]linked である。
  5. module.[[Status]]evaluating に設定する。
  6. moduleIndexindex とする。
  7. module.[[DFSAncestorIndex]]index に設定する。
  8. module.[[PendingAsyncDependencies]] を 0 に設定する。
  9. indexindex + 1 に設定する。
  10. modulestack に追加する。
  11. module.[[RequestedModules]] の各 ModuleRequest レコード request について、次を行う。
    1. requiredModuleGetImportedModule(module, request) とする。
    2. index を ? InnerModuleEvaluation(requiredModule, stack, index) に設定する。
    3. requiredModule循環モジュールレコードである場合、
      1. Assert: requiredModule.[[Status]]evaluatingevaluating-async、または evaluated のいずれかである。
      2. Assert: requiredModule.[[Status]]evaluating であることと、stackrequiredModule を含むことは同値である。
      3. requiredModule.[[Status]]evaluating である場合、
        1. module.[[DFSAncestorIndex]]min(module.[[DFSAncestorIndex]], requiredModule.[[DFSAncestorIndex]]) に設定する。
      4. それ以外の場合、
        1. requiredModulerequiredModule.[[CycleRoot]] に設定する。
        2. Assert: requiredModule.[[Status]]evaluating-async または evaluated のいずれかである。
        3. requiredModule.[[EvaluationError]]empty でない場合、? requiredModule.[[EvaluationError]] を返す。
      5. requiredModule.[[AsyncEvaluationOrder]] が整数である場合、
        1. module.[[PendingAsyncDependencies]]module.[[PendingAsyncDependencies]] + 1 に設定する。
        2. modulerequiredModule.[[AsyncParentModules]] に追加する。
  12. module.[[PendingAsyncDependencies]] > 0 または module.[[HasTLA]]true である場合、
    1. Assert: module.[[AsyncEvaluationOrder]]unset である。
    2. module.[[AsyncEvaluationOrder]]IncrementModuleAsyncEvaluationCount() に設定する。
    3. module.[[PendingAsyncDependencies]] = 0 である場合、ExecuteAsyncModule(module) を実行する。
  13. それ以外の場合、
    1. module.ExecuteModule() を実行する。
  14. Assert: modulestack 内にちょうど 1 回出現する。
  15. Assert: module.[[DFSAncestorIndex]]moduleIndex
  16. module.[[DFSAncestorIndex]] = moduleIndex である場合、
    1. donefalse とする。
    2. donefalse である間、繰り返す。
      1. requiredModulestack の最後の要素とする。
      2. stack の最後の要素を削除する。
      3. Assert: requiredModule循環モジュールレコードである。
      4. Assert: requiredModule.[[AsyncEvaluationOrder]] は整数または unset のいずれかである。
      5. requiredModule.[[AsyncEvaluationOrder]]unset である場合、requiredModule.[[Status]]evaluated に設定する。
      6. それ以外の場合、requiredModule.[[Status]]evaluating-async に設定する。
      7. requiredModulemodule が同じモジュールレコードである場合、donetrue に設定する。
      8. requiredModule.[[CycleRoot]]module に設定する。
  17. index を返す。
Note 1

モジュールは、InnerModuleEvaluation によって走査されている間は evaluating である。モジュールは、実行完了時に evaluated となるか、またはその [[HasTLA]] フィールドが true である場合、もしくは非同期依存関係を持つ場合、実行中に evaluating-async となる。

Note 2

非同期サイクルのモジュールに依存している任意のモジュールは、そのサイクルが evaluating でないときには、代わりに [[CycleRoot]] を通じてサイクルのルートの実行に依存する。これにより、サイクル状態をそのルートモジュール状態を通じて単一の強連結成分として扱えることが保証される。

16.2.1.6.1.3.2 ExecuteAsyncModule ( module )

The abstract operation ExecuteAsyncModule takes argument module (循環モジュールレコード) and returns unused. It performs the following steps when called:

  1. Assert: module.[[Status]]evaluating または evaluating-async のいずれかである。
  2. Assert: module.[[HasTLA]]true である。
  3. capability を ! NewPromiseCapability(%Promise%) とする。
  4. fulfilledClosure を、パラメータを持たず、module をキャプチャし、呼び出されたときに次の手順を実行する新しい抽象クロージャとする。
    1. AsyncModuleExecutionFulfilled(module) を実行する。
    2. NormalCompletion(undefined) を返す。
  5. onFulfilledCreateBuiltinFunction(fulfilledClosure, 0, "", « ») とする。
  6. rejectedClosure を、パラメータ (error) を持ち、module をキャプチャし、呼び出されたときに次の手順を実行する新しい抽象クロージャとする。
    1. AsyncModuleExecutionRejected(module, error) を実行する。
    2. NormalCompletion(undefined) を返す。
  7. onRejectedCreateBuiltinFunction(rejectedClosure, 0, "", « ») とする。
  8. PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected) を実行する。
  9. module.ExecuteModule(capability) を実行する。
  10. unused を返す。

16.2.1.6.1.3.3 GatherAvailableAncestors ( module, execList )

The abstract operation GatherAvailableAncestors takes arguments module (循環モジュールレコード) and execList (循環モジュールレコードList) and returns unused. It performs the following steps when called:

  1. module.[[AsyncParentModules]] の各循環モジュールレコード m について、次を行う。
    1. execListm を含まず、かつ m.[[CycleRoot]].[[EvaluationError]]empty である場合、
      1. Assert: m.[[Status]]evaluating-async である。
      2. Assert: m.[[EvaluationError]]empty である。
      3. Assert: m.[[AsyncEvaluationOrder]] は整数である。
      4. Assert: m.[[PendingAsyncDependencies]] > 0。
      5. m.[[PendingAsyncDependencies]]m.[[PendingAsyncDependencies]] - 1 に設定する。
      6. m.[[PendingAsyncDependencies]] = 0 である場合、
        1. mexecList に追加する。
        2. m.[[HasTLA]]false である場合、GatherAvailableAncestors(m, execList) を実行する。
  2. unused を返す。
Note

ルート module に対する非同期実行が fulfilled されたとき、この関数は、この完了時に同期的に一緒に実行できるモジュールのリストを決定し、それらを execList に設定する。

16.2.1.6.1.3.4 AsyncModuleExecutionFulfilled ( module )

The abstract operation AsyncModuleExecutionFulfilled takes argument module (循環モジュールレコード) and returns unused. It performs the following steps when called:

  1. module.[[Status]]evaluated である場合、
    1. Assert: module.[[EvaluationError]]empty でない。
    2. unused を返す。
  2. Assert: module.[[Status]]evaluating-async である。
  3. Assert: module.[[AsyncEvaluationOrder]] は整数である。
  4. Assert: module.[[EvaluationError]]empty である。
  5. module.[[AsyncEvaluationOrder]]done に設定する。
  6. module.[[Status]]evaluated に設定する。
  7. module.[[TopLevelCapability]]empty でない場合、
    1. Assert: module.[[CycleRoot]]module は同じモジュールレコードである。
    2. Call(module.[[TopLevelCapability]].[[Resolve]], undefined, « undefined ») を実行する。
  8. execList を新しい空の List とする。
  9. GatherAvailableAncestors(module, execList) を実行する。
  10. Assert: execList のすべての要素は、その [[AsyncEvaluationOrder]] フィールドが整数に設定され、[[PendingAsyncDependencies]] フィールドが 0 に設定され、[[EvaluationError]] フィールドが empty に設定されている。
  11. sortedExecList を、execList の要素を [[AsyncEvaluationOrder]] フィールドの昇順でソートした要素からなる List とする。
  12. sortedExecList の各循環モジュールレコード m について、次を行う。
    1. m.[[Status]]evaluated である場合、
      1. Assert: m.[[EvaluationError]]empty でない。
    2. そうでなく、m.[[HasTLA]]true である場合、
      1. ExecuteAsyncModule(m) を実行する。
    3. それ以外の場合、
      1. resultCompletion(m.ExecuteModule()) とする。
      2. result が中途完了である場合、
        1. AsyncModuleExecutionRejected(m, result.[[Value]]) を実行する。
      3. それ以外の場合、
        1. m.[[AsyncEvaluationOrder]]done に設定する。
        2. m.[[Status]]evaluated に設定する。
        3. m.[[TopLevelCapability]]empty でない場合、
          1. Assert: m.[[CycleRoot]]m は同じモジュールレコードである。
          2. Call(m.[[TopLevelCapability]].[[Resolve]], undefined, « undefined ») を実行する。
  13. unused を返す。

16.2.1.6.1.3.5 AsyncModuleExecutionRejected ( module, error )

The abstract operation AsyncModuleExecutionRejected takes arguments module (循環モジュールレコード) and error (ECMAScript 言語値) and returns unused. It performs the following steps when called:

  1. module.[[Status]]evaluated である場合、
    1. Assert: module.[[EvaluationError]]empty でない。
    2. unused を返す。
  2. Assert: module.[[Status]]evaluating-async である。
  3. Assert: module.[[AsyncEvaluationOrder]] は整数である。
  4. Assert: module.[[EvaluationError]]empty である。
  5. module.[[EvaluationError]]ThrowCompletion(error) に設定する。
  6. module.[[Status]]evaluated に設定する。
  7. module.[[AsyncEvaluationOrder]]done に設定する。
  8. NOTE: module.[[AsyncEvaluationOrder]]AsyncModuleExecutionFulfilled との対称性のために done に設定される。InnerModuleEvaluation では、モジュールの [[AsyncEvaluationOrder]] 内部スロットの値は、その [[EvaluationError]] 内部スロットが empty でない場合には使用されない。
  9. module.[[TopLevelCapability]]empty でない場合、
    1. Assert: module.[[CycleRoot]]module は同じモジュールレコードである。
    2. Call(module.[[TopLevelCapability]].[[Reject]], undefined, « error ») を実行する。
  10. module.[[AsyncParentModules]] の各循環モジュールレコード m について、次を行う。
    1. AsyncModuleExecutionRejected(m, error) を実行する。
  11. unused を返す。

16.2.1.6.2 循環モジュールレコードグラフの例

この非規範的な節では、いくつかの一般的なモジュールグラフのリンクおよび評価について、特にエラーがどのように発生し得るかに焦点を当てて、一連の例を示す。

まず、次の単純なモジュールグラフを考える。

Figure 2: 単純なモジュールグラフ
モジュール A がモジュール B に依存し、モジュール B がモジュール C に依存するモジュールグラフ

まずエラー条件がないと仮定する。ホストが最初に 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() の呼び出しが成功した後のリンクエラーを含む場合を考える。CInnerModuleLinking が成功したが、その後、例えば BC の提供しないものをインポートするために B で失敗した場合、元の A.Link() は失敗し、AB[[Status]]unlinked のままである。ただし、C[[Status]]linked になっている。

最後に、Link() の呼び出しが成功した後の評価エラーを含む場合を考える。CInnerModuleEvaluation が成功したが、その後、例えば B が例外を投げるコードを含むために B で失敗した場合、元の A.Evaluate() は失敗し、拒否された Promise を返す。結果として生じる例外は AB[[EvaluationError]] フィールドの両方に記録され、それらの [[Status]]evaluated になる。Cevaluated になるが、A および B とは対照的に、評価を正常に完了したため [[EvaluationError]] はないままである。例外を格納することで、ホストが A または B をそれらの Evaluate() メソッドを呼び出して再利用しようとするたびに、同じ例外に遭遇することが保証される。(ホストは循環モジュールレコードを再利用することを要求されない。同様に、ホストはこれらのメソッドによって投げられた例外オブジェクトを公開することを要求されない。しかし、この仕様はそのような使用を可能にしている。)

次に、別の種類のエラー条件を考える。

Figure 3: 解決不能なモジュールを持つモジュールグラフ
モジュール A が欠落した(解決不能な)モジュールに依存しており、それが ??? で表されているモジュールグラフ

このシナリオでは、モジュール A は他のあるモジュールへの依存関係を宣言しているが、そのモジュールのモジュールレコードは存在しない。すなわち、HostLoadImportedModule はそれを要求されたとき、例外とともに FinishLoadingImportedModule を呼び出す。これは、対応するリソースが存在しない、またはリソースは存在するが結果のソーステキストを解析しようとしたときに ParseModule が何らかのエラーを返す、などさまざまな理由で起こり得る。ホストは、FinishLoadingImportedModule に渡す完了を通じて失敗の原因を公開することを選択できる。いずれの場合でも、この例外は読み込み失敗を引き起こし、その結果 A[[Status]]new のままとなる。

ここでの読み込み、リンク、評価エラーの違いは、次の特性による。

  • 評価は副作用を引き起こし得るため、一度だけ実行されなければならない。したがって、たとえ失敗したとしても、評価がすでに実行されたかどうかを記憶することが重要である。(エラーの場合、例外も記憶するのが理にかなっている。そうしなければ、後続の Evaluate() 呼び出しが新しい例外を合成しなければならなくなるためである。)
  • 一方、リンクには副作用がないため、失敗しても、後の時点で問題なく再試行できる。
  • 読み込みはホストと密接に相互作用するため、ホストによっては、失敗した読み込みをユーザーが再試行できるようにすることが望ましい場合がある(例えば、一時的に悪いネットワーク状態によって失敗が引き起こされた場合)。

次に、サイクルを持つモジュールグラフを考える。

Figure 4: 循環モジュールグラフ
モジュール A がモジュール B および C に依存するが、モジュール B もモジュール A に依存するモジュールグラフ

ここではエントリポイントがモジュール A であると仮定するため、ホストは A.LoadRequestedModules() を呼び出して進み、これは A に対して InnerModuleLoading を実行する。これはさらに B および C に対して InnerModuleLoading を呼び出す。サイクルのため、これにより再び A に対して InnerModuleLoading が起動されるが、この時点では A の依存関係の読み込みはこの LoadRequestedModules 処理中にすでに起動されているため、これは no-op である。グラフ内のすべてのモジュールが正常に読み込まれると、それらの [[Status]] は同時に new から unlinked へ遷移する。

次にホストは A.Link() を呼び出して進み、これは A に対して InnerModuleLinking を実行する。これはさらに B に対して InnerModuleLinking を呼び出す。サイクルのため、これにより再び A に対して InnerModuleLinking が起動されるが、この時点では A.[[Status]] がすでに linking であるため、これは no-op である。制御が A に戻り、InnerModuleLinkingC に対して起動されるとき、B.[[Status]] 自体は linking のままである。これが C.[[Status]]linked で返った後、AB は一緒に linking から linked へ遷移する。これは設計によるものであり、それらが強連結成分を形成しているためである。この段階ではモジュールグラフが深さ優先探索で走査されるため、同じ SCC 内のモジュールの状態を同時に遷移させることが可能である。

循環モジュールグラフの評価段階についても、成功の場合には同様の話が成り立つ。

ここで、A にリンクエラーがある場合を考える。例えば、C に存在しない束縛をインポートしようとする場合である。その場合、A に対する InnerModuleLinking の 2 回目の呼び出しからの早期 return を含め、上記の手順は依然として発生する。しかし、元の A に対する InnerModuleLinking まで巻き戻ると、InitializeEnvironment 中、すなわち C.ResolveExport() の直後に失敗する。投げられた SyntaxError 例外は A.Link まで伝播し、現在その stack 上にあるすべてのモジュール(これらは常にまだ linking であるモジュールに正確に一致する)をリセットする。したがって、AB はともに unlinked になる。Clinked のまま残されることに注意。

あるいは、A に評価エラーがある場合を考える。例えば、そのソースコードが例外を投げる場合である。その場合、上記の手順の評価時の類似物は、A に対する InnerModuleEvaluation の 2 回目の呼び出しからの早期 return を含め、依然として発生する。しかし、元の A に対する InnerModuleEvaluation まで巻き戻ると、仮定により失敗する。投げられた例外は A.Evaluate() まで伝播し、現在その stack 上にあるすべてのモジュール(すなわち、まだ evaluating であるモジュール)に加え、[[AsyncParentModules]] を介してもエラーを記録する。[[AsyncParentModules]] は、top-level await を含む、またはそれに依存するモジュールについて、AsyncModuleExecutionRejected アルゴリズムを通じて依存関係グラフ全体にわたる連鎖を形成する。したがって、AB はともに evaluated となり、例外は AB[[EvaluationError]] フィールドの両方に記録される一方、C[[EvaluationError]] なしで evaluated のまま残される。

最後に、すべてのモジュールが非同期に完了する、サイクルを持つモジュールグラフを考える。

Figure 5: 非同期循環モジュールグラフ
モジュール A がモジュール B および C に依存し、モジュール B がモジュール D に依存し、モジュール C がモジュール D および E に依存し、モジュール D がモジュール A に依存するモジュールグラフ

読み込みおよびリンクは以前と同様に発生し、すべてのモジュールは [[Status]]linked に設定された状態になる。

A.Evaluate() を呼び出すと、AB、および D に対して InnerModuleEvaluation が呼び出され、これらはすべて evaluating へ遷移する。次に A に対して再び InnerModuleEvaluation が呼び出されるが、すでに evaluating であるためこれは no-op である。この時点で D.[[PendingAsyncDependencies]] は 0 であるため、ExecuteAsyncModule(D) が呼び出され、D の非同期実行を追跡する新しい PromiseCapability とともに D.ExecuteModule を呼び出す。B に対する InnerModuleEvaluation へ巻き戻り、B.[[PendingAsyncDependencies]] を 1 に、B.[[AsyncEvaluationOrder]] を 1 に設定する。元の A に対する InnerModuleEvaluation へ巻き戻り、A.[[PendingAsyncDependencies]] を 1 に設定する。A の依存関係をたどるループの次の反復で、C に対して、そしてそれによって D(再び no-op)および E に対して InnerModuleEvaluation を呼び出す。E は依存関係を持たず、サイクルの一部でもないため、D と同じ方法で ExecuteAsyncModule(E) を呼び出し、E は直ちにスタックから削除される。さらに C に対する InnerModuleEvaluation へ巻き戻り、C.[[AsyncEvaluationOrder]] を 3 に設定する。ここで A の依存関係をたどるループを終了し、A.[[AsyncEvaluationOrder]] を 4 に設定し、強連結成分全体をスタックから削除して、すべてのモジュールを一度に evaluating-async へ遷移させる。この時点で、モジュールのフィールドは Table 43 に示すとおりである。

Table 43: 初回 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 および C 1(D 2(D および E 0 0

E が最初に実行を完了すると仮定する。それが起こると、AsyncModuleExecutionFulfilled が呼び出され、E.[[Status]]evaluated に設定され、C.[[PendingAsyncDependencies]] は 1 になるよう減算される。更新されたモジュールのフィールドは Table 44 に示すとおりである。

Table 44: モジュール 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 になるよう減算され、ExecuteAsyncModuleB に対して呼び出され、実行を開始する。C.[[PendingAsyncDependencies]] も 0 になるよう減算され、C が実行を開始する(Bawait を含む場合、B と並行する可能性がある)。更新されたモジュールのフィールドは Table 45 に示すとおりである。

Table 45: モジュール 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 になるよう減算される。更新されたモジュールのフィールドは Table 46 に示すとおりである。

Table 46: モジュール 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 が呼び出され、実行を開始する。更新されたモジュールのフィールドは Table 47 に示すとおりである。

Table 47: モジュール 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() から返されたもの)は解決され、これでこのモジュールグラフの処理は終了する。更新されたモジュールのフィールドは Table 48 に示すとおりである。

Table 48: モジュール A の実行完了後のモジュールフィールド
フィールド
モジュール
A
[[DFSAncestorIndex]] 0
[[Status]] evaluated
[[AsyncEvaluationOrder]] done
[[AsyncParentModules]] « »
[[PendingAsyncDependencies]] 0

あるいは、B が実行を完了する前に C が実行に失敗してエラーを返す失敗の場合を考える。それが起こると、AsyncModuleExecutionRejected が呼び出され、C.[[Status]]evaluated に設定し、C.[[EvaluationError]] をそのエラーに設定する。その後、各 AsyncParentModules に対して AsyncModuleExecutionRejected を実行することで、このエラーをすべての AsyncParentModules に伝播する。更新されたモジュールのフィールドは Table 49 に示すとおりである。

Table 49: モジュール C がエラーで完了した後のモジュールフィールド
フィールド
モジュール
A C
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] done done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 1(B 0
[[EvaluationError]] empty C の評価エラー

CC のエラーで A に対して AsyncModuleExecutionRejected を呼び出すため、AC と同じエラーで拒否される。A.[[Status]]evaluated に設定される。この時点で、A.[[TopLevelCapability]] 内の Promise(A.Evaluate() から返されたもの)は拒否される。更新されたモジュールのフィールドは Table 50 に示すとおりである。

Table 50: モジュール A が拒否された後のモジュールフィールド
フィールド
モジュール
A
[[DFSAncestorIndex]] 0
[[Status]] evaluated
[[AsyncEvaluationOrder]] done
[[AsyncParentModules]] « »
[[PendingAsyncDependencies]] 0
[[EvaluationError]] C の評価エラー

その後、B はエラーなしで実行を完了する。それが起こると、AsyncModuleExecutionFulfilled が再び呼び出され、B.[[Status]]evaluated に設定される。GatherAvailableAncestorsB に対して呼び出される。しかし、A.[[CycleRoot]]A であり、評価エラーを持つため、返される sortedExecList には追加されず、AsyncModuleExecutionFulfilled は追加処理なしで返る。B の将来のインポーターは、サイクルルート A に設定された C からの評価エラーによる B.[[CycleRoot]].[[EvaluationError]] の拒否を解決する。更新されたモジュールのフィールドは Table 51 に示すとおりである。

Table 51: エラー中のグラフでモジュール B の実行完了後のモジュールフィールド
フィールド
モジュール
A B
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] 4 1
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 0 0
[[EvaluationError]] C の評価エラー empty

16.2.1.7 ソーステキストモジュールレコード

ソーステキストモジュールレコードは、目標記号 Module を用いて解析された ECMAScript ソーステキスト11)から定義されたモジュールに関する情報を表すために使用される。そのフィールドは、そのモジュールによってインポートおよびエクスポートされる名前に関する要約情報を含み、その具象メソッドはこれらの要約情報を使用してモジュールをリンクおよび評価する。

ソーステキストモジュールレコードは、抽象モジュールレコード型の他のサブクラスとともにモジュールグラフ内に存在でき、循環モジュールレコード型の他のサブクラスとともにサイクルに参加できる。

Table 40で定義されるフィールドに加えて、ソーステキストモジュールレコードTable 52に列挙される追加フィールドを持つ。これらの各フィールドは、ParseModule で初期設定される。

Table 52: ソーステキストモジュールレコードの追加フィールド
フィールド名 値の型 意味
[[ECMAScriptCode]] Parse Node 目標記号として Module を用いて、このモジュールのソーステキストを解析した結果。
[[Context]] ECMAScript コード実行コンテキストまたは empty このモジュールに関連付けられた実行コンテキスト。モジュールの環境が初期化されるまでは empty である。
[[ImportMeta]] Object または empty import.meta メタプロパティを通じて公開されるオブジェクト。ECMAScript コードからアクセスされるまでは empty である。
[[ImportEntries]] ImportEntry レコードList このモジュールのコードから導出された ImportEntry レコードList
[[LocalExportEntries]] ExportEntry レコードList モジュール内で出現する宣言に対応する、このモジュールのコードから導出された ExportEntry レコードList
[[IndirectExportEntries]] ExportEntry レコードList モジュール内で出現する再エクスポートされたインポート、または export * as namespace 宣言からのエクスポートに対応する、このモジュールのコードから導出された ExportEntry レコードList
[[StarExportEntries]] ExportEntry レコードList モジュール内で出現する export * 宣言に対応する、このモジュールのコードから導出された ExportEntry レコードList。ただし export * as namespace 宣言は含まない。

ImportEntry レコードは、単一の宣言的インポートに関する情報を要約するレコードである。各 ImportEntry レコードは、Table 53で定義されるフィールドを持つ。

Table 53: ImportEntry レコードフィールド
フィールド名 値の型 意味
[[ModuleRequest]] ModuleRequest レコード ImportDeclarationModuleSpecifier およびインポート属性を表す ModuleRequest レコード
[[ImportName]] String または namespace [[ModuleRequest]] によって識別されるモジュールによって、目的の束縛がエクスポートされている名前。値 namespace は、インポート要求が対象モジュールの名前空間オブジェクトに対するものであることを示す。
[[LocalName]] String インポートするモジュール内で、インポートされた値にローカルにアクセスするために使用される名前。
Note 1

Table 54は、構文上のインポート形式を表すために使用される ImportEntry レコードフィールドの例を示す。

Table 54 (Informative): インポート形式から ImportEntry レコードへの対応
インポート文形式 [[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 レコードは作成されない。

ExportEntry レコードは、単一の宣言的エクスポートに関する情報を要約するレコードである。各 ExportEntry レコードは、Table 55で定義されるフィールドを持つ。

Table 55: ExportEntry レコードフィールド
フィールド名 値の型 意味
[[ExportName]] String または null このモジュールによってこの束縛をエクスポートするために使用される名前。
[[ModuleRequest]] ModuleRequest レコードまたは null ExportDeclarationModuleSpecifier およびインポート属性を表す ModuleRequest レコードExportDeclarationModuleSpecifier を持たない場合は null
[[ImportName]] String、nullnamespace、または all-but-default [[ModuleRequest]] によって識別されるモジュールによって、目的の束縛がエクスポートされている名前。ExportDeclarationModuleSpecifier を持たない場合は nullnamespaceexport * as ns from "mod" 宣言に使用される。all-but-defaultexport * from "mod" 宣言に使用される。
[[LocalName]] String または null インポートするモジュール内で、エクスポートされた値にローカルにアクセスするために使用される名前。エクスポートされた値がモジュール内からローカルにアクセス可能でない場合は null
Note 2

Table 56は、構文上のエクスポート形式を表すために使用される ExportEntry レコードフィールドの例を示す。

Table 56 (Informative): エクスポート形式から ExportEntry レコードへの対応
エクスポート文形式 [[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

以下の定義は、ソーステキストモジュールレコードに必要な具象メソッドおよびその他の抽象操作を規定する。

16.2.1.7.1 ParseModule ( sourceText, realm, hostDefined )

The abstract operation ParseModule takes arguments sourceText (ECMAScript ソーステキスト), realm (Realm レコード), and hostDefined (anything) and returns ソーステキストモジュールレコード、または SyntaxError オブジェクトの空でない List. これは sourceTextModule として解析した結果に基づいて、ソーステキストモジュールレコードを作成する。 It performs the following steps when called:

  1. bodyParseText(sourceText, Module) とする。
  2. body がエラーの List である場合、body を返す。
  3. requestedModulesbodyModuleRequests とする。
  4. importEntriesbodyImportEntries とする。
  5. importedBoundNamesImportedLocalNames(importEntries) とする。
  6. indirectExportEntries を新しい空の List とする。
  7. localExportEntries を新しい空の List とする。
  8. starExportEntries を新しい空の List とする。
  9. exportEntriesbodyExportEntries とする。
  10. exportEntries の各 ExportEntry レコード ee について、次を行う。
    1. ee.[[ModuleRequest]]null である場合、
      1. importedBoundNamesee.[[LocalName]] を含まない場合、
        1. eelocalExportEntries に追加する。
      2. それ以外の場合、
        1. NOTE: もともと別のモジュールからインポートされた束縛または名前空間オブジェクトをエクスポートする場合、ExportEntry レコードは、その束縛または名前空間オブジェクトがインポートされてからエクスポートされたのではなく、元のモジュールから直接再エクスポートされた場合に持つであろう形式に一致するように書き換えられる。これにより、export * from を通じて同じ束縛または名前空間を同じ名前で二重にエクスポートすることから生じる競合は、ソーステキストモジュールレコードの ResolveExport 具象メソッドのステップ 9.e.iii で曖昧として扱われるのではなく、無視できるようになる。
        2. ie を、[[LocalName]]ee.[[LocalName]] である importEntries の要素とする。
        3. ExportEntry レコード { [[ModuleRequest]]: ie.[[ModuleRequest]], [[ImportName]]: ie.[[ImportName]], [[LocalName]]: null, [[ExportName]]: ee.[[ExportName]] } を indirectExportEntries に追加する。
    2. そうでなく、ee.[[ImportName]]all-but-default である場合、
      1. Assert: ee.[[ExportName]]null である。
      2. eestarExportEntries に追加する。
    3. それ以外の場合、
      1. eeindirectExportEntries に追加する。
  11. asyncbody Contains await とする。
  12. Source Text Module Record { [[Realm]]: realm, [[Environment]]: empty, [[Namespace]]: empty, [[CycleRoot]]: empty, [[HasTLA]]: async, [[AsyncEvaluationOrder]]: unset, [[TopLevelCapability]]: empty, [[AsyncParentModules]]: « », [[PendingAsyncDependencies]]: empty, [[Status]]: new, [[EvaluationError]]: empty, [[HostDefined]]: hostDefined, [[ECMAScriptCode]]: body, [[Context]]: empty, [[ImportMeta]]: empty, [[RequestedModules]]: requestedModules, [[LoadedModules]]: « », [[ImportEntries]]: importEntries, [[LocalExportEntries]]: localExportEntries, [[IndirectExportEntries]]: indirectExportEntries, [[StarExportEntries]]: starExportEntries, [[DFSAncestorIndex]]: empty } を返す。
Note

実装は、そのモジュールソーステキストに対する ParseModule の評価より前に、モジュールソーステキストを解析し、早期エラー条件について解析してもよい。ただし、いかなるエラーの報告も、この仕様が実際にそのソーステキストに対して ParseModule を実行する時点まで延期されなければならない。

16.2.1.7.2 モジュールレコード抽象メソッドの実装

以下は、Table 39で定義される対応するモジュールレコード抽象メソッドを実装する、ソーステキストモジュールレコードの具象メソッドである。

16.2.1.7.2.1 GetExportedNames ( [ exportStarSet ] )

The GetExportedNames concrete method of a Source Text Module Record module takes optional argument exportStarSet (ソーステキストモジュールレコードList) and returns String の List. It performs the following steps when called:

  1. Assert: module.[[Status]]new ではない。
  2. exportStarSet が存在しない場合、exportStarSet を新しい空の List に設定する。
  3. exportStarSetmodule を含む場合、
    1. Assert: export * 循環の開始点に到達している。
    2. 新しい空の List を返す。
  4. moduleexportStarSet に追加する。
  5. exportedNames を新しい空の List とする。
  6. module.[[LocalExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. Assert: module はこのエクスポートの直接束縛を提供する。
    2. Assert: e.[[ExportName]]null ではない。
    3. e.[[ExportName]]exportedNames に追加する。
  7. module.[[IndirectExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. Assert: module はこのエクスポートのために特定の束縛をインポートする。
    2. Assert: e.[[ExportName]]null ではない。
    3. e.[[ExportName]]exportedNames に追加する。
  8. module.[[StarExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. Assert: e.[[ModuleRequest]]null ではない。
    2. requestedModuleGetImportedModule(module, e.[[ModuleRequest]]) とする。
    3. starNamesrequestedModule.GetExportedNames(exportStarSet) とする。
    4. starNames の各要素 n について、次を行う。
      1. n"default" でない場合、
        1. exportedNamesn を含まない場合、
          1. nexportedNames に追加する。
  9. exportedNames を返す。
Note

GetExportedNames は、曖昧なスターエクスポート束縛を持つ名前を除外したり、例外を投げたりしない。

16.2.1.7.2.2 ResolveExport ( exportName [ , resolveSet ] )

The ResolveExport concrete method of a Source Text Module Record module takes argument exportName (a String) and optional argument resolveSet (a List of Records with fields [[Module]] (a Module Record) and [[ExportName]] (a String)) and returns a ResolvedBinding Record, null, or ambiguous.

ResolveExport は、インポートされた束縛を、実際の定義モジュールおよびローカル束縛名に解決しようとする。定義モジュールは、このメソッドが呼び出されたモジュールレコードによって表されるモジュールである場合も、そのモジュールによってインポートされる他のモジュールである場合もある。パラメータ resolveSet は、未解決の循環インポート/エクスポート経路を検出するために使用される。特定のモジュールレコードexportName からなる組で、すでに resolveSet 内にあるものに到達した場合、インポート循環が発生している。ResolveExport を再帰的に呼び出す前に、moduleexportName からなる組が resolveSet に追加される。

定義モジュールが見つかった場合、ResolvedBinding レコード { [[Module]], [[BindingName]] } が返される。このレコードは、もともと要求されたエクスポートの解決済み束縛を識別する。ただし、これがローカル束縛を持たない名前空間のエクスポートである場合を除く。この場合、[[BindingName]]namespace に設定される。定義が見つからなかった場合、または要求が循環していることが判明した場合は、null が返される。要求が曖昧であることが判明した場合は、ambiguous が返される。

It performs the following steps when called:

  1. Assert: module.[[Status]]new ではない。
  2. resolveSet が存在しない場合、resolveSet を新しい空の List に設定する。
  3. resolveSet の各 Record { [[Module]], [[ExportName]] } r について、次を行う。
    1. moduler.[[Module]] が同じモジュールレコードであり、かつ exportNamer.[[ExportName]] である場合、
      1. Assert: これは循環インポート要求である。
      2. null を返す。
  4. Record { [[Module]]: module, [[ExportName]]: exportName } を resolveSet に追加する。
  5. module.[[LocalExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. e.[[ExportName]]exportName である場合、
      1. Assert: module はこのエクスポートの直接束縛を提供する。
      2. ResolvedBinding レコード { [[Module]]: module, [[BindingName]]: e.[[LocalName]] } を返す。
  6. module.[[IndirectExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. e.[[ExportName]]exportName である場合、
      1. Assert: e.[[ModuleRequest]]null ではない。
      2. importedModuleGetImportedModule(module, e.[[ModuleRequest]]) とする。
      3. e.[[ImportName]]namespace である場合、
        1. Assert: module はこのエクスポートの直接束縛を提供しない。
        2. ResolvedBinding レコード { [[Module]]: importedModule, [[BindingName]]: namespace } を返す。
      4. Assert: module はこのエクスポートのために特定の束縛をインポートする。
      5. Assert: e.[[ImportName]] は String である。
      6. importedModule.ResolveExport(e.[[ImportName]], resolveSet) を返す。
  7. exportName"default" である場合、
    1. Assert: default エクスポートはこのモジュールによって明示的には定義されていなかった。
    2. null を返す。
    3. NOTE: default エクスポートは export * from "mod" 宣言によって提供されることはできない。
  8. starResolutionnull とする。
  9. module.[[StarExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. Assert: e.[[ModuleRequest]]null ではない。
    2. importedModuleGetImportedModule(module, e.[[ModuleRequest]]) とする。
    3. resolutionimportedModule.ResolveExport(exportName, resolveSet) とする。
    4. resolutionambiguous である場合、ambiguous を返す。
    5. resolutionnull でない場合、
      1. Assert: resolution は ResolvedBinding レコードである。
      2. starResolutionnull である場合、
        1. starResolutionresolution に設定する。
      3. それ以外の場合、
        1. Assert: 要求された名前を含む * エクスポートが複数存在する。
        2. resolution.[[Module]]starResolution.[[Module]] が同じモジュールレコードでない場合、ambiguous を返す。
        3. resolution.[[BindingName]]starResolution.[[BindingName]] でない場合、ambiguous を返す。
  10. starResolution を返す。

16.2.1.7.3 循環モジュールレコード抽象メソッドの実装

以下は、Table 41で定義される対応する循環モジュールレコード抽象メソッドを実装する、ソーステキストモジュールレコードの具象メソッドである。

16.2.1.7.3.1 InitializeEnvironment ( )

The InitializeEnvironment concrete method of a Source Text Module Record module takes no arguments and returns unused を含む正常完了、または throw 完了. It performs the following steps when called:

  1. module.[[IndirectExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. Assert: e.[[ExportName]]null ではない。
    2. resolutionmodule.ResolveExport(e.[[ExportName]]) とする。
    3. resolutionnull または ambiguous のいずれかである場合、SyntaxError 例外を投げる。
    4. Assert: resolution は ResolvedBinding レコードである。
  2. Assert: module からのすべての名前付きエクスポートは解決可能である。
  3. realmmodule.[[Realm]] とする。
  4. Assert: realmundefined ではない。
  5. envNewModuleEnvironment(realm.[[GlobalEnv]]) とする。
  6. module.[[Environment]]env に設定する。
  7. module.[[ImportEntries]] の各 ImportEntry レコード in について、次を行う。
    1. importedModuleGetImportedModule(module, in.[[ModuleRequest]]) とする。
    2. in.[[ImportName]]namespace である場合、
      1. namespaceGetModuleNamespace(importedModule) とする。
      2. env.CreateImmutableBinding(in.[[LocalName]], true) を実行する。
      3. env.InitializeBinding(in.[[LocalName]], namespace) を実行する。
    3. それ以外の場合、
      1. Assert: in.[[ImportName]] は String である。
      2. resolutionimportedModule.ResolveExport(in.[[ImportName]]) とする。
      3. resolutionnull または ambiguous のいずれかである場合、SyntaxError 例外を投げる。
      4. resolution.[[BindingName]]namespace である場合、
        1. namespaceGetModuleNamespace(resolution.[[Module]]) とする。
        2. env.CreateImmutableBinding(in.[[LocalName]], true) を実行する。
        3. env.InitializeBinding(in.[[LocalName]], namespace) を実行する。
      5. それ以外の場合、
        1. CreateImportBinding(env, in.[[LocalName]], resolution.[[Module]], resolution.[[BindingName]]) を実行する。
  8. moduleContext を新しい ECMAScript コード実行コンテキストとする。
  9. moduleContext の Function を null に設定する。
  10. Assert: module.[[Realm]]undefined ではない。
  11. moduleContextRealmmodule.[[Realm]] に設定する。
  12. moduleContext の ScriptOrModule を module に設定する。
  13. moduleContext の VariableEnvironment を module.[[Environment]] に設定する。
  14. moduleContext の LexicalEnvironment を module.[[Environment]] に設定する。
  15. moduleContext の PrivateEnvironment を null に設定する。
  16. module.[[Context]]moduleContext に設定する。
  17. moduleContext を実行コンテキストスタックにプッシュする。moduleContext は現在の実行中の実行コンテキストである。
  18. codemodule.[[ECMAScriptCode]] とする。
  19. varDeclarationscodeVarScopedDeclarations とする。
  20. declaredVarNames を新しい空の List とする。
  21. varDeclarations の各要素 d について、次を行う。
    1. dBoundNames の各要素 dn について、次を行う。
      1. declaredVarNamesdn を含まない場合、
        1. env.CreateMutableBinding(dn, false) を実行する。
        2. env.InitializeBinding(dn, undefined) を実行する。
        3. dndeclaredVarNames に追加する。
  22. lexDeclarationscodeLexicallyScopedDeclarations とする。
  23. privateEnvnull とする。
  24. lexDeclarations の各要素 d について、次を行う。
    1. dBoundNames の各要素 dn について、次を行う。
      1. dIsConstantDeclarationtrue である場合、
        1. env.CreateImmutableBinding(dn, true) を実行する。
      2. それ以外の場合、
        1. env.CreateMutableBinding(dn, false) を実行する。
      3. dFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclaration、または AsyncGeneratorDeclaration のいずれかである場合、
        1. fo を、引数 env および privateEnv を伴う dInstantiateFunctionObject とする。
        2. env.InitializeBinding(dn, fo) を実行する。
  25. 実行コンテキストスタックから moduleContext を削除する。
  26. unused を返す。

16.2.1.7.3.2 ExecuteModule ( [ capability ] )

The ExecuteModule concrete method of a Source Text Module Record module takes optional argument capability (PromiseCapability レコード) and returns unused を含む正常完了、または throw 完了. It performs the following steps when called:

  1. Assert: module はリンク済みであり、そのモジュール環境内の宣言はインスタンス化済みである。
  2. moduleContextmodule.[[Context]] とする。
  3. module.[[HasTLA]]false である場合、
    1. Assert: capability は存在しない。
    2. 実行中の実行コンテキストを中断する。
    3. moduleContext を実行コンテキストスタックにプッシュする。moduleContext は現在の実行中の実行コンテキストである。
    4. resultCompletion(module.[[ECMAScriptCode]]Evaluation) とする。
    5. moduleContext を中断し、実行コンテキストスタックから削除する。
    6. 実行コンテキストスタックの最上位にあるコンテキストを実行中の実行コンテキストとして再開する。
    7. result が中途完了である場合、
      1. result を返す。
  4. それ以外の場合、
    1. Assert: capability は PromiseCapability レコードである。
    2. AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleContext) を実行する。
  5. unused を返す。

16.2.1.8 合成モジュールレコード

合成モジュールレコードは、仕様によって定義されたモジュールに関する情報を表すために使用される。そのエクスポート名は作成時に静的に定義されるが、それに対応する値は SetSyntheticModuleExport を用いて時間の経過とともに変更できる。インポートや依存関係は持たない。

Note
合成モジュールレコードは、さまざまな種類のモジュールを定義するために使用できる。例えば、JSON モジュールや CSS モジュールなどである。

Table 38で定義されるフィールドに加えて、合成モジュールレコードはTable 57に列挙される追加フィールドを持つ。

Table 57: 合成モジュールレコードの追加フィールド
フィールド名 値の型 意味
[[ExportNames]] String の List このモジュールのエクスポート名。このリストには重複は含まれない。
[[EvaluationSteps]] 抽象クロージャ モジュール評価時に実行される初期化ロジックであり、唯一の引数として合成モジュールレコードを受け取る。[[ExportNames]] を変更してはならない。中途完了を返すことがある。

16.2.1.8.1 CreateDefaultExportSyntheticModule ( defaultExport )

The abstract operation CreateDefaultExportSyntheticModule takes argument defaultExport (ECMAScript 言語値) and returns 合成モジュールレコード. デフォルトエクスポートが defaultExport である合成モジュールレコードを作成する。 It performs the following steps when called:

  1. realm を現在の Realm レコードとする。
  2. setDefaultExport を、引数 (module) を取り defaultExport をキャプチャする新しい抽象クロージャとし、呼び出されたときに以下を実行する:
    1. SetSyntheticModuleExport(module, "default", defaultExport) を実行する。
    2. NormalCompletion(unused) を返す。
  3. 合成モジュールレコード { [[Realm]]: realm, [[Environment]]: empty, [[Namespace]]: empty, [[HostDefined]]: undefined, [[ExportNames]]: « "default" », [[EvaluationSteps]]: setDefaultExport } を返す。

16.2.1.8.2 ParseJSONModule ( source )

The abstract operation ParseJSONModule takes argument source (String) and returns 合成モジュールレコードを含む正常完了、または throw 完了. It performs the following steps when called:

  1. parseResult を ? ParseJSON(source) とする。
  2. CreateDefaultExportSyntheticModule(parseResult.[[Value]]) を返す。

16.2.1.8.3 SetSyntheticModuleExport ( module, exportName, exportValue )

The abstract operation SetSyntheticModuleExport takes arguments module (合成モジュールレコード), exportName (String), and exportValue (ECMAScript 言語値) and returns unused. 合成モジュールレコードの既存のエクスポートに対して、エクスポート値を設定または変更するために使用できる。 It performs the following steps when called:

  1. Assert: module.[[ExportNames]]exportName を含む。
  2. envRecmodule.[[Environment]] とする。
  3. Assert: envRecempty ではない。
  4. envRec.SetMutableBinding(exportName, exportValue, true) を実行する。
  5. unused を返す。

16.2.1.8.4 モジュールレコード抽象メソッドの実装

以下は、Table 39で定義される対応するモジュールレコード抽象メソッドを実装する、合成モジュールレコードの具象メソッドである。

16.2.1.8.4.1 LoadRequestedModules ( [ hostDefined ] )

The LoadRequestedModules concrete method of a Synthetic Module Record module takes optional argument hostDefined (anything) and returns Promise. It performs the following steps when called:

  1. NOTE: この LoadRequestedModules の実装は hostDefined を使用しない。
  2. PromiseResolve(%Promise%, undefined) を返す。
Note
合成モジュールレコードは依存関係を持たない。

16.2.1.8.4.2 GetExportedNames ( [ exportStarSet ] )

The GetExportedNames concrete method of a Synthetic Module Record module takes optional argument exportStarSet (ソーステキストモジュールレコードList) and returns String の List. It performs the following steps when called:

  1. NOTE: この GetExportedNames の実装は exportStarSet を使用しない。
  2. module.[[ExportNames]] を返す。

16.2.1.8.4.3 ResolveExport ( exportName [ , resolveSet ] )

The ResolveExport concrete method of a Synthetic Module Record module takes argument exportName (a String) and optional argument resolveSet (a List of Records with fields [[Module]] (a Module Record) and [[ExportName]] (a String)) and returns a ResolvedBinding Record, null, or ambiguous. It performs the following steps when called:

  1. NOTE: この ResolveExport の実装は resolveSet を使用しない。
  2. module.[[ExportNames]]exportName を含まない場合、null を返す。
  3. ResolvedBinding レコード { [[Module]]: module, [[BindingName]]: exportName } を返す。

16.2.1.8.4.4 Link ( )

The Link concrete method of a Synthetic Module Record module takes no arguments and returns unused を含む正常完了. It performs the following steps when called:

  1. realmmodule.[[Realm]] とする。
  2. envNewModuleEnvironment(realm.[[GlobalEnv]]) とする。
  3. module.[[Environment]]env に設定する。
  4. module.[[ExportNames]] の各 String exportName について、次を行う。
    1. env.CreateMutableBinding(exportName, false) を実行する。
    2. env.InitializeBinding(exportName, undefined) を実行する。
  5. NormalCompletion(unused) を返す。

16.2.1.8.4.5 Evaluate ( )

The Evaluate concrete method of a Synthetic Module Record module takes no arguments and returns Promise. It performs the following steps when called:

  1. moduleContext を新しい ECMAScript コード実行コンテキストとする。
  2. moduleContext の Function を null に設定する。
  3. moduleContextRealmmodule.[[Realm]] に設定する。
  4. moduleContext の ScriptOrModule を module に設定する。
  5. moduleContext の VariableEnvironment を module.[[Environment]] に設定する。
  6. moduleContext の LexicalEnvironment を module.[[Environment]] に設定する。
  7. 実行中の実行コンテキストを中断する。
  8. moduleContext を実行コンテキストスタックにプッシュする。moduleContext は現在の実行中の実行コンテキストである。
  9. stepsmodule.[[EvaluationSteps]] とする。
  10. resultCompletion(steps(module)) とする。
  11. moduleContext を中断し、実行コンテキストスタックから削除する。
  12. 実行コンテキストスタックの最上位にあるコンテキストを実行中の実行コンテキストとして再開する。
  13. pc を ! NewPromiseCapability(%Promise%) とする。
  14. IfAbruptRejectPromise(result, pc)。
  15. Call(pc.[[Resolve]], undefined, « undefined ») を実行する。
  16. pc.[[Promise]] を返す。

16.2.1.9 GetImportedModule ( referrer, request )

The abstract operation GetImportedModule takes arguments referrer (循環モジュールレコード) and request (ModuleRequest レコード) and returns モジュールレコード. It performs the following steps when called:

  1. records を、referrer.[[LoadedModules]] の各 LoadedModuleRequest レコード r のうち ModuleRequestsEqual(r, request) が true であるものからなる List とする。
  2. Assert: この抽象操作を呼び出す前に referrer に対して LoadRequestedModules が正常に完了しているため、records はちょうど 1 要素を持つ。
  3. recordrecords の唯一の要素とする。
  4. record.[[Module]] を返す。

16.2.1.10 HostLoadImportedModule ( referrer, moduleRequest, hostDefined, payload )

The host-defined abstract operation HostLoadImportedModule takes arguments referrer (スクリプトレコード循環モジュールレコード、または Realm レコード), moduleRequest (ModuleRequest レコード), hostDefined (anything), and payload (GraphLoadingState レコードまたは PromiseCapability レコード) and returns unused.

Note 1

referrerRealm レコードとなり得る例として、Web ブラウザホストがある。例えば、ユーザーが以下のようなコントロールをクリックした場合:

<button type="button" onclick="import('./foo.mjs')">Click me</button>

import() 式が実行される時点では、アクティブなスクリプトやモジュールは存在しない。より一般的には、これはホストが ScriptOrModule コンポーネントが null の実行コンテキストを実行コンテキストスタックにプッシュする状況で発生し得る。

HostLoadImportedModule の実装は、以下の要件に従わなければならない:

  • ホスト環境は FinishLoadingImportedModule(referrer, moduleRequest, payload, result) を実行しなければならない。ここで result は、ロードされたモジュールレコードを含む正常完了、または throw 完了のいずれかであり、同期または非同期で行われ得る。
  • この操作が、次の条件を満たす 2 つの (referrer, moduleRequest) の組に対して複数回呼び出される場合:

    • 最初の referrer が 2 番目の referrer と同一である;
    • ModuleRequestsEqual(最初の moduleRequest, 2 番目の moduleRequest) が true である;

    そして FinishLoadingImportedModule(referrer, moduleRequest, payload, result) を実行し、result が正常完了である場合、毎回同じ result を用いて FinishLoadingImportedModule を実行しなければならない。

  • moduleRequest.[[Attributes]] において、entry.[[Key]]"type" かつ entry.[[Value]]"json" であるエントリ entry が存在する場合、ホスト環境が FinishLoadingImportedModule(referrer, moduleRequest, payload, result) を実行する際、resultParseJSONModule の呼び出しによって返された Completion Record、または throw 完了のいずれかでなければならない。

  • この操作は、payload を不透明な値として扱い、そのまま FinishLoadingImportedModule に渡さなければならない。

実際に行われる処理はホスト定義であるが、通常は適切なモジュールレコードをロードするために必要な I/O 操作を実行することからなる。複数の (referrer, moduleRequest.[[Specifier]], moduleRequest.[[Attributes]]) の組が同一のモジュールレコードインスタンスに対応する場合がある。実際の対応付けの意味論はホスト定義であるが、通常は対応付けの過程で specifier に対して正規化処理が適用される。典型的な正規化処理には、相対パスや省略されたパス指定子の展開などが含まれる。

Note 2

上記のテキストは、type: "json" でインポートされた場合にホストが JSON モジュールをサポートすること(かつ HostLoadImportedModule が正常完了すること)を要求しているが、type: "json" を指定せずにインポートされた場合に JSON モジュールをサポートすることを禁止するものではない。

16.2.1.11 FinishLoadingImportedModule ( referrer, moduleRequest, payload, result )

The abstract operation FinishLoadingImportedModule takes arguments referrer (スクリプトレコード循環モジュールレコード、または Realm レコード), moduleRequest (ModuleRequest レコード), payload (GraphLoadingState レコードまたは PromiseCapability レコード), and result (モジュールレコードを含む正常完了、または throw 完了) and returns unused. It performs the following steps when called:

  1. result が正常完了である場合、
    1. referrer.[[LoadedModules]] において、ModuleRequestsEqual(record, moduleRequest) が true である LoadedModuleRequest レコード record が含まれている場合、
      1. Assert: record.[[Module]]result.[[Value]] は同一のモジュールレコードである。
    2. それ以外の場合、
      1. LoadedModuleRequest レコード { [[Specifier]]: moduleRequest.[[Specifier]], [[Attributes]]: moduleRequest.[[Attributes]], [[Module]]: result.[[Value]] } を referrer.[[LoadedModules]] に追加する。
  2. payloadGraphLoadingState レコードである場合、
    1. ContinueModuleLoading(payload, result) を実行する。
  3. それ以外の場合、
    1. ContinueDynamicImport(payload, result) を実行する。
  4. unused を返す。

16.2.1.12 AllImportAttributesSupported ( attributes )

The abstract operation AllImportAttributesSupported takes argument attributes (ImportAttribute レコードList) and returns Boolean. It performs the following steps when called:

  1. supportedHostGetSupportedImportAttributes() とする。
  2. attributes の各 ImportAttribute レコード attribute について、次を行う。
    1. supportedattribute.[[Key]] を含まない場合、false を返す。
  3. true を返す。

16.2.1.12.1 HostGetSupportedImportAttributes ( )

The host-defined abstract operation HostGetSupportedImportAttributes takes no arguments and returns String の List. ホスト環境がサポートするインポート属性を指定できるようにする。サポートされているキーを持つ属性のみがホストに提供される。

HostGetSupportedImportAttributes の実装は、以下の要件に従わなければならない:

  • 各要素がサポートされる属性を示す String である List を返さなければならない。
  • この操作が呼び出されるたびに、同じ内容を同じ順序で持つ同一の List を返さなければならない。

HostGetSupportedImportAttributes のデフォルト実装は、新しい空の List を返すことである。

Note
ホストにすべての属性を渡してどれを処理するか選択させるのではなく、サポートするインポート属性をホストに明示させる目的は、未サポートの属性が異なるホスト間で一貫した方法で処理されることを保証するためである。

16.2.1.13 GetModuleNamespace ( module )

The abstract operation GetModuleNamespace takes argument module (Module Record の具体的サブクラスのインスタンス) and returns モジュール名前空間オブジェクト. module のエクスポートを表すモジュール名前空間オブジェクトを取得し、最初に要求されたときに遅延生成し、将来の取得のために module.[[Namespace]] に保存する。 It performs the following steps when called:

  1. Assert: module循環モジュールレコードである場合、module.[[Status]]new または unlinked ではない。
  2. namespacemodule.[[Namespace]] とする。
  3. namespaceempty である場合、
    1. exportedNamesmodule.GetExportedNames() とする。
    2. unambiguousNames を新しい空の List とする。
    3. exportedNames の各要素 name について、次を行う。
      1. resolutionmodule.ResolveExport(name) とする。
      2. resolution が ResolvedBinding レコードである場合、nameunambiguousNames に追加する。
    4. namespaceModuleNamespaceCreate(module, unambiguousNames) とする。
  4. namespace を返す。
Note

GetModuleNamespace は決して例外を投げない。その代わり、この時点では解決不能な名前は単に名前空間から除外される。それらは、どこからも明示的に要求されていない曖昧なスターエクスポートのみでない限り、後に実際のリンクエラーを引き起こす。

16.2.1.14 Runtime Semantics: 評価

Module : [empty]
  1. undefined を返す。
ModuleBody : ModuleItemList
  1. resultCompletion(ModuleItemListEvaluation) とする。
  2. result が正常完了であり、かつ result.[[Value]]empty の場合、
    1. undefined を返す。
  3. result を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. sl を ? ModuleItemListEvaluation とする。
  2. sCompletion(ModuleItemEvaluation) とする。
  3. UpdateEmpty(s, sl) を返す。
Note

ModuleItemList の値は、その中の最後の値を生成する項目の値である。

ModuleItem : ImportDeclaration
  1. empty を返す。

16.2.2 インポート

構文

ImportDeclaration : import ImportClause FromClause WithClauseopt ; import ModuleSpecifier WithClauseopt ; ImportClause : ImportedDefaultBinding NameSpaceImport NamedImports ImportedDefaultBinding , NameSpaceImport ImportedDefaultBinding , NamedImports ImportedDefaultBinding : ImportedBinding NameSpaceImport : * as ImportedBinding NamedImports : { } { ImportsList } { ImportsList , } FromClause : from ModuleSpecifier ImportsList : ImportSpecifier ImportsList , ImportSpecifier ImportSpecifier : ImportedBinding ModuleExportName as ImportedBinding ModuleSpecifier : StringLiteral ImportedBinding : BindingIdentifier[~Yield, +Await] WithClause : with { } with { WithEntries ,opt } WithEntries : AttributeKey : StringLiteral AttributeKey : StringLiteral , WithEntries AttributeKey : IdentifierName StringLiteral

16.2.2.1 Static Semantics: 早期エラー

ModuleItem : ImportDeclaration WithClause : with { WithEntries ,opt }
  • WithClauseWithClauseToAttributes に、a.[[Key]]b.[[Key]] であるような2つの異なるエントリ ab がある場合、これは Syntax Error である。

16.2.2.2 Static Semantics: ImportEntries

The syntax-directed operation ImportEntries takes no arguments and returns ImportEntry レコードのリスト. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空の List を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. entries1ModuleItemListImportEntries とする。
  2. entries2ModuleItemImportEntries とする。
  3. entries1entries2 のリスト連結を返す。
ModuleItem : ExportDeclaration StatementListItem
  1. 新しい空の List を返す。
ImportDeclaration : import ImportClause FromClause WithClauseopt ;
  1. moduleImportDeclarationModuleRequests の唯一の要素とする。
  2. 引数 module を用いた ImportClauseImportEntriesForModule を返す。
ImportDeclaration : import ModuleSpecifier WithClauseopt ;
  1. 新しい空の List を返す。

16.2.2.3 Static Semantics: ImportEntriesForModule

The syntax-directed operation ImportEntriesForModule takes argument module (ModuleRequest レコード) and returns ImportEntry レコードのリスト. It is defined piecewise over the following productions:

ImportClause : ImportedDefaultBinding , NameSpaceImport
  1. entries1 を、引数 module を用いた ImportedDefaultBindingImportEntriesForModule とする。
  2. entries2 を、引数 module を用いた NameSpaceImportImportEntriesForModule とする。
  3. entries1entries2 のリスト連結を返す。
ImportClause : ImportedDefaultBinding , NamedImports
  1. entries1 を、引数 module を用いた ImportedDefaultBindingImportEntriesForModule とする。
  2. entries2 を、引数 module を用いた NamedImportsImportEntriesForModule とする。
  3. entries1entries2 のリスト連結を返す。
ImportedDefaultBinding : ImportedBinding
  1. localNameImportedBindingBoundNames の唯一の要素とする。
  2. defaultEntryImportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: "default", [[LocalName]]: localName } とする。
  3. « defaultEntry » を返す。
NameSpaceImport : * as ImportedBinding
  1. localNameImportedBindingStringValue とする。
  2. entryImportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: namespace, [[LocalName]]: localName } とする。
  3. « entry » を返す。
NamedImports : { }
  1. 新しい空の List を返す。
ImportsList : ImportsList , ImportSpecifier
  1. specs1 を、引数 module を用いた ImportsListImportEntriesForModule とする。
  2. specs2 を、引数 module を用いた ImportSpecifierImportEntriesForModule とする。
  3. specs1specs2 のリスト連結を返す。
ImportSpecifier : ImportedBinding
  1. localNameImportedBindingBoundNames の唯一の要素とする。
  2. entryImportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: localName, [[LocalName]]: localName } とする。
  3. « entry » を返す。
ImportSpecifier : ModuleExportName as ImportedBinding
  1. importNameModuleExportNameStringValue とする。
  2. localNameImportedBindingStringValue とする。
  3. entryImportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName } とする。
  4. « entry » を返す。

16.2.2.4 Static Semantics: WithClauseToAttributes

The syntax-directed operation WithClauseToAttributes takes no arguments and returns ImportAttribute レコードのリスト. It is defined piecewise over the following productions:

WithClause : with { }
  1. 新しい空の List を返す。
WithClause : with { WithEntries ,opt }
  1. attributesWithEntriesWithClauseToAttributes とする。
  2. attributes をそれらの [[Key]] フィールドの辞書式順序に従ってソートし、そのような各フィールドの値を UTF-16 コード単位値のシーケンスとして扱う。注: このソートが観測可能なのは、ホストが属性の列挙順序に基づいて振る舞いを変更することを禁止されているという点に限られる。
  3. attributes を返す。
WithEntries : AttributeKey : StringLiteral
  1. keyAttributeKeyPropName とする。
  2. entryImportAttribute レコード { [[Key]]: key, [[Value]]: StringLiteralSV } とする。
  3. « entry » を返す。
WithEntries : AttributeKey : StringLiteral , WithEntries
  1. keyAttributeKeyPropName とする。
  2. entryImportAttribute レコード { [[Key]]: key, [[Value]]: StringLiteralSV } とする。
  3. restWithEntriesWithClauseToAttributes とする。
  4. « entry » と rest のリスト連結を返す。

16.2.3 エクスポート

構文

ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ; export VariableStatement[~Yield, +Await] export Declaration[~Yield, +Await] export default HoistableDeclaration[~Yield, +Await, +Default] export default ClassDeclaration[~Yield, +Await, +Default] export default [lookahead ∉ { function, async [no LineTerminator here] function, class }] AssignmentExpression[+In, ~Yield, +Await] ; ExportFromClause : * * as ModuleExportName NamedExports NamedExports : { } { ExportsList } { ExportsList , } ExportsList : ExportSpecifier ExportsList , ExportSpecifier ExportSpecifier : ModuleExportName ModuleExportName as ModuleExportName

16.2.3.1 Static Semantics: 早期エラー

ExportDeclaration : export NamedExports ; Note

上記の規則は、NamedExports の各 ReferencedBindingsIdentifierReference として扱われることを意味する。

16.2.3.2 Static Semantics: ExportedBindings

The syntax-directed operation ExportedBindings takes no arguments and returns String のリスト.

Note

ExportedBindings は、ModuleExportedNames と明示的に関連付けられるローカル束縛名である。

It is defined piecewise over the following productions:

ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemListExportedBindings とする。
  2. names2ModuleItemExportedBindings とする。
  3. names1names2 のリスト連結を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空の List を返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. 新しい空の List を返す。
ExportDeclaration : export NamedExports ;
  1. NamedExportsExportedBindings を返す。
ExportDeclaration : export VariableStatement
  1. VariableStatementBoundNames を返す。
ExportDeclaration : export Declaration
  1. DeclarationBoundNames を返す。
ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. この ExportDeclarationBoundNames を返す。
NamedExports : { }
  1. 新しい空の List を返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsListExportedBindings とする。
  2. names2ExportSpecifierExportedBindings とする。
  3. names1names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. ModuleExportNameStringValue を唯一の要素とする List を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 最初の ModuleExportNameStringValue を唯一の要素とする List を返す。

16.2.3.3 Static Semantics: ExportedNames

The syntax-directed operation ExportedNames takes no arguments and returns String のリスト.

Note

ExportedNames は、Module がそのローカル名束縛の1つに明示的に対応付ける、外部から見える名前である。

It is defined piecewise over the following productions:

ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemListExportedNames とする。
  2. names2ModuleItemExportedNames とする。
  3. names1names2 のリスト連結を返す。
ModuleItem : ExportDeclaration
  1. ExportDeclarationExportedNames を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空の List を返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. ExportFromClauseExportedNames を返す。
ExportFromClause : *
  1. 新しい空の List を返す。
ExportFromClause : * as ModuleExportName
  1. ModuleExportNameStringValue を唯一の要素とする List を返す。
ExportFromClause : NamedExports
  1. NamedExportsExportedNames を返す。
ExportDeclaration : export VariableStatement
  1. VariableStatementBoundNames を返す。
ExportDeclaration : export Declaration
  1. DeclarationBoundNames を返す。
ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. « "default" » を返す。
NamedExports : { }
  1. 新しい空の List を返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsListExportedNames とする。
  2. names2ExportSpecifierExportedNames とする。
  3. names1names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. ModuleExportNameStringValue を唯一の要素とする List を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 2番目の ModuleExportNameStringValue を唯一の要素とする List を返す。

16.2.3.4 Static Semantics: ExportEntries

The syntax-directed operation ExportEntries takes no arguments and returns ExportEntry レコードのリスト. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空の List を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. entries1ModuleItemListExportEntries とする。
  2. entries2ModuleItemExportEntries とする。
  3. entries1entries2 のリスト連結を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空の List を返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. moduleExportDeclarationModuleRequests の唯一の要素とする。
  2. 引数 module を用いた ExportFromClauseExportEntriesForModule を返す。
ExportDeclaration : export NamedExports ;
  1. 引数 null を用いた NamedExportsExportEntriesForModule を返す。
ExportDeclaration : export VariableStatement
  1. entries を新しい空の List とする。
  2. namesVariableStatementBoundNames とする。
  3. names の各要素 name について、次を行う。
    1. ExportEntry レコード { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name } を entries に追加する。
  4. entries を返す。
ExportDeclaration : export Declaration
  1. entries を新しい空の List とする。
  2. namesDeclarationBoundNames とする。
  3. names の各要素 name について、次を行う。
    1. ExportEntry レコード { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name } を entries に追加する。
  4. entries を返す。
ExportDeclaration : export default HoistableDeclaration
  1. namesHoistableDeclarationBoundNames とする。
  2. localNamenames の唯一の要素とする。
  3. 新しい ExportEntry レコード { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" } を唯一の要素とする List を返す。
ExportDeclaration : export default ClassDeclaration
  1. namesClassDeclarationBoundNames とする。
  2. localNamenames の唯一の要素とする。
  3. 新しい ExportEntry レコード { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" } を唯一の要素とする List を返す。
ExportDeclaration : export default AssignmentExpression ;
  1. entryExportEntry レコード { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: "*default*", [[ExportName]]: "default" } とする。
  2. « entry » を返す。
Note

"*default*" は、匿名 default export 値の合成名として、この仕様内で使用される。詳細はこの注記を参照。

16.2.3.5 Static Semantics: ExportEntriesForModule

The syntax-directed operation ExportEntriesForModule takes argument module (ModuleRequest レコードまたは null) and returns ExportEntry レコードのリスト. It is defined piecewise over the following productions:

ExportFromClause : *
  1. entryExportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: all-but-default, [[LocalName]]: null, [[ExportName]]: null } とする。
  2. « entry » を返す。
ExportFromClause : * as ModuleExportName
  1. exportNameModuleExportNameStringValue とする。
  2. entryExportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: namespace, [[LocalName]]: null, [[ExportName]]: exportName } とする。
  3. « entry » を返す。
NamedExports : { }
  1. 新しい空の List を返す。
ExportsList : ExportsList , ExportSpecifier
  1. specs1 を、引数 module を用いた ExportsListExportEntriesForModule とする。
  2. specs2 を、引数 module を用いた ExportSpecifierExportEntriesForModule とする。
  3. specs1specs2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. sourceNameModuleExportNameStringValue とする。
  2. modulenull である場合、
    1. localNamesourceName とする。
    2. importNamenull とする。
  3. それ以外の場合、
    1. localNamenull とする。
    2. importNamesourceName とする。
  4. 新しい ExportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: sourceName } を唯一の要素とする List を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. sourceName を最初の ModuleExportNameStringValue とする。
  2. exportName を2番目の ModuleExportNameStringValue とする。
  3. modulenull である場合、
    1. localNamesourceName とする。
    2. importNamenull とする。
  4. それ以外の場合、
    1. localNamenull とする。
    2. importNamesourceName とする。
  5. 新しい ExportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: exportName } を唯一の要素とする List を返す。

16.2.3.6 Static Semantics: ReferencedBindings

The syntax-directed operation ReferencedBindings takes no arguments and returns Parse Node のリスト. It is defined piecewise over the following productions:

NamedExports : { }
  1. 新しい空の List を返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsListReferencedBindings とする。
  2. names2ExportSpecifierReferencedBindings とする。
  3. names1names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 最初の ModuleExportNameReferencedBindings を返す。
ModuleExportName : IdentifierName
  1. IdentifierName を唯一の要素とする List を返す。
ModuleExportName : StringLiteral
  1. StringLiteral を唯一の要素とする List を返す。

16.2.3.7 Runtime Semantics: Evaluation

ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ;
  1. empty を返す。
ExportDeclaration : export VariableStatement
  1. VariableStatementEvaluation を ? で返す。
ExportDeclaration : export Declaration
  1. DeclarationEvaluation を ? で返す。
ExportDeclaration : export default HoistableDeclaration
  1. HoistableDeclarationEvaluation を ? で返す。
ExportDeclaration : export default ClassDeclaration
  1. valueClassDeclarationBindingClassDeclarationEvaluation の ? 結果とする。
  2. classNameClassDeclarationBoundNames の唯一の要素とする。
  3. className"*default*" である場合、
    1. env を実行中の実行コンテキストの LexicalEnvironment とする。
    2. InitializeBoundName("*default*", value, env) を ? で実行する。
  4. empty を返す。
ExportDeclaration : export default AssignmentExpression ;
  1. IsAnonymousFunctionDefinition(AssignmentExpression) が true である場合、
    1. value を、引数 "default" を用いた AssignmentExpressionNamedEvaluation の ? 結果とする。
  2. それ以外の場合、
    1. rhsAssignmentExpressionEvaluation の ? 結果とする。
    2. valueGetValue(rhs) の ? 結果とする。
  3. env を実行中の実行コンテキストの LexicalEnvironment とする。
  4. InitializeBoundName("*default*", value, env) を ? で実行する。
  5. empty を返す。

17 Error Handling and Language Extensions

実装は、関連するECMAScript言語構成が評価される時点でほとんどのエラーを報告しなければならない。An early error は、そのエラーを含む Script 内のいかなる構成要素の評価より前に検出および報告できるエラーである。早期エラーの存在はその構成要素の評価を妨げる。実装は ParseScript において当該 Script を解析する際に Script 内の早期エラーを報告しなければならない。Module 内の早期エラーは Module が評価される時点で報告され、Module は決して初期化されない。eval コード内の早期エラーは eval が呼び出された時に報告され、eval コードの評価を防ぐ。早期エラーでないすべてのエラーはランタイムエラーである。

実装は、本仕様の「Static Semantics: Early Errors」小節に列挙されている条件が発生した場合、それを早期エラーとして報告しなければならない。

コンパイラがある構成がいかなる状況でもエラーなく実行できないと証明できる場合であっても、実装は他の種類のエラーを早期エラーとして扱ってはならない。そのような場合に実装は早期警告を発することができるが、該当する構成が実際に実行されるまでエラーを報告すべきではない。

実装は以下を除き、指定されたとおりにすべてのエラーを報告しなければならない:

17.1 Forbidden Extensions

実装は次の方法で本仕様を拡張してはならない:

  • 厳格モードのコードで構文上のコンストラクタを使って定義された ECMAScript 関数オブジェクトは、"caller" または "arguments" という名前の own プロパティを持って作成してはならない。そのような own プロパティは、ArrowFunctionMethodDefinitionGeneratorDeclarationGeneratorExpressionAsyncGeneratorDeclarationAsyncGeneratorExpressionClassDeclarationClassExpressionAsyncFunctionDeclarationAsyncFunctionExpression、または AsyncArrowFunction を使用して定義された関数オブジェクトについても、定義が厳格モードコード内に含まれているかどうかにかかわらず作成してはならない。組み込み関数、Function コンストラクタを使用して作成された厳格関数、Generator コンストラクタを使用して作成されたジェネレータ関数、AsyncFunction コンストラクタを使用して作成された async 関数、および bind メソッドを使用して作成された関数も同様にそのような own プロパティを持って作成してはならない。
  • 実装が own プロパティ名を "caller" として任意の関数オブジェクトを拡張する場合、そのプロパティの値は [[Get]] または [[GetOwnProperty]] を使用して観察したときに厳格関数オブジェクトであってはならない。もしそれがアクセサプロパティであるなら、そのプロパティの [[Get]] 属性の値である関数は、呼び出されたときに決して厳格関数を返してはならない。
  • マップされた引数オブジェクトでもマップされていない引数オブジェクトでも、"caller" という own プロパティを持って作成してはならない。
  • ECMA-402 に記載されているような組み込みメソッド(例えば toLocaleString と名付けられたもの)の振る舞いは、ECMA-402 で指定されている場合を除き拡張してはならない。
  • 22.2.1 および B.1.2 の RegExp パターン文法は、[UnicodeMode] 文法パラメータが存在する場合にソース文字 A-Z または a-z のいずれかを IdentityEscape[+UnicodeMode] として認識するように拡張してはならない。
  • 構文文法は、BindingIdentifier 非終端記号にマッチするソーステキストに直ちにトークン : が続くことを許すような形で拡張してはならない。
  • 厳格モードコードを処理する際、実装は 12.9.3.1 の早期エラー規則を緩和してはならない。
  • TemplateEscapeSequence12.9.4 で定義される LegacyOctalEscapeSequence または NonOctalDecimalEscapeSequence を含むように拡張してはならない。
  • 厳格モードコードを処理する際、B.3.1B.3.2B.3.3、および B.3.5 で定義された拡張はサポートしてはならない。
  • Module 目標記号の解析時には、B.1.1 で定義された字句文法の拡張をサポートしてはならない。
  • ImportCall は拡張してはならない。

18 ECMAScript Standard Built-in Objects

ECMAScript の Script または Module が実行を開始する際に利用可能ないくつかの組み込みオブジェクトがある。ひとつはグローバルオブジェクトであり、実行中のプログラムのグローバル環境の一部である。他はグローバルオブジェクトの初期プロパティとして、またはアクセス可能な組み込みオブジェクトのプロパティを通じて間接的にアクセス可能である。

特に指定がない限り、関数として呼び出し可能な組み込みオブジェクトは 10.3 に記述された特性を持つ組み込み関数オブジェクトである。特に指定がない限り、組み込みオブジェクトの [[Extensible]] 内部スロットは初期値として true を持つ。すべての組み込み関数オブジェクトは [[Realm]] 内部スロットを持ち、その値はオブジェクトが最初に作成されたレルムのレコードである。

多くの組み込みオブジェクトは関数であり、引数を指定して呼び出すことができる。さらにそれらのうちいくつかはコンストラクタであり、new 演算子で使うことを意図した関数である。各組み込み関数について、本仕様はその関数が要求する引数とその関数オブジェクトのプロパティを記述する。各組み込みコンストラクタについては、さらにそのコンストラクタの prototype オブジェクトのプロパティおよびそのコンストラクタを呼び出す new 式によって返される特定のオブジェクトインスタンスのプロパティを記述する。

特定の関数の記述で別段の指定がない限り、組み込み関数またはコンストラクタに指定された必要引数より少ない引数が与えられた場合、その関数またはコンストラクタは、各不足引数が undefined 値であるかのように振る舞わなければならない。そのような不足引数は「存在しない」と見なされ、仕様アルゴリズムによってそのように識別され得る。特定の関数の記述において、「this 値」および「NewTarget」という用語は 10.3 に与えられた意味を持つ。

特定の関数の記述で別段の指定がない限り、記述された組み込み関数またはコンストラクタに指定された許容引数より多くの引数が与えられた場合、追加の引数は呼び出しにより評価され、その後関数によって無視される。ただし、実装はそのような引数に関して実装特有の振る舞いを定義することができるが、その振る舞いが単に余分な引数の存在を理由に TypeError を投げることを含んではならない。

Note 1

組み込み関数の集合に追加的な機能を加える実装は、既存関数に新しいパラメータを追加するのではなく、新しい関数を追加する方法で行うことが推奨される。

特に指定がない限り、すべての組み込み関数およびすべての組み込みコンストラクタは Function prototype オブジェクト(式 Function.prototype の初期値としてのオブジェクト、20.2.3)をその [[Prototype]] 内部スロットの値として持つ。

特に指定がない限り、すべての組み込みプロトタイプオブジェクトは Object prototype オブジェクト(式 Object.prototype の初期値、20.1.3)をその [[Prototype]] 内部スロットの値として持つ(Object prototype オブジェクト自体を除く)。

もし本仕様が組み込みコンストラクタの振る舞いをアルゴリズム手順で定義するなら、それは [[Call]][[Construct]] の双方に対する振る舞いである。もしそのようなアルゴリズムが二つの場合を区別する必要があるなら、NewTarget が undefined かどうかをチェックし、undefined であれば [[Call]] 呼び出しを示す。

組み込み関数オブジェクトで、その関数がコンストラクタとして識別されていないものは、特に指定がない限り [[Construct]] 内部メソッドを実装しない。

組み込み関数オブジェクトでコンストラクタでないものは、特に指定がない限り "prototype" プロパティを持たない。

本仕様で定義された各組み込み関数は CreateBuiltinFunction 抽象操作 (10.3.4) を呼び出すことによって作成される。length および name パラメータの値は、後述の "length" および "name" プロパティの初期値である。prefix パラメータの値についても同様に後述する。

すべての組み込み関数オブジェクト(コンストラクタを含む)は "length" プロパティを持ち、その値は非負の整数 Number である。特に指定がない限り、この値は関数記述の小節見出しに示された必要パラメータの数である。オプションパラメータおよびレストパラメータはパラメータ数に含まれない。

Note 2

例えば、Array prototype オブジェクトの "map" プロパティの初期値である関数オブジェクトは小節見出し «Array.prototype.map (callback [ , thisArg])» の下に記述され、二つの名前付き引数 callback と thisArg が示されるが後者はオプションである。したがってその関数オブジェクトの "length" プロパティの値は 1𝔽 である。

特に指定がない限り、組み込み関数オブジェクトの "length" プロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

すべての組み込み関数オブジェクト(コンストラクタを含む)は "name" プロパティを持ち、その値は文字列である。特に指定がない限り、この値は本仕様で関数に与えられた名前である。無名関数として識別される関数は空文字列を "name" プロパティの値として使用する。オブジェクトのプロパティとして指定される関数については、名前の値はその関数にアクセスするために用いられるプロパティ名文字列である。組み込みプロパティの get または set アクセサ関数として指定された関数には、CreateBuiltinFunction を呼び出す際に prefix パラメータとしてそれぞれ "get" または "set" が渡される。

"name" プロパティの値は、プロパティキーが Symbol 値である各組み込み関数について明示的に指定される。もしそのように明示的に指定された値が "get " または "set " のプレフィックスで始まり、かつそれが組み込みプロパティの get または set アクセサ関数であるなら、プレフィックスを除いた値が name パラメータに渡され、プレフィックス "get" または "set"(それぞれ)が CreateBuiltinFunction を呼ぶ際に 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 グローバルオブジェクト

The グローバルオブジェクト

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% 内在オブジェクトである。

呼び出されたとき、以下の手順を実行する:

  1. Return ? PerformEval(source, false, false).

19.2.1.1 PerformEval ( source, strictCaller, direct )

The abstract operation PerformEval takes arguments source (an ECMAScript language value), strictCaller (a Boolean), and direct (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. 断言: directfalse の場合、strictCallerfalse であること。
  2. もし source が文字列でなければ、source を返す。
  3. evalRealm を現在の Realm Record とする。
  4. 注: 直接 eval の場合、evalRealm は eval を呼んだ側のレルムと eval 関数自身のレルムの両方である。
  5. Perform ? HostEnsureCanCompileStrings(evalRealm, « », source, direct) を実行する。
  6. inFunctionfalse にする。
  7. inMethodfalse にする。
  8. inDerivedConstructorfalse にする。
  9. inClassFieldInitializerfalse にする。
  10. もし directtrue ならば
    1. thisEnvRecGetThisEnvironment() とする。
    2. もし thisEnvRecFunction Environment Record であれば、
      1. functhisEnvRec.[[FunctionObject]] とする。
      2. inFunctiontrue にする。
      3. inMethodthisEnvRec.HasSuperBinding() にする。
      4. もし func.[[ConstructorKind]]derived であれば、inDerivedConstructortrue にする。
      5. classFieldInitializerNamefunc.[[ClassFieldInitializerName]] とする。
      6. もし classFieldInitializerNameempty でなければ、inClassFieldInitializertrue にする。
  11. 実装定義の順序で次のサブステップを実行する(パースとエラー検出を並列に行うことがある):
    1. scriptParseText(source, Script) とする。
    2. もし script がエラーのリストであれば、SyntaxError 例外を投げる。
    3. もし scriptScriptBody を含まないなら、undefined を返す。
    4. bodyscriptScriptBody とする。
    5. もし inFunctionfalse でかつ bodyNewTarget を含むなら、SyntaxError 例外を投げる。
    6. もし inMethodfalse でかつ bodySuperProperty を含むなら、SyntaxError 例外を投げる。
    7. もし inDerivedConstructorfalse でかつ bodySuperCall を含むなら、SyntaxError 例外を投げる。
    8. もし inClassFieldInitializertrue でかつ bodyContainsArgumentstrue なら、SyntaxError 例外を投げる。
  12. もし strictCallertrue なら、strictEvaltrue とする。
  13. さもなければ、strictEvalScriptIsStrict(script) とする。
  14. runningContext を実行中の実行コンテキストとする。
  15. 注: もし directtrue なら、runningContext は直接 eval を行った実行コンテキストとなる。もし directfalse なら、runningContexteval 関数の呼び出しのための実行コンテキストとなる。
  16. もし directtrue なら
    1. lexEnvNewDeclarativeEnvironment(runningContext's LexicalEnvironment) とする。
    2. varEnvrunningContext's VariableEnvironment とする。
    3. privateEnvrunningContext's PrivateEnvironment とする。
  17. さもなければ、
    1. lexEnvNewDeclarativeEnvironment(evalRealm.[[GlobalEnv]]) とする。
    2. varEnvevalRealm.[[GlobalEnv]] とする。
    3. privateEnvnull とする。
  18. もし strictEvaltrue なら、varEnvlexEnv に設定する。
  19. もし runningContext がまだ一時停止していなければ、runningContext を一時停止する。
  20. evalContext を新しい ECMAScript コード実行コンテキストとする。
  21. evalContext の Function を null に設定する。
  22. evalContextRealmevalRealm に設定する。
  23. evalContext の ScriptOrModule を runningContext's ScriptOrModule に設定する。
  24. evalContext の VariableEnvironment を varEnv に設定する。
  25. evalContext の LexicalEnvironment を lexEnv に設定する。
  26. evalContext の PrivateEnvironment を privateEnv に設定する。
  27. 実行コンテキストスタックに evalContext をプッシュする;evalContext が現在の実行コンテキストとなる。
  28. resultCompletion(EvalDeclarationInstantiation(body, varEnv, lexEnv, privateEnv, strictEval)) とする。
  29. もし result が通常完了なら、
    1. resultCompletion(Evaluation of body) に設定する。
  30. もし result が通常完了かつ result.[[Value]]empty なら、
    1. resultNormalCompletion(undefined) に設定する。
  31. evalContext を一時停止し、実行コンテキストスタックから取り除く。
  32. 実行コンテキストスタックのトップになっているコンテキストを再開して実行コンテキストとする。
  33. Return ? result.
Note

eval コードは、呼び出し元コンテキストのコードまたは eval コードのいずれかが strict mode の場合、呼び出し元の variable environment に変数や関数の束縛を生成できない。代わりにそのような束縛は eval コードだけがアクセス可能な新しい VariableEnvironment に生成される。letconstclass 宣言によって導入された束縛は常に新しい LexicalEnvironment に生成される。

19.2.1.2 HostEnsureCanCompileStrings ( calleeRealm, parameterStrings, bodyString, direct )

The host-defined abstract operation HostEnsureCanCompileStrings takes arguments calleeRealm (a Realm Record), parameterStrings (a List of Strings), bodyString (a String), and direct (a Boolean) and returns either a normal completion containing unused or a throw completion. ホスト環境が、文字列を ECMAScript コードとして解釈・評価することを可能にする特定の ECMAScript 関数をブロックできるようにする。

parameterStrings は関数コンストラクタを使用する際にパラメータリストを構築するために連結される文字列を表す。bodyString は関数本体または eval 呼び出しに渡される文字列を表す。 direct は評価が直接 eval であるかどうかを示す。

HostEnsureCanCompileStrings のデフォルト実装は NormalCompletion(unused) を返すことである。

19.2.1.3 EvalDeclarationInstantiation ( body, varEnv, lexEnv, privateEnv, strict )

The abstract operation EvalDeclarationInstantiation takes arguments body (a ScriptBody Parse Node), varEnv (an Environment Record), lexEnv (a Declarative Environment Record), privateEnv (a PrivateEnvironment Record or null), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. varNamesbodyVarDeclaredNames とする。
  2. varDeclarationsbodyVarScopedDeclarations とする。
  3. もし strictfalse なら、
    1. もし varEnvGlobal Environment Record であれば、
      1. 各要素 name に対して varNames の、次を行う
        1. もし HasLexicalDeclaration(varEnv, name) が true なら、SyntaxError 例外を投げる。
        2. 注: eval はグローバルな lexical 宣言によって覆い隠されるようなグローバル var 宣言を作成しない。
    2. thisEnvlexEnv とする。
    3. 断言: 以下のループは終了する。
    4. thisEnvvarEnv が同じ Environment Record でない間、繰り返す、
      1. もし thisEnvObject Environment Record でないなら、
        1. 注: with 文の環境は lexical 宣言を含まないため var/let ホイスティングの競合チェックは必要ない。
        2. 各要素 name に対して varNames の、次を行う
          1. もし ! thisEnv.HasBinding(name) が true なら、
            1. ホストが Web ブラウザであるか、または Catch ブロック内の VariableStatement をサポートしている場合は
              1. もし thisEnvCatch 節の Environment Record でなければ、SyntaxError 例外を投げる。
            2. さもなければ、
              1. SyntaxError 例外を投げる。
          2. 注: 直接 eval は同名の lexical 宣言よりも var 宣言をホイストしない。
      2. thisEnvthisEnv.[[OuterEnv]] に設定する。
  4. privateIdentifiers を新しい空のリストとする。
  5. pointerprivateEnv とする。
  6. pointernull でない間、繰り返す、
    1. pointer.[[Names]] の各 Private Name binding に対して、次を行う
      1. もし privateIdentifiersbinding.[[Description]] を含まなければ、binding.[[Description]]privateIdentifiers に追加する。
    2. pointerpointer.[[OuterPrivateEnvironment]] に設定する。
  7. もし AllPrivateIdentifiersValid(body, privateIdentifiers) が false なら、SyntaxError 例外を投げる。
  8. functionsToInitialize を新しい空のリストとする。
  9. declaredFunctionNames を新しい空のリストとする。
  10. varDeclarations の各要素 d に対して、逆リスト順で、次を行う
    1. もし dVariableDeclarationForBinding、あるいは BindingIdentifier のいずれでもないなら、
      1. 断言: dFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclaration、または AsyncGeneratorDeclaration のいずれかである。
      2. 注: 同じ名前の関数宣言が複数ある場合、最後の宣言が使用される。
      3. fndBoundNames の唯一の要素とする。
      4. もし declaredFunctionNamesfn を含まなければ、
        1. もし varEnvGlobal Environment Record であれば、
          1. fnDefinable を ? CanDeclareGlobalFunction(varEnv, fn) とする。
          2. もし fnDefinablefalse なら、TypeError 例外を投げる。
        2. fndeclaredFunctionNames に追加する。
        3. dfunctionsToInitialize の最初の要素として挿入する。
  11. declaredVarNames を新しい空のリストとする。
  12. varDeclarations の各要素 d に対して、次を行う
    1. もし dVariableDeclarationForBinding、または BindingIdentifier のいずれかであれば、
      1. dBoundNames の各文字列 vn に対して、次を行う
        1. もし declaredFunctionNamesvn を含まなければ、
          1. もし varEnvGlobal Environment Record であれば、
            1. vnDefinable を ? CanDeclareGlobalVar(varEnv, vn) とする。
            2. もし vnDefinablefalse なら、TypeError 例外を投げる。
          2. もし declaredVarNamesvn を含まなければ、
            1. vndeclaredVarNames に追加する。
  13. もし strictfalse でホストが Web ブラウザであるか、または ブロックレベル Function Declaration の Web レガシー互換性意味論 をサポートしているなら、
    1. declaredFunctionOrVarNamesdeclaredFunctionNamesdeclaredVarNames の連結リストとする。
    2. BlockCaseClause、または DefaultClauseStatementList に直接含まれる FunctionDeclaration f について、かつ body がその x を含む場合、次を行う
      1. funcNamefBindingIdentifierStringValue とする。
      2. もし FunctionDeclaration fVariableStatementBindingIdentifierfuncName)に置き換えても body に早期エラーが発生しないなら、
        1. bindingExistsfalse にする。
        2. thisEnvlexEnv に設定する。
        3. 断言: 以下のループは終了する。
        4. thisEnvvarEnv でない間、繰り返す、
          1. もし thisEnvObject Environment Record でないなら、
            1. もし ! thisEnv.HasBinding(funcName) が true なら、
              1. ホストが Web ブラウザであるか、または Catch ブロック内の VariableStatement をサポートしている場合、
                1. もし thisEnvCatch 節の Environment Record でなければ、bindingExiststrue に設定する。
              2. さもなければ、
                1. bindingExiststrue に設定する。
          2. thisEnvthisEnv.[[OuterEnv]] に設定する。
        5. もし bindingExistsfalse でかつ varEnvGlobal Environment Record であれば、
          1. もし HasLexicalDeclaration(varEnv, funcName) が false なら、
            1. fnDefinable を ? CanDeclareGlobalVar(varEnv, funcName) とする。
          2. さもなければ、
            1. fnDefinablefalse にする。
        6. さもなければ、
          1. fnDefinabletrue にする。
        7. もし bindingExistsfalse かつ fnDefinabletrue なら、
          1. もし declaredFunctionOrVarNamesfuncName を含まなければ、
            1. もし varEnvGlobal Environment Record であれば、
              1. Perform ? CreateGlobalVarBinding(varEnv, funcName, true) を実行する。
            2. さもなければ、
              1. bindingExists を ! varEnv.HasBinding(funcName) に設定する。
              2. もし bindingExistsfalse なら、
                1. Perform ! varEnv.CreateMutableBinding(funcName, true) を実行する。
                2. Perform ! varEnv.InitializeBinding(funcName, undefined) を実行する。
            3. funcNamedeclaredFunctionOrVarNames に追加する。
          2. FunctionDeclaration f が評価されるとき、次の手順を FunctionDeclaration 評価アルゴリズムの代わりに実行する:
            1. gEnv を実行中の実行コンテキストの VariableEnvironment とする。
            2. bEnv を実行中の実行コンテキストの LexicalEnvironment とする。
            3. fObj を ! bEnv.GetBindingValue(funcName, false) とする。
            4. Perform ? gEnv.SetMutableBinding(funcName, fObj, false) を実行する。
            5. Return unused
  14. 注: このアルゴリズムステップ以降は、varEnvGlobal Environment Record であり、かつグローバルオブジェクトが Proxy exotic object でない限り異常終了は発生しない。
  15. lexDeclarationsbodyLexicallyScopedDeclarations とする。
  16. lexDeclarations の各要素 d に対して、次を行う
    1. 注: レキシカルに宣言された名前はここでのみ生成され、初期化はされない。
    2. dBoundNames の各要素 dn に対して、次を行う
      1. もし IsConstantDeclaration(d) が true なら、
        1. Perform ? lexEnv.CreateImmutableBinding(dn, true) を実行する。
      2. さもなければ、
        1. Perform ? lexEnv.CreateMutableBinding(dn, false) を実行する。
  17. functionsToInitialize の各 Parse Node f に対して、次を行う
    1. fnfBoundNames の唯一の要素とする。
    2. foInstantiateFunctionObject(f, lexEnv, privateEnv) とする。
    3. もし varEnvGlobal Environment Record であれば、
      1. Perform ? CreateGlobalFunctionBinding(varEnv, fn, fo, true) を実行する。
    4. さもなければ、
      1. bindingExists を ! varEnv.HasBinding(fn) とする。
      2. もし bindingExistsfalse なら、
        1. 注: 以下の呼び出しは、前の検証により異常完了を返すことはない。
        2. Perform ! varEnv.CreateMutableBinding(fn, true) を実行する。
        3. Perform ! varEnv.InitializeBinding(fn, fo) を実行する。
      3. さもなければ、
        1. Perform ! varEnv.SetMutableBinding(fn, fo, false) を実行する。
  18. declaredVarNames の各文字列 vn に対して、次を行う
    1. もし varEnvGlobal Environment Record であれば、
      1. Perform ? CreateGlobalVarBinding(varEnv, vn, true) を実行する。
    2. さもなければ、
      1. bindingExists を ! varEnv.HasBinding(vn) とする。
      2. もし bindingExistsfalse なら、
        1. 注: 以下の呼び出しは、前の検証により異常完了を返すことはない。
        2. Perform ! varEnv.CreateMutableBinding(vn, true) を実行する。
        3. Perform ! varEnv.InitializeBinding(vn, undefined) を実行する。
  19. Return unused

19.2.2 isFinite ( number )

この関数は %isFinite% 内在オブジェクトである。

呼び出されたとき、以下の手順を実行する:

  1. num を ? ToNumber(number) とする。
  2. もし num が有限なら、true を返す。
  3. false を返す。

19.2.3 isNaN ( number )

この関数は %isNaN% 内在オブジェクトである。

呼び出されたとき、以下の手順を実行する:

  1. num を ? ToNumber(number) とする。
  2. もし numNaN なら、true を返す。
  3. false を返す。
Note

XNaN かどうかを ECMAScript コードから確実に検査する方法は X !== X のような式である。これはかつその場合に限り結果が true となる。

19.2.4 parseFloat ( string )

この関数は、string 引数の内容を小数リテラルとして解釈することによって規定される Number 値を生成する。

これは %parseFloat% 内在オブジェクトである。

呼び出されたとき、以下の手順を実行する:

  1. inputString を ? ToString(string) とする。
  2. trimmedString を ! TrimString(inputString, start) とする。
  3. trimmedStringToCodePoints(trimmedString) とする。
  4. trimmedPrefixStrDecimalLiteral の構文を満たす trimmed の最長プレフィックス(存在するならそれ自身)とする。もしそのようなプレフィックスがなければ、NaN を返す。
  5. parsedNumberParseText(trimmedPrefix, StrDecimalLiteral) とする。
  6. 断言: parsedNumberParse Node である。
  7. parsedNumberStringNumericValue を返す。
Note

この関数は string の先頭部分のみを Number 値として解釈する場合があり、10進リテラルの表記の一部として解釈できないコード単位は無視される。無視されたことを示す手段は与えられない。

19.2.5 parseInt ( string, radix )

この関数は、指定された radix に従って string の内容を解釈することによって定められる整数の Number を生成する。string の先頭の空白は無視される。radix が 0 に変換されると(例えば undefined の場合)、表記が "0x" または "0X" で始まらない限り 10 と見なされる。表記が "0x" または "0X" で始まる場合は 16 と見なされる。radix が 16 の場合、表記は任意で "0x" または "0X" で始まることができる。

これは %parseInt% 内在オブジェクトである。

呼び出されたとき、以下の手順を実行する:

  1. inputString を ? ToString(string) とする。
  2. trimmedString を ! TrimString(inputString, start) とする。
  3. sign を 1 にする。
  4. もし trimmedString が空でなく、かつ最初のコード単位が 0x002D (HYPHEN-MINUS) であれば、sign を -1 にする。
  5. もし trimmedString が空でなく、かつ最初のコード単位が 0x002B (PLUS SIGN) または 0x002D (HYPHEN-MINUS) のいずれかであれば、trimmedString をインデックス 1 からの部分文字列にする。
  6. radixMV(? ToInt32(radix)) とする。
  7. stripPrefixtrue にする。
  8. もし radixMV ≠ 0 なら、
    1. もし radixMV < 2 または radixMV > 36 なら、NaN を返す。
    2. もし radixMV ≠ 16 なら、stripPrefixfalse に設定する。
  9. さもなければ、
    1. radixMV を 10 に設定する。
  10. もし stripPrefixtrue なら、
    1. もし trimmedString の長さが ≥ 2 でかつ最初の二つのコード単位が "0x" または "0X" であれば、
      1. trimmedString をインデックス 2 からの部分文字列にする。
      2. radixMV を 16 に設定する。
  11. もし trimmedString が radix-radixMV の数字でないコード単位を含むなら、end をその最初の位置のインデックスにする;さもなければ endtrimmedString の長さにする。
  12. numberStringtrimmedString の 0 から end までの部分文字列とする。
  13. もし numberString が空なら、NaN を返す。
  14. mathInt を、numberString が radix-radixMV 表記で表す整数値とする(値 10 から 35 の数字には AZaz を用いる)。(しかしながら、もし radixMV = 10 かつ numberString が 20 を超える有効桁を含む場合、実装は 20 桁目以降の各有効桁を 0 に置き換えることができる;また radixMV が 2,4,8,10,16,32 のいずれでもない場合、mathInt は実装により近似された整数であってよい。)
  15. もし mathInt = 0 なら、
    1. もし sign = -1 なら、-0𝔽 を返す。
    2. +0𝔽 を返す。
  16. 𝔽(sign × mathInt) を返す。
Note

この関数は string の先頭部分のみを整数値として解釈する場合があり、整数の表記として解釈できないコード単位は無視される。無視されたことを示す手段は与えられない。

19.2.6 URI 処理関数

Uniform Resource Identifier(URI)は、インターネット上のリソース(例: ウェブページやファイル)およびそれらにアクセスするためのトランスポートプロトコル(例: HTTP や FTP)を識別する文字列である。ECMAScript 言語自体は URI を使用するためのサポートを提供しないが、本節で説明するように URI をエンコード/デコードする関数は提供する。encodeURIdecodeURI は完全な URI を扱うことを意図している;これらは予約文字が特別な意味(例えば区切り)を持つことを想定しており、エンコードしない。encodeURIComponentdecodeURIComponent は URI の個々のコンポーネントを扱うことを意図している;これらは予約文字がテキストを表し、コンポーネントが完全な URI の一部となる際に特別な意味を持たないようにエンコードされるべきであると想定している。

Note 1

予約文字の集合は RFC 2396 に基づいており、より新しい RFC 3986 による変更を反映していない。

Note 2

多くの ECMAScript 実装はウェブページを操作する追加の関数やメソッドを提供する;これらの関数は本標準の範囲外である。

19.2.6.1 decodeURI ( encodedURI )

この関数は、encodeURI 関数によって導入される可能性のある各エスケープシーケンスおよび UTF-8 エンコーディングを、それが表すコードポイントの UTF-16 エンコーディングに置き換えた URI の新しいバージョンを計算する。encodeURI によって導入され得ないエスケープシーケンスは置き換えられない。

これは %decodeURI% 内在オブジェクトである。

呼び出されたとき、以下の手順を実行する:

  1. uriString を ? ToString(encodedURI) とする。
  2. preserveEscapeSet";/?:@&=+$,#" とする。
  3. Return ? Decode(uriString, preserveEscapeSet) を実行する。

19.2.6.2 decodeURIComponent ( encodedURIComponent )

この関数は、encodeURIComponent 関数によって導入される可能性のある各エスケープシーケンスおよび UTF-8 エンコーディングを、それが表すコードポイントの UTF-16 エンコーディングに置き換えた URI の新しいバージョンを計算する。

これは %decodeURIComponent% 内在オブジェクトである。

呼び出されたとき、以下の手順を実行する:

  1. componentString を ? ToString(encodedURIComponent) とする。
  2. preserveEscapeSet を空の文字列とする。
  3. Return ? Decode(componentString, preserveEscapeSet) を実行する。

19.2.6.3 encodeURI ( uri )

この関数は、UTF-16 エンコードされた(6.1.4)URI の各インスタンスについて、あるコードポイントのインスタンスをそのコードポイントの UTF-8 エンコーディングを表す 1、2、3、または 4 のエスケープシーケンスに置き換えた新しいバージョンを計算する。

これは %encodeURI% 内在オブジェクトである。

呼び出されたとき、以下の手順を実行する:

  1. uriString を ? ToString(uri) とする。
  2. extraUnescaped";/?:@&=+$,#" とする。
  3. Return ? Encode(uriString, extraUnescaped) を実行する。

19.2.6.4 encodeURIComponent ( uriComponent )

この関数は、UTF-16 エンコードされた(6.1.4)URI の各インスタンスについて、あるコードポイントのインスタンスをそのコードポイントの UTF-8 エンコーディングを表す 1、2、3、または 4 のエスケープシーケンスに置き換えた新しいバージョンを計算する。

これは %encodeURIComponent% 内在オブジェクトである。

呼び出されたとき、以下の手順を実行する:

  1. componentString を ? ToString(uriComponent) とする。
  2. extraUnescaped を空の文字列とする。
  3. Return ? Encode(componentString, extraUnescaped) を実行する。

19.2.6.5 Encode ( string, extraUnescaped )

The abstract operation Encode takes arguments string (a String) and extraUnescaped (a String) and returns either a normal completion containing a String or a throw completion. これは URI のエンコードとエスケープを行い、string6.1.4 に記述されるような UTF-16 エンコードされたコードポイントの列として解釈する。文字が RFC 2396 において unreserved と識別されるか、extraUnescaped に現れる場合、それはエスケープされない。 It performs the following steps when called:

  1. lenstring の長さとする。
  2. result を空の文字列とする。
  3. alwaysUnescaped を ASCII の単語文字と "-.!~*'()" の文字列連結とする。
  4. unescapedSetalwaysUnescapedextraUnescaped の連結とする。
  5. k を 0 にする。
  6. k < len の間、繰り返す、
    1. codeUnitstring のインデックス k のコード単位とする。
    2. もし unescapedSetcodeUnit を含むなら、
      1. kk + 1 にする。
      2. resultresultcodeUnit の文字列連結に設定する。
    3. さもなければ、
      1. cpCodePointAt(string, k) とする。
      2. もし cp.[[IsUnpairedSurrogate]]true なら、URIError 例外を投げる。
      3. kk + cp.[[CodeUnitCount]] に設定する。
      4. octetscp.[[CodePoint]] に UTF-8 変換を適用して得られるオクテットのリストとする。
      5. octets の各要素 octet に対して、次を行う
        1. hexoctet の大文字の16進数文字列表現とする。
        2. resultresult"%"、および StringPad(hex, 2, "0", start) の連結に設定する。
  7. result を返す。
Note

パーセントエンコーディングは個々のオクテットを表現するため、単一のコードポイントは複数の連続するエスケープシーケンス(各 8 ビットの UTF-8 コード単位ごとに1つ)として表され得る。

19.2.6.6 Decode ( string, preserveEscapeSet )

The abstract operation Decode takes arguments string (a String) and preserveEscapeSet (a String) and returns either a normal completion containing a String or a throw completion. これは URI のアンエスケープとデコードを行い、preserveEscapeSet にある Basic Latin 文字に対応するエスケープシーケンスを保持する。 It performs the following steps when called:

  1. lenstring の長さとする。
  2. result を空の文字列とする。
  3. k を 0 にする。
  4. k < len の間、繰り返す、
    1. codeUnitstring のインデックス k のコード単位とする。
    2. segmentcodeUnit に設定する。
    3. もし codeUnit が 0x0025 (PERCENT SIGN) のコード単位であるなら、
      1. もし k + 3 > len なら、URIError 例外を投げる。
      2. escapestringk から k + 3 の部分文字列とする。
      3. firstOctetParseHexOctet(string, k + 1) とする。
      4. もし firstOctet が整数でなければ、URIError 例外を投げる。
      5. kk + 2 に設定する。
      6. nfirstOctet の先頭に並ぶ 1 ビットの数とする。
      7. もし n = 0 なら、
        1. asciiChar を数値が firstOctet のコード単位とする。
        2. もし preserveEscapeSetasciiChar を含めば、segmentescape に設定する;さもなければ segmentasciiChar に設定する。
      8. さもなければ、
        1. もし n = 1 または n > 4 なら、URIError 例外を投げる。
        2. octets を « firstOctet » とする。
        3. j を 1 にする。
        4. j < n の間、繰り返す、
          1. kk + 1 に設定する。
          2. もし k + 3 > len なら、URIError 例外を投げる。
          3. もし string のインデックス k のコード単位が 0x0025 (PERCENT SIGN) でなければ、URIError 例外を投げる。
          4. continuationByteParseHexOctet(string, k + 1) とする。
          5. もし continuationByte が整数でなければ、URIError 例外を投げる。
          6. continuationByteoctets に追加する。
          7. kk + 2 に設定する。
          8. jj + 1 に設定する。
        5. 断言: octets の長さは n である。
        6. もし octets が Unicode コードポイントの有効な UTF-8 エンコーディングを含まないなら、URIError 例外を投げる。
        7. codePointoctets に UTF-8 変換を適用して得られるコードポイントとする(21 ビット値)。
        8. segmentUTF16EncodeCodePoint(codePoint) に設定する。
    4. resultresultsegment の文字列連結に設定する。
    5. kk + 1 に設定する。
  5. result を返す。
Note

RFC 3629 は無効な UTF-8 オクテットシーケンスのデコードを禁じている。例えば無効なシーケンス 0xC0 0x80 はコード単位 0x0000 にデコードされてはならない。Decode アルゴリズムの実装は、そのような無効シーケンスに遭遇したとき URIError を投げることが要求される。

19.2.6.7 ParseHexOctet ( string, position )

The abstract operation ParseHexOctet takes arguments string (a String) and position (a non-negative integer) and returns either a non-negative integer or a non-empty List of SyntaxError objects. 指定した position における文字列中の 2 文字の 16 進文字列を無符号 8 ビット整数に解析する。 It performs the following steps when called:

  1. lenstring の長さとする。
  2. 断言: position + 2 ≤ len
  3. hexDigitsstringposition から position + 2 の部分文字列とする。
  4. parseResultParseText(hexDigits, HexDigits[~Sep]) とする。
  5. もし parseResultParse Node でなければ、parseResult を返す。
  6. nparseResult の MV とする。
  7. 断言: n は 0 から 255 の閉区間内である。
  8. n を返す。

19.3 グローバルオブジェクトのコンストラクタプロパティ

19.3.1 AggregateError ( . . . )

参照 20.5.7.1

19.3.2 Array ( . . . )

参照 23.1.1

19.3.3 ArrayBuffer ( . . . )

参照 25.1.4

19.3.4 BigInt ( . . . )

参照 21.2.1

19.3.5 BigInt64Array ( . . . )

参照 23.2.5

19.3.6 BigUint64Array ( . . . )

参照 23.2.5

19.3.7 Boolean ( . . . )

参照 20.3.1

19.3.8 DataView ( . . . )

参照 25.3.2

19.3.9 Date ( . . . )

参照 21.4.2

19.3.10 Error ( . . . )

参照 20.5.1

19.3.11 EvalError ( . . . )

参照 20.5.5.1

19.3.12 FinalizationRegistry ( . . . )

参照 26.2.1

19.3.13 Float16Array ( . . . )

参照 23.2.5

19.3.14 Float32Array ( . . . )

参照 23.2.5

19.3.15 Float64Array ( . . . )

参照 23.2.5

19.3.16 Function ( . . . )

参照 20.2.1

19.3.17 Int8Array ( . . . )

参照 23.2.5

19.3.18 Int16Array ( . . . )

参照 23.2.5

19.3.19 Int32Array ( . . . )

参照 23.2.5

19.3.20 Iterator ( . . . )

参照 27.1.3.1

19.3.21 Map ( . . . )

参照 24.1.1

19.3.22 Number ( . . . )

参照 21.1.1

19.3.23 Object ( . . . )

参照 20.1.1

19.3.24 Promise ( . . . )

参照 27.2.3

19.3.25 Proxy ( . . . )

参照 28.2.1

19.3.26 RangeError ( . . . )

参照 20.5.5.2

19.3.27 ReferenceError ( . . . )

参照 20.5.5.3

19.3.28 RegExp ( . . . )

参照 22.2.4

19.3.29 Set ( . . . )

参照 24.2.2

19.3.30 SharedArrayBuffer ( . . . )

参照 25.2.3

19.3.31 String ( . . . )

参照 22.1.1

19.3.32 Symbol ( . . . )

参照 20.4.1

19.3.33 SyntaxError ( . . . )

参照 20.5.5.4

19.3.34 TypeError ( . . . )

参照 20.5.5.5

19.3.35 Uint8Array ( . . . )

参照 23.2.5

19.3.36 Uint8ClampedArray ( . . . )

参照 23.2.5

19.3.37 Uint16Array ( . . . )

参照 23.2.5

19.3.38 Uint32Array ( . . . )

参照 23.2.5

19.3.39 URIError ( . . . )

参照 20.5.5.6

19.3.40 WeakMap ( . . . )

参照 24.3.1

19.3.41 WeakRef ( . . . )

参照 26.1.1

19.3.42 WeakSet ( . . . )

参照 24.4

19.4 グローバルオブジェクトのその他のプロパティ

19.4.1 Atomics

参照 25.4

19.4.2 JSON

参照 25.5

19.4.3 Math

参照 21.3

19.4.4 Reflect

参照 28.1

20 基本オブジェクト

20.1 Object オブジェクト

20.1.1 Object コンストラクタ

Object コンストラクタ:

  • %Object% である。
  • グローバルオブジェクト"Object" プロパティの初期値である。
  • コンストラクタとして呼び出されたときに新しい通常のオブジェクトを作成する。
  • コンストラクタとしてではなく関数として呼び出されたときに型変換を行う。
  • クラス定義の extends 節の値として使用されることがある。

20.1.1.1 Object ( value )

この関数は呼び出されたときに次の手順を実行する:

  1. NewTarget が undefined でもアクティブな関数オブジェクトでもない場合、次を行う:
    1. OrdinaryCreateFromConstructor(NewTarget, "%Object.prototype%") を返す。
  2. valueundefined または null のいずれかである場合、OrdinaryObjectCreate(%Object.prototype%) を返す。
  3. ToObject(value) を返す。

20.1.2 Object コンストラクタのプロパティ

Object コンストラクタ:

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 以下の追加プロパティを持つ:

20.1.2.1 Object.assign ( target, ...sources )

この関数は、1 個以上のソースオブジェクトから列挙可能な自身のプロパティのすべての値を target オブジェクトにコピーする。

呼び出されたときに次の手順を実行する:

  1. Let to be ? ToObject(target)(target をオブジェクトに変換する)。
  2. 引数が 1 個だけ渡された場合、to を返す。
  3. sources の各要素 nextSource について、次を行う:
    1. nextSourceundefined でも null でもない場合、次を行う:
      1. Let from be ! ToObject(nextSource)(ソースをオブジェクトに変換する)。
      2. Let keys be ? from.[[OwnPropertyKeys]]()(所有プロパティキーの一覧を取得する)。
      3. keys の各要素 nextKey について、次を行う:
        1. Let desc be ? from.[[GetOwnProperty]](nextKey)(当該キーのプロパティ記述子を取得する)。
        2. descundefined でなく、かつ desc.[[Enumerable]]true の場合、次を行う:
          1. Let propValue be ? Get(from, nextKey)(プロパティ値を取得する)。
          2. Perform ? Set(to, nextKey, propValue, true)(ターゲットに設定する)。
  4. to を返す。

この関数の "length" プロパティは 2𝔽 である。

20.1.2.2 Object.create ( proto, properties )

この関数は、指定されたプロトタイプを持つ新しいオブジェクトを作成する。

呼び出されたときに次の手順を実行する:

  1. proto がオブジェクトでなく、かつ protonull でもない場合、TypeError 例外を投げる。
  2. Let obj be OrdinaryObjectCreate(proto)(指定プロトタイプの通常オブジェクトを作成する)。
  3. propertiesundefined でない場合、次を行う:
    1. Return ? ObjectDefineProperties(obj, properties) を返す(プロパティ記述子で定義する)。
  4. obj を返す。

20.1.2.3 Object.defineProperties ( obj, properties )

この関数は、オブジェクトに自身のプロパティを追加し、または既存の自身のプロパティの属性を更新する。

呼び出されたときに次の手順を実行する:

  1. obj がオブジェクトでない場合、TypeError 例外を投げる。
  2. Return ? ObjectDefineProperties(obj, properties) を返す。

20.1.2.3.1 ObjectDefineProperties ( obj, properties )

The abstract operation ObjectDefineProperties takes arguments obj (an Object) and properties (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. Let props be ? ToObject(properties)(properties をオブジェクトに変換する)。
  2. Let keys be ? props.[[OwnPropertyKeys]]()props の所有プロパティキーを取得する)。
  3. Let descriptors be a new empty List(空の記述子リストを作る)。
  4. keys の各要素 nextKey について、次を行う:
    1. Let propDesc be ? props.[[GetOwnProperty]](nextKey)(当該キーのプロパティ記述子を取得する)。
    2. propDescundefined でなく、かつ propDesc.[[Enumerable]]true の場合、次を行う:
      1. Let descObj be ? Get(props, nextKey)(記述子オブジェクトを取得する)。
      2. Let desc be ? ToPropertyDescriptor(descObj)(プロパティ記述子に変換する)。
      3. Append the Record { [[Key]]: nextKey, [[Descriptor]]: desc } to descriptors(記述子リストに追加する)。
  5. descriptors の各要素 property について、次を行う:
    1. Perform ? DefinePropertyOrThrow(obj, property.[[Key]], property.[[Descriptor]])(対象オブジェクトに定義する/失敗すれば例外)。
  6. obj を返す。

20.1.2.4 Object.defineProperty ( obj, propertyKey, attributes )

この関数は、オブジェクトに自身のプロパティを追加し、または既存の自身のプロパティの属性を更新する。

呼び出されたときに次の手順を実行する:

  1. obj がオブジェクトでない場合、TypeError 例外を投げる。
  2. Let key be ? ToPropertyKey(propertyKey)(プロパティキーに変換する)。
  3. Let desc be ? ToPropertyDescriptor(attributes)(属性をプロパティ記述子に変換する)。
  4. Perform ? DefinePropertyOrThrow(obj, key, desc)(定義する、失敗すれば例外)。
  5. obj を返す。

20.1.2.5 Object.entries ( obj )

この関数は呼び出されたときに次の手順を実行する:

  1. Let coerced be ? ToObject(obj)(obj をオブジェクトに変換する)。
  2. Let entryList be ? EnumerableOwnProperties(coerced, key+value)(列挙可能な自身のキーと値の一覧を取得する)。
  3. Return CreateArrayFromList(entryList)(一覧から配列を作成して返す)。

20.1.2.6 Object.freeze ( obj )

この関数は呼び出されたときに次の手順を実行する:

  1. obj がオブジェクトでない場合、obj を返す。
  2. Let status be ? SetIntegrityLevel(obj, frozen)(完全凍結の整合性レベルを設定する)。
  3. statusfalse の場合、TypeError 例外を投げる。
  4. obj を返す。

20.1.2.7 Object.fromEntries ( iterable )

この関数は呼び出されたときに次の手順を実行する:

  1. Perform ? RequireObjectCoercible(iterable)(iterable がオブジェクトに変換可能であることを要求する)。
  2. Let obj be OrdinaryObjectCreate(%Object.prototype%)(%Object.prototype% をプロトタイプとする通常オブジェクトを作成する)。
  3. Assert: obj は拡張可能な通常オブジェクトで、所有プロパティを持たないことを主張する。
  4. Let closure be a new Abstract Closure with parameters (key, value) that captures obj and performs the following steps when called:
    1. Let propertyKey be ? ToPropertyKey(key)(キーをプロパティキーに変換する)。
    2. Perform ! CreateDataPropertyOrThrow(obj, propertyKey, value)(データプロパティを作成する、失敗すれば例外)。
    3. Return NormalCompletion(undefined).
  5. Let adder be CreateBuiltinFunction(closure, 2, "", « »)(上記クロージャを組み込み関数として作成する)。
  6. Return ? AddEntriesFromIterable(obj, iterable, adder)(反復可能からエントリを追加して結果を返す)。
Note
The function created for adder is never directly accessible to ECMAScript code.

20.1.2.8 Object.getOwnPropertyDescriptor ( obj, propertyKey )

この関数は呼び出されたときに次の手順を実行する:

  1. Let coerced be ? ToObject(obj)(obj をオブジェクトに変換する)。
  2. Let key be ? ToPropertyKey(propertyKey)(propertyKey をプロパティキーに変換する)。
  3. Let desc be ? coerced.[[GetOwnProperty]](key)(当該プロパティの内部記述子を取得する)。
  4. Return FromPropertyDescriptor(desc)(プロパティ記述子から外部表現を作成して返す)。

20.1.2.9 Object.getOwnPropertyDescriptors ( obj )

この関数は呼び出されたときに次の手順を実行する:

  1. Let coerced be ? ToObject(obj).
  2. Let ownKeys be ? coerced.[[OwnPropertyKeys]]()(所有プロパティキーを取得する)。
  3. Let descriptors be OrdinaryObjectCreate(%Object.prototype%)(記述子オブジェクトを作成する)。
  4. For each element key of ownKeys, do
    1. Let desc be ? coerced.[[GetOwnProperty]](key)(そのキーの内部プロパティ記述子を得る)。
    2. Let descriptor be FromPropertyDescriptor(desc)(外向きのプロパティ記述子に変換する)。
    3. If descriptor is not undefined, perform ! CreateDataPropertyOrThrow(descriptors, key, descriptor)(記述子オブジェクトにデータプロパティとして追加する)。
  5. Return descriptors(記述子オブジェクトを返す)。

20.1.2.10 Object.getOwnPropertyNames ( obj )

この関数は呼び出されたときに次の手順を実行する:

  1. Return CreateArrayFromList(? GetOwnPropertyKeys(obj, string))(文字列キーの所有プロパティキー一覧から配列を作成して返す)。

20.1.2.11 Object.getOwnPropertySymbols ( obj )

この関数は呼び出されたときに次の手順を実行する:

  1. Return CreateArrayFromList(? GetOwnPropertyKeys(obj, symbol))(シンボルキーの所有プロパティキー一覧から配列を作成して返す)。

20.1.2.11.1 GetOwnPropertyKeys ( value, type )

The abstract operation GetOwnPropertyKeys takes arguments value (an ECMAScript language value) and type (string or symbol) and returns either a normal completion containing a List of property keys or a throw completion. It performs the following steps when called:

  1. Let obj be ? ToObject(value)(value をオブジェクトに変換する)。
  2. Let keys be ? obj.[[OwnPropertyKeys]]()(所有プロパティキー一覧を取得する)。
  3. Let nameList be a new empty List(空の名前リストを作成する)。
  4. For each element nextKey of keys, do
    1. If nextKey is a Symbol and type is symbol, or if nextKey is a String and type is string, then
      1. Append nextKey to nameList(条件に一致するキーを名前リストに追加する)。
  5. Return nameList(名前リストを返す)。

20.1.2.12 Object.getPrototypeOf ( obj )

この関数は呼び出されたときに次の手順を実行する:

  1. Let coerced be ? ToObject(obj)(obj をオブジェクトに変換する)。
  2. Return ? coerced.[[GetPrototypeOf]]()(プロトタイプを返す)。

20.1.2.13 Object.groupBy ( items, callback )

Note

callback は 2 つの引数を受け取る関数であるべきである。groupByitems の各要素に対して昇順で一度ずつ callback を呼び出し、新しいオブジェクトを構築する。callback が返す各値はプロパティキーへ強制変換される。そのようにして得られた各プロパティキーについて、結果オブジェクトはそのキーを持ち、対応する値はそのキーに強制された戻り値を持つすべての要素を含む配列である。

callback は 2 引数で呼び出される:要素の値と要素のインデックスである。

groupBy の返り値は %Object.prototype% を継承しないオブジェクトである。

この関数は呼び出されたときに次の手順を実行する:

  1. Let groups be ? GroupBy(items, callback, property)(グルーピング情報を取得する)。
  2. Let obj be OrdinaryObjectCreate(null)(プロトタイプが null の通常オブジェクトを作る)。
  3. For each Record { [[Key]], [[Elements]] } g of groups, do
    1. Let elements be CreateArrayFromList(g.[[Elements]])(要素リストから配列を作る)。
    2. Perform ! CreateDataPropertyOrThrow(obj, g.[[Key]], elements)(オブジェクトにデータプロパティを作成する)。
  4. Return obj(結果オブジェクトを返す)。

20.1.2.14 Object.hasOwn ( obj, propertyKey )

この関数は呼び出されたときに次の手順を実行する:

  1. Let coerced be ? ToObject(obj)(obj をオブジェクトに変換する)。
  2. Let key be ? ToPropertyKey(propertyKey)(propertyKey をプロパティキーに変換する)。
  3. Return ? HasOwnProperty(coerced, key)(所有プロパティかどうかを返す)。

20.1.2.15 Object.is ( value1, value2 )

この関数は呼び出されたときに次の手順を実行する:

  1. Return SameValue(value1, value2)(同値判定を返す)。

20.1.2.16 Object.isExtensible ( obj )

この関数は呼び出されたときに次の手順を実行する:

  1. If obj is not an Object, return false(オブジェクトでなければ false を返す)。
  2. Return ? IsExtensible(obj)(拡張可能性を返す)。

20.1.2.17 Object.isFrozen ( obj )

この関数は呼び出されたときに次の手順を実行する:

  1. If obj is not an Object, return true(オブジェクトでなければ true を返す)。
  2. Return ? TestIntegrityLevel(obj, frozen)(凍結レベルをテストして返す)。

20.1.2.18 Object.isSealed ( obj )

この関数は呼び出されたときに次の手順を実行する:

  1. If obj is not an Object, return true(オブジェクトでなければ true を返す)。
  2. Return ? TestIntegrityLevel(obj, sealed)(封印レベルをテストして返す)。

20.1.2.19 Object.keys ( obj )

この関数は呼び出されたときに次の手順を実行する:

  1. Let coerced be ? ToObject(obj)(obj をオブジェクトに変換する)。
  2. Let keyList be ? EnumerableOwnProperties(coerced, key)(列挙可能な自身のキー一覧を取得する)。
  3. Return CreateArrayFromList(keyList)(配列を作って返す)。

20.1.2.20 Object.preventExtensions ( obj )

この関数は呼び出されたときに次の手順を実行する:

  1. If obj is not an Object, return obj(オブジェクトでなければそのまま返す)。
  2. Let status be ? obj.[[PreventExtensions]]()(内部メソッドで拡張禁止を行う)。
  3. If status is false, throw a TypeError exception(失敗したら例外)。
  4. Return obj.

20.1.2.21 Object.prototype

Object.prototype の初期値は Object プロトタイプオブジェクトである。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.1.2.22 Object.seal ( obj )

この関数は呼び出されたときに次の手順を実行する:

  1. If obj is not an Object, return obj(オブジェクトでなければそのまま返す)。
  2. Let status be ? SetIntegrityLevel(obj, sealed)(封印レベルを設定する)。
  3. If status is false, throw a TypeError exception(失敗したら例外)。
  4. Return obj.

20.1.2.23 Object.setPrototypeOf ( obj, proto )

この関数は呼び出されたときに次の手順を実行する:

  1. Perform ? RequireObjectCoercible(obj)(obj がオブジェクト化可能であることを要求する)。
  2. If proto is not an Object and proto is not null, throw a TypeError exception(proto が不正なら例外)。
  3. If obj is not an Object, return objobj がオブジェクトでなければそのまま返す)。
  4. Let status be ? obj.[[SetPrototypeOf]](proto)(内部メソッドでプロトタイプを設定する)。
  5. If status is false, throw a TypeError exception(失敗したら例外)。
  6. Return obj.

20.1.2.24 Object.values ( obj )

この関数は呼び出されたときに次の手順を実行する:

  1. Let coerced be ? ToObject(obj)(オブジェクトに変換する)。
  2. Let valueList be ? EnumerableOwnProperties(coerced, value)(列挙可能な自身の値一覧を取得する)。
  3. Return CreateArrayFromList(valueList)(配列を作って返す)。

20.1.3 Object プロトタイプオブジェクトのプロパティ

Object プロトタイプオブジェクト は次のとおりである:

  • %Object.prototype% である。
  • [[Extensible]] 内部スロットを持ち、その値は true である。
  • 通常オブジェクトのために定義される内部メソッドを持つが、[[SetPrototypeOf]] メソッドは 10.4.7.1 に定義されたものと同じである。(したがって、これは不変プロトタイプのエキゾチックオブジェクトである。)
  • [[Prototype]] 内部スロットを持ち、その値は null である。

20.1.3.1 Object.prototype.constructor

Object.prototype.constructor の初期値は %Object% である。

20.1.3.2 Object.prototype.hasOwnProperty ( value )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let propertyKey be ? ToPropertyKey(value)(value をプロパティキーに変換する)。
  2. Let obj be ? ToObject(this value)(this 値をオブジェクトに変換する)。
  3. Return ? HasOwnProperty(obj, propertyKey)(所有プロパティかどうかを返す)。
Note

ステップ 12 の順序は、以前の仕様版でステップ 1 によって投げられる例外が、this 値が undefined または null の場合でも引き続き投げられるように選択されている。

20.1.3.3 Object.prototype.isPrototypeOf ( value )

このメソッドは呼び出されたときに次の手順を実行する:

  1. If value is not an Object, return falsevalue がオブジェクトでなければ false)。
  2. Let obj be ? ToObject(this value)(this 値をオブジェクトに変換する)。
  3. Repeat,
    1. Set value to ? value.[[GetPrototypeOf]]()(プロトタイプをたどる)。
    2. If value is null, return false(プロトタイプが null なら false)。
    3. If SameValue(obj, value) is true, return true(一致すれば true)。
Note

ステップ 12 の順序は、value がオブジェクトでなく this 値が undefined または null の場合に以前の仕様で規定された振る舞いを保持するために選択されている。

20.1.3.4 Object.prototype.propertyIsEnumerable ( value )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let propertyKey be ? ToPropertyKey(value)(value をプロパティキーに変換する)。
  2. Let obj be ? ToObject(this value)(this 値をオブジェクトに変換する)。
  3. Let desc be ? obj.[[GetOwnProperty]](propertyKey)(所有プロパティ記述子を取得する)。
  4. If desc is undefined, return false(定義されていなければ false)。
  5. Return desc.[[Enumerable]](列挙可能かどうかを返す)。
Note 1

このメソッドはプロトタイプ連鎖上のオブジェクトを考慮しない。

Note 2

ステップ 12 の順序は、以前の仕様版でステップ 1 によって投げられる可能性のある例外が、this 値が undefined または null の場合でも引き続き投げられるように選択されている。

20.1.3.5 Object.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let thisValue be the this value(this 値を取得する)。
  2. Return ? Invoke(thisValue, "toString")(this に対して toString を呼び出して返す)。

このメソッドのオプション引数は使用されないが、ECMA-402 の toLocaleString メソッドで使われる引数パターンに対応させるために用意されている。ECMA-402 を含まない実装はこれらの引数位置を別の用途に使ってはならない。

Note 1

このメソッドはロケール依存の toString 振る舞いを持たないオブジェクトに対する一般的な toLocaleString 実装を提供する。ArrayNumberDate、および %TypedArray% は独自のロケール依存 toLocaleString メソッドを提供する。

Note 2

ECMA-402 はこのデフォルト実装に代わるものを意図的に提供していない。

20.1.3.6 Object.prototype.toString ( )

このメソッドは呼び出されたときに次の手順を実行する:

  1. If the this value is undefined, return "[object Undefined]"(this が undefined の場合、"[object Undefined]" を返す)。
  2. If the this value is null, return "[object Null]"(this が null の場合、"[object Null]" を返す)。
  3. Let obj be ! ToObject(this value)(this をオブジェクトに変換する)。
  4. Let isArray be ? IsArray(obj)(配列かどうかを判定する)。
  5. If isArray is true, let builtinTag be "Array"(配列ならタグを "Array" にする)。
  6. Else if obj has a [[ParameterMap]] internal slot, let builtinTag be "Arguments"(引数オブジェクトなら "Arguments")。
  7. Else if obj has a [[Call]] internal method, let builtinTag be "Function"(関数なら "Function")。
  8. Else if obj has an [[ErrorData]] internal slot, let builtinTag be "Error"(エラーなら "Error")。
  9. Else if obj has a [[BooleanData]] internal slot, let builtinTag be "Boolean"(Boolean オブジェクトなら "Boolean")。
  10. Else if obj has a [[NumberData]] internal slot, let builtinTag be "Number"(Number オブジェクトなら "Number")。
  11. Else if obj has a [[StringData]] internal slot, let builtinTag be "String"(String オブジェクトなら "String")。
  12. Else if obj has a [[DateValue]] internal slot, let builtinTag be "Date"(Date オブジェクトなら "Date")。
  13. Else if obj has a [[RegExpMatcher]] internal slot, let builtinTag be "RegExp"(RegExp オブジェクトなら "RegExp")。
  14. Else, let builtinTag be "Object"(それ以外は "Object")。
  15. Let tag be ? Get(obj, %Symbol.toStringTag%)(%Symbol.toStringTag% を取得する)。
  16. If tag is not a String, set tag to builtinTag(tag が文字列でなければ builtinTag を使う)。
  17. Return the string-concatenation of "[object ", tag, and "]"("[object " + tag + "]" を返す)。
Note

歴史的に、このメソッドは以前の仕様でいくつかの組み込みオブジェクトの名義的タイプタグとして使われていた [[Class]] 内部スロットの文字列値にアクセスするために使われることがあった。上記の toString の定義は、toString を特定の種類の組み込みオブジェクトの判定に使うレガシーコードとの互換性を保つ。これは他の種類の組み込みオブジェクトやプログラム定義オブジェクトに対する信頼できる型判定機構を提供するものではない。さらに、プログラムは %Symbol.toStringTag% を利用してそのようなレガシーな型判定の信頼性を損なうことができる。

20.1.3.7 Object.prototype.valueOf ( )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Return ? ToObject(this value)(this をオブジェクトに変換して返す)。

20.1.3.8 Object.prototype.__proto__

Object.prototype.__proto__ は属性 { [[Enumerable]]: false, [[Configurable]]: true } を持つアクセサプロパティである。[[Get]][[Set]] の属性は次のように定義される:

20.1.3.8.1 get Object.prototype.__proto__

[[Get]] 属性の値は引数を取らない組み込み関数であり、呼び出されたときに次の手順を実行する:

  1. Let obj be ? ToObject(this value)(this をオブジェクトに変換する)。
  2. Return ? obj.[[GetPrototypeOf]]()(プロトタイプを返す)。

20.1.3.8.2 set Object.prototype.__proto__

[[Set]] 属性の値は引数 proto を取る組み込み関数であり、呼び出されたときに次の手順を実行する:

  1. Let thisValue be the this value(this 値を得る)。
  2. Perform ? RequireObjectCoercible(thisValue)(this がオブジェクト化可能であることを要求する)。
  3. If proto is not an Object and proto is not null, return undefinedproto が不正なら undefined を返す)。
  4. If thisValue is not an Object, return undefined(this がオブジェクトでなければ undefined を返す)。
  5. Let status be ? thisValue.[[SetPrototypeOf]](proto)(内部 SetPrototypeOf を呼ぶ)。
  6. If status is false, throw a TypeError exception(失敗したら例外)。
  7. Return undefined.

20.1.3.9 レガシーな Object.prototype アクセサメソッド

20.1.3.9.1 Object.prototype.__defineGetter__ ( propertyKey, getter )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let obj be ? ToObject(this value)(this をオブジェクトに変換する)。
  2. If IsCallable(getter) is false, throw a TypeError exception(getter が呼び出し可能でない場合は例外)。
  3. Let desc be PropertyDescriptor { [[Get]]: getter, [[Enumerable]]: true, [[Configurable]]: true }(ゲッター記述子を作る)。
  4. Let key be ? ToPropertyKey(propertyKey)(キーに変換する)。
  5. Perform ? DefinePropertyOrThrow(obj, key, desc)(定義する、失敗すれば例外)。
  6. Return undefined.

20.1.3.9.2 Object.prototype.__defineSetter__ ( propertyKey, setter )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let obj be ? ToObject(this value)(this をオブジェクトに変換する)。
  2. If IsCallable(setter) is false, throw a TypeError exception(setter が呼び出し可能でない場合は例外)。
  3. Let desc be PropertyDescriptor { [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: true }(セッター記述子を作る)。
  4. Let key be ? ToPropertyKey(propertyKey)(キーに変換する)。
  5. Perform ? DefinePropertyOrThrow(obj, key, desc)(定義する、失敗すれば例外)。
  6. Return undefined.

20.1.3.9.3 Object.prototype.__lookupGetter__ ( propertyKey )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let obj be ? ToObject(this value)(this をオブジェクトに変換する)。
  2. Let key be ? ToPropertyKey(propertyKey)(キーに変換する)。
  3. Repeat,
    1. Let desc be ? obj.[[GetOwnProperty]](key)(所有プロパティ記述子を取得する)。
    2. If desc is not undefined, then
      1. If IsAccessorDescriptor(desc) is true, return desc.[[Get]](アクセサ記述子ならゲッターを返す)。
      2. Return undefined(データプロパティなら undefined を返す)。
    3. Set obj to ? obj.[[GetPrototypeOf]]()(プロトタイプを次に進める)。
    4. If obj is null, return undefined(プロトタイプが尽きたら undefined)。

20.1.3.9.4 Object.prototype.__lookupSetter__ ( propertyKey )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let obj be ? ToObject(this value)(this をオブジェクトに変換する)。
  2. Let key be ? ToPropertyKey(propertyKey)(キーに変換する)。
  3. Repeat,
    1. Let desc be ? obj.[[GetOwnProperty]](key)(所有プロパティ記述子を取得する)。
    2. If desc is not undefined, then
      1. If IsAccessorDescriptor(desc) is true, return desc.[[Set]](アクセサ記述子ならセッターを返す)。
      2. Return undefined(データプロパティなら undefined を返す)。
    3. Set obj to ? obj.[[GetPrototypeOf]]()(プロトタイプを次に進める)。
    4. If obj is null, return undefined(尽きたら undefined)。

20.1.4 オブジェクトインスタンスのプロパティ

オブジェクトインスタンスは、Object プロトタイプオブジェクトから継承するもの以外に特別なプロパティを持たない。

20.2 関数オブジェクト

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 ( ...parameterArgs, bodyArg )

最後の引数(存在する場合)は関数の本体(実行可能コード)を指定し、前の引数は形式パラメータを指定する。

この関数は呼び出されたときに次の手順を実行する:

  1. Let constructor be the active function object(アクティブな関数オブジェクトを取得する)。
  2. If bodyArg is not present, set bodyArg to the empty String(本体引数がなければ空文字列にする)。
  3. Return ? CreateDynamicFunction(constructor, NewTarget, normal, parameterArgs, bodyArg)(動的関数を作成して返す)。
Note

各形式パラメータに対して必ず 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 ( constructor, newTarget, kind, parameterArgs, bodyArg )

The abstract operation CreateDynamicFunction takes arguments constructor (a constructor), newTarget (a constructor or undefined), kind (normal, generator, async, or async-generator), parameterArgs (a List of ECMAScript language values), and bodyArg (an ECMAScript language value) and returns either a normal completion containing an ECMAScript function object or a throw completion. constructor はこの処理を行うコンストラクタ関数である。newTargetnew が最初に適用されたコンストラクタである。parameterArgsbodyArgconstructor に渡された引数値を反映する。 It performs the following steps when called:

  1. If newTarget is undefined, set newTarget to constructornewTarget が未定義なら constructor を使う)。
  2. If kind is normal, then
    1. Let prefix be "function".
    2. Let exprSym be the grammar symbol FunctionExpression.
    3. Let bodySym be the grammar symbol FunctionBody[~Yield, ~Await].
    4. Let parameterSym be the grammar symbol FormalParameters[~Yield, ~Await].
    5. Let fallbackProto be "%Function.prototype%".
  3. Else if kind is generator, then
    1. Let prefix be "function*".
    2. Let exprSym be the grammar symbol GeneratorExpression.
    3. Let bodySym be the grammar symbol GeneratorBody.
    4. Let parameterSym be the grammar symbol FormalParameters[+Yield, ~Await].
    5. Let fallbackProto be "%GeneratorFunction.prototype%".
  4. Else if kind is async, then
    1. Let prefix be "async function".
    2. Let exprSym be the grammar symbol AsyncFunctionExpression.
    3. Let bodySym be the grammar symbol AsyncFunctionBody.
    4. Let parameterSym be the grammar symbol FormalParameters[~Yield, +Await].
    5. Let fallbackProto be "%AsyncFunction.prototype%".
  5. Else,
    1. Assert: kind is async-generator.
    2. Let prefix be "async function*".
    3. Let exprSym be the grammar symbol AsyncGeneratorExpression.
    4. Let bodySym be the grammar symbol AsyncGeneratorBody.
    5. Let parameterSym be the grammar symbol FormalParameters[+Yield, +Await].
    6. Let fallbackProto be "%AsyncGeneratorFunction.prototype%".
  6. Let argCount be the number of elements in parameterArgs(パラメータ引数の数を得る)。
  7. Let parameterStrings be a new empty List(空の文字列リストを作る)。
  8. For each element arg of parameterArgs, do
    1. Append ? ToString(arg) to parameterStrings(各引数を文字列に変換してリストに追加)。
  9. Let bodyString be ? ToString(bodyArg)(本体引数を文字列にする)。
  10. Let currentRealm be the current Realm Record(現在の Realm レコードを取得)。
  11. Perform ? HostEnsureCanCompileStrings(currentRealm, parameterStrings, bodyString, false)(ホストにより文字列のコンパイル許可を確認)。
  12. Let parameterString be the empty String(パラメータ文字列を初期化)。
  13. If argCount > 0, then
    1. Set parameterString to parameterStrings[0].
    2. Let k be 1.
    3. Repeat, while k < argCount,
      1. Let nextArgString be parameterStrings[k].
      2. Set parameterString to the string-concatenation of parameterString, "," (a comma), and nextArgString(カンマで連結していく)。
      3. Set k to k + 1.
  14. Let bodyParseString be the string-concatenation of 0x000A (LINE FEED), bodyString, and 0x000A (LINE FEED)(本体のパース用文字列を生成)。
  15. Let sourceString be the string-concatenation of prefix, " anonymous(", parameterString, 0x000A (LINE FEED), ") {", bodyParseString, and "}"(ソース文字列を組み立てる)。
  16. Let sourceText be StringToCodePoints(sourceString)(コードポイント列に変換する)。
  17. Let parameters be ParseText(parameterString, parameterSym)(パラメータ文字列を構文解析する)。
  18. If parameters is a List of errors, throw a SyntaxError exception(パースエラーなら例外)。
  19. Let body be ParseText(bodyParseString, bodySym)(本体文字列を構文解析する)。
  20. If body is a List of errors, throw a SyntaxError exception(本体パースでエラーなら例外)。
  21. NOTE: パラメータと本体はそれぞれ単独で有効であることを保証するために別々に解析される。例えば new Function("/*", "*/ ) {") は関数にはならない。
  22. NOTE: このステップに到達した場合、sourceTextexprSym の構文を持たなければならない(ただしその逆は成り立たない)。次の 2 ステップの目的は exprSym に直接適用される Early Error ルールを強制することである。
  23. Let expr be ParseText(sourceText, exprSym)(ソース全体を構文解析)。
  24. If expr is a List of errors, throw a SyntaxError exception(構文エラーなら例外)。
  25. Let proto be ? GetPrototypeFromConstructor(newTarget, fallbackProto)(コンストラクタからプロトタイプを取得)。
  26. Let env be currentRealm.[[GlobalEnv]](グローバル環境を取得)。
  27. Let privateEnv be null(プライベート環境は null)。
  28. Let func be OrdinaryFunctionCreate(proto, sourceText, parameters, body, non-lexical-this, env, privateEnv)(関数オブジェクトを作成)。
  29. Perform SetFunctionName(func, "anonymous")(関数名を設定)。
  30. If kind is generator, then
    1. Let prototype be OrdinaryObjectCreate(%GeneratorPrototype%)(ジェネレータのプロトタイプを作成)。
    2. Perform ! DefinePropertyOrThrow(func, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }).(prototype プロパティを定義)。
  31. Else if kind is async-generator, then
    1. Let prototype be OrdinaryObjectCreate(%AsyncGeneratorPrototype%)(非同期ジェネレータのプロトタイプを作成)。
    2. Perform ! DefinePropertyOrThrow(func, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }).(prototype を定義)。
  32. Else if kind is normal, then
    1. Perform MakeConstructor(func)(関数をコンストラクタにする)。
  33. NOTE: kindasync の関数は constructable でなく、[[Construct]] 内部メソッドや "prototype" プロパティを持たない。
  34. Return func(作成した関数を返す)。
Note

CreateDynamicFunction は、作成する関数のうち kindasync でないものに対して "prototype" プロパティを定義する。これは関数がコンストラクタとして使われる可能性に備えるためである。

20.2.2 Function コンストラクタのプロパティ

Function コンストラクタ:

  • それ自体が組み込みの関数オブジェクトである。
  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • "length" プロパティの値は 1𝔽 である。
  • 以下のプロパティを持つ:

20.2.2.1 Function.prototype

Function.prototype の値は Function プロトタイプオブジェクトである。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.2.3 Function プロトタイプオブジェクトのプロパティ

Function プロトタイプオブジェクト は次のとおりである:

  • %Function.prototype% である。
  • それ自体が組み込み関数オブジェクトである。
  • 任意の引数を受け取り、呼び出されると undefined を返す。
  • [[Construct]] 内部メソッドを持たない;したがって new 演算子でコンストラクタとして使用できない。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。
  • "prototype" プロパティを持たない。
  • "length" プロパティの値は +0𝔽 である。
  • "name" プロパティの値は空文字列である。
Note

Function プロトタイプオブジェクトは、ECMAScript 2015 以前に作成された ECMAScript コードとの互換性を確保するために関数オブジェクトとして指定されている。

20.2.3.1 Function.prototype.apply ( thisArg, argArray )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let func be the this value(this を func とする)。
  2. If IsCallable(func) is false, throw a TypeError exception(呼び出し可能でなければ例外)。
  3. If argArray is either undefined or null, then
    1. Perform PrepareForTailCall().
    2. Return ? Call(func, thisArg)(引数なしで呼び出す)。
  4. Let argList be ? CreateListFromArrayLike(argArray)(配列様オブジェクトから引数リストを作る)。
  5. Perform PrepareForTailCall().
  6. Return ? Call(func, thisArg, argList)(作成した引数リストで呼び出す)。
Note 1

thisArg の値は修飾されずに this 値として渡される。これは Edition 3 からの変更であり、Edition 3 では undefined または nullthisArgグローバルオブジェクトに置き換えられ、他の値には ToObject を適用して渡していた。thisArg は修飾されずに渡されるが、非 strict 関数は関数内部に入るときにこれらの変換を行う。

Note 2

もし func がアロー関数かバウンド関数エキゾチックオブジェクトである場合、thisArg はステップ 6 の Call によって無視される。

20.2.3.2 Function.prototype.bind ( thisArg, ...args )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let target be the this value(this を target とする)。
  2. If IsCallable(target) is false, throw a TypeError exception(呼び出し可能でなければ例外)。
  3. Let boundFunc be ? BoundFunctionCreate(target, thisArg, args)(バウンド関数を作成する)。
  4. Let length be 0(length を 0 に初期化)。
  5. Let targetHasLength be ? HasOwnProperty(target, "length")(ターゲットに length 自身プロパティがあるか確認)。
  6. If targetHasLength is true, then
    1. Let targetLen be ? Get(target, "length")(ターゲットの length を取得)。
    2. If targetLen is a Number, then
      1. If targetLen is +∞𝔽, then
        1. Set length to +∞.
      2. Else if targetLen is -∞𝔽, then
        1. Set length to 0.
      3. Else,
        1. Let targetLenAsInt be ! ToIntegerOrInfinity(targetLen)(整数に変換)。
        2. Assert: targetLenAsInt is finite(有限であることを主張)。
        3. Let argCount be the number of elements in args(バインドする引数の数)。
        4. Set length to max(targetLenAsInt - argCount, 0)(残りの引数数を length に設定)。
  7. Perform SetFunctionLength(boundFunc, length)(バウンド関数の length を設定)。
  8. Let targetName be ? Get(target, "name")(ターゲットの name を取得)。
  9. If targetName is not a String, set targetName to the empty String(文字列でなければ空文字)。
  10. Perform SetFunctionName(boundFunc, targetName, "bound")(名前を設定し "bound" を付加)。
  11. Return boundFunc(バウンド関数を返す)。
Note 1

Function.prototype.bind で作成された関数オブジェクトはエキゾチックオブジェクトである。また "prototype" プロパティを持たない。

Note 2

もし target がアロー関数かバウンド関数エキゾチックオブジェクトである場合、このメソッドに渡された thisArg は後続の func 呼び出しで使用されない。

20.2.3.3 Function.prototype.call ( thisArg, ...args )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let func be the this value(this を func とする)。
  2. If IsCallable(func) is false, throw a TypeError exception(呼び出し可能でなければ例外)。
  3. Perform PrepareForTailCall().
  4. Return ? Call(func, thisArg, args)(引数で呼び出す)。
Note 1

thisArg の値は修飾されずに this 値として渡される。これは Edition 3 からの変更である。非 strict 関数は関数内部に入るときにこれらの変換を行う。

Note 2

もし func がアロー関数かバウンド関数エキゾチックオブジェクトである場合、thisArg はステップ 4 の Call によって無視される。

20.2.3.4 Function.prototype.constructor

Function.prototype.constructor の初期値は %Function% である。

20.2.3.5 Function.prototype.toString ( )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let func be the this value(this を func とする)。
  2. If func is an Object, func has a [[SourceText]] internal slot, func.[[SourceText]] is a sequence of Unicode code points, and HostHasSourceTextAvailable(func) is true, then
    1. Return CodePointsToString(func.[[SourceText]])(ソーステキストが利用可能ならそれを返す)。
  3. If func is a built-in function object, return an implementation-defined String source code representation of func. The representation must have the syntax of a NativeFunction. Additionally, if func has an [[InitialName]] internal slot and func.[[InitialName]] is a String, the portion of the returned String that would be matched by NativeFunctionAccessoropt PropertyName must be func.[[InitialName]].
  4. If func is an Object and IsCallable(func) is true, return an implementation-defined String source code representation of func. The representation must have the syntax of a NativeFunction.
  5. Throw a TypeError exception(上に当てはまらなければ例外)。
NativeFunction : function NativeFunctionAccessoropt PropertyName[~Yield, ~Await]opt ( FormalParameters[~Yield, ~Await] ) { [ native code ] } NativeFunctionAccessor : get set

20.2.3.6 Function.prototype [ %Symbol.hasInstance% ] ( value )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let thisValue be the this value(this を取得する)。
  2. Return ? OrdinaryHasInstance(thisValue, value)(ordinary has-instance を実行して返す)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

Note

これは %Symbol.hasInstance% のデフォルト実装であり、多くの関数が継承する。instanceof 演算子は特定のコンストラクタのインスタンスか否かを判定するために %Symbol.hasInstance% を呼び出す。式

v instanceof F

は次と評価される:

F[%Symbol.hasInstance%](v)

コンストラクタ関数は関数上に異なる %Symbol.hasInstance% メソッドを公開することで instanceof によって認識されるオブジェクトを制御できる。

このプロパティはバウンド関数の対象関数をグローバルに公開するための改変を防ぐために書き換え不可かつ設定不可である。

The value of the "name" property of this method is "[Symbol.hasInstance]".

20.2.4 関数インスタンス

すべての Function インスタンスは ECMAScript の関数オブジェクトであり、Table 25 に列挙される内部スロットを持つ。Function.prototype.bind によって作られた関数オブジェクトは Table 26 に示される内部スロットを持つ。

関数インスタンスは以下のプロパティを持つ:

20.2.4.1 length

"length" プロパティの値は、関数が期待する典型的な引数の数を示す整数である。ただし、言語は別の数の引数で呼び出すことを許す。関数が "length" プロパティで指定された数以外の引数で呼び出された場合の振る舞いは関数による。このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

20.2.4.2 name

"name" プロパティの値は関数を記述する文字列である。名前は意味論的な意味を持たないが、通常は ECMAScript ソーステキストの定義点で関数を参照するために使われる変数名やプロパティ名である。このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

この仕様によって文脈上の名前が関連付けられていない匿名関数オブジェクトは、"name" プロパティとして空文字列を使用する。

20.2.4.3 prototype

コンストラクタとして使用できる関数インスタンスは "prototype" プロパティを持つ。そのような Function インスタンスが作成されるとき、別の通常オブジェクトが作成され、それが関数の "prototype" プロパティの初期値となる。指定がない限り、"prototype" プロパティの値はその関数がコンストラクタとして呼ばれたときに作成されるオブジェクトの [[Prototype]] 内部スロットを初期化するために使用される。

このプロパティは属性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

Note

Function.prototype.bind で作成された関数、または MethodDefinitionGeneratorMethodAsyncGeneratorMethod ではないもの)や ArrowFunction を評価して作成された関数オブジェクトは "prototype" プロパティを持たない。

20.2.5 HostHasSourceTextAvailable ( func )

The host-defined abstract operation HostHasSourceTextAvailable takes argument func (a function object) and returns a 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 )

この関数は呼び出されたときに次の手順を実行する:

  1. Let b be ToBoolean(value)(値を真偽値に変換する)。
  2. If NewTarget is undefined, return b(NewTarget が undefined ならプリミティブ真偽値を返す)。
  3. Let obj be ? OrdinaryCreateFromConstructor(NewTarget, "%Boolean.prototype%", « [[BooleanData]] »)(コンストラクタから Boolean オブジェクトを作る)。
  4. Set obj.[[BooleanData]] to b(内部スロットに値を格納)。
  5. Return obj(オブジェクトを返す)。

20.3.2 Boolean コンストラクタのプロパティ

Boolean コンストラクタ:

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

20.3.2.1 Boolean.prototype

Boolean.prototype の初期値は Boolean プロトタイプオブジェクトである。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.3.3 Boolean プロトタイプオブジェクトのプロパティ

Boolean プロトタイプオブジェクト は次のとおりである:

  • %Boolean.prototype% である。
  • 通常オブジェクトである。
  • 自身が Boolean オブジェクトであり、[[BooleanData]] 内部スロットを持ち、その値は false である。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。

20.3.3.1 Boolean.prototype.constructor

Boolean.prototype.constructor の初期値は %Boolean% である。

20.3.3.2 Boolean.prototype.toString ( )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let b be ? ThisBooleanValue(this value)(this の Boolean 値を取得する)。
  2. If b is true, return "true"(真なら "true" を返す)。
  3. Return "false"(それ以外は "false" を返す)。

20.3.3.3 Boolean.prototype.valueOf ( )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Return ? ThisBooleanValue(this value)(this の Boolean 値を返す)。

20.3.3.3.1 ThisBooleanValue ( value )

The abstract operation ThisBooleanValue takes argument value (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. If value is a Boolean, return value(プリミティブ Boolean ならそのまま返す)。
  2. If value is an Object and value has a [[BooleanData]] internal slot, then
    1. Let b be value.[[BooleanData]](内部スロットの値を取得)。
    2. Assert: b is a Booleanb が Boolean であることを主張)。
    3. Return b(その値を返す)。
  3. Throw a TypeError exception(それ以外は例外)。

20.3.4 Boolean インスタンスのプロパティ

Boolean インスタンスは Boolean プロトタイプオブジェクトからプロパティを継承する通常オブジェクトである。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 ] )

この関数は呼び出されたときに次の手順を実行する:

  1. If NewTarget is not undefined, throw a TypeError exception(NewTarget が定義されている場合は例外)。
  2. If description is undefined, let descString be undefined(説明が undefined なら descString を undefined にする)。
  3. Else, let descString be ? ToString(description)(そうでなければ文字列化する)。
  4. Return a new Symbol whose [[Description]] is descString(説明を持つ新しい Symbol を返す)。

20.4.2 Symbol コンストラクタのプロパティ

Symbol コンストラクタ:

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

20.4.2.1 Symbol.asyncIterator

Symbol.asyncIterator の初期値は既知のシンボル %Symbol.asyncIterator% である(Table 1)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.2.2 Symbol.for ( key )

この関数は呼び出されたときに次の手順を実行する:

  1. Let stringKey be ? ToString(key)(キーを文字列に変換する)。
  2. For each element e of the GlobalSymbolRegistry List, do
    1. If e.[[Key]] is stringKey, return e.[[Symbol]](既に登録されていればそのシンボルを返す)。
  3. Assert: The GlobalSymbolRegistry List does not currently contain an entry for stringKey(登録されていないことを主張)。
  4. Let newSymbol be a new Symbol whose [[Description]] is stringKey(新しいシンボルを作る)。
  5. Append the GlobalSymbolRegistry Record { [[Key]]: stringKey, [[Symbol]]: newSymbol } to the GlobalSymbolRegistry List(登録リストに追加)。
  6. Return newSymbol(新しいシンボルを返す)。

GlobalSymbolRegistry List は追記のみ可能なグローバルに利用可能なリストである。すべての realm に共有される。任意の ECMAScript コードの評価より前に、これは新しい空リストとして初期化される。GlobalSymbolRegistry List の要素は Table 58 に定義される構造のレコードである。

Table 58: GlobalSymbolRegistry Record Fields
Field Name Value Usage
[[Key]] a String A string key used to globally identify a Symbol.
[[Symbol]] a Symbol A symbol that can be retrieved from any realm.

20.4.2.3 Symbol.hasInstance

Symbol.hasInstance の初期値は既知のシンボル %Symbol.hasInstance% である(Table 1)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.2.4 Symbol.isConcatSpreadable

Symbol.isConcatSpreadable の初期値は既知のシンボル %Symbol.isConcatSpreadable% である(Table 1)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.2.5 Symbol.iterator

Symbol.iterator の初期値は既知のシンボル %Symbol.iterator% である(Table 1)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.2.6 Symbol.keyFor ( sym )

この関数は呼び出されたときに次の手順を実行する:

  1. If sym is not a Symbol, throw a TypeError exception(sym がシンボルでなければ例外)。
  2. Return KeyForSymbol(sym)(キーを返す)。

20.4.2.7 Symbol.match

Symbol.match の初期値は既知のシンボル %Symbol.match% である(Table 1)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.2.8 Symbol.matchAll

Symbol.matchAll の初期値は既知のシンボル %Symbol.matchAll% である(Table 1)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.2.9 Symbol.prototype

Symbol.prototype の初期値は Symbol プロトタイプオブジェクトである。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.2.10 Symbol.replace

Symbol.replace の初期値は既知のシンボル %Symbol.replace% である(Table 1)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.2.11 Symbol.search

Symbol.search の初期値は既知のシンボル %Symbol.search% である(Table 1)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.2.12 Symbol.species

Symbol.species の初期値は既知のシンボル %Symbol.species% である(Table 1)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.2.13 Symbol.split

Symbol.split の初期値は既知のシンボル %Symbol.split% である(Table 1)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.2.14 Symbol.toPrimitive

Symbol.toPrimitive の初期値は既知のシンボル %Symbol.toPrimitive% である(Table 1)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.2.15 Symbol.toStringTag

Symbol.toStringTag の初期値は既知のシンボル %Symbol.toStringTag% である(Table 1)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.2.16 Symbol.unscopables

Symbol.unscopables の初期値は既知のシンボル %Symbol.unscopables% である(Table 1)。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.4.3 Symbol プロトタイプオブジェクトのプロパティ

Symbol プロトタイプオブジェクト は次のとおりである:

  • %Symbol.prototype% である。
  • 通常オブジェクトである。
  • Symbol インスタンスではなく、[[SymbolData]] 内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.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 アクセサ関数は呼び出されたときに次の手順を実行する:

  1. Let s be the this value(this を取得)。
  2. Let sym be ? ThisSymbolValue(s)(this からシンボル値を取得)。
  3. Return sym.[[Description]](その説明を返す)。

20.4.3.3 Symbol.prototype.toString ( )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let sym be ? ThisSymbolValue(this value)(this のシンボル値を取得)。
  2. Return SymbolDescriptiveString(sym)(記述文字列を返す)。

20.4.3.3.1 SymbolDescriptiveString ( sym )

The abstract operation SymbolDescriptiveString takes argument sym (a Symbol) and returns a String. It performs the following steps when called:

  1. Let desc be sym.[[Description]](説明を取得)。
  2. If desc is undefined, set desc to the empty String(説明が undefined なら空文字にする)。
  3. Assert: desc is a String(文字列であることを主張)。
  4. Return the string-concatenation of "Symbol(", desc, and ")"("Symbol(" + desc + ")" を返す)。

20.4.3.4 Symbol.prototype.valueOf ( )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Return ? ThisSymbolValue(this value)(this のシンボル値を返す)。

20.4.3.4.1 ThisSymbolValue ( value )

The abstract operation ThisSymbolValue takes argument value (an ECMAScript language value) and returns either a normal completion containing a Symbol or a throw completion. It performs the following steps when called:

  1. If value is a Symbol, return value(プリミティブ Symbol なら返す)。
  2. If value is an Object and value has a [[SymbolData]] internal slot, then
    1. Let s be value.[[SymbolData]](内部スロットのシンボルを取得)。
    2. Assert: s is a Symbol(シンボルであることを主張)。
    3. Return s(返す)。
  3. Throw a TypeError exception(それ以外は例外)。

20.4.3.5 Symbol.prototype [ %Symbol.toPrimitive% ] ( hint )

このメソッドは ECMAScript の演算子によって Symbol オブジェクトをプリミティブ値に変換するために呼び出される。

呼び出されたときに次の手順を実行する:

  1. Return ? ThisSymbolValue(this value)(this のシンボル値を返す)。
Note

引数は無視される。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.

The value of the "name" property of this method is "[Symbol.toPrimitive]".

20.4.3.6 Symbol.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "Symbol" である。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.

20.4.4 Symbol インスタンスのプロパティ

Symbol インスタンスは Symbol プロトタイプオブジェクトからプロパティを継承する通常オブジェクトである。Symbol インスタンスは [[SymbolData]] 内部スロットを持つ。[[SymbolData]] 内部スロットはこの Symbol オブジェクトが表す Symbol 値である。

20.4.5 シンボルのための抽象操作

20.4.5.1 KeyForSymbol ( sym )

The abstract operation KeyForSymbol takes argument sym (a Symbol) and returns a String or undefined. もし symGlobalSymbolRegistry List に含まれているなら、sym を登録するために使われた文字列を返す。 It performs the following steps when called:

  1. For each element e of the GlobalSymbolRegistry List, do
    1. If SameValue(e.[[Symbol]], sym) is true, return e.[[Key]](一致するエントリのキーを返す)。
  2. Assert: The GlobalSymbolRegistry List does not currently contain an entry for sym(登録されていないことを主張)。
  3. Return undefined(見つからなければ undefined を返す)。

20.5 Error オブジェクト

エラーオブジェクトのインスタンスは実行時エラーが発生したときに例外として投げられる。Error オブジェクトはユーザー定義の例外クラスの基底オブジェクトとしても使用され得る。

ECMAScript 実装が実行時エラーを検出したとき、それは 20.5.5 で定義された NativeError オブジェクトのいずれか、または 20.5.7 で定義された AggregateError オブジェクトの新しいインスタンスを投げる。

20.5.1 Error コンストラクタ

Error コンストラクタ:

  • %Error% である。
  • グローバルオブジェクト"Error" プロパティの初期値である。
  • コンストラクタとしてではなく関数として呼び出されたときに新しい Error オブジェクトを作成・初期化する。したがって関数呼び出し Error(…) は new Error(…) と同等である。
  • クラス定義の extends 節の値として使用されることがある。指定された Error 振る舞いを継承するサブクラスのコンストラクタは、[[ErrorData]] 内部スロットを持つサブクラスインスタンスを作成・初期化するために Error コンストラクタへの super 呼び出しを含まなければならない。

20.5.1.1 Error ( message [ , options ] )

この関数は呼び出されたときに次の手順を実行する:

  1. If NewTarget is undefined, let newTarget be the active function object; else let newTarget be NewTarget(NewTarget が undefined ならアクティブ関数を使う)。
  2. Let obj be ? OrdinaryCreateFromConstructor(newTarget, "%Error.prototype%", « [[ErrorData]] »)(Error オブジェクトを作成)。
  3. If message is not undefined, then
    1. Let msg be ? ToString(message)(メッセージを文字列化)。
    2. Perform CreateNonEnumerableDataPropertyOrThrow(obj, "message", msg)(message プロパティを非列挙で作成)。
  4. Perform ? InstallErrorCause(obj, options)(cause オプションをインストール)。
  5. Return obj(オブジェクトを返す)。

20.5.2 Error コンストラクタのプロパティ

Error コンストラクタ:

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

20.5.2.1 Error.isError ( arg )

この関数は呼び出されたときに次の手順を実行する:

  1. If arg is not an Object, return false(オブジェクトでなければ false)。
  2. If arg does not have an [[ErrorData]] internal slot, return false[[ErrorData]] がなければ false)。
  3. Return true(それ以外は true)。

20.5.2.2 Error.prototype

Error.prototype の初期値は Error プロトタイプオブジェクトである。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.5.3 Error プロトタイプオブジェクトのプロパティ

Error プロトタイプオブジェクト は次のとおりである:

  • %Error.prototype% である。
  • 通常オブジェクトである。
  • Error インスタンスではなく [[ErrorData]] 内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% である。

20.5.3.1 Error.prototype.constructor

Error.prototype.constructor の初期値は %Error% である。

20.5.3.2 Error.prototype.message

Error.prototype.message の初期値は空文字列である。

20.5.3.3 Error.prototype.name

Error.prototype.name の初期値は "Error" である。

20.5.3.4 Error.prototype.toString ( )

このメソッドは呼び出されたときに次の手順を実行する:

  1. Let obj be the this value(this を取得)。
  2. If obj is not an Object, throw a TypeError exception(オブジェクトでなければ例外)。
  3. Let name be ? Get(obj, "name")(name を取得)。
  4. If name is undefined, set name to "Error"; else set name to ? ToString(name)(name が undefined なら "Error"、そうでなければ文字列化)。
  5. Let msg be ? Get(obj, "message")(message を取得)。
  6. If msg is undefined, set msg to the empty String; else set msg to ? ToString(msg)(message が undefined なら空文字、そうでなければ文字列化)。
  7. If name is the empty String, return msg(name が空なら message を返す)。
  8. If msg is the empty String, return name(message が空なら name を返す)。
  9. Return the string-concatenation of name, the code unit 0x003A (COLON), the code unit 0x0020 (SPACE), and msg("name: message" を返す)。

20.5.4 Error インスタンスのプロパティ

Error インスタンスは Error プロトタイプオブジェクトからプロパティを継承する通常オブジェクトであり、[[ErrorData]] 内部スロットを持ち、その値は undefined である。[[ErrorData]] の唯一の指定用途は Object.prototype.toStringError.isError によって Error、AggregateError、NativeError のインスタンスを Error オブジェクトとして識別することである。

20.5.5 この標準で使用されるネイティブエラー型

以下の NativeError オブジェクトのいずれか、あるいは AggregateError オブジェクトの新しいインスタンスが実行時エラー検出時に投げられる。すべての 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% である。

他のいずれの NativeError も失敗原因を適切に示すものではない場合に、不成功な操作を示すために使用される。

20.5.5.6 URIError

URIError コンストラクタは %URIError% である。

グローバル URI 処理関数のいずれかがその定義と互換性のない方法で使用されたことを示す。

20.5.6 NativeError オブジェクトの構造

これらの各オブジェクトは下記に示す構造を持ち、コンストラクタ名とプロトタイプオブジェクトの "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 関数は呼び出されたときに次の手順を実行する:

  1. If NewTarget is undefined, let newTarget be the active function object; else let newTarget be NewTarget(NewTarget を決定)。
  2. Let obj be ? OrdinaryCreateFromConstructor(newTarget, "%NativeError.prototype%", « [[ErrorData]] »)(オブジェクトを作成)。
  3. If message is not undefined, then
    1. Let msg be ? ToString(message)(メッセージを文字列化)。
    2. Perform CreateNonEnumerableDataPropertyOrThrow(obj, "message", msg)(message を非列挙プロパティとして作成)。
  4. Perform ? InstallErrorCause(obj, options)(cause オプションをインストール)。
  5. Return obj(作成したオブジェクトを返す)。

ステップ 2 で渡される文字列の実際の値は、定義される NativeError コンストラクタに対応して "%EvalError.prototype%", "%RangeError.prototype%", "%ReferenceError.prototype%", "%SyntaxError.prototype%", "%TypeError.prototype%", または "%URIError.prototype%" のいずれかである。

20.5.6.2 NativeError コンストラクタのプロパティ

NativeError コンストラクタ:

  • [[Prototype]] 内部スロットを持ち、その値は %Error% である。
  • "name" プロパティの値は文字列値 "NativeError" である。
  • 以下のプロパティを持つ:

20.5.6.2.1 NativeError.prototype

NativeError.prototype の初期値は NativeError プロトタイプオブジェクトである(20.5.6.3)。各 NativeError コンストラクタは別個のプロトタイプオブジェクトを持つ。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.5.6.3 NativeError プロトタイプオブジェクトのプロパティ

NativeError プロトタイプオブジェクト は次のとおりである:

  • 通常オブジェクトである。
  • Error インスタンスではなく [[ErrorData]] 内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Error.prototype% である。

20.5.6.3.1 NativeError.prototype.constructor

特定の NativeError コンストラクタに対するプロトタイプの "constructor" プロパティの初期値はそのコンストラクタ自体である。

20.5.6.3.2 NativeError.prototype.message

特定の NativeError コンストラクタに対するプロトタイプの "message" プロパティの初期値は空文字列である。

20.5.6.3.3 NativeError.prototype.name

特定の NativeError コンストラクタに対するプロトタイプの "name" プロパティの初期値は、そのコンストラクタ名の文字列である(NativeError の代わりに使用される名前)。

20.5.6.4 NativeError インスタンスのプロパティ

NativeError インスタンスはその NativeError プロトタイプオブジェクトからプロパティを継承する通常オブジェクトであり、[[ErrorData]] 内部スロットを持ち、その値は undefined である。[[ErrorData]] の唯一の指定用途は Object.prototype.toStringError.isError によって Error、AggregateError、または 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 ] )

この関数は呼び出されたときに次の手順を実行する:

  1. If NewTarget is undefined, let newTarget be the active function object; else let newTarget be NewTarget(NewTarget を決める)。
  2. Let obj be ? OrdinaryCreateFromConstructor(newTarget, "%AggregateError.prototype%", « [[ErrorData]] »)(AggregateError オブジェクトを作成)。
  3. If message is not undefined, then
    1. Let msg be ? ToString(message)(メッセージを文字列化)。
    2. Perform CreateNonEnumerableDataPropertyOrThrow(obj, "message", msg)(message を作成)。
  4. Perform ? InstallErrorCause(obj, options)(cause をインストール)。
  5. Let errorsList be ? IteratorToList(? GetIterator(errors, sync))(errors から同期イテレータを取得してリスト化)。
  6. Perform ! DefinePropertyOrThrow(obj, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errorsList) })(errors プロパティを作成)。
  7. Return obj(オブジェクトを返す)。

20.5.7.2 AggregateError コンストラクタのプロパティ

AggregateError コンストラクタ:

  • [[Prototype]] 内部スロットを持ち、その値は %Error% である。
  • 以下のプロパティを持つ:

20.5.7.2.1 AggregateError.prototype

AggregateError.prototype の初期値は %AggregateError.prototype% である。

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

20.5.7.3 AggregateError プロトタイプオブジェクトのプロパティ

AggregateError プロトタイプオブジェクト は次のとおりである:

  • %AggregateError.prototype% である。
  • 通常オブジェクトである。
  • Error インスタンスや AggregateError インスタンスではなく、[[ErrorData]] 内部スロットを持たない。
  • [[Prototype]] 内部スロットを持ち、その値は %Error.prototype% である。

20.5.7.3.1 AggregateError.prototype.constructor

AggregateError.prototype.constructor の初期値は %AggregateError% である。

20.5.7.3.2 AggregateError.prototype.message

AggregateError.prototype.message の初期値は空文字列である。

20.5.7.3.3 AggregateError.prototype.name

AggregateError.prototype.name の初期値は "AggregateError" である。

20.5.7.4 AggregateError インスタンスのプロパティ

AggregateError インスタンスは AggregateError プロトタイプオブジェクトからプロパティを継承する通常オブジェクトであり、[[ErrorData]] 内部スロットを持ち、その値は undefined である。[[ErrorData]] の唯一の指定用途は Object.prototype.toStringError.isError によって Error、AggregateError、または NativeError のインスタンスを識別することである。

20.5.8 エラーオブジェクトの抽象操作

20.5.8.1 InstallErrorCause ( obj, options )

The abstract operation InstallErrorCause takes arguments obj (an Object) and options (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. これは options"cause" プロパティが存在する場合に obj"cause" プロパティを作成するために使用される。 It performs the following steps when called:

  1. If options is an Object and ? HasProperty(options, "cause") is true, then
    1. Let cause be ? Get(options, "cause")(options.cause を取得)。
    2. Perform CreateNonEnumerableDataPropertyOrThrow(obj, "cause", cause)(cause を非列挙プロパティとして作成)。
  2. Return unused(何も返さない)。

21 Numbers and Dates

21.1 数値オブジェクト

21.1.1 Number コンストラクター

Number コンストラクターは次の通りです:

  • %Number% です。
  • グローバルオブジェクト"Number" プロパティの初期値です。
  • コンストラクターとして呼び出された場合、新しい Number オブジェクトを作成して初期化します。
  • 関数として呼び出された場合は型変換を行います。
  • クラス定義の extends 節の値として使用できる場合があります。指定された Number の振る舞いを継承するサブクラスのコンストラクターは、サブクラスインスタンスを [[NumberData]] 内部スロットで作成・初期化するために、Number コンストラクターへの super 呼び出しを含める必要があります。

21.1.1.1 Number ( value )

この関数は呼び出されたときに以下の手順を実行します:

  1. value が存在する場合、次を行う:
    1. prim を ? ToNumeric(value) とする。
    2. prim が BigInt の場合、n𝔽((prim)) とする。
    3. それ以外の場合、nprim とする。
  2. 存在しない場合、次を行う:
    1. n+0𝔽 とする。
  3. NewTarget が undefined の場合、n を返す。
  4. obj を ? OrdinaryCreateFromConstructor(NewTarget, "%Number.prototype%", « [[NumberData]] ») とする。
  5. obj.[[NumberData]]n を設定する。
  6. obj を返す。

21.1.2 Numberコンストラクターのプロパティ

Numberコンストラクターは:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% です。
  • 次のプロパティを持ちます:

21.1.2.1 Number.EPSILON

Number.EPSILON の値は、1とNumber値として表現可能な1より大きい最小値との差の大きさを表すNumber値であり、概ね 2.2204460492503130808472633361816 × 10-16 です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

21.1.2.2 Number.isFinite ( number )

この関数は呼び出されたとき、以下の手順を実行します:

  1. number がNumberでなければ、false を返します。
  2. number が有限でなければ、false を返します。
  3. true を返します。

21.1.2.3 Number.isInteger ( number )

この関数は呼び出されたとき、以下の手順を実行します:

  1. number が整数のNumberであれば、true を返します。
  2. false を返します。

21.1.2.4 Number.isNaN ( number )

この関数は呼び出されたとき、以下の手順を実行します:

  1. number がNumberでなければ、false を返します。
  2. numberNaN であれば、true を返します。
  3. false を返します。
Note

この関数はグローバル関数 isNaN (19.2.3) とは異なり、引数をNumberに変換してから NaN かどうかを判定しません。

21.1.2.5 Number.isSafeInteger ( number )

Note

整数 n が "安全な整数" であるのは、n のNumber値が他の整数のNumber値と一致しない場合に限ります。

この関数は呼び出されたとき、以下の手順を実行します:

  1. number が整数のNumberであれば、
    1. abs((number)) ≤ 253 - 1 であれば、true を返します。
  2. false を返します。

21.1.2.6 Number.MAX_SAFE_INTEGER

Note

IEEE 754-2019 の精度制限による丸め挙動のため、Number.MAX_SAFE_INTEGER より大きいすべての整数のNumber値は少なくとも1つの他の整数と共有されます。このため、このような大きな整数は 安全ではなく、正確にNumber値として表現されることや区別可能であることは保証されません。例えば、90071992547409929007199254740993 はどちらも Number値 9007199254740992𝔽 になります。

Number.MAX_SAFE_INTEGER の値は 9007199254740991𝔽 (𝔽(253 - 1)) です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

21.1.2.7 Number.MAX_VALUE

Number.MAX_VALUE の値はNumber型の最大の正の有限値であり、概ね 1.7976931348623157 × 10308 です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

21.1.2.8 Number.MIN_SAFE_INTEGER

Note

IEEE 754-2019 の精度制限による丸め挙動のため、Number.MIN_SAFE_INTEGER より小さいすべての整数のNumber値は少なくとも1つの他の整数と共有されます。このため、このような大きな負の整数は 安全ではなく、正確にNumber値として表現されることや区別可能であることは保証されません。例えば、-9007199254740992-9007199254740993 はどちらも Number値 -9007199254740992𝔽 になります。

Number.MIN_SAFE_INTEGER の値は -9007199254740991𝔽 (𝔽(-(253 - 1))) です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

21.1.2.9 Number.MIN_VALUE

Number.MIN_VALUE の値はNumber型の最小の正の値であり、概ね 5 × 10-324 です。

IEEE 754-2019 の倍精度二進表現では、最小値は非正規化数です。実装が非正規化値をサポートしない場合、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オブジェクトであり、[[NumberData]] 内部スロットを持ち、その値は +0𝔽 です。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% です。

特に明記されていない限り、下記に定義されるNumberプロトタイプオブジェクトのメソッドは汎用的ではなく、渡される this 値はNumber値か、Number値で初期化された [[NumberData]] 内部スロットを持つオブジェクトでなければなりません。

メソッド仕様内の “this Number value” は、抽象操作 ThisNumberValue に this 値を渡した結果を指します。

21.1.3.1 Number.prototype.constructor

Number.prototype.constructor の初期値は %Number% です。

21.1.3.2 Number.prototype.toExponential ( fractionDigits )

このメソッドは、このNumber値を10進指数表記で文字列として返します。小数点の前に1桁、後に fractionDigits 桁を表示します。fractionDigitsundefined の場合、Numberを一意に特定するのに必要な桁数を使用します。

呼び出されたとき、以下の手順を実行します:

  1. numberValue を ? ThisNumberValue(this value) とする。
  2. fractionCount を ? ToIntegerOrInfinity(fractionDigits) とする。
  3. Assert: fractionDigitsundefined ならば、fractionCount は 0 である。
  4. numberValue が有限でないならば、Number::toString(numberValue, 10) を返す。
  5. fractionCount < 0 または fractionCount > 100 ならば、RangeError 例外を投げる。
  6. numberValue(numberValue) に設定する。
  7. sign を空の String とする。
  8. numberValue < 0 ならば、
    1. sign"-" に設定する。
    2. numberValue を -numberValue に設定する。
  9. numberValue = 0 ならば、
    1. significand を、コード単位 0x0030 (DIGIT ZERO) が fractionCount + 1 個出現するものからなる String 値とする。
    2. exponent を 0 とする。
  10. そうでなければ、
    1. fractionDigitsundefined でないならば、
      1. exponentintSignificand を、10fractionCountintSignificand < 10fractionCount + 1 であり、かつ intSignificand × 10exponent - fractionCount - numberValue が可能な限りゼロに近くなるような整数とする。そのような exponentintSignificand の組が 2 つある場合、intSignificand × 10exponent - fractionCount がより大きい方の exponentintSignificand を選ぶ。
    2. そうでなければ、
      1. exponentintSignificand、および ff を、ff ≥ 0、10ffintSignificand < 10ff + 1𝔽(intSignificand × 10exponent - ff) が 𝔽(numberValue) であり、かつ ff が可能な限り小さいような整数とする。intSignificand の十進表現は ff + 1 桁であり、intSignificand は 10 で割り切れず、intSignificand の最下位桁はこれらの基準によって必ずしも一意に定まらないことに注意。
      2. fractionCountff に設定する。
    3. significand を、intSignificand の十進表現の各桁からなる String 値(順に、先頭のゼロなし)とする。
  11. fractionCount ≠ 0 ならば、
    1. integerPartsignificand の最初のコード単位とする。
    2. fractionalPartsignificand の他の fractionCount 個のコード単位とする。
    3. significand を、integerPart"."、および fractionalPart の文字列連結に設定する。
  12. exponent = 0 ならば、
    1. exponentSign"+" とする。
    2. exponentDigits"0" とする。
  13. そうでなければ、
    1. exponent > 0 ならば、
      1. exponentSign"+" とする。
    2. そうでなければ、
      1. Assert: exponent < 0。
      2. exponentSign"-" とする。
      3. exponent を -exponent に設定する。
    3. exponentDigits を、exponent の十進表現の各桁からなる String 値(順に、先頭のゼロなし)とする。
  14. significand を、significand"e"exponentSign、および exponentDigits の文字列連結に設定する。
  15. signsignificand の文字列連結を返す。
Note

上記の規則で要求されるよりも正確な変換を提供する実装については、step 10.b.i の次の代替版を指針として使用することが推奨される:

  1. exponentintSignificand、および ff を、ff ≥ 0、10ffintSignificand < 10ff + 1𝔽(intSignificand × 10exponent - ff) が 𝔽(numberValue) であり、かつ ff が可能な限り小さいような整数とする。intSignificand について複数の可能性がある場合、𝔽(intSignificand × 10exponent - ff) が 𝔽(numberValue) に最も近くなるような intSignificand を選ぶ。そのような intSignificand の値が 2 つある場合、偶数である方を選ぶ。

21.1.3.3 Number.prototype.toFixed ( fractionDigits )

Note 1

このメソッドは、このNumber値を小数固定表記で文字列として返します。小数点以下に fractionDigits 桁を表示します。fractionDigitsundefined の場合、0が使用されます。

呼び出されたとき、以下の手順を実行します:

  1. numberValue を ? ThisNumberValue(this value) とする。
  2. fractionCount を ? ToIntegerOrInfinity(fractionDigits) とする。
  3. Assert: fractionDigitsundefined の場合、fractionCount は 0。
  4. fractionCount が有限でなければ RangeError を投げる。
  5. fractionCount < 0 または fractionCount > 100 なら RangeError を投げる。
  6. numberValue が有限でなければ Number::toString(numberValue, 10) を返す。
  7. numberValue(numberValue) に設定。
  8. sign を空文字列に設定。
  9. numberValue < 0 なら、sign を "-" に設定し、numberValue を -numberValue にする。
  10. numberValue ≥ 1021 の場合、digitString を ! ToString(𝔽(numberValue)) とする。
  11. それ以外の場合、整数値を求め、digitString を生成、fractionCount に応じて小数点を付与。
  12. signdigitString を連結して返す。
Note 2

toFixedtoString よりも正確に表示される場合があります。例:

(1000000000000000128).toString()"1000000000000000100" を返しますが、
(1000000000000000128).toFixed(0)"1000000000000000128" を返します。

21.1.3.4 Number.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 Internationalization API を含む実装では、このメソッドを ECMA-402 の仕様に従って実装する必要があります。APIを含まない場合、ホスト環境の現在のロケールに従った文字列を返す実装定義の仕様が適用されます。

21.1.3.5 Number.prototype.toPrecision ( precision )

このメソッドは、このNumber値を小数点1桁と precision - 1 桁の指数表記か、precision 桁の固定表記で文字列として返します。precisionundefined の場合、ToStringを呼びます。

呼び出されたとき、以下の手順を実行します:

  1. numberValue を ? ThisNumberValue(this value) とする。
  2. precisionundefined なら ! ToString(numberValue) を返す。
  3. precisionCount を ? ToIntegerOrInfinity(precision) とする。
  4. numberValue が有限でなければ Number::toString(numberValue, 10) を返す。
  5. precisionCount < 1 または precisionCount > 100 なら RangeError を投げる。
  6. numberValue(numberValue) に設定。
  7. sign を空文字列に設定。
  8. numberValue < 0 なら sign を "-" に設定し、numberValue を -numberValue にする。
  9. numberValue = 0 なら、significand に0を precisionCount 回繰り返した文字列を設定、exponent を 0。
  10. それ以外の場合、exponent, intSignificand を計算して significand を作成。
  11. 結果として signsignificand を連結して返す。

21.1.3.6 Number.prototype.toString ( [ radix ] )

Note

オプションの radix は2~36の整数であるべきです。radixundefined の場合、10 が使用されます。

呼び出されたとき、以下の手順を実行します:

  1. x を ? ThisNumberValue(this value) とする。
  2. radixundefined なら radixMV を 10 に設定。
  3. それ以外の場合、radixMV を ? ToIntegerOrInfinity(radix) とする。
  4. radixMV が 2~36 の範囲外なら RangeError を投げる。
  5. Number::toString(x, radixMV) を返す。

このメソッドは汎用的ではなく、this 値がNumberまたはNumberオブジェクトでなければ TypeError を投げます。lengthプロパティは 1𝔽 です。

21.1.3.7 Number.prototype.valueOf ( )

  1. ? ThisNumberValue(this value) を返す。

21.1.3.7.1 ThisNumberValue ( value: ECMAScript言語値, ): Numberを含む通常完了または例外

  1. value がNumberなら value を返す。
  2. value がオブジェクトで [[NumberData]] 内部スロットを持つ場合:
    1. nvalue.[[NumberData]] とする。
    2. Assert: n はNumber。
    3. n を返す。
  3. TypeError を投げる。

21.1.4 Numberインスタンスのプロパティ

Numberインスタンスは通常のオブジェクトで、Numberプロトタイプオブジェクトからプロパティを継承します。Numberインスタンスは [[NumberData]] 内部スロットを持ち、このNumberオブジェクトが表すNumber値を保持します。

21.2 BigIntオブジェクト

21.2.1 BigIntコンストラクター

BigIntコンストラクターは:

  • %BigInt% です。
  • グローバルオブジェクト"BigInt" プロパティの初期値です。
  • コンストラクターとしてではなく関数として呼び出された場合、型変換を行います。
  • new 演算子やサブクラス化の目的では使用されません。クラス定義の extends に使用することは可能ですが、BigIntコンストラクターへの super 呼び出しは例外を引き起こします。

21.2.1.1 BigInt ( value )

呼び出されたとき、この関数は以下の手順を実行します:

  1. NewTarget が undefined でなければ TypeError を投げる。
  2. prim を ? ToPrimitive(value, number) とする。
  3. prim がNumberであれば ? NumberToBigInt(prim) を返す。
  4. ToBigInt(prim) を返す。

21.2.1.1.1 NumberToBigInt ( number: Number, ): BigIntを返すか例外を投げる

  1. number が整数のNumberでなければ RangeError を投げる。
  2. ((number)) を返す。

21.2.2 BigIntコンストラクターのプロパティ

BigIntコンストラクターは:

  • [[Prototype]] 内部スロットを持ち、その値は %Function.prototype% です。
  • 次のプロパティを持ちます:

21.2.2.1 BigInt.asIntN ( bits, bigint )

呼び出されたとき、以下の手順を実行します:

  1. bits を ? ToIndex(bits) とする。
  2. bigint を ? ToBigInt(bigint) とする。
  3. mod(bigint) modulo 2bits とする。
  4. mod ≥ 2bits - 1 なら (mod - 2bits) を返す。
  5. (mod) を返す。

21.2.2.2 BigInt.asUintN ( bits, bigint )

呼び出されたとき、以下の手順を実行します:

  1. bits を ? ToIndex(bits) とする。
  2. bigint を ? ToBigInt(bigint) とする。
  3. ((bigint) modulo 2bits) を返す。

21.2.2.3 BigInt.prototype

BigInt.prototype の初期値はBigIntプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

21.2.3 BigIntプロトタイプオブジェクトのプロパティ

BigIntプロトタイプオブジェクトは:

  • %BigInt.prototype% です。
  • 通常のオブジェクトです。
  • BigIntオブジェクトではなく、[[BigIntData]] 内部スロットを持ちません。
  • [[Prototype]] 内部スロットを持ち、その値は %Object.prototype% です。

メソッド仕様内の “this BigInt value” は、抽象操作 ThisBigIntValue に this 値を渡した結果を指します。

21.2.3.1 BigInt.prototype.constructor

BigInt.prototype.constructor の初期値は %BigInt% です。

21.2.3.2 BigInt.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 Internationalization API を含む実装では、ECMA-402 仕様に従ってこのメソッドを実装する必要があります。含まない場合、ホスト環境のロケールに従った文字列を返す実装定義の仕様が適用されます。

21.2.3.3 BigInt.prototype.toString ( [ radix ] )

Note

オプションの radix は2~36の整数であるべきです。radixundefined の場合、10 が使用されます。

呼び出されたとき、以下の手順を実行します:

  1. x を ? ThisBigIntValue(this value) とする。
  2. radixundefined なら radixMV を 10 に設定。
  3. それ以外の場合、radixMV を ? ToIntegerOrInfinity(radix) とする。
  4. radixMV が 2~36 の範囲外なら RangeError を投げる。
  5. BigInt::toString(x, radixMV) を返す。

このメソッドは汎用的ではなく、this 値がBigIntまたはBigIntオブジェクトでなければ TypeError を投げます。

21.2.3.4 BigInt.prototype.valueOf ( )

  1. ? ThisBigIntValue(this value) を返す。

21.2.3.4.1 ThisBigIntValue ( value: ECMAScript言語値, ): BigIntを返すか例外を投げる

  1. value がBigIntなら value を返す。
  2. value がオブジェクトで [[BigIntData]] 内部スロットを持つ場合:
    1. value.[[BigIntData]] を返す。
  3. TypeError を投げる。

21.2.3.5 BigInt.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% の初期値は文字列 "BigInt" です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } です。

21.2.4 BigIntインスタンスのプロパティ

BigIntインスタンスは通常のオブジェクトで、BigIntプロトタイプオブジェクトからプロパティを継承します。BigIntインスタンスは [[BigIntData]] 内部スロットを持ち、このBigIntオブジェクトが表すBigInt値を保持します。

21.3 Mathオブジェクト

Mathオブジェクトは以下の通りです:

  • %Math%である。
  • グローバルオブジェクト"Math"プロパティの初期値である。
  • 通常のオブジェクトである。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 関数オブジェクトではない。
  • [[Construct]]内部メソッドを持たず、new演算子でコンストラクターとして使用できない。
  • [[Call]]内部メソッドを持たず、関数として呼び出すことができない。
Note

この仕様書において、“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 の常用対数値のNumber値で、おおよそ 0.4342944819032518。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

Note

Math.LOG10E の値は Math.LN10 の値のおおよその逆数です。

21.3.1.5 Math.LOG2E

自然対数の底 e の二進対数値のNumber値で、おおよそ 1.4426950408889634。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

Note

Math.LOG2E の値は Math.LN2 の値のおおよその逆数です。

21.3.1.6 Math.PI

円周と直径の比率 π のNumber値で、おおよそ 3.1415926535897932。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

21.3.1.7 Math.SQRT1_2

½ の平方根のNumber値で、おおよそ 0.7071067811865476。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

Note

Math.SQRT1_2 の値は Math.SQRT2 の値のおおよその逆数です。

21.3.1.8 Math.SQRT2

2 の平方根のNumber値で、おおよそ 1.4142135623730951。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

21.3.1.9 Math [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "Math" です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } です。

21.3.2 Mathオブジェクトの関数プロパティ

Note

acos, acosh, asin, asinh, atan, atanh, atan2, cbrt, cos, cosh, exp, expm1, hypot, log, log1p, log2, log10, pow, random, sin, sinh, tan, tanh の関数の動作はここで正確には指定されていません。特定の引数値に対しては境界ケースとして特定の結果が要求されます。他の引数値に対しては、これらの関数はよく知られた数学関数の結果の近似値を計算することを意図しており、近似アルゴリズムの選択には一定の裁量が認められています。一般的な意図として、実装者はそのハードウェアプラットフォーム上でCプログラマーが利用可能な数学ライブラリをECMAScriptで使用できるべきです。

アルゴリズムの選択は実装に委ねられますが、実装ではSun Microsystems の自由に配布可能な数学ライブラリ fdlibmhttp://www.netlib.org/fdlibm)に含まれるIEEE 754-2019算術の近似アルゴリズムを使用することが推奨されます(ただしこの標準で指定されているわけではありません)。

21.3.2.1 Math.abs ( x )

この関数は x の絶対値を返します。結果は x と同じ大きさですが、符号は正です。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaN の場合、NaN を返す。
  3. n-0𝔽 の場合、+0𝔽 を返す。
  4. n-∞𝔽 の場合、+∞𝔽 を返す。
  5. n < -0𝔽 の場合、-n を返す。
  6. n を返す。

21.3.2.2 Math.acos ( x )

この関数は x の逆余弦を返します。結果はラジアンで表され、+0𝔽 から 𝔽(π) の範囲に含まれます。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaNn > 1𝔽、または n < -1𝔽 の場合、NaN を返す。
  3. n1𝔽 の場合、+0𝔽 を返す。
  4. (n) の逆余弦を表す実装近似のNumber値を返す。

21.3.2.3 Math.acosh ( x )

この関数は x の逆双曲線余弦を返します。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaN または +∞𝔽 の場合、n を返す。
  3. n1𝔽 の場合、+0𝔽 を返す。
  4. n < 1𝔽 の場合、NaN を返す。
  5. (n) の逆双曲線余弦を表す実装近似のNumber値を返す。

21.3.2.4 Math.asin ( x )

この関数は x の逆正弦を返します。結果はラジアンで表され、𝔽(-π / 2) から 𝔽(π / 2) の範囲に含まれます。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaN+0𝔽、または -0𝔽 の場合、n を返す。
  3. n > 1𝔽 または n < -1𝔽 の場合、NaN を返す。
  4. (n) の逆正弦を表す実装近似のNumber値を返す。

21.3.2.5 Math.cbrt ( x )

この関数は x の立方根を返します。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. n が有限でないか、または +0𝔽 または -0𝔽 の場合、n を返す。
  3. (n) の立方根を表す実装近似のNumber値を返す。

21.3.2.6 Math.ceil ( x )

この関数は x 以上で -∞ に最も近い整数Number値を返します。x が既に整数Numberの場合、結果は x です。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. n が有限でないか、または +0𝔽 または -0𝔽 の場合、n を返す。
  3. n < -0𝔽 かつ n > -1𝔽 の場合、-0𝔽 を返す。
  4. n が整数Numberの場合、n を返す。
  5. n 以上で -∞ に最も近い整数Number値を返す。
Note

Math.ceil(x) の値は -Math.floor(-x) の値と同じです。

21.3.2.7 Math.clz32 ( x )

呼び出されたとき、次の手順を実行します:

  1. n を ? ToUint32(x) とする。
  2. n の符号なし32ビット二進表現における先頭ゼロビットの数を p とする。
  3. 𝔽(p) を返す。
Note

n+0𝔽 または -0𝔽 の場合、このメソッドは 32𝔽 を返す。n の32ビット二進表現の最上位ビットが1の場合、このメソッドは +0𝔽 を返す。

21.3.2.8 Math.cos ( x )

この関数は x の余弦を返します。引数はラジアンで表されます。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. n が有限でない場合、NaN を返す。
  3. n+0𝔽 または -0𝔽 の場合、1𝔽 を返す。
  4. (n) の余弦を表す実装近似のNumber値を返す。

21.3.2.9 Math.cosh ( x )

この関数は x の双曲線余弦を返します。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaN の場合、NaN を返す。
  3. n+∞𝔽 または -∞𝔽 の場合、+∞𝔽 を返す。
  4. n+0𝔽 または -0𝔽 の場合、1𝔽 を返す。
  5. (n) の双曲線余弦を表す実装近似のNumber値を返す。
Note

Math.cosh(x) の値は (Math.exp(x) + Math.exp(-x)) / 2 の値と同じです。

21.3.2.10 Math.exp ( x )

この関数は x の指数関数 (ex 乗、ここで e は自然対数の底) を返します。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaN または +∞𝔽 の場合、n を返す。
  3. n+0𝔽 または -0𝔽 の場合、1𝔽 を返す。
  4. n-∞𝔽 の場合、+0𝔽 を返す。
  5. (n) の指数関数を表す実装近似のNumber値を返す。

21.3.2.11 Math.expm1 ( x )

この関数は x の指数関数 (ex 乗) から1を引いた結果を返します。x の値が0に近い場合でも正確に計算されます。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaN+0𝔽−0𝔽、または +∞𝔽 の場合、n を返す。
  3. n−∞𝔽 の場合、−1𝔽 を返す。
  4. exp(n) の指数関数とする。
  5. exp − 1 を表す実装近似のNumber値を返す。

21.3.2.12 Math.log10 ( x )

この関数は x の常用対数を返します。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaN または +∞𝔽 の場合、n を返す。
  3. n1𝔽 の場合、+0𝔽 を返す。
  4. n+0𝔽 または -0𝔽 の場合、-∞𝔽 を返す。
  5. n < -0𝔽 の場合、NaN を返す。
  6. (n) の常用対数を表す実装近似のNumber値を返す。

21.3.2.13 Math.log2 ( x )

この関数は x の二進対数を返します。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaN または +∞𝔽 の場合、n を返す。
  3. n1𝔽 の場合、+0𝔽 を返す。
  4. n+0𝔽 または -0𝔽 の場合、-∞𝔽 を返す。
  5. n < -0𝔽 の場合、NaN を返す。
  6. (n) の二進対数を表す実装近似のNumber値を返す。

21.3.2.14 Math.max ( ...args )

0個以上の引数が与えられた場合、それぞれの引数に対して ToNumber を呼び出し、その結果値の中で最大の値を返します。

呼び出されたとき、次の手順を実行します:

  1. coerced を新しい空リストとする。
  2. args の各要素 arg について、次を行う:
    1. n を ? ToNumber(arg) とする。
    2. ncoerced に追加する。
  3. highest-∞𝔽 とする。
  4. coerced の各要素 number について、次を行う:
    1. numberNaN の場合、NaN を返す。
    2. number+0𝔽 かつ highest-0𝔽 の場合、highest+0𝔽 に設定する。
    3. number > highest の場合、highestnumber に設定する。
  5. highest を返す。
Note

最大値を決定する比較は IsLessThan アルゴリズムを用いて行いますが、+0𝔽-0𝔽 より大きいと見なされます。

この関数の "length" プロパティは 2𝔽 です。

21.3.2.15 Math.min ( ...args )

0個以上の引数が与えられた場合、それぞれの引数に対して ToNumber を呼び出し、その結果値の中で最小の値を返します。

呼び出されたとき、次の手順を実行します:

  1. coerced を新しい空リストとする。
  2. args の各要素 arg について、次を行う:
    1. n を ? ToNumber(arg) とする。
    2. ncoerced に追加する。
  3. lowest+∞𝔽 とする。
  4. coerced の各要素 number について、次を行う:
    1. numberNaN の場合、NaN を返す。
    2. number-0𝔽 かつ lowest+0𝔽 の場合、lowest-0𝔽 に設定する。
    3. number < lowest の場合、lowestnumber に設定する。
  5. lowest を返す。
Note

最小値を決定する比較は IsLessThan アルゴリズムを用いて行いますが、+0𝔽-0𝔽 より大きいと見なされます。

この関数の "length" プロパティは 2𝔽 です。

21.3.2.16 Math.pow ( base, exponent )

呼び出されたとき、次の手順を実行します:

  1. base を ? ToNumber(base) とする。
  2. exponent を ? ToNumber(exponent) とする。
  3. Number::exponentiate(base, exponent) を返す。

21.3.2.17 Math.random ( )

この関数は正の符号を持つNumber値を返します。値は +0𝔽 以上かつ 1𝔽 未満で、実装定義のアルゴリズムまたは戦略によりランダムまたは疑似ランダムにほぼ一様に選ばれます。

異なる Realm のために作成された各 Math.random 関数は、連続呼び出しから得られる値の列が異なる必要があります。

21.3.2.18 Math.round ( x )

この関数は x に最も近い整数のNumber値を返します。二つの整数が同じ距離にある場合、+∞ に近い方を返します。x が既に整数の場合、結果は x です。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. n が有限でない、または整数Numberの場合、n を返す。
  3. n < 0.5𝔽 かつ n > +0𝔽 の場合、+0𝔽 を返す。
  4. n < -0𝔽 かつ n-0.5𝔽 の場合、-0𝔽 を返す。
  5. n に最も近い整数Number値を返す。距離が同じ場合は +∞ に近い方を返す。
Note 1

Math.round(3.5) は 4 を返し、Math.round(-3.5) は -3 を返します。

Note 2

Math.round(x) の値は常に Math.floor(x + 0.5) と同じではありません。x-0𝔽 または -0𝔽 未満で -0.5𝔽 以上の場合、Math.round(x)-0𝔽 を返しますが、Math.floor(x + 0.5)+0𝔽 を返します。内部で x + 0.5 を計算する際の丸めにより、Math.round(x)Math.floor(x + 0.5) と異なる場合もあります。

21.3.2.19 Math.sign ( x )

この関数は x の符号を返します。正、負、またはゼロを示します。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaN+0𝔽、または -0𝔽 の場合、n を返す。
  3. n < -0𝔽 の場合、-1𝔽 を返す。
  4. 1𝔽 を返す。

21.3.2.20 Math.sin ( x )

この関数は x の正弦を返します。引数はラジアンで表されます。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaN+0𝔽、または -0𝔽 の場合、n を返す。
  3. n+∞𝔽 または -∞𝔽 の場合、NaN を返す。
  4. (n) の正弦を表す実装近似のNumber値を返す。

21.3.2.21 Math.sinh ( x )

この関数は x の双曲線正弦を返します。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. n が有限でないか、または +0𝔽 または -0𝔽 の場合、n を返す。
  3. (n) の双曲線正弦を表す実装近似のNumber値を返す。
Note

Math.sinh(x) の値は (Math.exp(x) - Math.exp(-x)) / 2 の値と同じです。

21.3.2.22 Math.sqrt ( x )

この関数は x の平方根を返します。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaN+0𝔽−0𝔽、または +∞𝔽 の場合、n を返す。
  3. n < -0𝔽 の場合、NaN を返す。
  4. (n) の平方根を表す実装近似のNumber値を返す。

21.3.2.23 Math.sumPrecise ( items )

Numberのイテラブルが与えられた場合、この関数は各値を合計し、その合計を返します。もし任意の値がNumberでない場合は TypeError 例外をスローします。

呼び出されたとき、次の手順を実行します:

  1. RequireObjectCoercible(items) を実行する。
  2. iteratorRecord を ? GetIterator(items, sync) とする。
  3. stateminus-zero とする。
  4. sum を 0 とする。
  5. count を 0 とする。
  6. nextnot-started とする。
  7. nextdone でない間繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone でない場合、次を行う:
      1. count ≥ 253 - 1 の場合、次を行う:
        1. NOTE: このステップは実際には到達しないことが期待され、実装が入力を「合理的なサイズ」と見なすために含まれる。
        2. errorThrowCompletion(新しい RangeError オブジェクト) とする。
        3. IteratorClose(iteratorRecord, error) を返す。
      2. next が Number でない場合、次を行う:
        1. errorThrowCompletion(新しい TypeError オブジェクト) とする。
        2. IteratorClose(iteratorRecord, error) を返す。
      3. nnext とする。
      4. statenot-a-number でない場合、次を行う:
        1. nNaN の場合、statenot-a-number に設定する。
        2. n+∞𝔽 の場合:
          1. stateminus-infinity の場合、statenot-a-number に設定する。
          2. それ以外の場合、stateplus-infinity に設定する。
        3. n-∞𝔽 の場合:
          1. stateplus-infinity の場合、statenot-a-number に設定する。
          2. それ以外の場合、stateminus-infinity に設定する。
        4. n-0𝔽 でなく、stateminus-zero または finite の場合:
          1. statefinite に設定する。
          2. sumsum + (n) に設定する。
      5. countcount + 1 とする。
  8. statenot-a-number の場合、NaN を返す。
  9. stateplus-infinity の場合、+∞𝔽 を返す。
  10. stateminus-infinity の場合、−∞𝔽 を返す。
  11. stateminus-zero の場合、−0𝔽 を返す。
  12. 𝔽(sum) を返す。
Note

sum の値は任意精度算術を使わずにさまざまなアルゴリズムで計算可能です。その一つは Jonathan Richard Shewchuk による「Grow-Expansion」アルゴリズムです。最近のアルゴリズムとしては "Fast exact summation using small and large superaccumulators" があり、コードは https://gitlab.com/radfordneal/xsum で利用可能です。

21.3.2.24 Math.tan ( x )

この関数は x の正接を返します。引数はラジアンで表されます。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaN+0𝔽、または -0𝔽 の場合、n を返す。
  3. n+∞𝔽 または -∞𝔽 の場合、NaN を返す。
  4. (n) の正接を表す実装近似のNumber値を返す。

21.3.2.25 Math.tanh ( x )

この関数は x の双曲線正接を返します。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. nNaN+0𝔽、または -0𝔽 の場合、n を返す。
  3. n+∞𝔽 の場合、1𝔽 を返す。
  4. n-∞𝔽 の場合、−1𝔽 を返す。
  5. (n) の双曲線正接を表す実装近似のNumber値を返す。
Note

Math.tanh(x) の値は (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x)) の値と同じです。

21.3.2.26 Math.trunc ( x )

この関数は x の整数部分を返します。小数部分は切り捨てられます。x が既に整数の場合、結果は x です。

呼び出されたとき、次の手順を実行します:

  1. n を ? ToNumber(x) とする。
  2. n が有限でないか、または +0𝔽 または -0𝔽 の場合、n を返す。
  3. n < 1𝔽 かつ n > +0𝔽 の場合、+0𝔽 を返す。
  4. n < -0𝔽 かつ n > -1𝔽 の場合、-0𝔽 を返す。
  5. n に最も近い整数Number値を返す(+0方向)。

21.4 Dateオブジェクト

21.4.1 Dateオブジェクトの概要および抽象操作の定義

以下の抽象操作は時刻値21.4.1.1 で定義される)に対して動作します。なお、いずれの場合も、これらの関数のいずれかへの任意の引数が NaN の場合、結果は NaN になります。

21.4.1.1 時刻値と時刻範囲

ECMAScriptにおける時刻の測定はPOSIXにおける時刻の測定に類似しており、特に、先発グレゴリオ暦、1970年1月1日UTCの始まりの午前0時を エポック とすること、およびすべての日を正確に86,400秒(それぞれが1000ミリ秒の長さ)から成るものとして数えることによって定義される点を共有します。

ECMAScriptの 時刻値 はNumberであり、ミリ秒精度で時点を表す有限の整数Number、または特定の時点を表さない NaN のいずれかです。24 × 60 × 60 × 1000 = 86,400,000 の倍数である時刻値(すなわち、ある整数 d について 86,400,000 × d であるもの)は、エポックから d 個の完全なUTC日だけ後の(負の d ではエポックより前の)UTC日の開始時点を表します。他のすべての有限時刻値 t は、そのような倍数である直前の最大の時刻値 s に対して定義され、s と同じUTC日内で、(t - s) ミリ秒後に発生する時点を表します。

時刻値はUTCのうるう秒を考慮しません。正のうるう秒内の時点を表す時刻値は存在せず、負のうるう秒によってUTCの時間線から取り除かれた時点を表す時刻値は存在します。しかし、時刻値の定義は、それでもUTCとの区分的な整合をもたらし、不連続はうるう秒境界でのみ発生し、うるう秒以外では差はゼロです。

Numberは -9,007,199,254,740,992 から 9,007,199,254,740,992 までのすべての整数を正確に表すことができます(21.1.2.8 および 21.1.2.6)。時刻値は、これよりわずかに小さい -8,640,000,000,000,000 から 8,640,000,000,000,000 ミリ秒までの範囲をサポートします。これにより、1970年1月1日UTCの始まりの午前0時を基準として、ちょうど -100,000,000 日から 100,000,000 日までの時刻値範囲がサポートされます。

1970年1月1日UTCの始まりの午前0時ちょうどは、時刻値 +0𝔽 によって表されます。

Note

先発グレゴリオ暦では、うるう年は、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
msPerSecond = 1000𝔽
msPerMinute = 60000𝔽 = msPerSecond × 𝔽(SecondsPerMinute)
msPerHour = 3600000𝔽 = msPerMinute × 𝔽(MinutesPerHour)
msPerDay = 86400000𝔽 = msPerHour × 𝔽(HoursPerDay)

21.4.1.3 Day ( t )

The abstract operation Day takes argument t (有限時刻値) and returns 整数Number. t が属する日の通日番号を返します。 It performs the following steps when called:

  1. 𝔽(floor((t / msPerDay))) を返す。

21.4.1.4 TimeWithinDay ( t )

The abstract operation TimeWithinDay takes argument t (有限時刻値) and returns +0𝔽 以上 msPerDay 未満の区間内の整数Number. t が属する日の開始からのミリ秒数を返します。 It performs the following steps when called:

  1. 𝔽((t) modulo (msPerDay)) を返す。

21.4.1.5 DaysInYear ( y )

The abstract operation DaysInYear takes argument y (整数Number) and returns 365𝔽 または 366𝔽. 年 y に含まれる日数を返します。うるう年は366日であり、それ以外のすべての年は365日です。 It performs the following steps when called:

  1. ry(y) とする。
  2. (ry modulo 400) = 0 の場合、366𝔽 を返す。
  3. (ry modulo 100) = 0 の場合、365𝔽 を返す。
  4. (ry modulo 4) = 0 の場合、366𝔽 を返す。
  5. 365𝔽 を返す。

21.4.1.6 DayFromYear ( y )

The abstract operation DayFromYear takes argument y (整数Number) and returns 整数Number. 年 y の最初の日の通日番号を返します。 It performs the following steps when called:

  1. ry(y) とする。
  2. NOTE: 以下のステップでは、numYears1numYears4numYears100、および numYears400 は、それぞれエポックから年 y の開始までの間に発生する、1、4、100、および400で割り切れる年数を表す。その数は、yエポックより前の場合には負になる。
  3. numYears1 を (ry - 1970) とする。
  4. numYears4floor((ry - 1969) / 4) とする。
  5. numYears100floor((ry - 1901) / 100) とする。
  6. numYears400floor((ry - 1601) / 400) とする。
  7. 𝔽(365 × numYears1 + numYears4 - numYears100 + numYears400) を返す。

21.4.1.7 TimeFromYear ( y )

The abstract operation TimeFromYear takes argument y (整数Number) and returns 時刻値. 年 y の開始時刻値を返します。 It performs the following steps when called:

  1. msPerDay × DayFromYear(y) を返す。

21.4.1.8 YearFromTime ( t )

The abstract operation YearFromTime takes argument t (有限時刻値) and returns 整数Number. t が属する年を返します。 It performs the following steps when called:

  1. TimeFromYear(y) ≤ t となる最大の整数Number y(+∞ に最も近いもの)を返す。

21.4.1.9 DayWithinYear ( t )

The abstract operation DayWithinYear takes argument t (有限時刻値) and returns +0𝔽 から 365𝔽 までの包含区間内の整数Number. It performs the following steps when called:

  1. Day(t) - DayFromYear(YearFromTime(t)) を返す。

21.4.1.10 InLeapYear ( t )

The abstract operation InLeapYear takes argument t (有限時刻値) and returns +0𝔽 または 1𝔽. t がうるう年内にある場合は 1𝔽 を返し、それ以外の場合は +0𝔽 を返します。 It performs the following steps when called:

  1. DaysInYear(YearFromTime(t)) が 366𝔽 の場合、1𝔽 を返す。
  2. +0𝔽 を返す。

21.4.1.11 MonthFromTime ( t )

The abstract operation MonthFromTime takes argument t (有限時刻値) and returns +0𝔽 から 11𝔽 までの包含区間内の整数Number. t が属する月を識別するNumberを返します。月の値 +0𝔽 は1月を指定し、1𝔽 は2月を指定し、2𝔽 は3月を指定し、3𝔽 は4月を指定し、4𝔽 は5月を指定し、5𝔽 は6月を指定し、6𝔽 は7月を指定し、7𝔽 は8月を指定し、8𝔽 は9月を指定し、9𝔽 は10月を指定し、10𝔽 は11月を指定し、11𝔽 は12月を指定します。なお、MonthFromTime(+0𝔽) = +0𝔽 であり、これは1970年1月1日木曜日に対応します。 It performs the following steps when called:

  1. inLeapYearInLeapYear(t) とする。
  2. dayWithinYearDayWithinYear(t) とする。
  3. dayWithinYear < 31𝔽 の場合、+0𝔽 を返す。
  4. dayWithinYear < 59𝔽 + inLeapYear の場合、1𝔽 を返す。
  5. dayWithinYear < 90𝔽 + inLeapYear の場合、2𝔽 を返す。
  6. dayWithinYear < 120𝔽 + inLeapYear の場合、3𝔽 を返す。
  7. dayWithinYear < 151𝔽 + inLeapYear の場合、4𝔽 を返す。
  8. dayWithinYear < 181𝔽 + inLeapYear の場合、5𝔽 を返す。
  9. dayWithinYear < 212𝔽 + inLeapYear の場合、6𝔽 を返す。
  10. dayWithinYear < 243𝔽 + inLeapYear の場合、7𝔽 を返す。
  11. dayWithinYear < 273𝔽 + inLeapYear の場合、8𝔽 を返す。
  12. dayWithinYear < 304𝔽 + inLeapYear の場合、9𝔽 を返す。
  13. dayWithinYear < 334𝔽 + inLeapYear の場合、10𝔽 を返す。
  14. Assert: dayWithinYear < 365𝔽 + inLeapYear
  15. 11𝔽 を返す。

21.4.1.12 DateFromTime ( t )

The abstract operation DateFromTime takes argument t (有限時刻値) and returns 1𝔽 から 31𝔽 までの包含区間内の整数Number. t が属する月の日を返します。 It performs the following steps when called:

  1. inLeapYearInLeapYear(t) とする。
  2. dayWithinYearDayWithinYear(t) とする。
  3. monthMonthFromTime(t) とする。
  4. month+0𝔽 の場合、dayWithinYear + 1𝔽 を返す。
  5. month1𝔽 の場合、dayWithinYear - 30𝔽 を返す。
  6. month2𝔽 の場合、dayWithinYear - 58𝔽 - inLeapYear を返す。
  7. month3𝔽 の場合、dayWithinYear - 89𝔽 - inLeapYear を返す。
  8. month4𝔽 の場合、dayWithinYear - 119𝔽 - inLeapYear を返す。
  9. month5𝔽 の場合、dayWithinYear - 150𝔽 - inLeapYear を返す。
  10. month6𝔽 の場合、dayWithinYear - 180𝔽 - inLeapYear を返す。
  11. month7𝔽 の場合、dayWithinYear - 211𝔽 - inLeapYear を返す。
  12. month8𝔽 の場合、dayWithinYear - 242𝔽 - inLeapYear を返す。
  13. month9𝔽 の場合、dayWithinYear - 272𝔽 - inLeapYear を返す。
  14. month10𝔽 の場合、dayWithinYear - 303𝔽 - inLeapYear を返す。
  15. Assert: month11𝔽 である。
  16. dayWithinYear - 333𝔽 - inLeapYear を返す。

21.4.1.13 WeekDay ( t )

The abstract operation WeekDay takes argument t (有限時刻値) and returns +0𝔽 から 6𝔽 までの包含区間内の整数Number. t が属する曜日を識別するNumberを返します。曜日値 +0𝔽 は日曜日を指定し、1𝔽 は月曜日を指定し、2𝔽 は火曜日を指定し、3𝔽 は水曜日を指定し、4𝔽 は木曜日を指定し、5𝔽 は金曜日を指定し、6𝔽 は土曜日を指定します。なお、WeekDay(+0𝔽) = 4𝔽 であり、これは1970年1月1日木曜日に対応します。 It performs the following steps when called:

  1. 𝔽((Day(t) + 4𝔽) modulo 7) を返す。

21.4.1.14 HourFromTime ( t )

The abstract operation HourFromTime takes argument t (有限時刻値) and returns +0𝔽 から 23𝔽 までの包含区間内の整数Number. t が属する日の時を返します。 It performs the following steps when called:

  1. 𝔽(floor((t / msPerHour)) modulo HoursPerDay) を返す。

21.4.1.15 MinFromTime ( t )

The abstract operation MinFromTime takes argument t (有限時刻値) and returns +0𝔽 から 59𝔽 までの包含区間内の整数Number. t が属する時の分を返します。 It performs the following steps when called:

  1. 𝔽(floor((t / msPerMinute)) modulo MinutesPerHour) を返す。

21.4.1.16 SecFromTime ( t )

The abstract operation SecFromTime takes argument t (有限時刻値) and returns +0𝔽 から 59𝔽 までの包含区間内の整数Number. t が属する分の秒を返します。 It performs the following steps when called:

  1. 𝔽(floor((t / msPerSecond)) modulo SecondsPerMinute) を返す。

21.4.1.17 msFromTime ( t )

The abstract operation msFromTime takes argument t (有限時刻値) and returns +0𝔽 から 999𝔽 までの包含区間内の整数Number. t が属する秒のミリ秒を返します。 It performs the following steps when called:

  1. 𝔽((t) modulo (msPerSecond)) を返す。

21.4.1.18 GetUTCEpochNanoseconds ( year, month, day, hour, minute, second, millisecond, microsecond, nanosecond )

The abstract operation GetUTCEpochNanoseconds takes arguments year (整数), month (1から12までの包含区間内の整数), day (1から31までの包含区間内の整数), hour (0から23までの包含区間内の整数), minute (0から59までの包含区間内の整数), second (0から59までの包含区間内の整数), millisecond (0から999までの包含区間内の整数), microsecond (0から999までの包含区間内の整数), and nanosecond (0から999までの包含区間内の整数) and returns BigInt. 返される値は、与えられたISO 8601暦日およびUTCの壁時計時刻に対応する、エポックからのナノ秒数を表します。 It performs the following steps when called:

  1. dateMakeDay(𝔽(year), 𝔽(month - 1), 𝔽(day)) とする。
  2. timeMakeTime(𝔽(hour), 𝔽(minute), 𝔽(second), 𝔽(millisecond)) とする。
  3. msMakeDate(date, time) とする。
  4. Assert: ms は整数Numberである。
  5. ((ms) × 106 + microsecond × 103 + nanosecond) を返す。

21.4.1.19 時間帯識別子

ECMAScriptにおける時間帯は 時間帯識別子 によって表されます。これは、0x0000から0x007Fまでの包含区間内のコード単位のみで構成されるStringです。 ECMAScript実装がサポートする時間帯は、AvailableNamedTimeZoneIdentifiersによって返されるTime Zone Identifier Record[[Identifier]]フィールドによって表される 利用可能な名前付き時間帯、またはIsTimeZoneOffsetStringtrue を返すStringによって表される オフセット時間帯 である場合があります。

一次時間帯識別子 は、利用可能な名前付き時間帯の推奨識別子です。 非一次時間帯識別子 は、一次時間帯識別子ではない、利用可能な名前付き時間帯の識別子です。 利用可能な名前付き時間帯識別子 は、一次時間帯識別子または非一次時間帯識別子のいずれかです。 各利用可能な名前付き時間帯識別子は、ちょうど1つの利用可能な名前付き時間帯に関連付けられます。 各利用可能な名前付き時間帯は、ちょうど1つの一次時間帯識別子と、0個以上の非一次時間帯識別子に関連付けられます。

ECMAScript実装は、識別子 "UTC" を持つ利用可能な名前付き時間帯をサポートしなければならず、これはUTC時間帯の一次時間帯識別子でなければなりません。 さらに、実装は任意の数の他の利用可能な名前付き時間帯をサポートしてもかまいません。

ECMA-402 Internationalization API仕様に記述される時間帯の要件に従う実装は、time zone aware と呼ばれます。 時間帯対応実装は、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 )

The implementation-defined abstract operation GetNamedTimeZoneEpochNanoseconds takes arguments timeZoneIdentifier (String), year (整数), month (1から12までの包含区間内の整数), day (1から31までの包含区間内の整数), hour (0から23までの包含区間内の整数), minute (0から59までの包含区間内の整数), second (0から59までの包含区間内の整数), millisecond (0から999までの包含区間内の整数), microsecond (0から999までの包含区間内の整数), and nanosecond (0から999までの包含区間内の整数) and returns BigIntのList. 返されるList内の各値は、timeZoneIdentifier によって識別される名前付き時間帯における、与えられたISO 8601暦日および壁時計時刻に対応する、エポックからのナノ秒数を表します。

入力が負の時間帯遷移(たとえば夏時間の終了時、または時間帯規則の変更により時間帯オフセットが減少した場合)によって複数回発生するローカル時刻を表す場合、返されるListは複数の要素を持ち、数値の昇順にソートされます。 入力が正の時間帯遷移(たとえば夏時間の開始時、または時間帯規則の変更により時間帯オフセットが増加した場合)によってスキップされたローカル時刻を表す場合、返されるListは空になります。 それ以外の場合、返されるListは1つの要素を持ちます。

いかなる時間帯についてもローカルな政治的規則を含まないECMAScript実装で使用される、GetNamedTimeZoneEpochNanosecondsの既定の実装は、呼び出されたとき次の手順を実行します:

  1. Assert: timeZoneIdentifier"UTC" である。
  2. epochNanosecondsGetUTCEpochNanoseconds(year, month, day, hour, minute, second, millisecond, microsecond, nanosecond) とする。
  3. « epochNanoseconds » を返す。
Note

時間帯対応実装には(また他のすべての実装にも推奨として)、IANA Time Zone Database https://www.iana.org/time-zones/ の時間帯情報を使用することが要求されます。

America/New_Yorkにおける2017年11月5日午前1時30分は2回繰り返されるため、GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 11, 5, 1, 30, 0, 0, 0, 0) は、最初の要素が05:30 UTC(UTCオフセット -04:00 の米国東部夏時間01:30に対応)を表し、2番目の要素が06:30 UTC(UTCオフセット -05:00 の米国東部標準時01:30に対応)を表す、長さ2のListを返します。

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 )

The implementation-defined abstract operation GetNamedTimeZoneOffsetNanoseconds takes arguments timeZoneIdentifier (String) and epochNanoseconds (BigInt) and returns 整数.

返される整数は、timeZoneIdentifier によって識別される名前付き時間帯のUTCからのオフセットを、epochNanoseconds に対応するエポック相対の時点において、いずれもナノ秒単位で表します。

いかなる時間帯についてもローカルな政治的規則を含まないECMAScript実装で使用される、GetNamedTimeZoneOffsetNanosecondsの既定の実装は、呼び出されたとき次の手順を実行します:

  1. Assert: timeZoneIdentifier"UTC" である。
  2. 0 を返す。
Note

時間帯オフセット値は正または負の場合があります。

21.4.1.22 Time Zone Identifier Record

Time Zone Identifier Record は、利用可能な名前付き時間帯識別子およびそれに対応する一次時間帯識別子を記述するために使用されるRecordです。

Time Zone Identifier Recordは、Table 59 に示されるフィールドを持ちます。

Table 59: Time Zone Identifier Record Fields
フィールド名 意味
[[Identifier]] String 実装によってサポートされる利用可能な名前付き時間帯識別子
[[PrimaryIdentifier]] String [[Identifier]] が解決される一次時間帯識別子
Note

[[Identifier]]一次時間帯識別子である場合、[[Identifier]][[PrimaryIdentifier]] です。

21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )

The implementation-defined abstract operation AvailableNamedTimeZoneIdentifiers takes no arguments and returns Time Zone Identifier RecordList. その結果は、この実装におけるすべての利用可能な名前付き時間帯識別子、および各利用可能な名前付き時間帯識別子に対応する一次時間帯識別子を記述します。 Listは、各Time Zone Identifier Record[[Identifier]]フィールドに従って順序付けられます。

ECMA-402 Internationalization APIを実装するすべての実装を含む時間帯対応実装は、ECMA-402仕様で指定されるとおりにAvailableNamedTimeZoneIdentifiers抽象操作を実装しなければなりません。 時間帯対応でない実装では、AvailableNamedTimeZoneIdentifiersは呼び出されたとき次の手順を実行します:

  1. 実装がいかなる時間帯についてもローカルな政治的規則を含まない場合、次を行う:
    1. « Time Zone Identifier Record { [[Identifier]]: "UTC", [[PrimaryIdentifier]]: "UTC" } » を返す。
  2. identifiers を、字句的コード単位順にソートされた、一意な利用可能な名前付き時間帯識別子Listとする。
  3. result を新しい空のListとする。
  4. identifiers の各要素 identifier について、次を行う:
    1. primaryidentifier とする。
    2. identifier がこの実装における非一次時間帯識別子であり、かつ identifier"UTC" でない場合、次を行う:
      1. primaryidentifier に関連付けられた一次時間帯識別子に設定する。
      2. NOTE: 実装は、一次時間帯識別子を得るために identifier を反復的に解決する必要がある場合がある。
    3. recordTime Zone Identifier Record { [[Identifier]]: identifier, [[PrimaryIdentifier]]: primary } とする。
    4. recordresult に追加する。
  5. Assert: result は、r.[[Identifier]]"UTC" であり r.[[PrimaryIdentifier]]"UTC" であるTime Zone Identifier Record r を含む。
  6. result を返す。

21.4.1.24 SystemTimeZoneIdentifier ( )

The implementation-defined abstract operation SystemTimeZoneIdentifier takes no arguments and returns String. ホスト環境の現在の時間帯を表すStringを返します。これは、IsTimeZoneOffsetStringtrue を返すUTCオフセットを表すString、または一次時間帯識別子のいずれかです。 It performs the following steps when called:

  1. 実装がUTC時間帯のみをサポートする場合、"UTC" を返す。
  2. systemTimeZoneString を、ホスト環境の現在の時間帯を表すString、すなわち一次時間帯識別子またはオフセット時間帯識別子のいずれかとする。
  3. systemTimeZoneString を返す。
Note

実装がDateオブジェクトのメソッドで一般的に提供する機能水準を確保するため、SystemTimeZoneIdentifierは、そのようなものが存在する場合、ホスト環境の時間帯設定に対応するIANA時間帯名を返すことが推奨されます。 GetNamedTimeZoneEpochNanosecondsおよびGetNamedTimeZoneOffsetNanosecondsは、その時間帯に標準時および夏時間に関するローカルな政治的規則が存在する場合、それを反映しなければなりません。

たとえば、ホスト環境が、ユーザーが時間帯として米国東部時間を選択したシステム上のブラウザーである場合、SystemTimeZoneIdentifierは "America/New_York" を返します。

21.4.1.25 LocalTime ( t )

The abstract operation LocalTime takes argument t (有限時刻値) and returns 整数Number. t をUTCからローカル時刻に変換します。 t において有効な標準時および夏時間に関するローカルな政治的規則を、この節で指定される方法で結果を決定するために使用するべきです。 It performs the following steps when called:

  1. systemTimeZoneIdentifierSystemTimeZoneIdentifier() とする。
  2. IsTimeZoneOffsetString(systemTimeZoneIdentifier) が true の場合、次を行う:
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier) とする。
  3. それ以外の場合、
    1. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, ((t) × 106)) とする。
  4. offsetMstruncate(offsetNs / 106) とする。
  5. t + 𝔽(offsetMs) を返す。
Note 1

ローカル時刻 t に関する政治的規則が実装内で利用可能でない場合、SystemTimeZoneIdentifier"UTC" を返し、GetNamedTimeZoneOffsetNanosecondsが0を返すため、結果は t になります。

Note 2

時間帯対応実装には(また他のすべての実装にも推奨として)、IANA Time Zone Database https://www.iana.org/time-zones/ の時間帯情報を使用することが要求されます。

Note 3

異なる2つの入力時刻値 tUTC は、繰り返される時刻が存在する負の時間帯遷移(たとえば夏時間の終了時、または時間帯調整が減少した場合)において、同じローカル時刻 tlocal に変換されます。

LocalTime(UTC(tlocal)) は必ずしも常に tlocal と等しいとは限りません。同様に、UTC(LocalTime(tUTC)) も必ずしも常に tUTC と等しいとは限りません。

21.4.1.26 UTC ( t )

The abstract operation UTC takes argument t (Number) and returns 時刻値. t をローカル時刻からUTC時刻値に変換します。 t において有効な標準時および夏時間に関するローカルな政治的規則を、この節で指定される方法で結果を決定するために使用するべきです。 It performs the following steps when called:

  1. t が有限でない場合、NaN を返す。
  2. systemTimeZoneIdentifierSystemTimeZoneIdentifier() とする。
  3. IsTimeZoneOffsetString(systemTimeZoneIdentifier) が true の場合、次を行う:
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier) とする。
  4. それ以外の場合、
    1. possibleInstantsGetNamedTimeZoneEpochNanoseconds(systemTimeZoneIdentifier, (YearFromTime(t)), (MonthFromTime(t)) + 1, (DateFromTime(t)), (HourFromTime(t)), (MinFromTime(t)), (SecFromTime(t)), (msFromTime(t)), 0, 0) とする。
    2. NOTE: 以下のステップは、t が負の時間帯遷移(たとえば夏時間の終了時、または時間帯規則の変更により時間帯オフセットが減少した場合)で複数回繰り返されるローカル時刻、または正の時間帯遷移(たとえば夏時間の開始時、または時間帯規則の変更により時間帯オフセットが増加した場合)でスキップされたローカル時刻を表す場合に、t が遷移前の時間帯オフセットを使用して解釈されることを保証する。
    3. possibleInstants が空でない場合、次を行う:
      1. disambiguatedInstantpossibleInstants[0] とする。
    4. それ以外の場合、
      1. NOTE: t は正の時間帯遷移(たとえば夏時間の開始または時間帯規則の変更によりUTCオフセットが増加すること)でスキップされたローカル時刻を表す。
      2. possibleInstantsBeforeGetNamedTimeZoneEpochNanoseconds(systemTimeZoneIdentifier, (YearFromTime(tBefore)), (MonthFromTime(tBefore)) + 1, (DateFromTime(tBefore)), (HourFromTime(tBefore)), (MinFromTime(tBefore)), (SecFromTime(tBefore)), (msFromTime(tBefore)), 0, 0) とする。ここで tBefore は、possibleInstantsBefore が空でないような t 未満の最大の整数Number(すなわち、tBefore は遷移前の最後のローカル時刻を表す)である。
      3. disambiguatedInstantpossibleInstantsBefore の最後の要素とする。
    5. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, disambiguatedInstant) とする。
  5. offsetMstruncate(offsetNs / 106) とする。
  6. t - 𝔽(offsetMs) を返す。

入力 t は名目上は時刻値ですが、任意のNumber値であってもかまいません。 このアルゴリズムは、時刻値範囲の境界に対応する入力がローカルUTCオフセットに関係なくサポートされるように、t時刻値範囲に制限してはなりません。 たとえば、最大の時刻値は 8.64 × 1015 であり、"+275760-09-13T00:00:00Z" に対応します。 その時点でローカル時間帯オフセットがUTCより1時間進んでいる環境では、それは 8.64 × 1015 + 3.6 × 106 というより大きい入力によって表され、"+275760-09-13T01:00:00+01:00" に対応します。

ローカル時刻 t に関する政治的規則が実装内で利用可能でない場合、SystemTimeZoneIdentifier"UTC" を返し、GetNamedTimeZoneOffsetNanosecondsが0を返すため、結果は t になります。

Note 1

時間帯対応実装には(また他のすべての実装にも推奨として)、IANA Time Zone Database https://www.iana.org/time-zones/ の時間帯情報を使用することが要求されます。

America/New_Yorkにおける2017年11月5日午前1時30分は2回繰り返されます(秋の後退)が、UTC-05の午前1時30分ではなく、UTC-04の午前1時30分として解釈されなければなりません。 UTC(TimeClip(MakeDate(MakeDay(2017, 10, 5), MakeTime(1, 30, 0, 0)))) では、offsetMs の値は -4 × msPerHour です。

America/New_Yorkにおける2017年3月12日午前2時30分は存在しませんが、UTC-05の午前2時30分(UTC-04の午前3時30分に相当)として解釈されなければなりません。 UTC(TimeClip(MakeDate(MakeDay(2017, 2, 12), MakeTime(2, 30, 0, 0)))) では、offsetMs の値は -5 × msPerHour です。

Note 2

UTC(LocalTime(tUTC)) は必ずしも常に tUTC と等しいとは限りません。同様に、LocalTime(UTC(tlocal)) も必ずしも常に tlocal と等しいとは限りません。

21.4.1.27 MakeTime ( hour, min, sec, ms )

The abstract operation MakeTime takes arguments hour (Number), min (Number), sec (Number), and ms (Number) and returns Number. ミリ秒数を計算します。 It performs the following steps when called:

  1. hour が有限でない、min が有限でない、sec が有限でない、または ms が有限でない場合、NaN を返す。
  2. h𝔽(! ToIntegerOrInfinity(hour)) とする。
  3. m𝔽(! ToIntegerOrInfinity(min)) とする。
  4. s𝔽(! ToIntegerOrInfinity(sec)) とする。
  5. milli𝔽(! ToIntegerOrInfinity(ms)) とする。
  6. ((h × msPerHour + m × msPerMinute) + s × msPerSecond) + milli を返す。
Note

MakeTimeにおける算術は浮動小数点算術であり、結合的ではないため、演算は正しい順序で実行されなければなりません。

21.4.1.28 MakeDay ( year, month, date )

The abstract operation MakeDay takes arguments year (a Number), month (a Number), and date (a Number) and returns a finite Number or NaN. 日数を計算します。 It performs the following steps when called:

  1. year が有限でない、month が有限でない、または date が有限でない場合、NaN を返す。
  2. y𝔽(! ToIntegerOrInfinity(year)) とする。
  3. m𝔽(! ToIntegerOrInfinity(month)) とする。
  4. dt𝔽(! ToIntegerOrInfinity(date)) とする。
  5. ymy + 𝔽(floor((m) / 12)) とする。
  6. ym が有限でない場合、NaN を返す。
  7. mn𝔽((m) modulo 12) とする。
  8. YearFromTime(t) が ymMonthFromTime(t) が mnDateFromTime(t) が 1𝔽 であるような有限時刻値 t を見つける。ただし、これが不可能である場合(何らかの引数が範囲外であるため)、NaN を返す。
  9. Day(t) + dt - 1𝔽 を返す。

21.4.1.29 MakeDate ( day, time )

The abstract operation MakeDate takes arguments day (a Number) and time (a Number) and returns a finite Number or NaN. ミリ秒数を計算します。 It performs the following steps when called:

  1. day が有限でない、または time が有限でない場合、NaN を返す。
  2. tvday × msPerDay + time とする。
  3. tv が有限でない場合、NaN を返す。
  4. tv を返す。

21.4.1.30 MakeFullYear ( year )

The abstract operation MakeFullYear takes argument year (Number) and returns 整数Numberまたは NaN. year の整数部分に関連付けられた完全な年を返します。0から99までの包含区間内の任意の値は、1900年の開始からの年数として解釈されます。先発グレゴリオ暦との整合のため、「完全な年」は年0(紀元前1年)の開始からの完了した年の符号付き数として定義されます。 It performs the following steps when called:

  1. yearNaN+∞𝔽、または -∞𝔽 のいずれかである場合、NaN を返す。
  2. truncated を ! ToIntegerOrInfinity(year) とする。
  3. truncated が0から99までの包含区間内にある場合、1900𝔽 + 𝔽(truncated) を返す。
  4. 𝔽(truncated) を返す。

21.4.1.31 TimeClip ( time )

The abstract operation TimeClip takes argument time (a Number) and returns a time value. ミリ秒数を計算します。 It performs the following steps when called:

  1. time が有限でない場合、NaN を返す。
  2. abs((time)) > 8.64 × 1015 の場合、NaN を返す。
  3. 𝔽(! ToIntegerOrInfinity(time)) を返す。

21.4.1.32 日時文字列形式

ECMAScriptは、ISO 8601暦日拡張形式を単純化したものに基づく、日時の文字列交換形式を定義します。その形式は次のとおりです:YYYY-MM-DDTHH:mm:ss.sssZ

各要素は次のとおりです:

YYYY 先発グレゴリオ暦における年であり、0000から9999までの4桁の10進数字、または "+" もしくは "-" の後に6桁の10進数字が続く 拡張年 として表されます。
- "-"(ハイフン)は文字列内にそのまま2回現れます。
MM 年の月であり、01(1月)から12(12月)までの2桁の10進数字として表されます。
DD 月の日であり、01から31までの2桁の10進数字として表されます。
T "T" は、時刻要素の開始を示すために文字列内にそのまま現れます。
HH 午前0時から経過した完全な時の数であり、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
        

範囲外または不適合な要素を含む文字列は、この形式の有効なインスタンスではありません。

Note 1

すべての日は午前0時で始まり午前0時で終わるため、00:0024:00 の2つの表記は、1つの日付に関連付けられる2つの午前0時を区別するために利用できます。これは、次の2つの表記がまったく同じ時点を指すことを意味します:1995-02-04T24:001995-02-05T00:00。後者の形式を「暦日の終わり」と解釈することはISO 8601と整合しますが、同仕様はこれを時間間隔の記述用に予約しており、単一時点の表現内では許可していません。

Note 2

CET、ESTなどの民用時間帯の略称を規定する国際標準は存在せず、同じ略称が非常に異なる2つの時間帯に使用されることさえあります。このため、ISO 8601およびこの形式はいずれも、時間帯オフセットの数値表現を指定しています。

21.4.1.32.1 拡張年

1970年1月1日から前後おおよそ273,790年にわたる完全な時刻値範囲(21.4.1.1)を扱うには、0年より前または9999年より後の年を表現する必要があります。ISO 8601は年表現の拡張を許可しますが、それは情報交換の当事者間の相互合意による場合に限られます。単純化されたECMAScript形式では、そのような拡張年表現は6桁でなければならず、常に + または - の符号が前置されます。年0は正と見なされ、+ 符号を前置しなければなりません。年0を -000000 と表すことは無効です。時刻値の範囲外の時点を表す拡張年を伴って 日時文字列形式 に一致するStringは、Date.parse によって認識不能として扱われ、その関数は実装固有の挙動またはヒューリスティックにフォールバックすることなく NaN を返します。

Note

拡張年を持つdate-time値の例:

-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 TemporalDecimalFractionopt TimeSeparator[Extended] ::: [+Extended] : [~Extended] [empty] MinuteSecond ::: 0 DecimalDigit 1 DecimalDigit 2 DecimalDigit 3 DecimalDigit 4 DecimalDigit 5 DecimalDigit TemporalDecimalFraction ::: TemporalDecimalSeparator DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator ::: one of . ,

21.4.1.33.1 IsTimeZoneOffsetString ( offsetString )

The abstract operation IsTimeZoneOffsetString takes argument offsetString (String) and returns Boolean. 返り値は、offsetStringUTCOffset によって与えられる文法に適合するかどうかを示します。 It performs the following steps when called:

  1. parseResultParseText(offsetString, UTCOffset) とする。
  2. parseResult がエラーのListである場合、false を返す。
  3. true を返す。

21.4.1.33.2 ParseTimeZoneOffsetString ( offsetString )

The abstract operation ParseTimeZoneOffsetString takes argument offsetString (String) and returns 整数. 返り値は、String offsetString に対応するUTCオフセットをナノ秒数として表したものです。 It performs the following steps when called:

  1. parseResultParseText(offsetString, UTCOffset) とする。
  2. Assert: parseResult はエラーのListではない。
  3. Assert: parseResultASCIISign Parse Node を含む。
  4. parsedSign を、parseResult 内に含まれる ASCIISign Parse Node に一致したソーステキストとする。
  5. parsedSign が単一のコードポイント U+002D (HYPHEN-MINUS) である場合、次を行う:
    1. sign を -1 とする。
  6. それ以外の場合、
    1. sign を 1 とする。
  7. NOTE: 以下のStringToNumberの適用は精度を失わない。解析された各値は十分に短い10進数字列であることが保証されているためである。
  8. Assert: parseResultHour Parse Node を含む。
  9. parsedHours を、parseResult 内に含まれる Hour Parse Node に一致したソーステキストとする。
  10. hours(StringToNumber(CodePointsToString(parsedHours))) とする。
  11. parseResultMinuteSecond Parse Node を含まない場合、次を行う:
    1. minutes を 0 とする。
  12. それ以外の場合、
    1. parsedMinutes を、parseResult 内に含まれる最初の MinuteSecond Parse Node に一致したソーステキストとする。
    2. minutes(StringToNumber(CodePointsToString(parsedMinutes))) とする。
  13. parseResult が2つの MinuteSecond Parse Node を含まない場合、次を行う:
    1. seconds を 0 とする。
  14. それ以外の場合、
    1. parsedSeconds を、parseResult 内に含まれる2番目の MinuteSecond Parse Node に一致したソーステキストとする。
    2. seconds(StringToNumber(CodePointsToString(parsedSeconds))) とする。
  15. parseResultTemporalDecimalFraction Parse Node を含まない場合、次を行う:
    1. nanoseconds を 0 とする。
  16. それ以外の場合、
    1. parsedFraction を、parseResult 内に含まれる TemporalDecimalFraction Parse Node に一致したソーステキストとする。
    2. fractionCodePointsToString(parsedFraction) と "000000000" の文字列連結とする。
    3. nanosecondsStringfraction の1から10までの部分文字列とする。
    4. nanoseconds(StringToNumber(nanosecondsString)) とする。
  17. sign × (((hours × 60 + minutes) × 60 + seconds) × 109 + nanoseconds) を返す。

21.4.2 Dateコンストラクター

Dateコンストラクターは以下の通りです:

  • %Date%である。
  • グローバルオブジェクト"Date"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいDateを作成して初期化する。
  • コンストラクターとしてではなく関数として呼び出されたとき、現在時刻(UTC)を表すStringを返す。
  • 引数の数および型に基づいて動作が異なる関数である。
  • クラス定義のextends節の値として使用できる。指定されたDateの動作を継承することを意図するサブクラスコンストラクターは、[[DateValue]]内部スロットを持つサブクラスインスタンスを作成して初期化するために、Dateコンストラクターへのsuper呼び出しを含めなければならない。

21.4.2.1 Date ( ...values )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、次を行う:
    1. now を現在時刻を識別する時刻値(UTC)とする。
    2. ToDateString(now) を返す。
  2. numberOfArgsvalues 内の要素数とする。
  3. numberOfArgs = 0 の場合、次を行う:
    1. dv を現在時刻を識別する時刻値(UTC)とする。
  4. そうでなく numberOfArgs = 1 の場合、次を行う:
    1. valuevalues[0] とする。
    2. value がObjectであり、value[[DateValue]] 内部スロットを持つ場合、次を行う:
      1. tvvalue.[[DateValue]] とする。
    3. それ以外の場合、
      1. v を ? ToPrimitive(value) とする。
      2. v がStringの場合、次を行う:
        1. Assert: v がStringであるため、次のステップは決して中断完了を返さない。
        2. tv を、parseメソッド(21.4.3.2)の場合とまったく同じ方法で、v を日付として解析した結果とする。
      3. それ以外の場合、
        1. tv を ? ToNumber(v) とする。
    4. dvTimeClip(tv) とする。
  5. それ以外の場合、
    1. Assert: numberOfArgs ≥ 2。
    2. y を ? ToNumber(values[0]) とする。
    3. m を ? ToNumber(values[1]) とする。
    4. numberOfArgs > 2 の場合、dt を ? ToNumber(values[2]) とする。そうでない場合、dt1𝔽 とする。
    5. numberOfArgs > 3 の場合、h を ? ToNumber(values[3]) とする。そうでない場合、h+0𝔽 とする。
    6. numberOfArgs > 4 の場合、min を ? ToNumber(values[4]) とする。そうでない場合、min+0𝔽 とする。
    7. numberOfArgs > 5 の場合、s を ? ToNumber(values[5]) とする。そうでない場合、s+0𝔽 とする。
    8. numberOfArgs > 6 の場合、milli を ? ToNumber(values[6]) とする。そうでない場合、milli+0𝔽 とする。
    9. yrMakeFullYear(y) とする。
    10. finalDateMakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli)) とする。
    11. dvTimeClip(UTC(finalDate)) とする。
  6. obj を ? OrdinaryCreateFromConstructor(NewTarget, "%Date.prototype%", « [[DateValue]] ») とする。
  7. obj.[[DateValue]]dv に設定する。
  8. obj を返す。

21.4.3 Dateコンストラクターのプロパティ

Dateコンストラクターは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 値が 7𝔽 である"length"プロパティを持つ。
  • 以下のプロパティを持つ:

21.4.3.1 Date.now ( )

この関数は、それが呼び出された時点のUTC日付および時刻を示す時刻値を返します。

21.4.3.2 Date.parse ( string )

この関数は引数にToString演算子を適用します。ToStringの結果が中断完了である場合、そのCompletion Recordが直ちに返されます。そうでない場合、この関数は結果のStringを日付および時刻として解釈します。これは、その日付および時刻に対応するUTC時刻値であるNumberを返します。Stringの内容に応じて、そのStringはローカル時刻、UTC時刻、または他の時間帯の時刻として解釈される場合があります。この関数はまず、拡張年を含め、Date Time String Format(21.4.1.32)で記述される形式に従ってStringを解析しようとします。Stringがその形式に適合しない場合、この関数は実装固有のヒューリスティックまたは実装固有の日付形式にフォールバックしてもかまいません。認識不能なString、または範囲外の形式要素値を含むStringは、この関数に NaN を返させなければなりません。

Stringが Date Time String Format に適合する場合、欠けている形式要素の代わりに代替値が使用されます。MMまたはDD要素が欠けている場合は、"01" が使用されます。HHmm、または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値を生成することは要求されません。また一般に、この関数が生成する値は、Date Time String Format(21.4.1.32)に適合せず、かつその実装でtoStringまたはtoUTCStringメソッドによって生成され得ない任意のString値が与えられた場合、実装定義です。

21.4.3.3 Date.prototype

Date.prototypeの初期値はDateプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

21.4.3.4 Date.UTC ( year [ , month [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] ] )

この関数は呼び出されたとき、次の手順を実行します:

  1. y を ? ToNumber(year) とする。
  2. month が存在する場合、m を ? ToNumber(month) とする。そうでない場合、m+0𝔽 とする。
  3. date が存在する場合、dt を ? ToNumber(date) とする。そうでない場合、dt1𝔽 とする。
  4. hours が存在する場合、h を ? ToNumber(hours) とする。そうでない場合、h+0𝔽 とする。
  5. minutes が存在する場合、min を ? ToNumber(minutes) とする。そうでない場合、min+0𝔽 とする。
  6. seconds が存在する場合、s を ? ToNumber(seconds) とする。そうでない場合、s+0𝔽 とする。
  7. ms が存在する場合、milli を ? ToNumber(ms) とする。そうでない場合、milli+0𝔽 とする。
  8. yrMakeFullYear(y) とする。
  9. TimeClip(MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))) を返す。

この関数の"length"プロパティは 7𝔽 です。

Note

この関数はDateコンストラクターと2つの点で異なります。Dateを作成するのではなくNumberとして時刻値を返すこと、および引数をローカル時刻ではなくUTCとして解釈することです。

21.4.4 Dateプロトタイプオブジェクトのプロパティ

Dateプロトタイプオブジェクトは以下の通りです:

  • %Date.prototype%である。
  • それ自体が通常のオブジェクトである。
  • Dateインスタンスではなく、[[DateValue]]内部スロットを持たない。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。

明示的に別途定義されている場合を除き、以下で定義されるDateプロトタイプオブジェクトのメソッドは汎用ではなく、それらに渡されるthis値は、時刻値に初期化された[[DateValue]]内部スロットを持つオブジェクトでなければなりません。

21.4.4.1 Date.prototype.constructor

Date.prototype.constructorの初期値は %Date% です。

21.4.4.2 Date.prototype.getDate ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. DateFromTime(LocalTime(t)) を返す。

21.4.4.3 Date.prototype.getDay ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. WeekDay(LocalTime(t)) を返す。

21.4.4.4 Date.prototype.getFullYear ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. YearFromTime(LocalTime(t)) を返す。

21.4.4.5 Date.prototype.getHours ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. HourFromTime(LocalTime(t)) を返す。

21.4.4.6 Date.prototype.getMilliseconds ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. msFromTime(LocalTime(t)) を返す。

21.4.4.7 Date.prototype.getMinutes ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. MinFromTime(LocalTime(t)) を返す。

21.4.4.8 Date.prototype.getMonth ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. MonthFromTime(LocalTime(t)) を返す。

21.4.4.9 Date.prototype.getSeconds ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. SecFromTime(LocalTime(t)) を返す。

21.4.4.10 Date.prototype.getTime ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. dateObject.[[DateValue]] を返す。

21.4.4.11 Date.prototype.getTimezoneOffset ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. (t - LocalTime(t)) / msPerMinute を返す。

21.4.4.12 Date.prototype.getUTCDate ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. DateFromTime(t) を返す。

21.4.4.13 Date.prototype.getUTCDay ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. WeekDay(t) を返す。

21.4.4.14 Date.prototype.getUTCFullYear ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. YearFromTime(t) を返す。

21.4.4.15 Date.prototype.getUTCHours ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. HourFromTime(t) を返す。

21.4.4.16 Date.prototype.getUTCMilliseconds ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. msFromTime(t) を返す。

21.4.4.17 Date.prototype.getUTCMinutes ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. MinFromTime(t) を返す。

21.4.4.18 Date.prototype.getUTCMonth ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. MonthFromTime(t) を返す。

21.4.4.19 Date.prototype.getUTCSeconds ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、NaN を返す。
  5. SecFromTime(t) を返す。

21.4.4.20 Date.prototype.setDate ( date )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. dt を ? ToNumber(date) とする。
  5. tNaN の場合、NaN を返す。
  6. tLocalTime(t) に設定する。
  7. newDateMakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t)) とする。
  8. uTimeClip(UTC(newDate)) とする。
  9. dateObject.[[DateValue]]u に設定する。
  10. u を返す。

21.4.4.21 Date.prototype.setFullYear ( year [ , month [ , date ] ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. y を ? ToNumber(year) とする。
  5. tNaN の場合、t+0𝔽 に設定する。そうでない場合、tLocalTime(t) に設定する。
  6. month が存在する場合、m を ? ToNumber(month) とする。そうでない場合、mMonthFromTime(t) とする。
  7. date が存在する場合、dt を ? ToNumber(date) とする。そうでない場合、dtDateFromTime(t) とする。
  8. newDateMakeDate(MakeDay(y, m, dt), TimeWithinDay(t)) とする。
  9. uTimeClip(UTC(newDate)) とする。
  10. dateObject.[[DateValue]]u に設定する。
  11. u を返す。

このメソッドの"length"プロパティは 3𝔽 です。

Note

month が存在しない場合、このメソッドは month が値 getMonth() とともに存在したかのように動作します。date が存在しない場合、date が値 getDate() とともに存在したかのように動作します。

21.4.4.22 Date.prototype.setHours ( hour [ , min [ , sec [ , ms ] ] ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. h を ? ToNumber(hour) とする。
  5. min が存在する場合、m を ? ToNumber(min) とする。
  6. sec が存在する場合、s を ? ToNumber(sec) とする。
  7. ms が存在する場合、milli を ? ToNumber(ms) とする。
  8. tNaN の場合、NaN を返す。
  9. tLocalTime(t) に設定する。
  10. min が存在しない場合、mMinFromTime(t) とする。
  11. sec が存在しない場合、sSecFromTime(t) とする。
  12. ms が存在しない場合、millimsFromTime(t) とする。
  13. dateMakeDate(Day(t), MakeTime(h, m, s, milli)) とする。
  14. uTimeClip(UTC(date)) とする。
  15. dateObject.[[DateValue]]u に設定する。
  16. u を返す。

このメソッドの"length"プロパティは 4𝔽 です。

Note

min が存在しない場合、このメソッドは min が値 getMinutes() とともに存在したかのように動作します。sec が存在しない場合、sec が値 getSeconds() とともに存在したかのように動作します。ms が存在しない場合、ms が値 getMilliseconds() とともに存在したかのように動作します。

21.4.4.23 Date.prototype.setMilliseconds ( ms )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. ms を ? ToNumber(ms) に設定する。
  5. tNaN の場合、NaN を返す。
  6. tLocalTime(t) に設定する。
  7. timeMakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms) とする。
  8. uTimeClip(UTC(MakeDate(Day(t), time))) とする。
  9. dateObject.[[DateValue]]u に設定する。
  10. u を返す。

21.4.4.24 Date.prototype.setMinutes ( min [ , sec [ , ms ] ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. m を ? ToNumber(min) とする。
  5. sec が存在する場合、s を ? ToNumber(sec) とする。
  6. ms が存在する場合、milli を ? ToNumber(ms) とする。
  7. tNaN の場合、NaN を返す。
  8. tLocalTime(t) に設定する。
  9. sec が存在しない場合、sSecFromTime(t) とする。
  10. ms が存在しない場合、millimsFromTime(t) とする。
  11. dateMakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli)) とする。
  12. uTimeClip(UTC(date)) とする。
  13. dateObject.[[DateValue]]u に設定する。
  14. u を返す。

このメソッドの"length"プロパティは 3𝔽 です。

Note

sec が存在しない場合、このメソッドは sec が値 getSeconds() とともに存在したかのように動作します。ms が存在しない場合、これは ms が値 getMilliseconds() とともに存在したかのように動作します。

21.4.4.25 Date.prototype.setMonth ( month [ , date ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. m を ? ToNumber(month) とする。
  5. date が存在する場合、dt を ? ToNumber(date) とする。
  6. tNaN の場合、NaN を返す。
  7. tLocalTime(t) に設定する。
  8. date が存在しない場合、dtDateFromTime(t) とする。
  9. newDateMakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t)) とする。
  10. uTimeClip(UTC(newDate)) とする。
  11. dateObject.[[DateValue]]u に設定する。
  12. u を返す。

このメソッドの"length"プロパティは 2𝔽 です。

Note

date が存在しない場合、このメソッドは date が値 getDate() とともに存在したかのように動作します。

21.4.4.26 Date.prototype.setSeconds ( sec [ , ms ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. s を ? ToNumber(sec) とする。
  5. ms が存在する場合、milli を ? ToNumber(ms) とする。
  6. tNaN の場合、NaN を返す。
  7. tLocalTime(t) に設定する。
  8. ms が存在しない場合、millimsFromTime(t) とする。
  9. dateMakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli)) とする。
  10. uTimeClip(UTC(date)) とする。
  11. dateObject.[[DateValue]]u に設定する。
  12. u を返す。

このメソッドの"length"プロパティは 2𝔽 です。

Note

ms が存在しない場合、このメソッドは ms が値 getMilliseconds() とともに存在したかのように動作します。

21.4.4.27 Date.prototype.setTime ( time )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. t を ? ToNumber(time) とする。
  4. vTimeClip(t) とする。
  5. dateObject.[[DateValue]]v に設定する。
  6. v を返す。

21.4.4.28 Date.prototype.setUTCDate ( date )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. dt を ? ToNumber(date) とする。
  5. tNaN の場合、NaN を返す。
  6. newDateMakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t)) とする。
  7. vTimeClip(newDate) とする。
  8. dateObject.[[DateValue]]v に設定する。
  9. v を返す。

21.4.4.29 Date.prototype.setUTCFullYear ( year [ , month [ , date ] ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN の場合、t+0𝔽 に設定する。
  5. y を ? ToNumber(year) とする。
  6. month が存在する場合、m を ? ToNumber(month) とする。そうでない場合、mMonthFromTime(t) とする。
  7. date が存在する場合、dt を ? ToNumber(date) とする。そうでない場合、dtDateFromTime(t) とする。
  8. newDateMakeDate(MakeDay(y, m, dt), TimeWithinDay(t)) とする。
  9. vTimeClip(newDate) とする。
  10. dateObject.[[DateValue]]v に設定する。
  11. v を返す。

このメソッドの"length"プロパティは 3𝔽 です。

Note

month が存在しない場合、このメソッドは month が値 getUTCMonth() とともに存在したかのように動作します。date が存在しない場合、date が値 getUTCDate() とともに存在したかのように動作します。

21.4.4.30 Date.prototype.setUTCHours ( hour [ , min [ , sec [ , ms ] ] ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. h を ? ToNumber(hour) とする。
  5. min が存在する場合、m を ? ToNumber(min) とする。
  6. sec が存在する場合、s を ? ToNumber(sec) とする。
  7. ms が存在する場合、milli を ? ToNumber(ms) とする。
  8. tNaN の場合、NaN を返す。
  9. min が存在しない場合、mMinFromTime(t) とする。
  10. sec が存在しない場合、sSecFromTime(t) とする。
  11. ms が存在しない場合、millimsFromTime(t) とする。
  12. dateMakeDate(Day(t), MakeTime(h, m, s, milli)) とする。
  13. vTimeClip(date) とする。
  14. dateObject.[[DateValue]]v に設定する。
  15. v を返す。

このメソッドの"length"プロパティは 4𝔽 です。

Note

min が存在しない場合、このメソッドは min が値 getUTCMinutes() とともに存在したかのように動作します。sec が存在しない場合、sec が値 getUTCSeconds() とともに存在したかのように動作します。ms が存在しない場合、ms が値 getUTCMilliseconds() とともに存在したかのように動作します。

21.4.4.31 Date.prototype.setUTCMilliseconds ( ms )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. ms を ? ToNumber(ms) に設定する。
  5. tNaN の場合、NaN を返す。
  6. timeMakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms) とする。
  7. vTimeClip(MakeDate(Day(t), time)) とする。
  8. dateObject.[[DateValue]]v に設定する。
  9. v を返す。

21.4.4.32 Date.prototype.setUTCMinutes ( min [ , sec [ , ms ] ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. m を ? ToNumber(min) とする。
  5. sec が存在する場合、s を ? ToNumber(sec) とする。
  6. ms が存在する場合、milli を ? ToNumber(ms) とする。
  7. tNaN の場合、NaN を返す。
  8. sec が存在しない場合、sSecFromTime(t) とする。
  9. ms が存在しない場合、millimsFromTime(t) とする。
  10. dateMakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli)) とする。
  11. vTimeClip(date) とする。
  12. dateObject.[[DateValue]]v に設定する。
  13. v を返す。

このメソッドの"length"プロパティは 3𝔽 です。

Note

sec が存在しない場合、このメソッドは sec が値 getUTCSeconds() とともに存在したかのように動作します。ms が存在しない場合、msgetUTCMilliseconds()によって返される値とともに存在したかのように動作します。

21.4.4.33 Date.prototype.setUTCMonth ( month [ , date ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. m を ? ToNumber(month) とする。
  5. date が存在する場合、dt を ? ToNumber(date) とする。
  6. tNaN の場合、NaN を返す。
  7. date が存在しない場合、dtDateFromTime(t) とする。
  8. newDateMakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t)) とする。
  9. vTimeClip(newDate) とする。
  10. dateObject.[[DateValue]]v に設定する。
  11. v を返す。

このメソッドの"length"プロパティは 2𝔽 です。

Note

date が存在しない場合、このメソッドは date が値 getUTCDate() とともに存在したかのように動作します。

21.4.4.34 Date.prototype.setUTCSeconds ( sec [ , ms ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. s を ? ToNumber(sec) とする。
  5. ms が存在する場合、milli を ? ToNumber(ms) とする。
  6. tNaN の場合、NaN を返す。
  7. ms が存在しない場合、millimsFromTime(t) とする。
  8. dateMakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli)) とする。
  9. vTimeClip(date) とする。
  10. dateObject.[[DateValue]]v に設定する。
  11. v を返す。

このメソッドの"length"プロパティは 2𝔽 です。

Note

ms が存在しない場合、このメソッドは ms が値 getUTCMilliseconds() とともに存在したかのように動作します。

21.4.4.35 Date.prototype.toDateString ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tvdateObject.[[DateValue]] とする。
  4. tvNaN の場合、"Invalid Date" を返す。
  5. tLocalTime(tv) とする。
  6. DateString(t) を返す。

21.4.4.36 Date.prototype.toISOString ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tvdateObject.[[DateValue]] とする。
  4. tvNaN の場合、RangeError 例外をスローする。
  5. Assert: tv は整数Numberである。
  6. tvDate Time String Format で表現できない年に対応する場合、RangeError 例外をスローする。
  7. UTC時間スケール上で、すべての形式要素およびUTCオフセット表現 "Z" を含む、Date Time String Format における tv のString表現を返す。

21.4.4.37 Date.prototype.toJSON ( key )

このメソッドは、JSON.stringify25.5.4)で使用するためのDateのString表現を提供します。

呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. tv を ? ToPrimitive(obj, number) とする。
  3. tv がNumberであり、かつ tv が有限でない場合、null を返す。
  4. Invoke(obj, "toISOString") を返す。
Note 1

引数は無視されます。

Note 2

このメソッドは意図的に汎用です。そのthis値がDateであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。ただし、そのようなオブジェクトがtoISOStringメソッドを持つことは要求されます。

21.4.4.38 Date.prototype.toLocaleDateString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 Internationalization APIを含むECMAScript実装は、このメソッドをECMA-402仕様で指定されるとおりに実装しなければなりません。ECMAScript実装がECMA-402 APIを含まない場合、このメソッドについて以下の仕様が使用されます:

このメソッドはString値を返します。Stringの内容は実装定義ですが、ホスト環境の現在のロケールの慣習に対応する便利で人間が読める形式で、現在の時間帯におけるDateの「日付」部分を表すことを意図しています。

このメソッドの任意パラメーターの意味はECMA-402仕様で定義されます。ECMA-402サポートを含まない実装は、これらのパラメーター位置を他の目的に使用してはなりません。

21.4.4.39 Date.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 Internationalization APIを含むECMAScript実装は、このメソッドをECMA-402仕様で指定されるとおりに実装しなければなりません。ECMAScript実装がECMA-402 APIを含まない場合、このメソッドについて以下の仕様が使用されます:

このメソッドはString値を返します。Stringの内容は実装定義ですが、ホスト環境の現在のロケールの慣習に対応する便利で人間が読める形式で、現在の時間帯におけるDateを表すことを意図しています。

このメソッドの任意パラメーターの意味はECMA-402仕様で定義されます。ECMA-402サポートを含まない実装は、これらのパラメーター位置を他の目的に使用してはなりません。

21.4.4.40 Date.prototype.toLocaleTimeString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 Internationalization APIを含むECMAScript実装は、このメソッドをECMA-402仕様で指定されるとおりに実装しなければなりません。ECMAScript実装がECMA-402 APIを含まない場合、このメソッドについて以下の仕様が使用されます:

このメソッドはString値を返します。Stringの内容は実装定義ですが、ホスト環境の現在のロケールの慣習に対応する便利で人間が読める形式で、現在の時間帯におけるDateの「時刻」部分を表すことを意図しています。

このメソッドの任意パラメーターの意味はECMA-402仕様で定義されます。ECMA-402サポートを含まない実装は、これらのパラメーター位置を他の目的に使用してはなりません。

21.4.4.41 Date.prototype.toString ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tvdateObject.[[DateValue]] とする。
  4. ToDateString(tv) を返す。
Note 1

d.[[DateValue]] が1000で割り切れる任意のDate dについて、Date.parse(d.toString()) の結果 = d.valueOf() です。21.4.3.2 を参照してください。

Note 2

このメソッドは汎用ではありません。そのthis値がDateでない場合、TypeError 例外をスローします。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことはできません。

21.4.4.41.1 TimeString ( tv )

The abstract operation TimeString takes argument tv (Number、ただし NaN ではない) and returns String. It performs the following steps when called:

  1. hourToZeroPaddedDecimalString((HourFromTime(tv)), 2) とする。
  2. minuteToZeroPaddedDecimalString((MinFromTime(tv)), 2) とする。
  3. secondToZeroPaddedDecimalString((SecFromTime(tv)), 2) とする。
  4. hour":"minute":"second、コード単位0x0020(SPACE)、および "GMT" の文字列連結を返す。

21.4.4.41.2 DateString ( tv )

The abstract operation DateString takes argument tv (Number、ただし NaN ではない) and returns String. It performs the following steps when called:

  1. weekday を、Number WeekDay(tv) を持つ Table 60 内のエントリのNameとする。
  2. month を、Number MonthFromTime(tv) を持つ Table 61 内のエントリのNameとする。
  3. dayToZeroPaddedDecimalString((DateFromTime(tv)), 2) とする。
  4. yvYearFromTime(tv) とする。
  5. yv+0𝔽 であるか、または yv > +0𝔽 の場合、yearSign を空のStringとする。そうでない場合、yearSign"-" とする。
  6. paddedYearToZeroPaddedDecimalString(abs((yv)), 4) とする。
  7. weekday、コード単位0x0020(SPACE)、month、コード単位0x0020(SPACE)、day、コード単位0x0020(SPACE)、yearSign、および paddedYear の文字列連結を返す。
Table 60: 曜日名
Number Name
+0𝔽 "Sun"
1𝔽 "Mon"
2𝔽 "Tue"
3𝔽 "Wed"
4𝔽 "Thu"
5𝔽 "Fri"
6𝔽 "Sat"
Table 61: 年の月名
Number Name
+0𝔽 "Jan"
1𝔽 "Feb"
2𝔽 "Mar"
3𝔽 "Apr"
4𝔽 "May"
5𝔽 "Jun"
6𝔽 "Jul"
7𝔽 "Aug"
8𝔽 "Sep"
9𝔽 "Oct"
10𝔽 "Nov"
11𝔽 "Dec"

21.4.4.41.3 TimeZoneString ( tv )

The abstract operation TimeZoneString takes argument tv (整数Number) and returns String. It performs the following steps when called:

  1. systemTimeZoneIdentifierSystemTimeZoneIdentifier() とする。
  2. IsTimeZoneOffsetString(systemTimeZoneIdentifier) が true の場合、次を行う:
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier) とする。
  3. それ以外の場合、
    1. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, ((tv) × 106)) とする。
  4. offset𝔽(truncate(offsetNs / 106)) とする。
  5. offset+0𝔽 であるか、または offset > +0𝔽 の場合、次を行う:
    1. offsetSign"+" とする。
    2. absOffsetoffset とする。
  6. それ以外の場合、
    1. offsetSign"-" とする。
    2. absOffset を -offset とする。
  7. offsetMinToZeroPaddedDecimalString((MinFromTime(absOffset)), 2) とする。
  8. offsetHourToZeroPaddedDecimalString((HourFromTime(absOffset)), 2) とする。
  9. tzName を、空のString、またはコード単位0x0020(SPACE)、コード単位0x0028(LEFT PARENTHESIS)、実装定義の時間帯名、およびコード単位0x0029(RIGHT PARENTHESIS)の文字列連結のいずれかである実装定義の文字列とする。
  10. offsetSignoffsetHouroffsetMin、および tzName の文字列連結を返す。

21.4.4.41.4 ToDateString ( tv )

The abstract operation ToDateString takes argument tv (整数Numberまたは NaN) and returns String. It performs the following steps when called:

  1. tvNaN の場合、"Invalid Date" を返す。
  2. tLocalTime(tv) とする。
  3. DateString(t)、コード単位0x0020(SPACE)、TimeString(t)、および TimeZoneString(tv) の文字列連結を返す。

21.4.4.42 Date.prototype.toTimeString ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tvdateObject.[[DateValue]] とする。
  4. tvNaN の場合、"Invalid Date" を返す。
  5. tLocalTime(tv) とする。
  6. TimeString(t) と TimeZoneString(tv) の文字列連結を返す。

21.4.4.43 Date.prototype.toUTCString ( )

このメソッドは、this値に対応する時点を表すString値を返します。Stringの形式は、RFC 7231の"HTTP-date"に基づいており、ECMAScript Datesによってサポートされる時刻の全範囲をサポートするように一般化されています。

呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tvdateObject.[[DateValue]] とする。
  4. tvNaN の場合、"Invalid Date" を返す。
  5. weekday を、Number WeekDay(tv) を持つ Table 60 内のエントリのNameとする。
  6. month を、Number MonthFromTime(tv) を持つ Table 61 内のエントリのNameとする。
  7. dayToZeroPaddedDecimalString((DateFromTime(tv)), 2) とする。
  8. yvYearFromTime(tv) とする。
  9. yv+0𝔽 であるか、または yv > +0𝔽 の場合、yearSign を空のStringとする。そうでない場合、yearSign"-" とする。
  10. paddedYearToZeroPaddedDecimalString(abs((yv)), 4) とする。
  11. weekday","、コード単位0x0020(SPACE)、day、コード単位0x0020(SPACE)、month、コード単位0x0020(SPACE)、yearSignpaddedYear、コード単位0x0020(SPACE)、および TimeString(tv) の文字列連結を返す。

21.4.4.44 Date.prototype.valueOf ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. dateObjectthis値とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. dateObject.[[DateValue]] を返す。

21.4.4.45 Date.prototype [ %Symbol.toPrimitive% ] ( hint )

このメソッドは、Dateをプリミティブ値に変換するためにECMAScript言語演算子によって呼び出されます。hint に許される値は "default""number"、および "string" です。Dateは組み込みECMAScriptオブジェクトの中で一意であり、"default""string" と同等として扱います。他のすべての組み込みECMAScriptオブジェクトは、"default""number" と同等として扱います。

呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. obj がObjectでない場合、TypeError 例外をスローする。
  3. hint"string" または "default" のいずれかである場合、次を行う:
    1. tryFirststring とする。
  4. そうでなく hint"number" である場合、次を行う:
    1. tryFirstnumber とする。
  5. それ以外の場合、
    1. TypeError 例外をスローする。
  6. OrdinaryToPrimitive(obj, tryFirst) を返す。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } です。

このメソッドの"name"プロパティの値は "[Symbol.toPrimitive]" です。

21.4.5 Dateインスタンスのプロパティ

Dateインスタンスは、Dateプロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。Dateインスタンスは[[DateValue]]内部スロットも持ちます。[[DateValue]]内部スロットは、このDateによって表される時刻値です。

22 テキスト処理

22.1 Stringオブジェクト

22.1.1 Stringコンストラクター

Stringコンストラクターは以下の通りです:

  • %String%である。
  • グローバルオブジェクト"String"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいStringオブジェクトを作成して初期化する。
  • コンストラクターとしてではなく関数として呼び出されたとき、型変換を実行する。
  • クラス定義のextends節の値として使用できる。指定されたStringの動作を継承することを意図するサブクラスコンストラクターは、[[StringData]]内部スロットを持つサブクラスインスタンスを作成して初期化するために、Stringコンストラクターへのsuper呼び出しを含めなければならない。

22.1.1.1 String ( value )

この関数は呼び出されたとき、次の手順を実行します:

  1. value が存在しない場合、次を行う:
    1. str を空のStringとする。
  2. それ以外の場合、
    1. NewTarget が undefined であり、かつ value がSymbolである場合、SymbolDescriptiveString(value) を返す。
    2. str を ? ToString(value) とする。
  3. NewTarget が undefined の場合、str を返す。
  4. StringCreate(str, ? GetPrototypeFromConstructor(NewTarget, "%String.prototype%")) を返す。

22.1.2 Stringコンストラクターのプロパティ

Stringコンストラクターは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

22.1.2.1 String.fromCharCode ( ...codeUnits )

この関数は、restパラメーター codeUnits を形成する任意個数の引数で呼び出すことができます。

呼び出されたとき、次の手順を実行します:

  1. result を空のStringとする。
  2. codeUnits の各要素 next について、次を行う:
    1. nextCU を、数値が (? ToUint16(next)) であるコード単位とする。
    2. resultresultnextCU の文字列連結に設定する。
  3. result を返す。

この関数の"length"プロパティは 1𝔽 です。

22.1.2.2 String.fromCodePoint ( ...codePoints )

この関数は、restパラメーター codePoints を形成する任意個数の引数で呼び出すことができます。

呼び出されたとき、次の手順を実行します:

  1. result を空のStringとする。
  2. codePoints の各要素 next について、次を行う:
    1. nextCP を ? ToNumber(next) とする。
    2. nextCP が整数Numberでない場合、RangeError 例外をスローする。
    3. (nextCP) < 0 または (nextCP) > 0x10FFFF の場合、RangeError 例外をスローする。
    4. resultresultUTF16EncodeCodePoint((nextCP)) の文字列連結に設定する。
  3. Assert: codePoints が空の場合、result は空のStringである。
  4. result を返す。

この関数の"length"プロパティは 1𝔽 です。

22.1.2.3 String.prototype

String.prototypeの初期値はStringプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

22.1.2.4 String.raw ( template, ...substitutions )

この関数は可変個数の引数で呼び出すことができます。第1引数は template であり、残りの引数はList substitutions を形成します。

呼び出されたとき、次の手順を実行します:

  1. substitutionCountsubstitutions 内の要素数とする。
  2. cooked を ? ToObject(template) とする。
  3. literals を ? ToObject(? Get(cooked, "raw")) とする。
  4. literalCount を ? LengthOfArrayLike(literals) とする。
  5. literalCount ≤ 0 の場合、空のStringを返す。
  6. result を空のStringとする。
  7. nextIndex を 0 とする。
  8. 繰り返す:
    1. nextLiteralVal を ? Get(literals, ! ToString(𝔽(nextIndex))) とする。
    2. nextLiteral を ? ToString(nextLiteralVal) とする。
    3. resultresultnextLiteral の文字列連結に設定する。
    4. nextIndex + 1 = literalCount の場合、result を返す。
    5. nextIndex < substitutionCount の場合、次を行う:
      1. nextSubValsubstitutions[nextIndex] とする。
      2. nextSub を ? ToString(nextSubVal) とする。
      3. resultresultnextSub の文字列連結に設定する。
    6. nextIndexnextIndex + 1 に設定する。
Note

この関数はTagged Template(13.3.11)のタグ関数として使用されることを意図しています。そのように呼び出された場合、第1引数は整形式のテンプレートオブジェクトであり、restパラメーターには置換値が含まれます。

22.1.3 Stringプロトタイプオブジェクトのプロパティ

Stringプロトタイプオブジェクトは以下の通りです:

  • %String.prototype%である。
  • String exotic objectであり、そのようなオブジェクトに指定された内部メソッドを持つ。
  • [[StringData]]内部スロットを持ち、その値は空のStringである。
  • 初期値が +0𝔽 であり、属性が { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } である"length"プロパティを持つ。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。

明示的に別途述べられている場合を除き、以下で定義されるStringプロトタイプオブジェクトのメソッドは汎用ではなく、それらに渡されるthis値は、String値であるか、String値に初期化された[[StringData]]内部スロットを持つオブジェクトでなければなりません。

22.1.3.1 String.prototype.at ( index )

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. lenstr の長さとする。
  5. relativeIndex を ? ToIntegerOrInfinity(index) とする。
  6. relativeIndex ≥ 0 の場合、次を行う:
    1. krelativeIndex とする。
  7. それ以外の場合、
    1. klen + relativeIndex とする。
  8. k < 0 または klen の場合、undefined を返す。
  9. strk から k + 1 までの部分文字列を返す。

22.1.3.2 String.prototype.charAt ( pos )

Note 1

このメソッドは、このオブジェクトをStringに変換した結果のString値内のインデックス pos にあるコード単位を含む、単一要素のStringを返します。そのインデックスに要素が存在しない場合、結果は空のStringです。結果はString値であり、Stringオブジェクトではありません。

posが整数Numberである場合、x.charAt(pos)の結果はx.substring(pos, pos + 1)の結果と等価です。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. position を ? ToIntegerOrInfinity(pos) とする。
  5. sizestr の長さとする。
  6. position < 0 または positionsize の場合、空のStringを返す。
  7. strposition から position + 1 までの部分文字列を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.3 String.prototype.charCodeAt ( pos )

Note 1

このメソッドは、このオブジェクトをStringに変換した結果のString内のインデックス pos にあるコード単位の数値であるNumber(216未満の非負の整数Number)を返します。そのインデックスに要素が存在しない場合、結果は NaN です。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. position を ? ToIntegerOrInfinity(pos) とする。
  5. sizestr の長さとする。
  6. position < 0 または positionsize の場合、NaN を返す。
  7. String str 内のインデックス position にあるコード単位の数値に対応するNumber値を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.4 String.prototype.codePointAt ( pos )

Note 1

このメソッドは、このオブジェクトをStringに変換した結果のString内のインデックス pos にある文字列要素から始まるUTF-16符号化コードポイント(6.1.4)の数値である、0x10FFFF𝔽 以下の非負の整数Numberを返します。そのインデックスに要素が存在しない場合、結果は undefined です。有効なUTF-16サロゲートペアが pos から始まらない場合、結果は pos にあるコード単位です。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. position を ? ToIntegerOrInfinity(pos) とする。
  5. sizestr の長さとする。
  6. position < 0 または positionsize の場合、undefined を返す。
  7. cpCodePointAt(str, position) とする。
  8. 𝔽(cp.[[CodePoint]]) を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.5 String.prototype.concat ( ...args )

Note 1

このメソッドが呼び出されたとき、this値(Stringに変換されたもの)のコード単位に続けて、それぞれの引数をStringに変換したもののコード単位から成るString値を返します。結果はString値であり、Stringオブジェクトではありません。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. resultstr とする。
  5. args の各要素 next について、次を行う:
    1. nextString を ? ToString(next) とする。
    2. resultresultnextString の文字列連結に設定する。
  6. result を返す。

このメソッドの"length"プロパティは 1𝔽 です。

Note 2

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.6 String.prototype.constructor

String.prototype.constructorの初期値は %String% です。

22.1.3.7 String.prototype.endsWith ( searchString [ , endPosition ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. isRegExp を ? IsRegExp(searchString) とする。
  5. isRegExptrue の場合、TypeError 例外をスローする。
  6. searchStr を ? ToString(searchString) とする。
  7. lenstr の長さとする。
  8. endPositionundefined の場合、poslen とする。そうでない場合、pos を ? ToIntegerOrInfinity(endPosition) とする。
  9. endpos を 0 と len の間にクランプした結果とする。
  10. searchLengthsearchStr の長さとする。
  11. searchLength = 0 の場合、true を返す。
  12. startend - searchLength とする。
  13. start < 0 の場合、false を返す。
  14. substringstrstart から end までの部分文字列とする。
  15. substringsearchStr である場合、true を返す。
  16. false を返す。
Note 1

第1引数がRegExpである場合に例外をスローすることは、将来の版がそのような引数値を許す拡張を定義できるようにするために指定されています。

Note 2

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.8 String.prototype.includes ( searchString [ , position ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. isRegExp を ? IsRegExp(searchString) とする。
  5. isRegExptrue の場合、TypeError 例外をスローする。
  6. searchStr を ? ToString(searchString) とする。
  7. pos を ? ToIntegerOrInfinity(position) とする。
  8. Assert: positionundefined の場合、pos は 0 である。
  9. lenstr の長さとする。
  10. startpos を 0 と len の間にクランプした結果とする。
  11. indexStringIndexOf(str, searchStr, start) とする。
  12. indexnot-found の場合、false を返す。
  13. true を返す。
Note 1

searchString が、このオブジェクトをStringに変換した結果の部分文字列として、position 以上の1つ以上のインデックスに現れる場合、この関数は true を返します。それ以外の場合は false を返します。positionundefined の場合、String全体を検索するために0が仮定されます。

Note 2

第1引数がRegExpである場合に例外をスローすることは、将来の版がそのような引数値を許す拡張を定義できるようにするために指定されています。

Note 3

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.9 String.prototype.indexOf ( searchString [ , position ] )

Note 1

searchString が、このオブジェクトをStringに変換した結果の部分文字列として、position 以上の1つ以上のインデックスに現れる場合、そのような最小のインデックスが返されます。それ以外の場合、-1𝔽 が返されます。positionundefined の場合、String全体を検索するために +0𝔽 が仮定されます。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. searchStr を ? ToString(searchString) とする。
  5. pos を ? ToIntegerOrInfinity(position) とする。
  6. Assert: positionundefined の場合、pos は 0 である。
  7. lenstr の長さとする。
  8. startpos を 0 と len の間にクランプした結果とする。
  9. resultStringIndexOf(str, searchStr, start) とする。
  10. resultnot-found の場合、-1𝔽 を返す。
  11. 𝔽(result) を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.10 String.prototype.isWellFormed ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. IsStringWellFormedUnicode(str) を返す。

22.1.3.11 String.prototype.lastIndexOf ( searchString [ , position ] )

Note 1

searchString が、このオブジェクトをStringに変換した結果の部分文字列として、position 以下の1つ以上のインデックスに現れる場合、そのような最大のインデックスが返されます。それ以外の場合、-1𝔽 が返されます。positionundefined の場合、String全体を検索するためにString値の長さが仮定されます。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. searchStr を ? ToString(searchString) とする。
  5. numPos を ? ToNumber(position) とする。
  6. Assert: positionundefined の場合、numPosNaN である。
  7. numPosNaN の場合、pos を +∞ とする。そうでない場合、pos を ! ToIntegerOrInfinity(numPos) とする。
  8. lenstr の長さとする。
  9. searchLensearchStr の長さとする。
  10. len < searchLen の場合、-1𝔽 を返す。
  11. startpos を 0 と len - searchLen の間にクランプした結果とする。
  12. resultStringLastIndexOf(str, searchStr, start) とする。
  13. resultnot-found の場合、-1𝔽 を返す。
  14. 𝔽(result) を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.12 String.prototype.localeCompare ( that [ , reserved1 [ , reserved2 ] ] )

ECMA-402 Internationalization APIを含むECMAScript実装は、このメソッドをECMA-402仕様で指定されるとおりに実装しなければなりません。ECMAScript実装がECMA-402 APIを含まない場合、このメソッドについて以下の仕様が使用されます:

このメソッドは、this値(String str に変換される)と that(String thatValue に変換される)との実装定義のロケール依存String比較の結果を表す、NaN 以外のNumberを返します。結果は、ホスト環境の現在のロケールの慣習に従うString値のソート順に対応することを意図しており、strthatValue より前に順序付けられる場合は負、strthatValue より後に順序付けられる場合は正、それ以外の場合はゼロ(strthatValue の間に相対的な順序がないことを表す)になります。

比較を実行する前に、このメソッドはStringを準備するために次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. thatValue を ? ToString(that) とする。

このメソッドの任意の第2および第3パラメーターの意味はECMA-402仕様で定義されます。ECMA-402サポートを含まない実装は、それらのパラメーター位置に他の解釈を割り当ててはなりません。

実際の戻り値は、追加情報をエンコードすることを許すために実装定義ですが、このメソッドは、2つの引数のメソッドとして考えた場合、すべてのStringの集合上の全順序を定義する一貫した比較関数であることが要求されます。このメソッドはまた、Unicode Standardに従う正準等価性を認識して尊重することも要求されます。これには、区別可能であるが正準等価なStringを比較するときに +0𝔽 を返すことが含まれます。

Note 1

このメソッド自体は、Array.prototype.sortへの引数として直接適していません。後者は2つの引数の関数を要求するためです。

Note 2

このメソッドは、ECMAScript環境がホスト環境から利用できる任意の言語依存および/またはロケール依存の比較機能に依存してもよく、ホスト環境の現在のロケールの慣習に従って比較することを意図しています。しかし、比較能力に関係なく、このメソッドはUnicode Standardに従う正準等価性を認識して尊重しなければなりません。たとえば、以下の比較はすべて +0𝔽 を返さなければなりません:

// Å ANGSTROM SIGN vs.
// Å LATIN CAPITAL LETTER A + COMBINING RING ABOVE
"\u212B".localeCompare("A\u030A")

// Ω OHM SIGN vs.
// Ω GREEK CAPITAL LETTER OMEGA
"\u2126".localeCompare("\u03A9")

// ṩ LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE vs.
// ṩ LATIN SMALL LETTER S + COMBINING DOT ABOVE + COMBINING DOT BELOW
"\u1E69".localeCompare("s\u0307\u0323")

// ḍ̇ LATIN SMALL LETTER D WITH DOT ABOVE + COMBINING DOT BELOW vs.
// ḍ̇ LATIN SMALL LETTER D WITH DOT BELOW + COMBINING DOT ABOVE
"\u1E0B\u0323".localeCompare("\u1E0D\u0307")

// 가 HANGUL CHOSEONG KIYEOK + HANGUL JUNGSEONG A vs.
// 가 HANGUL SYLLABLE GA
"\u1100\u1161".localeCompare("\uAC00")

正準等価性の定義および議論については、Unicode Standardの第2章および第3章、ならびに Unicode Standard Annex #15, Unicode Normalization Forms および Unicode Technical Note #5, Canonical Equivalence in Applications を参照してください。また、Unicode Technical Standard #10, Unicode Collation Algorithm も参照してください。

このメソッドは、Unicode Standard第3章3.7節で定義されるUnicode互換等価性または互換分解を尊重しないことが推奨されます。

Note 3

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.13 String.prototype.match ( regexpOrPattern )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. regexpOrPattern がObjectである場合、次を行う:
    1. matcher を ? GetMethod(regexpOrPattern, %Symbol.match%) とする。
    2. matcherundefined でない場合、次を行う:
      1. Call(matcher, regexpOrPattern, « thisValue ») を返す。
  4. str を ? ToString(thisValue) とする。
  5. regexp を ? RegExpCreate(regexpOrPattern, undefined) とする。
  6. Invoke(regexp, %Symbol.match%, « str ») を返す。
Note

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.14 String.prototype.matchAll ( regexpOrPattern )

このメソッドは、this値を表すStringに対して regexpOrPattern による正規表現マッチを実行し、マッチ結果を生成するイテレーターを返します。各マッチ結果は、Stringのマッチした部分を第1要素として含み、その後に任意のキャプチャグループによってマッチされた部分が続くArrayです。正規表現が一度もマッチしない場合、返されたイテレーターはマッチ結果を生成しません。

呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. regexpOrPattern がObjectである場合、次を行う:
    1. isRegExp を ? IsRegExp(regexpOrPattern) とする。
    2. isRegExptrue の場合、次を行う:
      1. flags を ? Get(regexpOrPattern, "flags") とする。
      2. RequireObjectCoercible(flags) を実行する。
      3. ToString(flags) が "g" を含まない場合、TypeError 例外をスローする。
    3. matcher を ? GetMethod(regexpOrPattern, %Symbol.matchAll%) とする。
    4. matcherundefined でない場合、次を行う:
      1. Call(matcher, regexpOrPattern, « thisValue ») を返す。
  4. str を ? ToString(thisValue) とする。
  5. regexp を ? RegExpCreate(regexpOrPattern, "g") とする。
  6. Invoke(regexp, %Symbol.matchAll%, « str ») を返す。
Note 1
このメソッドは意図的に汎用であり、そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。
Note 2
String.prototype.splitと同様に、String.prototype.matchAllは通常、入力を変更せずに動作するように設計されています。

22.1.3.15 String.prototype.normalize ( [ form ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. formundefined の場合、f"NFC" とする。
  5. それ以外の場合、f を ? ToString(form) とする。
  6. f"NFC""NFD""NFKC"、または "NFKD" のいずれでもない場合、RangeError 例外をスローする。
  7. ns を、最新のUnicode Standard, Normalization Forms で指定されるように、strf によって名付けられる正規化形式へ正規化した結果であるString値とする。
  8. ns を返す。
Note

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.16 String.prototype.padEnd ( maxLength [ , fillString ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. StringPaddingBuiltinsImpl(thisValue, maxLength, fillString, end) を返す。

22.1.3.17 String.prototype.padStart ( maxLength [ , fillString ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. StringPaddingBuiltinsImpl(thisValue, maxLength, fillString, start) を返す。

22.1.3.17.1 StringPaddingBuiltinsImpl ( thisValue, maxLength, fillString, placement )

The abstract operation StringPaddingBuiltinsImpl takes arguments thisValue (ECMAScript言語値), maxLength (ECMAScript言語値), fillString (ECMAScript言語値), and placement (start または end) and returns Stringを含む正常完了またはスロー完了. It performs the following steps when called:

  1. str を ? ToString(thisValue) とする。
  2. intMaxLength(? ToLength(maxLength)) とする。
  3. stringLengthstr の長さとする。
  4. intMaxLengthstringLength の場合、str を返す。
  5. fillStringundefined の場合、fillString をコード単位0x0020(SPACE)のみから成るString値に設定する。
  6. それ以外の場合、fillString を ? ToString(fillString) に設定する。
  7. StringPad(str, intMaxLength, fillString, placement) を返す。

22.1.3.17.2 StringPad ( str, maxLength, fillString, placement )

The abstract operation StringPad takes arguments str (String), maxLength (非負整数), fillString (String), and placement (start または end) and returns String. It performs the following steps when called:

  1. stringLengthstr の長さとする。
  2. maxLengthstringLength の場合、str を返す。
  3. fillString が空のStringである場合、str を返す。
  4. fillLenmaxLength - stringLength とする。
  5. truncatedStringFiller を、fillString の反復連結を長さ fillLen に切り詰めたString値とする。
  6. placementstart である場合、truncatedStringFillerstr の文字列連結を返す。
  7. strtruncatedStringFiller の文字列連結を返す。
Note 1

引数 maxLength は、str の長さより小さくならないようにクランプされます。

Note 2

引数 fillString の既定値は " "(コード単位0x0020 SPACEから成るString値)です。

22.1.3.17.3 ToZeroPaddedDecimalString ( n, minLength )

The abstract operation ToZeroPaddedDecimalString takes arguments n (非負整数) and minLength (非負整数) and returns String. It performs the following steps when called:

  1. str を、10進数として形式化された n のString表現とする。
  2. StringPad(str, minLength, "0", start) を返す。

22.1.3.18 String.prototype.repeat ( count )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. n を ? ToIntegerOrInfinity(count) とする。
  5. n < 0 または n = +∞ の場合、RangeError 例外をスローする。
  6. n = 0 の場合、空のStringを返す。
  7. strn 個のコピーを連結して作られるString値を返す。
Note 1

このメソッドは、this値(Stringに変換されたもの)のコード単位を count 回繰り返したString値を作成します。

Note 2

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.19 String.prototype.replace ( searchValue, replaceValue )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. searchValue がObjectである場合、次を行う:
    1. replacer を ? GetMethod(searchValue, %Symbol.replace%) とする。
    2. replacerundefined でない場合、次を行う:
      1. Call(replacer, searchValue, « thisValue, replaceValue ») を返す。
  4. string を ? ToString(thisValue) とする。
  5. searchString を ? ToString(searchValue) とする。
  6. functionalReplaceIsCallable(replaceValue) とする。
  7. functionalReplacefalse の場合、次を行う:
    1. replaceValue を ? ToString(replaceValue) に設定する。
  8. searchLengthsearchString の長さとする。
  9. positionStringIndexOf(string, searchString, 0) とする。
  10. positionnot-found の場合、string を返す。
  11. precedingstring の 0 から position までの部分文字列とする。
  12. followingstringposition + searchLength からの部分文字列とする。
  13. functionalReplacetrue の場合、次を行う:
    1. replacement を ? ToString(? Call(replaceValue, undefined, « searchString, 𝔽(position), string »)) とする。
  14. それ以外の場合、
    1. Assert: replaceValue はStringである。
    2. captures を新しい空のListとする。
    3. replacement を ! GetSubstitution(searchString, string, position, captures, undefined, replaceValue) とする。
  15. precedingreplacement、および following の文字列連結を返す。
Note

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.19.1 GetSubstitution ( matched, str, position, captures, namedCaptures, replacementTemplate )

The abstract operation GetSubstitution takes arguments matched (String), str (String), position (非負整数), captures (StringまたはundefinedList), namedCaptures (Objectまたはundefined), and replacementTemplate (String) and returns Stringを含む正常完了またはスロー完了. この抽象操作の目的において、10進数字は0x0030(DIGIT ZERO)から0x0039(DIGIT NINE)までの包含区間内のコード単位です。 It performs the following steps when called:

  1. stringLengthstr の長さとする。
  2. Assert: positionstringLength
  3. result を空のStringとする。
  4. templateRemainderreplacementTemplate とする。
  5. templateRemainder が空のStringでない間、繰り返す:
    1. NOTE: 以下のステップは reftemplateRemainder の接頭辞)を分離し、refReplacement(その置換)を決定し、その置換を result に追加する。
    2. templateRemainder"$$" で始まる場合、次を行う:
      1. ref"$$" とする。
      2. refReplacement"$" とする。
    3. そうでなく templateRemainder"$`" で始まる場合、次を行う:
      1. ref"$`" とする。
      2. refReplacementstr の 0 から position までの部分文字列とする。
    4. そうでなく templateRemainder"$&" で始まる場合、次を行う:
      1. ref"$&" とする。
      2. refReplacementmatched とする。
    5. そうでなく templateRemainder"$'"(0x0024(DOLLAR SIGN)の後に0x0027(APOSTROPHE)が続く)で始まる場合、次を行う:
      1. ref"$'" とする。
      2. matchLengthmatched の長さとする。
      3. tailPosposition + matchLength とする。
      4. refReplacementstrmin(tailPos, stringLength) からの部分文字列とする。
      5. NOTE: tailPosstringLength を超える可能性があるのは、この抽象操作が、"exec"プロパティが組み込みの %RegExp.prototype.exec% ではないオブジェクト上で %RegExp.prototype% の組み込み %Symbol.replace% メソッドの呼び出しによって起動された場合だけである。
    6. そうでなく templateRemainder"$" に続けて1つ以上の10進数字で始まる場合、次を行う:
      1. templateRemainder"$" に続けて2つ以上の10進数字で始まる場合、digitCount を 2 とする。そうでない場合、digitCount を 1 とする。
      2. digitstemplateRemainder の 1 から 1 + digitCount までの部分文字列とする。
      3. index(StringToNumber(digits)) とする。
      4. Assert: 0 ≤ index ≤ 99。
      5. captureLencaptures 内の要素数とする。
      6. index > captureLen かつ digitCount = 2 の場合、次を行う:
        1. NOTE: 2桁の置換パターンがキャプチャグループ数を超えるインデックスを指定する場合、それは1桁の置換パターンに続くリテラル数字として扱われる。
        2. digitCount を 1 に設定する。
        3. digitsdigits の 0 から 1 までの部分文字列に設定する。
        4. index(StringToNumber(digits)) に設定する。
      7. reftemplateRemainder の 0 から 1 + digitCount までの部分文字列とする。
      8. 1 ≤ indexcaptureLen の場合、次を行う:
        1. capturecaptures[index - 1] とする。
        2. captureundefined の場合、次を行う:
          1. refReplacement を空のStringとする。
        3. それ以外の場合、
          1. refReplacementcapture とする。
      9. それ以外の場合、
        1. refReplacementref とする。
    7. そうでなく templateRemainder"$<" で始まる場合、次を行う:
      1. gtPosStringIndexOf(templateRemainder, ">", 0) とする。
      2. gtPosnot-found であるか、または namedCapturesundefined である場合、次を行う:
        1. ref"$<" とする。
        2. refReplacementref とする。
      3. それ以外の場合、
        1. reftemplateRemainder の 0 から gtPos + 1 までの部分文字列とする。
        2. groupNametemplateRemainder の 2 から gtPos までの部分文字列とする。
        3. Assert: namedCaptures はObjectである。
        4. capture を ? Get(namedCaptures, groupName) とする。
        5. captureundefined の場合、次を行う:
          1. refReplacement を空のStringとする。
        6. それ以外の場合、
          1. refReplacement を ? ToString(capture) とする。
    8. それ以外の場合、
      1. reftemplateRemainder の 0 から 1 までの部分文字列とする。
      2. refReplacementref とする。
    9. refLengthref の長さとする。
    10. templateRemaindertemplateRemainderrefLength からの部分文字列に設定する。
    11. resultresultrefReplacement の文字列連結に設定する。
  6. result を返す。

22.1.3.20 String.prototype.replaceAll ( searchValue, replaceValue )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. searchValue がObjectである場合、次を行う:
    1. isRegExp を ? IsRegExp(searchValue) とする。
    2. isRegExptrue の場合、次を行う:
      1. flags を ? Get(searchValue, "flags") とする。
      2. RequireObjectCoercible(flags) を実行する。
      3. ToString(flags) が "g" を含まない場合、TypeError 例外をスローする。
    3. replacer を ? GetMethod(searchValue, %Symbol.replace%) とする。
    4. replacerundefined でない場合、次を行う:
      1. Call(replacer, searchValue, « thisValue, replaceValue ») を返す。
  4. string を ? ToString(thisValue) とする。
  5. searchString を ? ToString(searchValue) とする。
  6. functionalReplaceIsCallable(replaceValue) とする。
  7. functionalReplacefalse の場合、次を行う:
    1. replaceValue を ? ToString(replaceValue) に設定する。
  8. searchLengthsearchString の長さとする。
  9. advanceBymax(1, searchLength) とする。
  10. matchPositions を新しい空のListとする。
  11. positionStringIndexOf(string, searchString, 0) とする。
  12. positionnot-found でない間、繰り返す:
    1. positionmatchPositions に追加する。
    2. positionStringIndexOf(string, searchString, position + advanceBy) に設定する。
  13. endOfLastMatch を 0 とする。
  14. result を空のStringとする。
  15. matchPositions の各要素 matchPosition について、次を行う:
    1. preservedstringendOfLastMatch から matchPosition までの部分文字列とする。
    2. functionalReplacetrue の場合、次を行う:
      1. replacement を ? ToString(? Call(replaceValue, undefined, « searchString, 𝔽(matchPosition), string »)) とする。
    3. それ以外の場合、
      1. Assert: replaceValue はStringである。
      2. captures を新しい空のListとする。
      3. replacement を ! GetSubstitution(searchString, string, matchPosition, captures, undefined, replaceValue) とする。
    4. resultresultpreserved、および replacement の文字列連結に設定する。
    5. endOfLastMatchmatchPosition + searchLength に設定する。
  16. endOfLastMatch < string の長さ の場合、次を行う:
    1. resultresultstringendOfLastMatch からの部分文字列の文字列連結に設定する。
  17. result を返す。

22.1.3.21 String.prototype.search ( regexpOrPattern )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. regexpOrPattern がObjectである場合、次を行う:
    1. searcher を ? GetMethod(regexpOrPattern, %Symbol.search%) とする。
    2. searcherundefined でない場合、次を行う:
      1. Call(searcher, regexpOrPattern, « thisValue ») を返す。
  4. string を ? ToString(thisValue) とする。
  5. regexp を ? RegExpCreate(regexpOrPattern, undefined) とする。
  6. Invoke(regexp, %Symbol.search%, « string ») を返す。
Note

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.22 String.prototype.slice ( start, end )

このメソッドは、このオブジェクトをStringに変換した結果の部分文字列を返します。これはインデックス start から始まり、インデックス end の直前まで(または endundefined の場合はStringの末尾まで)続きます。start が負である場合、それは sourceLength + start として扱われます。ここで sourceLength はStringの長さです。end が負である場合、それは sourceLength + end として扱われます。ここで sourceLength はStringの長さです。結果はString値であり、Stringオブジェクトではありません。

呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. lenstr の長さとする。
  5. intStart を ? ToIntegerOrInfinity(start) とする。
  6. intStart = -∞ の場合、from を 0 とする。
  7. そうでなく intStart < 0 の場合、frommax(len + intStart, 0) とする。
  8. それ以外の場合、frommin(intStart, len) とする。
  9. endundefined の場合、intEndlen とする。そうでない場合、intEnd を ? ToIntegerOrInfinity(end) とする。
  10. intEnd = -∞ の場合、to を 0 とする。
  11. そうでなく intEnd < 0 の場合、tomax(len + intEnd, 0) とする。
  12. それ以外の場合、tomin(intEnd, len) とする。
  13. fromto の場合、空のStringを返す。
  14. strfrom から to までの部分文字列を返す。
Note

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.23 String.prototype.split ( separator, limit )

このメソッドは、このオブジェクトをStringに変換した結果の部分文字列を格納したArrayを返します。部分文字列は、separator の出現を左から右に検索することによって決定されます。これらの出現は、返される配列内のどのStringの一部でもありませんが、String値を分割する役割を果たします。separator の値は任意の長さのStringであってもよく、または%Symbol.split%メソッドを持つRegExpなどのオブジェクトであってもかまいません。

呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. separator がObjectである場合、次を行う:
    1. splitter を ? GetMethod(separator, %Symbol.split%) とする。
    2. splitterundefined でない場合、次を行う:
      1. Call(splitter, separator, « thisValue, limit ») を返す。
  4. str を ? ToString(thisValue) とする。
  5. limitundefined の場合、lim を 232 - 1 とする。そうでない場合、lim(? ToUint32(limit)) とする。
  6. separatorStr を ? ToString(separator) とする。
  7. lim = 0 の場合、次を行う:
    1. CreateArrayFromList(« ») を返す。
  8. separatorundefined の場合、次を行う:
    1. CreateArrayFromListstr ») を返す。
  9. separatorLengthseparatorStr の長さとする。
  10. separatorLength = 0 の場合、次を行う:
    1. strLenstr の長さとする。
    2. outLenlim を 0 と strLen の間にクランプした結果とする。
    3. headstr の 0 から outLen までの部分文字列とする。
    4. codeUnits を、head の要素であるコード単位の列から成るListとする。
    5. CreateArrayFromList(codeUnits) を返す。
  11. str が空のStringである場合、CreateArrayFromListstr ») を返す。
  12. substrings を新しい空のListとする。
  13. searchStart を 0 とする。
  14. matchIndexStringIndexOf(str, separatorStr, 0) とする。
  15. matchIndexnot-found でない間、繰り返す:
    1. substringstrsearchStart から matchIndex までの部分文字列とする。
    2. substringsubstrings に追加する。
    3. substrings 内の要素数が lim である場合、CreateArrayFromList(substrings) を返す。
    4. searchStartmatchIndex + separatorLength に設定する。
    5. matchIndexStringIndexOf(str, separatorStr, searchStart) に設定する。
  16. substringstrsearchStart からの部分文字列とする。
  17. substringsubstrings に追加する。
  18. CreateArrayFromList(substrings) を返す。
Note 1

separator の値は空のStringであってもかまいません。この場合、separator は入力Stringの先頭または末尾の空の部分文字列にはマッチせず、また前回のセパレータマッチの末尾の空の部分文字列にもマッチしません。separator が空のStringである場合、Stringは個々のコード単位要素に分割されます。結果配列の長さはStringの長さに等しく、各部分文字列は1つのコード単位を含みます。

this値が空のStringである(または空のStringに変換される)場合、結果は separator が空のStringにマッチできるかどうかに依存します。マッチできる場合、結果配列は要素を含みません。そうでない場合、結果配列は1つの要素を含み、それは空のStringです。

separatorundefined である場合、結果配列は、this値(Stringに変換されたもの)である1つのStringだけを含みます。limitundefined でない場合、出力配列は limit 要素以下になるように切り詰められます。

Note 2

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.24 String.prototype.startsWith ( searchString [ , position ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. isRegExp を ? IsRegExp(searchString) とする。
  5. isRegExptrue の場合、TypeError 例外をスローする。
  6. searchStr を ? ToString(searchString) とする。
  7. lenstr の長さとする。
  8. positionundefined の場合、pos を 0 とする。そうでない場合、pos を ? ToIntegerOrInfinity(position) とする。
  9. startpos を 0 と len の間にクランプした結果とする。
  10. searchLengthsearchStr の長さとする。
  11. searchLength = 0 の場合、true を返す。
  12. endstart + searchLength とする。
  13. end > len の場合、false を返す。
  14. substringstrstart から end までの部分文字列とする。
  15. substringsearchStr である場合、true を返す。
  16. false を返す。
Note 1

第1引数がRegExpである場合に例外をスローすることは、将来の版がそのような引数値を許す拡張を定義できるようにするために指定されています。

Note 2

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.25 String.prototype.substring ( start, end )

このメソッドは、このオブジェクトをStringに変換した結果の部分文字列を返します。これはインデックス start から始まり、Stringのインデックス end の直前まで(または endundefined の場合はStringの末尾まで)続きます。結果はString値であり、Stringオブジェクトではありません。

いずれかの引数が NaN または負である場合、それはゼロに置き換えられます。いずれかの引数がStringの長さより厳密に大きい場合、それはStringの長さに置き換えられます。

startend より厳密に大きい場合、それらは交換されます。

呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. lenstr の長さとする。
  5. intStart を ? ToIntegerOrInfinity(start) とする。
  6. endundefined の場合、intEndlen とする。そうでない場合、intEnd を ? ToIntegerOrInfinity(end) とする。
  7. finalStartintStart を 0 と len の間にクランプした結果とする。
  8. finalEndintEnd を 0 と len の間にクランプした結果とする。
  9. frommin(finalStart, finalEnd) とする。
  10. tomax(finalStart, finalEnd) とする。
  11. strfrom から to までの部分文字列を返す。
Note

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.26 String.prototype.toLocaleLowerCase ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 Internationalization APIを含むECMAScript実装は、このメソッドをECMA-402仕様で指定されるとおりに実装しなければなりません。ECMAScript実装がECMA-402 APIを含まない場合、このメソッドについて以下の仕様が使用されます:

このメソッドは、6.1.4 で説明されるように、String値をUTF-16符号化コードポイントの列として解釈します。

これはtoLowerCaseとまったく同じように動作しますが、ホスト環境の現在のロケールの慣習に対応するロケール依存の結果を生成することを意図している点が異なります。その言語の規則が通常のUnicode大文字小文字マッピングと衝突する少数の場合(トルコ語など)にのみ差異があります。

このメソッドの任意パラメーターの意味はECMA-402仕様で定義されます。ECMA-402サポートを含まない実装は、これらのパラメーター位置を他の目的に使用してはなりません。

Note

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.27 String.prototype.toLocaleUpperCase ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 Internationalization APIを含むECMAScript実装は、このメソッドをECMA-402仕様で指定されるとおりに実装しなければなりません。ECMAScript実装がECMA-402 APIを含まない場合、このメソッドについて以下の仕様が使用されます:

このメソッドは、6.1.4 で説明されるように、String値をUTF-16符号化コードポイントの列として解釈します。

これはtoUpperCaseとまったく同じように動作しますが、ホスト環境の現在のロケールの慣習に対応するロケール依存の結果を生成することを意図している点が異なります。その言語の規則が通常のUnicode大文字小文字マッピングと衝突する少数の場合(トルコ語など)にのみ差異があります。

このメソッドの任意パラメーターの意味はECMA-402仕様で定義されます。ECMA-402サポートを含まない実装は、これらのパラメーター位置を他の目的に使用してはなりません。

Note

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.28 String.prototype.toLowerCase ( )

このメソッドは、6.1.4 で説明されるように、String値をUTF-16符号化コードポイントの列として解釈します。

呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. sTextStringToCodePoints(str) とする。
  5. lowerText を、Unicode Default Case Conversionアルゴリズムに従う toLowercase(sText) とする。
  6. lowercaseStringCodePointsToString(lowerText) とする。
  7. lowercaseString を返す。

結果は、Unicode Character Databaseにおけるロケール非依存の大文字小文字マッピングに従って導かれなければなりません(これには、ファイル UnicodeData.txt だけでなく、それに付随するファイル SpecialCasing.txt 内のすべてのロケール非依存マッピングも明示的に含まれます)。

Note 1

一部のコードポイントの大文字小文字マッピングは複数のコードポイントを生成する場合があります。この場合、結果のStringは元のStringと同じ長さでないことがあります。toUpperCasetoLowerCaseはいずれも文脈依存の動作を持つため、これらのメソッドは対称的ではありません。言い換えると、s.toUpperCase().toLowerCase()は必ずしもs.toLowerCase()と等しいとは限りません。

Note 2

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.29 String.prototype.toString ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. ThisStringValue(this値) を返す。
Note

Stringオブジェクトの場合、このメソッドはたまたまvalueOfメソッドと同じものを返します。

22.1.3.30 String.prototype.toUpperCase ( )

このメソッドは、6.1.4 で説明されるように、String値をUTF-16符号化コードポイントの列として解釈します。

これはString.prototype.toLowerCaseとまったく同じように動作しますが、StringがUnicode Default Case ConversionのtoUppercaseアルゴリズムを使用してマップされる点が異なります。

Note

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.31 String.prototype.toWellFormed ( )

このメソッドは、このオブジェクトのString表現を返します。その際、サロゲートペアの一部でないすべての先行サロゲートおよび後続サロゲートはU+FFFD(REPLACEMENT CHARACTER)に置き換えられます。

呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. RequireObjectCoercible(thisValue) を実行する。
  3. str を ? ToString(thisValue) とする。
  4. strLenstr の長さとする。
  5. k を 0 とする。
  6. result を空のStringとする。
  7. k < strLen の間、繰り返す:
    1. cpCodePointAt(str, k) とする。
    2. cp.[[IsUnpairedSurrogate]]true の場合、次を行う:
      1. resultresult と 0xFFFD(REPLACEMENT CHARACTER)の文字列連結に設定する。
    3. それ以外の場合、
      1. resultresultUTF16EncodeCodePoint(cp.[[CodePoint]]) の文字列連結に設定する。
    4. kk + cp.[[CodeUnitCount]] に設定する。
  8. result を返す。

22.1.3.32 String.prototype.trim ( )

このメソッドは、6.1.4 で説明されるように、String値をUTF-16符号化コードポイントの列として解釈します。

呼び出されたとき、次の手順を実行します:

  1. thisValuethis値とする。
  2. TrimString(thisValue, start+end) を返す。
Note

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.32.1 TrimString ( string, where )

The abstract operation TrimString takes arguments string (ECMAScript言語値) and where (startend、または start+end) and returns Stringを含む正常完了またはスロー完了. 6.1.4 で説明されるように、string をUTF-16符号化コードポイントの列として解釈します。 It performs the following steps when called:

  1. RequireObjectCoercible(string) を実行する。
  2. str を ? ToString(string) とする。
  3. wherestart である場合、次を行う:
    1. trimmedString を、先頭の空白を取り除いた str のコピーであるString値とする。
  4. そうでなく whereend である場合、次を行う:
    1. trimmedString を、末尾の空白を取り除いた str のコピーであるString値とする。
  5. それ以外の場合、
    1. Assert: wherestart+end である。
    2. trimmedString を、先頭と末尾の両方の空白を取り除いた str のコピーであるString値とする。
  6. trimmedString を返す。

空白の定義は WhiteSpaceLineTerminator の和集合です。UnicodeコードポイントがUnicode一般カテゴリ“Space_Separator”(“Zs”)に含まれるかどうかを判定する際、コード単位列は 6.1.4 で指定されるUTF-16符号化コードポイント列として解釈されます。

22.1.3.33 String.prototype.trimEnd ( )

このメソッドは、6.1.4 で説明されるように、String値をUTF-16符号化コードポイントの列として解釈します。

呼び出されたとき、次の手順を実行します:

  1. strthis値とする。
  2. TrimString(str, end) を返す。
Note

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.34 String.prototype.trimStart ( )

このメソッドは、6.1.4 で説明されるように、String値をUTF-16符号化コードポイントの列として解釈します。

呼び出されたとき、次の手順を実行します:

  1. strthis値とする。
  2. TrimString(str, start) を返す。
Note

このメソッドは意図的に汎用です。そのthis値がStringオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

22.1.3.35 String.prototype.valueOf ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. ThisStringValue(this値) を返す。

22.1.3.35.1 ThisStringValue ( value )

The abstract operation ThisStringValue takes argument value (ECMAScript言語値) and returns Stringを含む正常完了またはスロー完了. It performs the following steps when called:

  1. value がStringである場合、value を返す。
  2. value がObjectであり、value[[StringData]] 内部スロットを持つ場合、次を行う:
    1. strvalue.[[StringData]] とする。
    2. Assert: str はStringである。
    3. str を返す。
  3. TypeError 例外をスローする。

22.1.3.36 String.prototype [ %Symbol.iterator% ] ( )

このメソッドは、String値のコードポイントを反復し、各コードポイントをString値として返すイテレーターオブジェクトを返します。

呼び出されたとき、次の手順を実行します:

  1. strthis値とする。
  2. RequireObjectCoercible(str) を実行する。
  3. str を ? ToString(str) に設定する。
  4. closure を、パラメーターを持たず、str を捕捉し、呼び出されたときに次の手順を実行する新しいAbstract Closureとする:
    1. lenstr の長さとする。
    2. position を 0 とする。
    3. position < len の間、繰り返す:
      1. cpCodePointAt(str, position) とする。
      2. nextIndexposition + cp.[[CodeUnitCount]] とする。
      3. resultStringstrposition から nextIndex までの部分文字列とする。
      4. positionnextIndex に設定する。
      5. GeneratorYield(CreateIteratorResultObject(resultString, false)) を実行する。
    4. NormalCompletion(unused) を返す。
  5. CreateIteratorFromClosure(closure, "%StringIteratorPrototype%", %StringIteratorPrototype%) を返す。

このメソッドの"name"プロパティの値は "[Symbol.iterator]" です。

22.1.4 Stringインスタンスのプロパティ

StringインスタンスはString exotic objectであり、そのようなオブジェクトに指定された内部メソッドを持ちます。StringインスタンスはStringプロトタイプオブジェクトからプロパティを継承します。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%オブジェクトは以下の通りです:

  • すべてのString Iteratorオブジェクトによって継承されるプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]]内部スロットを持ち、その値は %Iterator.prototype% である。
  • 以下のプロパティを持つ:

22.1.5.1.1 %StringIteratorPrototype%.next ( )

  1. GeneratorResume(this value, empty, "%StringIteratorPrototype%") を返す。

22.1.5.1.2 %StringIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値はString値 "String Iterator" です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } です。

22.2 RegExp(正規表現)オブジェクト

RegExpオブジェクトは、正規表現および関連するフラグを含みます。

Note

正規表現の形式および機能は、Perl 5プログラミング言語における正規表現機能をモデルとしています。

22.2.1 パターン

RegExpコンストラクターは、入力パターン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 HexTrailSurrogate :: Hex4Digits but only if the MV of Hex4Digits is in the inclusive interval from 0xDC00 to 0xDFFF HexNonSurrogate :: Hex4Digits but only if the MV of Hex4Digits is not in the inclusive interval from 0xD800 to 0xDFFF IdentityEscape[UnicodeMode] :: [+UnicodeMode] SyntaxCharacter [+UnicodeMode] / [~UnicodeMode] SourceCharacter but not UnicodeIDContinue DecimalEscape :: NonZeroDigit DecimalDigits[~Sep]opt [lookahead ∉ DecimalDigit] CharacterClassEscape[UnicodeMode] :: d D s S w W [+UnicodeMode] p{ UnicodePropertyValueExpression } [+UnicodeMode] P{ UnicodePropertyValueExpression } UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue LoneUnicodePropertyNameOrValue UnicodePropertyName :: UnicodePropertyNameCharacters UnicodePropertyNameCharacters :: UnicodePropertyNameCharacter UnicodePropertyNameCharactersopt UnicodePropertyValue :: UnicodePropertyValueCharacters LoneUnicodePropertyNameOrValue :: UnicodePropertyValueCharacters UnicodePropertyValueCharacters :: UnicodePropertyValueCharacter UnicodePropertyValueCharactersopt UnicodePropertyValueCharacter :: UnicodePropertyNameCharacter DecimalDigit UnicodePropertyNameCharacter :: AsciiLetter _ CharacterClass[UnicodeMode, UnicodeSetsMode] :: [ [lookahead ≠ ^] ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] [^ ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] ClassContents[UnicodeMode, UnicodeSetsMode] :: [empty] [~UnicodeSetsMode] NonemptyClassRanges[?UnicodeMode] [+UnicodeSetsMode] ClassSetExpression NonemptyClassRanges[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtom[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtom[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] NonemptyClassRangesNoDash[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] ClassAtom[UnicodeMode] :: - ClassAtomNoDash[?UnicodeMode] ClassAtomNoDash[UnicodeMode] :: SourceCharacter but not one of \ or ] or - \ ClassEscape[?UnicodeMode] ClassEscape[UnicodeMode] :: b [+UnicodeMode] - CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode] ClassSetExpression :: ClassUnion ClassIntersection ClassSubtraction ClassUnion :: ClassSetRange ClassUnionopt ClassSetOperand ClassUnionopt ClassIntersection :: ClassSetOperand && [lookahead ≠ &] ClassSetOperand ClassIntersection && [lookahead ≠ &] ClassSetOperand ClassSubtraction :: ClassSetOperand -- ClassSetOperand ClassSubtraction -- ClassSetOperand ClassSetRange :: ClassSetCharacter - ClassSetCharacter ClassSetOperand :: NestedClass ClassStringDisjunction ClassSetCharacter NestedClass :: [ [lookahead ≠ ^] ClassContents[+UnicodeMode, +UnicodeSetsMode] ] [^ ClassContents[+UnicodeMode, +UnicodeSetsMode] ] \ CharacterClassEscape[+UnicodeMode] Note 1

ここでの最初の2行はCharacterClassと等価です。

ClassStringDisjunction :: \q{ ClassStringDisjunctionContents } ClassStringDisjunctionContents :: ClassString ClassString | ClassStringDisjunctionContents ClassString :: [empty] NonEmptyClassString NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt ClassSetCharacter :: [lookahead ∉ ClassSetReservedDoublePunctuator] SourceCharacter but not ClassSetSyntaxCharacter \ CharacterEscape[+UnicodeMode] \ ClassSetReservedPunctuator \b ClassSetReservedDoublePunctuator :: one of && !! ## $$ %% ** ++ ,, .. :: ;; << == >> ?? @@ ^^ `` ~~ ClassSetSyntaxCharacter :: one of ( ) [ ] { } / - \ | ClassSetReservedPunctuator :: one of & - ! # % , : ; < = > @ ` ~ Note 2

この節のいくつかの生成式には、B.1.2 の節で代替定義が与えられています。

22.2.1.1 Static Semantics: 早期エラー

Note

この節は B.1.2.1 で修正されます。

Pattern :: Disjunction QuantifierPrefix :: { DecimalDigits , DecimalDigits } Atom :: (? RegularExpressionModifiers : Disjunction )
  • RegularExpressionModifiers に一致したソーステキストが同じコードポイントを複数回含む場合、Syntax Errorです。
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
  • UnicodePropertyName に一致したソーステキストが、Table 64 の「Property name and aliases」列に列挙されているUnicodeプロパティ名またはプロパティ別名でない場合、Syntax Errorです。
  • UnicodePropertyValue に一致したソーステキストが、UnicodePropertyName に一致したソーステキストによって与えられるUnicodeプロパティまたはプロパティ別名について、PropertyValueAliases.txt に列挙されているプロパティ値またはプロパティ値別名でない場合、Syntax Errorです。
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  • LoneUnicodePropertyNameOrValue に一致したソーステキストが、PropertyValueAliases.txt に列挙されているGeneral_Category(gc)プロパティのUnicodeプロパティ値またはプロパティ値別名でも、Table 65 の「Property name and aliases」列に列挙されている二値プロパティまたは二値プロパティ別名でも、Table 66 の「Property name」列に列挙されている文字列の二値プロパティでもない場合、Syntax Errorです。
  • 囲んでいる Pattern[UnicodeSetsMode] パラメーターを持たず、かつ LoneUnicodePropertyNameOrValue に一致したソーステキストが Table 66 の「Property name」列に列挙されている文字列の二値プロパティである場合、Syntax Errorです。
CharacterClassEscape :: P{ UnicodePropertyValueExpression } CharacterClass :: [^ ClassContents ] NestedClass :: [^ ClassContents ] ClassSetRange :: ClassSetCharacter - ClassSetCharacter

22.2.1.2 Static Semantics: CountLeftCapturingParensWithin ( node )

The abstract operation CountLeftCapturingParensWithin takes argument node (Parse Node) and returns 非負整数. node 内の左キャプチャ括弧の数を返します。左キャプチャ括弧とは、 Atom :: ( GroupSpecifieropt Disjunction ) 生成式の ( 終端記号に一致する任意の ( パターン文字です。

Note

この節は B.1.2.2 で修正されます。

It performs the following steps when called:

  1. Assert: nodeRegExp Pattern文法 内の生成式のインスタンスである。
  2. node 内に含まれる Atom :: ( GroupSpecifieropt Disjunction ) Parse Nodeの数を返す。

22.2.1.3 Static Semantics: CountLeftCapturingParensBefore ( node )

The abstract operation CountLeftCapturingParensBefore takes argument node (Parse Node) and returns 非負整数. 囲んでいるパターン内で node の左に出現する左キャプチャ括弧の数を返します。

Note

この節は B.1.2.2 で修正されます。

It performs the following steps when called:

  1. Assert: nodeRegExp Pattern文法 内の生成式のインスタンスである。
  2. patternnode を含む Pattern とする。
  3. pattern 内に含まれ、node より前に出現するか、または node を含む Atom :: ( GroupSpecifieropt Disjunction ) Parse Nodeの数を返す。

22.2.1.4 Static Semantics: MightBothParticipate ( x, y )

The abstract operation MightBothParticipate takes arguments x (Parse Node) and y (Parse Node) and returns Boolean. It performs the following steps when called:

  1. Assert: xy は同じ囲み Pattern を持つ。
  2. 囲んでいる Pattern Disjunction :: Alternative | Disjunction Parse Nodeを含み、xAlternative 内に含まれ y が派生した Disjunction 内に含まれるか、または x が派生した Disjunction 内に含まれ yAlternative 内に含まれる場合、false を返す。
  3. true を返す。

22.2.1.5 Static Semantics: CapturingGroupNumber

The syntax-directed operation CapturingGroupNumber takes no arguments and returns 正整数.

Note

この節は B.1.2.1 で修正されます。

It is defined piecewise over the following productions:

DecimalEscape :: NonZeroDigit
  1. NonZeroDigit のMVを返す。
DecimalEscape :: NonZeroDigit DecimalDigits
  1. nDecimalDigits 内のコードポイント数とする。
  2. NonZeroDigit のMV × 10nDecimalDigits のMVを加えたもの)を返す。

NonZeroDigit のMV」および「DecimalDigits のMV」の定義は 12.9.3 にあります。

22.2.1.6 Static Semantics: IsCharacterClass

The syntax-directed operation IsCharacterClass takes no arguments and returns Boolean.

Note

この節は B.1.2.3 で修正されます。

It is defined piecewise over the following productions:

ClassAtom :: - ClassAtomNoDash :: SourceCharacter but not one of \ or ] or - ClassEscape :: b - CharacterEscape
  1. false を返す。
ClassEscape :: CharacterClassEscape
  1. true を返す。

22.2.1.7 Static Semantics: CharacterValue

The syntax-directed operation CharacterValue takes no arguments and returns 非負整数.

Note 1

この節は B.1.2.4 で修正されます。

It is defined piecewise over the following productions:

ClassAtom :: -
  1. U+002D(HYPHEN-MINUS)の数値を返す。
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
  1. chSourceCharacter に一致したコードポイントとする。
  2. ch の数値を返す。
ClassEscape :: b
  1. U+0008(BACKSPACE)の数値を返す。
ClassEscape :: -
  1. U+002D(HYPHEN-MINUS)の数値を返す。
CharacterEscape :: ControlEscape
  1. Table 62 に従う数値を返す。
Table 62: 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
  1. chAsciiLetter に一致したコードポイントとする。
  2. ich の数値とする。
  3. i を32で割った余りを返す。
CharacterEscape :: 0 [lookahead ∉ DecimalDigit]
  1. U+0000(NULL)の数値を返す。
Note 2

\0 は <NUL> 文字を表し、10進数字を後続させることはできません。

CharacterEscape :: HexEscapeSequence
  1. HexEscapeSequence のMVを返す。
RegExpUnicodeEscapeSequence :: u HexLeadSurrogate \u HexTrailSurrogate
  1. leadHexLeadSurrogateCharacterValueとする。
  2. trailHexTrailSurrogateCharacterValueとする。
  3. cpUTF16SurrogatePairToCodePoint(lead, trail) とする。
  4. cp の数値を返す。
RegExpUnicodeEscapeSequence :: u Hex4Digits
  1. Hex4Digits のMVを返す。
RegExpUnicodeEscapeSequence :: u{ CodePoint }
  1. CodePoint のMVを返す。
HexLeadSurrogate :: Hex4Digits HexTrailSurrogate :: Hex4Digits HexNonSurrogate :: Hex4Digits
  1. Hex4Digits のMVを返す。
CharacterEscape :: IdentityEscape
  1. chIdentityEscape に一致したコードポイントとする。
  2. ch の数値を返す。
ClassSetCharacter :: SourceCharacter but not ClassSetSyntaxCharacter
  1. chSourceCharacter に一致したコードポイントとする。
  2. ch の数値を返す。
ClassSetCharacter :: \ ClassSetReservedPunctuator
  1. chClassSetReservedPunctuator に一致したコードポイントとする。
  2. ch の数値を返す。
ClassSetCharacter :: \b
  1. U+0008(BACKSPACE)の数値を返す。

22.2.1.8 Static Semantics: MayContainStrings

The syntax-directed operation MayContainStrings takes no arguments and returns Boolean. It is defined piecewise over the following productions:

CharacterClassEscape :: d D s S w W P{ UnicodePropertyValueExpression } UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue NestedClass :: [^ ClassContents ] ClassContents :: [empty] NonemptyClassRanges ClassSetOperand :: ClassSetCharacter
  1. false を返す。
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  1. LoneUnicodePropertyNameOrValue に一致したソーステキストが Table 66 の「Property name」列に列挙されている文字列の二値プロパティである場合、true を返す。
  2. false を返す。
ClassUnion :: ClassSetRange ClassUnionopt
  1. ClassUnion が存在する場合、ClassUnionMayContainStringsを返す。
  2. false を返す。
ClassUnion :: ClassSetOperand ClassUnionopt
  1. ClassSetOperandMayContainStringstrue である場合、true を返す。
  2. ClassUnion が存在する場合、ClassUnionMayContainStringsを返す。
  3. false を返す。
ClassIntersection :: ClassSetOperand && ClassSetOperand
  1. 最初の ClassSetOperandMayContainStringsfalse である場合、false を返す。
  2. 2番目の ClassSetOperandMayContainStringsfalse である場合、false を返す。
  3. true を返す。
ClassIntersection :: ClassIntersection && ClassSetOperand
  1. ClassIntersectionMayContainStringsfalse である場合、false を返す。
  2. ClassSetOperandMayContainStringsfalse である場合、false を返す。
  3. true を返す。
ClassSubtraction :: ClassSetOperand -- ClassSetOperand
  1. 最初の ClassSetOperandMayContainStringsを返す。
ClassSubtraction :: ClassSubtraction -- ClassSetOperand
  1. ClassSubtractionMayContainStringsを返す。
ClassStringDisjunctionContents :: ClassString | ClassStringDisjunctionContents
  1. ClassStringMayContainStringstrue である場合、true を返す。
  2. ClassStringDisjunctionContentsMayContainStringsを返す。
ClassString :: [empty]
  1. true を返す。
ClassString :: NonEmptyClassString
  1. NonEmptyClassStringMayContainStringsを返す。
NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt
  1. NonEmptyClassString が存在する場合、true を返す。
  2. false を返す。

22.2.1.9 Static Semantics: GroupSpecifiersThatMatch ( thisGroupName )

The abstract operation GroupSpecifiersThatMatch takes argument thisGroupName (GroupName Parse Node) and returns GroupSpecifier Parse NodeList. It performs the following steps when called:

  1. namethisGroupNameCapturingGroupNameとする。
  2. patternthisGroupName を含む Pattern とする。
  3. result を新しい空のListとする。
  4. pattern が含む各 GroupSpecifier gs について、次を行う:
    1. gsCapturingGroupNamename である場合、次を行う:
      1. gsresult に追加する。
  5. result を返す。

22.2.1.10 Static Semantics: CapturingGroupName

The syntax-directed operation CapturingGroupName takes no arguments and returns String. It is defined piecewise over the following productions:

GroupName :: < RegExpIdentifierName >
  1. idTextUnescapedRegExpIdentifierNameRegExpIdentifierCodePointsとする。
  2. CodePointsToString(idTextUnescaped) を返す。

22.2.1.11 Static Semantics: RegExpIdentifierCodePoints

The syntax-directed operation RegExpIdentifierCodePoints takes no arguments and returns コードポイントのList. It is defined piecewise over the following productions:

RegExpIdentifierName :: RegExpIdentifierStart
  1. cpRegExpIdentifierStartRegExpIdentifierCodePointとする。
  2. « cp » を返す。
RegExpIdentifierName :: RegExpIdentifierName RegExpIdentifierPart
  1. cps を派生した RegExpIdentifierNameRegExpIdentifierCodePointsとする。
  2. cpRegExpIdentifierPartRegExpIdentifierCodePointとする。
  3. cps と « cp » のリスト連結を返す。

22.2.1.12 Static Semantics: RegExpIdentifierCodePoint

The syntax-directed operation RegExpIdentifierCodePoint takes no arguments and returns コードポイント. It is defined piecewise over the following productions:

RegExpIdentifierStart :: IdentifierStartChar
  1. IdentifierStartChar に一致したコードポイントを返す。
RegExpIdentifierPart :: IdentifierPartChar
  1. IdentifierPartChar に一致したコードポイントを返す。
RegExpIdentifierStart :: \ RegExpUnicodeEscapeSequence RegExpIdentifierPart :: \ RegExpUnicodeEscapeSequence
  1. 数値が RegExpUnicodeEscapeSequenceCharacterValueであるコードポイントを返す。
RegExpIdentifierStart :: UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart :: UnicodeLeadSurrogate UnicodeTrailSurrogate
  1. lead を、数値が UnicodeLeadSurrogate に一致したコードポイントの数値であるコード単位とする。
  2. trail を、数値が UnicodeTrailSurrogate に一致したコードポイントの数値であるコード単位とする。
  3. UTF16SurrogatePairToCodePoint(lead, trail) を返す。

22.2.2 パターン意味論

正規表現パターンは、以下で説明されるプロセスを用いてAbstract Closureに変換されます。結果が同じである限り、実装は以下に列挙されたものより効率的なアルゴリズムを使用することが推奨されます。Abstract ClosureはRegExpオブジェクトの[[RegExpMatcher]]内部スロットの値として使用されます。

Pattern は、関連付けられたフラグが uv も含まない場合、BMPパターンです。それ以外の場合はUnicodeパターンです。BMPパターンは、Basic Multilingual Planeの範囲内のUnicodeコードポイントである16ビット値の列から成るものとして解釈されるStringに対してマッチします。Unicodeパターンは、UTF-16を用いて符号化されたUnicodeコードポイントから成るものとして解釈されるStringに対してマッチします。BMPパターンの動作を説明する文脈では、“character”は単一の16ビットUnicode BMPコードポイントを意味します。Unicodeパターンの動作を説明する文脈では、“character”はUTF-16符号化コードポイント(6.1.4)を意味します。いずれの文脈でも、“character value”は対応する非符号化コードポイントの数値を意味します。

Pattern の構文および意味論は、Pattern のソーステキストが SourceCharacter 値のListであり、各 SourceCharacter がUnicodeコードポイントに対応するものとして定義されます。BMPパターンが非BMP SourceCharacter を含む場合、パターン全体がUTF-16を用いて符号化され、その符号化の個々のコード単位がListの要素として使用されます。

Note

例えば、単一の非BMP文字 U+1D11E(MUSICAL SYMBOL G CLEF)としてソーステキスト内に表現されたパターンを考えます。Unicodeパターンとして解釈される場合、それは単一のコードポイント U+1D11E から成る単一要素(character)のListになります。しかし、BMPパターンとして解釈される場合、まずUTF-16で符号化され、コード単位 0xD834 と 0xDD1E から成る2要素のListが生成されます。

パターンはECMAScript String値としてRegExpコンストラクターに渡され、その中では非BMP文字はUTF-16で符号化されています。例えば、String値として表現された単一文字MUSICAL SYMBOL G CLEFパターンは、要素がコード単位 0xD834 および 0xDD1E である長さ2のStringです。したがって、2つのパターン文字から成るBMPパターンとして処理するためには、その文字列をさらに変換する必要はありません。しかし、Unicodeパターンとして処理するには、唯一の要素が単一のパターン文字、すなわちコードポイント U+1D11E であるListを生成する際に UTF16SurrogatePairToCodePoint を使用しなければなりません。

実装は実際にこのようなUTF-16への、またはUTF-16からの変換を行わない場合がありますが、この仕様の意味論は、パターンマッチングの結果がそのような変換が行われたかのようであることを要求します。

22.2.2.1 表記

以下の説明では、次の内部データ構造を使用します:

  • CharSetElement は、次の2つの実体のいずれかです:
    • regexpRecord.[[UnicodeSets]]false の場合、CharSetElementは上記のパターン意味論における意味でのcharacterです。
    • regexpRecord.[[UnicodeSets]]true の場合、CharSetElementは、上記のパターン意味論における意味でのcharacterを要素とする列です。これには、空列、1つのcharacterから成る列、および複数のcharacterから成る列が含まれます。便宜上、この種類のCharSetElementを扱う際、個々のcharacterは1つのcharacterから成る列と相互に置き換えて扱われます。
  • CharSet は、CharSetElementの数学的集合です。
  • CaptureRange は、キャプチャに含まれるcharacterの範囲を表すRecord { [[StartIndex]], [[EndIndex]] } です。ここで、[[StartIndex]]input 内の範囲の開始インデックス(包含)を表す整数であり、[[EndIndex]]input 内の範囲の終了インデックス(排他)を表す整数です。任意のCaptureRangeについて、これらのインデックスは [[StartIndex]][[EndIndex]] という不変条件を満たさなければなりません。
  • MatchStateRecord { [[Input]], [[EndIndex]], [[Captures]] } であり、[[Input]]はマッチ対象のStringを表すcharacterのList[[EndIndex]]は整数、[[Captures]]はパターン内の各左キャプチャ括弧に1つずつ対応する値のListです。MatchStateは、正規表現マッチングアルゴリズムにおける部分的なマッチ状態を表すために使用されます。[[EndIndex]]は、パターンによってこれまでにマッチされた最後の入力characterのインデックスに1を加えたものです。一方、[[Captures]]はキャプチャ括弧の結果を保持します。[[Captures]]n番目 の要素は、n番目 のキャプチャ括弧集合によってキャプチャされたcharacterの範囲を表すCaptureRange、または n番目 のキャプチャ括弧集合にまだ到達していない場合は undefined です。バックトラッキングにより、マッチング処理中の任意の時点で多数のMatchStateが使用される場合があります。
  • MatcherContinuation は、1つのMatchState引数を取り、MatchStateまたは failure のいずれかを返すAbstract Closureです。MatcherContinuationは、MatchState引数によって与えられた中間状態から開始して、パターンの残りの部分(クロージャーの捕捉値によって指定される)を input に対してマッチさせようとします。マッチに成功した場合、MatcherContinuationは到達した最終的なMatchStateを返します。マッチに失敗した場合、MatcherContinuationfailure を返します。
  • Matcher は、MatchStateMatcherContinuationという2つの引数を取り、MatchStateまたは failure のいずれかを返すAbstract Closureです。Matcherは、パターンの中間部分パターン(クロージャーの捕捉値によって指定される)を、MatchState引数によって与えられた中間状態から開始して、MatchState[[Input]]に対してマッチさせようとします。MatcherContinuation引数は、パターンの残りをマッチさせるクロージャーであるべきです。パターンの部分パターンをマッチさせて新しいMatchStateを得た後、Matcherはその新しいMatchStateに対してMatcherContinuationを呼び出し、パターンの残りもマッチできるかどうかをテストします。可能であれば、MatcherMatcherContinuationが返したMatchStateを返します。不可能であれば、Matcherは選択点で異なる選択を試み、成功するかすべての可能性が尽きるまでMatcherContinuationを繰り返し呼び出す場合があります。

22.2.2.1.1 RegExp Record

RegExp Record は、コンパイル中および場合によってはマッチング中に必要となるRegExpに関する情報を格納するために使用されるRecord値です。

これは以下のフィールドを持ちます:

Table 63: RegExp Record Fields
フィールド名 意味
[[IgnoreCase]] Boolean RegExpのフラグに "i" が現れるかどうかを示す
[[Multiline]] Boolean RegExpのフラグに "m" が現れるかどうかを示す
[[DotAll]] Boolean RegExpのフラグに "s" が現れるかどうかを示す
[[Unicode]] Boolean RegExpのフラグに "u" が現れるかどうかを示す
[[UnicodeSets]] Boolean RegExpのフラグに "v" が現れるかどうかを示す
[[CapturingGroupsCount]] 非負整数 RegExpのパターン内の左キャプチャ括弧の数

22.2.2.2 Runtime Semantics: CompilePattern

The syntax-directed operation CompilePattern takes argument regexpRecord (RegExp Record) and returns characterのListと非負整数を取り、MatchStateまたは failure のいずれかを返すAbstract Closure. It is defined piecewise over the following productions:

Pattern :: Disjunction
  1. m を、引数 regexpRecord および forward での DisjunctionCompileSubpattern とする。
  2. regexpRecordm を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (input, index) を持つ新しいAbstract Closureを返す:
    1. Assert: input はcharacterのListである。
    2. Assert: 0 ≤ indexinput 内の要素数。
    3. c を、何も捕捉せず、呼び出されたときに次の手順を実行する、パラメーター (y) を持つ新しいMatcherContinuationとする:
      1. Assert: yMatchStateである。
      2. y を返す。
    4. cap を、1から regexpRecord.[[CapturingGroupsCount]] までで添字付けされた、regexpRecord.[[CapturingGroupsCount]] 個の undefined 値から成るListとする。
    5. xMatchState { [[Input]]: input, [[EndIndex]]: index, [[Captures]]: cap } とする。
    6. m(x, c) を返す。
Note

PatternはAbstract Closure値へコンパイルされます。その後RegExpBuiltinExecは、この手続きをcharacterのListおよびそのList内のオフセットに適用し、パターンがList内のまさにそのオフセットから開始してマッチするかどうか、およびマッチする場合にキャプチャ括弧の値が何になるかを判定できます。22.2.2 のアルゴリズムは、パターンのコンパイルが SyntaxError 例外をスローし得るように設計されています。一方で、パターンがいったん正常にコンパイルされると、結果のAbstract ClosureをcharacterのList内のマッチ探索に適用することは例外をスローできません(メモリ不足など、どこでも発生し得る実装定義の例外を除く)。

22.2.2.3 Runtime Semantics: CompileSubpattern

The syntax-directed operation CompileSubpattern takes arguments regexpRecord (RegExp Record) and direction (forward または backward) and returns Matcher.

Note 1

この節は B.1.2.5 で修正されます。

It is defined piecewise over the following productions:

Disjunction :: Alternative | Disjunction
  1. m1 を、引数 regexpRecord および direction での AlternativeCompileSubpattern とする。
  2. m2 を、引数 regexpRecord および direction での DisjunctionCompileSubpattern とする。
  3. MatchTwoAlternatives(m1, m2) を返す。
Note 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]
  1. EmptyMatcher() を返す。
Alternative :: Alternative Term
  1. m1 を、引数 regexpRecord および direction での AlternativeCompileSubpattern とする。
  2. m2 を、引数 regexpRecord および direction での TermCompileSubpattern とする。
  3. MatchSequence(m1, m2, direction) を返す。
Note 3

連続する Term は、input の連続する部分を同時にマッチしようとします。directionforward の場合、左の Alternative、右の Term、および正規表現の後続部分のすべてが選択点を持つなら、右の Term の次の選択へ進む前に後続部分のすべての選択が試され、左の Alternative の次の選択へ進む前に右の Term のすべての選択が試されます。directionbackward の場合、AlternativeTerm の評価順序は逆になります。

Term :: Assertion
  1. 引数 regexpRecord での AssertionCompileAssertion を返す。
Note 4

結果のMatcherdirection に依存しません。

Term :: Atom
  1. 引数 regexpRecord および direction での AtomCompileAtom を返す。
Term :: Atom Quantifier
  1. m を、引数 regexpRecord および direction での AtomCompileAtom とする。
  2. qQuantifierCompileQuantifier とする。
  3. Assert: q.[[Min]]q.[[Max]]
  4. parenIndexCountLeftCapturingParensBefore(Term) とする。
  5. parenCountCountLeftCapturingParensWithin(Atom) とする。
  6. mqparenIndex、および parenCount を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (x, c) を持つ新しいMatcherを返す:
    1. Assert: xMatchStateである。
    2. Assert: cMatcherContinuationである。
    3. 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 )

The abstract operation RepeatMatcher takes arguments m (Matcher), min (非負整数), max (非負整数または +∞), greedy (Boolean), matchState (MatchState), continue (MatcherContinuation), parenIndex (非負整数), and parenCount (非負整数) and returns MatchStateまたは failure. It performs the following steps when called:

  1. max = 0 の場合、continue(matchState) を返す。
  2. d を、mminmaxgreedymatchStatecontinueparenIndex、および parenCount を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (y) を持つ新しいMatcherContinuationとする:
    1. Assert: yMatchStateである。
    2. min = 0 かつ y.[[EndIndex]] = matchState.[[EndIndex]] の場合、failure を返す。
    3. min = 0 の場合、min2 を 0 とする。そうでない場合、min2min - 1 とする。
    4. max = +∞ の場合、max2 を +∞ とする。そうでない場合、max2max - 1 とする。
    5. RepeatMatcher(m, min2, max2, greedy, y, continue, parenIndex, parenCount) を返す。
  3. capmatchState.[[Captures]] のコピーとする。
  4. parenIndex + 1 から parenIndex + parenCount までの包含区間内の各整数 k について、cap[k] を undefined に設定する。
  5. inputmatchState.[[Input]] とする。
  6. ematchState.[[EndIndex]] とする。
  7. xrMatchState { [[Input]]: input, [[EndIndex]]: e, [[Captures]]: cap } とする。
  8. min ≠ 0 の場合、m(xr, d) を返す。
  9. greedyfalse の場合、次を行う:
    1. zcontinue(matchState) とする。
    2. zfailure でない場合、z を返す。
    3. m(xr, d) を返す。
  10. zm(xr, d) とする。
  11. zfailure でない場合、z を返す。
  12. continue(matchState) を返す。
Note 1

Quantifier が後続する Atom は、Quantifier によって指定された回数だけ繰り返されます。Quantifier は非貪欲であることができ、その場合 Atom パターンは後続部分にマッチしつつ可能な限り少ない回数だけ繰り返されます。また貪欲であることもでき、その場合 Atom パターンは後続部分にマッチしつつ可能な限り多い回数だけ繰り返されます。繰り返されるのは、マッチした入力character列ではなく Atom パターンであるため、Atom の異なる繰り返しは異なる入力部分文字列にマッチできます。

Note 2

Atom と正規表現の後続部分のすべてが選択点を持つ場合、Atom はまず可能な限り多く(非貪欲なら可能な限り少なく)マッチされます。Atom の最後の繰り返しにおける次の選択へ進む前に、後続部分のすべての選択が試されます。Atom の最後(n番目)の繰り返しにおけるすべての選択は、Atom の最後から2番目(n - 1)番目の繰り返しにおける次の選択へ進む前に試されます。その時点で、Atom のより多い、またはより少ない繰り返しが今や可能であることが判明する場合があります。これらが(再び、可能な限り少ないか多いかのどちらかから始めて)尽くされてから、Atom の(n - 1)番目の繰り返しにおける次の選択へ進み、以下同様です。

次を比較してください:

/a[a-z]{2,4}/.exec("abcdefghi")

これは "abcde" を返しますが、

/a[a-z]{2,4}?/.exec("abcdefghi")

これは "abc" を返します。

また次も考えてください:

/(aa|aabaac|ba|b|c)*/.exec("aabaac")

これは、上記の選択点の順序により、次の配列を返し、

["aaba", "ba"]

次のいずれも返しません:

["aabaac", "aabaac"]
["aabaac", "c"]

上記の選択点の順序は、2つの数(単項表記で表される)の最大公約数を計算する正規表現を書くために使用できます。次の例は10と15のgcdを計算します:

"aaaaaaaaaa,aaaaaaaaaaaaaaa".replace(/^(a+)\1*,\1+$/, "$1")

これは単項表記でgcd "aaaaa" を返します。

Note 3

RepeatMatcherのステップ 4 は、Atom が繰り返されるたびに Atom のキャプチャをクリアします。この挙動は次の正規表現で確認できます。

/(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が含まれるためです。

Note 4

RepeatMatcherのステップ 2.b は、最小繰り返し数が満たされた後、空のcharacter列にマッチする Atom のさらなる展開は、追加の繰り返しとして考慮されないことを述べています。これにより、正規表現エンジンが次のようなパターンで無限ループに陥ることを防ぎます:

/(a*)*/.exec("b")

または少し複雑な次のもの:

/(a*)b\1+/.exec("baaaac")

これは次の配列を返します:

["b", ""]

22.2.2.3.2 EmptyMatcher ( )

The abstract operation EmptyMatcher takes no arguments and returns Matcher. It performs the following steps when called:

  1. 何も捕捉せず、呼び出されたときに次の手順を実行する、パラメーター (matchState, continue) を持つ新しいMatcherを返す:
    1. Assert: matchStateMatchStateである。
    2. Assert: continueMatcherContinuationである。
    3. continue(matchState) を返す。

22.2.2.3.3 MatchTwoAlternatives ( m1, m2 )

The abstract operation MatchTwoAlternatives takes arguments m1 (Matcher) and m2 (Matcher) and returns Matcher. It performs the following steps when called:

  1. m1m2 を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (matchState, continue) を持つ新しいMatcherを返す:
    1. Assert: matchStateMatchStateである。
    2. Assert: continueMatcherContinuationである。
    3. rm1(matchState, continue) とする。
    4. rfailure でない場合、r を返す。
    5. m2(matchState, continue) を返す。

22.2.2.3.4 MatchSequence ( m1, m2, direction )

The abstract operation MatchSequence takes arguments m1 (Matcher), m2 (Matcher), and direction (forward または backward) and returns Matcher. It performs the following steps when called:

  1. directionforward の場合、次を行う:
    1. m1m2 を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (matchState, continue) を持つ新しいMatcherを返す:
      1. Assert: matchStateMatchStateである。
      2. Assert: continueMatcherContinuationである。
      3. d を、continuem2 を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (y) を持つ新しいMatcherContinuationとする:
        1. Assert: yMatchStateである。
        2. m2(y, continue) を返す。
      4. m1(matchState, d) を返す。
  2. Assert: directionbackward である。
  3. m1m2 を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (matchState, continue) を持つ新しいMatcherを返す:
    1. Assert: matchStateMatchStateである。
    2. Assert: continueMatcherContinuationである。
    3. d を、continuem1 を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (y) を持つ新しいMatcherContinuationとする:
      1. Assert: yMatchStateである。
      2. m1(y, continue) を返す。
    4. m2(matchState, d) を返す。

22.2.2.4 Runtime Semantics: CompileAssertion

The syntax-directed operation CompileAssertion takes argument regexpRecord (RegExp Record) and returns Matcher.

Note 1

この節は B.1.2.6 で修正されます。

It is defined piecewise over the following productions:

Assertion :: ^
  1. regexpRecord を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (matchState, continue) を持つ新しいMatcherを返す:
    1. Assert: matchStateMatchStateである。
    2. Assert: continueMatcherContinuationである。
    3. inputmatchState.[[Input]] とする。
    4. ematchState.[[EndIndex]] とする。
    5. e = 0 であるか、または regexpRecord.[[Multiline]]true でありcharacter input[e - 1] が LineTerminator によってマッチされる場合、次を行う:
      1. continue(matchState) を返す。
    6. failure を返す。
Note 2

パターンで y フラグが使用されている場合でも、^ は常に input の先頭、または(regexpRecord.[[Multiline]]true の場合)行の先頭にのみマッチします。

Assertion :: $
  1. regexpRecord を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (matchState, continue) を持つ新しいMatcherを返す:
    1. Assert: matchStateMatchStateである。
    2. Assert: continueMatcherContinuationである。
    3. inputmatchState.[[Input]] とする。
    4. ematchState.[[EndIndex]] とする。
    5. inputLengthinput 内の要素数とする。
    6. e = inputLength であるか、または regexpRecord.[[Multiline]]true でありcharacter input[e] が LineTerminator によってマッチされる場合、次を行う:
      1. continue(matchState) を返す。
    7. failure を返す。
Assertion :: \b
  1. regexpRecord を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (matchState, continue) を持つ新しいMatcherを返す:
    1. Assert: matchStateMatchStateである。
    2. Assert: continueMatcherContinuationである。
    3. inputmatchState.[[Input]] とする。
    4. ematchState.[[EndIndex]] とする。
    5. aIsWordChar(regexpRecord, input, e - 1) とする。
    6. bIsWordChar(regexpRecord, input, e) とする。
    7. atrue かつ bfalse である場合、または afalse かつ btrue である場合、continue(matchState) を返す。
    8. failure を返す。
Assertion :: \B
  1. regexpRecord を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (matchState, continue) を持つ新しいMatcherを返す:
    1. Assert: matchStateMatchStateである。
    2. Assert: continueMatcherContinuationである。
    3. inputmatchState.[[Input]] とする。
    4. ematchState.[[EndIndex]] とする。
    5. aIsWordChar(regexpRecord, input, e - 1) とする。
    6. bIsWordChar(regexpRecord, input, e) とする。
    7. atrue かつ btrue である場合、または afalse かつ bfalse である場合、continue(matchState) を返す。
    8. failure を返す。
Assertion :: (?= Disjunction )
  1. m を、引数 regexpRecord および forward での DisjunctionCompileSubpattern とする。
  2. m を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (matchState, continue) を持つ新しいMatcherを返す:
    1. Assert: matchStateMatchStateである。
    2. Assert: continueMatcherContinuationである。
    3. d を、何も捕捉せず、呼び出されたときに次の手順を実行する、パラメーター (y) を持つ新しいMatcherContinuationとする:
      1. Assert: yMatchStateである。
      2. y を返す。
    4. rm(matchState, d) とする。
    5. rfailure である場合、failure を返す。
    6. Assert: rMatchStateである。
    7. capr.[[Captures]] とする。
    8. inputmatchState.[[Input]] とする。
    9. xematchState.[[EndIndex]] とする。
    10. zMatchState { [[Input]]: input, [[EndIndex]]: xe, [[Captures]]: cap } とする。
    11. continue(z) を返す。
Note 3

形式 (?= Disjunction ) はゼロ幅の肯定先読みを指定します。これが成功するためには、Disjunction 内のパターンが現在位置でマッチしなければなりませんが、後続部分をマッチする前に現在位置は進められません。Disjunction が現在位置で複数の方法でマッチできる場合、最初のものだけが試されます。他の正規表現演算子とは異なり、(?= 形式へのバックトラッキングはありません(この通常とは異なる挙動はPerlから継承されています)。これは、Disjunction がキャプチャ括弧を含み、パターンの後続部分がそれらのキャプチャへの後方参照を含む場合にのみ問題になります。

例えば、

/(?=(a+))/.exec("baaabac")

は最初の b の直後の空Stringにマッチし、そのため次の配列を返します:

["", "aaa"]

先読みへのバックトラッキングが存在しないことを示すため、次を考えてください:

/(?=(a+))a*b\1/.exec("baaabac")

この式は次を返し、

["aba", "a"]

次は返しません:

["aaaba", "a"]
Assertion :: (?! Disjunction )
  1. m を、引数 regexpRecord および forward での DisjunctionCompileSubpattern とする。
  2. m を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (matchState, continue) を持つ新しいMatcherを返す:
    1. Assert: matchStateMatchStateである。
    2. Assert: continueMatcherContinuationである。
    3. d を、何も捕捉せず、呼び出されたときに次の手順を実行する、パラメーター (y) を持つ新しいMatcherContinuationとする:
      1. Assert: yMatchStateである。
      2. y を返す。
    4. rm(matchState, d) とする。
    5. rfailure でない場合、failure を返す。
    6. continue(matchState) を返す。
Note 4

形式 (?! Disjunction ) はゼロ幅の否定先読みを指定します。これが成功するためには、Disjunction 内のパターンが現在位置でマッチに失敗しなければなりません。後続部分をマッチする前に現在位置は進められません。Disjunction はキャプチャ括弧を含むことができますが、それらへの後方参照は Disjunction 自体の内部からのみ意味を持ちます。パターン内の他の場所からこれらのキャプチャ括弧への後方参照は、否定先読みがパターン成功のためには失敗しなければならないため、常に undefined を返します。例えば、

/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")

は、正の数 n 個の ab、別の n 個の a(最初の \2 で指定される)、および c が直後に続かない a を探します。2番目の \2 は否定先読みの外側にあるため、undefined に対してマッチし、そのため常に成功します。式全体は次の配列を返します:

["baaabaac", "ba", undefined, "abaac"]
Assertion :: (?<= Disjunction )
  1. m を、引数 regexpRecord および backward での DisjunctionCompileSubpattern とする。
  2. m を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (matchState, continue) を持つ新しいMatcherを返す:
    1. Assert: matchStateMatchStateである。
    2. Assert: continueMatcherContinuationである。
    3. d を、何も捕捉せず、呼び出されたときに次の手順を実行する、パラメーター (y) を持つ新しいMatcherContinuationとする:
      1. Assert: yMatchStateである。
      2. y を返す。
    4. rm(matchState, d) とする。
    5. rfailure である場合、failure を返す。
    6. Assert: rMatchStateである。
    7. capr.[[Captures]] とする。
    8. inputmatchState.[[Input]] とする。
    9. xematchState.[[EndIndex]] とする。
    10. zMatchState { [[Input]]: input, [[EndIndex]]: xe, [[Captures]]: cap } とする。
    11. continue(z) を返す。
Assertion :: (?<! Disjunction )
  1. m を、引数 regexpRecord および backward での DisjunctionCompileSubpattern とする。
  2. m を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (matchState, continue) を持つ新しいMatcherを返す:
    1. Assert: matchStateMatchStateである。
    2. Assert: continueMatcherContinuationである。
    3. d を、何も捕捉せず、呼び出されたときに次の手順を実行する、パラメーター (y) を持つ新しいMatcherContinuationとする:
      1. Assert: yMatchStateである。
      2. y を返す。
    4. rm(matchState, d) とする。
    5. rfailure でない場合、failure を返す。
    6. continue(matchState) を返す。

22.2.2.4.1 IsWordChar ( regexpRecord, input, e )

The abstract operation IsWordChar takes arguments regexpRecord (RegExp Record), input (characterのList), and e (整数) and returns Boolean. It performs the following steps when called:

  1. inputLengthinput 内の要素数とする。
  2. e = -1 または e = inputLength の場合、false を返す。
  3. c をcharacter input[e] とする。
  4. WordCharacters(regexpRecord) が c を含む場合、true を返す。
  5. false を返す。

22.2.2.5 Runtime Semantics: CompileQuantifier

The syntax-directed operation CompileQuantifier takes no arguments and returns フィールド [[Min]](非負整数)、[[Max]](非負整数または +∞)、および [[Greedy]](Boolean)を持つRecord. It is defined piecewise over the following productions:

Quantifier :: QuantifierPrefix
  1. qpQuantifierPrefixCompileQuantifierPrefix とする。
  2. Record { [[Min]]: qp.[[Min]], [[Max]]: qp.[[Max]], [[Greedy]]: true } を返す。
Quantifier :: QuantifierPrefix ?
  1. qpQuantifierPrefixCompileQuantifierPrefix とする。
  2. Record { [[Min]]: qp.[[Min]], [[Max]]: qp.[[Max]], [[Greedy]]: false } を返す。

22.2.2.6 Runtime Semantics: CompileQuantifierPrefix

The syntax-directed operation CompileQuantifierPrefix takes no arguments and returns フィールド [[Min]](非負整数)および [[Max]](非負整数または +∞)を持つRecord. It is defined piecewise over the following productions:

QuantifierPrefix :: *
  1. Record { [[Min]]: 0, [[Max]]: +∞ } を返す。
QuantifierPrefix :: +
  1. Record { [[Min]]: 1, [[Max]]: +∞ } を返す。
QuantifierPrefix :: ?
  1. Record { [[Min]]: 0, [[Max]]: 1 } を返す。
QuantifierPrefix :: { DecimalDigits }
  1. iDecimalDigits のMV(12.9.3 を参照)とする。
  2. Record { [[Min]]: i, [[Max]]: i } を返す。
QuantifierPrefix :: { DecimalDigits ,}
  1. iDecimalDigits のMVとする。
  2. Record { [[Min]]: i, [[Max]]: +∞ } を返す。
QuantifierPrefix :: { DecimalDigits , DecimalDigits }
  1. i を最初の DecimalDigits のMVとする。
  2. j を2番目の DecimalDigits のMVとする。
  3. Record { [[Min]]: i, [[Max]]: j } を返す。

22.2.2.7 Runtime Semantics: CompileAtom

The syntax-directed operation CompileAtom takes arguments regexpRecord (RegExp Record) and direction (forward または backward) and returns Matcher.

Note 1

この節は B.1.2.7 で修正されます。

It is defined piecewise over the following productions:

Atom :: PatternCharacter
  1. chPatternCharacter に一致したcharacterとする。
  2. charSet をcharacter ch を含む1要素のCharSetとする。
  3. CharacterSetMatcher(regexpRecord, charSet, false, direction) を返す。
Atom :: .
  1. charSetAllCharacters(regexpRecord) とする。
  2. regexpRecord.[[DotAll]]true でない場合、次を行う:
    1. LineTerminator 生成式の右辺のコードポイントに対応するすべてのcharacterを charSet から除去する。
  3. CharacterSetMatcher(regexpRecord, charSet, false, direction) を返す。
Atom :: CharacterClass
  1. cc を、引数 regexpRecord での CharacterClassCompileCharacterClass とする。
  2. cscc.[[CharSet]] とする。
  3. regexpRecord.[[UnicodeSets]]false であるか、または cs のすべてのCharSetElementが単一のcharacterから成る場合(cs が空の場合を含む)、CharacterSetMatcher(regexpRecord, cs, cc.[[Invert]], direction) を返す。
  4. Assert: cc.[[Invert]]false である。
  5. lm を空のMatcherListとする。
  6. 複数のcharacterを含む cs 内の各CharSetElement s について、長さの降順に反復して、次を行う:
    1. cs2s の最後のコードポイントを含む1要素のCharSetとする。
    2. m2CharacterSetMatcher(regexpRecord, cs2, false, direction) とする。
    3. s 内の各コードポイント c1 について、その最後から2番目のコードポイントから後方に反復して、次を行う:
      1. cs1c1 を含む1要素のCharSetとする。
      2. m1CharacterSetMatcher(regexpRecord, cs1, false, direction) とする。
      3. m2MatchSequence(m1, m2, direction) に設定する。
    4. m2lm に追加する。
  7. singles を、単一のcharacterから成る cs のすべてのCharSetElementを含むCharSetとする。
  8. CharacterSetMatcher(regexpRecord, singles, false, direction) を lm に追加する。
  9. cs が空のcharacter列を含む場合、EmptyMatcher() を lm に追加する。
  10. m2lm 内の最後のMatcherとする。
  11. lm の各Matcher m1 について、その最後から2番目の要素から後方に反復して、次を行う:
    1. m2MatchTwoAlternatives(m1, m2) に設定する。
  12. m2 を返す。
Atom :: ( GroupSpecifieropt Disjunction )
  1. m を、引数 regexpRecord および direction での DisjunctionCompileSubpattern とする。
  2. parenIndexCountLeftCapturingParensBefore(Atom) とする。
  3. directionm、および parenIndex を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (x, c) を持つ新しいMatcherを返す:
    1. Assert: xMatchStateである。
    2. Assert: cMatcherContinuationである。
    3. d を、xcdirection、および parenIndex を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (y) を持つ新しいMatcherContinuationとする:
      1. Assert: yMatchStateである。
      2. capy.[[Captures]] のコピーとする。
      3. inputx.[[Input]] とする。
      4. xex.[[EndIndex]] とする。
      5. yey.[[EndIndex]] とする。
      6. directionforward の場合、次を行う:
        1. Assert: xeye
        2. rCaptureRange { [[StartIndex]]: xe, [[EndIndex]]: ye } とする。
      7. それ以外の場合、
        1. Assert: directionbackward である。
        2. Assert: yexe
        3. rCaptureRange { [[StartIndex]]: ye, [[EndIndex]]: xe } とする。
      8. cap[parenIndex + 1] を r に設定する。
      9. zMatchState { [[Input]]: input, [[EndIndex]]: ye, [[Captures]]: cap } とする。
      10. c(z) を返す。
    4. m(x, d) を返す。
Note 2

( Disjunction ) 形式の括弧は、Disjunction パターンの構成要素をまとめることと、マッチ結果を保存することの両方の役割を果たします。その結果は、後方参照(\ の後に0でない10進数が続くもの)、置換String内の参照、または正規表現マッチングAbstract Closureから返される配列の一部として使用できます。括弧のキャプチャ挙動を抑制するには、代わりに (?: Disjunction ) 形式を使用します。

Atom :: (? RegularExpressionModifiers : Disjunction )
  1. addModifiersRegularExpressionModifiers に一致したソーステキストとする。
  2. removeModifiers を空のStringとする。
  3. modifiedRerUpdateModifiers(regexpRecord, CodePointsToString(addModifiers), removeModifiers) とする。
  4. 引数 modifiedRer および direction での DisjunctionCompileSubpattern を返す。
Atom :: (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction )
  1. addModifiers を最初の RegularExpressionModifiers に一致したソーステキストとする。
  2. removeModifiers を2番目の RegularExpressionModifiers に一致したソーステキストとする。
  3. modifiedRerUpdateModifiers(regexpRecord, CodePointsToString(addModifiers), CodePointsToString(removeModifiers)) とする。
  4. 引数 modifiedRer および direction での DisjunctionCompileSubpattern を返す。
AtomEscape :: DecimalEscape
  1. nDecimalEscapeCapturingGroupNumberとする。
  2. Assert: nregexpRecord.[[CapturingGroupsCount]]
  3. BackreferenceMatcher(regexpRecord, « n », direction) を返す。
Note 3

\ の後に0でない10進数 n が続く形式のエスケープ列は、n番目 のキャプチャ括弧集合の結果(22.2.2.1)にマッチします。正規表現のキャプチャ括弧が n 個未満である場合はエラーです。正規表現が n 個以上のキャプチャ括弧を持っていても、n番目 の括弧が何もキャプチャしていないため undefined である場合、後方参照は常に成功します。

AtomEscape :: CharacterEscape
  1. cvCharacterEscapeCharacterValueとする。
  2. ch をcharacter valueが cv であるcharacterとする。
  3. charSet をcharacter ch を含む1要素のCharSetとする。
  4. CharacterSetMatcher(regexpRecord, charSet, false, direction) を返す。
AtomEscape :: CharacterClassEscape
  1. cs を、引数 regexpRecord での CharacterClassEscapeCompileToCharSet とする。
  2. regexpRecord.[[UnicodeSets]]false であるか、または cs のすべてのCharSetElementが単一のcharacterから成る場合(cs が空の場合を含む)、CharacterSetMatcher(regexpRecord, cs, false, direction) を返す。
  3. lm を空のMatcherListとする。
  4. 複数のcharacterを含む cs 内の各CharSetElement s について、長さの降順に反復して、次を行う:
    1. cs2s の最後のコードポイントを含む1要素のCharSetとする。
    2. m2CharacterSetMatcher(regexpRecord, cs2, false, direction) とする。
    3. s 内の各コードポイント c1 について、その最後から2番目のコードポイントから後方に反復して、次を行う:
      1. cs1c1 を含む1要素のCharSetとする。
      2. m1CharacterSetMatcher(regexpRecord, cs1, false, direction) とする。
      3. m2MatchSequence(m1, m2, direction) に設定する。
    4. m2lm に追加する。
  5. singles を、単一のcharacterから成る cs のすべてのCharSetElementを含むCharSetとする。
  6. CharacterSetMatcher(regexpRecord, singles, false, direction) を lm に追加する。
  7. cs が空のcharacter列を含む場合、EmptyMatcher() を lm に追加する。
  8. m2lm 内の最後のMatcherとする。
  9. lm の各Matcher m1 について、その最後から2番目の要素から後方に反復して、次を行う:
    1. m2MatchTwoAlternatives(m1, m2) に設定する。
  10. m2 を返す。
AtomEscape :: k GroupName
  1. matchingGroupSpecifiersGroupSpecifiersThatMatch(GroupName) とする。
  2. parenIndices を新しい空のListとする。
  3. matchingGroupSpecifiers の各 GroupSpecifier groupSpecifier について、次を行う:
    1. parenIndexCountLeftCapturingParensBefore(groupSpecifier) とする。
    2. parenIndexparenIndices に追加する。
  4. BackreferenceMatcher(regexpRecord, parenIndices, direction) を返す。

22.2.2.7.1 CharacterSetMatcher ( regexpRecord, charSet, invert, direction )

The abstract operation CharacterSetMatcher takes arguments regexpRecord (RegExp Record), charSet (CharSet), invert (Boolean), and direction (forward または backward) and returns Matcher. It performs the following steps when called:

  1. regexpRecord.[[UnicodeSets]]true の場合、次を行う:
    1. Assert: invertfalse である。
    2. Assert: charSet のすべてのCharSetElementは単一のcharacterから成る。
  2. regexpRecordcharSetinvert、および direction を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (x, c) を持つ新しいMatcherを返す:
    1. Assert: xMatchStateである。
    2. Assert: cMatcherContinuationである。
    3. inputx.[[Input]] とする。
    4. endIndexx.[[EndIndex]] とする。
    5. directionforward の場合、fendIndex + 1 とする。
    6. それ以外の場合、fendIndex - 1 とする。
    7. inputLengthinput 内の要素数とする。
    8. f < 0 または f > inputLength の場合、failure を返す。
    9. indexmin(endIndex, f) とする。
    10. ch をcharacter input[index] とする。
    11. ccCanonicalize(regexpRecord, ch) とする。
    12. Canonicalize(regexpRecord, a) が cc であるような、ちょうど1つのcharacter a を含むCharSetElementcharSet 内に存在する場合、foundtrue とする。そうでない場合、foundfalse とする。
    13. invertfalse かつ foundfalse の場合、failure を返す。
    14. inverttrue かつ foundtrue の場合、failure を返す。
    15. capx.[[Captures]] とする。
    16. yMatchState { [[Input]]: input, [[EndIndex]]: f, [[Captures]]: cap } とする。
    17. c(y) を返す。

22.2.2.7.2 BackreferenceMatcher ( regexpRecord, ns, direction )

The abstract operation BackreferenceMatcher takes arguments regexpRecord (RegExp Record), ns (正整数のList), and direction (forward または backward) and returns Matcher. It performs the following steps when called:

  1. regexpRecordns、および direction を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (x, c) を持つ新しいMatcherを返す:
    1. Assert: xMatchStateである。
    2. Assert: cMatcherContinuationである。
    3. inputx.[[Input]] とする。
    4. capx.[[Captures]] とする。
    5. rundefined とする。
    6. ns の各整数 n について、次を行う:
      1. cap[n] が undefined でない場合、次を行う:
        1. Assert: rundefined である。
        2. rcap[n] に設定する。
    7. rundefined である場合、c(x) を返す。
    8. endIndexx.[[EndIndex]] とする。
    9. rsr.[[StartIndex]] とする。
    10. rer.[[EndIndex]] とする。
    11. lenre - rs とする。
    12. directionforward の場合、fendIndex + len とする。
    13. それ以外の場合、fendIndex - len とする。
    14. inputLengthinput 内の要素数とする。
    15. f < 0 または f > inputLength の場合、failure を返す。
    16. gmin(endIndex, f) とする。
    17. 0(包含)から len(排他)までの区間内に、Canonicalize(regexpRecord, input[rs + i]) が Canonicalize(regexpRecord, input[g + i]) でないような整数 i が存在する場合、failure を返す。
    18. yMatchState { [[Input]]: input, [[EndIndex]]: f, [[Captures]]: cap } とする。
    19. c(y) を返す。

22.2.2.7.3 Canonicalize ( regexpRecord, ch )

The abstract operation Canonicalize takes arguments regexpRecord (RegExp Record) and ch (character) and returns character. It performs the following steps when called:

  1. HasEitherUnicodeFlag(regexpRecord) が true かつ regexpRecord.[[IgnoreCase]]true の場合、次を行う:
    1. Unicode Character Databaseのファイル CaseFolding.txtch に対するsimpleまたはcommon case foldingマッピングを提供する場合、そのマッピングを ch に適用した結果を返す。
    2. ch を返す。
  2. regexpRecord.[[IgnoreCase]]false の場合、ch を返す。
  3. Assert: ch はUTF-16コード単位である。
  4. cp を、数値が ch の数値であるコードポイントとする。
  5. u を、Unicode Default Case Conversionアルゴリズムに従う toUppercase(« cp ») とする。
  6. uStrCodePointsToString(u) とする。
  7. uStr の長さが 1 でない場合、ch を返す。
  8. cuuStr の単一コード単位要素とする。
  9. ch の数値が 128 以上で、かつ cu の数値が 128 未満の場合、ch を返す。
  10. cu を返す。
Note

HasEitherUnicodeFlag(regexpRecord) が true の場合の大小文字を区別しないマッチでは、すべてのcharacterは比較される直前にUnicode Standardが提供するsimple mappingを用いて暗黙的にcase-foldされます。simple mappingは常に単一のコードポイントへ写像するため、例えば ß(U+00DF LATIN SMALL LETTER SHARP S)を ss または SS へ写像しません。ただし、Basic Latinブロック外のコードポイントをその内部のコードポイントへ写像する場合があります。例えば、ſ(U+017F LATIN SMALL LETTER LONG S)は s(U+0073 LATIN SMALL LETTER S)へcase-foldされ、(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 にはマッチしません。また、Basic Latinブロック外のコードポイントはその内部のコードポイントへ写像されないため、"\u017F ſ""\u212A K" のようなStringは /[a-z]/i にマッチしません。

22.2.2.7.4 UpdateModifiers ( regexpRecord, add, remove )

The abstract operation UpdateModifiers takes arguments regexpRecord (RegExp Record), add (String), and remove (String) and returns RegExp Record. It performs the following steps when called:

  1. Assert: addremove は共通の要素を持たない。
  2. ignoreCaseregexpRecord.[[IgnoreCase]] とする。
  3. multilineregexpRecord.[[Multiline]] とする。
  4. dotAllregexpRecord.[[DotAll]] とする。
  5. unicoderegexpRecord.[[Unicode]] とする。
  6. unicodeSetsregexpRecord.[[UnicodeSets]] とする。
  7. capturingGroupsCountregexpRecord.[[CapturingGroupsCount]] とする。
  8. remove"i" を含む場合、ignoreCasefalse に設定する。
  9. そうでなく add"i" を含む場合、ignoreCasetrue に設定する。
  10. remove"m" を含む場合、multilinefalse に設定する。
  11. そうでなく add"m" を含む場合、multilinetrue に設定する。
  12. remove"s" を含む場合、dotAllfalse に設定する。
  13. そうでなく add"s" を含む場合、dotAlltrue に設定する。
  14. RegExp Record { [[IgnoreCase]]: ignoreCase, [[Multiline]]: multiline, [[DotAll]]: dotAll, [[Unicode]]: unicode, [[UnicodeSets]]: unicodeSets, [[CapturingGroupsCount]]: capturingGroupsCount } を返す。

22.2.2.8 Runtime Semantics: CompileCharacterClass

The syntax-directed operation CompileCharacterClass takes argument regexpRecord (RegExp Record) and returns フィールド [[CharSet]]CharSet)および [[Invert]](Boolean)を持つRecord. It is defined piecewise over the following productions:

CharacterClass :: [ ClassContents ]
  1. charSet を、引数 regexpRecord での ClassContentsCompileToCharSet とする。
  2. Record { [[CharSet]]: charSet, [[Invert]]: false } を返す。
CharacterClass :: [^ ClassContents ]
  1. charSet を、引数 regexpRecord での ClassContentsCompileToCharSet とする。
  2. regexpRecord.[[UnicodeSets]]true の場合、次を行う:
    1. Record { [[CharSet]]: CharacterComplement(regexpRecord, charSet), [[Invert]]: false } を返す。
  3. Record { [[CharSet]]: charSet, [[Invert]]: true } を返す。

22.2.2.9 Runtime Semantics: CompileToCharSet

The syntax-directed operation CompileToCharSet takes argument regexpRecord (RegExp Record) and returns CharSet.

Note 1

この節は B.1.2.8 で修正されます。

It is defined piecewise over the following productions:

ClassContents :: [empty]
  1. 空のCharSetを返す。
NonemptyClassRanges :: ClassAtom NonemptyClassRangesNoDash
  1. charSet を、引数 regexpRecord での ClassAtomCompileToCharSet とする。
  2. otherSet を、引数 regexpRecord での NonemptyClassRangesNoDashCompileToCharSet とする。
  3. CharSet charSetotherSet の和集合を返す。
NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents
  1. charSet を、引数 regexpRecord での最初の ClassAtomCompileToCharSet とする。
  2. otherSet を、引数 regexpRecord での2番目の ClassAtomCompileToCharSet とする。
  3. remainingSet を、引数 regexpRecord での ClassContentsCompileToCharSet とする。
  4. rangeSetCharacterRange(charSet, otherSet) とする。
  5. rangeSetremainingSet の和集合を返す。
NonemptyClassRangesNoDash :: ClassAtomNoDash NonemptyClassRangesNoDash
  1. charSet を、引数 regexpRecord での ClassAtomNoDashCompileToCharSet とする。
  2. otherSet を、引数 regexpRecord での NonemptyClassRangesNoDashCompileToCharSet とする。
  3. CharSet charSetotherSet の和集合を返す。
NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents
  1. charSet を、引数 regexpRecord での ClassAtomNoDashCompileToCharSet とする。
  2. otherSet を、引数 regexpRecord での ClassAtomCompileToCharSet とする。
  3. remainingSet を、引数 regexpRecord での ClassContentsCompileToCharSet とする。
  4. rangeSetCharacterRange(charSet, otherSet) とする。
  5. rangeSetremainingSet の和集合を返す。
Note 2

ClassContents は、単一の ClassAtom および/またはダッシュで区切られた2つの ClassAtom の範囲へ展開できます。後者の場合、ClassContents は最初の ClassAtom と2番目の ClassAtom の間のすべてのcharacterを包含的に含みます。いずれかの ClassAtom が単一のcharacterを表さない場合(例えば一方が \w である場合)、または最初の ClassAtom のcharacter valueが2番目の ClassAtom のcharacter valueより厳密に大きい場合、エラーが発生します。

Note 3

パターンが大小文字を無視する場合でも、範囲の両端の大小文字は、どのcharacterがその範囲に属するかを決定する際に重要です。したがって、例えばパターン /[E-F]/i は文字 EFe、および f のみにマッチしますが、パターン /[E-f]/i はUnicode Basic Latinブロック内のすべての大文字および小文字に加え、記号 [, \, ], ^, _, および ` にもマッチします。

Note 4

- characterはリテラルとして扱われることも、範囲を示すこともできます。ClassContents の最初または最後のcharacterである場合、範囲指定の開始または終了の限界である場合、または範囲指定の直後に続く場合、これはリテラルとして扱われます。

ClassAtom :: -
  1. 単一のcharacter - U+002D(HYPHEN-MINUS)を含むCharSetを返す。
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
  1. SourceCharacter に一致したcharacterを含むCharSetを返す。
ClassEscape :: b - CharacterEscape
  1. cv をこの ClassEscapeCharacterValueとする。
  2. c をcharacter valueが cv であるcharacterとする。
  3. 単一のcharacter c を含むCharSetを返す。
Note 5

ClassAtom は、\b\B、および後方参照を除き、正規表現の他の部分で許される任意のエスケープ列を使用できます。CharacterClass の内側では、\b はバックスペースcharacterを意味し、\B および後方参照はエラーを発生させます。ClassAtom の内側で後方参照を使用するとエラーになります。

CharacterClassEscape :: d
  1. character 012345678、および 9 を含む10要素のCharSetを返す。
CharacterClassEscape :: D
  1. charSet CharacterClassEscape :: d によって返されるCharSetとする。
  2. CharacterComplement(regexpRecord, charSet) を返す。
CharacterClassEscape :: s
  1. WhiteSpace または LineTerminator 生成式の右辺のコードポイントに対応するすべてのcharacterを含むCharSetを返す。
CharacterClassEscape :: S
  1. charSet CharacterClassEscape :: s によって返されるCharSetとする。
  2. CharacterComplement(regexpRecord, charSet) を返す。
CharacterClassEscape :: w
  1. MaybeSimpleCaseFolding(regexpRecord, WordCharacters(regexpRecord)) を返す。
CharacterClassEscape :: W
  1. charSet CharacterClassEscape :: w によって返されるCharSetとする。
  2. CharacterComplement(regexpRecord, charSet) を返す。
CharacterClassEscape :: p{ UnicodePropertyValueExpression }
  1. 引数 regexpRecord での UnicodePropertyValueExpressionCompileToCharSet を返す。
CharacterClassEscape :: P{ UnicodePropertyValueExpression }
  1. charSet を、引数 regexpRecord での UnicodePropertyValueExpressionCompileToCharSet とする。
  2. Assert: charSet は単一コードポイントのみを含む。
  3. CharacterComplement(regexpRecord, charSet) を返す。
UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue
  1. psUnicodePropertyName に一致したソーステキストとする。
  2. pUnicodeMatchProperty(regexpRecord, ps) とする。
  3. Assert: pTable 64 の「Property name and aliases」列に列挙されているUnicodeプロパティ名またはプロパティ別名である。
  4. vsUnicodePropertyValue に一致したソーステキストとする。
  5. vUnicodeMatchPropertyValue(p, vs) とする。
  6. charSet を、character database定義が値 v を持つプロパティ p を含む、すべてのUnicodeコードポイントを含むCharSetとする。
  7. MaybeSimpleCaseFolding(regexpRecord, charSet) を返す。
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  1. sLoneUnicodePropertyNameOrValue に一致したソーステキストとする。
  2. UnicodeMatchPropertyValue(General_Category, s) が、PropertyValueAliases.txt に列挙されているGeneral_Category(gc)プロパティのUnicodeプロパティ値またはプロパティ値別名である場合、次を行う:
    1. character database定義が値 s を持つプロパティ“General_Category”を含む、すべてのUnicodeコードポイントを含むCharSetを返す。
  3. pUnicodeMatchProperty(regexpRecord, s) とする。
  4. Assert: p は、Table 65 の「Property name and aliases」列に列挙されている二値Unicodeプロパティまたは二値プロパティ別名、または Table 66 の「Property name」列に列挙されている文字列の二値Unicodeプロパティである。
  5. charSet を、character database定義が値“True”を持つプロパティ p を含む、すべてのCharSetElementを含むCharSetとする。
  6. MaybeSimpleCaseFolding(regexpRecord, charSet) を返す。
ClassUnion :: ClassSetRange ClassUnionopt
  1. charSet を、引数 regexpRecord での ClassSetRangeCompileToCharSet とする。
  2. ClassUnion が存在する場合、次を行う:
    1. otherSet を、引数 regexpRecord での ClassUnionCompileToCharSet とする。
    2. CharSet charSetotherSet の和集合を返す。
  3. charSet を返す。
ClassUnion :: ClassSetOperand ClassUnionopt
  1. charSet を、引数 regexpRecord での ClassSetOperandCompileToCharSet とする。
  2. ClassUnion が存在する場合、次を行う:
    1. otherSet を、引数 regexpRecord での ClassUnionCompileToCharSet とする。
    2. CharSet charSetotherSet の和集合を返す。
  3. charSet を返す。
ClassIntersection :: ClassSetOperand && ClassSetOperand
  1. charSet を、引数 regexpRecord での最初の ClassSetOperandCompileToCharSet とする。
  2. otherSet を、引数 regexpRecord での2番目の ClassSetOperandCompileToCharSet とする。
  3. CharSet charSetotherSet の共通部分を返す。
ClassIntersection :: ClassIntersection && ClassSetOperand
  1. charSet を、引数 regexpRecord での ClassIntersectionCompileToCharSet とする。
  2. otherSet を、引数 regexpRecord での ClassSetOperandCompileToCharSet とする。
  3. CharSet charSetotherSet の共通部分を返す。
ClassSubtraction :: ClassSetOperand -- ClassSetOperand
  1. charSet を、引数 regexpRecord での最初の ClassSetOperandCompileToCharSet とする。
  2. otherSet を、引数 regexpRecord での2番目の ClassSetOperandCompileToCharSet とする。
  3. charSetCharSetElementのうち、otherSetCharSetElementでもあるものを除いたCharSetを返す。
ClassSubtraction :: ClassSubtraction -- ClassSetOperand
  1. charSet を、引数 regexpRecord での ClassSubtractionCompileToCharSet とする。
  2. otherSet を、引数 regexpRecord での ClassSetOperandCompileToCharSet とする。
  3. charSetCharSetElementのうち、otherSetCharSetElementでもあるものを除いたCharSetを返す。
ClassSetRange :: ClassSetCharacter - ClassSetCharacter
  1. charSet を、引数 regexpRecord での最初の ClassSetCharacterCompileToCharSet とする。
  2. otherSet を、引数 regexpRecord での2番目の ClassSetCharacterCompileToCharSet とする。
  3. MaybeSimpleCaseFolding(regexpRecord, CharacterRange(charSet, otherSet)) を返す。
Note 6

結果はしばしば2つ以上の範囲から成ります。UnicodeSetsが true かつIgnoreCaseが true の場合、MaybeSimpleCaseFolding(regexpRecord, [Ā-č]) はその範囲の奇数番号のコードポイントのみを含みます。

ClassSetOperand :: ClassSetCharacter
  1. charSet を、引数 regexpRecord での ClassSetCharacterCompileToCharSet とする。
  2. MaybeSimpleCaseFolding(regexpRecord, charSet) を返す。
ClassSetOperand :: ClassStringDisjunction
  1. charSet を、引数 regexpRecord での ClassStringDisjunctionCompileToCharSet とする。
  2. MaybeSimpleCaseFolding(regexpRecord, charSet) を返す。
ClassSetOperand :: NestedClass
  1. 引数 regexpRecord での NestedClassCompileToCharSet を返す。
NestedClass :: [ ClassContents ]
  1. 引数 regexpRecord での ClassContentsCompileToCharSet を返す。
NestedClass :: [^ ClassContents ]
  1. charSet を、引数 regexpRecord での ClassContentsCompileToCharSet とする。
  2. CharacterComplement(regexpRecord, charSet) を返す。
NestedClass :: \ CharacterClassEscape
  1. 引数 regexpRecord での CharacterClassEscapeCompileToCharSet を返す。
ClassStringDisjunction :: \q{ ClassStringDisjunctionContents }
  1. 引数 regexpRecord での ClassStringDisjunctionContentsCompileToCharSet を返す。
ClassStringDisjunctionContents :: ClassString
  1. s を、引数 regexpRecord での ClassStringCompileClassSetString とする。
  2. 1つの文字列 s を含むCharSetを返す。
ClassStringDisjunctionContents :: ClassString | ClassStringDisjunctionContents
  1. s を、引数 regexpRecord での ClassStringCompileClassSetString とする。
  2. charSet を1つの文字列 s を含むCharSetとする。
  3. otherSet を、引数 regexpRecord での ClassStringDisjunctionContentsCompileToCharSet とする。
  4. CharSet charSetotherSet の和集合を返す。
ClassSetCharacter :: SourceCharacter but not ClassSetSyntaxCharacter \ CharacterEscape \ ClassSetReservedPunctuator
  1. cv をこの ClassSetCharacterCharacterValueとする。
  2. c をcharacter valueが cv であるcharacterとする。
  3. 単一のcharacter c を含むCharSetを返す。
ClassSetCharacter :: \b
  1. 単一のcharacter U+0008(BACKSPACE)を含むCharSetを返す。

22.2.2.9.1 CharacterRange ( charSet, otherSet )

The abstract operation CharacterRange takes arguments charSet (CharSet) and otherSet (CharSet) and returns CharSet. It performs the following steps when called:

  1. Assert: charSetotherSet はそれぞれちょうど1つのcharacterを含む。
  2. aCharSet charSet 内の1つのcharacterとする。
  3. bCharSet otherSet 内の1つのcharacterとする。
  4. i をcharacter a のcharacter valueとする。
  5. j をcharacter b のcharacter valueとする。
  6. Assert: ij
  7. i から j までの包含区間内のcharacter valueを持つすべてのcharacterを含むCharSetを返す。

22.2.2.9.2 HasEitherUnicodeFlag ( regexpRecord )

The abstract operation HasEitherUnicodeFlag takes argument regexpRecord (RegExp Record) and returns Boolean. It performs the following steps when called:

  1. regexpRecord.[[Unicode]]true または regexpRecord.[[UnicodeSets]]true の場合、true を返す。
  2. false を返す。

22.2.2.9.3 WordCharacters ( regexpRecord )

The abstract operation WordCharacters takes argument regexpRecord (RegExp Record) and returns CharSet. \b\B\w、および \W の目的において「単語character」と見なされるcharacterを含むCharSetを返します。 It performs the following steps when called:

  1. basicWordChars をASCII単語character内のすべてのcharacterを含むCharSetとする。
  2. extraWordChars を、basicWordChars 内に含まれないが Canonicalize(regexpRecord, c) が basicWordChars 内にあるような、すべてのcharacter c を含むCharSetとする。
  3. Assert: HasEitherUnicodeFlag(regexpRecord) が true かつ regexpRecord.[[IgnoreCase]]true でない限り、extraWordChars は空である。
  4. basicWordCharsextraWordChars の和集合を返す。

22.2.2.9.4 AllCharacters ( regexpRecord )

The abstract operation AllCharacters takes argument regexpRecord (RegExp Record) and returns CharSet. 正規表現フラグに従った「すべてのcharacter」の集合を返します。 It performs the following steps when called:

  1. regexpRecord.[[UnicodeSets]]true かつ regexpRecord.[[IgnoreCase]]true の場合、次を行う:
    1. Simple Case Folding マッピングを持たない(すなわち scf(c)=c である)すべてのUnicodeコードポイント c を含むCharSetを返す。
  2. HasEitherUnicodeFlag(regexpRecord) が true の場合、次を行う:
    1. すべてのコードポイント値を含むCharSetを返す。
  3. すべてのコード単位値を含むCharSetを返す。

22.2.2.9.5 MaybeSimpleCaseFolding ( regexpRecord, charSet )

The abstract operation MaybeSimpleCaseFolding takes arguments regexpRecord (RegExp Record) and charSet (CharSet) and returns CharSet. regexpRecord.[[UnicodeSets]]false または regexpRecord.[[IgnoreCase]]false の場合、charSet を返します。それ以外の場合、Unicode Character Databaseのファイル CaseFolding.txt にある Simple Case Foldingscf(cp))定義(それぞれが単一コードポイントを別の単一コードポイントへ写像する)を用いて、charSet の各CharSetElementをcharacterごとに正準形式へ写像し、その結果のCharSetを返します。 It performs the following steps when called:

  1. regexpRecord.[[UnicodeSets]]false または regexpRecord.[[IgnoreCase]]false の場合、charSet を返す。
  2. otherSet を新しい空のCharSetとする。
  3. charSet の各CharSetElement s について、次を行う:
    1. t を空のcharacter列とする。
    2. s 内の各単一コードポイント cp について、次を行う:
      1. scf(cp) を t に追加する。
    3. totherSet に追加する。
  4. otherSet を返す。

22.2.2.9.6 CharacterComplement ( regexpRecord, complement )

The abstract operation CharacterComplement takes arguments regexpRecord (RegExp Record) and complement (CharSet) and returns CharSet. It performs the following steps when called:

  1. charSetAllCharacters(regexpRecord) とする。
  2. charSetCharSetElementのうち、complementCharSetElementでもあるものを除いたCharSetを返す。

22.2.2.9.7 UnicodeMatchProperty ( regexpRecord, p )

The abstract operation UnicodeMatchProperty takes arguments regexpRecord (RegExp Record) and p (ECMAScriptソーステキスト) and returns Unicodeプロパティ名. It performs the following steps when called:

  1. regexpRecord.[[UnicodeSets]]true であり、かつ pTable 66 の「Property name」列に列挙されているUnicodeプロパティ名である場合、次を行う:
    1. UnicodeコードポイントのList p を返す。
  2. Assert: pTable 64 または Table 65 の「Property name and aliases」列に列挙されているUnicodeプロパティ名またはプロパティ別名である。
  3. c を、対応する行の「Canonical property name」列に与えられている、p の正準プロパティ名とする。
  4. UnicodeコードポイントのList c を返す。

実装は、Table 64Table 65、および Table 66 に列挙されているUnicodeプロパティ名および別名をサポートしなければなりません。相互運用性を確保するため、実装は他のプロパティ名または別名をサポートしてはなりません。

Note 1

例えば、Script_Extensionsプロパティ名)および scx(プロパティ別名)は有効ですが、script_extensions または Scx は有効ではありません。

Note 2

列挙されたプロパティは、UTS18 RL1.2 が要求するものの上位集合を形成します。

Note 3

これらの表内のエントリの綴り(大文字小文字を含む)は、Unicode Character Databaseのファイル PropertyAliases.txt で使用される綴りと一致します。そのファイル内の正確な綴りは安定であることが保証されています

Table 64: Non-binary Unicode property aliases and their canonical property names
Property name and aliases Canonical property name
General_Category General_Category
gc
Script Script
sc
Script_Extensions Script_Extensions
scx
Table 65: Binary Unicode property aliases and their canonical property names
Property name and aliases Canonical property name
ASCII ASCII
ASCII_Hex_Digit ASCII_Hex_Digit
AHex
Alphabetic Alphabetic
Alpha
Any Any
Assigned Assigned
Bidi_Control Bidi_Control
Bidi_C
Bidi_Mirrored Bidi_Mirrored
Bidi_M
Case_Ignorable Case_Ignorable
CI
Cased Cased
Changes_When_Casefolded Changes_When_Casefolded
CWCF
Changes_When_Casemapped Changes_When_Casemapped
CWCM
Changes_When_Lowercased Changes_When_Lowercased
CWL
Changes_When_NFKC_Casefolded Changes_When_NFKC_Casefolded
CWKCF
Changes_When_Titlecased Changes_When_Titlecased
CWT
Changes_When_Uppercased Changes_When_Uppercased
CWU
Dash Dash
Default_Ignorable_Code_Point Default_Ignorable_Code_Point
DI
Deprecated Deprecated
Dep
Diacritic Diacritic
Dia
Emoji Emoji
Emoji_Component Emoji_Component
EComp
Emoji_Modifier Emoji_Modifier
EMod
Emoji_Modifier_Base Emoji_Modifier_Base
EBase
Emoji_Presentation Emoji_Presentation
EPres
Extended_Pictographic Extended_Pictographic
ExtPict
Extender Extender
Ext
Grapheme_Base Grapheme_Base
Gr_Base
Grapheme_Extend Grapheme_Extend
Gr_Ext
Hex_Digit Hex_Digit
Hex
IDS_Binary_Operator IDS_Binary_Operator
IDSB
IDS_Trinary_Operator IDS_Trinary_Operator
IDST
ID_Continue ID_Continue
IDC
ID_Start ID_Start
IDS
Ideographic Ideographic
Ideo
Join_Control Join_Control
Join_C
Logical_Order_Exception Logical_Order_Exception
LOE
Lowercase Lowercase
Lower
Math Math
Noncharacter_Code_Point Noncharacter_Code_Point
NChar
Pattern_Syntax Pattern_Syntax
Pat_Syn
Pattern_White_Space Pattern_White_Space
Pat_WS
Quotation_Mark Quotation_Mark
QMark
Radical Radical
Regional_Indicator Regional_Indicator
RI
Sentence_Terminal Sentence_Terminal
STerm
Soft_Dotted Soft_Dotted
SD
Terminal_Punctuation Terminal_Punctuation
Term
Unified_Ideograph Unified_Ideograph
UIdeo
Uppercase Uppercase
Upper
Variation_Selector Variation_Selector
VS
White_Space White_Space
space
XID_Continue XID_Continue
XIDC
XID_Start XID_Start
XIDS
Table 66: Binary Unicode properties of strings
Property name
Basic_Emoji
Emoji_Keycap_Sequence
RGI_Emoji_Modifier_Sequence
RGI_Emoji_Flag_Sequence
RGI_Emoji_Tag_Sequence
RGI_Emoji_ZWJ_Sequence
RGI_Emoji

22.2.2.9.8 UnicodeMatchPropertyValue ( p, v )

The abstract operation UnicodeMatchPropertyValue takes arguments p (ECMAScriptソーステキスト) and v (ECMAScriptソーステキスト) and returns Unicodeプロパティ値. It performs the following steps when called:

  1. Assert: pTable 64 の「Canonical property name」列に列挙されている正準で別名でないUnicodeプロパティ名である。
  2. Assert: vPropertyValueAliases.txt に列挙されているUnicodeプロパティ p のプロパティ値またはプロパティ値別名である。
  3. value を、対応する行の「Canonical property value」列に与えられている v の正準プロパティ値とする。
  4. UnicodeコードポイントのList value を返す。

実装は、Table 64 に列挙されているプロパティについて、PropertyValueAliases.txt に列挙されているUnicodeプロパティ値およびプロパティ値別名をサポートしなければなりません。相互運用性を確保するため、実装は他のプロパティ値またはプロパティ値別名をサポートしてはなりません。

Note 1

例えば、Xpeo および Old_Persian は有効な Script_Extensions 値ですが、xpeo および Old Persian は有効ではありません。

Note 2

このアルゴリズムは、UAX44に列挙されているシンボリック値のマッチング規則とは異なります。大文字小文字、空白、U+002D(HYPHEN-MINUS)、および U+005F(LOW LINE)は無視されず、Is 接頭辞はサポートされません。

22.2.2.10 Runtime Semantics: CompileClassSetString

The syntax-directed operation CompileClassSetString takes argument regexpRecord (RegExp Record) and returns characterの列. It is defined piecewise over the following productions:

ClassString :: [empty]
  1. 空のcharacter列を返す。
ClassString :: NonEmptyClassString
  1. 引数 regexpRecord での NonEmptyClassStringCompileClassSetString を返す。
NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt
  1. cs を、引数 regexpRecord での ClassSetCharacterCompileToCharSet とする。
  2. s1 を、cs の単一のCharSetElementであるcharacter列とする。
  3. NonEmptyClassString が存在する場合、次を行う:
    1. s2 を、引数 regexpRecord での NonEmptyClassStringCompileClassSetString とする。
    2. s1s2 の連結を返す。
  4. s1 を返す。

22.2.3 RegExp作成のための抽象操作

22.2.3.1 RegExpCreate ( pattern, flags )

The abstract operation RegExpCreate takes arguments pattern (ECMAScript言語値) and flags (Stringまたはundefined) and returns Objectを含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. obj を ! RegExpAlloc(%RegExp%) とする。
  2. RegExpInitialize(obj, pattern, flags) を返す。

22.2.3.2 RegExpAlloc ( newTarget )

The abstract operation RegExpAlloc takes argument newTarget (コンストラクター) and returns Objectを含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. obj を ? OrdinaryCreateFromConstructor(newTarget, "%RegExp.prototype%", « [[OriginalSource]], [[OriginalFlags]], [[RegExpRecord]], [[RegExpMatcher]] ») とする。
  2. DefinePropertyOrThrow(obj, "lastIndex", PropertyDescriptor { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  3. obj を返す。

22.2.3.3 RegExpInitialize ( obj, pattern, flags )

The abstract operation RegExpInitialize takes arguments obj (Object), pattern (ECMAScript言語値), and flags (ECMAScript言語値) and returns Objectを含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. patternundefined の場合、pattern を空のStringに設定する。
  2. そうでない場合、pattern を ? ToString(pattern) に設定する。
  3. flagsundefined の場合、flags を空のStringに設定する。
  4. そうでない場合、flags を ? ToString(flags) に設定する。
  5. flags"d""g""i""m""s""u""v"、または "y" 以外のコード単位を含む場合、SyntaxError 例外をスローする。
  6. flags が同じコード単位を複数回含む場合、SyntaxError 例外をスローする。
  7. flags"i" を含む場合、itrue とする。そうでない場合、ifalse とする。
  8. flags"m" を含む場合、mtrue とする。そうでない場合、mfalse とする。
  9. flags"s" を含む場合、strue とする。そうでない場合、sfalse とする。
  10. flags"u" を含む場合、utrue とする。そうでない場合、ufalse とする。
  11. flags"v" を含む場合、vtrue とする。そうでない場合、vfalse とする。
  12. utrue または vtrue の場合、次を行う:
    1. patternTextStringToCodePoints(pattern) とする。
  13. それ以外の場合、
    1. patternText を、pattern の各16ビット要素をUnicode BMPコードポイントとして解釈した結果とする。要素にはUTF-16復号は適用されない。
  14. parseResultParsePattern(patternText, u, v) とする。
  15. parseResultSyntaxError オブジェクトの空でないListである場合、SyntaxError 例外をスローする。
  16. Assert: parseResultPattern Parse Nodeである。
  17. obj.[[OriginalSource]]pattern に設定する。
  18. obj.[[OriginalFlags]]flags に設定する。
  19. capturingGroupsCountCountLeftCapturingParensWithin(parseResult) とする。
  20. regexpRecordRegExp Record { [[IgnoreCase]]: i, [[Multiline]]: m, [[DotAll]]: s, [[Unicode]]: u, [[UnicodeSets]]: v, [[CapturingGroupsCount]]: capturingGroupsCount } とする。
  21. obj.[[RegExpRecord]]regexpRecord に設定する。
  22. obj.[[RegExpMatcher]] を、引数 regexpRecord での parseResultCompilePattern に設定する。
  23. Set(obj, "lastIndex", +0𝔽, true) を実行する。
  24. obj を返す。

22.2.3.4 Static Semantics: ParsePattern ( patternText, u, v )

The abstract operation ParsePattern takes arguments patternText (Unicodeコードポイントの列), u (Boolean), and v (Boolean) and returns Parse NodeまたはSyntaxErrorオブジェクトの空でないList.

Note

この節は B.1.2.9 で修正されます。

It performs the following steps when called:

  1. vtrue かつ utrue の場合、次を行う:
    1. parseResult を1つ以上の SyntaxError オブジェクトを含むListとする。
  2. そうでなく vtrue の場合、次を行う:
    1. parseResultParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups]) とする。
  3. そうでなく utrue の場合、次を行う:
    1. parseResultParseText(patternText, Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups]) とする。
  4. それ以外の場合、
    1. parseResultParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups]) とする。
  5. parseResult を返す。

22.2.4 RegExpコンストラクター

RegExpコンストラクターは以下の通りです:

  • %RegExp%である。
  • グローバルオブジェクト"RegExp"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいRegExpオブジェクトを作成して初期化する。
  • コンストラクターとしてではなく関数として呼び出されたとき、新しいRegExpオブジェクト、または唯一の引数がRegExpオブジェクトである場合はその引数自体のいずれかを返す。
  • クラス定義のextends節の値として使用できる。指定されたRegExpの動作を継承することを意図するサブクラスコンストラクターは、必要な内部スロットを持つサブクラスインスタンスを作成して初期化するために、RegExpコンストラクターへのsuper呼び出しを含めなければならない。

22.2.4.1 RegExp ( patternOrRegexp, flags )

この関数は呼び出されたとき、次の手順を実行します:

  1. patternIsRegExp を ? IsRegExp(patternOrRegexp) とする。
  2. NewTarget が undefined の場合、次を行う:
    1. newTarget を実行中の関数オブジェクトとする。
    2. patternIsRegExptrue かつ flagsundefined の場合、次を行う:
      1. patternConstructor を ? Get(patternOrRegexp, "constructor") とする。
      2. SameValue(newTarget, patternConstructor) が true の場合、patternOrRegexp を返す。
  3. それ以外の場合、
    1. newTarget を NewTarget とする。
  4. patternOrRegexp がObjectであり、かつ patternOrRegexp[[RegExpMatcher]] 内部スロットを持つ場合、次を行う:
    1. patternSourcepatternOrRegexp.[[OriginalSource]] とする。
    2. flagsundefined の場合、flagspatternOrRegexp.[[OriginalFlags]] に設定する。
  5. そうでなく patternIsRegExptrue の場合、次を行う:
    1. patternSource を ? Get(patternOrRegexp, "source") とする。
    2. flagsundefined の場合、次を行う:
      1. flags を ? Get(patternOrRegexp, "flags") に設定する。
  6. それ以外の場合、
    1. patternSourcepatternOrRegexp とする。
  7. obj を ? RegExpAlloc(newTarget) とする。
  8. RegExpInitialize(obj, patternSource, flags) を返す。
Note

patternが StringLiteral を使用して供給される場合、通常のエスケープ列置換は、この関数によってStringが処理される前に実行されます。patternがこの関数によって認識されるためにエスケープ列を含まなければならない場合、StringLiteral の内容が形成されるときにU+005C(REVERSE SOLIDUS)コードポイントが除去されないように、StringLiteral 内でそれらをエスケープしなければなりません。

22.2.5 RegExpコンストラクターのプロパティ

RegExpコンストラクターは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

22.2.5.1 RegExp.escape ( str )

この関数は、正規表現 Pattern において潜在的に特別である文字が等価なエスケープ列に置き換えられた、str のコピーを返します。

呼び出されたとき、次の手順を実行します:

  1. str がStringでない場合、TypeError 例外をスローする。
  2. escaped を空のStringとする。
  3. cpListStringToCodePoints(str) とする。
  4. cpList の各コードポイント cp について、次を行う:
    1. escaped が空のStringであり、かつ cpDecimalDigit または AsciiLetter のいずれかに一致する場合、次を行う:
      1. NOTE: 先頭の数字をエスケープすると、出力が \0 characterエスケープまたは \1 のような DecimalEscape の後に使用され得るパターンテキストに対応し、それでも先行するエスケープ列の拡張として解釈されるのではなく str にマッチすることが保証される。先頭のASCII文字をエスケープすることは、\c の後の文脈について同じことを行う。
      2. numericValuecp の数値とする。
      3. hexNumber::toString(𝔽(numericValue), 16) とする。
      4. Assert: hex の長さは2である。
      5. escaped を、コード単位0x005C(REVERSE SOLIDUS)、"x"、および hex の文字列連結に設定する。
    2. それ以外の場合、
      1. escapedescapedEncodeForRegExpEscape(cp) の文字列連結に設定する。
  5. escaped を返す。
Note

名前は似ていますが、EscapeRegExpPatternRegExp.escapeは同様の動作を行いません。前者は文字列として表現するためにパターンをエスケープし、この関数はパターン内で表現するために文字列をエスケープします。

22.2.5.1.1 EncodeForRegExpEscape ( cp )

The abstract operation EncodeForRegExpEscape takes argument cp (コードポイント) and returns String. これは、cp にマッチする Pattern を表すStringを返します。cp が空白またはASCII区切り記号である場合、返される値はエスケープ列です。それ以外の場合、返される値は cp 自体のString表現です。 It performs the following steps when called:

  1. cpSyntaxCharacter に一致するか、または cp が U+002F(SOLIDUS)である場合、次を行う:
    1. 0x005C(REVERSE SOLIDUS)と UTF16EncodeCodePoint(cp) の文字列連結を返す。
  2. cpTable 62 の「Code Point」列に列挙されているコードポイントである場合、次を行う:
    1. 0x005C(REVERSE SOLIDUS)と、cp を含む「Code Point」列の行の「ControlEscape」列内の文字列の文字列連結を返す。
  3. otherPunctuators",-=<>#&!%:;@~'`" とコード単位0x0022(QUOTATION MARK)の文字列連結とする。
  4. toEscapeStringToCodePoints(otherPunctuators) とする。
  5. toEscapecp を含むか、cpWhiteSpace または LineTerminator のいずれかに一致するか、または cp が先行サロゲートまたは後続サロゲートと同じ数値を持つ場合、次を行う:
    1. cpNumcp の数値とする。
    2. cpNum ≤ 0xFF の場合、次を行う:
      1. hexNumber::toString(𝔽(cpNum), 16) とする。
      2. コード単位0x005C(REVERSE SOLIDUS)、"x"、および StringPad(hex, 2, "0", start) の文字列連結を返す。
    3. escaped を空のStringとする。
    4. codeUnitsUTF16EncodeCodePoint(cp) とする。
    5. codeUnits の各コード単位 cu について、次を行う:
      1. escapedescapedUnicodeEscape(cu) の文字列連結に設定する。
    6. escaped を返す。
  6. UTF16EncodeCodePoint(cp) を返す。

22.2.5.2 RegExp.prototype

RegExp.prototypeの初期値はRegExpプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

22.2.5.3 get RegExp [ %Symbol.species% ]

RegExp[%Symbol.species%]は、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. this値を返す。

この関数の"name"プロパティの値は "get [Symbol.species]" です。

Note

RegExpプロトタイプメソッドは通常、そのthis値のコンストラクターを使用して派生オブジェクトを作成します。しかし、サブクラスコンストラクターは、その%Symbol.species%プロパティを再定義することにより、その既定の動作を上書きできます。

22.2.6 RegExpプロトタイプオブジェクトのプロパティ

RegExpプロトタイプオブジェクトは以下の通りです:

  • %RegExp.prototype%である。
  • 通常のオブジェクトである。
  • RegExpインスタンスではなく、[[RegExpMatcher]]内部スロットまたはRegExpインスタンスオブジェクトの他の内部スロットを持たない。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
Note

RegExpプロトタイプオブジェクトは独自の"valueOf"プロパティを持ちません。しかし、Objectプロトタイプオブジェクトから"valueOf"プロパティを継承します。

22.2.6.1 RegExp.prototype.constructor

RegExp.prototype.constructorの初期値は %RegExp% です。

22.2.6.2 RegExp.prototype.exec ( string )

このメソッドは string から正規表現パターンの出現を検索し、マッチ結果を含むArrayを返します。または string がマッチしなかった場合は null を返します。

呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. RequireInternalSlot(regexp, [[RegExpMatcher]]) を実行する。
  3. str を ? ToString(string) とする。
  4. RegExpBuiltinExec(regexp, str) を返す。

22.2.6.3 get RegExp.prototype.dotAll

RegExp.prototype.dotAllは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. cu をコード単位0x0073(LATIN SMALL LETTER S)とする。
  3. RegExpHasFlag(regexp, cu) を返す。

22.2.6.4 get RegExp.prototype.flags

RegExp.prototype.flagsは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. regexp がObjectでない場合、TypeError 例外をスローする。
  3. codeUnits を新しい空のListとする。
  4. hasIndicesToBoolean(? Get(regexp, "hasIndices")) とする。
  5. hasIndicestrue の場合、コード単位0x0064(LATIN SMALL LETTER D)を codeUnits に追加する。
  6. globalToBoolean(? Get(regexp, "global")) とする。
  7. globaltrue の場合、コード単位0x0067(LATIN SMALL LETTER G)を codeUnits に追加する。
  8. ignoreCaseToBoolean(? Get(regexp, "ignoreCase")) とする。
  9. ignoreCasetrue の場合、コード単位0x0069(LATIN SMALL LETTER I)を codeUnits に追加する。
  10. multilineToBoolean(? Get(regexp, "multiline")) とする。
  11. multilinetrue の場合、コード単位0x006D(LATIN SMALL LETTER M)を codeUnits に追加する。
  12. dotAllToBoolean(? Get(regexp, "dotAll")) とする。
  13. dotAlltrue の場合、コード単位0x0073(LATIN SMALL LETTER S)を codeUnits に追加する。
  14. unicodeToBoolean(? Get(regexp, "unicode")) とする。
  15. unicodetrue の場合、コード単位0x0075(LATIN SMALL LETTER U)を codeUnits に追加する。
  16. unicodeSetsToBoolean(? Get(regexp, "unicodeSets")) とする。
  17. unicodeSetstrue の場合、コード単位0x0076(LATIN SMALL LETTER V)を codeUnits に追加する。
  18. stickyToBoolean(? Get(regexp, "sticky")) とする。
  19. stickytrue の場合、コード単位0x0079(LATIN SMALL LETTER Y)を codeUnits に追加する。
  20. List codeUnits の要素をコード単位とするString値を返す。codeUnits が要素を持たない場合、空のStringが返される。

22.2.6.4.1 RegExpHasFlag ( regexp, codeUnit )

The abstract operation RegExpHasFlag takes arguments regexp (ECMAScript言語値) and codeUnit (コード単位) and returns Booleanまたはundefinedのいずれかを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. regexp がObjectでない場合、TypeError 例外をスローする。
  2. regexp[[OriginalFlags]] 内部スロットを持たない場合、次を行う:
    1. SameValue(regexp, %RegExp.prototype%) が true の場合、undefined を返す。
    2. TypeError 例外をスローする。
  3. flagsregexp.[[OriginalFlags]] とする。
  4. flagscodeUnit を含む場合、true を返す。
  5. false を返す。

22.2.6.5 get RegExp.prototype.global

RegExp.prototype.globalは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. cu をコード単位0x0067(LATIN SMALL LETTER G)とする。
  3. RegExpHasFlag(regexp, cu) を返す。

22.2.6.6 get RegExp.prototype.hasIndices

RegExp.prototype.hasIndicesは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. cu をコード単位0x0064(LATIN SMALL LETTER D)とする。
  3. RegExpHasFlag(regexp, cu) を返す。

22.2.6.7 get RegExp.prototype.ignoreCase

RegExp.prototype.ignoreCaseは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. cu をコード単位0x0069(LATIN SMALL LETTER I)とする。
  3. RegExpHasFlag(regexp, cu) を返す。

22.2.6.8 RegExp.prototype [ %Symbol.match% ] ( string )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. regexp がObjectでない場合、TypeError 例外をスローする。
  3. str を ? ToString(string) とする。
  4. flags を ? ToString(? Get(regexp, "flags")) とする。
  5. flags"g" を含まない場合、? RegExpExec(regexp, str) を返す。
  6. flags"u" を含むか、または flags"v" を含む場合、fullUnicodetrue とする。そうでない場合、fullUnicodefalse とする。
  7. Set(regexp, "lastIndex", +0𝔽, true) を実行する。
  8. array を ! ArrayCreate(0) とする。
  9. matchCount を 0 とする。
  10. 繰り返す:
    1. result を ? RegExpExec(regexp, str) とする。
    2. resultnull の場合、次を行う:
      1. matchCount = 0 の場合、null を返す。
      2. array を返す。
    3. matchStr を ? ToString(? Get(result, "0")) とする。
    4. CreateDataPropertyOrThrow(array, ! ToString(𝔽(matchCount)), matchStr) を実行する。
    5. matchStr が空のStringである場合、次を行う:
      1. thisIndex(? ToLength(? Get(regexp, "lastIndex"))) とする。
      2. nextIndexAdvanceStringIndex(str, thisIndex, fullUnicode) とする。
      3. Set(regexp, "lastIndex", 𝔽(nextIndex), true) を実行する。
    6. matchCountmatchCount + 1 に設定する。

このメソッドの"name"プロパティの値は "[Symbol.match]" です。

Note

%Symbol.match%プロパティは、正規表現の基本的な動作を持つオブジェクトを識別するためにIsRegExp抽象操作によって使用されます。%Symbol.match%プロパティが存在しないこと、またはそのようなプロパティが存在してもその値がBooleanに強制変換されたとき true にならないことは、そのオブジェクトが正規表現オブジェクトとして使用されることを意図していないことを示します。

22.2.6.9 RegExp.prototype [ %Symbol.matchAll% ] ( string )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. regexp がObjectでない場合、TypeError 例外をスローする。
  3. str を ? ToString(string) とする。
  4. speciesConstructor を ? SpeciesConstructor(regexp, %RegExp%) とする。
  5. flags を ? ToString(? Get(regexp, "flags")) とする。
  6. matcher を ? Construct(speciesConstructor, « regexp, flags ») とする。
  7. lastIndex を ? ToLength(? Get(regexp, "lastIndex")) とする。
  8. Set(matcher, "lastIndex", lastIndex, true) を実行する。
  9. flags"g" を含む場合、globaltrue とする。
  10. それ以外の場合、globalfalse とする。
  11. flags"u" を含むか、または flags"v" を含む場合、fullUnicodetrue とする。
  12. それ以外の場合、fullUnicodefalse とする。
  13. CreateRegExpStringIterator(matcher, str, global, fullUnicode) を返す。

このメソッドの"name"プロパティの値は "[Symbol.matchAll]" です。

22.2.6.10 get RegExp.prototype.multiline

RegExp.prototype.multilineは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. cu をコード単位0x006D(LATIN SMALL LETTER M)とする。
  3. RegExpHasFlag(regexp, cu) を返す。

22.2.6.11 RegExp.prototype [ %Symbol.replace% ] ( string, replaceValue )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. regexp がObjectでない場合、TypeError 例外をスローする。
  3. str を ? ToString(string) とする。
  4. lengthSstr の長さとする。
  5. functionalReplaceIsCallable(replaceValue) とする。
  6. functionalReplacefalse の場合、次を行う:
    1. replaceValue を ? ToString(replaceValue) に設定する。
  7. flags を ? ToString(? Get(regexp, "flags")) とする。
  8. flags"g" を含む場合、globaltrue とする。そうでない場合、globalfalse とする。
  9. globaltrue の場合、次を行う:
    1. Set(regexp, "lastIndex", +0𝔽, true) を実行する。
  10. results を新しい空のListとする。
  11. donefalse とする。
  12. donefalse の間、繰り返す:
    1. result を ? RegExpExec(regexp, str) とする。
    2. resultnull の場合、次を行う:
      1. donetrue に設定する。
    3. それ以外の場合、
      1. resultresults に追加する。
      2. globalfalse の場合、次を行う:
        1. donetrue に設定する。
      3. それ以外の場合、
        1. matchStr を ? ToString(? Get(result, "0")) とする。
        2. matchStr が空のStringである場合、次を行う:
          1. thisIndex(? ToLength(? Get(regexp, "lastIndex"))) とする。
          2. flags"u" を含むか、または flags"v" を含む場合、fullUnicodetrue とする。そうでない場合、fullUnicodefalse とする。
          3. nextIndexAdvanceStringIndex(str, thisIndex, fullUnicode) とする。
          4. Set(regexp, "lastIndex", 𝔽(nextIndex), true) を実行する。
  13. accumulatedResult を空のStringとする。
  14. nextSourcePosition を 0 とする。
  15. results の各要素 result について、次を行う:
    1. resultLength を ? LengthOfArrayLike(result) とする。
    2. nCapturesmax(resultLength - 1, 0) とする。
    3. matched を ? ToString(? Get(result, "0")) とする。
    4. matchLengthmatched の長さとする。
    5. position を ? ToIntegerOrInfinity(? Get(result, "index")) とする。
    6. position を、0と lengthS の間にクランプした結果に設定する。
    7. captures を新しい空のListとする。
    8. captureNumber を 1 とする。
    9. captureNumbernCaptures の間、繰り返す:
      1. capN を ? Get(result, ! ToString(𝔽(captureNumber))) とする。
      2. capNundefined でない場合、次を行う:
        1. capN を ? ToString(capN) に設定する。
      3. capNcaptures に追加する。
      4. NOTE: captureNumber = 1 の場合、直前のステップは最初の要素を captures(インデックス0)に入れる。より一般には、captureNumber番目 のキャプチャ(captureNumber番目 のキャプチャ括弧集合によってキャプチャされた文字)は captures[captureNumber - 1] にある。
      5. captureNumbercaptureNumber + 1 に設定する。
    10. namedCaptures を ? Get(result, "groups") とする。
    11. functionalReplacetrue の場合、次を行う:
      1. replacerArgs を « matched »、captures、および « 𝔽(position), str » のリスト連結とする。
      2. namedCapturesundefined でない場合、次を行う:
        1. namedCapturesreplacerArgs に追加する。
      3. replacementValue を ? Call(replaceValue, undefined, replacerArgs) とする。
      4. replacementString を ? ToString(replacementValue) とする。
    12. それ以外の場合、
      1. namedCapturesundefined でない場合、次を行う:
        1. namedCaptures を ? ToObject(namedCaptures) に設定する。
      2. replacementString を ? GetSubstitution(matched, str, position, captures, namedCaptures, replaceValue) とする。
    13. positionnextSourcePosition の場合、次を行う:
      1. NOTE: position は通常、後方へ移動すべきではない。もしそうなる場合、それはRegExpサブクラスの不適切な挙動、またはアクセストリガーの副作用を用いて regexp のglobalフラグまたは他の特性を変更したことを示している。そのような場合、対応する置換は無視される。
      2. accumulatedResult を、accumulatedResultstrnextSourcePosition から position までの部分文字列、および replacementString の文字列連結に設定する。
      3. nextSourcePositionposition + matchLength に設定する。
  16. nextSourcePositionlengthS の場合、accumulatedResult を返す。
  17. accumulatedResultstrnextSourcePosition からの部分文字列の文字列連結を返す。

このメソッドの"name"プロパティの値は "[Symbol.replace]" です。

22.2.6.12 RegExp.prototype [ %Symbol.search% ] ( string )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. regexp がObjectでない場合、TypeError 例外をスローする。
  3. str を ? ToString(string) とする。
  4. previousLastIndex を ? Get(regexp, "lastIndex") とする。
  5. previousLastIndex+0𝔽 でない場合、次を行う:
    1. Set(regexp, "lastIndex", +0𝔽, true) を実行する。
  6. result を ? RegExpExec(regexp, str) とする。
  7. currentLastIndex を ? Get(regexp, "lastIndex") とする。
  8. SameValue(currentLastIndex, previousLastIndex) が false の場合、次を行う:
    1. Set(regexp, "lastIndex", previousLastIndex, true) を実行する。
  9. resultnull の場合、-1𝔽 を返す。
  10. Get(result, "index") を返す。

このメソッドの"name"プロパティの値は "[Symbol.search]" です。

Note

このRegExpオブジェクトの"lastIndex"および"global"プロパティは、検索を実行するとき無視されます。"lastIndex"プロパティは変更されません。

22.2.6.13 get RegExp.prototype.source

RegExp.prototype.sourceは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. regexp がObjectでない場合、TypeError 例外をスローする。
  3. regexp[[OriginalSource]] 内部スロットを持たない場合、次を行う:
    1. SameValue(regexp, %RegExp.prototype%) が true の場合、"(?:)" を返す。
    2. TypeError 例外をスローする。
  4. Assert: regexp[[OriginalFlags]] 内部スロットを持つ。
  5. srcregexp.[[OriginalSource]] とする。
  6. flagsregexp.[[OriginalFlags]] とする。
  7. EscapeRegExpPattern(src, flags) を返す。

22.2.6.13.1 EscapeRegExpPattern ( pattern, flags )

The abstract operation EscapeRegExpPattern takes arguments pattern (String) and flags (String) and returns String. It performs the following steps when called:

  1. flags"v" を含む場合、次を行う:
    1. patternSymbolPattern[+UnicodeMode, +UnicodeSetsMode] とする。
  2. そうでなく flags"u" を含む場合、次を行う:
    1. patternSymbolPattern[+UnicodeMode, ~UnicodeSetsMode] とする。
  3. それ以外の場合、
    1. patternSymbolPattern[~UnicodeMode, ~UnicodeSetsMode] とする。
  4. escapedPattern を、UTF-16符号化Unicodeコードポイント(6.1.4)として解釈された pattern と等価な patternSymbol 形式のStringとし、その中で特定のコードポイントは以下で説明されるようにエスケープされているものとする。escapedPatternpattern と異なっても異ならなくてもよい。ただし、escapedPatternpatternSymbol として評価することで生じるAbstract Closureは、構築されたオブジェクトの[[RegExpMatcher]]内部スロットによって与えられるAbstract Closureと同一に動作しなければならない。同じ pattern および flags の値を用いたこの抽象操作への複数回の呼び出しは、同一の結果を生成しなければならない。
  5. パターン内に出現するコードポイント / または任意の LineTerminator は、"\"/escapedPattern"/"、および flags の文字列連結が、(適切な字句文脈で)構築された正規表現と同一に動作する RegularExpressionLiteral として解析できることを保証するために、必要に応じて escapedPattern 内でエスケープされなければならない。例えば、pattern"/" である場合、escapedPattern"\/" または "\u002F" などであり得るが、"/" ではあり得ない。なぜなら、flags が後続する ///RegularExpressionLiteral ではなく SingleLineComment として解析されるためである。pattern が空のStringである場合、この仕様は escapedPattern"(?:)" とすることで満たすことができる。
  6. escapedPattern を返す。
Note

名前は似ていますが、RegExp.escapeとEscapeRegExpPatternは同様の動作を行いません。前者はパターン内で表現するために文字列をエスケープし、この関数は文字列として表現するためにパターンをエスケープします。

22.2.6.14 RegExp.prototype [ %Symbol.split% ] ( string, limit )

Note 1

このメソッドは、string をStringに変換した結果の部分文字列を格納したArrayを返します。部分文字列は、this値の正規表現とのマッチを左から右に検索することによって決定されます。これらの出現は返される配列内のどのStringの一部でもありませんが、String値を分割する役割を果たします。

this値は空の正規表現、または空のStringにマッチできる正規表現であってもかまいません。この場合、正規表現は入力Stringの先頭または末尾の空の部分文字列にはマッチせず、また前回のセパレータマッチの末尾の空の部分文字列にもマッチしません。(例えば、正規表現が空のStringにマッチする場合、Stringは個々のコード単位要素に分割されます。結果配列の長さはStringの長さに等しく、各部分文字列は1つのコード単位を含みます。)バックトラッキングによってそのインデックスで空でない部分文字列マッチが得られ得る場合でも、Stringの特定のインデックスにおける最初のマッチのみが考慮されます。(例えば、/a*?/[Symbol.split]("ab") は配列 ["a", "b"] に評価される一方、/a*/[Symbol.split]("ab") は配列 ["","b"] に評価されます。)

string が空のStringである(または空のStringに変換される)場合、結果は正規表現が空のStringにマッチできるかどうかに依存します。マッチできる場合、結果配列は要素を含みません。そうでない場合、結果配列は1つの要素を含み、それは空のStringです。

正規表現がキャプチャ括弧を含む場合、separator がマッチするたびに、キャプチャ括弧の結果(任意の undefined 結果を含む)が出力配列に挿入されます。例えば、

/<(\/)?([^<>]+)>/[Symbol.split]("A<B>bold</B>and<CODE>coded</CODE>")

は次の配列に評価されます:

["A", undefined, "B", "bold", "/", "B", "and", undefined, "CODE", "coded", "/", "CODE", ""]

limitundefined でない場合、出力配列は limit 要素以下になるように切り詰められます。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. regexp がObjectでない場合、TypeError 例外をスローする。
  3. str を ? ToString(string) とする。
  4. speciesConstructor を ? SpeciesConstructor(regexp, %RegExp%) とする。
  5. flags を ? ToString(? Get(regexp, "flags")) とする。
  6. flags"u" を含むか、または flags"v" を含む場合、unicodeMatchingtrue とする。
  7. それ以外の場合、unicodeMatchingfalse とする。
  8. flags"y" を含む場合、newFlagsflags とする。
  9. それ以外の場合、newFlagsflags"y" の文字列連結とする。
  10. splitter を ? Construct(speciesConstructor, « regexp, newFlags ») とする。
  11. array を ! ArrayCreate(0) とする。
  12. lengthA を 0 とする。
  13. limitundefined の場合、lim を 232 - 1 とする。そうでない場合、lim(? ToUint32(limit)) とする。
  14. lim = 0 の場合、array を返す。
  15. str が空のStringである場合、次を行う:
    1. matchResult を ? RegExpExec(splitter, str) とする。
    2. matchResultnull でない場合、array を返す。
    3. CreateDataPropertyOrThrow(array, "0", str) を実行する。
    4. array を返す。
  16. sizestr の長さとする。
  17. lastMatchEnd を 0 とする。
  18. searchIndexlastMatchEnd とする。
  19. searchIndex < size の間、繰り返す:
    1. Set(splitter, "lastIndex", 𝔽(searchIndex), true) を実行する。
    2. matchResult を ? RegExpExec(splitter, str) とする。
    3. matchResultnull の場合、次を行う:
      1. searchIndexAdvanceStringIndex(str, searchIndex, unicodeMatching) に設定する。
    4. それ以外の場合、
      1. matchEnd(? ToLength(? Get(splitter, "lastIndex"))) とする。
      2. matchEndmin(matchEnd, size) に設定する。
      3. matchEnd = lastMatchEnd の場合、次を行う:
        1. searchIndexAdvanceStringIndex(str, searchIndex, unicodeMatching) に設定する。
      4. それ以外の場合、
        1. substringstrlastMatchEnd から searchIndex までの部分文字列とする。
        2. CreateDataPropertyOrThrow(array, ! ToString(𝔽(lengthA)), substring) を実行する。
        3. lengthAlengthA + 1 に設定する。
        4. lengthA = lim の場合、array を返す。
        5. lastMatchEndmatchEnd に設定する。
        6. numberOfCaptures を ? LengthOfArrayLike(matchResult) とする。
        7. numberOfCapturesmax(numberOfCaptures - 1, 0) に設定する。
        8. captureIndex を 1 とする。
        9. captureIndexnumberOfCaptures の間、繰り返す:
          1. nextCapture を ? Get(matchResult, ! ToString(𝔽(captureIndex))) とする。
          2. CreateDataPropertyOrThrow(array, ! ToString(𝔽(lengthA)), nextCapture) を実行する。
          3. captureIndexcaptureIndex + 1 に設定する。
          4. lengthAlengthA + 1 に設定する。
          5. lengthA = lim の場合、array を返す。
        10. searchIndexlastMatchEnd に設定する。
  20. substringstrlastMatchEnd から size までの部分文字列とする。
  21. CreateDataPropertyOrThrow(array, ! ToString(𝔽(lengthA)), substring) を実行する。
  22. array を返す。

このメソッドの"name"プロパティの値は "[Symbol.split]" です。

Note 2

このメソッドは、このRegExpオブジェクトの"global"および"sticky"プロパティの値を無視します。

22.2.6.15 get RegExp.prototype.sticky

RegExp.prototype.stickyは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. cu をコード単位0x0079(LATIN SMALL LETTER Y)とする。
  3. RegExpHasFlag(regexp, cu) を返す。

22.2.6.16 RegExp.prototype.test ( str )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. regexp がObjectでない場合、TypeError 例外をスローする。
  3. string を ? ToString(str) とする。
  4. match を ? RegExpExec(regexp, string) とする。
  5. matchnull の場合、false を返す。
  6. true を返す。

22.2.6.17 RegExp.prototype.toString ( )

  1. regexpthis値とする。
  2. regexp がObjectでない場合、TypeError 例外をスローする。
  3. pattern を ? ToString(? Get(regexp, "source")) とする。
  4. flags を ? ToString(? Get(regexp, "flags")) とする。
  5. result"/"pattern"/"、および flags の文字列連結とする。
  6. result を返す。
Note

返されるStringは、このオブジェクトと同じ動作を持つ別のRegExpオブジェクトに評価される RegularExpressionLiteral の形式を持ちます。

22.2.6.18 get RegExp.prototype.unicode

RegExp.prototype.unicodeは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. cu をコード単位0x0075(LATIN SMALL LETTER U)とする。
  3. RegExpHasFlag(regexp, cu) を返す。

22.2.6.19 get RegExp.prototype.unicodeSets

RegExp.prototype.unicodeSetsは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. regexpthis値とする。
  2. cu をコード単位0x0076(LATIN SMALL LETTER V)とする。
  3. RegExpHasFlag(regexp, cu) を返す。

22.2.7 RegExpマッチングのための抽象操作

22.2.7.1 RegExpExec ( regexp, str )

The abstract operation RegExpExec takes arguments regexp (Object) and str (String) and returns Objectまたはnullのいずれかを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. exec を ? Get(regexp, "exec") とする。
  2. IsCallable(exec) が true の場合、次を行う:
    1. result を ? Call(exec, regexp, « str ») とする。
    2. result がObjectでなく、かつ resultnull でない場合、TypeError 例外をスローする。
    3. result を返す。
  3. RequireInternalSlot(regexp, [[RegExpMatcher]]) を実行する。
  4. RegExpBuiltinExec(regexp, str) を返す。
Note

呼び出し可能な"exec"プロパティが見つからない場合、このアルゴリズムは組み込みRegExpマッチングアルゴリズムの使用を試みるようにフォールバックします。これは、正規表現を使用するほとんどの組み込みアルゴリズムが"exec"の動的プロパティ検索を行わなかった以前の版向けに書かれたコードに対して互換性のある動作を提供します。

22.2.7.2 RegExpBuiltinExec ( regexp, str )

The abstract operation RegExpBuiltinExec takes arguments regexp (初期化済みRegExpインスタンス) and str (String) and returns Array exotic objectまたはnullのいずれかを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. lengthstr の長さとする。
  2. lastIndex(? ToLength(! Get(regexp, "lastIndex"))) とする。
  3. flagsregexp.[[OriginalFlags]] とする。
  4. flags"g" を含む場合、globaltrue とする。そうでない場合、globalfalse とする。
  5. flags"y" を含む場合、stickytrue とする。そうでない場合、stickyfalse とする。
  6. flags"d" を含む場合、hasIndicestrue とする。そうでない場合、hasIndicesfalse とする。
  7. globalfalse かつ stickyfalse の場合、lastIndex を0に設定する。
  8. matcherregexp.[[RegExpMatcher]] とする。
  9. flags"u" を含むか、または flags"v" を含む場合、fullUnicodetrue とする。そうでない場合、fullUnicodefalse とする。
  10. matchSucceededfalse とする。
  11. fullUnicodetrue の場合、inputStringToCodePoints(str) とする。そうでない場合、input を、str の要素であるコード単位を要素とするListとする。
  12. NOTE: input の各要素はcharacterと見なされる。
  13. matchSucceededfalse の間、繰り返す:
    1. lastIndex > length の場合、次を行う:
      1. globaltrue または stickytrue の場合、次を行う:
        1. Set(regexp, "lastIndex", +0𝔽, true) を実行する。
      2. null を返す。
    2. inputIndex を、str の要素 lastIndex から得られたcharacterの input 内のインデックスとする。
    3. rmatcher(input, inputIndex) とする。
    4. rfailure の場合、次を行う:
      1. stickytrue の場合、次を行う:
        1. Set(regexp, "lastIndex", +0𝔽, true) を実行する。
        2. null を返す。
      2. lastIndexAdvanceStringIndex(str, lastIndex, fullUnicode) に設定する。
    5. それ以外の場合、
      1. Assert: rMatchStateである。
      2. matchSucceededtrue に設定する。
  14. endIndexr.[[EndIndex]] とする。
  15. fullUnicodetrue の場合、endIndexGetStringIndex(str, endIndex) に設定する。
  16. globaltrue または stickytrue の場合、次を行う:
    1. Set(regexp, "lastIndex", 𝔽(endIndex), true) を実行する。
  17. nr.[[Captures]] 内の要素数とする。
  18. Assert: n = regexp.[[RegExpRecord]].[[CapturingGroupsCount]]
  19. Assert: n < 232 - 1。
  20. array を ! ArrayCreate(n + 1) とする。
  21. Assert: array"length"プロパティの数学的値は n + 1 である。
  22. CreateDataPropertyOrThrow(array, "index", 𝔽(lastIndex)) を実行する。
  23. CreateDataPropertyOrThrow(array, "input", str) を実行する。
  24. matchMatch Record { [[StartIndex]]: lastIndex, [[EndIndex]]: endIndex } とする。
  25. indices を新しい空のListとする。
  26. groupNames を新しい空のListとする。
  27. matchindices に追加する。
  28. matchedSubstrGetMatchString(str, match) とする。
  29. CreateDataPropertyOrThrow(array, "0", matchedSubstr) を実行する。
  30. regexp が任意の GroupName を含む場合、次を行う:
    1. groupsOrdinaryObjectCreate(null) とする。
    2. hasGroupstrue とする。
  31. それ以外の場合、
    1. groupsundefined とする。
    2. hasGroupsfalse とする。
  32. CreateDataPropertyOrThrow(array, "groups", groups) を実行する。
  33. matchedGroupNames を新しい空のListとする。
  34. 1 ≤ in である各整数 i について、昇順に、次を行う:
    1. captureIr.[[Captures]]i番目 の要素とする。
    2. captureIundefined の場合、次を行う:
      1. capturedValueundefined とする。
      2. undefinedindices に追加する。
    3. それ以外の場合、
      1. captureStartcaptureI.[[StartIndex]] とする。
      2. captureEndcaptureI.[[EndIndex]] とする。
      3. fullUnicodetrue の場合、次を行う:
        1. captureStartGetStringIndex(str, captureStart) に設定する。
        2. captureEndGetStringIndex(str, captureEnd) に設定する。
      4. captureMatch Record { [[StartIndex]]: captureStart, [[EndIndex]]: captureEnd } とする。
      5. capturedValueGetMatchString(str, capture) とする。
      6. captureindices に追加する。
    4. CreateDataPropertyOrThrow(array, ! ToString(𝔽(i)), capturedValue) を実行する。
    5. regexpi番目 のキャプチャが GroupName で定義されていた場合、次を行う:
      1. s をその GroupNameCapturingGroupNameとする。
      2. matchedGroupNamess を含む場合、次を行う:
        1. Assert: capturedValueundefined である。
        2. undefinedgroupNames に追加する。
      3. それ以外の場合、
        1. capturedValueundefined でない場合、smatchedGroupNames に追加する。
        2. NOTE: s という名前のグループが複数ある場合、この時点で groups はすでに s プロパティを持っている可能性がある。しかし、groups はすべてのプロパティが書き込み可能なデータプロパティである通常のオブジェクトであるため、CreateDataPropertyOrThrow の呼び出しはそれでも成功することが保証される。
        3. CreateDataPropertyOrThrow(groups, s, capturedValue) を実行する。
        4. sgroupNames に追加する。
    6. それ以外の場合、
      1. undefinedgroupNames に追加する。
  35. hasIndicestrue の場合、次を行う:
    1. indicesArrayMakeMatchIndicesIndexPairArray(str, indices, groupNames, hasGroups) とする。
    2. CreateDataPropertyOrThrow(array, "indices", indicesArray) を実行する。
  36. array を返す。

22.2.7.3 AdvanceStringIndex ( str, index, unicode )

The abstract operation AdvanceStringIndex takes arguments str (a String), index (a non-negative integer), and unicode (a Boolean) and returns a non-negative integer. It performs the following steps when called:

  1. Assert: index ≤ 253 - 1。
  2. unicodefalse の場合、index + 1 を返す。
  3. lengthstr の長さとする。
  4. index + 1 ≥ length の場合、index + 1 を返す。
  5. cpCodePointAt(str, index) とする。
  6. index + cp.[[CodeUnitCount]] を返す。

22.2.7.4 GetStringIndex ( str, codePointIndex )

The abstract operation GetStringIndex takes arguments str (String) and codePointIndex (非負整数) and returns 非負整数. これは、6.1.4 で説明されるように str をUTF-16符号化コードポイントの列として解釈し、そのようなインデックスが存在する場合、コードポイントインデックス codePointIndex に対応するコード単位インデックスを返します。存在しない場合、str の長さを返します。 It performs the following steps when called:

  1. str が空のStringである場合、0を返す。
  2. lenstr の長さとする。
  3. codeUnitCount を0とする。
  4. codePointCount を0とする。
  5. codeUnitCount < len の間、繰り返す:
    1. codePointCount = codePointIndex の場合、codeUnitCount を返す。
    2. cpCodePointAt(str, codeUnitCount) とする。
    3. codeUnitCountcodeUnitCount + cp.[[CodeUnitCount]] に設定する。
    4. codePointCountcodePointCount + 1 に設定する。
  6. len を返す。

22.2.7.5 Match Record

Match Record は、正規表現マッチまたはキャプチャの開始インデックスと終了インデックスをカプセル化するために使用されるRecord値です。

Match Recordは、Table 67 に列挙されているフィールドを持ちます。

Table 67: Match Record Fields
フィールド名 意味
[[StartIndex]] 非負整数 マッチが始まる(包含)文字列の先頭からのコード単位数。
[[EndIndex]] [[StartIndex]]以上の整数 マッチが終わる(排他)文字列の先頭からのコード単位数。

22.2.7.6 GetMatchString ( str, match )

The abstract operation GetMatchString takes arguments str (String) and match (Match Record) and returns String. It performs the following steps when called:

  1. Assert: match.[[StartIndex]]match.[[EndIndex]]str の長さ。
  2. strmatch.[[StartIndex]] から match.[[EndIndex]] までの部分文字列を返す。

22.2.7.7 GetMatchIndexPair ( str, match )

The abstract operation GetMatchIndexPair takes arguments str (String) and match (Match Record) and returns Array. It performs the following steps when called:

  1. Assert: match.[[StartIndex]]match.[[EndIndex]]str の長さ。
  2. CreateArrayFromList𝔽(match.[[StartIndex]]), 𝔽(match.[[EndIndex]]) ») を返す。

22.2.7.8 MakeMatchIndicesIndexPairArray ( str, indices, groupNames, hasGroups )

The abstract operation MakeMatchIndicesIndexPairArray takes arguments str (String), indices (Match RecordまたはundefinedのいずれかのList), groupNames (StringまたはundefinedのいずれかのList), and hasGroups (Boolean) and returns Array. It performs the following steps when called:

  1. nindices 内の要素数とする。
  2. Assert: n < 232 - 1。
  3. Assert: groupNamesn - 1 個の要素を持つ。
  4. NOTE: groupNames Listは、indices[1]から始まる indices Listと整列した要素を含む。
  5. array を ! ArrayCreate(n) とする。
  6. hasGroupstrue の場合、次を行う:
    1. groupsOrdinaryObjectCreate(null) とする。
  7. それ以外の場合、
    1. groupsundefined とする。
  8. CreateDataPropertyOrThrow(array, "groups", groups) を実行する。
  9. 0 ≤ i < n である各整数 i について、昇順に、次を行う:
    1. matchIndicesindices[i] とする。
    2. matchIndicesundefined でない場合、次を行う:
      1. matchIndexPairGetMatchIndexPair(str, matchIndices) とする。
    3. それ以外の場合、
      1. matchIndexPairundefined とする。
    4. CreateDataPropertyOrThrow(array, ! ToString(𝔽(i)), matchIndexPair) を実行する。
    5. i > 0 の場合、次を行う:
      1. namegroupNames[i - 1] とする。
      2. nameundefined でない場合、次を行う:
        1. Assert: groupsundefined でない。
        2. NOTE: name という名前のグループが複数ある場合、この時点で groups はすでに name プロパティを持っている可能性がある。しかし、groups はすべてのプロパティが書き込み可能なデータプロパティである通常のオブジェクトであるため、CreateDataPropertyOrThrow の呼び出しはそれでも成功することが保証される。
        3. CreateDataPropertyOrThrow(groups, name, matchIndexPair) を実行する。
  10. array を返す。

22.2.8 RegExpインスタンスのプロパティ

RegExpインスタンスは、RegExpプロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。RegExpインスタンスは内部スロット [[OriginalSource]][[OriginalFlags]][[RegExpRecord]]、および [[RegExpMatcher]] を持ちます。[[RegExpMatcher]] 内部スロットの値は、RegExpオブジェクトの PatternAbstract Closure表現です。

Note

ECMAScript 2015より前は、RegExpインスタンスは独自のデータプロパティ"source""global""ignoreCase"、および"multiline"を持つものとして指定されていました。現在、これらのプロパティはRegExp.prototypeのアクセサープロパティとして指定されています。

RegExpインスタンスは、以下のプロパティも持ちます:

22.2.8.1 lastIndex

"lastIndex"プロパティの値は、次のマッチを開始するStringインデックスを指定します。使用されるとき、これは整数Numberに強制変換されます(22.2.7.2 を参照)。このプロパティは属性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } を持たなければなりません。

22.2.9 RegExp String Iteratorオブジェクト

RegExp String Iterator は、ある特定のStringインスタンスオブジェクトに対して、ある特定のRegExpインスタンスオブジェクトとマッチさせながら行う特定の反復を表すオブジェクトです。RegExp String Iteratorオブジェクトには名前付きコンストラクターはありません。代わりに、RegExp String IteratorオブジェクトはRegExpインスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。

22.2.9.1 CreateRegExpStringIterator ( regexp, str, global, fullUnicode )

The abstract operation CreateRegExpStringIterator takes arguments regexp (Object), str (String), global (Boolean), and fullUnicode (Boolean) and returns Object. It performs the following steps when called:

  1. iteratorOrdinaryObjectCreate(%RegExpStringIteratorPrototype%, « [[IteratingRegExp]], [[IteratedString]], [[Global]], [[Unicode]], [[Done]] ») とする。
  2. iterator.[[IteratingRegExp]]regexp に設定する。
  3. iterator.[[IteratedString]]str に設定する。
  4. iterator.[[Global]]global に設定する。
  5. iterator.[[Unicode]]fullUnicode に設定する。
  6. iterator.[[Done]]false に設定する。
  7. iterator を返す。

22.2.9.2 %RegExpStringIteratorPrototype%オブジェクト

%RegExpStringIteratorPrototype%オブジェクトは以下の通りです:

  • すべてのRegExp String Iteratorオブジェクトによって継承されるプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]]内部スロットを持ち、その値は %Iterator.prototype% である。
  • 以下のプロパティを持つ:

22.2.9.2.1 %RegExpStringIteratorPrototype%.next ( )

  1. iteratorObjthis値とする。
  2. iteratorObj がObjectでない場合、TypeError 例外をスローする。
  3. iteratorObjRegExp String Iteratorオブジェクトインスタンスのすべての内部スロット(22.2.9.3 を参照)を持たない場合、TypeError 例外をスローする。
  4. iteratorObj.[[Done]]true の場合、次を行う:
    1. CreateIteratorResultObject(undefined, true) を返す。
  5. regexpiteratorObj.[[IteratingRegExp]] とする。
  6. striteratorObj.[[IteratedString]] とする。
  7. globaliteratorObj.[[Global]] とする。
  8. fullUnicodeiteratorObj.[[Unicode]] とする。
  9. match を ? RegExpExec(regexp, str) とする。
  10. matchnull の場合、次を行う:
    1. iteratorObj.[[Done]]true に設定する。
    2. CreateIteratorResultObject(undefined, true) を返す。
  11. globalfalse の場合、次を行う:
    1. iteratorObj.[[Done]]true に設定する。
    2. CreateIteratorResultObject(match, false) を返す。
  12. matchStr を ? ToString(? Get(match, "0")) とする。
  13. matchStr が空のStringである場合、次を行う:
    1. thisIndex(? ToLength(? Get(regexp, "lastIndex"))) とする。
    2. nextIndexAdvanceStringIndex(str, thisIndex, fullUnicode) とする。
    3. Set(regexp, "lastIndex", 𝔽(nextIndex), true) を実行する。
  14. 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インスタンスは、最初に Table 68 に列挙されている内部スロットを持つように作成されます。

Table 68: Internal Slots of RegExp String Iterator Instances
内部スロット 説明
[[IteratingRegExp]] Object 反復に使用される正規表現。IsRegExp([[IteratingRegExp]]) は初期状態で true です。
[[IteratedString]] String 反復対象のString値。
[[Global]] Boolean [[IteratingRegExp]] がglobalであるかどうかを示します。
[[Unicode]] Boolean [[IteratingRegExp]] がUnicodeモードであるかどうかを示します。
[[Done]] Boolean 反復が完了したかどうかを示します。

23 インデックス付きコレクション

23.1 Arrayオブジェクト

Arrayは、あるクラスのプロパティ名を特別に扱うexotic objectです。この特別な扱いの定義については 10.4.2 を参照してください。

23.1.1 Arrayコンストラクター

Arrayコンストラクターは以下の通りです:

  • %Array%である。
  • グローバルオブジェクト"Array"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいArrayを作成して初期化する。
  • コンストラクターとしてではなく関数として呼び出されたときも、新しいArrayを作成して初期化する。したがって、関数呼び出し Array(…) は、同じ引数を持つオブジェクト作成式 new Array(…) と等価である。
  • 引数の数と型に基づいて動作が異なる関数である。
  • クラス定義のextends節の値として使用できる。exotic Arrayの動作を継承することを意図するサブクラスコンストラクターは、Array exotic objectであるサブクラスインスタンスを初期化するために、Arrayコンストラクターへのsuper呼び出しを含めなければならない。ただし、Array.prototypeメソッドの大部分は汎用メソッドであり、そのthis値がArray exotic objectであることに依存しない。

23.1.1.1 Array ( ...values )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、newTarget を実行中の関数オブジェクトとする。そうでない場合、newTarget を NewTarget とする。
  2. proto を ? GetPrototypeFromConstructor(newTarget, "%Array.prototype%") とする。
  3. numberOfArgsvalues 内の要素数とする。
  4. numberOfArgs = 0 の場合、! ArrayCreate(0, proto) を返す。
  5. numberOfArgs = 1 の場合、次を行う:
    1. lenvalues[0] とする。
    2. array を ! ArrayCreate(0, proto) とする。
    3. len がNumberでない場合、次を行う:
      1. CreateDataPropertyOrThrow(array, "0", len) を実行する。
      2. intLen1𝔽 とする。
    4. それ以外の場合、
      1. intLen を ! ToUint32(len) とする。
      2. SameValueZero(intLen, len) が false の場合、RangeError 例外をスローする。
    5. Set(array, "length", intLen, true) を実行する。
    6. array を返す。
  6. Assert: numberOfArgs ≥ 2。
  7. array を ? ArrayCreate(numberOfArgs, proto) とする。
  8. k を 0 とする。
  9. k < numberOfArgs の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. itemKvalues[k] とする。
    3. CreateDataPropertyOrThrow(array, propertyKey, itemK) を実行する。
    4. kk + 1 に設定する。
  10. Assert: array"length"プロパティの数学的値は numberOfArgs である。
  11. array を返す。

23.1.2 Arrayコンストラクターのプロパティ

Arrayコンストラクターは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 値が 1𝔽 である"length"プロパティを持つ。
  • 以下のプロパティを持つ:

23.1.2.1 Array.from ( items [ , mapper [ , thisArg ] ] )

この関数は呼び出されたとき、次の手順を実行します:

  1. constructorthis値とする。
  2. mapperundefined の場合、次を行う:
    1. mappingfalse とする。
  3. それ以外の場合、
    1. IsCallable(mapper) が false の場合、TypeError 例外をスローする。
    2. mappingtrue とする。
  4. usingIterator を ? GetMethod(items, %Symbol.iterator%) とする。
  5. usingIteratorundefined でない場合、次を行う:
    1. IsConstructor(constructor) が true の場合、次を行う:
      1. array を ? Construct(constructor) とする。
    2. それ以外の場合、
      1. array を ! ArrayCreate(0) とする。
    3. iteratorRecord を ? GetIteratorFromMethod(items, usingIterator) とする。
    4. k を 0 とする。
    5. 繰り返す:
      1. k ≥ 253 - 1 の場合、次を行う:
        1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
        2. IteratorClose(iteratorRecord, error) を返す。
      2. propertyKey を ! ToString(𝔽(k)) とする。
      3. next を ? IteratorStepValue(iteratorRecord) とする。
      4. nextdone の場合、次を行う:
        1. Set(array, "length", 𝔽(k), true) を実行する。
        2. array を返す。
      5. mappingtrue の場合、次を行う:
        1. mappedValueCompletion(Call(mapper, thisArg, « next, 𝔽(k) »)) とする。
        2. IfAbruptCloseIterator(mappedValue, iteratorRecord)。
      6. それ以外の場合、
        1. mappedValuenext とする。
      7. defineStatusCompletion(CreateDataPropertyOrThrow(array, propertyKey, mappedValue)) とする。
      8. IfAbruptCloseIterator(defineStatus, iteratorRecord)。
      9. kk + 1 に設定する。
  6. NOTE: itemsiterableではないため、array-like objectであると仮定する。
  7. arrayLike を ! ToObject(items) とする。
  8. len を ? LengthOfArrayLike(arrayLike) とする。
  9. IsConstructor(constructor) が true の場合、次を行う:
    1. array を ? Construct(constructor, « 𝔽(len) ») とする。
  10. それ以外の場合、
    1. array を ? ArrayCreate(len) とする。
  11. k を 0 とする。
  12. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kValue を ? Get(arrayLike, propertyKey) とする。
    3. mappingtrue の場合、次を行う:
      1. mappedValue を ? Call(mapper, thisArg, « kValue, 𝔽(k) ») とする。
    4. それ以外の場合、
      1. mappedValuekValue とする。
    5. CreateDataPropertyOrThrow(array, propertyKey, mappedValue) を実行する。
    6. kk + 1 に設定する。
  13. Set(array, "length", 𝔽(len), true) を実行する。
  14. array を返す。
Note

このメソッドは意図的に汎用のファクトリメソッドです。そのthis値がArrayコンストラクターであることを要求しません。したがって、単一の数値引数で呼び出され得る任意の他のコンストラクターに移すこと、またはそれらに継承させることができます。

23.1.2.2 Array.fromAsync ( items [ , mapper [ , thisArg ] ] )

このasync関数は呼び出されたとき、次の手順を実行します:

  1. constructorthis値とする。
  2. mappingfalse とする。
  3. mapperundefined でない場合、次を行う:
    1. IsCallable(mapper) が false の場合、TypeError 例外をスローする。
    2. mappingtrue に設定する。
  4. iteratorRecordundefined とする。
  5. usingAsyncIterator を ? GetMethod(items, %Symbol.asyncIterator%) とする。
  6. usingAsyncIteratorundefined の場合、次を行う:
    1. usingSyncIterator を ? GetMethod(items, %Symbol.iterator%) とする。
    2. usingSyncIteratorundefined でない場合、次を行う:
      1. iteratorRecordCreateAsyncFromSyncIterator(? GetIteratorFromMethod(items, usingSyncIterator)) に設定する。
  7. それ以外の場合、
    1. iteratorRecord を ? GetIteratorFromMethod(items, usingAsyncIterator) に設定する。
  8. iteratorRecordundefined でない場合、次を行う:
    1. IsConstructor(constructor) が true の場合、次を行う:
      1. array を ? Construct(constructor) とする。
    2. それ以外の場合、
      1. array を ! ArrayCreate(0) とする。
    3. k を 0 とする。
    4. 繰り返す:
      1. k ≥ 253 - 1 の場合、次を行う:
        1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
        2. AsyncIteratorClose(iteratorRecord, error) を返す。
      2. propertyKey を ! ToString(𝔽(k)) とする。
      3. nextResult を ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]) とする。
      4. nextResult を ? Await(nextResult) に設定する。
      5. nextResult がObjectでない場合、TypeError 例外をスローする。
      6. done を ? IteratorComplete(nextResult) とする。
      7. donetrue の場合、次を行う:
        1. Set(array, "length", 𝔽(k), true) を実行する。
        2. array を返す。
      8. nextValue を ? IteratorValue(nextResult) とする。
      9. mappingtrue の場合、次を行う:
        1. mappedValueCompletion(Call(mapper, thisArg, « nextValue, 𝔽(k) »)) とする。
        2. IfAbruptCloseAsyncIterator(mappedValue, iteratorRecord)。
        3. mappedValueCompletion(Await(mappedValue)) に設定する。
        4. IfAbruptCloseAsyncIterator(mappedValue, iteratorRecord)。
      10. それ以外の場合、
        1. mappedValuenextValue とする。
      11. defineStatusCompletion(CreateDataPropertyOrThrow(array, propertyKey, mappedValue)) とする。
      12. IfAbruptCloseAsyncIterator(defineStatus, iteratorRecord)。
      13. kk + 1 に設定する。
  9. それ以外の場合、
    1. NOTE: itemsasync iterableでもiterableでもないため、array-like objectであると仮定する。
    2. arrayLike を ! ToObject(items) とする。
    3. len を ? LengthOfArrayLike(arrayLike) とする。
    4. IsConstructor(constructor) が true の場合、次を行う:
      1. array を ? Construct(constructor, « 𝔽(len) ») とする。
    5. それ以外の場合、
      1. array を ? ArrayCreate(len) とする。
    6. k を 0 とする。
    7. k < len の間、繰り返す:
      1. propertyKey を ! ToString(𝔽(k)) とする。
      2. kValue を ? Get(arrayLike, propertyKey) とする。
      3. kValue を ? Await(kValue) に設定する。
      4. mappingtrue の場合、次を行う:
        1. mappedValue を ? Call(mapper, thisArg, « kValue, 𝔽(k) ») とする。
        2. mappedValue を ? Await(mappedValue) に設定する。
      5. それ以外の場合、
        1. mappedValuekValue とする。
      6. CreateDataPropertyOrThrow(array, propertyKey, mappedValue) を実行する。
      7. kk + 1 に設定する。
    8. Set(array, "length", 𝔽(len), true) を実行する。
    9. array を返す。
Note

このメソッドは意図的に汎用のファクトリメソッドです。そのthis値がArrayコンストラクターであることを要求しません。したがって、単一の数値引数で呼び出され得る任意の他のコンストラクターに移すこと、またはそれらに継承させることができます。

23.1.2.3 Array.isArray ( arg )

この関数は呼び出されたとき、次の手順を実行します:

  1. IsArray(arg) を返す。

23.1.2.4 Array.of ( ...items )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. lenitems 内の要素数とする。
  2. lenNumber𝔽(len) とする。
  3. constructorthis値とする。
  4. IsConstructor(constructor) が true の場合、次を行う:
    1. array を ? Construct(constructor, « lenNumber ») とする。
  5. それ以外の場合、
    1. array を ? ArrayCreate(len) とする。
  6. k を 0 とする。
  7. k < len の間、繰り返す:
    1. kValueitems[k] とする。
    2. propertyKey を ! ToString(𝔽(k)) とする。
    3. CreateDataPropertyOrThrow(array, propertyKey, kValue) を実行する。
    4. kk + 1 に設定する。
  8. Set(array, "length", lenNumber, true) を実行する。
  9. array を返す。
Note

このメソッドは意図的に汎用のファクトリメソッドです。そのthis値がArrayコンストラクターであることを要求しません。したがって、単一の数値引数で呼び出され得る他のコンストラクターに移すこと、またはそれらに継承させることができます。

23.1.2.5 Array.prototype

Array.prototypeの値はArrayプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

23.1.2.6 get Array [ %Symbol.species% ]

Array[%Symbol.species%]は、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. this値を返す。

この関数の"name"プロパティの値は "get [Symbol.species]" です。

Note

Arrayプロトタイプメソッドは通常、そのthis値のコンストラクターを使用して派生オブジェクトを作成します。しかし、サブクラスコンストラクターは、その%Symbol.species%プロパティを再定義することにより、その既定の動作を上書きできます。

23.1.3 Arrayプロトタイプオブジェクトのプロパティ

Arrayプロトタイプオブジェクトは以下の通りです:

  • %Array.prototype%である。
  • Array exotic objectであり、そのようなオブジェクトに指定された内部メソッドを持つ。
  • 初期値が +0𝔽 であり、属性が { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } である"length"プロパティを持つ。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
Note

Arrayプロトタイプオブジェクトは、ECMAScript 2015仕様より前に作成されたECMAScriptコードとの互換性を確保するため、Array exotic objectであると指定されています。

23.1.3.1 Array.prototype.at ( index )

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. relativeIndex を ? ToIntegerOrInfinity(index) とする。
  4. relativeIndex ≥ 0 の場合、次を行う:
    1. krelativeIndex とする。
  5. それ以外の場合、
    1. klen + relativeIndex とする。
  6. k < 0 または klen の場合、undefined を返す。
  7. Get(obj, ! ToString(𝔽(k))) を返す。

23.1.3.2 Array.prototype.concat ( ...items )

このメソッドは、そのオブジェクトの配列要素に続いて各引数の配列要素を含む配列を返します。

呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. array を ? ArraySpeciesCreate(obj, 0) とする。
  3. nextIndex を 0 とする。
  4. objitems の先頭に追加する。
  5. items の各要素 item について、次を行う:
    1. spreadable を ? IsConcatSpreadable(item) とする。
    2. spreadabletrue の場合、次を行う:
      1. len を ? LengthOfArrayLike(item) とする。
      2. nextIndex + len > 253 - 1 の場合、TypeError 例外をスローする。
      3. sourceIndex を 0 とする。
      4. sourceIndex < len の間、繰り返す:
        1. propertyKey を ! ToString(𝔽(sourceIndex)) とする。
        2. exists を ? HasProperty(item, propertyKey) とする。
        3. existstrue の場合、次を行う:
          1. subElement を ? Get(item, propertyKey) とする。
          2. CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), subElement) を実行する。
        4. nextIndexnextIndex + 1 に設定する。
        5. sourceIndexsourceIndex + 1 に設定する。
    3. それ以外の場合、
      1. NOTE: item は展開されるのではなく、単一の項目として追加される。
      2. nextIndex ≥ 253 - 1 の場合、TypeError 例外をスローする。
      3. CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), item) を実行する。
      4. nextIndexnextIndex + 1 に設定する。
  6. Set(array, "length", 𝔽(nextIndex), true) を実行する。
  7. array を返す。

このメソッドの"length"プロパティは 1𝔽 です。

Note 1

ステップ 6 における"length"プロパティの明示的な設定は、items の最後の空でない要素に末尾の穴がある場合、または array が組み込みArrayでない場合に、長さが正しいことを確保することを意図しています。

Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.2.1 IsConcatSpreadable ( obj )

The abstract operation IsConcatSpreadable takes argument obj (ECMAScript言語値) and returns Booleanを含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. obj がObjectでない場合、false を返す。
  2. spreadable を ? Get(obj, %Symbol.isConcatSpreadable%) とする。
  3. spreadableundefined でない場合、ToBoolean(spreadable) を返す。
  4. IsArray(obj) を返す。

23.1.3.3 Array.prototype.constructor

Array.prototype.constructorの初期値は %Array% です。

23.1.3.4 Array.prototype.copyWithin ( target, start [ , end ] )

Note 1

end 引数は省略可能です。指定されない場合、this値の長さが使用されます。

Note 2

target が負である場合、それは length + target として扱われます。ここで length は配列の長さです。start が負である場合、それは length + start として扱われます。end が負である場合、それは length + end として扱われます。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. relativeTarget を ? ToIntegerOrInfinity(target) とする。
  4. relativeTarget = -∞ の場合、to を 0 とする。
  5. そうでなく relativeTarget < 0 の場合、tomax(len + relativeTarget, 0) とする。
  6. それ以外の場合、tomin(relativeTarget, len) とする。
  7. relativeStart を ? ToIntegerOrInfinity(start) とする。
  8. relativeStart = -∞ の場合、from を 0 とする。
  9. そうでなく relativeStart < 0 の場合、frommax(len + relativeStart, 0) とする。
  10. それ以外の場合、frommin(relativeStart, len) とする。
  11. endundefined の場合、relativeEndlen とする。そうでない場合、relativeEnd を ? ToIntegerOrInfinity(end) とする。
  12. relativeEnd = -∞ の場合、final を 0 とする。
  13. そうでなく relativeEnd < 0 の場合、finalmax(len + relativeEnd, 0) とする。
  14. それ以外の場合、finalmin(relativeEnd, len) とする。
  15. countmin(final - from, len - to) とする。
  16. from < to かつ to < from + count の場合、次を行う:
    1. direction を -1 とする。
    2. fromfrom + count - 1 に設定する。
    3. toto + count - 1 に設定する。
  17. それ以外の場合、
    1. direction を 1 とする。
  18. count > 0 の間、繰り返す:
    1. fromKey を ! ToString(𝔽(from)) とする。
    2. toKey を ! ToString(𝔽(to)) とする。
    3. fromPresent を ? HasProperty(obj, fromKey) とする。
    4. fromPresenttrue の場合、次を行う:
      1. fromValue を ? Get(obj, fromKey) とする。
      2. Set(obj, toKey, fromValue, true) を実行する。
    5. それ以外の場合、
      1. Assert: fromPresentfalse である。
      2. DeletePropertyOrThrow(obj, toKey) を実行する。
    6. fromfrom + direction に設定する。
    7. toto + direction に設定する。
    8. countcount - 1 に設定する。
  19. obj を返す。
Note 3

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.5 Array.prototype.entries ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. CreateArrayIterator(obj, key+value) を返す。

23.1.3.6 Array.prototype.every ( callback [ , thisArg ] )

Note 1

callback は3つの引数を受け取り、Boolean値に強制変換可能な値を返す関数であるべきです。everyは、callbackfalse を返すものを見つけるまで、配列内に存在する各要素について昇順に callback を1回ずつ呼び出します。そのような要素が見つかった場合、everyはただちに false を返します。そうでない場合、everytrue を返します。callback は実際に存在する配列要素についてのみ呼び出されます。配列の欠損要素については呼び出されません。

thisArg パラメーターが指定された場合、それは callback の各呼び出しのthis値として使用されます。指定されない場合、代わりに undefined が使用されます。

callback は3つの引数、すなわち要素の値、要素のインデックス、および走査されているオブジェクトで呼び出されます。

everyは、それが呼び出されたオブジェクトを直接変更しませんが、callback の呼び出しによってそのオブジェクトが変更される可能性があります。

everyによって処理される要素の範囲は、callback の最初の呼び出しの前に設定されます。everyの呼び出しが開始された後に配列へ追加された要素は、callback によって訪問されません。配列の既存要素が変更された場合、callback に渡される値は、everyがその要素を訪問した時点の値になります。everyの呼び出しが開始された後、訪問される前に削除された要素は訪問されません。everyは数学における「すべての」量化子のように動作します。特に、空の配列に対しては true を返します。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  4. k を 0 とする。
  5. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kPresent を ? HasProperty(obj, propertyKey) とする。
    3. kPresenttrue の場合、次を行う:
      1. kValue を ? Get(obj, propertyKey) とする。
      2. testResultToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), obj »)) とする。
      3. testResultfalse の場合、false を返す。
    4. kk + 1 に設定する。
  6. true を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.7 Array.prototype.fill ( value [ , start [ , end ] ] )

Note 1

start 引数は省略可能です。指定されない場合、+0𝔽 が使用されます。

end 引数は省略可能です。指定されない場合、this値の長さが使用されます。

Note 2

start が負である場合、それは length + start として扱われます。ここで length は配列の長さです。end が負である場合、それは length + end として扱われます。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. relativeStart を ? ToIntegerOrInfinity(start) とする。
  4. relativeStart = -∞ の場合、k を 0 とする。
  5. そうでなく relativeStart < 0 の場合、kmax(len + relativeStart, 0) とする。
  6. それ以外の場合、kmin(relativeStart, len) とする。
  7. endundefined の場合、relativeEndlen とする。そうでない場合、relativeEnd を ? ToIntegerOrInfinity(end) とする。
  8. relativeEnd = -∞ の場合、final を 0 とする。
  9. そうでなく relativeEnd < 0 の場合、finalmax(len + relativeEnd, 0) とする。
  10. それ以外の場合、finalmin(relativeEnd, len) とする。
  11. k < final の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. Set(obj, propertyKey, value, true) を実行する。
    3. kk + 1 に設定する。
  12. obj を返す。
Note 3

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.8 Array.prototype.filter ( callback [ , thisArg ] )

Note 1

callback は3つの引数を受け取り、Boolean値に強制変換可能な値を返す関数であるべきです。filterは、配列内の各要素について昇順に callback を1回ずつ呼び出し、callbacktrue を返す値すべてから成る新しい配列を構築します。callback は実際に存在する配列要素についてのみ呼び出されます。配列の欠損要素については呼び出されません。

thisArg パラメーターが指定された場合、それは callback の各呼び出しのthis値として使用されます。指定されない場合、代わりに undefined が使用されます。

callback は3つの引数、すなわち要素の値、要素のインデックス、および走査されているオブジェクトで呼び出されます。

filterは、それが呼び出されたオブジェクトを直接変更しませんが、callback の呼び出しによってそのオブジェクトが変更される可能性があります。

filterによって処理される要素の範囲は、callback の最初の呼び出しの前に設定されます。filterの呼び出しが開始された後に配列へ追加された要素は、callback によって訪問されません。配列の既存要素が変更された場合、callback に渡される値は、filterがその要素を訪問した時点の値になります。filterの呼び出しが開始された後、訪問される前に削除された要素は訪問されません。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  4. array を ? ArraySpeciesCreate(obj, 0) とする。
  5. k を 0 とする。
  6. to を 0 とする。
  7. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kPresent を ? HasProperty(obj, propertyKey) とする。
    3. kPresenttrue の場合、次を行う:
      1. kValue を ? Get(obj, propertyKey) とする。
      2. selectedToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), obj »)) とする。
      3. selectedtrue の場合、次を行う:
        1. CreateDataPropertyOrThrow(array, ! ToString(𝔽(to)), kValue) を実行する。
        2. toto + 1 に設定する。
    4. kk + 1 に設定する。
  8. array を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.9 Array.prototype.find ( predicate [ , thisArg ] )

Note 1

このメソッドは、predicatetrue に強制変換される値を返すものを見つけるまで、配列の各要素について昇順のインデックス順に predicate を1回ずつ呼び出します。そのような要素が見つかった場合、findはただちにその要素値を返します。そうでない場合、findundefined を返します。

追加情報については FindViaPredicate を参照してください。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. findRec を ? FindViaPredicate(obj, len, ascending, predicate, thisArg) とする。
  4. findRec.[[Value]] を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.10 Array.prototype.findIndex ( predicate [ , thisArg ] )

Note 1

このメソッドは、predicatetrue に強制変換される値を返すものを見つけるまで、配列の各要素について昇順のインデックス順に predicate を1回ずつ呼び出します。そのような要素が見つかった場合、findIndexはただちにその要素値のインデックスを返します。そうでない場合、findIndexは -1 を返します。

追加情報については FindViaPredicate を参照してください。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. findRec を ? FindViaPredicate(obj, len, ascending, predicate, thisArg) とする。
  4. findRec.[[Index]] を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.11 Array.prototype.findLast ( predicate [ , thisArg ] )

Note 1

このメソッドは、predicatetrue に強制変換される値を返すものを見つけるまで、配列の各要素について降順のインデックス順に predicate を1回ずつ呼び出します。そのような要素が見つかった場合、findLastはただちにその要素値を返します。そうでない場合、findLastundefined を返します。

追加情報については FindViaPredicate を参照してください。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. findRec を ? FindViaPredicate(obj, len, descending, predicate, thisArg) とする。
  4. findRec.[[Value]] を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.12 Array.prototype.findLastIndex ( predicate [ , thisArg ] )

Note 1

このメソッドは、predicatetrue に強制変換される値を返すものを見つけるまで、配列の各要素について降順のインデックス順に predicate を1回ずつ呼び出します。そのような要素が見つかった場合、findLastIndexはただちにその要素値のインデックスを返します。そうでない場合、findLastIndexは -1 を返します。

追加情報については FindViaPredicate を参照してください。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. findRec を ? FindViaPredicate(obj, len, descending, predicate, thisArg) とする。
  4. findRec.[[Index]] を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayオブジェクトであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.12.1 FindViaPredicate ( obj, len, direction, predicate, thisArg )

The abstract operation FindViaPredicate takes arguments obj (Object), len (非負整数), direction (ascending または descending), predicate (ECMAScript言語値), and thisArg (ECMAScript言語値) and returns フィールド [[Index]](整数Number)および [[Value]](ECMAScript言語値)を持つRecordを含む正常完了、またはスロー完了のいずれか.

objarray-like objectまたはTypedArrayであるべきです。この操作は、direction によって示される昇順または降順のインデックス順で、obj の各要素について predicate を1回ずつ呼び出し、predicatetrue に強制変換される値を返すものを見つけるまで続けます。その時点で、この操作は見つかった要素のインデックスと値を与えるRecordを返します。そのような要素が見つからない場合、この操作はインデックスとして -1𝔽、値として undefined を指定するRecordを返します。

predicate は関数であるべきです。配列の要素について呼び出されるとき、要素の値、要素のインデックス、および走査されているオブジェクトの3つの引数が渡されます。その戻り値はBoolean値に強制変換されます。

thisArgpredicate の各呼び出しのthis値として使用されます。

この操作は、それが呼び出されたオブジェクトを直接変更しませんが、predicate の呼び出しによってそのオブジェクトが変更される可能性があります。

処理される要素の範囲は、走査が開始される直前、predicate の最初の呼び出しの前に設定されます。この後に配列へ追加された要素は、predicate によって訪問されません。配列の既存要素が変更された場合、predicate に渡される値は、この操作がその要素を訪問した時点の値になります。走査開始後、訪問される前に削除された要素もなお訪問され、プロトタイプから検索されるか、または undefined になります。

It performs the following steps when called:

  1. IsCallable(predicate) が false の場合、TypeError 例外をスローする。
  2. directionascending である場合、次を行う:
    1. indices を、0(包含)から len(排他)までの区間内の整数を昇順に並べたListとする。
  3. それ以外の場合、
    1. indices を、0(包含)から len(排他)までの区間内の整数を降順に並べたListとする。
  4. indices の各整数 k について、次を行う:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. NOTE: objTypedArrayである場合、次の Get の呼び出しは正常完了を返す。
    3. kValue を ? Get(obj, propertyKey) とする。
    4. testResult を ? Call(predicate, thisArg, « kValue, 𝔽(k), obj ») とする。
    5. ToBoolean(testResult) が true の場合、Record { [[Index]]: 𝔽(k), [[Value]]: kValue } を返す。
  5. Record { [[Index]]: -1𝔽, [[Value]]: undefined } を返す。

23.1.3.13 Array.prototype.flat ( [ depth ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. sourceLen を ? LengthOfArrayLike(obj) とする。
  3. depthNum を 1 とする。
  4. depthundefined でない場合、次を行う:
    1. depthNum を ? ToIntegerOrInfinity(depth) に設定する。
    2. depthNum < 0 の場合、depthNum を 0 に設定する。
  5. array を ? ArraySpeciesCreate(obj, 0) とする。
  6. FlattenIntoArray(array, obj, sourceLen, 0, depthNum) を実行する。
  7. array を返す。

23.1.3.13.1 FlattenIntoArray ( target, source, sourceLen, start, depth [ , mapperFunction [ , thisArg ] ] )

The abstract operation FlattenIntoArray takes arguments target (Object), source (Object), sourceLen (非負整数), start (非負整数), and depth (非負整数または +∞) and optional arguments mapperFunction (関数オブジェクト) and thisArg (ECMAScript言語値) and returns 非負整数を含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. Assert: mapperFunction が存在する場合、IsCallable(mapperFunction) は true であり、thisArg が存在し、depth は 1 である。
  2. targetIndexstart とする。
  3. sourceIndex+0𝔽 とする。
  4. (sourceIndex) < sourceLen の間、繰り返す:
    1. propertyKey を ! ToString(sourceIndex) とする。
    2. exists を ? HasProperty(source, propertyKey) とする。
    3. existstrue の場合、次を行う:
      1. element を ? Get(source, propertyKey) とする。
      2. mapperFunction が存在する場合、次を行う:
        1. element を ? Call(mapperFunction, thisArg, « element, sourceIndex, source ») に設定する。
      3. shouldFlattenfalse とする。
      4. depth > 0 の場合、次を行う:
        1. shouldFlatten を ? IsArray(element) に設定する。
      5. shouldFlattentrue の場合、次を行う:
        1. depth = +∞ の場合、newDepth を +∞ とする。
        2. それ以外の場合、newDepthdepth - 1 とする。
        3. elementLen を ? LengthOfArrayLike(element) とする。
        4. targetIndex を ? FlattenIntoArray(target, element, elementLen, targetIndex, newDepth) に設定する。
      6. それ以外の場合、
        1. targetIndex ≥ 253 - 1 の場合、TypeError 例外をスローする。
        2. CreateDataPropertyOrThrow(target, ! ToString(𝔽(targetIndex)), element) を実行する。
        3. targetIndextargetIndex + 1 に設定する。
    4. sourceIndexsourceIndex + 1𝔽 に設定する。
  5. targetIndex を返す。

23.1.3.14 Array.prototype.flatMap ( mapperFunction [ , thisArg ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. sourceLen を ? LengthOfArrayLike(obj) とする。
  3. IsCallable(mapperFunction) が false の場合、TypeError 例外をスローする。
  4. array を ? ArraySpeciesCreate(obj, 0) とする。
  5. FlattenIntoArray(array, obj, sourceLen, 0, 1, mapperFunction, thisArg) を実行する。
  6. array を返す。

23.1.3.15 Array.prototype.forEach ( callback [ , thisArg ] )

Note 1

callback は3つの引数を受け取る関数であるべきです。forEachは、配列内に存在する各要素について昇順に callback を1回ずつ呼び出します。callback は実際に存在する配列要素についてのみ呼び出されます。配列の欠損要素については呼び出されません。

thisArg パラメーターが指定された場合、それは callback の各呼び出しのthis値として使用されます。指定されない場合、代わりに undefined が使用されます。

callback は3つの引数、すなわち要素の値、要素のインデックス、および走査されているオブジェクトで呼び出されます。

forEachは、それが呼び出されたオブジェクトを直接変更しませんが、callback の呼び出しによってそのオブジェクトが変更される可能性があります。

forEachによって処理される要素の範囲は、callback の最初の呼び出しの前に設定されます。forEachの呼び出しが開始された後に配列へ追加された要素は、callback によって訪問されません。配列の既存要素が変更された場合、callback に渡される値は、forEachがその要素を訪問した時点の値になります。forEachの呼び出しが開始された後、訪問される前に削除された要素は訪問されません。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  4. k を 0 とする。
  5. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kPresent を ? HasProperty(obj, propertyKey) とする。
    3. kPresenttrue の場合、次を行う:
      1. kValue を ? Get(obj, propertyKey) とする。
      2. Call(callback, thisArg, « kValue, 𝔽(k), obj ») を実行する。
    4. kk + 1 に設定する。
  6. undefined を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.16 Array.prototype.includes ( searchElement [ , fromIndex ] )

Note 1

このメソッドはSameValueZeroアルゴリズムを用いて searchElement を配列の要素と昇順に比較し、いずれかの位置で見つかった場合は true を返します。そうでない場合は false を返します。

省略可能な第2引数 fromIndex の既定値は +0𝔽 です(すなわち、配列全体が検索されます)。それが配列の長さ以上である場合、false が返されます。すなわち、配列は検索されません。それが -0𝔽 より小さい場合、fromIndex を計算するために配列の末尾からのオフセットとして使用されます。計算されたインデックスが +0𝔽 以下である場合、配列全体が検索されます。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. len = 0 の場合、false を返す。
  4. startIndex を ? ToIntegerOrInfinity(fromIndex) とする。
  5. Assert: fromIndexundefined の場合、startIndex は 0 である。
  6. startIndex = +∞ の場合、false を返す。
  7. startIndex = -∞ の場合、startIndex を 0 に設定する。
  8. startIndex ≥ 0 の場合、次を行う:
    1. kstartIndex とする。
  9. それ以外の場合、
    1. klen + startIndex とする。
    2. k < 0 の場合、k を 0 に設定する。
  10. k < len の間、繰り返す:
    1. elementK を ? Get(obj, ! ToString(𝔽(k))) とする。
    2. SameValueZero(searchElement, elementK) が true の場合、true を返す。
    3. kk + 1 に設定する。
  11. false を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

Note 3

このメソッドは、類似するindexOfメソッドと意図的に2つの点で異なります。第1に、IsStrictlyEqualではなくSameValueZeroアルゴリズムを使用するため、NaN 配列要素を検出できます。第2に、欠損配列要素をスキップせず、代わりにそれらを undefined として扱います。

23.1.3.17 Array.prototype.indexOf ( searchElement [ , fromIndex ] )

このメソッドはIsStrictlyEqualアルゴリズムを用いて searchElement を配列の要素と昇順に比較し、1つ以上のインデックスで見つかった場合、そのような最小のインデックスを返します。そうでない場合、-1𝔽 を返します。

Note 1

省略可能な第2引数 fromIndex の既定値は +0𝔽 です(すなわち、配列全体が検索されます)。それが配列の長さ以上である場合、-1𝔽 が返されます。すなわち、配列は検索されません。それが -0𝔽 より小さい場合、配列の末尾からのオフセットを計算するために使用されます。計算されたインデックスが +0𝔽 以下である場合、配列全体が検索されます。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. len = 0 の場合、-1𝔽 を返す。
  4. startIndex を ? ToIntegerOrInfinity(fromIndex) とする。
  5. Assert: fromIndexundefined の場合、startIndex は 0 である。
  6. startIndex = +∞ の場合、-1𝔽 を返す。
  7. startIndex = -∞ の場合、startIndex を 0 に設定する。
  8. startIndex ≥ 0 の場合、次を行う:
    1. kstartIndex とする。
  9. それ以外の場合、
    1. klen + startIndex とする。
    2. k < 0 の場合、k を 0 に設定する。
  10. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kPresent を ? HasProperty(obj, propertyKey) とする。
    3. kPresenttrue の場合、次を行う:
      1. elementK を ? Get(obj, propertyKey) とする。
      2. IsStrictlyEqual(searchElement, elementK) が true の場合、𝔽(k) を返す。
    4. kk + 1 に設定する。
  11. -1𝔽 を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.18 Array.prototype.join ( separator )

このメソッドは、配列の要素をStringに変換し、その後、separator の出現で区切られたこれらのStringを連結します。セパレーターが指定されない場合、単一のカンマがセパレーターとして使用されます。

呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. separatorundefined の場合、sep"," とする。
  4. それ以外の場合、sep を ? ToString(separator) とする。
  5. result を空のStringとする。
  6. k を 0 とする。
  7. k < len の間、繰り返す:
    1. k > 0 の場合、resultresultsep の文字列連結に設定する。
    2. element を ? Get(obj, ! ToString(𝔽(k))) とする。
    3. elementundefined でも null でもない場合、次を行う:
      1. elementStr を ? ToString(element) とする。
      2. resultresultelementStr の文字列連結に設定する。
    4. kk + 1 に設定する。
  8. result を返す。
Note

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.19 Array.prototype.keys ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. CreateArrayIterator(obj, key) を返す。

23.1.3.20 Array.prototype.lastIndexOf ( searchElement [ , fromIndex ] )

Note 1

このメソッドはIsStrictlyEqualアルゴリズムを用いて searchElement を配列の要素と降順に比較し、1つ以上のインデックスで見つかった場合、そのような最大のインデックスを返します。そうでない場合、-1𝔽 を返します。

省略可能な第2引数 fromIndex の既定値は、配列の長さから1を引いた値です(すなわち、配列全体が検索されます)。それが配列の長さ以上である場合、配列全体が検索されます。それが -0𝔽 より小さい場合、配列の末尾からのオフセットを計算するために使用されます。計算されたインデックスが -0𝔽 より小さい場合、-1𝔽 が返されます。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. len = 0 の場合、-1𝔽 を返す。
  4. fromIndex が存在する場合、startIndex を ? ToIntegerOrInfinity(fromIndex) とする。そうでない場合、startIndexlen - 1 とする。
  5. startIndex = -∞ の場合、-1𝔽 を返す。
  6. startIndex ≥ 0 の場合、次を行う:
    1. kmin(startIndex, len - 1) とする。
  7. それ以外の場合、
    1. klen + startIndex とする。
  8. k ≥ 0 の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kPresent を ? HasProperty(obj, propertyKey) とする。
    3. kPresenttrue の場合、次を行う:
      1. elementK を ? Get(obj, propertyKey) とする。
      2. IsStrictlyEqual(searchElement, elementK) が true の場合、𝔽(k) を返す。
    4. kk - 1 に設定する。
  9. -1𝔽 を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.21 Array.prototype.map ( callback [ , thisArg ] )

Note 1

callback は3つの引数を受け取る関数であるべきです。mapは配列内の各要素について昇順に callback を1回ずつ呼び出し、その結果から新しいArrayを構築します。callback は実際に存在する配列要素についてのみ呼び出されます。配列の欠損要素については呼び出されません。

thisArg パラメーターが指定された場合、それは callback の各呼び出しのthis値として使用されます。指定されない場合、代わりに undefined が使用されます。

callback は3つの引数、すなわち要素の値、要素のインデックス、および走査されているオブジェクトで呼び出されます。

mapは、それが呼び出されたオブジェクトを直接変更しませんが、callback の呼び出しによってそのオブジェクトが変更される可能性があります。

mapによって処理される要素の範囲は、callback の最初の呼び出しの前に設定されます。mapの呼び出しが開始された後に配列へ追加された要素は、callback によって訪問されません。配列の既存要素が変更された場合、callback に渡される値は、mapがその要素を訪問した時点の値になります。mapの呼び出しが開始された後、訪問される前に削除された要素は訪問されません。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  4. array を ? ArraySpeciesCreate(obj, len) とする。
  5. k を 0 とする。
  6. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kPresent を ? HasProperty(obj, propertyKey) とする。
    3. kPresenttrue の場合、次を行う:
      1. kValue を ? Get(obj, propertyKey) とする。
      2. mappedValue を ? Call(callback, thisArg, « kValue, 𝔽(k), obj ») とする。
      3. CreateDataPropertyOrThrow(array, propertyKey, mappedValue) を実行する。
    4. kk + 1 に設定する。
  7. array を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.22 Array.prototype.pop ( )

Note 1

このメソッドは配列の最後の要素を削除し、それを返します。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. len = 0 の場合、次を行う:
    1. Set(obj, "length", +0𝔽, true) を実行する。
    2. undefined を返す。
  4. Assert: len > 0。
  5. newLen𝔽(len - 1) とする。
  6. index を ! ToString(newLen) とする。
  7. element を ? Get(obj, index) とする。
  8. DeletePropertyOrThrow(obj, index) を実行する。
  9. Set(obj, "length", newLen, true) を実行する。
  10. element を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.23 Array.prototype.push ( ...items )

Note 1

このメソッドは、引数をそれらが現れる順序で配列の末尾に追加します。これは配列の新しい長さを返します。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. argCountitems 内の要素数とする。
  4. len + argCount > 253 - 1 の場合、TypeError 例外をスローする。
  5. items の各要素 item について、次を行う:
    1. Set(obj, ! ToString(𝔽(len)), item, true) を実行する。
    2. lenlen + 1 に設定する。
  6. Set(obj, "length", 𝔽(len), true) を実行する。
  7. 𝔽(len) を返す。

このメソッドの"length"プロパティは 1𝔽 です。

Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.24 Array.prototype.reduce ( callback [ , initialValue ] )

Note 1

callback は4つの引数を取る関数でなければならない。reduce は、配列内に存在する各要素について昇順で callback を1回ずつ呼び出す。ただし、initialValue が提供されていない場合は最初の要素をスキップする。

callback は4つの引数、すなわち previousValuecallback の前回の呼び出しからの値)、currentValue(現在の要素の値)、currentIndex、および走査されているオブジェクトで呼び出されます。callbackが初めて呼び出されるとき、previousValuecurrentValue は2つの値のいずれかになります。reduceの呼び出しで initialValue が供給された場合、previousValueinitialValue となり、currentValue は配列の最初の値となります。initialValue が供給されなかった場合、previousValue は配列の最初の値となり、currentValue は2番目の値となります。配列が要素を含まず、initialValue が提供されていない場合、TypeError です。

reduceは、それが呼び出されたオブジェクトを直接変更しませんが、callback の呼び出しによってそのオブジェクトが変更される可能性があります。

reduceによって処理される要素の範囲は、callback の最初の呼び出しの前に設定されます。reduceの呼び出しが開始された後に配列へ追加された要素は、callback によって訪問されません。配列の既存要素が変更された場合、callback に渡される値は、reduceがその要素を訪問した時点の値になります。reduceの呼び出しが開始された後、訪問される前に削除された要素は訪問されません。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  4. len = 0 かつ initialValue が存在しない場合、TypeError 例外をスローする。
  5. k を 0 とする。
  6. accumulatorundefined とする。
  7. initialValue が存在する場合、次を行う:
    1. accumulatorinitialValue に設定する。
  8. それ以外の場合、
    1. kPresentfalse とする。
    2. kPresentfalse かつ k < len の間、繰り返す:
      1. propertyKey を ! ToString(𝔽(k)) とする。
      2. kPresent を ? HasProperty(obj, propertyKey) に設定する。
      3. kPresenttrue の場合、次を行う:
        1. accumulator を ? Get(obj, propertyKey) に設定する。
      4. kk + 1 に設定する。
    3. kPresentfalse の場合、TypeError 例外をスローする。
  9. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kPresent を ? HasProperty(obj, propertyKey) とする。
    3. kPresenttrue の場合、次を行う:
      1. kValue を ? Get(obj, propertyKey) とする。
      2. accumulator を ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), obj ») に設定する。
    4. kk + 1 に設定する。
  10. accumulator を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.25 Array.prototype.reduceRight ( callback [ , initialValue ] )

Note 1

callback は4つの引数を取る関数でなければならない。reduceRight は、配列内に存在する各要素について降順で callback を1回ずつ呼び出す。ただし、initialValue が提供されていない場合は最初の呼び出しをスキップする。

callback は4つの引数、すなわち previousValuecallback の前回の呼び出しからの値)、currentValue(現在の要素の値)、currentIndex、および走査されているオブジェクトで呼び出されます。関数が初めて呼び出されるとき、previousValuecurrentValue は2つの値のいずれかになります。reduceRightの呼び出しで initialValue が供給された場合、previousValueinitialValue となり、currentValue は配列の最後の値となります。initialValue が供給されなかった場合、previousValue は配列の最後の値となり、currentValue は最後から2番目の値となります。配列が要素を含まず、initialValue が提供されていない場合、TypeError です。

reduceRightは、それが呼び出されたオブジェクトを直接変更しませんが、callback の呼び出しによってそのオブジェクトが変更される可能性があります。

reduceRightによって処理される要素の範囲は、callback の最初の呼び出しの前に設定されます。reduceRightの呼び出しが開始された後に配列へ追加された要素は、callback によって訪問されません。配列の既存要素が callback によって変更された場合、callback に渡される値は、reduceRightがその要素を訪問した時点の値になります。reduceRightの呼び出しが開始された後、訪問される前に削除された要素は訪問されません。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  4. len = 0 かつ initialValue が存在しない場合、TypeError 例外をスローする。
  5. klen - 1 とする。
  6. accumulatorundefined とする。
  7. initialValue が存在する場合、次を行う:
    1. accumulatorinitialValue に設定する。
  8. それ以外の場合、
    1. kPresentfalse とする。
    2. kPresentfalse かつ k ≥ 0 の間、繰り返す:
      1. propertyKey を ! ToString(𝔽(k)) とする。
      2. kPresent を ? HasProperty(obj, propertyKey) に設定する。
      3. kPresenttrue の場合、次を行う:
        1. accumulator を ? Get(obj, propertyKey) に設定する。
      4. kk - 1 に設定する。
    3. kPresentfalse の場合、TypeError 例外をスローする。
  9. k ≥ 0 の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kPresent を ? HasProperty(obj, propertyKey) とする。
    3. kPresenttrue の場合、次を行う:
      1. kValue を ? Get(obj, propertyKey) とする。
      2. accumulator を ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), obj ») に設定する。
    4. kk - 1 に設定する。
  10. accumulator を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.26 Array.prototype.reverse ( )

Note 1

このメソッドは配列の要素を並べ替え、その順序を逆にします。これは反転された配列を返します。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. middlefloor(len / 2) とする。
  4. lower を 0 とする。
  5. lowermiddle の間、繰り返す:
    1. upperlen - lower - 1 とする。
    2. upperP を ! ToString(𝔽(upper)) とする。
    3. lowerP を ! ToString(𝔽(lower)) とする。
    4. lowerExists を ? HasProperty(obj, lowerP) とする。
    5. lowerExiststrue の場合、次を行う:
      1. lowerValue を ? Get(obj, lowerP) とする。
    6. upperExists を ? HasProperty(obj, upperP) とする。
    7. upperExiststrue の場合、次を行う:
      1. upperValue を ? Get(obj, upperP) とする。
    8. lowerExiststrue かつ upperExiststrue の場合、次を行う:
      1. Set(obj, lowerP, upperValue, true) を実行する。
      2. Set(obj, upperP, lowerValue, true) を実行する。
    9. そうでなく lowerExistsfalse かつ upperExiststrue の場合、次を行う:
      1. Set(obj, lowerP, upperValue, true) を実行する。
      2. DeletePropertyOrThrow(obj, upperP) を実行する。
    10. そうでなく lowerExiststrue かつ upperExistsfalse の場合、次を行う:
      1. DeletePropertyOrThrow(obj, lowerP) を実行する。
      2. Set(obj, upperP, lowerValue, true) を実行する。
    11. それ以外の場合、
      1. Assert: lowerExistsupperExists はどちらも false である。
      2. NOTE: アクションは不要である。
    12. lowerlower + 1 に設定する。
  6. obj を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.27 Array.prototype.shift ( )

このメソッドは配列の最初の要素を削除し、それを返します。

呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. len = 0 の場合、次を行う:
    1. Set(obj, "length", +0𝔽, true) を実行する。
    2. undefined を返す。
  4. first を ? Get(obj, "0") とする。
  5. k を 1 とする。
  6. k < len の間、繰り返す:
    1. from を ! ToString(𝔽(k)) とする。
    2. to を ! ToString(𝔽(k - 1)) とする。
    3. fromPresent を ? HasProperty(obj, from) とする。
    4. fromPresenttrue の場合、次を行う:
      1. fromValue を ? Get(obj, from) とする。
      2. Set(obj, to, fromValue, true) を実行する。
    5. それ以外の場合、
      1. Assert: fromPresentfalse である。
      2. DeletePropertyOrThrow(obj, to) を実行する。
    6. kk + 1 に設定する。
  7. DeletePropertyOrThrow(obj, ! ToString(𝔽(len - 1))) を実行する。
  8. Set(obj, "length", 𝔽(len - 1), true) を実行する。
  9. first を返す。
Note

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.28 Array.prototype.slice ( start, end )

このメソッドは、要素 start から要素 end の直前まで(または endundefined の場合は配列の末尾まで)の配列要素を含む配列を返します。start が負である場合、それは length + start として扱われます。ここで length は配列の長さです。end が負である場合、それは length + end として扱われます。ここで length は配列の長さです。

呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. relativeStart を ? ToIntegerOrInfinity(start) とする。
  4. relativeStart = -∞ の場合、k を 0 とする。
  5. そうでなく relativeStart < 0 の場合、kmax(len + relativeStart, 0) とする。
  6. それ以外の場合、kmin(relativeStart, len) とする。
  7. endundefined の場合、relativeEndlen とする。そうでない場合、relativeEnd を ? ToIntegerOrInfinity(end) とする。
  8. relativeEnd = -∞ の場合、final を 0 とする。
  9. そうでなく relativeEnd < 0 の場合、finalmax(len + relativeEnd, 0) とする。
  10. それ以外の場合、finalmin(relativeEnd, len) とする。
  11. countmax(final - k, 0) とする。
  12. array を ? ArraySpeciesCreate(obj, count) とする。
  13. resultIndex を 0 とする。
  14. k < final の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kPresent を ? HasProperty(obj, propertyKey) とする。
    3. kPresenttrue の場合、次を行う:
      1. kValue を ? Get(obj, propertyKey) とする。
      2. CreateDataPropertyOrThrow(array, ! ToString(𝔽(resultIndex)), kValue) を実行する。
    4. kk + 1 に設定する。
    5. resultIndexresultIndex + 1 に設定する。
  15. Set(array, "length", 𝔽(resultIndex), true) を実行する。
  16. array を返す。
Note 1

ステップ 15 における"length"プロパティの明示的な設定は、array が組み込みArrayでない場合でも長さが正しいことを確保することを意図しています。

Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.29 Array.prototype.some ( callback [ , thisArg ] )

Note 1

callback は3つの引数を受け取り、Boolean値に強制変換可能な値を返す関数であるべきです。someは、callbacktrue を返すものを見つけるまで、配列内に存在する各要素について昇順に callback を1回ずつ呼び出します。そのような要素が見つかった場合、someはただちに true を返します。そうでない場合、somefalse を返します。callback は実際に存在する配列要素についてのみ呼び出されます。配列の欠損要素については呼び出されません。

thisArg パラメーターが指定された場合、それは callback の各呼び出しのthis値として使用されます。指定されない場合、代わりに undefined が使用されます。

callback は3つの引数、すなわち要素の値、要素のインデックス、および走査されているオブジェクトで呼び出されます。

someは、それが呼び出されたオブジェクトを直接変更しませんが、callback の呼び出しによってそのオブジェクトが変更される可能性があります。

someによって処理される要素の範囲は、callback の最初の呼び出しの前に設定されます。someの呼び出しが開始された後に配列へ追加された要素は、callback によって訪問されません。配列の既存要素が変更された場合、callback に渡される値は、someがその要素を訪問した時点の値になります。someの呼び出しが開始された後、訪問される前に削除された要素は訪問されません。someは数学における「存在する」量化子のように動作します。特に、空の配列に対しては false を返します。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  4. k を 0 とする。
  5. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kPresent を ? HasProperty(obj, propertyKey) とする。
    3. kPresenttrue の場合、次を行う:
      1. kValue を ? Get(obj, propertyKey) とする。
      2. testResultToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), obj »)) とする。
      3. testResulttrue の場合、true を返す。
    4. kk + 1 に設定する。
  6. false を返す。
Note 2

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.30 Array.prototype.sort ( comparator )

このメソッドは、この配列の要素をソートします。comparatorundefined でない場合、それは2つの引数 xy を受け取り、x < y の場合に負のNumber、x > y の場合に正のNumber、それ以外の場合にゼロを返す関数であるべきです。

呼び出されたとき、次の手順を実行します:

  1. comparatorundefined でなく、かつ IsCallable(comparator) が false の場合、TypeError 例外をスローする。
  2. obj を ? ToObject(this値) とする。
  3. len を ? LengthOfArrayLike(obj) とする。
  4. sortCompare を、comparator を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (x, y) を持つ新しいAbstract Closureとする:
    1. CompareArrayElements(x, y, comparator) を返す。
  5. sortedList を ? SortIndexedProperties(obj, len, sortCompare, skip-holes) とする。
  6. itemCountsortedList 内の要素数とする。
  7. j を 0 とする。
  8. j < itemCount の間、繰り返す:
    1. Set(obj, ! ToString(𝔽(j)), sortedList[j], true) を実行する。
    2. jj + 1 に設定する。
  9. NOTE: ステップ 5 における SortIndexedProperties の呼び出しは skip-holes を使用する。残りのインデックスは、検出されソートから除外された穴の数を保持するために削除される。
  10. j < len の間、繰り返す:
    1. DeletePropertyOrThrow(obj, ! ToString(𝔽(j))) を実行する。
    2. jj + 1 に設定する。
  11. obj を返す。
Note 1

存在しないプロパティ値は常に undefined プロパティ値より大きく比較され、undefined は常に他の任意の値より大きく比較されるため(CompareArrayElementsを参照)、undefined プロパティ値は常に結果の末尾にソートされ、その後に存在しないプロパティ値が続きます。

Note 2

ステップ 5 および 6 におけるToString抽象操作によって実行されるメソッド呼び出しは、sortCompare一貫した比較関数として動作しなくなる可能性があります。

Note 3

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.30.1 SortIndexedProperties ( obj, len, sortCompare, holes )

The abstract operation SortIndexedProperties takes arguments obj (Object), len (非負整数), sortCompare (2つのパラメーターを持つAbstract Closure), and holes (skip-holes または read-through-holes) and returns ECMAScript言語値のListを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. items を新しい空のListとする。
  2. k を 0 とする。
  3. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. holesskip-holes である場合、次を行う:
      1. kRead を ? HasProperty(obj, propertyKey) とする。
    3. それ以外の場合、
      1. Assert: holesread-through-holes である。
      2. kReadtrue とする。
    4. kReadtrue の場合、次を行う:
      1. kValue を ? Get(obj, propertyKey) とする。
      2. kValueitems に追加する。
    5. kk + 1 に設定する。
  4. 実装定義の sortCompare への呼び出し の列を使用して items をソートする。そのような呼び出しのいずれかが急な完了を返す場合、sortCompare へのそれ以降の呼び出しを実行する前に停止し、そのCompletion Recordを返す。
  5. items を返す。

ソート順は、上記アルゴリズムのステップ 4 の完了後の items の順序です。sortCompareitems の要素に対する一貫した比較関数でない場合、ソート順は実装定義です。SortIndexedPropertiesが Array.prototype.sort または Array.prototype.toSorted によって起動された場合、comparatorundefined であり、かつ 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 に対して、集合 values 内のすべての値 ab、および c(同じ値であってもよい)について以下の要件がすべて満たされる場合、その集合に対する一貫した比較関数です。表記 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つの引数として特定の値の組 ab が与えられたとき、常に同じ値 v を返す。さらに、v はNumberであり、vNaN でない。これは、与えられた ab の組について、a <C ba =C b、および a >C b のちょうど1つがtrueになることを意味することに注意。
  • comparator(a, b) の呼び出しは、obj または obj のプロトタイプチェーン上のどのオブジェクトも変更しない。
  • 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 の推移律)
Note

上記の条件は、comparator が集合 values を同値類に分割し、これらの同値類が全順序付けされることを確保するために必要十分です。

23.1.3.30.2 CompareArrayElements ( x, y, comparator )

The abstract operation CompareArrayElements takes arguments x (ECMAScript言語値), y (ECMAScript言語値), and comparator (関数オブジェクトまたはundefined) and returns Numberを含む正常完了または急な完了のいずれか. It performs the following steps when called:

  1. xundefined かつ yundefined の場合、+0𝔽 を返す。
  2. xundefined の場合、1𝔽 を返す。
  3. yundefined の場合、-1𝔽 を返す。
  4. comparatorundefined でない場合、次を行う:
    1. result を ? ToNumber(? Call(comparator, undefined, « x, y »)) とする。
    2. resultNaN の場合、+0𝔽 を返す。
    3. result を返す。
  5. xString を ? ToString(x) とする。
  6. yString を ? ToString(y) とする。
  7. xSmaller を ! IsLessThan(xString, yString, true) とする。
  8. xSmallertrue の場合、-1𝔽 を返す。
  9. ySmaller を ! IsLessThan(yString, xString, true) とする。
  10. ySmallertrue の場合、1𝔽 を返す。
  11. +0𝔽 を返す。

23.1.3.31 Array.prototype.splice ( start, deleteCount, ...items )

Note 1

このメソッドは、整数インデックス start から始まる配列の deleteCount 個の要素を削除し、それらを items の要素で置き換えます。これは削除された要素(存在する場合)を含むArrayを返します。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. relativeStart を ? ToIntegerOrInfinity(start) とする。
  4. relativeStart = -∞ の場合、actualStart を 0 とする。
  5. そうでなく relativeStart < 0 の場合、actualStartmax(len + relativeStart, 0) とする。
  6. それ以外の場合、actualStartmin(relativeStart, len) とする。
  7. itemCountitems 内の要素数とする。
  8. start が存在しない場合、次を行う:
    1. actualDeleteCount を 0 とする。
  9. そうでなく deleteCount が存在しない場合、次を行う:
    1. actualDeleteCountlen - actualStart とする。
  10. それ以外の場合、
    1. dc を ? ToIntegerOrInfinity(deleteCount) とする。
    2. actualDeleteCount を、dc を0と len - actualStart の間にクランプした結果とする。
  11. len + itemCount - actualDeleteCount > 253 - 1 の場合、TypeError 例外をスローする。
  12. deletedArray を ? ArraySpeciesCreate(obj, actualDeleteCount) とする。
  13. k を 0 とする。
  14. k < actualDeleteCount の間、繰り返す:
    1. from を ! ToString(𝔽(actualStart + k)) とする。
    2. HasProperty(obj, from) が true の場合、次を行う:
      1. fromValue を ? Get(obj, from) とする。
      2. CreateDataPropertyOrThrow(deletedArray, ! ToString(𝔽(k)), fromValue) を実行する。
    3. kk + 1 に設定する。
  15. Set(deletedArray, "length", 𝔽(actualDeleteCount), true) を実行する。
  16. itemCount < actualDeleteCount の場合、次を行う:
    1. kactualStart に設定する。
    2. k < (len - actualDeleteCount) の間、繰り返す:
      1. from を ! ToString(𝔽(k + actualDeleteCount)) とする。
      2. to を ! ToString(𝔽(k + itemCount)) とする。
      3. HasProperty(obj, from) が true の場合、次を行う:
        1. fromValue を ? Get(obj, from) とする。
        2. Set(obj, to, fromValue, true) を実行する。
      4. それ以外の場合、
        1. DeletePropertyOrThrow(obj, to) を実行する。
      5. kk + 1 に設定する。
    3. klen に設定する。
    4. k > (len - actualDeleteCount + itemCount) の間、繰り返す:
      1. DeletePropertyOrThrow(obj, ! ToString(𝔽(k - 1))) を実行する。
      2. kk - 1 に設定する。
  17. そうでなく itemCount > actualDeleteCount の場合、次を行う:
    1. k を (len - actualDeleteCount) に設定する。
    2. k > actualStart の間、繰り返す:
      1. from を ! ToString(𝔽(k + actualDeleteCount - 1)) とする。
      2. to を ! ToString(𝔽(k + itemCount - 1)) とする。
      3. HasProperty(obj, from) が true の場合、次を行う:
        1. fromValue を ? Get(obj, from) とする。
        2. Set(obj, to, fromValue, true) を実行する。
      4. それ以外の場合、
        1. DeletePropertyOrThrow(obj, to) を実行する。
      5. kk - 1 に設定する。
  18. kactualStart に設定する。
  19. items の各要素 item について、次を行う:
    1. Set(obj, ! ToString(𝔽(k)), item, true) を実行する。
    2. kk + 1 に設定する。
  20. Set(obj, "length", 𝔽(len - actualDeleteCount + itemCount), true) を実行する。
  21. deletedArray を返す。
Note 2

ステップ 15 および 20 における"length"プロパティの明示的な設定は、オブジェクトが組み込みArrayでない場合でも長さが正しいことを確保することを意図しています。

Note 3

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.32 Array.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 Internationalization APIを含むECMAScript実装は、このメソッドをECMA-402仕様で指定されるとおりに実装しなければなりません。ECMAScript実装がECMA-402 APIを含まない場合、このメソッドについて以下の仕様が使用されます。

Note 1

ECMA-402の第1版には、このメソッドの代替仕様は含まれていませんでした。

このメソッドの任意パラメーターの意味はECMA-402仕様で定義されます。ECMA-402サポートを含まない実装は、これらのパラメーター位置を他の目的に使用してはなりません。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. array を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(array) とする。
  3. separator を、ホスト環境の現在のロケールに適した実装定義のリストセパレーターString値(例えば ", ")とする。
  4. result を空のStringとする。
  5. k を 0 とする。
  6. k < len の間、繰り返す:
    1. k > 0 の場合、resultresultseparator の文字列連結に設定する。
    2. element を ? Get(array, ! ToString(𝔽(k))) とする。
    3. elementundefined でも null でもない場合、次を行う:
      1. elementStr を ? ToString(? Invoke(element, "toLocaleString")) とする。
      2. resultresultelementStr の文字列連結に設定する。
    4. kk + 1 に設定する。
  7. result を返す。
Note 2

このメソッドは、配列の要素をそれぞれのtoLocaleStringメソッドを使用してStringに変換し、その後、実装定義のロケール依存セパレーターStringの出現で区切ってこれらのStringを連結します。このメソッドはtoStringに類似していますが、ホスト環境の現在のロケールの慣習に対応するロケール依存の結果を生成することを意図している点が異なります。

Note 3

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.33 Array.prototype.toReversed ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. array を ? ArrayCreate(len) とする。
  4. k を 0 とする。
  5. k < len の間、繰り返す:
    1. from を ! ToString(𝔽(len - k - 1)) とする。
    2. propertyKey を ! ToString(𝔽(k)) とする。
    3. fromValue を ? Get(obj, from) とする。
    4. CreateDataPropertyOrThrow(array, propertyKey, fromValue) を実行する。
    5. kk + 1 に設定する。
  6. array を返す。

23.1.3.34 Array.prototype.toSorted ( comparator )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. comparatorundefined でなく、かつ IsCallable(comparator) が false の場合、TypeError 例外をスローする。
  2. obj を ? ToObject(this値) とする。
  3. len を ? LengthOfArrayLike(obj) とする。
  4. array を ? ArrayCreate(len) とする。
  5. sortCompare を、comparator を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (x, y) を持つ新しいAbstract Closureとする:
    1. CompareArrayElements(x, y, comparator) を返す。
  6. sortedList を ? SortIndexedProperties(obj, len, sortCompare, read-through-holes) とする。
  7. j を 0 とする。
  8. j < len の間、繰り返す:
    1. CreateDataPropertyOrThrow(array, ! ToString(𝔽(j)), sortedList[j]) を実行する。
    2. jj + 1 に設定する。
  9. array を返す。

23.1.3.35 Array.prototype.toSpliced ( start, skipCount, ...items )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. relativeStart を ? ToIntegerOrInfinity(start) とする。
  4. relativeStart = -∞ の場合、actualStart を 0 とする。
  5. そうでなく relativeStart < 0 の場合、actualStartmax(len + relativeStart, 0) とする。
  6. それ以外の場合、actualStartmin(relativeStart, len) とする。
  7. insertCountitems 内の要素数とする。
  8. start が存在しない場合、次を行う:
    1. actualSkipCount を 0 とする。
  9. そうでなく skipCount が存在しない場合、次を行う:
    1. actualSkipCountlen - actualStart とする。
  10. それ以外の場合、
    1. sc を ? ToIntegerOrInfinity(skipCount) とする。
    2. actualSkipCount を、sc を0と len - actualStart の間にクランプした結果とする。
  11. newLenlen + insertCount - actualSkipCount とする。
  12. newLen > 253 - 1 の場合、TypeError 例外をスローする。
  13. newArray を ? ArrayCreate(newLen) とする。
  14. writeIndex を 0 とする。
  15. readIndexactualStart + actualSkipCount とする。
  16. writeIndex < actualStart の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(writeIndex)) とする。
    2. iValue を ? Get(obj, propertyKey) とする。
    3. CreateDataPropertyOrThrow(newArray, propertyKey, iValue) を実行する。
    4. writeIndexwriteIndex + 1 に設定する。
  17. items の各要素 item について、次を行う:
    1. propertyKey を ! ToString(𝔽(writeIndex)) とする。
    2. CreateDataPropertyOrThrow(newArray, propertyKey, item) を実行する。
    3. writeIndexwriteIndex + 1 に設定する。
  18. writeIndex < newLen の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(writeIndex)) とする。
    2. from を ! ToString(𝔽(readIndex)) とする。
    3. fromValue を ? Get(obj, from) とする。
    4. CreateDataPropertyOrThrow(newArray, propertyKey, fromValue) を実行する。
    5. writeIndexwriteIndex + 1 に設定する。
    6. readIndexreadIndex + 1 に設定する。
  19. newArray を返す。

23.1.3.36 Array.prototype.toString ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. array を ? ToObject(this値) とする。
  2. func を ? Get(array, "join") とする。
  3. IsCallable(func) が false の場合、func を組み込み関数 %Object.prototype.toString% に設定する。
  4. Call(func, array) を返す。
Note

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.37 Array.prototype.unshift ( ...items )

このメソッドは、引数リストに現れる順序と同じ順序で配列内に配置されるように、引数を配列の先頭に追加します。

呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. argCountitems 内の要素数とする。
  4. argCount > 0 の場合、次を行う:
    1. len + argCount > 253 - 1 の場合、TypeError 例外をスローする。
    2. klen とする。
    3. k > 0 の間、繰り返す:
      1. from を ! ToString(𝔽(k - 1)) とする。
      2. to を ! ToString(𝔽(k + argCount - 1)) とする。
      3. fromPresent を ? HasProperty(obj, from) とする。
      4. fromPresenttrue の場合、次を行う:
        1. fromValue を ? Get(obj, from) とする。
        2. Set(obj, to, fromValue, true) を実行する。
      5. それ以外の場合、
        1. Assert: fromPresentfalse である。
        2. DeletePropertyOrThrow(obj, to) を実行する。
      6. kk - 1 に設定する。
    4. j+0𝔽 とする。
    5. items の各要素 item について、次を行う:
      1. Set(obj, ! ToString(j), item, true) を実行する。
      2. jj + 1𝔽 に設定する。
  5. Set(obj, "length", 𝔽(len + argCount), true) を実行する。
  6. 𝔽(len + argCount) を返す。

このメソッドの"length"プロパティは 1𝔽 です。

Note

このメソッドは意図的に汎用です。そのthis値がArrayであることを要求しません。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができます。

23.1.3.38 Array.prototype.values ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. CreateArrayIterator(obj, value) を返す。

23.1.3.39 Array.prototype.with ( index, value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. obj を ? ToObject(this値) とする。
  2. len を ? LengthOfArrayLike(obj) とする。
  3. relativeIndex を ? ToIntegerOrInfinity(index) とする。
  4. relativeIndex ≥ 0 の場合、actualIndexrelativeIndex とする。
  5. それ以外の場合、actualIndexlen + relativeIndex とする。
  6. actualIndexlen または actualIndex < 0 の場合、RangeError 例外をスローする。
  7. array を ? ArrayCreate(len) とする。
  8. k を 0 とする。
  9. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. k = actualIndex の場合、fromValuevalue とする。
    3. それ以外の場合、fromValue を ? Get(obj, propertyKey) とする。
    4. CreateDataPropertyOrThrow(array, propertyKey, fromValue) を実行する。
    5. kk + 1 に設定する。
  10. 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%データプロパティの初期値は、次の手順によって作成されるオブジェクトです:

  1. unscopableListOrdinaryObjectCreate(null) とする。
  2. CreateDataPropertyOrThrow(unscopableList, "at", true) を実行する。
  3. CreateDataPropertyOrThrow(unscopableList, "copyWithin", true) を実行する。
  4. CreateDataPropertyOrThrow(unscopableList, "entries", true) を実行する。
  5. CreateDataPropertyOrThrow(unscopableList, "fill", true) を実行する。
  6. CreateDataPropertyOrThrow(unscopableList, "find", true) を実行する。
  7. CreateDataPropertyOrThrow(unscopableList, "findIndex", true) を実行する。
  8. CreateDataPropertyOrThrow(unscopableList, "findLast", true) を実行する。
  9. CreateDataPropertyOrThrow(unscopableList, "findLastIndex", true) を実行する。
  10. CreateDataPropertyOrThrow(unscopableList, "flat", true) を実行する。
  11. CreateDataPropertyOrThrow(unscopableList, "flatMap", true) を実行する。
  12. CreateDataPropertyOrThrow(unscopableList, "includes", true) を実行する。
  13. CreateDataPropertyOrThrow(unscopableList, "keys", true) を実行する。
  14. CreateDataPropertyOrThrow(unscopableList, "toReversed", true) を実行する。
  15. CreateDataPropertyOrThrow(unscopableList, "toSorted", true) を実行する。
  16. CreateDataPropertyOrThrow(unscopableList, "toSpliced", true) を実行する。
  17. CreateDataPropertyOrThrow(unscopableList, "values", true) を実行する。
  18. unscopableList を返す。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } です。

Note

このオブジェクトの独自プロパティ名は、ECMAScript 2015仕様より前にArray.prototypeの標準プロパティとして含まれていなかったプロパティ名です。これらの名前は、Arrayである束縛オブジェクトを持つwith文によって隠蔽される外側のスコープ内の束縛として既存のコードがこれらの名前の1つを使用している可能性があるため、with文の束縛目的では無視されます。

"with"unscopableList に含まれない理由は、それがすでに予約語であるためです。

23.1.4 Arrayインスタンスのプロパティ

ArrayインスタンスはArray exotic objectであり、そのようなオブジェクトに指定された内部メソッドを持ちます。ArrayインスタンスはArrayプロトタイプオブジェクトからプロパティを継承します。

Arrayインスタンスは"length"プロパティ、および配列インデックス名を持つ列挙可能なプロパティの集合を持ちます。

23.1.4.1 length

Arrayインスタンスの"length"プロパティはデータプロパティであり、その値は常に、名前が配列インデックスであるすべての構成可能な独自プロパティの名前より数値的に大きいです。

"length"プロパティの初期属性は { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } です。

Note

"length"プロパティの値を減らすことは、配列インデックスが古い長さ値と新しい長さ値の間にある独自配列要素を削除する副作用を持ちます。ただし、構成不可プロパティは削除できません。Arrayの"length"プロパティを、配列の既存の構成不可な配列インデックス付きプロパティの最大数値独自プロパティ名以下の数値に設定しようとすると、長さはその構成不可な数値独自プロパティ名より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 )

The abstract operation CreateArrayIterator takes arguments array (Object) and kind (key+valuekey、または value) and returns Object. これは、そのようなイテレーターを返すArrayメソッドのためにイテレーターオブジェクトを作成するために使用されます。 It performs the following steps when called:

  1. iteratorOrdinaryObjectCreate(%ArrayIteratorPrototype%, « [[IteratedArrayLike]], [[ArrayLikeNextIndex]], [[ArrayLikeIterationKind]] ») とする。
  2. iterator.[[IteratedArrayLike]]array に設定する。
  3. iterator.[[ArrayLikeNextIndex]] を 0 に設定する。
  4. iterator.[[ArrayLikeIterationKind]]kind に設定する。
  5. iterator を返す。

23.1.5.2 %ArrayIteratorPrototype%オブジェクト

%ArrayIteratorPrototype%オブジェクトは以下の通りです:

  • すべてのArray Iteratorオブジェクトによって継承されるプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]]内部スロットを持ち、その値は %Iterator.prototype% である。
  • 以下のプロパティを持つ:

23.1.5.2.1 %ArrayIteratorPrototype%.next ( )

  1. iteratorObjthis値とする。
  2. iteratorObj がObjectでない場合、TypeError 例外をスローする。
  3. iteratorObjArray Iteratorインスタンスのすべての内部スロット(23.1.5.3)を持たない場合、TypeError 例外をスローする。
  4. arrayiteratorObj.[[IteratedArrayLike]] とする。
  5. arrayundefined の場合、CreateIteratorResultObject(undefined, true) を返す。
  6. indexiteratorObj.[[ArrayLikeNextIndex]] とする。
  7. kinditeratorObj.[[ArrayLikeIterationKind]] とする。
  8. array[[TypedArrayName]] 内部スロットを持つ場合、次を行う:
    1. taRecordMakeTypedArrayWithBufferWitnessRecord(array, seq-cst) とする。
    2. IsTypedArrayOutOfBounds(taRecord) が true の場合、TypeError 例外をスローする。
    3. lenTypedArrayLength(taRecord) とする。
  9. それ以外の場合、
    1. len を ? LengthOfArrayLike(array) とする。
  10. indexlen の場合、次を行う:
    1. iteratorObj.[[IteratedArrayLike]]undefined に設定する。
    2. CreateIteratorResultObject(undefined, true) を返す。
  11. iteratorObj.[[ArrayLikeNextIndex]]index + 1 に設定する。
  12. indexNumber𝔽(index) とする。
  13. kindkey である場合、次を行う:
    1. resultindexNumber とする。
  14. それ以外の場合、
    1. elementKey を ! ToString(indexNumber) とする。
    2. elementValue を ? Get(array, elementKey) とする。
    3. kindvalue である場合、次を行う:
      1. resultelementValue とする。
    4. それ以外の場合、
      1. Assert: kindkey+value である。
      2. resultCreateArrayFromListindexNumber, elementValue ») とする。
  15. 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インスタンスは、最初に Table 69 に列挙されている内部スロットを持つように作成されます。

Table 69: Internal Slots of Array Iterator Instances
内部スロット 説明
[[IteratedArrayLike]] Objectまたはundefined 反復されているarray-like object
[[ArrayLikeNextIndex]] 非負整数 このイテレーターによって次に調べられる要素の整数インデックス。
[[ArrayLikeIterationKind]] key+valuekey、または value 反復の各要素について返されるものを識別する値。

23.2 TypedArrayオブジェクト

TypedArray は、基底となるバイナリデータバッファ(25.1)のarray-likeなビューを提供します。TypedArray要素型は、TypedArray インスタンスのすべての要素が持つ基底となるバイナリスカラーのデータ型です。サポートされる各要素型について、Table 70 に列挙されている個別の TypedArray コンストラクターがあります。Table 70 内の各コンストラクターは、対応する個別のプロトタイプオブジェクトを持ちます。

Table 70: The TypedArray Constructors
コンストラクター名およびIntrinsic 要素型 要素サイズ 変換操作 説明
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% Intrinsicオブジェクト

%TypedArray% intrinsicオブジェクトは以下の通りです:

  • すべての TypedArray コンストラクターオブジェクトが継承するコンストラクター関数オブジェクトである。
  • 対応するプロトタイプオブジェクトとともに、すべての TypedArray コンストラクターおよびそのインスタンスによって継承される共通プロパティを提供する。
  • グローバル名を持たず、グローバルオブジェクトのプロパティとして現れない。
  • 各種 TypedArray コンストラクターの抽象スーパークラスとして機能する。
  • 抽象クラスコンストラクターであるため、呼び出されるとエラーをスローする。TypedArray コンストラクターはこれに対するsuper呼び出しを実行しない。

23.2.1.1 %TypedArray% ( )

この関数は呼び出されたとき、次の手順を実行します:

  1. TypeError 例外をスローする。

この関数の"length"プロパティは +0𝔽 です。

23.2.2 %TypedArray% Intrinsicオブジェクトのプロパティ

%TypedArray% intrinsicオブジェクトは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 値が "TypedArray" である"name"プロパティを持つ。
  • 以下のプロパティを持つ:

23.2.2.1 %TypedArray%.from ( source [ , mapper [ , thisArg ] ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. constructorthis値とする。
  2. IsConstructor(constructor) が false の場合、TypeError 例外をスローする。
  3. mapperundefined の場合、次を行う:
    1. mappingfalse とする。
  4. それ以外の場合、
    1. IsCallable(mapper) が false の場合、TypeError 例外をスローする。
    2. mappingtrue とする。
  5. usingIterator を ? GetMethod(source, %Symbol.iterator%) とする。
  6. usingIteratorundefined でない場合、次を行う:
    1. values を ? IteratorToList(? GetIteratorFromMethod(source, usingIterator)) とする。
    2. lenvalues 内の要素数とする。
    3. targetObj を ? TypedArrayCreateFromConstructor(constructor, « 𝔽(len) ») とする。
    4. k を 0 とする。
    5. k < len の間、繰り返す:
      1. propertyKey を ! ToString(𝔽(k)) とする。
      2. kValuevalues の最初の要素とする。
      3. values から最初の要素を除去する。
      4. mappingtrue の場合、次を行う:
        1. mappedValue を ? Call(mapper, thisArg, « kValue, 𝔽(k) ») とする。
      5. それ以外の場合、
        1. mappedValuekValue とする。
      6. Set(targetObj, propertyKey, mappedValue, true) を実行する。
      7. kk + 1 に設定する。
    6. Assert: values は今や空のListである。
    7. targetObj を返す。
  7. NOTE: sourceiterable objectでないため、すでにarray-like objectであると仮定する。
  8. arrayLike を ! ToObject(source) とする。
  9. len を ? LengthOfArrayLike(arrayLike) とする。
  10. targetObj を ? TypedArrayCreateFromConstructor(constructor, « 𝔽(len) ») とする。
  11. k を 0 とする。
  12. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kValue を ? Get(arrayLike, propertyKey) とする。
    3. mappingtrue の場合、次を行う:
      1. mappedValue を ? Call(mapper, thisArg, « kValue, 𝔽(k) ») とする。
    4. それ以外の場合、
      1. mappedValuekValue とする。
    5. Set(targetObj, propertyKey, mappedValue, true) を実行する。
    6. kk + 1 に設定する。
  13. targetObj を返す。

23.2.2.2 %TypedArray%.of ( ...items )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. lenitems 内の要素数とする。
  2. constructorthis値とする。
  3. IsConstructor(constructor) が false の場合、TypeError 例外をスローする。
  4. newObj を ? TypedArrayCreateFromConstructor(constructor, « 𝔽(len) ») とする。
  5. k を 0 とする。
  6. k < len の間、繰り返す:
    1. kValueitems[k] とする。
    2. propertyKey を ! ToString(𝔽(k)) とする。
    3. Set(newObj, propertyKey, kValue, true) を実行する。
    4. kk + 1 に設定する。
  7. newObj を返す。

23.2.2.3 %TypedArray%.prototype

%TypedArray%.prototypeの初期値は %TypedArray% プロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

23.2.2.4 get %TypedArray% [ %Symbol.species% ]

%TypedArray%[%Symbol.species%]は、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. this値を返す。

この関数の"name"プロパティの値は "get [Symbol.species]" です。

Note

%TypedArray.prototype%メソッドは通常、そのthis値のコンストラクターを使用して派生オブジェクトを作成します。しかし、サブクラスコンストラクターは、その%Symbol.species%プロパティを再定義することにより、その既定の動作を上書きできます。

23.2.3 %TypedArray%プロトタイプオブジェクトのプロパティ

%TypedArray%プロトタイプオブジェクトは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • %TypedArray.prototype%である。
  • 通常のオブジェクトである。
  • [[ViewedArrayBuffer]]、または TypedArray インスタンスオブジェクトに固有のその他の内部スロットを持たない。

23.2.3.1 %TypedArray%.prototype.at ( index )

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. relativeIndex を ? ToIntegerOrInfinity(index) とする。
  5. relativeIndex ≥ 0 の場合、次を行う:
    1. krelativeIndex とする。
  6. それ以外の場合、
    1. klen + relativeIndex とする。
  7. k < 0 または klen の場合、undefined を返す。
  8. Get(obj, ! ToString(𝔽(k))) を返す。

23.2.3.2 get %TypedArray%.prototype.buffer

%TypedArray%.prototype.bufferは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[TypedArrayName]]) を実行する。
  3. Assert: obj[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. bufferobj.[[ViewedArrayBuffer]] とする。
  5. buffer を返す。

23.2.3.3 get %TypedArray%.prototype.byteLength

%TypedArray%.prototype.byteLengthは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[TypedArrayName]]) を実行する。
  3. Assert: obj[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(obj, seq-cst) とする。
  5. IsTypedArrayOutOfBounds(taRecord) が true の場合、+0𝔽 を返す。
  6. sizeTypedArrayByteLength(taRecord) とする。
  7. 𝔽(size) を返す。

23.2.3.4 get %TypedArray%.prototype.byteOffset

%TypedArray%.prototype.byteOffsetは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[TypedArrayName]]) を実行する。
  3. Assert: obj[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(obj, seq-cst) とする。
  5. IsTypedArrayOutOfBounds(taRecord) が true の場合、+0𝔽 を返す。
  6. offsetobj.[[ByteOffset]] とする。
  7. 𝔽(offset) を返す。

23.2.3.5 %TypedArray%.prototype.constructor

%TypedArray%.prototype.constructorの初期値は %TypedArray% です。

23.2.3.6 %TypedArray%.prototype.copyWithin ( target, start [ , end ] )

このメソッドの引数の解釈および使用方法は、23.1.3.4 で定義される Array.prototype.copyWithin と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. relativeTarget を ? ToIntegerOrInfinity(target) とする。
  5. relativeTarget = -∞ の場合、targetIndex を 0 とする。
  6. そうでなく relativeTarget < 0 の場合、targetIndexmax(len + relativeTarget, 0) とする。
  7. それ以外の場合、targetIndexmin(relativeTarget, len) とする。
  8. relativeStart を ? ToIntegerOrInfinity(start) とする。
  9. relativeStart = -∞ の場合、startIndex を 0 とする。
  10. そうでなく relativeStart < 0 の場合、startIndexmax(len + relativeStart, 0) とする。
  11. それ以外の場合、startIndexmin(relativeStart, len) とする。
  12. endundefined の場合、relativeEndlen とする。そうでない場合、relativeEnd を ? ToIntegerOrInfinity(end) とする。
  13. relativeEnd = -∞ の場合、endIndex を 0 とする。
  14. そうでなく relativeEnd < 0 の場合、endIndexmax(len + relativeEnd, 0) とする。
  15. それ以外の場合、endIndexmin(relativeEnd, len) とする。
  16. countmin(endIndex - startIndex, len - targetIndex) とする。
  17. count > 0 の場合、次を行う:
    1. NOTE: コピーは、ソースデータのビットレベル符号化を保持する方法で実行されなければならない。
    2. bufferobj.[[ViewedArrayBuffer]] とする。
    3. taRecordMakeTypedArrayWithBufferWitnessRecord(obj, seq-cst) に設定する。
    4. IsTypedArrayOutOfBounds(taRecord) が true の場合、TypeError 例外をスローする。
    5. lenTypedArrayLength(taRecord) に設定する。
    6. NOTE: 上記の手順の副作用により obj のサイズが縮小されている可能性がある。その場合、コピーは依然として適用可能な最長の接頭辞で進めるべきである。
    7. countmin(count, len - startIndex, len - targetIndex) に設定する。
    8. elementSizeTypedArrayElementSize(obj) とする。
    9. byteOffsetobj.[[ByteOffset]] とする。
    10. toByteIndex を (targetIndex × elementSize) + byteOffset とする。
    11. fromByteIndex を (startIndex × elementSize) + byteOffset とする。
    12. countBytescount × elementSize とする。
    13. fromByteIndex < toByteIndex かつ toByteIndex < fromByteIndex + countBytes の場合、次を行う:
      1. direction を -1 とする。
      2. fromByteIndexfromByteIndex + countBytes - 1 に設定する。
      3. toByteIndextoByteIndex + countBytes - 1 に設定する。
    14. それ以外の場合、
      1. direction を 1 とする。
    15. countBytes > 0 の間、繰り返す:
      1. valueGetValueFromBuffer(buffer, fromByteIndex, uint8, true, unordered) とする。
      2. SetValueInBuffer(buffer, toByteIndex, uint8, value, true, unordered) を実行する。
      3. fromByteIndexfromByteIndex + direction に設定する。
      4. toByteIndextoByteIndex + direction に設定する。
      5. countBytescountBytes - 1 に設定する。
  18. obj を返す。

23.2.3.7 %TypedArray%.prototype.entries ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. ValidateTypedArray(obj, seq-cst) を実行する。
  3. CreateArrayIterator(obj, key+value) を返す。

23.2.3.8 %TypedArray%.prototype.every ( callback [ , thisArg ] )

このメソッドの引数の解釈および使用方法は、23.1.3.6 で定義される Array.prototype.every と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  5. k を 0 とする。
  6. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kValue を ! Get(obj, propertyKey) とする。
    3. testResultToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), obj »)) とする。
    4. testResultfalse の場合、false を返す。
    5. kk + 1 に設定する。
  7. true を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.9 %TypedArray%.prototype.fill ( value [ , start [ , end ] ] )

このメソッドの引数の解釈および使用方法は、23.1.3.7 で定義される Array.prototype.fill と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. obj.[[ContentType]]bigint である場合、value を ? ToBigInt(value) に設定する。
  5. それ以外の場合、value を ? ToNumber(value) に設定する。
  6. relativeStart を ? ToIntegerOrInfinity(start) とする。
  7. relativeStart = -∞ の場合、startIndex を 0 とする。
  8. そうでなく relativeStart < 0 の場合、startIndexmax(len + relativeStart, 0) とする。
  9. それ以外の場合、startIndexmin(relativeStart, len) とする。
  10. endundefined の場合、relativeEndlen とする。そうでない場合、relativeEnd を ? ToIntegerOrInfinity(end) とする。
  11. relativeEnd = -∞ の場合、endIndex を 0 とする。
  12. そうでなく relativeEnd < 0 の場合、endIndexmax(len + relativeEnd, 0) とする。
  13. それ以外の場合、endIndexmin(relativeEnd, len) とする。
  14. taRecordMakeTypedArrayWithBufferWitnessRecord(obj, seq-cst) に設定する。
  15. IsTypedArrayOutOfBounds(taRecord) が true の場合、TypeError 例外をスローする。
  16. lenTypedArrayLength(taRecord) に設定する。
  17. endIndexmin(endIndex, len) に設定する。
  18. kstartIndex とする。
  19. k < endIndex の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. Set(obj, propertyKey, value, true) を実行する。
    3. kk + 1 に設定する。
  20. obj を返す。

23.2.3.10 %TypedArray%.prototype.filter ( callback [ , thisArg ] )

このメソッドの引数の解釈および使用方法は、23.1.3.8 で定義される Array.prototype.filter と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  5. kept を新しい空のListとする。
  6. captured を 0 とする。
  7. k を 0 とする。
  8. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kValue を ! Get(obj, propertyKey) とする。
    3. selectedToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), obj »)) とする。
    4. selectedtrue の場合、次を行う:
      1. kValuekept に追加する。
      2. capturedcaptured + 1 に設定する。
    5. kk + 1 に設定する。
  9. resultTypedArray を ? TypedArraySpeciesCreate(obj, « 𝔽(captured) ») とする。
  10. n を 0 とする。
  11. kept の各要素 e について、次を行う:
    1. Set(resultTypedArray, ! ToString(𝔽(n)), e, true) を実行する。
    2. nn + 1 に設定する。
  12. resultTypedArray を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.11 %TypedArray%.prototype.find ( predicate [ , thisArg ] )

このメソッドの引数の解釈および使用方法は、23.1.3.9 で定義される Array.prototype.find と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. findRec を ? FindViaPredicate(obj, len, ascending, predicate, thisArg) とする。
  5. findRec.[[Value]] を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.12 %TypedArray%.prototype.findIndex ( predicate [ , thisArg ] )

このメソッドの引数の解釈および使用方法は、23.1.3.10 で定義される Array.prototype.findIndex と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. findRec を ? FindViaPredicate(obj, len, ascending, predicate, thisArg) とする。
  5. findRec.[[Index]] を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.13 %TypedArray%.prototype.findLast ( predicate [ , thisArg ] )

このメソッドの引数の解釈および使用方法は、23.1.3.11 で定義される Array.prototype.findLast と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. findRec を ? FindViaPredicate(obj, len, descending, predicate, thisArg) とする。
  5. findRec.[[Value]] を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.14 %TypedArray%.prototype.findLastIndex ( predicate [ , thisArg ] )

このメソッドの引数の解釈および使用方法は、23.1.3.12 で定義される Array.prototype.findLastIndex と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. findRec を ? FindViaPredicate(obj, len, descending, predicate, thisArg) とする。
  5. findRec.[[Index]] を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.15 %TypedArray%.prototype.forEach ( callback [ , thisArg ] )

このメソッドの引数の解釈および使用方法は、23.1.3.15 で定義される Array.prototype.forEach と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  5. k を 0 とする。
  6. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kValue を ! Get(obj, propertyKey) とする。
    3. Call(callback, thisArg, « kValue, 𝔽(k), obj ») を実行する。
    4. kk + 1 に設定する。
  7. undefined を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.16 %TypedArray%.prototype.includes ( searchElement [ , fromIndex ] )

このメソッドの引数の解釈および使用方法は、23.1.3.16 で定義される Array.prototype.includes と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. len = 0 の場合、false を返す。
  5. n を ? ToIntegerOrInfinity(fromIndex) とする。
  6. Assert: fromIndexundefined の場合、n は 0 である。
  7. n = +∞ の場合、false を返す。
  8. n = -∞ の場合、n を 0 に設定する。
  9. n ≥ 0 の場合、次を行う:
    1. kn とする。
  10. それ以外の場合、
    1. klen + n とする。
    2. k < 0 の場合、k を 0 に設定する。
  11. k < len の間、繰り返す:
    1. elementK を ! Get(obj, ! ToString(𝔽(k))) とする。
    2. SameValueZero(searchElement, elementK) が true の場合、true を返す。
    3. kk + 1 に設定する。
  12. false を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.17 %TypedArray%.prototype.indexOf ( searchElement [ , fromIndex ] )

このメソッドの引数の解釈および使用方法は、23.1.3.17 で定義される Array.prototype.indexOf と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. len = 0 の場合、-1𝔽 を返す。
  5. n を ? ToIntegerOrInfinity(fromIndex) とする。
  6. Assert: fromIndexundefined の場合、n は 0 である。
  7. n = +∞ の場合、-1𝔽 を返す。
  8. n = -∞ の場合、n を 0 に設定する。
  9. n ≥ 0 の場合、次を行う:
    1. kn とする。
  10. それ以外の場合、
    1. klen + n とする。
    2. k < 0 の場合、k を 0 に設定する。
  11. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kPresent を ! HasProperty(obj, propertyKey) とする。
    3. kPresenttrue の場合、次を行う:
      1. elementK を ! Get(obj, propertyKey) とする。
      2. IsStrictlyEqual(searchElement, elementK) が true の場合、𝔽(k) を返す。
    4. kk + 1 に設定する。
  12. -1𝔽 を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.18 %TypedArray%.prototype.join ( separator )

このメソッドの引数の解釈および使用方法は、23.1.3.18 で定義される Array.prototype.join と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. separatorundefined の場合、sep"," とする。
  5. それ以外の場合、sep を ? ToString(separator) とする。
  6. result を空のStringとする。
  7. k を 0 とする。
  8. k < len の間、繰り返す:
    1. k > 0 の場合、resultresultsep の文字列連結に設定する。
    2. element を ! Get(obj, ! ToString(𝔽(k))) とする。
    3. elementundefined でない場合、次を行う:
      1. elementStr を ! ToString(element) とする。
      2. resultresultelementStr の文字列連結に設定する。
    4. kk + 1 に設定する。
  9. result を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.19 %TypedArray%.prototype.keys ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. ValidateTypedArray(obj, seq-cst) を実行する。
  3. CreateArrayIterator(obj, key) を返す。

23.2.3.20 %TypedArray%.prototype.lastIndexOf ( searchElement [ , fromIndex ] )

このメソッドの引数の解釈および使用方法は、23.1.3.20 で定義される Array.prototype.lastIndexOf と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. len = 0 の場合、-1𝔽 を返す。
  5. fromIndex が存在する場合、n を ? ToIntegerOrInfinity(fromIndex) とする。そうでない場合、nlen - 1 とする。
  6. n = -∞ の場合、-1𝔽 を返す。
  7. n ≥ 0 の場合、次を行う:
    1. kmin(n, len - 1) とする。
  8. それ以外の場合、
    1. klen + n とする。
  9. k ≥ 0 の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kPresent を ! HasProperty(obj, propertyKey) とする。
    3. kPresenttrue の場合、次を行う:
      1. elementK を ! Get(obj, propertyKey) とする。
      2. IsStrictlyEqual(searchElement, elementK) が true の場合、𝔽(k) を返す。
    4. kk - 1 に設定する。
  10. -1𝔽 を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.21 get %TypedArray%.prototype.length

%TypedArray%.prototype.lengthは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[TypedArrayName]]) を実行する。
  3. Assert: obj[[ViewedArrayBuffer]] および [[ArrayLength]] 内部スロットを持つ。
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(obj, seq-cst) とする。
  5. IsTypedArrayOutOfBounds(taRecord) が true の場合、+0𝔽 を返す。
  6. lengthTypedArrayLength(taRecord) とする。
  7. 𝔽(length) を返す。

この関数は汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.22 %TypedArray%.prototype.map ( callback [ , thisArg ] )

このメソッドの引数の解釈および使用方法は、23.1.3.21 で定義される Array.prototype.map と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  5. resultTypedArray を ? TypedArraySpeciesCreate(obj, « 𝔽(len) ») とする。
  6. k を 0 とする。
  7. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kValue を ! Get(obj, propertyKey) とする。
    3. mappedValue を ? Call(callback, thisArg, « kValue, 𝔽(k), obj ») とする。
    4. Set(resultTypedArray, propertyKey, mappedValue, true) を実行する。
    5. kk + 1 に設定する。
  8. resultTypedArray を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.23 %TypedArray%.prototype.reduce ( callback [ , initialValue ] )

このメソッドの引数の解釈および使用方法は、23.1.3.24 で定義される Array.prototype.reduce と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  5. len = 0 かつ initialValue が存在しない場合、TypeError 例外をスローする。
  6. k を 0 とする。
  7. accumulatorundefined とする。
  8. initialValue が存在する場合、次を行う:
    1. accumulatorinitialValue に設定する。
  9. それ以外の場合、
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. accumulator を ! Get(obj, propertyKey) に設定する。
    3. kk + 1 に設定する。
  10. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kValue を ! Get(obj, propertyKey) とする。
    3. accumulator を ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), obj ») に設定する。
    4. kk + 1 に設定する。
  11. accumulator を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.24 %TypedArray%.prototype.reduceRight ( callback [ , initialValue ] )

このメソッドの引数の解釈および使用方法は、23.1.3.25 で定義される Array.prototype.reduceRight と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  5. len = 0 かつ initialValue が存在しない場合、TypeError 例外をスローする。
  6. klen - 1 とする。
  7. accumulatorundefined とする。
  8. initialValue が存在する場合、次を行う:
    1. accumulatorinitialValue に設定する。
  9. それ以外の場合、
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. accumulator を ! Get(obj, propertyKey) に設定する。
    3. kk - 1 に設定する。
  10. k ≥ 0 の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kValue を ! Get(obj, propertyKey) とする。
    3. accumulator を ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), obj ») に設定する。
    4. kk - 1 に設定する。
  11. accumulator を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.25 %TypedArray%.prototype.reverse ( )

このメソッドの引数の解釈および使用方法は、23.1.3.26 で定義される Array.prototype.reverse と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. middlefloor(len / 2) とする。
  5. lower を 0 とする。
  6. lowermiddle の間、繰り返す:
    1. upperlen - lower - 1 とする。
    2. upperP を ! ToString(𝔽(upper)) とする。
    3. lowerP を ! ToString(𝔽(lower)) とする。
    4. lowerValue を ! Get(obj, lowerP) とする。
    5. upperValue を ! Get(obj, upperP) とする。
    6. Set(obj, lowerP, upperValue, true) を実行する。
    7. Set(obj, upperP, lowerValue, true) を実行する。
    8. lowerlower + 1 に設定する。
  7. obj を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.26 %TypedArray%.prototype.set ( source [ , offset ] )

このメソッドは、この TypedArray 内に複数の値を設定し、その値を source から読み取ります。詳細は source の型に基づいて異なります。省略可能な offset 値は、この TypedArray 内で値が書き込まれる最初の要素インデックスを示します。省略された場合、0であると仮定されます。

呼び出されたとき、次の手順を実行します:

  1. targetthis値とする。
  2. RequireInternalSlot(target, [[TypedArrayName]]) を実行する。
  3. Assert: target[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. targetOffset を ? ToIntegerOrInfinity(offset) とする。
  5. targetOffset < 0 の場合、RangeError 例外をスローする。
  6. source[[TypedArrayName]] 内部スロットを持つObjectである場合、次を行う:
    1. SetTypedArrayFromTypedArray(target, targetOffset, source) を実行する。
  7. それ以外の場合、
    1. SetTypedArrayFromArrayLike(target, targetOffset, source) を実行する。
  8. undefined を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.26.1 SetTypedArrayFromArrayLike ( target, targetOffset, source )

The abstract operation SetTypedArrayFromArrayLike takes arguments target (TypedArray), targetOffset (非負整数または +∞), and source (ECMAScript言語値、ただしTypedArrayではない) and returns unused を含む正常完了またはスロー完了のいずれか. これは、source から値を読み取り、インデックス targetOffset から始めて target 内に複数の値を設定します。 It performs the following steps when called:

  1. targetRecordMakeTypedArrayWithBufferWitnessRecord(target, seq-cst) とする。
  2. IsTypedArrayOutOfBounds(targetRecord) が true の場合、TypeError 例外をスローする。
  3. targetLengthTypedArrayLength(targetRecord) とする。
  4. src を ? ToObject(source) とする。
  5. srcLength を ? LengthOfArrayLike(src) とする。
  6. targetOffset = +∞ の場合、RangeError 例外をスローする。
  7. srcLength + targetOffset > targetLength の場合、RangeError 例外をスローする。
  8. k を 0 とする。
  9. k < srcLength の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. value を ? Get(src, propertyKey) とする。
    3. targetIndex𝔽(targetOffset + k) とする。
    4. TypedArraySetElement(target, targetIndex, value) を実行する。
    5. kk + 1 に設定する。
  10. unused を返す。

23.2.3.26.2 SetTypedArrayFromTypedArray ( target, targetOffset, source )

The abstract operation SetTypedArrayFromTypedArray takes arguments target (TypedArray), targetOffset (非負整数または +∞), and source (TypedArray) and returns unused を含む正常完了またはスロー完了のいずれか. これは、source から値を読み取り、インデックス targetOffset から始めて target 内に複数の値を設定します。 It performs the following steps when called:

  1. targetBuffertarget.[[ViewedArrayBuffer]] とする。
  2. targetRecordMakeTypedArrayWithBufferWitnessRecord(target, seq-cst) とする。
  3. IsTypedArrayOutOfBounds(targetRecord) が true の場合、TypeError 例外をスローする。
  4. targetLengthTypedArrayLength(targetRecord) とする。
  5. srcBuffersource.[[ViewedArrayBuffer]] とする。
  6. srcRecordMakeTypedArrayWithBufferWitnessRecord(source, seq-cst) とする。
  7. IsTypedArrayOutOfBounds(srcRecord) が true の場合、TypeError 例外をスローする。
  8. srcLengthTypedArrayLength(srcRecord) とする。
  9. targetTypeTypedArrayElementType(target) とする。
  10. targetElementSizeTypedArrayElementSize(target) とする。
  11. targetByteOffsettarget.[[ByteOffset]] とする。
  12. srcTypeTypedArrayElementType(source) とする。
  13. srcElementSizeTypedArrayElementSize(source) とする。
  14. srcByteOffsetsource.[[ByteOffset]] とする。
  15. targetOffset = +∞ の場合、RangeError 例外をスローする。
  16. srcLength + targetOffset > targetLength の場合、RangeError 例外をスローする。
  17. target.[[ContentType]]source.[[ContentType]] でない場合、TypeError 例外をスローする。
  18. IsSharedArrayBuffer(srcBuffer) が trueIsSharedArrayBuffer(targetBuffer) が true、かつ srcBuffer.[[ArrayBufferData]]targetBuffer.[[ArrayBufferData]] である場合、sameSharedArrayBuffertrue とする。そうでない場合、sameSharedArrayBufferfalse とする。
  19. SameValue(srcBuffer, targetBuffer) が true、または sameSharedArrayBuffertrue の場合、次を行う:
    1. srcByteLengthTypedArrayByteLength(srcRecord) とする。
    2. srcBuffer を ? CloneArrayBuffer(srcBuffer, srcByteOffset, srcByteLength) に設定する。
    3. srcByteIndex を 0 とする。
  20. それ以外の場合、
    1. srcByteIndexsrcByteOffset とする。
  21. targetByteIndex を (targetOffset × targetElementSize) + targetByteOffset とする。
  22. limittargetByteIndex + (targetElementSize × srcLength) とする。
  23. srcTypetargetType である場合、次を行う:
    1. NOTE: 転送は、ソースデータのビットレベル符号化を保持する方法で実行されなければならない。
    2. targetByteIndex < limit の間、繰り返す:
      1. valueGetValueFromBuffer(srcBuffer, srcByteIndex, uint8, true, unordered) とする。
      2. SetValueInBuffer(targetBuffer, targetByteIndex, uint8, value, true, unordered) を実行する。
      3. srcByteIndexsrcByteIndex + 1 に設定する。
      4. targetByteIndextargetByteIndex + 1 に設定する。
  24. それ以外の場合、
    1. targetByteIndex < limit の間、繰り返す:
      1. valueGetValueFromBuffer(srcBuffer, srcByteIndex, srcType, true, unordered) とする。
      2. SetValueInBuffer(targetBuffer, targetByteIndex, targetType, value, true, unordered) を実行する。
      3. srcByteIndexsrcByteIndex + srcElementSize に設定する。
      4. targetByteIndextargetByteIndex + targetElementSize に設定する。
  25. unused を返す。

23.2.3.27 %TypedArray%.prototype.slice ( start, end )

このメソッドの引数の解釈および使用方法は、23.1.3.28 で定義される Array.prototype.slice と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. srcArrayLengthTypedArrayLength(taRecord) とする。
  4. relativeStart を ? ToIntegerOrInfinity(start) とする。
  5. relativeStart = -∞ の場合、startIndex を 0 とする。
  6. そうでなく relativeStart < 0 の場合、startIndexmax(srcArrayLength + relativeStart, 0) とする。
  7. それ以外の場合、startIndexmin(relativeStart, srcArrayLength) とする。
  8. endundefined の場合、relativeEndsrcArrayLength とする。そうでない場合、relativeEnd を ? ToIntegerOrInfinity(end) とする。
  9. relativeEnd = -∞ の場合、endIndex を 0 とする。
  10. そうでなく relativeEnd < 0 の場合、endIndexmax(srcArrayLength + relativeEnd, 0) とする。
  11. それ以外の場合、endIndexmin(relativeEnd, srcArrayLength) とする。
  12. countBytesmax(endIndex - startIndex, 0) とする。
  13. resultArray を ? TypedArraySpeciesCreate(obj, « 𝔽(countBytes) ») とする。
  14. countBytes > 0 の場合、次を行う:
    1. taRecordMakeTypedArrayWithBufferWitnessRecord(obj, seq-cst) に設定する。
    2. IsTypedArrayOutOfBounds(taRecord) が true の場合、TypeError 例外をスローする。
    3. endIndexmin(endIndex, TypedArrayLength(taRecord)) に設定する。
    4. countBytesmax(endIndex - startIndex, 0) に設定する。
    5. srcTypeTypedArrayElementType(obj) とする。
    6. targetTypeTypedArrayElementType(resultArray) とする。
    7. srcTypetargetType である場合、次を行う:
      1. NOTE: 転送は、ソースデータのビットレベル符号化を保持する方法で実行されなければならない。
      2. srcBufferobj.[[ViewedArrayBuffer]] とする。
      3. targetBufferresultArray.[[ViewedArrayBuffer]] とする。
      4. elementSizeTypedArrayElementSize(obj) とする。
      5. srcByteOffsetobj.[[ByteOffset]] とする。
      6. srcByteIndex を (startIndex × elementSize) + srcByteOffset とする。
      7. targetByteIndexresultArray.[[ByteOffset]] とする。
      8. endByteIndextargetByteIndex + (countBytes × elementSize) とする。
      9. targetByteIndex < endByteIndex の間、繰り返す:
        1. valueGetValueFromBuffer(srcBuffer, srcByteIndex, uint8, true, unordered) とする。
        2. SetValueInBuffer(targetBuffer, targetByteIndex, uint8, value, true, unordered) を実行する。
        3. srcByteIndexsrcByteIndex + 1 に設定する。
        4. targetByteIndextargetByteIndex + 1 に設定する。
    8. それ以外の場合、
      1. n を 0 とする。
      2. kstartIndex とする。
      3. k < endIndex の間、繰り返す:
        1. propertyKey を ! ToString(𝔽(k)) とする。
        2. kValue を ! Get(obj, propertyKey) とする。
        3. Set(resultArray, ! ToString(𝔽(n)), kValue, true) を実行する。
        4. kk + 1 に設定する。
        5. nn + 1 に設定する。
  15. resultArray を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.28 %TypedArray%.prototype.some ( callback [ , thisArg ] )

このメソッドの引数の解釈および使用方法は、23.1.3.29 で定義される Array.prototype.some と同じです。

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  5. k を 0 とする。
  6. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kValue を ! Get(obj, propertyKey) とする。
    3. testResultToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), obj »)) とする。
    4. testResulttrue の場合、true を返す。
    5. kk + 1 に設定する。
  7. false を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.29 %TypedArray%.prototype.sort ( comparator )

これは、以下に記述される場合を除き、23.1.3.30 で定義される Array.prototype.sort の要件と同じ要件を実装する個別のメソッドです。このメソッドの実装は、this値が固定長を持ち、その整数インデックス付きプロパティが疎でないオブジェクトであるという知識によって最適化されてもよいです。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

呼び出されたとき、次の手順を実行します:

  1. comparatorundefined でなく、かつ IsCallable(comparator) が false の場合、TypeError 例外をスローする。
  2. objthis値とする。
  3. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  4. lenTypedArrayLength(taRecord) とする。
  5. NOTE: 次のclosureは、23.1.3.30 で使用される文字列比較ではなく数値比較を実行する。
  6. sortCompare を、comparator を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (x, y) を持つ新しいAbstract Closureとする:
    1. CompareTypedArrayElements(x, y, comparator) を返す。
  7. sortedList を ? SortIndexedProperties(obj, len, sortCompare, read-through-holes) とする。
  8. j を 0 とする。
  9. j < len の間、繰り返す:
    1. Set(obj, ! ToString(𝔽(j)), sortedList[j], true) を実行する。
    2. jj + 1 に設定する。
  10. obj を返す。
Note

NaN は常に他の任意の値より大きく比較されるため(CompareTypedArrayElementsを参照)、comparator が提供されない場合、NaN プロパティ値は常に結果の末尾にソートされます。

23.2.3.30 %TypedArray%.prototype.subarray ( start, end )

このメソッドは、この TypedArray の要素型を要素型とし、この TypedArray のArrayBufferをArrayBufferとする新しい TypedArray を返し、start(包含)から end(排他)までの区間内の要素を参照します。start または end のいずれかが負である場合、それは先頭からではなく、配列の末尾からのインデックスを参照します。

呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[TypedArrayName]]) を実行する。
  3. Assert: obj[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. bufferobj.[[ViewedArrayBuffer]] とする。
  5. srcRecordMakeTypedArrayWithBufferWitnessRecord(obj, seq-cst) とする。
  6. IsTypedArrayOutOfBounds(srcRecord) が true の場合、次を行う:
    1. srcLength を 0 とする。
  7. それ以外の場合、
    1. srcLengthTypedArrayLength(srcRecord) とする。
  8. relativeStart を ? ToIntegerOrInfinity(start) とする。
  9. relativeStart = -∞ の場合、startIndex を 0 とする。
  10. そうでなく relativeStart < 0 の場合、startIndexmax(srcLength + relativeStart, 0) とする。
  11. それ以外の場合、startIndexmin(relativeStart, srcLength) とする。
  12. elementSizeTypedArrayElementSize(obj) とする。
  13. srcByteOffsetobj.[[ByteOffset]] とする。
  14. beginByteOffsetsrcByteOffset + (startIndex × elementSize) とする。
  15. obj.[[ArrayLength]]auto かつ endundefined の場合、次を行う:
    1. argumentsList を « buffer, 𝔽(beginByteOffset) » とする。
  16. それ以外の場合、
    1. endundefined の場合、relativeEndsrcLength とする。そうでない場合、relativeEnd を ? ToIntegerOrInfinity(end) とする。
    2. relativeEnd = -∞ の場合、endIndex を 0 とする。
    3. そうでなく relativeEnd < 0 の場合、endIndexmax(srcLength + relativeEnd, 0) とする。
    4. それ以外の場合、endIndexmin(relativeEnd, srcLength) とする。
    5. newLengthmax(endIndex - startIndex, 0) とする。
    6. argumentsList を « buffer, 𝔽(beginByteOffset), 𝔽(newLength) » とする。
  17. TypedArraySpeciesCreate(obj, argumentsList) を返す。

このメソッドは汎用ではありません。this値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければなりません。

23.2.3.31 %TypedArray%.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

これは、23.1.3.32 で定義される Array.prototype.toLocaleString と同じアルゴリズムを実装する個別のメソッドですが、"length"[[Get]] を実行する代わりにTypedArrayLengthが呼び出されます。基底バッファがリサイズ可能でない場合、this値は固定長を持ち、その整数インデックス付きプロパティは疎でないという知識によって、アルゴリズムの実装は最適化されてもよいです。ただし、そのような最適化は、アルゴリズムの指定された動作に観察可能な変更を導入してはなりません。

このメソッドは汎用ではありません。アルゴリズムを評価する前に、ValidateTypedArraythis値と seq-cst を引数として呼び出されます。その結果が急な完了である場合、アルゴリズムを評価する代わりにその例外がスローされます。

Note

ECMAScript実装がECMA-402 Internationalization APIを含む場合、このメソッドはECMA-402仕様内の Array.prototype.toLocaleString のアルゴリズムに基づきます。

23.2.3.32 %TypedArray%.prototype.toReversed ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. resultArray を ? TypedArrayCreateSameType(obj, len) とする。
  5. k を 0 とする。
  6. k < len の間、繰り返す:
    1. from を ! ToString(𝔽(len - k - 1)) とする。
    2. propertyKey を ! ToString(𝔽(k)) とする。
    3. fromValue を ! Get(obj, from) とする。
    4. Set(resultArray, propertyKey, fromValue, true) を実行する。
    5. kk + 1 に設定する。
  7. resultArray を返す。

23.2.3.33 %TypedArray%.prototype.toSorted ( comparator )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. comparatorundefined でなく、かつ IsCallable(comparator) が false の場合、TypeError 例外をスローする。
  2. objthis値とする。
  3. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  4. lenTypedArrayLength(taRecord) とする。
  5. resultArray を ? TypedArrayCreateSameType(obj, len) とする。
  6. NOTE: 次のclosureは、23.1.3.34 で使用される文字列比較ではなく数値比較を実行する。
  7. sortCompare を、comparator を捕捉し、呼び出されたときに次の手順を実行する、パラメーター (x, y) を持つ新しいAbstract Closureとする:
    1. CompareTypedArrayElements(x, y, comparator) を返す。
  8. sortedList を ? SortIndexedProperties(obj, len, sortCompare, read-through-holes) とする。
  9. j を 0 とする。
  10. j < len の間、繰り返す:
    1. Set(resultArray, ! ToString(𝔽(j)), sortedList[j], true) を実行する。
    2. jj + 1 に設定する。
  11. resultArray を返す。

23.2.3.34 %TypedArray%.prototype.toString ( )

"toString"プロパティの初期値は、23.1.3.36 で定義される %Array.prototype.toString% です。

23.2.3.35 %TypedArray%.prototype.values ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. ValidateTypedArray(obj, seq-cst) を実行する。
  3. CreateArrayIterator(obj, value) を返す。

23.2.3.36 %TypedArray%.prototype.with ( index, value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. taRecord を ? ValidateTypedArray(obj, seq-cst) とする。
  3. lenTypedArrayLength(taRecord) とする。
  4. relativeIndex を ? ToIntegerOrInfinity(index) とする。
  5. relativeIndex ≥ 0 の場合、actualIndexrelativeIndex とする。
  6. それ以外の場合、actualIndexlen + relativeIndex とする。
  7. obj.[[ContentType]]bigint である場合、numericValue を ? ToBigInt(value) とする。
  8. それ以外の場合、numericValue を ? ToNumber(value) とする。
  9. IsValidIntegerIndex(obj, 𝔽(actualIndex)) が false の場合、RangeError 例外をスローする。
  10. resultArray を ? TypedArrayCreateSameType(obj, len) とする。
  11. k を 0 とする。
  12. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. k = actualIndex の場合、fromValuenumericValue とする。
    3. それ以外の場合、fromValue を ! Get(obj, propertyKey) とする。
    4. Set(resultArray, propertyKey, fromValue, true) を実行する。
    5. kk + 1 に設定する。
  13. 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アクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. obj がObjectでない場合、undefined を返す。
  3. obj[[TypedArrayName]] 内部スロットを持たない場合、undefined を返す。
  4. nameobj.[[TypedArrayName]] とする。
  5. Assert: name はStringである。
  6. name を返す。

このプロパティの属性は { [[Enumerable]]: false, [[Configurable]]: true } です。

この関数の"name"プロパティの初期値は "get [Symbol.toStringTag]" です。

23.2.4 TypedArrayオブジェクトのための抽象操作

23.2.4.1 TypedArrayCreateFromConstructor ( constructor, argumentList )

The abstract operation TypedArrayCreateFromConstructor takes arguments constructor (コンストラクター) and argumentList (ECMAScript言語値のList) and returns TypedArrayを含む正常完了またはスロー完了のいずれか. これは、コンストラクター関数を使用した新しいTypedArrayの作成を指定するために使用されます。 It performs the following steps when called:

  1. newTypedArray を ? Construct(constructor, argumentList) とする。
  2. taRecord を ? ValidateTypedArray(newTypedArray, seq-cst) とする。
  3. Assert: newTypedArrayTypedArray インスタンスのプロパティ で言及されるすべての内部スロットを持つ。
  4. argumentList 内の要素数が1であり、argumentList[0] がNumberである場合、次を行う:
    1. IsTypedArrayOutOfBounds(taRecord) が true の場合、TypeError 例外をスローする。
    2. lengthTypedArrayLength(taRecord) とする。
    3. length < (argumentList[0]) の場合、TypeError 例外をスローする。
  5. newTypedArray を返す。

23.2.4.2 TypedArrayCreateSameType ( exemplar, length )

The abstract operation TypedArrayCreateSameType takes arguments exemplar (TypedArray) and length (非負整数) and returns TypedArrayを含む正常完了またはスロー完了のいずれか. これは、exemplar から派生したコンストラクター関数を使用した新しいTypedArrayの作成を指定するために使用されます。%Symbol.species% の使用を通じてカスタムTypedArrayサブクラスを構築できるTypedArraySpeciesCreateとは異なり、この操作は常に組み込みTypedArrayコンストラクターの1つを使用します。 It performs the following steps when called:

  1. constructor を、Table 70 内のコンストラクター名 exemplar.[[TypedArrayName]] に関連付けられたintrinsicオブジェクトとする。
  2. result を ? TypedArrayCreateFromConstructor(constructor, « 𝔽(length) ») とする。
  3. Assert: result[[TypedArrayName]] および [[ContentType]] 内部スロットを持つ。
  4. Assert: result.[[ContentType]]exemplar.[[ContentType]] である。
  5. result を返す。

23.2.4.3 TypedArraySpeciesCreate ( exemplar, argumentList )

The abstract operation TypedArraySpeciesCreate takes arguments exemplar (TypedArray) and argumentList (ECMAScript言語値のList) and returns TypedArrayを含む正常完了またはスロー完了のいずれか. これは、exemplar から派生したコンストラクター関数を使用した新しいTypedArrayの作成を指定するために使用されます。%Symbol.species% の使用を通じて非Arrayオブジェクトを作成できるArraySpeciesCreateとは異なり、この操作は、コンストラクター関数が実際のTypedArrayを作成することを強制します。 It performs the following steps when called:

  1. defaultConstructor を、Table 70 内のコンストラクター名 exemplar.[[TypedArrayName]] に関連付けられたintrinsicオブジェクトとする。
  2. constructor を ? SpeciesConstructor(exemplar, defaultConstructor) とする。
  3. result を ? TypedArrayCreateFromConstructor(constructor, argumentList) とする。
  4. result.[[ContentType]]exemplar.[[ContentType]] でない場合、TypeError 例外をスローする。
  5. result を返す。

23.2.4.4 ValidateTypedArray ( obj, order )

The abstract operation ValidateTypedArray takes arguments obj (ECMAScript言語値) and order (seq-cst または unordered) and returns TypedArray With Buffer Witness Recordを含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. RequireInternalSlot(obj, [[TypedArrayName]]) を実行する。
  2. Assert: obj[[ViewedArrayBuffer]] 内部スロットを持つ。
  3. taRecordMakeTypedArrayWithBufferWitnessRecord(obj, order) とする。
  4. IsTypedArrayOutOfBounds(taRecord) が true の場合、TypeError 例外をスローする。
  5. taRecord を返す。

23.2.4.5 TypedArrayElementSize ( obj )

The abstract operation TypedArrayElementSize takes argument obj (TypedArray) and returns 非負整数. It performs the following steps when called:

  1. obj.[[TypedArrayName]] について Table 70 に指定されたElement Size値を返す。

23.2.4.6 TypedArrayElementType ( obj )

The abstract operation TypedArrayElementType takes argument obj (TypedArray) and returns TypedArray要素型. It performs the following steps when called:

  1. obj.[[TypedArrayName]] について Table 70 に指定されたElement Type値を返す。

23.2.4.7 CompareTypedArrayElements ( x, y, comparator )

The abstract operation CompareTypedArrayElements takes arguments x (NumberまたはBigInt), y (NumberまたはBigInt), and comparator (関数オブジェクトまたはundefined) and returns Numberを含む正常完了または急な完了のいずれか. It performs the following steps when called:

  1. Assert: x はNumberであり y はNumberである、または x はBigIntであり y はBigIntである。
  2. comparatorundefined でない場合、次を行う:
    1. result を ? ToNumber(? Call(comparator, undefined, « x, y »)) とする。
    2. resultNaN の場合、+0𝔽 を返す。
    3. result を返す。
  3. xNaN かつ yNaN の場合、+0𝔽 を返す。
  4. xNaN の場合、1𝔽 を返す。
  5. yNaN の場合、-1𝔽 を返す。
  6. x < y の場合、-1𝔽 を返す。
  7. x > y の場合、1𝔽 を返す。
  8. x-0𝔽 かつ y+0𝔽 の場合、-1𝔽 を返す。
  9. x+0𝔽 かつ y-0𝔽 の場合、1𝔽 を返す。
  10. +0𝔽 を返す。
Note
これは、23.1.3.30.2 で使用される文字列比較ではなく数値比較を実行します。

23.2.5 TypedArray コンストラクター

TypedArray コンストラクターは以下の通りです:

  • 下記に説明される構造を持つintrinsicオブジェクトであり、特に注記がない限り、Table 70 において TypedArray の代わりにコンストラクター名として使用される名前のみが異なる。
  • 引数の数と型に基づいて動作が異なる関数である。TypedArray の呼び出しの実際の動作は、それに渡される引数の数および種類に依存する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローする。
  • クラス定義のextends節の値として使用できる。指定された TypedArray の動作を継承することを意図するサブクラスコンストラクターは、%TypedArray%.prototype組み込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するために、TypedArray コンストラクターへのsuper呼び出しを含めなければならない。

23.2.5.1 TypedArray ( ...args )

TypedArray コンストラクターは呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. constructorName を、このTypedArrayコンストラクターについて Table 70 に指定されたConstructor Name値のString値とする。
  3. proto"%TypedArray.prototype%" とする。
  4. numberOfArgsargs 内の要素数とする。
  5. numberOfArgs = 0 の場合、? AllocateTypedArray(constructorName, NewTarget, proto, 0) を返す。
  6. firstArgumentargs[0] とする。
  7. firstArgument がObjectである場合、次を行う:
    1. obj を ? AllocateTypedArray(constructorName, NewTarget, proto) とする。
    2. firstArgument[[TypedArrayName]] 内部スロットを持つ場合、次を行う:
      1. InitializeTypedArrayFromTypedArray(obj, firstArgument) を実行する。
    3. そうでなく firstArgument[[ArrayBufferData]] 内部スロットを持つ場合、次を行う:
      1. numberOfArgs > 1 の場合、byteOffsetargs[1] とする。そうでない場合、byteOffsetundefined とする。
      2. numberOfArgs > 2 の場合、lengthargs[2] とする。そうでない場合、lengthundefined とする。
      3. InitializeTypedArrayFromArrayBuffer(obj, firstArgument, byteOffset, length) を実行する。
    4. それ以外の場合、
      1. Assert: firstArgument はObjectであり、firstArgument[[TypedArrayName]] または [[ArrayBufferData]] 内部スロットのいずれも持たない。
      2. usingIterator を ? GetMethod(firstArgument, %Symbol.iterator%) とする。
      3. usingIteratorundefined でない場合、次を行う:
        1. values を ? IteratorToList(? GetIteratorFromMethod(firstArgument, usingIterator)) とする。
        2. InitializeTypedArrayFromList(obj, values) を実行する。
      4. それ以外の場合、
        1. NOTE: firstArgumentiterable objectではないため、すでにarray-like objectであると仮定する。
        2. InitializeTypedArrayFromArrayLike(obj, firstArgument) を実行する。
    5. obj を返す。
  8. Assert: firstArgument はObjectでない。
  9. elementLength を ? ToIndex(firstArgument) とする。
  10. AllocateTypedArray(constructorName, NewTarget, proto, elementLength) を返す。

23.2.5.1.1 AllocateTypedArray ( constructorName, newTarget, defaultProto [ , length ] )

The abstract operation AllocateTypedArray takes arguments constructorName (Table 70 内のTypedArrayコンストラクターの名前であるString), newTarget (コンストラクター), and defaultProto (String) and optional argument length (非負整数) and returns TypedArrayを含む正常完了またはスロー完了のいずれか. これは、TypedArrayコンストラクターのインスタンスを検証し作成するために使用されます。length 引数が渡された場合、その長さのArrayBufferも割り当てられ、新しいTypedArrayインスタンスに関連付けられます。AllocateTypedArrayは、TypedArray によって使用される共通の意味論を提供します。 It performs the following steps when called:

  1. proto を ? GetPrototypeFromConstructor(newTarget, defaultProto) とする。
  2. objTypedArrayCreate(proto) とする。
  3. Assert: obj.[[ViewedArrayBuffer]]undefined である。
  4. obj.[[TypedArrayName]]constructorName に設定する。
  5. constructorName"BigInt64Array" または "BigUint64Array" のいずれかである場合、obj.[[ContentType]]bigint に設定する。
  6. それ以外の場合、obj.[[ContentType]]number に設定する。
  7. length が存在しない場合、次を行う:
    1. obj.[[ByteLength]] を 0 に設定する。
    2. obj.[[ByteOffset]] を 0 に設定する。
    3. obj.[[ArrayLength]] を 0 に設定する。
  8. それ以外の場合、
    1. AllocateTypedArrayBuffer(obj, length) を実行する。
  9. obj を返す。

23.2.5.1.2 InitializeTypedArrayFromTypedArray ( obj, srcArray )

The abstract operation InitializeTypedArrayFromTypedArray takes arguments obj (TypedArray) and srcArray (TypedArray) and returns unused を含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. srcDatasrcArray.[[ViewedArrayBuffer]] とする。
  2. elementTypeTypedArrayElementType(obj) とする。
  3. elementSizeTypedArrayElementSize(obj) とする。
  4. srcTypeTypedArrayElementType(srcArray) とする。
  5. srcElementSizeTypedArrayElementSize(srcArray) とする。
  6. srcByteOffsetsrcArray.[[ByteOffset]] とする。
  7. srcRecordMakeTypedArrayWithBufferWitnessRecord(srcArray, seq-cst) とする。
  8. IsTypedArrayOutOfBounds(srcRecord) が true の場合、TypeError 例外をスローする。
  9. elementLengthTypedArrayLength(srcRecord) とする。
  10. byteLengthelementSize × elementLength とする。
  11. elementTypesrcType である場合、次を行う:
    1. data を ? CloneArrayBuffer(srcData, srcByteOffset, byteLength) とする。
  12. それ以外の場合、
    1. data を ? AllocateArrayBuffer(%ArrayBuffer%, byteLength) とする。
    2. srcArray.[[ContentType]]obj.[[ContentType]] でない場合、TypeError 例外をスローする。
    3. srcByteIndexsrcByteOffset とする。
    4. targetByteIndex を 0 とする。
    5. countelementLength とする。
    6. count > 0 の間、繰り返す:
      1. valueGetValueFromBuffer(srcData, srcByteIndex, srcType, true, unordered) とする。
      2. SetValueInBuffer(data, targetByteIndex, elementType, value, true, unordered) を実行する。
      3. srcByteIndexsrcByteIndex + srcElementSize に設定する。
      4. targetByteIndextargetByteIndex + elementSize に設定する。
      5. countcount - 1 に設定する。
  13. obj.[[ViewedArrayBuffer]]data に設定する。
  14. obj.[[ByteLength]]byteLength に設定する。
  15. obj.[[ByteOffset]] を 0 に設定する。
  16. obj.[[ArrayLength]]elementLength に設定する。
  17. unused を返す。

23.2.5.1.3 InitializeTypedArrayFromArrayBuffer ( obj, buffer, byteOffset, length )

The abstract operation InitializeTypedArrayFromArrayBuffer takes arguments obj (TypedArray), buffer (ArrayBufferまたはSharedArrayBuffer), byteOffset (ECMAScript言語値), and length (ECMAScript言語値) and returns unused を含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. elementSizeTypedArrayElementSize(obj) とする。
  2. offset を ? ToIndex(byteOffset) とする。
  3. offset modulo elementSize ≠ 0 の場合、RangeError 例外をスローする。
  4. bufferIsFixedLengthIsFixedLengthArrayBuffer(buffer) とする。
  5. lengthundefined でない場合、次を行う:
    1. newLength を ? ToIndex(length) とする。
  6. IsDetachedBuffer(buffer) が true の場合、TypeError 例外をスローする。
  7. bufferByteLengthArrayBufferByteLength(buffer, seq-cst) とする。
  8. lengthundefined かつ bufferIsFixedLengthfalse の場合、次を行う:
    1. offset > bufferByteLength の場合、RangeError 例外をスローする。
    2. obj.[[ByteLength]]auto に設定する。
    3. obj.[[ArrayLength]]auto に設定する。
  9. それ以外の場合、
    1. lengthundefined の場合、次を行う:
      1. bufferByteLength modulo elementSize ≠ 0 の場合、RangeError 例外をスローする。
      2. newByteLengthbufferByteLength - offset とする。
      3. newByteLength < 0 の場合、RangeError 例外をスローする。
    2. それ以外の場合、
      1. newByteLengthnewLength × elementSize とする。
      2. offset + newByteLength > bufferByteLength の場合、RangeError 例外をスローする。
    3. obj.[[ByteLength]]newByteLength に設定する。
    4. obj.[[ArrayLength]]newByteLength / elementSize に設定する。
  10. obj.[[ViewedArrayBuffer]]buffer に設定する。
  11. obj.[[ByteOffset]]offset に設定する。
  12. unused を返す。

23.2.5.1.4 InitializeTypedArrayFromList ( obj, values )

The abstract operation InitializeTypedArrayFromList takes arguments obj (TypedArray) and values (ECMAScript言語値のList) and returns unused を含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. lenvalues 内の要素数とする。
  2. AllocateTypedArrayBuffer(obj, len) を実行する。
  3. k を 0 とする。
  4. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kValuevalues の最初の要素とする。
    3. values から最初の要素を除去する。
    4. Set(obj, propertyKey, kValue, true) を実行する。
    5. kk + 1 に設定する。
  5. Assert: values は今や空のListである。
  6. unused を返す。

23.2.5.1.5 InitializeTypedArrayFromArrayLike ( obj, arrayLike )

The abstract operation InitializeTypedArrayFromArrayLike takes arguments obj (TypedArray) and arrayLike (Object、ただしTypedArrayでもArrayBufferでもない) and returns unused を含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. len を ? LengthOfArrayLike(arrayLike) とする。
  2. AllocateTypedArrayBuffer(obj, len) を実行する。
  3. k を 0 とする。
  4. k < len の間、繰り返す:
    1. propertyKey を ! ToString(𝔽(k)) とする。
    2. kValue を ? Get(arrayLike, propertyKey) とする。
    3. Set(obj, propertyKey, kValue, true) を実行する。
    4. kk + 1 に設定する。
  5. unused を返す。

23.2.5.1.6 AllocateTypedArrayBuffer ( obj, length )

The abstract operation AllocateTypedArrayBuffer takes arguments obj (TypedArray) and length (非負整数) and returns unused を含む正常完了またはスロー完了のいずれか. これはArrayBufferを割り当て、obj に関連付けます。 It performs the following steps when called:

  1. Assert: obj.[[ViewedArrayBuffer]]undefined である。
  2. elementSizeTypedArrayElementSize(obj) とする。
  3. byteLengthelementSize × length とする。
  4. data を ? AllocateArrayBuffer(%ArrayBuffer%, byteLength) とする。
  5. obj.[[ViewedArrayBuffer]]data に設定する。
  6. obj.[[ByteLength]]byteLength に設定する。
  7. obj.[[ByteOffset]] を 0 に設定する。
  8. obj.[[ArrayLength]]length に設定する。
  9. unused を返す。

23.2.6 TypedArray コンストラクターのプロパティ

TypedArray コンストラクターは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %TypedArray% である。
  • 値が 3𝔽 である"length"プロパティを持つ。
  • 値が Table 70 でそれについて指定されたコンストラクター名のString値である"name"プロパティを持つ。
  • 以下のプロパティを持つ:

23.2.6.1 TypedArray.BYTES_PER_ELEMENT

TypedArray.BYTES_PER_ELEMENTの値は、Table 70 において TypedArray について指定されたElement Size値です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

23.2.6.2 TypedArray.prototype

TypedArray.prototypeの初期値は、対応する TypedArray プロトタイプintrinsicオブジェクト(23.2.7)です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

23.2.7 TypedArray プロトタイプオブジェクトのプロパティ

TypedArray プロトタイプオブジェクトは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %TypedArray.prototype% である。
  • 通常のオブジェクトである。
  • [[ViewedArrayBuffer]]、または TypedArray インスタンスオブジェクトに固有のその他の内部スロットを持たない。

23.2.7.1 TypedArray.prototype.BYTES_PER_ELEMENT

TypedArray.prototype.BYTES_PER_ELEMENTの値は、Table 70 において TypedArray について指定されたElement Size値です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

23.2.7.2 TypedArray.prototype.constructor

所与の TypedArray コンストラクターのプロトタイプの"constructor"プロパティの初期値は、そのコンストラクター自体です。

23.2.8 TypedArray インスタンスのプロパティ

TypedArray インスタンスはTypedArrayです。各 TypedArray インスタンスは、対応する TypedArray プロトタイプオブジェクトからプロパティを継承します。各 TypedArray インスタンスは、次の内部スロットを持ちます:[[ViewedArrayBuffer]][[TypedArrayName]][[ContentType]][[ByteLength]][[ByteOffset]]、および [[ArrayLength]]

23.3 Uint8Arrayオブジェクト

Uint8Arrayは、上記で説明された特定の種類の TypedArray です。さらに、Uint8Arrayコンストラクター上(23.3.1)およびUint8Arrayプロトタイプオブジェクト上(23.3.2)には追加のメソッドがあります。

23.3.1 Uint8Arrayコンストラクターの追加プロパティ

23.3.1.1 Uint8Array.fromBase64 ( string [ , options ] )

  1. string がStringでない場合、TypeError 例外をスローする。
  2. opts を ? GetOptionsObject(options) とする。
  3. alphabet を ? Get(opts, "alphabet") とする。
  4. alphabetundefined の場合、alphabet"base64" に設定する。
  5. alphabet"base64""base64url" のいずれでもない場合、TypeError 例外をスローする。
  6. lastChunkHandling を ? Get(opts, "lastChunkHandling") とする。
  7. lastChunkHandlingundefined の場合、lastChunkHandling"loose" に設定する。
  8. lastChunkHandling"loose""strict"、または "stop-before-partial" のいずれでもない場合、TypeError 例外をスローする。
  9. resultFromBase64(string, alphabet, lastChunkHandling) とする。
  10. result.[[Error]]none でない場合、次を行う:
    1. result.[[Error]] をスローする。
  11. resultLengthresult.[[Bytes]] 内の要素数とする。
  12. ta を ? AllocateTypedArray("Uint8Array", %Uint8Array%, "%Uint8Array.prototype%", resultLength) とする。
  13. Assert: ta.[[ViewedArrayBuffer]].[[ArrayBufferByteLength]]result.[[Bytes]] 内の要素数である。
  14. ta.[[ViewedArrayBuffer]].[[ArrayBufferData]] の各インデックスの値を、result.[[Bytes]] の対応するインデックスの値に設定する。
  15. ta を返す。

23.3.1.2 Uint8Array.fromHex ( string )

  1. string がStringでない場合、TypeError 例外をスローする。
  2. resultFromHex(string) とする。
  3. result.[[Error]]none でない場合、次を行う:
    1. result.[[Error]] をスローする。
  4. resultLengthresult.[[Bytes]] 内の要素数とする。
  5. ta を ? AllocateTypedArray("Uint8Array", %Uint8Array%, "%Uint8Array.prototype%", resultLength) とする。
  6. Assert: ta.[[ViewedArrayBuffer]].[[ArrayBufferByteLength]]result.[[Bytes]] 内の要素数である。
  7. ta.[[ViewedArrayBuffer]].[[ArrayBufferData]] の各インデックスの値を、result.[[Bytes]] の対応するインデックスの値に設定する。
  8. ta を返す。

23.3.2 Uint8Arrayプロトタイプオブジェクトの追加プロパティ

23.3.2.1 Uint8Array.prototype.setFromBase64 ( string [ , options ] )

  1. intothis値とする。
  2. ValidateUint8Array(into) を実行する。
  3. string がStringでない場合、TypeError 例外をスローする。
  4. opts を ? GetOptionsObject(options) とする。
  5. alphabet を ? Get(opts, "alphabet") とする。
  6. alphabetundefined の場合、alphabet"base64" に設定する。
  7. alphabet"base64""base64url" のいずれでもない場合、TypeError 例外をスローする。
  8. lastChunkHandling を ? Get(opts, "lastChunkHandling") とする。
  9. lastChunkHandlingundefined の場合、lastChunkHandling"loose" に設定する。
  10. lastChunkHandling"loose""strict"、または "stop-before-partial" のいずれでもない場合、TypeError 例外をスローする。
  11. taRecordMakeTypedArrayWithBufferWitnessRecord(into, seq-cst) とする。
  12. IsTypedArrayOutOfBounds(taRecord) が true の場合、TypeError 例外をスローする。
  13. byteLengthTypedArrayLength(taRecord) とする。
  14. resultFromBase64(string, alphabet, lastChunkHandling, byteLength) とする。
  15. bytesresult.[[Bytes]] とする。
  16. writtenbytes 内の要素数とする。
  17. NOTE: FromBase64はユーザーコードを起動しないため、into を支えるArrayBufferがデタッチまたは縮小されていることはあり得ない。
  18. Assert: writtenbyteLength
  19. SetUint8ArrayBytes(into, bytes) を実行する。
  20. result.[[Error]]none でない場合、次を行う:
    1. result.[[Error]] をスローする。
  21. resultObjectOrdinaryObjectCreate(%Object.prototype%) とする。
  22. CreateDataPropertyOrThrow(resultObject, "read", 𝔽(result.[[Read]])) を実行する。
  23. CreateDataPropertyOrThrow(resultObject, "written", 𝔽(written)) を実行する。
  24. resultObject を返す。

23.3.2.2 Uint8Array.prototype.setFromHex ( string )

  1. intothis値とする。
  2. ValidateUint8Array(into) を実行する。
  3. string がStringでない場合、TypeError 例外をスローする。
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(into, seq-cst) とする。
  5. IsTypedArrayOutOfBounds(taRecord) が true の場合、TypeError 例外をスローする。
  6. byteLengthTypedArrayLength(taRecord) とする。
  7. resultFromHex(string, byteLength) とする。
  8. bytesresult.[[Bytes]] とする。
  9. writtenbytes 内の要素数とする。
  10. NOTE: FromHexはユーザーコードを起動しないため、into を支えるArrayBufferがデタッチまたは縮小されていることはあり得ない。
  11. Assert: writtenbyteLength
  12. SetUint8ArrayBytes(into, bytes) を実行する。
  13. result.[[Error]]none でない場合、次を行う:
    1. result.[[Error]] をスローする。
  14. resultObjectOrdinaryObjectCreate(%Object.prototype%) とする。
  15. CreateDataPropertyOrThrow(resultObject, "read", 𝔽(result.[[Read]])) を実行する。
  16. CreateDataPropertyOrThrow(resultObject, "written", 𝔽(written)) を実行する。
  17. resultObject を返す。

23.3.2.3 Uint8Array.prototype.toBase64 ( [ options ] )

  1. objthis値とする。
  2. ValidateUint8Array(obj) を実行する。
  3. opts を ? GetOptionsObject(options) とする。
  4. alphabet を ? Get(opts, "alphabet") とする。
  5. alphabetundefined の場合、alphabet"base64" に設定する。
  6. alphabet"base64""base64url" のいずれでもない場合、TypeError 例外をスローする。
  7. omitPaddingToBoolean(? Get(opts, "omitPadding")) とない場合、TypeError 例外をスローする。
  8. omitPaddingToBoolean(? Get(opts, *する。
  9. toEncode を ? GetUint8ArrayBytes(obj) とする。
  10. alphabet"base64" である場合、次を行う:
    1. outAscii を、RFC 4648 のsection 4に指定されるbase64符号化に従って toEncode を符号化した結果として得られるコードポイント列とする。パディングは omitPaddingfalse である場合に限り含まれる。
  11. それ以外の場合、
    1. Assert: alphabet"base64url" である。
    2. outAscii を、RFC 4648 のsection 5に指定されるbase64url符号化に従って toEncode を符号化した結果として得られるコードポイント列とする。パディングは omitPaddingfalse である場合に限り含まれる。
  12. CodePointsToString(outAscii) を返す。

23.3.2.4 Uint8Array.prototype.toHex ( )

  1. objthis値とする。
  2. ValidateUint8Array(obj) を実行する。
  3. toEncode を ? GetUint8ArrayBytes(obj) とする。
  4. out を空のStringとする。
  5. toEncode の各byte byte について、次を行う:
    1. hexNumber::toString(𝔽(byte), 16) とする。
    2. hexStringPad(hex, 2, "0", start) に設定する。
    3. outouthex の文字列連結に設定する。
  6. out を返す。

23.3.3 Uint8Arrayオブジェクトのための抽象操作

23.3.3.1 ValidateUint8Array ( ta )

The abstract operation ValidateUint8Array takes argument ta (ECMAScript言語値) and returns unused を含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. RequireInternalSlot(ta, [[TypedArrayName]]) を実行する。
  2. ta.[[TypedArrayName]]"Uint8Array" でない場合、TypeError 例外をスローする。
  3. unused を返す。

23.3.3.2 GetUint8ArrayBytes ( ta )

The abstract operation GetUint8ArrayBytes takes argument ta (Uint8Array) and returns byte値のListを含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. bufferta.[[ViewedArrayBuffer]] とする。
  2. taRecordMakeTypedArrayWithBufferWitnessRecord(ta, seq-cst) とする。
  3. IsTypedArrayOutOfBounds(taRecord) が true の場合、TypeError 例外をスローする。
  4. lenTypedArrayLength(taRecord) とする。
  5. byteOffsetta.[[ByteOffset]] とする。
  6. bytes を新しい空のListとする。
  7. index を 0 とする。
  8. index < len の間、繰り返す:
    1. byteIndexbyteOffset + index とする。
    2. byte(GetValueFromBuffer(buffer, byteIndex, uint8, true, unordered)) とする。
    3. bytebytes に追加する。
    4. indexindex + 1 に設定する。
  9. bytes を返す。

23.3.3.3 SetUint8ArrayBytes ( into, bytes )

The abstract operation SetUint8ArrayBytes takes arguments into (Uint8Array) and bytes (byte値のList) and returns unused. It performs the following steps when called:

  1. offsetinto.[[ByteOffset]] とする。
  2. lenbytes 内の要素数とする。
  3. index を 0 とする。
  4. index < len の間、繰り返す:
    1. bytebytes[index] とする。
    2. byteIndexInBufferindex + offset とする。
    3. SetValueInBuffer(into.[[ViewedArrayBuffer]], byteIndexInBuffer, uint8, 𝔽(byte), true, unordered) を実行する。
    4. indexindex + 1 に設定する。
  5. unused を返す。

23.3.3.4 SkipAsciiWhitespace ( string, index )

The abstract operation SkipAsciiWhitespace takes arguments string (String) and index (非負整数) and returns 非負整数. It performs the following steps when called:

  1. lengthstring の長さとする。
  2. index < length の間、繰り返す:
    1. charstring 内のインデックス index にあるコード単位とする。
    2. char が 0x0009 (TAB)、0x000A (LF)、0x000C (FF)、0x000D (CR)、または 0x0020 (SPACE) のいずれでもない場合、次を行う:
      1. index を返す。
    3. indexindex + 1 に設定する。
  3. index を返す。

23.3.3.5 DecodeFinalBase64Chunk ( chunk, throwOnExtraBits )

The abstract operation DecodeFinalBase64Chunk takes arguments chunk (長さ2または3のString) and throwOnExtraBits (Boolean) and returns byte値のListを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. chunkLengthchunk の長さとする。
  2. chunkLength = 2 の場合、次を行う:
    1. chunkchunk"AA" の文字列連結に設定する。
  3. それ以外の場合、
    1. Assert: chunkLength は 3 である。
    2. chunkchunk"A" の文字列連結に設定する。
  4. bytesDecodeFullLengthBase64Chunk(chunk) とする。
  5. chunkLength = 2 の場合、次を行う:
    1. throwOnExtraBitstrue かつ bytes[1] ≠ 0 の場合、SyntaxError 例外をスローする。
    2. « bytes[0] » を返す。
  6. throwOnExtraBitstrue かつ bytes[2] ≠ 0 の場合、SyntaxError 例外をスローする。
  7. « bytes[0], bytes[1] » を返す。

23.3.3.6 DecodeFullLengthBase64Chunk ( chunk )

The abstract operation DecodeFullLengthBase64Chunk takes argument chunk (長さ4のString) and returns 長さ3のbyte値のList.

標準base64アルファベット"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" です。すなわち、Unicode Basic Latinブロック内のすべての文字と数字に対応するコード単位、および "+""/" を要素とするStringです。

  1. byteSequence を、chunk をbase64として復号した結果として得られる一意な3バイトの列(すなわち、RFC 4648 のsection 4で指定されるbase64符号化を byteSequence に適用すると chunk が生成されるような列)とする。
  2. byteSequence の要素を順番に要素とするListを返す。

23.3.3.7 FromBase64 ( string, alphabet, lastChunkHandling [ , maxLength ] )

The abstract operation FromBase64 takes arguments string (String), alphabet ("base64" または "base64url"), and lastChunkHandling ("loose""strict"、または "stop-before-partial") and optional argument maxLength (非負整数) and returns フィールド [[Read]](整数)、[[Bytes]](byte値のList)、および [[Error]]SyntaxError オブジェクトまたは none)を持つRecord. It performs the following steps when called:

  1. maxLength が存在しない場合、次を行う:
    1. maxLength を 253 - 1 に設定する。
    2. NOTE: 入力はStringであるため、Stringの長さは253 - 1文字に制限され、出力は入力が持つ文字数を超えるバイトを必要としないので、この制限に到達することは決してない。しかし、有限値を使用することは編集上便利である。
  2. NOTE: 下のアルゴリズムにおける検証と復号の順序は観察可能ではない。実装は、最も効率的な任意の順序でそれらを実行することが推奨され、検証と復号を交互に行ってもよい。
  3. maxLength = 0 の場合、次を行う:
    1. Record { [[Read]]: 0, [[Bytes]]: « », [[Error]]: none } を返す。
  4. read を 0 とする。
  5. bytes を新しい空のListとする。
  6. chunk を空のStringとする。
  7. chunkLength を 0 とする。
  8. index を 0 とする。
  9. lengthstring の長さとする。
  10. 繰り返す:
    1. indexSkipAsciiWhitespace(string, index) に設定する。
    2. index = length の場合、次を行う:
      1. chunkLength > 0 の場合、次を行う:
        1. lastChunkHandling"stop-before-partial" である場合、次を行う:
          1. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: none } を返す。
        2. lastChunkHandling"strict" である場合、次を行う:
          1. error を新しく作成された SyntaxError オブジェクトとする。
          2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error } を返す。
        3. Assert: lastChunkHandling"loose" である。
        4. chunkLength = 1 の場合、次を行う:
          1. error を新しく作成された SyntaxError オブジェクトとする。
          2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error } を返す。
        5. bytesbytes と ! DecodeFinalBase64Chunk(chunk, false) のリスト連結に設定する。
      2. Record { [[Read]]: length, [[Bytes]]: bytes, [[Error]]: none } を返す。
    3. charstringindex から index + 1 までの部分文字列とする。
    4. indexindex + 1 に設定する。
    5. char"=" である場合、次を行う:
      1. chunkLength < 2 の場合、次を行う:
        1. error を新しく作成された SyntaxError オブジェクトとする。
        2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error } を返す。
      2. indexSkipAsciiWhitespace(string, index) に設定する。
      3. chunkLength = 2 の場合、次を行う:
        1. index = length の場合、次を行う:
          1. lastChunkHandling"stop-before-partial" である場合、次を行う:
            1. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: none } を返す。
          2. error を新しく作成された SyntaxError オブジェクトとする。
          3. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error } を返す。
        2. charstringindex から index + 1 までの部分文字列に設定する。
        3. char"=" である場合、次を行う:
          1. indexSkipAsciiWhitespace(string, index + 1) に設定する。
      4. index < length の場合、次を行う:
        1. error を新しく作成された SyntaxError オブジェクトとする。
        2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error } を返す。
      5. lastChunkHandling"strict" である場合、throwOnExtraBitstrue とする。そうでない場合、throwOnExtraBitsfalse とする。
      6. decodeResultCompletion(DecodeFinalBase64Chunk(chunk, throwOnExtraBits)) とする。
      7. decodeResult が急な完了である場合、次を行う:
        1. errordecodeResult.[[Value]] とする。
        2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error } を返す。
      8. bytesbytes と ! decodeResult のリスト連結に設定する。
      9. Record { [[Read]]: length, [[Bytes]]: bytes, [[Error]]: none } を返す。
    6. alphabet"base64url" である場合、次を行う:
      1. char"+" または "/" のいずれかである場合、次を行う:
        1. error を新しく作成された SyntaxError オブジェクトとする。
        2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error } を返す。
      2. そうでなく char"-" である場合、次を行う:
        1. char"+" に設定する。
      3. そうでなく char"_" である場合、次を行う:
        1. char"/" に設定する。
    7. char の唯一のコード単位が標準base64アルファベットの要素でない場合、次を行う:
      1. error を新しく作成された SyntaxError オブジェクトとする。
      2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error } を返す。
    8. remainingmaxLength - bytes 内の要素数とする。
    9. remaining = 1 かつ chunkLength = 2 の場合、または remaining = 2 かつ chunkLength = 3 の場合、次を行う:
      1. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: none } を返す。
    10. chunkchunkchar の文字列連結に設定する。
    11. chunkLengthchunk の長さに設定する。
    12. chunkLength = 4 の場合、次を行う:
      1. bytesbytesDecodeFullLengthBase64Chunk(chunk) のリスト連結に設定する。
      2. chunk を空のStringに設定する。
      3. chunkLength を 0 に設定する。
      4. readindex に設定する。
      5. bytes 内の要素数 = maxLength の場合、次を行う:
        1. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: none } を返す。

23.3.3.8 FromHex ( string [ , maxLength ] )

The abstract operation FromHex takes argument string (String) and optional argument maxLength (非負整数) and returns フィールド [[Read]](整数)、[[Bytes]](byte値のList)、および [[Error]]SyntaxError オブジェクトまたは none)を持つRecord. It performs the following steps when called:

  1. maxLength が存在しない場合、maxLength を 253 - 1 に設定する。
  2. lengthstring の長さとする。
  3. bytes を新しい空のListとする。
  4. read を 0 とする。
  5. length modulo 2 ≠ 0 の場合、次を行う:
    1. error を新しく作成された SyntaxError オブジェクトとする。
    2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error } を返す。
  6. read < length かつ bytes 内の要素数 < maxLength の間、繰り返す:
    1. hexitsstringread から read + 2 までの部分文字列とする。
    2. hexits"0123456789abcdefABCDEF" 内にないコード単位を含む場合、次を行う:
      1. error を新しく作成された SyntaxError オブジェクトとする。
      2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error } を返す。
    3. readread + 2 に設定する。
    4. byte を、値10から15の数字に A から F および a から f の文字を使用する16進表記で hexits によって表される整数値とする。
    5. bytebytes に追加する。
  7. 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 ] )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. map を ? OrdinaryCreateFromConstructor(NewTarget, "%Map.prototype%", « [[MapData]] ») とする。
  3. map.[[MapData]] を新しい空のListに設定する。
  4. iterableundefined または null のいずれかである場合、map を返す。
  5. adder を ? Get(map, "set") とする。
  6. IsCallable(adder) が false の場合、TypeError 例外をスローする。
  7. AddEntriesFromIterable(map, iterable, adder) を返す。
Note

パラメーター iterable が存在する場合、それは、Mapキーとして使用される値を第1要素とし、そのキーに関連付ける値を第2要素とする2要素のarray-like objectを生成するイテレーターオブジェクトを返す %Symbol.iterator% メソッドを実装するオブジェクトであることが期待されます。

24.1.1.2 AddEntriesFromIterable ( target, iterable, adder )

The abstract operation AddEntriesFromIterable takes arguments target (an Object), iterable (an ECMAScript language value, but not undefined or null), and adder (a function object) and returns either a normal completion containing an Object or a throw completion. adder は、target をレシーバーとして起動されます。 It performs the following steps when called:

  1. iteratorRecord を ? GetIterator(iterable, sync) とする。
  2. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone の場合、target を返す。
    3. next がObjectでない場合、次を行う:
      1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
      2. IteratorClose(iteratorRecord, error) を返す。
    4. keyCompletion(Get(next, "0")) とする。
    5. IfAbruptCloseIterator(key, iteratorRecord)。
    6. valueCompletion(Get(next, "1")) とする。
    7. IfAbruptCloseIterator(value, iteratorRecord)。
    8. statusCompletion(Call(adder, target, « key, value »)) とする。
    9. IfAbruptCloseIterator(status, iteratorRecord)。
Note

パラメーター iterable は、Mapキーとして使用される値を第1要素とし、そのキーに関連付ける値を第2要素とする2要素のarray-like objectを生成するイテレーターオブジェクトを返す %Symbol.iterator% メソッドを実装するオブジェクトであることが期待されます。

24.1.2 Mapコンストラクターのプロパティ

Mapコンストラクターは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

24.1.2.1 Map.groupBy ( items, callback )

Note

callback は2つの引数を受け取る関数であるべきです。groupByは、items 内の各要素について昇順に callback を1回ずつ呼び出し、新しいMapを構築します。callback によって返される各値は、Map内のキーとして使用されます。そのような各キーについて、結果のMapは、そのキーをキーとし、そのキーを返した callback のすべての要素を含む配列を値とするエントリーを持ちます。

callback は2つの引数、すなわち要素の値と要素のインデックスで呼び出されます。

groupByの戻り値はMapです。

この関数は呼び出されたとき、次の手順を実行します:

  1. groups を ? GroupBy(items, callback, collection) とする。
  2. map を ! Construct(%Map%) とする。
  3. groups の各Record { [[Key]], [[Elements]] } group について、次を行う:
    1. elementsCreateArrayFromList(group.[[Elements]]) とする。
    2. entryRecord { [[Key]]: group.[[Key]], [[Value]]: elements } とする。
    3. entrymap.[[MapData]] に追加する。
  4. map を返す。

24.1.2.2 Map.prototype

Map.prototypeの初期値はMapプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

24.1.2.3 get Map [ %Symbol.species% ]

Map[%Symbol.species%]は、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. this値を返す。

この関数の"name"プロパティの値は "get [Symbol.species]" です。

Note

派生コレクションオブジェクトを作成するメソッドは、派生オブジェクトを作成するために使用するコンストラクターを決定するため、%Symbol.species% を呼び出すべきです。サブクラスコンストラクターは、既定のコンストラクター割り当てを変更するために %Symbol.species% を上書きできます。

24.1.3 Mapプロトタイプオブジェクトのプロパティ

Mapプロトタイプオブジェクトは以下の通りです:

  • %Map.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[MapData]]内部スロットを持たない。

24.1.3.1 Map.prototype.clear ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty に設定する。
    2. entry.[[Value]]empty に設定する。
  4. undefined を返す。
Note

既存の[[MapData]] Listは保持されます。なぜなら、そのListの反復途中で中断されている既存のMap Iteratorオブジェクトが存在する可能性があるためです。

24.1.3.2 Map.prototype.constructor

Map.prototype.constructorの初期値は %Map% です。

24.1.3.3 Map.prototype.delete ( key )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定する。
  4. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、次を行う:
      1. entry.[[Key]]empty に設定する。
      2. entry.[[Value]]empty に設定する。
      3. true を返す。
  5. false を返す。
Note

empty は、エントリーが削除されたことを示す仕様上の道具として使用されます。実際の実装は、内部データ構造からエントリーを物理的に削除するなど、他の処理を行ってもよいです。

24.1.3.4 Map.prototype.entries ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. CreateMapIterator(map, key+value) を返す。

24.1.3.5 Map.prototype.forEach ( callback [ , thisArg ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  4. entriesmap.[[MapData]] とする。
  5. numEntriesentries 内の要素数とする。
  6. index を 0 とする。
  7. index < numEntries の間、繰り返す:
    1. eentries[index] とする。
    2. indexindex + 1 に設定する。
    3. e.[[Key]]empty でない場合、次を行う:
      1. Call(callback, thisArg, « e.[[Value]], e.[[Key]], map ») を実行する。
      2. NOTE: callback の実行中に entries 内の要素数が増加している可能性がある。
      3. numEntriesentries 内の要素数に設定する。
  8. undefined を返す。
Note

callback は3つの引数を受け取る関数であるべきです。forEachは、Mapに存在する各キー/値ペアについて、キーの挿入順に callback を1回ずつ呼び出します。callback は実際に存在するMapのキーについてのみ呼び出され、Mapから削除されたキーについては呼び出されません。

thisArg パラメーターが提供された場合、それは callback の各呼び出しのthis値として使用されます。提供されない場合、代わりに undefined が使用されます。

callback は3つの引数、すなわち項目の値、項目のキー、および走査されているMapで呼び出されます。

forEachは、それが呼び出されたオブジェクトを直接変更しませんが、callback の呼び出しによってそのオブジェクトが変更される可能性があります。Mapの[[MapData]]の各エントリーは1回だけ訪問されます。forEachの呼び出しが開始された後に追加された新しいキーは訪問されます。キーは、訪問された後に削除され、forEachの呼び出しが完了する前に再び追加された場合、再訪問されます。forEachの呼び出しが開始された後、訪問される前に削除されたキーは、forEachの呼び出しが完了する前にそのキーが再び追加されない限り、訪問されません。

24.1.3.6 Map.prototype.get ( key )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定する。
  4. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、entry.[[Value]] を返す。
  5. undefined を返す。

24.1.3.7 Map.prototype.getOrInsert ( key, value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定する。
  4. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、entry.[[Value]] を返す。
  5. entryRecord { [[Key]]: key, [[Value]]: value } とする。
  6. entrymap.[[MapData]] に追加する。
  7. value を返す。

24.1.3.8 Map.prototype.getOrInsertComputed ( key, callback )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  4. keyCanonicalizeKeyedCollectionKey(key) に設定する。
  5. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、entry.[[Value]] を返す。
  6. value を ? Call(callback, undefined, « key ») とする。
  7. NOTE: callback の実行中にMapが変更されている可能性がある。
  8. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、次を行う:
      1. entry.[[Value]]value に設定する。
      2. value を返す。
  9. entryRecord { [[Key]]: key, [[Value]]: value } とする。
  10. entrymap.[[MapData]] に追加する。
  11. value を返す。

24.1.3.9 Map.prototype.has ( key )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定する。
  4. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、true を返す。
  5. false を返す。

24.1.3.10 Map.prototype.keys ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. CreateMapIterator(map, key) を返す。

24.1.3.11 Map.prototype.set ( key, value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定する。
  4. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、次を行う:
      1. entry.[[Value]]value に設定する。
      2. map を返す。
  5. entryRecord { [[Key]]: key, [[Value]]: value } とする。
  6. entrymap.[[MapData]] に追加する。
  7. map を返す。

24.1.3.12 get Map.prototype.size

Map.prototype.sizeは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. count を 0 とする。
  4. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でない場合、countcount + 1 に設定する。
  5. 𝔽(count) を返す。

24.1.3.13 Map.prototype.values ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. 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プロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。Mapインスタンスは [[MapData]] 内部スロットも持ちます。

24.1.5 Map Iteratorオブジェクト

Map Iteratorは、ある特定のMapインスタンスオブジェクトに対する特定の反復を表すオブジェクトです。Map Iteratorオブジェクトには名前付きコンストラクターはありません。代わりに、Map IteratorオブジェクトはMapインスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。

24.1.5.1 CreateMapIterator ( map, kind )

The abstract operation CreateMapIterator takes arguments map (ECMAScript言語値) and kind (key+valuekey、または value) and returns Generatorを含む正常完了またはスロー完了のいずれか. これは、そのようなイテレーターを返すMapメソッドのためにイテレーターオブジェクトを作成するために使用されます。 It performs the following steps when called:

  1. RequireInternalSlot(map, [[MapData]]) を実行する。
  2. closure を、mapkind を捕捉し、呼び出されたときに次の手順を実行する、パラメーターを持たない新しいAbstract Closureとする:
    1. entriesmap.[[MapData]] とする。
    2. index を 0 とする。
    3. numEntriesentries 内の要素数とする。
    4. index < numEntries の間、繰り返す:
      1. entryentries[index] とする。
      2. indexindex + 1 に設定する。
      3. entry.[[Key]]empty でない場合、次を行う:
        1. kindkey である場合、次を行う:
          1. resultentry.[[Key]] とする。
        2. そうでなく kindvalue である場合、次を行う:
          1. resultentry.[[Value]] とする。
        3. それ以外の場合、
          1. Assert: kindkey+value である。
          2. resultCreateArrayFromListentry.[[Key]], entry.[[Value]] ») とする。
        4. GeneratorYield(CreateIteratorResultObject(result, false)) を実行する。
        5. NOTE: GeneratorYieldによってこの抽象操作の実行が一時停止されている間に、entries 内の要素数が増加している可能性がある。
        6. numEntriesentries 内の要素数に設定する。
    5. NormalCompletion(unused) を返す。
  3. CreateIteratorFromClosure(closure, "%MapIteratorPrototype%", %MapIteratorPrototype%) を返す。

24.1.5.2 %MapIteratorPrototype%オブジェクト

%MapIteratorPrototype%オブジェクトは以下の通りです:

  • すべてのMap Iteratorオブジェクトによって継承されるプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]]内部スロットを持ち、その値は %Iterator.prototype% である。
  • 以下のプロパティを持つ:

24.1.5.2.1 %MapIteratorPrototype%.next ( )

  1. GeneratorResume(this value, empty, "%MapIteratorPrototype%") を返す。

24.1.5.2.2 %MapIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値は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は、Table 71 に列挙されるフィールドを持ちます。

Table 71: Set Record Fields
フィールド名 意味
[[SetObject]] Object Setまたは類似オブジェクト。
[[Size]] 非負整数または +∞ オブジェクトの報告されるサイズ。
[[Has]] 関数オブジェクト オブジェクトのhasメソッド。
[[Keys]] 関数オブジェクト オブジェクトのkeysメソッド。

24.2.1.2 GetSetRecord ( obj )

The abstract operation GetSetRecord takes argument obj (ECMAScript言語値) and returns Set Recordを含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. obj がObjectでない場合、TypeError 例外をスローする。
  2. rawSize を ? Get(obj, "size") とする。
  3. numSize を ? ToNumber(rawSize) とする。
  4. NOTE: rawSizeundefined である場合、numSizeNaN になる。
  5. numSizeNaN の場合、TypeError 例外をスローする。
  6. intSize を ! ToIntegerOrInfinity(numSize) とする。
  7. intSize < 0 の場合、RangeError 例外をスローする。
  8. has を ? Get(obj, "has") とする。
  9. IsCallable(has) が false の場合、TypeError 例外をスローする。
  10. keys を ? Get(obj, "keys") とする。
  11. IsCallable(keys) が false の場合、TypeError 例外をスローする。
  12. 新しいSet Record { [[SetObject]]: obj, [[Size]]: intSize, [[Has]]: has, [[Keys]]: keys } を返す。

24.2.1.3 SetDataHas ( setData, value )

The abstract operation SetDataHas takes arguments setData (ECMAScript言語値または empty のいずれかのList) and value (ECMAScript言語値) and returns Boolean. It performs the following steps when called:

  1. SetDataIndex(setData, value) が not-found である場合、false を返す。
  2. true を返す。

24.2.1.4 SetDataIndex ( setData, value )

The abstract operation SetDataIndex takes arguments setData (ECMAScript言語値または empty のいずれかのList) and value (ECMAScript言語値) and returns 非負整数または not-found. It performs the following steps when called:

  1. valueCanonicalizeKeyedCollectionKey(value) に設定する。
  2. sizesetData 内の要素数とする。
  3. index を 0 とする。
  4. index < size の間、繰り返す:
    1. esetData[index] とする。
    2. eempty でなく、evalue である場合、次を行う:
      1. index を返す。
    3. indexindex + 1 に設定する。
  5. not-found を返す。

24.2.1.5 SetDataSize ( setData )

The abstract operation SetDataSize takes argument setData (ECMAScript言語値または empty のいずれかのList) and returns 非負整数. It performs the following steps when called:

  1. count を 0 とする。
  2. setData の各要素 e について、次を行う:
    1. eempty でない場合、countcount + 1 に設定する。
  3. count を返す。

24.2.2 Setコンストラクター

Setコンストラクターは以下の通りです:

  • %Set%である。
  • グローバルオブジェクト"Set"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいSetオブジェクトを作成して初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローする。
  • クラス定義のextends節の値として使用できる。指定されたSetの動作を継承することを意図するサブクラスコンストラクターは、Set.prototype組み込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するために、Setコンストラクターへのsuper呼び出しを含めなければならない。

24.2.2.1 Set ( [ iterable ] )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. set を ? OrdinaryCreateFromConstructor(NewTarget, "%Set.prototype%", « [[SetData]] ») とする。
  3. set.[[SetData]] を新しい空のListに設定する。
  4. iterableundefined または null のいずれかである場合、set を返す。
  5. adder を ? Get(set, "add") とする。
  6. IsCallable(adder) が false の場合、TypeError 例外をスローする。
  7. iteratorRecord を ? GetIterator(iterable, sync) とする。
  8. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone の場合、set を返す。
    3. statusCompletion(Call(adder, set, « next »)) とする。
    4. IfAbruptCloseIterator(status, iteratorRecord)。

24.2.3 Setコンストラクターのプロパティ

Setコンストラクターは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

24.2.3.1 Set.prototype

Set.prototypeの初期値はSetプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

24.2.3.2 get Set [ %Symbol.species% ]

Set[%Symbol.species%]は、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. this値を返す。

この関数の"name"プロパティの値は "get [Symbol.species]" です。

Note

派生コレクションオブジェクトを作成するメソッドは、派生オブジェクトを作成するために使用するコンストラクターを決定するため、%Symbol.species% を呼び出すべきです。サブクラスコンストラクターは、既定のコンストラクター割り当てを変更するために %Symbol.species% を上書きできます。

24.2.4 Setプロトタイプオブジェクトのプロパティ

Setプロトタイプオブジェクトは以下の通りです:

  • %Set.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[SetData]]内部スロットを持たない。

24.2.4.1 Set.prototype.add ( value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. valueCanonicalizeKeyedCollectionKey(value) に設定する。
  4. set.[[SetData]] の各要素 entry について、次を行う:
    1. entryempty でなく、SameValue(entry, value) が true である場合、次を行う:
      1. set を返す。
  5. valueset.[[SetData]] に追加する。
  6. set を返す。

24.2.4.2 Set.prototype.clear ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. set.[[SetData]] の各要素 entry について、次を行う:
    1. 値が entry である set.[[SetData]] の要素を、値が empty である要素で置き換える。
  4. undefined を返す。
Note

既存の[[SetData]] Listは保持されます。なぜなら、そのListの反復途中で中断されている既存のSet Iteratorオブジェクトが存在する可能性があるためです。

24.2.4.3 Set.prototype.constructor

Set.prototype.constructorの初期値は %Set% です。

24.2.4.4 Set.prototype.delete ( value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. valueCanonicalizeKeyedCollectionKey(value) に設定する。
  4. set.[[SetData]] の各要素 entry について、次を行う:
    1. entryempty でなく、SameValue(entry, value) が true である場合、次を行う:
      1. 値が entry である set.[[SetData]] の要素を、値が empty である要素で置き換える。
      2. true を返す。
  5. false を返す。
Note

empty は、エントリーが削除されたことを示す仕様上の道具として使用されます。実際の実装は、内部データ構造からエントリーを物理的に削除するなど、他の処理を行ってもよいです。

24.2.4.5 Set.prototype.difference ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. resultSetDataset.[[SetData]] のコピーとする。
  5. SetDataSize(set.[[SetData]]) ≤ otherRec.[[Size]] の場合、次を行う:
    1. thisSizeset.[[SetData]] 内の要素数とする。
    2. index を 0 とする。
    3. index < thisSize の間、繰り返す:
      1. entryresultSetData[index] とする。
      2. entryempty でない場合、次を行う:
        1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « entry »)) とする。
        2. inOthertrue である場合、次を行う:
          1. resultSetData[index] を empty に設定する。
      3. indexindex + 1 に設定する。
  6. それ以外の場合、
    1. keysIter を ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]) とする。
    2. nextnot-started とする。
    3. nextdone でない間、繰り返す:
      1. next を ? IteratorStepValue(keysIter) に設定する。
      2. nextdone でない場合、次を行う:
        1. nextCanonicalizeKeyedCollectionKey(next) に設定する。
        2. valueIndexSetDataIndex(resultSetData, next) とする。
        3. valueIndexnot-found でない場合、次を行う:
          1. resultSetData[valueIndex] を empty に設定する。
  7. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») とする。
  8. result.[[SetData]]resultSetData に設定する。
  9. result を返す。

24.2.4.6 Set.prototype.entries ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. CreateSetIterator(set, key+value) を返す。
Note

反復目的では、Setは各エントリーがキーと値に同じ値を持つMapに似て見えます。

24.2.4.7 Set.prototype.forEach ( callback [ , thisArg ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  4. entriesset.[[SetData]] とする。
  5. numEntriesentries 内の要素数とする。
  6. index を 0 とする。
  7. index < numEntries の間、繰り返す:
    1. entryentries[index] とする。
    2. indexindex + 1 に設定する。
    3. entryempty でない場合、次を行う:
      1. Call(callback, thisArg, « entry, entry, set ») を実行する。
      2. NOTE: callback の実行中に entries 内の要素数が増加している可能性がある。
      3. numEntriesentries 内の要素数に設定する。
  8. undefined を返す。
Note

callback は3つの引数を受け取る関数であるべきです。forEachは、Setオブジェクト内に存在する各値について、値の挿入順に callback を1回ずつ呼び出します。callback は実際に存在するSetの値についてのみ呼び出され、setから削除されたキーについては呼び出されません。

thisArg パラメーターが提供された場合、それは callback の各呼び出しのthis値として使用されます。提供されない場合、代わりに undefined が使用されます。

callback は3つの引数で呼び出されます。最初の2つの引数はSetに含まれる値です。同じ値が両方の引数に渡されます。走査されているSetオブジェクトは第3引数として渡されます。

callback が3つの引数で呼び出されるのは、MapおよびArrayのforEachメソッドで使用されるコールバック関数と整合させるためです。Setでは、各項目値はキーでも値でもあるとみなされます。

forEachは、それが呼び出されたオブジェクトを直接変更しませんが、callback の呼び出しによってそのオブジェクトが変更される可能性があります。

各値は通常1回だけ訪問されます。ただし、値は訪問された後に削除され、forEachの呼び出しが完了する前に再び追加された場合、再訪問されます。forEachの呼び出しが開始された後、訪問される前に削除された値は、forEachの呼び出しが完了する前にその値が再び追加されない限り、訪問されません。forEachの呼び出しが開始された後に追加された新しい値は訪問されます。

24.2.4.8 Set.prototype.has ( value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. valueCanonicalizeKeyedCollectionKey(value) に設定する。
  4. set.[[SetData]] の各要素 entry について、次を行う:
    1. entryempty でなく、SameValue(entry, value) が true である場合、true を返す。
  5. false を返す。

24.2.4.9 Set.prototype.intersection ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. resultSetData を新しい空のListとする。
  5. SetDataSize(set.[[SetData]]) ≤ otherRec.[[Size]] の場合、次を行う:
    1. thisSizeset.[[SetData]] 内の要素数とする。
    2. index を 0 とする。
    3. index < thisSize の間、繰り返す:
      1. entryset.[[SetData]][index] とする。
      2. indexindex + 1 に設定する。
      3. entryempty でない場合、次を行う:
        1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « entry »)) とする。
        2. inOthertrue である場合、次を行う:
          1. NOTE: otherRec.[[Has]] への以前の呼び出しが set.[[SetData]] の要素を削除して再追加する可能性があり、それによりこの反復中に同じ要素が2回訪問されることがある。
          2. SetDataHas(resultSetData, entry) が false である場合、次を行う:
            1. entryresultSetData に追加する。
        3. NOTE: otherRec.[[Has]] の実行中に set.[[SetData]] 内の要素数が増加している可能性がある。
        4. thisSizeset.[[SetData]] 内の要素数に設定する。
  6. それ以外の場合、
    1. keysIter を ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]) とする。
    2. nextnot-started とする。
    3. nextdone でない間、繰り返す:
      1. next を ? IteratorStepValue(keysIter) に設定する。
      2. nextdone でない場合、次を行う:
        1. nextCanonicalizeKeyedCollectionKey(next) に設定する。
        2. inThisSetDataHas(set.[[SetData]], next) とする。
        3. inThistrue である場合、次を行う:
          1. NOTE: other は任意のオブジェクトであるため、その"keys"イテレーターが同じ値を複数回生成する可能性がある。
          2. SetDataHas(resultSetData, next) が false である場合、次を行う:
            1. nextresultSetData に追加する。
  7. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») とする。
  8. result.[[SetData]]resultSetData に設定する。
  9. result を返す。

24.2.4.10 Set.prototype.isDisjointFrom ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. SetDataSize(set.[[SetData]]) ≤ otherRec.[[Size]] の場合、次を行う:
    1. thisSizeset.[[SetData]] 内の要素数とする。
    2. index を 0 とする。
    3. index < thisSize の間、繰り返す:
      1. entryset.[[SetData]][index] とする。
      2. indexindex + 1 に設定する。
      3. entryempty でない場合、次を行う:
        1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « entry »)) とする。
        2. inOthertrue である場合、false を返す。
        3. NOTE: otherRec.[[Has]] の実行中に set.[[SetData]] 内の要素数が増加している可能性がある。
        4. thisSizeset.[[SetData]] 内の要素数に設定する。
  5. それ以外の場合、
    1. keysIter を ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]) とする。
    2. nextnot-started とする。
    3. nextdone でない間、繰り返す:
      1. next を ? IteratorStepValue(keysIter) に設定する。
      2. nextdone でない場合、次を行う:
        1. SetDataHas(set.[[SetData]], next) が true である場合、次を行う:
          1. IteratorClose(keysIter, NormalCompletion(unused)) を実行する。
          2. false を返す。
  6. true を返す。

24.2.4.11 Set.prototype.isSubsetOf ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. SetDataSize(set.[[SetData]]) > otherRec.[[Size]] の場合、false を返す。
  5. thisSizeset.[[SetData]] 内の要素数とする。
  6. index を 0 とする。
  7. index < thisSize の間、繰り返す:
    1. entryset.[[SetData]][index] とする。
    2. indexindex + 1 に設定する。
    3. entryempty でない場合、次を行う:
      1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « entry »)) とする。
      2. inOtherfalse である場合、false を返す。
      3. NOTE: otherRec.[[Has]] の実行中に set.[[SetData]] 内の要素数が増加している可能性がある。
      4. thisSizeset.[[SetData]] 内の要素数に設定する。
  8. true を返す。

24.2.4.12 Set.prototype.isSupersetOf ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. SetDataSize(set.[[SetData]]) < otherRec.[[Size]] の場合、false を返す。
  5. keysIter を ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]) とする。
  6. nextnot-started とする。
  7. nextdone でない間、繰り返す:
    1. next を ? IteratorStepValue(keysIter) に設定する。
    2. nextdone でない場合、次を行う:
      1. SetDataHas(set.[[SetData]], next) が false である場合、次を行う:
        1. IteratorClose(keysIter, NormalCompletion(unused)) を実行する。
        2. false を返す。
  8. true を返す。

24.2.4.13 Set.prototype.keys ( )

"keys"プロパティの初期値は、24.2.4.17 で定義される %Set.prototype.values% です。

Note

反復目的では、Setは各エントリーがキーと値に同じ値を持つMapに似て見えます。

24.2.4.14 get Set.prototype.size

Set.prototype.sizeは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. sizeSetDataSize(set.[[SetData]]) とする。
  4. 𝔽(size) を返す。

24.2.4.15 Set.prototype.symmetricDifference ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. keysIter を ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]) とする。
  5. resultSetDataset.[[SetData]] のコピーとする。
  6. nextnot-started とする。
  7. nextdone でない間、繰り返す:
    1. next を ? IteratorStepValue(keysIter) に設定する。
    2. nextdone でない場合、次を行う:
      1. nextCanonicalizeKeyedCollectionKey(next) に設定する。
      2. resultIndexSetDataIndex(resultSetData, next) とする。
      3. resultIndexnot-found である場合、alreadyInResultfalse とする。そうでない場合、alreadyInResulttrue とする。
      4. SetDataHas(set.[[SetData]], next) が true である場合、次を行う:
        1. alreadyInResulttrue である場合、resultSetData[resultIndex] を empty に設定する。
      5. それ以外の場合、
        1. alreadyInResultfalse である場合、nextresultSetData に追加する。
  8. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») とする。
  9. result.[[SetData]]resultSetData に設定する。
  10. result を返す。

24.2.4.16 Set.prototype.union ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. keysIter を ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]) とする。
  5. resultSetDataset.[[SetData]] のコピーとする。
  6. nextnot-started とする。
  7. nextdone でない間、繰り返す:
    1. next を ? IteratorStepValue(keysIter) に設定する。
    2. nextdone でない場合、次を行う:
      1. nextCanonicalizeKeyedCollectionKey(next) に設定する。
      2. SetDataHas(resultSetData, next) が false である場合、次を行う:
        1. nextresultSetData に追加する。
  8. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») とする。
  9. result.[[SetData]]resultSetData に設定する。
  10. result を返す。

24.2.4.17 Set.prototype.values ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. 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プロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。Setインスタンスは [[SetData]] 内部スロットも持ちます。

24.2.6 Set Iteratorオブジェクト

Set Iteratorは、下記で定義される構造を持つ通常のオブジェクトであり、ある特定のSetインスタンスオブジェクトに対する特定の反復を表します。Set Iteratorオブジェクトには名前付きコンストラクターはありません。代わりに、Set IteratorオブジェクトはSetインスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。

24.2.6.1 CreateSetIterator ( set, kind )

The abstract operation CreateSetIterator takes arguments set (ECMAScript言語値) and kind (key+value または value) and returns Generatorを含む正常完了またはスロー完了のいずれか. これは、そのようなイテレーターを返すSetメソッドのためにイテレーターオブジェクトを作成するために使用されます。 It performs the following steps when called:

  1. RequireInternalSlot(set, [[SetData]]) を実行する。
  2. closure を、setkind を捕捉し、呼び出されたときに次の手順を実行する、パラメーターを持たない新しいAbstract Closureとする:
    1. index を 0 とする。
    2. entriesset.[[SetData]] とする。
    3. numEntriesentries 内の要素数とする。
    4. index < numEntries の間、繰り返す:
      1. entryentries[index] とする。
      2. indexindex + 1 に設定する。
      3. entryempty でない場合、次を行う:
        1. kindkey+value である場合、次を行う:
          1. resultCreateArrayFromListentry, entry ») とする。
          2. GeneratorYield(CreateIteratorResultObject(result, false)) を実行する。
        2. それ以外の場合、
          1. Assert: kindvalue である。
          2. GeneratorYield(CreateIteratorResultObject(entry, false)) を実行する。
        3. NOTE: GeneratorYieldによってこの抽象操作の実行が一時停止されている間に、entries 内の要素数が増加している可能性がある。
        4. numEntriesentries 内の要素数に設定する。
    5. NormalCompletion(unused) を返す。
  3. CreateIteratorFromClosure(closure, "%SetIteratorPrototype%", %SetIteratorPrototype%) を返す。

24.2.6.2 %SetIteratorPrototype%オブジェクト

%SetIteratorPrototype%オブジェクトは以下の通りです:

  • すべてのSet Iteratorオブジェクトによって継承されるプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]]内部スロットを持ち、その値は %Iterator.prototype% である。
  • 以下のプロパティを持つ:

24.2.6.2.1 %SetIteratorPrototype%.next ( )

  1. GeneratorResume(this value, empty, "%SetIteratorPrototype%") を返す。

24.2.6.2.2 %SetIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値はString値 "Set Iterator" です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } です。

24.3 WeakMapオブジェクト

WeakMapは、キーがオブジェクトおよび/またはシンボルであり、値が任意のECMAScript言語値であってよいキー/値ペアのコレクションです。WeakMapは、特定のキーを持つキー/値ペアを含むかどうかを問い合わせることができますが、それがキーとして保持する値を列挙する機構は提供されません。特定の条件では、liveでない値は、9.9.3 に記述されるように、WeakMapキーとして削除されます。

実装は、WeakMapのキー/値ペアがアクセス不能になった時点から、そのキー/値ペアがWeakMapから削除される時点までの間に、任意に決定された遅延を課してもよいです。この遅延がECMAScriptプログラムから観察可能であった場合、それはプログラム実行に影響し得る不確定性の源となります。そのため、ECMAScript実装は、観察者が観察対象のキーを提示することを要求しない方法でWeakMapのキーを観察する手段を提供してはなりません。

WeakMapは、平均してコレクション内のキー/値ペア数に対してサブリニアなアクセス時間を提供するハッシュテーブルまたはその他の機構を使用して実装されなければなりません。この仕様で使用されるデータ構造は、WeakMapに要求される観察可能な意味論を記述することのみを意図しています。実行可能な実装モデルであることは意図していません。

Note

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 ] )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. map を ? OrdinaryCreateFromConstructor(NewTarget, "%WeakMap.prototype%", « [[WeakMapData]] ») とする。
  3. map.[[WeakMapData]] を新しい空のListに設定する。
  4. iterableundefined または null のいずれかである場合、map を返す。
  5. adder を ? Get(map, "set") とする。
  6. IsCallable(adder) が false の場合、TypeError 例外をスローする。
  7. AddEntriesFromIterable(map, iterable, adder) を返す。
Note

パラメーター iterable が存在する場合、それは、WeakMapキーとして使用される値を第1要素とし、そのキーに関連付ける値を第2要素とする2要素のarray-like objectを生成するイテレーターオブジェクトを返す %Symbol.iterator% メソッドを実装するオブジェクトであることが期待されます。

24.3.2 WeakMapコンストラクターのプロパティ

WeakMapコンストラクターは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

24.3.2.1 WeakMap.prototype

WeakMap.prototypeの初期値はWeakMapプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

24.3.3 WeakMapプロトタイプオブジェクトのプロパティ

WeakMapプロトタイプオブジェクトは以下の通りです:

  • %WeakMap.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[WeakMapData]]内部スロットを持たない。

24.3.3.1 WeakMap.prototype.constructor

WeakMap.prototype.constructorの初期値は %WeakMap% です。

24.3.3.2 WeakMap.prototype.delete ( key )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakMapthis値とする。
  2. RequireInternalSlot(weakMap, [[WeakMapData]]) を実行する。
  3. CanBeHeldWeakly(key) が false の場合、false を返す。
  4. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、次を行う:
      1. entry.[[Key]]empty に設定する。
      2. entry.[[Value]]empty に設定する。
      3. true を返す。
  5. false を返す。
Note

empty は、エントリーが削除されたことを示す仕様上の道具として使用されます。実際の実装は、内部データ構造からエントリーを物理的に削除するなど、他の処理を行ってもよいです。

24.3.3.3 WeakMap.prototype.get ( key )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakMapthis値とする。
  2. RequireInternalSlot(weakMap, [[WeakMapData]]) を実行する。
  3. CanBeHeldWeakly(key) が false の場合、undefined を返す。
  4. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、entry.[[Value]] を返す。
  5. undefined を返す。

24.3.3.4 WeakMap.prototype.getOrInsert ( key, value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakMapthis値とする。
  2. RequireInternalSlot(weakMap, [[WeakMapData]]) を実行する。
  3. CanBeHeldWeakly(key) が false の場合、TypeError 例外をスローする。
  4. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、entry.[[Value]] を返す。
  5. entryRecord { [[Key]]: key, [[Value]]: value } とする。
  6. entryweakMap.[[WeakMapData]] に追加する。
  7. value を返す。

24.3.3.5 WeakMap.prototype.getOrInsertComputed ( key, callback )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakMapthis値とする。
  2. RequireInternalSlot(weakMap, [[WeakMapData]]) を実行する。
  3. CanBeHeldWeakly(key) が false の場合、TypeError 例外をスローする。
  4. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  5. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、entry.[[Value]] を返す。
  6. value を ? Call(callback, undefined, « key ») とする。
  7. NOTE: callback の実行中にWeakMapが変更されている可能性がある。
  8. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、次を行う:
      1. entry.[[Value]]value に設定する。
      2. value を返す。
  9. entryRecord { [[Key]]: key, [[Value]]: value } とする。
  10. entryweakMap.[[WeakMapData]] に追加する。
  11. value を返す。

24.3.3.6 WeakMap.prototype.has ( key )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakMapthis値とする。
  2. RequireInternalSlot(weakMap, [[WeakMapData]]) を実行する。
  3. CanBeHeldWeakly(key) が false の場合、false を返す。
  4. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、true を返す。
  5. false を返す。

24.3.3.7 WeakMap.prototype.set ( key, value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakMapthis値とする。
  2. RequireInternalSlot(weakMap, [[WeakMapData]]) を実行する。
  3. CanBeHeldWeakly(key) が false の場合、TypeError 例外をスローする。
  4. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、次を行う:
      1. entry.[[Value]]value に設定する。
      2. weakMap を返す。
  5. entryRecord { [[Key]]: key, [[Value]]: value } とする。
  6. entryweakMap.[[WeakMapData]] に追加する。
  7. 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プロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。WeakMapインスタンスは [[WeakMapData]] 内部スロットも持ちます。

24.4 WeakSetオブジェクト

WeakSetはオブジェクトおよび/またはシンボルのコレクションです。異なるオブジェクトまたはシンボルは、WeakSetのコレクションの要素として一度だけ出現できます。WeakSetは、特定の値を含むかどうかを問い合わせることができますが、それが保持する値を列挙する機構は提供されません。特定の条件では、liveでない値は、9.9.3 に記述されるように、WeakSet要素として削除されます。

実装は、WeakSetに含まれる値がアクセス不能になった時点から、その値がWeakSetから削除される時点までの間に、任意に決定された遅延を課してもよいです。この遅延がECMAScriptプログラムから観察可能であった場合、それはプログラム実行に影響し得る不確定性の源となります。そのため、ECMAScript実装は、観察者が観察対象の値を提示することを要求しない方法で、WeakSetが特定の値を含むかどうかを判定する手段を提供してはなりません。

WeakSetは、平均してコレクション内の要素数に対してサブリニアなアクセス時間を提供するハッシュテーブルまたはその他の機構を使用して実装されなければなりません。この仕様で使用されるデータ構造は、WeakSetに要求される観察可能な意味論を記述することのみを意図しています。実行可能な実装モデルであることは意図していません。

Note

24.3NOTEを参照してください。

24.4.1 WeakSetコンストラクター

WeakSetコンストラクターは以下の通りです:

  • %WeakSet%である。
  • グローバルオブジェクト"WeakSet"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいWeakSetを作成して初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローする。
  • クラス定義のextends節の値として使用できる。指定されたWeakSetの動作を継承することを意図するサブクラスコンストラクターは、WeakSet.prototype組み込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するために、WeakSetコンストラクターへのsuper呼び出しを含めなければならない。

24.4.1.1 WeakSet ( [ iterable ] )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. set を ? OrdinaryCreateFromConstructor(NewTarget, "%WeakSet.prototype%", « [[WeakSetData]] ») とする。
  3. set.[[WeakSetData]] を新しい空のListに設定する。
  4. iterableundefined または null のいずれかである場合、set を返す。
  5. adder を ? Get(set, "add") とする。
  6. IsCallable(adder) が false の場合、TypeError 例外をスローする。
  7. iteratorRecord を ? GetIterator(iterable, sync) とする。
  8. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone の場合、set を返す。
    3. statusCompletion(Call(adder, set, « next »)) とする。
    4. IfAbruptCloseIterator(status, iteratorRecord)。

24.4.2 WeakSetコンストラクターのプロパティ

WeakSetコンストラクターは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

24.4.2.1 WeakSet.prototype

WeakSet.prototypeの初期値はWeakSetプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

24.4.3 WeakSetプロトタイプオブジェクトのプロパティ

WeakSetプロトタイプオブジェクトは以下の通りです:

  • %WeakSet.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[WeakSetData]]内部スロットを持たない。

24.4.3.1 WeakSet.prototype.add ( value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakSetthis値とする。
  2. RequireInternalSlot(weakSet, [[WeakSetData]]) を実行する。
  3. CanBeHeldWeakly(value) が false の場合、TypeError 例外をスローする。
  4. weakSet.[[WeakSetData]] の各要素 entry について、次を行う:
    1. entryempty でなく、SameValue(entry, value) が true である場合、次を行う:
      1. weakSet を返す。
  5. valueweakSet.[[WeakSetData]] に追加する。
  6. weakSet を返す。

24.4.3.2 WeakSet.prototype.constructor

WeakSet.prototype.constructorの初期値は %WeakSet% です。

24.4.3.3 WeakSet.prototype.delete ( value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakSetthis値とする。
  2. RequireInternalSlot(weakSet, [[WeakSetData]]) を実行する。
  3. CanBeHeldWeakly(value) が false の場合、false を返す。
  4. weakSet.[[WeakSetData]] の各要素 entry について、次を行う:
    1. entryempty でなく、SameValue(entry, value) が true である場合、次を行う:
      1. 値が entry である weakSet.[[WeakSetData]] の要素を、値が empty である要素で置き換える。
      2. true を返す。
  5. false を返す。
Note

empty は、エントリーが削除されたことを示す仕様上の道具として使用されます。実際の実装は、内部データ構造からエントリーを物理的に削除するなど、他の処理を行ってもよいです。

24.4.3.4 WeakSet.prototype.has ( value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakSetthis値とする。
  2. RequireInternalSlot(weakSet, [[WeakSetData]]) を実行する。
  3. CanBeHeldWeakly(value) が false の場合、false を返す。
  4. weakSet.[[WeakSetData]] の各要素 entry について、次を行う:
    1. entryempty でなく、SameValue(entry, value) が true である場合、true を返す。
  5. 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プロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。WeakSetインスタンスは [[WeakSetData]] 内部スロットも持ちます。

24.5 キー付きコレクションのための抽象操作

24.5.1 CanonicalizeKeyedCollectionKey ( key )

The abstract operation CanonicalizeKeyedCollectionKey takes argument key (ECMAScript言語値) and returns ECMAScript言語値. It performs the following steps when called:

  1. key-0𝔽 の場合、+0𝔽 を返す。
  2. key を返す。

25 構造化データ

25.1 ArrayBufferオブジェクト

25.1.1 表記

この節、25.4、および 29 の以下の記述では、read-modify-write変更関数の内部データ構造を使用します。

read-modify-write変更関数とは、2つのバイト値のListを引数として受け取り、バイト値のListを返すAbstract Closureとして表される数学的関数です。これらのAbstract Closureは、次のすべての性質を満たします:

  • すべてのアルゴリズム手順を原子的に実行する。
  • 個々のアルゴリズム手順は観察可能でない。
Note

read-modify-write変更関数のアルゴリズム手順が純粋な数学的関数を構成することの検証を助けるため、次の編集上の慣例が推奨されます:

  • パラメーターおよび捕捉された値を除き、直接にも、呼び出された抽象操作およびAbstract Closureを介して推移的にも、いかなる言語値または仕様値にもアクセスしない。
  • Completion Recordを返す抽象操作およびAbstract Closureを、直接にも推移的にも呼び出さない。
  • Completion Recordを返さない。

25.1.2 固定長およびサイズ変更可能なArrayBufferオブジェクト

固定長ArrayBufferとは、作成後にバイト長を変更できないArrayBufferです。

サイズ変更可能なArrayBufferとは、作成後に ArrayBuffer.prototype.resize ( newLength ) を呼び出すことによってバイト長を変更できるArrayBufferです。

作成されるArrayBufferオブジェクトの種類は、ArrayBuffer ( length [ , options ] ) に渡される引数に依存します。

25.1.3 ArrayBufferオブジェクトのための抽象操作

25.1.3.1 AllocateArrayBuffer ( constructor, byteLength [ , maxByteLength ] )

The abstract operation AllocateArrayBuffer takes arguments constructor (コンストラクター) and byteLength (非負整数) and optional argument maxByteLength (非負整数または empty) and returns ArrayBufferを含む正常完了またはスロー完了のいずれか. ArrayBufferを作成するために使用されます。 It performs the following steps when called:

  1. Let slots be « [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] ».
  2. If maxByteLength is present and maxByteLength is not empty, let allocatingResizableBuffer be true; else let allocatingResizableBuffer be false.
  3. If allocatingResizableBuffer is true, then
    1. If byteLength > maxByteLength, throw a RangeError exception.
    2. Append [[ArrayBufferMaxByteLength]] to slots.
  4. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%ArrayBuffer.prototype%", slots).
  5. Let block be ? CreateByteDataBlock(byteLength).
  6. Set obj.[[ArrayBufferData]] to block.
  7. Set obj.[[ArrayBufferByteLength]] to byteLength.
  8. If allocatingResizableBuffer is true, then
    1. If it is not possible to create a Data Block block consisting of maxByteLength bytes, throw a RangeError exception.
    2. NOTE: Resizable ArrayBuffers are designed to be implementable with in-place growth. Implementations may throw if, for example, virtual memory cannot be reserved up front.
    3. Set obj.[[ArrayBufferMaxByteLength]] to maxByteLength.
  9. Return obj.

25.1.3.2 ArrayBufferByteLength ( arrayBuffer, order )

The abstract operation ArrayBufferByteLength takes arguments arrayBuffer (ArrayBufferまたはSharedArrayBuffer) and order (seq-cst または unordered) and returns 非負整数. It performs the following steps when called:

  1. IsGrowableSharedArrayBuffer(arrayBuffer) が true の場合、
    1. bufferByteLengthBlockarrayBuffer.[[ArrayBufferByteLengthData]] とする。
    2. rawLengthGetRawBytesFromSharedBlock(bufferByteLengthBlock, 0, biguint64, true, order) とする。
    3. agentRecord を周囲のエージェントのAgent Recordとする。
    4. isLittleEndianagentRecord.[[LittleEndian]] とする。
    5. (RawBytesToNumeric(biguint64, rawLength, isLittleEndian)) を返す。
  2. Assert: IsDetachedBuffer(arrayBuffer) は false である。
  3. arrayBuffer.[[ArrayBufferByteLength]] を返す。

25.1.3.3 ArrayBufferCopyAndDetach ( arrayBuffer, newLength, preserveResizability )

The abstract operation ArrayBufferCopyAndDetach takes arguments arrayBuffer (ECMAScript言語値), newLength (ECMAScript言語値), and preserveResizability (preserve-resizability または fixed-length) and returns ArrayBufferを含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. RequireInternalSlot(arrayBuffer, [[ArrayBufferData]]) を実行する。
  2. IsSharedArrayBuffer(arrayBuffer) が true の場合、TypeError 例外をスローする。
  3. newLengthundefined の場合、
    1. newByteLengtharrayBuffer.[[ArrayBufferByteLength]] とする。
  4. そうでなければ、
    1. newByteLength を ? ToIndex(newLength) とする。
  5. IsDetachedBuffer(arrayBuffer) が true の場合、TypeError 例外をスローする。
  6. preserveResizabilitypreserve-resizability であり、IsFixedLengthArrayBuffer(arrayBuffer) が false である場合、
    1. newMaxByteLengtharrayBuffer.[[ArrayBufferMaxByteLength]] とする。
  7. そうでなければ、
    1. newMaxByteLengthempty とする。
  8. arrayBuffer.[[ArrayBufferDetachKey]]undefined でない場合、TypeError 例外をスローする。
  9. newBuffer を ? AllocateArrayBuffer(%ArrayBuffer%, newByteLength, newMaxByteLength) とする。
  10. copyLengthmin(newByteLength, arrayBuffer.[[ArrayBufferByteLength]]) とする。
  11. fromBlockarrayBuffer.[[ArrayBufferData]] とする。
  12. toBlocknewBuffer.[[ArrayBufferData]] とする。
  13. CopyDataBlockBytes(toBlock, 0, fromBlock, 0, copyLength) を実行する。
  14. NOTE: 新しいData Blockの作成も古いData Blockからのコピーも観察可能ではありません。実装はこのメソッドをゼロコピー移動またはreallocとして実装してもよいです。
  15. DetachArrayBuffer(arrayBuffer) を実行する。
  16. newBuffer を返す。

25.1.3.4 IsDetachedBuffer ( arrayBuffer )

The abstract operation IsDetachedBuffer takes argument arrayBuffer (ArrayBufferまたはSharedArrayBuffer) and returns Boolean. It performs the following steps when called:

  1. arrayBuffer.[[ArrayBufferData]]null の場合、true を返す。
  2. false を返す。

25.1.3.5 DetachArrayBuffer ( arrayBuffer [ , key ] )

The abstract operation DetachArrayBuffer takes argument arrayBuffer (ArrayBuffer) and optional argument key (任意) and returns unused を含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. Assert: IsSharedArrayBuffer(arrayBuffer) は false である。
  2. key が存在しない場合、keyundefined に設定する。
  3. arrayBuffer.[[ArrayBufferDetachKey]]key でない場合、TypeError 例外をスローする。
  4. arrayBuffer.[[ArrayBufferData]]null に設定する。
  5. arrayBuffer.[[ArrayBufferByteLength]] を0に設定する。
  6. unused を返す。
Note

ArrayBufferインスタンスをデタッチすると、そのバッキングストアとして使用されるData Blockがそのインスタンスから切り離され、バッファーのバイト長が0に設定されます。

25.1.3.6 CloneArrayBuffer ( srcBuffer, srcByteOffset, srcLength )

The abstract operation CloneArrayBuffer takes arguments srcBuffer (ArrayBufferまたはSharedArrayBuffer), srcByteOffset (非負整数), and srcLength (非負整数) and returns ArrayBufferを含む正常完了またはスロー完了のいずれか. srcByteOffset から始まり srcLength バイト続く範囲にわたる srcBuffer のデータのコピーをデータとして持つ、新しいArrayBufferを作成します。 It performs the following steps when called:

  1. Assert: IsDetachedBuffer(srcBuffer) は false である。
  2. targetBuffer を ? AllocateArrayBuffer(%ArrayBuffer%, srcLength) とする。
  3. srcBlocksrcBuffer.[[ArrayBufferData]] とする。
  4. targetBlocktargetBuffer.[[ArrayBufferData]] とする。
  5. CopyDataBlockBytes(targetBlock, 0, srcBlock, srcByteOffset, srcLength) を実行する。
  6. targetBuffer を返す。

25.1.3.7 GetArrayBufferMaxByteLengthOption ( options )

The abstract operation GetArrayBufferMaxByteLengthOption takes argument options (ECMAScript言語値) and returns 非負整数または empty のいずれかを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. options がObjectでない場合、empty を返す。
  2. maxByteLength を ? Get(options, "maxByteLength") とする。
  3. maxByteLengthundefined の場合、empty を返す。
  4. ToIndex(maxByteLength) を返す。

25.1.3.8 HostResizeArrayBuffer ( buffer, newByteLength )

The host-defined abstract operation HostResizeArrayBuffer takes arguments buffer (ArrayBuffer) and newByteLength (非負整数) and returns handled または unhandled のいずれかを含む正常完了、またはスロー完了のいずれか. ホストに buffer の実装定義のサイズ変更を実行する機会を与えます。ホストが buffer のサイズ変更を処理しないことを選択した場合、既定の動作として unhandled を返してもよいです。

HostResizeArrayBufferの実装は、次の要件に適合しなければなりません:

  • この抽象操作は buffer をデタッチしない。
  • この抽象操作が handled で正常完了する場合、buffer.[[ArrayBufferByteLength]]newByteLength である。

HostResizeArrayBufferの既定の実装は NormalCompletion(unhandled) を返すことです。

25.1.3.9 IsFixedLengthArrayBuffer ( arrayBuffer )

The abstract operation IsFixedLengthArrayBuffer takes argument arrayBuffer (ArrayBufferまたはSharedArrayBuffer) and returns Boolean. It performs the following steps when called:

  1. arrayBuffer[[ArrayBufferMaxByteLength]] 内部スロットを持つ場合、false を返す。
  2. true を返す。

25.1.3.10 IsUnsignedElementType ( type )

The abstract operation IsUnsignedElementType takes argument type (TypedArray要素型) and returns Boolean. 引数 type が符号なしTypedArray要素型であるかを検証します。 It performs the following steps when called:

  1. typeuint8uint8clampeduint16uint32、または biguint64 のいずれかである場合、true を返す。
  2. false を返す。

25.1.3.11 IsUnclampedIntegerElementType ( type )

The abstract operation IsUnclampedIntegerElementType takes argument type (TypedArray要素型) and returns Boolean. 引数 typeuint8clamped を含まないInteger TypedArray要素型であるかを検証します。 It performs the following steps when called:

  1. typeint8uint8int16uint16int32、または uint32 のいずれかである場合、true を返す。
  2. false を返す。

25.1.3.12 IsBigIntElementType ( type )

The abstract operation IsBigIntElementType takes argument type (TypedArray要素型) and returns Boolean. 引数 type がBigInt TypedArray要素型であるかを検証します。 It performs the following steps when called:

  1. typebiguint64 または bigint64 のいずれかである場合、true を返す。
  2. false を返す。

25.1.3.13 IsNoTearConfiguration ( type, order )

The abstract operation IsNoTearConfiguration takes arguments type (TypedArray要素型) and order (seq-cstunordered、または init) and returns Boolean. It performs the following steps when called:

  1. IsUnclampedIntegerElementType(type) が true の場合、true を返す。
  2. IsBigIntElementType(type) が true であり、orderinit でも unordered でもない場合、true を返す。
  3. false を返す。

25.1.3.14 RawBytesToNumeric ( type, rawBytes, isLittleEndian )

The abstract operation RawBytesToNumeric takes arguments type (TypedArray要素型), rawBytes (バイト値のList), and isLittleEndian (Boolean) and returns NumberまたはBigInt. It performs the following steps when called:

  1. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  2. isLittleEndianfalse の場合、rawBytes の要素の順序を反転する。
  3. typefloat16 の場合、
    1. value を、rawBytes のバイト要素を連結し、IEEE 754-2019 binary16値のリトルエンディアンビット文字列エンコーディングとして解釈したものとする。
    2. value がNaNである場合、NaN を返す。
    3. value に対応するNumber値を返す。
  4. typefloat32 の場合、
    1. value を、rawBytes のバイト要素を連結し、IEEE 754-2019 binary32値のリトルエンディアンビット文字列エンコーディングとして解釈したものとする。
    2. value がNaNである場合、NaN を返す。
    3. value に対応するNumber値を返す。
  5. typefloat64 の場合、
    1. value を、rawBytes のバイト要素を連結し、IEEE 754-2019 binary64値のリトルエンディアンビット文字列エンコーディングとして解釈したものとする。
    2. value がNaNである場合、NaN を返す。
    3. value に対応するNumber値を返す。
  6. IsUnsignedElementType(type) が true の場合、
    1. intValue を、rawBytes のバイト要素を連結し、符号なしリトルエンディアン2進数のビット文字列エンコーディングとして解釈したものとする。
  7. そうでなければ、
    1. intValue を、rawBytes のバイト要素を連結し、ビット長 elementSize × 8 の2進リトルエンディアン2の補数のビット文字列エンコーディングとして解釈したものとする。
  8. IsBigIntElementType(type) が true の場合、intValue に対応するBigInt値を返す。
  9. intValue に対応するNumber値を返す。

25.1.3.15 GetRawBytesFromSharedBlock ( block, byteIndex, type, isTypedArray, order )

The abstract operation GetRawBytesFromSharedBlock takes arguments block (Shared Data Block), byteIndex (非負整数), type (TypedArray要素型), isTypedArray (Boolean), and order (seq-cst または unordered) and returns バイト値のList. It performs the following steps when called:

  1. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  2. agentRecord を周囲のエージェントのAgent Recordとする。
  3. executionagentRecord.[[CandidateExecution]] とする。
  4. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() であるAgent Events Recordとする。
  5. isTypedArraytrue であり、IsNoTearConfiguration(type, order) が true である場合、noTeartrue とする。そうでなければ、noTearfalse とする。
  6. rawValue を、要素が非決定的に選択されたバイト値である、長さ elementSizeListとする。
  7. NOTE: 実装では、rawValue は基盤ハードウェア上の非原子的または原子的な読み取り命令の結果です。この非決定性は、弱い一貫性を持つハードウェアの観察可能な動作を記述するためのメモリモデルの意味論上の規定です。
  8. readEventReadSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize } とする。
  9. readEventeventsRecord.[[EventList]] に追加する。
  10. Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: rawValue } を execution.[[ChosenValues]] に追加する。
  11. rawValue を返す。

25.1.3.16 GetValueFromBuffer ( arrayBuffer, byteIndex, type, isTypedArray, order [ , isLittleEndian ] )

The abstract operation GetValueFromBuffer takes arguments arrayBuffer (ArrayBufferまたはSharedArrayBuffer), byteIndex (非負整数), type (TypedArray要素型), isTypedArray (Boolean), and order (seq-cst または unordered) and optional argument isLittleEndian (Boolean) and returns NumberまたはBigInt. It performs the following steps when called:

  1. Assert: IsDetachedBuffer(arrayBuffer) は false である。
  2. Assert: arrayBuffer 内の byteIndex から始まる十分なバイトがあり、type の値を表せる。
  3. blockarrayBuffer.[[ArrayBufferData]] とする。
  4. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  5. IsSharedArrayBuffer(arrayBuffer) が true の場合、
    1. Assert: blockShared Data Blockである。
    2. rawValueGetRawBytesFromSharedBlock(block, byteIndex, type, isTypedArray, order) とする。
  6. そうでなければ、
    1. rawValue を、byteIndex(含む)から byteIndex + elementSize(含まない)までの区間のインデックスにある block からのバイトを要素とするListとする。
  7. Assert: rawValue の要素数は elementSize である。
  8. isLittleEndian が存在しない場合、
    1. agentRecord を周囲のエージェントのAgent Recordとする。
    2. isLittleEndianagentRecord.[[LittleEndian]] に設定する。
  9. RawBytesToNumeric(type, rawValue, isLittleEndian) を返す。

25.1.3.17 NumericToRawBytes ( type, value, isLittleEndian )

The abstract operation NumericToRawBytes takes arguments type (TypedArray要素型), value (NumberまたはBigInt), and isLittleEndian (Boolean) and returns バイト値のList. It performs the following steps when called:

  1. typefloat16 の場合、
    1. rawBytes を、value をroundTiesToEvenモードを用いてIEEE 754-2019 binary16形式に変換した結果である2バイトを要素とするListとする。バイトはリトルエンディアン順に並べられる。valueNaN の場合、rawBytes は実装が選択した任意のIEEE 754-2019 binary16形式のNaNエンコーディングに設定されてもよい。実装は、実装上区別可能な各 NaN 値について常に同じエンコーディングを選択しなければならない。
  2. そうでなく typefloat32 の場合、
    1. rawBytes を、value をroundTiesToEvenモードを用いてIEEE 754-2019 binary32形式に変換した結果である4バイトを要素とするListとする。バイトはリトルエンディアン順に並べられる。valueNaN の場合、rawBytes は実装が選択した任意のIEEE 754-2019 binary32形式のNaNエンコーディングに設定されてもよい。実装は、実装上区別可能な各 NaN 値について常に同じエンコーディングを選択しなければならない。
  3. そうでなく typefloat64 の場合、
    1. rawBytes を、valueIEEE 754-2019 binary64形式エンコーディングである8バイトを要素とするListとする。バイトはリトルエンディアン順に並べられる。valueNaN の場合、rawBytes は実装が選択した任意のIEEE 754-2019 binary64形式のNaNエンコーディングに設定されてもよい。実装は、実装上区別可能な各 NaN 値について常に同じエンコーディングを選択しなければならない。
  4. そうでなければ、
    1. nTable 70 のElement Type type に対して指定されたElement Size値とする。
    2. conversionOperation を、Table 70 のElement Type type に対する“Conversion Operation”列で名付けられた抽象操作とする。
    3. intValue(! conversionOperation(value)) とする。
    4. intValue ≥ 0 の場合、
      1. rawBytes を、intValuen バイト2進エンコーディングを要素とするListとする。バイトはリトルエンディアン順に並べられる。
    5. そうでなければ、
      1. rawBytes を、intValuen バイト2進2の補数エンコーディングを要素とするListとする。バイトはリトルエンディアン順に並べられる。
  5. isLittleEndianfalse の場合、rawBytes の要素の順序を反転する。
  6. rawBytes を返す。

25.1.3.18 SetValueInBuffer ( arrayBuffer, byteIndex, type, value, isTypedArray, order [ , isLittleEndian ] )

The abstract operation SetValueInBuffer takes arguments arrayBuffer (ArrayBufferまたはSharedArrayBuffer), byteIndex (非負整数), type (TypedArray要素型), value (NumberまたはBigInt), isTypedArray (Boolean), and order (seq-cstunordered、または init) and optional argument isLittleEndian (Boolean) and returns unused. It performs the following steps when called:

  1. Assert: IsDetachedBuffer(arrayBuffer) は false である。
  2. Assert: arrayBuffer 内の byteIndex から始まる十分なバイトがあり、type の値を表せる。
  3. Assert: IsBigIntElementType(type) が true である場合、value はBigIntである。そうでなければ、value はNumberである。
  4. blockarrayBuffer.[[ArrayBufferData]] とする。
  5. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  6. agentRecord を周囲のエージェントのAgent Recordとする。
  7. isLittleEndian が存在しない場合、
    1. isLittleEndianagentRecord.[[LittleEndian]] に設定する。
  8. rawBytesNumericToRawBytes(type, value, isLittleEndian) とする。
  9. IsSharedArrayBuffer(arrayBuffer) が true の場合、
    1. executionagentRecord.[[CandidateExecution]] とする。
    2. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() であるAgent Events Recordとする。
    3. isTypedArraytrue であり、IsNoTearConfiguration(type, order) が true である場合、noTeartrue とする。そうでなければ、noTearfalse とする。
    4. WriteSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes } を eventsRecord.[[EventList]] に追加する。
  10. そうでなければ、
    1. rawBytes の個々のバイトを、block[byteIndex] から始めて block に格納する。
  11. unused を返す。

25.1.3.19 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op )

The abstract operation GetModifySetValueInBuffer takes arguments arrayBuffer (ArrayBufferまたはSharedArrayBuffer), byteIndex (非負整数), type (TypedArray要素型), value (NumberまたはBigInt), and op (read-modify-write変更関数) and returns NumberまたはBigInt. It performs the following steps when called:

  1. Assert: IsDetachedBuffer(arrayBuffer) は false である。
  2. Assert: arrayBuffer 内の byteIndex から始まる十分なバイトがあり、type の値を表せる。
  3. Assert: IsBigIntElementType(type) が true である場合、value はBigIntである。そうでなければ、value はNumberである。
  4. blockarrayBuffer.[[ArrayBufferData]] とする。
  5. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  6. agentRecord を周囲のエージェントのAgent Recordとする。
  7. isLittleEndianagentRecord.[[LittleEndian]] とする。
  8. rawBytesNumericToRawBytes(type, value, isLittleEndian) とする。
  9. IsSharedArrayBuffer(arrayBuffer) が true の場合、
    1. executionagentRecord.[[CandidateExecution]] とする。
    2. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() であるAgent Events Recordとする。
    3. rawBytesRead を、要素が非決定的に選択されたバイト値である、長さ elementSizeListとする。
    4. NOTE: 実装では、rawBytesRead は基盤ハードウェア上のload-link、load-exclusive、またはread-modify-write命令のオペランドの結果です。この非決定性は、弱い一貫性を持つハードウェアの観察可能な動作を記述するためのメモリモデルの意味論上の規定です。
    5. rmwEventReadModifyWriteSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes, [[ModifyOp]]: op } とする。
    6. rmwEventeventsRecord.[[EventList]] に追加する。
    7. Chosen Value Record { [[Event]]: rmwEvent, [[ChosenValue]]: rawBytesRead } を execution.[[ChosenValues]] に追加する。
  10. そうでなければ、
    1. rawBytesRead を、block[byteIndex] から始まる elementSize バイトの列を要素とする、長さ elementSizeListとする。
    2. rawBytesModifiedop(rawBytesRead, rawBytes) とする。
    3. rawBytesModified の個々のバイトを、block[byteIndex] から始めて block に格納する。
  11. RawBytesToNumeric(type, rawBytesRead, isLittleEndian) を返す。

25.1.4 ArrayBufferコンストラクター

ArrayBufferコンストラクターは:

  • %ArrayBuffer%である。
  • グローバルオブジェクト"ArrayBuffer"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいArrayBufferを作成して初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローする。
  • クラス定義のextends節の値として使用できる。指定されたArrayBufferの振る舞いを継承しようとするサブクラスコンストラクターは、ArrayBuffer.prototype組み込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するために、ArrayBufferコンストラクターへのsuper呼び出しを含めなければならない。

25.1.4.1 ArrayBuffer ( length [ , options ] )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. byteLength を ? ToIndex(length) とする。
  3. requestedMaxByteLength を ? GetArrayBufferMaxByteLengthOption(options) とする。
  4. AllocateArrayBuffer(NewTarget, byteLength, requestedMaxByteLength) を返す。

25.1.5 ArrayBufferコンストラクターのプロパティ

ArrayBufferコンストラクターは:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 次のプロパティを持つ:

25.1.5.1 ArrayBuffer.isView ( arg )

この関数は呼び出されたとき、次の手順を実行します:

  1. arg がObjectでない場合、false を返す。
  2. arg[[ViewedArrayBuffer]] 内部スロットを持つ場合、true を返す。
  3. false を返す。

25.1.5.2 ArrayBuffer.prototype

ArrayBuffer.prototypeの初期値はArrayBufferプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

25.1.5.3 get ArrayBuffer [ %Symbol.species% ]

ArrayBuffer[%Symbol.species%]は、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. this値を返す。

この関数の"name"プロパティの値は "get [Symbol.species]" です。

Note

ArrayBuffer.prototype.slice ( start, end ) は通常、そのthis値のコンストラクターを使用して派生オブジェクトを作成します。しかし、サブクラスコンストラクターは、その %Symbol.species% プロパティを再定義することによって、ArrayBuffer.prototype.slice ( start, end ) メソッドについてその既定の振る舞いを上書きできます。

25.1.6 ArrayBufferプロトタイプオブジェクトのプロパティ

ArrayBufferプロトタイプオブジェクトは:

  • %ArrayBuffer.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[ArrayBufferData]]または[[ArrayBufferByteLength]]内部スロットを持たない。

25.1.6.1 get ArrayBuffer.prototype.byteLength

ArrayBuffer.prototype.byteLengthは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が true の場合、TypeError 例外をスローする。
  4. IsDetachedBuffer(obj) が true の場合、+0𝔽 を返す。
  5. lengthobj.[[ArrayBufferByteLength]] とする。
  6. 𝔽(length) を返す。

25.1.6.2 ArrayBuffer.prototype.constructor

ArrayBuffer.prototype.constructorの初期値は %ArrayBuffer% です。

25.1.6.3 get ArrayBuffer.prototype.detached

ArrayBuffer.prototype.detachedは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が true の場合、TypeError 例外をスローする。
  4. IsDetachedBuffer(obj) を返す。

25.1.6.4 get ArrayBuffer.prototype.maxByteLength

ArrayBuffer.prototype.maxByteLengthは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が true の場合、TypeError 例外をスローする。
  4. IsDetachedBuffer(obj) が true の場合、+0𝔽 を返す。
  5. IsFixedLengthArrayBuffer(obj) が true の場合、
    1. lengthobj.[[ArrayBufferByteLength]] とする。
  6. そうでなければ、
    1. lengthobj.[[ArrayBufferMaxByteLength]] とする。
  7. 𝔽(length) を返す。

25.1.6.5 get ArrayBuffer.prototype.resizable

ArrayBuffer.prototype.resizableは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が true の場合、TypeError 例外をスローする。
  4. IsFixedLengthArrayBuffer(obj) が false の場合、true を返す。
  5. false を返す。

25.1.6.6 ArrayBuffer.prototype.resize ( newLength )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferMaxByteLength]]) を実行する。
  3. IsSharedArrayBuffer(obj) が true の場合、TypeError 例外をスローする。
  4. newByteLength を ? ToIndex(newLength) とする。
  5. IsDetachedBuffer(obj) が true の場合、TypeError 例外をスローする。
  6. newByteLength > obj.[[ArrayBufferMaxByteLength]] の場合、RangeError 例外をスローする。
  7. hostHandled を ? HostResizeArrayBuffer(obj, newByteLength) とする。
  8. hostHandledhandled である場合、undefined を返す。
  9. oldBlockobj.[[ArrayBufferData]] とする。
  10. newBlock を ? CreateByteDataBlock(newByteLength) とする。
  11. copyLengthmin(newByteLength, obj.[[ArrayBufferByteLength]]) とする。
  12. CopyDataBlockBytes(newBlock, 0, oldBlock, 0, copyLength) を実行する。
  13. NOTE: 新しいData Blockの作成も古いData Blockからのコピーも観察可能ではありません。実装はこのメソッドをインプレース拡張または縮小として実装してもよいです。
  14. obj.[[ArrayBufferData]]newBlock に設定する。
  15. obj.[[ArrayBufferByteLength]]newByteLength に設定する。
  16. undefined を返す。

25.1.6.7 ArrayBuffer.prototype.slice ( start, end )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が true の場合、TypeError 例外をスローする。
  4. IsDetachedBuffer(obj) が true の場合、TypeError 例外をスローする。
  5. lenobj.[[ArrayBufferByteLength]] とする。
  6. relativeStart を ? ToIntegerOrInfinity(start) とする。
  7. relativeStart = -∞ の場合、first を0とする。
  8. そうでなく relativeStart < 0 の場合、firstmax(len + relativeStart, 0) とする。
  9. そうでなければ、firstmin(relativeStart, len) とする。
  10. endundefined の場合、relativeEndlen とする。そうでなければ、relativeEnd を ? ToIntegerOrInfinity(end) とする。
  11. relativeEnd = -∞ の場合、final を0とする。
  12. そうでなく relativeEnd < 0 の場合、finalmax(len + relativeEnd, 0) とする。
  13. そうでなければ、finalmin(relativeEnd, len) とする。
  14. newLenmax(final - first, 0) とする。
  15. ctor を ? SpeciesConstructor(obj, %ArrayBuffer%) とする。
  16. new を ? Construct(ctor, « 𝔽(newLen) ») とする。
  17. RequireInternalSlot(new, [[ArrayBufferData]]) を実行する。
  18. IsSharedArrayBuffer(new) が true の場合、TypeError 例外をスローする。
  19. IsDetachedBuffer(new) が true の場合、TypeError 例外をスローする。
  20. SameValue(new, obj) が true の場合、TypeError 例外をスローする。
  21. new.[[ArrayBufferByteLength]] < newLen の場合、TypeError 例外をスローする。
  22. NOTE: 上記の手順の副作用によって、obj がデタッチまたはサイズ変更されている可能性があります。
  23. IsDetachedBuffer(obj) が true の場合、TypeError 例外をスローする。
  24. fromBufobj.[[ArrayBufferData]] とする。
  25. toBufnew.[[ArrayBufferData]] とする。
  26. currentLenobj.[[ArrayBufferByteLength]] とする。
  27. first < currentLen の場合、
    1. countmin(newLen, currentLen - first) とする。
    2. CopyDataBlockBytes(toBuf, 0, fromBuf, first, count) を実行する。
  28. new を返す。

25.1.6.8 ArrayBuffer.prototype.transfer ( [ newLength ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. ArrayBufferCopyAndDetach(obj, newLength, preserve-resizability) を返す。

25.1.6.9 ArrayBuffer.prototype.transferToFixedLength ( [ newLength ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. 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プロトタイプオブジェクトからプロパティを継承します。ArrayBufferインスタンスはそれぞれ、[[ArrayBufferData]]内部スロット、[[ArrayBufferByteLength]]内部スロット、および[[ArrayBufferDetachKey]]内部スロットを持ちます。サイズ変更可能なArrayBufferインスタンスはそれぞれ、[[ArrayBufferMaxByteLength]]内部スロットを持ちます。

[[ArrayBufferData]]null であるArrayBufferインスタンスはデタッチされているとみなされ、そのArrayBufferインスタンスに含まれるデータにアクセスまたは変更するすべての演算子は失敗します。

[[ArrayBufferDetachKey]]undefined 以外の値に設定されているArrayBufferインスタンスでは、すべてのDetachArrayBuffer呼び出しで同じ"detach key"を引数として渡す必要があります。そうでない場合、TypeErrorになります。この内部スロットは、この仕様のアルゴリズムではなく、特定の埋め込み環境によってのみ設定されます。

25.1.8 サイズ変更可能なArrayBufferのガイドライン

Note 1

以下は、サイズ変更可能なArrayBufferを扱うECMAScriptプログラマー向けのガイドラインです。

可能な場合、プログラムはその展開環境でテストすることを推奨します。利用可能な物理メモリ量はハードウェアデバイス間で大きく異なります。同様に、仮想メモリサブシステムも、ハードウェアデバイス間だけでなくオペレーティングシステム間でも大きく異なります。64ビットのデスクトップWebブラウザーでメモリ不足エラーなしに動作するアプリケーションが、32ビットのモバイルWebブラウザーではメモリ不足になる可能性があります。

サイズ変更可能なArrayBuffer"maxByteLength"オプションの値を選択する際には、アプリケーションにとって可能な最小サイズを選択することを推奨します。"maxByteLength" は1,073,741,824(230バイトまたは1GiB)を超えないことを推奨します。

特定の最大サイズでサイズ変更可能なArrayBufferの構築に成功しても、将来のサイズ変更が成功することを保証するものではないことに注意してください。

Note 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とは、作成後にバイト長を変更できないSharedArrayBufferです。

拡張可能なSharedArrayBufferとは、作成後に SharedArrayBuffer.prototype.grow ( newLength ) を呼び出すことによってバイト長を増加できるSharedArrayBufferです。

作成されるSharedArrayBufferオブジェクトの種類は、SharedArrayBuffer ( length [ , options ] ) に渡される引数に依存します。

25.2.2 SharedArrayBufferオブジェクトのための抽象操作

25.2.2.1 AllocateSharedArrayBuffer ( constructor, byteLength [ , maxByteLength ] )

The abstract operation AllocateSharedArrayBuffer takes arguments constructor (コンストラクター) and byteLength (非負整数) and optional argument maxByteLength (非負整数または empty) and returns SharedArrayBufferを含む正常完了またはスロー完了のいずれか. SharedArrayBufferを作成するために使用されます。 It performs the following steps when called:

  1. Let slots be « [[ArrayBufferData]] ».
  2. If maxByteLength is present and maxByteLength is not empty, let allocatingGrowableBuffer be true; else let allocatingGrowableBuffer be false.
  3. If allocatingGrowableBuffer is true, then
    1. If byteLength > maxByteLength, throw a RangeError exception.
    2. Append [[ArrayBufferByteLengthData]] and [[ArrayBufferMaxByteLength]] to slots.
  4. Else,
    1. Append [[ArrayBufferByteLength]] to slots.
  5. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%SharedArrayBuffer.prototype%", slots).
  6. If allocatingGrowableBuffer is true, let allocLength be maxByteLength; else let allocLength be byteLength.
  7. Let block be ? CreateSharedByteDataBlock(allocLength).
  8. Set obj.[[ArrayBufferData]] to block.
  9. If allocatingGrowableBuffer is true, then
    1. Assert: byteLengthmaxByteLength.
    2. Let byteLengthBlock be ? CreateSharedByteDataBlock(8).
    3. Perform SetValueInBuffer(byteLengthBlock, 0, biguint64, (byteLength), true, seq-cst).
    4. Set obj.[[ArrayBufferByteLengthData]] to byteLengthBlock.
    5. Set obj.[[ArrayBufferMaxByteLength]] to maxByteLength.
  10. Else,
    1. Set obj.[[ArrayBufferByteLength]] to byteLength.
  11. Return obj.

25.2.2.2 IsSharedArrayBuffer ( obj )

The abstract operation IsSharedArrayBuffer takes argument obj (ArrayBufferまたはSharedArrayBuffer) and returns Boolean. オブジェクトがSharedArrayBufferであるかどうかをテストします。 It performs the following steps when called:

  1. obj.[[ArrayBufferData]]Shared Data Blockである場合、true を返す。
  2. false を返す。

25.2.2.3 IsGrowableSharedArrayBuffer ( obj )

The abstract operation IsGrowableSharedArrayBuffer takes argument obj (ArrayBufferまたはSharedArrayBuffer) and returns Boolean. オブジェクトが拡張可能なSharedArrayBufferであるかどうかをテストします。 It performs the following steps when called:

  1. IsSharedArrayBuffer(obj) が true であり、obj[[ArrayBufferByteLengthData]] 内部スロットを持つ場合、true を返す。
  2. false を返す。

25.2.2.4 HostGrowSharedArrayBuffer ( buffer, newByteLength )

The host-defined abstract operation HostGrowSharedArrayBuffer takes arguments buffer (SharedArrayBuffer) and newByteLength (非負整数) and returns handled または unhandled のいずれかを含む正常完了、またはスロー完了のいずれか. ホストに buffer の実装定義の拡張を実行する機会を与えます。ホストが buffer の拡張を処理しないことを選択した場合、既定の動作として unhandled を返してもよいです。

HostGrowSharedArrayBufferの実装は、次の要件に適合しなければなりません:

  • この抽象操作が unhandled で正常完了しない場合で、newByteLength < buffer の現在のバイト長、または newByteLength > buffer.[[ArrayBufferMaxByteLength]] である場合、RangeError 例外をスローする。
  • agentRecord を周囲のエージェントのAgent Recordとする。isLittleEndianagentRecord.[[LittleEndian]] とする。この抽象操作が handled で正常完了する場合、[[Order]]seq-cst[[Payload]]NumericToRawBytes(biguint64, newByteLength, isLittleEndian)、[[Block]]buffer.[[ArrayBufferByteLengthData]][[ByteIndex]] が0、[[ElementSize]] が8であるWriteSharedMemoryまたはReadModifyWriteSharedMemoryイベントが、SharedArrayBuffer.prototype.grow ( newLength ) への競合する呼び出しが「失われる」、すなわち黙って何もしない、ということがないように、周囲のエージェントの候補実行に追加される。
Note

上記の第2要件は、buffer の現在のバイト長がどのように、またはいつ読み取られるかについて意図的に曖昧です。バイト長は基盤ハードウェア上の原子的read-modify-write操作によって更新されなければならないため、load-link/store-conditionalまたはload-exclusive/store-exclusive命令ペアを使用するアーキテクチャは、ペアとなる命令を命令ストリーム内で近接させたい場合があります。そのため、SharedArrayBuffer.prototype.grow ( newLength ) 自体はHostGrowSharedArrayBufferを呼び出す前に newByteLength の境界チェックを行わず、現在のバイト長がいつ読み取られるかについての要件もありません。

これは、0 ≤ newByteLengthbuffer.[[ArrayBufferMaxByteLength]] が保証されているHostResizeArrayBufferとは対照的です。

HostGrowSharedArrayBufferの既定の実装は NormalCompletion(unhandled) を返すことです。

25.2.3 SharedArrayBufferコンストラクター

SharedArrayBufferコンストラクターは:

  • %SharedArrayBuffer%である。
  • そのプロパティが存在する場合(下記参照)、グローバルオブジェクト"SharedArrayBuffer"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいSharedArrayBufferを作成して初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローする。
  • クラス定義のextends節の値として使用できる。指定されたSharedArrayBufferの振る舞いを継承しようとするサブクラスコンストラクターは、SharedArrayBuffer.prototype組み込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するために、SharedArrayBufferコンストラクターへのsuper呼び出しを含めなければならない。

ホストがSharedArrayBufferへの並行アクセスを提供しない場合はいつでも、グローバルオブジェクト"SharedArrayBuffer"プロパティを省略してもよいです。

Note

ArrayBufferとは異なり、SharedArrayBufferはデタッチされることができず、その内部[[ArrayBufferData]]スロットは決して null になりません。

25.2.3.1 SharedArrayBuffer ( length [ , options ] )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. byteLength を ? ToIndex(length) とする。
  3. requestedMaxByteLength を ? GetArrayBufferMaxByteLengthOption(options) とする。
  4. AllocateSharedArrayBuffer(NewTarget, byteLength, requestedMaxByteLength) を返す。

25.2.4 SharedArrayBufferコンストラクターのプロパティ

SharedArrayBufferコンストラクターは:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 次のプロパティを持つ:

25.2.4.1 SharedArrayBuffer.prototype

SharedArrayBuffer.prototypeの初期値はSharedArrayBufferプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

25.2.4.2 get SharedArrayBuffer [ %Symbol.species% ]

SharedArrayBuffer[%Symbol.species%]は、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. this値を返す。

この関数の"name"プロパティの値は "get [Symbol.species]" です。

25.2.5 SharedArrayBufferプロトタイプオブジェクトのプロパティ

SharedArrayBufferプロトタイプオブジェクトは:

  • %SharedArrayBuffer.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[ArrayBufferData]]または[[ArrayBufferByteLength]]内部スロットを持たない。

25.2.5.1 get SharedArrayBuffer.prototype.byteLength

SharedArrayBuffer.prototype.byteLengthは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が false の場合、TypeError 例外をスローする。
  4. lengthArrayBufferByteLength(obj, seq-cst) とする。
  5. 𝔽(length) を返す。

25.2.5.2 SharedArrayBuffer.prototype.constructor

SharedArrayBuffer.prototype.constructorの初期値は %SharedArrayBuffer% です。

25.2.5.3 SharedArrayBuffer.prototype.grow ( newLength )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferMaxByteLength]]) を実行する。
  3. IsSharedArrayBuffer(obj) が false の場合、TypeError 例外をスローする。
  4. newByteLength を ? ToIndex(newLength) とする。
  5. hostHandled を ? HostGrowSharedArrayBuffer(obj, newByteLength) とする。
  6. hostHandledhandled である場合、undefined を返す。
  7. agentRecord を周囲のエージェントのAgent Recordとする。
  8. isLittleEndianagentRecord.[[LittleEndian]] とする。
  9. byteLengthBlockobj.[[ArrayBufferByteLengthData]] とする。
  10. currentByteLengthRawBytesGetRawBytesFromSharedBlock(byteLengthBlock, 0, biguint64, true, seq-cst) とする。
  11. newByteLengthRawBytesNumericToRawBytes(biguint64, (newByteLength), isLittleEndian) とする。
  12. 繰り返す:
    1. NOTE: これは、同じバッファーの並列で競合する拡張が全順序化され、失われず、黙って何もしないことがないようにするためのcompare-and-exchangeループです。このループは、競合なしに拡張を試みることができた場合に終了します。
    2. currentByteLength(RawBytesToNumeric(biguint64, currentByteLengthRawBytes, isLittleEndian)) とする。
    3. newByteLength = currentByteLength の場合、undefined を返す。
    4. newByteLength < currentByteLength または newByteLength > obj.[[ArrayBufferMaxByteLength]] の場合、RangeError 例外をスローする。
    5. byteLengthDeltanewByteLength - currentByteLength とする。
    6. byteLengthDelta バイトからなる新しいShared Data Block値を作成することが不可能な場合、RangeError 例外をスローする。
    7. NOTE: ここでは新しいShared Data Blockは構築も使用もされません。拡張可能なSharedArrayBufferの観察可能な振る舞いは、構築時に最大サイズのShared Data Blockを割り当てることで指定されており、この手順は、メモリ不足になった実装が RangeError をスローしなければならないという要件を捉えています。
    8. readByteLengthRawBytesAtomicCompareExchangeInSharedBlock(byteLengthBlock, 0, 8, currentByteLengthRawBytes, newByteLengthRawBytes) とする。
    9. ByteListEqual(readByteLengthRawBytes, currentByteLengthRawBytes) が true の場合、undefined を返す。
    10. currentByteLengthRawBytesreadByteLengthRawBytes に設定する。
Note

長さを更新するcompare-exchangeの偽の失敗は禁止されています。新しい長さの境界チェックが通過し、実装がメモリ不足でない場合、ReadModifyWriteSharedMemoryイベント(すなわち成功したcompare-exchange)は常に候補実行に追加されます。

SharedArrayBuffer.prototype.growへの並列呼び出しは全順序化されます。例えば、sab.grow(10)sab.grow(20)という2つの競合する呼び出しを考えます。2つの呼び出しの一方が競争に勝つことが保証されます。sab.grow(10)の呼び出しは、sab.grow(20)が先に起きた場合でもsabを縮小することは決してなく、その場合は代わりにRangeErrorをスローします。

25.2.5.4 get SharedArrayBuffer.prototype.growable

SharedArrayBuffer.prototype.growableは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が false の場合、TypeError 例外をスローする。
  4. IsFixedLengthArrayBuffer(obj) が false の場合、true を返す。
  5. false を返す。

25.2.5.5 get SharedArrayBuffer.prototype.maxByteLength

SharedArrayBuffer.prototype.maxByteLengthは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が false の場合、TypeError 例外をスローする。
  4. IsFixedLengthArrayBuffer(obj) が true の場合、
    1. lengthobj.[[ArrayBufferByteLength]] とする。
  5. そうでなければ、
    1. lengthobj.[[ArrayBufferMaxByteLength]] とする。
  6. 𝔽(length) を返す。

25.2.5.6 SharedArrayBuffer.prototype.slice ( start, end )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[ArrayBufferData]]) を実行する。
  3. IsSharedArrayBuffer(obj) が false の場合、TypeError 例外をスローする。
  4. lenArrayBufferByteLength(obj, seq-cst) とする。
  5. relativeStart を ? ToIntegerOrInfinity(start) とする。
  6. relativeStart = -∞ の場合、first を0とする。
  7. そうでなく relativeStart < 0 の場合、firstmax(len + relativeStart, 0) とする。
  8. そうでなければ、firstmin(relativeStart, len) とする。
  9. endundefined の場合、relativeEndlen とする。そうでなければ、relativeEnd を ? ToIntegerOrInfinity(end) とする。
  10. relativeEnd = -∞ の場合、final を0とする。
  11. そうでなく relativeEnd < 0 の場合、finalmax(len + relativeEnd, 0) とする。
  12. そうでなければ、finalmin(relativeEnd, len) とする。
  13. newLenmax(final - first, 0) とする。
  14. ctor を ? SpeciesConstructor(obj, %SharedArrayBuffer%) とする。
  15. new を ? Construct(ctor, « 𝔽(newLen) ») とする。
  16. RequireInternalSlot(new, [[ArrayBufferData]]) を実行する。
  17. IsSharedArrayBuffer(new) が false の場合、TypeError 例外をスローする。
  18. new.[[ArrayBufferData]]obj.[[ArrayBufferData]] である場合、TypeError 例外をスローする。
  19. ArrayBufferByteLength(new, seq-cst) < newLen の場合、TypeError 例外をスローする。
  20. fromBufobj.[[ArrayBufferData]] とする。
  21. toBufnew.[[ArrayBufferData]] とする。
  22. CopyDataBlockBytes(toBuf, 0, fromBuf, first, newLen) を実行する。
  23. 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プロトタイプオブジェクトからプロパティを継承します。SharedArrayBufferインスタンスはそれぞれ[[ArrayBufferData]]内部スロットを持ちます。拡張可能でないSharedArrayBufferインスタンスはそれぞれ[[ArrayBufferByteLength]]内部スロットを持ちます。拡張可能なSharedArrayBufferインスタンスはそれぞれ[[ArrayBufferByteLengthData]]内部スロットおよび[[ArrayBufferMaxByteLength]]内部スロットを持ちます。

Note

SharedArrayBufferインスタンスは、ArrayBufferインスタンスと異なり、決してデタッチされません。

25.2.7 拡張可能なSharedArrayBufferのガイドライン

Note 1

以下は、拡張可能なSharedArrayBufferを扱うECMAScriptプログラマー向けのガイドラインです。

可能な場合、プログラムはその展開環境でテストすることを推奨します。利用可能な物理メモリ量はハードウェアデバイス間で大きく異なります。同様に、仮想メモリサブシステムも、ハードウェアデバイス間だけでなくオペレーティングシステム間でも大きく異なります。64ビットのデスクトップWebブラウザーでメモリ不足エラーなしに動作するアプリケーションが、32ビットのモバイルWebブラウザーではメモリ不足になる可能性があります。

拡張可能なSharedArrayBuffer"maxByteLength"オプションの値を選択する際には、アプリケーションにとって可能な最小サイズを選択することを推奨します。"maxByteLength" は1073741824、すなわち1GiBを超えないことを推奨します。

特定の最大サイズで拡張可能なSharedArrayBufferの構築に成功しても、将来の拡張が成功することを保証するものではないことに注意してください。

拡張可能なSharedArrayBufferの長さのすべてのロードが同期的な seq-cst ロードであるわけではありません。整数インデックス付きプロパティアクセス、例えば u8[idx] の境界チェックのための長さのロードは同期的ではありません。一般に、明示的な同期がない場合、あるプロパティアクセスが範囲内であることは、同じエージェント内の後続のプロパティアクセスも範囲内であることを意味しません。対照的に、SharedArrayBuffer、%TypedArray%.prototype、およびDataView.prototype上のlengthおよびbyteLengthゲッターを介した長さの明示的なロードは同期的です。TypedArrayが完全に範囲外かどうかを確認するために組み込みメソッドによって実行される長さのロードも同期的です。

Note 2

以下は、拡張可能なSharedArrayBufferを実装するECMAScript実装者向けのガイドラインです。

拡張可能なSharedArrayBufferは、仮想メモリを事前に予約することによるインプレース拡張として実装することを推奨します。

拡張操作は拡張可能なSharedArrayBuffer上のメモリアクセスと並列に発生し得るため、メモリモデルの制約により、順序なしアクセスであっても「tear」しない(値のビットが混ざらない)ことが要求されます。実際には、これは、拡張可能なSharedArrayBufferの基盤データブロックを、世界を停止することなしにコピーによって拡張できないことを意味します。世界を停止することは直列化ポイントを導入し低速であるため、実装戦略として推奨しません。

拡張されたメモリは、並列で競合するアクセスに対しても、その作成の瞬間からゼロ化されて見えなければなりません。これは、オンデマンドでゼロ埋めされる仮想メモリページ、または手動でメモリをゼロ化する場合の慎重な同期によって達成できます。

拡張可能なSharedArrayBufferTypedArrayビュー上の整数インデックス付きプロパティアクセスは、非拡張可能なSharedArrayBufferTypedArrayビュー上のアクセスと同様に最適化可能であることを意図しています。なぜなら、整数インデックス付きプロパティロードは、基盤バッファーの長さに対して同期的ではないためです(上記のプログラマー向けガイドラインを参照)。例えば、プロパティアクセスの境界チェックはループ外へ移動されてもよいです。

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を、閲覧対象バッファーのキャッシュされたバイト長とともにカプセル化するために使用されるRecord値です。これは、閲覧対象バッファーが拡張可能なSharedArrayBufferである場合に、バイト長データブロックのReadSharedMemoryイベントが1つだけであることを保証するのに役立ちます。

DataView With Buffer Witness Recordは、Table 72 に列挙されるフィールドを持ちます。

Table 72: DataView With Buffer Witness Record Fields
フィールド名 意味
[[Object]] DataView バッファーのバイト長がロードされるDataViewオブジェクト。
[[CachedBufferByteLength]] 非負整数または detached Recordが作成されたときの、オブジェクトの[[ViewedArrayBuffer]]のバイト長。

25.3.1.2 MakeDataViewWithBufferWitnessRecord ( obj, order )

The abstract operation MakeDataViewWithBufferWitnessRecord takes arguments obj (DataView) and order (seq-cst または unordered) and returns DataView With Buffer Witness Record. It performs the following steps when called:

  1. bufferobj.[[ViewedArrayBuffer]] とする。
  2. IsDetachedBuffer(buffer) が true の場合、
    1. byteLengthdetached とする。
  3. そうでなければ、
    1. byteLengthArrayBufferByteLength(buffer, order) とする。
  4. DataView With Buffer Witness Record { [[Object]]: obj, [[CachedBufferByteLength]]: byteLength } を返す。

25.3.1.3 GetViewByteLength ( viewRecord )

The abstract operation GetViewByteLength takes argument viewRecord (DataView With Buffer Witness Record) and returns 非負整数. It performs the following steps when called:

  1. Assert: IsViewOutOfBounds(viewRecord) は false である。
  2. viewviewRecord.[[Object]] とする。
  3. view.[[ByteLength]]auto でない場合、view.[[ByteLength]] を返す。
  4. Assert: IsFixedLengthArrayBuffer(view.[[ViewedArrayBuffer]]) は false である。
  5. byteOffsetview.[[ByteOffset]] とする。
  6. byteLengthviewRecord.[[CachedBufferByteLength]] とする。
  7. Assert: byteLengthdetached でない。
  8. byteLength - byteOffset を返す。

25.3.1.4 IsViewOutOfBounds ( viewRecord )

The abstract operation IsViewOutOfBounds takes argument viewRecord (DataView With Buffer Witness Record) and returns Boolean. It performs the following steps when called:

  1. viewviewRecord.[[Object]] とする。
  2. bufferByteLengthviewRecord.[[CachedBufferByteLength]] とする。
  3. IsDetachedBuffer(view.[[ViewedArrayBuffer]]) が true の場合、
    1. Assert: bufferByteLengthdetached である。
    2. true を返す。
  4. Assert: bufferByteLength は非負整数である。
  5. byteOffsetStartview.[[ByteOffset]] とする。
  6. view.[[ByteLength]]auto である場合、
    1. byteOffsetEndbufferByteLength とする。
  7. そうでなければ、
    1. byteOffsetEndbyteOffsetStart + view.[[ByteLength]] とする。
  8. NOTE: [[ByteOffset]]bufferByteLength である0長のDataViewは、範囲外とはみなされません。
  9. byteOffsetStart > bufferByteLength または byteOffsetEnd > bufferByteLength の場合、true を返す。
  10. false を返す。

25.3.1.5 GetViewValue ( view, requestIndex, isLittleEndian, type )

The abstract operation GetViewValue takes arguments view (ECMAScript言語値), requestIndex (ECMAScript言語値), isLittleEndian (ECMAScript言語値), and type (TypedArray要素型) and returns NumberまたはBigIntのいずれかを含む正常完了、またはスロー完了のいずれか. DataViewインスタンス上の関数が、ビューのバッファーから値を取得するために使用します。 It performs the following steps when called:

  1. RequireInternalSlot(view, [[DataView]]) を実行する。
  2. Assert: view[[ViewedArrayBuffer]] 内部スロットを持つ。
  3. getIndex を ? ToIndex(requestIndex) とする。
  4. isLittleEndianToBoolean(isLittleEndian) に設定する。
  5. viewOffsetview.[[ByteOffset]] とする。
  6. viewRecordMakeDataViewWithBufferWitnessRecord(view, unordered) とする。
  7. NOTE: view のバッキングバッファーが拡張可能なSharedArrayBufferである場合、境界チェックは同期操作ではありません。
  8. IsViewOutOfBounds(viewRecord) が true の場合、TypeError 例外をスローする。
  9. viewSizeGetViewByteLength(viewRecord) とする。
  10. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  11. getIndex + elementSize > viewSize の場合、RangeError 例外をスローする。
  12. bufferIndexgetIndex + viewOffset とする。
  13. GetValueFromBuffer(view.[[ViewedArrayBuffer]], bufferIndex, type, false, unordered, isLittleEndian) を返す。

25.3.1.6 SetViewValue ( view, requestIndex, isLittleEndian, type, value )

The abstract operation SetViewValue takes arguments view (ECMAScript言語値), requestIndex (ECMAScript言語値), isLittleEndian (ECMAScript言語値), type (TypedArray要素型), and value (ECMAScript言語値) and returns undefined を含む正常完了またはスロー完了のいずれか. DataViewインスタンス上の関数が、ビューのバッファーに値を格納するために使用します。 It performs the following steps when called:

  1. RequireInternalSlot(view, [[DataView]]) を実行する。
  2. Assert: view[[ViewedArrayBuffer]] 内部スロットを持つ。
  3. getIndex を ? ToIndex(requestIndex) とする。
  4. IsBigIntElementType(type) が true の場合、numberValue を ? ToBigInt(value) とする。
  5. そうでなければ、numberValue を ? ToNumber(value) とする。
  6. isLittleEndianToBoolean(isLittleEndian) に設定する。
  7. viewOffsetview.[[ByteOffset]] とする。
  8. viewRecordMakeDataViewWithBufferWitnessRecord(view, unordered) とする。
  9. NOTE: view のバッキングバッファーが拡張可能なSharedArrayBufferである場合、境界チェックは同期操作ではありません。
  10. IsViewOutOfBounds(viewRecord) が true の場合、TypeError 例外をスローする。
  11. viewSizeGetViewByteLength(viewRecord) とする。
  12. elementSizeTable 70 のElement Type type に対して指定されたElement Size値とする。
  13. getIndex + elementSize > viewSize の場合、RangeError 例外をスローする。
  14. bufferIndexgetIndex + viewOffset とする。
  15. SetValueInBuffer(view.[[ViewedArrayBuffer]], bufferIndex, type, numberValue, false, unordered, isLittleEndian) を実行する。
  16. undefined を返す。

25.3.2 DataViewコンストラクター

DataViewコンストラクターは:

  • %DataView%である。
  • グローバルオブジェクト"DataView"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいDataViewを作成して初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローする。
  • クラス定義のextends節の値として使用できる。指定されたDataViewの振る舞いを継承しようとするサブクラスコンストラクターは、DataView.prototype組み込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するために、DataViewコンストラクターへのsuper呼び出しを含めなければならない。

25.3.2.1 DataView ( buffer [ , byteOffset [ , byteLength ] ] )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. RequireInternalSlot(buffer, [[ArrayBufferData]]) を実行する。
  3. offset を ? ToIndex(byteOffset) とする。
  4. IsDetachedBuffer(buffer) が true の場合、TypeError 例外をスローする。
  5. bufferByteLengthArrayBufferByteLength(buffer, seq-cst) とする。
  6. offset > bufferByteLength の場合、RangeError 例外をスローする。
  7. bufferIsFixedLengthIsFixedLengthArrayBuffer(buffer) とする。
  8. byteLengthundefined の場合、
    1. bufferIsFixedLengthtrue の場合、
      1. viewByteLengthbufferByteLength - offset とする。
    2. そうでなければ、
      1. viewByteLengthauto とする。
  9. そうでなければ、
    1. viewByteLength を ? ToIndex(byteLength) とする。
    2. offset + viewByteLength > bufferByteLength の場合、RangeError 例外をスローする。
  10. obj を ? OrdinaryCreateFromConstructor(NewTarget, "%DataView.prototype%", « [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] ») とする。
  11. IsDetachedBuffer(buffer) が true の場合、TypeError 例外をスローする。
  12. bufferByteLengthArrayBufferByteLength(buffer, seq-cst) に設定する。
  13. offset > bufferByteLength の場合、RangeError 例外をスローする。
  14. byteLengthundefined でない場合、
    1. offset + viewByteLength > bufferByteLength の場合、RangeError 例外をスローする。
  15. obj.[[ViewedArrayBuffer]]buffer に設定する。
  16. obj.[[ByteLength]]viewByteLength に設定する。
  17. obj.[[ByteOffset]]offset に設定する。
  18. obj を返す。

25.3.3 DataViewコンストラクターのプロパティ

DataViewコンストラクターは:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 次のプロパティを持つ:

25.3.3.1 DataView.prototype

DataView.prototypeの初期値はDataViewプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

25.3.4 DataViewプロトタイプオブジェクトのプロパティ

DataViewプロトタイプオブジェクトは:

  • %DataView.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[DataView]][[ViewedArrayBuffer]][[ByteLength]]、または[[ByteOffset]]内部スロットを持たない。

25.3.4.1 get DataView.prototype.buffer

DataView.prototype.bufferは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[DataView]]) を実行する。
  3. Assert: obj[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. bufferobj.[[ViewedArrayBuffer]] とする。
  5. buffer を返す。

25.3.4.2 get DataView.prototype.byteLength

DataView.prototype.byteLengthは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[DataView]]) を実行する。
  3. Assert: obj[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. viewRecordMakeDataViewWithBufferWitnessRecord(obj, seq-cst) とする。
  5. IsViewOutOfBounds(viewRecord) が true の場合、TypeError 例外をスローする。
  6. sizeGetViewByteLength(viewRecord) とする。
  7. 𝔽(size) を返す。

25.3.4.3 get DataView.prototype.byteOffset

DataView.prototype.byteOffsetは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. objthis値とする。
  2. RequireInternalSlot(obj, [[DataView]]) を実行する。
  3. Assert: obj[[ViewedArrayBuffer]] 内部スロットを持つ。
  4. viewRecordMakeDataViewWithBufferWitnessRecord(obj, seq-cst) とする。
  5. IsViewOutOfBounds(viewRecord) が true の場合、TypeError 例外をスローする。
  6. offsetobj.[[ByteOffset]] とする。
  7. 𝔽(offset) を返す。

25.3.4.4 DataView.prototype.constructor

DataView.prototype.constructorの初期値は %DataView% です。

25.3.4.5 DataView.prototype.getBigInt64 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. GetViewValue(view, byteOffset, littleEndian, bigint64) を返す。

25.3.4.6 DataView.prototype.getBigUint64 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. GetViewValue(view, byteOffset, littleEndian, biguint64) を返す。

25.3.4.7 DataView.prototype.getFloat16 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, float16) を返す。

25.3.4.8 DataView.prototype.getFloat32 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, float32) を返す。

25.3.4.9 DataView.prototype.getFloat64 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, float64) を返す。

25.3.4.10 DataView.prototype.getInt8 ( byteOffset )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. GetViewValue(view, byteOffset, true, int8) を返す。

25.3.4.11 DataView.prototype.getInt16 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, int16) を返す。

25.3.4.12 DataView.prototype.getInt32 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, int32) を返す。

25.3.4.13 DataView.prototype.getUint8 ( byteOffset )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. GetViewValue(view, byteOffset, true, uint8) を返す。

25.3.4.14 DataView.prototype.getUint16 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, uint16) を返す。

25.3.4.15 DataView.prototype.getUint32 ( byteOffset [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. GetViewValue(view, byteOffset, littleEndian, uint32) を返す。

25.3.4.16 DataView.prototype.setBigInt64 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. SetViewValue(view, byteOffset, littleEndian, bigint64, value) を返す。

25.3.4.17 DataView.prototype.setBigUint64 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. SetViewValue(view, byteOffset, littleEndian, biguint64, value) を返す。

25.3.4.18 DataView.prototype.setFloat16 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, float16, value) を返す。

25.3.4.19 DataView.prototype.setFloat32 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, float32, value) を返す。

25.3.4.20 DataView.prototype.setFloat64 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, float64, value) を返す。

25.3.4.21 DataView.prototype.setInt8 ( byteOffset, value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. SetViewValue(view, byteOffset, true, int8, value) を返す。

25.3.4.22 DataView.prototype.setInt16 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, int16, value) を返す。

25.3.4.23 DataView.prototype.setInt32 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, int32, value) を返す。

25.3.4.24 DataView.prototype.setUint8 ( byteOffset, value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. SetViewValue(view, byteOffset, true, uint8, value) を返す。

25.3.4.25 DataView.prototype.setUint16 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, uint16, value) を返す。

25.3.4.26 DataView.prototype.setUint32 ( byteOffset, value [ , littleEndian ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. viewthis値とする。
  2. littleEndian が存在しない場合、littleEndianfalse に設定する。
  3. SetViewValue(view, byteOffset, littleEndian, uint32, value) を返す。

25.3.4.27 DataView.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値はString値 "DataView" です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } です。

25.3.5 DataViewインスタンスのプロパティ

DataViewインスタンスは、DataViewプロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。DataViewインスタンスはそれぞれ、[[DataView]][[ViewedArrayBuffer]][[ByteLength]]、および[[ByteOffset]]内部スロットを持ちます。

Note

[[DataView]]内部スロットの値は、この仕様内では使用されません。その内部スロットが存在するという単純な事実が、DataViewコンストラクターを使用して作成されたオブジェクトを識別するために仕様内で使用されます。

25.4 Atomicsオブジェクト

Atomicsオブジェクトは:

  • %Atomics%である。
  • グローバルオブジェクト"Atomics"プロパティの初期値である。
  • 通常のオブジェクトである。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • [[Construct]]内部メソッドを持たない。new演算子と共にコンストラクターとして使用できない。
  • [[Call]]内部メソッドを持たない。関数として呼び出すことができない。

Atomicsオブジェクトは、共有メモリ配列セル上で不可分に(原子的に)動作する関数、およびエージェントがプリミティブイベントを待機しディスパッチできるようにする関数を提供します。規律をもって使用される場合、Atomics関数は、共有メモリを通じて通信するマルチエージェントプログラムが、並列CPU上であってもよく理解された順序で実行できるようにします。共有メモリ通信を支配する規則は、下記で定義されるメモリモデルによって提供されます。

Note

ECMAScriptにおける共有メモリのプログラミングおよび実装のための参考ガイドラインについては、メモリモデル節の末尾の注記を参照してください。

25.4.1 Waiter Record

Waiter Recordとは、Atomics.waitまたはAtomics.waitAsyncへの特定の呼び出しを表すために使用されるRecord値です。

Waiter Recordは、Table 73 に列挙されるフィールドを持ちます。

Table 73: Waiter Record Fields
フィールド名 意味
[[AgentSignifier]] エージェントsignifier Atomics.waitまたはAtomics.waitAsyncを呼び出したエージェント。
[[PromiseCapability]] PromiseCapability Recordまたは blocking Atomics.waitAsyncへの呼び出しを表す場合は結果のpromise、そうでない場合は blocking
[[TimeoutTime]] 非負の拡張数学値 タイムアウトが引き起こされ得る最も早い時刻。時刻値を使用して計算される。
[[Result]] "ok" または "timed-out" 呼び出しの戻り値。

25.4.2 WaiterList Record

WaiterList Recordは、Atomics.waitAtomics.waitAsync、およびAtomics.notifyを介したエージェントの待機と通知を説明するために使用されます。

WaiterList Recordは、Table 74 に列挙されるフィールドを持ちます。

Table 74: WaiterList Record Fields
フィールド名 意味
[[Waiters]] Waiter RecordList このWaiterListに関連付けられた位置で待機しているAtomics.waitまたはAtomics.waitAsyncへの呼び出し。
[[MostRecentLeaveEvent]] Synchronizeイベントまたは empty そのクリティカルセクションから最後に退出したイベント、またはそのクリティカルセクションに一度も入ったことがない場合は empty

同じエージェントsignifierを持つ複数のWaiter RecordがWaiterList内に存在できます。

エージェントクラスターはWaiterList Recordのストアを持ちます。このストアは (block, i) によって索引付けされます。ここで blockShared Data Blockであり、iblock のメモリ内へのバイトオフセットです。WaiterList Recordはエージェント非依存です。(block, i) によるWaiterList Recordのストア内の検索は、エージェントクラスター内の任意のエージェントで同じWaiterList Recordを結果とします。

各WaiterList Recordは、評価中にそのWaiterList Recordへの排他的アクセスを制御するクリティカルセクションを持ちます。一度に1つのエージェントだけがWaiterList Recordのクリティカルセクションに入ることができます。WaiterList Recordのクリティカルセクションへの入退出は、抽象操作EnterCriticalSectionおよびLeaveCriticalSectionによって制御されます。待機エージェントの追加と削除、エージェントリストの走査、リスト上のエージェントの一時停止と通知、Synchronizeイベントの設定と取得といったWaiterList Record上の操作は、そのWaiterList Recordのクリティカルセクションに入ったエージェントによってのみ実行できます。

25.4.3 Atomicsのための抽象操作

25.4.3.1 ValidateIntegerTypedArray ( typedArray, waitable )

The abstract operation ValidateIntegerTypedArray takes arguments typedArray (ECMAScript言語値) and waitable (Boolean) and returns TypedArray With Buffer Witness Recordを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. taRecord を ? ValidateTypedArray(typedArray, unordered) とする。
  2. NOTE: typedArray のバッキングバッファーが拡張可能なSharedArrayBufferである場合、境界チェックは同期操作ではありません。
  3. waitabletrue の場合、
    1. typedArray.[[TypedArrayName]]"Int32Array""BigInt64Array" のいずれでもない場合、TypeError 例外をスローする。
  4. そうでなければ、
    1. typeTypedArrayElementType(typedArray) とする。
    2. IsUnclampedIntegerElementType(type) が false であり、IsBigIntElementType(type) が false である場合、TypeError 例外をスローする。
  5. taRecord を返す。

25.4.3.2 ValidateAtomicAccess ( taRecord, requestIndex )

The abstract operation ValidateAtomicAccess takes arguments taRecord (a TypedArray With Buffer Witness Record) and requestIndex (an ECMAScript language value) and returns either a normal completion containing a non-negative integer or a throw completion. It performs the following steps when called:

  1. lengthTypedArrayLength(taRecord) とする。
  2. accessIndex を ? ToIndex(requestIndex) とする。
  3. Assert: accessIndex ≥ 0 である。
  4. accessIndexlength の場合、RangeError 例外をスローする。
  5. typedArraytaRecord.[[Object]] とする。
  6. elementSizeTypedArrayElementSize(typedArray) とする。
  7. offsettypedArray.[[ByteOffset]] とする。
  8. (accessIndex × elementSize) + offset を返す。

25.4.3.3 ValidateAtomicAccessOnIntegerTypedArray ( typedArray, requestIndex )

The abstract operation ValidateAtomicAccessOnIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and requestIndex (an ECMAScript language value) and returns either a normal completion containing a non-negative integer or a throw completion. It performs the following steps when called:

  1. taRecord を ? ValidateIntegerTypedArray(typedArray, false) とする。
  2. ValidateAtomicAccess(taRecord, requestIndex) を返す。

25.4.3.4 RevalidateAtomicAccess ( typedArray, byteIndexInBuffer )

The abstract operation RevalidateAtomicAccess takes arguments typedArray (a TypedArray) and byteIndexInBuffer (a non-negative integer) and returns either a normal completion containing unused or a throw completion. この操作は、Atomicsメソッドですべての引数強制変換が実行された後、原子的操作のためにバッキングバッファー内のインデックスを再検証します。これは、引数強制変換が任意の副作用を持ち得て、それによりバッファーが範囲外になる可能性があるためです。この操作は、typedArray のバッキングバッファーがSharedArrayBufferである場合にはスローしません。 It performs the following steps when called:

  1. taRecordMakeTypedArrayWithBufferWitnessRecord(typedArray, unordered) とする。
  2. NOTE: typedArray のバッキングバッファーが拡張可能なSharedArrayBufferである場合、境界チェックは同期操作ではありません。
  3. IsTypedArrayOutOfBounds(taRecord) が true の場合、TypeError 例外をスローする。
  4. Assert: byteIndexInBuffertypedArray.[[ByteOffset]] である。
  5. byteIndexInBuffertaRecord.[[CachedBufferByteLength]] の場合、RangeError 例外をスローする。
  6. unused を返す。

25.4.3.5 GetWaiterList ( block, i )

The abstract operation GetWaiterList takes arguments block (Shared Data Block) and i (4で割り切れる非負整数) and returns WaiterList Record. It performs the following steps when called:

  1. Assert: i および i + 3 は block のメモリ内の有効なバイトオフセットである。
  2. ペア (block, i) によって参照されるWaiterList Recordを返す。

25.4.3.6 EnterCriticalSection ( waiterList )

The abstract operation EnterCriticalSection takes argument waiterList (WaiterList Record) and returns unused. It performs the following steps when called:

  1. Assert: 周囲のエージェントはいかなるWaiterList Recordクリティカルセクションにもいない。
  2. waiterListクリティカルセクションにエージェントがいなくなるまで待ち、その後 waiterListクリティカルセクションに入る(他のエージェントが入ることを許さない)。
  3. waiterList.[[MostRecentLeaveEvent]]empty でない場合、
    1. NOTE: 少なくとも一度クリティカルセクションに入った waiterList は、LeaveCriticalSectionによって設定されたSynchronizeイベントを持ちます。
    2. agentRecord を周囲のエージェントのAgent Recordとする。
    3. executionagentRecord.[[CandidateExecution]] とする。
    4. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() であるAgent Events Recordとする。
    5. enterEvent を新しいSynchronizeイベントとする。
    6. enterEventeventsRecord.[[EventList]] に追加する。
    7. (waiterList.[[MostRecentLeaveEvent]], enterEvent) を eventsRecord.[[AgentSynchronizesWith]] に追加する。
  4. unused を返す。

EnterCriticalSectionは、クリティカルセクションに入ろうとするエージェントが別のエージェントがそこから退出するのを待たなければならない場合、競合を持ちます。競合がない場合、EnterCriticalSection呼び出しのFIFO順序は観察可能です。競合がある場合、実装は任意の順序を選択してもよいですが、エージェントを無期限に待たせてはなりません。

25.4.3.7 LeaveCriticalSection ( waiterList )

The abstract operation LeaveCriticalSection takes argument waiterList (WaiterList Record) and returns unused. It performs the following steps when called:

  1. Assert: 周囲のエージェントは waiterListクリティカルセクション内にいる。
  2. agentRecord を周囲のエージェントのAgent Recordとする。
  3. executionagentRecord.[[CandidateExecution]] とする。
  4. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() であるAgent Events Recordとする。
  5. leaveEvent を新しいSynchronizeイベントとする。
  6. leaveEventeventsRecord.[[EventList]] に追加する。
  7. waiterList.[[MostRecentLeaveEvent]]leaveEvent に設定する。
  8. waiterListクリティカルセクションを出る。
  9. unused を返す。

25.4.3.8 AddWaiter ( waiterList, waiterRecord )

The abstract operation AddWaiter takes arguments waiterList (WaiterList Record) and waiterRecord (Waiter Record) and returns unused. It performs the following steps when called:

  1. Assert: 周囲のエージェントは waiterListクリティカルセクション内にいる。
  2. Assert: waiterList.[[Waiters]] 内には、[[PromiseCapability]]フィールドが waiterRecord.[[PromiseCapability]] であり、[[AgentSignifier]]フィールドが waiterRecord.[[AgentSignifier]] であるWaiter Recordは存在しない。
  3. waiterRecordwaiterList.[[Waiters]] に追加する。
  4. unused を返す。

25.4.3.9 RemoveWaiter ( waiterList, waiterRecord )

The abstract operation RemoveWaiter takes arguments waiterList (WaiterList Record) and waiterRecord (Waiter Record) and returns unused. It performs the following steps when called:

  1. Assert: 周囲のエージェントは waiterListクリティカルセクション内にいる。
  2. Assert: waiterList.[[Waiters]]waiterRecord を含む。
  3. waiterRecordwaiterList.[[Waiters]] から削除する。
  4. unused を返す。

25.4.3.10 RemoveWaiters ( waiterList, count )

The abstract operation RemoveWaiters takes arguments waiterList (WaiterList Record) and count (非負整数または +∞) and returns Waiter RecordList. It performs the following steps when called:

  1. Assert: 周囲のエージェントは waiterListクリティカルセクション内にいる。
  2. lenwaiterList.[[Waiters]] 内の要素数とする。
  3. countmin(count, len) に設定する。
  4. waiters を、waiterList.[[Waiters]] の最初の count 個の要素を要素とするListとする。
  5. waiterList.[[Waiters]] の最初の count 個の要素を削除する。
  6. waiters を返す。

25.4.3.11 SuspendThisAgent ( waiterList, waiterRecord )

The abstract operation SuspendThisAgent takes arguments waiterList (WaiterList Record) and waiterRecord (Waiter Record) and returns unused. It performs the following steps when called:

  1. Assert: 周囲のエージェントは waiterListクリティカルセクション内にいる。
  2. Assert: waiterList.[[Waiters]]waiterRecord を含む。
  3. thisAgentAgentSignifier() とする。
  4. Assert: waiterRecord.[[AgentSignifier]]thisAgent である。
  5. Assert: waiterRecord.[[PromiseCapability]]blocking である。
  6. Assert: AgentCanSuspend() は true である。
  7. LeaveCriticalSection(waiterList) を実行し、時刻が waiterRecord.[[TimeoutTime]] になるまで周囲のエージェントを一時停止する。この複合操作は、クリティカルセクションを出た後、一時停止が有効になる前に到着した通知が失われないような方法で実行される。周囲のエージェントは、タイムアウトによって、または別のエージェントが引数 waiterList および thisAgentNotifyWaiterを呼び出すこと(すなわち、Atomics.notifyへの呼び出しを介して)によってのみ、一時停止から復帰できる。
  8. EnterCriticalSection(waiterList) を実行する。
  9. unused を返す。

25.4.3.12 NotifyWaiter ( waiterList, waiterRecord )

The abstract operation NotifyWaiter takes arguments waiterList (WaiterList Record) and waiterRecord (Waiter Record) and returns unused. It performs the following steps when called:

  1. Assert: 周囲のエージェントは waiterListクリティカルセクション内にいる。
  2. waiterRecord.[[PromiseCapability]]blocking の場合、
    1. signifierが waiterRecord.[[AgentSignifier]] であるエージェントを一時停止から起こす。
    2. NOTE: これにより、そのエージェントはSuspendThisAgent内で実行を再開します。
  3. そうでなく AgentSignifier() が waiterRecord.[[AgentSignifier]] である場合、
    1. promiseCapabilitywaiterRecord.[[PromiseCapability]] とする。
    2. Call(promiseCapability.[[Resolve]], undefined, « waiterRecord.[[Result]] ») を実行する。
  4. そうでなければ、
    1. EnqueueResolveInAgentJob(waiterRecord.[[AgentSignifier]], waiterRecord.[[PromiseCapability]], waiterRecord.[[Result]]) を実行する。
  5. unused を返す。
Note

エージェントは、別のエージェントのpromise capabilityに対して、それをホストに渡すことを超えるいかなる形でもアクセスしてはなりません。

25.4.3.13 EnqueueResolveInAgentJob ( agentSignifier, promiseCapability, resolution )

The abstract operation EnqueueResolveInAgentJob takes arguments agentSignifier (エージェントsignifier), promiseCapability (PromiseCapability Record), and resolution ("ok" または "timed-out") and returns unused. It performs the following steps when called:

  1. resolveJob を、agentSignifierpromiseCapability、および resolution を捕捉し、呼び出されたときに次の手順を実行する、パラメーターを持たない新しいJob Abstract Closureとする:
    1. Assert: AgentSignifier() は agentSignifier である。
    2. Call(promiseCapability.[[Resolve]], undefined, « resolution ») を実行する。
    3. unused を返す。
  2. realmInTargetAgent を ! GetFunctionRealm(promiseCapability.[[Resolve]]) とする。
  3. Assert: agentSignifierrealmInTargetAgent.[[AgentSignifier]] である。
  4. HostEnqueueGenericJob(resolveJob, realmInTargetAgent) を実行する。
  5. unused を返す。

25.4.3.14 DoWait ( mode, typedArray, index, value, timeout )

The abstract operation DoWait takes arguments mode (sync または async), typedArray (ECMAScript言語値), index (ECMAScript言語値), value (ECMAScript言語値), and timeout (ECMAScript言語値) and returns Object、"not-equal""timed-out"、または "ok" のいずれかを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. taRecord を ? ValidateIntegerTypedArray(typedArray, true) とする。
  2. buffertaRecord.[[Object]].[[ViewedArrayBuffer]] とする。
  3. IsSharedArrayBuffer(buffer) が false の場合、TypeError 例外をスローする。
  4. byteIndexInBuffer を ? ValidateAtomicAccess(taRecord, index) とする。
  5. arrayTypeNametypedArray.[[TypedArrayName]] とする。
  6. arrayTypeName"BigInt64Array" である場合、expected を ? ToBigInt64(value) とする。
  7. そうでなければ、expected を ? ToInt32(value) とする。
  8. timeoutNumber を ? ToNumber(timeout) とする。
  9. timeoutNumberNaN または +∞𝔽 のいずれかである場合、realTimeout を +∞ とする。
  10. そうでなく timeoutNumber-∞𝔽 である場合、realTimeout を0とする。
  11. そうでなければ、realTimeoutmax((timeoutNumber), 0) とする。
  12. modesync であり、AgentCanSuspend() が false である場合、TypeError 例外をスローする。
  13. blockbuffer.[[ArrayBufferData]] とする。
  14. waiterListGetWaiterList(block, byteIndexInBuffer) とする。
  15. modesync の場合、
    1. promiseCapabilityblocking とする。
    2. resultObjectundefined とする。
  16. そうでなければ、
    1. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
    2. resultObjectOrdinaryObjectCreate(%Object.prototype%) とする。
  17. EnterCriticalSection(waiterList) を実行する。
  18. elementTypeTypedArrayElementType(typedArray) とする。
  19. witnessGetValueFromBuffer(buffer, byteIndexInBuffer, elementType, true, seq-cst) とする。
  20. expectedwitness の場合、
    1. LeaveCriticalSection(waiterList) を実行する。
    2. modesync の場合、"not-equal" を返す。
    3. CreateDataPropertyOrThrow(resultObject, "async", false) を実行する。
    4. CreateDataPropertyOrThrow(resultObject, "value", "not-equal") を実行する。
    5. resultObject を返す。
  21. realTimeout = 0 かつ modeasync である場合、
    1. NOTE: 同期即時タイムアウトには特別な処理はありません。非同期即時タイムアウトは、早く失敗し不要なPromiseジョブを避けるために特別な処理を持ちます。
    2. LeaveCriticalSection(waiterList) を実行する。
    3. CreateDataPropertyOrThrow(resultObject, "async", false) を実行する。
    4. CreateDataPropertyOrThrow(resultObject, "value", "timed-out") を実行する。
    5. resultObject を返す。
  22. thisAgentAgentSignifier() とする。
  23. now を現在時刻を識別する時刻値(UTC)とする。
  24. additionalTimeout を実装定義の非負数学値とする。
  25. timeoutTime(now) + realTimeout + additionalTimeout とする。
  26. NOTE: realTimeout が +∞ の場合、timeoutTime も +∞ です。
  27. waiterRecord を新しいWaiter Record { [[AgentSignifier]]: thisAgent, [[PromiseCapability]]: promiseCapability, [[TimeoutTime]]: timeoutTime, [[Result]]: "ok" } とする。
  28. AddWaiter(waiterList, waiterRecord) を実行する。
  29. modesync の場合、
    1. SuspendThisAgent(waiterList, waiterRecord) を実行する。
  30. そうでなく timeoutTime が有限である場合、
    1. EnqueueAtomicsWaitAsyncTimeoutJob(waiterList, waiterRecord) を実行する。
  31. LeaveCriticalSection(waiterList) を実行する。
  32. modesync の場合、waiterRecord.[[Result]] を返す。
  33. CreateDataPropertyOrThrow(resultObject, "async", true) を実行する。
  34. CreateDataPropertyOrThrow(resultObject, "value", promiseCapability.[[Promise]]) を実行する。
  35. resultObject を返す。
Note

additionalTimeout は、電力消費の削減やタイミング攻撃を緩和するためのタイマー解像度の粗化など、必要に応じて実装がタイムアウトを延長することを可能にします。この値はDoWaitの呼び出しごとに異なってもよいです。

25.4.3.15 EnqueueAtomicsWaitAsyncTimeoutJob ( waiterList, waiterRecord )

The abstract operation EnqueueAtomicsWaitAsyncTimeoutJob takes arguments waiterList (WaiterList Record) and waiterRecord (Waiter Record) and returns unused. It performs the following steps when called:

  1. timeoutJob を、waiterList および waiterRecord を捕捉し、呼び出されたときに次の手順を実行する、パラメーターを持たない新しいJob Abstract Closureとする:
    1. EnterCriticalSection(waiterList) を実行する。
    2. waiterList.[[Waiters]]waiterRecord を含む場合、
      1. timeOfJobExecution を現在時刻を識別する時刻値(UTC)とする。
      2. Assert: (timeOfJobExecution) ≥ waiterRecord.[[TimeoutTime]] である(時刻値の潜在的な非単調性を無視する)。
      3. waiterRecord.[[Result]]"timed-out" に設定する。
      4. RemoveWaiter(waiterList, waiterRecord) を実行する。
      5. NotifyWaiter(waiterList, waiterRecord) を実行する。
    3. LeaveCriticalSection(waiterList) を実行する。
    4. unused を返す。
  2. now を現在時刻を識別する時刻値(UTC)とする。
  3. currentRealm を現在のRealm Recordとする。
  4. HostEnqueueTimeoutJob(timeoutJob, currentRealm, 𝔽(waiterRecord.[[TimeoutTime]]) - now) を実行する。
  5. unused を返す。

25.4.3.16 AtomicCompareExchangeInSharedBlock ( block, byteIndexInBuffer, elementSize, expectedBytes, replacementBytes )

The abstract operation AtomicCompareExchangeInSharedBlock takes arguments block (Shared Data Block), byteIndexInBuffer (整数), elementSize (非負整数), expectedBytes (バイト値のList), and replacementBytes (バイト値のList) and returns バイト値のList. It performs the following steps when called:

  1. agentRecord を周囲のエージェントのAgent Recordとする。
  2. executionagentRecord.[[CandidateExecution]] とする。
  3. eventsRecord を、execution.[[EventsRecords]] のうち [[AgentSignifier]]AgentSignifier() であるAgent Events Recordとする。
  4. rawBytesRead を、要素が非決定的に選択されたバイト値である、長さ elementSizeListとする。
  5. NOTE: 実装では、rawBytesRead は基盤ハードウェア上のload-link、load-exclusive、またはread-modify-write命令のオペランドの結果です。この非決定性は、弱い一貫性を持つハードウェアの観察可能な振る舞いを記述するためのメモリモデルの意味論上の規定です。
  6. NOTE: 期待値と読み取られた値の比較は、期待値が読み取られた値と等しくない場合に不必要に強い同期を避けるため、read-modify-write変更関数の外側で実行されます。
  7. ByteListEqual(rawBytesRead, expectedBytes) が true の場合、
    1. second を、何も捕捉せず、呼び出されたときに次の手順を原子的に実行する、パラメーター (oldBytes, newBytes) を持つ新しいread-modify-write変更関数とする:
      1. newBytes を返す。
    2. eventReadModifyWriteSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndexInBuffer, [[ElementSize]]: elementSize, [[Payload]]: replacementBytes, [[ModifyOp]]: second } とする。
  8. そうでなければ、
    1. eventReadSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndexInBuffer, [[ElementSize]]: elementSize } とする。
  9. eventeventsRecord.[[EventList]] に追加する。
  10. Chosen Value Record { [[Event]]: event, [[ChosenValue]]: rawBytesRead } を execution.[[ChosenValues]] に追加する。
  11. rawBytesRead を返す。

25.4.3.17 AtomicReadModifyWrite ( typedArray, index, value, op )

The abstract operation AtomicReadModifyWrite takes arguments typedArray (ECMAScript言語値), index (ECMAScript言語値), value (ECMAScript言語値), and op (read-modify-write変更関数) and returns NumberまたはBigIntのいずれかを含む正常完了、またはスロー完了のいずれか. op はバイト値のListを2つ引数として取り、バイト値のListを返します。この操作は、値を原子的にロードし、それを別の値と結合し、その結合を格納します。ロードされた値を返します。 It performs the following steps when called:

  1. byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index) とする。
  2. typedArray.[[ContentType]]bigint である場合、coerced を ? ToBigInt(value) とする。
  3. そうでなければ、coerced𝔽(? ToIntegerOrInfinity(value)) とする。
  4. RevalidateAtomicAccess(typedArray, byteIndexInBuffer) を実行する。
  5. buffertypedArray.[[ViewedArrayBuffer]] とする。
  6. elementTypeTypedArrayElementType(typedArray) とする。
  7. GetModifySetValueInBuffer(buffer, byteIndexInBuffer, elementType, coerced, op) を返す。

25.4.3.18 ByteListBitwiseOp ( op, xBytes, yBytes )

The abstract operation ByteListBitwiseOp takes arguments op (&^、または |), xBytes (バイト値のList), and yBytes (バイト値のList) and returns バイト値のList. この操作は、引数のすべてのバイト値に対してビット単位演算を原子的に実行し、バイト値のListを返します。 It performs the following steps when called:

  1. Assert: xBytesyBytes は同じ数の要素を持つ。
  2. result を新しい空のListとする。
  3. i を0とする。
  4. xBytes の各要素 xByte について、次を行う:
    1. yByteyBytes[i] とする。
    2. op& である場合、
      1. resultByte を、xByteyByte にビット単位AND演算を適用した結果とする。
    3. そうでなく op^ である場合、
      1. resultByte を、xByteyByte にビット単位排他的OR(XOR)演算を適用した結果とする。
    4. そうでなければ、
      1. Assert: op| である。
      2. resultByte を、xByteyByte にビット単位包含OR演算を適用した結果とする。
    5. ii + 1 に設定する。
    6. resultByteresult に追加する。
  5. result を返す。

25.4.3.19 ByteListEqual ( xBytes, yBytes )

The abstract operation ByteListEqual takes arguments xBytes (バイト値のList) and yBytes (バイト値のList) and returns Boolean. It performs the following steps when called:

  1. xBytesyBytes が同じ数の要素を持たない場合、false を返す。
  2. i を0とする。
  3. xBytes の各要素 xByte について、次を行う:
    1. yByteyBytes[i] とする。
    2. xByteyByte の場合、false を返す。
    3. ii + 1 に設定する。
  4. true を返す。

25.4.4 Atomics.add ( typedArray, index, value )

この関数は呼び出されたとき、次の手順を実行します:

  1. add を、typedArray を捕捉し、呼び出されたときに次の手順を原子的に実行する、パラメーター (xBytes, yBytes) を持つ新しいread-modify-write変更関数とする:
    1. typeTypedArrayElementType(typedArray) とする。
    2. agentRecord を周囲のエージェントのAgent Recordとする。
    3. isLittleEndianagentRecord.[[LittleEndian]] とする。
    4. xRawBytesToNumeric(type, xBytes, isLittleEndian) とする。
    5. yRawBytesToNumeric(type, yBytes, isLittleEndian) とする。
    6. x がNumberである場合、
      1. sumNumber::add(x, y) とする。
    7. そうでなければ、
      1. Assert: x はBigIntである。
      2. sumBigInt::add(x, y) とする。
    8. sumBytesNumericToRawBytes(type, sum, isLittleEndian) とする。
    9. Assert: sumBytesxBytes、および yBytes は同じ数の要素を持つ。
    10. sumBytes を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, add) を返す。

25.4.5 Atomics.and ( typedArray, index, value )

この関数は呼び出されたとき、次の手順を実行します:

  1. and を、何も捕捉せず、呼び出されたときに次の手順を原子的に実行する、パラメーター (xBytes, yBytes) を持つ新しいread-modify-write変更関数とする:
    1. ByteListBitwiseOp(&, xBytes, yBytes) を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, and) を返す。

25.4.6 Atomics.compareExchange ( typedArray, index, expectedValue, replacementValue )

この関数は呼び出されたとき、次の手順を実行します:

  1. byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index) とする。
  2. buffertypedArray.[[ViewedArrayBuffer]] とする。
  3. blockbuffer.[[ArrayBufferData]] とする。
  4. typedArray.[[ContentType]]bigint である場合、
    1. expected を ? ToBigInt(expectedValue) とする。
    2. replacement を ? ToBigInt(replacementValue) とする。
  5. そうでなければ、
    1. expected𝔽(? ToIntegerOrInfinity(expectedValue)) とする。
    2. replacement𝔽(? ToIntegerOrInfinity(replacementValue)) とする。
  6. RevalidateAtomicAccess(typedArray, byteIndexInBuffer) を実行する。
  7. elementTypeTypedArrayElementType(typedArray) とする。
  8. elementSizeTypedArrayElementSize(typedArray) とする。
  9. agentRecord を周囲のエージェントのAgent Recordとする。
  10. isLittleEndianagentRecord.[[LittleEndian]] とする。
  11. expectedBytesNumericToRawBytes(elementType, expected, isLittleEndian) とする。
  12. replacementBytesNumericToRawBytes(elementType, replacement, isLittleEndian) とする。
  13. IsSharedArrayBuffer(buffer) が true の場合、
    1. rawBytesReadAtomicCompareExchangeInSharedBlock(block, byteIndexInBuffer, elementSize, expectedBytes, replacementBytes) とする。
  14. そうでなければ、
    1. rawBytesRead を、block[byteIndexInBuffer] から始まる elementSize バイトの列を要素とする、長さ elementSizeListとする。
    2. ByteListEqual(rawBytesRead, expectedBytes) が true の場合、
      1. replacementBytes の個々のバイトを、block[byteIndexInBuffer] から始めて block に格納する。
  15. RawBytesToNumeric(elementType, rawBytesRead, isLittleEndian) を返す。

25.4.7 Atomics.exchange ( typedArray, index, value )

この関数は呼び出されたとき、次の手順を実行します:

  1. second を、何も捕捉せず、呼び出されたときに次の手順を原子的に実行する、パラメーター (oldBytes, newBytes) を持つ新しいread-modify-write変更関数とする:
    1. newBytes を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, second) を返す。

25.4.8 Atomics.isLockFree ( size )

この関数は呼び出されたとき、次の手順を実行します:

  1. n を ? ToIntegerOrInfinity(size) とする。
  2. agentRecord を周囲のエージェントのAgent Recordとする。
  3. n = 1 の場合、agentRecord.[[IsLockFree1]] を返す。
  4. n = 2 の場合、agentRecord.[[IsLockFree2]] を返す。
  5. n = 4 の場合、true を返す。
  6. n = 8 の場合、agentRecord.[[IsLockFree8]] を返す。
  7. false を返す。
Note

この関数は最適化プリミティブです。その直感は、サイズ n バイトのデータ上の原子的プリミティブ(compareExchangeloadstoreaddsubandorxor、またはexchange)の原子的手順が、周囲のエージェントがそのデータを構成する n バイトの外側のロックを取得することなしに実行される場合、Atomics.isLockFree(n) は true を返す、というものです。高性能アルゴリズムは、クリティカルセクションでロックまたは原子的操作のどちらを使用するかを決定するためにこの関数を使用します。原子的プリミティブがロックフリーでない場合、アルゴリズムが独自のロックを提供する方がしばしば効率的です。

Atomics.isLockFree(4) は、既知の関連ハードウェアすべてでサポート可能であるため、常に true を返します。これを仮定できることは、一般にプログラムを単純化します。

この関数によって返される値にかかわらず、すべての原子的操作は原子的であることが保証されます。例えば、操作の途中で可視的な操作が発生すること(例えば「tearing」)は決してありません。

25.4.9 Atomics.load ( typedArray, index )

この関数は呼び出されたとき、次の手順を実行します:

  1. byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index) とする。
  2. RevalidateAtomicAccess(typedArray, byteIndexInBuffer) を実行する。
  3. buffertypedArray.[[ViewedArrayBuffer]] とする。
  4. elementTypeTypedArrayElementType(typedArray) とする。
  5. GetValueFromBuffer(buffer, byteIndexInBuffer, elementType, true, seq-cst) を返す。

25.4.10 Atomics.or ( typedArray, index, value )

この関数は呼び出されたとき、次の手順を実行します:

  1. or を、何も捕捉せず、呼び出されたときに次の手順を原子的に実行する、パラメーター (xBytes, yBytes) を持つ新しいread-modify-write変更関数とする:
    1. ByteListBitwiseOp(|, xBytes, yBytes) を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, or) を返す。

25.4.11 Atomics.store ( typedArray, index, value )

この関数は呼び出されたとき、次の手順を実行します:

  1. byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index) とする。
  2. typedArray.[[ContentType]]bigint である場合、coerced を ? ToBigInt(value) とする。
  3. そうでなければ、coerced𝔽(? ToIntegerOrInfinity(value)) とする。
  4. RevalidateAtomicAccess(typedArray, byteIndexInBuffer) を実行する。
  5. buffertypedArray.[[ViewedArrayBuffer]] とする。
  6. elementTypeTypedArrayElementType(typedArray) とする。
  7. SetValueInBuffer(buffer, byteIndexInBuffer, elementType, coerced, true, seq-cst) を実行する。
  8. coerced を返す。

25.4.12 Atomics.sub ( typedArray, index, value )

この関数は呼び出されたとき、次の手順を実行します:

  1. subtract を、typedArray を捕捉し、呼び出されたときに次の手順を原子的に実行する、パラメーター (xBytes, yBytes) を持つ新しいread-modify-write変更関数とする:
    1. typeTypedArrayElementType(typedArray) とする。
    2. agentRecord を周囲のエージェントのAgent Recordとする。
    3. isLittleEndianagentRecord.[[LittleEndian]] とする。
    4. xRawBytesToNumeric(type, xBytes, isLittleEndian) とする。
    5. yRawBytesToNumeric(type, yBytes, isLittleEndian) とする。
    6. x がNumberである場合、
      1. differenceNumber::subtract(x, y) とする。
    7. そうでなければ、
      1. Assert: x はBigIntである。
      2. differenceBigInt::subtract(x, y) とする。
    8. differenceBytesNumericToRawBytes(type, difference, isLittleEndian) とする。
    9. Assert: differenceBytesxBytes、および yBytes は同じ数の要素を持つ。
    10. differenceBytes を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, subtract) を返す。

25.4.13 Atomics.wait ( typedArray, index, value, timeout )

この関数は、周囲のエージェントを待機キューに入れて、通知されるか待機がタイムアウトするまで一時停止し、それらの場合を区別するStringを返します。

呼び出されたとき、次の手順を実行します:

  1. DoWait(sync, typedArray, index, value, timeout) を返す。

25.4.14 Atomics.waitAsync ( typedArray, index, value, timeout )

この関数は、呼び出し元エージェントが通知されるかタイムアウトに到達したときに解決されるPromiseを返します。

呼び出されたとき、次の手順を実行します:

  1. DoWait(async, typedArray, index, value, timeout) を返す。

25.4.15 Atomics.notify ( typedArray, index, count )

この関数は、待機キューで眠っているいくつかのエージェントに通知します。

呼び出されたとき、次の手順を実行します:

  1. taRecord を ? ValidateIntegerTypedArray(typedArray, true) とする。
  2. byteIndexInBuffer を ? ValidateAtomicAccess(taRecord, index) とする。
  3. countundefined の場合、
    1. count を +∞ に設定する。
  4. そうでなければ、
    1. intCount を ? ToIntegerOrInfinity(count) とする。
    2. countmax(intCount, 0) に設定する。
  5. buffertypedArray.[[ViewedArrayBuffer]] とする。
  6. blockbuffer.[[ArrayBufferData]] とする。
  7. IsSharedArrayBuffer(buffer) が false の場合、+0𝔽 を返す。
  8. waiterListGetWaiterList(block, byteIndexInBuffer) とする。
  9. EnterCriticalSection(waiterList) を実行する。
  10. waitersRemoveWaiters(waiterList, count) とする。
  11. waiters の各要素 waiterRecord について、次を行う:
    1. NotifyWaiter(waiterList, waiterRecord) を実行する。
  12. LeaveCriticalSection(waiterList) を実行する。
  13. nwaiters 内の要素数とする。
  14. 𝔽(n) を返す。

25.4.16 Atomics.xor ( typedArray, index, value )

この関数は呼び出されたとき、次の手順を実行します:

  1. xor を、何も捕捉せず、呼び出されたときに次の手順を原子的に実行する、パラメーター (xBytes, yBytes) を持つ新しいread-modify-write変更関数とする:
    1. ByteListBitwiseOp(^, xBytes, yBytes) を返す。
  2. AtomicReadModifyWrite(typedArray, index, value, xor) を返す。

25.4.17 Atomics [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値はString値 "Atomics" です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } です。

25.5 JSONオブジェクト

JSONオブジェクトは:

  • %JSON%である。
  • グローバルオブジェクト"JSON"プロパティの初期値である。
  • 通常のオブジェクトである。
  • JSONテキストを解析および構築するために使用される2つの関数、parsestringifyを含む。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • [[Construct]]内部メソッドを持たない。new演算子と共にコンストラクターとして使用できない。
  • [[Call]]内部メソッドを持たない。関数として呼び出すことができない。

JSONデータ交換形式はECMA-404で定義されています。この仕様で使用されるJSON交換形式は、ECMA-404によって記述されたものと正確に同じです。JSON.parseおよびJSON.stringifyの適合実装は、ECMA-404仕様で記述された正確な交換形式を、その形式に対するいかなる削除または拡張もなしにサポートしなければなりません。

25.5.1 JSON.isRawJSON ( obj )

この関数は呼び出されたとき、次の手順を実行します:

  1. obj がObjectであり、obj[[IsRawJSON]] 内部スロットを持つ場合、true を返す。
  2. 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つの引数(関連付けられたプロパティキー、値、およびコンテキストオブジェクト)で呼び出されます。プロパティが変更されておらず、その値がプリミティブである場合、提供されるコンテキストオブジェクトは、対応するParse Nodeのソーステキストを含む"source"プロパティを持ちます。呼び出しが undefined を返す場合、そのプロパティは削除されます。そうでない場合、そのプロパティは戻り値を使用するように再定義されます。

  1. jsonString を ? ToString(text) とする。
  2. parseResult を ? ParseJSON(jsonString) とする。
  3. unfilteredparseResult.[[Value]] とする。
  4. IsCallable(reviver) が false の場合、unfiltered を返す。
  5. rootOrdinaryObjectCreate(%Object.prototype%) とする。
  6. rootName を空のStringとする。
  7. CreateDataPropertyOrThrow(root, rootName, unfiltered) を実行する。
  8. snapshotCreateJSONParseRecord(parseResult.[[ParseNode]], rootName, unfiltered) とする。
  9. InternalizeJSONProperty(root, rootName, reviver, snapshot) を返す。

この関数の"length"プロパティは 2𝔽 です。

25.5.2.1 ParseJSON ( text )

The abstract operation ParseJSON takes argument text (String) and returns フィールド [[ParseNode]]Parse Node)および [[Value]](ECMAScript言語値)を持つRecordを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. StringToCodePoints(text) がECMA-404で指定される有効なJSONテキストでない場合、SyntaxError 例外をスローする。
  2. scriptString"("text、および ");" の文字列連結とする。
  3. scriptParseText(scriptString, Script) とする。
  4. NOTE: 13.2.5.1 で定義される早期エラー規則は、上記のParseTextの呼び出しについて特別な扱いを持ちます。
  5. Assert: scriptParse Nodeである。
  6. result を ! Evaluation of script とする。
  7. NOTE: 13.2.5.6 で定義されるPropertyDefinitionEvaluation意味論は、上記の評価について特別な扱いを持ちます。
  8. Assert: result はString、Number、Boolean、ArrayLiteralまたはObjectLiteralのいずれかによって定義されるObject、または null のいずれかである。
  9. Record { [[ParseNode]]: script, [[Value]]: result } を返す。

JSON.parseの適合実装がJSON文法を拡張することは許されません。実装が変更または拡張されたJSON交換形式をサポートしたい場合、別の解析関数を定義することによってそうしなければなりません。

Note 1

有効なJSONテキストはECMAScriptのPrimaryExpression構文のサブセットです。手順 1jsonString がそのサブセットに適合することを検証し、手順 8 は評価が適切な型の値を返すことを表明します。

しかし、13.2.5.6 はParseJSON中に異なる振る舞いをするため、同じソーステキストがJSONとしてではなくPrimaryExpressionとして評価された場合、異なる結果を生成する可能性があります。さらに、オブジェクトリテラル内の重複する"__proto__"プロパティに対するEarly ErrorもParseJSON中には適用されないため、文法に一致しているにもかかわらず、ParseJSONによって受け入れられるすべてのテキストがPrimaryExpressionとして有効であるわけではありません。

Note 2

オブジェクト内に重複する名前Stringがある場合、字句的に先行する同じキーの値は上書きされます。

25.5.2.2 JSON Parse Record

JSON Parse Recordとは、JSONテキストから解析された値の初期状態を記述するために使用されるRecord値です。

JSON Parse Recordは、Table 75 に列挙されるフィールドを持ちます。

Table 75: JSON Parse Record Fields
フィールド名 意味
[[ParseNode]] Parse Node コンテキストParse Node
[[Key]] プロパティ名 [[Value]]が関連付けられているプロパティ名。
[[Value]] ECMAScript言語値 [[ParseNode]]の評価によって生成された値。
[[Elements]] JSON Parse RecordList [[Value]]がArrayである場合、これは[[Value]]の要素に対応するJSON Parse Recordを含む。そうでない場合、これは空のListである。
[[Entries]] JSON Parse RecordList [[Value]]が非Array Objectである場合、これは[[Value]]のエントリーに対応するJSON Parse Recordを含む。そうでない場合、これは空のListである。

25.5.2.3 CreateJSONParseRecord ( parseNode, key, val )

The abstract operation CreateJSONParseRecord takes arguments parseNode (Parse Node), key (プロパティ名), and val (ECMAScript言語値) and returns JSON Parse Record. JSONテキストから解析された parseNode と、その評価によって生成された val を再帰的に結合します。 It performs the following steps when called:

  1. typedValNodeShallowestContainedJSONValue(parseNode) とする。
  2. Assert: typedValNodeempty でない。
  3. elements を新しい空のListとする。
  4. entries を新しい空のListとする。
  5. val がObjectである場合、
    1. isArray を ! IsArray(val) とする。
    2. isArraytrue の場合、
      1. Assert: typedValNodeArrayLiteral Parse Nodeである。
      2. contentNodestypedValNodeJSONArrayLiteralContentNodesとする。
      3. lencontentNodes 内の要素数とする。
      4. valLen を ! LengthOfArrayLike(val) とする。
      5. Assert: valLenlen である。
      6. index を0とする。
      7. index < len の間、繰り返す:
        1. propName を ! ToString(𝔽(index)) とする。
        2. elementParseRecordCreateJSONParseRecord(contentNodes[index], propName, ! Get(val, propName)) とする。
        3. elementParseRecordelements に追加する。
        4. indexindex + 1 に設定する。
    3. そうでなければ、
      1. Assert: typedValNodeObjectLiteral Parse Nodeである。
      2. propertyNodestypedValNodePropertyDefinitionNodesとする。
      3. NOTE: val はJSONテキストから生成され変更されていないため、そのすべてのプロパティキーはStringであり、網羅的に列挙されます。
      4. keys を ! EnumerableOwnProperties(val, key) とする。
      5. keys の各String propertyKey について、次を行う:
        1. NOTE: 単一のオブジェクトに対して同じ名前の複数の名前/値ペアを指定するJSONテキスト(例えば {"a":"lost","a":"kept"})の場合、結果のECMAScriptオブジェクトの対応するプロパティの値は、その名前を持つ最後のペアによって指定されます。
        2. propertyDefinitionempty とする。
        3. propertyNodes の各Parse Node propertyNode について、次を行う:
          1. propNamepropertyNodePropNameとする。
          2. propNamepropertyKey である場合、propertyDefinitionpropertyNode に設定する。
        4. Assert: propertyDefinition PropertyDefinition : PropertyName : AssignmentExpression である。
        5. propertyValueNodepropertyDefinitionAssignmentExpression とする。
        6. entryParseRecordCreateJSONParseRecord(propertyValueNode, propertyKey, ! Get(val, propertyKey)) とする。
        7. entryParseRecordentries に追加する。
  6. そうでなければ、
    1. Assert: typedValNodeArrayLiteral Parse Nodeでも ObjectLiteral Parse Nodeでもない。
  7. JSON Parse Record { [[ParseNode]]: typedValNode, [[Key]]: key, [[Value]]: val, [[Elements]]: elements, [[Entries]]: entries } を返す。

25.5.2.4 InternalizeJSONProperty ( holder, name, reviver, parseRecord )

The abstract operation InternalizeJSONProperty takes arguments holder (Object), name (String), reviver (関数オブジェクト), and parseRecord (JSON Parse Recordまたは empty) and returns ECMAScript言語値を含む正常完了またはスロー完了のいずれか.

Note

このアルゴリズムは、[[Delete]]またはCreateDataPropertyのいずれかが false を返しても、意図的に例外をスローしません。

呼び出されたとき、次の手順を実行します:

  1. val を ? Get(holder, name) とする。
  2. contextOrdinaryObjectCreate(%Object.prototype%) とする。
  3. parseRecordJSON Parse Recordであり、SameValue(parseRecord.[[Value]], val) が true である場合、
    1. val がObjectでない場合、
      1. parseNodeparseRecord.[[ParseNode]] とする。
      2. Assert: parseNodeArrayLiteral Parse Nodeでも ObjectLiteral Parse Nodeでもない。
      3. sourceTextparseNode に一致したソーステキストとする。
      4. CreateDataPropertyOrThrow(context, "source", CodePointsToString(sourceText)) を実行する。
    2. elementRecordsparseRecord.[[Elements]] とする。
    3. entryRecordsparseRecord.[[Entries]] とする。
  4. そうでなければ、
    1. elementRecords を新しい空のListとする。
    2. entryRecords を新しい空のListとする。
  5. val がObjectである場合、
    1. isArray を ? IsArray(val) とする。
    2. isArraytrue の場合、
      1. elementRecordsLenelementRecords 内の要素数とする。
      2. len を ? LengthOfArrayLike(val) とする。
      3. index を0とする。
      4. index < len の間、繰り返す:
        1. propertyKey を ! ToString(𝔽(index)) とする。
        2. index < elementRecordsLen の場合、elementRecordelementRecords[index] とする。そうでなければ、elementRecordempty とする。
        3. newElement を ? InternalizeJSONProperty(val, propertyKey, reviver, elementRecord) とする。
        4. newElementundefined である場合、
          1. val.[[Delete]](propertyKey) を実行する。
        5. そうでなければ、
          1. CreateDataProperty(val, propertyKey, newElement) を実行する。
        6. indexindex + 1 に設定する。
    3. そうでなければ、
      1. keys を ? EnumerableOwnProperties(val, key) とする。
      2. keys の各String propertyKey について、次を行う:
        1. entryRecords の要素 entry であって entry.[[Key]]propertyKey であるものが存在する場合、entryRecordentry とする。そうでなければ、entryRecordempty とする。
        2. newElement を ? InternalizeJSONProperty(val, propertyKey, reviver, entryRecord) とする。
        3. newElementundefined である場合、
          1. val.[[Delete]](propertyKey) を実行する。
        4. そうでなければ、
          1. CreateDataProperty(val, propertyKey, newElement) を実行する。
  6. Call(reviver, holder, « name, val, context ») を返す。

25.5.2.5 Static Semantics: ShallowestContainedJSONValue ( root )

The abstract operation ShallowestContainedJSONValue takes argument root (Parse Node) and returns Parse Nodeまたは empty. root を根とする解析木を幅優先探索し、JSON値に対応する非終端記号のインスタンスである最初のノードを返します。そのようなノードが存在しない場合は empty を返します。 It performs the following steps when called:

  1. activeFunc をアクティブな関数オブジェクトとする。
  2. Assert: activeFuncJSON.parse組み込み関数オブジェクトである(JSON.parse を参照)。
  3. types を « NullLiteral, BooleanLiteral, NumericLiteral, StringLiteral, ArrayLiteral, ObjectLiteral, UnaryExpression » とする。
  4. unaryExpressionempty とする。
  5. queue を « root » とする。
  6. queue が空でない間、繰り返す:
    1. candidatequeue の最初の要素とする。
    2. queue から最初の要素を削除する。
    3. queuedChildrenfalse とする。
    4. types の各非終端記号 type について、次を行う:
      1. candidatetype のインスタンスである場合、
        1. NOTE: JSON文法では、numberトークンは負の値を表す場合があります。ECMAScriptでは、否定は単項演算として表され、その中で UnaryExpression- に続く派生 UnaryExpression として解析されます。
        2. typeUnaryExpression である場合、
          1. candidate の親が UnaryExpression Parse Nodeでない場合、unaryExpressioncandidate に設定する。
        3. そうでなく typeNumericLiteral である場合、
          1. Assert: candidateunaryExpression に含まれている。
          2. unaryExpression を返す。
        4. そうでなければ、
          1. candidate を返す。
      2. queuedChildrenfalse であり、candidate が非終端記号のインスタンスであり、かつ candidate Contains typetrue である場合、
        1. children を、candidate の各子ノードを順に含むListとする。
        2. queuequeuechildren のリスト連結に設定する。
        3. queuedChildrentrue に設定する。
  7. empty を返す。

25.5.2.6 Static Semantics: JSONArrayLiteralContentNodes

The syntax-directed operation JSONArrayLiteralContentNodes takes no arguments and returns Parse NodeList. It is defined piecewise over the following productions:

ArrayLiteral : [ Elisionopt ] [ ElementList ] [ ElementList , Elisionopt ]
  1. Assert: Elision は存在しない。
  2. ElementList が存在しない場合、新しい空のListを返す。
  3. ElementListJSONArrayLiteralContentNodesを返す。
ElementList : Elisionopt AssignmentExpression
  1. Assert: Elision は存在しない。
  2. « AssignmentExpression » を返す。
ElementList : ElementList , Elisionopt AssignmentExpression
  1. Assert: Elision は存在しない。
  2. elements を派生 ElementListJSONArrayLiteralContentNodesとする。
  3. elements と « AssignmentExpression » のリスト連結を返す。
ElementList : Elisionopt SpreadElement ElementList , Elisionopt SpreadElement
  1. NOTE: ECMA-404で指定されるJSONテキストは SpreadElement を含みません。
  2. Assert: この手順に到達することは決してない。

25.5.3 JSON.rawJSON ( text )

この関数は、文字列、数値、真偽値、またはnull値の生のJSONテキストを表すオブジェクトを返します。

  1. jsonString を ? ToString(text) とする。
  2. jsonString が空のStringである場合、SyntaxError 例外をスローする。
  3. jsonString の最初のコード単位が、ASCII小文字コード単位(0x0061から0x007Aまで、両端を含む)、ASCII数字コード単位(0x0030から0x0039まで、両端を含む)、0x0022(QUOTATION MARK)、または0x002D(HYPHEN-MINUS)のいずれでもない場合、SyntaxError 例外をスローする。
  4. jsonString の最後のコード単位が、ASCII小文字コード単位(0x0061から0x007Aまで、両端を含む)、ASCII数字コード単位(0x0030から0x0039まで、両端を含む)、または0x0022(QUOTATION MARK)のいずれでもない場合、SyntaxError 例外をスローする。
  5. parseResult を ? ParseJSON(jsonString) とする。
  6. Assert: parseResult.[[Value]] はString、Number、Boolean、または null のいずれかである。
  7. internalSlotsList を « [[IsRawJSON]] » とする。
  8. objOrdinaryObjectCreate(null, internalSlotsList) とする。
  9. CreateDataPropertyOrThrow(obj, "rawJSON", jsonString) を実行する。
  10. SetIntegrityLevel(obj, frozen) を実行する。
  11. 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です。

呼び出されたとき、次の手順を実行します:

  1. stack を新しい空のListとする。
  2. indent を空のStringとする。
  3. propertyListundefined とする。
  4. replacerFunctionundefined とする。
  5. replacer がObjectである場合、
    1. IsCallable(replacer) が true の場合、
      1. replacerFunctionreplacer に設定する。
    2. そうでなければ、
      1. isArray を ? IsArray(replacer) とする。
      2. isArraytrue の場合、
        1. propertyList を新しい空のListに設定する。
        2. len を ? LengthOfArrayLike(replacer) とする。
        3. k を0とする。
        4. k < len の間、繰り返す:
          1. propertyKey を ! ToString(𝔽(k)) とする。
          2. propertyValue を ? Get(replacer, propertyKey) とする。
          3. itemundefined とする。
          4. propertyValue がStringである場合、
            1. itempropertyValue に設定する。
          5. そうでなく propertyValue がNumberである場合、
            1. item を ! ToString(propertyValue) に設定する。
          6. そうでなく propertyValue がObjectである場合、
            1. propertyValue[[StringData]] または [[NumberData]] 内部スロットを持つ場合、item を ? ToString(propertyValue) に設定する。
          7. itemundefined でなく、かつ propertyListitem を含まない場合、
            1. itempropertyList に追加する。
          8. kk + 1 に設定する。
  6. space がObjectである場合、
    1. space[[NumberData]] 内部スロットを持つ場合、
      1. space を ? ToNumber(space) に設定する。
    2. そうでなく space[[StringData]] 内部スロットを持つ場合、
      1. space を ? ToString(space) に設定する。
  7. space がNumberである場合、
    1. spaceMV を ! ToIntegerOrInfinity(space) とする。
    2. spaceMVmin(10, spaceMV) に設定する。
    3. spaceMV < 1 の場合、gap を空のStringとする。そうでなければ、gap をコード単位0x0020(SPACE)が spaceMV 個出現するString値とする。
  8. そうでなく space がStringである場合、
    1. space の長さが10以下である場合、gapspace とする。そうでなければ、gapspace の0から10までの部分文字列とする。
  9. そうでなければ、
    1. gap を空のStringとする。
  10. wrapperOrdinaryObjectCreate(%Object.prototype%) とする。
  11. CreateDataPropertyOrThrow(wrapper, 空のString, value) を実行する。
  12. stateJSON Serialization Record { [[ReplacerFunction]]: replacerFunction, [[Stack]]: stack, [[Indent]]: indent, [[Gap]]: gap, [[PropertyList]]: propertyList } とする。
  13. SerializeJSONProperty(state, 空のString, wrapper) を返す。

この関数の"length"プロパティは 3𝔽 です。

Note 1

JSON構造は任意の深さまで入れ子にできますが、非循環でなければなりません。value が循環構造である、または循環構造を含む場合、この関数は TypeError 例外をスローしなければなりません。これは文字列化できない値の例です:

a = [];
a[0] = a;
my_text = JSON.stringify(a); // これはTypeErrorをスローしなければならない。
Note 2

シンボリックなプリミティブ値は次のようにレンダリングされます:

  • null 値は、JSONテキストではString値 "null" としてレンダリングされる。
  • undefined 値はレンダリングされない。
  • true 値は、JSONテキストではString値 "true" としてレンダリングされる。
  • false 値は、JSONテキストではString値 "false" としてレンダリングされる。
Note 3

String値はQUOTATION MARK(")コード単位で囲まれます。コード単位 " および \\ 接頭辞でエスケープされます。制御文字コード単位は、エスケープシーケンス \uHHHH、またはより短い形式である \b(BACKSPACE)、\f(FORM FEED)、\n(LINE FEED)、\r(CARRIAGE RETURN)、\t(CHARACTER TABULATION)に置き換えられます。

Note 4

有限数はToString(number)を呼び出したかのように文字列化されます。NaN および Infinity は符号にかかわらずString値 "null" として表されます。

Note 5

JSON表現を持たない値(undefined や関数など)はStringを生成しません。代わりに undefined 値を生成します。配列では、これらの値はString値 "null" として表されます。オブジェクトでは、表現不能な値により、そのプロパティは文字列化から除外されます。

Note 6

オブジェクトは、U+007B(LEFT CURLY BRACKET)に続き、0個以上のプロパティをU+002C(COMMA)で区切り、U+007D(RIGHT CURLY BRACKET)で閉じたものとしてレンダリングされます。プロパティは、プロパティ名を表す引用符付きString、U+003A(COLON)、そして文字列化されたプロパティ値からなります。配列は、開始U+005B(LEFT SQUARE BRACKET)に続き、0個以上の値をU+002C(COMMA)で区切り、U+005D(RIGHT SQUARE BRACKET)で閉じたものとしてレンダリングされます。

25.5.4.1 JSON Serialization Record

JSON Serialization Recordとは、JSON形式への直列化を可能にするために使用されるRecord値です。

JSON Serialization Recordは、Table 76 に列挙されるフィールドを持ちます。

Table 76: JSON Serialization Record Fields
フィールド名 意味
[[ReplacerFunction]] 関数オブジェクトまたは undefined オブジェクトプロパティの置換値を供給できる関数(JSON.stringifyの replacer パラメーターから)。
[[PropertyList]] StringのListまたは undefined のいずれか 非配列オブジェクトを直列化するときに含めるプロパティ名(JSON.stringifyの replacer パラメーターから)。
[[Gap]] String インデントの単位(JSON.stringifyの space パラメーターから)。
[[Stack]] ObjectのList 直列化処理中である入れ子のオブジェクトの集合。循環構造を検出するために使用される。
[[Indent]] String 現在のインデント。

25.5.4.2 SerializeJSONProperty ( state, key, holder )

The abstract operation SerializeJSONProperty takes arguments state (JSON Serialization Record), key (String), and holder (Object) and returns Stringまたは undefined のいずれかを含む正常完了、またはスロー完了のいずれか. It performs the following steps when called:

  1. value を ? Get(holder, key) とする。
  2. value が Object または value が BigInt である場合、
    1. toJSON を ? GetV(value, "toJSON") とする。
    2. IsCallable(toJSON) が true である場合、
      1. value を ? Call(toJSON, value, « key ») に設定する。
  3. state.[[ReplacerFunction]]undefined でない場合、
    1. value を ? Call(state.[[ReplacerFunction]], holder, « key, value ») に設定する。
  4. value が Object である場合、
    1. value[[IsRawJSON]] 内部スロットを持つ場合、
      1. rawJSON を ! Get(value, "rawJSON") とする。
      2. Assert: rawJSON は String である。
      3. rawJSON を返す。
    2. value[[NumberData]] 内部スロットを持つ場合、
      1. value を ? ToNumber(value) に設定する。
    3. そうではなく、value[[StringData]] 内部スロットを持つ場合、
      1. value を ? ToString(value) に設定する。
    4. そうではなく、value[[BooleanData]] 内部スロットを持つ場合、
      1. valuevalue.[[BooleanData]] に設定する。
    5. そうではなく、value[[BigIntData]] 内部スロットを持つ場合、
      1. valuevalue.[[BigIntData]] に設定する。
  5. valuenull である場合、"null" を返す。
  6. valuetrue である場合、"true" を返す。
  7. valuefalse である場合、"false" を返す。
  8. value が String である場合、QuoteJSONString(value) を返す。
  9. value が Number である場合、
    1. value が有限である場合、! ToString(value) を返す。
    2. "null" を返す。
  10. value が BigInt である場合、TypeError 例外を投げる。
  11. value が Object であり、IsCallable(value) が false である場合、
    1. isArray を ? IsArray(value) とする。
    2. isArraytrue である場合、
      1. SerializeJSONArray(state, value) を返す。
    3. SerializeJSONObject(state, value) を返す。
  12. undefined を返す。

25.5.4.3 QuoteJSONString ( value )

The abstract operation QuoteJSONString takes argument value (String) and returns String. value を0x0022(QUOTATION MARK)コード単位で囲み、その内部の特定の他のコード単位をエスケープします。この操作は、value6.1.4 で説明されるUTF-16エンコードされたコードポイントの列として解釈します。 It performs the following steps when called:

  1. product を、コード単位0x0022(QUOTATION MARK)のみからなるString値とする。
  2. StringToCodePoints(value) の各コードポイント cp について、次を行う:
    1. cpTable 77 の“Code Point”列に列挙されている場合、
      1. product を、product と、対応する行の“Escape Sequence”列で指定される cp のエスケープシーケンスとの文字列連結に設定する。
    2. そうでなく cp の数値が0x0020(SPACE)未満であるか、または cp が先行サロゲートまたは後続サロゲートと同じ数値を持つ場合、
      1. unit を、数値が cp の数値であるコード単位とする。
      2. product を、productUnicodeEscape(unit) の文字列連結に設定する。
    3. そうでなければ、
      1. product を、productUTF16EncodeCodePoint(cp) の文字列連結に設定する。
  3. product を、product とコード単位0x0022(QUOTATION MARK)の文字列連結に設定する。
  4. product を返す。
Table 77: JSON Single Character Escape Sequences
コードポイント 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 ( constructor )

The abstract operation UnicodeEscape takes argument constructor (コード単位) and returns String. constructor をUnicodeエスケープシーケンスとして表します。 It performs the following steps when called:

  1. nconstructor の数値とする。
  2. Assert: n ≤ 0xFFFF である。
  3. hex を、小文字の16進数として書式化された n のString表現とする。
  4. コード単位0x005C(REVERSE SOLIDUS)、"u"、および StringPad(hex, 4, "0", start) の文字列連結を返す。

25.5.4.5 SerializeJSONObject ( state, value )

The abstract operation SerializeJSONObject takes arguments state (JSON Serialization Record) and value (Object) and returns Stringを含む正常完了またはスロー完了のいずれか. オブジェクトを直列化します。 It performs the following steps when called:

  1. state.[[Stack]]value を含む場合、その構造は循環しているため、TypeError 例外をスローする。
  2. valuestate.[[Stack]] に追加する。
  3. stepBackstate.[[Indent]] とする。
  4. state.[[Indent]]state.[[Indent]]state.[[Gap]] の文字列連結に設定する。
  5. state.[[PropertyList]]undefined でない場合、
    1. keysstate.[[PropertyList]] とする。
  6. そうでなければ、
    1. keys を ? EnumerableOwnProperties(value, key) とする。
  7. partial を新しい空のListとする。
  8. keys の各要素 propertyKey について、次を行う:
    1. strP を ? SerializeJSONProperty(state, propertyKey, value) とする。
    2. strPundefined でない場合、
      1. memberQuoteJSONString(propertyKey) とする。
      2. membermember":" の文字列連結に設定する。
      3. state.[[Gap]] が空のStringでない場合、
        1. membermember とコード単位0x0020(SPACE)の文字列連結に設定する。
      4. membermemberstrP の文字列連結に設定する。
      5. memberpartial に追加する。
  9. partial が空である場合、
    1. final"{}" とする。
  10. そうでなければ、
    1. state.[[Gap]] が空のStringである場合、
      1. properties を、partial のすべての要素Stringを連結し、隣接するStringの各ペアの間をコード単位0x002C(COMMA)で区切って形成されるString値とする。最初のStringの前にも最後のStringの後にもコンマは挿入されない。
      2. final"{"properties、および "}" の文字列連結とする。
    2. そうでなければ、
      1. separator を、コード単位0x002C(COMMA)、コード単位0x000A(LINE FEED)、および state.[[Indent]] の文字列連結とする。
      2. properties を、partial のすべての要素Stringを連結し、隣接するStringの各ペアの間を separator で区切って形成されるString値とする。separator Stringは、最初のStringの前にも最後のStringの後にも挿入されない。
      3. final"{"、コード単位0x000A(LINE FEED)、state.[[Indent]]properties、コード単位0x000A(LINE FEED)、stepBack、および "}" の文字列連結とする。
  11. state.[[Stack]] の最後の要素を削除する。
  12. state.[[Indent]]stepBack に設定する。
  13. final を返す。

25.5.4.6 SerializeJSONArray ( state, value )

The abstract operation SerializeJSONArray takes arguments state (a JSON Serialization Record) and value (an Object) and returns either a normal completion containing a String or a throw completion. 配列を直列化します。 It performs the following steps when called:

  1. state.[[Stack]]value を含む場合、その構造は循環しているため、TypeError 例外をスローする。
  2. valuestate.[[Stack]] に追加する。
  3. stepBackstate.[[Indent]] とする。
  4. state.[[Indent]]state.[[Indent]]state.[[Gap]] の文字列連結に設定する。
  5. partial を新しい空のListとする。
  6. len を ? LengthOfArrayLike(value) とする。
  7. index を0とする。
  8. index < len の間、繰り返す:
    1. strP を ? SerializeJSONProperty(state, ! ToString(𝔽(index)), value) とする。
    2. strPundefined である場合、
      1. "null"partial に追加する。
    3. そうでなければ、
      1. strPpartial に追加する。
    4. indexindex + 1 に設定する。
  9. partial が空である場合、
    1. final"[]" とする。
  10. そうでなければ、
    1. state.[[Gap]] が空のStringである場合、
      1. properties を、partial のすべての要素Stringを連結し、隣接するStringの各ペアの間をコード単位0x002C(COMMA)で区切って形成されるString値とする。最初のStringの前にも最後のStringの後にもコンマは挿入されない。
      2. final"["properties、および "]" の文字列連結とする。
    2. そうでなければ、
      1. separator を、コード単位0x002C(COMMA)、コード単位0x000A(LINE FEED)、および state.[[Indent]] の文字列連結とする。
      2. properties を、partial のすべての要素Stringを連結し、隣接するStringの各ペアの間を separator で区切って形成されるString値とする。separator Stringは、最初のStringの前にも最後のStringの後にも挿入されない。
      3. final"["、コード単位0x000A(LINE FEED)、state.[[Indent]]properties、コード単位0x000A(LINE FEED)、stepBack、および "]" の文字列連結とする。
  11. state.[[Stack]] の最後の要素を削除する。
  12. state.[[Indent]]stepBack に設定する。
  13. final を返す。
Note

配列の表現には、+0𝔽(含む)から array.length(含まない)までの区間内の要素のみが含まれます。キーが配列インデックスでないプロパティは文字列化から除外されます。配列は、開始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 )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. CanBeHeldWeakly(target) が false の場合、TypeError 例外をスローする。
  3. weakRef を ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRef.prototype%", « [[WeakRefTarget]] ») とする。
  4. AddToKeptObjects(target) を実行する。
  5. weakRef.[[WeakRefTarget]]target に設定する。
  6. weakRef を返す。

26.1.2 WeakRefコンストラクターのプロパティ

WeakRefコンストラクターは:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 次のプロパティを持つ:

26.1.2.1 WeakRef.prototype

WeakRef.prototypeの初期値はWeakRefプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

26.1.3 WeakRefプロトタイプオブジェクトのプロパティ

WeakRefプロトタイプオブジェクトは:

  • %WeakRef.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[WeakRefTarget]]内部スロットを持たない。

26.1.3.1 WeakRef.prototype.constructor

WeakRef.prototype.constructorの初期値は %WeakRef% です。

26.1.3.2 WeakRef.prototype.deref ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakRefthis値とする。
  2. RequireInternalSlot(weakRef, [[WeakRefTarget]]) を実行する。
  3. WeakRefDeref(weakRef) を返す。
Note

WeakRefundefined でない target 値を返す場合、この target 値は、ECMAScriptコードの現在の実行が完了するまでガーベジコレクションされるべきではありません。AddToKeptObjects操作は、読み取り一貫性が維持されることを確実にします。

let target = { foo() {} };
let weakRef = new WeakRef(target);

// ... later ...

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 )

The abstract operation WeakRefDeref takes argument weakRef (WeakRef) and returns ECMAScript言語値. It performs the following steps when called:

  1. targetweakRef.[[WeakRefTarget]] とする。
  2. targetempty でない場合、
    1. AddToKeptObjects(target) を実行する。
    2. target を返す。
  3. undefined を返す。
Note

この抽象操作は、livenessを簡潔に定義できるようにするためだけに、WeakRef.prototype.derefとは別に定義されています。

26.1.5 WeakRefインスタンスのプロパティ

WeakRefインスタンスは、WeakRefプロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。WeakRefインスタンスは、[[WeakRefTarget]]内部スロットも持ちます。

26.2 FinalizationRegistryオブジェクト

FinalizationRegistryは、ターゲットオブジェクトおよびシンボルがガーベジコレクションされたときに実行されるクリーンアップ操作の登録および登録解除を管理するオブジェクトです。

26.2.1 FinalizationRegistryコンストラクター

FinalizationRegistryコンストラクターは:

  • %FinalizationRegistry%である。
  • グローバルオブジェクト"FinalizationRegistry"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいFinalizationRegistryを作成して初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローする。
  • クラス定義のextends節の値として使用できる。指定されたFinalizationRegistryの振る舞いを継承しようとするサブクラスコンストラクターは、FinalizationRegistry.prototype組み込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するために、FinalizationRegistryコンストラクターへのsuper呼び出しを含めなければならない。

26.2.1.1 FinalizationRegistry ( cleanupCallback )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. IsCallable(cleanupCallback) が false の場合、TypeError 例外をスローする。
  3. finalizationRegistry を ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationRegistry.prototype%", « [[Realm]], [[CleanupCallback]], [[Cells]] ») とする。
  4. fn をアクティブな関数オブジェクトとする。
  5. finalizationRegistry.[[Realm]]fn.[[Realm]] に設定する。
  6. finalizationRegistry.[[CleanupCallback]]HostMakeJobCallback(cleanupCallback) に設定する。
  7. finalizationRegistry.[[Cells]] を新しい空のListに設定する。
  8. finalizationRegistry を返す。

26.2.2 FinalizationRegistryコンストラクターのプロパティ

FinalizationRegistryコンストラクターは:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 次のプロパティを持つ:

26.2.2.1 FinalizationRegistry.prototype

FinalizationRegistry.prototypeの初期値はFinalizationRegistryプロトタイプオブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } です。

26.2.3 FinalizationRegistryプロトタイプオブジェクトのプロパティ

FinalizationRegistryプロトタイプオブジェクトは:

  • %FinalizationRegistry.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[Cells]]および[[CleanupCallback]]内部スロットを持たない。

26.2.3.1 FinalizationRegistry.prototype.constructor

FinalizationRegistry.prototype.constructorの初期値は %FinalizationRegistry% です。

26.2.3.2 FinalizationRegistry.prototype.register ( target, heldValue [ , unregisterToken ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. finalizationRegistrythis値とする。
  2. RequireInternalSlot(finalizationRegistry, [[Cells]]) を実行する。
  3. CanBeHeldWeakly(target) が false の場合、TypeError 例外をスローする。
  4. SameValue(target, heldValue) が true の場合、TypeError 例外をスローする。
  5. CanBeHeldWeakly(unregisterToken) が false の場合、
    1. unregisterTokenundefined でない場合、TypeError 例外をスローする。
    2. unregisterTokenempty に設定する。
  6. cellRecord { [[WeakRefTarget]]: target, [[HeldValue]]: heldValue, [[UnregisterToken]]: unregisterToken } とする。
  7. cellfinalizationRegistry.[[Cells]] に追加する。
  8. undefined を返す。
Note

この仕様のアルゴリズムおよび定義に基づくと、finalizationRegistry.[[Cells]]cell を含む場合、cell.[[HeldValue]]liveです。しかし、これは必ずしも cell.[[UnregisterToken]] または cell.[[Target]]liveであることを意味しません。例えば、オブジェクト自身をそのunregister tokenとして登録しても、そのオブジェクトを永遠に生かし続けることにはなりません。

26.2.3.3 FinalizationRegistry.prototype.unregister ( unregisterToken )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. finalizationRegistrythis値とする。
  2. RequireInternalSlot(finalizationRegistry, [[Cells]]) を実行する。
  3. CanBeHeldWeakly(unregisterToken) が false の場合、TypeError 例外をスローする。
  4. removedfalse とする。
  5. finalizationRegistry.[[Cells]] の各Record { [[WeakRefTarget]], [[HeldValue]], [[UnregisterToken]] } cell について、次を行う:
    1. cell.[[UnregisterToken]]empty でなく、SameValue(cell.[[UnregisterToken]], unregisterToken) が true である場合、
      1. cellfinalizationRegistry.[[Cells]] から削除する。
      2. removedtrue に設定する。
  6. removed を返す。

26.2.3.4 FinalizationRegistry.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値はString値 "FinalizationRegistry" です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } です。

26.2.4 FinalizationRegistryインスタンスのプロパティ

FinalizationRegistryインスタンスは、FinalizationRegistryプロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。FinalizationRegistryインスタンスは、[[Cells]]および[[CleanupCallback]]内部スロットも持ちます。

27 制御抽象オブジェクト

27.1 反復

27.1.1 共通反復インターフェイス

インターフェイスとは、関連付けられた値が特定の仕様に一致するプロパティキーの集合である。インターフェイスの仕様で記述されているすべてのプロパティを提供する任意のオブジェクトは、そのインターフェイスに適合する。インターフェイスは、個別のオブジェクトによって表されるものではない。任意のインターフェイスに適合する、別々に実装されたオブジェクトは多数存在し得る。個々のオブジェクトは複数のインターフェイスに適合し得る。

27.1.1.1 Iterable インターフェイス

iterable インターフェイスは、Table 78 に記述されるプロパティを含む:

Table 78: Iterable インターフェイスの必須プロパティ
プロパティ 要件
%Symbol.iterator% iterator オブジェクトを返す関数 返されるオブジェクトは iterator インターフェイスに適合しなければならない。

27.1.1.2 Iterator インターフェイス

iterator インターフェイスを実装するオブジェクトは、Table 79 のプロパティを含まなければならない。そのようなオブジェクトは、Table 80 のプロパティも実装してよい。

Table 79: Iterator インターフェイスの必須プロパティ
プロパティ 要件
"next" IteratorResult オブジェクトを返す関数 返されるオブジェクトは IteratorResult インターフェイスに適合しなければならない。iteratornext メソッドへの以前の呼び出しが、"done" プロパティの値が true である IteratorResult オブジェクトを返した場合、そのオブジェクトの next メソッドへの以後のすべての呼び出しも、"done" プロパティの値が true である IteratorResult オブジェクトを返すべきである。ただし、この要件は強制されない。
Note 1

next 関数に引数を渡してもよいが、その解釈と妥当性は対象の iterator に依存する。for-of 文および iterator のその他の一般的な利用者は引数を渡さないため、そのような方法で使用されることを想定する iterator オブジェクトは、引数なしで呼び出されることに対処できるようにしておかなければならない。

Table 80: Iterator インターフェイスのオプションプロパティ
プロパティ 要件
"return" IteratorResult オブジェクトを返す関数 返されるオブジェクトは IteratorResult インターフェイスに適合しなければならない。このメソッドを呼び出すことは、呼び出し元がその iterator に対してこれ以上 next メソッド呼び出しを行う意図がないことを iterator オブジェクトに通知する。返される IteratorResult オブジェクトは通常、値が true である "done" プロパティと、return メソッドの引数として渡された値を持つ "value" プロパティを持つ。ただし、この要件は強制されない。
"throw" IteratorResult オブジェクトを返す関数 返されるオブジェクトは IteratorResult インターフェイスに適合しなければならない。このメソッドを呼び出すことは、呼び出し元がエラー条件を検出したことを iterator オブジェクトに通知する。引数はそのエラー条件を識別するために使用され得、通常は例外オブジェクトである。典型的な応答は、引数として渡された値を throw することである。メソッドが throw しない場合、返される IteratorResult オブジェクトは通常、値が true である "done" プロパティを持つ。
Note 2

通常、これらのメソッドの呼び出し元は、それらを呼び出す前に存在を確認するべきである。for-ofyield*、および配列分割代入を含む特定の ECMAScript 言語機能は、存在確認を行った後にこれらのメソッドを呼び出す。iterable オブジェクトを引数として受け取るほとんどの ECMAScript ライブラリ関数も、それらを条件付きで呼び出す。

27.1.1.3 Async Iterable インターフェイス

async iterable インターフェイスは、Table 81 に記述されるプロパティを含む:

Table 81: Async Iterable インターフェイスの必須プロパティ
プロパティ 要件
%Symbol.asyncIterator% async iterator オブジェクトを返す関数 返されるオブジェクトは async iterator インターフェイスに適合しなければならない。

27.1.1.4 Async Iterator インターフェイス

async iterator インターフェイスを実装するオブジェクトは、Table 82 のプロパティを含まなければならない。そのようなオブジェクトは、Table 83 のプロパティも実装してよい。

Table 82: Async Iterator インターフェイスの必須プロパティ
プロパティ 要件
"next" IteratorResult オブジェクトに対する promise を返す関数

返される promise は、履行されたとき、IteratorResult インターフェイスに適合するオブジェクトで履行されなければならない。async iteratornext メソッドへの以前の呼び出しが、"done" プロパティの値が true である IteratorResult オブジェクトに対する promise を返した場合、そのオブジェクトの next メソッドへの以後のすべての呼び出しも、"done" プロパティの値が true である IteratorResult オブジェクトに対する promise を返すべきである。ただし、この要件は強制されない。

さらに、履行値として機能する IteratorResult オブジェクトは、値が promise(または「thenable」)ではない "value" プロパティを持つべきである。ただし、この要件も強制されない。

Note 1

next 関数に引数を渡してもよいが、その解釈と妥当性は対象の async iterator に依存する。for-await-of 文および async iterator のその他の一般的な利用者は引数を渡さないため、そのような方法で使用されることを想定する async iterator オブジェクトは、引数なしで呼び出されることに対処できるようにしておかなければならない。

Table 83: Async Iterator インターフェイスのオプションプロパティ
プロパティ 要件
"return" IteratorResult オブジェクトに対する promise を返す関数

返される promise は、履行されたとき、IteratorResult インターフェイスに適合するオブジェクトで履行されなければならない。このメソッドを呼び出すことは、呼び出し元がその async iterator に対してこれ以上 next メソッド呼び出しを行う意図がないことを async iterator オブジェクトに通知する。返される promise は、通常、値が true である "done" プロパティと、return メソッドの引数として渡された値を持つ "value" プロパティを持つ IteratorResult オブジェクトで履行される。ただし、この要件は強制されない。

さらに、履行値として機能する IteratorResult オブジェクトは、値が promise(または「thenable」)ではない "value" プロパティを持つべきである。引数値が典型的な方法で使用される場合、それが拒否された promise であれば、同じ理由で拒否された promise が返されるべきであり、それが履行された promise であれば、その履行値が返される promise の IteratorResult オブジェクト履行値の "value" プロパティとして使用されるべきである。ただし、これらの要件も強制されない。

"throw" IteratorResult オブジェクトに対する promise を返す関数

返される promise は、履行されたとき、IteratorResult インターフェイスに適合するオブジェクトで履行されなければならない。このメソッドを呼び出すことは、呼び出し元がエラー条件を検出したことを async iterator オブジェクトに通知する。引数はそのエラー条件を識別するために使用され得、通常は例外オブジェクトである。典型的な応答は、引数として渡された値で拒否される拒否済み promise を返すことである。

返される promise が履行された場合、IteratorResult オブジェクト履行値は通常、値が true である "done" プロパティを持つ。さらに、それは値が promise(または「thenable」)ではない "value" プロパティを持つべきであるが、この要件は強制されない。

Note 2

通常、これらのメソッドの呼び出し元は、それらを呼び出す前に存在を確認するべきである。for-await-of および yield* を含む特定の ECMAScript 言語機能は、存在確認を行った後にこれらのメソッドを呼び出す。

27.1.1.5 IteratorResult インターフェイス

IteratorResult インターフェイスは、Table 84 に列挙されるプロパティを含む:

Table 84: IteratorResult インターフェイスプロパティ
プロパティ 要件
"done" Boolean これは iteratornext メソッド呼び出しの結果状態である。iterator の終端に到達した場合、"done"true である。終端に到達していない場合、"done"false であり、値が利用可能である。"done" プロパティ(独自または継承)が存在しない場合、それは値 false を持つとみなされる。
"value" ECMAScript 言語値 done が false であれば、これは現在の反復要素値である。done が true であれば、これは iterator が提供した場合の iterator の return 値である。iterator が return 値を持たない場合、"value"undefined である。その場合、適合するオブジェクトが明示的な "value" プロパティを継承していなければ、"value" プロパティは存在しなくてもよい。

27.1.2 Iterator Helper オブジェクト

Iterator Helper オブジェクトは、特定のソース iterator オブジェクトの遅延変換を表す通常のオブジェクトである。Iterator Helper オブジェクト用の名前付きコンストラクターは存在しない。代わりに、Iterator Helper オブジェクトは Iterator インスタンスオブジェクトの特定のメソッドを呼び出すことによって作成される。

27.1.2.1 %IteratorHelperPrototype% オブジェクト

%IteratorHelperPrototype% オブジェクト:

27.1.2.1.1 %IteratorHelperPrototype%.next ( )

  1. GeneratorResume(this value, undefined, "Iterator Helper") を返す。

27.1.2.1.2 %IteratorHelperPrototype%.return ( )

  1. objthis value とする。
  2. RequireInternalSlot(obj, [[UnderlyingIterators]]) を実行する。
  3. Assert: obj[[GeneratorState]] 内部スロットを持つ。
  4. obj.[[GeneratorState]]suspended-start であるならば、
    1. obj.[[GeneratorState]]completed に設定する。
    2. NOTE: generator が completed 状態に入ると、それは二度とその状態を離れず、関連付けられた実行コンテキストは二度と再開されない。この時点で、obj に関連付けられた任意の実行状態は破棄できる。
    3. IteratorCloseAll(obj.[[UnderlyingIterators]], NormalCompletion(unused)) を実行する。
    4. CreateIteratorResultObject(undefined, true) を返す。
  5. completionReturnCompletion(undefined) とする。
  6. 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 ( )

この関数は、呼び出されたとき次の手順を実行する:

  1. NewTarget が undefined またはアクティブな関数オブジェクトのいずれかであれば、TypeError 例外を投げる。
  2. OrdinaryCreateFromConstructor(NewTarget, "%Iterator.prototype%") を返す。

27.1.3.2 Iterator コンストラクターのプロパティ

Iterator コンストラクター:

  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持つ。
  • 次のプロパティを持つ:

27.1.3.2.1 Iterator.concat ( ...items )

  1. iterables を新しい空の List とする。
  2. items の各要素 item について、次を行う:
    1. item が Object でなければ、TypeError 例外を投げる。
    2. method を ? GetMethod(item, %Symbol.iterator%) とする。
    3. methodundefined ならば、TypeError 例外を投げる。
    4. Record { [[OpenMethod]]: method, [[Iterable]]: item } を iterables に追加する。
  3. closure を、iterables をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. iterables の各 Record iterable について、次を行う:
      1. iter を ? Call(iterable.[[OpenMethod]], iterable.[[Iterable]]) とする。
      2. iter が Object でなければ、TypeError 例外を投げる。
      3. iteratorRecord を ? GetIteratorDirect(iter) とする。
      4. innerAlivetrue とする。
      5. innerAlivetrue である間、繰り返す:
        1. innerValue を ? IteratorStepValue(iteratorRecord) とする。
        2. innerValuedone であれば、
          1. innerAlivefalse に設定する。
        3. そうでなければ、
          1. completionCompletion(Yield(innerValue)) とする。
          2. completionabrupt completion であれば、
            1. IteratorClose(iteratorRecord, completion) を返す。
    2. ReturnCompletion(undefined) を返す。
  4. genCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  5. gen.[[UnderlyingIterators]] を新しい空の List に設定する。
  6. gen を返す。

27.1.3.2.2 Iterator.from ( obj )

  1. iteratorRecord を ? GetIteratorFlattenable(obj, iterate-string-primitives) とする。
  2. hasInstance を ? OrdinaryHasInstance(%Iterator%, iteratorRecord.[[Iterator]]) とする。
  3. hasInstancetrue ならば、
    1. iteratorRecord.[[Iterator]] を返す。
  4. wrapperOrdinaryObjectCreate(%WrapForValidIteratorPrototype%, « [[Iterated]] ») とする。
  5. wrapper.[[Iterated]]iteratorRecord に設定する。
  6. wrapper を返す。

27.1.3.2.2.1 %WrapForValidIteratorPrototype% オブジェクト

%WrapForValidIteratorPrototype% オブジェクト:

  • 通常のオブジェクトである。
  • 値が %Iterator.prototype% である [[Prototype]] 内部スロットを持つ。

27.1.3.2.2.1.1 %WrapForValidIteratorPrototype%.next ( )

  1. objthis value とする。
  2. RequireInternalSlot(obj, [[Iterated]]) を実行する。
  3. iteratorRecordobj.[[Iterated]] とする。
  4. Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]) を返す。

27.1.3.2.2.1.2 %WrapForValidIteratorPrototype%.return ( )

  1. objthis value とする。
  2. RequireInternalSlot(obj, [[Iterated]]) を実行する。
  3. iteratorobj.[[Iterated]].[[Iterator]] とする。
  4. Assert: iterator は Object である。
  5. returnMethod を ? GetMethod(iterator, "return") とする。
  6. returnMethodundefined ならば、
    1. CreateIteratorResultObject(undefined, true) を返す。
  7. Call(returnMethod, iterator) を返す。

27.1.3.2.3 Iterator.prototype

Iterator.prototype の初期値は Iterator プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

27.1.3.3 Iterator プロトタイプオブジェクトのプロパティ

Iterator プロトタイプオブジェクト

  • %Iterator.prototype% である。
  • 値が %Object.prototype% である [[Prototype]] 内部スロットを持つ。
  • 通常のオブジェクトである。
Note

この仕様で定義され、iterator インターフェイスを実装するすべてのオブジェクトも %Iterator.prototype% から継承する。ECMAScript コードは、%Iterator.prototype% から継承するオブジェクトを定義することもできる。%Iterator.prototype% は、すべての iterator オブジェクトに適用可能な追加メソッドを追加できる場所を提供する。

次の式は、ECMAScript コードが %Iterator.prototype% オブジェクトにアクセスできる方法の一つである:

Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))

27.1.3.3.1 Iterator.prototype.constructor

Iterator.prototype.constructor は、属性 { [[Enumerable]]: false, [[Configurable]]: true } を持つ accessor プロパティである。[[Get]] 属性と [[Set]] 属性は次のように定義される:

27.1.3.3.1.1 get Iterator.prototype.constructor

[[Get]] 属性の値は、引数を必要としない built-in 関数である。呼び出されたとき、次の手順を実行する:

  1. %Iterator% を返す。

27.1.3.3.1.2 set Iterator.prototype.constructor

[[Set]] 属性の値は、引数 v を取る built-in 関数である。呼び出されたとき、次の手順を実行する:

  1. SetterThatIgnoresPrototypeProperties(this value, %Iterator.prototype%, "constructor", v) を実行する。
  2. undefined を返す。
Note

ほとんどの built-in プロトタイプ上の "constructor" プロパティとは異なり、web 互換性の理由により、このプロパティは accessor でなければならない。

27.1.3.3.2 Iterator.prototype.drop ( limit )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. numLimitCompletion(ToNumber(limit)) とする。
  5. IfAbruptCloseIterator(numLimit, iterated)。
  6. numLimitNaN ならば、
    1. errorThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  7. integerLimit を ! ToIntegerOrInfinity(numLimit) とする。
  8. integerLimit < 0 ならば、
    1. errorThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  9. iterated を ? GetIteratorDirect(obj) に設定する。
  10. closure を、iteratedintegerLimit をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. remainingintegerLimit とする。
    2. remaining > 0 である間、繰り返す:
      1. remaining ≠ +∞ ならば、
        1. remainingremaining - 1 に設定する。
      2. next を ? IteratorStep(iterated) とする。
      3. nextdone ならば、ReturnCompletion(undefined) を返す。
    3. 繰り返す:
      1. value を ? IteratorStepValue(iterated) とする。
      2. valuedone ならば、ReturnCompletion(undefined) を返す。
      3. completionCompletion(Yield(value)) とする。
      4. IfAbruptCloseIterator(completion, iterated)。
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  12. result.[[UnderlyingIterators]] を « iterated » に設定する。
  13. result を返す。

27.1.3.3.3 Iterator.prototype.every ( predicate )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(predicate) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. counter を 0 とする。
  7. 繰り返す:
    1. value を ? IteratorStepValue(iterated) とする。
    2. valuedone ならば、true を返す。
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. ToBoolean(result) が false ならば、? IteratorClose(iterated, NormalCompletion(false)) を返す。
    6. countercounter + 1 に設定する。

27.1.3.3.4 Iterator.prototype.filter ( predicate )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(predicate) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. closure を、iteratedpredicate をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. counter を 0 とする。
    2. 繰り返す:
      1. value を ? IteratorStepValue(iterated) とする。
      2. valuedone ならば、ReturnCompletion(undefined) を返す。
      3. selectedCompletion(Call(predicate, undefined, « value, 𝔽(counter) »)) とする。
      4. IfAbruptCloseIterator(selected, iterated)。
      5. ToBoolean(selected) が true ならば、
        1. completionCompletion(Yield(value)) とする。
        2. IfAbruptCloseIterator(completion, iterated)。
      6. countercounter + 1 に設定する。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  8. result.[[UnderlyingIterators]] を « iterated » に設定する。
  9. result を返す。

27.1.3.3.5 Iterator.prototype.find ( predicate )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(predicate) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. counter を 0 とする。
  7. 繰り返す:
    1. value を ? IteratorStepValue(iterated) とする。
    2. valuedone ならば、undefined を返す。
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. ToBoolean(result) が true ならば、? IteratorClose(iterated, NormalCompletion(value)) を返す。
    6. countercounter + 1 に設定する。

27.1.3.3.6 Iterator.prototype.flatMap ( mapper )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(mapper) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. closure を、iteratedmapper をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. counter を 0 とする。
    2. 繰り返す:
      1. value を ? IteratorStepValue(iterated) とする。
      2. valuedone ならば、ReturnCompletion(undefined) を返す。
      3. mappedCompletion(Call(mapper, undefined, « value, 𝔽(counter) »)) とする。
      4. IfAbruptCloseIterator(mapped, iterated)。
      5. innerIteratorCompletion(GetIteratorFlattenable(mapped, reject-primitives)) とする。
      6. IfAbruptCloseIterator(innerIterator, iterated)。
      7. innerAlivetrue とする。
      8. innerAlivetrue である間、繰り返す:
        1. innerValueCompletion(IteratorStepValue(innerIterator)) とする。
        2. IfAbruptCloseIterator(innerValue, iterated)。
        3. innerValuedone であれば、
          1. innerAlivefalse に設定する。
        4. そうでなければ、
          1. completionCompletion(Yield(innerValue)) とする。
          2. completionabrupt completion であれば、
            1. backupCompletionCompletion(IteratorClose(innerIterator, completion)) とする。
            2. IfAbruptCloseIterator(backupCompletion, iterated)。
            3. IteratorClose(iterated, completion) を返す。
      9. countercounter + 1 に設定する。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  8. result.[[UnderlyingIterators]] を « iterated » に設定する。
  9. result を返す。

27.1.3.3.7 Iterator.prototype.forEach ( procedure )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(procedure) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. counter を 0 とする。
  7. 繰り返す:
    1. value を ? IteratorStepValue(iterated) とする。
    2. valuedone ならば、undefined を返す。
    3. resultCompletion(Call(procedure, undefined, « value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. countercounter + 1 に設定する。

27.1.3.3.8 Iterator.prototype.map ( mapper )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(mapper) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. closure を、iteratedmapper をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. counter を 0 とする。
    2. 繰り返す:
      1. value を ? IteratorStepValue(iterated) とする。
      2. valuedone ならば、ReturnCompletion(undefined) を返す。
      3. mappedCompletion(Call(mapper, undefined, « value, 𝔽(counter) »)) とする。
      4. IfAbruptCloseIterator(mapped, iterated)。
      5. completionCompletion(Yield(mapped)) とする。
      6. IfAbruptCloseIterator(completion, iterated)。
      7. countercounter + 1 に設定する。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  8. result.[[UnderlyingIterators]] を « iterated » に設定する。
  9. result を返す。

27.1.3.3.9 Iterator.prototype.reduce ( reducer [ , initialValue ] )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(reducer) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. initialValue が存在しないならば、
    1. accumulator を ? IteratorStepValue(iterated) とする。
    2. accumulatordone ならば、TypeError 例外を投げる。
    3. counter を 1 とする。
  7. そうでなければ、
    1. accumulatorinitialValue とする。
    2. counter を 0 とする。
  8. 繰り返す:
    1. value を ? IteratorStepValue(iterated) とする。
    2. valuedone ならば、accumulator を返す。
    3. resultCompletion(Call(reducer, undefined, « accumulator, value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. accumulatorresult に設定する。
    6. countercounter + 1 に設定する。

27.1.3.3.10 Iterator.prototype.some ( predicate )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(predicate) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. counter を 0 とする。
  7. 繰り返す:
    1. value を ? IteratorStepValue(iterated) とする。
    2. valuedone ならば、false を返す。
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. ToBoolean(result) が true ならば、? IteratorClose(iterated, NormalCompletion(true)) を返す。
    6. countercounter + 1 に設定する。

27.1.3.3.11 Iterator.prototype.take ( limit )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. numLimitCompletion(ToNumber(limit)) とする。
  5. IfAbruptCloseIterator(numLimit, iterated)。
  6. numLimitNaN ならば、
    1. errorThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  7. integerLimit を ! ToIntegerOrInfinity(numLimit) とする。
  8. integerLimit < 0 ならば、
    1. errorThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  9. iterated を ? GetIteratorDirect(obj) に設定する。
  10. closure を、iteratedintegerLimit をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. remainingintegerLimit とする。
    2. 繰り返す:
      1. remaining = 0 ならば、
        1. IteratorClose(iterated, ReturnCompletion(undefined)) を返す。
      2. remaining ≠ +∞ ならば、
        1. remainingremaining - 1 に設定する。
      3. value を ? IteratorStepValue(iterated) とする。
      4. valuedone ならば、ReturnCompletion(undefined) を返す。
      5. completionCompletion(Yield(value)) とする。
      6. IfAbruptCloseIterator(completion, iterated)。
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  12. result.[[UnderlyingIterators]] を « iterated » に設定する。
  13. result を返す。

27.1.3.3.12 Iterator.prototype.toArray ( )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iterated を ? GetIteratorDirect(obj) とする。
  4. items を新しい空の List とする。
  5. 繰り返す:
    1. value を ? IteratorStepValue(iterated) とする。
    2. valuedone ならば、CreateArrayFromList(items) を返す。
    3. valueitems に追加する。

27.1.3.3.13 Iterator.prototype [ %Symbol.iterator% ] ( )

この関数は、呼び出されたとき次の手順を実行する:

  1. this value を返す。

この関数の "name" プロパティの値は "[Symbol.iterator]" である。

27.1.3.3.14 Iterator.prototype [ %Symbol.toStringTag% ]

Iterator.prototype[%Symbol.toStringTag%] は、属性 { [[Enumerable]]: false, [[Configurable]]: true } を持つ accessor プロパティである。[[Get]] 属性と [[Set]] 属性は次のように定義される:

27.1.3.3.14.1 get Iterator.prototype [ %Symbol.toStringTag% ]

[[Get]] 属性の値は、引数を必要としない built-in 関数である。呼び出されたとき、次の手順を実行する:

  1. "Iterator" を返す。

27.1.3.3.14.2 set Iterator.prototype [ %Symbol.toStringTag% ]

[[Set]] 属性の値は、引数 v を取る built-in 関数である。呼び出されたとき、次の手順を実行する:

  1. SetterThatIgnoresPrototypeProperties(this value, %Iterator.prototype%, %Symbol.toStringTag%, v) を実行する。
  2. undefined を返す。
Note

ほとんどの built-in プロトタイプ上の %Symbol.toStringTag% プロパティとは異なり、web 互換性の理由により、このプロパティは accessor でなければならない。

27.1.4 %AsyncIteratorPrototype% オブジェクト

%AsyncIteratorPrototype% オブジェクト:

  • 値が %Object.prototype% である [[Prototype]] 内部スロットを持つ。
  • 通常のオブジェクトである。
Note

この仕様で定義され、async iterator インターフェイスを実装するすべてのオブジェクトも %AsyncIteratorPrototype% から継承する。ECMAScript コードは、%AsyncIteratorPrototype% から継承するオブジェクトを定義することもできる。%AsyncIteratorPrototype% オブジェクトは、すべての async iterator オブジェクトに適用可能な追加メソッドを追加できる場所を提供する。

27.1.4.1 %AsyncIteratorPrototype% [ %Symbol.asyncIterator% ] ( )

この関数は、呼び出されたとき次の手順を実行する:

  1. this value を返す。

この関数の "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 )

The abstract operation CreateAsyncFromSyncIterator takes argument syncIteratorRecord (Iterator Record) and returns Iterator Record. これは、同期 Iterator Record から async Iterator Record を作成するために使用される。 It performs the following steps when called:

  1. asyncIteratorOrdinaryObjectCreate(%AsyncFromSyncIteratorPrototype%, « [[SyncIteratorRecord]] ») とする。
  2. asyncIterator.[[SyncIteratorRecord]]syncIteratorRecord に設定する。
  3. nextMethod を ! Get(asyncIterator, "next") とする。
  4. iteratorRecordIterator Record { [[Iterator]]: asyncIterator, [[NextMethod]]: nextMethod, [[Done]]: false } とする。
  5. iteratorRecord を返す。

27.1.5.2 %AsyncFromSyncIteratorPrototype% オブジェクト

%AsyncFromSyncIteratorPrototype% オブジェクト:

  • すべての Async-from-Sync Iterator オブジェクトによって継承されるプロパティを持つ。
  • 通常のオブジェクトである。
  • 値が %AsyncIteratorPrototype% である [[Prototype]] 内部スロットを持つ。
  • ECMAScript コードから直接アクセスされることは決してない。
  • 次のプロパティを持つ:

27.1.5.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )

  1. objthis value とする。
  2. Assert: obj[[SyncIteratorRecord]] 内部スロットを持つ Object である。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordobj.[[SyncIteratorRecord]] とする。
  5. value が存在するならば、
    1. resultCompletion(IteratorNext(syncIteratorRecord, value)) とする。
  6. そうでなければ、
    1. resultCompletion(IteratorNext(syncIteratorRecord)) とする。
  7. IfAbruptRejectPromise(result, promiseCapability)。
  8. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true) を返す。

27.1.5.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )

  1. objthis value とする。
  2. Assert: obj[[SyncIteratorRecord]] 内部スロットを持つ Object である。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordobj.[[SyncIteratorRecord]] とする。
  5. syncIteratorsyncIteratorRecord.[[Iterator]] とする。
  6. returnCompletion(GetMethod(syncIterator, "return")) とする。
  7. IfAbruptRejectPromise(return, promiseCapability)。
  8. returnundefined ならば、
    1. iteratorResultCreateIteratorResultObject(value, true) とする。
    2. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») を実行する。
    3. promiseCapability.[[Promise]] を返す。
  9. value が存在するならば、
    1. resultCompletion(Call(return, syncIterator, « value »)) とする。
  10. そうでなければ、
    1. resultCompletion(Call(return, syncIterator)) とする。
  11. IfAbruptRejectPromise(result, promiseCapability)。
  12. result が Object でないならば、
    1. Call(promiseCapability.[[Reject]], undefined, « 新しく作成された TypeError オブジェクト ») を実行する。
    2. promiseCapability.[[Promise]] を返す。
  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, false) を返す。

27.1.5.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [ value ] )

Note
この仕様では、value は常に提供されるが、%AsyncFromSyncIteratorPrototype%.return ( [ value ] ) との一貫性のためにオプションのままにされている。
  1. objthis value とする。
  2. Assert: obj[[SyncIteratorRecord]] 内部スロットを持つ Object である。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordobj.[[SyncIteratorRecord]] とする。
  5. syncIteratorsyncIteratorRecord.[[Iterator]] とする。
  6. throwCompletion(GetMethod(syncIterator, "throw")) とする。
  7. IfAbruptRejectPromise(throw, promiseCapability)。
  8. throwundefined ならば、
    1. NOTE: syncIteratorthrow メソッドを持たない場合、capability を拒否する前にクリーンアップする機会を与えるためにそれを閉じる。
    2. closeCompletionNormalCompletion(empty) とする。
    3. resultCompletion(IteratorClose(syncIteratorRecord, closeCompletion)) とする。
    4. IfAbruptRejectPromise(result, promiseCapability)。
    5. NOTE: 次の手順は、プロトコル違反があったこと、すなわち syncIteratorthrow メソッドを持たないことを示すために TypeError を投げる。
    6. NOTE: syncIterator を閉じることが throw しない場合、その操作の結果は、たとえ拒否された promise を生成しても無視される。
    7. Call(promiseCapability.[[Reject]], undefined, « 新しく作成された TypeError オブジェクト ») を実行する。
    8. promiseCapability.[[Promise]] を返す。
  9. value が存在するならば、
    1. resultCompletion(Call(throw, syncIterator, « value »)) とする。
  10. そうでなければ、
    1. resultCompletion(Call(throw, syncIterator)) とする。
  11. IfAbruptRejectPromise(result, promiseCapability)。
  12. result が Object でないならば、
    1. Call(promiseCapability.[[Reject]], undefined, « 新しく作成された TypeError オブジェクト ») を実行する。
    2. promiseCapability.[[Promise]] を返す。
  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true) を返す。

27.1.5.3 Async-from-Sync Iterator インスタンスのプロパティ

Async-from-Sync Iterator インスタンスは、%AsyncFromSyncIteratorPrototype% intrinsic オブジェクトからプロパティを継承する通常のオブジェクトである。Async-from-Sync Iterator インスタンスは、Table 85 に列挙される内部スロットを持って最初に作成される。

Table 85: Async-from-Sync Iterator インスタンスの内部スロット
内部スロット 説明
[[SyncIteratorRecord]] Iterator Record 適応されている元の同期 iterator を表す。

27.1.5.4 AsyncFromSyncIteratorContinuation ( result, promiseCapability, syncIteratorRecord, closeOnRejection )

The abstract operation AsyncFromSyncIteratorContinuation takes arguments result (Object), promiseCapability (intrinsic %Promise% 用の PromiseCapability Record), syncIteratorRecord (Iterator Record), and closeOnRejection (Boolean) and returns Promise. It performs the following steps when called:

  1. NOTE: promiseCapability は intrinsic %Promise% から導出されるため、以下の IfAbruptRejectPromise の使用によって伴われる promiseCapability.[[Reject]] への呼び出しは throw しないことが保証される。
  2. doneCompletion(IteratorComplete(result)) とする。
  3. IfAbruptRejectPromise(done, promiseCapability)。
  4. valueCompletion(IteratorValue(result)) とする。
  5. IfAbruptRejectPromise(value, promiseCapability)。
  6. valueWrapperCompletion(PromiseResolve(%Promise%, value)) とする。
  7. valueWrapperabrupt completion であり、donefalse であり、かつ closeOnRejectiontrue であるならば、
    1. valueWrapperCompletion(IteratorClose(syncIteratorRecord, valueWrapper)) に設定する。
  8. IfAbruptRejectPromise(valueWrapper, promiseCapability)。
  9. unwrap を、done をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (v) を持つ新しい Abstract Closure とする:
    1. CreateIteratorResultObject(v, done) を返す。
  10. onFulfilledCreateBuiltinFunction(unwrap, 1, "", « ») とする。
  11. NOTE: onFulfilled は、IteratorResult オブジェクトの "value" プロパティを処理する際、その値が promise である場合にその値を待機し、その結果を新しい「unwrapped」IteratorResult オブジェクトに再パッケージ化するために使用される。
  12. donetrue または closeOnRejectionfalse ならば、
    1. onRejectedundefined とする。
  13. そうでなければ、
    1. closeIterator を、syncIteratorRecord をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (error) を持つ新しい Abstract Closure とする:
      1. IteratorClose(syncIteratorRecord, ThrowCompletion(error)) を返す。
    2. onRejectedCreateBuiltinFunction(closeIterator, 1, "", « ») とする。
    3. NOTE: onRejected は、IteratorResult オブジェクトが生成するその "value" プロパティが拒否された promise である場合に Iterator を閉じるために使用される。
  14. PerformPromiseThen(valueWrapper, onFulfilled, onRejected, promiseCapability) を実行する。
  15. promiseCapability.[[Promise]] を返す。

27.2 Promise オブジェクト

Promise は、遅延された(かつ非同期である可能性のある)計算の最終的な結果のプレースホルダーとして使用されるオブジェクトである。

任意の Promise は、相互に排他的な 3 つの状態、すなわち fulfilledrejected、および 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 の状態に一致するように「locked in」されている場合、resolved である。resolved promise を resolve または reject しようとしても効果はない。promise は、resolved でなければ unresolved である。unresolved promise は常に pending 状態にある。resolved promise は pending、fulfilled、または rejected であり得る。

27.2.1 Promise 抽象操作

27.2.1.1 PromiseCapability Record

PromiseCapability Record は、Promise または promise-like オブジェクトを、その promise を resolve または reject できる関数とともにカプセル化するために使用される Record 値である。PromiseCapability Record は NewPromiseCapability 抽象操作によって生成される。

PromiseCapability Record は、Table 86 に列挙されるフィールドを持つ。

Table 86: PromiseCapability Record のフィールド
フィールド名 意味
[[Promise]] Object promise として使用できるオブジェクト。
[[Resolve]] function object 与えられた promise を resolve するために使用される関数。
[[Reject]] function object 与えられた promise を reject するために使用される関数。

27.2.1.1.1 IfAbruptRejectPromise ( value, capability )

IfAbruptRejectPromise は、PromiseCapability Record を使用する一連のアルゴリズム手順の省略表記である。次の形式のアルゴリズム手順:

  1. IfAbruptRejectPromise(value, capability).

は、次と同じ意味である:

  1. Assert: valueCompletion Record である。
  2. valueabrupt completion であるならば、
    1. Call(capability.[[Reject]], undefined, « value.[[Value]] ») を実行する。
    2. capability.[[Promise]] を返す。
  3. value を ! value に設定する。

27.2.1.2 PromiseReaction Record

PromiseReaction Record は、promise が与えられた値で resolved または rejected になったときにどのように反応すべきかに関する情報を格納するために使用される Record 値である。PromiseReaction Record は PerformPromiseThen 抽象操作によって作成され、NewPromiseReactionJob によって返される Abstract Closure によって使用される。

PromiseReaction Record は、Table 87 に列挙されるフィールドを持つ。

Table 87: PromiseReaction Record のフィールド
フィールド名 意味
[[Capability]] PromiseCapability Record または undefined このレコードが reaction handler を提供する promise の capability。
[[Type]] fulfill または reject [[Type]] は、[[Handler]]empty である場合に、settlement の種類に固有の動作を可能にするために使用される。
[[Handler]] JobCallback Record または empty 入力値に適用されるべき関数であり、その戻り値が派生 promise に何が起こるかを支配する。[[Handler]]empty である場合、代わりに [[Type]] の値に依存する関数が使用される。

27.2.1.3 CreateResolvingFunctions ( toResolve )

The abstract operation CreateResolvingFunctions takes argument toResolve (Promise) and returns フィールド [[Resolve]] (function object) および [[Reject]] (function object) を持つ Record. It performs the following steps when called:

  1. promiseOrEmptyRecord { [[Value]]: toResolve } とする。
  2. resolveSteps を、promiseOrEmpty をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (resolution) を持つ新しい Abstract Closure とする:
    1. promiseOrEmpty.[[Value]]empty であれば、undefined を返す。
    2. promisepromiseOrEmpty.[[Value]] とする。
    3. promiseOrEmpty.[[Value]]empty に設定する。
    4. SameValue(resolution, promise) が true であれば、
      1. selfResolutionError を新しく作成された TypeError オブジェクトとする。
      2. RejectPromise(promise, selfResolutionError) を実行する。
      3. undefined を返す。
    5. resolution が Object でないならば、
      1. FulfillPromise(promise, resolution) を実行する。
      2. undefined を返す。
    6. thenCompletion(Get(resolution, "then")) とする。
    7. thenabrupt completion であるならば、
      1. RejectPromise(promise, then.[[Value]]) を実行する。
      2. undefined を返す。
    8. thenActionthen.[[Value]] とする。
    9. IsCallable(thenAction) が false であれば、
      1. FulfillPromise(promise, resolution) を実行する。
      2. undefined を返す。
    10. thenJobCallbackHostMakeJobCallback(thenAction) とする。
    11. jobNewPromiseResolveThenableJob(promise, resolution, thenJobCallback) とする。
    12. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) を実行する。
    13. undefined を返す。
  3. resolveCreateBuiltinFunction(resolveSteps, 1, "", « ») とする。
  4. rejectSteps を、promiseOrEmpty をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (reason) を持つ新しい Abstract Closure とする:
    1. promiseOrEmpty.[[Value]]empty であれば、undefined を返す。
    2. promisepromiseOrEmpty.[[Value]] とする。
    3. promiseOrEmpty.[[Value]]empty に設定する。
    4. RejectPromise(promise, reason) を実行する。
    5. undefined を返す。
  5. rejectCreateBuiltinFunction(rejectSteps, 1, "", « ») とする。
  6. Record { [[Resolve]]: resolve, [[Reject]]: reject } を返す。

27.2.1.4 FulfillPromise ( promise, value )

The abstract operation FulfillPromise takes arguments promise (Promise) and value (ECMAScript 言語値) and returns unused. It performs the following steps when called:

  1. Assert: promise.[[PromiseState]]pending である。
  2. reactionspromise.[[PromiseFulfillReactions]] とする。
  3. promise.[[PromiseResult]]value に設定する。
  4. promise.[[PromiseFulfillReactions]]undefined に設定する。
  5. promise.[[PromiseRejectReactions]]undefined に設定する。
  6. promise.[[PromiseState]]fulfilled に設定する。
  7. TriggerPromiseReactions(reactions, value) を実行する。
  8. unused を返す。

27.2.1.5 NewPromiseCapability ( constructor )

The abstract operation NewPromiseCapability takes argument constructor (ECMAScript 言語値) and returns PromiseCapability Record を含む normal completion または throw completion のいずれか. これは、built-in Promise コンストラクターの方式で constructor をコンストラクターとして使用し、promise を作成してその resolve 関数と reject 関数を抽出しようとする。promise と resolve 関数および reject 関数は、新しい PromiseCapability Record を初期化するために使用される。 It performs the following steps when called:

  1. IsConstructor(constructor) が false であれば、TypeError 例外を投げる。
  2. NOTE: constructor は、Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であると想定される(27.2.3.1 を参照)。
  3. resolvingFunctionsRecord { [[Resolve]]: undefined, [[Reject]]: undefined } とする。
  4. executorClosure を、resolvingFunctions をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (resolve, reject) を持つ新しい Abstract Closure とする:
    1. resolvingFunctions.[[Resolve]]undefined でないならば、TypeError 例外を投げる。
    2. resolvingFunctions.[[Reject]]undefined でないならば、TypeError 例外を投げる。
    3. resolvingFunctions.[[Resolve]]resolve に設定する。
    4. resolvingFunctions.[[Reject]]reject に設定する。
    5. NormalCompletion(undefined) を返す。
  5. executorCreateBuiltinFunction(executorClosure, 2, "", « ») とする。
  6. promise を ? Construct(constructor, « executor ») とする。
  7. IsCallable(resolvingFunctions.[[Resolve]]) が false であれば、TypeError 例外を投げる。
  8. IsCallable(resolvingFunctions.[[Reject]]) が false であれば、TypeError 例外を投げる。
  9. PromiseCapability Record { [[Promise]]: promise, [[Resolve]]: resolvingFunctions.[[Resolve]], [[Reject]]: resolvingFunctions.[[Reject]] } を返す。
Note

この抽象操作は Promise のサブクラス化をサポートする。これは、渡された executor 関数引数を Promise コンストラクターと同じ方法で呼び出す任意のコンストラクターに対して generic であるためである。Promise コンストラクターの static メソッドを任意のサブクラスへ一般化するために使用される。

27.2.1.6 IsPromise ( value )

The abstract operation IsPromise takes argument value (ECMAScript 言語値) and returns Boolean. これは、オブジェクト上の promise brand を検査する。 It performs the following steps when called:

  1. value が Object でなければ、false を返す。
  2. value[[PromiseState]] 内部スロットを持たなければ、false を返す。
  3. true を返す。

27.2.1.7 RejectPromise ( promise, reason )

The abstract operation RejectPromise takes arguments promise (Promise) and reason (ECMAScript 言語値) and returns unused. It performs the following steps when called:

  1. Assert: promise.[[PromiseState]]pending である。
  2. reactionspromise.[[PromiseRejectReactions]] とする。
  3. promise.[[PromiseResult]]reason に設定する。
  4. promise.[[PromiseFulfillReactions]]undefined に設定する。
  5. promise.[[PromiseRejectReactions]]undefined に設定する。
  6. promise.[[PromiseState]]rejected に設定する。
  7. promise.[[PromiseIsHandled]]false ならば、HostPromiseRejectionTracker(promise, "reject") を実行する。
  8. TriggerPromiseReactions(reactions, reason) を実行する。
  9. unused を返す。

27.2.1.8 TriggerPromiseReactions ( reactions, argument )

The abstract operation TriggerPromiseReactions takes arguments reactions (PromiseReaction RecordList) and argument (ECMAScript 言語値) and returns unused. これは、reactions 内の各レコードについて新しい Job をエンキューする。そのような各 Job は、PromiseReaction Record[[Type]][[Handler]] を処理し、[[Handler]]empty でなければ、与えられた引数を渡してそれを呼び出す。[[Handler]]empty である場合、動作は [[Type]] によって決定される。 It performs the following steps when called:

  1. reactions の各要素 reaction について、次を行う:
    1. jobNewPromiseReactionJob(reaction, argument) とする。
    2. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) を実行する。
  2. unused を返す。

27.2.1.9 HostPromiseRejectionTracker ( promise, operation )

The host-defined abstract operation HostPromiseRejectionTracker takes arguments promise (Promise) and operation ("reject" または "handle") and returns unused. これは、host environment が promise rejection を追跡できるようにする。

HostPromiseRejectionTracker の既定の実装は、unused を返すことである。

Note 1

HostPromiseRejectionTracker は 2 つのシナリオで呼び出される:

  • promise が handler なしで rejected になったとき、operation 引数を "reject" に設定して呼び出される。
  • rejected promise に初めて handler が追加されたとき、operation 引数を "handle" に設定して呼び出される。

HostPromiseRejectionTracker の典型的な実装は、unhandled rejection について開発者に通知しようとしつつ、以前のそのような通知が後から新しい handler の付加によって無効化された場合にも注意深く通知するかもしれない。

Note 2

operation"handle" である場合、実装は garbage collection を妨げるような方法で promise への参照を保持するべきではない。operation"reject" である場合、rejection はまれであり hot code path 上にはないと期待されるため、実装は promise への参照を保持してもよい。

27.2.2 Promise Job

27.2.2.1 NewPromiseReactionJob ( reaction, argument )

The abstract operation NewPromiseReactionJob takes arguments reaction (PromiseReaction Record) and argument (ECMAScript 言語値) and returns フィールド [[Job]] (Job Abstract Closure) および [[Realm]] (Realm Record または null) を持つ Record. これは、入力値に適切な handler を適用し、その handler の戻り値を使用して、その handler に関連付けられた派生 promise を resolve または reject する新しい Job Abstract Closure を返す。 It performs the following steps when called:

  1. job を、reactionargument をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Job Abstract Closure とする:
    1. promiseCapabilityreaction.[[Capability]] とする。
    2. typereaction.[[Type]] とする。
    3. handlerreaction.[[Handler]] とする。
    4. handlerempty であれば、
      1. typefulfill であれば、
        1. handlerResultNormalCompletion(argument) とする。
      2. そうでなければ、
        1. Assert: typereject である。
        2. handlerResultThrowCompletion(argument) とする。
    5. そうでなければ、
      1. handlerResultCompletion(HostCallJobCallback(handler, undefined, « argument »)) とする。
    6. promiseCapabilityundefined であれば、
      1. Assert: handlerResultabrupt completion でない。
      2. empty を返す。
    7. Assert: promiseCapabilityPromiseCapability Record である。
    8. handlerResultabrupt completion であるならば、
      1. Call(promiseCapability.[[Reject]], undefined, « handlerResult.[[Value]] ») を返す。
    9. Call(promiseCapability.[[Resolve]], undefined, « handlerResult.[[Value]] ») を返す。
  2. handlerRealmnull とする。
  3. reaction.[[Handler]]empty でないならば、
    1. getHandlerRealmResultCompletion(GetFunctionRealm(reaction.[[Handler]].[[Callback]])) とする。
    2. getHandlerRealmResultnormal completion であるならば、handlerRealmgetHandlerRealmResult.[[Value]] に設定する。
    3. そうでなければ、handlerRealm を現在の Realm Record に設定する。
    4. NOTE: handler が undefined でない限り、handlerRealmnull になることはない。handler が revoked Proxy であり、ECMAScript コードが実行されない場合、handlerRealm はエラーオブジェクトを作成するために使用される。
  4. Record { [[Job]]: job, [[Realm]]: handlerRealm } を返す。

27.2.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )

The abstract operation NewPromiseResolveThenableJob takes arguments promiseToResolve (Promise), thenable (Object), and then (JobCallback Record) and returns フィールド [[Job]] (Job Abstract Closure) および [[Realm]] (Realm Record) を持つ Record. It performs the following steps when called:

  1. job を、promiseToResolvethenable、および then をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Job Abstract Closure とする:
    1. resolvingFunctionsCreateResolvingFunctions(promiseToResolve) とする。
    2. thenCallResultCompletion(HostCallJobCallback(then, thenable, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »)) とする。
    3. thenCallResultabrupt completion であるならば、
      1. Call(resolvingFunctions.[[Reject]], undefined, « thenCallResult.[[Value]] ») を返す。
    4. thenCallResult を返す。
  2. getThenRealmResultCompletion(GetFunctionRealm(then.[[Callback]])) とする。
  3. getThenRealmResultnormal completion であるならば、thenRealmgetThenRealmResult.[[Value]] とする。
  4. そうでなければ、thenRealm を現在の Realm Record とする。
  5. NOTE: thenRealmnull になることはない。then.[[Callback]] が revoked Proxy でありコードが実行されない場合、thenRealm はエラーオブジェクトを作成するために使用される。
  6. Record { [[Job]]: job, [[Realm]]: thenRealm } を返す。
Note

この Job は、与えられた promise を resolve するために、提供された thenable とその then メソッドを使用する。この処理は、周囲のコードの評価が完了した後に then メソッドの評価が行われることを保証するために、Job として行われなければならない。

27.2.3 Promise コンストラクター

Promise コンストラクター:

  • %Promise% である。
  • グローバルオブジェクト"Promise" プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しい Promise を作成し初期化する。
  • 関数として呼び出されることは意図されておらず、そのように呼び出された場合は例外を投げる。
  • クラス定義の extends 節における値として使用してよい。指定された Promise の動作を継承することを意図するサブクラスコンストラクターは、Promise および Promise.prototype の built-in メソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成し初期化するため、Promise コンストラクターへの super 呼び出しを含まなければならない。

27.2.3.1 Promise ( executor )

この関数は、呼び出されたとき次の手順を実行する:

  1. NewTarget が undefined であれば、TypeError 例外を投げる。
  2. IsCallable(executor) が false であれば、TypeError 例外を投げる。
  3. promise を ? OrdinaryCreateFromConstructor(NewTarget, "%Promise.prototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] ») とする。
  4. promise.[[PromiseState]]pending に設定する。
  5. promise.[[PromiseResult]]empty に設定する。
  6. promise.[[PromiseFulfillReactions]] を新しい空の List に設定する。
  7. promise.[[PromiseRejectReactions]] を新しい空の List に設定する。
  8. promise.[[PromiseIsHandled]]false に設定する。
  9. resolvingFunctionsCreateResolvingFunctions(promise) とする。
  10. completionCompletion(Call(executor, undefined, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »)) とする。
  11. completionabrupt completion であるならば、
    1. Call(resolvingFunctions.[[Reject]], undefined, « completion.[[Value]] ») を実行する。
  12. promise を返す。
Note

executor 引数は function object でなければならない。これは、この Promise によって表される、遅延される可能性のある動作を開始し、その完了を報告するために呼び出される。executor は 2 つの引数、resolvereject で呼び出される。これらは、遅延計算の最終的な完了または失敗を報告するために executor 関数が使用できる関数である。executor 関数から戻ることは、遅延動作が完了したことを意味するのではなく、最終的に遅延動作を実行する要求が受け入れられたことのみを意味する。

executor 関数に渡される resolve 関数は単一の引数を受け入れる。executor コードは、関連付けられた Promise を resolve したいことを示すために、最終的に resolve 関数を呼び出してよい。resolve 関数に渡される引数は、遅延動作の最終的な値を表し、実際の fulfillment 値、または fulfilled された場合にその値を提供する別の promise のいずれかであり得る。

executor 関数に渡される reject 関数は単一の引数を受け入れる。executor コードは、関連付けられた Promise が rejected であり、決して fulfilled されないことを示すために、最終的に reject 関数を呼び出してよい。reject 関数に渡される引数は promise の rejection 値として使用される。通常、それは Error オブジェクトである。

Promise コンストラクターによって executor 関数に渡される resolve 関数と reject 関数は、関連付けられた promise を実際に resolve および reject する能力を持つ。サブクラスは、resolve と reject に対してカスタマイズされた値を渡す異なるコンストラクター動作を持ち得る。

27.2.4 Promise コンストラクターのプロパティ

Promise コンストラクター:

  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持つ。
  • 次のプロパティを持つ:

27.2.4.1 Promise.all ( iterable )

この関数は、渡された promise の fulfillment 値の配列で fulfilled される新しい promise、または rejected になる最初の渡された promise の理由で rejected される新しい promise を返す。このアルゴリズムを実行する際、渡された iterable のすべての要素を promise に resolve する。

  1. constructorthis value とする。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. promiseResolveCompletion(GetPromiseResolve(constructor)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseAll(iteratorRecord, constructor, promiseCapability, promiseResolve)) とする。
  8. resultabrupt completion であるならば、
    1. iteratorRecord.[[Done]]false であれば、resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを要求する。

27.2.4.1.1 GetPromiseResolve ( promiseConstructor )

The abstract operation GetPromiseResolve takes argument promiseConstructor (constructor) and returns function object を含む normal completion または throw completion のいずれか. It performs the following steps when called:

  1. promiseResolve を ? Get(promiseConstructor, "resolve") とする。
  2. IsCallable(promiseResolve) が false であれば、TypeError 例外を投げる。
  3. promiseResolve を返す。

27.2.4.1.2 PerformPromiseAll ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseAll takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. values を新しい空の List とする。
  2. NOTE: remainingElementsCount は、入力 iterator が尽きる前に渡された callback を呼び出す不正な "then" が存在しても、resultCapability.[[Resolve]] が一度だけ呼び出されることを保証するため、0 ではなく 1 から開始する。
  3. remainingElementsCountRecord { [[Value]]: 1 } とする。
  4. index を 0 とする。
  5. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone であれば、
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      2. remainingElementsCount.[[Value]] = 0 であれば、
        1. valuesArrayCreateArrayFromList(values) とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を実行する。
      3. resultCapability.[[Promise]] を返す。
    3. undefinedvalues に追加する。
    4. nextPromise を ? Call(promiseResolve, constructor, « next ») とする。
    5. fulfilledSteps を、valuesresultCapability、および remainingElementsCount をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (value) を持つ新しい Abstract Closure とする:
      1. activeFunc をアクティブな関数オブジェクトとする。
      2. activeFunc.[[AlreadyCalled]]true であれば、undefined を返す。
      3. activeFunc.[[AlreadyCalled]]true に設定する。
      4. thisIndexactiveFunc.[[Index]] とする。
      5. values[thisIndex] を value に設定する。
      6. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      7. remainingElementsCount.[[Value]] = 0 であれば、
        1. valuesArrayCreateArrayFromList(values) とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を返す。
      8. undefined を返す。
    6. onFulfilledCreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») とする。
    7. onFulfilled.[[AlreadyCalled]]false に設定する。
    8. onFulfilled.[[Index]]index に設定する。
    9. indexindex + 1 に設定する。
    10. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 に設定する。
    11. Invoke(nextPromise, "then", « onFulfilled, resultCapability.[[Reject]] ») を実行する。

27.2.4.2 Promise.allSettled ( iterable )

この関数は、元のすべての promise が settled、すなわち fulfilled または rejected のいずれかになった後にのみ、promise 状態の snapshot の配列で fulfilled される promise を返す。このアルゴリズムを実行する際、渡された iterable のすべての要素を promise に resolve する。

  1. constructorthis value とする。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. promiseResolveCompletion(GetPromiseResolve(constructor)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseAllSettled(iteratorRecord, constructor, promiseCapability, promiseResolve)) とする。
  8. resultabrupt completion であるならば、
    1. iteratorRecord.[[Done]]false であれば、resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを要求する。

27.2.4.2.1 PerformPromiseAllSettled ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseAllSettled takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. values を新しい空の List とする。
  2. NOTE: remainingElementsCount は、入力 iterator が尽きる前に渡された callback の一つを呼び出す不正な "then" が存在しても、resultCapability.[[Resolve]] が一度だけ呼び出されることを保証するため、0 ではなく 1 から開始する。
  3. remainingElementsCountRecord { [[Value]]: 1 } とする。
  4. index を 0 とする。
  5. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone であれば、
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      2. remainingElementsCount.[[Value]] = 0 であれば、
        1. valuesArrayCreateArrayFromList(values) とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を実行する。
      3. resultCapability.[[Promise]] を返す。
    3. undefinedvalues に追加する。
    4. nextPromise を ? Call(promiseResolve, constructor, « next ») とする。
    5. alreadyCalledRecord { [[Value]]: false } とする。
    6. fulfilledSteps を、valuesresultCapability、および remainingElementsCount をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (value) を持つ新しい Abstract Closure とする:
      1. activeFunc をアクティブな関数オブジェクトとする。
      2. activeFunc.[[AlreadyCalled]].[[Value]]true であれば、undefined を返す。
      3. activeFunc.[[AlreadyCalled]].[[Value]]true に設定する。
      4. objOrdinaryObjectCreate(%Object.prototype%) とする。
      5. CreateDataPropertyOrThrow(obj, "status", "fulfilled") を実行する。
      6. CreateDataPropertyOrThrow(obj, "value", value) を実行する。
      7. thisIndexactiveFunc.[[Index]] とする。
      8. values[thisIndex] を obj に設定する。
      9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      10. remainingElementsCount.[[Value]] = 0 であれば、
        1. valuesArrayCreateArrayFromList(values) とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を返す。
      11. undefined を返す。
    7. onFulfilledCreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») とする。
    8. onFulfilled.[[AlreadyCalled]]alreadyCalled に設定する。
    9. onFulfilled.[[Index]]index に設定する。
    10. rejectedSteps を、valuesresultCapability、および remainingElementsCount をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (error) を持つ新しい Abstract Closure とする:
      1. activeFunc をアクティブな関数オブジェクトとする。
      2. activeFunc.[[AlreadyCalled]].[[Value]]true であれば、undefined を返す。
      3. activeFunc.[[AlreadyCalled]].[[Value]]true に設定する。
      4. objOrdinaryObjectCreate(%Object.prototype%) とする。
      5. CreateDataPropertyOrThrow(obj, "status", "rejected") を実行する。
      6. CreateDataPropertyOrThrow(obj, "reason", error) を実行する。
      7. thisIndexactiveFunc.[[Index]] とする。
      8. values[thisIndex] を obj に設定する。
      9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      10. remainingElementsCount.[[Value]] = 0 であれば、
        1. valuesArrayCreateArrayFromList(values) とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を返す。
      11. undefined を返す。
    11. onRejectedCreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») とする。
    12. onRejected.[[AlreadyCalled]]alreadyCalled に設定する。
    13. onRejected.[[Index]]index に設定する。
    14. indexindex + 1 に設定する。
    15. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 に設定する。
    16. Invoke(nextPromise, "then", « onFulfilled, onRejected ») を実行する。

27.2.4.3 Promise.any ( iterable )

この関数は、与えられた promise のうち最初に fulfilled されたものによって fulfilled される promise、または与えられた promise のすべてが rejected された場合に rejection 理由を保持する AggregateError で rejected される promise を返す。このアルゴリズムを実行する際、渡された iterable のすべての要素を promise に resolve する。

  1. constructorthis value とする。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. promiseResolveCompletion(GetPromiseResolve(constructor)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseAny(iteratorRecord, constructor, promiseCapability, promiseResolve)) とする。
  8. resultabrupt completion であるならば、
    1. iteratorRecord.[[Done]]false であれば、resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを要求する。

27.2.4.3.1 PerformPromiseAny ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseAny takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. errors を新しい空の List とする。
  2. NOTE: remainingElementsCount は、入力 iterator が尽きる前に渡された callback を呼び出す不正な "then" が存在しても、resultCapability.[[Reject]] が一度だけ呼び出されることを保証するため、0 ではなく 1 から開始する。
  3. remainingElementsCountRecord { [[Value]]: 1 } とする。
  4. index を 0 とする。
  5. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone であれば、
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      2. remainingElementsCount.[[Value]] = 0 であれば、
        1. aggregateError を新しく作成された AggregateError オブジェクトとする。
        2. DefinePropertyOrThrow(aggregateError, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }) を実行する。
        3. Call(resultCapability.[[Reject]], undefined, « aggregateError ») を実行する。
      3. resultCapability.[[Promise]] を返す。
    3. undefinederrors に追加する。
    4. nextPromise を ? Call(promiseResolve, constructor, « next ») とする。
    5. rejectedSteps を、errorsresultCapability、および remainingElementsCount をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (error) を持つ新しい Abstract Closure とする:
      1. activeFunc をアクティブな関数オブジェクトとする。
      2. activeFunc.[[AlreadyCalled]]true であれば、undefined を返す。
      3. activeFunc.[[AlreadyCalled]]true に設定する。
      4. thisIndexactiveFunc.[[Index]] とする。
      5. errors[thisIndex] を error に設定する。
      6. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      7. remainingElementsCount.[[Value]] = 0 であれば、
        1. aggregateError を新しく作成された AggregateError オブジェクトとする。
        2. DefinePropertyOrThrow(aggregateError, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }) を実行する。
        3. Call(resultCapability.[[Reject]], undefined, « aggregateError ») を返す。
      8. undefined を返す。
    6. onRejectedCreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») とする。
    7. onRejected.[[AlreadyCalled]]false に設定する。
    8. onRejected.[[Index]]index に設定する。
    9. indexindex + 1 に設定する。
    10. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 に設定する。
    11. Invoke(nextPromise, "then", « resultCapability.[[Resolve]], onRejected ») を実行する。

27.2.4.4 Promise.prototype

Promise.prototype の初期値は Promise プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

27.2.4.5 Promise.race ( iterable )

この関数は、渡された promise のうち最初に settle する promise と同じ方法で settled される新しい promise を返す。このアルゴリズムを実行する際、渡された iterable のすべての要素を promise に resolve する。

  1. constructorthis value とする。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. promiseResolveCompletion(GetPromiseResolve(constructor)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseRace(iteratorRecord, constructor, promiseCapability, promiseResolve)) とする。
  8. resultabrupt completion であるならば、
    1. iteratorRecord.[[Done]]false であれば、resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note 1

iterable 引数が値を生成しない場合、または iterable によって生成された promise のいずれも決して settle しない場合、このメソッドによって返される pending promise は決して settled にならない。

Note 2

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを期待する。また、その this value が resolve メソッドを提供することも期待する。

27.2.4.5.1 PerformPromiseRace ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseRace takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone であれば、
      1. resultCapability.[[Promise]] を返す。
    3. nextPromise を ? Call(promiseResolve, constructor, « next ») とする。
    4. Invoke(nextPromise, "then", « resultCapability.[[Resolve]], resultCapability.[[Reject]] ») を実行する。

27.2.4.6 Promise.reject ( reason )

この関数は、渡された引数で rejected された新しい promise を返す。

  1. constructorthis value とする。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. Call(promiseCapability.[[Reject]], undefined, « reason ») を実行する。
  4. promiseCapability.[[Promise]] を返す。
Note

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを期待する。

27.2.4.7 Promise.resolve ( resolution )

この関数は、渡された引数で resolved された新しい promise、または引数がこのコンストラクターによって生成された promise である場合はその引数自体を返す。

  1. constructorthis value とする。
  2. constructor が Object でなければ、TypeError 例外を投げる。
  3. PromiseResolve(constructor, resolution) を返す。
Note

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを期待する。

27.2.4.7.1 PromiseResolve ( constructor, resolution )

The abstract operation PromiseResolve takes arguments constructor (an Object) and resolution (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion. これは、resolution で resolved された新しい promise を返す。 It performs the following steps when called:

  1. IsPromise(resolution) が true であれば、
    1. xConstructor を ? Get(resolution, "constructor") とする。
    2. SameValue(xConstructor, constructor) が true であれば、resolution を返す。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. Call(promiseCapability.[[Resolve]], undefined, « resolution ») を実行する。
  4. promiseCapability.[[Promise]] を返す。

27.2.4.8 Promise.try ( callback, ...args )

この関数は、呼び出されたとき次の手順を実行する:

  1. constructorthis value とする。
  2. constructor が Object でなければ、TypeError 例外を投げる。
  3. promiseCapability を ? NewPromiseCapability(constructor) とする。
  4. statusCompletion(Call(callback, undefined, args)) とする。
  5. statusabrupt completion であるならば、
    1. Call(promiseCapability.[[Reject]], undefined, « status.[[Value]] ») を実行する。
  6. そうでなければ、
    1. Call(promiseCapability.[[Resolve]], undefined, « status.[[Value]] ») を実行する。
  7. promiseCapability.[[Promise]] を返す。
Note

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを期待する。

27.2.4.9 Promise.withResolvers ( )

この関数は、新しい promise と、それに関連付けられた resolve 関数および reject 関数を合わせた 3 つのプロパティを持つオブジェクトを返す。

  1. constructorthis value とする。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. objOrdinaryObjectCreate(%Object.prototype%) とする。
  4. CreateDataPropertyOrThrow(obj, "promise", promiseCapability.[[Promise]]) を実行する。
  5. CreateDataPropertyOrThrow(obj, "resolve", promiseCapability.[[Resolve]]) を実行する。
  6. CreateDataPropertyOrThrow(obj, "reject", promiseCapability.[[Reject]]) を実行する。
  7. obj を返す。

27.2.4.10 get Promise [ %Symbol.species% ]

Promise[%Symbol.species%] は set accessor 関数が undefined である accessor プロパティである。その get accessor 関数は、呼び出されたとき次の手順を実行する:

  1. this value を返す。

この関数の "name" プロパティの値は "get [Symbol.species]" である。

Note

Promise プロトタイプメソッドは通常、派生オブジェクトを作成するために、その this value のコンストラクターを使用する。しかし、サブクラスコンストラクターは、その %Symbol.species% プロパティを再定義することによって、その既定の動作を上書きしてよい。

27.2.5 Promise プロトタイプオブジェクトのプロパティ

Promise プロトタイプオブジェクト

  • %Promise.prototype% である。
  • 値が %Object.prototype% である [[Prototype]] 内部スロットを持つ。
  • 通常のオブジェクトである。
  • [[PromiseState]] 内部スロット、または Promise インスタンスのその他の内部スロットを持たない。

27.2.5.1 Promise.prototype.catch ( onRejected )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. promisethis value とする。
  2. Invoke(promise, "then", « undefined, onRejected ») を返す。

27.2.5.2 Promise.prototype.constructor

Promise.prototype.constructor の初期値は %Promise% である。

27.2.5.3 Promise.prototype.finally ( onFinally )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. promisethis value とする。
  2. promise が Object でなければ、TypeError 例外を投げる。
  3. constructor を ? SpeciesConstructor(promise, %Promise%) とする。
  4. Assert: IsConstructor(constructor) は true である。
  5. IsCallable(onFinally) が false であれば、
    1. thenFinallyonFinally とする。
    2. catchFinallyonFinally とする。
  6. そうでなければ、
    1. thenFinallyClosure を、onFinallyconstructor をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (value) を持つ新しい Abstract Closure とする:
      1. result を ? Call(onFinally, undefined) とする。
      2. p を ? PromiseResolve(constructor, result) とする。
      3. returnValue を、value をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
        1. NormalCompletion(value) を返す。
      4. valueThunkCreateBuiltinFunction(returnValue, 0, "", « ») とする。
      5. Invoke(p, "then", « valueThunk ») を返す。
    2. thenFinallyCreateBuiltinFunction(thenFinallyClosure, 1, "", « ») とする。
    3. catchFinallyClosure を、onFinallyconstructor をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (reason) を持つ新しい Abstract Closure とする:
      1. result を ? Call(onFinally, undefined) とする。
      2. p を ? PromiseResolve(constructor, result) とする。
      3. throwReason を、reason をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
        1. reason を投げる。
      4. throwerCreateBuiltinFunction(throwReason, 0, "", « ») とする。
      5. Invoke(p, "then", « thrower ») を返す。
    4. catchFinallyCreateBuiltinFunction(catchFinallyClosure, 1, "", « ») とする。
  7. Invoke(promise, "then", « thenFinally, catchFinally ») を返す。

27.2.5.4 Promise.prototype.then ( onFulfilled, onRejected )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. promisethis value とする。
  2. IsPromise(promise) が false であれば、TypeError 例外を投げる。
  3. constructor を ? SpeciesConstructor(promise, %Promise%) とする。
  4. resultCapability を ? NewPromiseCapability(constructor) とする。
  5. PerformPromiseThen(promise, onFulfilled, onRejected, resultCapability) を返す。

27.2.5.4.1 PerformPromiseThen ( promise, onFulfilled, onRejected [ , resultCapability ] )

The abstract operation PerformPromiseThen takes arguments promise (a Promise), onFulfilled (an ECMAScript language value), and onRejected (an ECMAScript language value) and optional argument resultCapability (a PromiseCapability Record) and returns an Object or undefined. これは、onFulfilledonRejected を settlement action として使用して、promise に対して “then” 操作を実行する。resultCapability が渡された場合、結果は resultCapability の promise を更新することによって格納される。渡されなかった場合、PerformPromiseThen は、結果が重要でない仕様内部操作によって呼び出されている。 It performs the following steps when called:

  1. Assert: IsPromise(promise) は true である。
  2. resultCapability が存在しないならば、
    1. resultCapabilityundefined に設定する。
  3. IsCallable(onFulfilled) が false であれば、
    1. onFulfilledJobCallbackempty とする。
  4. そうでなければ、
    1. onFulfilledJobCallbackHostMakeJobCallback(onFulfilled) とする。
  5. IsCallable(onRejected) が false であれば、
    1. onRejectedJobCallbackempty とする。
  6. そうでなければ、
    1. onRejectedJobCallbackHostMakeJobCallback(onRejected) とする。
  7. fulfillReactionPromiseReaction Record { [[Capability]]: resultCapability, [[Type]]: fulfill, [[Handler]]: onFulfilledJobCallback } とする。
  8. rejectReactionPromiseReaction Record { [[Capability]]: resultCapability, [[Type]]: reject, [[Handler]]: onRejectedJobCallback } とする。
  9. promise.[[PromiseState]]pending であるならば、
    1. fulfillReactionpromise.[[PromiseFulfillReactions]] に追加する。
    2. rejectReactionpromise.[[PromiseRejectReactions]] に追加する。
  10. そうではなく promise.[[PromiseState]]fulfilled であるならば、
    1. valuepromise.[[PromiseResult]] とする。
    2. fulfillJobNewPromiseReactionJob(fulfillReaction, value) とする。
    3. HostEnqueuePromiseJob(fulfillJob.[[Job]], fulfillJob.[[Realm]]) を実行する。
  11. そうでなければ、
    1. Assert: promise.[[PromiseState]]rejected である。
    2. reasonpromise.[[PromiseResult]] とする。
    3. promise.[[PromiseIsHandled]]false であれば、HostPromiseRejectionTracker(promise, "handle") を実行する。
    4. rejectJobNewPromiseReactionJob(rejectReaction, reason) とする。
    5. HostEnqueuePromiseJob(rejectJob.[[Job]], rejectJob.[[Realm]]) を実行する。
  12. promise.[[PromiseIsHandled]]true に設定する。
  13. resultCapabilityundefined であれば、undefined を返す。
  14. resultCapability.[[Promise]] を返す。

27.2.5.5 Promise.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "Promise" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.2.6 Promise インスタンスのプロパティ

Promise インスタンスは、Promise プロトタイプオブジェクト(intrinsic, %Promise.prototype%)からプロパティを継承する通常のオブジェクトである。Promise インスタンスは、Table 88 に記述される内部スロットを持って最初に作成される。

Table 88: Promise インスタンスの内部スロット
内部スロット 説明
[[PromiseState]] pending, fulfilled, または rejected promise がその then メソッドへの入力呼び出しにどのように反応するかを支配する。
[[PromiseResult]] ECMAScript 言語値または empty promise が fulfilled または rejected された値(存在する場合)。[[PromiseState]]pending である場合に、かつその場合に限り empty である。
[[PromiseFulfillReactions]] PromiseReaction RecordList promise が pending 状態から fulfilled 状態に遷移するとき/遷移する場合に処理される Record
[[PromiseRejectReactions]] PromiseReaction RecordList promise が pending 状態から rejected 状態に遷移するとき/遷移する場合に処理される Record
[[PromiseIsHandled]] Boolean promise が fulfillment または rejection handler をこれまでに持ったことがあるかどうかを示す。unhandled rejection tracking で使用される。

27.3 GeneratorFunction オブジェクト

GeneratorFunction は、通常 GeneratorDeclarationGeneratorExpression、および GeneratorMethod を評価することによって作成される関数である。%GeneratorFunction% intrinsic を呼び出すことによって作成されることもある。

Figure 6 (Informative): Generator オブジェクトの関係
驚くほど多様なボックスと矢印。

27.3.1 GeneratorFunction コンストラクター

GeneratorFunction コンストラクター:

  • %GeneratorFunction% である。
  • Function のサブクラスである。
  • コンストラクターとしてではなく関数として呼び出されたとき、新しい GeneratorFunction を作成し初期化する。したがって、関数呼び出し GeneratorFunction (…) は、同じ引数を持つオブジェクト作成式 new GeneratorFunction (…) と等価である。
  • クラス定義の extends 節の値として使用してよい。指定された GeneratorFunction の動作を継承することを意図するサブクラスコンストラクターは、built-in GeneratorFunction の動作に必要な内部スロットを持つサブクラスインスタンスを作成し初期化するため、GeneratorFunction コンストラクターへの super 呼び出しを含まなければならない。generator function オブジェクトを定義するすべての ECMAScript 構文形式は、GeneratorFunction の直接インスタンスを作成する。GeneratorFunction サブクラスのインスタンスを作成する構文上の手段は存在しない。

27.3.1.1 GeneratorFunction ( ...parameterArgs, bodyArg )

最後の引数(存在する場合)は generator function の本体(実行可能コード)を指定し、それより前の任意の引数は仮引数を指定する。

この関数は、呼び出されたとき次の手順を実行する:

  1. activeFunc をアクティブな関数オブジェクトとする。
  2. bodyArg が存在しないならば、bodyArg を空の String に設定する。
  3. CreateDynamicFunction(activeFunc, NewTarget, generator, parameterArgs, bodyArg) を返す。
Note

20.2.1.1NOTE を参照。

27.3.2 GeneratorFunction コンストラクターのプロパティ

GeneratorFunction コンストラクター:

  • Function コンストラクターから継承する標準 built-in 関数オブジェクトである。
  • 値が %Function% である [[Prototype]] 内部スロットを持つ。
  • 値が 1𝔽 である "length" プロパティを持つ。
  • 値が "GeneratorFunction" である "name" プロパティを持つ。
  • 次のプロパティを持つ:

27.3.2.1 GeneratorFunction.prototype

GeneratorFunction.prototype の初期値は GeneratorFunction プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

27.3.3 GeneratorFunction プロトタイプオブジェクトのプロパティ

GeneratorFunction プロトタイプオブジェクト

  • %GeneratorFunction.prototype% である(Figure 6 を参照)。
  • 通常のオブジェクトである。
  • 関数オブジェクトではなく、[[ECMAScriptCode]] 内部スロット、または Table 25 もしくは Table 89 に列挙されるその他の内部スロットを持たない。
  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持つ。

27.3.3.1 GeneratorFunction.prototype.constructor

GeneratorFunction.prototype.constructor の初期値は %GeneratorFunction% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.3.3.2 GeneratorFunction.prototype.prototype

GeneratorFunction.prototype.prototype の初期値は %GeneratorPrototype% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.3.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "GeneratorFunction" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.3.4 GeneratorFunction インスタンス

すべての GeneratorFunction インスタンスは ECMAScript 関数オブジェクトであり、Table 25 に列挙される内部スロットを持つ。そのようなすべてのインスタンスについて、[[IsClassConstructor]] 内部スロットの値は false である。

各 GeneratorFunction インスタンスは、次の own プロパティを持つ:

27.3.4.1 length

20.2.4.1 で与えられる Function インスタンスの "length" プロパティの仕様は、GeneratorFunction インスタンスにも適用される。

27.3.4.2 name

20.2.4.2 で与えられる Function インスタンスの "name" プロパティの仕様は、GeneratorFunction インスタンスにも適用される。

27.3.4.3 prototype

GeneratorFunction インスタンスが作成されるたびに、別の通常のオブジェクトも作成され、それが generator function の "prototype" プロパティの初期値となる。prototype プロパティの値は、generator function オブジェクトが [[Call]] を使用して呼び出されたときに、新しく作成される Generator の [[Prototype]] 内部スロットを初期化するために使用される。

このプロパティは属性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

Note

Function インスタンスとは異なり、GeneratorFunction の "prototype" プロパティの値であるオブジェクトは、その値が GeneratorFunction インスタンスである "constructor" プロパティを持たない。

27.4 AsyncGeneratorFunction オブジェクト

AsyncGeneratorFunction は、通常 AsyncGeneratorDeclarationAsyncGeneratorExpression、および AsyncGeneratorMethod 構文生成規則を評価することによって作成される関数である。%AsyncGeneratorFunction% intrinsic を呼び出すことによって作成されることもある。

27.4.1 AsyncGeneratorFunction コンストラクター

AsyncGeneratorFunction コンストラクター:

  • %AsyncGeneratorFunction% である。
  • Function のサブクラスである。
  • コンストラクターとしてではなく関数として呼び出されたとき、新しい AsyncGeneratorFunction を作成し初期化する。したがって、関数呼び出し AsyncGeneratorFunction (...) は、同じ引数を持つオブジェクト作成式 new AsyncGeneratorFunction (...) と等価である。
  • クラス定義の extends 節の値として使用してよい。指定された AsyncGeneratorFunction の動作を継承することを意図するサブクラスコンストラクターは、built-in AsyncGeneratorFunction の動作に必要な内部スロットを持つサブクラスインスタンスを作成し初期化するため、AsyncGeneratorFunction コンストラクターへの super 呼び出しを含まなければならない。async generator function オブジェクトを定義するすべての ECMAScript 構文形式は、AsyncGeneratorFunction の直接インスタンスを作成する。AsyncGeneratorFunction サブクラスのインスタンスを作成する構文上の手段は存在しない。

27.4.1.1 AsyncGeneratorFunction ( ...parameterArgs, bodyArg )

最後の引数(存在する場合)は async generator function の本体(実行可能コード)を指定し、それより前の任意の引数は仮引数を指定する。

この関数は、呼び出されたとき次の手順を実行する:

  1. activeFunc をアクティブな関数オブジェクトとする。
  2. bodyArg が存在しないならば、bodyArg を空の String に設定する。
  3. CreateDynamicFunction(activeFunc, NewTarget, async-generator, parameterArgs, bodyArg) を返す。
Note

20.2.1.1NOTE を参照。

27.4.2 AsyncGeneratorFunction コンストラクターのプロパティ

AsyncGeneratorFunction コンストラクター:

  • Function コンストラクターから継承する標準 built-in 関数オブジェクトである。
  • 値が %Function% である [[Prototype]] 内部スロットを持つ。
  • 値が 1𝔽 である "length" プロパティを持つ。
  • 値が "AsyncGeneratorFunction" である "name" プロパティを持つ。
  • 次のプロパティを持つ:

27.4.2.1 AsyncGeneratorFunction.prototype

AsyncGeneratorFunction.prototype の初期値は AsyncGeneratorFunction プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

27.4.3 AsyncGeneratorFunction プロトタイプオブジェクトのプロパティ

AsyncGeneratorFunction プロトタイプオブジェクト

  • %AsyncGeneratorFunction.prototype% である。
  • 通常のオブジェクトである。
  • 関数オブジェクトではなく、[[ECMAScriptCode]] 内部スロット、または Table 25 もしくは Table 90 に列挙されるその他の内部スロットを持たない。
  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持つ。

27.4.3.1 AsyncGeneratorFunction.prototype.constructor

AsyncGeneratorFunction.prototype.constructor の初期値は %AsyncGeneratorFunction% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.4.3.2 AsyncGeneratorFunction.prototype.prototype

AsyncGeneratorFunction.prototype.prototype の初期値は %AsyncGeneratorPrototype% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.4.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "AsyncGeneratorFunction" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.4.4 AsyncGeneratorFunction インスタンス

すべての AsyncGeneratorFunction インスタンスは ECMAScript 関数オブジェクトであり、Table 25 に列挙される内部スロットを持つ。そのようなすべてのインスタンスについて、[[IsClassConstructor]] 内部スロットの値は false である。

各 AsyncGeneratorFunction インスタンスは、次の own プロパティを持つ:

27.4.4.1 length

"length" プロパティの値は、AsyncGeneratorFunction が通常期待する引数の個数を示す整数の Number である。ただし、この言語は、関数が他の個数の引数で呼び出されることを許容する。"length" プロパティによって指定された個数以外の引数で呼び出されたときの AsyncGeneratorFunction の動作は、その関数に依存する。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.4.4.2 name

20.2.4.2 で与えられる Function インスタンスの "name" プロパティの仕様は、AsyncGeneratorFunction インスタンスにも適用される。

27.4.4.3 prototype

AsyncGeneratorFunction インスタンスが作成されるたびに、別の通常のオブジェクトも作成され、それが async generator function の "prototype" プロパティの初期値となる。prototype プロパティの値は、generator function オブジェクトが [[Call]] を使用して呼び出されたときに、新しく作成される AsyncGenerator の [[Prototype]] 内部スロットを初期化するために使用される。

このプロパティは属性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

Note

function インスタンスとは異なり、AsyncGeneratorFunction の "prototype" プロパティの値であるオブジェクトは、その値が AsyncGeneratorFunction インスタンスである "constructor" プロパティを持たない。

27.5 Generator オブジェクト

Generator は generator function を呼び出すことによって作成され、iterator インターフェイスiterable インターフェイスの両方に適合する。

Generator インスタンスは、そのインスタンスを作成した generator function の "prototype" プロパティの初期値から直接プロパティを継承する。Generator インスタンスは %GeneratorPrototype% から間接的にプロパティを継承する。

27.5.1 %GeneratorPrototype% オブジェクト

%GeneratorPrototype% オブジェクト:

  • %GeneratorFunction.prototype.prototype% である。
  • 通常のオブジェクトである。
  • Generator インスタンスではなく、[[GeneratorState]] 内部スロットを持たない。
  • 値が %Iterator.prototype% である [[Prototype]] 内部スロットを持つ。
  • すべての Generator インスタンスによって間接的に継承されるプロパティを持つ。

27.5.1.1 %GeneratorPrototype%.constructor

%GeneratorPrototype%.constructor の初期値は %GeneratorFunction.prototype% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.5.1.2 %GeneratorPrototype%.next ( value )

  1. GeneratorResume(this value, value, empty) を返す。

27.5.1.3 %GeneratorPrototype%.return ( value )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. generatorthis value とする。
  2. completionReturnCompletion(value) とする。
  3. GeneratorResumeAbrupt(generator, completion, empty) を返す。

27.5.1.4 %GeneratorPrototype%.throw ( exception )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. generatorthis value とする。
  2. completionThrowCompletion(exception) とする。
  3. GeneratorResumeAbrupt(generator, completion, empty) を返す。

27.5.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "Generator" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.5.2 Generator インスタンスのプロパティ

Generator インスタンスは、Table 89 に記述される内部スロットを持って最初に作成される。

Table 89: Generator インスタンスの内部スロット
内部スロット 説明
[[GeneratorState]] suspended-start, suspended-yield, executing, または completed generator の現在の実行状態。
[[GeneratorContext]] execution context この generator のコードを実行するときに使用される実行コンテキスト。
[[GeneratorBrand]] String または empty 異なる種類の generator を区別するために使用される brand。ECMAScript ソーステキストによって宣言された generator の [[GeneratorBrand]] は常に empty である。

27.5.3 Generator 抽象操作

27.5.3.1 GeneratorStart ( generator, generatorBody )

The abstract operation GeneratorStart takes arguments generator (Generator) and generatorBody (FunctionBody Parse Node またはパラメータを持たない Abstract Closure) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[GeneratorState]]suspended-start である。
  2. genContext を実行中の実行コンテキストとする。
  3. genContext の Generator コンポーネントを generator に設定する。
  4. closure を、generatorBody をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. acGenContext を実行中の実行コンテキストとする。
    2. acGeneratoracGenContext の Generator コンポーネントとする。
    3. generatorBodyParse Node であるならば、
      1. resultgeneratorBodyEvaluationCompletion とする。
    4. そうでなければ、
      1. Assert: generatorBody はパラメータを持たない Abstract Closure である。
      2. resultCompletion(generatorBody()) とする。
    5. Assert: ここに戻ってきたならば、generator は例外を投げたか、暗黙的または明示的な return のいずれかを実行した。
    6. acGenContext を実行コンテキストスタックから取り除き、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する。
    7. acGenerator.[[GeneratorState]]completed に設定する。
    8. NOTE: generator が completed 状態に入ると、それは二度とその状態を離れず、関連付けられた実行コンテキストは二度と再開されない。この時点で、acGenerator に関連付けられた任意の実行状態は破棄できる。
    9. resultnormal completion であるならば、
      1. resultValueundefined とする。
    10. そうではなく resultreturn completion であるならば、
      1. resultValueresult.[[Value]] とする。
    11. そうでなければ、
      1. Assert: resultthrow completion である。
      2. result を返す。
    12. NormalCompletion(CreateIteratorResultObject(resultValue, true)) を返す。
  5. genContext のコード評価状態を、その実行コンテキストについて評価が再開されたときに、closure が引数なしで呼び出されるように設定する。
  6. generator.[[GeneratorContext]]genContext に設定する。
  7. unused を返す。

27.5.3.2 GeneratorValidate ( generator, generatorBrand )

The abstract operation GeneratorValidate takes arguments generator (ECMAScript 言語値) and generatorBrand (String または empty) and returns suspended-startsuspended-yield、または completed のいずれかを含む normal completion、または throw completion のいずれか. It performs the following steps when called:

  1. RequireInternalSlot(generator, [[GeneratorState]]) を実行する。
  2. RequireInternalSlot(generator, [[GeneratorBrand]]) を実行する。
  3. generator.[[GeneratorBrand]]generatorBrand でないならば、TypeError 例外を投げる。
  4. Assert: generator[[GeneratorContext]] 内部スロットを持つ。
  5. stategenerator.[[GeneratorState]] とする。
  6. stateexecuting であるならば、TypeError 例外を投げる。
  7. state を返す。

27.5.3.3 GeneratorResume ( generator, value, generatorBrand )

The abstract operation GeneratorResume takes arguments generator (ECMAScript 言語値), value (ECMAScript 言語値または empty), and generatorBrand (String または empty) and returns ECMAScript 言語値を含む normal completion または throw completion のいずれか. It performs the following steps when called:

  1. state を ? GeneratorValidate(generator, generatorBrand) とする。
  2. statecompleted である場合、CreateIteratorResultObject(undefined, true) を返す。
  3. Assert: statesuspended-start または suspended-yield のいずれかである。
  4. genContextgenerator.[[GeneratorContext]] とする。
  5. generator.[[GeneratorState]]executing に設定する。
  6. RunSuspendedContext(genContext, NormalCompletion(value)) を返す。

27.5.3.4 GeneratorResumeAbrupt ( generator, abruptCompletion, generatorBrand )

The abstract operation GeneratorResumeAbrupt takes arguments generator (ECMAScript 言語値), abruptCompletion (return completion または throw completion), and generatorBrand (String または empty) and returns ECMAScript 言語値を含む normal completion または throw completion のいずれか. It performs the following steps when called:

  1. state を ? GeneratorValidate(generator, generatorBrand) とする。
  2. statesuspended-start である場合、
    1. generator.[[GeneratorState]]completed に設定する。
    2. NOTE: ジェネレーターはいったん completed 状態に入ると、そこから離れることはなく、それに関連付けられた実行コンテキストが再開されることもない。この時点で、generator に関連付けられた任意の実行状態を破棄できる。
    3. statecompleted に設定する。
  3. statecompleted である場合、
    1. abruptCompletion が return 完了である場合、
      1. CreateIteratorResultObject(abruptCompletion.[[Value]], true) を返す。
    2. abruptCompletion を返す。
  4. Assert: statesuspended-yield である。
  5. genContextgenerator.[[GeneratorContext]] とする。
  6. generator.[[GeneratorState]]executing に設定する。
  7. RunSuspendedContext(genContext, abruptCompletion) を返す。

27.5.3.5 GetGeneratorKind ( )

The abstract operation GetGeneratorKind takes no arguments and returns non-generator, sync, or async. It performs the following steps when called:

  1. genContext を実行中の実行コンテキストとする。
  2. genContext が Generator コンポーネントを持たないならば、non-generator を返す。
  3. generatorgenContext の Generator コンポーネントとする。
  4. generator[[AsyncGeneratorState]] 内部スロットを持つならば、async を返す。
  5. sync を返す。

27.5.3.6 GeneratorYield ( iteratorResult )

The abstract operation GeneratorYield takes argument iteratorResult (IteratorResult インターフェイスに適合する Object) and returns ECMAScript 言語値を含む normal completion または abrupt completion のいずれか. It performs the following steps when called:

  1. genContext を実行中の実行コンテキストとする。
  2. Assert: genContext は generator の実行コンテキストである。
  3. generatorgenContext の Generator コンポーネントの値とする。
  4. Assert: GetGeneratorKind() は sync である。
  5. generator.[[GeneratorState]]suspended-yield に設定する。
  6. genContext を実行コンテキストスタックから取り除き、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する。
  7. callerContext を実行中の実行コンテキストとする。
  8. NormalCompletion(iteratorResult) を渡して callerContext を再開する。genContext が再び再開された場合、resumptionValue をそれが再開された Completion Record とする。
  9. Assert: ここに制御が到達したならば、genContext は再び実行中の実行コンテキストである。
  10. resumptionValue を返す。

27.5.3.7 Yield ( value )

The abstract operation Yield takes argument value (ECMAScript 言語値) and returns ECMAScript 言語値を含む normal completion または abrupt completion のいずれか. It performs the following steps when called:

  1. generatorKindGetGeneratorKind() とする。
  2. generatorKindasync であるならば、? AsyncGeneratorYield(? Await(value)) を返す。
  3. GeneratorYield(CreateIteratorResultObject(value, false)) を返す。

27.5.3.8 CreateIteratorFromClosure ( closure, generatorBrand, generatorPrototype [ , extraSlots ] )

The abstract operation CreateIteratorFromClosure takes arguments closure (パラメータを持たない Abstract Closure), generatorBrand (String または empty), and generatorPrototype (Object) and optional argument extraSlots (内部スロット名の List) and returns Generator. It performs the following steps when called:

  1. NOTE: closure は、IteratorResult オブジェクトを yield するために Yield 操作の使用を含むことができる。
  2. extraSlots が存在しないならば、extraSlots を新しい空の List に設定する。
  3. internalSlotsListextraSlots と « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] » のリスト連結とする。
  4. generatorOrdinaryObjectCreate(generatorPrototype, internalSlotsList) とする。
  5. generator.[[GeneratorBrand]]generatorBrand に設定する。
  6. generator.[[GeneratorState]]suspended-start に設定する。
  7. callerContext を実行中の実行コンテキストとする。
  8. calleeContext を新しい実行コンテキストとする。
  9. calleeContext の Function を null に設定する。
  10. calleeContextRealm を現在の Realm Record に設定する。
  11. calleeContext の ScriptOrModule を callerContext の ScriptOrModule に設定する。
  12. callerContext がまだ suspended でないならば、callerContext を suspend する。
  13. calleeContext を実行コンテキストスタックに push する。calleeContext はここで実行中の実行コンテキストとなる。
  14. GeneratorStart(generator, closure) を実行する。
  15. calleeContext を実行コンテキストスタックから取り除き、callerContext を実行中の実行コンテキストとして復元する。
  16. generator を返す。

27.6 AsyncGenerator オブジェクト

AsyncGenerator は async generator function を呼び出すことによって作成され、async iterator インターフェイスasync iterable インターフェイスの両方に適合する。

AsyncGenerator インスタンスは、そのインスタンスを作成した async generator function の "prototype" プロパティの初期値から直接プロパティを継承する。AsyncGenerator インスタンスは %AsyncGeneratorPrototype% から間接的にプロパティを継承する。

27.6.1 %AsyncGeneratorPrototype% オブジェクト

%AsyncGeneratorPrototype% オブジェクト:

  • %AsyncGeneratorFunction.prototype.prototype% である。
  • 通常のオブジェクトである。
  • AsyncGenerator インスタンスではなく、[[AsyncGeneratorState]] 内部スロットを持たない。
  • 値が %AsyncIteratorPrototype% である [[Prototype]] 内部スロットを持つ。
  • すべての AsyncGenerator インスタンスによって間接的に継承されるプロパティを持つ。

27.6.1.1 %AsyncGeneratorPrototype%.constructor

%AsyncGeneratorPrototype%.constructor の初期値は %AsyncGeneratorFunction.prototype% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.6.1.2 %AsyncGeneratorPrototype%.next ( value )

  1. generatorthis value とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. resultCompletion(AsyncGeneratorValidate(generator, empty)) とする。
  4. IfAbruptRejectPromise(result, promiseCapability)。
  5. stategenerator.[[AsyncGeneratorState]] とする。
  6. statecompleted であるならば、
    1. iteratorResultCreateIteratorResultObject(undefined, true) とする。
    2. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») を実行する。
    3. promiseCapability.[[Promise]] を返す。
  7. completionNormalCompletion(value) とする。
  8. AsyncGeneratorEnqueue(generator, completion, promiseCapability) を実行する。
  9. statesuspended-start または suspended-yield のいずれかであるならば、
    1. AsyncGeneratorResume(generator, completion) を実行する。
  10. そうでなければ、
    1. Assert: stateexecuting または draining-queue のいずれかである。
  11. promiseCapability.[[Promise]] を返す。

27.6.1.3 %AsyncGeneratorPrototype%.return ( value )

  1. generatorthis value とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. resultCompletion(AsyncGeneratorValidate(generator, empty)) とする。
  4. IfAbruptRejectPromise(result, promiseCapability)。
  5. completionReturnCompletion(value) とする。
  6. AsyncGeneratorEnqueue(generator, completion, promiseCapability) を実行する。
  7. stategenerator.[[AsyncGeneratorState]] とする。
  8. statesuspended-start または completed のいずれかであるならば、
    1. generator.[[AsyncGeneratorState]]draining-queue に設定する。
    2. AsyncGeneratorAwaitReturn(generator) を実行する。
  9. そうではなく statesuspended-yield であるならば、
    1. AsyncGeneratorResume(generator, completion) を実行する。
  10. そうでなければ、
    1. Assert: stateexecuting または draining-queue のいずれかである。
  11. promiseCapability.[[Promise]] を返す。

27.6.1.4 %AsyncGeneratorPrototype%.throw ( exception )

  1. generatorthis value とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. resultCompletion(AsyncGeneratorValidate(generator, empty)) とする。
  4. IfAbruptRejectPromise(result, promiseCapability)。
  5. stategenerator.[[AsyncGeneratorState]] とする。
  6. statesuspended-start であるならば、
    1. generator.[[AsyncGeneratorState]]completed に設定する。
    2. statecompleted に設定する。
  7. statecompleted であるならば、
    1. Call(promiseCapability.[[Reject]], undefined, « exception ») を実行する。
    2. promiseCapability.[[Promise]] を返す。
  8. completionThrowCompletion(exception) とする。
  9. AsyncGeneratorEnqueue(generator, completion, promiseCapability) を実行する。
  10. statesuspended-yield であるならば、
    1. AsyncGeneratorResume(generator, completion) を実行する。
  11. そうでなければ、
    1. Assert: stateexecuting または draining-queue のいずれかである。
  12. promiseCapability.[[Promise]] を返す。

27.6.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "AsyncGenerator" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.6.2 AsyncGenerator インスタンスのプロパティ

AsyncGenerator インスタンスは、以下に記述される内部スロットを持って最初に作成される:

Table 90: AsyncGenerator インスタンスの内部スロット
内部スロット 説明
[[AsyncGeneratorState]] suspended-start, suspended-yield, executing, draining-queue, または completed async generator の現在の実行状態。
[[AsyncGeneratorContext]] execution context この async generator のコードを実行するときに使用される実行コンテキスト。
[[AsyncGeneratorQueue]] AsyncGeneratorRequest RecordList async generator を再開する要求を表す Record。状態遷移中を除き、[[AsyncGeneratorState]]executing または draining-queue のいずれかである場合に、かつその場合に限り空でない。
[[GeneratorBrand]] String または empty 異なる種類の async generator を区別するために使用される brand。ECMAScript ソーステキストによって宣言された async generator の [[GeneratorBrand]] は常に empty である。

27.6.3 AsyncGenerator 抽象操作

27.6.3.1 AsyncGeneratorRequest Record

AsyncGeneratorRequest は、async generator がどのように再開されるべきかについての情報を格納するために使用され、対応する promise を fulfill または reject するための capability を含む Record 値である。

これは次のフィールドを持つ:

Table 91: AsyncGeneratorRequest Record のフィールド
フィールド名 意味
[[Completion]] Completion Record async generator を再開するために使用されるべき Completion Record
[[Capability]] PromiseCapability Record この要求に関連付けられた promise capability。

27.6.3.2 AsyncGeneratorStart ( generator, generatorBody )

The abstract operation AsyncGeneratorStart takes arguments generator (AsyncGenerator) and generatorBody (FunctionBody Parse Node またはパラメータを持たない Abstract Closure) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorState]]suspended-start である。
  2. genContext を実行中の実行コンテキストとする。
  3. genContext の Generator コンポーネントを generator に設定する。
  4. closure を、generatorBody をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. acGenContext を実行中の実行コンテキストとする。
    2. acGeneratoracGenContext の Generator コンポーネントとする。
    3. generatorBodyParse Node であるならば、
      1. resultgeneratorBodyEvaluationCompletion とする。
    4. そうでなければ、
      1. Assert: generatorBody はパラメータを持たない Abstract Closure である。
      2. resultCompletion(generatorBody()) とする。
    5. Assert: ここに戻ってきたならば、async generator は例外を投げたか、暗黙的または明示的な return のいずれかを実行した。
    6. acGenContext を実行コンテキストスタックから取り除き、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する。
    7. acGenerator.[[AsyncGeneratorState]]draining-queue に設定する。
    8. resultnormal completion であるならば、resultNormalCompletion(undefined) に設定する。
    9. resultreturn completion であるならば、resultNormalCompletion(result.[[Value]]) に設定する。
    10. AsyncGeneratorCompleteStep(acGenerator, result, true) を実行する。
    11. AsyncGeneratorDrainQueue(acGenerator) を実行する。
    12. NormalCompletion(undefined) を返す。
  5. genContext のコード評価状態を、その実行コンテキストについて評価が再開されたときに、closure が引数なしで呼び出されるように設定する。
  6. generator.[[AsyncGeneratorContext]]genContext に設定する。
  7. generator.[[AsyncGeneratorQueue]] を新しい空の List に設定する。
  8. unused を返す。

27.6.3.3 AsyncGeneratorValidate ( generator, generatorBrand )

The abstract operation AsyncGeneratorValidate takes arguments generator (ECMAScript 言語値) and generatorBrand (String または empty) and returns unused を含む normal completion または throw completion のいずれか. It performs the following steps when called:

  1. RequireInternalSlot(generator, [[AsyncGeneratorContext]]) を実行する。
  2. RequireInternalSlot(generator, [[AsyncGeneratorState]]) を実行する。
  3. RequireInternalSlot(generator, [[AsyncGeneratorQueue]]) を実行する。
  4. generator.[[GeneratorBrand]]generatorBrand でないならば、TypeError 例外を投げる。
  5. unused を返す。

27.6.3.4 AsyncGeneratorEnqueue ( generator, completion, promiseCapability )

The abstract operation AsyncGeneratorEnqueue takes arguments generator (AsyncGenerator), completion (Completion Record), and promiseCapability (PromiseCapability Record) and returns unused. It performs the following steps when called:

  1. requestAsyncGeneratorRequest { [[Completion]]: completion, [[Capability]]: promiseCapability } とする。
  2. requestgenerator.[[AsyncGeneratorQueue]] に追加する。
  3. unused を返す。

27.6.3.5 AsyncGeneratorCompleteStep ( generator, completion, done [ , realm ] )

The abstract operation AsyncGeneratorCompleteStep takes arguments generator (AsyncGenerator), completion (Completion Record), and done (Boolean) and optional argument realm (Realm Record) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorQueue]] は空でない。
  2. nextgenerator.[[AsyncGeneratorQueue]] の最初の要素とする。
  3. 最初の要素を generator.[[AsyncGeneratorQueue]] から取り除く。
  4. promiseCapabilitynext.[[Capability]] とする。
  5. valuecompletion.[[Value]] とする。
  6. completionthrow completion であるならば、
    1. Call(promiseCapability.[[Reject]], undefined, « value ») を実行する。
  7. そうでなければ、
    1. Assert: completionnormal completion である。
    2. realm が存在するならば、
      1. oldRealm を実行中の実行コンテキストの Realm とする。
      2. 実行中の実行コンテキストの Realmrealm に設定する。
      3. iteratorResultCreateIteratorResultObject(value, done) とする。
      4. 実行中の実行コンテキストの RealmoldRealm に設定する。
    3. そうでなければ、
      1. iteratorResultCreateIteratorResultObject(value, done) とする。
    4. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») を実行する。
  8. unused を返す。

27.6.3.6 AsyncGeneratorResume ( generator, completion )

The abstract operation AsyncGeneratorResume takes arguments generator (AsyncGenerator) and completion (Completion Record) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorState]]suspended-start または suspended-yield のいずれかである。
  2. genContextgenerator.[[AsyncGeneratorContext]] とする。
  3. generator.[[AsyncGeneratorState]]executing に設定する。
  4. RunSuspendedContext(genContext, completion) を実行する。
  5. unused を返す。

27.6.3.7 AsyncGeneratorUnwrapYieldResumption ( resumptionValue )

The abstract operation AsyncGeneratorUnwrapYieldResumption takes argument resumptionValue (Completion Record) and returns ECMAScript 言語値を含む normal completion または abrupt completion のいずれか. It performs the following steps when called:

  1. resumptionValuereturn completion でないならば、? resumptionValue を返す。
  2. awaitedCompletion(Await(resumptionValue.[[Value]])) とする。
  3. awaitedthrow completion であるならば、? awaited を返す。
  4. Assert: awaitednormal completion である。
  5. ReturnCompletion(awaited.[[Value]]) を返す。

27.6.3.8 AsyncGeneratorYield ( value )

The abstract operation AsyncGeneratorYield takes argument value (ECMAScript 言語値) and returns ECMAScript 言語値を含む normal completion または abrupt completion のいずれか. It performs the following steps when called:

  1. genContext を実行中の実行コンテキストとする。
  2. Assert: genContext は generator の実行コンテキストである。
  3. generatorgenContext の Generator コンポーネントの値とする。
  4. Assert: GetGeneratorKind() は async である。
  5. completionNormalCompletion(value) とする。
  6. Assert: 実行コンテキストスタックは少なくとも 2 つの要素を持つ。
  7. previousContext を実行コンテキストスタックの上から 2 番目の要素とする。
  8. previousRealmpreviousContextRealm とする。
  9. AsyncGeneratorCompleteStep(generator, completion, false, previousRealm) を実行する。
  10. queuegenerator.[[AsyncGeneratorQueue]] とする。
  11. queue が空でないならば、
    1. NOTE: 実行は generator を suspend せずに継続する。
    2. toYieldqueue の最初の要素とする。
    3. resumptionValueCompletion(toYield.[[Completion]]) とする。
    4. AsyncGeneratorUnwrapYieldResumption(resumptionValue) を返す。
  12. generator.[[AsyncGeneratorState]]suspended-yield に設定する。
  13. genContext を実行コンテキストスタックから取り除き、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する。
  14. callerContext を実行中の実行コンテキストとする。
  15. undefined を渡して callerContext を再開する。genContext が再び再開された場合、resumptionValue をそれが再開された Completion Record とする。
  16. Assert: ここに制御が到達したならば、genContext は再び実行中の実行コンテキストである。
  17. AsyncGeneratorUnwrapYieldResumption(resumptionValue) を返す。

27.6.3.9 AsyncGeneratorAwaitReturn ( generator )

The abstract operation AsyncGeneratorAwaitReturn takes argument generator (AsyncGenerator) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorState]]draining-queue である。
  2. queuegenerator.[[AsyncGeneratorQueue]] とする。
  3. Assert: queue は空でない。
  4. nextqueue の最初の要素とする。
  5. completionCompletion(next.[[Completion]]) とする。
  6. Assert: completionreturn completion である。
  7. promiseCompletionCompletion(PromiseResolve(%Promise%, completion.[[Value]])) とする。
  8. promiseCompletionabrupt completion であるならば、
    1. AsyncGeneratorCompleteStep(generator, promiseCompletion, true) を実行する。
    2. AsyncGeneratorDrainQueue(generator) を実行する。
    3. unused を返す。
  9. Assert: promiseCompletionnormal completion である。
  10. promisepromiseCompletion.[[Value]] とする。
  11. fulfilledClosure を、generator をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (value) を持つ新しい Abstract Closure とする:
    1. Assert: generator.[[AsyncGeneratorState]]draining-queue である。
    2. resultNormalCompletion(value) とする。
    3. AsyncGeneratorCompleteStep(generator, result, true) を実行する。
    4. AsyncGeneratorDrainQueue(generator) を実行する。
    5. NormalCompletion(undefined) を返す。
  12. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « ») とする。
  13. rejectedClosure を、generator をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (reason) を持つ新しい Abstract Closure とする:
    1. Assert: generator.[[AsyncGeneratorState]]draining-queue である。
    2. resultThrowCompletion(reason) とする。
    3. AsyncGeneratorCompleteStep(generator, result, true) を実行する。
    4. AsyncGeneratorDrainQueue(generator) を実行する。
    5. NormalCompletion(undefined) を返す。
  14. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « ») とする。
  15. PerformPromiseThen(promise, onFulfilled, onRejected) を実行する。
  16. unused を返す。

27.6.3.10 AsyncGeneratorDrainQueue ( generator )

The abstract operation AsyncGeneratorDrainQueue takes argument generator (AsyncGenerator) and returns unused. これは、return completion を保持する AsyncGeneratorRequest に遭遇するまで、generator の AsyncGeneratorQueue を drain する。 It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorState]]draining-queue である。
  2. queuegenerator.[[AsyncGeneratorQueue]] とする。
  3. queue が空でない間、繰り返す:
    1. nextqueue の最初の要素とする。
    2. completionCompletion(next.[[Completion]]) とする。
    3. completionreturn completion であるならば、
      1. AsyncGeneratorAwaitReturn(generator) を実行する。
      2. unused を返す。
    4. completionnormal completion であるならば、
      1. completionNormalCompletion(undefined) に設定する。
    5. AsyncGeneratorCompleteStep(generator, completion, true) を実行する。
  4. generator.[[AsyncGeneratorState]]completed に設定する。
  5. unused を返す。

27.7 AsyncFunction オブジェクト

AsyncFunction は、通常 AsyncFunctionDeclarationAsyncFunctionExpressionAsyncMethod、および AsyncArrowFunction を評価することによって作成される関数である。%AsyncFunction% intrinsic を呼び出すことによって作成されることもある。

27.7.1 AsyncFunction コンストラクター

AsyncFunction コンストラクター:

  • %AsyncFunction% である。
  • Function のサブクラスである。
  • コンストラクターとしてではなく関数として呼び出されたとき、新しい AsyncFunction を作成し初期化する。したがって、関数呼び出し AsyncFunction(…) は、同じ引数を持つオブジェクト作成式 new AsyncFunction(…) と等価である。
  • クラス定義の extends 節の値として使用してよい。指定された AsyncFunction の動作を継承することを意図するサブクラスコンストラクターは、built-in async function の動作に必要な内部スロットを持つサブクラスインスタンスを作成し初期化するため、AsyncFunction コンストラクターへの super 呼び出しを含まなければならない。async function オブジェクトを定義するすべての ECMAScript 構文形式は、AsyncFunction の直接インスタンスを作成する。AsyncFunction サブクラスのインスタンスを作成する構文上の手段は存在しない。

27.7.1.1 AsyncFunction ( ...parameterArgs, bodyArg )

最後の引数(存在する場合)は async function の本体(実行可能コード)を指定する。それより前の任意の引数は仮引数を指定する。

この関数は、呼び出されたとき次の手順を実行する:

  1. activeFunc をアクティブな関数オブジェクトとする。
  2. bodyArg が存在しないならば、bodyArg を空の String に設定する。
  3. CreateDynamicFunction(activeFunc, NewTarget, async, parameterArgs, bodyArg) を返す。
Note
20.2.1.1NOTE を参照。

27.7.2 AsyncFunction コンストラクターのプロパティ

AsyncFunction コンストラクター:

  • Function コンストラクターから継承する標準 built-in 関数オブジェクトである。
  • 値が %Function% である [[Prototype]] 内部スロットを持つ。
  • 値が 1𝔽 である "length" プロパティを持つ。
  • 値が "AsyncFunction" である "name" プロパティを持つ。
  • 次のプロパティを持つ:

27.7.2.1 AsyncFunction.prototype

AsyncFunction.prototype の初期値は AsyncFunction プロトタイプオブジェクトである。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

27.7.3 AsyncFunction プロトタイプオブジェクトのプロパティ

AsyncFunction プロトタイプオブジェクト

  • %AsyncFunction.prototype% である。
  • 通常のオブジェクトである。
  • 関数オブジェクトではなく、[[ECMAScriptCode]] 内部スロット、または Table 25 に列挙されるその他の内部スロットを持たない。
  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持つ。

27.7.3.1 AsyncFunction.prototype.constructor

AsyncFunction.prototype.constructor の初期値は %AsyncFunction% である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.7.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "AsyncFunction" である。

このプロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } を持つ。

27.7.4 AsyncFunction インスタンス

すべての AsyncFunction インスタンスは ECMAScript 関数オブジェクトであり、Table 25 に列挙される内部スロットを持つ。そのようなすべてのインスタンスについて、[[IsClassConstructor]] 内部スロットの値は false である。AsyncFunction インスタンスはコンストラクターではなく、[[Construct]] 内部メソッドを持たない。AsyncFunction インスタンスは constructable ではないため、prototype プロパティを持たない。

各 AsyncFunction インスタンスは、次の own プロパティを持つ:

27.7.4.1 length

20.2.4.1 で与えられる Function インスタンスの "length" プロパティの仕様は、AsyncFunction インスタンスにも適用される。

27.7.4.2 name

20.2.4.2 で与えられる Function インスタンスの "name" プロパティの仕様は、AsyncFunction インスタンスにも適用される。

27.7.5 Async Functions 抽象操作

27.7.5.1 AsyncFunctionStart ( promiseCapability, asyncFunctionBody )

The abstract operation AsyncFunctionStart takes arguments promiseCapability (PromiseCapability Record) and asyncFunctionBody (FunctionBody Parse NodeExpressionBody Parse Node、またはパラメータを持たない Abstract Closure) and returns unused. It performs the following steps when called:

  1. runningContext を実行中の実行コンテキストとする。
  2. asyncContextrunningContext のコピーとする。
  3. NOTE: 実行状態のコピーは、AsyncBlockStart がその実行を再開するために必要である。現在実行中のコンテキストを再開することは未定義である。
  4. AsyncBlockStart(promiseCapability, asyncFunctionBody, asyncContext) を実行する。
  5. unused を返す。

27.7.5.2 AsyncBlockStart ( promiseCapability, asyncBody, asyncContext )

The abstract operation AsyncBlockStart takes arguments promiseCapability (PromiseCapability Record), asyncBody (Parse Node またはパラメータを持たない Abstract Closure), and asyncContext (execution context) and returns unused. It performs the following steps when called:

  1. closure を、パラメーターを持たず、promiseCapabilityasyncBody を捕捉する新しい抽象クロージャーとし、呼び出されたときに次の手順を実行するものとする:
    1. acAsyncContext を実行中の実行コンテキストとする。
    2. asyncBody が構文解析ノードである場合、
      1. resultCompletion(asyncBody の評価) とする。
    3. そうでない場合、
      1. Assert: asyncBody はパラメーターを持たない抽象クロージャーである。
      2. resultCompletion(asyncBody()) とする。
    4. Assert: ここに戻ってきた場合、その async 関数は例外を投げたか、暗黙的または明示的な return を実行したかのいずれかであり、すべての await は完了している。
    5. acAsyncContext を実行コンテキストスタックから取り除き、実行コンテキストスタックの先頭にある実行コンテキストを実行中の実行コンテキストとして復元する。
    6. result が正常完了である場合、
      1. Call(promiseCapability.[[Resolve]], undefined, « undefined ») を実行する。
    7. そうでなく result が return 完了である場合、
      1. Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] ») を実行する。
    8. そうでない場合、
      1. Assert: result は throw 完了である。
      2. Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] ») を実行する。
    9. NormalCompletion(unused) を返す。
  2. asyncContext のコード評価状態を、当該実行コンテキストについて評価が再開されたときに closure が引数なしで呼び出されるように設定する。
  3. result を ! RunSuspendedContext(asyncContext, NormalCompletion(empty)) とする。
  4. Assert: resultunused である。
  5. NOTE: result 値の可能な発生源は Await、または async 関数が何も await しない場合は上記のステップ 1.i である。
  6. unused を返す。

27.7.5.3 Await ( value )

The abstract operation Await takes argument value (ECMAScript 言語値) and returns ECMAScript 言語値または empty のいずれかを含む normal completion、または throw completion のいずれか. It performs the following steps when called:

  1. asyncContext を実行中の実行コンテキストとする。
  2. promise を ? PromiseResolve(%Promise%, value) とする。
  3. fulfilledClosure を、パラメーター (v) を持ち、asyncContext を捕捉する新しい抽象クロージャーとし、呼び出されたときに次の手順を実行するものとする:
    1. Completion(RunSuspendedContext(asyncContext, NormalCompletion(v))) を実行する。
    2. NOTE: RunSuspendedContext によって返される完了レコードは意図的に無視される。
    3. NormalCompletion(undefined) を返す。
  4. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « ») とする。
  5. rejectedClosure を、パラメーター (reason) を持ち、asyncContext を捕捉する新しい抽象クロージャーとし、呼び出されたときに次の手順を実行するものとする:
    1. Completion(RunSuspendedContext(asyncContext, ThrowCompletion(reason))) を実行する。
    2. NOTE: RunSuspendedContext によって返される完了レコードは意図的に無視される。
    3. NormalCompletion(undefined) を返す。
  6. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « ») とする。
  7. PerformPromiseThen(promise, onFulfilled, onRejected) を実行する。
  8. asyncContext を実行コンテキストスタックから取り除き、実行コンテキストスタックの先頭にある実行コンテキストを実行中の実行コンテキストとして復元する。
  9. callerContext を実行中の実行コンテキストとする。
  10. empty を渡して callerContext を再開する。asyncContext が再び再開されることがあれば、それが再開されるときの完了レコードを completion とする。
  11. Assert: 制御がここに到達した場合、asyncContext は再び実行中の実行コンテキストである。
  12. completion を返す。

28 リフレクション

28.1 Reflect オブジェクト

Reflect オブジェクト:

  • %Reflect% である。
  • グローバルオブジェクト"Reflect" プロパティの初期値である。
  • 通常のオブジェクトである。
  • 値が %Object.prototype% である [[Prototype]] 内部スロットを持つ。
  • 関数オブジェクトではない。
  • [[Construct]] 内部メソッドを持たない。new 演算子でコンストラクターとして使用できない。
  • [[Call]] 内部メソッドを持たない。関数として呼び出すことはできない。

28.1.1 Reflect.apply ( target, thisArgument, argumentsList )

この関数は、呼び出されたとき次の手順を実行する:

  1. IsCallable(target) が false であれば、TypeError 例外を投げる。
  2. args を ? CreateListFromArrayLike(argumentsList) とする。
  3. PrepareForTailCall() を実行する。
  4. Call(target, thisArgument, args) を返す。

28.1.2 Reflect.construct ( target, argumentsList [ , newTarget ] )

この関数は、呼び出されたとき次の手順を実行する:

  1. IsConstructor(target) が false であれば、TypeError 例外を投げる。
  2. newTarget が存在しないならば、newTargettarget に設定する。
  3. そうではなく IsConstructor(newTarget) が false であれば、TypeError 例外を投げる。
  4. args を ? CreateListFromArrayLike(argumentsList) とする。
  5. Construct(target, args, newTarget) を返す。

28.1.3 Reflect.defineProperty ( target, propertyKey, attributes )

この関数は、呼び出されたとき次の手順を実行する:

  1. target が Object でなければ、TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. desc を ? ToPropertyDescriptor(attributes) とする。
  4. target.[[DefineOwnProperty]](key, desc) を返す。

28.1.4 Reflect.deleteProperty ( target, propertyKey )

この関数は、呼び出されたとき次の手順を実行する:

  1. target が Object でなければ、TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. target.[[Delete]](key) を返す。

28.1.5 Reflect.get ( target, propertyKey [ , receiver ] )

この関数は、呼び出されたとき次の手順を実行する:

  1. target が Object でなければ、TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. receiver が存在しないならば、
    1. receivertarget に設定する。
  4. target.[[Get]](key, receiver) を返す。

28.1.6 Reflect.getOwnPropertyDescriptor ( target, propertyKey )

この関数は、呼び出されたとき次の手順を実行する:

  1. target が Object でなければ、TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. desc を ? target.[[GetOwnProperty]](key) とする。
  4. FromPropertyDescriptor(desc) を返す。

28.1.7 Reflect.getPrototypeOf ( target )

この関数は、呼び出されたとき次の手順を実行する:

  1. target が Object でなければ、TypeError 例外を投げる。
  2. target.[[GetPrototypeOf]]() を返す。

28.1.8 Reflect.has ( target, propertyKey )

この関数は、呼び出されたとき次の手順を実行する:

  1. target が Object でなければ、TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. target.[[HasProperty]](key) を返す。

28.1.9 Reflect.isExtensible ( target )

この関数は、呼び出されたとき次の手順を実行する:

  1. target が Object でなければ、TypeError 例外を投げる。
  2. target.[[IsExtensible]]() を返す。

28.1.10 Reflect.ownKeys ( target )

この関数は、呼び出されたとき次の手順を実行する:

  1. target が Object でなければ、TypeError 例外を投げる。
  2. keys を ? target.[[OwnPropertyKeys]]() とする。
  3. CreateArrayFromList(keys) を返す。

28.1.11 Reflect.preventExtensions ( target )

この関数は、呼び出されたとき次の手順を実行する:

  1. target が Object でなければ、TypeError 例外を投げる。
  2. target.[[PreventExtensions]]() を返す。

28.1.12 Reflect.set ( target, propertyKey, value [ , receiver ] )

この関数は、呼び出されたとき次の手順を実行する:

  1. target が Object でなければ、TypeError 例外を投げる。
  2. key を ? ToPropertyKey(propertyKey) とする。
  3. receiver が存在しないならば、
    1. receivertarget に設定する。
  4. target.[[Set]](key, value, receiver) を返す。

28.1.13 Reflect.setPrototypeOf ( target, proto )

この関数は、呼び出されたとき次の手順を実行する:

  1. target が Object でなければ、TypeError 例外を投げる。
  2. proto が Object でなく、かつ protonull でないならば、TypeError 例外を投げる。
  3. target.[[SetPrototypeOf]](proto) を返す。

28.1.14 Reflect [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は 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 )

この関数は、呼び出されたとき次の手順を実行する:

  1. NewTarget が undefined であれば、TypeError 例外を投げる。
  2. ProxyCreate(target, handler) を返す。

28.2.2 Proxy コンストラクターのプロパティ

Proxy コンストラクター:

  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持つ。
  • Proxy オブジェクトは初期化を必要とする [[Prototype]] 内部スロットを持たないため、"prototype" プロパティを持たない。
  • 次のプロパティを持つ:

28.2.2.1 Proxy.revocable ( target, handler )

この関数は、revocable Proxy オブジェクトを作成する。

呼び出されたとき、次の手順を実行する:

  1. proxy を ? ProxyCreate(target, handler) とする。
  2. revokerClosure を、何もキャプチャせず、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. activeFunc をアクティブな関数オブジェクトとする。
    2. pactiveFunc.[[RevocableProxy]] とする。
    3. pnull であれば、NormalCompletion(undefined) を返す。
    4. activeFunc.[[RevocableProxy]]null に設定する。
    5. Assert: p は Proxy exotic object である。
    6. p.[[ProxyTarget]]null に設定する。
    7. p.[[ProxyHandler]]null に設定する。
    8. NormalCompletion(undefined) を返す。
  3. revokerCreateBuiltinFunction(revokerClosure, 0, "", « [[RevocableProxy]] ») とする。
  4. revoker.[[RevocableProxy]]proxy に設定する。
  5. resultOrdinaryObjectCreate(%Object.prototype%) とする。
  6. CreateDataPropertyOrThrow(result, "proxy", proxy) を実行する。
  7. CreateDataPropertyOrThrow(result, "revoke", revoker) を実行する。
  8. result を返す。

28.3 Module Namespace オブジェクト

Module Namespace Object は、モジュールの exported binding への実行時のプロパティベースのアクセスを提供する module namespace exotic object である。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 イベントの可能な順序付けを指定する。プログラムにデータ競合(以下で定義)がない場合、イベントの順序付けは逐次一貫であるように、すなわち各エージェントからの動作のインターリーブとして現れる。プログラムにデータ競合がある場合、共有メモリ操作は逐次一貫でないように現れ得る。例えば、プログラムは因果性に反する振る舞いやその他の驚くべき振る舞いを示し得る。これらの驚きは、コンパイラ変換および CPU の設計(例えば、アウトオブオーダー実行や投機)から生じる。メモリモデルは、プログラムが逐次一貫な振る舞いを示す正確な条件と、データ競合から読み取られる可能な値の両方を定義する。すなわち、未定義動作は存在しない。

メモリモデルは、評価中に SharedArrayBuffer 上の抽象操作または Atomics オブジェクト上のメソッドによって導入される Memory event に対する関係的制約として定義される。

Note

この節は、SharedArrayBuffer 上の抽象操作によって導入される Memory event に対する公理的モデルを提供する。このモデルは、この仕様の他の部分とは異なり、アルゴリズムとして表現できないことを強調しておく。抽象操作によるイベントの非決定的な導入は、ECMAScript 評価の操作的意味論とメモリモデルの公理的意味論との間のインターフェイスである。これらのイベントの意味論は、評価におけるすべてのイベントのグラフを考慮することによって定義される。これらは Static Semantics でも Runtime Semantics でもない。実証されたアルゴリズム的実装は存在せず、代わりに特定のイベントグラフが許可されるか禁止されるかを決定する制約の集合が存在する。

29.1 メモリモデルの基礎

共有メモリアクセス(読み取りおよび書き込み)は、以下で定義される 2 つのグループ、atomic access と data access に分けられる。atomic access は逐次一貫であり、すなわちエージェントクラスタ内のすべてのエージェントが合意するイベントの厳密な全順序が存在する。非 atomic access には、すべてのエージェントが合意する厳密な全順序は存在しない、すなわち unordered である。

Note 1

release-acquire のような、逐次一貫より弱く unordered より強い順序付けはサポートされない。

Shared Data Block イベントは、ReadSharedMemoryWriteSharedMemory、または ReadModifyWriteSharedMemory Record のいずれかである。read event は、ReadSharedMemory または ReadModifyWriteSharedMemory のいずれかである。write event は、WriteSharedMemory または ReadModifyWriteSharedMemory のいずれかである。

Table 92: ReadSharedMemory イベントのフィールド
フィールド名 意味
[[Order]] seq-cst または unordered そのイベントについてメモリモデルが保証する最も弱い順序付け。
[[NoTear]] Boolean このイベントが、このイベントと等しいメモリ範囲を持つ複数の write event から読み取ることを許されるかどうか。
[[Block]] Shared Data Block そのイベントが操作するブロック。
[[ByteIndex]] 非負整数 [[Block]] 内の読み取りのバイトアドレス。
[[ElementSize]] 非負整数 読み取りのサイズ。
Table 93: WriteSharedMemory イベントのフィールド
フィールド名 意味
[[Order]] seq-cstunordered、または init そのイベントについてメモリモデルが保証する最も弱い順序付け。
[[NoTear]] Boolean このイベントが、このイベントと等しいメモリ範囲を持つ複数の read event から読み取られることを許されるかどうか。
[[Block]] Shared Data Block そのイベントが操作するブロック。
[[ByteIndex]] 非負整数 [[Block]] 内の書き込みのバイトアドレス。
[[ElementSize]] 非負整数 書き込みのサイズ。
[[Payload]] バイト値の List 他のイベントによって読み取られるバイト値の List
Table 94: ReadModifyWriteSharedMemory イベントのフィールド
フィールド名 意味
[[Order]] seq-cst read-modify-write イベントは常に逐次一貫である。
[[NoTear]] true read-modify-write イベントは tear しない。
[[Block]] Shared Data Block そのイベントが操作するブロック。
[[ByteIndex]] 非負整数 [[Block]] 内の read-modify-write のバイトアドレス。
[[ElementSize]] 非負整数 read-modify-write のサイズ。
[[Payload]] バイト値の List [[ModifyOp]] に渡されるバイト値の List
[[ModifyOp]] read-modify-write 変更関数 読み取られたバイト値の List[[Payload]] から変更されたバイト値の List を返す Abstract Closure

Shared Data Block イベントは、抽象操作または Atomics オブジェクト上のメソッドによって candidate execution Agent Events Record に導入される。一部の操作は、Synchronize イベントも導入する。これはフィールドを持たず、他のイベントの許可される順序付けを直接制約するためだけに存在する。最後に、host-specific イベントがある。Memory event は、Shared Data Block イベント、Synchronize イベント、またはそのような host-specific イベントのいずれかである。

Shared Data Block イベント eメモリ範囲を、e.[[ByteIndex]](含む)から e.[[ByteIndex]] + e.[[ElementSize]](含まない)までの区間内のすべての整数の Set とする。2 つのイベントのメモリ範囲は、それらのイベントが同じ [[Block]][[ByteIndex]]、および [[ElementSize]] を持つとき等しい。2 つのイベントのメモリ範囲は、それらのイベントが同じ [[Block]] を持ち、範囲が等しくなく、かつそれらの共通部分が空でないとき重なっている。2 つのイベントのメモリ範囲は、それらのイベントが同じ [[Block]] を持たないか、またはそれらの範囲が等しくも重なってもいないとき、互いに素である。

Note 2

考慮されるべき host-specific synchronizing event の例には、あるエージェントから別のエージェントへ SharedArrayBuffer を送信すること(例えば、ブラウザにおける postMessage による)、エージェントの開始と停止、および共有メモリ以外のチャネルを介したエージェントクラスタ内での通信がある。特定の execution execution について、それらのイベントは host-synchronizes-with strict partial order を介してホストによって提供される。さらに、ホストは is-agent-order-before Relation に参加するために、host-specific synchronizing event を execution.[[EventList]] に追加できる。

イベントは、以下で定義される関係によって candidate execution 内で順序付けられる。

29.2 Agent Events Record

Agent Events Record は、次のフィールドを持つ Record である。

Table 95: Agent Events Record のフィールド
フィールド名 意味
[[AgentSignifier]] agent signifier この順序付けを生じさせた評価を行ったエージェント。
[[EventList]] Memory eventList イベントは評価中にこのリストへ追加される。
[[AgentSynchronizesWith]] Synchronize イベントのペアの List 操作的意味論によって導入される Synchronize 関係。

29.3 Chosen Value Record

Chosen Value Record は、次のフィールドを持つ Record である。

Table 96: Chosen Value Record のフィールド
フィールド名 意味
[[Event]] Shared Data Block イベント この chosen value のために導入された ReadSharedMemory または ReadModifyWriteSharedMemory イベント。
[[ChosenValue]] バイト値の List 評価中に非決定的に選ばれたバイト。

29.4 Candidate Execution

エージェントクラスタの評価のcandidate execution は、次のフィールドを持つ Record である。

Table 97: Candidate Execution Record のフィールド
フィールド名 意味
[[EventsRecords]] Agent Events RecordList エージェントを、評価中に追加された Memory eventList に対応付ける。
[[ChosenValues]] Chosen Value RecordList ReadSharedMemory または ReadModifyWriteSharedMemory イベントを、評価中に選ばれたバイト値の List に対応付ける。

空の candidate execution は、そのフィールドが空の List である candidate execution Record である。

29.5 メモリモデルのための抽象操作

29.5.1 EventSet ( execution )

The abstract operation EventSet takes argument execution (candidate execution) and returns Memory event の Set. It performs the following steps when called:

  1. events を空の Set とする。
  2. execution.[[EventsRecords]] の各 Agent Events Record aer について、次を行う:
    1. aer.[[EventList]] の各 Memory event event について、次を行う:
      1. eventevents に追加する。
  3. events を返す。

29.5.2 SharedDataBlockEventSet ( execution )

The abstract operation SharedDataBlockEventSet takes argument execution (candidate execution) and returns Shared Data Block event の Set. It performs the following steps when called:

  1. events を空の Set とする。
  2. EventSet(execution) の各 Memory event event について、次を行う:
    1. eventShared Data Block イベントならば、eventevents に追加する。
  3. events を返す。

29.5.3 HostEventSet ( execution )

The abstract operation HostEventSet takes argument execution (candidate execution) and returns Memory event の Set. It performs the following steps when called:

  1. EventSet(execution) の要素のうち、SharedDataBlockEventSet(execution) に含まれないすべての要素を含む新しい Set を返す。

29.5.4 ComposeWriteEventBytes ( execution, byteIndex, writes )

The abstract operation ComposeWriteEventBytes takes arguments execution (candidate execution), byteIndex (非負整数), and writes (WriteSharedMemory または ReadModifyWriteSharedMemory イベントの List) and returns バイト値の List. It performs the following steps when called:

  1. byteLocationbyteIndex とする。
  2. bytesRead を新しい空の List とする。
  3. writes の各要素 writeEvent について、次を行う:
    1. Assert: writeEvent はそのメモリ範囲内に byteLocation を持つ。
    2. payloadIndexbyteLocation - writeEvent.[[ByteIndex]] とする。
    3. writeEventWriteSharedMemory イベントであるならば、
      1. bytewriteEvent.[[Payload]][payloadIndex] とする。
    4. そうでなければ、
      1. Assert: writeEventReadModifyWriteSharedMemory イベントである。
      2. bytesValueOfReadEvent(execution, writeEvent) とする。
      3. bytesModifiedwriteEvent.[[ModifyOp]](bytes, writeEvent.[[Payload]]) とする。
      4. bytebytesModified[payloadIndex] とする。
    5. bytebytesRead に追加する。
    6. byteLocationbyteLocation + 1 に設定する。
  4. bytesRead を返す。
Note 1

read-modify-write 変更 [[ModifyOp]] は、ReadModifyWriteSharedMemory イベントを導入する Atomics オブジェクト上の関数プロパティによって与えられる。

Note 2

この抽象操作は、write eventList をバイト値の List に合成する。これは ReadSharedMemory および ReadModifyWriteSharedMemory イベントのイベント意味論で使用される。

29.5.5 ValueOfReadEvent ( execution, readEvent )

The abstract operation ValueOfReadEvent takes arguments execution (candidate execution) and readEvent (ReadSharedMemory または ReadModifyWriteSharedMemory イベント) and returns バイト値の List. It performs the following steps when called:

  1. writesexecution における reads-bytes-from(readEvent) とする。
  2. Assert: writes は、長さが readEvent.[[ElementSize]] と等しい WriteSharedMemory または ReadModifyWriteSharedMemory イベントの List である。
  3. ComposeWriteEventBytes(execution, readEvent.[[ByteIndex]], writes) を返す。

29.6 Candidate Execution の関係

次の関係および数学的関数は、特定の candidate execution によってパラメータ化され、その Memory event を順序付ける。

29.6.1 is-agent-order-before

candidate execution execution について、その is-agent-order-before Relation は、次を満たす Memory event 上の最小の Relation である。

  • イベント eventA および eventB について、execution.[[EventsRecords]] 内にある Agent Events Record aer が存在し、aer.[[EventList]]eventAeventB の両方を含み、かつ aer.[[EventList]]List 順序において eventAeventB より前である場合、execution において eventAeventB より is-agent-order-before である。
Note

各エージェントは、評価中にエージェントごとの厳密な全順序でイベントを導入する。これはそれらの厳密な全順序の和集合である。

29.6.2 reads-bytes-from

candidate execution execution について、その reads-bytes-from 関数は、SharedDataBlockEventSet(execution) 内の Memory event を、SharedDataBlockEventSet(execution) 内のイベントの List に写像する数学的関数であり、次の条件を満たす。

candidate execution は常に reads-bytes-from 関数を認める。

29.6.3 reads-from

candidate execution execution について、その reads-from Relation は、次を満たす Memory event 上の最小の Relation である。

  • イベント readEvent および writeEvent について、SharedDataBlockEventSet(execution) が readEventwriteEvent の両方を含み、かつ execution における reads-bytes-from(readEvent) が writeEvent を含む場合、execution において readEventwriteEvent から reads-from する。

29.6.4 host-synchronizes-with

candidate execution execution について、その host-synchronizes-with Relation は、少なくとも次を満たす host-specific Memory event 上の、ホストが提供する strict partial order である。

  • execution において eventAeventB と host-synchronizes-with するならば、HostEventSet(execution) は eventAeventB を含む。
  • execution において host-synchronizes-with と is-agent-order-before の和集合に cycle は存在しない。
Note 1

candidate execution execution 内の 2 つの host-specific イベント eventA および eventB について、execution において eventAeventB と host-synchronizes-with することは、execution において eventAeventB より happens-before であることを含意する。

Note 2

この Relation により、ホストは HTML worker 間の postMessage などの追加の同期機構を提供できる。

29.6.5 synchronizes-with

candidate execution execution について、その synchronizes-with Relation は、次を満たす Memory event 上の最小の Relation である。

  • イベント readEvent および writeEvent について、execution において readEventwriteEvent から reads-from し、readEvent.[[Order]]seq-cst であり、writeEvent.[[Order]]seq-cst であり、かつ readEventwriteEvent が等しいメモリ範囲を持つ場合、execution において writeEventreadEvent と synchronizes-with する。
  • execution.[[EventsRecords]] の各要素 eventsRecord について、次が真である。
    • イベント eventA および eventB について、eventsRecord.[[AgentSynchronizesWith]] が (eventA, eventB) を含む場合、execution において eventAeventB と synchronizes-with する。
  • イベント eventA および eventB について、execution.[[HostSynchronizesWith]] が (eventA, eventB) を含む場合、execution において eventAeventB と synchronizes-with する。
Note 1

メモリモデル文献における慣例により、candidate execution execution においては、read eventwrite event と synchronizes-with するのではなく、write eventread event と synchronizes-with する。

Note 2

candidate execution execution において、init イベントはこの Relation に参加せず、代わりに happens-before によって直接制約される。

Note 3

candidate execution execution において、reads-from によって関連付けられるすべての seq-cst イベントが synchronizes-with によって関連付けられるわけではない。等しいメモリ範囲も持つイベントのみが synchronizes-with によって関連付けられる。

Note 4

candidate execution execution 内の Shared Data Block イベント readEvent および writeEvent について、writeEventreadEvent と synchronizes-with する場合、readEventwriteEvent 以外の write から reads-from してよい。

29.6.6 happens-before

candidate execution execution について、その happens-before Relation は、次を満たす Memory event 上の最小の Relation である。

  • イベント eventA および eventB について、次の条件のいずれかが真である場合、execution において eventAeventB より happens-before である。

    • execution において eventAeventB より is-agent-order-before である。
    • execution において eventAeventBsynchronizes-with する。
    • SharedDataBlockEventSet(execution) が eventAeventB の両方を含み、eventA.[[Order]]init であり、かつ eventAeventB が重なっているメモリ範囲を持つ。
    • execution において eventAeventC より happens-before であり、かつ eventCeventB より happens-before であるようなイベント eventC が存在する。
Note

happens-before は agent-order の上位集合であるため、candidate execution は ECMAScript の単一スレッド評価意味論と一貫している。

29.7 Valid Execution の性質

29.7.1 Valid Chosen Reads

candidate execution execution は、次のアルゴリズムが true を返すならば valid chosen reads を持つ。

  1. SharedDataBlockEventSet(execution) の各 ReadSharedMemory または ReadModifyWriteSharedMemory イベント readEvent について、次を行う:
    1. chosenValueRecord を、[[Event]] フィールドが readEvent である execution.[[ChosenValues]] の要素とする。
    2. chosenValuechosenValueRecord.[[ChosenValue]] とする。
    3. readValueValueOfReadEvent(execution, readEvent) とする。
    4. chosenLenchosenValue 内の要素数とする。
    5. readLenreadValue 内の要素数とする。
    6. chosenLenreadLen ならば、
      1. false を返す。
    7. 0(含む)から chosenLen(含まない)までの区間内のある整数 i について chosenValue[i] ≠ readValue[i] であるならば、
      1. false を返す。
  2. true を返す。

29.7.2 Coherent Reads

candidate execution execution は、次のアルゴリズムが true を返すならば coherent reads を持つ。

  1. SharedDataBlockEventSet(execution) の各 ReadSharedMemory または ReadModifyWriteSharedMemory イベント readEvent について、次を行う:
    1. writesexecution における reads-bytes-from(readEvent) とする。
    2. byteLocationreadEvent.[[ByteIndex]] とする。
    3. writes の各要素 writeEvent について、次を行う:
      1. execution において readEventwriteEvent より happens-before であるならば、
        1. false を返す。
      2. byteLocation をそのメモリ範囲内に持つ WriteSharedMemory または ReadModifyWriteSharedMemory イベント value が存在し、execution において writeEventvalue より happens-before であり、かつ valuereadEvent より happens-before であるならば、
        1. false を返す。
      3. byteLocationbyteLocation + 1 に設定する。
  2. true を返す。

29.7.3 Tear Free Reads

candidate execution execution は、次のアルゴリズムが true を返すならば tear free reads を持つ。

  1. SharedDataBlockEventSet(execution) の各 ReadSharedMemory または ReadModifyWriteSharedMemory イベント readEvent について、次を行う:
    1. readEvent.[[NoTear]]true であるならば、
      1. Assert: readEvent.[[ByteIndex]]readEvent.[[ElementSize]] で割った余りは 0 である。
      2. execution において readEventwriteEvent から reads-from し、かつ writeEvent.[[NoTear]]true である各 Memory event writeEvent について、次を行う:
        1. readEventwriteEvent が等しいメモリ範囲を持ち、かつ valuewriteEvent が等しいメモリ範囲を持ち、value.[[NoTear]]true であり、writeEventvalue が同じ Shared Data Block イベントではなく、かつ execution において readEventvalue から reads-from するような Memory event value が存在するならば、
          1. false を返す。
  2. true を返す。
Note

Shared Data Block イベント[[NoTear]] フィールドは、そのイベントが整数 TypedArray へのアクセスを介して導入された場合に true であり、浮動小数点 TypedArray または DataView へのアクセスを介して導入された場合に false である。

直感的には、この要件は、メモリ範囲が整数 TypedArray を介してアラインされた方法でアクセスされる場合、等しい範囲を持つ他の write event とのデータ競合において、その範囲上の単一の write event が「勝た」なければならないことを述べている。より正確には、この要件は、アラインされた read event が、すべて等しい範囲を持つ複数の異なる write event からのバイトで構成された値を読み取ることができないことを述べている。ただし、アラインされた read event が、重なり合う範囲を持つ複数の write event から読み取ることは可能である。

29.7.4 逐次一貫 Atomic

candidate execution execution について、is-memory-order-beforeEventSet(execution) 内のすべての Memory eventstrict total order であり、次を満たす。

  • イベント eventA および eventB について、execution において eventAeventB より happens-before である場合、execution において eventAeventB より is-memory-order-before である。
  • execution において readEventwriteEvent から reads-from するようなイベント readEvent および writeEvent について、SharedDataBlockEventSet(execution) 内に、value.[[Order]]seq-cst であり、execution において writeEventvalue より is-memory-order-before であり、valuereadEvent より is-memory-order-before であり、かつ次の条件のいずれかが真であるような WriteSharedMemory または ReadModifyWriteSharedMemory イベント value は存在しない。

    • execution において writeEventreadEventsynchronizes-with し、かつ valuereadEvent が等しいメモリ範囲を持つ。
    • execution において writeEventreadEvent より happens-before であり、かつ valuereadEvent より happens-before であり、writeEvent.[[Order]]seq-cst であり、かつ writeEventvalue が等しいメモリ範囲を持つ。
    • execution において writeEventreadEvent より happens-before であり、かつ writeEventvalue より happens-before であり、readEvent.[[Order]]seq-cst であり、かつ valuereadEvent が等しいメモリ範囲を持つ。
    Note 1

    この節はさらに、等しいメモリ範囲上の seq-cst イベントを制約する。

  • SharedDataBlockEventSet(execution) 内の各 WriteSharedMemory または ReadModifyWriteSharedMemory イベント writeEvent について、writeEvent.[[Order]]seq-cst であるならば、等しいメモリ範囲を持ち、かつ writeEvent より memory-order before である ReadSharedMemory または ReadModifyWriteSharedMemory イベントが SharedDataBlockEventSet(execution) 内に無限個存在する、ということはない。

    Note 2

    この節は、エージェントに対する forward progress 保証とともに、等しいメモリ範囲を持つ seq-cst write が有限時間で seq-cst read に見えるようになるという liveness 条件を保証する。

candidate execution は、is-memory-order-before Relation を認める場合、sequentially consistent atomics を持つ。

Note 3

is-memory-order-before は EventSet(execution) 内のすべてのイベントを含むが、execution において happens-before または synchronizes-with によって制約されないイベントは、その順序のどこに現れてもよい。

29.7.5 Valid Executions

candidate execution execution は、次のすべてが真である場合、valid execution(または単に execution)である。

  • ホストが execution に対して host-synchronizes-with Relation を提供する。
  • executionstrict partial order である happens-before Relation を認める。
  • execution は valid chosen reads を持つ。
  • execution は coherent reads を持つ。
  • execution は tear free reads を持つ。
  • execution は sequentially consistent atomics を持つ。

すべてのプログラムは少なくとも 1 つの valid execution を持つ。

29.8 Races

execution execution および SharedDataBlockEventSet(execution) に含まれるイベント eventAeventB について、次のアルゴリズムが true を返すならば、eventAeventBrace状態にある。

  1. eventAeventB が同じ Shared Data Block イベントでないならば、
    1. execution において eventAeventB より happens-before であり、かつ eventBeventA より happens-before である、ということが成り立たないならば、
      1. eventAWriteSharedMemory または ReadModifyWriteSharedMemory イベントのいずれかであり、eventBWriteSharedMemory または ReadModifyWriteSharedMemory イベントのいずれかであり、かつ eventAeventB が互いに素なメモリ範囲を持たない場合、
        1. true を返す。
      2. execution において eventAeventB から reads-from する、または eventBeventA から reads-from するならば、
        1. true を返す。
  2. false を返す。

29.9 Data Races

execution execution および SharedDataBlockEventSet(execution) に含まれるイベント eventAeventB について、次のアルゴリズムが true を返すならば、eventAeventBdata race状態にある。

  1. execution において eventAeventBrace 状態にあるならば、
    1. eventA.[[Order]]seq-cst でないか、または eventB.[[Order]]seq-cst でないならば、
      1. true を返す。
    2. eventAeventB が重なり合うメモリ範囲を持つならば、
      1. true を返す。
  2. false を返す。

29.10 Data Race Freedom

execution execution は、SharedDataBlockEventSet(execution) 内に data race 状態にある 2 つのイベントが存在しない場合、data race free である。

プログラムは、そのすべての execution が data race free である場合、data race free である。

メモリモデルは、data race free プログラムについて、すべてのイベントの逐次一貫性を保証する。

29.11 共有メモリの指針

Note 1

以下は、共有メモリを扱う ECMAScript プログラマーのための指針である。

プログラムを data race free に保つこと、すなわち同じメモリロケーションに対する並行する非 atomic 操作が存在し得ないようにすることを推奨する。Data race free プログラムは、各エージェントの評価意味論における各ステップが互いにインターリーブされるインターリーブ意味論を持つ。Data race free プログラムについては、メモリモデルの詳細を理解する必要はない。その詳細が、ECMAScript をよりよく書くための直感を構築する可能性は低い。

より一般に、プログラムが data race free でなくても、atomic 操作がどの data race にも関与せず、競合する操作がすべて同じアクセスサイズを持つ限り、予測可能な振る舞いを持ち得る。atomic が race に関与しないようにする最も単純な方法は、atomic 操作と非 atomic 操作で異なるメモリセルを使用し、異なるサイズの atomic access が同じセルへ同時にアクセスするために使用されないようにすることである。実質的に、プログラムは共有メモリを可能な限り強く型付けされたものとして扱うべきである。競合する非 atomic access の順序付けやタイミングに依存することは依然としてできないが、メモリが強く型付けされたものとして扱われるならば、競合する access は「tear」しない(その値のビットが混ざらない)。

Note 2

以下は、共有メモリを使用するプログラムに対するコンパイラ変換を書く ECMAScript 実装者のための指針である。

単一エージェント設定で有効なほとんどのプログラム変換を、マルチエージェント設定でも許可することが望ましい。これは、マルチエージェントプログラム内の各エージェントの性能が単一エージェント設定と同程度に良好であることを保証するためである。しばしば、これらの変換は判断が難しい。ここでは、(メモリモデルによって含意される、またはメモリモデルが含意するものより強いという意味で)規範的であることを意図しているが、おそらく網羅的ではない、プログラム変換に関するいくつかの規則を概説する。これらの規則は、is-agent-order-before Relation を構成する Memory event の導入に先立つプログラム変換に適用されることを意図している。

agent-order slice を、単一のエージェントに関係する is-agent-order-before Relation の部分集合とする。

read eventpossible read valuesを、そのイベントについて、すべての valid execution にわたる ValueOfReadEvent のすべての値の集合とする。

共有メモリが存在しない場合に有効な agent-order slice の任意の変換は、次の例外を除き、共有メモリが存在する場合にも有効である。

  • Atomics are carved in stone:プログラム変換は、[[Order]]seq-cst である Shared Data Block イベントis-agent-order-before Relation から取り除いたり、それらを互いに対して並べ替えたり、エージェント順序スライス内で [[Order]]unordered であるイベントに対して並べ替えたりしてはならない。

    (実際には、並べ替えの禁止により、コンパイラはすべての seq-cst 操作が同期であり、最終的な is-memory-order-before Relation に含まれると仮定せざるを得なくなる。これは、エージェント間プログラム解析がない場合には、通常いずれにせよ仮定しなければならないことである。また、メモリ順序への効果が不明な呼び出し先を持つすべての呼び出しが seq-cst 操作を含み得ると仮定することもコンパイラに強制する。)

  • Reads must be stable:任意の与えられた共有メモリ読み取りは、1 回の execution において単一の値のみを観測しなければならない。

    (例えば、プログラム内で意味論的に単一の読み取りであるものが複数回実行された場合、その後プログラムは読み取られた値のうち 1 つだけを観測することが許される。rematerialization と呼ばれる変換はこの規則に違反し得る。)

  • Writes must be stable:共有メモリへのすべての観測可能な書き込みは、execution におけるプログラム意味論から従わなければならない。

    (例えば、変換は、より小さいデータを書き込むためにより大きなロケーション上の read-modify-write 操作を使用すること、プログラムが書き込めなかった値をメモリに書き込むこと、または読み取られたロケーションが読み取り後に別のエージェントによって上書きされ得た場合に、読み取ったばかりの値をそのロケーションへ書き戻すことなど、特定の観測可能な書き込みを導入してはならない。)

  • Possible read values must be non-empty:プログラム変換は、共有メモリ読み取りの possible read values を空にしてはならない。

    (直感に反するが、この規則は、read event によって読み取られる限りで write がメモリモデルにおいて効力を持つため、実質的に write に対する変換を制限する。例えば、write は移動および併合され、時には 2 つの seq-cst 操作の間で並べ替えられることもあるが、その変換はあるロケーションを更新するすべての write を取り除いてはならず、何らかの write が保持されなければならない。)

有効なままである変換の例には、同じロケーションからの複数の非 atomic read のマージ、非 atomic read の並べ替え、投機的な非 atomic read の導入、同じロケーションへの複数の非 atomic write のマージ、異なるロケーションへの非 atomic write の並べ替え、および終了性に影響しても非 atomic read をループ外へ巻き上げることがある。一般に、エイリアスされた TypedArray はロケーションが異なることを証明することを難しくする点に注意。

Note 3

以下は、共有メモリアクセスのための機械語コードを生成する ECMAScript 実装者のための指針である。

ARM または Power のメモリモデル以上に弱くないメモリモデルを持つアーキテクチャでは、非 atomic store および load はターゲットアーキテクチャ上の裸の store および load にコンパイルされてよい。Atomic store および load は、逐次一貫性を保証する命令へコンパイルされてよい。そのような命令が存在しない場合、裸の store または load の両側にバリアを置くなどして、メモリバリアが使用されるべきである。Read-modify-write 操作は、ターゲットアーキテクチャ上の read-modify-write 命令、例えば x86 上の LOCK プレフィックス付き命令、ARM 上の load-exclusive/store-exclusive 命令、および Power 上の load-link/store-conditional 命令にコンパイルされてよい。

具体的には、メモリモデルは次のようなコード生成を許可することを意図している。

  • プログラム内のすべての atomic 操作は必要であると仮定される。
  • Atomic 操作は、互いに対しても非 atomic 操作に対しても決して並べ替えられない。
  • 関数は常に atomic 操作を実行するものと仮定される。
  • Atomic 操作は、より大きなデータに対する read-modify-write 操作として実装されることはなく、プラットフォームが適切なサイズの atomic 操作を持たない場合は非 lock-free atomic として実装される。(すべてのプラットフォームが、重要なすべてのサイズの通常のメモリアクセス操作を持つことは既に仮定している。)

単純なコード生成では、次のパターンを使用する。

  • 通常の load および store は、単一の load 命令および store 命令にコンパイルされる。
  • Lock-free atomic load および store は、完全な(逐次一貫な)fence、通常の load または store、および完全な fence にコンパイルされる。
  • Lock-free atomic read-modify-write access は、完全な fence、atomic read-modify-write 命令列、および完全な fence にコンパイルされる。
  • 非 lock-free atomic は、spinlock acquire、完全な fence、一連の非 atomic load および store 命令、完全な fence、および spinlock release にコンパイルされる。

この写像は、あるメモリ範囲上の atomic 操作が非 atomic write や異なるサイズの atomic 操作と race しない限り正しい。ただし、必要なのはそれだけである。メモリモデルは、race に関与する atomic 操作を実質的に非 atomic 状態に降格する。一方で、単純な写像は非常に強い。これは、atomic 操作を逐次一貫 fence として使用することを許すが、メモリモデルは実際にはそれを保証していない。

これらの基本パターンへの局所的な改善も、メモリモデルの制約に従う限り許可される。例えば:

  • 冗長な fence を取り除く、明らかなプラットフォーム依存の改善がある。例えば、x86 では、lock-free atomic load および store の周囲の fence は、store 後の fence を除き常に省略でき、lock-free read-modify-write 命令には fence が不要である。これらはすべて LOCK プレフィックス付き命令を使用するためである。多くのプラットフォームには複数の強度の fence があり、特定の文脈では逐次一貫性を壊すことなくより弱い fence を使用できる。
  • ほとんどの現代的なプラットフォームは、ECMAScript atomics が要求するすべてのデータサイズについて lock-free atomics をサポートしている。非 lock-free atomic が必要な場合、atomic 操作本体を囲む fence は通常 lock および unlock 手順に畳み込める。非 lock-free atomics の最も単純な解決策は、SharedArrayBuffer ごとに単一の lock word を持つことである。
  • より複雑なプラットフォーム依存の局所的改善もあり、それには何らかのコード解析が必要である。例えば、連続する 2 つの fence はしばしば単一の fence と同じ効果を持つため、2 つの atomic 操作が連続してコード生成される場合、それらの間を隔てる fence は 1 つだけでよい。x86 では、atomic store を隔てる単一の fence でさえ省略できる。store 後の fence は、その store を後続の load から分離するためにのみ必要であるためである。

Annex A (informative) 文法概要

A.1 字句文法

SourceCharacter :: 任意の Unicode 符号位置 InputElementDiv :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator RightBracePunctuator InputElementRegExp :: WhiteSpace LineTerminator Comment CommonToken RightBracePunctuator RegularExpressionLiteral InputElementRegExpOrTemplateTail :: WhiteSpace LineTerminator Comment CommonToken RegularExpressionLiteral TemplateSubstitutionTail InputElementTemplateTail :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator TemplateSubstitutionTail InputElementHashbangOrRegExp :: WhiteSpace LineTerminator Comment CommonToken HashbangComment RegularExpressionLiteral WhiteSpace :: <TAB> <VT> <FF> <ZWNBSP> <USP> LineTerminator :: <LF> <CR> <LS> <PS> LineTerminatorSequence :: <LF> <CR> [lookahead ≠ <LF>] <LS> <PS> <CR> <LF> Comment :: MultiLineComment SingleLineComment MultiLineComment :: /* MultiLineCommentCharsopt */ MultiLineCommentChars :: MultiLineNotAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt PostAsteriskCommentChars :: MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt MultiLineNotAsteriskChar :: SourceCharacter but not * MultiLineNotForwardSlashOrAsteriskChar :: SourceCharacter but not one of / or * SingleLineComment :: // SingleLineCommentCharsopt SingleLineCommentChars :: SingleLineCommentChar SingleLineCommentCharsopt SingleLineCommentChar :: SourceCharacter but not LineTerminator HashbangComment :: #! SingleLineCommentCharsopt CommonToken :: IdentifierName PrivateIdentifier Punctuator NumericLiteral StringLiteral Template PrivateIdentifier :: # IdentifierName IdentifierName :: IdentifierStart IdentifierName IdentifierPart IdentifierStart :: IdentifierStartChar \ UnicodeEscapeSequence IdentifierPart :: IdentifierPartChar \ UnicodeEscapeSequence IdentifierStartChar :: UnicodeIDStart $ _ IdentifierPartChar :: UnicodeIDContinue $ AsciiLetter :: one of a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z UnicodeIDStart :: Unicode property “ID_Start” を持つ任意の Unicode code point UnicodeIDContinue :: Unicode property “ID_Continue” を持つ任意の Unicode code point ReservedWord :: one of await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield Punctuator :: OptionalChainingPunctuator OtherPunctuator OptionalChainingPunctuator :: ?. [lookahead ∉ DecimalDigit] OtherPunctuator :: one of { ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ?? ? : = += -= *= %= **= <<= >>= >>>= &= |= ^= &&= ||= ??= => DivPunctuator :: / /= RightBracePunctuator :: } NullLiteral :: null BooleanLiteral :: true false NumericLiteralSeparator :: _ NumericLiteral :: DecimalLiteral DecimalBigIntegerLiteral NonDecimalIntegerLiteral[+Sep] NonDecimalIntegerLiteral[+Sep] BigIntLiteralSuffix LegacyOctalIntegerLiteral DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix NonZeroDigit DecimalDigits[+Sep]opt BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits[+Sep] BigIntLiteralSuffix NonDecimalIntegerLiteral[Sep] :: BinaryIntegerLiteral[?Sep] OctalIntegerLiteral[?Sep] HexIntegerLiteral[?Sep] BigIntLiteralSuffix :: n DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits[+Sep]opt ExponentPart[+Sep]opt . DecimalDigits[+Sep] ExponentPart[+Sep]opt DecimalIntegerLiteral ExponentPart[+Sep]opt DecimalIntegerLiteral :: 0 NonZeroDigit NonZeroDigit NumericLiteralSeparatoropt DecimalDigits[+Sep] NonOctalDecimalIntegerLiteral DecimalDigits[Sep] :: DecimalDigit DecimalDigits[?Sep] DecimalDigit [+Sep] DecimalDigits[+Sep] NumericLiteralSeparator DecimalDigit DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9 NonZeroDigit :: one of 1 2 3 4 5 6 7 8 9 ExponentPart[Sep] :: ExponentIndicator SignedInteger[?Sep] ExponentIndicator :: one of e E SignedInteger[Sep] :: DecimalDigits[?Sep] + DecimalDigits[?Sep] - DecimalDigits[?Sep] BinaryIntegerLiteral[Sep] :: 0b BinaryDigits[?Sep] 0B BinaryDigits[?Sep] BinaryDigits[Sep] :: BinaryDigit BinaryDigits[?Sep] BinaryDigit [+Sep] BinaryDigits[+Sep] NumericLiteralSeparator BinaryDigit BinaryDigit :: one of 0 1 OctalIntegerLiteral[Sep] :: 0o OctalDigits[?Sep] 0O OctalDigits[?Sep] OctalDigits[Sep] :: OctalDigit OctalDigits[?Sep] OctalDigit [+Sep] OctalDigits[+Sep] NumericLiteralSeparator OctalDigit LegacyOctalIntegerLiteral :: 0 OctalDigit LegacyOctalIntegerLiteral OctalDigit NonOctalDecimalIntegerLiteral :: 0 NonOctalDigit LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit NonOctalDecimalIntegerLiteral DecimalDigit LegacyOctalLikeDecimalIntegerLiteral :: 0 OctalDigit LegacyOctalLikeDecimalIntegerLiteral OctalDigit OctalDigit :: one of 0 1 2 3 4 5 6 7 NonOctalDigit :: one of 8 9 HexIntegerLiteral[Sep] :: 0x HexDigits[?Sep] 0X HexDigits[?Sep] HexDigits[Sep] :: HexDigit HexDigits[?Sep] HexDigit [+Sep] HexDigits[+Sep] NumericLiteralSeparator HexDigit HexDigit :: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F StringLiteral :: " DoubleStringCharactersopt " ' SingleStringCharactersopt ' DoubleStringCharacters :: DoubleStringCharacter DoubleStringCharactersopt SingleStringCharacters :: SingleStringCharacter SingleStringCharactersopt DoubleStringCharacter :: SourceCharacter but not one of " or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation SingleStringCharacter :: SourceCharacter but not one of ' or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation LineContinuation :: \ LineTerminatorSequence EscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence HexEscapeSequence UnicodeEscapeSequence CharacterEscapeSequence :: SingleEscapeCharacter NonEscapeCharacter SingleEscapeCharacter :: one of ' " \ b f n r t v NonEscapeCharacter :: SourceCharacter but not one of EscapeCharacter or LineTerminator EscapeCharacter :: SingleEscapeCharacter DecimalDigit x u LegacyOctalEscapeSequence :: 0 [lookahead ∈ { 8, 9 }] NonZeroOctalDigit [lookahead ∉ OctalDigit] ZeroToThree OctalDigit [lookahead ∉ OctalDigit] FourToSeven OctalDigit ZeroToThree OctalDigit OctalDigit NonZeroOctalDigit :: OctalDigit but not 0 ZeroToThree :: one of 0 1 2 3 FourToSeven :: one of 4 5 6 7 NonOctalDecimalEscapeSequence :: one of 8 9 HexEscapeSequence :: x HexDigit HexDigit UnicodeEscapeSequence :: u Hex4Digits u{ CodePoint } Hex4Digits :: HexDigit HexDigit HexDigit HexDigit RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags RegularExpressionBody :: RegularExpressionFirstChar RegularExpressionChars RegularExpressionChars :: [empty] RegularExpressionChars RegularExpressionChar RegularExpressionFirstChar :: RegularExpressionNonTerminator but not one of * or \ or / or [ RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionChar :: RegularExpressionNonTerminator but not one of \ or / or [ RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionBackslashSequence :: \ RegularExpressionNonTerminator RegularExpressionNonTerminator :: SourceCharacter but not LineTerminator RegularExpressionClass :: [ RegularExpressionClassChars ] RegularExpressionClassChars :: [empty] RegularExpressionClassChars RegularExpressionClassChar RegularExpressionClassChar :: RegularExpressionNonTerminator but not one of ] or \ RegularExpressionBackslashSequence RegularExpressionFlags :: [empty] RegularExpressionFlags IdentifierPartChar Template :: NoSubstitutionTemplate TemplateHead NoSubstitutionTemplate :: ` TemplateCharactersopt ` TemplateHead :: ` TemplateCharactersopt ${ TemplateSubstitutionTail :: TemplateMiddle TemplateTail TemplateMiddle :: } TemplateCharactersopt ${ TemplateTail :: } TemplateCharactersopt ` TemplateCharacters :: TemplateCharacter TemplateCharactersopt TemplateCharacter :: $ [lookahead ≠ {] \ TemplateEscapeSequence \ NotEscapeSequence LineContinuation LineTerminatorSequence SourceCharacter but not one of ` or \ or $ or LineTerminator TemplateEscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] HexEscapeSequence UnicodeEscapeSequence NotEscapeSequence :: 0 DecimalDigit DecimalDigit but not 0 x [lookahead ∉ HexDigit] x HexDigit [lookahead ∉ HexDigit] u [lookahead ∉ HexDigit] [lookahead ≠ {] u HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit HexDigit [lookahead ∉ HexDigit] u { [lookahead ∉ HexDigit] u { NotCodePoint [lookahead ∉ HexDigit] u { CodePoint [lookahead ∉ HexDigit] [lookahead ≠ }] NotCodePoint :: HexDigits[~Sep] but only if the MV of HexDigits > 0x10FFFF CodePoint :: HexDigits[~Sep] but only if the MV of HexDigits ≤ 0x10FFFF

A.2

IdentifierReference[Yield, Await] : Identifier [~Yield] yield [~Await] await BindingIdentifier[Yield, Await] : Identifier yield await LabelIdentifier[Yield, Await] : Identifier [~Yield] yield [~Await] await Identifier : IdentifierName but not ReservedWord PrimaryExpression[Yield, Await] : this IdentifierReference[?Yield, ?Await] Literal ArrayLiteral[?Yield, ?Await] ObjectLiteral[?Yield, ?Await] FunctionExpression ClassExpression[?Yield, ?Await] GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral[?Yield, ?Await, ~Tagged] CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] : ( Expression[+In, ?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ) ( ) ( ... BindingIdentifier[?Yield, ?Await] ) ( ... BindingPattern[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingIdentifier[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingPattern[?Yield, ?Await] )

生成規則
PrimaryExpression[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
のインスタンスを処理するとき、CoverParenthesizedExpressionAndArrowParameterList の解釈は次の文法を用いて精緻化される:

ParenthesizedExpression[Yield, Await] : ( Expression[+In, ?Yield, ?Await] )

 

Literal : NullLiteral BooleanLiteral NumericLiteral StringLiteral ArrayLiteral[Yield, Await] : [ Elisionopt ] [ ElementList[?Yield, ?Await] ] [ ElementList[?Yield, ?Await] , Elisionopt ] ElementList[Yield, Await] : Elisionopt AssignmentExpression[+In, ?Yield, ?Await] Elisionopt SpreadElement[?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt AssignmentExpression[+In, ?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt SpreadElement[?Yield, ?Await] Elision : , Elision , SpreadElement[Yield, Await] : ... AssignmentExpression[+In, ?Yield, ?Await] ObjectLiteral[Yield, Await] : { } { PropertyDefinitionList[?Yield, ?Await] } { PropertyDefinitionList[?Yield, ?Await] , } PropertyDefinitionList[Yield, Await] : PropertyDefinition[?Yield, ?Await] PropertyDefinitionList[?Yield, ?Await] , PropertyDefinition[?Yield, ?Await] PropertyDefinition[Yield, Await] : IdentifierReference[?Yield, ?Await] CoverInitializedName[?Yield, ?Await] PropertyName[?Yield, ?Await] : AssignmentExpression[+In, ?Yield, ?Await] MethodDefinition[?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] PropertyName[Yield, Await] : LiteralPropertyName ComputedPropertyName[?Yield, ?Await] LiteralPropertyName : IdentifierName StringLiteral NumericLiteral ComputedPropertyName[Yield, Await] : [ AssignmentExpression[+In, ?Yield, ?Await] ] CoverInitializedName[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await] Initializer[In, Yield, Await] : = AssignmentExpression[?In, ?Yield, ?Await] TemplateLiteral[Yield, Await, Tagged] : NoSubstitutionTemplate SubstitutionTemplate[?Yield, ?Await, ?Tagged] SubstitutionTemplate[Yield, Await, Tagged] : TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged] TemplateSpans[Yield, Await, Tagged] : TemplateTail TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateTail TemplateMiddleList[Yield, Await, Tagged] : TemplateMiddle Expression[+In, ?Yield, ?Await] TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await] MemberExpression[Yield, Await] : PrimaryExpression[?Yield, ?Await] MemberExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] MemberExpression[?Yield, ?Await] . IdentifierName MemberExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] SuperProperty[?Yield, ?Await] MetaProperty new MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await] MemberExpression[?Yield, ?Await] . PrivateIdentifier SuperProperty[Yield, Await] : super [ Expression[+In, ?Yield, ?Await] ] super . IdentifierName MetaProperty : NewTarget ImportMeta NewTarget : new . target ImportMeta : import . meta NewExpression[Yield, Await] : MemberExpression[?Yield, ?Await] new NewExpression[?Yield, ?Await] CallExpression[Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] SuperCall[?Yield, ?Await] ImportCall[?Yield, ?Await] CallExpression[?Yield, ?Await] Arguments[?Yield, ?Await] CallExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] CallExpression[?Yield, ?Await] . IdentifierName CallExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] CallExpression[?Yield, ?Await] . PrivateIdentifier

生成規則
CallExpression[Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await]
のインスタンスを処理するとき、CoverCallExpressionAndAsyncArrowHead の解釈は次の文法を用いて精緻化される:

CallMemberExpression[Yield, Await] : MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]

 

SuperCall[Yield, Await] : super Arguments[?Yield, ?Await] ImportCall[Yield, Await] : import ( AssignmentExpression[+In, ?Yield, ?Await] ,opt ) import ( AssignmentExpression[+In, ?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ,opt ) Arguments[Yield, Await] : ( ) ( ArgumentList[?Yield, ?Await] ) ( ArgumentList[?Yield, ?Await] , ) ArgumentList[Yield, Await] : AssignmentExpression[+In, ?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , ... AssignmentExpression[+In, ?Yield, ?Await] OptionalExpression[Yield, Await] : MemberExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalChain[Yield, Await] : ?. Arguments[?Yield, ?Await] ?. [ Expression[+In, ?Yield, ?Await] ] ?. IdentifierName ?. TemplateLiteral[?Yield, ?Await, +Tagged] ?. PrivateIdentifier OptionalChain[?Yield, ?Await] Arguments[?Yield, ?Await] OptionalChain[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] OptionalChain[?Yield, ?Await] . IdentifierName OptionalChain[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] OptionalChain[?Yield, ?Await] . PrivateIdentifier LeftHandSideExpression[Yield, Await] : NewExpression[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalExpression[?Yield, ?Await] UpdateExpression[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++ LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] -- ++ UnaryExpression[?Yield, ?Await] -- UnaryExpression[?Yield, ?Await] UnaryExpression[Yield, Await] : UpdateExpression[?Yield, ?Await] delete UnaryExpression[?Yield, ?Await] void UnaryExpression[?Yield, ?Await] typeof UnaryExpression[?Yield, ?Await] + UnaryExpression[?Yield, ?Await] - UnaryExpression[?Yield, ?Await] ~ UnaryExpression[?Yield, ?Await] ! UnaryExpression[?Yield, ?Await] [+Await] AwaitExpression[?Yield] ExponentiationExpression[Yield, Await] : UnaryExpression[?Yield, ?Await] UpdateExpression[?Yield, ?Await] ** ExponentiationExpression[?Yield, ?Await] MultiplicativeExpression[Yield, Await] : ExponentiationExpression[?Yield, ?Await] MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?Yield, ?Await] MultiplicativeOperator : one of * / % AdditiveExpression[Yield, Await] : MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] + MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] - MultiplicativeExpression[?Yield, ?Await] ShiftExpression[Yield, Await] : AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] << AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] >> AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] >>> AdditiveExpression[?Yield, ?Await] RelationalExpression[In, Yield, Await] : ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] < ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] > ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] <= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] >= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] instanceof ShiftExpression[?Yield, ?Await] [+In] RelationalExpression[+In, ?Yield, ?Await] in ShiftExpression[?Yield, ?Await] [+In] PrivateIdentifier in ShiftExpression[?Yield, ?Await] EqualityExpression[In, Yield, Await] : RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] == RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] != RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] === RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] !== RelationalExpression[?In, ?Yield, ?Await] BitwiseANDExpression[In, Yield, Await] : EqualityExpression[?In, ?Yield, ?Await] BitwiseANDExpression[?In, ?Yield, ?Await] & EqualityExpression[?In, ?Yield, ?Await] BitwiseXORExpression[In, Yield, Await] : BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseXORExpression[?In, ?Yield, ?Await] ^ BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseORExpression[In, Yield, Await] : BitwiseXORExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] | BitwiseXORExpression[?In, ?Yield, ?Await] LogicalANDExpression[In, Yield, Await] : BitwiseORExpression[?In, ?Yield, ?Await] LogicalANDExpression[?In, ?Yield, ?Await] && BitwiseORExpression[?In, ?Yield, ?Await] LogicalORExpression[In, Yield, Await] : LogicalANDExpression[?In, ?Yield, ?Await] LogicalORExpression[?In, ?Yield, ?Await] || LogicalANDExpression[?In, ?Yield, ?Await] CoalesceExpression[In, Yield, Await] : CoalesceExpressionHead[?In, ?Yield, ?Await] ?? BitwiseORExpression[?In, ?Yield, ?Await] CoalesceExpressionHead[In, Yield, Await] : CoalesceExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] ShortCircuitExpression[In, Yield, Await] : LogicalORExpression[?In, ?Yield, ?Await] CoalesceExpression[?In, ?Yield, ?Await] ConditionalExpression[In, Yield, Await] : ShortCircuitExpression[?In, ?Yield, ?Await] ShortCircuitExpression[?In, ?Yield, ?Await] ? AssignmentExpression[+In, ?Yield, ?Await] : AssignmentExpression[?In, ?Yield, ?Await] AssignmentExpression[In, Yield, Await] : ConditionalExpression[?In, ?Yield, ?Await] [+Yield] YieldExpression[?In, ?Await] ArrowFunction[?In, ?Yield, ?Await] AsyncArrowFunction[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] AssignmentOperator AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] &&= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ||= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ??= AssignmentExpression[?In, ?Yield, ?Await] AssignmentOperator : one of *= /= %= += -= <<= >>= >>>= &= ^= |= **=

特定の状況で、生成規則
AssignmentExpression[In, Yield, Await] : LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await]
のインスタンスを処理するとき、LeftHandSideExpression の解釈は次の文法を用いて精緻化される:

AssignmentPattern[Yield, Await] : ObjectAssignmentPattern[?Yield, ?Await] ArrayAssignmentPattern[?Yield, ?Await] ObjectAssignmentPattern[Yield, Await] : { } { AssignmentRestProperty[?Yield, ?Await] } { AssignmentPropertyList[?Yield, ?Await] } { AssignmentPropertyList[?Yield, ?Await] , AssignmentRestProperty[?Yield, ?Await]opt } ArrayAssignmentPattern[Yield, Await] : [ Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] [ AssignmentElementList[?Yield, ?Await] ] [ AssignmentElementList[?Yield, ?Await] , Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] AssignmentRestProperty[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] AssignmentPropertyList[Yield, Await] : AssignmentProperty[?Yield, ?Await] AssignmentPropertyList[?Yield, ?Await] , AssignmentProperty[?Yield, ?Await] AssignmentElementList[Yield, Await] : AssignmentElisionElement[?Yield, ?Await] AssignmentElementList[?Yield, ?Await] , AssignmentElisionElement[?Yield, ?Await] AssignmentElisionElement[Yield, Await] : Elisionopt AssignmentElement[?Yield, ?Await] AssignmentProperty[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt PropertyName[?Yield, ?Await] : AssignmentElement[?Yield, ?Await] AssignmentElement[Yield, Await] : DestructuringAssignmentTarget[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt AssignmentRestElement[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] DestructuringAssignmentTarget[Yield, Await] : LeftHandSideExpression[?Yield, ?Await]

 

Expression[In, Yield, Await] : AssignmentExpression[?In, ?Yield, ?Await] Expression[?In, ?Yield, ?Await] , AssignmentExpression[?In, ?Yield, ?Await]

A.3

Statement[Yield, Await, Return] : BlockStatement[?Yield, ?Await, ?Return] VariableStatement[?Yield, ?Await] EmptyStatement ExpressionStatement[?Yield, ?Await] IfStatement[?Yield, ?Await, ?Return] BreakableStatement[?Yield, ?Await, ?Return] ContinueStatement[?Yield, ?Await] BreakStatement[?Yield, ?Await] [+Return] ReturnStatement[?Yield, ?Await] WithStatement[?Yield, ?Await, ?Return] LabelledStatement[?Yield, ?Await, ?Return] ThrowStatement[?Yield, ?Await] TryStatement[?Yield, ?Await, ?Return] DebuggerStatement Declaration[Yield, Await] : HoistableDeclaration[?Yield, ?Await, ~Default] ClassDeclaration[?Yield, ?Await, ~Default] LexicalDeclaration[+In, ?Yield, ?Await] HoistableDeclaration[Yield, Await, Default] : FunctionDeclaration[?Yield, ?Await, ?Default] GeneratorDeclaration[?Yield, ?Await, ?Default] AsyncFunctionDeclaration[?Yield, ?Await, ?Default] AsyncGeneratorDeclaration[?Yield, ?Await, ?Default] BreakableStatement[Yield, Await, Return] : IterationStatement[?Yield, ?Await, ?Return] SwitchStatement[?Yield, ?Await, ?Return] BlockStatement[Yield, Await, Return] : Block[?Yield, ?Await, ?Return] Block[Yield, Await, Return] : { StatementList[?Yield, ?Await, ?Return]opt } StatementList[Yield, Await, Return] : StatementListItem[?Yield, ?Await, ?Return] StatementList[?Yield, ?Await, ?Return] StatementListItem[?Yield, ?Await, ?Return] StatementListItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] Declaration[?Yield, ?Await] LexicalDeclaration[In, Yield, Await] : LetOrConst BindingList[?In, ?Yield, ?Await] ; LetOrConst : let const BindingList[In, Yield, Await] : LexicalBinding[?In, ?Yield, ?Await] BindingList[?In, ?Yield, ?Await] , LexicalBinding[?In, ?Yield, ?Await] LexicalBinding[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await] VariableStatement[Yield, Await] : var VariableDeclarationList[+In, ?Yield, ?Await] ; VariableDeclarationList[In, Yield, Await] : VariableDeclaration[?In, ?Yield, ?Await] VariableDeclarationList[?In, ?Yield, ?Await] , VariableDeclaration[?In, ?Yield, ?Await] VariableDeclaration[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await] BindingPattern[Yield, Await] : ObjectBindingPattern[?Yield, ?Await] ArrayBindingPattern[?Yield, ?Await] ObjectBindingPattern[Yield, Await] : { } { BindingRestProperty[?Yield, ?Await] } { BindingPropertyList[?Yield, ?Await] } { BindingPropertyList[?Yield, ?Await] , BindingRestProperty[?Yield, ?Await]opt } ArrayBindingPattern[Yield, Await] : [ Elisionopt BindingRestElement[?Yield, ?Await]opt ] [ BindingElementList[?Yield, ?Await] ] [ BindingElementList[?Yield, ?Await] , Elisionopt BindingRestElement[?Yield, ?Await]opt ] BindingRestProperty[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] BindingPropertyList[Yield, Await] : BindingProperty[?Yield, ?Await] BindingPropertyList[?Yield, ?Await] , BindingProperty[?Yield, ?Await] BindingElementList[Yield, Await] : BindingElisionElement[?Yield, ?Await] BindingElementList[?Yield, ?Await] , BindingElisionElement[?Yield, ?Await] BindingElisionElement[Yield, Await] : Elisionopt BindingElement[?Yield, ?Await] BindingProperty[Yield, Await] : SingleNameBinding[?Yield, ?Await] PropertyName[?Yield, ?Await] : BindingElement[?Yield, ?Await] BindingElement[Yield, Await] : SingleNameBinding[?Yield, ?Await] BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt SingleNameBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt BindingRestElement[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] ... BindingPattern[?Yield, ?Await] EmptyStatement : ; ExpressionStatement[Yield, Await] : [lookahead ∉ { {, function, async [no LineTerminator here] function, class, let [ }] Expression[+In, ?Yield, ?Await] ; IfStatement[Yield, Await, Return] : if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] else Statement[?Yield, ?Await, ?Return] if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [lookahead ≠ else] IterationStatement[Yield, Await, Return] : DoWhileStatement[?Yield, ?Await, ?Return] WhileStatement[?Yield, ?Await, ?Return] ForStatement[?Yield, ?Await, ?Return] ForInOfStatement[?Yield, ?Await, ?Return] DoWhileStatement[Yield, Await, Return] : do Statement[?Yield, ?Await, ?Return] while ( Expression[+In, ?Yield, ?Await] ) ; WhileStatement[Yield, Await, Return] : while ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] ForStatement[Yield, Await, Return] : for ( [lookahead ≠ let [] Expression[~In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] for ( var VariableDeclarationList[~In, ?Yield, ?Await] ; Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] for ( LexicalDeclaration[~In, ?Yield, ?Await] Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] ForInOfStatement[Yield, Await, Return] : for ( [lookahead ≠ let [] LeftHandSideExpression[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( ForDeclaration[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( [lookahead ∉ { let, async of }] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( ForDeclaration[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( [lookahead ≠ let] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( var ForBinding[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( ForDeclaration[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] ForDeclaration[Yield, Await] : LetOrConst ForBinding[?Yield, ?Await] ForBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] BindingPattern[?Yield, ?Await] ContinueStatement[Yield, Await] : continue ; continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; BreakStatement[Yield, Await] : break ; break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; ReturnStatement[Yield, Await] : return ; return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; WithStatement[Yield, Await, Return] : with ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] SwitchStatement[Yield, Await, Return] : switch ( Expression[+In, ?Yield, ?Await] ) CaseBlock[?Yield, ?Await, ?Return] CaseBlock[Yield, Await, Return] : { CaseClauses[?Yield, ?Await, ?Return]opt } { CaseClauses[?Yield, ?Await, ?Return]opt DefaultClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return]opt } CaseClauses[Yield, Await, Return] : CaseClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return] CaseClause[?Yield, ?Await, ?Return] CaseClause[Yield, Await, Return] : case Expression[+In, ?Yield, ?Await] : StatementList[?Yield, ?Await, ?Return]opt DefaultClause[Yield, Await, Return] : default : StatementList[?Yield, ?Await, ?Return]opt LabelledStatement[Yield, Await, Return] : LabelIdentifier[?Yield, ?Await] : LabelledItem[?Yield, ?Await, ?Return] LabelledItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] FunctionDeclaration[?Yield, ?Await, ~Default] ThrowStatement[Yield, Await] : throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; TryStatement[Yield, Await, Return] : try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] Catch[Yield, Await, Return] : catch ( CatchParameter[?Yield, ?Await] ) Block[?Yield, ?Await, ?Return] catch Block[?Yield, ?Await, ?Return] Finally[Yield, Await, Return] : finally Block[?Yield, ?Await, ?Return] CatchParameter[Yield, Await] : BindingIdentifier[?Yield, ?Await] BindingPattern[?Yield, ?Await] DebuggerStatement : debugger ;

A.4 関数とクラス

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 : ScriptBodyopt ScriptBody : StatementList[~Yield, ~Await, ~Return] Module : ModuleBodyopt ModuleBody : ModuleItemList ModuleItemList : ModuleItem ModuleItemList ModuleItem ModuleItem : ImportDeclaration ExportDeclaration StatementListItem[~Yield, +Await, ~Return] ModuleExportName : IdentifierName StringLiteral ImportDeclaration : import ImportClause FromClause WithClauseopt ; import ModuleSpecifier WithClauseopt ; ImportClause : ImportedDefaultBinding NameSpaceImport NamedImports ImportedDefaultBinding , NameSpaceImport ImportedDefaultBinding , NamedImports ImportedDefaultBinding : ImportedBinding NameSpaceImport : * as ImportedBinding NamedImports : { } { ImportsList } { ImportsList , } FromClause : from ModuleSpecifier ImportsList : ImportSpecifier ImportsList , ImportSpecifier ImportSpecifier : ImportedBinding ModuleExportName as ImportedBinding ModuleSpecifier : StringLiteral ImportedBinding : BindingIdentifier[~Yield, +Await] WithClause : with { } with { WithEntries ,opt } WithEntries : AttributeKey : StringLiteral AttributeKey : StringLiteral , WithEntries AttributeKey : IdentifierName StringLiteral ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ; export VariableStatement[~Yield, +Await] export Declaration[~Yield, +Await] export default HoistableDeclaration[~Yield, +Await, +Default] export default ClassDeclaration[~Yield, +Await, +Default] export default [lookahead ∉ { function, async [no LineTerminator here] function, class }] AssignmentExpression[+In, ~Yield, +Await] ; ExportFromClause : * * as ModuleExportName NamedExports NamedExports : { } { ExportsList } { ExportsList , } ExportsList : ExportSpecifier ExportsList , ExportSpecifier ExportSpecifier : ModuleExportName ModuleExportName as ModuleExportName

A.6 数値変換

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

StringNumericLiteral 文法によって明示的に定義されていないすべての文法記号は、数値リテラルの字句文法で使用される定義を持つ。

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

A.7 タイムゾーンオフセット文字列形式

UTCOffset ::: ASCIISign Hour ASCIISign Hour HourSubcomponents[+Extended] ASCIISign Hour HourSubcomponents[~Extended] ASCIISign ::: one of + - Hour ::: 0 DecimalDigit 1 DecimalDigit 20 21 22 23 HourSubcomponents[Extended] ::: TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TemporalDecimalFractionopt TimeSeparator[Extended] ::: [+Extended] : [~Extended] [empty] MinuteSecond ::: 0 DecimalDigit 1 DecimalDigit 2 DecimalDigit 3 DecimalDigit 4 DecimalDigit 5 DecimalDigit TemporalDecimalFraction ::: TemporalDecimalSeparator DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator ::: one of . ,

A.8 正規表現

Pattern[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Disjunction[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] | Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Alternative[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: [empty] Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Term[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Term[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Assertion[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Quantifier Assertion[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: ^ $ \b \B (?= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) Quantifier :: QuantifierPrefix QuantifierPrefix ? QuantifierPrefix :: * + ? { DecimalDigits[~Sep] } { DecimalDigits[~Sep] ,} { DecimalDigits[~Sep] , DecimalDigits[~Sep] } Atom[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: PatternCharacter . \ AtomEscape[?UnicodeMode, ?NamedCaptureGroups] CharacterClass[?UnicodeMode, ?UnicodeSetsMode] ( GroupSpecifier[?UnicodeMode]opt Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers : Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) RegularExpressionModifiers :: [empty] RegularExpressionModifiers RegularExpressionModifier RegularExpressionModifier :: one of i m s SyntaxCharacter :: one of ^ $ \ . * + ? ( ) [ ] { } | PatternCharacter :: SourceCharacter but not SyntaxCharacter AtomEscape[UnicodeMode, NamedCaptureGroups] :: DecimalEscape CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode] [+NamedCaptureGroups] k GroupName[?UnicodeMode] CharacterEscape[UnicodeMode] :: ControlEscape c AsciiLetter 0 [lookahead ∉ DecimalDigit] HexEscapeSequence RegExpUnicodeEscapeSequence[?UnicodeMode] IdentityEscape[?UnicodeMode] ControlEscape :: one of f n r t v GroupSpecifier[UnicodeMode] :: ? GroupName[?UnicodeMode] GroupName[UnicodeMode] :: < RegExpIdentifierName[?UnicodeMode] > RegExpIdentifierName[UnicodeMode] :: RegExpIdentifierStart[?UnicodeMode] RegExpIdentifierName[?UnicodeMode] RegExpIdentifierPart[?UnicodeMode] RegExpIdentifierStart[UnicodeMode] :: IdentifierStartChar \ RegExpUnicodeEscapeSequence[+UnicodeMode] [~UnicodeMode] UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart[UnicodeMode] :: IdentifierPartChar \ RegExpUnicodeEscapeSequence[+UnicodeMode] [~UnicodeMode] UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpUnicodeEscapeSequence[UnicodeMode] :: [+UnicodeMode] u HexLeadSurrogate \u HexTrailSurrogate [+UnicodeMode] u HexLeadSurrogate [+UnicodeMode] u HexTrailSurrogate [+UnicodeMode] u HexNonSurrogate [~UnicodeMode] u Hex4Digits [+UnicodeMode] u{ CodePoint } UnicodeLeadSurrogate :: any Unicode code point in the inclusive interval from U+D800 to U+DBFF UnicodeTrailSurrogate :: any Unicode code point in the inclusive interval from U+DC00 to U+DFFF

関連付けられる u HexLeadSurrogate の選択が曖昧である各 \u HexTrailSurrogate は、そうでなければ対応する \u HexTrailSurrogate を持たない、可能な限り最も近い u HexLeadSurrogate と関連付けられなければならない。

 

HexLeadSurrogate :: Hex4Digits but only if the MV of Hex4Digits is in the inclusive interval from 0xD800 to 0xDBFF HexTrailSurrogate :: Hex4Digits but only if the MV of Hex4Digits is in the inclusive interval from 0xDC00 to 0xDFFF HexNonSurrogate :: Hex4Digits but only if the MV of Hex4Digits is not in the inclusive interval from 0xD800 to 0xDFFF IdentityEscape[UnicodeMode] :: [+UnicodeMode] SyntaxCharacter [+UnicodeMode] / [~UnicodeMode] SourceCharacter but not UnicodeIDContinue DecimalEscape :: NonZeroDigit DecimalDigits[~Sep]opt [lookahead ∉ DecimalDigit] CharacterClassEscape[UnicodeMode] :: d D s S w W [+UnicodeMode] p{ UnicodePropertyValueExpression } [+UnicodeMode] P{ UnicodePropertyValueExpression } UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue LoneUnicodePropertyNameOrValue UnicodePropertyName :: UnicodePropertyNameCharacters UnicodePropertyNameCharacters :: UnicodePropertyNameCharacter UnicodePropertyNameCharactersopt UnicodePropertyValue :: UnicodePropertyValueCharacters LoneUnicodePropertyNameOrValue :: UnicodePropertyValueCharacters UnicodePropertyValueCharacters :: UnicodePropertyValueCharacter UnicodePropertyValueCharactersopt UnicodePropertyValueCharacter :: UnicodePropertyNameCharacter DecimalDigit UnicodePropertyNameCharacter :: AsciiLetter _ CharacterClass[UnicodeMode, UnicodeSetsMode] :: [ [lookahead ≠ ^] ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] [^ ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] ClassContents[UnicodeMode, UnicodeSetsMode] :: [empty] [~UnicodeSetsMode] NonemptyClassRanges[?UnicodeMode] [+UnicodeSetsMode] ClassSetExpression NonemptyClassRanges[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtom[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtom[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] NonemptyClassRangesNoDash[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] ClassAtom[UnicodeMode] :: - ClassAtomNoDash[?UnicodeMode] ClassAtomNoDash[UnicodeMode] :: SourceCharacter but not one of \ or ] or - \ ClassEscape[?UnicodeMode] ClassEscape[UnicodeMode] :: b [+UnicodeMode] - CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode] ClassSetExpression :: ClassUnion ClassIntersection ClassSubtraction ClassUnion :: ClassSetRange ClassUnionopt ClassSetOperand ClassUnionopt ClassIntersection :: ClassSetOperand && [lookahead ≠ &] ClassSetOperand ClassIntersection && [lookahead ≠ &] ClassSetOperand ClassSubtraction :: ClassSetOperand -- ClassSetOperand ClassSubtraction -- ClassSetOperand ClassSetRange :: ClassSetCharacter - ClassSetCharacter ClassSetOperand :: NestedClass ClassStringDisjunction ClassSetCharacter NestedClass :: [ [lookahead ≠ ^] ClassContents[+UnicodeMode, +UnicodeSetsMode] ] [^ ClassContents[+UnicodeMode, +UnicodeSetsMode] ] \ CharacterClassEscape[+UnicodeMode] ClassStringDisjunction :: \q{ ClassStringDisjunctionContents } ClassStringDisjunctionContents :: ClassString ClassString | ClassStringDisjunctionContents ClassString :: [empty] NonEmptyClassString NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt ClassSetCharacter :: [lookahead ∉ ClassSetReservedDoublePunctuator] SourceCharacter but not ClassSetSyntaxCharacter \ CharacterEscape[+UnicodeMode] \ ClassSetReservedPunctuator \b ClassSetReservedDoublePunctuator :: one of && !! ## $$ %% ** ++ ,, .. :: ;; << == >> ?? @@ ^^ `` ~~ ClassSetSyntaxCharacter :: one of ( ) [ ] { } / - \ | ClassSetReservedPunctuator :: one of & - ! # % , : ; < = > @ ` ~

Annex B (normative) Web ブラウザー向けの追加 ECMAScript 機能

この附属書で定義される ECMAScript 言語の構文および意味論は、ECMAScript ホストが web ブラウザーである場合に要求される。この附属書の内容は規範的であるが、ECMAScript ホストが web ブラウザーでない場合は任意である。

この附属書で定義される機能の一部はこの附属書で指定され、一部はこの文書の本文で指定される。

機能が本文で指定される場合、それが文書に影響する各箇所は、色付きのボックス内の "Normative Optional" という語で示される。さらに、その機能がアルゴリズムまたは early error 規則内の特定の文言に関わる場合、これは関連する機能を「ホストがサポートする」という条件によって保護される。Web ブラウザーはそのようなすべての機能をサポートすることが要求される。

Note

この附属書は、web ブラウザー ECMAScript ホストの様々なレガシー機能およびその他の特性を記述する。この附属書で指定されるすべての言語機能および振る舞いは、1 つ以上の望ましくない特性を持ち、レガシーな使用がなければこの仕様から削除されるものである。しかし、既存の多数の web ページがこれらの機能を使用しているため、web ブラウザーはそれらを引き続きサポートしなければならない。この附属書の仕様は、これらのレガシー機能の相互運用可能な実装に対する要件を定義する。

これらの機能は、コア ECMAScript 言語の一部とは見なされない。プログラマーは、新しい ECMAScript コードを書くときに、これらの機能および振る舞いを使用したり、それらの存在を仮定したりするべきではない。ECMAScript 実装は、その実装が web ブラウザーの一部であるか、web ブラウザーが遭遇するものと同じレガシー ECMAScript コードを実行する必要がある場合を除き、これらの機能を実装しないことが推奨される。

B.1 追加構文

B.1.1 HTML 風コメント

12.4 の構文および意味論は、次のように拡張される。ただし、この拡張は、ゴール記号 Module を使用してソーステキストを解析するときには許可されない:

構文

InputElementHashbangOrRegExp :: WhiteSpace LineTerminator Comment CommonToken HashbangComment RegularExpressionLiteral HTMLCloseComment Comment :: MultiLineComment SingleLineComment SingleLineHTMLOpenComment SingleLineHTMLCloseComment SingleLineDelimitedComment MultiLineComment :: /* FirstCommentLineopt LineTerminator MultiLineCommentCharsopt */ HTMLCloseCommentopt FirstCommentLine :: SingleLineDelimitedCommentChars SingleLineHTMLOpenComment :: <!-- SingleLineCommentCharsopt SingleLineHTMLCloseComment :: LineTerminatorSequence HTMLCloseComment SingleLineDelimitedComment :: /* SingleLineDelimitedCommentCharsopt */ HTMLCloseComment :: WhiteSpaceSequenceopt SingleLineDelimitedCommentSequenceopt --> SingleLineCommentCharsopt SingleLineDelimitedCommentChars :: SingleLineNotAsteriskChar SingleLineDelimitedCommentCharsopt * SingleLinePostAsteriskCommentCharsopt SingleLineNotAsteriskChar :: SourceCharacter but not one of * or LineTerminator SingleLinePostAsteriskCommentChars :: SingleLineNotForwardSlashOrAsteriskChar SingleLineDelimitedCommentCharsopt * SingleLinePostAsteriskCommentCharsopt SingleLineNotForwardSlashOrAsteriskChar :: SourceCharacter but not one of / or * or LineTerminator WhiteSpaceSequence :: WhiteSpace WhiteSpaceSequenceopt SingleLineDelimitedCommentSequence :: SingleLineDelimitedComment WhiteSpaceSequenceopt SingleLineDelimitedCommentSequenceopt

行終端コードポイントを含む MultiLineComment と同様に、SingleLineHTMLCloseComment は構文文法による解析の目的では LineTerminator と見なされる。

B.1.2 正規表現パターン

22.2.1 の構文は、次のように変更および拡張される。これらの変更は曖昧性を導入するが、それらは文法生成規則の順序および文脈情報によって解消される。次の文法を使用して解析する場合、各選択肢は、それ以前の生成規則の選択肢が一致しない場合にのみ考慮される。

この代替パターン文法および意味論は、BMP パターンの構文および意味論のみを変更する。次の文法拡張には、[UnicodeMode] パラメータでパラメータ化された生成規則が含まれる。しかし、これらの拡張はいずれも、ゴール記号に [UnicodeMode] パラメータが存在する状態で解析するときに認識される Unicode パターンの構文を変更しない。

構文

Term[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: [+UnicodeMode] Assertion[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] [+UnicodeMode] Atom[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Quantifier [+UnicodeMode] Atom[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] [~UnicodeMode] QuantifiableAssertion[?NamedCaptureGroups] Quantifier [~UnicodeMode] Assertion[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] [~UnicodeMode] ExtendedAtom[?NamedCaptureGroups] Quantifier [~UnicodeMode] ExtendedAtom[?NamedCaptureGroups] Assertion[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: ^ $ \b \B [+UnicodeMode] (?= Disjunction[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) [+UnicodeMode] (?! Disjunction[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) [~UnicodeMode] QuantifiableAssertion[?NamedCaptureGroups] (?<= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) QuantifiableAssertion[NamedCaptureGroups] :: (?= Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) (?! Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) ExtendedAtom[NamedCaptureGroups] :: . \ AtomEscape[~UnicodeMode, ?NamedCaptureGroups] \ [lookahead = c] CharacterClass[~UnicodeMode, ~UnicodeSetsMode] ( GroupSpecifier[~UnicodeMode]opt Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers : Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) InvalidBracedQuantifier ExtendedPatternCharacter InvalidBracedQuantifier :: { DecimalDigits[~Sep] } { DecimalDigits[~Sep] ,} { DecimalDigits[~Sep] , DecimalDigits[~Sep] } ExtendedPatternCharacter :: SourceCharacter but not one of ^ $ \ . * + ? ( ) [ | AtomEscape[UnicodeMode, NamedCaptureGroups] :: [+UnicodeMode] DecimalEscape [~UnicodeMode] DecimalEscape but only if the CapturingGroupNumber of DecimalEscape is ≤ CountLeftCapturingParensWithin(the Pattern containing DecimalEscape) CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode, ?NamedCaptureGroups] [+NamedCaptureGroups] k GroupName[?UnicodeMode] CharacterEscape[UnicodeMode, NamedCaptureGroups] :: ControlEscape c AsciiLetter 0 [lookahead ∉ DecimalDigit] HexEscapeSequence RegExpUnicodeEscapeSequence[?UnicodeMode] [~UnicodeMode] LegacyOctalEscapeSequence IdentityEscape[?UnicodeMode, ?NamedCaptureGroups] IdentityEscape[UnicodeMode, NamedCaptureGroups] :: [+UnicodeMode] SyntaxCharacter [+UnicodeMode] / [~UnicodeMode] SourceCharacterIdentityEscape[?NamedCaptureGroups] SourceCharacterIdentityEscape[NamedCaptureGroups] :: [~NamedCaptureGroups] SourceCharacter but not c [+NamedCaptureGroups] SourceCharacter but not one of c or k ClassAtomNoDash[UnicodeMode, NamedCaptureGroups] :: SourceCharacter but not one of \ or ] or - \ ClassEscape[?UnicodeMode, ?NamedCaptureGroups] \ [lookahead = c] ClassEscape[UnicodeMode, NamedCaptureGroups] :: b [+UnicodeMode] - [~UnicodeMode] c ClassControlLetter CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode, ?NamedCaptureGroups] ClassControlLetter :: DecimalDigit _ Note

同じ左辺が [+UnicodeMode] ガードと [~UnicodeMode] ガードの両方で出現する場合、それは曖昧性解消の優先順位を制御するためである。

B.1.2.1 Static Semantics: Early Errors

22.2.1.1 の意味論は次のように拡張される:

ExtendedAtom :: InvalidBracedQuantifier
  • いずれかのソーステキストがこの生成規則に一致する場合、それは Syntax Error である。

さらに、次の生成規則に対する規則は、強調表示されたテキストの追加によって変更される:

NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents

B.1.2.2 Static Semantics: CountLeftCapturingParensWithin and CountLeftCapturingParensBefore

CountLeftCapturingParensWithin および CountLeftCapturingParensBefore の定義において、“ Atom :: ( GroupSpecifieropt Disjunction ) ” への参照は、“ Atom :: ( GroupSpecifieropt Disjunction ) ” または “ ExtendedAtom :: ( GroupSpecifieropt Disjunction ) ” を意味するものとして解釈される。

B.1.2.3 Static Semantics: IsCharacterClass

22.2.1.6 の意味論は次のように拡張される:

ClassAtomNoDash :: \ [lookahead = c]
  1. false を返す。

B.1.2.4 Static Semantics: CharacterValue

22.2.1.7 の意味論は次のように拡張される:

ClassAtomNoDash :: \ [lookahead = c]
  1. U+005C (REVERSE SOLIDUS) の数値を返す。
ClassEscape :: c ClassControlLetter
  1. chClassControlLetter に一致したコードポイントとする。
  2. ich の数値とする。
  3. i を 32 で割った余りを返す。
CharacterEscape :: LegacyOctalEscapeSequence
  1. LegacyOctalEscapeSequence の MV を返す(12.9.4.3 を参照)。

B.1.2.5 Runtime Semantics: CompileSubpattern

CompileSubpattern の意味論は次のように拡張される:

Term :: QuantifiableAssertion Quantifier に対する規則は、AtomQuantifiableAssertion に置き換えることを除き、 Term :: Atom Quantifier に対する規則と同じである。

Term :: ExtendedAtom Quantifier に対する規則は、AtomExtendedAtom に置き換えることを除き、 Term :: Atom Quantifier に対する規則と同じである。

Term :: ExtendedAtom に対する規則は、AtomExtendedAtom に置き換えることを除き、 Term :: Atom に対する規則と同じである。

B.1.2.6 Runtime Semantics: CompileAssertion

Assertion :: (?= Disjunction ) および Assertion :: (?! Disjunction ) 生成規則に対する CompileAssertion 規則は、AssertionQuantifiableAssertion に置き換えて、QuantifiableAssertion 生成規則にも使用される。

B.1.2.7 Runtime Semantics: CompileAtom

Atom :: PatternCharacter を除く Atom 生成規則に対する CompileAtom 規則は、AtomExtendedAtom に置き換えて、ExtendedAtom 生成規則にも使用される。パラメータ direction を持つ次の規則も追加される:

ExtendedAtom :: \ [lookahead = c]
  1. charSet を単一文字 \ U+005C (REVERSE SOLIDUS) を含む CharSet とする。
  2. CharacterSetMatcher(regexpRecord, charSet, false, direction) を返す。
ExtendedAtom :: ExtendedPatternCharacter
  1. chExtendedPatternCharacter によって表される文字とする。
  2. charSet を文字 ch を含む 1 要素の CharSet とする。
  3. CharacterSetMatcher(regexpRecord, charSet, false, direction) を返す。

B.1.2.8 Runtime Semantics: CompileToCharSet

22.2.2.9 の意味論は次のように拡張される:

次の 2 つの規則は、CompileToCharSet の対応する規則を置き換える。

NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents
  1. charSet を、引数 regexpRecord を伴う最初の ClassAtomCompileToCharSet とする。
  2. otherSet を、引数 regexpRecord を伴う 2 番目の ClassAtomCompileToCharSet とする。
  3. remainingSet を、引数 regexpRecord を伴う ClassContentsCompileToCharSet とする。
  4. rangeSetCharacterRangeOrUnion(regexpRecord, charSet, otherSet) とする。
  5. rangeSetremainingSet の和集合を返す。
NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents
  1. charSet を、引数 regexpRecord を伴う ClassAtomNoDashCompileToCharSet とする。
  2. otherSet を、引数 regexpRecord を伴う ClassAtomCompileToCharSet とする。
  3. remainingSet を、引数 regexpRecord を伴う ClassContentsCompileToCharSet とする。
  4. rangeSetCharacterRangeOrUnion(regexpRecord, charSet, otherSet) とする。
  5. rangeSetremainingSet の和集合を返す。

さらに、次の規則が CompileToCharSet に追加される。

ClassEscape :: c ClassControlLetter
  1. cv をこの ClassEscapeCharacterValue とする。
  2. c を文字値が cv である文字とする。
  3. 単一文字 c を含む CharSet を返す。
ClassAtomNoDash :: \ [lookahead = c]
  1. 単一文字 \ U+005C (REVERSE SOLIDUS) を含む CharSet を返す。
Note
この生成規則は、文字クラス内のシーケンス \c からのみ到達でき、その後に許容可能な制御文字が続かない場合に限られる。

B.1.2.8.1 CharacterRangeOrUnion ( regexpRecord, charSet, otherSet )

The abstract operation CharacterRangeOrUnion takes arguments regexpRecord (RegExp Record), charSet (CharSet), and otherSet (CharSet) and returns CharSet. It performs the following steps when called:

  1. HasEitherUnicodeFlag(regexpRecord) が false であれば、
    1. charSet がちょうど 1 つの文字を含まない、または otherSet がちょうど 1 つの文字を含まないならば、
      1. remainingSet を単一文字 - U+002D (HYPHEN-MINUS) を含む CharSet とする。
      2. CharSet charSetotherSet、および remainingSet の和集合を返す。
  2. CharacterRange(charSet, otherSet) を返す。

B.1.2.9 Static Semantics: ParsePattern ( patternText, u, v )

22.2.3.4 の意味論は次のように拡張される:

抽象操作 ParsePattern は引数 patternText(Unicode コードポイントのシーケンス)、u(Boolean)、および v(Boolean)を取る。これは呼び出されたとき次の手順を実行する:

  1. vtrue かつ utrue ならば、
    1. parseResult を、1 つ以上の SyntaxError オブジェクトを含む List とする。
  2. そうではなく vtrue ならば、
    1. parseResultParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups]) とする。
  3. そうではなく utrue ならば、
    1. parseResultParseText(patternText, Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups]) とする。
  4. そうでなければ、
    1. parseResultParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, ~NamedCaptureGroups]) とする。
    2. parseResultParse Node であり、かつ parseResultGroupName を含むならば、
      1. parseResultParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups]) に設定する。
  5. parseResult を返す。

B.2 追加の組込みプロパティ

ECMAScript ホストが web ブラウザーである場合、標準組込みオブジェクトの次の追加プロパティが定義される。

B.2.1 グローバルオブジェクトの追加プロパティ

Table 98 のエントリは、Table 6 に追加される。

Table 98: 追加の Well-known Intrinsic Objects
Intrinsic 名 グローバル名 ECMAScript 言語との関連
%escape% escape escape 関数(B.2.1.1
%unescape% unescape unescape 関数(B.2.1.2

B.2.1.1 escape ( string )

この関数はグローバルオブジェクトのプロパティである。これは、特定のコード単位が 16 進エスケープシーケンスで置き換えられた String 値の新しいバージョンを計算する。

数値が 0x00FF 以下のコード単位を置き換える場合、%xx 形式の 2 桁エスケープシーケンスが使用される。数値が 0x00FF より厳密に大きいコード単位を置き換える場合、%uxxxx 形式の 4 桁エスケープシーケンスが使用される。

これは %escape% intrinsic オブジェクトである。

呼び出されたとき、次の手順を実行する:

  1. string を ? ToString(string) に設定する。
  2. lenstring の長さとする。
  3. result を空の String とする。
  4. unescapedSet を ASCII word character と "@*+-./" の文字列連結とする。
  5. k を 0 とする。
  6. k < len の間、繰り返す:
    1. codeUnitstring 内のインデックス k にあるコード単位とする。
    2. unescapedSetcodeUnit を含むならば、
      1. strcodeUnit とする。
    3. そうでなければ、
      1. ncodeUnit の数値とする。
      2. n < 256 ならば、
        1. hex を、大文字の 16 進数として書式化された n の String 表現とする。
        2. str"%"StringPad(hex, 2, "0", start) の文字列連結とする。
      3. そうでなければ、
        1. hex を、大文字の 16 進数として書式化された n の String 表現とする。
        2. str"%u"StringPad(hex, 4, "0", start) の文字列連結とする。
    4. resultresultstr の文字列連結に設定する。
    5. kk + 1 に設定する。
  7. result を返す。
Note

このエンコーディングは RFC 1738 に記述されたエンコーディングに部分的に基づくが、この標準で指定されるエンコーディング全体は RFC 1738 の内容に関わらず上記で記述されている。このエンコーディングは、RFC 3986 によって RFC 1738 に加えられた変更を反映しない。

B.2.1.2 unescape ( string )

この関数はグローバルオブジェクトのプロパティである。これは、escape 関数によって導入され得る種類の各エスケープシーケンスが、それが表すコード単位に置き換えられた String 値の新しいバージョンを計算する。

これは %unescape% intrinsic オブジェクトである。

呼び出されたとき、次の手順を実行する:

  1. string を ? ToString(string) に設定する。
  2. lenstring の長さとする。
  3. result を空の String とする。
  4. k を 0 とする。
  5. k < len の間、繰り返す:
    1. codeUnitstring 内のインデックス k にあるコード単位とする。
    2. codeUnit がコード単位 0x0025 (PERCENT SIGN) であるならば、
      1. hexDigits を空の String とする。
      2. optionalAdvance を 0 とする。
      3. k + 5 < len であり、かつ string 内のインデックス k + 1 にあるコード単位がコード単位 0x0075 (LATIN SMALL LETTER U) であるならば、
        1. hexDigitsstringk + 2 から k + 6 までの部分文字列に設定する。
        2. optionalAdvance を 5 に設定する。
      4. そうではなく k + 3 ≤ len ならば、
        1. hexDigitsstringk + 1 から k + 3 までの部分文字列に設定する。
        2. optionalAdvance を 2 に設定する。
      5. parseResultParseText(hexDigits, HexDigits[~Sep]) とする。
      6. parseResultParse Node であるならば、
        1. nparseResult の MV とする。
        2. codeUnit を数値が n であるコード単位に設定する。
        3. kk + optionalAdvance に設定する。
    3. resultresultcodeUnit の文字列連結に設定する。
    4. kk + 1 に設定する。
  6. result を返す。

B.2.2 String.prototype オブジェクトの追加プロパティ

B.2.2.1 String.prototype.substr ( start, length )

このメソッドは、this 値を String に変換した結果の部分文字列を返す。これはインデックス start から開始し、length 個のコード単位分だけ続く(または lengthundefined ならば String の末尾まで)。start が負である場合、それは sourceLength + start として扱われる。ここで sourceLength は String の長さである。結果は String 値であり、String オブジェクトではない。

呼び出されたとき、次の手順を実行する:

  1. objthis value とする。
  2. RequireObjectCoercible(obj) を実行する。
  3. str を ? ToString(obj) とする。
  4. sizestr の長さとする。
  5. intStart を ? ToIntegerOrInfinity(start) とする。
  6. intStart = -∞ ならば、intStart を 0 に設定する。
  7. そうではなく intStart < 0 ならば、intStartmax(size + intStart, 0) に設定する。
  8. そうでなければ、intStartmin(intStart, size) に設定する。
  9. lengthundefined ならば intLengthsize とする;そうでなければ intLength を ? ToIntegerOrInfinity(length) とする。
  10. intLength を、intLength を 0 と size の間にクランプした結果に設定する。
  11. intEndmin(intStart + intLength, size) とする。
  12. strintStart から intEnd までの部分文字列を返す。
Note

このメソッドは意図的に generic である。その this 値が String オブジェクトであることを要求しない。したがって、メソッドとして使用するために他の種類のオブジェクトへ移すことができる。

B.2.2.2 String.prototype.anchor ( name )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. strthis value とする。
  2. CreateHTML(str, "a", "name", name) を返す。

B.2.2.2.1 CreateHTML ( contents, tag, attribute, attrValue )

The abstract operation CreateHTML takes arguments contents (ECMAScript 言語値), tag (String), attribute (String), and attrValue (ECMAScript 言語値) and returns String を含む normal completion または throw completion のいずれか. It performs the following steps when called:

  1. RequireObjectCoercible(contents) を実行する。
  2. contentsStr を ? ToString(contents) とする。
  3. p1"<"tag の文字列連結とする。
  4. attribute が空の String でないならば、
    1. attrValueStr を ? ToString(attrValue) とする。
    2. escapedAttrValue を、attrValueStr 内のコード単位 0x0022 (QUOTATION MARK) の各出現が 6 個のコード単位のシーケンス "&quot;" に置き換えられていることを除き、attrValueStr と同じ String 値とする。
    3. p1 を次の文字列連結に設定する:
      • p1
      • コード単位 0x0020 (SPACE)
      • attribute
      • コード単位 0x003D (EQUALS SIGN)
      • コード単位 0x0022 (QUOTATION MARK)
      • escapedAttrValue
      • コード単位 0x0022 (QUOTATION MARK)
  5. p2p1">" の文字列連結とする。
  6. p3p2contentsStr の文字列連結とする。
  7. p4p3"</"tag、および ">" の文字列連結とする。
  8. p4 を返す。

B.2.2.3 String.prototype.big ( )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. strthis value とする。
  2. CreateHTML(str, "big", "", "") を返す。

B.2.2.4 String.prototype.blink ( )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. strthis value とする。
  2. CreateHTML(str, "blink", "", "") を返す。

B.2.2.5 String.prototype.bold ( )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. strthis value とする。
  2. CreateHTML(str, "b", "", "") を返す。

B.2.2.6 String.prototype.fixed ( )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. strthis value とする。
  2. CreateHTML(str, "tt", "", "") を返す。

B.2.2.7 String.prototype.fontcolor ( colour )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. strthis value とする。
  2. CreateHTML(str, "font", "color", colour) を返す。

B.2.2.8 String.prototype.fontsize ( size )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. strthis value とする。
  2. CreateHTML(str, "font", "size", size) を返す。

B.2.2.9 String.prototype.italics ( )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. strthis value とする。
  2. CreateHTML(str, "i", "", "") を返す。

B.2.2.10 String.prototype.link ( url )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. strthis value とする。
  2. CreateHTML(str, "a", "href", url) を返す。

B.2.2.11 String.prototype.small ( )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. strthis value とする。
  2. CreateHTML(str, "small", "", "") を返す。

B.2.2.12 String.prototype.strike ( )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. strthis value とする。
  2. CreateHTML(str, "strike", "", "") を返す。

B.2.2.13 String.prototype.sub ( )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. strthis value とする。
  2. CreateHTML(str, "sub", "", "") を返す。

B.2.2.14 String.prototype.sup ( )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. strthis value とする。
  2. CreateHTML(str, "sup", "", "") を返す。

B.2.2.15 String.prototype.trimLeft ( )

Note

"trimStart" プロパティが推奨される。"trimLeft" プロパティは主に古いコードとの互換性のために提供される。新しい ECMAScript コードでは "trimStart" プロパティを使用することが推奨される。

"trimLeft" プロパティの初期値は、22.1.3.34 で定義される %String.prototype.trimStart% である。

B.2.2.16 String.prototype.trimRight ( )

Note

"trimEnd" プロパティが推奨される。"trimRight" プロパティは主に古いコードとの互換性のために提供される。新しい ECMAScript コードでは "trimEnd" プロパティを使用することが推奨される。

"trimRight" プロパティの初期値は、22.1.3.33 で定義される %String.prototype.trimEnd% である。

B.2.3 Date.prototype オブジェクトの追加プロパティ

B.2.3.1 Date.prototype.getYear ( )

Note

getFullYear メソッドは、“year 2000 problem” を回避するため、ほぼすべての目的で推奨される。

このメソッドは、呼び出されたとき次の手順を実行する:

  1. dateObjectthis value とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. tdateObject.[[DateValue]] とする。
  4. tNaN であれば、NaN を返す。
  5. YearFromTime(LocalTime(t)) - 1900𝔽 を返す。

B.2.3.2 Date.prototype.setYear ( year )

Note

setFullYear メソッドは、“year 2000 problem” を回避するため、ほぼすべての目的で推奨される。

このメソッドは、呼び出されたとき次の手順を実行する:

  1. dateObjectthis value とする。
  2. RequireInternalSlot(dateObject, [[DateValue]]) を実行する。
  3. timedateObject.[[DateValue]] とする。
  4. year を ? ToNumber(year) とする。
  5. timeNaN ならば、time+0𝔽 に設定する;そうでなければ timeLocalTime(time) に設定する。
  6. fullYearMakeFullYear(year) とする。
  7. dayMakeDay(fullYear, MonthFromTime(time), DateFromTime(time)) とする。
  8. dateMakeDate(day, TimeWithinDay(time)) とする。
  9. utcTimestampTimeClip(UTC(date)) とする。
  10. dateObject.[[DateValue]]utcTimestamp に設定する。
  11. utcTimestamp を返す。

B.2.3.3 Date.prototype.toGMTString ( )

Note

toUTCString メソッドが推奨される。このメソッドは主に古いコードとの互換性のために提供される。

"toGMTString" プロパティの初期値は、21.4.4.43 で定義される %Date.prototype.toUTCString% である。

B.2.4 RegExp.prototype オブジェクトの追加プロパティ

B.2.4.1 RegExp.prototype.compile ( pattern, flags )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. RequireInternalSlot(obj, [[RegExpMatcher]]) を実行する。
  3. pattern が Object であり、pattern[[RegExpMatcher]] 内部スロットを持つならば、
    1. flagsundefined でないならば、TypeError 例外を投げる。
    2. flagspattern.[[OriginalFlags]] に設定する。
    3. patternpattern.[[OriginalSource]] に設定する。
  4. RegExpInitialize(obj, pattern, flags) を返す。
Note

このメソッドは this value である RegExp を、新しいパターンおよびフラグで完全に再初期化する。実装は、このメソッドの使用を、結果の RegExp オブジェクトが複数回使用され、したがって追加の最適化の候補であるという表明として解釈してよい。

B.3 その他の追加機能

B.3.1 ラベル付き Function Declaration

ECMAScript 2015 より前は、LabelledStatement の仕様は、文ラベルと FunctionDeclaration との関連付けを許可していなかった。しかし、ラベル付き FunctionDeclaration は非 strict コードに対する許容される拡張であり、ほとんどのブラウザーでホストされる ECMAScript 実装はその拡張をサポートしていた。ECMAScript 2015 以降では、LabelledStatement の文法生成規則は LabelledItem として FunctionDeclaration の使用を許可するが、14.13.1 はそれが発生した場合に Syntax Error を生成する Early Error 規則を含む。その規則は、この機能をホストがサポートする場合、非 strict コードでは Syntax Error を抑制するように変更される。

Note

WithStatementIfStatement、および IterationStatementearly error 規則は、これらの文が非 strict コード内でラベル付き FunctionDeclaration を含むことを防ぐ。

B.3.2 ブロックレベル Function Declaration の Web レガシー互換性意味論

ECMAScript 2015 より前は、ECMAScript 仕様は Block 文の StatementList の要素としての FunctionDeclaration の出現を定義していなかった。しかし、その形式の FunctionDeclaration のサポートは許容される拡張であり、ほとんどのブラウザーでホストされる ECMAScript 実装はそれらを許可していた。残念ながら、そのような宣言の意味論はそれらの実装間で異なる。これらの意味論上の違いのため、Block レベルの関数宣言を使用する既存の web ECMAScript ソーステキストは、その使用がそのような宣言に対するすべてのブラウザー実装の意味論の共通部分にのみ依存する場合に限り、ブラウザー実装間で移植可能である。次は、その共通部分の意味論に含まれるユースケースである:

  1. 関数が宣言され、単一のブロック内でのみ参照される。

  2. 関数が宣言され、単一の Block 内で使用される可能性があるが、その同じ Block 内に含まれていない内側の関数定義によっても参照される。

    • BindingIdentifier が名前 f である 1 つ以上の FunctionDeclaration が、包含関数 g関数コード内に現れ、その宣言が Block 内にネストされている。
    • var 宣言でない f の他の宣言が、g関数コード内に存在しない。
    • IdentifierReference としての f の出現が、f の宣言を含む BlockStatementList 内に存在してよい。
    • g 内にネストされた別の関数 h 内に、IdentifierReference としての f の出現が少なくとも 1 つ存在し、h 内からの f への参照を shadow する f の他の宣言が存在しない。
    • h のすべての呼び出しは、f の宣言が評価された後に発生する。
  3. 関数が宣言され、単一のブロック内で使用される可能性があるが、後続のブロック内でも参照される。

最初のユースケースは、ECMAScript 2015 によって提供される Block レベルの関数宣言の意味論と相互運用可能である。そのユースケースを用いる既存の ECMAScript ソーステキストはすべて、1014、および 15 の各節で定義されるブロックレベル関数宣言の意味論を使用して動作する。

2 番目および 3 番目のユースケースについて ECMAScript 2015 との相互運用性を得るには、節 10、節 15、節 19.2.1、および節 16.1.7 の意味論に対する次の拡張が必要である。

ECMAScript 実装が診断警告メッセージを報告する機構を持つ場合、これらの互換性意味論が適用され、非互換性意味論との差異が観測可能に導入される FunctionDeclaration をコードが含むとき、警告が生成されるべきである。例えば、var binding の導入が early error を作るために導入されない場合、警告メッセージは生成されるべきではない。

この機能は、次の箇所で特別な意味論を伴う:

B.3.3 IfStatement の Statement 節内の FunctionDeclaration

次は、14.6IfStatement 生成規則を拡張する:

IfStatement[Yield, Await, Return] : if ( Expression[+In, ?Yield, ?Await] ) FunctionDeclaration[?Yield, ?Await, ~Default] else Statement[?Yield, ?Await, ?Return] if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] else FunctionDeclaration[?Yield, ?Await, ~Default] if ( Expression[+In, ?Yield, ?Await] ) FunctionDeclaration[?Yield, ?Await, ~Default] else FunctionDeclaration[?Yield, ?Await, ~Default] if ( Expression[+In, ?Yield, ?Await] ) FunctionDeclaration[?Yield, ?Await, ~Default] [lookahead ≠ else]

この生成規則は、非 strict コードを解析するときにのみ適用される。この生成規則に一致したソーステキストは、FunctionDeclaration[?Yield, ?Await, ~Default] の各一致出現が、ソーステキスト内のその位置を占める BlockStatement の唯一の StatementListItem であるかのように処理される。そのような合成 BlockStatement の意味論には、B.3.2 で指定される web レガシー互換性意味論が含まれる。

B.3.4 Catch ブロック内の VariableStatement

この機能では、Catch 節の Block が、CatchParameter によっても束縛される名前を束縛する var 宣言を含んでよい。これは、14.15.1 における Catch : catch ( CatchParameter ) Block に対する early error 規則を変更することによって実現される。

Note

実行時、そのような binding は VariableDeclarationEnvironment 内でインスタンス化される。それらは CatchParameter によって導入された同名の binding を shadow しないため、そのような var 宣言の Initializer は、var binding ではなく対応する catch parameter に代入する。

この変更された振る舞いは、Catch 節の Block 内に含まれる direct eval 呼び出しによって導入される var および function 宣言にも適用される。この変更は、EvalDeclarationInstantiation 内の step 3.d.i.2.a.i および 13.b.ii.4.a.i.i を変更することによって実現される。

B.3.5 ForIn 文ヘッド内の Initializer

次は、14.7.5ForInOfStatement 生成規則を拡張する:

ForInOfStatement[Yield, Await, Return] : for ( var BindingIdentifier[?Yield, ?Await] Initializer[~In, ?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return]

この生成規則は、非 strict コードを解析するときにのみ適用される。

8.3.1ContainsDuplicateLabelsstatic semantics は、次で拡張される:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. 引数 labelSet を伴う StatementContainsDuplicateLabels を返す。

8.3.2ContainsUndefinedBreakTargetstatic semantics は、次で拡張される:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. 引数 labelSet を伴う StatementContainsUndefinedBreakTarget を返す。

8.3.3ContainsUndefinedContinueTargetstatic semantics は、次で拡張される:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. 引数 iterationSet および « » を伴う StatementContainsUndefinedContinueTarget を返す。

14.7.5.2IsDestructuringstatic semantics は、次で拡張される:

BindingIdentifier : Identifier yield await
  1. false を返す。

8.2.6VarDeclaredNamesstatic semantics は、次で拡張される:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. names1BindingIdentifierBoundNames とする。
  2. names2StatementVarDeclaredNames とする。
  3. names1names2 のリスト連結を返す。

8.2.7VarScopedDeclarationsstatic semantics は、次で拡張される:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. declarations1 を « BindingIdentifier » とする。
  2. declarations2StatementVarScopedDeclarations とする。
  3. declarations1declarations2 のリスト連結を返す。

14.7.5.5ForInOfLoopEvaluationruntime semantics は、次で拡張される:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. bindingIdBindingIdentifierStringValue とする。
  2. lhs を ? ResolveBinding(bindingId) とする。
  3. IsAnonymousFunctionDefinition(Initializer) が true ならば、
    1. value を、引数 bindingId を伴う InitializerNamedEvaluation とする。
  4. そうでなければ、
    1. rhsInitializer の ? Evaluation とする。
    2. value を ? GetValue(rhs) とする。
  5. PutValue(lhs, value) を実行する。
  6. keyResult を ? ForIn/OfHeadEvaluation(« », Expression, enumerate) とする。
  7. ForIn/OfBodyEvaluation(BindingIdentifier, Statement, keyResult, enumerate, var-binding, labelSet) を返す。

B.3.6 [[IsHTMLDDA]] 内部スロット

[[IsHTMLDDA]] 内部スロットは、host-defined オブジェクト上に存在し得る。[[IsHTMLDDA]] 内部スロットを持つオブジェクトは、ToBoolean および IsLooselyEqual 抽象操作において、また typeof 演算子のオペランドとして使用されるとき、undefined のように振る舞う。

Note

[[IsHTMLDDA]] 内部スロットを持つオブジェクトは、この仕様によって作成されることは決してない。しかし、web ブラウザーの document.all オブジェクトは、web 互換性のために存在する、このスロットを持つ host-defined exotic object である。この種類のオブジェクトの既知の他の例は存在せず、実装は document.all を除き、これを持つものを作成するべきではない。

この機能は、次の箇所で特別な意味論を伴う:

B.3.7 HostMakeJobCallback における非既定の振る舞い

HostMakeJobCallback 抽象操作は、web ブラウザーであるホストが非既定の振る舞いを指定することを許可する。

B.3.8 HostEnsureCanAddPrivateElement における非既定の振る舞い

HostEnsureCanAddPrivateElement 抽象操作は、web ブラウザーであるホストが非既定の振る舞いを指定することを許可する。

B.3.9 関数呼び出し代入ターゲットに対する実行時エラー

非 strict コードにおいて関数呼び出し(13.3.6)が代入ターゲットとして使用される場合、early error を生成する代わりに、代入の評価中に ReferenceError 例外が投げられる。

Note

代入ターゲットが AssignmentExpressionLeftHandSideExpression である場合、代入演算子は = または AssignmentOperator でなければならない。特に、ここでの許可は論理代入演算子(??=&&=||=)には適用されない。

CallExpression : CoverCallExpressionAndAsyncArrowHead および CallExpression : CallExpression Arguments に対する AssignmentTargetType の step 1 を参照。

Annex C (informative) ECMAScript の strict mode

strict mode の制限と例外

Annex D (informative) ホスト階層化ポイント

host の定義については 4.2 を参照。

D.1 Host Hook

HostCallJobCallback(...)

HostEnqueueFinalizationRegistryCleanupJob(...)

HostEnqueueGenericJob(...)

HostEnqueuePromiseJob(...)

HostEnqueueTimeoutJob(...)

HostEnsureCanCompileStrings(...)

HostFinalizeImportMeta(...)

HostGetImportMetaProperties(...)

HostGrowSharedArrayBuffer(...)

HostHasSourceTextAvailable(...)

HostLoadImportedModule(...)

HostGetSupportedImportAttributes(...)

HostMakeJobCallback(...)

HostPromiseRejectionTracker(...)

HostResizeArrayBuffer(...)

InitializeHostDefinedRealm(...)

D.2 Host-defined フィールド

Realm Record 上の [[HostDefined]]Table 19 を参照。

Script Record 上の [[HostDefined]]Table 34 を参照。

Module Record 上の [[HostDefined]]Table 38 を参照。

JobCallback Record 上の [[HostDefined]]Table 23 を参照。

Candidate Execution 上の [[HostSynchronizesWith]]Table 97 を参照。

[[IsHTMLDDA]]B.3.6 を参照。

D.3 Host-defined オブジェクト

グローバルオブジェクト:節 19 を参照。

D.4 Job の実行

Job Abstract Closure の呼び出し前の準備手順、および呼び出し後のクリーンアップ手順。9.5 を参照。

D.5 Exotic Object の内部メソッド

この仕様内で指定されていない任意の exotic object について、Table 4 内の必須内部メソッドのいずれか。

D.6 組込みオブジェクトおよびメソッド

17.1 で制限されるものを除き、この仕様内で定義されていない任意の組込みオブジェクトおよびメソッド。

Annex E (informative) 互換性に影響する可能性のある ECMAScript 2015 における訂正および明確化

9.1.1.4.14-9.1.1.4.17 Edition 5 および 5.1 では、新しいグローバル宣言に対応するグローバルオブジェクトプロパティが既に存在するかどうかを判断するために、プロパティ存在テストを使用していた。ECMAScript 2015 は own property 存在テストを使用する。これは、web ブラウザーで最も一般的に実装されてきたものに対応する。

10.4.2.1:第 5 版では、配列インデックスまたは新しい length 値の整数変換より前に、現在の配列 length を捕捉するように移動された。しかし、変換処理が配列 length を変更する副作用を持つ場合、捕捉された length 値は無効になる可能性があった。ECMAScript 2015 は、そのような副作用が起こり得た後に現在の配列 length を捕捉しなければならないと指定する。

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:以前の版では、パターン引数が 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 を呼び出している。

Annex F (informative) 以前の版との非互換性を導入する追加および変更

6.2.5:ECMAScript 2015 では、関数呼び出しは 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(ソース位置)に基づいて正準化される。

12.2:ECMAScript 2016 では、Unicode 5.1 を義務付けていた ECMAScript 2015 とは対照的に、Unicode 8.0.0 以上が義務付けられる。特に、これにより、ECMAScript 2015 では Space_SeparatorZs)カテゴリにあり whitespace として扱われていた U+180E MONGOLIAN VOWEL SEPARATOR が、(Unicode 6.3.0 時点で)FormatCf)カテゴリへ移動された。これは whitespace-sensitive なメソッドの振る舞いを変える。例えば、"\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 では、do-while 文の末尾にセミコロンがない場合、Automatic Semicolon Insertion がセミコロンを追加する。この変更は、仕様をほとんどの既存実装の実際の振る舞いに合わせるものである。

13.2.5.1:ECMAScript 2015 では、Object Initializer 内に重複するプロパティ名を持つことは、もはや early error ではない。

13.15.1:ECMAScript 2015 では、FunctionExpression の関数名のような immutable binding への代入を含む strict mode コードは early error を生成しない。代わりに実行時エラーを生成する。

14.2:ECMAScript 2015 では、トークン let に続いて入力要素 LineTerminator、さらに Identifier で始まる StatementListLexicalDeclaration の開始である。以前の版では、automatic semicolon insertion は常に Identifier 入力要素の前にセミコロンを挿入していた。

14.5:ECMAScript 2015 では、トークン let に続いてトークン [ で始まる StatementListItemLexicalDeclaration の開始である。以前の版では、そのようなシーケンスは ExpressionStatement の開始であった。

14.6.2:ECMAScript 2015 では、IfStatement の normal result が値 empty になることは決してない。Statement 部分が評価されない場合、または評価された Statement 部分が empty を含む normal completion を生成する場合、IfStatement の結果は undefined である。

14.7:ECMAScript 2015 では、for 文の ( トークンの直後にトークンシーケンス let [ が続く場合、その letLexicalDeclaration の開始として扱われる。以前の版では、そのようなトークンシーケンスは Expression の開始であった。

14.7:ECMAScript 2015 では、for-in 文の ( トークンの直後にトークンシーケンス let [ が続く場合、その letForDeclaration の開始として扱われる。以前の版では、そのようなトークンシーケンスは LeftHandSideExpression の開始であった。

14.7:ECMAScript 2015 より前は、初期化式が in キーワードに先行する VariableDeclaration の一部として現れることができた。ECMAScript 2015 では、同じ位置の ForBinding はそのような initializer の出現を許可しない。ECMAScript 2017 では、そのような initializer は非 strict コードでのみ許可される。

14.7:ECMAScript 2015 では、IterationStatement の評価結果が [[Value]]empty である normal completion になることは決してない。IterationStatementStatement 部分が評価されない場合、または Statement 部分の最終評価が [[Value]]empty である normal completion を生成する場合、IterationStatement の評価結果は [[Value]]undefined である normal completion である。

14.11.2:ECMAScript 2015 では、WithStatement の評価結果が [[Value]]empty である normal completion になることは決してない。WithStatementStatement 部分の評価が [[Value]]empty である normal completion を生成する場合、WithStatement の評価結果は [[Value]]undefined である normal completion である。

14.12.4:ECMAScript 2015 では、SwitchStatement の評価結果が [[Value]]empty である normal completion になることは決してない。SwitchStatementCaseBlock 部分の評価が [[Value]]empty である normal completion を生成する場合、SwitchStatement の評価結果は [[Value]]undefined である normal completion である。

14.15:ECMAScript 2015 では、Catch 節が、Catch 節のパラメータとして現れる同じ Identifier に対する var 宣言を含むことは early error である。以前の版では、そのような変数宣言は包含する variable environment にインスタンス化されたが、その宣言の Initializer 値は Catch パラメータへ代入されていた。

14.15, 19.2.1.3:ECMAScript 2015 では、Catch 節が、その Catch 節パラメータとして現れる同じ Identifier を束縛する var または FunctionDeclaration 宣言を eval コードが含む非 strict direct eval を評価する場合、実行時 SyntaxError が投げられる。

14.15.3:ECMAScript 2015 では、TryStatement の結果が値 empty になることは決してない。TryStatementBlock 部分が empty を含む normal completion に評価される場合、TryStatement の結果は undefined である。TryStatementBlock 部分が throw completion に評価され、かつ empty を含む normal completion に評価される Catch 部分を持つ場合、Finally 節が存在しないか、その Finally 節が empty normal completion に評価されるならば、TryStatement の結果は undefined である。

15.4.5 ECMAScript 2015 では、ObjectLiteral 内のアクセサプロパティの [[Get]] または [[Set]] 属性の値として作成される関数オブジェクトはコンストラクター関数ではなく、"prototype" own property を持たない。以前の版では、それらはコンストラクターであり、"prototype" プロパティを持っていた。

20.1.2.6:ECMAScript 2015 では、Object.freeze への引数がオブジェクトでない場合、それは own property を持たない non-extensible な ordinary object であるかのように扱われる。以前の版では、オブジェクトでない引数は常に 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 property を持たない non-extensible な ordinary object であるかのように扱われる。以前の版では、オブジェクトでない引数は常に TypeError を投げていた。

20.1.2.17:ECMAScript 2015 では、Object.isFrozen への引数がオブジェクトでない場合、それは own property を持たない non-extensible な ordinary object であるかのように扱われる。以前の版では、オブジェクトでない引数は常に TypeError を投げていた。

20.1.2.18:ECMAScript 2015 では、Object.isSealed への引数がオブジェクトでない場合、それは own property を持たない non-extensible な ordinary object であるかのように扱われる。以前の版では、オブジェクトでない引数は常に TypeError を投げていた。

20.1.2.19:ECMAScript 2015 では、Object.keys への引数がオブジェクトでない場合、ToObject を使用してその引数を強制変換しようとする。強制変換に成功すると、その結果が元の引数値の代わりに使用される。以前の版では、オブジェクトでない引数は常に TypeError を投げていた。

20.1.2.20:ECMAScript 2015 では、Object.preventExtensions への引数がオブジェクトでない場合、それは own property を持たない non-extensible な ordinary object であるかのように扱われる。以前の版では、オブジェクトでない引数は常に TypeError を投げていた。

20.1.2.22:ECMAScript 2015 では、Object.seal への引数がオブジェクトでない場合、それは own property を持たない non-extensible な ordinary object であるかのように扱われる。以前の版では、オブジェクトでない引数は常に TypeError を投げていた。

20.2.3.2:ECMAScript 2015 では、bound function の [[Prototype]] 内部スロットは、その target function の [[GetPrototypeOf]] 値に設定される。以前の版では、[[Prototype]] は常に %Function.prototype% に設定されていた。

20.2.4.1:ECMAScript 2015 では、関数インスタンスの "length" プロパティは configurable である。以前の版では non-configurable であった。

20.5.6.2:ECMAScript 2015 では、NativeError コンストラクターの [[Prototype]] 内部スロットは Error コンストラクターである。以前の版では Function プロトタイプオブジェクトであった。

21.4.4 ECMAScript 2015 では、Date プロトタイプオブジェクトは 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 では、小文字/大文字変換処理はコードポイントに対して動作する。以前の版では、そのような変換処理は個々のコード単位にのみ適用されていた。影響を受けるコードポイントは Unicode の Deseret block 内のものだけである。

22.1.3.32 ECMAScript 2015 では、String.prototype.trim メソッドは Unicode BMP の外に存在し得る white space コードポイントを認識するように定義されている。ただし、Unicode 7 時点ではそのようなコードポイントは定義されていない。以前の版では、そのようなコードポイントは white space として認識されなかった。

22.2.4.1 ECMAScript 2015 では、pattern 引数が RegExp インスタンスであり、flags 引数が undefined でない場合、pattern のフラグが引数 flags に置き換えられることを除き、pattern と同様の新しい RegExp インスタンスが作成される。以前の版では、pattern が RegExp インスタンスであり、flagsundefined でない場合、TypeError 例外が投げられていた。

22.2.6 ECMAScript 2015 では、RegExp プロトタイプオブジェクトは RegExp インスタンスではない。以前の版では、パターンが空の String である RegExp インスタンスであった。

22.2.6 ECMAScript 2015 では、"source""global""ignoreCase"、および "multiline" は RegExp プロトタイプオブジェクト上に定義されるアクセサプロパティである。以前の版では、それらは RegExp インスタンス上に定義されたデータプロパティであった。

25.4.15:ECMAScript 2019 では、Atomics.wait との混同を防ぐため、Atomics.wakeAtomics.notify に名称変更された。

27.1.5.4, 27.6.3.6:ECMAScript 2019 では、await によってエンキューされる Job の数が削減され、これにより then() 呼び出しと await 式との間の解決順序に観測可能な差異が生じる可能性があった。

参考文献

  1. IEEE 754-2019IEEE Standard for Floating-Point Arithmetic。Institute of Electrical and Electronic Engineers, New York (2019) Note

    IEEE 754-2008 と IEEE 754-2019 の間には、ECMA-262 仕様に影響する規範的変更は存在しない。

  2. The Unicode Standard、<https://unicode.org/versions/latest> で入手可能
  3. Unicode Technical Note #5: Canonical Equivalence in Applications、<https://unicode.org/notes/tn5/> で入手可能
  4. Unicode Technical Standard #10: Unicode Collation Algorithm、<https://unicode.org/reports/tr10/> で入手可能
  5. Unicode Standard Annex #15, Unicode Normalization Forms、<https://unicode.org/reports/tr15/> で入手可能
  6. Unicode Standard Annex #18: Unicode Regular Expressions、<https://unicode.org/reports/tr18/> で入手可能
  7. Unicode Standard Annex #24: Unicode Script Property、<https://unicode.org/reports/tr24/> で入手可能
  8. Unicode Standard Annex #31, Unicode Identifiers and Pattern Syntax、<https://unicode.org/reports/tr31/> で入手可能
  9. Unicode Standard Annex #44: Unicode Character Database、<https://unicode.org/reports/tr44/> で入手可能
  10. Unicode Technical Standard #51: Unicode Emoji、<https://unicode.org/reports/tr51/> で入手可能
  11. IANA Time Zone Database、<https://www.iana.org/time-zones> で入手可能
  12. ISO 8601:2004(E) Data elements and interchange formats — Information interchange — Representation of dates and times
  13. RFC 1738 “Uniform Resource Locators (URL)”、<https://tools.ietf.org/html/rfc1738> で入手可能
  14. RFC 2396 “Uniform Resource Identifiers (URI): Generic Syntax”、<https://tools.ietf.org/html/rfc2396> で入手可能
  15. RFC 3629 “UTF-8, a transformation format of ISO 10646”、<https://tools.ietf.org/html/rfc3629> で入手可能
  16. RFC 7231 “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content”、<https://tools.ietf.org/html/rfc7231> で入手可能

奥付

この仕様は、GitHub 上で、Ecmarkup と呼ばれる plaintext ソース形式により執筆されている。Ecmarkup は HTML および Markdown の方言であり、Ecma 仕様を plaintext で執筆し、その仕様をこの文書の編集上の慣例に従う高機能な HTML レンダリングへ処理するためのフレームワークおよびツールセットを提供する。Ecmarkup は、構文を定義するための Grammarkdown や、アルゴリズム手順を執筆するための Ecmarkdown を含む、いくつかの他の形式および技術の上に構築され、それらを統合している。この仕様の PDF レンダリングは、CSS Paged Media 仕様を活用する印刷スタイルシートを使用して生成され、PrinceXML を使用して変換される。

この仕様の以前の版は Word を使用して執筆されていた。この版の基礎となった Ecmarkup ソーステキストは、ECMAScript 2015 Word 文書を自動変換ツールで Ecmarkup に変換することによって生成された。

Copyright & Software License

Ecma International

Rue du Rhone 114

CH-1204 Geneva

Tel: +41 22 849 6000

Fax: +41 22 849 6001

Web: https://ecma-international.org/

Software License

All Software contained in this document ("Software") is protected by copyright and is being made available under the "BSD License", included below. This Software may be subject to third party rights (rights from parties other than Ecma International), including patent rights, and no licenses under such third party rights are granted under this license even if the third party concerned is a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT https://ecma-international.org/memento/codeofconduct.htm FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA INTERNATIONAL STANDARDS.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  3. Neither the name of the authors nor Ecma International may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.