Draft ECMA-262 / September 16, 2025 ECMAScript® 2026 言語仕様
はじめに
このEcma標準は、ECMAScript 2026言語を定義します。これはECMAScript言語仕様の第17版です。1997年の第1版公開以来、ECMAScriptは世界で最も広く使われている汎用プログラミング言語の一つに成長しました。主にウェブブラウザに組み込まれている言語として知られていますが、サーバーや組み込み用途にも広く採用されています。
ECMAScriptはいくつかの技術をもとにしており、最もよく知られているのはJavaScript(Netscape)とJScript(Microsoft)です。この言語はNetscapeのBrendan Eichによって発明され、同社のNavigator 2.0ブラウザで初めて登場しました。その後、Netscapeの全てのブラウザと、Internet Explorer 3.0以降のMicrosoftの全てのブラウザに搭載されています。
ECMAScript言語仕様の開発は1996年11月に始まりました。このEcma標準の第1版は1997年6月のEcma総会で採択されました。
このEcma標準はISO/IEC JTC 1に高速トラック手続きで提出され、1998年4月に国際標準ISO/IEC 16262として承認されました。1998年6月のEcma総会では、ISO/IEC 16262との完全な整合性を保つため第2版(ECMA-262)が承認されました。第1版と第2版の間の変更は編集上のものです。
第3版の標準では、強力な正規表現、より良い文字列処理、新しい制御文、try/catch例外処理、エラー定義の強化、数値出力のフォーマット、将来の言語成長を見越した小さな変更などが導入されました。ECMAScript標準の第3版は1999年12月のEcma総会で採択され、2002年6月にISO/IEC 16262:2002として発行されました。
第3版発行後、ECMAScriptはWorld Wide Webとともに大量に普及し、事実上すべてのウェブブラウザでサポートされるプログラミング言語となりました。第4版の開発も大きく進みましたが、最終的には完了せず、第4版としては公開されませんでした。しかし、その一部は第6版の開発に取り込まれました。
第5版(ECMA-262第5版として発行)は、ブラウザ実装で一般的となった言語仕様の事実上の解釈を成文化し、第3版以降に登場した新機能への対応を追加しました。これにはアクセサプロパティ 、オブジェクトの反射的な生成・検査、プロパティ属性の制御、配列操作関数の追加、JSONオブジェクトエンコーディング形式のサポート、エラー検出とプログラムの安全性を強化するstrict modeなどが含まれます。第5版は2009年12月のEcma総会で採択されました。
第5版はISO/IEC JTC 1に高速トラック手続きで提出され、国際標準ISO/IEC 16262:2011として承認されました。ECMAScript標準のEdition 5.1では小さな修正が加えられ、ISO/IEC 16262:2011と同一のテキストとなりました。5.1版は2011年6月のEcma総会で採択されました。
第6版の集中的な開発は2009年に始まりましたが、その前には1999年の第3版発行以降、言語拡張設計や実験が積み重ねられてきました。第6版の完成は、まさに15年にわたる取り組みの集大成です。本版の目標には、大規模アプリケーションやライブラリ作成、他言語のコンパイルターゲットとしてのECMAScriptのサポート強化などが含まれます。主な拡張点は、モジュール、クラス宣言、レキシカルブロックスコープ、イテレータとジェネレータ、非同期プログラミングのためのPromise、分割代入パターン、適切な末尾呼び出しです。組み込みライブラリも拡張され、マップ・セット・バイナリ数値配列のほか、文字列や正規表現でのUnicode補助文字サポートも強化されました。組み込みオブジェクトはサブクラス化によって拡張可能になりました。第6版は、定期的かつ漸進的な言語・ライブラリ拡張の基礎となります。第6版は2015年6月の総会で採択されました。
ECMAScript 2016は、Ecma TC39による新たな年次リリースおよびオープン開発プロセスのもとで初めて公開されたECMAScript版です。ECMAScript 2015のソース文書からプレーンテキスト文書を作成し、以降の開発は全てGitHub上で行われました。本標準の開発期間中、数百件のPull RequestやIssueが提出され、何千ものバグ修正や編集修正、その他の改善が行われました。また、Ecmarkup・Ecmarkdown・Grammarkdownなどの開発支援ツールも多数作られました。ES2016では新しいべき乗演算子や、Array.prototype
にincludes
メソッドが追加されました。
ECMAScript 2017ではAsync Function、Shared Memory、Atomicsが導入され、他にも小規模な言語・ライブラリ拡張やバグ修正、編集更新が行われました。Async FunctionはPromiseを返す関数のための構文を提供し、非同期プログラミング体験を向上させます。Shared MemoryとAtomicsは、複数エージェント間で原子的な操作による通信を可能にし、並列CPUでも明確な実行順序を保証する新しいメモリモデルを導入します。また、ObjectにはObject.values
、Object.entries
、Object.getOwnPropertyDescriptors
などの新しい静的メソッドが追加されました。
ECMAScript 2018では、非同期イテレーションを実現するasync iterator プロトコルとasync generatorがサポートされました。さらに、4つの新しい正規表現機能(dotAll
フラグ、名前付きキャプチャグループ、Unicodeプロパティエスケープ、後方参照)が追加されました。最後に、オブジェクトのrest/spreadプロパティも導入されました。
ECMAScript 2019では、Array.prototype
のflat
とflatMap
、Object.fromEntries
によるObject.entries
の戻り値から新しいオブジェクトを直接作成する関数、String.prototype
のtrimStart
とtrimEnd
(従来のtrimLeft
・trimRight
よりも適切な名称)などのビルトイン関数が追加されました。また、構文と意味への小規模な更新も含まれています。構文の更新では、catchバインディングパラメータの省略や、文字列リテラルでU+2028(行区切り)・U+2029(段落区切り)をJSONに合わせて許可する変更がありました。その他、Array.prototype.sort
の安定ソートの要求や、JSON.stringify
の入力に関わらずUTF-8の整形式な出力の要求、Function.prototype.toString
の仕様明確化(元のソースまたは標準プレースホルダーの返却)が行われました。
ECMAScript 2020(第11版)では、文字列の全マッチオブジェクトをイテレータで返すmatchAll
メソッド、動的指定子でモジュールを非同期インポートするimport()
構文、任意精度整数 を扱う新しい数値型BigInt
、短絡しないPromise合成のためのPromise.allSettled
、グローバルなthis
値への統一的アクセス手段globalThis
、export * as ns from 'module'
のモジュール構文、for-in
列挙順序の標準化、モジュール文脈情報のためのimport.meta
、nullish値(undefined やnull )の扱いを改善するnullish合体演算子・オプショナルチェーン演算子などが導入されました。
ECMAScript 2021(第12版)では、文字列のreplaceAll
メソッド、Promiseの短絡合成Promise.any
、複数のエラーを同時に表現する新しいエラー型AggregateError
、論理代入演算子(??=
、&&=
、||=
)、ガベージコレクション抑止なしでターゲットオブジェクト参照を可能にするWeakRef
、ガベージコレクション時のクリーンアップ操作管理のためのFinalizationRegistry
、数値リテラルの区切り(1_000
)、Array.prototype.sort
の実装定義 順序を減らす仕様強化などが追加されました。
ECMAScript 2022(第13版)では、モジュールのトップレベルでawait
キーワードが使用できるようになり、クラスの新要素(public/privateインスタンスフィールド、public/private staticフィールド、privateインスタンスメソッド・アクセサ、private staticメソッド・アクセサ)、クラス内のstatic blockによる初期化、#x in obj
構文によるオブジェクトのprivateフィールド存在判定、正規表現の/d
フラグによるマッチ開始・終了インデックス取得、エラーの原因記録用cause
プロパティ、文字列・配列・TypedArray での相対インデックス取得のat
メソッド、Object.hasOwn
によるObject.prototype.hasOwnProperty
の簡便な代替手段などが導入されました。
ECMAScript 2023(第14版)では、Array.prototype
とTypedArray.prototype
のtoSorted
、toReversed
、with
、findLast
、findLastIndex
メソッド、およびArray.prototype
のtoSpliced
メソッドが追加されました。また、ファイル先頭の#!
コメントによる実行可能ECMAScriptファイル対応や、弱コレクションのキーとしてほとんどのSymbolの使用が許可されました。
ECMAScript 2024(第15版)では、ArrayBufferとSharedArrayBufferのサイズ変更・転送機能、文字列集合操作に便利な新しいRegExp /v
フラグ、Promise構築のためのPromise.withResolvers
、データ集計のObject.groupBy
とMap.groupBy
、共有メモリ変更を非同期で待つAtomics.waitAsync
、文字列のUnicode整形式判定・修正のString.prototype.isWellFormed
とString.prototype.toWellFormed
などが導入されました。
ECMAScript 2025(第16版)では、イテレータ操作のための新しいグローバルIterator
(静的・プロトタイプメソッド付き)、Set.prototype
のセット操作メソッド、JSONモジュールのインポートとインポート属性宣言構文、正規表現用のRegExp.escape
メソッド、正規表現内での修飾子フラグのインライン変更構文、Promise返却有無を問わず常にPromiseを返すPromise.try
メソッド、新しいTypedArray 種Float16Array
とそれに対応するDataView.prototype.getFloat16
、DataView.prototype.setFloat16
、Math.f16round
メソッドが導入されました。
本版および以前の版の開発において、Ecma TC39には多くの組織を代表する多数の個人が非常に重要な貢献をしています。さらに、TC39のECMAScript活動を支える活発なコミュニティも生まれました。このコミュニティは多数のドラフトのレビュー、数千件に及ぶバグ報告、実装実験、テストスイートの提供、世界中の開発者へのECMAScriptの教育などで貢献しています。残念ながら、この取り組みに貢献した全ての個人や組織を特定し、謝意を表することは不可能です。
Allen Wirfs-Brock
ECMA-262、第6版プロジェクトエディター
Brian Terlson
ECMA-262、第7~10版プロジェクトエディター
Jordan Harband
ECMA-262、第10~12版プロジェクトエディター
Shu-yu Guo
ECMA-262、第12~16版プロジェクトエディター
Michael Ficarra
ECMA-262、第12~16版プロジェクトエディター
Kevin Gibbons
ECMA-262、第12~16版プロジェクトエディター
1 適用範囲
本標準は、ECMAScript 2026汎用プログラミング言語を定義します。
2 適合性
ECMAScriptの適合する実装は、本仕様で記述されているすべての型、値、オブジェクト、プロパティ、関数、プログラムの構文および意味を提供し、サポートしなければなりません。
ECMAScriptの適合する実装は、Unicode標準およびISO/IEC 10646の最新バージョンに従って、ソーステキスト入力を解釈しなければなりません。
異なる言語や国の言語的・文化的慣習に適応する必要があるプログラムをサポートするアプリケーションプログラミングインターフェイス(API)を提供するECMAScriptの適合実装は、本仕様と互換性のある最新のECMA-402版で定義されたインターフェイスを実装しなければなりません。
ECMAScriptの適合する実装は、本仕様で記述されているもの以外にも追加の型、値、オブジェクト、プロパティ、関数を提供することができます。特に、適合する実装は本仕様で記述されていないプロパティやその値を、本仕様で記述されているオブジェクトに対して提供することができます。
ECMAScriptの適合する実装は、本仕様で記述されていないプログラムおよび正規表現の構文をサポートすることができます。特に、適合する実装は、本仕様の12.7.2 の小項で示される「将来予約語」を使用するプログラム構文をサポートすることができます。
ECMAScriptの適合する実装は、17.1 の小項で「禁止拡張」としてリストされているいかなる拡張も実装してはなりません。
ECMAScriptの適合する実装は、実装定義 、実装近似 、またはホスト定義 でないいかなる機能も再定義してはなりません。
ECMAScriptの適合する実装は、特に指示がない限り、規範的任意 の小項を実装するかしないかを選択できます。ウェブブラウザは一般的にすべての規範的任意の小項を実装する必要があります。(付録B を参照。)規範的任意の動作が実装される場合は、その規範的任意項内のすべての動作を実装しなければなりません。規範的任意の項は、本仕様書では「規範的任意」と書かれた色付きのボックスで示されます。下記はその例です。
Normative Optional
2.1 規範的任意項目の見出し例
項目内容の例。
ECMAScriptの適合する実装は、規範的任意としてもマークされていない限り、レガシー の小項を実装しなければなりません。レガシーの小項で規定された言語機能や動作は、いずれも何らかの望ましくない特性を有しています。しかし、既存アプリケーションでの継続的な利用により、本仕様からの削除ができません。これらの機能はECMAScript言語のコア部分とはみなされません。プログラマーは新しいECMAScriptコードを書く際、これらの機能や動作の利用や存在を前提とすべきではありません。
Legacy
2.2 レガシー項目の見出し例
項目内容の例。
Normative Optional, Legacy
2.3 レガシー規範的任意項目の見出し例
項目内容の例。
3 規範参照
以下に参照する文書は、本書の適用に不可欠です。日付付き参照については、記載された版のみが適用されます。日付なし参照については、参照文書の最新版(修正等を含む)が適用されます。
IEEE 754-2019 , 浮動小数点算術のIEEE標準 。
Unicode標準。
https://unicode.org/versions/latest
ISO/IEC 10646, 情報技術 ― 多オクテット符号化文字集合(UCS) および Amendment 1:2005, Amendment 2:2006, Amendment 3:2008, Amendment 4:2008、追加の修正および後継。
ECMA-402, ECMAScript国際化API仕様 、特に本仕様の版に対応する年次版。
https://www.ecma-international.org/publications-and-standards/standards/ecma-402/
ECMA-404, JSONデータ交換フォーマット 。
https://www.ecma-international.org/publications-and-standards/standards/ecma-404/
4 概要
本節では、ECMAScript言語の非規範的な概要を示します。
ECMAScriptは、オブジェクト指向プログラミング言語であり、計算処理やホスト環境 内での計算オブジェクトの操作を行うために使用されます。ここで定義されるECMAScriptは、計算自体を自給自足で行うことを意図していません。実際、本仕様では外部データの入力や計算結果の出力の手段は規定されていません。その代わりに、ECMAScriptプログラムの計算環境が本仕様で記述されるオブジェクトや機能に加え、環境固有のオブジェクトも提供することが期待されます。これらのオブジェクトの詳細な説明や挙動は本仕様の範囲外ですが、ECMAScriptプログラムからプロパティや関数としてアクセスや呼び出しが可能であることを示しています。
ECMAScriptは元々スクリプト言語として設計されましたが、現在では汎用プログラミング言語として広く利用されています。スクリプト言語 とは、既存システムの機能を操作・カスタマイズ・自動化するためのプログラミング言語です。こうしたシステムでは、ユーザーインターフェースを通じて有用な機能がすでに利用可能で、スクリプト言語はその機能をプログラムで制御する手段となります。このように、既存システムはオブジェクトや機能からなるホスト環境 を提供し、スクリプト言語の能力を補完します。スクリプト言語は、専門・非専門のプログラマー双方による利用を想定しています。
ECMAScriptは元々Webスクリプト言語 として設計され、ブラウザ上でWebページを動的にしたり、Webベースのクライアント・サーバーアーキテクチャの一部としてサーバー計算を行う仕組みを提供していました。現在では様々なホスト環境 のためのコアスクリプト機能を提供しており、コア言語は特定のホスト環境 から切り離して本書で定義されています。
ECMAScriptの利用は単純なスクリプト用途を超えて拡大し、さまざまな環境や規模におけるあらゆるプログラミング課題に使われています。それに伴い、言語の機能や設備も拡充されてきました。ECMAScriptは現在、十分に機能を備えた汎用プログラミング言語です。
4.1 ウェブスクリプト
ウェブブラウザは、クライアントサイドの計算処理のためのECMAScriptホスト環境 を提供します。例えば、ウィンドウ・メニュー・ポップアップ・ダイアログボックス・テキストエリア・アンカー・フレーム・履歴・クッキー・入出力などを表すオブジェクトがあります。さらに、ホスト環境 は、フォーカスの変化、ページや画像の読み込み・アンロード・エラー・中断・選択・フォーム送信・マウス操作等のイベントにスクリプトコードを関連付ける手段を提供します。スクリプトコードはHTML内に記述され、表示ページはユーザーインターフェース要素と固定・計算済みのテキストや画像の組み合わせとなります。スクリプトコードはユーザー操作に反応し、メインプログラムは不要です。
ウェブサーバは、サーバサイドの計算処理のための別のホスト環境 を提供し、リクエスト・クライアント・ファイルなどを表すオブジェクトや、データのロック・共有の仕組みを備えています。クライアント側とサーバ側のスクリプトを組み合わせることで、Webアプリケーションにおいて計算処理をクライアントとサーバ間で分散し、カスタマイズされたユーザーインターフェースを提供できます。
ECMAScriptをサポートする各ウェブブラウザやサーバは、それぞれ独自のホスト環境 を提供し、ECMAScriptの実行環境を完結させます。
4.2 ホストと実装
ECMAScriptをホスト環境 に統合しやすくするため、本仕様は一部の機能(例:抽象演算)について、その定義を外部に委譲しています。編集上、本仕様では以下の区分を区別します。
実装 とは、付録D で列挙される機能や、実装定義 ・実装近似 と記載された機能をさらに定義する外部ソースです。非公式には、実装は特定のウェブブラウザなどの具体的な成果物を指します。
実装定義 の機能とは、追加の条件なく外部ソースに定義を委ねるものです。本仕様は特定の挙動について推奨はせず、適合実装は本仕様の制約内で任意の挙動を選択できます。
実装近似 の機能とは、外部ソースに定義を委ねつつ、理想的な挙動を推奨するものです。適合実装は本仕様の制約内で任意の挙動を選択できますが、理想的な挙動に近づくことが推奨されます。例えばMath.exp
などの数学演算が該当します。
ホスト とは、付録D で列挙される機能をさらに定義する外部ソースですが、他の実装定義 や実装近似 の機能は定義しません。非公式には、ホスト は本仕様に同じ方法でインターフェースする全てのウェブブラウザ等の集合を指します。ホスト は WHATWG HTML(https://html.spec.whatwg.org/ )などの外部仕様であることが多いです。つまり、ホスト定義 の機能は外部仕様でさらに定義されることが多いです。
ホストフック とは、外部ソースによって全体または一部が定義される抽象演算です。すべてのホストフック は付録D に列挙される必要があります。ホストフック は少なくとも以下の要件を満たさなければなりません:
正常完了またはthrow完了を返す必要があります。
ホスト定義 の機能とは、追加の条件なく外部ソースに定義を委ね、付録D に列挙されるものです。ホスト でない実装もホスト定義 の機能の定義を提供できます。
ホスト環境 とは、すべてのホスト定義 機能の定義を選択したものです。ホスト環境 は、グローバルオブジェクト のホスト定義 プロパティとして入出力等のオブジェクトや関数を含むことが一般的です。
本仕様は、常に最も具体的な用語を用いる編集方針です。例えば、機能がホスト定義 の場合、実装定義 として言及してはなりません。
ホスト と実装の両方が、本仕様で定義される言語型・仕様型・抽象演算・文法・組み込みオブジェクト・組み込みシンボルを通して本仕様とインターフェース可能です。
4.3 ECMAScript概要
以下はECMAScriptの非公式な概要であり、言語のすべての部分を記述するものではありません。この概要は標準本体には含まれません。
ECMAScriptはオブジェクトベースです。基本的な言語機能やホスト 機能はオブジェクトによって提供され、ECMAScriptプログラムは相互に通信するオブジェクトの集まりです。ECMAScriptにおけるオブジェクト は、0個以上のプロパティ を持ち、各プロパティには属性 があり、プロパティの利用方法を決定します。例えば、プロパティのWritable属性がfalse の場合、ECMAScriptコードでそのプロパティに値を代入しようとしても失敗します。プロパティは他のオブジェクトやプリミティブ値 、関数 を格納するコンテナです。プリミティブ値は、Undefined 、Null 、Boolean 、Number 、BigInt 、String 、Symbol のいずれかの組み込み型のメンバーです。オブジェクトは組み込み型Object のメンバーであり、関数は呼び出し可能なオブジェクトです。オブジェクトのプロパティとして結び付けられた関数はメソッド と呼ばれます。
ECMAScriptは組み込みオブジェクト の集合を定義し、ECMAScriptの構成要素を補完します。これらの組み込みオブジェクトにはグローバルオブジェクト 、言語のランタイム意味論に不可欠なObject
、Function
、Boolean
、Symbol
、各種Error
オブジェクト、数値値を表現・操作するMath
、Number
、Date
、テキスト処理用のString
・RegExp
、値のインデックス付きコレクションであるArray
と9種類のTyped Array(いずれも特定数値表現)、キー付きコレクションのMap
・Set
、構造化データのためのJSON
・ArrayBuffer
・SharedArrayBuffer
・DataView
、制御抽象のためのジェネレータ関数やPromise
オブジェクト、リフレクション用のProxy
・Reflect
などがあります。
ECMAScriptはまた、組み込み演算子 の集合も定義しています。ECMAScriptの演算子には、各種単項演算、乗算演算子、加算演算子、ビットシフト演算子、関係演算子、等価演算子、2項ビット演算子、2項論理演算子、代入演算子、カンマ演算子などがあります。
大規模なECMAScriptプログラムはモジュール によってサポートされ、プログラムを複数の文・宣言列に分割できます。各モジュールは、他のモジュールから提供される必要がある宣言と、他のモジュールで利用可能な自身の宣言を明示します。
ECMAScriptの構文は意図的にJava構文に似せられています。ECMAScriptの構文は、使いやすいスクリプト言語として機能するように緩やかです。例えば、変数に型宣言は不要であり、プロパティにも型は関連付けられません。また、定義済み関数は宣言が呼び出しより前に現れなくてもかまいません。
4.3.1 オブジェクト
ECMAScriptにはクラス定義の構文が含まれていますが、ECMAScriptのオブジェクトはC++・Smalltalk・Javaのようなクラスベースではありません。代わりに、リテラル記法や、オブジェクトを生成しプロパティに初期値を割り当てるコンストラクタ ー など、様々な方法でオブジェクトが作成されます。各コンストラクタ ーは"prototype" というプロパティを持ち、プロトタイプベースの継承 や共有プロパティ を実現します。オブジェクトはnew 式でコンストラクタ ーを使うことで作成されます。例えば、new Date(2009, 11)
は新しいDateオブジェクトを生成します。コンストラクタ ーをnew なしで呼び出すと、その挙動はコンストラクタ ーごとに異なります。例えば、Date()
は現在の日付と時刻の文字列表現を返し、オブジェクトは生成しません。
コンストラクタ ーで作成されたすべてのオブジェクトは、コンストラクタ ーの"prototype" プロパティ値への暗黙的な参照(そのオブジェクトのプロトタイプ と呼ばれる)を持ちます。さらに、プロトタイプは非null なプロトタイプへの暗黙参照を持つ場合があり、これをプロトタイプチェーン と呼びます。オブジェクトのプロパティ参照は、その名前のプロパティを持つプロトタイプチェーンの最初のオブジェクトのプロパティへの参照です。つまり、まず参照されるオブジェクト自身にそのプロパティがあるかを調べ、あればそのプロパティが参照されます。なければ、そのオブジェクトのプロトタイプを次に調べ、以降同様です。
Figure 1: オブジェクト/プロトタイプ関係
クラスベースのオブジェクト指向言語では、一般にインスタンスが状態を持ち、メソッドはクラスに属し、継承は構造と振る舞いのみです。ECMAScriptでは、状態とメソッドの両方がオブジェクトに属し、構造・振る舞い・状態すべてが継承されます。
プロトタイプが直接持つプロパティを持たないすべてのオブジェクトは、そのプロパティと値を共有します。図1はこれを示します:
CF はコンストラクタ ー(同時にオブジェクトでもある)です。new
式で5つのオブジェクトcf1 、cf2 、cf3 、cf4 、cf5 が生成されています。各オブジェクトは"q1" と"q2" プロパティを持ちます。破線は暗黙のプロトタイプ関係を示します。例えばcf3 のプロトタイプはCFp です。コンストラクタ ーCF 自身は"P1" と"P2" プロパティを持っており、CFp 、cf1 、cf2 、cf3 、cf4 、cf5 からは見えません。CFp の"CFP1" プロパティはcf1 、cf2 、cf3 、cf4 、cf5 で共有されます(CF 自身は除く)。また、プロトタイプチェーン上で"q1" 、"q2" 、"CFP1" 以外のプロパティも共有されます。CF とCFp の間に暗黙のプロトタイプリンクはありません。
多くのクラスベース言語と異なり、プロパティは値を代入することで動的に追加できます。つまり、コンストラクタ ーは生成したオブジェクトのすべてのプロパティを命名・初期化する必要はありません。上述の図では、CFp に新しい値を割り当てることでcf1 ~cf5 の共有プロパティを追加できます。
ECMAScriptオブジェクトは本来クラスベースではありませんが、共通パターンのコンストラクタ ー関数・プロトタイプオブジェクト・メソッドを使ってクラスライクな抽象化を定義することが便利な場合が多いです。ECMAScriptの組み込みオブジェクト自身もそのようなクラスライクなパターンに従っています。ECMAScript 2015以降、組み込みオブジェクトと同様のクラスライク抽象に沿ったオブジェクトを簡潔に定義できる構文的なクラス定義が導入されました。
4.3.2 ECMAScriptの厳格バリアント
ECMAScript言語は、利用者が言語の一部機能の利用を制限したい場合があることを認識しています。これはセキュリティ向上、エラーを起こしやすい機能回避、エラー検出強化など様々な理由によるものです。そのため、ECMAScriptは言語の厳格バリアントを定義しています。厳格バリアントでは、通常のECMAScript言語の特定の構文的・意味的機能が除外され、いくつかの機能の詳細な意味論が変更されます。また、非厳格な言語形式ではエラーとされていない状況でも、追加のエラー条件を規定し、エラー例外のthrowが必須となります。
厳格バリアントは一般に言語のstrict mode (厳格モード)と呼ばれます。厳格モードの選択および構文・意味論の利用は、個々のECMAScriptソーステキスト単位ごとに明示的に行われます(11.2.2 参照)。厳格モードは構文単位ごとに選択されるため、制限はその単位内でのみ局所的に作用します。厳格モードは、複数のソーステキスト単位にまたがって一貫して動作が求められるECMAScript意味論には影響しません。完全なECMAScriptプログラムは、厳格モードと非厳格モードのソーステキスト単位の混在から構成可能です。この場合、厳格モードは実際に厳格モードのソーステキスト単位内のコードが実行されるときのみ適用されます。
本仕様への適合には、ECMAScriptの制限なしの完全な言語と、本仕様で定義される厳格バリアントの両方を実装する必要があります。また、制限なしの単位と厳格モード単位を単一の複合プログラムとして組み合わせてサポートする必要があります。
4.4 用語と定義
本書の目的のため、以下の用語と定義が適用されます。
4.4.1 実装近似
実装近似 機能は、外部ソースによって全部または一部が定義されますが、本仕様で推奨される理想的な挙動を持ちます
4.4.2 実装定義
実装定義 機能は、本仕様外の外部ソースによって全部または一部が定義されます
4.4.3 ホスト定義
実装定義 と同義
Note
4.4.4 型
6 で定義されるデータ値の集合
4.4.5 プリミティブ値
6 で定義される、Undefined・Null・Boolean・Number・BigInt・Symbol・Stringのいずれかの型のメンバー
Note
プリミティブ値は、言語実装の最下層で直接表現されるデータです。
4.4.6 オブジェクト
Object型 のメンバー
Note
オブジェクトはプロパティの集合であり、1つのプロトタイプオブジェクトを持ちます。プロトタイプはnull の場合もあります。
4.4.7 コンストラクター
オブジェクトを生成・初期化する関数オブジェクト
Note
コンストラクタ ーの"prototype" プロパティ値は、継承や共有プロパティの実現に用いられるプロトタイプオブジェクトです。
4.4.8 プロトタイプ
他のオブジェクトに共有プロパティを提供するオブジェクト
Note
コンストラクタ ーがオブジェクトを生成すると、そのオブジェクトはプロパティ参照解決のためにコンストラクタ ーの"prototype" プロパティを暗黙参照します。"prototype" プロパティはconstructor .prototype
式で参照でき、プロトタイプに追加したプロパティはすべての派生オブジェクトで継承して共有されます。Object.create
組み込み関数で明示的なプロトタイプを指定して新規作成することもできます。
4.4.9 通常オブジェクト
すべてのオブジェクトがサポートすべき基本的な内部メソッドについて、デフォルトの挙動を持つオブジェクト
4.4.10 特異オブジェクト
基本的な内部メソッドのうち1つ以上についてデフォルトの挙動を持たないオブジェクト
Note
通常オブジェクト でないものはすべて特異オブジェクトです。
4.4.11 標準オブジェクト
本仕様で意味論が定義されているオブジェクト
4.4.12 組み込みオブジェクト
ECMAScript実装によって指定・供給されるオブジェクト
Note
標準組み込みオブジェクトは本仕様で定義されます。実装は追加の組み込みオブジェクトを指定・供給することができます。
4.4.13 undefined値
変数に値が代入されていない場合に用いられるプリミティブ値
4.4.14 Undefined型
唯一の値がundefined 値である型
4.4.15 null値
任意のオブジェクト値が存在しないことを明示的に表すプリミティブ値
4.4.16 Null型
唯一の値がnull 値である型
4.4.17 Boolean値
Boolean型 のメンバー
Note
Boolean値はtrue とfalse の2つのみです。
4.4.18 Boolean型
プリミティブ値true とfalse からなる型
4.4.19 Booleanオブジェクト
標準組み込みBooleanコンストラクタ ーのインスタンスであるObject型 メンバー
Note
Booleanオブジェクトは、new
式でBooleanコンストラクタ ーにBoolean値を渡して生成します。生成されたオブジェクトは内部スロットにBoolean値を保持します。BooleanオブジェクトはBoolean値に変換できます。
4.4.20 String値
有限 個の16ビット符号なし整数 値からなる順序付き列のプリミティブ値
Note
String値はString型 のメンバーです。各整数 値は通常UTF-16テキストの1単位を表しますが、ECMAScriptでは16ビット符号なし整数 であること以外に制約はありません。
4.4.21 String型
すべてのString値の集合
4.4.22 Stringオブジェクト
標準組み込みStringコンストラクタ ーのインスタンスであるObject型 メンバー
Note
Stringオブジェクトは、new
式でStringコンストラクタ ーにString値を渡して生成します。生成されたオブジェクトは内部スロットにString値を保持します。Stringオブジェクトは、Stringコンストラクタ ー関数呼び出し(22.1.1.1 )でString値に変換できます。
4.4.23 Number値
倍精度64ビット2進形式IEEE 754-2019 値に対応するプリミティブ値
Note
Number値はNumber型 のメンバーであり、数値を直接表現します。
4.4.24 Number型
NaN (非数)、+∞ 𝔽 (正の無限大)、-∞ 𝔽 (負の無限大)を含むすべてのNumber値の集合
4.4.25 Numberオブジェクト
標準組み込みNumberコンストラクタ ーのインスタンスであるObject型 メンバー
Note
Numberオブジェクトは、new
式でNumberコンストラクタ ーにNumber値を渡して生成します。生成されたオブジェクトは内部スロットにNumber値を保持します。Numberオブジェクトは、Numberコンストラクタ ー関数呼び出し(21.1.1.1 )でNumber値に変換できます。
4.4.26 Infinity
正の無限大のNumber値
4.4.27 NaN
IEEE 754-2019 のNaN(非数)値であるNumber値
4.4.28 BigInt値
任意精度整数 値に対応するプリミティブ値
4.4.29 BigInt型
すべてのBigInt値 の集合
4.4.30 BigIntオブジェクト
標準組み込みBigIntコンストラクタ ーのインスタンスであるObject型 メンバー
4.4.31 Symbol値
一意かつ非Stringのオブジェクトプロパティキー を表すプリミティブ値
4.4.32 Symbol型
すべてのSymbol値の集合
4.4.33 Symbolオブジェクト
標準組み込みSymbolコンストラクタ ーのインスタンスであるObject型 メンバー
4.4.34 関数
サブルーチンとして呼び出し可能なObject型 のメンバー
Note
関数はプロパティに加えて、呼び出し時の挙動を決定する実行コードと状態を持ちます。関数のコードはECMAScriptで書かれている場合もそうでない場合もあります。
4.4.35 組み込み関数
関数である組み込みオブジェクト
Note
組み込み関数の例としてparseInt
やMath.exp
があります。ホスト や実装は、本仕様に記載されていない追加の組み込み関数を提供する場合があります。
4.4.36 組み込みコンストラクター
コンストラクタ ーである組み込み関数
Note
組み込みコンストラクタ ーの例としてObject
やFunction
があります。ホスト や実装は、本仕様に記載されていない追加の組み込みコンストラクタ ーを提供する場合があります。
4.4.37 プロパティ
キー(String値またはSymbol値)と値を関連付けるオブジェクトの一部
Note
プロパティの形式によって、値はデータ値(プリミティブ値・オブジェクト・関数オブジェクト )として直接、またはアクセサ関数のペアによって間接的に表現されます。
4.4.38 メソッド
プロパティの値である関数
Note
関数がオブジェクトのメソッドとして呼び出されると、そのオブジェクトがthis 値として関数に渡されます。
4.4.39 組み込みメソッド
組み込み関数であるメソッド
Note
標準組み込みメソッドは本仕様で定義されます。ホスト や実装は、本仕様に記載されていない追加の組み込みメソッドを提供する場合があります。
4.4.40 属性
プロパティの特性を定義する内部値
4.4.41 自身のプロパティ
オブジェクトが直接保持するプロパティ
4.4.42 継承プロパティ
オブジェクト自身のプロパティではないが、そのプロトタイプのプロパティ(自身または継承)であるプロパティ
4.5 本仕様書の構成
本仕様書の残りの部分は以下の通り構成されています:
5 では、仕様全体で使用される記法規則を定義します。
6 から10 まででは、ECMAScriptプログラムが動作する実行環境を定義します。
11 から17 まででは、ECMAScriptプログラミング言語そのもの(構文的記述とすべての言語機能の実行意味論)を定義します。
18 から28 まででは、ECMAScript標準ライブラリを定義します。これには、ECMAScriptプログラムの実行時に利用可能なすべての標準オブジェクトの定義が含まれます。
29 では、SharedArrayBufferバックメモリへのアクセスおよびAtomicsオブジェクトのメソッドに関するメモリ整合性モデルを説明します。
5 記法規則
5.1 構文・字句文法
5.1.1 文脈自由文法
文脈自由文法 は、複数の生成式 で構成されます。各生成式は、非終端記号 と呼ばれる抽象的な記号を左辺 に持ち、0個以上の非終端記号と終端記号 の並びを右辺 に持ちます。各文法ごとに、終端記号は指定されたアルファベットから選ばれます。
連鎖生成式 は、右辺にまさに1個の非終端記号と0個以上の終端記号のみを持つ生成式です。
区別される単一の非終端記号(ゴール記号 )から始めて、与えられた文脈自由文法は言語 、すなわち、非終端記号をその左辺となる生成式の右辺で繰り返し置き換えることで得られる終端記号の並びの(おそらく無限の)集合を定義します。
5.1.2 字句・正規表現文法
ECMAScriptの字句文法 は12 で示されています。この文法の終端記号は、11.1 で定義されるSourceCharacter の規則に従うUnicodeコードポイントです。ゴール記号 InputElementDiv 、InputElementTemplateTail 、InputElementRegExp 、InputElementRegExpOrTemplateTail 、InputElementHashbangOrRegExp から始まる生成式集合が定義され、これらのコードポイントの並びを入力要素の並びへ変換する方法を表します。
空白やコメント以外の入力要素は、ECMAScriptの構文文法の終端記号となり、ECMAScriptのトークン と呼ばれます。これらのトークンは、予約語、識別子、リテラル、句読点です。さらに、行終端文字はトークンとはみなされませんが、入力要素のストリームの一部となり自動セミコロン挿入(12.10 )を導きます。単純な空白や1行コメントは破棄され、構文文法の入力要素ストリームには現れません。MultiLineComment (つまり、/*
…*/
形式のコメントで、複数行にまたがるかどうかにかかわらず)は、行終端文字を含まなければ単に破棄されますが、行終端文字が1つ以上含まれていれば、1つの行終端文字に置き換えられ、構文文法の入力要素ストリームの一部となります。
ECMAScriptの正規表現文法 は22.2.1 で示されています。この文法の終端記号もSourceCharacter で定義されるコードポイントです。ゴール記号 Pattern から始まる生成式集合が定義され、コードポイントの並びを正規表現パターンへ変換する方法を表します。
字句文法・正規表現文法の生成式は、「:: 」の2つのコロンで区切られていることで区別されます。字句文法と正規表現文法は一部の生成式を共有します。
5.1.3 数値文字列文法
数値文字列文法 は7.1.4.1 に示されています。終端記号はSourceCharacter であり、ゴール記号 StringNumericLiteral から文字列を数値値へ変換するために使われます(数値リテラルの字句文法 とは似ていますが異なります)。
数値文字列文法の生成式は「::: 」の3つのコロンで区切られており、ソーステキストの構文解析には使用されません。
5.1.4 構文文法
ECMAScriptの構文文法 は13 から16 までの節で示されています。この文法の終端記号は字句文法で定義されたECMAScriptトークンです(5.1.2 )。ゴール記号 Script とModule の2つから始まる生成式集合が定義され、トークンの並びがECMAScriptプログラムの構文的に正しい独立要素を形成する方法を表します。
コードポイントのストリームをECMAScriptのScript やModule として構文解析する場合、まず字句文法を繰り返し適用して入力要素のストリームに変換し、その後構文文法を1回適用して解析します。入力ストリームが、ゴール非終端記号(Script またはModule )の単一インスタンスとして解析できず、トークンが余る場合は構文エラーとなります。
構文解析が成功すると、構文木 という根付きの木構造が構築され、各ノードは構文ノード です。各構文ノードは文法記号のインスタンス であり、その記号から導出できるソーステキストの範囲を表します。構文木の根ノードは解析全体のゴール記号 のインスタンスです。構文ノードが非終端記号のインスタンスである場合、その非終端記号を左辺に持つ生成式のインスタンスでもあります。また、右辺の各記号ごとに0個以上の子ノード を持ちます。各子は対応する記号のインスタンスである構文ノードです。
構文ノードはパーサーの呼び出しごとに新たに生成され、同じソーステキストでも解析間で使い回されることはありません。構文ノードは、同じソース範囲を表し、同じ文法記号のインスタンスであり、同じパーサー呼び出しから生成された場合のみ同じ構文ノード とみなされます。
Note 1
同じ文字列を複数回解析すると、異なる構文ノードが得られます。例えば:
let str = "1 + 1;" ;
eval (str);
eval (str);
それぞれのeval
呼び出しは、str
の値をECMAScriptソーステキストに変換し、独立した構文木を生成する個別の解析を行います。各木は、同じ文字列値から導出されたソーステキストであっても別物です。
Note 2 構文ノードは仕様上のアーティファクトであり、実装が同様のデータ構造を使う必要はありません。
構文文法の生成式は、区切りが1つのコロン「: 」であることで区別されます。
構文文法は、13 から16 までで示されるものだけでは、どのトークン並びが正しいECMAScriptのScript やModule として受理されるかの完全な説明にはなりません。特定の追加トークン並び(たとえば行終端文字の前にセミコロンを追加した場合など)は、文法で記述されていれば受理されます。逆に、文法で記述されていても、行終端文字が「不自然」な場所に現れると受理されない場合もあります。
曖昧さ回避のため、構文文法では有効なECMAScriptのScript やModule にならないトークン並びも許容する一般化生成式が使われる場合があります。例えば、オブジェクトリテラルや分割代入パターンでこの手法が使われます。その場合、より制約された補助文法 が提供され、受理可能なトークン並びが制限されます。通常、早期エラー規則 で「"P はN をカバーしなければならない "」と記されます。P は一般化生成式の構文ノード、N は補助文法の非終端記号です。これは次の意味です:
P がもともとマッチしたトークン並びを、N をゴール記号 として再度解析します。N が文法パラメータを持つ場合は、P の解析時と同じ値で設定します。
トークン並びが、余りなくN の単一インスタンスとして解析できれば:
そのN のインスタンス(P 固有の構文ノード)を「P によってカバーされた N 」と呼びます。
N およびその派生生成式の早期エラー規則 は、P によってカバーされたN にも適用されます。
そうでなければ(解析失敗時)、早期構文エラーとなります。
5.1.5 文法記法
5.1.5.1 終端記号
ECMAScriptの文法では、等幅
フォントで示される終端記号があります。これらはソーステキストに正確に記述されたとおりに現れなければなりません。このように指定されたすべての終端記号コードポイントは、他のUnicode範囲ではなく、基本ラテンブロックの適切なUnicodeコードポイントであると理解されます。終端記号内のコードポイントは、\
UnicodeEscapeSequence で表現することはできません。
終端記号が個々のUnicodeコードポイントで構成される文法(字句・正規表現・数値文字列文法)では、生成式内の複数の等幅コードポイントの連続は、同じコードポイントの並びを個別の終端記号として書く省略表記です。
例えば、次の生成式:
HexIntegerLiteral ::
0x
HexDigits
は、次の省略表記です:
HexIntegerLiteral ::
0
x
HexDigits
一方、構文文法では、等幅コードポイントの連続は1つの終端記号です。
終端記号には他にも2つの形式があります:
5.1.5.2 非終端記号と生成式
非終端記号は斜体 で示されます。非終端記号(「生成式」とも呼ばれる)の定義は、定義される非終端記号の名前の後に1つ以上のコロンを続けて導入されます。(コロンの数はその生成式が属する文法を示します。)非終端記号の右辺の選択肢が続く形になります。例えば、構文定義:
WhileStatement :
while
(
Expression
)
Statement
は、非終端記号WhileStatement が、while
トークン、左括弧トークン、Expression 、右括弧トークン、Statement の並びを表すことを示します。Expression やStatement はそれ自体非終端記号です。別の例として、構文定義:
ArgumentList :
AssignmentExpression
ArgumentList
,
AssignmentExpression
は、ArgumentList が、単一のAssignmentExpression または、ArgumentList の後にカンマとAssignmentExpression が続く場合のいずれかを表すことを示します。このArgumentList の定義は再帰的であり、自己参照によって任意個数の引数(各引数式はAssignmentExpression )をカンマ区切りで持つことができます。このような非終端記号の再帰定義はよく使われます。
5.1.5.3 省略可能記号
終端記号や非終端記号の後に「opt 」という下付き文字が付く場合、省略可能記号を表します。省略可能記号を含む選択肢は、実際には省略要素なしとありの2つの右辺を指定します。つまり:
VariableDeclaration :
BindingIdentifier
Initializer opt
は、次の省略表記です:
VariableDeclaration :
BindingIdentifier
BindingIdentifier
Initializer
また、次の:
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
は、次の省略表記です:
ForStatement :
for
(
LexicalDeclaration
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression
;
Expression opt
)
Statement
さらに、次の省略表記です:
ForStatement :
for
(
LexicalDeclaration
;
)
Statement
for
(
LexicalDeclaration
;
Expression
)
Statement
for
(
LexicalDeclaration
Expression
;
)
Statement
for
(
LexicalDeclaration
Expression
;
Expression
)
Statement
つまり、この例では非終端記号ForStatement は実際には4つの右辺選択肢を持ちます。
5.1.5.4 文法パラメータ
生成式は、下付きの「[parameters] 」という注釈でパラメータ化できます。これは定義される非終端記号の後ろに付与されます。「parameters 」は単一名またはカンマ区切りの複数名です。パラメータ化された生成式は、パラメータ名のすべての組合せに対して、パラメータ化非終端記号にアンダースコアで付加したものとして生成式を定義する省略表記です。つまり:
StatementList [Return] :
ReturnStatement
ExpressionStatement
は、次の省略表記です:
StatementList :
ReturnStatement
ExpressionStatement
StatementList_Return :
ReturnStatement
ExpressionStatement
また、次の:
StatementList [Return, In] :
ReturnStatement
ExpressionStatement
は、次の省略表記です:
StatementList :
ReturnStatement
ExpressionStatement
StatementList_Return :
ReturnStatement
ExpressionStatement
StatementList_In :
ReturnStatement
ExpressionStatement
StatementList_Return_In :
ReturnStatement
ExpressionStatement
複数パラメータは、完全な文法で参照されない生成式も含め、組合せ数だけ生成式を生みます。
生成式右辺の非終端記号への参照もパラメータ化できます。例えば:
StatementList :
ReturnStatement
ExpressionStatement [+In]
は、次の表現と同義です:
StatementList :
ReturnStatement
ExpressionStatement_In
また、次の:
StatementList :
ReturnStatement
ExpressionStatement [~In]
は、次の表現と同義です:
StatementList :
ReturnStatement
ExpressionStatement
非終端記号参照には、パラメータリストと「opt 」を両方付けることもできます。例えば:
VariableDeclaration :
BindingIdentifier
Initializer [+In] opt
は、次の表現と同義です:
VariableDeclaration :
BindingIdentifier
BindingIdentifier
Initializer_In
右辺の非終端記号参照に「? 」付きパラメータ名を付けると、そのパラメータ値は現在の生成式左辺への参照時に使われたパラメータ名の有無に依存します。例えば:
VariableDeclaration [In] :
BindingIdentifier
Initializer [?In]
は、次の表現と同義です:
VariableDeclaration :
BindingIdentifier
Initializer
VariableDeclaration_In :
BindingIdentifier
Initializer_In
右辺選択肢の先頭に「[+parameter]」が付く場合、その選択肢は参照時にパラメータ名が使われている場合のみ利用可能です。「[~parameter]」付きの場合は、参照時にパラメータ名が使われていない 場合のみ利用可能です。つまり:
StatementList [Return] : [+Return]
ReturnStatement
ExpressionStatement
は、次の表現と同義です:
StatementList :
ExpressionStatement
StatementList_Return :
ReturnStatement
ExpressionStatement
また、次の:
StatementList [Return] : [~Return]
ReturnStatement
ExpressionStatement
は、次の表現と同義です:
StatementList :
ReturnStatement
ExpressionStatement
StatementList_Return :
ExpressionStatement
5.1.5.5 one of
文法定義のコロンの後に「one of 」と記されている場合、続く行に示す各終端記号がそれぞれ代替定義であることを意味します。例えば、ECMAScriptの字句文法には次の生成式があります:
NonZeroDigit :: one of 1 2 3 4 5 6 7 8 9
これは、次の表現の省略形です:
NonZeroDigit ::
1
2
3
4
5
6
7
8
9
5.1.5.6 [empty]
生成式の右辺に「[empty]」と記されている場合、その生成式の右辺には終端記号も非終端記号も含まれないことを示します。
5.1.5.7 先読み制約
生成式の右辺に「[lookahead = seq ]」と記されている場合、その生成式はトークン並びseq が直後の入力トークン並びの接頭辞である場合のみ利用できます。同様に「[lookahead ∈ set ]」では、set のいずれかの要素が直後のトークン並びの接頭辞である場合のみ利用できます。簡便のため、set を非終端記号として書くこともでき、その場合はその非終端記号が展開できるすべてのトークン並びの集合を表します。非終端記号が無限個の異なるトークン並びに展開できる場合、編集上の誤りとされます。
これらの条件は否定できます。「[lookahead ≠ seq ]」は、seq が直後の入力トークン並びの接頭辞でない 場合のみ利用できることを意味し、「[lookahead ∉ set ]」は、set のいずれの要素も直後のトークン並びの接頭辞でない場合のみ利用できます。
例として、次の定義を考えます:
DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9
DecimalDigits ::
DecimalDigit
DecimalDigits
DecimalDigit
次の定義:
LookaheadExample ::
n
[lookahead ∉ { 1 , 3 , 5 , 7 , 9 }]
DecimalDigits
DecimalDigit
[lookahead ∉ DecimalDigit ]
は、アルファベットn
の後に1つ以上の10進数字が続き、その最初が偶数である場合、または10進数字の後にさらに数字が続かない場合にマッチします。
これらの句が構文文法で使われる場合、直後のトークン並びを一意に特定できない可能性があることに注意してください。後続トークンの決定には後続位置で使う字句ゴール記号 の選択が必要となるためです。したがって、構文文法でこれらを使う場合、seq のトークン並びが先読み制約(集合の一部としても)に現れ、字句ゴール記号 の選択によって接頭辞となるかどうかが変わる場合、編集上の誤りとされます。
構文文法の生成式の右辺に「[no LineTerminator here]」と記されている場合、その生成式は制限生成式 であり、指定された位置にLineTerminator が入力ストリームに現れると利用できません。例えば、次の生成式:
ThrowStatement :
throw
[no LineTerminator here]
Expression
;
は、throw
トークンとExpression の間にLineTerminator が現れる場合、生成式を利用できないことを示します。
制限生成式でLineTerminator の存在が禁止されていない限り、入力要素ストリームの任意の2つの連続トークンの間にLineTerminator がいくら現れても、スクリプトの構文的な正当性には影響しません。
5.1.5.9 but not
生成式の右辺は、「but not 」という句を使って、特定の展開を許可しないことを指定できます。例えば、次の生成式:
Identifier ::
IdentifierName but not ReservedWord
は、非終端記号Identifier はIdentifierName で置換できるコードポイント並びのうち、同じ並びがReservedWord でも置換できる場合を除くことを意味します。
5.1.5.10 記述的句
最後に、非終端記号のうち、すべての選択肢を列挙するのが非現実的な場合、サンセリフ体の記述的句で説明されるものがあります:
SourceCharacter ::
any Unicode code point
5.2 アルゴリズム規則
仕様書では、アルゴリズムの手順を指定するために番号付きリストをよく使用します。これらのアルゴリズムは、ECMAScript言語構成要素の必要な意味論を厳密に規定するために使われます。ただし、特定の実装技法の使用を示唆するものではありません。実際には、ある機能を実装するためにより効率的なアルゴリズムが存在する場合もあります。
アルゴリズムは、順序付きのカンマ区切りのエイリアス名の列で明示的にパラメータ化されることがあります。これらの名前は、アルゴリズムの手順内でその位置に渡された引数を参照するために使用できます。省略可能なパラメータは角括弧([ , name ])で囲まれて示され、アルゴリズム手順内では必須パラメータと違いはありません。パラメータリストの末尾には、先頭に省略記号(...name )を付けたrestパラメータを指定できます。restパラメータは、必須・省略可能パラメータの後に渡された全ての引数をList にまとめて受け取ります。追加の引数がない場合、そのList は空です。
アルゴリズムの手順は、順序付きのサブステップに分割できます。サブステップはインデントされ、さらにインデントされたサブステップに分割することもできます。アウトライン番号付け規則により、最初のサブステップは小文字アルファベット、次のレベルは小文字ローマ数字でラベル付けされます。3段階を超える場合は、4段階目で数字ラベルが使われ、以降繰り返します。例えば:
最上位の手順サブステップ サブステップサブサブステップサブサブサブステップサブサブサブサブステップサブサブサブサブサブステップ
手順やサブステップは、「if」条件で書かれており、サブステップは条件が真の時のみ適用されます。「else」で始まる場合は、同じ階層の直前の「if」手順の否定条件になります。
手順は、サブステップの反復適用を指定することがあります。
「Assert :」で始まる手順やサブステップは、そのアルゴリズムの不変条件を主張します。これらのアサートは、暗黙的なアルゴリズム不変性を明示するために使われます。アサートは追加の意味的要件を持たず、実装がチェックする必要はありません。アルゴリズムの明確化のためだけに使用されます。
アルゴリズム手順では、「Let x be someValue 」の形式で任意の値に名前付きエイリアスを宣言できます。これらのエイリアスは参照のようなもので、x とsomeValue は同じデータを参照し、どちらかを変更すると両方に反映されます。参照的挙動を避けたい場合は、「Let x be a copy of someValue 」と明示的にコピーを作成することもできます。
エイリアスは宣言後の任意の手順で参照できますが、宣言より前の手順では参照できません。エイリアスは「Set x to someOtherValue 」の形式で変更できます。
5.2.1 抽象操作
この仕様の複数箇所で利用しやすくするために、あるアルゴリズム(抽象操作 )は名前付き・パラメータ化された関数形式で記述され、他のアルゴリズムから名前で参照できるようになっています。抽象操作は通常、OperationName(arg1 , arg2 )のような関数呼び出し形式で参照されます。一部の抽象操作は、クラスライクな仕様抽象のメソッドとして多態的に呼び出されます。メソッドライク抽象操作は、someValue .OperationName(arg1 , arg2 )のようなメソッド呼び出し形式で参照されます。
5.2.2 構文指示操作
構文指示操作 は、名前付き操作であり、その定義は複数のアルゴリズムからなり、それぞれがECMAScript文法の1つ以上の生成式に関連付けられています。生成式が複数の代替定義を持つ場合、各代替ごとに異なるアルゴリズムがあることが多いです。アルゴリズムが文法生成式に関連付けられている場合、生成式代替の終端記号や非終端記号をアルゴリズムのパラメータのように参照できます。この場合、非終端記号は、ソーステキストを構文解析したときにマッチした実際の代替定義を参照します。文法生成式やそこから導出されるParse Nodeがマッチしたソーステキストとは、最初にマッチした終端記号から最後にマッチした終端記号までのソーステキスト部分です。
アルゴリズムが生成式代替に関連付けられる場合、代替は通常「[ ]」文法注釈なしで示されます。これらの注釈は代替の構文的認識のみに影響し、代替に関連付けられた意味論には影響しません。
構文指示操作は、パースノードと(必要に応じて)他のパラメータを使って、以下のアルゴリズムの手順1 、3 、4 で示される規則で呼び出します:
Let status be SyntaxDirectedOperation of SomeNonTerminal . Let someParseNode be the parse of some source text. Perform SyntaxDirectedOperation of someParseNode . Perform SyntaxDirectedOperation of someParseNode with argument "value" .
明示的な記載がない限り、すべての連鎖生成式 には、その生成式の左辺非終端記号に適用される可能性のあるすべての操作の暗黙定義があります。暗黙定義は、同じ操作を同じパラメータ(あれば)で連鎖生成式 の唯一の右辺非終端記号に再適用し、その結果を返すだけです。たとえば、あるアルゴリズムに「Return Evaluation of Block 」という手順があり、次の生成式があるとします:
Block :
{
StatementList
}
Evaluation操作がその生成式にアルゴリズムを関連付けていない場合、Evaluation操作には次のような暗黙の関連付けが含まれます:
実行時意味論 : Evaluation
Block :
{
StatementList
}
Return Evaluation of StatementList .
5.2.3 実行時意味論
実行時に呼び出される必要がある意味論を規定するアルゴリズムは実行時意味論 と呼ばれます。実行時意味論は抽象操作 または構文指示操作 によって定義されます。
5.2.3.1 Completion ( completionRecord )
The abstract operation Completion takes argument completionRecord (Completion Record ) and returns Completion Record . It performs the following steps when called:
Assert : completionRecord はCompletion Record である。completionRecord を返す。
5.2.3.2 例外を投げる
例外を投げるように記載されたアルゴリズム手順、例えば
TypeError 例外を投げる。
は、次の意味と同じです:
ThrowCompletion (新しく生成されたTypeError オブジェクト)を返す。
5.2.3.3 ReturnIfAbrupt
次のような記載やそれに相当するアルゴリズム手順:
ReturnIfAbrupt (argument )。
は、次の意味と同じです:
Assert : argument はCompletion Record である。argument がabrupt completion なら、Completion (argument )を返す。それ以外の場合、argument をargument .[[Value]] にセットする。
次のような記載やそれに相当するアルゴリズム手順:
ReturnIfAbrupt (AbstractOperation())。
は、次の意味と同じです:
Let hygienicTemp be AbstractOperation()。 Assert : hygienicTemp はCompletion Record である。hygienicTemp がabrupt completion なら、Completion (hygienicTemp )を返す。それ以外の場合、hygienicTemp をhygienicTemp .[[Value]] にセットする。
ここで、hygienicTemp はReturnIfAbruptに関する手順でのみ一時的に可視です。
次のような記載やそれに相当するアルゴリズム手順:
Let result be AbstractOperation(ReturnIfAbrupt (argument ))。
は、次の意味と同じです:
Assert : argument はCompletion Record である。argument がabrupt completion なら、Completion (argument )を返す。それ以外の場合、argument をargument .[[Value]] にセットする。 Let result be AbstractOperation(argument )。
5.2.3.4 ReturnIfAbruptの省略記法
抽象操作 や構文指示操作 の呼び出しの前に?
が付く場合、ReturnIfAbrupt をそのCompletion Record に適用することを示します。例えば、この手順:
? OperationName()。
は次の手順と同義です:
ReturnIfAbrupt (OperationName())。
同様に、メソッド呼び出し形式の場合は:
? someValue .OperationName()。
は次の手順と同義です:
ReturnIfAbrupt (someValue .OperationName())。
また、!
のプレフィックスは、後続の抽象操作 や構文指示操作 の呼び出しがabrupt completion を返さないことを示し、Completion Record の[[Value]] フィールドを操作の戻り値として使うことを意味します。例えば、この手順:
Let val be ! OperationName()。
は、次の手順と同義です:
Let val be OperationName()。 Assert : val はnormal completion である。val をval .[[Value]] にセットする。
実行時意味論 の構文指示操作 では、操作呼び出しの前に!
または?
を付けてこの省略記法を利用します:
! SyntaxDirectedOperation of NonTerminal を実行する。
5.2.3.5 暗黙のnormal completion
Completion Record を返すことが宣言された抽象操作 内や、全ての組み込み関数内のアルゴリズムでは、返される値はまずNormalCompletion に渡され、その結果が代わりに使われます。この規則はCompletion アルゴリズム内や、その手順でCompletion Record と明示されている場合には適用されません。具体的には次のケースです:
これら以外の方法でCompletion Record を返すことは編集上の誤りです。例として、これらの抽象操作 内では、
true を返す。
は次のいずれかと同義です:
NormalCompletion (true )を返す。
あるいは
Let completion be NormalCompletion (true )。 Completion (completion )を返す。
あるいは
Completion Record { [[Type]] : normal , [[Value]] : true , [[Target]] : empty }を返す。
ReturnIfAbrupt 展開によって、次の例は許容されます。展開後の手順内でCompletion の適用結果がabruptの場合は直接返され、normalの場合はアンラップ後に暗黙のNormalCompletion 適用が行われます。
Return ? completion 。
次の例は、Completion Record をその手順で注釈なしに返しているため編集上の誤りです。
Let completion be NormalCompletion (true )。 completion を返す。
5.2.4 静的意味論
文脈自由文法だけでは、入力要素のストリームが評価可能な有効なECMAScriptのScript やModule になるかどうかを定義する全ての規則を表現することはできません。場合によっては、ECMAScriptアルゴリズム規則や記述的要件を使って追加の規則を記述する必要があります。これらの規則は常に文法生成式に関連付けられ、生成式の静的意味論 と呼ばれます。
静的意味論規則には名前があり、通常アルゴリズムで定義されます。名前付き静的意味論規則は文法生成式に関連付けられ、生成式が複数の代替定義を持つ場合、各代替ごとに適用される名前付き静的意味論規則のアルゴリズムが異なることが多いです。
静的意味論規則の中には、早期エラー規則 という特別なものがあります。早期エラー規則 は、特定の文法生成式に関連付けられた早期エラー条件(17 参照)を定義します。ほとんどの早期エラー規則 の評価は、仕様のアルゴリズム内で明示的に呼び出されません。適合実装は、Script やModule を初めて評価する前に、パースに使われた生成式の全ての早期エラー規則 を検証しなければなりません。早期エラー規則 が違反している場合、そのScript やModule は無効となり、評価できません。
5.2.5 数学演算
本仕様書では、以下の種類の数値値に言及します:
仕様書の記述では、数値値は下付き添え字で種類が区別されます。添え字𝔽 はNumber、添え字ℤ はBigIntを指します。添え字なしは数学値 です。数値の表記はほとんど10進数ですが、0xに続く数字0-9やA-Fは16進数値として使われます。
一般に、本仕様が数値値(例えば「y の長さ」や「4桁の16進数が表す整数 」など)に言及する場合、数値種類を明示しない限り数学値 を指します。NumberやBigInt値 に言及する場合は、明示的に注釈されます(例:「…のcode point数のNumber値」や「…のBigInt値 」など)。
本仕様で 整数 という用語は、特に断りがない限り、整数 集合に属する数学値 を指します。 整数値(Number) は、その数学値 が整数 集合に属する有限 のNumber値を指します。
数値演算子(+, ×, =, ≥など)は、オペランドの型に応じた演算を指します。数学値 に適用すれば通常の数学演算、拡張数学値 なら拡張実数上の演算(未定義形は定義しないので仕様に現れたら編集誤り)、NumberならIEEE 754-2019 の演算、BigIntならBigIntの数学値 への演算です。型の異なるオペランドへの数値演算子の適用(例: Numberと数学値 )は未定義であり、仕様書に現れたら編集誤りです。
数学値 とNumberやBigInt間の変換は常に明示的です。数学値 または拡張数学値 x からNumberへの変換は「x のNumber値」または𝔽(x ) と記述され、6.1.6.1 で定義されます。整数 x からBigIntへの変換は「x のBigInt値 」またはℤ(x ) と記述されます。NumberやBigInt_x_から数学値 への変換は「x の数学値 」またはℝ(x ) と記述されます。+0 𝔽 と-0 𝔽 の数学値 は数学値 0です。非有限 値の数学値 は定義されません。拡張数学値 は有限 値に対しては数学値 、+∞ 𝔽 と-∞ 𝔽 に対してはそれぞれ+∞と-∞、NaN には定義されません。
数学関数abs(x ) はx の絶対値(x < 0なら- x 、それ以外はx )を返します。
数学関数min(x1 , x2 , … , xN ) はx1 からxN までの最小値、max(x1 , x2 , ..., xN ) は最大値を返します。これらの関数の定義域と値域は拡張数学値 です。
記法「x modulo y 」(y は有限 かつ非零)は、y と同じ符号(または0)で絶対値がy 未満になる値k を計算し、abs (k ) < abs (y ) and x - k = q × y (q は整数 )を満たします。
「x をlower からupper の間でクランプする 」という句(x は拡張数学値 、lower とupper はlower ≤ upper な数学値 )は、x < lower ならlower 、x > upper ならupper 、それ以外はx を返します。
数学関数floor(x ) はx 以下で最大の整数 (+∞に最も近いもの)を返します。
Note
floor (x ) = x - (x modulo 1) です。
数学関数truncate(x ) はx の小数部をゼロ方向に切り捨て、x < 0なら-floor (-x ) 、それ以外はfloor (x ) を返します。
数学関数min , max , abs , floor , truncate はNumberやBigIntには定義されません。非数学値 引数でこれらの関数を使うのは仕様書の編集誤りです。
区間 とは、下限a から上限b までの同じ数値型の値(無限または空の場合もある)の集合です。各端点は包含か排他かどちらかのみ指定されます。区間 には次の4種類があります:
a (包含)からb (包含)の区間 : 包含区間 とも呼ばれ、a ≤ x ≤ b を満たす値x のみ含みます。
a (包含)からb (排他)の区間 : a ≤ x < b を満たす値x のみ含みます。
a (排他)からb (包含)の区間 : a < x ≤ b を満たす値x のみ含みます。
a (排他)からb (排他)の区間 : a < x < b を満たす値x のみ含みます。
例えば、1(包含)から2(排他)の区間 は1以上2未満の数学値 全て(1は含み、2は含まない)です。区間 定義の目的で、-0 𝔽 < +0 𝔽 (比較対象が0の場合のエラー回避コメントあり)なので、例えば下端が+0 𝔽 の包含区間 は+0 𝔽 のみ含み、-0 𝔽 は含みません。NaN は区間 に含まれません。
5.2.6 値の記法
本仕様書では、ECMAScript言語値 は太字 で表示されます。例: null , true , "hello" など。これらは、Function.prototype.apply
やlet n = 42;
などのECMAScriptソーステキストとは区別されます。
5.2.7 同一性
本仕様書では、仕様値とECMAScript言語値 の両方の等価性を比較します。等価性を比較する場合、値は2つのカテゴリのいずれかに属します。同一性のない値 は、全ての本質的特徴が同じであれば他の同一性のない値と等価です(整数 の大きさや配列の長さなど)。同一性のない値は、特徴を完全に記述することで事前参照なしに現すことができます。対照的に、同一性を持つ値 は一意であり自分自身とだけ等価です。同一性を持つ値は、同一性のない値の特徴に加え、推測不可・不変・普遍的な同一性 という特徴を持ちます。既存の同一性を持つ値への参照は、同一性自体が記述不可能なので記述によって現せず、明示的に他所から受け渡す必要があります。同一性を持つ値の一部は可変であり、特徴(同一性以外)はその場で変更可能で、値を保持する者全員が新しい特徴を観察することになります。同一性のない値は同一性を持つ値と等価になることはありません。
本仕様書の観点では、「is」は2つの値の等価性比較に使われます(例:「bool is true なら…」)。「contains」はリスト内の値を等価性比較で探索する場合に使われます(例:「list がRecord r (r .[[Foo]] is true )を含むなら…」)。値の仕様同一性 がこれらの比較結果を決定し、本仕様では公理的に扱います。
ECMAScript言語の観点では、言語値の等価性比較はSameValue 抽象操作 と、それが遡及的に呼び出す抽象操作 で行われます。これらの比較抽象操作 のアルゴリズムがECMAScript言語値 の言語同一性 を定義します。
仕様値の例として、仕様同一性を持たない値には、数学値 ・拡張数学値 、ECMAScriptソーステキスト、サロゲートペア 、Directive Prologue、UTF-16コード単位、Unicodeコードポイント、enum 、抽象操作 (構文指示操作 ・ホストフック 等)、順序対などが含まれます。仕様同一性を持つ値には、Record (Property Descriptor 、PrivateElement 等)、Parse Node、List 、Set ・Relation 、Abstract Closure 、Data Block 、Private Name 、実行コンテキスト・スタック、agent signifier 、WaiterList Record などがあります。
仕様同一性は、Symbol.for で生成されたSymbol値を除き、全てのECMAScript言語値 で言語同一性と一致します。仕様同一性も言語同一性も持たないECMAScript言語値 は、undefined 、null 、Boolean 、String 、Number 、BigInt です。仕様同一性も言語同一性も持つのはSymbol (Symbol.for 生成を除く)とObject です。Symbol.for で生成されたSymbol値は仕様同一性のみ持ち、言語同一性は持ちません。
6 ECMAScriptデータ型と値
本仕様書のアルゴリズムは、それぞれ型が結び付けられた値を操作します。値の型の種類は本節で定義されるものだけです。型はさらにECMAScript言語型 と仕様型に分類されます。
6.1 ECMAScript言語型
ECMAScript言語型 は、ECMAScriptプログラマーがECMAScript言語で直接操作する値に対応します。ECMAScript言語型には、Undefined、Null、Boolean、String、Symbol、Number、BigInt、Objectがあります。ECMAScript言語値 は、ECMAScript言語型によって特徴付けられる値です。
6.1.1 Undefined型
Undefined型は、undefined という唯一の値だけを持ちます。値が代入されていない変数はundefined 値を持ちます。
6.1.2 Null型
Null型は、null という唯一の値だけを持ちます。
6.1.3 Boolean型
Boolean型 は、true とfalse という2つの値を持つ論理的な存在を表します。
6.1.4 String型
String型 は、0個以上の16ビット符号なし整数 値(「要素」)の順序付き列で、最大長は253 - 1個です。String型は、実行中のECMAScriptプログラムで主にテキストデータの表現に使われます。その場合、String内の各要素はUTF-16コード単位値として扱われます。各要素は列内の位置を持ち、その位置は非負整数 でインデックスされます。最初の要素(存在する場合)はインデックス0、次はインデックス1、以降同様です。Stringの長さはその中の要素(16ビット値)の数です。空文字列は長さ0で要素を含みません。
String内容を解釈しないECMAScript操作は、追加の意味論を持ちません。String値を解釈する操作は、各要素を単一のUTF-16コード単位として扱います。ただし、ECMAScriptはこれらのコード単位の値や相互関係を制限しないため、String内容をUTF-16でエンコードされたUnicodeコードポイントの並びとしてさらに解釈する操作は、不正な部分列も考慮する必要があります。こうした操作では、数値が0xD800から0xDBFFまでの包含区間 にあるコード単位(Unicode標準でリーディングサロゲート 、または正式にはハイサロゲートコード単位 )、および0xDC00から0xDFFFまでの包含区間 にあるコード単位(トレーリングサロゲート 、または正式にはローサロゲートコード単位 )に対して以下の規則を適用します:
String.prototype.normalize
関数(22.1.3.15 参照)は、String値を明示的に正規化するために使えます。String.prototype.localeCompare
(22.1.3.12 参照)は内部でString値を正規化しますが、他の操作は暗黙に正規化しません。操作結果は、特に記載がない限り言語・ロケールに依存しません。
Note
この設計の理由は、Stringの実装をできるだけ単純かつ高性能に保つことでした。ECMAScriptソーステキストがNormalized Form Cであれば、文字列リテラルもUnicodeエスケープシーケンスを含まない限り正規化が保証されます。
本仕様では、「A 、B ...の文字列連結 」(各引数がString値・コード単位・コード単位列)は、各引数(順番通り)のコード単位を連結した並びを持つString値を指します。
「S のinclusiveStart からexclusiveEnd までの部分文字列 」(S はString値またはコード単位列、inclusiveStart とexclusiveEnd は整数 )は、S のinclusiveStart インデックスからexclusiveEnd の直前までの連続コード単位からなるString値(inclusiveStart = exclusiveEnd なら空文字列)を指します。「to」接尾語が省略された場合はexclusiveEnd にS の長さが使われます。
「ASCIIワード文字 」は、Unicode基本ラテンブロックの全ての英字・数字とU+005F(LOW LINE)のみからなる、次のString値を指します:
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_" 。
歴史的事情により、様々なアルゴリズムで意味を持ちます。
6.1.4.1 StringIndexOf ( string , searchValue , fromIndex )
The abstract operation StringIndexOf takes arguments string (String), searchValue (String), and fromIndex (非負整数 ) and returns 非負整数 またはnot-found . It performs the following steps when called:
string の長さをlen とする。searchValue が空文字列でかつfromIndex ≤ len なら、fromIndex を返す。searchValue の長さをsearchLen とする。fromIndex ≤ i ≤ len - searchLen を満たす各整数 i について、昇順で:string のi からi + searchLen までの部分文字列 をcandidate とする。candidate がsearchValue ならi を返す。not-found を返す。
Note 1
searchValue が空文字列でかつfromIndex ≤ string の長さなら、このアルゴリズムはfromIndex を返します。空文字列は、文字列内のすべての位置(最後のコード単位の後も含む)で「見つかる」ものとみなされます。
Note 2
このアルゴリズムは、fromIndex + searchValue の長さがstring の長さを超える場合、必ずnot-found を返します。
6.1.4.2 StringLastIndexOf ( string , searchValue , fromIndex )
The abstract operation StringLastIndexOf takes arguments string (String), searchValue (String), and fromIndex (非負整数 ) and returns 非負整数 またはnot-found . It performs the following steps when called:
string の長さをlen とする。searchValue の長さをsearchLen とする。Assert : fromIndex + searchLen ≤ len 。0 ≤ i ≤ fromIndex を満たす各整数 i について、降順で:string のi からi + searchLen までの部分文字列 をcandidate とする。candidate がsearchValue ならi を返す。 not-found を返す。
Note
searchValue が空文字列の場合、このアルゴリズムはfromIndex を返します。空文字列は、文字列内のすべての位置(最後のコード単位の後も含む)で「見つかる」ものとみなされます。
6.1.5 Symbol型
Symbol型 は、Objectプロパティのキーとして使える全ての非String値の集合です(6.1.7 )。
各Symbolは一意で不変です。
各Symbolは、不変の[[Description]] 内部スロットを持ち、その値はStringまたはundefined です。
6.1.5.1 Well-known Symbol
Well-known Symbolは、本仕様のアルゴリズムから明示的に参照される組み込みのSymbol値です。これらは、値が仕様アルゴリズムの拡張ポイントとなるプロパティのキーとして使われることが一般的です。特に記載がない限り、Well-known Symbol値は全Realm で共有されます(9.3 )。
本仕様では、Well-known Symbolは標準のintrinsic記法 で参照されます。intrinsicはTable 1 で挙げられた値のいずれかです。
Note 以前の版では@@name形式の記法が使われていましたが、現行版では%Symbol.name%形式を使います。具体的には、@@asyncIterator、@@hasInstance、@@isConcatSpreadable、@@iterator 、@@match、@@matchAll、@@replace、@@search、@@species、@@split、@@toPrimitive、@@toStringTag、@@unscopablesなどの名称が使われていました。
Table 1: Well-known Symbol
仕様名
[[Description]]
値/目的
%Symbol.asyncIterator%
"Symbol.asyncIterator"
オブジェクトのデフォルト非同期イテレータを返すメソッド。for
-await
-of
文の意味論から呼び出されます。
%Symbol.hasInstance%
"Symbol.hasInstance"
コンストラクタ ーオブジェクトがあるオブジェクトを自分のインスタンスとして認識するかどうかを判定するメソッド。instanceof
演算子の意味論から呼び出されます。
%Symbol.isConcatSpreadable%
"Symbol.isConcatSpreadable"
真の場合、そのオブジェクトがArray.prototype.concat
で配列要素として平坦化されるべきことを示すBoolean値のプロパティ。
%Symbol.iterator%
"Symbol.iterator"
オブジェクトのデフォルトイテレータを返すメソッド。for-of文の意味論から呼び出されます。
%Symbol.match%
"Symbol.match"
正規表現で文字列とマッチさせるメソッド。String.prototype.match
メソッドから呼び出されます。
%Symbol.matchAll%
"Symbol.matchAll"
正規表現に一致するすべてのマッチをイテレータで返すメソッド。String.prototype.matchAll
メソッドから呼び出されます。
%Symbol.replace%
"Symbol.replace"
文字列の一致部分を置換する正規表現メソッド。String.prototype.replace
メソッドから呼び出されます。
%Symbol.search%
"Symbol.search"
正規表現と一致する文字列内のインデックスを返すメソッド。String.prototype.search
メソッドから呼び出されます。
%Symbol.species%
"Symbol.species"
派生オブジェクトの作成に使われるコンストラクタ ー関数の値を持つプロパティ。
%Symbol.split%
"Symbol.split"
正規表現で一致するインデックスで文字列を分割するメソッド。String.prototype.split
メソッドから呼び出されます。
%Symbol.toPrimitive%
"Symbol.toPrimitive"
オブジェクトを対応するプリミティブ値に変換するメソッド。ToPrimitive抽象操作 から呼び出されます。
%Symbol.toStringTag%
"Symbol.toStringTag"
オブジェクトのデフォルト文字列表現の生成に使われるString値のプロパティ。組み込みメソッドObject.prototype.toString
でアクセスされます。
%Symbol.unscopables%
"Symbol.unscopables"
自身および継承したプロパティ名 が、関連オブジェクトのwith
環境バインディングから除外されるプロパティ名 となるオブジェクト値のプロパティ。
6.1.6 数値型
ECMAScriptには組み込み数値型が2つあります:Number型 とBigInt型 です。以下の抽象操作 はこれらの数値型に対して定義されています。「結果」列には返却型、そしてある操作の一部の呼び出しがabrupt completion (例外的完了)を返す可能性がある場合はその旨も示されます。
Table 2: 数値型の操作
操作
ソース例
評価意味論で呼び出される箇所
結果
Number::unaryMinus
-x
単項 -
演算子 (Unary -
Operator)
Number
BigInt::unaryMinus
BigInt
Number::bitwiseNOT
~x
ビット単位 NOT 演算子 ( ~
) (Bitwise NOT Operator)
Number
BigInt::bitwiseNOT
BigInt
Number::exponentiate
x ** y
累乗演算子 (Exponentiation Operator)
および Math.pow ( base , exponent )
Number
BigInt::exponentiate
正常完了でBigIntを含む、またはthrow completion
Number::multiply
x * y
乗算系演算子 (Multiplicative Operators)
Number
BigInt::multiply
BigInt
Number::divide
x / y
乗算系演算子 (Multiplicative Operators)
Number
BigInt::divide
正常完了でBigIntを含む、またはthrow completion
Number::remainder
x % y
乗算系演算子 (Multiplicative Operators)
Number
BigInt::remainder
正常完了でBigIntを含む、またはthrow completion
Number::add
x ++
++ x
x + y
後置インクリメント演算子 (Postfix Increment Operator) ,
前置インクリメント演算子 (Prefix Increment Operator) ,
および 加算演算子 ( +
) (The Addition Operator)
Number
BigInt::add
BigInt
Number::subtract
x --
-- x
x - y
後置デクリメント演算子 (Postfix Decrement Operator) ,
前置デクリメント演算子 (Prefix Decrement Operator) ,
および 減算演算子 ( -
) (The Subtraction Operator)
Number
BigInt::subtract
BigInt
Number::leftShift
x << y
左シフト演算子 ( <<
) (The Left Shift Operator)
Number
BigInt::leftShift
BigInt
Number::signedRightShift
x >> y
算術(符号付き)右シフト演算子 ( >>
) (The Signed Right Shift Operator)
Number
BigInt::signedRightShift
BigInt
Number::unsignedRightShift
x >>> y
論理(ゼロ埋め)右シフト演算子 ( >>>
) (The Unsigned Right Shift Operator)
Number
BigInt::unsignedRightShift
throw completion
Number::lessThan
x < y
x > y
x <= y
x >= y
関係演算子 (Relational Operators) ,
IsLessThan ( x , y , LeftFirst ) 経由
Boolean または undefined (順序付けできない入力の場合)
BigInt::lessThan
Boolean
Number::equal
x == y
x != y
x === y
x !== y
等価演算子 (Equality Operators) ,
IsStrictlyEqual ( x , y ) 経由
Boolean
BigInt::equal
Number::sameValue
Object.is(x, y)
Object内部メソッド、
SameValue ( x , y ) 経由、
厳密な値の等価性検証
Boolean
Number::sameValueZero
[x].includes(y)
SameValueZero ( x , y ) 経由、
ArrayやMap、Setのメソッドなどで+0 𝔽 と-0 𝔽 の違いを無視して値の等価性を検証
Boolean
Number::bitwiseAND
x & y
ビット単位二項演算子 (Binary Bitwise Operators)
Number
BigInt::bitwiseAND
BigInt
Number::bitwiseXOR
x ^ y
Number
BigInt::bitwiseXOR
BigInt
Number::bitwiseOR
x | y
Number
BigInt::bitwiseOR
BigInt
Number::toString
String(x)
多くの式や組み込み関数、ToString ( argument ) 経由
String
BigInt::toString
数値型は一般的に精度の損失や切り捨てなしに変換できないため、ECMAScript言語ではこれらの型間の暗黙的な変換は提供されません。プログラマーは、別の型を必要とする関数を呼び出す際に、型間の変換を明示的にNumber
やBigInt
関数で行う必要があります。
Note
ECMAScriptの第1版以降、特定の演算子では精度が失われたり切り捨てられる暗黙の数値変換が提供されてきました。これらの従来の暗黙変換は後方互換性のために維持されていますが、BigIntには提供されていません。これはプログラマーのミスの機会を最小限に抑えるためであり、将来版での一般化された値型 の選択肢を残すためです。
6.1.6.1 Number型
Number型 は18,437,736,874,454,810,627個(すなわち264 - 253 + 3 )の値を持ち、IEEE 754-2019 の倍精度浮動小数点binary64値を表します。ただし、IEEE標準の9,007,199,254,740,990個(すなわち253 - 2 )の異なるNaN値は、ECMAScriptでは単一の特別なNaN 値として表現されます。(NaN 値はプログラム式NaN
によって生成されます。)実装によっては外部コードが異なるNaN値を検出できる場合がありますが、その挙動は実装依存です。ECMAScriptコードからはすべてのNaN 値は相互に区別できません。
Note
Number値をArrayBuffer(25.1 )やSharedArrayBuffer(25.2 )に格納した後に観察されるビットパターンは、ECMAScript実装が内部で使用するNumber値の表現と必ずしも同じではありません。
他に2つの特別な値があり、正の無限大 と負の無限大 と呼ばれます。説明の簡略化のため、これらの値は記述上+∞ 𝔽 、-∞ 𝔽 という記号で呼ばれることもあります。(これら2つの無限大Number値は、プログラム式+Infinity
(または単にInfinity
)と-Infinity
で生成されます。)
残りの18,437,736,874,454,810,624個(すなわち264 - 253 )の値は有限 数と呼ばれます。これらの半分は正の数、半分は負の数です。すべての有限 な正のNumber値には、同じ大きさの負の値が対応しています。
正のゼロ と負のゼロ が存在することに注意してください。説明の簡略化のため、これらの値は記述上+0 𝔽 、-0 𝔽 という記号で呼ばれることもあります。(これら2つのゼロNumber値は、プログラム式+0
(または単に0
)と-0
で生成されます。)
18,437,736,874,454,810,622個(すなわち264 - 253 - 2 )の有限 非ゼロ値は2種類あります:
18,428,729,675,200,069,632個(すなわち264 - 254 )は正規化されており、次の形を持ちます:
s × m × 2e
ここで、s は1または-1、m は252 (含む)から253 (含まない)までの整数 、e は-1074から971までの整数 (両端含む)です。
残りの9,007,199,254,740,990個(すなわち253 - 2 )は非正規化値であり、次の形を持ちます:
s × m × 2e
ここで、s は1または-1、m は0(含まない)から252 (含まない)までの整数 、e は-1074です。
絶対値が253 以下のすべての正負の整数 はNumber型で表現可能です。整数 0はNumber型で+0 𝔽 と-0 𝔽 の2つの表現を持ちます。
有限 な数値は、それが非ゼロで上記いずれかの形で表される整数 m が奇数である場合、奇数の仮数 を持ちます。そうでなければ偶数の仮数 となります。
この仕様では、「x のNumber値 」という表現は、x が実数(πのような無理数も含む)であるとき、次の方法で選ばれたNumber値を意味します。Number型の有限 値の集合から-0 𝔽 を除き、さらにNumber型で表現できない値21024 (+1 × 253 × 2971 )と-21024 (-1 × 253 × 2971 )を加えます。この集合のうちx に最も近い値を選びます。2つの値が同じだけ近い場合は偶数の仮数を持つ方を選びます(この場合、追加された2つの値も偶数の仮数とみなします)。最後に、21024 が選ばれた場合は+∞ 𝔽 に、-21024 が選ばれた場合は-∞ 𝔽 に、+0 𝔽 が選ばれた場合x < 0のときのみ-0 𝔽 に置き換え、その他はそのまま使います。結果がx のNumber値です。(この手順はIEEE 754-2019 のroundTiesToEvenモードの挙動と一致します。)
+∞のNumber値は+∞ 𝔽 、-∞のNumber値は-∞ 𝔽 です。
一部のECMAScript演算子は、-231 から231 - 1 まで、または0から216 - 1 までなど、特定の範囲の整数 のみを扱います。これらの演算子はNumber型の任意の値を受け入れますが、まずその値を期待される範囲の整数 値に変換します。数値変換操作の説明は7.1 を参照してください。
6.1.6.1.1 Number::unaryMinus ( x )
The abstract operation Number::unaryMinus takes argument x (a Number) and returns a Number. It performs the following steps when called:
x がNaN であれば、NaN を返す。x の符号を反転した値(絶対値は同じで符号が逆のNumber)を返す。
6.1.6.1.2 Number::bitwiseNOT ( x )
The abstract operation Number::bitwiseNOT takes argument x (a Number) and returns an integral Number. It performs the following steps when called:
oldValue を! ToInt32 (x )とする。oldValue のビットごとの補数を返す。結果の数学的な値は32ビット2の補数ビット列として正確に表現可能である。
6.1.6.1.3 Number::exponentiate ( base , exponent )
The abstract operation Number::exponentiate takes arguments base (a Number) and exponent (a Number) and returns a Number. base をexponent 乗した結果を表す実装依存の近似値を返す。 It performs the following steps when called:
exponent がNaN ならNaN を返す。exponent が+0 𝔽 または-0 𝔽 なら1 𝔽 を返す。base がNaN ならNaN を返す。base が+∞ 𝔽 ならexponent > +0 𝔽 なら+∞ 𝔽 、それ以外は+0 𝔽 を返す。base が-∞ 𝔽 ならexponent > +0 𝔽 ならexponent が奇数の整数 Numberなら-∞ 𝔽 、それ以外は+∞ 𝔽 を返す。それ以外ならexponent が奇数の整数 Numberなら-0 𝔽 、それ以外は+0 𝔽 を返す。 base が+0 𝔽 ならexponent > +0 𝔽 なら+0 𝔽 、それ以外は+∞ 𝔽 を返す。base が-0 𝔽 ならexponent > +0 𝔽 ならexponent が奇数の整数 Numberなら-0 𝔽 、それ以外は+0 𝔽 を返す。それ以外ならexponent が奇数の整数 Numberなら-∞ 𝔽 、それ以外は+∞ 𝔽 を返す。 (アサート)base は有限 であり+0 𝔽 でも-0 𝔽 でもない。 exponent が+∞ 𝔽 ならabs (ℝ (base )) > 1なら+∞ 𝔽 を返す。abs (ℝ (base )) = 1ならNaN を返す。abs (ℝ (base )) < 1なら+0 𝔽 を返す。exponent が-∞ 𝔽 ならabs (ℝ (base )) > 1なら+0 𝔽 を返す。abs (ℝ (base )) = 1ならNaN を返す。abs (ℝ (base )) < 1なら+∞ 𝔽 を返す。(アサート)exponent は有限 であり+0 𝔽 でも-0 𝔽 でもない。 base < -0 𝔽 かつexponent が整数 Numberでない場合、NaN を返す。ℝ (base )のℝ (exponent )乗の結果を表す実装依存の近似Number値を返す。
Note
base が1 𝔽 や-1 𝔽 でexponent が+∞ 𝔽 または-∞ 𝔽 の場合、またはbase が1 𝔽 でexponent がNaN の場合の**
演算の結果は、IEEE 754-2019 とは異なります。ECMAScript第1版ではこの操作の結果をNaN と規定していましたが、後のIEEE 754改訂では1 𝔽 とされています。互換性のため、従来のECMAScriptの挙動を維持しています。
6.1.6.1.4 Number::multiply ( x , y )
The abstract operation Number::multiply takes arguments x (a Number) and y (a Number) and returns a Number. x とy の積をIEEE 754-2019 バイナリ倍精度演算規則に従って計算します。 It performs the following steps when called:
x がNaN またはy がNaN ならNaN を返す。x が+∞ 𝔽 または-∞ 𝔽 ならy が+0 𝔽 または-0 𝔽 ならNaN を返す。y > +0 𝔽 ならx を返す。それ以外は-x を返す。 y が+∞ 𝔽 または-∞ 𝔽 ならx が+0 𝔽 または-0 𝔽 ならNaN を返す。x > +0 𝔽 ならy を返す。それ以外は-y を返す。 x が-0 𝔽 ならy が-0 𝔽 またはy < -0 𝔽 なら+0 𝔽 を返す。それ以外は-0 𝔽 を返す。 y が-0 𝔽 ならx < -0 𝔽 なら+0 𝔽 を返す。それ以外は-0 𝔽 を返す。 𝔽 (ℝ (x ) × ℝ (y ))を返す。
Note
有限 精度の乗算は可換ですが、常に結合法則が成り立つわけではありません。
6.1.6.1.5 Number::divide ( x , y )
The abstract operation Number::divide takes arguments x (a Number) and y (a Number) and returns a Number. x (被除数)とy (除数)の商をIEEE 754-2019 バイナリ倍精度演算規則に従って計算します。 It performs the following steps when called:
x がNaN またはy がNaN ならNaN を返す。x が+∞ 𝔽 または-∞ 𝔽 ならy が+∞ 𝔽 または-∞ 𝔽 ならNaN を返す。y が+0 𝔽 またはy > +0 𝔽 ならx を返す。それ以外は-x を返す。 y が+∞ 𝔽 ならx が+0 𝔽 またはx > +0 𝔽 なら+0 𝔽 、それ以外は-0 𝔽 を返す。y が-∞ 𝔽 ならx が+0 𝔽 またはx > +0 𝔽 なら-0 𝔽 、それ以外は+0 𝔽 を返す。x が+0 𝔽 または-0 𝔽 ならy が+0 𝔽 または-0 𝔽 ならNaN を返す。y > +0 𝔽 ならx を返す。それ以外は-x を返す。 y が+0 𝔽 ならx > +0 𝔽 なら+∞ 𝔽 、それ以外は-∞ 𝔽 を返す。y が-0 𝔽 ならx > +0 𝔽 なら-∞ 𝔽 、それ以外は+∞ 𝔽 を返す。𝔽 (ℝ (x ) / ℝ (y ))を返す。
6.1.6.1.6 Number::remainder ( 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:
n がNaN またはd がNaN ならNaN を返す。n が+∞ 𝔽 または-∞ 𝔽 ならNaN を返す。d が+∞ 𝔽 または-∞ 𝔽 ならn を返す。d が+0 𝔽 または-0 𝔽 ならNaN を返す。n が+0 𝔽 または-0 𝔽 ならn を返す。(アサート)n とd は有限 かつ非ゼロ。 quotient をℝ (n ) / ℝ (d )とする。q をtruncate (quotient )とする。r をℝ (n ) - (ℝ (d ) × q )とする。r = 0かつn < -0 𝔽 なら-0 𝔽 を返す。𝔽 (r )を返す。
Note 1
CやC++の剰余演算子は整数 のみを受け付けますが、ECMAScriptでは浮動小数点も受け付けます。
Note 2 浮動小数点の剰余演算(
%
演算子)は
IEEE 754-2019 で定義される「remainder」演算と同じではありません。
IEEE 754-2019 の「remainder」演算は丸め割り算に基づく余りを計算しますが、ECMAScript言語では浮動小数点演算の
%
はJavaの
整数 剰余演算に類似した切り捨て割り算の余りとなります。これはCライブラリのfmod関数と比較できます。
6.1.6.1.7 Number::add ( x , y )
The abstract operation Number::add takes arguments x (a Number) and y (a Number) and returns a Number. x とy の和をIEEE 754-2019 バイナリ倍精度演算規則に従って計算します。 It performs the following steps when called:
x がNaN またはy がNaN ならNaN を返す。x が+∞ 𝔽 かつy が-∞ 𝔽 ならNaN を返す。x が-∞ 𝔽 かつy が+∞ 𝔽 ならNaN を返す。x が+∞ 𝔽 または-∞ 𝔽 ならx を返す。y が+∞ 𝔽 または-∞ 𝔽 ならy を返す。(アサート)x とy はともに有限 。 x が-0 𝔽 かつy が-0 𝔽 なら-0 𝔽 を返す。𝔽 (ℝ (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:
Number::add (x , Number::unaryMinus (y ))を返す。
Note
x - y
の結果は常にx + (-y)
の結果と同じになります。
6.1.6.1.9 Number::leftShift ( x , y )
The abstract operation Number::leftShift takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:
lNum を! ToInt32 (x )とする。rNum を! ToUint32 (y )とする。shiftCount をℝ (rNum ) modulo 32とする。lNum をshiftCount ビット左シフトした結果を返す。結果の数学的な値は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:
lNum を! ToInt32 (x )とする。rNum を! ToUint32 (y )とする。shiftCount をℝ (rNum ) modulo 32とする。lNum をshiftCount ビット符号拡張付き右シフトした結果を返す。最上位ビットは伝播されます。結果の数学的な値は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:
lNum を! ToUint32 (x )とする。rNum を! ToUint32 (y )とする。shiftCount をℝ (rNum ) modulo 32とする。lNum をshiftCount ビットゼロ埋め右シフトした結果を返す。空いたビットはゼロで埋めます。結果の数学的な値は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:
x がNaN ならundefined を返す。y がNaN ならundefined を返す。x がy と等しいならfalse を返す。x が+0 𝔽 かつy が-0 𝔽 ならfalse を返す。x が-0 𝔽 かつy が+0 𝔽 ならfalse を返す。x が+∞ 𝔽 ならfalse を返す。y が+∞ 𝔽 ならtrue を返す。y が-∞ 𝔽 ならfalse を返す。x が-∞ 𝔽 ならtrue を返す。(アサート)x とy は有限 。 ℝ (x ) < ℝ (y )ならtrue 、それ以外はfalse を返す。
6.1.6.1.13 Number::equal ( x , y )
The abstract operation Number::equal takes arguments x (a Number) and y (a Number) and returns a Boolean. It performs the following steps when called:
x がNaN ならfalse を返す。y がNaN ならfalse を返す。x がy と等しいならtrue を返す。x が+0 𝔽 かつy が-0 𝔽 ならtrue を返す。x が-0 𝔽 かつy が+0 𝔽 ならtrue を返す。false を返す。
6.1.6.1.14 Number::sameValue ( x , y )
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:
x とy がともにNaN ならtrue を返す。x が+0 𝔽 かつy が-0 𝔽 ならfalse を返す。x が-0 𝔽 かつy が+0 𝔽 ならfalse を返す。x がy と等しいならtrue を返す。false を返す。
6.1.6.1.15 Number::sameValueZero ( x , y )
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:
x とy がともにNaN ならtrue を返す。x が+0 𝔽 かつy が-0 𝔽 ならtrue を返す。x が-0 𝔽 かつy が+0 𝔽 ならtrue を返す。x がy と等しいならtrue を返す。false を返す。
6.1.6.1.16 NumberBitwiseOp ( op , x , y )
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:
lNum を! ToInt32 (x )とする。rNum を! ToInt32 (y )とする。lBits をℝ (lNum )の32ビット2の補数ビット列とする。rBits をℝ (rNum )の32ビット2の補数ビット列とする。op が&
ならresult をlBits とrBits のビットごとのAND演算結果とする。そうでなくop が^
ならresult をlBits とrBits のビットごとの排他的論理和(XOR)演算結果とする。 それ以外(アサート:op は|
)result をlBits とrBits のビットごとの論理和(OR)演算結果とする。 result の32ビット2の補数ビット列が表す整数 のNumber値を返す。
6.1.6.1.17 Number::bitwiseAND ( x , y )
The abstract operation Number::bitwiseAND takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:
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:
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:
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:
x がNaN なら"NaN" を返す。x が+0 𝔽 または-0 𝔽 なら"0" を返す。x < -0 𝔽 なら、文字列連結 で"-" とNumber::toString (-x , radix )を返す。x が+∞ 𝔽 なら"Infinity" を返す。n 、k 、s を整数 として、k ≥ 1、radix k - 1 ≤ s < radix k 、𝔽 (s × radix n - k )がx 、かつk が可能な限り最小となるようにする。k はradix 進法でのs の桁数で、s はradix で割り切れない。最下位桁が一意に決まるとは限らない。radix ≠ 10またはn が-5から21の範囲ならn ≥ k なら次の文字列連結 で返す:s のradix 進法表現のk 桁0x0030(数字ゼロ)のコードユニットをn - k 回 それ以外でn > 0なら次の文字列連結 で返す:s のradix 進法表現の最上位n 桁0x002E(ピリオド) 残りk - n 桁 それ以外(n ≤ 0をアサート)次の文字列連結 で返す:0x0030(数字ゼロ) 0x002E(ピリオド) 0x0030(数字ゼロ)を-n 回 s のradix 進法表現のk 桁 注:この場合、入力は科学的E表記(例:1.2e+3
)で表現される。 (アサート)radix は10。 n < 0ならexponentSign を0x002D(ハイフンマイナス)とする。それ以外exponentSign を0x002B(プラス記号)とする。 k = 1なら次の文字列連結 で返す:s の1桁目0x0065(小文字e) exponentSign abs (n - 1)の10進表現 次の文字列連結 で返す:s の最上位桁(10進表現)0x002E(ピリオド) 残りk - 1桁(10進表現) 0x0065(小文字e) exponentSign abs (n - 1)の10進表現
Note 1
次の点は実装の指針となり得ますが、この規格の規範的要件の一部ではありません:
Note 2
規定よりも高精度の変換が可能な実装には、step 5 の次の代替手順が指針となります:
n 、k 、s を整数 として、k ≥ 1、radix k - 1 ≤ s < radix k 、𝔽 (s × radix n - k )がx 、k が最小となるようにする。s の値が複数ある場合、s × radix n - k がℝ (x )に最も近いものを選ぶ。2つの可能な値がある場合は偶数の方を選ぶ。k はradix 進法でのs の桁数であり、s はradix で割り切れない。
Note 3
ECMAScript実装者は、David M. Gayによる浮動小数点数の2進-10進変換に関する論文およびコードが参考になるかもしれません:
Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary Conversions. Numerical Analysis, Manuscript 90-10. AT&T Bell Laboratories (Murray Hill, New Jersey). 1990年11月30日。
https://ampl.com/_archive/first-website/REFS/rounding.pdf 。関連コード:
http://netlib.sandia.gov/fp/dtoa.c および
http://netlib.sandia.gov/fp/g_fmt.c 。また各netlib
ミラーサイトにもあります。
6.1.6.2 BigInt型
BigInt型 は整数 値を表します。値のサイズは任意であり、特定のビット幅に制限されません。特に記載がない限り、演算は正確な数学的結果を返すよう設計されています。2項演算の場合、BigIntは2の補数のバイナリ文字列として扱われ、負の数は左側に無限にビットが立っているものとして扱われます。
6.1.6.2.1 BigInt::unaryMinus ( x )
The abstract operation BigInt::unaryMinus takes argument x (a BigInt) and returns a BigInt. It performs the following steps when called:
x = 0 ℤ なら、0 ℤ を返す。-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:
-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:
exponent < 0 ℤ なら、RangeError 例外を投げる。base = 0 ℤ かつexponent = 0 ℤ なら、1 ℤ を返す。base をexponent 乗した値を返す。
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:
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:
y = 0 ℤ なら、RangeError 例外を投げる。quotient をℝ (x ) / ℝ (y )とする。ℤ (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:
d = 0 ℤ なら、RangeError 例外を投げる。n = 0 ℤ なら、0 ℤ を返す。quotient をℝ (n ) / ℝ (d )とする。q をℤ (truncate (quotient ))とする。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:
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:
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:
y < 0 ℤ ならℤ (floor (ℝ (x ) / 2-ℝ (y ) ))を返す。x × 2 ℤ y を返す。
Note ここでの意味論は、BigIntを無限長の2の補数バイナリ文字列として扱うビットシフトと同等です。
6.1.6.2.10 BigInt::signedRightShift ( x , y )
The abstract operation BigInt::signedRightShift takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:
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:
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:
ℝ (x ) < ℝ (y )ならtrue 、それ以外はfalse を返す。
6.1.6.2.13 BigInt::equal ( x , y )
The abstract operation BigInt::equal takes arguments x (a BigInt) and y (a BigInt) and returns a Boolean. It performs the following steps when called:
ℝ (x ) = ℝ (y )ならtrue 、それ以外はfalse を返す。
6.1.6.2.14 BinaryAnd ( x , y )
The abstract operation BinaryAnd takes arguments x (0 or 1) and y (0 or 1) and returns 0 or 1. It performs the following steps when called:
x = 1かつy = 1なら1を返す。それ以外は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:
x = 1またはy = 1なら1を返す。それ以外は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:
x = 1かつy = 0なら1を返す。それ以外でx = 0かつy = 1なら1を返す。 それ以外は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:
x をℝ (x )に設定する。y をℝ (y )に設定する。result を0とする。shift を0とする。(x = 0またはx = -1)かつ(y = 0またはy = -1)になるまで繰り返す:xDigit をx modulo 2とする。yDigit をy modulo 2とする。op が&
ならresult をresult + 2shift × BinaryAnd (xDigit , yDigit )に設定する。それ以外でop が|
ならresult をresult + 2shift × BinaryOr (xDigit , yDigit )に設定する。 それ以外アサート:op は^
である。 result をresult + 2shift × BinaryXor (xDigit , yDigit )に設定する。 shift をshift + 1に設定する。x を(x - xDigit ) / 2に設定する。y を(y - yDigit ) / 2に設定する。 op が&
ならtmp をBinaryAnd (x modulo 2, y modulo 2)とする。それ以外でop が|
ならtmp をBinaryOr (x modulo 2, y modulo 2)とする。 それ以外アサート:op は^
である。 tmp をBinaryXor (x modulo 2, y modulo 2)とする。 tmp ≠ 0ならresult をresult - 2shift に設定する。注:これは符号拡張となる。 result のBigInt値 を返す。
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:
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:
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:
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:
x < 0 ℤ なら、文字列連結 で"-" とBigInt::toString (-x , radix )を返す。x をradix で表現したString値を返す。
6.1.7 オブジェクト型
Object型 (単に「オブジェクト」とも呼ばれる)の各インスタンスは、プロパティの集合を表します。各プロパティはデータプロパティまたはアクセサプロパティのいずれかです:
データプロパティ は、キー値をECMAScript言語値 と一連の真偽値属性に関連付けます。
アクセサプロパティ は、キー値を1つまたは2つのアクセサ関数と一連の真偽値属性に関連付けます。アクセサ関数はそのプロパティに関連付けられたECMAScript言語値 の保存または取得に使用されます。
オブジェクトのプロパティはプロパティキー によって一意に識別されます。 プロパティキー はStringまたはSymbolです。空文字列を含むすべてのStringとSymbolはプロパティキー として有効です。プロパティ名 は、プロパティキー のうちStringであるものです。
整数インデックス は、CanonicalNumericIndexString (n )が+0 𝔽 から𝔽 (253 - 1)までの範囲の整数 Numberを返すプロパティ名 n です。配列インデックス は、CanonicalNumericIndexString (n )が+0 𝔽 から𝔽 (232 - 2)までの範囲の整数 Numberを返す整数インデックス n です。
Note
全ての非負の安全な整数 には対応する整数インデックス があります。232 - 1 を除く全ての32ビット符号なし整数 には対応する配列インデックス があります。"-0" は整数インデックス でも配列インデックス でもありません。
プロパティキー はプロパティおよびその値へのアクセスに用いられます。プロパティへのアクセスには、値の取得(get)と値の代入(set)の2種類があります。get/setアクセスで利用できるプロパティには、オブジェクト自身が直接持つ自身のプロパティ と、プロパティ継承関係によって関連する他のオブジェクトから提供される継承プロパティ の両方が含まれます。継承プロパティも、その関連オブジェクトの自身プロパティまたは継承プロパティのいずれかである場合があります。オブジェクトの自身プロパティは、それぞれ他の自身プロパティとは異なるキー値を持たねばなりません。
全てのオブジェクトは論理的にはプロパティの集合ですが、プロパティへのアクセスや操作の意味論が異なる複数の形式のオブジェクトがあります。複数のオブジェクト形式の定義については6.1.7.2 を参照してください。
さらに、一部のオブジェクトは呼び出し可能(callable)であり、これらは関数または関数オブジェクト と呼ばれ、後述します。ECMAScriptの全ての関数はObject型のメンバーです。
6.1.7.1 プロパティ属性
属性は、この仕様においてTable 3 で説明されるオブジェクトプロパティの状態を定義・説明するために使用されます。明示的に指定されていない限り、各属性の初期値はそのデフォルト値です。
Table 3: オブジェクトプロパティの属性
属性名
存在するプロパティの種類
値のドメイン
デフォルト値
説明
[[Value]]
データプロパティ
ECMAScript言語値
undefined
プロパティへのgetアクセス時に取得される値。
[[Writable]]
データプロパティ
真偽値
false
false の場合、ECMAScriptコードによる[[Set]] でプロパティの[[Value]] 属性を変更しようとしても成功しない。
[[Get]]
アクセサプロパティ
オブジェクトまたはundefined
undefined
値がオブジェクトの場合、関数オブジェクト でなければならない。プロパティのgetアクセスごとに、関数の[[Call]] 内部メソッド(Table 5 )が空の引数リストで呼び出され、値を取得する。
[[Set]]
アクセサプロパティ
オブジェクトまたはundefined
undefined
値がオブジェクトの場合、関数オブジェクト でなければならない。プロパティのsetアクセスごとに、関数の[[Call]] 内部メソッド(Table 5 )が代入値のみを含む引数リストで呼び出される。プロパティの[[Set]] 内部メソッドの効果は、後の[[Get]] 内部メソッドの呼び出しで返される値に影響を与えても与えなくてもよい。
[[Enumerable]]
データプロパティ またはアクセサプロパティ
真偽値
false
true の場合、プロパティはfor-in列挙(14.7.5 参照)で列挙される。そうでなければ非列挙プロパティとされる。
[[Configurable]]
データプロパティ またはアクセサプロパティ
真偽値
false
false の場合、プロパティの削除やデータ⇄アクセサプロパティ の変更、その他の属性変更(既存の[[Value]] の置換や[[Writable]] をfalse にする以外)は成功しない。
6.1.7.2 オブジェクトの内部メソッドと内部スロット
ECMAScriptでは、オブジェクトの実際の意味論は内部メソッド と呼ばれるアルゴリズムによって定義されます。ECMAScriptエンジンの各オブジェクトには、そのランタイム動作を定義する内部メソッドの集合が関連付けられています。これらの内部メソッドはECMAScript言語の一部ではなく、説明目的で仕様に定義されています。ただし、実装内の各オブジェクトは、関連付けられた内部メソッドで指定された通りに振る舞わなければなりません。その実現方法は実装によって異なります。
内部メソッド名は多態的です。つまり、同じ内部メソッド名が呼び出されても、異なるオブジェクト値は異なるアルゴリズムを実行することがあります。内部メソッドが呼び出される実際のオブジェクトがその呼び出しの「ターゲット」です。実行時にアルゴリズムの実装がオブジェクトのサポートしていない内部メソッドを使おうとした場合、TypeError 例外が投げられます。
内部スロットは、オブジェクト、Symbol、プライベート名に関連付けられた内部状態であり、様々なECMAScript仕様アルゴリズムで使われます。内部スロットはプロパティではなく、継承もされません。特定の内部スロット仕様によっては、状態が任意のECMAScript言語型 または仕様型値になることがあります。明示的な記載がない限り、内部スロットはオブジェクト、Symbol、プライベート名の作成時に割り当てられ、動的に追加されることはありません。明示的な記載がない限り、内部スロットの初期値はundefined です。本仕様内の様々なアルゴリズムは内部スロットを持つ値を生成しますが、ECMAScript言語は内部スロットを直接操作する方法を提供しません。
全てのオブジェクトは[[PrivateElements]] という名前の内部スロットを持ちます。これはPrivateElementsのリストであり、そのオブジェクトのプライベートフィールド、メソッド、アクセサの値を表します。初期状態では空のリストです。
内部メソッドと内部スロットは本仕様中では[[ ]]で囲まれた名前で識別されます。
Table 4 は、ECMAScriptコードで生成・操作される全てのオブジェクトに適用される本質的な内部メソッド をまとめたものです。全てのオブジェクトは本質的な内部メソッドのアルゴリズムを持たねばなりませんが、必ずしも同じアルゴリズムを使うとは限りません。
通常オブジェクト は、次の全ての条件を満たすオブジェクトです:
エキゾチックオブジェクト は、通常オブジェクト でないオブジェクトです。
本仕様では、エキゾチックオブジェクト の種類はその内部メソッドによって認識されます。特定の種類のエキゾチックオブジェクト (配列エキゾチックオブジェクト や束縛関数エキゾチックオブジェクト など)と振る舞いが同等でも、その種類に指定された内部メソッド群を持たない場合は、その種類のエキゾチックオブジェクト として認識されません。
Table 4 などの表の「Signature」列は、各内部メソッドの呼び出しパターンを示します。呼び出しパターンには常に括弧付きの説明的パラメータ名リストが含まれます。パラメータ名がECMAScript型名と同じなら、その型の値が必要です。内部メソッドが値を明示的に返す場合、パラメータリストの後に「→」と返却値型名が続きます。Signatureで使われる型名は6 で定義された型に、下記の追加型名を加えたものです。「any 」は任意のECMAScript言語型 の値を意味します。
パラメータに加え、内部メソッドは呼び出し対象オブジェクト(ターゲット)に常にアクセスできます。
内部メソッドは必ずCompletion Record を返します。これは、正常完了で返却型値を包むものか、throw完了です。
Table 4: 本質的な内部メソッド
内部メソッド
シグネチャ
説明
[[GetPrototypeOf]]
( ) → Object | Null
このオブジェクトに継承プロパティを提供するオブジェクトを決定する。null 値は継承プロパティが無いことを示す。
[[SetPrototypeOf]]
(Object | Null) → Boolean
このオブジェクトを継承プロパティを提供する他のオブジェクトと関連付ける。null を渡すと継承プロパティが無いことを示す。操作が成功した場合はtrue 、失敗した場合はfalse を返す。
[[IsExtensible]]
( ) → Boolean
このオブジェクトに追加プロパティの追加が許可されているかどうかを判定する。
[[PreventExtensions]]
( ) → Boolean
このオブジェクトに新しいプロパティ追加を制御する。操作が成功した場合はtrue 、失敗した場合はfalse を返す。
[[GetOwnProperty]]
(propertyKey ) → Undefined | Property Descriptor
このオブジェクト自身のプロパティでキーがpropertyKey であるもののプロパティ記述子を返す。なければundefined を返す。
[[DefineOwnProperty]]
(propertyKey , PropertyDescriptor ) → Boolean
キーがpropertyKey である自身のプロパティを、PropertyDescriptor で記述される状態に新規作成または変更する。そのプロパティが作成/更新できればtrue 、できなければfalse を返す。
[[HasProperty]]
(propertyKey ) → Boolean
このオブジェクトがpropertyKey をキーに持つ自身または継承プロパティを既に持っているかどうかを示す真偽値を返す。
[[Get]]
(propertyKey , Receiver ) → any
このオブジェクトからpropertyKey のプロパティ値を返す。プロパティ値取得のためにECMAScriptコードの実行が必要な場合、Receiver がthis 値として使用される。
[[Set]]
(propertyKey , value , Receiver ) → Boolean
このオブジェクトのpropertyKey プロパティ値をvalue に設定する。値の設定にECMAScriptコードの実行が必要な場合、Receiver がthis 値として使われる。値の設定ができればtrue 、できなければfalse を返す。
[[Delete]]
(propertyKey ) → Boolean
このオブジェクト自身からpropertyKey をキーに持つプロパティを削除する。削除できずまだ存在する場合はfalse 、削除された場合や元々存在しない場合はtrue を返す。
[[OwnPropertyKeys]]
( ) → プロパティキー のリスト
オブジェクト自身の全てのプロパティキー のリストを返す。
Table 5 は、関数として呼び出し可能なオブジェクトがサポートする追加の本質的な内部メソッドをまとめています。関数オブジェクト は[[Call]] 内部メソッドをサポートするオブジェクトです。コンストラクタ は[[Construct]] 内部メソッドをサポートするオブジェクトです。[[Construct]] をサポートするオブジェクトは[[Call]] もサポートしなければならず、全てのコンストラクタ は関数オブジェクト となります。したがって、コンストラクタ はコンストラクタ 関数 またはコンストラクタ 関数オブジェクト とも呼ばれます。
Table 5: 関数オブジェクト の追加本質的内部メソッド
内部メソッド
シグネチャ
説明
[[Call]]
(any , any のリスト) → any
このオブジェクトに関連付けられたコードを実行する。関数呼び出し式を通して呼び出される。引数はthis 値と、呼び出し式で渡された引数のリスト。[[Call]] を実装するオブジェクトは呼び出し可能 です。
[[Construct]]
(any のリスト, Object) → Object
オブジェクトを生成する。new
演算子またはsuper
呼び出しで起動される。最初の引数はコンストラクタ 呼び出しまたはsuper
呼び出しの引数のリスト。2番目の引数はnew
演算子が最初に適用されたオブジェクト。[[Construct]] を実装するオブジェクトはコンストラクタ と呼ばれる。関数オブジェクト が必ずしもコンストラクタ とは限らず、非コンストラクタ 関数オブジェクト は[[Construct]] 内部メソッドを持たない。
通常オブジェクト や標準エキゾチックオブジェクト の本質的内部メソッドの意味論は10 で定義されています。エキゾチックオブジェクト の内部メソッドの指定された使用が実装でサポートされていない場合、その使用は試みられるとTypeError 例外を投げなければなりません。
6.1.7.3 本質的内部メソッドの不変条件
ECMAScriptエンジンのオブジェクトの内部メソッドは、以下に示す不変条件リストに準拠しなければなりません。通常のECMAScriptオブジェクトおよび本仕様の全標準エキゾチックオブジェクト はこれらの不変条件を維持します。ECMAScriptのProxyオブジェクトは、[[ProxyHandler]] オブジェクトでtrapを呼び出した結果に対するランタイムチェックによってこれらの不変条件を維持します。
実装が提供するエキゾチックオブジェクト も、そのオブジェクトについてこれらの不変条件を維持しなければなりません。これらの不変条件に違反すると、ECMAScriptコードの挙動が予測不能になったり、セキュリティ問題が生じる場合があります。ただし、これらの不変条件への違反によって実装のメモリ安全性が損なわれてはなりません。
実装は、本質的内部メソッドの不変条件を強制しないまま、その機能を代替インターフェイスで提供するなどして、不変条件を回避できるようにしてはなりません。
定義:
内部メソッドのターゲット は、その内部メソッドが呼び出されるオブジェクトです。
ターゲットが[[IsExtensible]] 内部メソッドでfalse を返すこと、または[[PreventExtensions]] 内部メソッドでtrue を返すことが観測された場合、ターゲットは非拡張 とされます。
非存在 プロパティとは、非拡張ターゲットに自身プロパティとして存在しないプロパティです。
SameValue への参照は、SameValue アルゴリズムの定義に従います。
戻り値:
いかなる内部メソッドも、以下いずれかのCompletion Record 値を返さなければなりません:
[[Type]] = normal , [[Target]] = empty , [[Value]] = 下記内部メソッドごとの「正常返却型」の値、または
[[Type]] = throw , [[Target]] = empty , [[Value]] = 任意のECMAScript言語値
Note 1
内部メソッドはcontinue完了、break完了、return完了を返してはなりません。
[[GetPrototypeOf]] ( )
正常返却型はObjectまたはNullです。
ターゲットが非拡張で、[[GetPrototypeOf]] が値V を返した場合、以後の[[GetPrototypeOf]] 呼び出しもV とSameValue な値を返すべきです。
Note 2
オブジェクトのプロトタイプチェーンは有限 長であるべきです(すなわち、任意のオブジェクトから[[GetPrototypeOf]] 内部メソッドを再帰的に適用すると、最終的にnull になるべき)。ただし、プロトタイプチェーンに通常オブジェクト 定義でない[[GetPrototypeOf]] を使うエキゾチックオブジェクト が含まれる場合、この条件はオブジェクトレベルの不変条件として強制できません。循環したプロトタイプチェーンは、プロパティアクセス時に無限ループとなる場合があります。
[[SetPrototypeOf]] ( V )
正常返却型はBooleanです。
ターゲットが非拡張の場合、[[SetPrototypeOf]] はfalse を返さなければなりません。ただしV がターゲットの観測済み[[GetPrototypeOf]] 値とSameValue の場合を除く。
[[IsExtensible]] ( )
正常返却型はBooleanです。
[[IsExtensible]] がfalse を返した場合、以後の[[IsExtensible]] 呼び出しもfalse を返さなければなりません。
[[PreventExtensions]] ( )
正常返却型はBooleanです。
[[PreventExtensions]] がtrue を返した場合、以後の[[IsExtensible]] 呼び出しはfalse を返し、ターゲットは非拡張とされます。
[[GetOwnProperty]] ( P )
正常返却型はProperty Descriptor またはUndefinedです。
返却値がProperty Descriptor の場合、完全に埋められた記述子でなければなりません。
P が非設定可能・非書き込み可能な自身データプロパティ である場合、以後の[[GetOwnProperty]] ( P )呼び出しは、P の[[Value]] 属性がSameValue なProperty Descriptor を返さなければなりません。
P の[[Writable]] と[[Value]] 以外の属性が変化する可能性がある、またはプロパティが削除され得る場合、P の[[Configurable]] 属性はtrue でなければなりません。
[[Writable]] 属性がfalse からtrue に変化し得る場合、[[Configurable]] 属性はtrue でなければなりません。
ターゲットが非拡張かつP が非存在自身プロパティの場合、以後の[[GetOwnProperty]] (P )呼び出しはP を非存在として記述しなければならない(つまりundefined を返す)。
Note 3
3番目の不変条件の結果として、プロパティがデータプロパティ で時間経過で値が変わる可能性がある場合、他の本質的内部メソッドで値の変更手段が公開されていなくても、[[Writable]] または[[Configurable]] 属性のいずれかまたは両方をtrue にしなければなりません。
[[DefineOwnProperty]] ( P , Desc )
正常返却型はBooleanです。
P が過去に非設定可能自身プロパティと観測されていた場合、次のいずれかでない限り[[DefineOwnProperty]] はfalse を返さなければなりません:
P が書き込み可能データプロパティ である。非設定可能な書き込み可能データプロパティ は非設定可能な非書き込み可能データプロパティ に変更できる。
Desc の全属性がP の属性とSameValue である。
ターゲットが非拡張かつP が非存在自身プロパティの場合、[[DefineOwnProperty]] (P , Desc )はfalse を返さなければならない。つまり非拡張ターゲットオブジェクトに新しいプロパティは追加できない。
[[HasProperty]] ( P )
正常返却型はBooleanです。
P が過去に非設定可能自身データまたはアクセサプロパティ だった場合、[[HasProperty]] はtrue を返さなければなりません。
[[Get]] ( P , Receiver )
[[Set]] ( P , V , Receiver )
正常返却型はBooleanです。
P が過去に非設定可能・非書き込み可能な自身データプロパティ だった場合、V がP の[[Value]] 属性とSameValue でない限り[[Set]] はfalse を返さなければなりません。
P が過去に非設定可能な自身アクセサプロパティ で[[Set]] 属性がundefined だった場合、[[Set]] 操作はfalse を返さなければなりません。
[[Delete]] ( P )
正常返却型はBooleanです。
P が過去に非設定可能自身データまたはアクセサプロパティ だった場合、[[Delete]] はfalse を返さなければなりません。
[[OwnPropertyKeys]] ( )
正常返却型はリストです。
返却されたリストに重複エントリがあってはなりません。
リストの各要素はプロパティキー でなければなりません。
リストには、これまで観測された非設定可能自身プロパティのキーが必ず含まれていなければなりません。
ターゲットが非拡張の場合、返却リストには[[GetOwnProperty]] で観測可能なターゲットの自身プロパティ全てのキーのみが含まれていなければなりません。
[[Call]] ( )
[[Construct]] ( )
正常返却型はObjectです。
ターゲットは[[Call]] 内部メソッドも持っていなければなりません。
6.1.7.4 著名な組み込みオブジェクト
著名な組み込みオブジェクト(well-known intrinsics)は、本仕様のアルゴリズムで明示的に参照され、通常はレルムごとに異なる同一性を持つ組み込みオブジェクトです。特に明示されていない限り、各組み込みオブジェクトはレルムごとに類似したオブジェクトの集合に対応します。
本仕様内では、%name%のような参照は、現在のレルムに関連付けられた対応する名前の組み込みオブジェクトを意味します。%name.a.b%のような参照は、組み込みオブジェクト%name%の"a" プロパティ値の"b" プロパティ値に、ECMAScriptコードが評価される前にアクセスしたかのような意味です。現在のレルムとその組み込みオブジェクトの決定については9.4 で説明されています。著名な組み込みオブジェクトはTable 6 に一覧化されています。
Table 6: 著名な組み込みオブジェクト
Note
6.2 ECMAScript仕様型
仕様型は、ECMAScript言語構造やECMAScript言語型 の意味論を記述するためにアルゴリズム内で使用されるメタ値を表します。仕様型にはReference Record 、List 、Completion Record 、Property Descriptor 、Environment Record 、Abstract Closure 、Data Block が含まれます。仕様型の値は仕様上のアーティファクトであり、ECMAScript実装内の特定の実体に必ずしも対応しません。仕様型の値はECMAScript式評価の中間結果の記述に使われることがありますが、オブジェクトのプロパティやECMAScript言語変数の値として保存することはできません。
6.2.1 Enum仕様型
Enum は仕様内部の値であり、ECMAScriptコードから直接観測することはできません。Enumはsans-serif フォントで表記されます。例えば、Completion Record の[[Type]] フィールドはnormal 、return 、throw などの値を取ります。Enumは名前以外の特性を持ちません。Enumの名前は他のEnumと区別するためだけに存在し、コンテキストでの使い方や意味を暗示しません。
6.2.2 ListおよびRecord仕様型
List 型は、new
式や関数呼び出し、その他値の単純な順序付きリストが必要なアルゴリズムにおける引数リスト評価を説明するために使用されます。List型の値は個々の値を含むリスト要素の順序付き列です。これらの列の長さは任意です。リストの要素は0始まりのインデックスでランダムにアクセスできます。記法上の便宜として、List要素へのアクセスには配列風の構文が使えます。例えば、arguments [2]はList_arguments_の3番目の要素を表します。
アルゴリズムがListの要素を順序指定なしで反復する場合、使用される順序はList内の要素の順序です。
この仕様書内の記法上の便宜として、リテラル構文を用いて新しいList値を表現できます。例えば、« 1, 2 »は2つの要素を持ち、それぞれ特定の値で初期化されているList値を定義します。新しい空のListは« »で表現できます。
この仕様書では、「A 、B 、...のリスト結合 」という表現(各引数は空リストの場合もある)は、各引数の要素(順序通り)を連結した新しいList値を表します。
List of Stringsに対して「辞書式コードユニット順 で並べ替える」とは、短い文字列の長さまで各コードユニットの数値で比較し、全てが等しければ短い方を先に並べることを意味します。これは抽象操作 IsLessThan で説明されています。
Record 型は、この仕様のアルゴリズム内でデータ集合を記述するために使われます。Record型の値は1つ以上の名前付きフィールドからなります。各フィールドの値はECMAScript言語値 または仕様値です。フィールド名は常に二重角括弧で囲まれます(例:[[Value]] )。
記法上の便宜として、Record値はオブジェクトリテラル風の構文で表現できます。例えば、{ [[Field1]] : 42, [[Field2]] : false , [[Field3]] : empty }は3つのフィールドを持ち、それぞれが特定の値で初期化されたRecord値を定義します。フィールド名の順序は重要ではありません。明示的に記載されていないフィールドは存在しないものとみなされます。
仕様本文やアルゴリズムでは、Record値の特定フィールドを参照するためにドット記法が使われます。例えば、Rが前述のRecordの場合、R.[[Field2]] は「Rの[[Field2]] という名前のフィールド」を意味します。
よく使われるRecordフィールド組み合わせのスキーマには名前が付けられ、その名前をリテラルRecord値の前に付けて、記述している特定の集合種別を識別することができます。例:PropertyDescriptor { [[Value]] : 42, [[Writable]] : false , [[Configurable]] : true }。
6.2.3 SetおよびRelation仕様型
Set 型は、メモリモデルで使用するための順序なし要素の集合を説明するために使われます。これはECMAScriptの同名コレクション型とは異なります。区別のため、ECMAScriptコレクションのインスタンスは常に「Setオブジェクト」と呼ばれます。Set型の値は単純な要素集合であり、同じ要素が複数回現れることはありません。Setには要素の追加・削除ができます。Set同士の和集合、積集合、差集合も可能です。
Relation 型は、Setに対する制約を説明するために使われます。Relation型の値は、その値域からの順序付きペアのSetです。例えば、イベントに対するRelationは、イベントの順序付きペアの集合です。Relation_R_と値域内の2つの値a 、b について、a R b は順序付きペア(a , b )がR に含まれることの略記です。Relationがある条件に関して最小Relation であるとは、その条件を満たす最小のRelationであることを意味します。
狭義半順序 は、Relation値R が以下を満たす場合です。
R の値域内の全てのa 、b 、c について:
a R a であることはない
a R b かつb R c ならa R c
Note 1
上記2つの性質は、それぞれ反射性の否定(非自反性)と推移性と呼ばれます。
狭義全順序 は、Relation値R が以下を満たす場合です。
R の値域内の全てのa 、b 、c について:
a がb であるか、a R b か、b R a である
a R a であることはない
a R b かつb R c ならa R c
Note 2
上記3つの性質は、それぞれ全域性、非自反性、推移性と呼ばれます。
6.2.4 Completion Record仕様型
Completion Record 仕様型は、値や制御フロー(break
、continue
、return
、throw
による非局所的な制御移動)のランタイム伝播などを説明するために使われます。
Completion RecordはTable 7 で定義されたフィールドを持ちます。
Table 7: Completion Record フィールド
フィールド名
値
意味
[[Type]]
normal 、break 、continue 、return 、throw
発生したcompletionの種類。
[[Value]]
Completion Record 以外の任意の値
生成された値。
[[Target]]
Stringまたはempty
指定制御移動のターゲットラベル。
Completion Recordを指すために次の略称が用いられることがあります。
normal completion は[[Type]] 値がnormal のCompletion Recordを指します。
break completion は[[Type]] 値がbreak のCompletion Recordを指します。
continue completion は[[Type]] 値がcontinue のCompletion Recordを指します。
return completion は[[Type]] 値がreturn のCompletion Recordを指します。
throw completion は[[Type]] 値がthrow のCompletion Recordを指します。
abrupt completion は[[Type]] 値がnormal 以外のCompletion Recordを指します。
normal completion containing は[[Value]] フィールドに指定された型の値を持つnormal completionを指します。
この仕様で定義される呼び出し可能オブジェクトは、normal completionまたはthrow completionのみを返します。それ以外のCompletion Recordを返す場合は編集上の誤りです。
実装定義 の呼び出し可能オブジェクトもnormal completionまたはthrow completionのみを返さなければなりません。
6.2.4.1 NormalCompletion ( value )
The abstract operation NormalCompletion takes argument value (Completion Record 以外の任意の値) and returns normal completion . It performs the following steps when called:
Completion Record { [[Type]] : normal , [[Value]] : value , [[Target]] : empty }を返す。
6.2.4.2 ThrowCompletion ( value )
The abstract operation ThrowCompletion takes argument value (ECMAScript言語値 ) and returns throw completion . It performs the following steps when called:
Completion Record { [[Type]] : throw , [[Value]] : value , [[Target]] : empty }を返す。
6.2.4.3 ReturnCompletion ( value )
The abstract operation ReturnCompletion takes argument value (ECMAScript言語値 ) and returns return completion . It performs the following steps when called:
Completion Record { [[Type]] : return , [[Value]] : value , [[Target]] : empty }を返す。
6.2.4.4 UpdateEmpty ( completionRecord , value )
The abstract operation UpdateEmpty takes arguments completionRecord (Completion Record ) and value (Completion Record 以外の任意の値) and returns Completion Record . It performs the following steps when called:
completionRecord がreturn completion またはthrow completion の場合、completionRecord .[[Value]] はempty でないことをアサートする。completionRecord .[[Value]] がempty でないなら、? completionRecord を返す。Completion Record { [[Type]] : completionRecord .[[Type]] , [[Value]] : value , [[Target]] : completionRecord .[[Target]] }を返す。
6.2.5 Reference Record仕様型
Reference Record 型は、delete
、typeof
、代入演算子、super
キーワードやその他の言語機能の動作を説明するために使われます。例えば、代入の左辺オペランドはReference Recordを生成することが期待されます。
Reference Recordは解決済みの名前や(未解決の場合もある)プロパティバインディングであり、そのフィールドはTable 8 で定義されます。
Table 8: Reference Record フィールド
この仕様でReference Recordを操作するのに使われる抽象操作 は以下の通りです:
6.2.5.1 IsPropertyReference ( V )
The abstract operation IsPropertyReference takes argument V (Reference Record ) and returns 真偽値. It performs the following steps when called:
V .[[Base]] がunresolvable ならfalse を返す。V .[[Base]] がEnvironment Record ならfalse を返す、そうでなければtrue を返す。
6.2.5.2 IsUnresolvableReference ( V )
The abstract operation IsUnresolvableReference takes argument V (Reference Record ) and returns 真偽値. It performs the following steps when called:
V .[[Base]] がunresolvable ならtrue 、そうでなければfalse を返す。
6.2.5.3 IsSuperReference ( V )
The abstract operation IsSuperReference takes argument V (Reference Record ) and returns 真偽値. It performs the following steps when called:
V .[[ThisValue]] がempty でないならtrue 、それ以外はfalse を返す。
6.2.5.4 IsPrivateReference ( V )
The abstract operation IsPrivateReference takes argument V (Reference Record ) and returns 真偽値. It performs the following steps when called:
V .[[ReferencedName]] がPrivate Name ならtrue 、それ以外はfalse を返す。
6.2.5.5 GetValue ( V )
The abstract operation GetValue takes argument V (Reference Record またはECMAScript言語値 ) and returns normal completion (ECMAScript言語値 含む)またはabrupt completion . It performs the following steps when called:
V がReference Record でなければV を返す。IsUnresolvableReference (V )がtrue ならReferenceError 例外を投げる。IsPropertyReference (V )がtrue ならbaseObj を? ToObject (V .[[Base]] )とする。IsPrivateReference (V )がtrue なら? PrivateGet (baseObj , V .[[ReferencedName]] )を返す。 V .[[ReferencedName]] がプロパティキー でない場合V .[[ReferencedName]] を? ToPropertyKey (V .[[ReferencedName]] )に設定する。? baseObj .[[Get]] (V .[[ReferencedName]] , GetThisValue (V ))を返す。 それ以外の場合base をV .[[Base]] とする。アサート:base はEnvironment Record 。 ? base .GetBindingValue (V .[[ReferencedName]] , V .[[Strict]] )(9.1 参照)を返す。
Note
step 3.a で生成されるオブジェクトは、上記抽象操作 および通常オブジェクト [[Get]] 内部メソッド以外からはアクセスできません。実装によっては、実際のオブジェクト生成を省略する場合もあります。
6.2.5.6 PutValue ( V , W )
The abstract operation PutValue takes arguments V (Reference Record またはECMAScript言語値 ) and W (ECMAScript言語値 ) and returns normal completion (unused 含む)またはabrupt completion . It performs the following steps when called:
V がReference Record でなければReferenceError 例外を投げる。IsUnresolvableReference (V )がtrue ならV .[[Strict]] がtrue ならReferenceError 例外を投げる。globalObj をGetGlobalObject ()とする。? Set (globalObj , V .[[ReferencedName]] , W , false )を実行する。 unused を返す。IsPropertyReference (V )がtrue ならbaseObj を? ToObject (V .[[Base]] )とする。IsPrivateReference (V )がtrue なら? PrivateSet (baseObj , V .[[ReferencedName]] , W )を返す。 V .[[ReferencedName]] がプロパティキー でない場合V .[[ReferencedName]] を? ToPropertyKey (V .[[ReferencedName]] )に設定する。succeeded を? baseObj .[[Set]] (V .[[ReferencedName]] , W , GetThisValue (V ))とする。succeeded がfalse かつV .[[Strict]] がtrue ならTypeError 例外を投げる。unused を返す。それ以外の場合base をV .[[Base]] とする。アサート:base はEnvironment Record 。 ? base .SetMutableBinding (V .[[ReferencedName]] , W , V .[[Strict]] )(9.1 参照)を返す。
Note
step 3.a で生成されるオブジェクトは、上記抽象操作 および通常オブジェクト [[Set]] 内部メソッド以外からはアクセスできません。実装によっては、実際のオブジェクト生成を省略する場合もあります。
6.2.5.7 GetThisValue ( V )
The abstract operation GetThisValue takes argument V (Reference Record ) and returns ECMAScript言語値 . It performs the following steps when called:
IsPropertyReference (V )がtrue であることをアサートする。IsSuperReference (V )がtrue ならV .[[ThisValue]] を返し、そうでなければV .[[Base]] を返す。
6.2.5.8 InitializeReferencedBinding ( V , W )
The abstract operation InitializeReferencedBinding takes arguments V (Reference Record ) and W (ECMAScript言語値 ) and returns normal completion (unused 含む)またはabrupt completion . It performs the following steps when called:
IsUnresolvableReference (V )がfalse であることをアサートする。base をV .[[Base]] とする。アサート:base はEnvironment Record 。 ? base .InitializeBinding(V .[[ReferencedName]] , W )を返す。
6.2.5.9 MakePrivateReference ( baseValue , privateIdentifier )
The abstract operation MakePrivateReference takes arguments baseValue (ECMAScript言語値 ) and privateIdentifier (String) and returns Reference Record . It performs the following steps when called:
privateEnv を実行中の実行コンテキストのPrivateEnvironmentとする。アサート:privateEnv はnull ではない。 privateName をResolvePrivateIdentifier (privateEnv , privateIdentifier )とする。Reference Record { [[Base]] : baseValue , [[ReferencedName]] : privateName , [[Strict]] : true , [[ThisValue]] : empty }を返す。
6.2.6 Property Descriptor仕様型
Property Descriptor 型は、オブジェクトプロパティ属性の操作や具現化を説明するために使われます。Property Descriptorは0個以上のフィールドを持つRecord であり、各フィールド名は属性名、値は6.1.7.1 で指定された属性値です。仕様内でProperty Descriptor Record をリテラル記述する際のスキーマ名は「PropertyDescriptor」です。
Property Descriptor値は、特定のフィールドの存在や使用に基づきデータProperty DescriptorとアクセサProperty Descriptorに分類できます。[[Value]] または[[Writable]] フィールドがあるものはデータProperty Descriptor、[[Get]] または[[Set]] フィールドがあるものはアクセサProperty Descriptorです。全てのProperty Descriptorは[[Enumerable]] や[[Configurable]] フィールドを持てます。Property Descriptor値はデータProperty DescriptorとアクセサProperty Descriptorの両方になることはできませんが、どちらでもない場合もあり(その場合は汎用Property Descriptor)、完全なProperty Descriptor はアクセサまたはデータProperty Descriptorのいずれかで、かつ対応する全フィールドがTable 3 で定義されているものです。
この仕様でProperty Descriptor値を操作するために使われる抽象操作 は以下の通りです:
6.2.6.1 IsAccessorDescriptor ( Desc )
The abstract operation IsAccessorDescriptor takes argument Desc (Property Descriptor ) and returns 真偽値. It performs the following steps when called:
Desc が[[Get]] フィールドを持つならtrue を返す。Desc が[[Set]] フィールドを持つならtrue を返す。false を返す。
6.2.6.2 IsDataDescriptor ( Desc )
The abstract operation IsDataDescriptor takes argument Desc (Property Descriptor ) and returns 真偽値. It performs the following steps when called:
Desc が[[Value]] フィールドを持つならtrue を返す。Desc が[[Writable]] フィールドを持つならtrue を返す。false を返す。
6.2.6.3 IsGenericDescriptor ( Desc )
The abstract operation IsGenericDescriptor takes argument Desc (Property Descriptor ) and returns 真偽値. It performs the following steps when called:
IsAccessorDescriptor (Desc )がtrue ならfalse を返す。IsDataDescriptor (Desc )がtrue ならfalse を返す。true を返す。
6.2.6.4 FromPropertyDescriptor ( Desc )
The abstract operation FromPropertyDescriptor takes argument Desc (Property Descriptor またはundefined ) and returns Objectまたはundefined . It performs the following steps when called:
Desc がundefined ならundefined を返す。obj をOrdinaryObjectCreate (%Object.prototype% )とする。アサート:obj は自身プロパティを持たない拡張可能な通常オブジェクト 。 Desc が[[Value]] フィールドを持つなら! CreateDataPropertyOrThrow (obj , "value" , Desc .[[Value]] )を実行する。 Desc が[[Writable]] フィールドを持つなら! CreateDataPropertyOrThrow (obj , "writable" , Desc .[[Writable]] )を実行する。 Desc が[[Get]] フィールドを持つなら! CreateDataPropertyOrThrow (obj , "get" , Desc .[[Get]] )を実行する。 Desc が[[Set]] フィールドを持つなら! CreateDataPropertyOrThrow (obj , "set" , Desc .[[Set]] )を実行する。 Desc が[[Enumerable]] フィールドを持つなら! CreateDataPropertyOrThrow (obj , "enumerable" , Desc .[[Enumerable]] )を実行する。 Desc が[[Configurable]] フィールドを持つなら! CreateDataPropertyOrThrow (obj , "configurable" , Desc .[[Configurable]] )を実行する。 obj を返す。
6.2.6.5 ToPropertyDescriptor ( Obj )
The abstract operation ToPropertyDescriptor takes argument Obj (ECMAScript言語値 ) and returns normal completion (Property Descriptor 含む)またはthrow completion . It performs the following steps when called:
Obj がObjectでなければTypeError 例外を投げる。desc をフィールドなしの新しいProperty Descriptor とする。hasEnumerable を? HasProperty (Obj , "enumerable" )とする。hasEnumerable がtrue ならenumerable をToBoolean (? Get (Obj , "enumerable" ))とする。desc .[[Enumerable]] にenumerable を設定する。hasConfigurable を? HasProperty (Obj , "configurable" )とする。hasConfigurable がtrue ならconfigurable をToBoolean (? Get (Obj , "configurable" ))とする。desc .[[Configurable]] にconfigurable を設定する。hasValue を? HasProperty (Obj , "value" )とする。hasValue がtrue ならvalue を? Get (Obj , "value" )とする。desc .[[Value]] にvalue を設定する。hasWritable を? HasProperty (Obj , "writable" )とする。hasWritable がtrue ならwritable をToBoolean (? Get (Obj , "writable" ))とする。desc .[[Writable]] にwritable を設定する。hasGet を? HasProperty (Obj , "get" )とする。hasGet がtrue ならgetter を? Get (Obj , "get" )とする。IsCallable (getter )がfalse かつgetter がundefined でなければTypeError 例外を投げる。desc .[[Get]] にgetter を設定する。hasSet を? HasProperty (Obj , "set" )とする。hasSet がtrue ならsetter を? Get (Obj , "set" )とする。IsCallable (setter )がfalse かつsetter がundefined でなければTypeError 例外を投げる。desc .[[Set]] にsetter を設定する。desc が[[Get]] フィールドを持つ、または[[Set]] フィールドを持つならdesc が[[Value]] フィールドを持つ、または[[Writable]] フィールドを持つならTypeError 例外を投げる。desc を返す。
6.2.6.6 CompletePropertyDescriptor ( Desc )
The abstract operation CompletePropertyDescriptor takes argument Desc (Property Descriptor ) and returns unused . It performs the following steps when called:
like をRecord { [[Value]] : undefined , [[Writable]] : false , [[Get]] : undefined , [[Set]] : undefined , [[Enumerable]] : false , [[Configurable]] : false }とする。IsGenericDescriptor (Desc )がtrue またはIsDataDescriptor (Desc )がtrue ならDesc が[[Value]] フィールドを持たなければDesc .[[Value]] にlike .[[Value]] を設定する。Desc が[[Writable]] フィールドを持たなければDesc .[[Writable]] にlike .[[Writable]] を設定する。それ以外の場合Desc が[[Get]] フィールドを持たなければDesc .[[Get]] にlike .[[Get]] を設定する。Desc が[[Set]] フィールドを持たなければDesc .[[Set]] にlike .[[Set]] を設定する。 Desc が[[Enumerable]] フィールドを持たなければDesc .[[Enumerable]] にlike .[[Enumerable]] を設定する。Desc が[[Configurable]] フィールドを持たなければDesc .[[Configurable]] にlike .[[Configurable]] を設定する。unused を返す。
6.2.7 Environment Record仕様型
Environment Record 型は、入れ子関数やブロックにおける名前解決の動作を説明するために使われます。この型および操作は9.1 で定義されています。
6.2.8 Abstract Closure仕様型
Abstract Closure 仕様型は、アルゴリズム手順と値の集合をまとめて参照するために使われます。Abstract Closureはメタ値であり、closure (arg1 , arg2 )のような関数適用スタイルで呼び出されます。抽象操作 と同様、呼び出しではAbstract Closureで記述されたアルゴリズム手順を実行します。
Abstract Closureを生成するアルゴリズム手順では、"capture"という動詞とエイリアスのリストで値をキャプチャします。Abstract Closure生成時には各エイリアスに関連付けられた値をキャプチャします。Abstract Closureの呼び出しで実行されるアルゴリズム手順には、キャプチャした値をエイリアス名で参照します。
Abstract ClosureがCompletion Record を返す場合、それはnormal completion またはthrow completion でなければなりません。
Abstract Closureは他のアルゴリズムの一部としてインラインで生成され、次の例のように表されます。
addend を41とする。closure をパラメータ(x )でaddend をキャプチャし、呼び出し時に次の手順を実行する新しいAbstract Closure とする:x + addend を返す。val をclosure (1)とする。アサート:val は42である。
6.2.9 Data Block
Data Block 仕様型は、個別かつ可変なバイトサイズ(8ビット)の数値値の列を説明するために使われます。バイト値 は0から255までの整数 です。Data Block値は、各バイトの初期値が0である固定サイズのバイト数で作成されます。
記法上の便宜として、Data Block値の個々のバイトへのアクセスには配列風の構文が使えます。この記法は、Data Block値を0ベースのinteger-indexed なバイトの列として表現します。例えば、db が5バイトのData Block値の場合、db [2]で3番目のバイトにアクセスできます。
複数のエージェントが同時に参照可能なメモリ上のデータブロックはShared Data Block と呼ばれます。Shared Data Blockは同一性(Shared Data Block値の等価性判定のため)はアドレス非依存 です。つまり、ブロックがどの仮想アドレスにマップされているかではなく、そのブロックが表すメモリ位置集合に結びついています。2つのデータブロックは、含む位置集合が等しい場合のみ等価であり、そうでなければ等価ではなく、位置集合の共通部分は空です。Shared Data BlockはData Blockと区別されます。
Shared Data Blockの意味論は、メモリモデルによるShared Data Blockイベントを使って定義されます。以下の抽象操作 はShared Data Blockイベントを導入し、評価意味論とメモリモデルのイベント意味論のインターフェースとなります。イベントは候補実行を形成し、メモリモデルがそれにフィルタをかけます。完全な意味論についてはメモリモデルを参照してください。
Shared Data BlockイベントはRecord でモデル化され、メモリモデルで定義されています。
この仕様でData Block値を操作するために使われる抽象操作 は以下の通りです:
6.2.9.1 CreateByteDataBlock ( size )
The abstract operation CreateByteDataBlock takes argument size (非負整数 ) and returns normal completion (Data Block 含む)またはthrow completion . It performs the following steps when called:
size > 253 - 1ならRangeError 例外を投げる。db をsize バイトからなる新しいData Block 値とする。作成不可能ならRangeError 例外を投げる。db の全バイトを0に設定する。db を返す。
6.2.9.2 CreateSharedByteDataBlock ( size )
The abstract operation CreateSharedByteDataBlock takes argument size (非負整数 ) and returns normal completion (Shared Data Block 含む)またはthrow completion . It performs the following steps when called:
db をsize バイトからなる新しいShared Data Block 値とする。作成不可能ならRangeError 例外を投げる。execution を周囲エージェントのAgent Record の[[CandidateExecution]] フィールドとする。eventsRecord をagent のAgent Events Record (execution .[[EventsRecords]] 中で[[AgentSignifier]] がAgentSignifier ()となるもの)とする。zero を« 0 »とする。db の各インデックスi について:WriteSharedMemory { [[Order]] : init , [[NoTear]] : true , [[Block]] : db , [[ByteIndex]] : i , [[ElementSize]] : 1, [[Payload]] : zero }をeventsRecord .[[EventList]] に追加する。db を返す。
6.2.9.3 CopyDataBlockBytes ( toBlock , toIndex , fromBlock , fromIndex , count )
The abstract operation CopyDataBlockBytes takes arguments toBlock (Data Block またはShared Data Block ), toIndex (非負整数 ), fromBlock (Data Block またはShared Data Block ), fromIndex (非負整数 ), and count (非負整数 ) and returns unused . It performs the following steps when called:
fromBlock とtoBlock が異なる値であることをアサートする。fromSize をfromBlock のバイト数とする。fromIndex + count ≤ fromSize をアサートする。toSize をtoBlock のバイト数とする。toIndex + count ≤ toSize をアサートする。count > 0の間、繰り返す:fromBlock がShared Data Block の場合execution を周囲エージェントのAgent Record の[[CandidateExecution]] フィールドとする。eventsRecord をagent のAgent Events Record (execution .[[EventsRecords]] 中で[[AgentSignifier]] がAgentSignifier ()となるもの)とする。bytes を、非決定的に選ばれたバイト値 を唯一の要素とするList とする。注:実装では、bytes は基底ハードウェアで非アトミックな読込命令の結果。非決定性は、弱い一貫性ハードウェアの観測可能挙動を記述するメモリモデルの意味論的規定。 readEvent をReadSharedMemory { [[Order]] : unordered , [[NoTear]] : true , [[Block]] : fromBlock , [[ByteIndex]] : fromIndex , [[ElementSize]] : 1 }とする。readEvent をeventsRecord .[[EventList]] に追加する。Chosen Value Record { [[Event]] : readEvent , [[ChosenValue]] : bytes }をexecution .[[ChosenValues]] に追加する。toBlock がShared Data Block ならWriteSharedMemory { [[Order]] : unordered , [[NoTear]] : true , [[Block]] : toBlock , [[ByteIndex]] : toIndex , [[ElementSize]] : 1, [[Payload]] : bytes }をeventsRecord .[[EventList]] に追加する。それ以外の場合toBlock [toIndex ]にbytes [0]を設定する。 それ以外の場合toBlock がShared Data Block でないことをアサートする。toBlock [toIndex ]にfromBlock [fromIndex ]を設定する。 toIndex をtoIndex + 1に設定する。fromIndex をfromIndex + 1に設定する。count をcount - 1に設定する。unused を返す。
6.2.10 PrivateElement仕様型
PrivateElement型は、privateクラスフィールド・メソッド・アクセサの仕様で使用されるRecord です。Property Descriptor はprivate要素には使われませんが、privateフィールドは非設定可能・非列挙・書き込み可能なデータプロパティ 、privateメソッドは非設定可能・非列挙・非書き込み可能なデータプロパティ 、privateアクセサは非設定可能・非列挙なアクセサプロパティ と同様に振る舞います。
PrivateElement型の値は、Table 9 で定義されたフィールドを持つRecord 値です。これらの値はPrivateElement と呼ばれます。
Table 9: PrivateElement フィールド
フィールド名
[[Kind]] フィールドが存在する場合の値
値
意味
[[Key]]
全て
Private Name
フィールド・メソッド・アクセサの名前。
[[Kind]]
全て
field 、method 、accessor
要素の種類。
[[Value]]
field とmethod
ECMAScript言語値
フィールドの値。
[[Get]]
accessor
関数オブジェクト またはundefined
privateアクセサのgetter。
[[Set]]
accessor
関数オブジェクト またはundefined
privateアクセサのsetter。
6.2.11 ClassFieldDefinition Record仕様型
ClassFieldDefinition型はクラスフィールドの仕様で使用されるRecord です。
ClassFieldDefinition型の値は、Table 10 で定義されたフィールドを持つRecord 値です。これらの値はClassFieldDefinition Record と呼ばれます。
Table 10: ClassFieldDefinition Record フィールド
フィールド名
値
意味
[[Name]]
Private Name 、String、Symbol
フィールドの名前。
[[Initializer]]
ECMAScript関数オブジェクト またはempty
フィールドの初期化子(あれば)。
6.2.12 Private Name
Private Name 仕様型は、他のPrivate Nameと区別される(たとえ他と区別できない場合でも)グローバルに一意な値を表し、privateクラス要素(フィールド・メソッド・アクセサ)のキーとなります。各Private Nameは不変な[[Description]] 内部スロットを持ち、値はStringです。Private NameはECMAScriptオブジェクトにPrivateFieldAdd またはPrivateMethodOrAccessorAdd でインストールでき、PrivateGet やPrivateSet で読み書きできます。
6.2.13 ClassStaticBlockDefinition Record仕様型
ClassStaticBlockDefinition Record は、クラスのstatic初期化ブロック用実行コードをカプセル化するRecord 値です。
ClassStaticBlockDefinition RecordはTable 11 で挙げられるフィールドを持ちます。
Table 11: ClassStaticBlockDefinition Record フィールド
7 抽象操作
これらの操作はECMAScript言語の一部ではなく、ECMAScript言語の意味論を仕様化する助けのためだけにここで定義される。その他、より専門的な抽象操作 は本仕様全体で定義されている。
7.1 型変換
ECMAScript言語は必要に応じて暗黙的な自動型変換を行う。特定の構文要素の意味論を明確化するため、変換用の抽象操作 集合を定義すると便利である。変換抽象操作 は多態的であり、任意のECMAScript言語型 の値を受け取ることができる。ただし他の仕様型はこれらの操作では使用しない。
BigInt型 はECMAScript言語において暗黙の変換を持たない。プログラマは他の型から値を変換する際に明示的にBigIntを呼び出す必要がある。
7.1.1
ToPrimitive (
input : ECMAScript言語値,
省略可能 preferredType : string または number ,
): ECMAScript言語値を含む normal completion あるいは throw completion
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. input 引数を非 Object 型へ変換する。オブジェクトが複数の基本型へ変換可能な場合、オプションのヒント preferredType を使ってその型を優先できる。 It performs the following steps when called:
input が Object であるならexoticToPrim を ? GetMethod (input , %Symbol.toPrimitive% ) とする。exoticToPrim が undefined でないならpreferredType が存在しないならhint を "default" とする。そうでなく preferredType が string ならhint を "string" とする。 それ以外アサート: preferredType は number である。 hint を "number" とする。 result を ? Call(exoticToPrim , input , « hint ») とする。result が Object でないなら result を返す。TypeError 例外を投げる。preferredType が存在しないなら preferredType を number とする。? OrdinaryToPrimitive (input , preferredType ) を返す。 input を返す。
Note
ヒントなしで ToPrimitive が呼び出された場合、一般的にはヒントが number であったかのように振る舞う。しかし、オブジェクトは %Symbol.toPrimitive% メソッドを定義することでこの挙動を上書きできる。本仕様で定義されるオブジェクトのうち既定の ToPrimitive 挙動を上書きするのは Date(21.4.4.45 参照)と Symbol オブジェクト(20.4.3.5 参照)のみである。Date はヒント不在を string として扱う。
7.1.1.1 OrdinaryToPrimitive ( O , hint )
The abstract operation OrdinaryToPrimitive takes arguments O (Object) and hint (string または number ) and returns ECMAScript言語値 を含む normal completion あるいは throw completion . It performs the following steps when called:
hint が string ならmethodNames を « "toString" , "valueOf" » とする。それ以外methodNames を « "valueOf" , "toString" » とする。 methodNames の各要素 name についてmethod を ? Get (O , name ) とする。IsCallable (method ) が true ならresult を ? Call(method , O ) とする。result が Object でないなら result を返す。TypeError 例外を投げる。
7.1.2 ToBoolean ( argument )
The abstract operation ToBoolean takes argument argument (ECMAScript言語値 ) and returns Boolean. argument を Boolean 型の値へ変換する。 It performs the following steps when called:
argument が Boolean なら argument を返す。argument が undefined , null , +0 𝔽 , -0 𝔽 , NaN , 0 ℤ , または空文字列のいずれかなら false を返す。Normative Optional
ホスト が Web ブラウザまたは [[IsHTMLDDA]] 内部スロット をサポートする場合argument が Object でかつ [[IsHTMLDDA]] 内部スロットを持つなら false を返す。true を返す。
7.1.3 ToNumeric ( value )
The abstract operation ToNumeric takes argument value (ECMAScript言語値 ) and returns Number または BigInt を含む normal completion あるいは throw completion . value を Number か BigInt に変換して返す。 It performs the following steps when called:
primValue を ? ToPrimitive(value , number ) とする。primValue が BigInt なら primValue を返す。? ToNumber (primValue ) を返す。
7.1.4 ToNumber ( argument )
The abstract operation ToNumber takes argument argument (ECMAScript言語値 ) and returns Number を含む normal completion あるいは throw completion . argument を Number 型の値へ変換する。 It performs the following steps when called:
argument が Number なら argument を返す。argument が Symbol か BigInt のいずれかなら TypeError 例外を投げる。argument が undefined なら NaN を返す。argument が null または false なら +0 𝔽 を返す。argument が true なら 1 𝔽 を返す。argument が String なら StringToNumber (argument ) を返す。アサート: argument は Object である。 primValue を ? ToPrimitive(argument , number ) とする。アサート: primValue は Object でない。 ? ToNumber (primValue ) を返す。
7.1.4.1 文字列型への ToNumber の適用
抽象操作 StringToNumber は次の文法を用いて String 値を Number 値へ変換する方法を規定する。
構文
StringNumericLiteral :::
StrWhiteSpace opt
StrWhiteSpace opt
StrNumericLiteral
StrWhiteSpace opt
StrWhiteSpace :::
StrWhiteSpaceChar
StrWhiteSpace opt
StrWhiteSpaceChar :::
WhiteSpace
LineTerminator
StrNumericLiteral :::
StrDecimalLiteral
NonDecimalIntegerLiteral [~Sep]
StrDecimalLiteral :::
StrUnsignedDecimalLiteral
+
StrUnsignedDecimalLiteral
-
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral :::
Infinity
DecimalDigits [~Sep]
.
DecimalDigits [~Sep] opt
ExponentPart [~Sep] opt
.
DecimalDigits [~Sep]
ExponentPart [~Sep] opt
DecimalDigits [~Sep]
ExponentPart [~Sep] opt
上で明示的に定義されていない文法記号は数値リテラルの字句文法(12.9.3 )で用いられる定義を持つ。
Note
7.1.4.1.1 StringToNumber ( str )
The abstract operation StringToNumber takes argument str (String) and returns Number. It performs the following steps when called:
literal を ParseText(str , StringNumericLiteral ) とする。literal がエラーの List なら NaN を返す。literal の StringNumericValue を返す。
7.1.4.1.2 実行時意味論: StringNumericValue : Number
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
StringNumericLiteral を Number 値へ変換することは、NumericLiteral の NumericValue の決定(12.9.3 参照)と全体として類似するが、いくつか詳細は異なる。
It is defined piecewise over the following productions:
StringNumericLiteral ::: StrWhiteSpace opt
+0 𝔽 を返す。
StringNumericLiteral :::
StrWhiteSpace opt
StrNumericLiteral
StrWhiteSpace opt
StrNumericLiteral の StringNumericValue を返す。
StrNumericLiteral ::: NonDecimalIntegerLiteral
𝔽 (NonDecimalIntegerLiteral の MV) を返す。
StrDecimalLiteral :::
-
StrUnsignedDecimalLiteral
a を StrUnsignedDecimalLiteral の StringNumericValue とする。a が +0 𝔽 なら -0 𝔽 を返す。-a を返す。
StrUnsignedDecimalLiteral ::: Infinity
+∞ 𝔽 を返す。
StrUnsignedDecimalLiteral :::
DecimalDigits
.
DecimalDigits opt
ExponentPart opt
a を最初の DecimalDigits の MV とする。2番目の DecimalDigits が存在するならb を2番目の DecimalDigits の MV とする。n を2番目の DecimalDigits のコードポイント数とする。 それ以外b を 0 とする。n を 0 とする。 ExponentPart が存在するなら e を ExponentPart の MV とし、そうでなければ e を 0 とする。RoundMVResult ((a + (b × 10-n )) × 10e ) を返す。
StrUnsignedDecimalLiteral :::
.
DecimalDigits
ExponentPart opt
b を DecimalDigits の MV とする。ExponentPart が存在するなら e を ExponentPart の MV とし、そうでなければ e を 0 とする。n を DecimalDigits のコードポイント数とする。RoundMVResult (b × 10e - n ) を返す。
StrUnsignedDecimalLiteral :::
DecimalDigits
ExponentPart opt
a を DecimalDigits の MV とする。ExponentPart が存在するなら e を ExponentPart の MV とし、そうでなければ e を 0 とする。RoundMVResult (a × 10e ) を返す。
7.1.4.1.3 RoundMVResult ( n )
The abstract operation RoundMVResult takes argument n (数学的値) and returns Number. n を実装依存の方法で Number に変換する。この抽象操作 において、桁は 0 でないか左側に 0 でない桁があり右側にも 0 でない桁がある場合に有効とみなされる。また「数学的値の表現が表す数学的値」とは「数学的値の10進表現」の逆写像とする。 It performs the following steps when called:
n の10進表現が有効桁20桁以下なら 𝔽 (n ) を返す。option1 を n の10進表現において20桁目より後の各有効桁を 0 に置き換えた表現が表す数学的値とする。option2 を n の10進表現において20桁目より後の各有効桁を 0 に置き換え、20桁目を(必要なら桁上げしつつ)インクリメントした表現が表す数学的値とする。chosen を実装依存に option1 または option2 から選ぶ。𝔽 (chosen ) を返す。
7.1.5 ToIntegerOrInfinity ( argument )
The abstract operation ToIntegerOrInfinity takes argument argument (ECMAScript言語値 ) and returns 整数 , +∞, -∞ のいずれかを含む normal completion あるいは throw completion . argument を Number 値の小数部分切り捨て表現の整数 、またはその Number 値が無限大の場合は +∞ / -∞ に変換する。 It performs the following steps when called:
number を ? ToNumber (argument ) とする。number が NaN , +0 𝔽 , -0 𝔽 のいずれかなら 0 を返す。number が +∞ 𝔽 なら +∞ を返す。number が -∞ 𝔽 なら -∞ を返す。truncate (ℝ (number )) を返す。
Note
𝔽 (ToIntegerOrInfinity(
x )) はいかなる
x に対しても
-0 𝔽 を返さない。小数部の切り捨ては
x を数学的値に変換した後に行われる。
7.1.6 ToInt32 ( argument )
The abstract operation ToInt32 takes argument argument (ECMAScript言語値 ) and returns 整数 Number を含む normal completion あるいは throw completion . argument を 𝔽 (-231 ) から 𝔽 (231 - 1) までの 232 個の整数 Number 値のいずれかに変換する。 It performs the following steps when called:
number を ? ToNumber (argument ) とする。number が有限 でない、または +0 𝔽 か -0 𝔽 のいずれかなら +0 𝔽 を返す。int を truncate (ℝ (number )) とする。int32bit を int modulo 232 とする。int32bit ≥ 231 なら 𝔽 (int32bit - 232 ) を返し、そうでなければ 𝔽 (int32bit ) を返す。
Note
上記 ToInt32 定義により:
ToInt32 抽象操作 は冪等であり、その結果に再適用しても値は変わらない。
全ての x について ToInt32(ToUint32 (x )) は ToInt32(x ) と同じ値。(この性質を保つため +∞ 𝔽 と -∞ 𝔽 は +0 𝔽 に写る。)
ToInt32 は -0 𝔽 を +0 𝔽 に写す。
7.1.7 ToUint32 ( argument )
The abstract operation ToUint32 takes argument argument (ECMAScript言語値 ) and returns 整数 Number を含む normal completion あるいは throw completion . argument を +0 𝔽 から 𝔽 (232 - 1) までの 232 個の整数 Number 値のいずれかに変換する。 It performs the following steps when called:
number を ? ToNumber (argument ) とする。number が有限 でない、または +0 𝔽 か -0 𝔽 のいずれかなら +0 𝔽 を返す。int を truncate (ℝ (number )) とする。int32bit を int modulo 232 とする。𝔽 (int32bit ) を返す。
Note
上記 ToUint32 定義により:
ステップ 5 が ToUint32 と ToInt32 の唯一の差異。
ToUint32 抽象操作 は冪等である。
全ての x について ToUint32(ToInt32 (x )) は ToUint32(x ) と同じ値。(この性質を保つため +∞ 𝔽 と -∞ 𝔽 は +0 𝔽 に写る。)
ToUint32 は -0 𝔽 を +0 𝔽 に写す。
7.1.8 ToInt16 ( argument )
The abstract operation ToInt16 takes argument argument (ECMAScript言語値 ) and returns 整数 Number を含む normal completion あるいは throw completion . argument を 𝔽 (-215 ) から 𝔽 (215 - 1) までの 216 個の整数 Number 値のいずれかに変換する。 It performs the following steps when called:
number を ? ToNumber (argument ) とする。number が有限 でない、または +0 𝔽 か -0 𝔽 のいずれかなら +0 𝔽 を返す。int を truncate (ℝ (number )) とする。int16bit を int modulo 216 とする。int16bit ≥ 215 なら 𝔽 (int16bit - 216 ) を返し、そうでなければ 𝔽 (int16bit ) を返す。
7.1.9 ToUint16 ( argument )
The abstract operation ToUint16 takes argument argument (ECMAScript言語値 ) and returns 整数 Number を含む normal completion あるいは throw completion . argument を +0 𝔽 から 𝔽 (216 - 1) までの 216 個の整数 Number 値のいずれかに変換する。 It performs the following steps when called:
number を ? ToNumber (argument ) とする。number が有限 でない、または +0 𝔽 か -0 𝔽 のいずれかなら +0 𝔽 を返す。int を truncate (ℝ (number )) とする。int16bit を int modulo 216 とする。𝔽 (int16bit ) を返す。
Note
上記 ToUint16 定義により:
ステップ 4 における 216 の代入が ToUint32 との唯一の差異。
ToUint16 は -0 𝔽 を +0 𝔽 に写す。
7.1.10 ToInt8 ( argument )
The abstract operation ToInt8 takes argument argument (ECMAScript言語値 ) and returns 整数 Number を含む normal completion あるいは throw completion . argument を -128 𝔽 から 127 𝔽 までの 28 個の整数 Number 値のいずれかに変換する。 It performs the following steps when called:
number を ? ToNumber (argument ) とする。number が有限 でない、または +0 𝔽 か -0 𝔽 のいずれかなら +0 𝔽 を返す。int を truncate (ℝ (number )) とする。int8bit を int modulo 28 とする。int8bit ≥ 27 なら 𝔽 (int8bit - 28 ) を返し、そうでなければ 𝔽 (int8bit ) を返す。
7.1.11 ToUint8 ( argument )
The abstract operation ToUint8 takes argument argument (ECMAScript言語値 ) and returns 整数 Number を含む normal completion あるいは throw completion . argument を +0 𝔽 から 255 𝔽 までの 28 個の整数 Number 値のいずれかに変換する。 It performs the following steps when called:
number を ? ToNumber (argument ) とする。number が有限 でない、または +0 𝔽 か -0 𝔽 のいずれかなら +0 𝔽 を返す。int を truncate (ℝ (number )) とする。int8bit を int modulo 28 とする。𝔽 (int8bit ) を返す。
7.1.12 ToUint8Clamp ( argument )
The abstract operation ToUint8Clamp takes argument argument (ECMAScript言語値 ) and returns 整数 Number を含む normal completion あるいは throw completion . argument を +0 𝔽 から 255 𝔽 の範囲に丸め及びクランプし 28 個の整数 Number 値のいずれかにする。 It performs the following steps when called:
number を ? ToNumber (argument ) とする。number が NaN なら +0 𝔽 を返す。mv を number の拡張数学的値とする。clamped を mv を 0 と 255 の間にクランプした結果とする。f を floor (clamped ) とする。clamped < f + 0.5 なら 𝔽 (f ) を返す。clamped > f + 0.5 なら 𝔽 (f + 1) を返す。f が偶数なら 𝔽 (f ) を返し、そうでなければ 𝔽 (f + 1) を返す。
Note
他の多くの整数 変換操作と異なり ToUint8Clamp は非整数 値を切り捨てではなく丸める。また “round half to even” であり Math.round
の “round half up” とは異なる。
7.1.13 ToBigInt ( argument )
The abstract operation ToBigInt takes argument argument (ECMAScript言語値 ) and returns BigInt を含む normal completion あるいは throw completion . argument を BigInt 値へ変換する。Number からの暗黙変換が必要となる場合は例外を投げる。 It performs the following steps when called:
prim を ? ToPrimitive(argument , number ) とする。Table 12 において prim が対応する値を返す。
Table 12: BigInt 変換
引数型
結果
Undefined
TypeError 例外を投げる。
Null
TypeError 例外を投げる。
Boolean
prim が true なら 1n
を、prim が false なら 0n
を返す。
BigInt
prim を返す。
Number
TypeError 例外を投げる。
String
n を StringToBigInt (prim ) とする。n が undefined なら SyntaxError 例外を投げる。n を返す。
Symbol
TypeError 例外を投げる。
7.1.14 StringToBigInt ( str )
The abstract operation StringToBigInt takes argument str (String) and returns BigInt または undefined . It performs the following steps when called:
literal を ParseText(str , StringIntegerLiteral ) とする。literal がエラーの List なら undefined を返す。mv を literal の MV とする。アサート: mv は整数 。 ℤ (mv ) を返す。
7.1.14.1 StringIntegerLiteral 文法
StringToBigInt は以下の文法を用いる。
構文
StringIntegerLiteral :::
StrWhiteSpace opt
StrWhiteSpace opt
StrIntegerLiteral
StrWhiteSpace opt
StrIntegerLiteral :::
SignedInteger [~Sep]
NonDecimalIntegerLiteral [~Sep]
7.1.14.2 実行時意味論: MV
7.1.15 ToBigInt64 ( argument )
The abstract operation ToBigInt64 takes argument argument (ECMAScript言語値 ) and returns BigInt を含む normal completion あるいは throw completion . argument を ℤ (-263 ) から ℤ (263 - 1) までの 264 個の BigInt 値のいずれかに変換する。 It performs the following steps when called:
n を ? ToBigInt (argument ) とする。int64bit を ℝ (n ) modulo 264 とする。int64bit ≥ 263 なら ℤ (int64bit - 264 ) を返し、そうでなければ ℤ (int64bit ) を返す。
7.1.16 ToBigUint64 ( argument )
The abstract operation ToBigUint64 takes argument argument (ECMAScript言語値 ) and returns BigInt を含む normal completion あるいは throw completion . argument を 0 ℤ から ℤ (264 - 1) までの 264 個の BigInt 値のいずれかに変換する。 It performs the following steps when called:
n を ? ToBigInt (argument ) とする。int64bit を ℝ (n ) modulo 264 とする。ℤ (int64bit ) を返す。
7.1.17 ToString ( argument )
The abstract operation ToString takes argument argument (ECMAScript言語値 ) and returns String を含む normal completion あるいは throw completion . argument を String 型の値へ変換する。 It performs the following steps when called:
argument が String なら argument を返す。argument が Symbol なら TypeError 例外を投げる。argument が undefined なら "undefined" を返す。argument が null なら "null" を返す。argument が true なら "true" を返す。argument が false なら "false" を返す。argument が Number なら Number::toString (argument , 10) を返す。argument が BigInt なら BigInt::toString (argument , 10) を返す。アサート: argument は Object である。 primValue を ? ToPrimitive(argument , string ) とする。アサート: primValue は Object でない。 ? ToString (primValue ) を返す。
7.1.18 ToObject ( argument )
The abstract operation ToObject takes argument argument (ECMAScript言語値 ) and returns Object を含む normal completion あるいは throw completion . argument を Object 型の値へ変換する。 It performs the following steps when called:
argument が undefined または null のいずれかなら TypeError 例外を投げる。argument が Boolean なら [[BooleanData]] 内部スロットに argument を設定した新しい Boolean オブジェクトを返す。Boolean オブジェクトの説明は 20.3 を参照。argument が Number なら [[NumberData]] 内部スロットに argument を設定した新しい Number オブジェクトを返す。説明は 21.1 参照。argument が String なら [[StringData]] 内部スロットに argument を設定した新しい String オブジェクトを返す。説明は 22.1 参照。argument が Symbol なら [[SymbolData]] 内部スロットに argument を設定した新しい Symbol オブジェクトを返す。説明は 20.4 参照。argument が BigInt なら [[BigIntData]] 内部スロットに argument を設定した新しい BigInt オブジェクトを返す。説明は 21.2 参照。アサート: argument は Object である。 argument を返す。
7.1.19 ToPropertyKey ( argument )
The abstract operation ToPropertyKey takes argument argument (ECMAScript言語値 ) and returns プロパティキー を含む normal completion あるいは throw completion . argument をプロパティキー として使用可能な値へ変換する。 It performs the following steps when called:
key を ? ToPrimitive(argument , string ) とする。key が Symbol ならkey を返す。! ToString (key ) を返す。
7.1.20 ToLength ( argument )
The abstract operation ToLength takes argument argument (ECMAScript言語値 ) and returns 非負整数 Number を含む normal completion あるいは throw completion . argument を配列風オブジェクト の length として適した非負整数 Number にクランプし切り捨てる。 It performs the following steps when called:
len を ? ToIntegerOrInfinity (argument ) とする。len ≤ 0 なら +0 𝔽 を返す。𝔽 (min (len , 253 - 1)) を返す。
7.1.21 CanonicalNumericIndexString ( argument )
The abstract operation CanonicalNumericIndexString takes argument argument (String) and returns Number または undefined . argument が "-0" であるか、ある Number 値 n について ToString (n ) と正確に一致するなら、対応する Number 値を返す。それ以外は undefined を返す。 It performs the following steps when called:
argument が "-0" なら -0 𝔽 を返す。n を ! ToNumber (argument ) とする。! ToString (n ) が argument と等しいなら n を返す。 undefined を返す。
正規数値文字列 とは CanonicalNumericIndexString 抽象操作 が undefined を返さない任意の String のこと。
7.1.22 ToIndex ( value )
The abstract operation ToIndex takes argument value (ECMAScript言語値 ) and returns 非負整数 を含む normal completion あるいは throw completion . value を整数 に変換し、それが非負かつ整数インデックス に対応するならその整数 を返す。そうでなければ例外を投げる。 It performs the following steps when called:
integer を ? ToIntegerOrInfinity (value ) とする。integer が 0 から 253 - 1 までの範囲にないなら RangeError 例外を投げる。integer を返す。
7.2 テストおよび比較操作
7.2.1 RequireObjectCoercible ( argument )
The abstract operation RequireObjectCoercible takes argument argument (ECMAScript言語値 ) and returns unused を含む normal completion あるいは throw completion . argument が ToObject により Object へ変換できない値ならエラーを投げる。 It performs the following steps when called:
argument が undefined または null のいずれかなら TypeError 例外を投げる。unused を返す。
7.2.2 IsArray ( argument )
The abstract operation IsArray takes argument argument (ECMAScript言語値 ) and returns Boolean を含む normal completion あるいは throw completion . It performs the following steps when called:
argument が Object でないなら false を返す。argument が Array エキゾチックオブジェクト なら true を返す。argument が Proxy エキゾチックオブジェクト なら? ValidateNonRevokedProxy (argument ) を実行する。 proxyTarget を argument .[[ProxyTarget]] とする。? IsArray (proxyTarget ) を返す。 false を返す。
7.2.3 IsCallable ( argument )
The abstract operation IsCallable takes argument argument (ECMAScript言語値 ) and returns Boolean. argument が [[Call]] 内部メソッドを持つ呼び出し可能関数か判定する。 It performs the following steps when called:
argument が Object でないなら false を返す。argument が [[Call]] 内部メソッドを持つなら true を返す。false を返す。
7.2.4 IsConstructor ( argument )
The abstract operation IsConstructor takes argument argument (ECMAScript言語値 ) and returns Boolean. argument が [[Construct]] 内部メソッドを持つ関数オブジェクト か判定する。 It performs the following steps when called:
argument が Object でないなら false を返す。argument が [[Construct]] 内部メソッドを持つなら true を返す。false を返す。
7.2.5 IsExtensible ( O )
The abstract operation IsExtensible takes argument O (Object) and returns Boolean を含む normal completion あるいは throw completion . O に追加のプロパティを加えられるか判定する。 It performs the following steps when called:
? O .[[IsExtensible]] () を返す。
7.2.6 IsRegExp ( argument )
The abstract operation IsRegExp takes argument argument (ECMAScript言語値 ) and returns Boolean を含む normal completion あるいは throw completion . It performs the following steps when called:
argument が Object でないなら false を返す。matcher を ? Get (argument , %Symbol.match% ) とする。matcher が undefined でないなら ToBoolean (matcher ) を返す。argument が [[RegExpMatcher]] 内部スロットを持つなら true を返す。false を返す。
7.2.7
静的意味論: IsStringWellFormedUnicode (
string : String,
): Boolean
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. string を 6.1.4 に記述される UTF-16 符号化コードポイント列として解釈し、それが well formed な UTF-16 シーケンスか判定する。 It performs the following steps when called:
len を string の長さとする。k を 0 とする。k < len の間繰り返すcp を CodePointAt(string , k ) とする。cp .[[IsUnpairedSurrogate]] が true なら false を返す。k を k + cp .[[CodeUnitCount]] に設定する。true を返す。
7.2.8 SameType ( x , y )
The abstract operation SameType takes arguments x (ECMAScript言語値 ) and y (ECMAScript言語値 ) and returns Boolean. 2つの引数が同じ型かどうか判定する。 It performs the following steps when called:
x が undefined かつ y が undefined なら true を返す。x が null かつ y が null なら true を返す。x が Boolean かつ y が Boolean なら true を返す。x が Number かつ y が Number なら true を返す。x が BigInt かつ y が BigInt なら true を返す。x が Symbol かつ y が Symbol なら true を返す。x が String かつ y が String なら true を返す。x が Object かつ y が Object なら true を返す。false を返す。
7.2.9 SameValue ( x , y )
The abstract operation SameValue takes arguments x (ECMAScript言語値 ) and y (ECMAScript言語値 ) and returns Boolean. 2つの引数が同じ値かどうか判定する。 It performs the following steps when called:
SameType (x , y ) が false なら false を返す。x が Number ならNumber::sameValue (x , y ) を返す。SameValueNonNumber (x , y ) を返す。
Note
このアルゴリズムは NaN 値を同等とみなし +0 𝔽 と -0 𝔽 を区別する点で IsStrictlyEqual アルゴリズムと異なる。
7.2.10 SameValueZero ( x , y )
The abstract operation SameValueZero takes arguments x (ECMAScript言語値 ) and y (ECMAScript言語値 ) and returns Boolean. 2つの引数が同じ値か(+0 𝔽 と -0 𝔽 の差異を無視して)判定する。 It performs the following steps when called:
SameType (x , y ) が false なら false を返す。x が Number ならNumber::sameValueZero (x , y ) を返す。SameValueNonNumber (x , y ) を返す。
Note
SameValueZero は +0 𝔽 と -0 𝔽 を同等と扱う点のみ SameValue と異なる。
7.2.11 SameValueNonNumber ( x , y )
The abstract operation SameValueNonNumber takes arguments x (Number でない ECMAScript言語値 ) and y (Number でない ECMAScript言語値 ) and returns Boolean. It performs the following steps when called:
アサート: SameType (x , y ) は true 。 x が undefined または null のいずれかなら true を返す。x が BigInt ならBigInt::equal (x , y ) を返す。x が String ならx と y が同じ長さで同じ位置に同じコードユニットを持つなら true を返し、そうでなければ false を返す。x が Boolean ならx と y がともに true またはともに false なら true を返し、そうでなければ false を返す。注: 他の全ての ECMAScript 言語値は同一性で比較される。 x が y なら true を返し、そうでなければ false を返す。
Note 1
説明のため、一部のケースは必要ではないが個別に扱っている。
Note 2
7.2.12 IsLessThan ( x , y , LeftFirst )
The abstract operation IsLessThan takes arguments x (ECMAScript言語値 ), y (ECMAScript言語値 ), and LeftFirst (Boolean) and returns Boolean または undefined を含む normal completion あるいは throw completion . 比較 x < y の意味論を提供し、true / false / undefined (少なくとも一方が NaN を示す)を返す。LeftFirst フラグは副作用の可視性を伴う操作の順序を制御するために使われ、ECMAScript が左から右への評価順を規定しているため必要。LeftFirst が true のとき x は y より左に現れる式に対応し、false のときは逆でその場合操作は y が先に行われる。 It performs the following steps when called:
LeftFirst が true ならpx を ? ToPrimitive(x , number ) とする。py を ? ToPrimitive(y , number ) とする。それ以外注: 評価順維持のため順序を反転する必要がある。 py を ? ToPrimitive(y , number ) とする。px を ? ToPrimitive(x , number ) とする。 px が String かつ py が String ならlx を px の長さとする。ly を py の長さとする。0 ≤ i < min (lx , ly ) なる各整数 i について昇順でcx を px のインデックス i にあるコードユニットの数値とする。cy を py のインデックス i にあるコードユニットの数値とする。cx < cy なら true を返す。cx > cy なら false を返す。 lx < ly なら true を返し、そうでなければ false を返す。それ以外px が BigInt かつ py が String ならny を StringToBigInt (py ) とする。ny が undefined なら undefined を返す。BigInt::lessThan (px , ny ) を返す。px が String かつ py が BigInt ならnx を StringToBigInt (px ) とする。nx が undefined なら undefined を返す。BigInt::lessThan (nx , py ) を返す。注: px , py はプリミティブなので評価順は重要でない。 nx を ? ToNumeric (px ) とする。ny を ? ToNumeric (py ) とする。SameType (nx , ny ) が true ならnx が Number ならNumber::lessThan (nx , ny ) を返す。それ以外アサート: nx は BigInt。 BigInt::lessThan (nx , ny ) を返す。 アサート: (nx が BigInt かつ ny が Number) または (nx が Number かつ ny が BigInt)。 nx または ny が NaN なら undefined を返す。nx が -∞ 𝔽 または ny が +∞ 𝔽 なら true を返す。nx が +∞ 𝔽 または ny が -∞ 𝔽 なら false を返す。ℝ (nx ) < ℝ (ny ) なら true を返し、そうでなければ false を返す。
Note 1
ステップ 3 は、加算演算子 +
を扱うアルゴリズム(13.15.3 )のステップ 1.c と、論理和ではなく論理積を用いる点で異なる。
Note 2
文字列の比較は UTF-16 コードユニット値列に対する単純な辞書式順序を使用する。Unicode 仕様で定義される文字や文字列の意味的な等価性や照合順序は考慮しない。そのため Unicode Standard 上正規等価だが正規化形式が異なる文字列は不等と判定され得る。またサロゲートペア を含む文字列ではコードユニット順序はコードポイント順序と異なる。
7.2.13 IsLooselyEqual ( x , y )
The abstract operation IsLooselyEqual takes arguments x (ECMAScript言語値 ) and y (ECMAScript言語値 ) and returns Boolean を含む normal completion あるいは throw completion . ==
演算子の意味論を提供する。 It performs the following steps when called:
SameType (x , y ) が true ならIsStrictlyEqual (x , y ) を返す。x が null かつ y が undefined なら true を返す。x が undefined かつ y が null なら true を返す。Normative Optional
ホスト が Web ブラウザまたは [[IsHTMLDDA]] 内部スロット をサポートする場合x が Object で [[IsHTMLDDA]] 内部スロットを持ち、y が undefined または null なら true を返す。x が undefined または null で y が Object かつ [[IsHTMLDDA]] 内部スロットを持つなら true を返す。x が Number かつ y が String なら ! IsLooselyEqual (x , ! ToNumber (y )) を返す。x が String かつ y が Number なら ! IsLooselyEqual (! ToNumber (x ), y ) を返す。x が BigInt かつ y が String ならn を StringToBigInt (y ) とする。n が undefined なら false を返す。! IsLooselyEqual (x , n ) を返す。 x が String かつ y が BigInt なら ! IsLooselyEqual (y , x ) を返す。x が Boolean なら ! IsLooselyEqual (! ToNumber (x ), y ) を返す。y が Boolean なら ! IsLooselyEqual (x , ! ToNumber (y )) を返す。x が String, Number, BigInt, Symbol のいずれかで y が Object なら ! IsLooselyEqual (x , ? ToPrimitive(y )) を返す。x が Object で y が String, Number, BigInt, Symbol のいずれかなら ! IsLooselyEqual (? ToPrimitive(x ), y ) を返す。x が BigInt かつ y が Number, または x が Number かつ y が BigInt ならx が有限 でないまたは y が有限 でないなら false を返す。ℝ (x ) = ℝ (y ) なら true を返し、そうでなければ false を返す。false を返す。
7.2.14 IsStrictlyEqual ( x , y )
The abstract operation IsStrictlyEqual takes arguments x (ECMAScript言語値 ) and y (ECMAScript言語値 ) and returns Boolean. ===
演算子の意味論を提供する。 It performs the following steps when called:
SameType (x , y ) が false なら false を返す。x が Number ならNumber::equal (x , y ) を返す。SameValueNonNumber (x , y ) を返す。
Note
このアルゴリズムは符号付きゼロと NaN の扱いにおいて SameValue アルゴリズムと異なる。
7.3 オブジェクトに対する操作
7.3.1 MakeBasicObject ( internalSlotsList )
The abstract operation MakeBasicObject takes argument internalSlotsList (内部スロット名の List ) and returns Object. 通常オブジェクト とエキゾチックオブジェクト を含む、アルゴリズム的に作られる全ての ECMAScript オブジェクトの起源である。全オブジェクト生成で共通する手順を切り出し、生成を集約する。 It performs the following steps when called:
internalSlotsList を internalSlotsList と « [[PrivateElements]] » のリスト結合 に設定する。internalSlotsList 内の各名前に対応する内部スロットを持つ新規オブジェクト obj を作成する。注: オブジェクトの内部メソッドと内部スロット で述べるように特記ない限り各内部スロットの初期値は undefined 。 obj .[[PrivateElements]] を空の新しい List に設定する。obj の本質的内部メソッドを 10.1 で規定される既定の通常オブジェクト 定義に設定する。アサート: 呼び出し側が obj の [[GetPrototypeOf]] と [[SetPrototypeOf]] の両方を上書きしない場合、internalSlotsList は [[Prototype]] を含む。 アサート: 呼び出し側が obj の [[SetPrototypeOf]] , [[IsExtensible]] , [[PreventExtensions]] の全てを上書きしない場合、internalSlotsList は [[Extensible]] を含む。 internalSlotsList が [[Extensible]] を含むなら obj .[[Extensible]] を true に設定する。obj を返す。
Note
本仕様内でエキゾチックオブジェクト は ArrayCreate や BoundFunctionCreate のような抽象操作 で、まず MakeBasicObject を呼び基本オブジェクトを得てから内部メソッドの一部または全部を上書きして作成される。エキゾチックオブジェクト 生成をカプセル化するため、本質的内部メソッドはそれら操作以外では変更されない。
7.3.2 Get ( O , P )
The abstract operation Get takes arguments O (Object) and P (プロパティキー ) and returns ECMAScript言語値 を含む normal completion あるいは throw completion . オブジェクトの特定プロパティの値を取得するために使用される。 It performs the following steps when called:
? O .[[Get]] (P , O ) を返す。
7.3.3 GetV ( V , P )
The abstract operation GetV takes arguments V (ECMAScript言語値 ) and P (プロパティキー ) and returns ECMAScript言語値 を含む normal completion あるいは throw completion . ECMAScript言語値 の特定プロパティの値を取得するために使用される。値がオブジェクトでない場合、値の型に適切なラッパーオブジェクトを用いてプロパティ探索が行われる。 It performs the following steps when called:
O を ? ToObject (V ) とする。? O .[[Get]] (P , V ) を返す。
7.3.4 Set ( O , P , V , Throw )
The abstract operation Set takes arguments O (Object), P (プロパティキー ), V (ECMAScript言語値 ), and Throw (Boolean) and returns unused を含む normal completion あるいは throw completion . オブジェクトの特定プロパティの値を設定するために用いられる。V は新しい値。 It performs the following steps when called:
success を ? O .[[Set]] (P , V , O ) とする。success が false かつ Throw が true なら TypeError 例外を投げる。unused を返す。
7.3.5 CreateDataProperty ( O , P , V )
The abstract operation CreateDataProperty takes arguments O (Object), P (プロパティキー ), and V (ECMAScript言語値 ) and returns Boolean を含む normal completion あるいは throw completion . オブジェクトの新しい自身プロパティを生成するために使用される。 It performs the following steps when called:
newDesc を PropertyDescriptor { [[Value]] : V , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : true } とする。? O .[[DefineOwnProperty]] (P , newDesc ) を返す。
Note
この抽象操作 は ECMAScript の代入演算子で作られるプロパティと同じ既定属性を持つプロパティを生成する。通常プロパティは未存在であり、存在し非設定可能または O が拡張不可能なら [[DefineOwnProperty]] は false を返す。
7.3.6 CreateDataPropertyOrThrow ( O , P , V )
The abstract operation CreateDataPropertyOrThrow takes arguments O (Object), P (プロパティキー ), and V (ECMAScript言語値 ) and returns unused を含む normal completion あるいは throw completion . オブジェクトの新しい自身プロパティを生成する。要求された更新が行えない場合 TypeError を投げる。 It performs the following steps when called:
success を ? CreateDataProperty (O , P , V ) とする。success が false なら TypeError 例外を投げる。unused を返す。
Note
属性は代入演算子によって生成されるプロパティの既定値と同じ。存在済みで非設定可能または O が拡張不可能なら [[DefineOwnProperty]] は false を返し本操作は TypeError を投げる。
7.3.7 CreateNonEnumerableDataPropertyOrThrow ( O , P , V )
The abstract operation CreateNonEnumerableDataPropertyOrThrow takes arguments O (Object), P (プロパティキー ), and V (ECMAScript言語値 ) and returns unused . 通常オブジェクト の列挙不可な新しい自身プロパティを生成する。 It performs the following steps when called:
アサート: O は非設定可能プロパティを持たない通常で拡張可能なオブジェクト。 newDesc を PropertyDescriptor { [[Value]] : V , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true } とする。! DefinePropertyOrThrow (O , P , newDesc ) を実行する。 unused を返す。
Note
代入演算子既定と同じだが列挙不可。通常存在しないが存在しても DefinePropertyOrThrow は正常完了する。
7.3.8 DefinePropertyOrThrow ( O , P , desc )
The abstract operation DefinePropertyOrThrow takes arguments O (Object), P (プロパティキー ), and desc (Property Descriptor ) and returns unused を含む normal completion あるいは throw completion . オブジェクトの [[DefineOwnProperty]] 内部メソッドを呼び、要求された更新が行えない場合 TypeError を投げる。 It performs the following steps when called:
success を ? O .[[DefineOwnProperty]] (P , desc ) とする。success が false なら TypeError 例外を投げる。unused を返す。
7.3.9 DeletePropertyOrThrow ( O , P )
The abstract operation DeletePropertyOrThrow takes arguments O (Object) and P (プロパティキー ) and returns unused を含む normal completion あるいは throw completion . オブジェクトの特定自身プロパティを削除する。プロパティが設定可能でない場合例外を投げる。 It performs the following steps when called:
success を ? O .[[Delete]] (P ) とする。success が false なら TypeError 例外を投げる。unused を返す。
7.3.10 GetMethod ( V , P )
The abstract operation GetMethod takes arguments V (ECMAScript言語値 ) and P (プロパティキー ) and returns 関数オブジェクト または undefined を含む normal completion あるいは throw completion . プロパティ値が関数であることが期待される場合に ECMAScript 言語値の特定プロパティ値を取得する。 It performs the following steps when called:
func を ? GetV (V , P ) とする。func が undefined または null のいずれかなら undefined を返す。IsCallable (func ) が false なら TypeError 例外を投げる。func を返す。
7.3.11 HasProperty ( O , P )
The abstract operation HasProperty takes arguments O (Object) and P (プロパティキー ) and returns Boolean を含む normal completion あるいは throw completion . オブジェクトが指定キーのプロパティ(自身または継承)を持つか判定する。 It performs the following steps when called:
? O .[[HasProperty]] (P ) を返す。
7.3.12 HasOwnProperty ( O , P )
The abstract operation HasOwnProperty takes arguments O (Object) and P (プロパティキー ) and returns Boolean を含む normal completion あるいは throw completion . オブジェクトが指定キーの自身プロパティを持つか判定する。 It performs the following steps when called:
desc を ? O .[[GetOwnProperty]] (P ) とする。desc が undefined なら false を返す。true を返す。
7.3.13
Call (
F : ECMAScript言語値,
V : ECMAScript言語値,
省略可能 argumentsList : ECMAScript言語値の List,
): ECMAScript言語値を含む normal completion あるいは throw completion
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 関数オブジェクト の [[Call]] 内部メソッドを呼ぶために用いる。F が関数、V が this 値、argumentsList が内部メソッドに渡す引数列。argumentsList が無ければ空の新 List を用いる。 It performs the following steps when called:
argumentsList が存在しないなら argumentsList を空の新 List に設定する。IsCallable (F ) が false なら TypeError 例外を投げる。? F .[[Call]] (V , argumentsList ) を返す。
7.3.14
Construct (
F : constructor,
省略可能 argumentsList : ECMAScript言語値の List,
省略可能 newTarget : constructor,
): Object を含む normal completion あるいは throw completion
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 関数オブジェクト の [[Construct]] 内部メソッドを呼ぶために用いる。argumentsList と newTarget は内部メソッドに対応する引数として渡される。argumentsList が無い場合空の新 List 、newTarget が無い場合 F を用いる。 It performs the following steps when called:
newTarget が存在しないなら newTarget を F に設定する。argumentsList が存在しないなら argumentsList を空の新 List に設定する。? F .[[Construct]] (argumentsList , newTarget ) を返す。
Note
newTarget が無い場合、この操作は new F(...argumentsList)
と同等。
7.3.15 SetIntegrityLevel ( O , level )
The abstract operation SetIntegrityLevel takes arguments O (Object) and level (sealed または frozen ) and returns Boolean を含む normal completion あるいは throw completion . オブジェクトの自身プロパティ集合を固定するために使用。 It performs the following steps when called:
status を ? O .[[PreventExtensions]] () とする。status が false なら false を返す。keys を ? O .[[OwnPropertyKeys]] () とする。level が sealed ならkeys の各要素 k について? DefinePropertyOrThrow (O , k , PropertyDescriptor { [[Configurable]] : false }) を実行する。 それ以外アサート: level は frozen 。 keys の各要素 k についてcurrentDesc を ? O .[[GetOwnProperty]] (k ) とする。currentDesc が undefined でないならIsAccessorDescriptor (currentDesc ) が true ならdesc を PropertyDescriptor { [[Configurable]] : false } とする。それ以外desc を PropertyDescriptor { [[Configurable]] : false , [[Writable]] : false } とする。 ? DefinePropertyOrThrow (O , k , desc ) を実行する。 true を返す。
7.3.16 TestIntegrityLevel ( O , level )
The abstract operation TestIntegrityLevel takes arguments O (Object) and level (sealed または frozen ) and returns Boolean を含む normal completion あるいは throw completion . オブジェクトの自身プロパティ集合が固定されているか判定する。 It performs the following steps when called:
extensible を ? IsExtensible (O ) とする。extensible が true なら false を返す。注: オブジェクトが拡張可能ならプロパティは調べない。 keys を ? O .[[OwnPropertyKeys]] () とする。keys の各要素 k についてcurrentDesc を ? O .[[GetOwnProperty]] (k ) とする。currentDesc が undefined でないならcurrentDesc .[[Configurable]] が true なら false を返す。level が frozen かつ IsDataDescriptor (currentDesc ) が true ならcurrentDesc .[[Writable]] が true なら false を返す。true を返す。
7.3.17 CreateArrayFromList ( elements )
The abstract operation CreateArrayFromList takes argument elements (ECMAScript言語値 の List ) and returns Array. 要素が elements によって与えられる Array を生成する。 It performs the following steps when called:
array を ! ArrayCreate (0) とする。n を 0 とする。elements の各要素 e について! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (n )), e ) を実行する。 n を n + 1 に設定する。array を返す。
7.3.18 LengthOfArrayLike ( obj )
The abstract operation LengthOfArrayLike takes argument obj (Object) and returns 非負整数 を含む normal completion あるいは throw completion . 配列風オブジェクトの "length" プロパティの値を返す。 It performs the following steps when called:
ℝ (? ToLength (? Get (obj , "length" ))) を返す。
配列風オブジェクト とはこの操作が normal completion を返す任意のオブジェクト。
Note 1
通常配列風オブジェクトは
整数インデックス 名プロパティを持つがこの定義の要件ではない。
Note 2
Array と String オブジェクトは配列風オブジェクトの例である。
7.3.19
CreateListFromArrayLike (
obj : ECMAScript言語値,
省略可能 validElementTypes : all または property-key ,
): ECMAScript言語値の List を含む normal completion あるいは throw completion
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. obj のインデックス付きプロパティから要素を取得して List 値を生成する。validElementTypes は要素として許可される値の型を示す。 It performs the following steps when called:
validElementTypes が存在しないなら validElementTypes を all とする。obj が Object でないなら TypeError 例外を投げる。len を ? LengthOfArrayLike (obj ) とする。list を空の新 List とする。index を 0 とする。index < len の間繰り返すindexName を ! ToString (𝔽 (index )) とする。next を ? Get (obj , indexName ) とする。validElementTypes が property-key かつ next がプロパティキー でないなら TypeError 例外を投げる。next を list に追加する。index を index + 1 に設定する。list を返す。
7.3.20
Invoke (
V : ECMAScript言語値,
P : プロパティキー,
省略可能 argumentsList : ECMAScript言語値の List,
): ECMAScript言語値を含む normal completion あるいは throw completion
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. ECMAScript言語値 のメソッドプロパティを呼び出すために用いる。V はプロパティ探索点かつ呼び出しの this 値。argumentsList はメソッドに渡す引数列。省略時は空 List 。 It performs the following steps when called:
argumentsList が存在しないなら argumentsList を空の新 List に設定する。func を ? GetV (V , P ) とする。? Call(func , V , argumentsList ) を返す。
7.3.21 OrdinaryHasInstance ( C , O )
The abstract operation OrdinaryHasInstance takes arguments C (ECMAScript言語値 ) and O (ECMAScript言語値 ) and returns Boolean を含む normal completion あるいは throw completion . O が C により提供されるインスタンスオブジェクト継承パスから継承しているかの既定アルゴリズムを実装する。 It performs the following steps when called:
IsCallable (C ) が false なら false を返す。C が [[BoundTargetFunction]] 内部スロットを持つならBC を C .[[BoundTargetFunction]] とする。? InstanceofOperator (O , BC ) を返す。 O が Object でないなら false を返す。P を ? Get (C , "prototype" ) とする。P が Object でないなら TypeError 例外を投げる。繰り返しO を ? O .[[GetPrototypeOf]] () に設定する。O が null なら false を返す。SameValue (P , O ) が true なら true を返す。
7.3.22 SpeciesConstructor ( O , defaultConstructor )
The abstract operation SpeciesConstructor takes arguments O (Object) and defaultConstructor (constructor) and returns constructor を含む normal completion あるいは throw completion . O から派生する新オブジェクト生成に用いるべきコンストラクタ を取得する。defaultConstructor は %Symbol.species% プロパティが O から辿れない場合に使用するコンストラクタ 。 It performs the following steps when called:
C を ? Get (O , "constructor" ) とする。C が undefined なら defaultConstructor を返す。C が Object でないなら TypeError 例外を投げる。S を ? Get (C , %Symbol.species% ) とする。S が undefined または null のいずれかなら defaultConstructor を返す。IsConstructor (S ) が true なら S を返す。TypeError 例外を投げる。
7.3.23 EnumerableOwnProperties ( O , kind )
The abstract operation EnumerableOwnProperties takes arguments O (Object) and kind (key , value , key+value ) and returns ECMAScript言語値 の List を含む normal completion あるいは throw completion . It performs the following steps when called:
ownKeys を ? O .[[OwnPropertyKeys]] () とする。results を空の新 List とする。ownKeys の各要素 key についてkey が String ならdesc を ? O .[[GetOwnProperty]] (key ) とする。desc が undefined でなく desc .[[Enumerable]] が true ならkind が key ならkey を results に追加する。それ以外value を ? Get (O , key ) とする。kind が value ならvalue を results に追加する。それ以外アサート: kind は key+value 。 entry を CreateArrayFromList (« key , value ») とする。entry を results に追加する。 results を返す。
7.3.24 GetFunctionRealm ( obj )
The abstract operation GetFunctionRealm takes argument obj (関数オブジェクト ) and returns Realm Record を含む normal completion あるいは throw completion . It performs the following steps when called:
obj が [[Realm]] 内部スロットを持つならobj .[[Realm]] を返す。obj が bound function エキゾチックオブジェクト ならboundTargetFunction を obj .[[BoundTargetFunction]] とする。? GetFunctionRealm (boundTargetFunction ) を返す。 obj が Proxy エキゾチックオブジェクト なら? ValidateNonRevokedProxy (obj ) を実行する。 proxyTarget を obj .[[ProxyTarget]] とする。アサート: proxyTarget は関数オブジェクト 。 ? GetFunctionRealm (proxyTarget ) を返す。 現在の Realm Record を返す。
Note
ステップ 4 に到達するのは [[Realm]] 内部スロットを持たない非標準 function エキゾチックオブジェクト の場合のみ。
7.3.25 CopyDataProperties ( target , source , excludedItems )
The abstract operation CopyDataProperties takes arguments target (Object), source (ECMAScript言語値 ), and excludedItems (プロパティキー の List ) and returns unused を含む normal completion あるいは throw completion . It performs the following steps when called:
source が undefined または null のいずれかなら unused を返す。from を ! ToObject (source ) とする。keys を ? from .[[OwnPropertyKeys]] () とする。keys の各要素 nextKey についてexcluded を false とする。excludedItems の各要素 e についてSameValue (e , nextKey ) が true ならexcluded を true に設定する。excluded が false ならdesc を ? from .[[GetOwnProperty]] (nextKey ) とする。desc が undefined でなく desc .[[Enumerable]] が true ならpropValue を ? Get (from , nextKey ) とする。! CreateDataPropertyOrThrow (target , nextKey , propValue ) を実行する。 unused を返す。
Note
ここに渡される target は常に新規作成オブジェクトで、エラー時に直接アクセスされない。
7.3.26 PrivateElementFind ( O , P )
The abstract operation PrivateElementFind takes arguments O (Object) and P (Private Name ) and returns PrivateElement または empty . It performs the following steps when called:
O .[[PrivateElements]] が PrivateElement pe を含み pe .[[Key]] が P であるならpe を返す。empty を返す。
7.3.27 PrivateFieldAdd ( O , P , value )
The abstract operation PrivateFieldAdd takes arguments O (Object), P (Private Name ), and value (ECMAScript言語値 ) and returns unused を含む normal completion あるいは throw completion . It performs the following steps when called:
ホスト が Web ブラウザなら? HostEnsureCanAddPrivateElement (O ) を実行する。 entry を PrivateElementFind (O , P ) とする。entry が empty でないなら TypeError 例外を投げる。PrivateElement { [[Key]] : P , [[Kind]] : field , [[Value]] : value } を O .[[PrivateElements]] に追加する。unused を返す。
7.3.28 PrivateMethodOrAccessorAdd ( O , method )
The abstract operation PrivateMethodOrAccessorAdd takes arguments O (Object) and method (PrivateElement ) and returns unused を含む normal completion あるいは throw completion . It performs the following steps when called:
アサート: method .[[Kind]] は method または accessor のいずれか。 ホスト が Web ブラウザなら? HostEnsureCanAddPrivateElement (O ) を実行する。 entry を PrivateElementFind (O , method .[[Key]] ) とする。entry が empty でないなら TypeError 例外を投げる。method を O .[[PrivateElements]] に追加する。unused を返す。
Note
private メソッドとアクセサの値はインスタンス間で共有され、この操作は新しいコピーを作成しない。
7.3.29 HostEnsureCanAddPrivateElement ( O )
The host-defined abstract operation HostEnsureCanAddPrivateElement takes argument O (Object) and returns unused を含む normal completion あるいは throw completion . ホスト環境 が特定のホスト定義 エキゾチックオブジェクト への private 要素追加を禁止できるようにする。
HostEnsureCanAddPrivateElement の実装は次の要件に従わなければならない:
既定実装は NormalCompletion (unused ) を返す。
この抽象操作 は Web ブラウザの ECMAScript ホスト のみが呼び出す。
7.3.30 PrivateGet ( O , P )
The abstract operation PrivateGet takes arguments O (Object) and P (Private Name ) and returns ECMAScript言語値 を含む normal completion あるいは throw completion . It performs the following steps when called:
entry を PrivateElementFind (O , P ) とする。entry が empty なら TypeError 例外を投げる。entry .[[Kind]] が field または method のいずれかならentry .[[Value]] を返す。アサート: entry .[[Kind]] は accessor 。 entry .[[Get]] が undefined なら TypeError 例外を投げる。getter を entry .[[Get]] とする。? Call(getter , O ) を返す。
7.3.31 PrivateSet ( O , P , value )
The abstract operation PrivateSet takes arguments O (Object), P (Private Name ), and value (ECMAScript言語値 ) and returns unused を含む normal completion あるいは throw completion . It performs the following steps when called:
entry を PrivateElementFind (O , P ) とする。entry が empty なら TypeError 例外を投げる。entry .[[Kind]] が field ならentry .[[Value]] を value に設定する。それ以外で entry .[[Kind]] が method ならTypeError 例外を投げる。 それ以外アサート: entry .[[Kind]] は accessor 。 entry .[[Set]] が undefined なら TypeError 例外を投げる。setter を entry .[[Set]] とする。? Call(setter , O , « value ») を実行する。 unused を返す。
7.3.32 DefineField ( receiver , fieldRecord )
The abstract operation DefineField takes arguments receiver (Object) and fieldRecord (ClassFieldDefinition Record ) and returns unused を含む normal completion あるいは throw completion . It performs the following steps when called:
fieldName を fieldRecord .[[Name]] とする。initializer を fieldRecord .[[Initializer]] とする。initializer が empty でないならinitValue を ? Call(initializer , receiver ) とする。それ以外initValue を undefined とする。 fieldName が Private Name なら? PrivateFieldAdd (receiver , fieldName , initValue ) を実行する。 それ以外アサート: fieldName はプロパティキー 。 ? CreateDataPropertyOrThrow (receiver , fieldName , initValue ) を実行する。 unused を返す。
7.3.33 InitializeInstanceElements ( O , constructor )
The abstract operation InitializeInstanceElements takes arguments O (Object) and constructor (ECMAScript 関数オブジェクト ) and returns unused を含む normal completion あるいは throw completion . It performs the following steps when called:
methods を constructor .[[PrivateMethods]] とする。methods の各 PrivateElement method について? PrivateMethodOrAccessorAdd (O , method ) を実行する。 fields を constructor .[[Fields]] とする。fields の各要素 fieldRecord について? DefineField (O , fieldRecord ) を実行する。 unused を返す。
7.3.34 AddValueToKeyedGroup ( groups , key , value )
The abstract operation AddValueToKeyedGroup takes arguments groups ([[Key]] (ECMAScript言語値 ) と [[Elements]] (ECMAScript言語値 の List ) フィールドを持つ Record の List ), key (ECMAScript言語値 ), and value (ECMAScript言語値 ) and returns unused . It performs the following steps when called:
groups の各 Record { [[Key]] , [[Elements]] } g についてSameValue (g .[[Key]] , key ) が true ならアサート: groups のうちこの条件を満たす要素は正確に1つ。 value を g .[[Elements]] に追加する。unused を返す。group を Record { [[Key]] : key , [[Elements]] : « value » } とする。group を groups に追加する。unused を返す。
7.3.35 GroupBy ( items , callback , keyCoercion )
The abstract operation GroupBy takes arguments items (ECMAScript言語値 ), callback (ECMAScript言語値 ), and keyCoercion (property または collection ) and returns [[Key]] と [[Elements]] フィールドを持つ Record の List を含む normal completion あるいは throw completion . It performs the following steps when called:
? RequireObjectCoercible (items ) を実行する。 IsCallable (callback ) が false なら TypeError 例外を投げる。groups を空の新 List とする。iteratorRecord を ? GetIterator (items , sync ) とする。k を 0 とする。繰り返しk ≥ 253 - 1 ならerror を ThrowCompletion (新規 TypeError オブジェクト) とする。? IteratorClose (iteratorRecord , error ) を返す。 next を ? IteratorStepValue (iteratorRecord ) とする。next が done ならgroups を返す。value を next とする。key を Completion (Call(callback , undefined , « value , 𝔽 (k ) »)) とする。IfAbruptCloseIterator (key , iteratorRecord )。keyCoercion が property ならkey を Completion (ToPropertyKey (key )) とする。IfAbruptCloseIterator (key , iteratorRecord )。それ以外アサート: keyCoercion は collection 。 key を CanonicalizeKeyedCollectionKey (key ) に設定する。 AddValueToKeyedGroup (groups , key , value ) を実行する。k を k + 1 に設定する。
7.3.36 SetterThatIgnoresPrototypeProperties ( thisValue , home , p , v )
The abstract operation SetterThatIgnoresPrototypeProperties takes arguments thisValue (ECMAScript言語値 ), home (Object), p (プロパティキー ), and v (ECMAScript言語値 ) and returns unused を含む normal completion あるいは throw completion . It performs the following steps when called:
thisValue が Object でないならTypeError 例外を投げる。SameValue (thisValue , home ) が true なら注: ここで投げることは strict mode で home オブジェクト上の非書き込み可能データプロパティ への代入をエミュレートする。 TypeError 例外を投げる。desc を ? thisValue .[[GetOwnProperty]] (p ) とする。desc が undefined なら? CreateDataPropertyOrThrow (thisValue , p , v ) を実行する。 それ以外? Set (thisValue , p , v , true ) を実行する。 unused を返す。
7.4 イテレータオブジェクトに対する操作
共通反復インターフェイス(27.1 )を参照。
7.4.1 Iterator Record
Iterator Record はイテレータまたは非同期イテレータとその next
メソッドをカプセル化するための Record 値。
Iterator Record は Table 13 に示すフィールドを持つ。
Table 13: Iterator Record フィールド
フィールド名
値
意味
[[Iterator]]
Object
イテレータまたは非同期イテレータインターフェイスに準拠するオブジェクト。
[[NextMethod]]
ECMAScript言語値
[[Iterator]] オブジェクトの next
メソッド。
[[Done]]
Boolean
イテレータが完了またはクローズされたか。
7.4.2 GetIteratorDirect ( obj )
The abstract operation GetIteratorDirect takes argument obj (Object) and returns Iterator Record を含む normal completion あるいは throw completion . It performs the following steps when called:
nextMethod を ? Get (obj , "next" ) とする。iteratorRecord を Iterator Record { [[Iterator]] : obj , [[NextMethod]] : nextMethod , [[Done]] : false } とする。iteratorRecord を返す。
7.4.3 GetIteratorFromMethod ( obj , method )
The abstract operation GetIteratorFromMethod takes arguments obj (ECMAScript言語値 ) and method (関数オブジェクト ) and returns Iterator Record を含む normal completion あるいは throw completion . It performs the following steps when called:
iterator を ? Call(method , obj ) とする。iterator が Object でないなら TypeError 例外を投げる。? GetIteratorDirect (iterator ) を返す。
7.4.4 GetIterator ( obj , kind )
The abstract operation GetIterator takes arguments obj (ECMAScript言語値 ) and kind (sync または async ) and returns Iterator Record を含む normal completion あるいは throw completion . It performs the following steps when called:
kind が async ならmethod を ? GetMethod (obj , %Symbol.asyncIterator% ) とする。method が undefined ならsyncMethod を ? GetMethod (obj , %Symbol.iterator% ) とする。syncMethod が undefined なら TypeError 例外を投げる。syncIteratorRecord を ? GetIteratorFromMethod (obj , syncMethod ) とする。CreateAsyncFromSyncIterator (syncIteratorRecord ) を返す。それ以外method を ? GetMethod (obj , %Symbol.iterator% ) とする。 method が undefined なら TypeError 例外を投げる。? GetIteratorFromMethod (obj , method ) を返す。
7.4.5 GetIteratorFlattenable ( obj , primitiveHandling )
The abstract operation GetIteratorFlattenable takes arguments obj (ECMAScript言語値 ) and primitiveHandling (iterate-string-primitives または reject-primitives ) and returns Iterator Record を含む normal completion あるいは throw completion . It performs the following steps when called:
obj が Object でないならprimitiveHandling が reject-primitives なら TypeError 例外を投げる。アサート: primitiveHandling は iterate-string-primitives 。 obj が String でないなら TypeError 例外を投げる。method を ? GetMethod (obj , %Symbol.iterator% ) とする。method が undefined ならiterator を obj とする。それ以外iterator を ? Call(method , obj ) とする。 iterator が Object でないなら TypeError 例外を投げる。? GetIteratorDirect (iterator ) を返す。
7.4.6
IteratorNext (
iteratorRecord : Iterator Record,
省略可能 value : ECMAScript言語値,
): Object を含む normal completion あるいは throw completion
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
value が存在しないならresult を Completion (Call(iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] )) とする。それ以外result を Completion (Call(iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] , « value »)) とする。 result が throw completion ならiteratorRecord .[[Done]] を true に設定する。? result を返す。 result を ! result に設定する。result が Object でないならiteratorRecord .[[Done]] を true に設定する。TypeError 例外を投げる。result を返す。
7.4.7 IteratorComplete ( iteratorResult )
The abstract operation IteratorComplete takes argument iteratorResult (Object) and returns Boolean を含む normal completion あるいは throw completion . It performs the following steps when called:
ToBoolean (? Get (iteratorResult , "done" )) を返す。
7.4.8 IteratorValue ( iteratorResult )
The abstract operation IteratorValue takes argument iteratorResult (Object) and returns ECMAScript言語値 を含む normal completion あるいは throw completion . It performs the following steps when called:
? Get (iteratorResult , "value" ) を返す。
7.4.9 IteratorStep ( iteratorRecord )
The abstract operation IteratorStep takes argument iteratorRecord (Iterator Record ) and returns Object または done を含む normal completion あるいは throw completion . iteratorRecord .[[NextMethod]] を呼び次の値を要求し、イテレータが終端なら done を、そうでなければ次の値を含む IteratorResult オブジェクトを返す。 It performs the following steps when called:
result を ? IteratorNext(iteratorRecord ) とする。done を Completion (IteratorComplete (result )) とする。done が throw completion ならiteratorRecord .[[Done]] を true に設定する。? done を返す。 done を ! done に設定する。done が true ならiteratorRecord .[[Done]] を true に設定する。done を返す。result を返す。
7.4.10 IteratorStepValue ( iteratorRecord )
The abstract operation IteratorStepValue takes argument iteratorRecord (Iterator Record ) and returns ECMAScript言語値 または done を含む normal completion あるいは throw completion . iteratorRecord .[[NextMethod]] を呼び次の値を要求し、イテレータ終端なら done 、値があれば IteratorResult からその値を返す。 It performs the following steps when called:
result を ? IteratorStep (iteratorRecord ) とする。result が done ならdone を返す。value を Completion (IteratorValue (result )) とする。value が throw completion ならiteratorRecord .[[Done]] を true に設定する。? value を返す。
7.4.11 IteratorClose ( iteratorRecord , completion )
The abstract operation IteratorClose takes arguments iteratorRecord (Iterator Record ) and completion (Completion Record ) and returns Completion Record . イテレータが完了状態に達した際に通常行う処理を実行するよう通知する。 It performs the following steps when called:
アサート: iteratorRecord .[[Iterator]] は Object。 iterator を iteratorRecord .[[Iterator]] とする。innerResult を Completion (GetMethod (iterator , "return" )) とする。innerResult が normal completion ならreturn を innerResult .[[Value]] とする。return が undefined なら ? completion を返す。innerResult を Completion (Call(return , iterator )) に設定する。completion が throw completion なら ? completion を返す。innerResult が throw completion なら ? innerResult を返す。innerResult .[[Value]] が Object でないなら TypeError 例外を投げる。? completion を返す。
7.4.12 IfAbruptCloseIterator ( value , iteratorRecord )
IfAbruptCloseIterator は Iterator Record を用いるアルゴリズム手順列の省略記法。次の形式のステップ:
IfAbruptCloseIterator (value , iteratorRecord )。
は次と同じ意味を持つ:
アサート: value は Completion Record 。 value が abrupt completion なら ? IteratorClose (iteratorRecord , value ) を返す。それ以外なら value を ! value に設定する。
7.4.13 AsyncIteratorClose ( iteratorRecord , completion )
The abstract operation AsyncIteratorClose takes arguments iteratorRecord (Iterator Record ) and completion (Completion Record ) and returns Completion Record . 非同期イテレータが完了状態に達した際に通常行う処理を実行するよう通知する。 It performs the following steps when called:
アサート: iteratorRecord .[[Iterator]] は Object。 iterator を iteratorRecord .[[Iterator]] とする。innerResult を Completion (GetMethod (iterator , "return" )) とする。innerResult が normal completion ならreturn を innerResult .[[Value]] とする。return が undefined なら ? completion を返す。innerResult を Completion (Call(return , iterator )) に設定する。innerResult が normal completion なら innerResult を Completion (Await (innerResult .[[Value]] )) に設定する。completion が throw completion なら ? completion を返す。innerResult が throw completion なら ? innerResult を返す。innerResult .[[Value]] が Object でないなら TypeError 例外を投げる。? completion を返す。
7.4.14 CreateIteratorResultObject ( value , done )
The abstract operation CreateIteratorResultObject takes arguments value (ECMAScript言語値 ) and done (Boolean) and returns IteratorResult インターフェイスに準拠する Object. IteratorResult インターフェイスに準拠するオブジェクトを生成する。 It performs the following steps when called:
obj を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (obj , "value" , value ) を実行する。 ! CreateDataPropertyOrThrow (obj , "done" , done ) を実行する。 obj を返す。
7.4.15 CreateListIteratorRecord ( list )
The abstract operation CreateListIteratorRecord takes argument list (ECMAScript言語値 の List ) and returns Iterator Record . list の連続要素を返す [[NextMethod]] を持つ Iterator Record を生成する。 It performs the following steps when called:
closure をパラメータ無しで list をキャプチャし呼び出し時に次を行う新しい Abstract Closure とする:list の各要素 E について? GeneratorYield (CreateIteratorResultObject (E , false )) を実行する。 NormalCompletion (undefined ) を返す。iterator を CreateIteratorFromClosure (closure , empty , %Iterator.prototype% ) とする。Iterator Record { [[Iterator]] : iterator , [[NextMethod]] : %GeneratorPrototype.next%, [[Done]] : false } を返す。
Note
List イテレータオブジェクトは ECMAScript コードから直接アクセスできない。
7.4.16 IteratorToList ( iteratorRecord )
The abstract operation IteratorToList takes argument iteratorRecord (Iterator Record ) and returns ECMAScript言語値 の List を含む normal completion あるいは throw completion . It performs the following steps when called:
values を空の新 List とする。繰り返しnext を ? IteratorStepValue (iteratorRecord ) とする。next が done ならvalues を返す。next を values に追加する。
8 構文指向操作 (Syntax-Directed Operations)
本節で定義されるものに加えて、特化した構文指向操作が本仕様全体で定義されている。
8.1 実行時意味論: Evaluation : Completion Record
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
この操作の定義は本仕様の「ECMAScript Language」各節に分散している。各定義は関連する生成規則 (production) が定義出現する直後に現れる。
8.2 スコープ解析 (Scope Analysis)
8.2.1 静的意味論: BoundNames : 文字列の List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
"*default*" は、モジュールの default export に別名が存在しない場合に、そのモジュールの default export を表すための合成(synthetic)名として本仕様内で用いられる。この名前でモジュールの [[Environment]] にエントリが作成され対応する値を保持し、当該モジュールについて ResolveExport ( exportName [ , resolveSet ] ) を呼び "default" という export を解決すると、[[BindingName]] が "*default*" の ResolvedBinding Record を返し、それがモジュールの [[Environment]] 内で前述の値へ解決される。これは仕様記述の簡便さのみを目的としており、無名の default export を他の export と同様に解決できるようにするためである。この "*default*" 文字列が ECMAScript コードやモジュールリンクアルゴリズムからアクセスされることは決してない。
It is defined piecewise over the following productions:
BindingIdentifier : Identifier
Identifier の StringValue を唯一の要素とする List を返す。
BindingIdentifier : yield
« "yield" » を返す。
BindingIdentifier : await
« "await" » を返す。
LexicalDeclaration :
LetOrConst
BindingList
;
BindingList の BoundNames を返す。
BindingList :
BindingList
,
LexicalBinding
names1 を BindingList の BoundNames とする。names2 を LexicalBinding の BoundNames とする。names1 と names2 のリスト結合 を返す。
LexicalBinding :
BindingIdentifier
Initializer opt
BindingIdentifier の BoundNames を返す。
LexicalBinding :
BindingPattern
Initializer
BindingPattern の BoundNames を返す。
VariableDeclarationList :
VariableDeclarationList
,
VariableDeclaration
names1 を VariableDeclarationList の BoundNames とする。names2 を VariableDeclaration の BoundNames とする。names1 と names2 のリスト結合 を返す。
VariableDeclaration :
BindingIdentifier
Initializer opt
BindingIdentifier の BoundNames を返す。
VariableDeclaration :
BindingPattern
Initializer
BindingPattern の BoundNames を返す。
ObjectBindingPattern :
{
}
新しい空の List を返す。
ObjectBindingPattern :
{
BindingPropertyList
,
BindingRestProperty
}
names1 を BindingPropertyList の BoundNames とする。names2 を BindingRestProperty の BoundNames とする。names1 と names2 のリスト結合 を返す。
ArrayBindingPattern :
[
Elision opt
]
新しい空の List を返す。
ArrayBindingPattern :
[
Elision opt
BindingRestElement
]
BindingRestElement の BoundNames を返す。
ArrayBindingPattern :
[
BindingElementList
,
Elision opt
]
BindingElementList の BoundNames を返す。
ArrayBindingPattern :
[
BindingElementList
,
Elision opt
BindingRestElement
]
names1 を BindingElementList の BoundNames とする。names2 を BindingRestElement の BoundNames とする。names1 と names2 のリスト結合 を返す。
BindingPropertyList :
BindingPropertyList
,
BindingProperty
names1 を BindingPropertyList の BoundNames とする。names2 を BindingProperty の BoundNames とする。names1 と names2 のリスト結合 を返す。
BindingElementList :
BindingElementList
,
BindingElisionElement
names1 を BindingElementList の BoundNames とする。names2 を BindingElisionElement の BoundNames とする。names1 と names2 のリスト結合 を返す。
BindingElisionElement :
Elision opt
BindingElement
BindingElement の BoundNames を返す。
BindingProperty :
PropertyName
:
BindingElement
BindingElement の BoundNames を返す。
SingleNameBinding :
BindingIdentifier
Initializer opt
BindingIdentifier の BoundNames を返す。
BindingElement :
BindingPattern
Initializer opt
BindingPattern の BoundNames を返す。
ForDeclaration :
LetOrConst
ForBinding
ForBinding の BoundNames を返す。
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
BindingIdentifier の BoundNames を返す。
FunctionDeclaration :
function
(
FormalParameters
)
{
FunctionBody
}
« "*default*" » を返す。
FormalParameters : [empty]
新しい空の List を返す。
FormalParameters :
FormalParameterList
,
FunctionRestParameter
names1 を FormalParameterList の BoundNames とする。names2 を FunctionRestParameter の BoundNames とする。names1 と names2 のリスト結合 を返す。
FormalParameterList :
FormalParameterList
,
FormalParameter
names1 を FormalParameterList の BoundNames とする。names2 を FormalParameter の BoundNames とする。names1 と names2 のリスト結合 を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
formals を CoverParenthesizedExpressionAndArrowParameterList が被覆する ArrowFormalParameters とする。formals の BoundNames を返す。
GeneratorDeclaration :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
BindingIdentifier の BoundNames を返す。
GeneratorDeclaration :
function
*
(
FormalParameters
)
{
GeneratorBody
}
« "*default*" » を返す。
AsyncGeneratorDeclaration :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
BindingIdentifier の BoundNames を返す。
AsyncGeneratorDeclaration :
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
« "*default*" » を返す。
ClassDeclaration :
class
BindingIdentifier
ClassTail
BindingIdentifier の BoundNames を返す。
ClassDeclaration :
class
ClassTail
« "*default*" » を返す。
AsyncFunctionDeclaration :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
BindingIdentifier の BoundNames を返す。
AsyncFunctionDeclaration :
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
« "*default*" » を返す。
CoverCallExpressionAndAsyncArrowHead :
MemberExpression
Arguments
head を CoverCallExpressionAndAsyncArrowHead が被覆する AsyncArrowHead とする。head の BoundNames を返す。
ImportDeclaration :
import
ImportClause
FromClause
WithClause opt
;
ImportClause の BoundNames を返す。
ImportDeclaration :
import
ModuleSpecifier
WithClause opt
;
新しい空の List を返す。
ImportClause :
ImportedDefaultBinding
,
NameSpaceImport
names1 を ImportedDefaultBinding の BoundNames とする。names2 を NameSpaceImport の BoundNames とする。names1 と names2 のリスト結合 を返す。
ImportClause :
ImportedDefaultBinding
,
NamedImports
names1 を ImportedDefaultBinding の BoundNames とする。names2 を NamedImports の BoundNames とする。names1 と names2 のリスト結合 を返す。
NamedImports :
{
}
新しい空の List を返す。
ImportsList :
ImportsList
,
ImportSpecifier
names1 を ImportsList の BoundNames とする。names2 を ImportSpecifier の BoundNames とする。names1 と names2 のリスト結合 を返す。
ImportSpecifier :
ModuleExportName
as
ImportedBinding
ImportedBinding の BoundNames を返す。
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
新しい空の List を返す。
ExportDeclaration :
export
VariableStatement
VariableStatement の BoundNames を返す。
ExportDeclaration :
export
Declaration
Declaration の BoundNames を返す。
ExportDeclaration :
export
default
HoistableDeclaration
declarationNames を HoistableDeclaration の BoundNames とする。declarationNames に "*default*" が含まれないなら "*default*" を declarationNames に追加する。declarationNames を返す。
ExportDeclaration :
export
default
ClassDeclaration
declarationNames を ClassDeclaration の BoundNames とする。declarationNames に "*default*" が含まれないなら "*default*" を declarationNames に追加する。declarationNames を返す。
ExportDeclaration :
export
default
AssignmentExpression
;
« "*default*" » を返す。
8.2.2 静的意味論: DeclarationPart : Parse Node
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
HoistableDeclaration : FunctionDeclaration
FunctionDeclaration を返す。
HoistableDeclaration : GeneratorDeclaration
GeneratorDeclaration を返す。
HoistableDeclaration : AsyncFunctionDeclaration
AsyncFunctionDeclaration を返す。
HoistableDeclaration : AsyncGeneratorDeclaration
AsyncGeneratorDeclaration を返す。
Declaration : ClassDeclaration
ClassDeclaration を返す。
Declaration : LexicalDeclaration
LexicalDeclaration を返す。
8.2.3 静的意味論: IsConstantDeclaration : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
LexicalDeclaration :
LetOrConst
BindingList
;
LetOrConst の IsConstantDeclaration を返す。
LetOrConst : let
false を返す。
LetOrConst : const
true を返す。
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
GeneratorDeclaration :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorDeclaration :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionDeclaration :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
false を返す。
ClassDeclaration :
class
BindingIdentifier
ClassTail
class
ClassTail
false を返す。
ExportDeclaration :
export
ExportFromClause
FromClause
;
export
NamedExports
;
export
default
AssignmentExpression
;
false を返す。
Note
export default
AssignmentExpression を定数宣言として扱う必要はない。モジュールの default オブジェクトを参照する内部束縛名に代入できる構文は存在しないためである。
8.2.4 静的意味論: LexicallyDeclaredNames : 文字列の List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Block :
{
}
新しい空の List を返す。
StatementList :
StatementList
StatementListItem
names1 を StatementList の LexicallyDeclaredNames とする。names2 を StatementListItem の LexicallyDeclaredNames とする。names1 と names2 のリスト結合 を返す。
StatementListItem : Statement
Statement が
Statement : LabelledStatement
であれば、LabelledStatement の LexicallyDeclaredNames を返す。新しい空の List を返す。
StatementListItem : Declaration
Declaration の BoundNames を返す。
CaseBlock :
{
}
新しい空の List を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在するなら names1 をその LexicallyDeclaredNames、存在しないなら新しい空の List とする。 names2 を DefaultClause の LexicallyDeclaredNames とする。2番目の CaseClauses が存在するなら names3 をその LexicallyDeclaredNames、存在しないなら新しい空の List とする。 names1 , names2 , names3 のリスト結合 を返す。
CaseClauses :
CaseClauses
CaseClause
names1 を CaseClauses の LexicallyDeclaredNames とする。names2 を CaseClause の LexicallyDeclaredNames とする。names1 と names2 のリスト結合 を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在するならその LexicallyDeclaredNames を返す。新しい空の List を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在するならその LexicallyDeclaredNames を返す。新しい空の List を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
LabelledItem の LexicallyDeclaredNames を返す。
LabelledItem : Statement
新しい空の List を返す。
LabelledItem : FunctionDeclaration
FunctionDeclaration の BoundNames を返す。
FunctionStatementList : [empty]
新しい空の List を返す。
FunctionStatementList : StatementList
StatementList の TopLevelLexicallyDeclaredNames を返す。
ClassStaticBlockStatementList : [empty]
新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
StatementList の TopLevelLexicallyDeclaredNames を返す。
ConciseBody : ExpressionBody
新しい空の List を返す。
AsyncConciseBody : ExpressionBody
新しい空の List を返す。
Script : [empty]
新しい空の List を返す。
ScriptBody : StatementList
StatementList の TopLevelLexicallyDeclaredNames を返す。
Note 1
Script の最上位では function 宣言は lexical 宣言ではなく var 宣言として扱われる。
Note 2
Module の LexicallyDeclaredNames にはその全ての import された束縛の名前が含まれる。
ModuleItemList :
ModuleItemList
ModuleItem
names1 を ModuleItemList の LexicallyDeclaredNames とする。names2 を ModuleItem の LexicallyDeclaredNames とする。names1 と names2 のリスト結合 を返す。
ModuleItem : ImportDeclaration
ImportDeclaration の BoundNames を返す。
ModuleItem : ExportDeclaration
ExportDeclaration が export
VariableStatement であれば新しい空の List を返す。ExportDeclaration の BoundNames を返す。
ModuleItem : StatementListItem
StatementListItem の LexicallyDeclaredNames を返す。
Note 3
Module の最上位では function 宣言は var 宣言ではなく lexical 宣言として扱われる。
8.2.5 静的意味論: LexicallyScopedDeclarations : Parse Node の List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
StatementList :
StatementList
StatementListItem
declarations1 を StatementList の LexicallyScopedDeclarations とする。declarations2 を StatementListItem の LexicallyScopedDeclarations とする。declarations1 と declarations2 のリスト結合 を返す。
StatementListItem : Statement
Statement が
Statement : LabelledStatement
なら LabelledStatement の LexicallyScopedDeclarations を返す。新しい空の List を返す。
StatementListItem : Declaration
Declaration の DeclarationPart を唯一の要素とする List を返す。
CaseBlock :
{
}
新しい空の List を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在するなら declarations1 をその LexicallyScopedDeclarations、存在しないなら新しい空の List とする。 declarations2 を DefaultClause の LexicallyScopedDeclarations とする。2番目の CaseClauses が存在するなら declarations3 をその LexicallyScopedDeclarations、存在しないなら新しい空の List とする。 declarations1 , declarations2 , declarations3 のリスト結合 を返す。
CaseClauses :
CaseClauses
CaseClause
declarations1 を CaseClauses の LexicallyScopedDeclarations とする。declarations2 を CaseClause の LexicallyScopedDeclarations とする。declarations1 と declarations2 のリスト結合 を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在するならその LexicallyScopedDeclarations を返す。新しい空の List を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在するならその LexicallyScopedDeclarations を返す。新しい空の List を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
LabelledItem の LexicallyScopedDeclarations を返す。
LabelledItem : Statement
新しい空の List を返す。
LabelledItem : FunctionDeclaration
« FunctionDeclaration » を返す。
FunctionStatementList : [empty]
新しい空の List を返す。
FunctionStatementList : StatementList
StatementList の TopLevelLexicallyScopedDeclarations を返す。
ClassStaticBlockStatementList : [empty]
新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
StatementList の TopLevelLexicallyScopedDeclarations を返す。
ConciseBody : ExpressionBody
新しい空の List を返す。
AsyncConciseBody : ExpressionBody
新しい空の List を返す。
Script : [empty]
新しい空の List を返す。
ScriptBody : StatementList
StatementList の TopLevelLexicallyScopedDeclarations を返す。
Module : [empty]
新しい空の List を返す。
ModuleItemList :
ModuleItemList
ModuleItem
declarations1 を ModuleItemList の LexicallyScopedDeclarations とする。declarations2 を ModuleItem の LexicallyScopedDeclarations とする。declarations1 と declarations2 のリスト結合 を返す。
ModuleItem : ImportDeclaration
新しい空の List を返す。
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
export
VariableStatement
新しい空の List を返す。
ExportDeclaration :
export
Declaration
DeclarationPart が Declaration である要素のみを持つ List を返す。
ExportDeclaration :
export
default
HoistableDeclaration
DeclarationPart が HoistableDeclaration である唯一の要素を持つ List を返す。
ExportDeclaration :
export
default
ClassDeclaration
唯一の要素が ClassDeclaration である List を返す。
ExportDeclaration :
export
default
AssignmentExpression
;
唯一の要素がこの ExportDeclaration である List を返す。
8.2.6 静的意味論: VarDeclaredNames : 文字列の List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Statement :
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
新しい空の List を返す。
Block :
{
}
新しい空の List を返す。
StatementList :
StatementList
StatementListItem
names1 を StatementList の VarDeclaredNames とする。names2 を StatementListItem の VarDeclaredNames とする。names1 と names2 のリスト結合 を返す。
StatementListItem : Declaration
新しい空の List を返す。
VariableStatement :
var
VariableDeclarationList
;
VariableDeclarationList の BoundNames を返す。
IfStatement :
if
(
Expression
)
Statement
else
Statement
names1 を最初の Statement の VarDeclaredNames とする。names2 を2番目の Statement の VarDeclaredNames とする。names1 と names2 のリスト結合 を返す。
IfStatement :
if
(
Expression
)
Statement
Statement の VarDeclaredNames を返す。
DoWhileStatement :
do
Statement
while
(
Expression
)
;
Statement の VarDeclaredNames を返す。
WhileStatement :
while
(
Expression
)
Statement
Statement の VarDeclaredNames を返す。
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
Statement の VarDeclaredNames を返す。
ForStatement :
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
names1 を VariableDeclarationList の BoundNames とする。names2 を Statement の VarDeclaredNames とする。names1 と names2 のリスト結合 を返す。
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
Statement の VarDeclaredNames を返す。
ForInOfStatement :
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
Statement の VarDeclaredNames を返す。
ForInOfStatement :
for
(
var
ForBinding
in
Expression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
names1 を « ForBinding » とする。names2 を Statement の VarDeclaredNames とする。names1 と names2 のリスト結合 を返す。
Note
WithStatement :
with
(
Expression
)
Statement
Statement の VarDeclaredNames を返す。
SwitchStatement :
switch
(
Expression
)
CaseBlock
CaseBlock の VarDeclaredNames を返す。
CaseBlock :
{
}
新しい空の List を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在するなら names1 をその VarDeclaredNames、存在しないなら新しい空の List とする。 names2 を DefaultClause の VarDeclaredNames とする。2番目の CaseClauses が存在するなら names3 をその VarDeclaredNames、存在しないなら新しい空の List とする。 names1 , names2 , names3 のリスト結合 を返す。
CaseClauses :
CaseClauses
CaseClause
names1 を CaseClauses の VarDeclaredNames とする。names2 を CaseClause の VarDeclaredNames とする。names1 と names2 のリスト結合 を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在するならその VarDeclaredNames を返す。新しい空の List を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在するならその VarDeclaredNames を返す。新しい空の List を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
LabelledItem の VarDeclaredNames を返す。
LabelledItem : FunctionDeclaration
新しい空の List を返す。
TryStatement :
try
Block
Catch
names1 を Block の VarDeclaredNames とする。names2 を Catch の VarDeclaredNames とする。names1 と names2 のリスト結合 を返す。
TryStatement :
try
Block
Finally
names1 を Block の VarDeclaredNames とする。names2 を Finally の VarDeclaredNames とする。names1 と names2 のリスト結合 を返す。
TryStatement :
try
Block
Catch
Finally
names1 を Block の VarDeclaredNames とする。names2 を Catch の VarDeclaredNames とする。names3 を Finally の VarDeclaredNames とする。names1 , names2 , names3 のリスト結合 を返す。
Catch :
catch
(
CatchParameter
)
Block
Block の VarDeclaredNames を返す。
FunctionStatementList : [empty]
新しい空の List を返す。
FunctionStatementList : StatementList
StatementList の TopLevelVarDeclaredNames を返す。
ClassStaticBlockStatementList : [empty]
新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
StatementList の TopLevelVarDeclaredNames を返す。
ConciseBody : ExpressionBody
新しい空の List を返す。
AsyncConciseBody : ExpressionBody
新しい空の List を返す。
Script : [empty]
新しい空の List を返す。
ScriptBody : StatementList
StatementList の TopLevelVarDeclaredNames を返す。
ModuleItemList :
ModuleItemList
ModuleItem
names1 を ModuleItemList の VarDeclaredNames とする。names2 を ModuleItem の VarDeclaredNames とする。names1 と names2 のリスト結合 を返す。
ModuleItem : ImportDeclaration
新しい空の List を返す。
ModuleItem : ExportDeclaration
ExportDeclaration が export
VariableStatement であれば ExportDeclaration の BoundNames を返す。新しい空の List を返す。
8.2.7 静的意味論: VarScopedDeclarations : Parse Node の List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Statement :
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
新しい空の List を返す。
Block :
{
}
新しい空の List を返す。
StatementList :
StatementList
StatementListItem
declarations1 を StatementList の VarScopedDeclarations とする。declarations2 を StatementListItem の VarScopedDeclarations とする。declarations1 と declarations2 のリスト結合 を返す。
StatementListItem : Declaration
新しい空の List を返す。
VariableDeclarationList : VariableDeclaration
« VariableDeclaration » を返す。
VariableDeclarationList :
VariableDeclarationList
,
VariableDeclaration
declarations1 を VariableDeclarationList の VarScopedDeclarations とする。declarations1 と « VariableDeclaration » のリスト結合 を返す。
IfStatement :
if
(
Expression
)
Statement
else
Statement
declarations1 を最初の Statement の VarScopedDeclarations とする。declarations2 を2番目の Statement の VarScopedDeclarations とする。declarations1 と declarations2 のリスト結合 を返す。
IfStatement :
if
(
Expression
)
Statement
Statement の VarScopedDeclarations を返す。
DoWhileStatement :
do
Statement
while
(
Expression
)
;
Statement の VarScopedDeclarations を返す。
WhileStatement :
while
(
Expression
)
Statement
Statement の VarScopedDeclarations を返す。
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
Statement の VarScopedDeclarations を返す。
ForStatement :
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
declarations1 を VariableDeclarationList の VarScopedDeclarations とする。declarations2 を Statement の VarScopedDeclarations とする。declarations1 と declarations2 のリスト結合 を返す。
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
Statement の VarScopedDeclarations を返す。
ForInOfStatement :
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
Statement の VarScopedDeclarations を返す。
ForInOfStatement :
for
(
var
ForBinding
in
Expression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
declarations1 を « ForBinding » とする。declarations2 を Statement の VarScopedDeclarations とする。declarations1 と declarations2 のリスト結合 を返す。
Note
WithStatement :
with
(
Expression
)
Statement
Statement の VarScopedDeclarations を返す。
SwitchStatement :
switch
(
Expression
)
CaseBlock
CaseBlock の VarScopedDeclarations を返す。
CaseBlock :
{
}
新しい空の List を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在するなら declarations1 をその VarScopedDeclarations、存在しないなら新しい空の List とする。 declarations2 を DefaultClause の VarScopedDeclarations とする。2番目の CaseClauses が存在するなら declarations3 をその VarScopedDeclarations、存在しないなら新しい空の List とする。 declarations1 , declarations2 , declarations3 のリスト結合 を返す。
CaseClauses :
CaseClauses
CaseClause
declarations1 を CaseClauses の VarScopedDeclarations とする。declarations2 を CaseClause の VarScopedDeclarations とする。declarations1 と declarations2 のリスト結合 を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在するならその VarScopedDeclarations を返す。新しい空の List を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在するならその VarScopedDeclarations を返す。新しい空の List を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
LabelledItem の VarScopedDeclarations を返す。
LabelledItem : Statement
Statement が
Statement : LabelledStatement
なら Statement の VarScopedDeclarations を返す。Statement の VarScopedDeclarations を返す。
LabelledItem : FunctionDeclaration
« FunctionDeclaration » を返す。
FunctionStatementList : [empty]
新しい空の List を返す。
FunctionStatementList : StatementList
StatementList の TopLevelVarScopedDeclarations を返す。
ClassStaticBlockStatementList : [empty]
新しい空の List を返す。
ClassStaticBlockStatementList : StatementList
StatementList の TopLevelVarScopedDeclarations を返す。
ConciseBody : ExpressionBody
新しい空の List を返す。
AsyncConciseBody : ExpressionBody
新しい空の List を返す。
Script : [empty]
新しい空の List を返す。
ScriptBody : StatementList
StatementList の TopLevelVarScopedDeclarations を返す。
Module : [empty]
新しい空の List を返す。
ModuleItemList :
ModuleItemList
ModuleItem
declarations1 を ModuleItemList の VarScopedDeclarations とする。declarations2 を ModuleItem の VarScopedDeclarations とする。declarations1 と declarations2 のリスト結合 を返す。
ModuleItem : ImportDeclaration
新しい空の List を返す。
ModuleItem : ExportDeclaration
ExportDeclaration が export
VariableStatement であれば VariableStatement の VarScopedDeclarations を返す。新しい空の List を返す。
8.2.8 静的意味論: TopLevelLexicallyDeclaredNames : 文字列の List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
StatementList :
StatementList
StatementListItem
names1 を StatementList の TopLevelLexicallyDeclaredNames とする。names2 を StatementListItem の TopLevelLexicallyDeclaredNames とする。names1 と names2 のリスト結合 を返す。
StatementListItem : Statement
新しい空の List を返す。
StatementListItem : Declaration
Declaration が
Declaration : HoistableDeclaration
であれば新しい空の List を返す。 Declaration の BoundNames を返す。
Note
関数またはスクリプトの最上位では function 宣言は lexical 宣言ではなく var 宣言として扱われる。
8.2.9 静的意味論: TopLevelLexicallyScopedDeclarations : Parse Node の List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
StatementList :
StatementList
StatementListItem
declarations1 を StatementList の TopLevelLexicallyScopedDeclarations とする。declarations2 を StatementListItem の TopLevelLexicallyScopedDeclarations とする。declarations1 と declarations2 のリスト結合 を返す。
StatementListItem : Statement
新しい空の List を返す。
StatementListItem : Declaration
Declaration が
Declaration : HoistableDeclaration
であれば新しい空の List を返す。 « Declaration » を返す。
8.2.10 静的意味論: TopLevelVarDeclaredNames : 文字列の List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
StatementList :
StatementList
StatementListItem
names1 を StatementList の TopLevelVarDeclaredNames とする。names2 を StatementListItem の TopLevelVarDeclaredNames とする。names1 と names2 のリスト結合 を返す。
StatementListItem : Declaration
Declaration が
Declaration : HoistableDeclaration
であればHoistableDeclaration の BoundNames を返す。新しい空の List を返す。
StatementListItem : Statement
Statement が
Statement : LabelledStatement
なら Statement の TopLevelVarDeclaredNames を返す。Statement の VarDeclaredNames を返す。
Note
関数またはスクリプトの最上位では内部の function 宣言は var 宣言として扱われる。
LabelledStatement :
LabelIdentifier
:
LabelledItem
LabelledItem の TopLevelVarDeclaredNames を返す。
LabelledItem : Statement
Statement が
Statement : LabelledStatement
なら Statement の TopLevelVarDeclaredNames を返す。Statement の VarDeclaredNames を返す。
LabelledItem : FunctionDeclaration
FunctionDeclaration の BoundNames を返す。
8.2.11 静的意味論: TopLevelVarScopedDeclarations : Parse Node の List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
StatementList :
StatementList
StatementListItem
declarations1 を StatementList の TopLevelVarScopedDeclarations とする。declarations2 を StatementListItem の TopLevelVarScopedDeclarations とする。declarations1 と declarations2 のリスト結合 を返す。
StatementListItem : Statement
Statement が
Statement : LabelledStatement
なら Statement の TopLevelVarScopedDeclarations を返す。Statement の VarScopedDeclarations を返す。
StatementListItem : Declaration
Declaration が
Declaration : HoistableDeclaration
であればdeclaration を HoistableDeclaration の DeclarationPart とする。« declaration » を返す。 新しい空の List を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
LabelledItem の TopLevelVarScopedDeclarations を返す。
LabelledItem : Statement
Statement が
Statement : LabelledStatement
なら Statement の TopLevelVarScopedDeclarations を返す。Statement の VarScopedDeclarations を返す。
LabelledItem : FunctionDeclaration
« FunctionDeclaration » を返す。
8.3 ラベル (Labels)
8.3.1 静的意味論: ContainsDuplicateLabels : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block :
{
}
StatementListItem :
Declaration
false を返す。
StatementList :
StatementList
StatementListItem
hasDuplicates を StatementList の ContainsDuplicateLabels (引数 labelSet ) とする。hasDuplicates が true なら true を返す。StatementListItem の ContainsDuplicateLabels (引数 labelSet ) を返す。
IfStatement :
if
(
Expression
)
Statement
else
Statement
hasDuplicate を 最初の Statement の ContainsDuplicateLabels (引数 labelSet ) とする。hasDuplicate が true なら true を返す。2番目の Statement の ContainsDuplicateLabels (引数 labelSet ) を返す。
IfStatement :
if
(
Expression
)
Statement
Statement の ContainsDuplicateLabels (引数 labelSet ) を返す。
DoWhileStatement :
do
Statement
while
(
Expression
)
;
Statement の ContainsDuplicateLabels (引数 labelSet ) を返す。
WhileStatement :
while
(
Expression
)
Statement
Statement の ContainsDuplicateLabels (引数 labelSet ) を返す。
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
Statement の ContainsDuplicateLabels (引数 labelSet ) を返す。
ForInOfStatement :
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
Statement の ContainsDuplicateLabels (引数 labelSet ) を返す。
Note
WithStatement :
with
(
Expression
)
Statement
Statement の ContainsDuplicateLabels (引数 labelSet ) を返す。
SwitchStatement :
switch
(
Expression
)
CaseBlock
CaseBlock の ContainsDuplicateLabels (引数 labelSet ) を返す。
CaseBlock :
{
}
false を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在するなら最初の CaseClauses の ContainsDuplicateLabels (引数 labelSet ) が true なら true を返す。 DefaultClause の ContainsDuplicateLabels (引数 labelSet ) が true なら true を返す。2番目の CaseClauses が存在しないなら false を返す。 2番目の CaseClauses の ContainsDuplicateLabels (引数 labelSet ) を返す。
CaseClauses :
CaseClauses
CaseClause
hasDuplicates を CaseClauses の ContainsDuplicateLabels (引数 labelSet ) とする。hasDuplicates が true なら true を返す。CaseClause の ContainsDuplicateLabels (引数 labelSet ) を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在するなら StatementList の ContainsDuplicateLabels (引数 labelSet ) を返す。false を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在するなら StatementList の ContainsDuplicateLabels (引数 labelSet ) を返す。false を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
label を LabelIdentifier の StringValue とする。labelSet が label を含むなら true を返す。newLabelSet を labelSet と « label » のリスト結合 とする。LabelledItem の ContainsDuplicateLabels (引数 newLabelSet ) を返す。
LabelledItem : FunctionDeclaration
false を返す。
TryStatement :
try
Block
Catch
hasDuplicates を Block の ContainsDuplicateLabels (引数 labelSet ) とする。hasDuplicates が true なら true を返す。Catch の ContainsDuplicateLabels (引数 labelSet ) を返す。
TryStatement :
try
Block
Finally
hasDuplicates を Block の ContainsDuplicateLabels (引数 labelSet ) とする。hasDuplicates が true なら true を返す。Finally の ContainsDuplicateLabels (引数 labelSet ) を返す。
TryStatement :
try
Block
Catch
Finally
Block の ContainsDuplicateLabels (引数 labelSet ) が true なら true を返す。Catch の ContainsDuplicateLabels (引数 labelSet ) が true なら true を返す。Finally の ContainsDuplicateLabels (引数 labelSet ) を返す。
Catch :
catch
(
CatchParameter
)
Block
Block の ContainsDuplicateLabels (引数 labelSet ) を返す。
FunctionStatementList : [empty]
false を返す。
ClassStaticBlockStatementList : [empty]
false を返す。
ModuleItemList :
ModuleItemList
ModuleItem
hasDuplicates を ModuleItemList の ContainsDuplicateLabels (引数 labelSet ) とする。hasDuplicates が true なら true を返す。ModuleItem の ContainsDuplicateLabels (引数 labelSet ) を返す。
ModuleItem :
ImportDeclaration
ExportDeclaration
false を返す。
8.3.2 静的意味論: ContainsUndefinedBreakTarget : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block :
{
}
StatementListItem :
Declaration
false を返す。
StatementList :
StatementList
StatementListItem
hasUndefinedLabels を StatementList の ContainsUndefinedBreakTarget (引数 labelSet ) とする。hasUndefinedLabels が true なら true を返す。StatementListItem の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
IfStatement :
if
(
Expression
)
Statement
else
Statement
hasUndefinedLabels を 最初の Statement の ContainsUndefinedBreakTarget (引数 labelSet ) とする。hasUndefinedLabels が true なら true を返す。2番目の Statement の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
IfStatement :
if
(
Expression
)
Statement
Statement の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
DoWhileStatement :
do
Statement
while
(
Expression
)
;
Statement の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
WhileStatement :
while
(
Expression
)
Statement
Statement の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
Statement の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
ForInOfStatement :
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
Statement の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
Note
BreakStatement :
break
;
false を返す。
BreakStatement :
break
LabelIdentifier
;
labelSet が LabelIdentifier の StringValue を含まないなら true を返す。false を返す。
WithStatement :
with
(
Expression
)
Statement
Statement の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
SwitchStatement :
switch
(
Expression
)
CaseBlock
CaseBlock の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
CaseBlock :
{
}
false を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在するなら最初の CaseClauses の ContainsUndefinedBreakTarget (引数 labelSet ) が true なら true を返す。 DefaultClause の ContainsUndefinedBreakTarget (引数 labelSet ) が true なら true を返す。2番目の CaseClauses が存在しないなら false を返す。 2番目の CaseClauses の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
CaseClauses :
CaseClauses
CaseClause
hasUndefinedLabels を CaseClauses の ContainsUndefinedBreakTarget (引数 labelSet ) とする。hasUndefinedLabels が true なら true を返す。CaseClause の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在するなら StatementList の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。false を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在するなら StatementList の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。false を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
label を LabelIdentifier の StringValue とする。newLabelSet を labelSet と « label » のリスト結合 とする。LabelledItem の ContainsUndefinedBreakTarget (引数 newLabelSet ) を返す。
LabelledItem : FunctionDeclaration
false を返す。
TryStatement :
try
Block
Catch
hasUndefinedLabels を Block の ContainsUndefinedBreakTarget (引数 labelSet ) とする。hasUndefinedLabels が true なら true を返す。Catch の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
TryStatement :
try
Block
Finally
hasUndefinedLabels を Block の ContainsUndefinedBreakTarget (引数 labelSet ) とする。hasUndefinedLabels が true なら true を返す。Finally の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
TryStatement :
try
Block
Catch
Finally
Block の ContainsUndefinedBreakTarget (引数 labelSet ) が true なら true を返す。Catch の ContainsUndefinedBreakTarget (引数 labelSet ) が true なら true を返す。Finally の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
Catch :
catch
(
CatchParameter
)
Block
Block の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
FunctionStatementList : [empty]
false を返す。
ClassStaticBlockStatementList : [empty]
false を返す。
ModuleItemList :
ModuleItemList
ModuleItem
hasUndefinedLabels を ModuleItemList の ContainsUndefinedBreakTarget (引数 labelSet ) とする。hasUndefinedLabels が true なら true を返す。ModuleItem の ContainsUndefinedBreakTarget (引数 labelSet ) を返す。
ModuleItem :
ImportDeclaration
ExportDeclaration
false を返す。
8.3.3 静的意味論: ContainsUndefinedContinueTarget : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block :
{
}
StatementListItem :
Declaration
false を返す。
Statement : BlockStatement
BlockStatement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
BreakableStatement : IterationStatement
newIterationSet を iterationSet と labelSet のリスト結合 とする。IterationStatement の ContainsUndefinedContinueTarget (引数 newIterationSet と « ») を返す。
StatementList :
StatementList
StatementListItem
hasUndefinedLabels を StatementList の ContainsUndefinedContinueTarget (引数 iterationSet と « ») とする。hasUndefinedLabels が true なら true を返す。StatementListItem の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
IfStatement :
if
(
Expression
)
Statement
else
Statement
hasUndefinedLabels を 最初の Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») とする。hasUndefinedLabels が true なら true を返す。2番目の Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
IfStatement :
if
(
Expression
)
Statement
Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
DoWhileStatement :
do
Statement
while
(
Expression
)
;
Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
WhileStatement :
while
(
Expression
)
Statement
Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
ForInOfStatement :
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
Note
ContinueStatement :
continue
;
false を返す。
ContinueStatement :
continue
LabelIdentifier
;
iterationSet が LabelIdentifier の StringValue を含まないなら true を返す。false を返す。
WithStatement :
with
(
Expression
)
Statement
Statement の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
SwitchStatement :
switch
(
Expression
)
CaseBlock
CaseBlock の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
CaseBlock :
{
}
false を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
最初の CaseClauses が存在するなら最初の CaseClauses の ContainsUndefinedContinueTarget (引数 iterationSet と « ») が true なら true を返す。 DefaultClause の ContainsUndefinedContinueTarget (引数 iterationSet と « ») が true なら true を返す。2番目の CaseClauses が存在しないなら false を返す。 2番目の CaseClauses の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
CaseClauses :
CaseClauses
CaseClause
hasUndefinedLabels を CaseClauses の ContainsUndefinedContinueTarget (引数 iterationSet と « ») とする。hasUndefinedLabels が true なら true を返す。CaseClause の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
CaseClause :
case
Expression
:
StatementList opt
StatementList が存在するなら StatementList の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。false を返す。
DefaultClause :
default
:
StatementList opt
StatementList が存在するなら StatementList の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。false を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
label を LabelIdentifier の StringValue とする。newLabelSet を labelSet と « label » のリスト結合 とする。LabelledItem の ContainsUndefinedContinueTarget (引数 iterationSet と newLabelSet ) を返す。
LabelledItem : FunctionDeclaration
false を返す。
TryStatement :
try
Block
Catch
hasUndefinedLabels を Block の ContainsUndefinedContinueTarget (引数 iterationSet と « ») とする。hasUndefinedLabels が true なら true を返す。Catch の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
TryStatement :
try
Block
Finally
hasUndefinedLabels を Block の ContainsUndefinedContinueTarget (引数 iterationSet と « ») とする。hasUndefinedLabels が true なら true を返す。Finally の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
TryStatement :
try
Block
Catch
Finally
Block の ContainsUndefinedContinueTarget (引数 iterationSet と « ») が true なら true を返す。Catch の ContainsUndefinedContinueTarget (引数 iterationSet と « ») が true なら true を返す。Finally の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
Catch :
catch
(
CatchParameter
)
Block
Block の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
FunctionStatementList : [empty]
false を返す。
ClassStaticBlockStatementList : [empty]
false を返す。
ModuleItemList :
ModuleItemList
ModuleItem
hasUndefinedLabels を ModuleItemList の ContainsUndefinedContinueTarget (引数 iterationSet と « ») とする。hasUndefinedLabels が true なら true を返す。ModuleItem の ContainsUndefinedContinueTarget (引数 iterationSet と « ») を返す。
ModuleItem :
ImportDeclaration
ExportDeclaration
false を返す。
8.4 関数名の推論 (Function Name Inference)
8.4.1 静的意味論: HasName : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
expr を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。IsFunctionDefinition of expr が false なら false を返す。 expr の HasName を返す。
FunctionExpression :
function
(
FormalParameters
)
{
FunctionBody
}
GeneratorExpression :
function
*
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorExpression :
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionExpression :
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
ArrowFunction :
ArrowParameters
=>
ConciseBody
AsyncArrowFunction :
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
ClassExpression :
class
ClassTail
false を返す。
FunctionExpression :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
GeneratorExpression :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorExpression :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionExpression :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
ClassExpression :
class
BindingIdentifier
ClassTail
true を返す。
8.4.2 静的意味論: IsFunctionDefinition : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
expr を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。expr の IsFunctionDefinition を返す。
PrimaryExpression :
this
IdentifierReference
Literal
ArrayLiteral
ObjectLiteral
RegularExpressionLiteral
TemplateLiteral
MemberExpression :
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
MemberExpression
TemplateLiteral
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
.
PrivateIdentifier
NewExpression :
new
NewExpression
LeftHandSideExpression :
CallExpression
OptionalExpression
UpdateExpression :
LeftHandSideExpression
++
LeftHandSideExpression
--
++
UnaryExpression
--
UnaryExpression
UnaryExpression :
delete
UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
+
UnaryExpression
-
UnaryExpression
~
UnaryExpression
!
UnaryExpression
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
false を返す。
AssignmentExpression :
ArrowFunction
AsyncArrowFunction
FunctionExpression :
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
GeneratorExpression :
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorExpression :
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionExpression :
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
ClassExpression :
class
BindingIdentifier opt
ClassTail
true を返す。
8.4.3
静的意味論: IsAnonymousFunctionDefinition (
expr : AssignmentExpression 生成句ノード, Initializer 生成句ノード, または Expression 生成句ノード,
): Boolean
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 引数が名前を束縛しない関数定義かどうかを判定する。 It performs the following steps when called:
IsFunctionDefinition of expr が false なら false を返す。 hasName を HasName of expr とする。hasName が true なら false を返す。true を返す。
8.4.4 静的意味論: IsIdentifierRef : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
PrimaryExpression : IdentifierReference
true を返す。
PrimaryExpression :
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
CoverParenthesizedExpressionAndArrowParameterList
MemberExpression :
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
MemberExpression
TemplateLiteral
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
.
PrivateIdentifier
NewExpression :
new
NewExpression
LeftHandSideExpression :
CallExpression
OptionalExpression
false を返す。
8.4.5 実行時意味論: NamedEvaluation : 関数オブジェクトを含む正常完了または異常完了
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
expr を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。引数 name で expr の NamedEvaluation を ? 付きで返す。
ParenthesizedExpression :
(
Expression
)
アサート: IsAnonymousFunctionDefinition(Expression ) は true 。 引数 name で Expression の NamedEvaluation を ? 付きで返す。
FunctionExpression :
function
(
FormalParameters
)
{
FunctionBody
}
引数 name で FunctionExpression の InstantiateOrdinaryFunctionExpression を返す。
GeneratorExpression :
function
*
(
FormalParameters
)
{
GeneratorBody
}
引数 name で GeneratorExpression の InstantiateGeneratorFunctionExpression を返す。
AsyncGeneratorExpression :
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
引数 name で AsyncGeneratorExpression の InstantiateAsyncGeneratorFunctionExpression を返す。
AsyncFunctionExpression :
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
引数 name で AsyncFunctionExpression の InstantiateAsyncFunctionExpression を返す。
ArrowFunction :
ArrowParameters
=>
ConciseBody
引数 name で ArrowFunction の InstantiateArrowFunctionExpression を返す。
AsyncArrowFunction :
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
引数 name で AsyncArrowFunction の InstantiateAsyncArrowFunctionExpression を返す。
ClassExpression :
class
ClassTail
sourceText を ClassExpression によりマッチしたソーステキストとする。引数 undefined , name , sourceText で ClassTail の ClassDefinitionEvaluation を ? 付きで返す。
8.5 Contains
8.5.1 静的意味論: Contains : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
以下に列挙されていない本仕様中のすべての文法生成規則の代替は、暗黙的に次の既定の Contains 定義を持つ:
この生成句ノードの各子ノード child について:child が symbol のインスタンスであるなら true を返す。child が非終端記号のインスタンスならcontained を child Contains symbol の結果とする。contained が true なら true を返す。 false を返す。
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
FunctionExpression :
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
GeneratorDeclaration :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
GeneratorExpression :
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorDeclaration :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression :
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionDeclaration :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionExpression :
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
false を返す。
Note 1
部分構造に依存する静的意味規則は一般に関数定義内部を調べない。
ClassTail :
ClassHeritage opt
{
ClassBody
}
symbol が ClassBody なら true を返す。symbol が ClassHeritage ならClassHeritage が存在するなら true 、そうでなければ false を返す。ClassHeritage が存在するならClassHeritage Contains symbol が true なら true を返す。引数 symbol で ClassBody の ComputedPropertyContains の結果を返す。
Note 2
部分構造に依存する静的意味規則は一般にクラス本体内部(PropertyName 以外)を調べない。
ClassStaticBlock :
static
{
ClassStaticBlockBody
}
false を返す。
Note 3
部分構造に依存する静的意味規則は一般に static
初期化ブロック内部を調べない。
ArrowFunction :
ArrowParameters
=>
ConciseBody
symbol が NewTarget , SuperProperty , SuperCall , super
, this
のいずれでもないなら false を返す。ArrowParameters Contains symbol が true なら true を返す。ConciseBody Contains symbol を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
formals を CoverParenthesizedExpressionAndArrowParameterList により被覆される ArrowFormalParameters とする。formals Contains symbol を返す。
AsyncArrowFunction :
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
symbol が NewTarget , SuperProperty , SuperCall , super
, this
のいずれでもないなら false を返す。AsyncConciseBody Contains symbol を返す。
AsyncArrowFunction :
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
symbol が NewTarget , SuperProperty , SuperCall , super
, this
のいずれでもないなら false を返す。head を CoverCallExpressionAndAsyncArrowHead により被覆される AsyncArrowHead とする。head Contains symbol が true なら true を返す。AsyncConciseBody Contains symbol を返す。
Note 4
Contains は ArrowFunction や AsyncArrowFunction 内での new.target
, this
, super
使用を検出するために用いられる。
PropertyDefinition : MethodDefinition
symbol が MethodDefinition なら true を返す。引数 symbol で MethodDefinition の ComputedPropertyContains の結果を返す。
LiteralPropertyName : IdentifierName
false を返す。
MemberExpression :
MemberExpression
.
IdentifierName
MemberExpression Contains symbol が true なら true を返す。false を返す。
SuperProperty :
super
.
IdentifierName
symbol が 予約語 super
であるなら true を返す。false を返す。
CallExpression :
CallExpression
.
IdentifierName
CallExpression Contains symbol が true なら true を返す。false を返す。
OptionalChain :
?.
IdentifierName
false を返す。
OptionalChain :
OptionalChain
.
IdentifierName
OptionalChain Contains symbol が true なら true を返す。false を返す。
8.5.2 静的意味論: ComputedPropertyContains : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ClassElementName : PrivateIdentifier
PropertyName : LiteralPropertyName
false を返す。
PropertyName : ComputedPropertyName
ComputedPropertyName Contains symbol の結果を返す。
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
引数 symbol で ClassElementName の ComputedPropertyContains の結果を返す。
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
引数 symbol で ClassElementName の ComputedPropertyContains の結果を返す。
AsyncGeneratorMethod :
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
引数 symbol で ClassElementName の ComputedPropertyContains の結果を返す。
ClassElementList :
ClassElementList
ClassElement
inList を 引数 symbol で ClassElementList の ComputedPropertyContains とする。inList が true なら true を返す。引数 symbol で ClassElement の ComputedPropertyContains の結果を返す。
ClassElement : ClassStaticBlock
false を返す。
ClassElement : ;
false を返す。
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
引数 symbol で ClassElementName の ComputedPropertyContains の結果を返す。
FieldDefinition :
ClassElementName
Initializer opt
引数 symbol で ClassElementName の ComputedPropertyContains の結果を返す。
8.6 その他 (Miscellaneous)
これらの操作は仕様全体の複数箇所で使用される。
8.6.1 実行時意味論: InstantiateFunctionObject : ECMAScript 関数オブジェクト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
引数 env , privateEnv で FunctionDeclaration の InstantiateOrdinaryFunctionObject を返す。
GeneratorDeclaration :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
引数 env , privateEnv で GeneratorDeclaration の InstantiateGeneratorFunctionObject を返す。
AsyncGeneratorDeclaration :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
引数 env , privateEnv で AsyncGeneratorDeclaration の InstantiateAsyncGeneratorFunctionObject を返す。
AsyncFunctionDeclaration :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
引数 env , privateEnv で AsyncFunctionDeclaration の InstantiateAsyncFunctionObject を返す。
8.6.2 実行時意味論: BindingInitialization : unused を含む正常完了または異常完了
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
environment に undefined が渡されるのは、初期化値の代入に PutValue 操作を用いることを示す。これは var
文と(いくつかの)非 strict 関数の仮引数リストの場合である(10.2.11 参照)。その場合、束縛は初期化子の評価前に巻き上げられ事前初期化される。
It is defined piecewise over the following productions:
BindingIdentifier : Identifier
name を Identifier の StringValue とする。? InitializeBoundName (name , value , environment ) を返す。
BindingIdentifier : yield
? InitializeBoundName ("yield" , value , environment ) を返す。
BindingIdentifier : await
? InitializeBoundName ("await" , value , environment ) を返す。
BindingPattern : ObjectBindingPattern
? RequireObjectCoercible (value ) を実行する。 引数 value , environment で ObjectBindingPattern の BindingInitialization を ? 付きで返す。
BindingPattern : ArrayBindingPattern
iteratorRecord を ? GetIterator (value , sync ) とする。result を Completion ( 引数 iteratorRecord , environment で ArrayBindingPattern の IteratorBindingInitialization ) とする。iteratorRecord .[[Done]] が false なら ? IteratorClose (iteratorRecord , result ) を返す。? result を返す。
ObjectBindingPattern :
{
}
unused を返す。
ObjectBindingPattern :
{
BindingPropertyList
}
{
BindingPropertyList
,
}
引数 value , environment で BindingPropertyList の PropertyBindingInitialization を ? 付きで実行する。 unused を返す。
ObjectBindingPattern :
{
BindingRestProperty
}
excludedNames を空の新 List とする。引数 value , environment , excludedNames で BindingRestProperty の RestBindingInitialization を ? 付きで返す。
ObjectBindingPattern :
{
BindingPropertyList
,
BindingRestProperty
}
excludedNames を 引数 value , environment で BindingPropertyList の PropertyBindingInitialization (結果は ? ) とする。引数 value , environment , excludedNames で BindingRestProperty の RestBindingInitialization を ? 付きで返す。
8.6.2.1 InitializeBoundName ( name , value , environment )
The abstract operation InitializeBoundName takes arguments name (String), value (ECMAScript 言語値), and environment (Environment Record または undefined ) and returns unused を含む正常完了または異常完了. It performs the following steps when called:
environment が undefined でないなら! environment .InitializeBinding(name , value ) を実行する。 unused を返す。それ以外lhs を ? ResolveBinding (name ) とする。? PutValue (lhs , value ) を返す。
8.6.3 実行時意味論: IteratorBindingInitialization : unused を含む正常完了または異常完了
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
environment に undefined が渡される場合は初期化値の代入に PutValue を使うことを示し、これは非 strict 関数の仮引数リストで発生する。その場合、同名パラメータの複数存在可能性に対処するため事前初期化される。
It is defined piecewise over the following productions:
ArrayBindingPattern :
[
]
unused を返す。
ArrayBindingPattern :
[
Elision
]
引数 iteratorRecord で Elision の IteratorDestructuringAssignmentEvaluation を ? 付きで返す。
ArrayBindingPattern :
[
Elision opt
BindingRestElement
]
Elision が存在するなら引数 iteratorRecord で Elision の IteratorDestructuringAssignmentEvaluation を ? 付きで実行する。 引数 iteratorRecord , environment で BindingRestElement の IteratorBindingInitialization を ? 付きで返す。
ArrayBindingPattern :
[
BindingElementList
,
Elision
]
引数 iteratorRecord , environment で BindingElementList の IteratorBindingInitialization を ? 付きで実行する。 引数 iteratorRecord で Elision の IteratorDestructuringAssignmentEvaluation を ? 付きで返す。
ArrayBindingPattern :
[
BindingElementList
,
Elision opt
BindingRestElement
]
引数 iteratorRecord , environment で BindingElementList の IteratorBindingInitialization を ? 付きで実行する。 Elision が存在するなら引数 iteratorRecord で Elision の IteratorDestructuringAssignmentEvaluation を ? 付きで実行する。 引数 iteratorRecord , environment で BindingRestElement の IteratorBindingInitialization を ? 付きで返す。
BindingElementList :
BindingElementList
,
BindingElisionElement
引数 iteratorRecord , environment で BindingElementList の IteratorBindingInitialization を ? 付きで実行する。 引数 iteratorRecord , environment で BindingElisionElement の IteratorBindingInitialization を ? 付きで返す。
BindingElisionElement :
Elision
BindingElement
引数 iteratorRecord で Elision の IteratorDestructuringAssignmentEvaluation を ? 付きで実行する。 引数 iteratorRecord , environment で BindingElement の IteratorBindingInitialization を ? 付きで返す。
SingleNameBinding :
BindingIdentifier
Initializer opt
bindingId を BindingIdentifier の StringValue とする。lhs を ? ResolveBinding (bindingId , environment ) とする。v を undefined とする。iteratorRecord .[[Done]] が false ならnext を ? IteratorStepValue (iteratorRecord ) とする。next が done でないならv を next に設定する。Initializer が存在し v が undefined ならIsAnonymousFunctionDefinition(Initializer ) が true ならv を ? NamedEvaluation(Initializer , 引数 bindingId ) に設定する。 それ以外defaultValue を ? Evaluation(Initializer ) とする。v を ? GetValue (defaultValue ) に設定する。 environment が undefined なら ? PutValue (lhs , v ) を返す。? InitializeReferencedBinding (lhs , v ) を返す。
BindingElement :
BindingPattern
Initializer opt
v を undefined とする。iteratorRecord .[[Done]] が false ならnext を ? IteratorStepValue (iteratorRecord ) とする。next が done でないならv を next に設定する。Initializer が存在し v が undefined ならdefaultValue を ? Evaluation(Initializer ) とする。v を ? GetValue (defaultValue ) に設定する。引数 v , environment で BindingPattern の BindingInitialization を ? 付きで返す。
BindingRestElement :
...
BindingIdentifier
lhs を ? ResolveBinding (StringValue of BindingIdentifier , environment ) とする。A を ! ArrayCreate (0) とする。n を 0 とする。繰り返しnext を done とする。iteratorRecord .[[Done]] が false ならnext を ? IteratorStepValue (iteratorRecord ) に設定する。next が done ならenvironment が undefined なら ? PutValue (lhs , A ) を返す。? InitializeReferencedBinding (lhs , A ) を返す。 ! CreateDataPropertyOrThrow (A , ! ToString (𝔽 (n )), next ) を実行する。 n を n + 1 に設定する。
BindingRestElement :
...
BindingPattern
A を ! ArrayCreate (0) とする。n を 0 とする。繰り返しnext を done とする。iteratorRecord .[[Done]] が false ならnext を ? IteratorStepValue (iteratorRecord ) に設定する。next が done なら引数 A , environment で BindingPattern の BindingInitialization を ? 付きで返す。 ! CreateDataPropertyOrThrow (A , ! ToString (𝔽 (n )), next ) を実行する。 n を n + 1 に設定する。
FormalParameters : [empty]
unused を返す。
FormalParameters :
FormalParameterList
,
FunctionRestParameter
引数 iteratorRecord , environment で FormalParameterList の IteratorBindingInitialization を ? 付きで実行する。 引数 iteratorRecord , environment で FunctionRestParameter の IteratorBindingInitialization を ? 付きで返す。
FormalParameterList :
FormalParameterList
,
FormalParameter
引数 iteratorRecord , environment で FormalParameterList の IteratorBindingInitialization を ? 付きで実行する。 引数 iteratorRecord , environment で FormalParameter の IteratorBindingInitialization を ? 付きで返す。
ArrowParameters : BindingIdentifier
v を undefined とする。アサート: iteratorRecord .[[Done]] は false 。 next を ? IteratorStepValue (iteratorRecord ) とする。next が done でないならv を next に設定する。引数 v , environment で BindingIdentifier の BindingInitialization を ? 付きで返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
formals を CoverParenthesizedExpressionAndArrowParameterList により被覆される ArrowFormalParameters とする。引数 iteratorRecord , environment で formals の IteratorBindingInitialization を ? 付きで返す。
AsyncArrowBindingIdentifier : BindingIdentifier
v を undefined とする。アサート: iteratorRecord .[[Done]] は false 。 next を ? IteratorStepValue (iteratorRecord ) とする。next が done でないならv を next に設定する。引数 v , environment で BindingIdentifier の BindingInitialization を ? 付きで返す。
8.6.4 静的意味論: AssignmentTargetType : simple , web-compat , または invalid
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
IdentifierReference : Identifier
IsStrict(this IdentifierReference ) が true かつ Identifier の StringValue が "eval" または "arguments" のいずれかなら invalid を返す。 simple を返す。
IdentifierReference :
yield
await
CallExpression :
CallExpression
[
Expression
]
CallExpression
.
IdentifierName
CallExpression
.
PrivateIdentifier
MemberExpression :
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
SuperProperty
MemberExpression
.
PrivateIdentifier
simple を返す。
PrimaryExpression :
CoverParenthesizedExpressionAndArrowParameterList
expr を CoverParenthesizedExpressionAndArrowParameterList によって被覆される ParenthesizedExpression とする。expr の AssignmentTargetType を返す。
CallExpression :
CoverCallExpressionAndAsyncArrowHead
CallExpression
Arguments
Normative Optional
ホスト が Web ブラウザ又は 関数呼び出し代入ターゲットの実行時エラー をサポートし、かつ IsStrict(this CallExpression ) が false ならweb-compat を返す。invalid を返す。
PrimaryExpression :
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
CallExpression :
SuperCall
ImportCall
CallExpression
TemplateLiteral
NewExpression :
new
NewExpression
MemberExpression :
MemberExpression
TemplateLiteral
new
MemberExpression
Arguments
NewTarget :
new
.
target
ImportMeta :
import
.
meta
LeftHandSideExpression :
OptionalExpression
UpdateExpression :
LeftHandSideExpression
++
LeftHandSideExpression
--
++
UnaryExpression
--
UnaryExpression
UnaryExpression :
delete
UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
+
UnaryExpression
-
UnaryExpression
~
UnaryExpression
!
UnaryExpression
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
invalid を返す。
8.6.5 静的意味論: PropName : String または empty
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
PropertyDefinition : IdentifierReference
IdentifierReference の StringValue を返す。
PropertyDefinition :
...
AssignmentExpression
empty を返す。
PropertyDefinition :
PropertyName
:
AssignmentExpression
PropertyName の PropName を返す。
LiteralPropertyName : IdentifierName
AttributeKey : IdentifierName
IdentifierName の StringValue を返す。
LiteralPropertyName : StringLiteral
AttributeKey : StringLiteral
StringLiteral の SV を返す。
LiteralPropertyName : NumericLiteral
nbr を NumericLiteral の NumericValue とする。! ToString (nbr ) を返す。
ComputedPropertyName :
[
AssignmentExpression
]
empty を返す。
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
ClassElementName の PropName を返す。
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
ClassElementName の PropName を返す。
AsyncGeneratorMethod :
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
ClassElementName の PropName を返す。
ClassElement : ClassStaticBlock
empty を返す。
ClassElement : ;
empty を返す。
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
ClassElementName の PropName を返す。
FieldDefinition :
ClassElementName
Initializer opt
ClassElementName の PropName を返す。
ClassElementName : PrivateIdentifier
empty を返す。
9 実行可能コードと実行コンテキスト (Executable Code and Execution Contexts)
9.1 環境レコード (Environment Records)
Environment Record は、ECMAScript コードの字句上の入れ子(レキシカル)構造に基づいて Identifier と特定の変数・関数との関連付けを定義するために用いられる仕様上の型である。通常、Environment Record は FunctionDeclaration 、BlockStatement 、または TryStatement の Catch 節といった ECMAScript コードの特定の構文構造に関連付けられる。そのようなコードが評価されるたびに、そのコードが生成する識別子束縛を記録する新しい Environment Record が作成される。
すべての Environment Record は [[OuterEnv]] フィールドを持ち、これは null か、外側の Environment Record への参照である。これは Environment Record 値の論理的な入れ子をモデル化するために使われる。ある(内側の)Environment Record の外側参照は、その内側 Environment Record を論理的に囲む Environment Record への参照である。外側の Environment Record もまた自身の外側 Environment Record を持ちうる。1 つの Environment Record は複数の内側 Environment Record の外側環境として機能することがある。例えば、ある FunctionDeclaration が 2 つのネストした FunctionDeclaration を含む場合、それぞれのネストした関数の Environment Record の外側 Environment Record は、その囲む関数の現在の評価の Environment Record になる。
Environment Record は純粋に仕様上のメカニズムであり、ECMAScript 実装の特定の成果物に対応する必要はない。ECMAScript プログラムがそれらの値に直接アクセスまたは操作することは不可能である。
9.1.1 Environment Record 型階層 (The Environment Record Type Hierarchy)
Environment Record は、Environment Record が抽象クラスであり 3 つの具象サブクラス(Declarative Environment Record 、Object Environment Record 、Global Environment Record )を持つ、単純なオブジェクト指向階層に存在するものと考えられる。Function Environment Record と Module Environment Record は Declarative Environment Record のサブクラスである。
Environment Record 抽象クラスは、Table 14 に定義される抽象仕様メソッドを含む。これらの抽象メソッドは、各具象サブクラスに固有の具体的アルゴリズムを持つ。
Table 14: 環境レコードの抽象メソッド (Abstract Methods of Environment Records )
メソッド (Method)
目的 (Purpose)
HasBinding(N)
Environment Record が文字列値 N の束縛を持つか判定する。持つなら true 、持たないなら false を返す。
CreateMutableBinding(N, D)
Environment Record に新しい未初期化の可変束縛を作成する。文字列値 N は束縛名のテキスト。Boolean 引数 D が true の場合、その束縛は後で削除可能。
CreateImmutableBinding(N, S)
Environment Record に新しい未初期化の不変束縛を作成する。文字列値 N は束縛名のテキスト。S が true の場合、初期化後に設定しようとすると、参照する操作の strict モード設定に関わらず常に例外を投げる。
InitializeBinding(N, V)
既に存在し未初期化の束縛の値を設定する。文字列値 N は束縛名のテキスト。V は任意の ECMAScript 言語型の値。
SetMutableBinding(N, V, S)
既存の可変束縛の値を設定する。N は束縛名。V は任意の ECMAScript 言語型の値。S が true で束縛を設定できない場合 TypeError を投げる。
GetBindingValue(N, S)
既存束縛の値を返す。N は束縛名。S は strict モードコード(または strict セマンティクスが必要な参照)を識別する。S が true で束縛が存在しないなら ReferenceError 。束縛が存在するが未初期化なら S に関係なく ReferenceError を投げる。
DeleteBinding(N)
束縛を削除する。存在し削除成功なら true 、削除できなければ false 。存在しないなら true 。
HasThisBinding()
this
束縛を確立するか判定。確立するなら true 、しないなら false 。
HasSuperBinding()
super
メソッド束縛を確立するか判定。確立するなら true 、しないなら false 。true の場合、その Environment Record は Function Environment Record であることを含意する(逆は必ずしも成立しない)。
WithBaseObject()
この Environment Record が with
文に関連付くなら with オブジェクトを返し、それ以外は undefined を返す。
9.1.1.1 宣言的環境レコード (Declarative Environment Records)
各 Declarative Environment Record は、変数、定数、let、class、module、import、および / または function 宣言を含む ECMAScript プログラムスコープに関連付けられる。Declarative Environment Record は、そのスコープ内の宣言によって定義される識別子集合を束縛する。
9.1.1.1.1 HasBinding ( N )
The HasBinding concrete method of Declarative Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了. 引数の識別子がそのレコードで束縛される識別子の一つかどうかを判定する。 It performs the following steps when called:
envRec が N の束縛を持つなら true を返す。false を返す。
9.1.1.1.2 CreateMutableBinding ( N , D )
The CreateMutableBinding concrete method of Declarative Environment Record envRec takes arguments N (String) and D (Boolean) and returns unused を含む正常完了. 未初期化の新しい可変束縛 N を作成する。envRec に N の既存束縛があってはならない。D が true の場合、その新しい束縛は削除対象としてマークされる。 It performs the following steps when called:
アサート: envRec はまだ N の束縛を持たない。 envRec に N の未初期化可変束縛を作成する。D が true なら、後続の DeleteBinding 呼び出しで削除可能であることを記録する。unused を返す。
9.1.1.1.3 CreateImmutableBinding ( N , S )
The CreateImmutableBinding concrete method of Declarative Environment Record envRec takes arguments N (String) and S (Boolean) and returns unused を含む正常完了. 未初期化の新しい不変束縛 N を作成する。既存束縛は存在してはならない。S が true の場合、新しい束縛を strict 束縛としてマークする。 It performs the following steps when called:
アサート: envRec はまだ N の束縛を持たない。 envRec に N の未初期化不変束縛を作成する。S が true なら strict 束縛であることを記録する。unused を返す。
9.1.1.1.4 InitializeBinding ( N , V )
The InitializeBinding concrete method of Declarative Environment Record envRec takes arguments N (String) and V (ECMAScript 言語値) and returns unused を含む正常完了. 名前 N を持つ識別子の現在の未初期化束縛に値 V を設定するために使用される。未初期化束縛が既に存在しなければならない。 It performs the following steps when called:
アサート: envRec は N の未初期化束縛を持つ。 envRec における N の束縛値を V に設定する。Record その束縛が初期化されたことを記録する。unused を返す。
9.1.1.1.5 SetMutableBinding ( N , V , S )
The SetMutableBinding concrete method of Declarative Environment Record envRec takes arguments N (String), V (ECMAScript 言語値), and S (Boolean) and returns unused を含む正常完了または throw 完了. 名前 N の可変束縛値を V に変更しようとする。通常束縛は既存だが、まれに存在しない場合がある。束縛が不変束縛で S が true のとき TypeError を投げる。 It performs the following steps when called:
envRec が N の束縛を持たない場合、S が true なら ReferenceError 例外を投げる。! envRec .CreateMutableBinding(N , true ) を実行。 ! envRec .InitializeBinding(N , V ) を実行。 unused を返す。envRec における N の束縛が strict 束縛なら S を true に設定。envRec における N の束縛が未初期化ならReferenceError 例外を投げる。そうでなく envRec における N が可変束縛ならその束縛値を V に変更する。 それ以外アサート: 不変束縛の値を変更しようとしている。 S が true なら TypeError 例外を投げる。 unused を返す。
Note
ステップ 1 で束縛が存在しない状況を生む ECMAScript コード例:
function f ( ) { eval ("var x; x = (delete x, 0);" ); }
9.1.1.1.6 GetBindingValue ( N , S )
The GetBindingValue concrete method of Declarative Environment Record envRec takes arguments N (String) and S (Boolean) and returns ECMAScript 言語値を含む正常完了または throw 完了. 名前 N の束縛値を返す。束縛が存在し未初期化である場合は、S の値に関わらず ReferenceError を投げる。 It performs the following steps when called:
アサート: envRec は N の束縛を持つ。 envRec における N の束縛が未初期化なら ReferenceError 例外を投げる。現在 envRec で N に束縛されている値を返す。
9.1.1.1.7 DeleteBinding ( N )
The DeleteBinding concrete method of Declarative Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了. 削除対象として明示的に指定された束縛のみ削除できる。 It performs the following steps when called:
アサート: envRec は N の束縛を持つ。 envRec における N の束縛が削除不可なら false を返す。envRec から N の束縛を除去する。true を返す。
9.1.1.1.8 HasThisBinding ( )
The HasThisBinding concrete method of Declarative Environment Record envRec takes no arguments and returns false . It performs the following steps when called:
false を返す。
Note
9.1.1.1.9 HasSuperBinding ( )
The HasSuperBinding concrete method of Declarative Environment Record envRec takes no arguments and returns false . It performs the following steps when called:
false を返す。
Note
9.1.1.1.10 WithBaseObject ( )
The WithBaseObject concrete method of Declarative Environment Record envRec takes no arguments and returns undefined . It performs the following steps when called:
undefined を返す。
9.1.1.2 オブジェクト環境レコード (Object Environment Records)
各 Object Environment Record は binding object と呼ばれるオブジェクトに関連付けられる。Object Environment Record は、その binding object のプロパティ名 と直接対応する文字列識別子名の集合を束縛する。IdentifierName 形式でない文字列でないプロパティキー は束縛された識別子集合に含まれない。自身のプロパティと継承されたプロパティは [[Enumerable]] 属性の設定に関わらず集合に含まれる。プロパティは動的に追加・削除されうるため、Object Environment Record によって束縛される識別子集合は、プロパティを追加または削除する任意の操作の副作用として変化し得る。そのような副作用によって作成された束縛は、対応するプロパティの Writable 属性が false であっても可変束縛とみなされる。Object Environment Record には不変束縛は存在しない。
with
文(14.11 )のために作成される Object Environment Record は、関数呼び出しで使用する暗黙の this 値として binding object を提供できる。この能力は Boolean フィールド [[IsWithEnvironment]] によって制御される。
Object Environment Record は Table 15 に列挙される追加状態フィールドを持つ。
Table 15: Object Environment Record の追加フィールド (Additional Fields of Object Environment Records )
フィールド名 (Field Name)
値 (Value)
意味 (Meaning)
[[BindingObject]]
Object
この Environment Record の binding object。
[[IsWithEnvironment]]
Boolean
この Environment Record が with
文のために作成されたかどうかを示す。
9.1.1.2.1 HasBinding ( N )
The HasBinding concrete method of Object Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了または throw 完了. 関連付けられた binding object が名前 N のプロパティを持つか判定する。 It performs the following steps when called:
bindingObject を envRec .[[BindingObject]] とする。foundBinding を ? HasProperty (bindingObject , N ) とする。foundBinding が false なら false を返す。envRec .[[IsWithEnvironment]] が false なら true を返す。unscopables を ? Get (bindingObject , %Symbol.unscopables% ) とする。unscopables が Object ならblocked を ToBoolean (? Get (unscopables , N )) とする。blocked が true なら false を返す。true を返す。
9.1.1.2.2 CreateMutableBinding ( N , D )
The CreateMutableBinding concrete method of Object Environment Record envRec takes arguments N (String) and D (Boolean) and returns unused を含む正常完了または throw 完了. Environment Record の binding object に名前 N のプロパティを作成し、その値を undefined に初期化する。D が true なら新プロパティの [[Configurable]] を true にし、そうでなければ false にする。 It performs the following steps when called:
bindingObject を envRec .[[BindingObject]] とする。? DefinePropertyOrThrow (bindingObject , N , PropertyDescriptor { [[Value]] : undefined , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : D }) を実行。 unused を返す。
Note
通常 envRec は N の束縛を持たないが、持つ場合には DefinePropertyOrThrow のセマンティクスにより既存束縛が置換・シャドウされるか、または急な完了が返ることがある。
9.1.1.2.3 CreateImmutableBinding ( N , S )
Object Environment Record の CreateImmutableBinding 具体メソッドは本仕様では使用されない。
9.1.1.2.4 InitializeBinding ( N , V )
The InitializeBinding concrete method of Object Environment Record envRec takes arguments N (String) and V (ECMAScript 言語値) and returns unused を含む正常完了または throw 完了. 名前 N の現在の束縛値を V に設定する。 It performs the following steps when called:
? envRec .SetMutableBinding (N , V , false ) を実行。 unused を返す。
Note
本仕様では Object Environment Record に対する CreateMutableBinding の全使用は直後に同じ名前で InitializeBinding を呼び出す。したがって初期化状態は明示的に追跡しない。
9.1.1.2.5 SetMutableBinding ( N , V , S )
The SetMutableBinding concrete method of Object Environment Record envRec takes arguments N (String), V (ECMAScript 言語値), and S (Boolean) and returns unused を含む正常完了または throw 完了. 関連する binding object のプロパティ N の値を V に設定しようとする。通常 N のプロパティは既に存在するが、存在しないか書き込み不可の場合、エラー処理は S に依存する。 It performs the following steps when called:
bindingObject を envRec .[[BindingObject]] とする。stillExists を ? HasProperty (bindingObject , N ) とする。stillExists が false かつ S が true なら ReferenceError 例外を投げる。? Set (bindingObject , N , V , S ) を実行。 unused を返す。
9.1.1.2.6 GetBindingValue ( N , S )
The GetBindingValue concrete method of Object Environment Record envRec takes arguments N (String) and S (Boolean) and returns ECMAScript 言語値を含む正常完了または throw 完了. 関連 binding object のプロパティ N の値を返す。プロパティは存在するはずだが存在しない場合、結果は S に依存する。 It performs the following steps when called:
bindingObject を envRec .[[BindingObject]] とする。value を ? HasProperty (bindingObject , N ) とする。value が false ならS が false なら undefined を返し、そうでなければ ReferenceError 例外を投げる。? Get (bindingObject , N ) を返す。
9.1.1.2.7 DeleteBinding ( N )
The DeleteBinding concrete method of Object Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了または throw 完了. [[Configurable]] 属性が true の環境オブジェクトプロパティに対応する束縛のみ削除できる。 It performs the following steps when called:
bindingObject を envRec .[[BindingObject]] とする。? bindingObject .[[Delete]] (N ) を返す。
9.1.1.2.8 HasThisBinding ( )
The HasThisBinding concrete method of Object Environment Record envRec takes no arguments and returns false . It performs the following steps when called:
false を返す。
Note
9.1.1.2.9 HasSuperBinding ( )
The HasSuperBinding concrete method of Object Environment Record envRec takes no arguments and returns false . It performs the following steps when called:
false を返す。
Note
9.1.1.2.10 WithBaseObject ( )
The WithBaseObject concrete method of Object Environment Record envRec takes no arguments and returns Object または undefined . It performs the following steps when called:
envRec .[[IsWithEnvironment]] が true なら envRec .[[BindingObject]] を返す。そうでなければ undefined を返す。
9.1.1.3 関数環境レコード (Function Environment Records)
Function Environment Record は、関数のトップレベルスコープを表し、かつその関数が ArrowFunction でない場合 this
束縛を提供する Declarative Environment Record である。関数が ArrowFunction でなく super
を参照する場合、その Function Environment Record は関数内部からの super
メソッド呼び出しを実行するために使用される状態も含む。
Function Environment Record は Table 16 に列挙される追加状態フィールドを持つ。
Table 16: Function Environment Record の追加フィールド (Additional Fields of Function Environment Records )
フィールド名 (Field Name)
値 (Value)
意味 (Meaning)
[[ThisValue]]
ECMAScript 言語値
この関数呼び出しで使用される this 値。
[[ThisBindingStatus]]
lexical , initialized , または uninitialized
値が lexical の場合、これは ArrowFunction でありローカルな this 値を持たない。
[[FunctionObject]]
ECMAScript 関数オブジェクト
この Environment Record を生成した呼び出し元の関数オブジェクト 。
[[NewTarget]]
コンストラクタ または undefined
この Environment Record が [[Construct]] 内部メソッドで作成された場合、[[NewTarget]] はその [[Construct]] newTarget パラメータの値。それ以外は undefined 。
Function Environment Record は Table 14 に挙げる Declarative Environment Record メソッドすべてをサポートし、HasThisBinding と HasSuperBinding を除き同一の仕様を共有する。さらに Table 17 に示すメソッドをサポートする:
Table 17: Function Environment Record の追加メソッド (Additional Methods of Function Environment Records )
メソッド (Method)
目的 (Purpose)
GetThisBinding()
この Environment Record の this
束縛の値を返す。未初期化なら ReferenceError を投げる。
9.1.1.3.1 BindThisValue ( envRec , V )
The abstract operation BindThisValue takes arguments envRec (Function Environment Record ) and V (ECMAScript 言語値) and returns unused を含む正常完了または throw 完了. envRec .[[ThisValue]] を設定し初期化済みであることを記録する。 It performs the following steps when called:
アサート: envRec .[[ThisBindingStatus]] は lexical ではない。 envRec .[[ThisBindingStatus]] が initialized なら ReferenceError 例外を投げる。envRec .[[ThisValue]] を V に設定する。envRec .[[ThisBindingStatus]] を initialized に設定する。unused を返す。
9.1.1.3.2 HasThisBinding ( )
The HasThisBinding concrete method of Function Environment Record envRec takes no arguments and returns Boolean. It performs the following steps when called:
envRec .[[ThisBindingStatus]] が lexical なら false 、そうでなければ true を返す。
9.1.1.3.3 HasSuperBinding ( )
The HasSuperBinding concrete method of Function Environment Record envRec takes no arguments and returns Boolean. It performs the following steps when called:
envRec .[[ThisBindingStatus]] が lexical なら false を返す。envRec .[[FunctionObject]] .[[HomeObject]] が undefined なら false 、そうでなければ true を返す。
9.1.1.3.4 GetThisBinding ( )
The GetThisBinding concrete method of Function Environment Record envRec takes no arguments and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:
アサート: envRec .[[ThisBindingStatus]] は lexical ではない。 envRec .[[ThisBindingStatus]] が uninitialized なら ReferenceError 例外を投げる。envRec .[[ThisValue]] を返す。
9.1.1.3.5 GetSuperBase ( envRec )
The abstract operation GetSuperBase takes argument envRec (Function Environment Record ) and returns Object, null , または undefined . envRec に束縛された super
プロパティアクセスの基底オブジェクトを返す。値 undefined はそうしたアクセスが実行時エラーになることを示す。 It performs the following steps when called:
home を envRec .[[FunctionObject]] .[[HomeObject]] とする。home が undefined なら undefined を返す。アサート: home は ordinary object。 ! home .[[GetPrototypeOf]] () を返す。
9.1.1.4 グローバル環境レコード (Global Environment Records)
Global Environment Record は、共通の realm で処理されるすべての ECMAScript Script 要素に共有される最も外側のスコープを表す。Global Environment Record は組み込みグローバル(19 )、グローバルオブジェクト のプロパティ、および Script 内に現れるすべてのトップレベル宣言(8.2.9 , 8.2.11 )に束縛を提供する。
Global Environment Record は論理的には単一のレコードだが、Object Environment Record と Declarative Environment Record を包含する合成体として仕様化される。Object Environment Record の基底オブジェクトは関連する Realm Record のグローバルオブジェクト であり、これは Global Environment Record の GetThisBinding 具体メソッドが返す値である。Global Environment Record の Object Environment Record 部分は、すべての組み込みグローバル(19 )およびグローバルコード内の FunctionDeclaration 、GeneratorDeclaration 、AsyncFunctionDeclaration 、AsyncGeneratorDeclaration 、VariableStatement によって導入される束縛を含む。それ以外のグローバルコード内の ECMAScript 宣言による束縛は Global Environment Record の Declarative Environment Record 部分に含まれる。
プロパティはグローバルオブジェクト 上に直接作成され得る。したがって Global Environment Record の Object Environment Record 部分は、宣言(FunctionDeclaration 等)によって明示的に作成された束縛と、グローバルオブジェクト のプロパティとして暗黙に作成された束縛の両方を含み得る。どの束縛が宣言によって明示的に作成されたものか識別するため、Global Environment Record は CreateGlobalVarBinding と CreateGlobalFunctionBinding 抽象操作 で束縛された名前のリストを保持する。
Global Environment Record は Table 18 に挙げる追加フィールドおよび Table 19 に挙げる追加メソッドを持つ。
Table 18: Global Environment Record の追加フィールド (Additional Fields of Global Environment Records )
Table 19: Global Environment Record の追加メソッド (Additional Methods of Global Environment Records )
9.1.1.4.1 HasBinding ( N )
The HasBinding concrete method of Global Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了または throw 完了. 引数の識別子がこのレコードで束縛される一つか判定する。 It performs the following steps when called:
DclRec を envRec .[[DeclarativeRecord]] とする。! DclRec .HasBinding(N ) が true なら true を返す。 ObjRec を envRec .[[ObjectRecord]] とする。? ObjRec .HasBinding (N ) を返す。
9.1.1.4.2 CreateMutableBinding ( N , D )
The CreateMutableBinding concrete method of Global Environment Record envRec takes arguments N (String) and D (Boolean) and returns unused を含む正常完了または throw 完了. 未初期化の新しい可変束縛 N を作成する。束縛は関連 DeclarativeRecord に作成される。N の束縛は既に存在してはならない。D が true の場合、削除対象としてマークされる。 It performs the following steps when called:
DclRec を envRec .[[DeclarativeRecord]] とする。! DclRec .HasBinding(N ) が true なら TypeError 例外を投げる。 ! DclRec .CreateMutableBinding(N , D ) を返す。
9.1.1.4.3 CreateImmutableBinding ( N , S )
The CreateImmutableBinding concrete method of Global Environment Record envRec takes arguments N (String) and S (Boolean) and returns unused を含む正常完了または throw 完了. 未初期化の新しい不変束縛 N を作成する。N の既存束縛は存在してはならない。S が true なら strict 束縛としてマーク。 It performs the following steps when called:
DclRec を envRec .[[DeclarativeRecord]] とする。! DclRec .HasBinding(N ) が true なら TypeError 例外を投げる。 ! DclRec .CreateImmutableBinding(N , S ) を返す。
9.1.1.4.4 InitializeBinding ( N , V )
The InitializeBinding concrete method of Global Environment Record envRec takes arguments N (String) and V (ECMAScript 言語値) and returns unused を含む正常完了または throw 完了. 名前 N の未初期化束縛値を V に設定する。未初期化束縛が既に存在する必要がある。 It performs the following steps when called:
DclRec を envRec .[[DeclarativeRecord]] とする。! DclRec .HasBinding(N ) が true なら! DclRec .InitializeBinding(N , V ) を返す。 アサート: 束縛が存在するなら Object Environment Record にある。 ObjRec を envRec .[[ObjectRecord]] とする。? ObjRec .InitializeBinding (N , V ) を返す。
9.1.1.4.5 SetMutableBinding ( N , V , S )
The SetMutableBinding concrete method of Global Environment Record envRec takes arguments N (String), V (ECMAScript 言語値), and S (Boolean) and returns unused を含む正常完了または throw 完了. 名前 N の現在の束縛値を V に変更しようとする。不変束縛で S が true なら TypeError 。プロパティ N が存在しないか書き込み不可の場合の処理は S に依存。 It performs the following steps when called:
DclRec を envRec .[[DeclarativeRecord]] とする。! DclRec .HasBinding(N ) が true なら? DclRec .SetMutableBinding(N , V , S ) を返す。 ObjRec を envRec .[[ObjectRecord]] とする。? ObjRec .SetMutableBinding (N , V , S ) を返す。
9.1.1.4.6 GetBindingValue ( N , S )
The GetBindingValue concrete method of Global Environment Record envRec takes arguments N (String) and S (Boolean) and returns ECMAScript 言語値を含む正常完了または throw 完了. 名前 N の束縛値を返す。束縛が未初期化なら ReferenceError 。プロパティ N の存在や書き込み可否に関連するエラー処理は S に依存。 It performs the following steps when called:
DclRec を envRec .[[DeclarativeRecord]] とする。! DclRec .HasBinding(N ) が true なら? DclRec .GetBindingValue(N , S ) を返す。 ObjRec を envRec .[[ObjectRecord]] とする。? ObjRec .GetBindingValue (N , S ) を返す。
9.1.1.4.7 DeleteBinding ( N )
The DeleteBinding concrete method of Global Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了または throw 完了. 削除対象として明示的に指定された束縛のみ削除できる。 It performs the following steps when called:
DclRec を envRec .[[DeclarativeRecord]] とする。! DclRec .HasBinding(N ) が true なら! DclRec .DeleteBinding(N ) を返す。 ObjRec を envRec .[[ObjectRecord]] とする。globalObject を ObjRec .[[BindingObject]] とする。existingProp を ? HasOwnProperty (globalObject , N ) とする。existingProp が true なら? ObjRec .DeleteBinding (N ) を返す。 true を返す。
9.1.1.4.8 HasThisBinding ( )
The HasThisBinding concrete method of Global Environment Record envRec takes no arguments and returns true . It performs the following steps when called:
true を返す。
Note
9.1.1.4.9 HasSuperBinding ( )
The HasSuperBinding concrete method of Global Environment Record envRec takes no arguments and returns false . It performs the following steps when called:
false を返す。
Note
9.1.1.4.10 WithBaseObject ( )
The WithBaseObject concrete method of Global Environment Record envRec takes no arguments and returns undefined . It performs the following steps when called:
undefined を返す。
9.1.1.4.11 GetThisBinding ( )
The GetThisBinding concrete method of Global Environment Record envRec takes no arguments and returns Object を含む正常完了. It performs the following steps when called:
envRec .[[GlobalThisValue]] を返す。
9.1.1.4.12 HasLexicalDeclaration ( envRec , N )
The abstract operation HasLexicalDeclaration takes arguments envRec (Global Environment Record ) and N (String) and returns Boolean. 引数の識別子が、LexicalDeclaration や ClassDeclaration のようなレキシカル宣言で envRec に作成された束縛を持つか判定する。 It performs the following steps when called:
DclRec を envRec .[[DeclarativeRecord]] とする。! DclRec .HasBinding(N ) を返す。
9.1.1.4.13 HasRestrictedGlobalProperty ( envRec , N )
The abstract operation HasRestrictedGlobalProperty takes arguments envRec (Global Environment Record ) and N (String) and returns Boolean を含む正常完了または throw 完了. 引数の識別子が、グローバルレキシカル束縛によってシャドウされてはならないグローバルオブジェクト のプロパティ名 か判定する。 It performs the following steps when called:
ObjRec を envRec .[[ObjectRecord]] とする。globalObject を ObjRec .[[BindingObject]] とする。existingProp を ? globalObject .[[GetOwnProperty]] (N ) とする。existingProp が undefined なら false を返す。existingProp .[[Configurable]] が true なら false を返す。true を返す。
Note
グローバルオブジェクト 上には var や function 宣言ではなく直接作成されたプロパティが存在し得る。非 configurable なグローバルオブジェクト のプロパティと同名のグローバルレキシカル束縛は作成できない。"undefined" はその例である。
9.1.1.4.14 CanDeclareGlobalVar ( envRec , N )
The abstract operation CanDeclareGlobalVar takes arguments envRec (Global Environment Record ) and N (String) and returns Boolean を含む正常完了または throw 完了. 同じ引数 N で CreateGlobalVarBinding 呼び出しが成功するか判定する。冗長な var 宣言や既存グローバルオブジェクト プロパティに対する var 宣言は許可される。 It performs the following steps when called:
ObjRec を envRec .[[ObjectRecord]] とする。globalObject を ObjRec .[[BindingObject]] とする。hasProperty を ? HasOwnProperty (globalObject , N ) とする。hasProperty が true なら true を返す。? IsExtensible (globalObject ) を返す。
9.1.1.4.15 CanDeclareGlobalFunction ( envRec , N )
The abstract operation CanDeclareGlobalFunction takes arguments envRec (Global Environment Record ) and N (String) and returns Boolean を含む正常完了または throw 完了. 同じ引数 N で CreateGlobalFunctionBinding 呼び出しが成功するか判定する。 It performs the following steps when called:
ObjRec を envRec .[[ObjectRecord]] とする。globalObject を ObjRec .[[BindingObject]] とする。existingProp を ? globalObject .[[GetOwnProperty]] (N ) とする。existingProp が undefined なら ? IsExtensible (globalObject ) を返す。existingProp .[[Configurable]] が true なら true を返す。IsDataDescriptor (existingProp ) が true かつ existingProp が属性 { [[Writable]] : true , [[Enumerable]] : true } を持つなら true を返す。false を返す。
9.1.1.4.16 CreateGlobalVarBinding ( envRec , N , D )
The abstract operation CreateGlobalVarBinding takes arguments envRec (Global Environment Record ), N (String), and D (Boolean) and returns unused を含む正常完了または throw 完了. 関連する Object Environment Record に可変束縛を作成・初期化する。既存束縛があれば再利用され初期化済みとみなされる。 It performs the following steps when called:
ObjRec を envRec .[[ObjectRecord]] とする。globalObject を ObjRec .[[BindingObject]] とする。hasProperty を ? HasOwnProperty (globalObject , N ) とする。extensible を ? IsExtensible (globalObject ) とする。hasProperty が false かつ extensible が true なら? ObjRec .CreateMutableBinding (N , D ) を実行。 ? ObjRec .InitializeBinding (N , undefined ) を実行。 unused を返す。
9.1.1.4.17 CreateGlobalFunctionBinding ( envRec , N , V , D )
The abstract operation CreateGlobalFunctionBinding takes arguments envRec (Global Environment Record ), N (String), V (ECMAScript 言語値), and D (Boolean) and returns unused を含む正常完了または throw 完了. 関連する Object Environment Record に可変束縛を作成・初期化する。既存束縛があれば置き換える。 It performs the following steps when called:
ObjRec を envRec .[[ObjectRecord]] とする。globalObject を ObjRec .[[BindingObject]] とする。existingProp を ? globalObject .[[GetOwnProperty]] (N ) とする。existingProp が undefined または existingProp .[[Configurable]] が true ならdesc を PropertyDescriptor { [[Value]] : V , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : D } とする。それ以外desc を PropertyDescriptor { [[Value]] : V } とする。 ? DefinePropertyOrThrow (globalObject , N , desc ) を実行。 ? Set (globalObject , N , V , false ) を実行。 unused を返す。
Note
グローバル関数宣言は常にグローバルオブジェクト の自身プロパティとして表現される。可能であれば既存の自身プロパティは標準的な属性値集合に再設定される。ステップ 7 は InitializeBinding 具体メソッド呼び出しと等価であり、globalObject が Proxy の場合同じ Proxy トラップ呼び出し列を生成する。
9.1.1.5 モジュール環境レコード (Module Environment Records)
Module Environment Record は ECMAScript Module の外側スコープを表す Declarative Environment Record である。通常の可変・不変束縛に加え、他の Environment Record に存在する対象束縛への間接アクセスを提供する不変の import 束縛も提供する。
Module Environment Record は Table 14 に挙げる Declarative Environment Record メソッドのすべてをサポートし、GetBindingValue, DeleteBinding, HasThisBinding, GetThisBinding を除き同じ仕様を共有する。さらに Table 20 に示すメソッドをサポートする:
Table 20: Module Environment Record の追加メソッド (Additional Methods of Module Environment Records )
9.1.1.5.1 GetBindingValue ( N , S )
The GetBindingValue concrete method of Module Environment Record envRec takes arguments N (String) and S (Boolean) and returns ECMAScript 言語値を含む正常完了または throw 完了. 名前 N の束縛値を返す。ただし束縛が間接束縛なら対象束縛値を返す。束縛が未初期化なら ReferenceError を投げる。 It performs the following steps when called:
アサート: S は true 。 アサート: envRec は N の束縛を持つ。 N の束縛が間接束縛ならM と N2 をこの束縛作成時に提供された間接化値とする。targetEnv を M .[[Environment]] とする。targetEnv が empty なら ReferenceError 例外を投げる。? targetEnv .GetBindingValue (N2 , true ) を返す。 envRec における N の束縛が未初期化なら ReferenceError 例外を投げる。現在 envRec で N に束縛されている値を返す。
Note
S は常に true 。Module は常に strict モードコードだからである。
9.1.1.5.2 DeleteBinding ( N )
Module Environment Record の DeleteBinding 具体メソッドは本仕様では使用されない。
Note
9.1.1.5.3 HasThisBinding ( )
The HasThisBinding concrete method of Module Environment Record envRec takes no arguments and returns true . It performs the following steps when called:
true を返す。
Note
9.1.1.5.4 GetThisBinding ( )
The GetThisBinding concrete method of Module Environment Record envRec takes no arguments and returns undefined を含む正常完了. It performs the following steps when called:
undefined を返す。
9.1.1.5.5 CreateImportBinding ( envRec , N , M , N2 )
The abstract operation CreateImportBinding takes arguments envRec (Module Environment Record ), N (String), M (Module Record ), and N2 (String) and returns unused . 名前 N の新しい初期化済み不変間接束縛を作成する。envRec に N の束縛は存在してはならない。N2 は M の Module Environment Record に存在する束縛名。新束縛の値へのアクセスは対象束縛値を間接的にアクセスする。 It performs the following steps when called:
アサート: envRec はまだ N の束縛を持たない。 アサート: M .[[Environment]] のインスタンス化時、N2 の直接束縛を持つ。 envRec に M , N2 を対象とする N の不変間接束縛を(初期化済みとして)作成する。unused を返す。
9.1.2 環境レコード操作 (Environment Record Operations)
以下の抽象操作 は本仕様で Environment Record を操作するために使用される:
9.1.2.1 GetIdentifierReference ( env , name , strict )
The abstract operation GetIdentifierReference takes arguments env (Environment Record または null ), name (String), and strict (Boolean) and returns Reference Record を含む正常完了または throw 完了. It performs the following steps when called:
env が null ならReference Record { [[Base]] : unresolvable , [[ReferencedName]] : name , [[Strict]] : strict , [[ThisValue]] : empty } を返す。exists を ? env .HasBinding (name ) とする。exists が true ならReference Record { [[Base]] : env , [[ReferencedName]] : name , [[Strict]] : strict , [[ThisValue]] : empty } を返す。それ以外outer を env .[[OuterEnv]] とする。? GetIdentifierReference (outer , name , strict ) を返す。
9.1.2.2 NewDeclarativeEnvironment ( E )
The abstract operation NewDeclarativeEnvironment takes argument E (Environment Record または null ) and returns Declarative Environment Record . It performs the following steps when called:
绑定を含まない新しい Declarative Environment Record env を生成する。 env .[[OuterEnv]] を E に設定。env を返す。
9.1.2.3 NewObjectEnvironment ( O , W , E )
The abstract operation NewObjectEnvironment takes arguments O (Object), W (Boolean), and E (Environment Record または null ) and returns Object Environment Record . It performs the following steps when called:
新しい Object Environment Record env を生成する。 env .[[BindingObject]] を O に設定。env .[[IsWithEnvironment]] を W に設定。env .[[OuterEnv]] を E に設定。env を返す。
9.1.2.4 NewFunctionEnvironment ( F , newTarget )
The abstract operation NewFunctionEnvironment takes arguments F (ECMAScript 関数オブジェクト ) and newTarget (Object または undefined ) and returns Function Environment Record . It performs the following steps when called:
束縛を含まない新しい Function Environment Record env を生成。 env .[[FunctionObject]] を F に設定。F .[[ThisMode]] が lexical なら env .[[ThisBindingStatus]] を lexical に設定。それ以外なら env .[[ThisBindingStatus]] を uninitialized に設定。 env .[[NewTarget]] を newTarget に設定。env .[[OuterEnv]] を F .[[Environment]] に設定。env を返す。
9.1.2.5 NewGlobalEnvironment ( G , thisValue )
The abstract operation NewGlobalEnvironment takes arguments G (Object) and thisValue (Object) and returns Global Environment Record . It performs the following steps when called:
objRec を NewObjectEnvironment (G , false , null ) とする。dclRec を NewDeclarativeEnvironment (null ) とする。新しい Global Environment Record env を生成。 env .[[ObjectRecord]] を objRec に設定。env .[[GlobalThisValue]] を thisValue に設定。env .[[DeclarativeRecord]] を dclRec に設定。env .[[OuterEnv]] を null に設定。env を返す。
9.1.2.6 NewModuleEnvironment ( E )
The abstract operation NewModuleEnvironment takes argument E (Environment Record ) and returns Module Environment Record . It performs the following steps when called:
束縛を含まない新しい Module Environment Record env を生成する。 env .[[OuterEnv]] を E に設定。env を返す。
9.2 PrivateEnvironment レコード
PrivateEnvironment Record は、ECMAScript コード内の ClassDeclaration および ClassExpression の字句上の入れ子構造に基づいて Private Name を追跡するための仕様上のメカニズムである。Environment Record に類似しているが別個のものである。各 PrivateEnvironment Record は 1 つの ClassDeclaration または ClassExpression に関連付けられる。そのようなクラスが評価されるたびに、そのクラスで宣言された Private Name を記録する新たな PrivateEnvironment Record が生成される。
各 PrivateEnvironment Record は Table 21 で定義されるフィールドを持つ。
Table 21: PrivateEnvironment Record のフィールド (PrivateEnvironment Record Fields)
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:
names を新しい空の List とする。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:
names を privateEnv .[[Names]] とする。names の各 Private Name pn について、pn .[[Description]] が identifier であるならpn を返す。outerPrivateEnv を privateEnv .[[OuterPrivateEnvironment]] とする。アサート: outerPrivateEnv は null ではない。 ResolvePrivateIdentifier (outerPrivateEnv , identifier ) を返す。
9.3 Realm
評価される前に、すべての ECMAScript コードは realm に関連付けられなければならない。概念的には realm は一連の組み込みオブジェクト、ECMAScript のグローバル環境、そのグローバル環境のスコープ内で読み込まれるすべての ECMAScript コード、及びその他関連する状態とリソースから構成される。
realm は本仕様では Table 22 に示すフィールドを持つ Realm Record として表現される:
Table 22: Realm Record のフィールド (Realm Record Fields)
9.3.1 InitializeHostDefinedRealm ( )
The abstract operation InitializeHostDefinedRealm takes no arguments and returns unused を含む正常完了または throw 完了. It performs the following steps when called:
realm を新しい Realm Record とする。CreateIntrinsics (realm ) を実行。realm .[[AgentSignifier]] を AgentSignifier () に設定。realm .[[TemplateMap]] を新しい空の List に設定。newContext を新しい実行コンテキストとする。newContext の Function を null に設定。newContext の Realm を realm に設定。newContext の ScriptOrModule を null に設定。実行コンテキストスタックに newContext を push する; newContext が現在の実行コンテキストとなる。 ホスト が realm の global object として奇異 (exotic) オブジェクトを要求する場合、global をホスト定義 の方法で作成されたそのようなオブジェクトとする。それ以外、global を OrdinaryObjectCreate (realm .[[Intrinsics]] .[[%Object.prototype% ]]) とする。 ホスト が realm のグローバルスコープにおける this
束縛が global object とは異なるオブジェクトを返すことを要求する場合、thisValue をホスト定義 の方法で作成されたそのようなオブジェクトとする。それ以外、thisValue を global とする。 realm .[[GlobalObject]] を global に設定。realm .[[GlobalEnv]] を NewGlobalEnvironment (global , thisValue ) に設定。? SetDefaultGlobalBindings (realm ) を実行。 ホスト定義 のグローバルオブジェクト プロパティを global 上に作成する。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:
realmRec .[[Intrinsics]] を新しい Record に設定。realmRec .[[Intrinsics]] のフィールドを Table 6 に列挙される値で設定する。フィールド名は表の第 1 列の名前。各フィールドの値は、19 から 28 の各節で定義されたとおりのプロパティ値で完全かつ再帰的に埋められた新しいオブジェクト値。すべてのオブジェクトプロパティ値は新たに作成されるオブジェクト値。ビルトイン関数オブジェクト となる値はすべて CreateBuiltinFunction (steps , length , name , slots , realmRec , prototype ) を実行して作成される。ここで steps は本仕様で提供されるその関数の定義、name は関数の "name" プロパティの初期値、length は "length" プロパティの初期値、slots はその関数に指定された内部スロット名(存在する場合)のリスト、prototype はその関数の [[Prototype]] 内部スロットの指定値。intrinsic とそのプロパティの生成順序は未生成のオブジェクトに依存しないよう配慮しなければならない。AddRestrictedFunctionProperties (realmRec .[[Intrinsics]] .[[%Function.prototype% ]], realmRec ) を実行。unused を返す。
9.3.3 SetDefaultGlobalBindings ( realmRec )
The abstract operation SetDefaultGlobalBindings takes argument realmRec (a Realm Record ) and returns unused を含む正常完了または throw 完了. It performs the following steps when called:
global を realmRec .[[GlobalObject]] とする。節 19 で指定される Global Object の各プロパティについて、name をプロパティ名 の String 値とする。desc をそのプロパティに対して指定された属性を含む、完全に埋められたデータ Property Descriptor とする。19.2 、19.3 、または 19.4 に列挙されたプロパティについては [[Value]] 属性の値は realmRec から対応する intrinsic オブジェクト。? DefinePropertyOrThrow (global , name , desc ) を実行。 unused を返す。
9.4 実行コンテキスト (Execution Contexts)
execution context は、ECMAScript 実装によるコードの実行時評価を追跡するために用いられる仕様デバイスである。任意の時点で、実際にコードを実行している agent ごとに高々 1 つの実行コンテキストが存在する。これをその agent の 実行中実行コンテキスト (running execution context) と呼ぶ。本仕様中で実行中実行コンテキストへの参照は常に囲んでいる agent の実行中実行コンテキストを指す。
実行コンテキストスタック (execution context stack) は実行コンテキストを追跡するために使用される。実行中実行コンテキストは常にこのスタックの最上位要素である。現在の実行中実行コンテキストに関連付く実行可能コードから、関連付いていない別の実行可能コードへ制御が移るたびに新しい実行コンテキストが生成される。新たな実行コンテキストはスタックに push され、実行中実行コンテキストとなる。
実行コンテキストは、関連コードの実行進行状況を追跡するために必要な実装依存状態を保持する。各実行コンテキストは少なくとも Table 23 に列挙される状態コンポーネントを持つ。
Table 23: すべての実行コンテキストに共通の状態コンポーネント (State Components for All Execution Contexts)
実行中実行コンテキストによるコード評価は本仕様で定義された様々な地点で一時停止され得る。一度一時停止されると別の実行コンテキストが実行中実行コンテキストとなり自身のコード評価を開始し得る。後で一時停止中の実行コンテキストが再び実行中となり、以前に一時停止された地点から評価を継続し得る。実行中実行コンテキストの状態移行は通常スタック的 (LIFO) に行われるが、いくつかの ECMAScript 機能では非 LIFO の遷移が必要である。
実行中実行コンテキストの Realm コンポーネントの値は current Realm Record とも呼ばれる。Function コンポーネントの値は active function object とも呼ばれる。
ECMAScript コード実行コンテキスト は Table 24 に列挙される追加状態コンポーネントを持つ。
Table 24: ECMAScript コード実行コンテキスト の追加状態コンポーネント (Additional State Components for ECMAScript Code Execution Contexts)
実行コンテキストの LexicalEnvironment および VariableEnvironment コンポーネントは常に Environment Record である。
Generator の評価を表す実行コンテキストは Table 25 に示す追加状態コンポーネントを持つ。
Table 25: Generator 実行コンテキストの追加状態コンポーネント (Additional State Components for Generator Execution Contexts)
コンポーネント
目的
Generator
この実行コンテキストが評価している Generator。
ほとんどの場合、本仕様のアルゴリズムが直接操作するのは実行中実行コンテキスト(スタック頂上)のみである。したがって「LexicalEnvironment」や「VariableEnvironment」という語が修飾なしに使われるとき、それは実行中実行コンテキストのそれらを指す。
実行コンテキストは純粋に仕様上のメカニズムであり、ECMAScript 実装の特定成果物に対応する必要はない。ECMAScript コードから実行コンテキストへ直接アクセスや観測を行うことは不可能である。
9.4.1 GetActiveScriptOrModule ( )
The abstract operation GetActiveScriptOrModule takes no arguments and returns a Script Record , a Module Record , or null . 実行中実行コンテキストに基づき、実行中の script または module を決定するために用いられる。 It performs the following steps when called:
実行コンテキストスタックが空なら null を返す。 ec を、実行コンテキストスタック上で最上位から見て ScriptOrModule コンポーネントが null でない最初の実行コンテキストとする。そのような実行コンテキストが存在しなければ null を返し、存在するなら ec の ScriptOrModule を返す。
9.4.2 ResolveBinding ( name [ , env ] )
The abstract operation ResolveBinding takes argument name (a String) and optional argument env (an Environment Record or undefined ) and returns either a normal completion containing a Reference Record or a throw completion . name の束縛を決定するために用いられる。env は探索対象の Environment Record を明示的に与えるために使用できる。 It performs the following steps when called:
env が与えられていない、または env が undefined ならenv を実行中実行コンテキストの LexicalEnvironment に設定する。アサート: env は Environment Record である。 strict を評価されつつある構文生成規則に対する IsStrict の結果とする。? 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:
env を実行中実行コンテキストの LexicalEnvironment とする。繰り返し:exists を env .HasThisBinding() とする。exists が true なら env を返す。outer を env .[[OuterEnv]] とする。アサート: outer は null ではない。 env を outer に設定する。
Note
ステップ 2 のループは、連鎖が常に this
束縛を持つグローバル環境で終わるため必ず停止する。
9.4.4 ResolveThisBinding ( )
The abstract operation ResolveThisBinding takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion . 実行中実行コンテキストの LexicalEnvironment を用いてキーワード this
の束縛を決定する。 It performs the following steps when called:
envRec を GetThisEnvironment () とする。? envRec .GetThisBinding() を返す。
9.4.5 GetNewTarget ( )
The abstract operation GetNewTarget takes no arguments and returns an Object or undefined . 実行中実行コンテキストの LexicalEnvironment を用いて NewTarget 値を決定する。 It performs the following steps when called:
envRec を GetThisEnvironment () とする。アサート: envRec は [[NewTarget]] フィールドを持つ。 envRec .[[NewTarget]] を返す。
9.4.6 GetGlobalObject ( )
The abstract operation GetGlobalObject takes no arguments and returns an Object. 現在実行中の実行コンテキストが使用するグローバルオブジェクト を返す。 It performs the following steps when called:
currentRealm を current Realm Record とする。currentRealm .[[GlobalObject]] を返す。
9.5 Job と Job をキューに入れるためのホスト操作 (Jobs and Host Operations to Enqueue Jobs)
Job とは、他の ECMAScript 計算が現在進行中でないときに ECMAScript 計算を開始する、引数を持たない Abstract Closure である。
Job は特定の agent 内で ECMAScript ホスト環境 によって実行がスケジュールされる。本仕様は、HostEnqueueGenericJob 、HostEnqueueFinalizationRegistryCleanupJob 、HostEnqueuePromiseJob 、および HostEnqueueTimeoutJob というホストフック を記述し、Job をスケジュールする。これらのホストフック は、Job のスケジューリングに課される追加制約によって整理されている。ホスト は追加で Job をスケジュールする抽象操作 を定義してよい。そのような操作は Job Abstract Closure と realm (Realm Record または null )を引数に取る。Realm Record が与えられた場合、これらの操作は、その realm を所有する agent において、指定された将来時点でその realm において Job を実行するようスケジュールする。realm に null が与えられた場合、その Job は ECMAScript コードを評価しない。実装は以下の要件に従わなければならない:
Note 1
ホスト環境 はスケジューリングに関して
Job を一様に扱う必要はない。例えば、Web ブラウザや Node.js は Promise 処理の
Job を他の作業より高優先度で扱う。将来の機能追加により、必ずしも高優先度で扱われない新たな
Job が追加されるかもしれない。
任意の時点で、scriptOrModule (Script Record 、Module Record 、または null )が次の条件をすべて満たすなら、その時点の active script or module である:
任意の時点で、次の条件をすべて満たすとき、その実行は prepared to evaluate ECMAScript code である:
Note 2
ホスト環境 は実行コンテキストを実行コンテキストスタックに push することでコード評価の準備を行うことができる。具体的な手順は実装定義 である。
Realm の具体的選択はホスト環境 次第である。この初期実行コンテキストと Realm は、任意のコールバック関数が呼ばれる前にのみ使用される。Promise ハンドラのような Job 関連のコールバック関数が呼び出されると、その呼び出しは独自の実行コンテキストと Realm を push する。
特定種類の Job には追加の適合要件が存在する。
9.5.1 JobCallback Record
JobCallback Record は関数オブジェクト とホスト定義 値を格納するための Record 値である。ホスト によってキューに入れられた Job を通じて呼び出される関数オブジェクト は追加のホスト定義 コンテキストを持ち得る。その状態を伝播するために、Job Abstract Closure は関数オブジェクト を直接捕捉して呼び出すべきではない。代わりに HostMakeJobCallback と HostCallJobCallback を用いる。
Note
例えば WHATWG HTML 仕様 (https://html.spec.whatwg.org/ ) は、ホスト定義 値を用いて Promise コールバック用の incumbent settings object を伝播する。
JobCallback Record は Table 26 に列挙するフィールドを持つ。
Table 26: JobCallback Record のフィールド (JobCallback Record Fields)
Field Name
Value
Meaning
[[Callback]]
a function object
Job が呼び出されたときに実行する関数。
[[HostDefined]]
anything (default value is empty )
ホスト が使用するために予約されたフィールド。
9.5.2 HostMakeJobCallback ( callback )
The host-defined abstract operation HostMakeJobCallback takes argument callback (a function object) and returns a JobCallback Record .
HostMakeJobCallback の実装は次の要件に従わなければならない:
HostMakeJobCallback のデフォルト実装は呼び出されたとき次を行う:
JobCallback Record { [[Callback]] : callback , [[HostDefined]] : empty } を返す。
Web ブラウザではない ECMAScript ホスト は HostMakeJobCallback のデフォルト実装を使用しなければならない。
Note
これは、コールバックが最終的にスケジュールされ実行される責任を持つ関数に渡される時点で呼ばれる。例えば promise.then(thenAction)
はリアクション Job のスケジュール時ではなく Promise.prototype.then
呼び出し時に thenAction に対して MakeJobCallback を呼ぶ。
9.5.3 HostCallJobCallback ( jobCallback , V , argumentsList )
The host-defined abstract operation HostCallJobCallback takes arguments jobCallback (a JobCallback Record ), V (an ECMAScript language value), and argumentsList (a List of ECMAScript language values ) and returns either a normal completion containing an ECMAScript language value or a throw completion .
HostCallJobCallback の実装は次の要件に従わなければならない:
Call(jobCallback .[[Callback]] , V , argumentsList ) を実行しその結果を返さなければならない。
Note
この要件は、ホスト が本仕様で定義される関数オブジェクト の [[Call]] の振る舞いを変更できないことを意味する。
HostCallJobCallback のデフォルト実装は呼び出されたとき次を行う:
アサート: IsCallable (jobCallback .[[Callback]] ) is true . ? Call(jobCallback .[[Callback]] , V , argumentsList ) を返す。
Web ブラウザではない ECMAScript ホスト は HostCallJobCallback のデフォルト実装を使用しなければならない。
9.5.4 HostEnqueueGenericJob ( job , realm )
The host-defined abstract operation HostEnqueueGenericJob takes arguments job (a Job Abstract Closure ) and realm (a Realm Record ) and returns unused . realm .[[AgentSignifier]] で示される agent において realm realm で将来のある時点に job をスケジュールする。このアルゴリズムと共に用いられる Abstract Closure は、優先度や順序付けといった追加制約なくスケジュールされることを意図している。
HostEnqueueGenericJob の実装は 9.5 の要件に従わなければならない。
9.5.5 HostEnqueuePromiseJob ( job , realm )
The host-defined abstract operation HostEnqueuePromiseJob takes arguments job (a Job Abstract Closure ) and realm (a Realm Record or null ) and returns unused . 将来のある時点に job をスケジュールする。このアルゴリズムと共に用いられる Abstract Closure は、Promise の処理に関連するか、さもなくば Promise 処理操作と同等の優先度でスケジュールされることを意図している。
HostEnqueuePromiseJob の実装は 9.5 の要件に加えて以下に従わなければならない:
realm が null でないなら、job が呼び出されるたびに、その時点で ECMAScript コードを評価する準備が整うよう実装定義 ステップを実行しなければならない。
scriptOrModule を HostEnqueuePromiseJob が呼び出された時点での GetActiveScriptOrModule () とする。realm が null でないなら、job が呼び出されるたびに、その呼び出しの時点で scriptOrModule が active script or module であるよう実装定義 ステップを実行しなければならない。
Job はそれらをスケジュールした HostEnqueuePromiseJob 呼び出しと同じ順序で実行されなければならない。
Note
NewPromiseResolveThenableJob が返す Job の realm は通常 then 関数オブジェクト に対して GetFunctionRealm を呼び出した結果である。NewPromiseReactionJob が返す Job の realm は、ハンドラが undefined でない場合そのハンドラに対して GetFunctionRealm を呼び出した結果が通常使われる。ハンドラが undefined の場合、realm は null 。どちらの種類の Job でも、GetFunctionRealm が異常終了する(例: revoke 済み Proxy に対して呼び出された)とき、realm はその GetFunctionRealm 呼び出し時の現在の Realm Record となる。realm が null の場合、ユーザ ECMAScript コードは評価されず、新しい ECMAScript オブジェクト(例えば Error オブジェクト)は生成されない。例えば WHATWG HTML 仕様 (https://html.spec.whatwg.org/ ) はスクリプト実行可能性の確認および entry の概念のために realm を使用する。
9.5.6 HostEnqueueTimeoutJob ( timeoutJob , realm , milliseconds )
The host-defined abstract operation HostEnqueueTimeoutJob takes arguments timeoutJob (a Job Abstract Closure ), realm (a Realm Record ), and milliseconds (a non-negative finite Number) and returns unused . realm .[[AgentSignifier]] で示される agent の realm realm において、少なくとも milliseconds ミリ秒後に timeoutJob を実行するようスケジュールする。
HostEnqueueTimeoutJob の実装は 9.5 の要件に従わなければならない。
9.6 Agent
agent は一組の ECMAScript 実行コンテキスト、実行コンテキストスタック、実行中実行コンテキスト、Agent Record 、および executing thread から構成される。executing thread を除き、agent の構成要素はその agent にのみ属する。
agent の executing thread は他の agent と独立してその agent の実行コンテキスト上でアルゴリズムステップを実行する。ただし、[[CanBlock]] フィールドが true である Agent Record を持つ agent が共有していない限り、1 つの executing thread を複数の agent で共有してもよい。
Note 1
例えば一部の Web ブラウザでは、ブラウザウィンドウの複数の無関係なタブ間で単一の executing thread を共有する。
agent の executing thread がアルゴリズムステップを実行している間、その agent はそれらのステップにとっての surrounding agent である。ステップは surrounding agent を用いて、agent 内に保持された仕様レベルの実行オブジェクト(実行中実行コンテキスト、実行コンテキストスタック、Agent Record のフィールド)へアクセスする。
agent signifier は Agent を識別するために用いられるグローバル一意の不透明値である。
Table 27: Agent Record のフィールド (Agent Record Fields)
Field Name
Value
Meaning
[[LittleEndian]]
a Boolean
アルゴリズム GetValueFromBuffer と SetValueInBuffer で必要なときに isLittleEndian 引数の既定値として計算される値。選択は実装定義 であり、実装にとって最も効率的な方を選ぶべき。この値が一度観測された後は変更できない。
[[CanBlock]]
a Boolean
その agent がブロック可能かどうかを決定する。
[[Signifier]]
an agent signifier
agent クラスタ内で agent を一意に識別する。
[[IsLockFree1]]
a Boolean
true の場合 1 byte 値 上のアトミック操作は lock-free、そうでなければ false 。
[[IsLockFree2]]
a Boolean
true の場合 2 byte 値 上のアトミック操作は lock-free、そうでなければ false 。
[[IsLockFree8]]
a Boolean
true の場合 8 byte 値 上のアトミック操作は lock-free、そうでなければ false 。
[[CandidateExecution]]
a candidate execution Record
メモリモデル参照。
[[KeptAlive]]
a List of either Objects or Symbols
初期状態は空の新しい List 。現在の Job の終了まで生存させるオブジェクトやシンボルのリスト。
[[ModuleAsyncEvaluationCount]]
an integer
初期値 0。非同期または非同期依存を持つモジュールの [[AsyncEvaluationOrder]] フィールドに一意の増加値を割り当てるために用いられる。
[[Signifier]] 、[[IsLockFree1]] 、[[IsLockFree2]] の値は、一度クラスタ内のいずれかの agent により観測された後は変更できない。
Note 2
[[IsLockFree1]] と [[IsLockFree2]] の値は必ずしもハードウェアだけで決定されるわけではなく、時間経過や ECMAScript 実装間で異なりうる実装上の選択を反映することがある。
[[IsLockFree4]] フィールドは存在しない: 4 バイトのアトミック操作は常に lock-free である。
実際には、アトミック操作が何らかのロックを用いて実装されているなら、その操作は lock-free ではない。lock-free は wait-free を意味しない: lock-free なアトミック操作を完了するのに必要なマシンステップ数に上限はない。
サイズ n のアトミックアクセスが lock-free であることは、同サイズの非アトミックアクセスの(知覚される)アトミシティについて何も意味しない。具体的には、非アトミックアクセスは複数のメモリアクセス列として実行され得る。詳細は ReadSharedMemory および WriteSharedMemory を参照。
Note 3
agent は仕様上のメカニズムであり、ECMAScript 実装の特定成果物に対応する必要はない。
9.6.1 AgentSignifier ( )
The abstract operation AgentSignifier takes no arguments and returns an agent signifier . It performs the following steps when called:
AR を surrounding agent の Agent Record とする。AR .[[Signifier]] を返す。
9.6.2 AgentCanSuspend ( )
The abstract operation AgentCanSuspend takes no arguments and returns a Boolean. It performs the following steps when called:
AR を surrounding agent の Agent Record とする。AR .[[CanBlock]] を返す。
Note
環境によっては、特定の agent をサスペンドすることが妥当でない場合がある。例えば Web ブラウザ環境では、ドキュメントのメインイベントハンドリングスレッドのサスペンドを禁止しつつ、worker のイベントハンドリングスレッドはサスペンドを許容することが妥当かもしれない。
9.6.3 IncrementModuleAsyncEvaluationCount ( )
The abstract operation IncrementModuleAsyncEvaluationCount takes no arguments and returns an integer. It performs the following steps when called:
AR を surrounding agent の Agent Record とする。count を AR .[[ModuleAsyncEvaluationCount]] とする。AR .[[ModuleAsyncEvaluationCount]] を count + 1 に設定。count を返す。
Note
この値は保留中モジュール間の相対評価順を追跡するためだけに使用される。実装は、保留中モジュールが無いときは [[ModuleAsyncEvaluationCount]] を観測不能な形で 0 にリセットしてよい。
9.7 Agent Cluster
agent cluster とは、共有メモリ操作によって通信可能な agent の極大集合である。
Note 1
異なる agent 内のプログラムは未規定の手段によってメモリを共有しうる。最小でも SharedArrayBuffer の裏付けメモリはクラスタ内の agent 間で共有可能である。
メッセージパッシングで通信可能だがメモリを共有できない agent が存在するかもしれない。そのような agent は同じ agent cluster にはならない。
すべての agent は正確に 1 つの agent cluster に属する。
Note 2
クラスタ内の agent が特定時点で全て生存している必要はない。agent A が agent B を生成し、その後 A が終了し B が agent C を生成した場合、A が B とメモリを共有し得て、B が C とメモリを共有し得るなら、3 つの agent は同一クラスタである。
クラスタ内のすべての agent は、それぞれの Agent Record の [[LittleEndian]] フィールドについて同じ値を持たなければならない。
Note 3
クラスタ内で異なる [[LittleEndian]] 値を持つ agent があると、マルチバイトデータに対し共有メモリを使うのが困難になる。
クラスタ内のすべての agent は、それぞれの Agent Record の [[IsLockFree1]] フィールドについて同じ値を持たなければならない; [[IsLockFree2]] フィールドについても同様。
クラスタ内のすべての agent は、それぞれの Agent Record の [[Signifier]] フィールドについて互いに異なる値を持たなければならない。
埋め込み環境 (embedding) は agent の知識や協力なしに agent を非アクティブ化(進行停止)またはアクティブ化(進行再開)してよい。埋め込み環境がそれを行う場合、クラスタ内で一部の agent を非アクティブ化したまま他を無期限にアクティブにしてはならない。
Note 4
上記制約の目的は、他の agent が非アクティブ化されたために agent がデッドロックまたはスターブする状況を避けることである。例えば、HTML shared worker がウィンドウ内ドキュメントと独立したライフタイムを持ち、その shared worker がそのような独立ドキュメントの dedicated worker とメモリ共有を許される場合、ドキュメントとその dedicated worker が dedicated worker がロックを保持した状態で非アクティブ化され(例えばドキュメントが履歴に保存される等)、shared worker がそのロック取得を試みた場合、shared worker は dedicated worker が再びアクティブ化されるまでブロックされる(場合によっては永久に)。その間、他ウィンドウから shared worker へアクセスしようとする他の worker はスターブする。
この制約の含意は、埋め込み環境内で同一のサスペンド/ウェイク集団に属さない agent 同士ではメモリ共有が不可能になるということである。
埋め込み環境は agent のクラスタ内の他の agent の事前の知識や協力なしに agent を終了させてもよい。agent が自身またはクラスタ内の他の agent のプログラム的作用によってではなくクラスタ外の要因によって終了させられる場合、埋め込み環境は 2 つの戦略のいずれかを選ばなければならない: すべての agent を終了させるか、またはクラスタ内の agent が協調できる信頼性のある API を提供し、クラスタの少なくとも 1 つの残存メンバが終了を検出できるようにし、終了データには終了した agent を識別する十分な情報を含める。
Note 5
その種の終了例: 別プロセスで動作する agent を OS またはユーザが終了させる; per-agent リソース計測が runaway と示したときに、他の agent と同一プロセスで動作する agent を埋め込み環境自身が終了させる、等。
以下の仕様値およびそれらから推移的に到達可能な値はそれぞれ正確に 1 つの agent cluster に属する。
クラスタ内の任意の agent が ECMAScript コードを評価する前に、クラスタ内すべての agent の Agent Record の [[CandidateExecution]] フィールドは初期 candidate execution に設定される。初期 candidate execution は空の candidate execution で、[[EventsRecords]] フィールドは各 agent について、その [[AgentSignifier]] フィールドがその agent の agent signifier で、[[EventList]] と [[AgentSynchronizesWith]] フィールドが空の List である Agent Events Record を含む List である。
Note 6
agent cluster 内のすべての agent は Agent Record の [[CandidateExecution]] フィールド内で同じ candidate execution を共有する。candidate execution はメモリモデルで使用される仕様メカニズムである。
Note 7
agent cluster は仕様メカニズムであり、ECMAScript 実装の特定成果物に対応する必要はない。
9.8 Forward Progress
agent が forward progress を行う (make forward progress) とは、本仕様に従って評価ステップを 1 つ実行することである。
agent の実行中実行コンテキストが外部イベントを同期的かつ無期限に待機すると、その agent は blocked になる。この意味で blocked になり得るのは Agent Record の [[CanBlock]] フィールドが true の agent のみである。unblocked agent とは blocked でない agent である。
実装は以下を保証しなければならない:
Note
これは、メモリモデルの liveness 保証と共に、すべての seq-cst write が最終的に全 agent に観測されることを保証する。
9.9 WeakRef と FinalizationRegistry ターゲットの処理モデル (Processing Model of WeakRef and FinalizationRegistry Targets)
9.9.1 Objectives
本仕様は、任意のオブジェクトまたはシンボルがガーベジコレクトされることを保証しない。生存していないオブジェクトやシンボルは長時間後に解放されるか、全く解放されない可能性がある。このため、本仕様はガーベジコレクションによってトリガーされる挙動を記述する際に「may」という語を使用する。
WeakRef および FinalizationRegistry のセマンティクスは、特定の時点で発生する 2 つの操作に基づいている:
これら(ClearKeptObjects と CleanupFinalizationRegistry )のいずれの動作も同期 ECMAScript 実行を割り込まない。ホスト はより長い同期 ECMAScript 実行を組み立てる可能性があるため、本仕様は ClearKeptObjects および CleanupFinalizationRegistry のスケジューリングをホスト環境 に委ねる。
一部 ECMAScript 実装は、ECMAScript がアイドルである間も含め、バックグラウンドでガーベジコレクタを走らせる。ホスト環境 に CleanupFinalizationRegistry のスケジューリングを任せることで、ホスト は最終化作業を行うために ECMAScript 実行を再開し、保持された値を解放して全体的なメモリ使用量を削減し得る。
9.9.2 Liveness
オブジェクトやシンボルの集合 S に対し、S に関して hypothetical WeakRef-oblivious な実行とは、参照先が S の要素である WeakRef の抽象操作 WeakRefDeref が常に undefined を返すような実行である。
Note 1
WeakRef -obliviousness と liveness は 2 つの概念を捉える。(1)
WeakRef 自体は参照対象を生存させない。(2) liveness に循環が存在しても値が生存であることを意味しない。具体的には
v の liveness 判定が
WeakRef 参照先
r の liveness 判定に依存する場合、
r の liveness は
v の liveness を仮定できず、そうすると循環的推論になる。
Note 2
WeakRef -obliviousness が個々の値ではなく値の集合に対して定義されるのは循環を考慮するためである。個々の値に対して定義すると、循環内の
WeakRef 参照先は、その同一性が循環内の他の
WeakRef 参照先を介してのみ観測されるにもかかわらず、生存と考えられてしまう。
Note 3
口語的には、個々のオブジェクトまたはシンボルは、それを含むすべての集合が live であれば live であると言う。
評価中の任意の時点で、オブジェクトやシンボルの集合 S は以下の条件のいずれかを満たす場合 live と見なされる:
S の任意の要素が任意の agent の [[KeptAlive]] List に含まれている。
S に関して WeakRef -oblivious である有効な将来の仮想実行が存在し、その実行が S 内の任意の値の同一性を観測する。
Note 4
上記 2 番目の条件は、値の同一性が非
WeakRef 手段で観測可能であれば値は live であるという直感を捉える。値の同一性は厳密等価比較の観測や、値が Map のキーとして使用されることの観測によって観測され得る。
Note 5
値がフィールド、内部スロット、またはプロパティに存在するという事実は、その値が live であることを意味しない。例えば、その値がプログラムに返されることが一度も無いなら観測できない。
これは WeakMap のキー、WeakSet のメンバ、そして FinalizationRegistry Cell record の [[WeakRefTarget]] および [[UnregisterToken]] フィールドについても同様である。
上記定義は、WeakMap のキーが live でないなら対応する value も必ずしも live とは限らないことを含意する。
Note 6
Liveness はエンジンが空にしてはならない
WeakRef を保証するための下限である。ここで定義する Liveness は決定不能である。実際にはエンジンは到達可能性などの保守的近似を用いる。実装には大きな裁量が期待される。
9.9.3 Execution
任意の時点で、オブジェクトやシンボルの集合 S が live でない場合、ECMAScript 実装は以下のステップをアトミックに実行してもよい:
S の各要素 value についてref .[[WeakRefTarget]] が value である各 WeakRef ref についてref .[[WeakRefTarget]] を empty に設定する。fg .[[Cells]] が Record cell を含み、cell .[[WeakRefTarget]] が value である各 FinalizationRegistry fg についてcell .[[WeakRefTarget]] を empty に設定する。任意で HostEnqueueFinalizationRegistryCleanupJob (fg ) を実行する。 map .[[WeakMapData]] が Record r を含み、r .[[Key]] が value である各 WeakMap map についてr .[[Key]] を empty に設定する。r .[[Value]] を empty に設定する。set .[[WeakSetData]] が value を含む各 WeakSet set について値が value の要素を、値が empty の要素に置き換える。
Note 1
Liveness の定義と合わせて、本節は実装が WeakRef に関して適用してよい最適化を規定する。
オブジェクトの同一性を観測せずにオブジェクトへアクセスすることは可能である。エスケープしないオブジェクトのプロパティに対するデッド変数除去やスカラ置換などの最適化が許可され、その同一性が観測されないオブジェクトを指す WeakRef を観測可能な形で空にすることが許される。
一方、オブジェクトの同一性が観測可能で、そのオブジェクトが WeakRef の [[WeakRefTarget]] 内部スロットにある場合、WeakRef を観測可能に空にしてしまう再物質化 (rematerialization) などの最適化は禁じられる。
HostEnqueueFinalizationRegistryCleanupJob の呼び出しは任意であるため、FinalizationRegistry に登録されたオブジェクトがその FinalizationRegistry 自体を生存保持するとは限らない。実装は、FinalizationRegistry 自体が死んだ場合やアプリケーション終了中など、任意の理由で FinalizationRegistry コールバックを省略してよい。
Note 2
実装は、非 live オブジェクトやシンボルの極大集合に対して WeakRef を必ずしも空にする義務はない。
実装が WeakRef を空にするために非 live 集合 S を選ぶ場合、本定義は S 内のすべての値に対する WeakRef を同時に空にすることを要求する。言い換えると、値 v を指す WeakRef を空にしながら、v の値を観測しうる他の WeakRef を空にしないままにするのは非適合である。
9.9.4 ホストフック (Host Hooks)
9.9.4.1 HostEnqueueFinalizationRegistryCleanupJob ( finalizationRegistry )
The host-defined abstract operation HostEnqueueFinalizationRegistryCleanupJob takes argument finalizationRegistry (a FinalizationRegistry ) and returns unused .
cleanupJob を、引数を持たず finalizationRegistry を捕捉し、呼び出されたとき次のステップを実行する新しい Job Abstract Closure とする:
cleanupResult を Completion (CleanupFinalizationRegistry (finalizationRegistry )) とする。cleanupResult が abrupt completion であるなら、エラー報告のためのホスト定義 ステップを実行する。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:
agentRecord を surrounding agent の Agent Record とする。agentRecord .[[KeptAlive]] を新しい空の List に設定する。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:
agentRecord を surrounding agent の Agent Record とする。agentRecord .[[KeptAlive]] に value を追加する。unused を返す。
Note
抽象操作 AddToKeptObjects が対象となるオブジェクトまたはシンボルを引数に呼び出されると、その対象は
ClearKeptObjects が呼び出されるまで対象を強参照し続けるリストに追加される。
9.12 CleanupFinalizationRegistry ( finalizationRegistry )
The abstract operation CleanupFinalizationRegistry takes argument finalizationRegistry (a FinalizationRegistry ) and returns either a normal completion containing unused or a throw completion . It performs the following steps when called:
アサート: finalizationRegistry は [[Cells]] および [[CleanupCallback]] 内部スロットを持つ。 callback を finalizationRegistry .[[CleanupCallback]] とする。finalizationRegistry .[[Cells]] が Record cell を含み、かつ cell .[[WeakRefTarget]] が empty であるものが存在する間、実装は以下のステップを(任意のタイミングで)実行してよい:そのような cell のいずれかを選ぶ。 finalizationRegistry .[[Cells]] から cell を取り除く。? HostCallJobCallback (callback , undefined , « cell .[[HeldValue]] ») を実行する。 unused を返す。
9.13 CanBeHeldWeakly ( v )
The abstract operation CanBeHeldWeakly takes argument v (an ECMAScript language value) and returns a Boolean. v が弱参照として利用に適している場合に限り true を返す。弱参照として利用に適した値のみが WeakMap のキー、WeakSet の要素、WeakRef の target、あるいは FinalizationRegistry の targets の 1 つになれる。 It performs the following steps when called:
v が Object であるなら true を返す。v が Symbol でかつ KeyForSymbol (v ) が undefined であるなら true を返す。false を返す。
Note
言語同一性 (language identity) を持たない言語値は、事前の参照なしに生成し得るため弱参照としては不適切である。Symbol.for により生成された Symbol 値は他の Symbol と異なり言語同一性を持たず、弱参照として不適切である。Well-known symbols は収集されない可能性が高いが、数が限定され多様な実装手法で管理可能であるため、弱参照として利用に適したものとして扱われる。しかし、live な WeakMap 内で well-known symbol に関連付けられた任意の値は収集されにくく、実装においてメモリ資源を「リーク」させる可能性がある。
10 通常オブジェクトとエキゾチックオブジェクトの挙動 (Ordinary and Exotic Objects Behaviours)
10.1 通常オブジェクトの内部メソッドと内部スロット (Ordinary Object Internal Methods and Internal Slots)
すべての通常オブジェクト は [[Prototype]] という内部スロットを持つ。この内部スロットの値は null かオブジェクトであり、継承を実装するために用いられる。通常オブジェクト O にプロパティ P が存在せず、しかしその [[Prototype]] オブジェクトには存在する状況を仮定する。P が [[Prototype]] オブジェクト上のデータプロパティ を参照する場合、O は取得アクセスにおいてそれを継承し、P が O 自身のプロパティであるかのように振る舞う。P が [[Prototype]] オブジェクト上の書き込み可能なデータプロパティ を参照する場合、O 上で P に値を設定すると O 上に新しいデータプロパティ P が作成される。P が [[Prototype]] オブジェクト上の書き込み不可のデータプロパティ を参照する場合、O 上での P への設定は失敗する。P が [[Prototype]] オブジェクト上のアクセサプロパティ を参照する場合、そのアクセサは取得および設定アクセスの両方について O に継承される。
すべての通常オブジェクト は Boolean 値を取る [[Extensible]] 内部スロットを持ち、これは 6.1.7.3 で規定される拡張可能性に関する内部メソッドの不変条件を満たすために使用される。すなわち、一度オブジェクトの [[Extensible]] 内部スロットの値が false に設定されると、そのオブジェクトに新しいプロパティを追加したり、オブジェクトの [[Prototype]] 内部スロットの値を変更したり、後で [[Extensible]] の値を true に戻したりすることはできない。
以下のアルゴリズム記述では、O は通常オブジェクト 、P はプロパティキー 値、V は任意の ECMAScript 言語値、Desc は Property Descriptor レコードであると仮定する。
各通常オブジェクト 内部メソッドは同名の抽象操作 に委譲する。そのような抽象操作 が別の内部メソッドに依存する場合、同名の抽象操作 を直接呼ぶ代わりに O 上で内部メソッドが呼び出される。これらのセマンティクスは、通常オブジェクト 内部メソッドが適用された際に、エキゾチックオブジェクト ではオーバーライドされた内部メソッドが呼ばれることを保証する。
10.1.1 [[GetPrototypeOf]] ( )
The [[GetPrototypeOf]] internal method of 通常オブジェクト O takes no arguments and returns Object か null を含む正常完了. It performs the following steps when called:
OrdinaryGetPrototypeOf (O ) を返す。
10.1.1.1 OrdinaryGetPrototypeOf ( O )
The abstract operation OrdinaryGetPrototypeOf takes argument O (an Object) and returns an Object or null . It performs the following steps when called:
O .[[Prototype]] を返す。
10.1.2 [[SetPrototypeOf]] ( V )
The [[SetPrototypeOf]] internal method of 通常オブジェクト O takes argument V (an Object or null ) and returns Boolean を含む正常完了. It performs the following steps when called:
OrdinarySetPrototypeOf (O , V ) を返す。
10.1.2.1 OrdinarySetPrototypeOf ( O , V )
The abstract operation OrdinarySetPrototypeOf takes arguments O (an Object) and V (an Object or null ) and returns a Boolean. It performs the following steps when called:
current を O .[[Prototype]] とする。SameValue (V , current ) が true なら true を返す。extensible を O .[[Extensible]] とする。extensible が false なら false を返す。p を V とする。done を false とする。done が false の間、繰り返す:p が null ならdone を true に設定する。そうでなく SameValue (p , O ) が true ならfalse を返す。 それ以外ならp .[[GetPrototypeOf]] が 10.1.1 で定義された通常オブジェクト 内部メソッドでないなら done を true に設定する。そうでなければ p を p .[[Prototype]] に設定する。 O .[[Prototype]] を V に設定する。true を返す。
Note
ステップ 7 のループは、[[GetPrototypeOf]] と [[SetPrototypeOf]] に通常オブジェクト 定義を用いるオブジェクトのみから成る任意のプロトタイプ連鎖に循環が存在しないことを保証する。
10.1.3 [[IsExtensible]] ( )
The [[IsExtensible]] internal method of 通常オブジェクト O takes no arguments and returns Boolean を含む正常完了. It performs the following steps when called:
OrdinaryIsExtensible (O ) を返す。
10.1.3.1 OrdinaryIsExtensible ( O )
The abstract operation OrdinaryIsExtensible takes argument O (an Object) and returns a Boolean. It performs the following steps when called:
O .[[Extensible]] を返す。
10.1.4 [[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of 通常オブジェクト O takes no arguments and returns true を含む正常完了. It performs the following steps when called:
OrdinaryPreventExtensions (O ) を返す。
10.1.4.1 OrdinaryPreventExtensions ( O )
The abstract operation OrdinaryPreventExtensions takes argument O (an Object) and returns true . It performs the following steps when called:
O .[[Extensible]] を false に設定する。true を返す。
10.1.5 [[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of 通常オブジェクト O takes argument P (a property key) and returns Property Descriptor か undefined を含む正常完了. It performs the following steps when called:
OrdinaryGetOwnProperty (O , P ) を返す。
10.1.5.1 OrdinaryGetOwnProperty ( O , P )
The abstract operation OrdinaryGetOwnProperty takes arguments O (an Object) and P (a property key) and returns a Property Descriptor or undefined . It performs the following steps when called:
O がキー P の自身のプロパティを持たないなら undefined を返す。フィールドを持たない新しい Property Descriptor D を生成する。 X をキーが P である O の自身のプロパティとする。X がデータプロパティ ならD .[[Value]] を X .[[Value]] 属性の値に設定する。D .[[Writable]] を X .[[Writable]] 属性の値に設定する。それ以外アサート: X はアクセサプロパティ である。 D .[[Get]] を X .[[Get]] 属性の値に設定する。D .[[Set]] を X .[[Set]] 属性の値に設定する。 D .[[Enumerable]] を X .[[Enumerable]] 属性の値に設定する。D .[[Configurable]] を X .[[Configurable]] 属性の値に設定する。D を返す。
10.1.6 [[DefineOwnProperty]] ( P , Desc )
The [[DefineOwnProperty]] internal method of 通常オブジェクト O takes arguments P (a property key) and Desc (a Property Descriptor ) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
? OrdinaryDefineOwnProperty (O , P , Desc ) を返す。
10.1.6.1 OrdinaryDefineOwnProperty ( O , P , Desc )
The abstract operation OrdinaryDefineOwnProperty takes arguments O (an Object), P (a property key), and Desc (a Property Descriptor ) and returns either a normal completion containing a Boolean or a throw completion . It performs the following steps when called:
current を ? O .[[GetOwnProperty]] (P ) とする。extensible を ? IsExtensible (O ) とする。ValidateAndApplyPropertyDescriptor (O , P , extensible , Desc , current ) を返す。
10.1.6.2 IsCompatiblePropertyDescriptor ( Extensible , Desc , Current )
The abstract operation IsCompatiblePropertyDescriptor takes arguments Extensible (a Boolean), Desc (a Property Descriptor ), and Current (a Property Descriptor or undefined ) and returns a Boolean. It performs the following steps when called:
ValidateAndApplyPropertyDescriptor (undefined , "" , Extensible , Desc , Current ) を返す。
10.1.6.3 ValidateAndApplyPropertyDescriptor ( O , P , extensible , Desc , current )
The abstract operation ValidateAndApplyPropertyDescriptor takes arguments O (an Object or undefined ), P (a property key), extensible (a Boolean), Desc (a Property Descriptor ), and current (a Property Descriptor or undefined ) and returns a Boolean. Desc が、指定された拡張可能性 extensible と現行プロパティ current を持つオブジェクトのプロパティとして 不変条件 を維持しつつ適用できる場合に限り true を返す。そのような適用が可能で O が undefined でない場合、名前 P のプロパティ(必要なら作成される)に対して実行される。 It performs the following steps when called:
アサート: P はプロパティキー である。 current が undefined ならextensible が false なら false を返す。O が undefined なら true を返す。IsAccessorDescriptor (Desc ) が true ならオブジェクト O に、Desc に対応フィールドがあればその値、そうでなければその属性の 既定値 を [[Get]] , [[Set]] , [[Enumerable]] , [[Configurable]] に設定した名前 P の自身のアクセサプロパティ を作成する。 それ以外オブジェクト O に、Desc に対応フィールドがあればその値、そうでなければその属性の 既定値 を [[Value]] , [[Writable]] , [[Enumerable]] , [[Configurable]] に設定した名前 P の自身のデータプロパティ を作成する。 true を返す。アサート: current は完全に埋められた Property Descriptor である。 Desc がいかなるフィールドも持たないなら true を返す。current .[[Configurable]] が false ならDesc が [[Configurable]] フィールドを持ちかつ Desc .[[Configurable]] が true なら false を返す。Desc が [[Enumerable]] フィールドを持ちかつ Desc .[[Enumerable]] が current .[[Enumerable]] と異なるなら false を返す。IsGenericDescriptor (Desc ) が false でかつ IsAccessorDescriptor (Desc ) が IsAccessorDescriptor (current ) と異なるなら false を返す。IsAccessorDescriptor (current ) が true ならDesc が [[Get]] フィールドを持ち SameValue (Desc .[[Get]] , current .[[Get]] ) が false なら false を返す。Desc が [[Set]] フィールドを持ち SameValue (Desc .[[Set]] , current .[[Set]] ) が false なら false を返す。それ以外で current .[[Writable]] が false ならDesc が [[Writable]] フィールドを持ち Desc .[[Writable]] が true なら false を返す。注記: SameValue は他の手段で区別可能な NaN 値について true を返す。ここで返すことで O の既存プロパティが変更されないことを保証する。 Desc が [[Value]] フィールドを持つなら SameValue (Desc .[[Value]] , current .[[Value]] ) を返す。 O が undefined でないならIsDataDescriptor (current ) が true かつ IsAccessorDescriptor (Desc ) が true ならDesc が [[Configurable]] フィールドを持つなら configurable を Desc .[[Configurable]] とし、そうでなければ configurable を current .[[Configurable]] とする。Desc が [[Enumerable]] フィールドを持つなら enumerable を Desc .[[Enumerable]] とし、そうでなければ enumerable を current .[[Enumerable]] とする。オブジェクト O の名前 P のプロパティを、[[Configurable]] と [[Enumerable]] をそれぞれ configurable と enumerable に、[[Get]] と [[Set]] を Desc に対応フィールドがあればその値、なければその属性の 既定値 に設定したアクセサプロパティ に置き換える。 それ以外で IsAccessorDescriptor (current ) が true かつ IsDataDescriptor (Desc ) が true ならDesc が [[Configurable]] フィールドを持つなら configurable を Desc .[[Configurable]] とし、そうでなければ configurable を current .[[Configurable]] とする。Desc が [[Enumerable]] フィールドを持つなら enumerable を Desc .[[Enumerable]] とし、そうでなければ enumerable を current .[[Enumerable]] とする。オブジェクト O の名前 P のプロパティを、[[Configurable]] と [[Enumerable]] をそれぞれ configurable と enumerable に、[[Value]] と [[Writable]] を Desc に対応フィールドがあればその値、なければその属性の 既定値 に設定したデータプロパティ に置き換える。 それ以外の場合Desc の各フィールドについて、オブジェクト O の名前 P のプロパティの対応する属性をそのフィールドの値に設定する。 true を返す。
10.1.7 [[HasProperty]] ( P )
The [[HasProperty]] internal method of 通常オブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
? OrdinaryHasProperty (O , P ) を返す。
10.1.7.1 OrdinaryHasProperty ( O , P )
The abstract operation OrdinaryHasProperty takes arguments O (an Object) and P (a property key) and returns either a normal completion containing a Boolean or a throw completion . It performs the following steps when called:
hasOwn を ? O .[[GetOwnProperty]] (P ) とする。hasOwn が undefined でないなら true を返す。parent を ? O .[[GetPrototypeOf]] () とする。parent が null でないなら? parent .[[HasProperty]] (P ) を返す。 false を返す。
10.1.8 [[Get]] ( P , Receiver )
The [[Get]] internal method of 通常オブジェクト O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:
? OrdinaryGet (O , P , Receiver ) を返す。
10.1.8.1 OrdinaryGet ( O , P , Receiver )
The abstract operation OrdinaryGet takes arguments O (an Object), P (a property key), and Receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion . It performs the following steps when called:
desc を ? O .[[GetOwnProperty]] (P ) とする。desc が undefined ならparent を ? O .[[GetPrototypeOf]] () とする。parent が null なら undefined を返す。? parent .[[Get]] (P , Receiver ) を返す。 IsDataDescriptor (desc ) が true なら desc .[[Value]] を返す。アサート: IsAccessorDescriptor (desc ) は true である。 getter を desc .[[Get]] とする。getter が undefined なら undefined を返す。? Call(getter , Receiver ) を返す。
10.1.9 [[Set]] ( P , V , Receiver )
The [[Set]] internal method of 通常オブジェクト O takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
? OrdinarySet (O , P , V , Receiver ) を返す。
10.1.9.1 OrdinarySet ( O , P , V , Receiver )
The abstract operation OrdinarySet takes arguments O (an Object), P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion . It performs the following steps when called:
ownDesc を ? O .[[GetOwnProperty]] (P ) とする。? OrdinarySetWithOwnDescriptor (O , P , V , Receiver , ownDesc ) を返す。
10.1.9.2 OrdinarySetWithOwnDescriptor ( O , P , V , Receiver , ownDesc )
The abstract operation OrdinarySetWithOwnDescriptor takes arguments O (an Object), P (a property key), V (an ECMAScript language value), Receiver (an ECMAScript language value), and ownDesc (a Property Descriptor or undefined ) and returns either a normal completion containing a Boolean or a throw completion . It performs the following steps when called:
ownDesc が undefined ならparent を ? O .[[GetPrototypeOf]] () とする。parent が null でないなら? parent .[[Set]] (P , V , Receiver ) を返す。 それ以外ならownDesc を PropertyDescriptor { [[Value]] : undefined , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : true } に設定する。 IsDataDescriptor (ownDesc ) が true ならownDesc .[[Writable]] が false なら false を返す。Receiver が Object でないなら false を返す。existingDescriptor を ? Receiver .[[GetOwnProperty]] (P ) とする。existingDescriptor が undefined でないならIsAccessorDescriptor (existingDescriptor ) が true なら false を返す。existingDescriptor .[[Writable]] が false なら false を返す。valueDesc を PropertyDescriptor { [[Value]] : V } とする。? Receiver .[[DefineOwnProperty]] (P , valueDesc ) を返す。 それ以外ならアサート: Receiver は現在プロパティ P を持たない。 ? CreateDataProperty (Receiver , P , V ) を返す。 アサート: IsAccessorDescriptor (ownDesc ) は true である。 setter を ownDesc .[[Set]] とする。setter が undefined なら false を返す。? Call(setter , Receiver , « V ») を実行する。 true を返す。
10.1.10 [[Delete]] ( P )
The [[Delete]] internal method of 通常オブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
? OrdinaryDelete (O , P ) を返す。
10.1.10.1 OrdinaryDelete ( O , P )
The abstract operation OrdinaryDelete takes arguments O (an Object) and P (a property key) and returns either a normal completion containing a Boolean or a throw completion . It performs the following steps when called:
desc を ? O .[[GetOwnProperty]] (P ) とする。desc が undefined なら true を返す。desc .[[Configurable]] が true なら名前 P の自身のプロパティを O から除去する。 true を返す。false を返す。
10.1.11 [[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of 通常オブジェクト O takes no arguments and returns プロパティキー の List を含む正常完了. It performs the following steps when called:
OrdinaryOwnPropertyKeys (O ) を返す。
10.1.11.1 OrdinaryOwnPropertyKeys ( O )
The abstract operation OrdinaryOwnPropertyKeys takes argument O (an Object) and returns a List of property keys . It performs the following steps when called:
keys を新しい空の List とする。O の各自身のプロパティキー P で、P が配列インデックス であるものについて、数値的インデックス昇順で:keys に P を追加する。O の各自身のプロパティキー P で、P が String かつ配列インデックス でないものについて、作成順(時間順)昇順で:keys に P を追加する。O の各自身のプロパティキー P で、P が Symbol であるものについて、作成順(時間順)昇順で:keys に P を追加する。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:
internalSlotsList を « [[Prototype]] , [[Extensible]] » とする。additionalInternalSlotsList が存在するなら internalSlotsList を internalSlotsList と additionalInternalSlotsList のリスト結合 結果に設定する。O を MakeBasicObject (internalSlotsList ) とする。O .[[Prototype]] を proto に設定する。O を返す。
Note
OrdinaryObjectCreate は MakeBasicObject を呼ぶ以上の多くをしないが、エキゾチックではない通常オブジェクト を生成する意図を示す。そのため本仕様内では、結果を非通常にする形で後から内部メソッドを変更するアルゴリズムからは呼ばれない。エキゾチックオブジェクト を生成する操作は直接 MakeBasicObject を呼び出す。
10.1.13 OrdinaryCreateFromConstructor ( constructor , intrinsicDefaultProto [ , internalSlotsList ] )
The abstract operation OrdinaryCreateFromConstructor takes arguments constructor (a function object) and intrinsicDefaultProto (a String) and optional argument internalSlotsList (a List of names of internal slots) and returns Object を含む正常完了または throw 完了. 存在するならコンストラクタ の "prototype" プロパティから取得した [[Prototype]] 値を持つ通常オブジェクト を生成する。存在しない場合 intrinsicDefaultProto で名付けられた intrinsic が [[Prototype]] として使用される。internalSlotsList には追加内部スロット名が含まれる。未指定の場合は空の List が使用される。 It performs the following steps when called:
アサート: intrinsicDefaultProto はこの仕様で定義された intrinsic オブジェクトの名前である。該当オブジェクトは [[Prototype]] 値として使用されることを意図した intrinsic でなければならない。 proto を ? GetPrototypeFromConstructor (constructor , intrinsicDefaultProto ) とする。internalSlotsList が存在するなら slotsList を internalSlotsList とし、そうでなければ slotsList を新しい空の List とする。OrdinaryObjectCreate (proto , slotsList ) を返す。
10.1.14 GetPrototypeFromConstructor ( constructor , intrinsicDefaultProto )
The abstract operation GetPrototypeFromConstructor takes arguments constructor (a function object) and intrinsicDefaultProto (a String) and returns Object を含む正常完了または throw 完了. 特定のコンストラクタ に対応するオブジェクトを作成する際に使用すべき [[Prototype]] 値を決定する。値はコンストラクタ の "prototype" プロパティから取得され、存在しない場合 intrinsicDefaultProto で名付けられた intrinsic が [[Prototype]] に用いられる。 It performs the following steps when called:
アサート: intrinsicDefaultProto はこの仕様で定義された intrinsic オブジェクトの名前である。該当オブジェクトはオブジェクトの [[Prototype]] として使われることを意図した intrinsic でなければならない。 proto を ? Get (constructor , "prototype" ) とする。proto が Object でないならrealm を ? GetFunctionRealm (constructor ) とする。proto を realm の intrinsicDefaultProto という名前の intrinsic オブジェクトに設定する。proto を返す。
Note
constructor が [[Prototype]] 値を提供しない場合、使用される既定値は実行中実行コンテキストではなく constructor 関数の realm から取得される。
10.1.15 RequireInternalSlot ( O , internalSlot )
The abstract operation RequireInternalSlot takes arguments O (an ECMAScript language value) and internalSlot (an internal slot name) and returns unused を含む正常完了または throw 完了. O が Object であり、かつ指定された内部スロットを持つ場合を除いて例外を投げる。 It performs the following steps when called:
O が Object でないなら TypeError 例外を投げる。O が internalSlot 内部スロットを持たないなら TypeError 例外を投げる。unused を返す。
10.2 ECMAScript 関数オブジェクト (ECMAScript Function Objects)
ECMAScript 関数オブジェクト は、レキシカル環境を閉じ込めたパラメータ化 ECMAScript コードをカプセル化し、そのコードの動的評価をサポートする。ECMAScript 関数オブジェクト は通常オブジェクト であり、他の通常オブジェクト と同じ内部スロットおよび内部メソッドを持つ。ECMAScript 関数オブジェクト のコードは strict mode コード(11.2.2 )か非 strict コードのいずれかである。コードが strict mode コードである ECMAScript 関数オブジェクト は strict function と呼ばれる。コードが strict mode コードでないものは non-strict function と呼ばれる。
[[Extensible]] と [[Prototype]] に加えて、ECMAScript 関数オブジェクト は Table 28 に列挙される内部スロットも持つ。
Table 28: ECMAScript 関数オブジェクト の内部スロット (Internal Slots of ECMAScript Function Objects)
Internal Slot
Type
Description
[[Environment]]
an Environment Record
関数がクロージャ化した Environment Record 。関数のコードを評価する際の外側環境として使用される。
[[PrivateEnvironment]]
a PrivateEnvironment Record or null
関数がクロージャ化した Private Name 用の PrivateEnvironment Record 。関数が構文上クラス内に含まれない場合は null 。関数のコードを評価するときに内部クラスの外側 PrivateEnvironment として使用される。
[[FormalParameters]]
a Parse Node
関数の仮引数リストを定義するソーステキストのルートパースノード。
[[ECMAScriptCode]]
a Parse Node
関数本体を定義するソーステキストのルートパースノード。
[[ConstructorKind]]
base or derived
関数が派生クラスコンストラクタ かどうか。
[[Realm]]
a Realm Record
関数が生成された realm 。関数評価時にアクセスされる intrinsic オブジェクトを提供する。
[[ScriptOrModule]]
a Script Record or a Module Record
関数が生成された script または module。
[[ThisMode]]
lexical , strict , or global
関数の仮引数およびコード本体内での this
参照の解釈方法を定義する。lexical は this
がレキシカルに内包する関数の this 値を指すことを意味する。strict は関数呼び出しで与えられた this 値をそのまま用いる。global は this 値が undefined または null の場合グローバルオブジェクト 参照と解釈し、その他の場合は ToObject に渡すことを意味する。
[[Strict]]
a Boolean
strict function なら true 、non-strict function なら false 。
[[HomeObject]]
an Object
関数が super
を使用する場合、super
プロパティ探索が開始されるオブジェクトを提供する [[GetPrototypeOf]] を持つオブジェクト。
[[SourceText]]
a sequence of Unicode code points
関数を定義する source text 。
[[Fields]]
a List of ClassFieldDefinition Records
関数がクラスである場合、その非 static field と対応する初期化子の Record のリスト。
[[PrivateMethods]]
a List of PrivateElements
関数がクラスである場合、その非 static private method と accessor を表すリスト。
[[ClassFieldInitializerName]]
a String, a Symbol, a Private Name , or empty
関数がクラスフィールドの初期化子として作成される場合、そのフィールドの NamedEvaluation で用いる名前。そうでなければ empty 。
[[IsClassConstructor]]
a Boolean
関数が class constructor かどうか(true の場合、その [[Call]] 呼び出しは直ちに TypeError 例外を投げる)。
すべての ECMAScript 関数オブジェクト はここで定義される [[Call]] 内部メソッドを持つ。コンストラクタ でもある ECMAScript 関数は加えて [[Construct]] 内部メソッドを持つ。
10.2.1 [[Call]] ( thisArgument , argumentsList )
The [[Call]] internal method of ECMAScript 関数オブジェクト F takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values ) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:
callerContext を実行中実行コンテキストとする。calleeContext を PrepareForOrdinaryCall (F , undefined ) とする。アサート: calleeContext が現在の実行中実行コンテキストである。 F .[[IsClassConstructor]] が true ならerror を新たに生成された TypeError オブジェクトとする。注記: error は F の関連 Realm Record を持つ calleeContext 内で生成される。 実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。 ThrowCompletion (error ) を返す。OrdinaryCallBindThis (F , calleeContext , thisArgument ) を実行する。result を Completion (OrdinaryCallEvaluateBody (F , argumentsList )) とする。実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。 result が return completion なら result .[[Value]] を返す。アサート: result は throw completion である。 ? result を返す。
Note
ステップ 7 で calleeContext が実行コンテキストスタックから除去されるとき、到達可能な Generator により後で再開のためにサスペンド保持されている場合は破棄されてはならない。
10.2.1.1 PrepareForOrdinaryCall ( F , newTarget )
The abstract operation PrepareForOrdinaryCall takes arguments F (an ECMAScript function object) and newTarget (an Object or undefined ) and returns an execution context . It performs the following steps when called:
callerContext を実行中実行コンテキストとする。calleeContext を新しい ECMAScript コード実行コンテキスト とする。calleeContext の Function を F に設定する。calleeRealm を F .[[Realm]] とする。calleeContext の Realm を calleeRealm に設定する。calleeContext の ScriptOrModule を F .[[ScriptOrModule]] に設定する。localEnv を NewFunctionEnvironment (F , newTarget ) とする。calleeContext の LexicalEnvironment を localEnv に設定する。calleeContext の VariableEnvironment を localEnv に設定する。calleeContext の PrivateEnvironment を F .[[PrivateEnvironment]] に設定する。callerContext がまだサスペンドされていないなら callerContext をサスペンドする。実行コンテキストスタックに calleeContext を push する;calleeContext が実行中実行コンテキストとなる。 注記: この地点以降に生成される例外オブジェクトは calleeRealm に関連付けられる。 calleeContext を返す。
10.2.1.2 OrdinaryCallBindThis ( F , calleeContext , thisArgument )
The abstract operation OrdinaryCallBindThis takes arguments F (an ECMAScript function object), calleeContext (an execution context ), and thisArgument (an ECMAScript language value) and returns unused . It performs the following steps when called:
thisMode を F .[[ThisMode]] とする。thisMode が lexical なら unused を返す。calleeRealm を F .[[Realm]] とする。localEnv を calleeContext の LexicalEnvironment とする。thisMode が strict ならthisValue を thisArgument とする。それ以外thisArgument が undefined か null のいずれかならglobalEnv を calleeRealm .[[GlobalEnv]] とする。アサート: globalEnv は Global Environment Record である。 thisValue を globalEnv .[[GlobalThisValue]] とする。それ以外thisValue を ! ToObject (thisArgument ) とする。注記: ToObject は calleeRealm を用いてラッパーオブジェクトを生成する。 アサート: localEnv は Function Environment Record である。 アサート: 次のステップは localEnv .[[ThisBindingStatus]] が initialized でないため決して abrupt completion を返さない。 ! BindThisValue (localEnv , thisValue ) を実行する。 unused を返す。
10.2.1.3 Runtime Semantics: EvaluateBody
The syntax-directed operation EvaluateBody takes arguments functionObject (an ECMAScript function object) and argumentsList (a List of ECMAScript language values ) and returns a return completion or a throw completion . It is defined piecewise over the following productions:
FunctionBody : FunctionStatementList
FunctionBody の EvaluateFunctionBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
ConciseBody : ExpressionBody
ConciseBody の EvaluateConciseBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
GeneratorBody : FunctionBody
GeneratorBody の EvaluateGeneratorBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
AsyncGeneratorBody : FunctionBody
AsyncGeneratorBody の EvaluateAsyncGeneratorBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
AsyncFunctionBody : FunctionBody
AsyncFunctionBody の EvaluateAsyncFunctionBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
AsyncConciseBody : ExpressionBody
AsyncConciseBody の EvaluateAsyncConciseBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
Initializer :
=
AssignmentExpression
アサート: argumentsList は空である。 アサート: functionObject .[[ClassFieldInitializerName]] は empty ではない。 IsAnonymousFunctionDefinition(AssignmentExpression ) が true ならvalue を Initializer の NamedEvaluation を引数 functionObject .[[ClassFieldInitializerName]] で行い ? を付して得られる値とする。 それ以外rhs を AssignmentExpression の Evaluation を ? 付きで行った結果とする。value を ? GetValue (rhs ) とする。 ReturnCompletion (value ) を返す。
Note
フィールド初期化子は関数境界を構成するが、FunctionDeclarationInstantiation を呼び出しても観測可能な効果はないため省略される。
ClassStaticBlockBody : ClassStaticBlockStatementList
アサート: argumentsList は空である。 ClassStaticBlockBody の EvaluateClassStaticBlockBody を引数 functionObject で評価し ? を付して結果を返す。
10.2.1.4 OrdinaryCallEvaluateBody ( F , argumentsList )
The abstract operation OrdinaryCallEvaluateBody takes arguments F (an ECMAScript function object) and argumentsList (a List of ECMAScript language values ) and returns a return completion or a throw completion . It performs the following steps when called:
F .[[ECMAScriptCode]] の EvaluateBody を引数 F および argumentsList で評価し ? を付して結果を返す。
10.2.2 [[Construct]] ( argumentsList , newTarget )
The [[Construct]] internal method of ECMAScript 関数オブジェクト F takes arguments argumentsList (a List of ECMAScript language values ) and newTarget (a constructor) and returns Object を含む正常完了または throw 完了. It performs the following steps when called:
callerContext を実行中実行コンテキストとする。kind を F .[[ConstructorKind]] とする。kind が base ならthisArgument を ? OrdinaryCreateFromConstructor (newTarget , "%Object.prototype%" ) とする。calleeContext を PrepareForOrdinaryCall (F , newTarget ) とする。アサート: calleeContext が現在の実行中実行コンテキストである。 kind が base ならOrdinaryCallBindThis (F , calleeContext , thisArgument ) を実行する。initializeResult を Completion (InitializeInstanceElements (thisArgument , F )) とする。initializeResult が abrupt completion なら実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。 ? initializeResult を返す。 constructorEnv を calleeContext の LexicalEnvironment とする。result を Completion (OrdinaryCallEvaluateBody (F , argumentsList )) とする。実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。 result が throw completion なら? result を返す。 アサート: result は return completion である。 result .[[Value]] が Object なら result .[[Value]] を返す。kind が base なら thisArgument を返す。result .[[Value]] が undefined でないなら TypeError 例外を投げる。thisBinding を ? constructorEnv .GetThisBinding() とする。アサート: thisBinding は Object である。 thisBinding を返す。
10.2.3 OrdinaryFunctionCreate ( functionPrototype , sourceText , ParameterList , Body , thisMode , env , privateEnv )
The abstract operation OrdinaryFunctionCreate takes arguments functionPrototype (an Object), sourceText (a sequence of Unicode code points), ParameterList (a Parse Node), Body (a Parse Node), thisMode (lexical-this or non-lexical-this ), env (an Environment Record ), and privateEnv (a PrivateEnvironment Record or null ) and returns an ECMAScript function object. 新しい関数を(既定の [[Call]] 内部メソッドと、後で MakeConstructor などの操作によって追加されうる場合を除き [[Construct]] 内部メソッドなしで)実行時生成することを規定する。sourceText は生成対象関数の構文定義のソーステキストである。 It performs the following steps when called:
internalSlotsList を Table 28 に列挙された内部スロットとする。F を OrdinaryObjectCreate (functionPrototype , internalSlotsList ) とする。F .[[Call]] を 10.2.1 で規定される定義に設定する。F .[[SourceText]] を sourceText に設定する。F .[[FormalParameters]] を ParameterList に設定する。F .[[ECMAScriptCode]] を Body に設定する。Strict を IsStrict(Body ) とする。F .[[Strict]] を Strict に設定する。thisMode が lexical-this なら F .[[ThisMode]] を lexical に設定する。それ以外で Strict が true なら F .[[ThisMode]] を strict に設定する。 それ以外なら F .[[ThisMode]] を global に設定する。 F .[[IsClassConstructor]] を false に設定する。F .[[Environment]] を env に設定する。F .[[PrivateEnvironment]] を privateEnv に設定する。F .[[ScriptOrModule]] を GetActiveScriptOrModule () に設定する。F .[[Realm]] を current Realm Record に設定する。F .[[HomeObject]] を undefined に設定する。F .[[Fields]] を新しい空の List に設定する。F .[[PrivateMethods]] を新しい空の List に設定する。F .[[ClassFieldInitializerName]] を empty に設定する。len を ParameterList の ExpectedArgumentCount とする。SetFunctionLength (F , len ) を実行する。F を返す。
10.2.4 AddRestrictedFunctionProperties ( F , realm )
The abstract operation AddRestrictedFunctionProperties takes arguments F (a function object) and realm (a Realm Record ) and returns unused . It performs the following steps when called:
アサート: realm .[[Intrinsics]] .[[%ThrowTypeError% ]] が存在し初期化済みである。 thrower を realm .[[Intrinsics]] .[[%ThrowTypeError% ]] とする。! DefinePropertyOrThrow (F , "caller" , PropertyDescriptor { [[Get]] : thrower , [[Set]] : thrower , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 ! DefinePropertyOrThrow (F , "arguments" , PropertyDescriptor { [[Get]] : thrower , [[Set]] : thrower , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 unused を返す。
10.2.4.1 %ThrowTypeError% ( )
この関数は %ThrowTypeError% intrinsic オブジェクトである。
各 realm ごとに一度定義される匿名の組み込み関数オブジェクト である。
呼び出されたとき次の手順を実行する:
TypeError 例外を投げる。
この関数の [[Extensible]] 内部スロットの値は false である。
この関数の "length" プロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
この関数の "name" プロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
10.2.5 MakeConstructor ( F [ , writablePrototype [ , prototype ] ] )
The abstract operation MakeConstructor takes argument F (an ECMAScript function object or a built-in function object) and optional arguments writablePrototype (a Boolean) and prototype (an Object) and returns unused . F をコンストラクタ に変換する。 It performs the following steps when called:
F が ECMAScript 関数オブジェクト ならアサート: IsConstructor (F ) は false 。 アサート: F は "prototype" 自身プロパティを持たない拡張可能オブジェクトである。 F .[[Construct]] を 10.2.2 で規定される定義に設定する。それ以外F .[[Construct]] を 10.3.2 で規定される定義に設定する。 F .[[ConstructorKind]] を base に設定する。writablePrototype が与えられていなければ writablePrototype を true に設定する。prototype が与えられていないならprototype を OrdinaryObjectCreate (%Object.prototype% ) に設定する。! DefinePropertyOrThrow (prototype , "constructor" , PropertyDescriptor { [[Value]] : F , [[Writable]] : writablePrototype , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 ! DefinePropertyOrThrow (F , "prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : writablePrototype , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 unused を返す。
10.2.6 MakeClassConstructor ( F )
The abstract operation MakeClassConstructor takes argument F (an ECMAScript function object) and returns unused . It performs the following steps when called:
アサート: F .[[IsClassConstructor]] は false 。 F .[[IsClassConstructor]] を true に設定する。unused を返す。
10.2.7 MakeMethod ( F , homeObject )
The abstract operation MakeMethod takes arguments F (an ECMAScript function object) and homeObject (an Object) and returns unused . F を method として構成する。 It performs the following steps when called:
アサート: homeObject は通常オブジェクト である。 F .[[HomeObject]] を homeObject に設定する。unused を返す。
10.2.8 DefineMethodProperty ( homeObject , key , closure , enumerable )
The abstract operation DefineMethodProperty takes arguments homeObject (an Object), key (a property key or Private Name ), closure (a function object), and enumerable (a Boolean) and returns PrivateElement または unused を含む正常完了、または abrupt completion . It performs the following steps when called:
アサート: homeObject は通常で拡張可能なオブジェクトである。 key が Private Name ならPrivateElement { [[Key]] : key , [[Kind]] : method , [[Value]] : closure } を返す。それ以外desc を PropertyDescriptor { [[Value]] : closure , [[Writable]] : true , [[Enumerable]] : enumerable , [[Configurable]] : true } とする。? DefinePropertyOrThrow (homeObject , key , desc ) を実行する。 注記: DefinePropertyOrThrow は key が "prototype" であるクラス static method の定義を試みる場合のみ abrupt completion を返しうる。 unused を返す。
10.2.9 SetFunctionName ( F , name [ , prefix ] )
The abstract operation SetFunctionName takes arguments F (a function object) and name (a property key or Private Name ) and optional argument prefix (a String) and returns unused . F に "name" プロパティを追加する。 It performs the following steps when called:
アサート: F は "name" 自身プロパティを持たない拡張可能オブジェクトである。 name が Symbol ならdescription を name .[[Description]] とする。description が undefined なら name を空文字列に設定する。それ以外なら name を "[" , description , "]" の文字列連結 に設定する。 それ以外で name が Private Name ならname を name .[[Description]] に設定する。 F が [[InitialName]] 内部スロットを持つならF .[[InitialName]] を name に設定する。prefix が与えられているならname を prefix 、コード単位 0x0020 (SPACE)、name の連結に設定する。F が [[InitialName]] 内部スロットを持つなら注記: 以下のステップでの選択は本抽象操作 呼び出し毎に独立に行われる。 任意で F .[[InitialName]] を name に設定してよい。 ! DefinePropertyOrThrow (F , "name" , PropertyDescriptor { [[Value]] : name , [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 unused を返す。
10.2.10 SetFunctionLength ( F , length )
The abstract operation SetFunctionLength takes arguments F (a function object) and length (a non-negative integer or +∞) and returns unused . F に "length" プロパティを追加する。 It performs the following steps when called:
アサート: F は "length" 自身プロパティを持たない拡張可能オブジェクトである。 ! DefinePropertyOrThrow (F , "length" , PropertyDescriptor { [[Value]] : 𝔽 (length ), [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 unused を返す。
10.2.11 FunctionDeclarationInstantiation ( func , argumentsList )
The abstract operation FunctionDeclarationInstantiation takes arguments func (an ECMAScript function object) and argumentsList (a List of ECMAScript language values ) and returns unused を含む正常完了または throw 完了. func は実行コンテキストが確立される関数オブジェクト である。
Note
ECMAScript 関数の評価のために実行コンテキストが確立されると、新しい Function Environment Record が作成され、各仮引数の束縛がその Environment Record にインスタンス化される。関数本体内の各宣言もインスタンス化される。関数の仮引数に既定値初期化子が含まれない場合、本体宣言は仮引数と同じ Environment Record 内にインスタンス化される。既定値パラメータ初期化子が存在する場合、本体宣言用に 2 つ目の Environment Record が作成される。仮引数および関数は FunctionDeclarationInstantiation の一部として初期化される。その他の束縛は関数本体の評価中に初期化される。
呼び出されたとき次の手順を実行する:
calleeContext を実行中実行コンテキストとする。code を func .[[ECMAScriptCode]] とする。strict を func .[[Strict]] とする。formals を func .[[FormalParameters]] とする。parameterNames を formals の BoundNames とする。parameterNames が重複要素を持つなら hasDuplicates を true 、そうでなければ false とする。simpleParameterList を IsSimpleParameterList of formals とする。hasParameterExpressions を ContainsExpression of formals とする。varNames を code の VarDeclaredNames とする。varDeclarations を code の VarScopedDeclarations とする。lexicalNames を code の LexicallyDeclaredNames とする。functionNames を新しい空の List とする。functionsToInitialize を新しい空の List とする。varDeclarations の各要素 d について、List の逆順で:d が VariableDeclaration でも ForBinding でも BindingIdentifier でもないならアサート: d は FunctionDeclaration , GeneratorDeclaration , AsyncFunctionDeclaration , AsyncGeneratorDeclaration のいずれかである。 fn を d の BoundNames の唯一の要素とする。functionNames が fn を含まないならfn を functionNames の先頭に挿入する。注記: 同名の複数の関数宣言がある場合、最後の宣言が使用される。 d を functionsToInitialize の先頭に挿入する。argumentsObjectNeeded を true とする。func .[[ThisMode]] が lexical なら注記: Arrow function は arguments オブジェクトを持たない。 argumentsObjectNeeded を false に設定する。それ以外で parameterNames が "arguments" を含むならargumentsObjectNeeded を false に設定する。 それ以外で hasParameterExpressions が false ならfunctionNames が "arguments" を含むか lexicalNames が "arguments" を含むならargumentsObjectNeeded を false に設定する。 strict が true または hasParameterExpressions が false なら注記: strict mode コードでの eval
呼び出しは外側に可視な新しい束縛を生成できないため、仮引数には単一の Environment Record だけが必要。 env を calleeContext の LexicalEnvironment とする。それ以外注記: 形式パラメータリスト内の direct eval 呼び出しで生成される束縛がパラメータ宣言環境外になるよう別の Environment Record が必要。 calleeEnv を calleeContext の LexicalEnvironment とする。env を NewDeclarativeEnvironment (calleeEnv ) とする。アサート: calleeContext の VariableEnvironment と calleeEnv は同じ Environment Record 。 calleeContext の LexicalEnvironment を env に設定する。 parameterNames の各 String paramName についてalreadyDeclared を ! env .HasBinding(paramName ) とする。注記: 早期エラーにより重複パラメータ名はデフォルト値または rest パラメータを持たない non-strict 関数でのみ許される。 alreadyDeclared が false なら! env .CreateMutableBinding(paramName , false ) を実行する。 hasDuplicates が true なら! env .InitializeBinding(paramName , undefined ) を実行する。 argumentsObjectNeeded が true ならstrict が true または simpleParameterList が false ならao を CreateUnmappedArgumentsObject (argumentsList ) とする。それ以外注記: mapped arguments オブジェクトは rest パラメータ・デフォルト値初期化子・分割代入パラメータを持たない non-strict 関数にのみ提供される。 ao を CreateMappedArgumentsObject (func , formals , argumentsList , env ) とする。 strict が true なら! env .CreateImmutableBinding("arguments" , false ) を実行する。 注記: strict mode では早期エラーによりこの束縛への代入試行が防がれるため不変性は観測できない。 それ以外! env .CreateMutableBinding("arguments" , false ) を実行する。 ! env .InitializeBinding("arguments" , ao ) を実行する。 parameterBindings を parameterNames と « "arguments" » のリスト結合 とする。それ以外parameterBindings を parameterNames とする。 iteratorRecord を CreateListIteratorRecord (argumentsList ) とする。hasDuplicates が true ならusedEnv を undefined とする。それ以外usedEnv を env とする。 注記: 次のステップは ReturnCompletion を返しえない。expression 位置でそのような completion が生じる唯一の方法は YieldExpression の使用だが、これは 15.5.1 と 15.6.1 の Early Error 規則でパラメータリスト内で禁止される。 ? IteratorBindingInitialization of formals with arguments iteratorRecord and usedEnv を実行する。 hasParameterExpressions が false なら注記: 仮引数とトップレベル var には単一 Environment Record でよい。 instantiatedVarNames を List parameterBindings のコピーとする。varNames の各要素 n についてinstantiatedVarNames が n を含まないならn を instantiatedVarNames に追加する。! env .CreateMutableBinding(n , false ) を実行する。 ! env .InitializeBinding(n , undefined ) を実行する。 varEnv を env とする。それ以外注記: 形式パラメータリスト内の式で生成されるクロージャが関数本体内の宣言を可視化しないよう別 Environment Record が必要。 varEnv を NewDeclarativeEnvironment (env ) とする。calleeContext の VariableEnvironment を varEnv に設定する。instantiatedVarNames を新しい空の List とする。varNames の各要素 n についてinstantiatedVarNames が n を含まないならn を instantiatedVarNames に追加する。! varEnv .CreateMutableBinding(n , false ) を実行する。 parameterBindings が n を含まない、または functionNames が n を含むならinitialValue を undefined とする。それ以外initialValue を ! env .GetBindingValue(n , false ) とする。 ! varEnv .InitializeBinding(n , initialValue ) を実行する。 注記: 仮引数と同じ名前の var は初期的に対応する初期化済み仮引数と同じ値を持つ。 strict が true ならlexEnv を varEnv とする。それ以外Normative Optional
ホスト が web ブラウザであるか、または ブロックレベル Function 宣言 (Web レガシー互換意味論) をサポートするならcode Contains x が true である任意の Block , CaseClause , DefaultClause の StatementList に直接含まれる各 FunctionDeclaration f についてF を f の BindingIdentifier の StringValue とする。FunctionDeclaration f を F を BindingIdentifier とする VariableStatement に置き換えても func に Early Errors を生じさせず、かつ parameterNames が F を含まないなら注記: F の var 束縛は VarDeclaredName、仮引数名、別の FunctionDeclaration のいずれでもない場合のみここでインスタンス化される。 instantiatedVarNames が F を含まずかつ F が "arguments" でないなら! varEnv .CreateMutableBinding(F , false ) を実行する。 ! varEnv .InitializeBinding(F , undefined ) を実行する。 F を instantiatedVarNames に追加する。FunctionDeclaration f が評価されるとき、15.2.6 で提供される FunctionDeclaration Evaluation アルゴリズムの代わりに次を行う:fEnv を実行中実行コンテキストの VariableEnvironment とする。bEnv を実行中実行コンテキストの LexicalEnvironment とする。fObj を ! bEnv .GetBindingValue(F , false ) とする。! fEnv .SetMutableBinding(F , fObj , false ) を実行する。 unused を返す。lexEnv を NewDeclarativeEnvironment (varEnv ) とする。注記: Non-strict 関数はトップレベル lexical 宣言用に別の Environment Record を使用し、direct eval が eval コードで導入される var スコープ宣言が既存のトップレベル lexical 宣言と衝突するか判別できるようにする。strict 関数では strict direct eval がすべての宣言を新しい Environment Record に置くため不要。 calleeContext の LexicalEnvironment を lexEnv に設定する。lexDeclarations を code の LexicallyScopedDeclarations とする。lexDeclarations の各要素 d について注記: lexical に宣言された名前は function/generator 宣言、仮引数、var 名と同一になりえない。lexical 宣言された名前はここでインスタンス化されるが初期化されない。 d の BoundNames の各要素 dn についてIsConstantDeclaration of d が true なら! lexEnv .CreateImmutableBinding(dn , true ) を実行する。 それ以外! lexEnv .CreateMutableBinding(dn , false ) を実行する。 privateEnv を calleeContext の PrivateEnvironment とする。functionsToInitialize の各 Parse Node f についてfn を f の BoundNames の唯一の要素とする。fo を InstantiateFunctionObject of f with arguments lexEnv and privateEnv とする。! varEnv .SetMutableBinding(fn , fo , false ) を実行する。 unused を返す。
10.3 組み込み関数オブジェクト (Built-in Function Objects)
組み込み関数オブジェクト は通常オブジェクト であり、10.1 で定められる通常オブジェクト の要件を満たさなければならない。
すべての通常オブジェクト に要求される内部スロット(10.1 参照)に加えて、組み込み関数オブジェクト は次の内部スロットも持たなければならない:
組み込み関数オブジェクト の [[Prototype]] 内部スロットの初期値は、特に指定がない限り %Function.prototype% である。
組み込み関数オブジェクト は 10.3.1 の定義に適合する [[Call]] 内部メソッドを持たなければならない。
組み込み関数オブジェクト は “constructor” と記述される場合、または本仕様のあるアルゴリズムが明示的にその [[Construct]] 内部メソッドを設定する場合に限り [[Construct]] 内部メソッドを持つ。そうした [[Construct]] 内部メソッドは 10.3.2 の定義に適合しなければならない。
実装は本仕様で定義されない追加の組み込み関数オブジェクト を提供してもよい。
10.3.1 [[Call]] ( thisArgument , argumentsList )
The [[Call]] internal method of 組み込み関数オブジェクト F takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values ) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:
? BuiltinCallOrConstruct (F , thisArgument , argumentsList , undefined ) を返す。
10.3.2 [[Construct]] ( argumentsList , newTarget )
The [[Construct]] internal method of (このメソッドを持つ場合の)組み込み関数オブジェクト F takes arguments argumentsList (a List of ECMAScript language values ) and newTarget (a constructor) and returns Object を含む正常完了または throw 完了. It performs the following steps when called:
result を ? BuiltinCallOrConstruct (F , uninitialized , argumentsList , newTarget ) とする。アサート: result は Object である。 result を返す。
10.3.3 BuiltinCallOrConstruct ( F , thisArgument , argumentsList , newTarget )
The abstract operation BuiltinCallOrConstruct takes arguments F (a built-in function object), thisArgument (an ECMAScript language value or uninitialized ), argumentsList (a List of ECMAScript language values ), and newTarget (a constructor or undefined ) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:
callerContext を実行中実行コンテキストとする。callerContext がまだサスペンドされていないなら callerContext をサスペンドする。calleeContext を新しい実行コンテキストとする。calleeContext の Function を F に設定する。calleeRealm を F .[[Realm]] とする。calleeContext の Realm を calleeRealm に設定する。calleeContext の ScriptOrModule を null に設定する。必要な実装定義 の初期化を calleeContext に対して行う。 実行コンテキストスタックに calleeContext を push する;calleeContext が実行中実行コンテキストとなる。 result を、F の仕様に適合する形で F を評価した結果である Completion Record とする。thisArgument が uninitialized なら this 値は未初期化、それ以外の場合 thisArgument が this 値を提供する。argumentsList は名前付き引数を提供し、newTarget は NewTarget 値を提供する。注記: F がこの文書内で定義されている場合、「F の仕様」とはアルゴリズム手順や他の手段で指定されたその挙動である。 実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。 ? result を返す。
Note
calleeContext が実行コンテキストスタックから除去されるとき、アクセス可能な Generator により後で再開するためサスペンド保持されている場合は破棄されてはならない。
10.3.4 CreateBuiltinFunction ( behaviour , length , name , additionalInternalSlotsList [ , realm [ , prototype [ , prefix ] ] ] )
The abstract operation CreateBuiltinFunction takes arguments behaviour (an Abstract Closure , a set of algorithm steps, or some other definition of a function's behaviour provided in this specification), length (a non-negative integer or +∞), name (a property key or a Private Name ), and additionalInternalSlotsList (a List of names of internal slots) and optional arguments realm (a Realm Record ), prototype (an Object or null ), and prefix (a String) and returns a built-in function object. additionalInternalSlotsList にはオブジェクトの一部として定義されなければならない追加内部スロット名が含まれる。この操作は組み込み関数オブジェクト を生成する。 It performs the following steps when called:
realm が与えられていなければ realm を current Realm Record に設定する。prototype が与えられていなければ prototype を realm .[[Intrinsics]] .[[%Function.prototype% ]] に設定する。internalSlotsList を、これから生成する組み込み関数オブジェクト に 10.3 が要求するすべての内部スロット名を含む List とする。additionalInternalSlotsList の要素を internalSlotsList に追加する。func を新しい組み込み関数オブジェクト とし、呼び出されたとき behaviour で指定された対応パラメータに与えられた引数を渡して behaviour に記述された動作を行うものとする。この新しい関数オブジェクト は名前が internalSlotsList の要素である内部スロット群と [[InitialName]] 内部スロットを持つ。func .[[Prototype]] を prototype に設定する。func .[[Extensible]] を true に設定する。func .[[Realm]] を realm に設定する。func .[[InitialName]] を null に設定する。SetFunctionLength (func , length ) を実行する。prefix が与えられていないならSetFunctionName (func , name ) を実行する。それ以外SetFunctionName (func , name , prefix ) を実行する。 func を返す。
本仕様で定義される各組み込み関数は CreateBuiltinFunction 抽象操作 を呼び出すことで生成される。
10.4 組み込みエキゾチックオブジェクトの内部メソッドとスロット (Built-in Exotic Object Internal Methods and Slots)
本仕様はいくつかの種類の組み込みエキゾチックオブジェクト を定義する。これらのオブジェクトは特定の状況を除いて一般に通常オブジェクト と同様に振る舞う。以下のエキゾチックオブジェクト は、下で明示的に別途指定される場合を除き通常オブジェクト 内部メソッドを使用する:
10.4.1 束縛関数エキゾチックオブジェクト (Bound Function Exotic Objects)
束縛関数エキゾチックオブジェクト は別の関数オブジェクト を包むエキゾチックオブジェクト である。束縛関数エキゾチックオブジェクト は呼び出し可能([[Call]] 内部メソッドを持ち、[[Construct]] 内部メソッドを持つ場合がある)。束縛関数エキゾチックオブジェクト を呼び出すことは一般に包まれた関数の呼び出しをもたらす。
オブジェクトの [[Call]] および(該当する場合)[[Construct]] 内部メソッドが以下の実装を使用し、その他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは 束縛関数エキゾチックオブジェクト である。これらのメソッドは BoundFunctionCreate で設定される。
束縛関数エキゾチックオブジェクト は Table 28 に列挙される ECMAScript 関数オブジェクト の内部スロットを持たない。代わりに [[Prototype]] と [[Extensible]] に加えて Table 29 に列挙される内部スロットを持つ。
Table 29: 束縛関数エキゾチックオブジェクト の内部スロット (Internal Slots of Bound Function Exotic Objects)
Internal Slot
Type
Description
[[BoundTargetFunction]]
a callable Object
包まれている関数オブジェクト 。
[[BoundThis]]
an ECMAScript language value
包まれた関数を呼ぶ際に常に this 値として渡される値。
[[BoundArguments]]
a List of ECMAScript language values
包まれた関数へのあらゆる呼び出しで最初の引数として使用される要素のリスト。
10.4.1.1 [[Call]] ( thisArgument , argumentsList )
The [[Call]] internal method of 束縛関数エキゾチックオブジェクト F takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values ) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:
target を F .[[BoundTargetFunction]] とする。boundThis を F .[[BoundThis]] とする。boundArgs を F .[[BoundArguments]] とする。args を boundArgs と argumentsList のリスト結合 とする。? Call(target , boundThis , args ) を返す。
10.4.1.2 [[Construct]] ( argumentsList , newTarget )
The [[Construct]] internal method of 束縛関数エキゾチックオブジェクト F takes arguments argumentsList (a List of ECMAScript language values ) and newTarget (a constructor) and returns Object を含む正常完了または throw 完了. It performs the following steps when called:
target を F .[[BoundTargetFunction]] とする。アサート: IsConstructor (target ) は true 。 boundArgs を F .[[BoundArguments]] とする。args を boundArgs と argumentsList のリスト結合 とする。SameValue (F , newTarget ) が true なら newTarget を target に設定する。? Construct(target , args , newTarget ) を返す。
10.4.1.3 BoundFunctionCreate ( targetFunction , boundThis , boundArgs )
The abstract operation BoundFunctionCreate takes arguments targetFunction (a function object), boundThis (an ECMAScript language value), and boundArgs (a List of ECMAScript language values ) and returns function object を含む正常完了または throw 完了. 新しい束縛関数エキゾチックオブジェクト の生成を規定する。 It performs the following steps when called:
proto を ? targetFunction .[[GetPrototypeOf]] () とする。internalSlotsList を « [[Prototype]] , [[Extensible]] » と Table 29 に列挙される内部スロットのリスト結合 とする。obj を MakeBasicObject (internalSlotsList ) とする。obj .[[Prototype]] を proto に設定する。obj .[[Call]] を 10.4.1.1 で述べるとおりに設定する。IsConstructor (targetFunction ) が true ならobj .[[Construct]] を 10.4.1.2 で述べるとおりに設定する。obj .[[BoundTargetFunction]] を targetFunction に設定する。obj .[[BoundThis]] を boundThis に設定する。obj .[[BoundArguments]] を boundArgs に設定する。obj を返す。
10.4.2 配列エキゾチックオブジェクト (Array Exotic Objects)
Array は配列インデックス プロパティキー (6.1.7 参照)に特別な扱いを与えるエキゾチックオブジェクト である。プロパティ名 が配列インデックス であるプロパティは 要素 (element) とも呼ばれる。すべての Array は設定不可 ("length" ) プロパティを持ち、その値は常に 232 より厳密に小さい非負整数 的 Number である。"length" プロパティの値は、自身の名前が配列インデックス であるすべての自身プロパティ名 より数値的に大きい;Array の自身プロパティが生成または変更されたとき、この不変条件を維持するために他のプロパティが必要に応じ調整される。具体的には、名前が配列インデックス である自身プロパティが追加されるたび、必要なら "length" プロパティの値はその配列インデックス の数値値 + 1 に変更され;"length" プロパティの値が変更されるたび、新しい length 以上の値を持つ配列インデックス 名の自身プロパティはすべて削除される。この制約は Array の自身プロパティにのみ適用され、そのプロトタイプから継承される "length" や配列インデックス プロパティには影響されない。
オブジェクトの [[DefineOwnProperty]] 内部メソッドが以下の実装を使用し、他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは Array エキゾチックオブジェクト (単に Array)である。これらのメソッドは ArrayCreate で設定される。
10.4.2.1 [[DefineOwnProperty]] ( P , Desc )
The [[DefineOwnProperty]] internal method of Array エキゾチックオブジェクト A takes arguments P (a property key) and Desc (a Property Descriptor ) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
P が "length" なら? ArraySetLength (A , Desc ) を返す。 それ以外で P が配列インデックス ならlengthDesc を OrdinaryGetOwnProperty (A , "length" ) とする。アサート: lengthDesc は undefined ではない。 アサート: IsDataDescriptor (lengthDesc ) は true 。 アサート: lengthDesc .[[Configurable]] は false 。 length を lengthDesc .[[Value]] とする。アサート: length は非負整数 的 Number である。 index を ! ToUint32 (P ) とする。index ≥ length かつ lengthDesc .[[Writable]] が false なら false を返す。succeeded を ! OrdinaryDefineOwnProperty (A , P , Desc ) とする。succeeded が false なら false を返す。index ≥ length ならlengthDesc .[[Value]] を index + 1 𝔽 に設定する。succeeded を ! OrdinaryDefineOwnProperty (A , "length" , lengthDesc ) に設定する。アサート: succeeded は true 。 true を返す。 ? OrdinaryDefineOwnProperty (A , P , Desc ) を返す。
10.4.2.2 ArrayCreate ( length [ , proto ] )
The abstract operation ArrayCreate takes argument length (a non-negative integer) and optional argument proto (an Object) and returns Array エキゾチックオブジェクト または throw 完了. 新しい Array の生成を規定する。 It performs the following steps when called:
length > 232 - 1 なら RangeError 例外を投げる。proto が与えられていなければ proto を %Array.prototype% に設定する。A を MakeBasicObject (« [[Prototype]] , [[Extensible]] ») とする。A .[[Prototype]] を proto に設定する。A .[[DefineOwnProperty]] を 10.4.2.1 で規定されるとおりに設定する。! OrdinaryDefineOwnProperty (A , "length" , PropertyDescriptor { [[Value]] : 𝔽 (length ), [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 A を返す。
10.4.2.3 ArraySpeciesCreate ( originalArray , length )
The abstract operation ArraySpeciesCreate takes arguments originalArray (an Object) and length (a non-negative integer) and returns Object を含む正常完了または throw 完了. originalArray から派生したコンストラクタ 関数を用いて新しい Array または類似オブジェクトを生成することを規定する。コンストラクタ が Array を返すことは強制されない。 It performs the following steps when called:
isArray を ? IsArray (originalArray ) とする。isArray が false なら ? ArrayCreate (length ) を返す。C を ? Get (originalArray , "constructor" ) とする。IsConstructor (C ) が true ならthisRealm を current Realm Record とする。realmC を ? GetFunctionRealm (C ) とする。thisRealm と realmC が同じ Realm Record でないならSameValue (C , realmC .[[Intrinsics]] .[[%Array% ]]) が true なら C を undefined に設定する。C が Object ならC を ? Get (C , %Symbol.species% ) に設定する。C が null なら C を undefined に設定する。C が undefined なら ? ArrayCreate (length ) を返す。IsConstructor (C ) が false なら TypeError 例外を投げる。? Construct(C , « 𝔽 (length ) ») を返す。
Note
originalArray が実行中実行コンテキストの realm ではない realm の標準組み込み Array コンストラクタ を用いて生成されていた場合、実行中実行コンテキストの realm を用いて新しい Array が生成される。これは歴史的に Array.prototype
メソッドがそのような動作をしていた Web ブラウザとの互換性を維持する。
10.4.2.4 ArraySetLength ( A , Desc )
The abstract operation ArraySetLength takes arguments A (an Array) and Desc (a Property Descriptor ) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
Desc が [[Value]] フィールドを持たないなら! OrdinaryDefineOwnProperty (A , "length" , Desc ) を返す。 newLenDesc を Desc のコピーとする。newLen を ? ToUint32 (Desc .[[Value]] ) とする。numberLen を ? ToNumber (Desc .[[Value]] ) とする。SameValueZero (newLen , numberLen ) が false なら RangeError 例外を投げる。newLenDesc .[[Value]] を newLen に設定する。oldLenDesc を OrdinaryGetOwnProperty (A , "length" ) とする。アサート: oldLenDesc は undefined ではない。 アサート: IsDataDescriptor (oldLenDesc ) は true 。 アサート: oldLenDesc .[[Configurable]] は false 。 oldLen を oldLenDesc .[[Value]] とする。newLen ≥ oldLen なら! OrdinaryDefineOwnProperty (A , "length" , newLenDesc ) を返す。 oldLenDesc .[[Writable]] が false なら false を返す。newLenDesc が [[Writable]] フィールドを持たないか newLenDesc .[[Writable]] が true ならnewWritable を true とする。それ以外注記: [[Writable]] 属性を false に設定するのは、要素が削除できない場合に備えて遅延される。 newWritable を false とする。newLenDesc .[[Writable]] を true に設定する。 succeeded を ! OrdinaryDefineOwnProperty (A , "length" , newLenDesc ) とする。succeeded が false なら false を返す。A の各自身プロパティキー P で P が配列インデックス かつ ! ToUint32 (P ) ≥ newLen であるものについて、数値インデックス降順で:deleteSucceeded を ! A .[[Delete]] (P ) とする。deleteSucceeded が false ならnewLenDesc .[[Value]] を ! ToUint32 (P ) + 1 𝔽 に設定する。newWritable が false なら newLenDesc .[[Writable]] を false に設定する。! OrdinaryDefineOwnProperty (A , "length" , newLenDesc ) を実行する。 false を返す。newWritable が false ならsucceeded を ! OrdinaryDefineOwnProperty (A , "length" , PropertyDescriptor { [[Writable]] : false }) に設定する。アサート: succeeded は true 。 true を返す。
Note
ステップ 3 および 4 では、Desc .[[Value]] がオブジェクトの場合その valueOf
メソッドが 2 回呼び出される。これは本仕様第 2 版以降この効果を伴うよう規定されたレガシー 動作である。
10.4.3 文字列エキゾチックオブジェクト (String Exotic Objects)
String オブジェクトは String 値をカプセル化し、その String 値の個々のコード単位要素に対応する仮想の整数インデックス 付きデータプロパティ を公開するエキゾチックオブジェクト である。String エキゾチックオブジェクト は常に "length" という名前のデータプロパティ を持ち、その値はカプセル化された String 値の長さである。コード単位データプロパティ と "length" プロパティはいずれも書き込み不可かつ設定不可である。
オブジェクトの [[GetOwnProperty]] 、[[DefineOwnProperty]] 、[[OwnPropertyKeys]] 内部メソッドが以下の実装を使用し、他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは String エキゾチックオブジェクト (単に String オブジェクト)である。これらのメソッドは StringCreate で設定される。
String エキゾチックオブジェクト は通常オブジェクト と同じ内部スロットを持つ。また [[StringData]] 内部スロットを持つ。
10.4.3.1 [[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of String エキゾチックオブジェクト S takes argument P (a property key) and returns Property Descriptor か undefined を含む正常完了. It performs the following steps when called:
desc を OrdinaryGetOwnProperty (S , P ) とする。desc が undefined でないなら desc を返す。StringGetOwnProperty (S , P ) を返す。
10.4.3.2 [[DefineOwnProperty]] ( P , Desc )
The [[DefineOwnProperty]] internal method of String エキゾチックオブジェクト S takes arguments P (a property key) and Desc (a Property Descriptor ) and returns Boolean を含む正常完了. It performs the following steps when called:
stringDesc を StringGetOwnProperty (S , P ) とする。stringDesc が undefined でないならextensible を S .[[Extensible]] とする。IsCompatiblePropertyDescriptor (extensible , Desc , stringDesc ) を返す。! OrdinaryDefineOwnProperty (S , P , Desc ) を返す。
10.4.3.3 [[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of String エキゾチックオブジェクト O takes no arguments and returns プロパティキー の List を含む正常完了. It performs the following steps when called:
keys を新しい空の List とする。str を O .[[StringData]] とする。アサート: str は String である。 len を str の長さとする。0 ≤ i < len を満たす各整数 i について昇順で:! ToString (𝔽 (i )) を keys に追加する。 O の各自身プロパティキー P で P が配列インデックス かつ ! ToIntegerOrInfinity (P ) ≥ len であるものについて、数値インデックス昇順で:P を keys に追加する。O の各自身プロパティキー P で P が String かつ配列インデックス でないものについて、作成順昇順で:P を keys に追加する。O の各自身プロパティキー P で P が Symbol であるものについて、作成順昇順で:P を keys に追加する。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:
S を MakeBasicObject (« [[Prototype]] , [[Extensible]] , [[StringData]] ») とする。S .[[Prototype]] を prototype に設定する。S .[[StringData]] を value に設定する。S .[[GetOwnProperty]] を 10.4.3.1 で規定されるとおりに設定する。S .[[DefineOwnProperty]] を 10.4.3.2 で規定されるとおりに設定する。S .[[OwnPropertyKeys]] を 10.4.3.3 で規定されるとおりに設定する。length を value の長さとする。! DefinePropertyOrThrow (S , "length" , PropertyDescriptor { [[Value]] : 𝔽 (length ), [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 S を返す。
10.4.3.5 StringGetOwnProperty ( S , P )
The abstract operation StringGetOwnProperty takes arguments S (an Object that has a [[StringData]] internal slot) and P (a property key) and returns a Property Descriptor or undefined . It performs the following steps when called:
P が String でなければ undefined を返す。index を CanonicalNumericIndexString (P ) とする。index が整数 的 Number でなければ undefined を返す。index が -0 𝔽 または index < -0 𝔽 なら undefined を返す。str を S .[[StringData]] とする。アサート: str は String。 len を str の長さとする。ℝ (index ) ≥ len なら undefined を返す。resultStr を str の ℝ (index ) から ℝ (index ) + 1 までの部分文字列 とする。PropertyDescriptor { [[Value]] : resultStr , [[Writable]] : false , [[Enumerable]] : true , [[Configurable]] : false } を返す。
10.4.4 arguments エキゾチックオブジェクト (Arguments Exotic Objects)
ほとんどの ECMAScript 関数はそのコードに arguments オブジェクトを利用可能にする。関数定義の特性に応じて、その arguments オブジェクトは通常オブジェクト か arguments エキゾチックオブジェクト のいずれかである。arguments エキゾチックオブジェクト は、配列インデックス プロパティが関連 ECMAScript 関数の呼び出しでの仮引数束縛に対応付けられるエキゾチックオブジェクト である。
オブジェクトの内部メソッドが以下の実装を使用し、ここで指定されないものが 10.1 の定義を使用する場合、そのオブジェクトは arguments エキゾチックオブジェクト である。これらのメソッドは CreateMappedArgumentsObject で設定される。
Note 1
arguments エキゾチックオブジェクト は通常オブジェクト と同じ内部スロットを持つ。また [[ParameterMap]] 内部スロットを持つ。通常の arguments オブジェクトも常に undefined である [[ParameterMap]] 内部スロットを持つ。通常の arguments オブジェクトでは [[ParameterMap]] 内部スロットは Object.prototype.toString
(20.1.3.6 ) によりその識別にのみ使われる。
Note 2
対応する関数オブジェクト の仮引数数より小さい数値名を持つ arguments エキゾチックオブジェクト の整数インデックス データプロパティ は、初期状態で関数の実行コンテキスト内の対応する引数束縛の値を共有する。これはそのプロパティを変更すると対応する引数束縛の値も変わり、逆も同様であることを意味する。この対応はそのようなプロパティが削除され再定義された場合、またはアクセサプロパティ に変換された場合に失われる。arguments オブジェクトが通常オブジェクト であれば、そのプロパティ値は単に関数に渡された引数のコピーであり、プロパティ値と仮引数値の動的リンクは存在しない。
Note 3
ParameterMap オブジェクトとそのプロパティ値は arguments オブジェクトと引数束縛間の対応を仕様化するための装置として使用される。ParameterMap オブジェクトやそのプロパティ値であるオブジェクトは ECMAScript コードから直接観測できない。実装は指定されたセマンティクスを実現するために実際にそれらを生成または使用する必要はない。
Note 4
通常の arguments オブジェクトはアクセス時に TypeError 例外を投げる設定不可のアクセサプロパティ "callee" を定義する。"callee" プロパティは non-strict 関数の一部にのみ生成される arguments エキゾチックオブジェクト ではより特定の意味を持つ。通常バリアントでこのプロパティを定義するのは、適合実装が他のいかなる形でも定義しないことを保証するためである。
Note 5
arguments エキゾチックオブジェクト の実装は歴史的に "caller" というアクセサプロパティ を含んでいた。ECMAScript 2017 以前、この仕様は通常 arguments オブジェクト上の投げる "caller" プロパティの定義を含んでいた。実装がもはやこの拡張を含まないため、ECMAScript 2017 は投げる "caller" アクセサの要件を削除した。
10.4.4.1 [[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of arguments エキゾチックオブジェクト args takes argument P (a property key) and returns Property Descriptor か undefined を含む正常完了. It performs the following steps when called:
desc を OrdinaryGetOwnProperty (args , P ) とする。desc が undefined なら undefined を返す。map を args .[[ParameterMap]] とする。isMapped を ! HasOwnProperty (map , P ) とする。isMapped が true ならdesc .[[Value]] を ! Get (map , P ) に設定する。desc を返す。
10.4.4.2 [[DefineOwnProperty]] ( P , Desc )
The [[DefineOwnProperty]] internal method of arguments エキゾチックオブジェクト args takes arguments P (a property key) and Desc (a Property Descriptor ) and returns Boolean を含む正常完了. It performs the following steps when called:
map を args .[[ParameterMap]] とする。isMapped を ! HasOwnProperty (map , P ) とする。newArgDesc を Desc とする。isMapped が true かつ IsDataDescriptor (Desc ) が true の場合、Desc が [[Value]] フィールドを持たず [[Writable]] フィールドを持ち Desc .[[Writable]] が false ならnewArgDesc を Desc のコピーとする。newArgDesc .[[Value]] を ! Get (map , P ) に設定する。allowed を ! OrdinaryDefineOwnProperty (args , P , newArgDesc ) とする。allowed が false なら false を返す。isMapped が true ならIsAccessorDescriptor (Desc ) が true なら! map .[[Delete]] (P ) を実行する。 それ以外Desc が [[Value]] フィールドを持つならアサート: arguments オブジェクトによりマップされる仮引数は常に書き込み可能であるため以下の Set は成功する。 ! Set (map , P , Desc .[[Value]] , false ) を実行する。 Desc が [[Writable]] フィールドを持ち Desc .[[Writable]] が false なら! map .[[Delete]] (P ) を実行する。 true を返す。
10.4.4.3 [[Get]] ( P , Receiver )
The [[Get]] internal method of arguments エキゾチックオブジェクト args takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:
map を args .[[ParameterMap]] とする。isMapped を ! HasOwnProperty (map , P ) とする。isMapped が false なら? OrdinaryGet (args , P , Receiver ) を返す。 それ以外アサート: map は P に対する仮引数マッピングを含む。 ! Get (map , P ) を返す。
10.4.4.4 [[Set]] ( P , V , Receiver )
The [[Set]] internal method of arguments エキゾチックオブジェクト args takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
SameValue (args , Receiver ) が false ならisMapped を false とする。それ以外map を args .[[ParameterMap]] とする。isMapped を ! HasOwnProperty (map , P ) とする。 isMapped が true ならアサート: 以下の Set は成功する。なぜなら arguments オブジェクトによりマップされる仮引数は常に書き込み可能だからである。 ! Set (map , P , V , false ) を実行する。 ? OrdinarySet (args , P , V , Receiver ) を返す。
10.4.4.5 [[Delete]] ( P )
The [[Delete]] internal method of arguments エキゾチックオブジェクト args takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
map を args .[[ParameterMap]] とする。isMapped を ! HasOwnProperty (map , P ) とする。result を ? OrdinaryDelete (args , P ) とする。result が true かつ isMapped が true なら! map .[[Delete]] (P ) を実行する。 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:
len を argumentsList の要素数とする。obj を OrdinaryObjectCreate (%Object.prototype% , « [[ParameterMap]] ») とする。obj .[[ParameterMap]] を undefined に設定する。! DefinePropertyOrThrow (obj , "length" , PropertyDescriptor { [[Value]] : 𝔽 (len ), [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 index を 0 とする。index < len の間繰り返す:val を argumentsList [index ] とする。! CreateDataPropertyOrThrow (obj , ! ToString (𝔽 (index )), val ) を実行する。 index を index + 1 に設定する。! DefinePropertyOrThrow (obj , %Symbol.iterator% , PropertyDescriptor { [[Value]] : %Array.prototype.values%, [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 ! DefinePropertyOrThrow (obj , "callee" , PropertyDescriptor { [[Get]] : %ThrowTypeError% , [[Set]] : %ThrowTypeError% , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 obj を返す。
10.4.4.7 CreateMappedArgumentsObject ( func , formals , argumentsList , env )
The abstract operation CreateMappedArgumentsObject takes arguments func (an Object), formals (a Parse Node), argumentsList (a List of ECMAScript language values ), and env (an Environment Record ) and returns an arguments exotic object. It performs the following steps when called:
アサート: formals は rest パラメータ、任意の binding pattern、任意の initializer を含まず、重複識別子を含んでもよい。 len を argumentsList の要素数とする。obj を MakeBasicObject (« [[Prototype]] , [[Extensible]] , [[ParameterMap]] ») とする。obj .[[GetOwnProperty]] を 10.4.4.1 で規定されるとおりに設定する。obj .[[DefineOwnProperty]] を 10.4.4.2 で規定されるとおりに設定する。obj .[[Get]] を 10.4.4.3 で規定されるとおりに設定する。obj .[[Set]] を 10.4.4.4 で規定されるとおりに設定する。obj .[[Delete]] を 10.4.4.5 で規定されるとおりに設定する。obj .[[Prototype]] を %Object.prototype% に設定する。map を OrdinaryObjectCreate (null ) とする。obj .[[ParameterMap]] を map に設定する。parameterNames を formals の BoundNames とする。numberOfParameters を parameterNames の要素数とする。index を 0 とする。index < len の間繰り返す:val を argumentsList [index ] とする。! CreateDataPropertyOrThrow (obj , ! ToString (𝔽 (index )), val ) を実行する。 index を index + 1 に設定する。! DefinePropertyOrThrow (obj , "length" , PropertyDescriptor { [[Value]] : 𝔽 (len ), [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 mappedNames を新しい空の List とする。index を numberOfParameters - 1 に設定する。index ≥ 0 の間繰り返す:name を parameterNames [index ] とする。mappedNames が name を含まないならmappedNames に name を追加する。index < len ならg を MakeArgGetter (name , env ) とする。p を MakeArgSetter (name , env ) とする。! map .[[DefineOwnProperty]] (! ToString (𝔽 (index )), PropertyDescriptor { [[Set]] : p , [[Get]] : g , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 index を index - 1 に設定する。! DefinePropertyOrThrow (obj , %Symbol.iterator% , PropertyDescriptor { [[Value]] : %Array.prototype.values%, [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 ! DefinePropertyOrThrow (obj , "callee" , PropertyDescriptor { [[Value]] : func , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true }) を実行する。 obj を返す。
10.4.4.7.1 MakeArgGetter ( name , env )
The abstract operation MakeArgGetter takes arguments name (a String) and env (an Environment Record ) and returns a function object. env において name に束縛された値を返す組み込み関数オブジェクト を生成する。 It performs the following steps when called:
getterClosure を、新しい引数なし Abstract Closure とし、name と env を捕捉し呼び出されたとき次を行うものとする:NormalCompletion (! env .GetBindingValue(name , false )) を返す。getter を CreateBuiltinFunction (getterClosure , 0, "" , « ») とする。注記: getter は ECMAScript コードから直接アクセスされない。 getter を返す。
10.4.4.7.2 MakeArgSetter ( name , env )
The abstract operation MakeArgSetter takes arguments name (a String) and env (an Environment Record ) and returns a function object. env において name に束縛された値を設定する組み込み関数オブジェクト を生成する。 It performs the following steps when called:
setterClosure を、パラメータ (value ) を持ち name と env を捕捉し呼び出されたとき次を行う新しい Abstract Closure とする:NormalCompletion (! env .SetMutableBinding(name , value , false )) を返す。setter を CreateBuiltinFunction (setterClosure , 1, "" , « ») とする。注記: setter は ECMAScript コードから直接アクセスされない。 setter を返す。
10.4.5 TypedArray エキゾチックオブジェクト (TypedArray Exotic Objects)
TypedArray は正準数値文字列であるプロパティキー を特別扱いし、そのうち境界内の整数インデックス 集合を用いて均一型要素をインデックス付けし、残りがプロトタイプ連鎖走査を発生させずに欠落しているという不変条件を強制するエキゾチックオブジェクト である。
Note
任意の Number n に対する ToString (n ) は正準数値文字列であるため、実装は実際に文字列変換を行わずに Number を TypedArray のプロパティキー として扱ってもよい。
TypedArray は通常オブジェクト と同じ内部スロットを持ち、さらに [[ViewedArrayBuffer]] , [[TypedArrayName]] , [[ContentType]] , [[ByteLength]] , [[ByteOffset]] , [[ArrayLength]] 内部スロットを持つ。
オブジェクトの [[PreventExtensions]] , [[GetOwnProperty]] , [[HasProperty]] , [[DefineOwnProperty]] , [[Get]] , [[Set]] , [[Delete]] , [[OwnPropertyKeys]] 内部メソッドが本節の定義を使用し、他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは TypedArray である。これらのメソッドは TypedArrayCreate により設定される。
10.4.5.1 [[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of TypedArray O takes no arguments and returns Boolean を含む正常完了. It performs the following steps when called:
注記: 6.1.7.3 に規定される拡張可能性関連の不変条件は、基礎バッファがリサイズされ整数インデックス 名のプロパティを獲得(または失い再獲得)し得る場合に true を返すことを許さない。 IsTypedArrayFixedLength (O ) が false なら false を返す。OrdinaryPreventExtensions (O ) を返す。
10.4.5.2 [[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of TypedArray O takes argument P (a property key) and returns Property Descriptor か undefined を含む正常完了. It performs the following steps when called:
P が String ならnumericIndex を CanonicalNumericIndexString (P ) とする。numericIndex が undefined でないならvalue を TypedArrayGetElement (O , numericIndex ) とする。value が undefined なら undefined を返す。PropertyDescriptor { [[Value]] : value , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : true } を返す。 OrdinaryGetOwnProperty (O , P ) を返す。
10.4.5.3 [[HasProperty]] ( P )
The [[HasProperty]] internal method of TypedArray O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
P が String ならnumericIndex を CanonicalNumericIndexString (P ) とする。numericIndex が undefined でないなら IsValidIntegerIndex (O , numericIndex ) を返す。? OrdinaryHasProperty (O , P ) を返す。
10.4.5.4 [[DefineOwnProperty]] ( P , Desc )
The [[DefineOwnProperty]] internal method of TypedArray O takes arguments P (a property key) and Desc (a Property Descriptor ) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
P が String ならnumericIndex を CanonicalNumericIndexString (P ) とする。numericIndex が undefined でないならIsValidIntegerIndex (O , numericIndex ) が false なら false を返す。Desc が [[Configurable]] フィールドを持ち Desc .[[Configurable]] が false なら false を返す。Desc が [[Enumerable]] フィールドを持ち Desc .[[Enumerable]] が false なら false を返す。IsAccessorDescriptor (Desc ) が true なら false を返す。Desc が [[Writable]] フィールドを持ち Desc .[[Writable]] が false なら false を返す。Desc が [[Value]] フィールドを持つなら ? TypedArraySetElement (O , numericIndex , Desc .[[Value]] ) を実行する。true を返す。! OrdinaryDefineOwnProperty (O , P , Desc ) を返す。
10.4.5.5 [[Get]] ( P , Receiver )
The [[Get]] internal method of TypedArray O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:
P が String ならnumericIndex を CanonicalNumericIndexString (P ) とする。numericIndex が undefined でないならTypedArrayGetElement (O , numericIndex ) を返す。? OrdinaryGet (O , P , Receiver ) を返す。
10.4.5.6 [[Set]] ( P , V , Receiver )
The [[Set]] internal method of TypedArray O takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
P が String ならnumericIndex を CanonicalNumericIndexString (P ) とする。numericIndex が undefined でないならSameValue (O , Receiver ) が true なら? TypedArraySetElement (O , numericIndex , V ) を実行する。 true を返す。IsValidIntegerIndex (O , numericIndex ) が false なら true を返す。? OrdinarySet (O , P , V , Receiver ) を返す。
10.4.5.7 [[Delete]] ( P )
The [[Delete]] internal method of TypedArray O takes argument P (a property key) and returns Boolean を含む正常完了. It performs the following steps when called:
P が String ならnumericIndex を CanonicalNumericIndexString (P ) とする。numericIndex が undefined でないならIsValidIntegerIndex (O , numericIndex ) が false なら true を返す;そうでなければ false を返す。! OrdinaryDelete (O , P ) を返す。
10.4.5.8 [[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of TypedArray O takes no arguments and returns プロパティキー の List を含む正常完了. It performs the following steps when called:
taRecord を MakeTypedArrayWithBufferWitnessRecord (O , seq-cst ) とする。keys を新しい空の List とする。IsTypedArrayOutOfBounds (taRecord ) が false ならlength を TypedArrayLength (taRecord ) とする。0 ≤ i < length の各整数 i について昇順で:! ToString (𝔽 (i )) を keys に追加する。 O の各自身プロパティキー P で P が String かつ整数インデックス でないものについて、作成順昇順で:P を keys に追加する。O の各自身プロパティキー P で P が Symbol であるものについて、作成順昇順で:P を keys に追加する。keys を返す。
10.4.5.9 バッファ監視付き TypedArray レコード (TypedArray With Buffer Witness Records)
TypedArray With Buffer Witness Record は、TypedArray と、ビュー対象バッファのキャッシュされたバイト長をカプセル化する Record 値である。Growable SharedArrayBuffer をビューしている場合に、そのバイト長データブロックの単一の共有メモリ読取イベントがあることを保証する助けとなる。
TypedArray With Buffer Witness Record は Table 30 に列挙されるフィールドを持つ。
Table 30: TypedArray With Buffer Witness Record Fields
Field Name
Value
Meaning
[[Object]]
a TypedArray
バッファのバイト長が読み出される TypedArray 。
[[CachedBufferByteLength]]
a non-negative integer or detached
Record 作成時点のオブジェクトの [[ViewedArrayBuffer]] のバイト長。
10.4.5.10 MakeTypedArrayWithBufferWitnessRecord ( obj , order )
The abstract operation MakeTypedArrayWithBufferWitnessRecord takes arguments obj (a TypedArray ) and order (seq-cst or unordered ) and returns a TypedArray With Buffer Witness Record . It performs the following steps when called:
buffer を obj .[[ViewedArrayBuffer]] とする。IsDetachedBuffer (buffer ) が true ならbyteLength を detached とする。それ以外byteLength を ArrayBufferByteLength (buffer , order ) とする。 TypedArray With Buffer Witness Record { [[Object]] : obj , [[CachedBufferByteLength]] : byteLength } を返す。
10.4.5.11 TypedArrayCreate ( prototype )
The abstract operation TypedArrayCreate takes argument prototype (an Object) and returns a TypedArray . 新しい TypedArray の生成を規定する。 It performs the following steps when called:
internalSlotsList を « [[Prototype]] , [[Extensible]] , [[ViewedArrayBuffer]] , [[TypedArrayName]] , [[ContentType]] , [[ByteLength]] , [[ByteOffset]] , [[ArrayLength]] » とする。A を MakeBasicObject (internalSlotsList ) とする。A .[[PreventExtensions]] を 10.4.5.1 で規定されるとおりに設定する。A .[[GetOwnProperty]] を 10.4.5.2 で規定されるとおりに設定する。A .[[HasProperty]] を 10.4.5.3 で規定されるとおりに設定する。A .[[DefineOwnProperty]] を 10.4.5.4 で規定されるとおりに設定する。A .[[Get]] を 10.4.5.5 で規定されるとおりに設定する。A .[[Set]] を 10.4.5.6 で規定されるとおりに設定する。A .[[Delete]] を 10.4.5.7 で規定されるとおりに設定する。A .[[OwnPropertyKeys]] を 10.4.5.8 で規定されるとおりに設定する。A .[[Prototype]] を prototype に設定する。A を返す。
10.4.5.12 TypedArrayByteLength ( taRecord )
The abstract operation TypedArrayByteLength takes argument taRecord (a TypedArray With Buffer Witness Record ) and returns a non-negative integer. It performs the following steps when called:
IsTypedArrayOutOfBounds (taRecord ) が true なら 0 を返す。length を TypedArrayLength (taRecord ) とする。length = 0 なら 0 を返す。O を taRecord .[[Object]] とする。O .[[ByteLength]] が auto でないなら O .[[ByteLength]] を返す。elementSize を TypedArrayElementSize (O ) とする。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:
アサート: IsTypedArrayOutOfBounds (taRecord ) は false 。 O を taRecord .[[Object]] とする。O .[[ArrayLength]] が auto でないなら O .[[ArrayLength]] を返す。アサート: IsFixedLengthArrayBuffer (O .[[ViewedArrayBuffer]] ) は false 。 byteOffset を O .[[ByteOffset]] とする。elementSize を TypedArrayElementSize (O ) とする。byteLength を taRecord .[[CachedBufferByteLength]] とする。アサート: byteLength は detached ではない。 floor ((byteLength - byteOffset ) / elementSize ) を返す。
10.4.5.14 IsTypedArrayOutOfBounds ( taRecord )
The abstract operation IsTypedArrayOutOfBounds takes argument taRecord (a TypedArray With Buffer Witness Record ) and returns a Boolean. オブジェクトの数値プロパティのいずれかが基礎バッファの境界外のインデックスを参照するかを確認する。 It performs the following steps when called:
O を taRecord .[[Object]] とする。bufferByteLength を taRecord .[[CachedBufferByteLength]] とする。アサート: IsDetachedBuffer (O .[[ViewedArrayBuffer]] ) は bufferByteLength が detached の場合かつその場合に限り true 。 bufferByteLength が detached なら true を返す。byteOffsetStart を O .[[ByteOffset]] とする。O .[[ArrayLength]] が auto ならbyteOffsetEnd を bufferByteLength とする。それ以外elementSize を TypedArrayElementSize (O ) とする。byteOffsetEnd を byteOffsetStart + O .[[ArrayLength]] × elementSize とする。 byteOffsetStart > bufferByteLength または byteOffsetEnd > bufferByteLength なら true を返す。注記: 長さ 0 の TypedArray は境界外とは見なされない。 false を返す。
10.4.5.15 IsTypedArrayFixedLength ( O )
The abstract operation IsTypedArrayFixedLength takes argument O (a TypedArray ) and returns a Boolean. It performs the following steps when called:
O .[[ArrayLength]] が auto なら false を返す。buffer を O .[[ViewedArrayBuffer]] とする。IsFixedLengthArrayBuffer (buffer ) が false かつ IsSharedArrayBuffer (buffer ) が false なら false を返す。true を返す。
10.4.5.16 IsValidIntegerIndex ( O , index )
The abstract operation IsValidIntegerIndex takes arguments O (a TypedArray ) and index (a Number) and returns a Boolean. It performs the following steps when called:
IsDetachedBuffer (O .[[ViewedArrayBuffer]] ) が true なら false を返す。index が整数 的 Number でなければ false を返す。index が -0 𝔽 または index < -0 𝔽 なら false を返す。taRecord を MakeTypedArrayWithBufferWitnessRecord (O , unordered ) とする。注記: O の裏付けバッファが growable SharedArrayBuffer の場合、境界チェックは同期化操作ではない。 IsTypedArrayOutOfBounds (taRecord ) が true なら false を返す。length を TypedArrayLength (taRecord ) とする。ℝ (index ) ≥ length なら false を返す。true を返す。
10.4.5.17 TypedArrayGetElement ( O , index )
The abstract operation TypedArrayGetElement takes arguments O (a TypedArray ) and index (a Number) and returns a Number, a BigInt, or undefined . It performs the following steps when called:
IsValidIntegerIndex (O , index ) が false なら undefined を返す。offset を O .[[ByteOffset]] とする。elementSize を TypedArrayElementSize (O ) とする。byteIndexInBuffer を (ℝ (index ) × elementSize ) + offset とする。elementType を TypedArrayElementType (O ) とする。GetValueFromBuffer (O .[[ViewedArrayBuffer]] , byteIndexInBuffer , elementType , true , unordered ) を返す。
10.4.5.18 TypedArraySetElement ( O , index , value )
The abstract operation TypedArraySetElement takes arguments O (a TypedArray ), index (a Number), and value (an ECMAScript language value) and returns unused を含む正常完了または throw 完了. It performs the following steps when called:
O .[[ContentType]] が bigint なら numValue を ? ToBigInt (value ) とする。それ以外は numValue を ? ToNumber (value ) とする。 IsValidIntegerIndex (O , index ) が true ならoffset を O .[[ByteOffset]] とする。elementSize を TypedArrayElementSize (O ) とする。byteIndexInBuffer を (ℝ (index ) × elementSize ) + offset とする。elementType を TypedArrayElementType (O ) とする。SetValueInBuffer (O .[[ViewedArrayBuffer]] , byteIndexInBuffer , elementType , numValue , true , unordered ) を実行する。unused を返す。
Note
この操作は常に成功するように見えるが、TypedArray の末尾を超えて書こうとしたり、切り離された ArrayBuffer を裏付けとする TypedArray に書こうとした場合は何の効果もない。
10.4.5.19 IsArrayBufferViewOutOfBounds ( O )
The abstract operation IsArrayBufferViewOutOfBounds takes argument O (a TypedArray or a DataView) and returns a Boolean. TypedArray の数値プロパティまたは DataView オブジェクトのメソッドのいずれかが基礎データブロック境界外のインデックス値を参照し得るかを確認する。上位仕様向け利便性のために存在する抽象操作 。 It performs the following steps when called:
O が [[DataView]] 内部スロットを持つならviewRecord を MakeDataViewWithBufferWitnessRecord (O , seq-cst ) とする。IsViewOutOfBounds (viewRecord ) を返す。taRecord を MakeTypedArrayWithBufferWitnessRecord (O , seq-cst ) とする。IsTypedArrayOutOfBounds (taRecord ) を返す。
10.4.6 モジュール名前空間エキゾチックオブジェクト (Module Namespace Exotic Objects)
モジュール名前空間エキゾチックオブジェクト は ECMAScript Module からエクスポートされた束縛を公開するエキゾチックオブジェクト である(16.2.3 参照)。モジュール名前空間エキゾチックオブジェクト の String キー自身プロパティと Module がエクスポートする束縛名には 1 対 1 の対応がある。エクスポートされた束縛には export *
による間接エクスポートも含まれる。各 String 値自身プロパティキー は対応するエクスポート束縛名の StringValue である。これらはモジュール名前空間エキゾチックオブジェクト の唯一の String キー付きプロパティである。各プロパティは属性 { [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : false } を持つ。モジュール名前空間エキゾチックオブジェクト は拡張不可能である。
オブジェクトの [[GetPrototypeOf]] , [[SetPrototypeOf]] , [[IsExtensible]] , [[PreventExtensions]] , [[GetOwnProperty]] , [[DefineOwnProperty]] , [[HasProperty]] , [[Get]] , [[Set]] , [[Delete]] , [[OwnPropertyKeys]] 内部メソッドが本節の定義を使用し、他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは モジュール名前空間エキゾチックオブジェクト である。これらのメソッドは ModuleNamespaceCreate により設定される。
モジュール名前空間エキゾチックオブジェクト は Table 31 に定義される内部スロットを持つ。
Table 31: モジュール名前空間エキゾチックオブジェクト の内部スロット (Internal Slots of Module Namespace Exotic Objects)
Internal Slot
Type
Description
[[Module]]
a Module Record
この名前空間が公開するエクスポートを持つ Module Record 。
[[Exports]]
a List of Strings
このオブジェクトの自身プロパティとして公開されるエクスポートされた名前の String 値のリスト。コードユニットの辞書式順にソートされる。
10.4.6.1 [[GetPrototypeOf]] ( )
The [[GetPrototypeOf]] internal method of モジュール名前空間エキゾチックオブジェクト takes no arguments and returns null を含む正常完了. It performs the following steps when called:
null を返す。
10.4.6.2 [[SetPrototypeOf]] ( V )
The [[SetPrototypeOf]] internal method of モジュール名前空間エキゾチックオブジェクト O takes argument V (an Object or null ) and returns Boolean を含む正常完了. It performs the following steps when called:
! SetImmutablePrototype (O , V ) を返す。
10.4.6.3 [[IsExtensible]] ( )
The [[IsExtensible]] internal method of モジュール名前空間エキゾチックオブジェクト takes no arguments and returns false を含む正常完了. It performs the following steps when called:
false を返す。
10.4.6.4 [[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of モジュール名前空間エキゾチックオブジェクト takes no arguments and returns true を含む正常完了. It performs the following steps when called:
true を返す。
10.4.6.5 [[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of モジュール名前空間エキゾチックオブジェクト O takes argument P (a property key) and returns Property Descriptor か undefined を含む正常完了、または throw 完了. It performs the following steps when called:
P が Symbol なら OrdinaryGetOwnProperty (O , P ) を返す。exports を O .[[Exports]] とする。exports が P を含まないなら undefined を返す。value を ? O .[[Get]] (P , O ) とする。PropertyDescriptor { [[Value]] : value , [[Writable]] : true , [[Enumerable]] : true , [[Configurable]] : false } を返す。
10.4.6.6 [[DefineOwnProperty]] ( P , Desc )
The [[DefineOwnProperty]] internal method of モジュール名前空間エキゾチックオブジェクト O takes arguments P (a property key) and Desc (a Property Descriptor ) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
P が Symbol なら ! OrdinaryDefineOwnProperty (O , P , Desc ) を返す。current を ? O .[[GetOwnProperty]] (P ) とする。current が undefined なら false を返す。Desc が [[Configurable]] フィールドを持ち Desc .[[Configurable]] が true なら false を返す。Desc が [[Enumerable]] フィールドを持ち Desc .[[Enumerable]] が false なら false を返す。IsAccessorDescriptor (Desc ) が true なら false を返す。Desc が [[Writable]] フィールドを持ち Desc .[[Writable]] が false なら false を返す。Desc が [[Value]] フィールドを持つなら SameValue (Desc .[[Value]] , current .[[Value]] ) を返す。true を返す。
10.4.6.7 [[HasProperty]] ( P )
The [[HasProperty]] internal method of モジュール名前空間エキゾチックオブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了. It performs the following steps when called:
P が Symbol なら ! OrdinaryHasProperty (O , P ) を返す。exports を O .[[Exports]] とする。exports が P を含むなら true を返す。false を返す。
10.4.6.8 [[Get]] ( P , Receiver )
The [[Get]] internal method of モジュール名前空間エキゾチックオブジェクト O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:
P が Symbol なら! OrdinaryGet (O , P , Receiver ) を返す。 exports を O .[[Exports]] とする。exports が P を含まないなら undefined を返す。m を O .[[Module]] とする。binding を m .ResolveExport(P ) とする。アサート: binding は ResolvedBinding Record 。 targetModule を binding .[[Module]] とする。アサート: targetModule は undefined ではない。 binding .[[BindingName]] が namespace ならGetModuleNamespace (targetModule ) を返す。targetEnv を targetModule .[[Environment]] とする。targetEnv が empty なら ReferenceError 例外を投げる。? targetEnv .GetBindingValue(binding .[[BindingName]] , true ) を返す。
Note
ResolveExport は副作用がない。同一の exportName , resolveSet 引数組で呼ばれるたびに同じ結果を返さなければならない。実装は各モジュール名前空間エキゾチックオブジェクト の [[Exports]] について ResolveExport 結果を事前計算またはキャッシュしてもよい。
10.4.6.9 [[Set]] ( P , V , Receiver )
The [[Set]] internal method of モジュール名前空間エキゾチックオブジェクト takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns false を含む正常完了. It performs the following steps when called:
false を返す。
10.4.6.10 [[Delete]] ( P )
The [[Delete]] internal method of モジュール名前空間エキゾチックオブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了. It performs the following steps when called:
P が Symbol なら! OrdinaryDelete (O , P ) を返す。 exports を O .[[Exports]] とする。exports が P を含むなら false を返す。true を返す。
10.4.6.11 [[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of モジュール名前空間エキゾチックオブジェクト O takes no arguments and returns プロパティキー の List を含む正常完了. It performs the following steps when called:
exports を O .[[Exports]] とする。symbolKeys を OrdinaryOwnPropertyKeys (O ) とする。exports と symbolKeys のリスト結合 を返す。
10.4.6.12 ModuleNamespaceCreate ( module , exports )
The abstract operation ModuleNamespaceCreate takes arguments module (a Module Record ) and exports (a List of Strings) and returns a module namespace exotic object. 新しいモジュール名前空間エキゾチックオブジェクト の生成を規定する。 It performs the following steps when called:
アサート: module .[[Namespace]] は empty 。 internalSlotsList を Table 31 に列挙される内部スロットとする。M を MakeBasicObject (internalSlotsList ) とする。M の必須内部メソッドを 10.4.6 で規定される定義に設定する。M .[[Module]] を module に設定する。sortedExports を exports の要素をコードユニット辞書式順でソートした List とする。M .[[Exports]] を sortedExports に設定する。28.3 の定義に対応する M の自身プロパティを生成する。module .[[Namespace]] を M に設定する。M を返す。
10.4.7 不変プロトタイプエキゾチックオブジェクト (Immutable Prototype Exotic Objects)
不変プロトタイプエキゾチックオブジェクト は、初期化後に変更されない [[Prototype]] 内部スロットを持つエキゾチックオブジェクト である。
オブジェクトの [[SetPrototypeOf]] 内部メソッドが以下の実装を使用する場合、そのオブジェクトは 不変プロトタイプエキゾチックオブジェクト である。(その他の必須内部メソッドは対象となる不変プロトタイプエキゾチックオブジェクト に応じて任意の実装を使用しうる。)
Note
他のエキゾチックオブジェクト と異なり、不変プロトタイプエキゾチックオブジェクト 用の専用生成抽象操作 は提供されない。これはそれらが %Object.prototype% とホスト環境 でのみ使用され、ホスト環境 では関連オブジェクトが他の点でもエキゾチックであり専用生成操作を必要とするためである。
10.4.7.1 [[SetPrototypeOf]] ( V )
The [[SetPrototypeOf]] internal method of 不変プロトタイプエキゾチックオブジェクト O takes argument V (an Object or null ) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
? SetImmutablePrototype (O , V ) を返す。
10.4.7.2 SetImmutablePrototype ( O , V )
The abstract operation SetImmutablePrototype takes arguments O (an Object) and V (an Object or null ) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
current を ? O .[[GetPrototypeOf]] () とする。SameValue (V , current ) が true なら true を返す。false を返す。
10.5 Proxy オブジェクトの内部メソッドと内部スロット (Proxy Object Internal Methods and Internal Slots)
Proxy オブジェクトは、本質的内部メソッドの一部が ECMAScript コードで部分的に実装されるエキゾチックオブジェクト である。すべての Proxy オブジェクトは [[ProxyHandler]] という内部スロットを持つ。[[ProxyHandler]] の値はプロキシの ハンドラーオブジェクト (handler object) と呼ばれるオブジェクトか null である。ハンドラーオブジェクトのメソッド(Table 32 参照)は、1 つ以上の Proxy オブジェクト内部メソッドの実装を拡張するために用いられうる。すべての Proxy オブジェクトはまた [[ProxyTarget]] という内部スロットを持ち、その値はオブジェクトまたは null である。このオブジェクトはプロキシの ターゲットオブジェクト (target object) と呼ばれる。
オブジェクトの本質的内部メソッド(該当する場合は [[Call]] と [[Construct]] を含む)が本節の定義を使用する場合、そのオブジェクトは Proxy エキゾチックオブジェクト である。これらの内部メソッドは ProxyCreate により設定される。
Table 32: Proxy ハンドラーメソッド (Proxy Handler Methods)
Internal Method
Handler Method
[[GetPrototypeOf]]
getPrototypeOf
[[SetPrototypeOf]]
setPrototypeOf
[[IsExtensible]]
isExtensible
[[PreventExtensions]]
preventExtensions
[[GetOwnProperty]]
getOwnPropertyDescriptor
[[DefineOwnProperty]]
defineProperty
[[HasProperty]]
has
[[Get]]
get
[[Set]]
set
[[Delete]]
deleteProperty
[[OwnPropertyKeys]]
ownKeys
[[Call]]
apply
[[Construct]]
construct
ハンドラーメソッドが Proxy オブジェクト内部メソッドの実装提供のために呼び出されるとき、ハンドラーメソッドにはプロキシのターゲットオブジェクトがパラメータとして渡される。プロキシのハンドラーオブジェクトは必ずしもすべての本質的内部メソッドに対応するメソッドを持つとは限らない。ハンドラーオブジェクトが内部トラップに対応するメソッドを持たない場合、プロキシ上の内部メソッド呼び出しは対応する内部メソッドをターゲットオブジェクト上で呼び出すことになる。
Proxy オブジェクトの [[ProxyHandler]] および [[ProxyTarget]] 内部スロットはオブジェクト生成時に常に初期化され、通常は変更できない。いくつかの Proxy オブジェクトは後に revoked(無効化) できる形で生成される。プロキシが無効化されると、その [[ProxyHandler]] と [[ProxyTarget]] 内部スロットは null に設定され、その Proxy オブジェクトに対する後続の内部メソッド呼び出しは TypeError 例外を投げる。
Proxy オブジェクトは内部メソッド実装を任意の ECMAScript コードで提供できるため、6.1.7.3 で定義される不変条件に違反するハンドラーメソッドを持つ Proxy オブジェクトを定義することが可能である。6.1.7.3 で定義される内部メソッド不変条件の一部は本質的整合性不変条件である。これらの不変条件は本節で規定される Proxy オブジェクト内部メソッドによって明示的に強制される。ECMAScript 実装はあらゆる不変条件違反が存在しても堅牢でなければならない。
以下のアルゴリズム記述では、O は ECMAScript Proxy オブジェクト、P はプロパティキー 値、V は任意の ECMAScript 言語値、Desc は Property Descriptor レコードであると仮定する。
10.5.1 [[GetPrototypeOf]] ( )
The [[GetPrototypeOf]] internal method of Proxy エキゾチックオブジェクト O takes no arguments and returns Object か null を含む正常完了または throw 完了. It performs the following steps when called:
? ValidateNonRevokedProxy (O ) を実行する。 target を O .[[ProxyTarget]] とする。handler を O .[[ProxyHandler]] とする。アサート: handler は Object である。 trap を ? GetMethod (handler , "getPrototypeOf" ) とする。trap が undefined なら? target .[[GetPrototypeOf]] () を返す。 handlerProto を ? Call(trap , handler , « target ») とする。handlerProto が Object でなく null でもないなら TypeError 例外を投げる。extensibleTarget を ? IsExtensible (target ) とする。extensibleTarget が true なら handlerProto を返す。targetProto を ? target .[[GetPrototypeOf]] () とする。SameValue (handlerProto , targetProto ) が false なら TypeError 例外を投げる。handlerProto を返す。
Note
Proxy オブジェクトの [[GetPrototypeOf]] は以下の不変条件を強制する:
[[GetPrototypeOf]] の結果は Object か null でなければならない。
ターゲットオブジェクトが拡張不可能な場合、Proxy オブジェクトに適用した [[GetPrototypeOf]] はターゲットオブジェクトに適用した [[GetPrototypeOf]] と同じ値を返さなければならない。
10.5.2 [[SetPrototypeOf]] ( V )
The [[SetPrototypeOf]] internal method of Proxy エキゾチックオブジェクト O takes argument V (an Object or null ) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
? ValidateNonRevokedProxy (O ) を実行する。 target を O .[[ProxyTarget]] とする。handler を O .[[ProxyHandler]] とする。アサート: handler は Object である。 trap を ? GetMethod (handler , "setPrototypeOf" ) とする。trap が undefined なら? target .[[SetPrototypeOf]] (V ) を返す。 booleanTrapResult を ToBoolean (? Call(trap , handler , « target , V »)) とする。booleanTrapResult が false なら false を返す。extensibleTarget を ? IsExtensible (target ) とする。extensibleTarget が true なら true を返す。targetProto を ? target .[[GetPrototypeOf]] () とする。SameValue (V , targetProto ) が false なら TypeError 例外を投げる。true を返す。
Note
Proxy オブジェクトの [[SetPrototypeOf]] は以下の不変条件を強制する:
[[SetPrototypeOf]] の結果は Boolean である。
ターゲットオブジェクトが拡張不可能である場合、引数値はターゲットオブジェクトに適用した [[GetPrototypeOf]] の結果と同じでなければならない。
10.5.3 [[IsExtensible]] ( )
The [[IsExtensible]] internal method of Proxy エキゾチックオブジェクト O takes no arguments and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
? ValidateNonRevokedProxy (O ) を実行する。 target を O .[[ProxyTarget]] とする。handler を O .[[ProxyHandler]] とする。アサート: handler は Object である。 trap を ? GetMethod (handler , "isExtensible" ) とする。trap が undefined なら? IsExtensible (target ) を返す。 booleanTrapResult を ToBoolean (? Call(trap , handler , « target »)) とする。targetResult を ? IsExtensible (target ) とする。booleanTrapResult が targetResult と異なるなら TypeError 例外を投げる。booleanTrapResult を返す。
Note
Proxy オブジェクトの [[IsExtensible]] は以下の不変条件を強制する:
[[IsExtensible]] の結果は Boolean である。
Proxy オブジェクトに適用した [[IsExtensible]] は、同じ引数でターゲットオブジェクトに適用した [[IsExtensible]] と同じ値を返さなければならない。
10.5.4 [[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of Proxy エキゾチックオブジェクト O takes no arguments and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
? ValidateNonRevokedProxy (O ) を実行する。 target を O .[[ProxyTarget]] とする。handler を O .[[ProxyHandler]] とする。アサート: handler は Object である。 trap を ? GetMethod (handler , "preventExtensions" ) とする。trap が undefined なら? target .[[PreventExtensions]] () を返す。 booleanTrapResult を ToBoolean (? Call(trap , handler , « target »)) とする。booleanTrapResult が true ならextensibleTarget を ? IsExtensible (target ) とする。extensibleTarget が true なら TypeError 例外を投げる。booleanTrapResult を返す。
Note
Proxy オブジェクトの [[PreventExtensions]] は以下の不変条件を強制する:
[[PreventExtensions]] の結果は Boolean である。
Proxy オブジェクトに適用した [[PreventExtensions]] が true を返すのは、ターゲットオブジェクトに適用した [[IsExtensible]] が false の場合のみである。
10.5.5 [[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of Proxy エキゾチックオブジェクト O takes argument P (a property key) and returns Property Descriptor か undefined を含む正常完了または throw 完了. It performs the following steps when called:
? ValidateNonRevokedProxy (O ) を実行する。 target を O .[[ProxyTarget]] とする。handler を O .[[ProxyHandler]] とする。アサート: handler は Object である。 trap を ? GetMethod (handler , "getOwnPropertyDescriptor" ) とする。trap が undefined なら? target .[[GetOwnProperty]] (P ) を返す。 trapResultObj を ? Call(trap , handler , « target , P ») とする。trapResultObj が Object でなく undefined でもないなら TypeError 例外を投げる。targetDesc を ? target .[[GetOwnProperty]] (P ) とする。trapResultObj が undefined ならtargetDesc が undefined なら undefined を返す。targetDesc .[[Configurable]] が false なら TypeError 例外を投げる。extensibleTarget を ? IsExtensible (target ) とする。extensibleTarget が false なら TypeError 例外を投げる。undefined を返す。extensibleTarget を ? IsExtensible (target ) とする。resultDesc を ? ToPropertyDescriptor (trapResultObj ) とする。CompletePropertyDescriptor (resultDesc ) を実行する。valid を IsCompatiblePropertyDescriptor (extensibleTarget , resultDesc , targetDesc ) とする。valid が false なら TypeError 例外を投げる。resultDesc .[[Configurable]] が false ならtargetDesc が undefined または targetDesc .[[Configurable]] が true ならTypeError 例外を投げる。resultDesc が [[Writable]] フィールドを持ちかつ resultDesc .[[Writable]] が false ならアサート: targetDesc は [[Writable]] フィールドを持つ。 targetDesc .[[Writable]] が true なら TypeError 例外を投げる。resultDesc を返す。
Note
Proxy オブジェクトの [[GetOwnProperty]] は以下の不変条件を強制する:
[[GetOwnProperty]] の結果は Object か undefined でなければならない。
ターゲットオブジェクトに設定不可な自身プロパティとして存在する場合、そのプロパティを不存在と報告してはならない。
ターゲットオブジェクトが拡張不可能であり、そのプロパティが自身プロパティとして存在する場合、そのプロパティを不存在と報告してはならない。
ターゲットオブジェクトが拡張不可能でなく、かつそのプロパティがターゲットの自身プロパティに存在しない場合、存在すると報告してはならない。
ターゲットオブジェクトに対応する設定不可な自身プロパティが存在しない限り、プロパティを設定不可と報告してはならない。
対応するターゲットオブジェクトの設定不可・非書き込み自身プロパティが存在しない限り、プロパティを同時に設定不可かつ非書き込みと報告してはならない。
10.5.6 [[DefineOwnProperty]] ( P , Desc )
The [[DefineOwnProperty]] internal method of Proxy エキゾチックオブジェクト O takes arguments P (a property key) and Desc (a Property Descriptor ) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
? ValidateNonRevokedProxy (O ) を実行する。 target を O .[[ProxyTarget]] とする。handler を O .[[ProxyHandler]] とする。アサート: handler は Object である。 trap を ? GetMethod (handler , "defineProperty" ) とする。trap が undefined なら? target .[[DefineOwnProperty]] (P , Desc ) を返す。 descObj を FromPropertyDescriptor (Desc ) とする。booleanTrapResult を ToBoolean (? Call(trap , handler , « target , P , descObj »)) とする。booleanTrapResult が false なら false を返す。targetDesc を ? target .[[GetOwnProperty]] (P ) とする。extensibleTarget を ? IsExtensible (target ) とする。Desc が [[Configurable]] フィールドを持ちかつ Desc .[[Configurable]] が false ならsettingConfigFalse を true とする。それ以外settingConfigFalse を false とする。 targetDesc が undefined ならextensibleTarget が false なら TypeError 例外を投げる。settingConfigFalse が true なら TypeError 例外を投げる。それ以外IsCompatiblePropertyDescriptor (extensibleTarget , Desc , targetDesc ) が false なら TypeError 例外を投げる。settingConfigFalse が true かつ targetDesc .[[Configurable]] が true なら TypeError 例外を投げる。IsDataDescriptor (targetDesc ) が true かつ targetDesc .[[Configurable]] が false かつ targetDesc .[[Writable]] が true ならDesc が [[Writable]] フィールドを持ちかつ Desc .[[Writable]] が false なら TypeError 例外を投げる。 true を返す。
Note
Proxy オブジェクトの [[DefineOwnProperty]] は以下の不変条件を強制する:
[[DefineOwnProperty]] の結果は Boolean である。
ターゲットオブジェクトが拡張不可能ならプロパティは追加できない。
対応する設定不可な自身プロパティがターゲット上に存在しない限り、プロパティを設定不可にできない。
対応する設定不可かつ非書き込みな自身プロパティがターゲット上に存在しない限り、プロパティを設定不可かつ非書き込みにできない。
対応するターゲットプロパティが存在する場合、その Property Descriptor を [[DefineOwnProperty]] でターゲットに適用しても例外は投げられない。
10.5.7 [[HasProperty]] ( P )
The [[HasProperty]] internal method of Proxy エキゾチックオブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
? ValidateNonRevokedProxy (O ) を実行する。 target を O .[[ProxyTarget]] とする。handler を O .[[ProxyHandler]] とする。アサート: handler は Object である。 trap を ? GetMethod (handler , "has" ) とする。trap が undefined なら? target .[[HasProperty]] (P ) を返す。 booleanTrapResult を ToBoolean (? Call(trap , handler , « target , P »)) とする。booleanTrapResult が false ならtargetDesc を ? target .[[GetOwnProperty]] (P ) とする。targetDesc が undefined でないならtargetDesc .[[Configurable]] が false なら TypeError 例外を投げる。extensibleTarget を ? IsExtensible (target ) とする。extensibleTarget が false なら TypeError 例外を投げる。booleanTrapResult を返す。
Note
Proxy オブジェクトの [[HasProperty]] は以下の不変条件を強制する:
[[HasProperty]] の結果は Boolean である。
ターゲットオブジェクトに設定不可な自身プロパティとして存在する場合、プロパティを不存在と報告してはならない。
ターゲットオブジェクトが拡張不可能で、そのプロパティが自身プロパティとして存在する場合、プロパティを不存在と報告してはならない。
10.5.8 [[Get]] ( P , Receiver )
The [[Get]] internal method of Proxy エキゾチックオブジェクト O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:
? ValidateNonRevokedProxy (O ) を実行する。 target を O .[[ProxyTarget]] とする。handler を O .[[ProxyHandler]] とする。アサート: handler は Object である。 trap を ? GetMethod (handler , "get" ) とする。trap が undefined なら? target .[[Get]] (P , Receiver ) を返す。 trapResult を ? Call(trap , handler , « target , P , Receiver ») とする。targetDesc を ? target .[[GetOwnProperty]] (P ) とする。targetDesc が undefined でなくかつ targetDesc .[[Configurable]] が false ならIsDataDescriptor (targetDesc ) が true かつ targetDesc .[[Writable]] が false ならSameValue (trapResult , targetDesc .[[Value]] ) が false なら TypeError 例外を投げる。IsAccessorDescriptor (targetDesc ) が true かつ targetDesc .[[Get]] が undefined ならtrapResult が undefined でないなら TypeError 例外を投げる。trapResult を返す。
Note
Proxy オブジェクトの [[Get]] は以下の不変条件を強制する:
対応するターゲットオブジェクトプロパティが非書き込み・設定不可な自身データプロパティ である場合、報告される値はターゲットプロパティの値と同じでなければならない。
対応するターゲットオブジェクトプロパティが設定不可な自身 accessor プロパティでその [[Get]] 属性が undefined の場合、報告される値は undefined でなければならない。
10.5.9 [[Set]] ( P , V , Receiver )
The [[Set]] internal method of Proxy エキゾチックオブジェクト O takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
? ValidateNonRevokedProxy (O ) を実行する。 target を O .[[ProxyTarget]] とする。handler を O .[[ProxyHandler]] とする。アサート: handler は Object である。 trap を ? GetMethod (handler , "set" ) とする。trap が undefined なら? target .[[Set]] (P , V , Receiver ) を返す。 booleanTrapResult を ToBoolean (? Call(trap , handler , « target , P , V , Receiver »)) とする。booleanTrapResult が false なら false を返す。targetDesc を ? target .[[GetOwnProperty]] (P ) とする。targetDesc が undefined でなくかつ targetDesc .[[Configurable]] が false ならIsDataDescriptor (targetDesc ) が true かつ targetDesc .[[Writable]] が false ならSameValue (V , targetDesc .[[Value]] ) が false なら TypeError 例外を投げる。IsAccessorDescriptor (targetDesc ) が true ならtargetDesc .[[Set]] が undefined なら TypeError 例外を投げる。true を返す。
Note
Proxy オブジェクトの [[Set]] は以下の不変条件を強制する:
[[Set]] の結果は Boolean である。
対応するターゲットオブジェクトプロパティが非書き込み・設定不可な自身データプロパティ である場合、その値と異なる値に変更することはできない。
対応するターゲットオブジェクトプロパティが設定不可な自身 accessor プロパティでその [[Set]] 属性が undefined の場合、値を設定できない。
10.5.10 [[Delete]] ( P )
The [[Delete]] internal method of Proxy エキゾチックオブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:
? ValidateNonRevokedProxy (O ) を実行する。 target を O .[[ProxyTarget]] とする。handler を O .[[ProxyHandler]] とする。アサート: handler は Object である。 trap を ? GetMethod (handler , "deleteProperty" ) とする。trap が undefined なら? target .[[Delete]] (P ) を返す。 booleanTrapResult を ToBoolean (? Call(trap , handler , « target , P »)) とする。booleanTrapResult が false なら false を返す。targetDesc を ? target .[[GetOwnProperty]] (P ) とする。targetDesc が undefined なら true を返す。targetDesc .[[Configurable]] が false なら TypeError 例外を投げる。extensibleTarget を ? IsExtensible (target ) とする。extensibleTarget が false なら TypeError 例外を投げる。true を返す。
Note
Proxy オブジェクトの [[Delete]] は以下の不変条件を強制する:
[[Delete]] の結果は Boolean である。
ターゲットオブジェクトに設定不可な自身プロパティとして存在する場合、そのプロパティを削除済みと報告してはならない。
ターゲットオブジェクトが拡張不可能でそのプロパティが自身プロパティとして存在する場合、そのプロパティを削除済みと報告してはならない。
10.5.11 [[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of Proxy エキゾチックオブジェクト O takes no arguments and returns プロパティキー の List を含む正常完了または throw 完了. It performs the following steps when called:
? ValidateNonRevokedProxy (O ) を実行する。 target を O .[[ProxyTarget]] とする。handler を O .[[ProxyHandler]] とする。アサート: handler は Object である。 trap を ? GetMethod (handler , "ownKeys" ) とする。trap が undefined なら? target .[[OwnPropertyKeys]] () を返す。 trapResultArray を ? Call(trap , handler , « target ») とする。trapResult を ? CreateListFromArrayLike(trapResultArray , property-key ) とする。trapResult が重複要素を含むなら TypeError 例外を投げる。extensibleTarget を ? IsExtensible (target ) とする。targetKeys を ? target .[[OwnPropertyKeys]] () とする。アサート: targetKeys はプロパティキー の List である。 アサート: targetKeys は重複要素を含まない。 targetConfigurableKeys を新しい空の List とする。targetNonconfigurableKeys を新しい空の List とする。targetKeys の各要素 key についてdesc を ? target .[[GetOwnProperty]] (key ) とする。desc が undefined でなくかつ desc .[[Configurable]] が false ならkey を targetNonconfigurableKeys に追加する。それ以外key を targetConfigurableKeys に追加する。 extensibleTarget が true かつ targetNonconfigurableKeys が空ならtrapResult を返す。uncheckedResultKeys を trapResult の要素からなる List とする。targetNonconfigurableKeys の各要素 key についてuncheckedResultKeys が key を含まないなら TypeError 例外を投げる。uncheckedResultKeys から key を除去する。extensibleTarget が true なら trapResult を返す。targetConfigurableKeys の各要素 key についてuncheckedResultKeys が key を含まないなら TypeError 例外を投げる。uncheckedResultKeys から key を除去する。uncheckedResultKeys が空でないなら TypeError 例外を投げる。trapResult を返す。
Note
Proxy オブジェクトの [[OwnPropertyKeys]] は以下の不変条件を強制する:
[[OwnPropertyKeys]] の結果は List である。
返される List は重複要素を含まない。
返される List の各要素はプロパティキー である。
結果の List はターゲットオブジェクトのすべての設定不可な自身プロパティのキーを含まなければならない。
ターゲットオブジェクトが拡張不可能である場合、結果の List はターゲットオブジェクトの自身プロパティすべてのキーのみを含まなければならない。
10.5.12 [[Call]] ( thisArgument , argumentsList )
The [[Call]] internal method of Proxy エキゾチックオブジェクト O takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values ) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:
? ValidateNonRevokedProxy (O ) を実行する。 target を O .[[ProxyTarget]] とする。handler を O .[[ProxyHandler]] とする。アサート: handler は Object である。 trap を ? GetMethod (handler , "apply" ) とする。trap が undefined なら? Call(target , thisArgument , argumentsList ) を返す。 argArray を CreateArrayFromList (argumentsList ) とする。? Call(trap , handler , « target , thisArgument , argArray ») を返す。
Note
Proxy エキゾチックオブジェクト は、その [[ProxyTarget]] 内部スロットの初期値が [[Call]] 内部メソッドを持つオブジェクトである場合にのみ [[Call]] 内部メソッドを持つ。
10.5.13 [[Construct]] ( argumentsList , newTarget )
The [[Construct]] internal method of Proxy エキゾチックオブジェクト O takes arguments argumentsList (a List of ECMAScript language values ) and newTarget (a constructor) and returns Object を含む正常完了または throw 完了. It performs the following steps when called:
? ValidateNonRevokedProxy (O ) を実行する。 target を O .[[ProxyTarget]] とする。アサート: IsConstructor (target ) は true 。 handler を O .[[ProxyHandler]] とする。アサート: handler は Object である。 trap を ? GetMethod (handler , "construct" ) とする。trap が undefined なら? Construct(target , argumentsList , newTarget ) を返す。 argArray を CreateArrayFromList (argumentsList ) とする。newObj を ? Call(trap , handler , « target , argArray , newTarget ») とする。newObj が Object でないなら TypeError 例外を投げる。newObj を返す。
Note 1
Proxy エキゾチックオブジェクト は、その [[ProxyTarget]] 内部スロットの初期値が [[Construct]] 内部メソッドを持つオブジェクトである場合にのみ [[Construct]] 内部メソッドを持つ。
Note 2
Proxy オブジェクトの [[Construct]] は以下の不変条件を強制する:
[[Construct]] の結果は Object でなければならない。
10.5.14 ValidateNonRevokedProxy ( proxy )
The abstract operation ValidateNonRevokedProxy takes argument proxy (a Proxy exotic object) and returns unused を含む正常完了または throw 完了. proxy が無効化されている場合 TypeError 例外を投げる。 It performs the following steps when called:
proxy .[[ProxyTarget]] が null なら TypeError 例外を投げる。アサート: proxy .[[ProxyHandler]] は null ではない。 unused を返す。
10.5.15 ProxyCreate ( target , handler )
The abstract operation ProxyCreate takes arguments target (an ECMAScript language value) and handler (an ECMAScript language value) and returns Proxy エキゾチックオブジェクト を含む正常完了または throw 完了. 新しい Proxy オブジェクトの生成を規定する。 It performs the following steps when called:
target が Object でないなら TypeError 例外を投げる。handler が Object でないなら TypeError 例外を投げる。P を MakeBasicObject (« [[ProxyHandler]] , [[ProxyTarget]] ») とする。P の本質的内部メソッド([[Call]] と [[Construct]] を除く)を 10.5 で規定される定義に設定する。IsCallable (target ) が true ならP .[[Call]] を 10.5.12 で規定されるとおりに設定する。IsConstructor (target ) が true ならP .[[Construct]] を 10.5.13 で規定されるとおりに設定する。P .[[ProxyTarget]] を target に設定する。P .[[ProxyHandler]] を handler に設定する。P を返す。
11 ECMAScript 言語: ソーステキスト (ECMAScript Language: Source Text)
11.1 ソーステキスト (Source Text)
構文 (Syntax)
SourceCharacter ::
any Unicode code point
ECMAScript ソーステキスト は Unicode 符号位置の列である。ECMAScript 文法で許容される箇所であれば、U+0000 から U+10FFFF までのすべての Unicode 符号位置(サロゲートコードポイントを含む)が ECMAScript ソーステキスト中に現れうる。ECMAScript ソーステキストを格納または交換するために実際に用いられるエンコーディングは本仕様にとって本質的ではない。外部的なソーステキストのエンコーディングに関わらず、適合する ECMAScript 実装はソーステキストを、各 SourceCharacter が 1 つの Unicode 符号位置であるような同値の SourceCharacter 値列として処理する。適合実装はソーステキストの正規化を行うこと、または正規化を行っているかのように振る舞うことを要求されない。
結合文字シーケンスの構成要素は、利用者がその全体を 1 文字と捉える可能性があっても、個々の独立した Unicode 符号位置として扱われる。
Note
文字列リテラル、正規表現リテラル、テンプレートリテラル、および識別子においては、任意の Unicode 符号位置をその数値値を明示的に表す Unicode エスケープシーケンスで表現することもできる。コメント内では、そのようなエスケープシーケンスはコメントの一部として実質的に無視される。
ECMAScript は Unicode エスケープシーケンスの挙動において Java プログラミング言語と異なる。例えば Java プログラムにおいて Unicode エスケープ \u000A
が単一行コメント内に現れた場合、それは行終端子(Unicode 符号位置 U+000A は LINE FEED (LF))として解釈され、次の符号位置はそのコメントの一部ではなくなる。同様に Java の文字列リテラル内で \u000A
が現れると、それは文字列リテラル内に許可されない行終端子として解釈される——文字列リテラルの値に LF を含めるには \u000A
ではなく \n
と書かなければならない。ECMAScript プログラムでは、コメント中の Unicode エスケープシーケンスが解釈されることは決してなく、従ってコメント終端に寄与しない。同様に、ECMAScript プログラム内の文字列リテラル中に現れる Unicode エスケープシーケンスは常にリテラル内容に寄与し、行終端子として、あるいは文字列リテラルを終端させうる符号位置として解釈されることはない。
11.1.1
静的セマンティクス: UTF16EncodeCodePoint (
cp : a Unicode code point,
): a String
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
Assert : 0 ≤ cp ≤ 0x10FFFF.If cp ≤ 0xFFFF, return the String value consisting of the code unit whose numeric value is cp . Let cu1 be the code unit whose numeric value is floor ((cp - 0x10000) / 0x400) + 0xD800. Let cu2 be the code unit whose numeric value is ((cp - 0x10000) modulo 0x400) + 0xDC00. Return the string-concatenation of cu1 and cu2 .
11.1.2
静的セマンティクス: CodePointsToString (
text : a sequence of Unicode code points,
): a String
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. text を 6.1.4 で述べるように String 値へ変換する。 It performs the following steps when called:
Let result be the empty String. For each code point cp of text , doSet result to the string-concatenation of result and UTF16EncodeCodePoint(cp ). Return result .
11.1.3
静的セマンティクス: UTF16SurrogatePairToCodePoint (
lead : a code unit,
trail : a code unit,
): a code point
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. UTF-16 サロゲートペア を形成する 2 つのコードユニットを 1 つのコードポイントへ変換する。 It performs the following steps when called:
Assert : lead is a leading surrogate and trail is a trailing surrogate.Let cp be (lead - 0xD800) × 0x400 + (trail - 0xDC00) + 0x10000. Return the code point cp .
11.1.4
静的セマンティクス: CodePointAt (
string : a String,
position : a non-negative integer,
): a Record with fields [[CodePoint]] (a code point), [[CodeUnitCount]] (a positive integer), and [[IsUnpairedSurrogate]] (a Boolean)
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. string を 6.1.4 に記述される UTF-16 エンコードされたコードポイント列として解釈し、インデックス position のコードユニットから始まる 1 つのコードポイントを読み取る。 It performs the following steps when called:
Let size be the length of string . Assert : position ≥ 0 and position < size .Let first be the code unit at index position within string . Let cp be the code point whose numeric value is the numeric value of first . If first is neither a leading surrogate nor a trailing surrogate, thenReturn the Record { [[CodePoint]] : cp , [[CodeUnitCount]] : 1, [[IsUnpairedSurrogate]] : false }. If first is a trailing surrogate or position + 1 = size , thenReturn the Record { [[CodePoint]] : cp , [[CodeUnitCount]] : 1, [[IsUnpairedSurrogate]] : true }. Let second be the code unit at index position + 1 within string . If second is not a trailing surrogate, thenReturn the Record { [[CodePoint]] : cp , [[CodeUnitCount]] : 1, [[IsUnpairedSurrogate]] : true }. Set cp to UTF16SurrogatePairToCodePoint(first , second ). Return the Record { [[CodePoint]] : cp , [[CodeUnitCount]] : 2, [[IsUnpairedSurrogate]] : false }.
11.1.5
静的セマンティクス: StringToCodePoints (
string : a String,
): a List of code points
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. string を 6.1.4 に記述される UTF-16 エンコードされた Unicode テキストとして解釈した結果得られる Unicode 符号位置列を返す。 It performs the following steps when called:
Let codePoints be a new empty List . Let size be the length of string . Let position be 0. Repeat, while position < size ,Let cp be CodePointAt(string , position ). Append cp .[[CodePoint]] to codePoints . Set position to position + cp .[[CodeUnitCount]] . Return codePoints .
11.1.6
静的セマンティクス: ParseText (
sourceText : a String or a sequence of Unicode code points,
goalSymbol : a nonterminal in one of the ECMAScript grammars,
): a Parse Node or a non-empty List of SyntaxError objects
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
If sourceText is a String , set sourceText to StringToCodePoints(sourceText ). Attempt to parse sourceText using goalSymbol as the goal symbol, and analyse the parse result for any early error conditions. Parsing and early error detection may be interleaved in an implementation-defined manner. If the parse succeeded and no early errors were found, return the Parse Node (an instance of goalSymbol ) at the root of the parse tree resulting from the parse. Otherwise, return a List of one or more SyntaxError objects representing the parsing errors and/or early errors . If more than one parsing error or early error is present, the number and ordering of error objects in the list is implementation-defined, but at least one must be present.
Note 1
ある箇所に早期エラーが存在し、後続位置に構文エラーが存在するテキストを考える。パース後に早期エラー検査を行う実装は構文エラーを報告し、早期エラー検査へ進まないかもしれない。両者をインターリーブする実装は早期エラーを報告し構文エラー検出を行わないかもしれない。第三の実装は両方のエラーを報告するかもしれない。これらの挙動はいずれも適合である。
Note 2
11.2 ソースコードの種類 (Types of Source Code)
ECMAScript コードには 4 種類がある:
グローバルコード (Global code) は ECMAScript Script として扱われるソーステキストである。特定の Script のグローバルコードには、FunctionDeclaration , FunctionExpression , GeneratorDeclaration , GeneratorExpression , AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncGeneratorDeclaration , AsyncGeneratorExpression , MethodDefinition , ArrowFunction , AsyncArrowFunction , ClassDeclaration , ClassExpression の一部としてパースされるソーステキストは含まれない。
Eval コード (Eval code) は組み込み eval
関数へ与えられたソーステキストである。より正確には、組み込み eval
関数のパラメータが String の場合、それは ECMAScript Script として扱われる。特定の eval
呼び出しにおける eval コードはその Script のグローバルコード部である。
関数コード (Function code) は ECMAScript 関数オブジェクト の [[ECMAScriptCode]] および [[FormalParameters]] 内部スロット(10.2 参照)の値を与えるためにパースされるソーステキストである。特定の ECMAScript 関数の関数コードには、入れ子の FunctionDeclaration , FunctionExpression , GeneratorDeclaration , GeneratorExpression , AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncGeneratorDeclaration , AsyncGeneratorExpression , MethodDefinition , ArrowFunction , AsyncArrowFunction , ClassDeclaration , ClassExpression の関数コードとしてパースされるソーステキストは含まれない。
さらに、上記ソーステキストが次のようにパースされる場合:
そのとき、その宣言または式の BindingIdentifier (存在する場合)にマッチしたソーステキストも対応する関数の関数コードに含まれる。
モジュールコード (Module code) は ModuleBody として提供されるソーステキストである。これはモジュール初期化時に直接評価されるコードである。特定モジュールのモジュールコードには、入れ子の FunctionDeclaration , FunctionExpression , GeneratorDeclaration , GeneratorExpression , AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncGeneratorDeclaration , AsyncGeneratorExpression , MethodDefinition , ArrowFunction , AsyncArrowFunction , ClassDeclaration , ClassExpression の一部としてパースされるソーステキストは含まれない。
Note 1
関数コードは一般に Function 定義(15.2 )、Arrow Function 定義(15.3 )、Method 定義(15.4 )、Generator Function 定義(15.5 )、Async Function 定義(15.8 )、Async Generator Function 定義(15.6 )、および Async Arrow Function(15.9 )の本体として提供される。関数コードはまた Function コンストラクタ (20.2.1.1 )、GeneratorFunction コンストラクタ (27.3.1.1 )、AsyncFunction コンストラクタ (27.7.1.1 )、AsyncGeneratorFunction コンストラクタ (27.4.1.1 )への引数から導出される。
Note 2
BindingIdentifier を関数コードに含める実際上の効果は、その関数本体が "use strict" ディレクティブを含む関数の名前である BindingIdentifier に対して、周囲のコードが strict でない場合でも strict mode の Early Error が適用されることである。
11.2.1 ディレクティブプロローグと Use Strict ディレクティブ (Directive Prologues and the Use Strict Directive)
ディレクティブプロローグ (Directive Prologue) とは、FunctionBody , ScriptBody , または ModuleBody の先頭に現れる StatementListItem もしくは ModuleItem のうち、連続して並ぶ最長の ExpressionStatement 列であって、その列中の各 ExpressionStatement がセミコロンにより終端される(明示または自動セミコロン挿入 (12.10 ) により)純粋な StringLiteral トークンのみから構成されるものである。ディレクティブプロローグは空列であってもよい。
Use Strict ディレクティブ (Use Strict Directive) は、その StringLiteral が正確に "use strict"
または 'use strict'
のいずれかの符号位置列であるディレクティブプロローグ中の ExpressionStatement である。Use Strict ディレクティブは EscapeSequence や LineContinuation を含んではならない。
ディレクティブプロローグは複数の Use Strict ディレクティブを含んでもよい。ただし実装はこれが発生した場合に警告を出してよい。
Note
ディレクティブプロローグの ExpressionStatement は包含している生成規則の評価中に通常どおり評価される。実装は、Use Strict ディレクティブではないがディレクティブプロローグ中に現れる ExpressionStatement に対し実装独自の意味を定義してよい。適切な通知手段が存在する場合、実装はディレクティブプロローグ内で Use Strict ディレクティブではなく、かつ実装により意味が定義されていない ExpressionStatement に遭遇した際、警告を発するべきである。
11.2.2 Strict Mode コード (Strict Mode Code)
ECMAScript の構文単位は制限のない(非 strict)または strict モードの構文とセマンティクス(4.3.2 )で処理されうる。コードは次の状況で strict mode code として解釈される:
グローバルコードが、Use Strict ディレクティブを含むディレクティブプロローグで始まる場合。
モジュールコードは常に strict mode code である。
ClassDeclaration または ClassExpression の全ての部分は strict mode code である。
Eval コードが Use Strict ディレクティブを含むディレクティブプロローグで始まる、またはその eval
呼び出しが strict mode code 内に含まれる直接 eval である場合。
関数コードが、対応する FunctionDeclaration , FunctionExpression , GeneratorDeclaration , GeneratorExpression , AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncGeneratorDeclaration , AsyncGeneratorExpression , MethodDefinition , ArrowFunction , AsyncArrowFunction が strict mode code 内に含まれる、またはその関数の [[ECMAScriptCode]] 内部スロットの値を生成するコードが Use Strict ディレクティブを含むディレクティブプロローグで始まる場合。
Function, Generator, AsyncFunction, AsyncGenerator の各組み込みコンストラクタ へ引数として与えられる関数コードが、最後の引数が String であり、それを処理した結果が Use Strict ディレクティブを含むディレクティブプロローグで始まる FunctionBody である場合。
strict mode code でない ECMAScript コードは non-strict code と呼ばれる。
11.2.2.1
静的セマンティクス: IsStrict (
node : a Parse Node,
): a Boolean
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
If the source text matched by node is strict mode code , return true ; else return false .
11.2.3 非 ECMAScript 関数 (Non-ECMAScript Functions)
ECMAScript 実装は、評価挙動が ECMAScript ソーステキスト 以外のホスト定義 実行可能コード形式で記述される関数エキゾチックオブジェクト の評価をサポートしてよい。ある関数オブジェクト が ECMAScript コード内で定義されたか、組み込み関数であるかは、その関数オブジェクト が呼び出す/呼び出される ECMAScript コードの観点からは観測できない。
12 ECMAScript 言語: 字句文法 (ECMAScript Language: Lexical Grammar)
ECMAScript の Script または Module のソーステキストはまず入力要素(トークン、行終端子、コメント、または空白)から成る列へと変換される。ソーステキストは左から右へ走査され、可能な限り最長の符号位置列が次の入力要素として逐次選択される。
入力要素の識別がそれを消費する構文文法コンテキストに依存する状況がいくつか存在する。これは字句文法に複数の目標(goal)記号を必要とする。InputElementHashbangOrRegExp 目標は Script または Module の開始時に用いられる。InputElementRegExpOrTemplateTail 目標は RegularExpressionLiteral , TemplateMiddle , または TemplateTail が許可される構文文法コンテキストで用いられる。InputElementRegExp 目標記号は RegularExpressionLiteral が許可され、かつ TemplateMiddle と TemplateTail が許可されないすべての構文文法コンテキストで用いられる。InputElementTemplateTail 目標は TemplateMiddle または TemplateTail が許可され、 RegularExpressionLiteral が許可されないすべての構文文法コンテキストで用いられる。その他すべてのコンテキストでは InputElementDiv が字句目標記号として用いられる。
Note
複数の字句目標を用いることで自動セミコロン挿入に影響する字句的曖昧さが存在しないことを保証する。例えば、先頭に除算または除算代入、かつ先頭に RegularExpressionLiteral の両方が許容される構文文法コンテキストは存在しない。これはセミコロン挿入(12.10 参照)によって影響を受けない。以下の例のように:
a = b
/hi/g.exec (c).map (d);
LineTerminator の後の最初の非空白・非コメント符号位置が U+002F (SOLIDUS) であり、構文コンテキストが除算または除算代入を許可する場合、LineTerminator の位置にセミコロンは挿入されない。すなわち上の例は次と同じように解釈される:
a = b / hi / g.exec (c).map (d);
構文 (Syntax)
InputElementDiv ::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
RightBracePunctuator
InputElementRegExp ::
WhiteSpace
LineTerminator
Comment
CommonToken
RightBracePunctuator
RegularExpressionLiteral
InputElementRegExpOrTemplateTail ::
WhiteSpace
LineTerminator
Comment
CommonToken
RegularExpressionLiteral
TemplateSubstitutionTail
InputElementTemplateTail ::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
TemplateSubstitutionTail
InputElementHashbangOrRegExp ::
WhiteSpace
LineTerminator
Comment
CommonToken
HashbangComment
RegularExpressionLiteral
12.1 Unicode 形式制御文字 (Unicode Format-Control Characters)
Unicode 形式制御文字(すなわち Unicode 文字データベースにおける “Cf” カテゴリ、例えば LEFT-TO-RIGHT MARK や RIGHT-TO-LEFT MARK)は、上位プロトコル(マークアップ言語など)が存在しない場合にテキスト範囲の整形を制御するために使用される制御コードである。
編集および表示を容易にするため、ソーステキスト内で形式制御文字を許可することは有用である。すべての形式制御文字はコメント内、ならびに文字列リテラル、テンプレートリテラル、正規表現リテラル内で使用できる。
U+FEFF (ZERO WIDTH NO-BREAK SPACE) は主としてテキストの冒頭で Unicode であることを示し、テキストのエンコーディングとバイト順を検出するために用いられる形式制御文字である。この目的で用いられる <ZWNBSP> 文字は、ファイル連結の結果などとしてテキスト開始後にも現れることがある。ECMAScript ソーステキスト では、コメント、文字列リテラル、テンプレートリテラル、正規表現リテラルの外側で <ZWNBSP> 符号位置は空白文字として扱われる(12.2 参照)。
12.2 空白 (White Space)
空白符号位置はソーステキストの可読性を高め、トークン(分割不可能な字句単位)を相互に分離するために使用されるが、それ以外の点では意味を持たない。空白符号位置は任意の 2 つのトークンの間および入力の開始・末尾に現れうる。空白符号位置は StringLiteral , RegularExpressionLiteral , Template , TemplateSubstitutionTail の内部に現れ、その場合リテラル値を構成する有意味な符号位置として扱われる。また Comment 内に現れうるが、他の種類のトークン内部には現れない。
ECMAScript の空白符号位置は Table 33 に列挙される。
Table 33: White Space Code Points
Code Points
Name
Abbreviation
U+0009
CHARACTER TABULATION
<TAB>
U+000B
LINE TABULATION
<VT>
U+000C
FORM FEED (FF)
<FF>
U+FEFF
ZERO WIDTH NO-BREAK SPACE
<ZWNBSP>
一般カテゴリ “Space_Separator” のいかなる符号位置
<USP>
Note 1
U+0020 (SPACE) と U+00A0 (NO-BREAK SPACE) は <USP> の一部である。
Note 2
Table 33 に列挙される符号位置を除き、ECMAScript WhiteSpace は Unicode “White_Space” プロパティを持つが一般カテゴリ “Space_Separator” (“Zs”) に分類されないすべての符号位置を意図的に除外する。
構文 (Syntax)
WhiteSpace ::
<TAB>
<VT>
<FF>
<ZWNBSP>
<USP>
12.3 行終端子 (Line Terminators)
空白符号位置と同様に、行終端子符号位置はソーステキストの可読性を高め、トークンを相互に分離するために使用される。しかし空白符号位置と異なり、行終端子は構文文法の振る舞いに影響を及ぼす。一般に、行終端子は任意の 2 つのトークン間に現れうるが、構文文法により禁止される箇所がいくつか存在する。行終端子は自動セミコロン挿入(12.10 )の過程にも影響する。行終端子は StringLiteral , Template , TemplateSubstitutionTail 以外のいかなるトークン内部にも現れない。<LF> および <CR> 行終端子は LineContinuation の一部である場合を除き StringLiteral トークン内部に現れない。
行終端子は MultiLineComment 内には現れることができるが、SingleLineComment 内には現れない。
行終端子は正規表現において \s
クラスによりマッチされる空白符号位置集合に含まれる。
ECMAScript の行終端子符号位置は Table 34 に列挙される。
Table 34: Line Terminator Code Points
Code Point
Unicode Name
Abbreviation
U+000A
LINE FEED (LF)
<LF>
U+000D
CARRIAGE RETURN (CR)
<CR>
U+2028
LINE SEPARATOR
<LS>
U+2029
PARAGRAPH SEPARATOR
<PS>
Table 34 に示す Unicode 符号位置のみが行終端子として扱われる。その他の改行または行分割の Unicode 符号位置は行終端子とは扱われないが、Table 33 に記述された要件を満たす場合は空白として扱われる。シーケンス <CR><LF> は行終端子として一般的に使用される。行番号の報告目的においては一つの SourceCharacter と見なされるべきである。
構文 (Syntax)
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence ::
<LF>
<CR>
[lookahead ≠ <LF> ]
<LS>
<PS>
<CR>
<LF>
12.5 ハッシュバンコメント (Hashbang Comments)
ハッシュバンコメントは位置依存であり、他の種類のコメントと同様に構文文法への入力要素列からは破棄される。
構文 (Syntax)
12.6 トークン (Tokens)
構文 (Syntax)
CommonToken ::
IdentifierName
PrivateIdentifier
Punctuator
NumericLiteral
StringLiteral
Template
Note
12.7 名前とキーワード (Names and Keywords)
IdentifierName および ReservedWord は Unicode Standard Annex #31「Identifier and Pattern Syntax」で与えられる既定の識別子構文(わずかな修正付き)に従って解釈されるトークンである。ReservedWord は IdentifierName の列挙された部分集合である。構文文法は Identifier を ReservedWord ではない IdentifierName として定義する。Unicode 識別子文法は Unicode Standard が定義する文字プロパティに基づく。Unicode 標準の最新バージョンで指定カテゴリに属する Unicode 符号位置は、すべての適合 ECMAScript 実装によりそのカテゴリとして扱われなければならない。実装は Unicode 標準の後続版で定義された識別子用符号位置を認識してもよい。
Note 1
この規格は追加の特定符号位置を許可する: U+0024 (DOLLAR SIGN) および U+005F (LOW LINE) は IdentifierName 内の任意の位置で許可される。
構文 (Syntax)
PrivateIdentifier ::
#
IdentifierName
IdentifierName ::
IdentifierStart
IdentifierName
IdentifierPart
IdentifierStart ::
IdentifierStartChar
\
UnicodeEscapeSequence
IdentifierPart ::
IdentifierPartChar
\
UnicodeEscapeSequence
IdentifierStartChar ::
UnicodeIDStart
$
_
IdentifierPartChar ::
UnicodeIDContinue
$
AsciiLetter :: one of a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
UnicodeIDStart ::
any Unicode code point with the Unicode property “ID_Start”
UnicodeIDContinue ::
any Unicode code point with the Unicode property “ID_Continue”
非終端記号 UnicodeEscapeSequence の定義は 12.9.4 に示される。
Note 2
Note 3
Unicode プロパティ “ID_Start” および “ID_Continue” の集合には、それぞれ “Other_ID_Start” および “Other_ID_Continue” プロパティを持つ符号位置が含まれる。
12.7.1 識別子名 (Identifier Names)
Unicode エスケープシーケンスは IdentifierName 内で許可され、その場合 UnicodeEscapeSequence の IdentifierCodePoint に等しい一つの Unicode 符号位置として寄与する。UnicodeEscapeSequence に先行する ` はいかなる符号位置も寄与しない。|UnicodeEscapeSequence| は、それが寄与する符号位置をエスケープ無しで書いた場合に無効となるような符号位置を |IdentifierName| に寄与するためには使用できない。言い換えると、
` UnicodeEscapeSequence の並びをそれが寄与する SourceCharacter に置換した場合、結果は元の IdentifierName と同一の SourceCharacter 列を持つ有効な IdentifierName でなければならない。本仕様内の IdentifierName の解釈は、特定符号位置がエスケープシーケンスで与えられたかどうかに関わらず実際のコードポイントに基づく。
Unicode 標準に従い正規等価な 2 つの IdentifierName は、各 UnicodeEscapeSequence を置換した後に完全に同じコードポイント列で表されない限り等しくない 。
12.7.1.1 静的セマンティクス: 早期エラー (Early Errors)
IdentifierStart ::
\
UnicodeEscapeSequence
IdentifierPart ::
\
UnicodeEscapeSequence
12.7.1.2 静的セマンティクス: IdentifierCodePoints : 符号位置の List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
IdentifierName :: IdentifierStart
cp を IdentifierStart の IdentifierCodePoint とする。« cp » を返す。
IdentifierName ::
IdentifierName
IdentifierPart
cps を導出された IdentifierName の IdentifierCodePoints とする。cp を IdentifierPart の IdentifierCodePoint とする。cps と « cp » のリスト結合 を返す。
12.7.1.3 静的セマンティクス: IdentifierCodePoint : 符号位置
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
IdentifierStart :: IdentifierStartChar
IdentifierStartChar によりマッチされた符号位置を返す。
IdentifierPart :: IdentifierPartChar
IdentifierPartChar によりマッチされた符号位置を返す。
UnicodeEscapeSequence ::
u
Hex4Digits
Hex4Digits の MV の数値値を持つ符号位置を返す。
UnicodeEscapeSequence ::
u{
CodePoint
}
CodePoint の MV の数値値を持つ符号位置を返す。
12.7.2 キーワードと予約語 (Keywords and Reserved Words)
キーワード (keyword) とは IdentifierName にマッチしかつ構文上の用途(生成規則中に等幅フォントで文字通り出現する)を持つトークンである。ECMAScript のキーワードには if
, while
, async
, await
など多数が含まれる。
予約語 (reserved word) とは識別子として使用できない IdentifierName である。多くのキーワードは予約語であるが、そうでないものもあり、また特定の文脈でのみ予約されるものもある。if
と while
は予約語である。await
は async 関数およびモジュール内でのみ予約される。async
は予約されていないため、変数名やラベルとして制限なく使用できる。
この仕様は文法生成規則および早期エラールールの組み合わせを用いて、どの名前が有効な識別子でどれが予約語かを指定する。下記 ReservedWord 一覧内の await
と yield
を除くすべてのトークンは無条件に予約される。await
と yield
の例外は 13.1 でパラメータ化された構文生成規則を用いて指定される。最後に、いくつかの早期エラールールが有効な識別子集合を制限する。13.1.1 , 14.3.1.1 , 14.7.5.1 , 15.7.1 を参照。まとめると識別子名には 5 つの分類がある:
常に識別子として許可されキーワードではないもの(Math
, window
, toString
, _
など);
決して識別子として許可されないもの(await
と yield
を除く ReservedWord );
文脈的に識別子として許可されるもの(await
と yield
);
strict mode code で文脈的に識別子として不許可となるもの: let
, static
, implements
, interface
, package
, private
, protected
, public
;
常に識別子として許可されるが、特定の構文生成規則中で Identifier が許可されない位置にキーワードとして現れるもの: as
, async
, from
, get
, meta
, of
, set
, target
。
条件付きキーワード (conditional keyword) または 文脈的キーワード (contextual keyword) という語がしばしば最後の 3 つのカテゴリに属するキーワードを指し、これらは文脈によって識別子またはキーワードとして使用できる。
構文 (Syntax)
ReservedWord :: one of await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield
Note 1
5.1.5 に従い、文法内のキーワードは特定の SourceCharacter 列をリテラルにマッチする。キーワード中の符号位置は `` |UnicodeEscapeSequence| で表現できない。
IdentifierName は ` |UnicodeEscapeSequence| を含み得るが、
els\u{65}` のように書いて “else” という名前の変数を宣言することはできない。13.1.1 にある早期エラールールが、予約語と同じ StringValue を持つ識別子を除外する。
Note 2
enum
は現時点で本仕様においてキーワードとして使用されていない。これは将来の言語拡張でキーワードとして使用するために予約された future reserved word である。
同様に、implements
, interface
, package
, private
, protected
, public
は strict mode code における future reserved words である。
Note 3
arguments
および eval
はキーワードではないが strict mode code でいくつかの制限を受ける。13.1.1 , 8.6.4 , 15.2.1 , 15.5.1 , 15.6.1 , 15.8.1 を参照。
12.8 句読点 (Punctuators)
構文 (Syntax)
Punctuator ::
OptionalChainingPunctuator
OtherPunctuator
OptionalChainingPunctuator ::
?.
[lookahead ∉ DecimalDigit ]
OtherPunctuator :: one of { ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ?? ? : = += -= *= %= **= <<= >>= >>>= &= |= ^= &&= ||= ??= =>
DivPunctuator ::
/
/=
RightBracePunctuator ::
}
12.9 リテラル (Literals)
12.9.1 null リテラル (Null Literals)
構文 (Syntax)
NullLiteral ::
null
12.9.2 真偽値リテラル (Boolean Literals)
構文 (Syntax)
BooleanLiteral ::
true
false
12.9.3 数値リテラル (Numeric Literals)
構文 (Syntax)
NumericLiteralSeparator ::
_
NumericLiteral ::
DecimalLiteral
DecimalBigIntegerLiteral
NonDecimalIntegerLiteral [+Sep]
NonDecimalIntegerLiteral [+Sep]
BigIntLiteralSuffix
LegacyOctalIntegerLiteral
DecimalBigIntegerLiteral ::
0
BigIntLiteralSuffix
NonZeroDigit
DecimalDigits [+Sep] opt
BigIntLiteralSuffix
NonZeroDigit
NumericLiteralSeparator
DecimalDigits [+Sep]
BigIntLiteralSuffix
NonDecimalIntegerLiteral [Sep] ::
BinaryIntegerLiteral [?Sep]
OctalIntegerLiteral [?Sep]
HexIntegerLiteral [?Sep]
BigIntLiteralSuffix ::
n
DecimalLiteral ::
DecimalIntegerLiteral
.
DecimalDigits [+Sep] opt
ExponentPart [+Sep] opt
.
DecimalDigits [+Sep]
ExponentPart [+Sep] opt
DecimalIntegerLiteral
ExponentPart [+Sep] opt
DecimalIntegerLiteral ::
0
NonZeroDigit
NonZeroDigit
NumericLiteralSeparator opt
DecimalDigits [+Sep]
NonOctalDecimalIntegerLiteral
DecimalDigits [Sep] ::
DecimalDigit
DecimalDigits [?Sep]
DecimalDigit
[+Sep]
DecimalDigits [+Sep]
NumericLiteralSeparator
DecimalDigit
DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9
NonZeroDigit :: one of 1 2 3 4 5 6 7 8 9
ExponentPart [Sep] ::
ExponentIndicator
SignedInteger [?Sep]
ExponentIndicator :: one of e E
SignedInteger [Sep] ::
DecimalDigits [?Sep]
+
DecimalDigits [?Sep]
-
DecimalDigits [?Sep]
BinaryIntegerLiteral [Sep] ::
0b
BinaryDigits [?Sep]
0B
BinaryDigits [?Sep]
BinaryDigits [Sep] ::
BinaryDigit
BinaryDigits [?Sep]
BinaryDigit
[+Sep]
BinaryDigits [+Sep]
NumericLiteralSeparator
BinaryDigit
BinaryDigit :: one of 0 1
OctalIntegerLiteral [Sep] ::
0o
OctalDigits [?Sep]
0O
OctalDigits [?Sep]
OctalDigits [Sep] ::
OctalDigit
OctalDigits [?Sep]
OctalDigit
[+Sep]
OctalDigits [+Sep]
NumericLiteralSeparator
OctalDigit
LegacyOctalIntegerLiteral ::
0
OctalDigit
LegacyOctalIntegerLiteral
OctalDigit
NonOctalDecimalIntegerLiteral ::
0
NonOctalDigit
LegacyOctalLikeDecimalIntegerLiteral
NonOctalDigit
NonOctalDecimalIntegerLiteral
DecimalDigit
LegacyOctalLikeDecimalIntegerLiteral ::
0
OctalDigit
LegacyOctalLikeDecimalIntegerLiteral
OctalDigit
OctalDigit :: one of 0 1 2 3 4 5 6 7
NonOctalDigit :: one of 8 9
HexIntegerLiteral [Sep] ::
0x
HexDigits [?Sep]
0X
HexDigits [?Sep]
HexDigits [Sep] ::
HexDigit
HexDigits [?Sep]
HexDigit
[+Sep]
HexDigits [+Sep]
NumericLiteralSeparator
HexDigit
HexDigit :: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
NumericLiteral に直続する SourceCharacter は IdentifierStart でも DecimalDigit でもあってはならない。
Note
例えば: 3in
はエラーであり、3
と in
の 2 つの入力要素ではない。
12.9.3.1 静的セマンティクス: 早期エラー (Early Errors)
NumericLiteral :: LegacyOctalIntegerLiteral
DecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral
IsStrict(this production) が true なら構文エラー。
Note 非 strict コードではこの構文は Legacy である。
12.9.3.2 静的セマンティクス: MV
数値リテラルは Number 型または BigInt 型の値を表す。
12.9.3.3 静的セマンティクス: NumericValue : Number または BigInt
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
NumericLiteral :: DecimalLiteral
RoundMVResult (DecimalLiteral の MV) を返す。
NumericLiteral :: NonDecimalIntegerLiteral
𝔽 (NonDecimalIntegerLiteral の MV) を返す。
NumericLiteral :: LegacyOctalIntegerLiteral
𝔽 (LegacyOctalIntegerLiteral の MV) を返す。
NumericLiteral ::
NonDecimalIntegerLiteral
BigIntLiteralSuffix
NonDecimalIntegerLiteral の MV に対応する BigInt 値を返す。
DecimalBigIntegerLiteral ::
0
BigIntLiteralSuffix
0 ℤ を返す。
DecimalBigIntegerLiteral ::
NonZeroDigit
BigIntLiteralSuffix
NonZeroDigit の MV に対応する BigInt 値を返す。
DecimalBigIntegerLiteral ::
NonZeroDigit
DecimalDigits
BigIntLiteralSuffix
NonZeroDigit
NumericLiteralSeparator
DecimalDigits
BigIntLiteralSuffix
n を NumericLiteralSeparator の出現を除いた DecimalDigits の符号位置数とする。mv を (NonZeroDigit の MV × 10n ) + DecimalDigits の MV とする。ℤ (mv ) を返す。
12.9.4 文字列リテラル (String Literals)
Note 1
文字列リテラルは単一または二重引用符で囲まれた 0 個以上の Unicode 符号位置である。Unicode 符号位置はエスケープシーケンスで表すこともできる。閉じ引用符、U+005C (REVERSE SOLIDUS), U+000D (CARRIAGE RETURN), U+000A (LINE FEED) 以外のすべての符号位置は文字列リテラル内にリテラルに記述可能である。任意の符号位置はエスケープシーケンスの形で出現可能である。文字列リテラルは ECMAScript String 値へと評価される。これらの String 値を生成する際、Unicode 符号位置は 11.1.1 で定義されるように UTF-16 エンコードされる。基本多言語面に属するコードポイントは文字列の 1 つのコードユニット要素としてエンコードされ、それ以外は 2 つのコードユニット要素としてエンコードされる。
構文 (Syntax)
StringLiteral ::
"
DoubleStringCharacters opt
"
'
SingleStringCharacters opt
'
DoubleStringCharacters ::
DoubleStringCharacter
DoubleStringCharacters opt
SingleStringCharacters ::
SingleStringCharacter
SingleStringCharacters opt
DoubleStringCharacter ::
SourceCharacter but not one of " or \ or LineTerminator
<LS>
<PS>
\
EscapeSequence
LineContinuation
SingleStringCharacter ::
SourceCharacter but not one of ' or \ or LineTerminator
<LS>
<PS>
\
EscapeSequence
LineContinuation
LineContinuation ::
\
LineTerminatorSequence
EscapeSequence ::
CharacterEscapeSequence
0
[lookahead ∉ DecimalDigit ]
LegacyOctalEscapeSequence
NonOctalDecimalEscapeSequence
HexEscapeSequence
UnicodeEscapeSequence
CharacterEscapeSequence ::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter :: one of ' " \ b f n r t v
NonEscapeCharacter ::
SourceCharacter but not one of EscapeCharacter or LineTerminator
EscapeCharacter ::
SingleEscapeCharacter
DecimalDigit
x
u
LegacyOctalEscapeSequence ::
0
[lookahead ∈ { 8 , 9 }]
NonZeroOctalDigit
[lookahead ∉ OctalDigit ]
ZeroToThree
OctalDigit
[lookahead ∉ OctalDigit ]
FourToSeven
OctalDigit
ZeroToThree
OctalDigit
OctalDigit
NonZeroOctalDigit ::
OctalDigit but not 0
ZeroToThree :: one of 0 1 2 3
FourToSeven :: one of 4 5 6 7
NonOctalDecimalEscapeSequence :: one of 8 9
HexEscapeSequence ::
x
HexDigit
HexDigit
UnicodeEscapeSequence ::
u
Hex4Digits
u{
CodePoint
}
Hex4Digits ::
HexDigit
HexDigit
HexDigit
HexDigit
非終端 HexDigit の定義は 12.9.3 に、SourceCharacter は 11.1 にある。
Note 2
<LF> と <CR> は LineContinuation の一部として空の符号位置列を生成する場合を除き文字列リテラル内に現れない。文字列リテラルの String 値にこれらを含める正しい方法は \n
や \u000A
などのエスケープシーケンスを用いることである。
12.9.4.1 静的セマンティクス: 早期エラー (Early Errors)
EscapeSequence ::
LegacyOctalEscapeSequence
NonOctalDecimalEscapeSequence
IsStrict(this production) が true なら構文エラー。
Note 1 非 strict コードではこの構文は Legacy。
Note 2
文字列リテラルは囲むコードを strict mode にする Use Strict ディレクティブより前に現れる可能性があるため、実装はそのようなリテラルに対して上記規則を適用する際注意しなければならない。例えば次のソーステキストは構文エラーを含む:
function invalid ( ) { "\7" ; "use strict" ; }
12.9.4.2 静的セマンティクス: SV : String
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
文字列リテラルは String 型の値を表す。SV は文字列リテラルの各部分に再帰的に適用され String 値を生成する。この過程で、文字列リテラル内の一部の Unicode 符号位置は下記または 12.9.3 に述べるように数学的値を持つものとして解釈される。
Table 35: String Single Character Escape Sequences
Escape Sequence
Code Unit Value
Unicode Character Name
Symbol
\\b
0x0008
BACKSPACE
<BS>
\\t
0x0009
CHARACTER TABULATION
<HT>
\\n
0x000A
LINE FEED (LF)
<LF>
\\v
0x000B
LINE TABULATION
<VT>
\\f
0x000C
FORM FEED (FF)
<FF>
\\r
0x000D
CARRIAGE RETURN (CR)
<CR>
\\"
0x0022
QUOTATION MARK
"
\\'
0x0027
APOSTROPHE
'
\\\\
0x005C
REVERSE SOLIDUS
\\
12.9.4.3 静的セマンティクス: MV
12.9.5 正規表現リテラル (Regular Expression Literals)
Note 1
正規表現リテラルは評価のたびに RegExp オブジェクト(22.2 参照)へ変換される入力要素である。プログラム中の 2 つの正規表現リテラルは内容が同一でも ===
で等しくならない。RegExp オブジェクトは new RegExp
またはコンストラクタ 呼び出し(22.2.4 )で実行時に生成することもできる。
以下の生成規則は正規表現リテラルの構文を記述し、入力要素スキャナが正規表現リテラルの終端を見つけるために用いられる。RegularExpressionBody と RegularExpressionFlags を成すソーステキストは、その後より厳密な ECMAScript 正規表現文法(22.2.1 )を用いて再度パースされる。
実装は 22.2.1 で定義される ECMAScript 正規表現文法を拡張してもよいが、下に定義される RegularExpressionBody および RegularExpressionFlags 生成規則、またそれらが使用する生成規則を拡張してはならない。
構文 (Syntax)
RegularExpressionLiteral ::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionBody ::
RegularExpressionFirstChar
RegularExpressionChars
RegularExpressionChars ::
[empty]
RegularExpressionChars
RegularExpressionChar
RegularExpressionFirstChar ::
RegularExpressionNonTerminator but not one of * or \ or / or [
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionChar ::
RegularExpressionNonTerminator but not one of \ or / or [
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionBackslashSequence ::
\
RegularExpressionNonTerminator
RegularExpressionNonTerminator ::
SourceCharacter but not LineTerminator
RegularExpressionClass ::
[
RegularExpressionClassChars
]
RegularExpressionClassChars ::
[empty]
RegularExpressionClassChars
RegularExpressionClassChar
RegularExpressionClassChar ::
RegularExpressionNonTerminator but not one of ] or \
RegularExpressionBackslashSequence
RegularExpressionFlags ::
[empty]
RegularExpressionFlags
IdentifierPartChar
Note 2
正規表現リテラルは空にできない。空の正規表現リテラルを表す代わりに //
は単一行コメントを開始する。空の正規表現を指定するには /(?:)/
を用いる。
12.9.5.1 静的セマンティクス: BodyText : ソーステキスト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
RegularExpressionLiteral ::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionBody として認識されたソーステキストを返す。
12.9.5.2 静的セマンティクス: FlagText : ソーステキスト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
RegularExpressionLiteral ::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionFlags として認識されたソーステキストを返す。
12.9.6 テンプレートリテラルの字句要素 (Template Literal Lexical Components)
構文 (Syntax)
Template ::
NoSubstitutionTemplate
TemplateHead
NoSubstitutionTemplate ::
`
TemplateCharacters opt
`
TemplateHead ::
`
TemplateCharacters opt
${
TemplateSubstitutionTail ::
TemplateMiddle
TemplateTail
TemplateMiddle ::
}
TemplateCharacters opt
${
TemplateTail ::
}
TemplateCharacters opt
`
TemplateCharacters ::
TemplateCharacter
TemplateCharacters opt
TemplateCharacter ::
$
[lookahead ≠ { ]
\
TemplateEscapeSequence
\
NotEscapeSequence
LineContinuation
LineTerminatorSequence
SourceCharacter but not one of ` or \ or $ or LineTerminator
TemplateEscapeSequence ::
CharacterEscapeSequence
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
UnicodeEscapeSequence
NotEscapeSequence ::
0
DecimalDigit
DecimalDigit but not 0
x
[lookahead ∉ HexDigit ]
x
HexDigit
[lookahead ∉ HexDigit ]
u
[lookahead ∉ HexDigit ]
[lookahead ≠ { ]
u
HexDigit
[lookahead ∉ HexDigit ]
u
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
u
HexDigit
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
u
{
[lookahead ∉ HexDigit ]
u
{
NotCodePoint
[lookahead ∉ HexDigit ]
u
{
CodePoint
[lookahead ∉ HexDigit ]
[lookahead ≠ } ]
NotCodePoint ::
HexDigits [~Sep]
but only if the MV of HexDigits > 0x10FFFF
CodePoint ::
HexDigits [~Sep]
but only if the MV of HexDigits ≤ 0x10FFFF
Note
12.9.6.1 静的セマンティクス: TV : String または undefined
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. テンプレートリテラル構成要素は TV により String 型の値として解釈される。TV はテンプレートオブジェクトのインデックス付き構成要素(テンプレート値)を構成する。TV ではエスケープシーケンスはその Unicode 符号位置を UTF-16 のコードユニットに置換される。
12.9.6.2 静的セマンティクス: TRV : String
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. テンプレートリテラル構成要素は TRV により String 型の値として解釈される。TRV はテンプレートオブジェクトの raw 構成要素(テンプレート raw 値)を構築する。TRV は TV と似ているが、TRV ではエスケープシーケンスは字面通りのコード単位として扱われる点が異なる。
Note
TV は LineContinuation のコードユニットを除外するが TRV は含む。<CR><LF> と <CR> の LineTerminatorSequence は TV と TRV の両方で <LF> に正規化される。<CR> または <CR><LF> を含めるには明示的な TemplateEscapeSequence が必要。
12.10 自動セミコロン挿入 (Automatic Semicolon Insertion)
ほとんどの ECMAScript 文および宣言はセミコロンで終端されなければならない。これらのセミコロンは常に明示的に記述できる。利便性のため、特定の状況ではそれらを省略できる。これらの状況ではソースコードトークン列へ自動的にセミコロンが挿入されると記述される。
12.10.1 自動セミコロン挿入の規則 (Rules of Automatic Semicolon Insertion)
以下の規則において “token” は 12 に述べる現在の字句目標記号を用いて決定される実際に認識された字句トークンを意味する。
セミコロン挿入には 3 つの基本規則がある:
ソーステキストを左から右へパースする際、いかなる文法生成規則でも許可されないトークン(違反トークン )に遭遇したとき、以下のいずれかが真ならその違反トークンの前にセミコロンが自動挿入される:
違反トークンが直前のトークンと 1 つ以上の LineTerminator で分離されている。
違反トークンが }
である。
直前のトークンが )
であり、挿入されたセミコロンが do-while 文 (14.7.2 ) の終端セミコロンとしてパースされる。
ソーステキストを左から右へパースする際、トークン入力列の終端に到達し、構文解析器が入力トークン列を目標非終端の単一インスタンスとしてパースできないなら、入力列末尾にセミコロンが自動挿入される。
ソーステキストを左から右へパースする際、文法生成規則により許可されるトークンだがその生成規則が制限付き生成規則 であり、トークンが制限付き生成規則内の “[no LineTerminator here]” 注釈直後に位置する終端または非終端の先頭トークン(= 制限トークン)であり、その制限トークンが直前トークンと 1 つ以上の LineTerminator で分離されているなら、制限トークンの前にセミコロンが自動挿入される。
ただし上記規則には更に支配的な条件がある: セミコロンが自動挿入された結果それが空文としてパースされる場合、またはそのセミコロンが for
文ヘッダ内の 2 つのセミコロンの一つになる場合(14.7.4 参照)、セミコロンは決して自動挿入されない。
Note
以下は文法中の唯一の制限付き生成規則である:
UpdateExpression [Yield, Await] :
LeftHandSideExpression [?Yield, ?Await]
[no LineTerminator here]
++
LeftHandSideExpression [?Yield, ?Await]
[no LineTerminator here]
--
ContinueStatement [Yield, Await] :
continue
;
continue
[no LineTerminator here]
LabelIdentifier [?Yield, ?Await]
;
BreakStatement [Yield, Await] :
break
;
break
[no LineTerminator here]
LabelIdentifier [?Yield, ?Await]
;
ReturnStatement [Yield, Await] :
return
;
return
[no LineTerminator here]
Expression [+In, ?Yield, ?Await]
;
ThrowStatement [Yield, Await] :
throw
[no LineTerminator here]
Expression [+In, ?Yield, ?Await]
;
YieldExpression [In, Await] :
yield
yield
[no LineTerminator here]
AssignmentExpression [?In, +Yield, ?Await]
yield
[no LineTerminator here]
*
AssignmentExpression [?In, +Yield, ?Await]
ArrowFunction [In, Yield, Await] :
ArrowParameters [?Yield, ?Await]
[no LineTerminator here]
=>
ConciseBody [?In]
AsyncFunctionDeclaration [Yield, Await, Default] :
async
[no LineTerminator here]
function
BindingIdentifier [?Yield, ?Await]
(
FormalParameters [~Yield, +Await]
)
{
AsyncFunctionBody
}
[+Default]
async
[no LineTerminator here]
function
(
FormalParameters [~Yield, +Await]
)
{
AsyncFunctionBody
}
AsyncFunctionExpression :
async
[no LineTerminator here]
function
BindingIdentifier [~Yield, +Await] opt
(
FormalParameters [~Yield, +Await]
)
{
AsyncFunctionBody
}
AsyncMethod [Yield, Await] :
async
[no LineTerminator here]
ClassElementName [?Yield, ?Await]
(
UniqueFormalParameters [~Yield, +Await]
)
{
AsyncFunctionBody
}
AsyncGeneratorDeclaration [Yield, Await, Default] :
async
[no LineTerminator here]
function
*
BindingIdentifier [?Yield, ?Await]
(
FormalParameters [+Yield, +Await]
)
{
AsyncGeneratorBody
}
[+Default]
async
[no LineTerminator here]
function
*
(
FormalParameters [+Yield, +Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression :
async
[no LineTerminator here]
function
*
BindingIdentifier [+Yield, +Await] opt
(
FormalParameters [+Yield, +Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorMethod [Yield, Await] :
async
[no LineTerminator here]
*
ClassElementName [?Yield, ?Await]
(
UniqueFormalParameters [+Yield, +Await]
)
{
AsyncGeneratorBody
}
AsyncArrowFunction [In, Yield, Await] :
async
[no LineTerminator here]
AsyncArrowBindingIdentifier [?Yield]
[no LineTerminator here]
=>
AsyncConciseBody [?In]
CoverCallExpressionAndAsyncArrowHead [?Yield, ?Await]
[no LineTerminator here]
=>
AsyncConciseBody [?In]
AsyncArrowHead :
async
[no LineTerminator here]
ArrowFormalParameters [~Yield, +Await]
これら制限付き生成規則の実際的効果は次の通り:
後置 ++
または --
が出現し、直前トークンとの間に 1 つ以上の LineTerminator がある場合、その前にセミコロンが自動挿入される。
continue
, break
, return
, throw
, yield
トークンに続いて LineTerminator が現れた場合、それらトークンの直後にセミコロンが自動挿入される。
アロー関数パラメータの終わりと =>
の間に LineTerminator がある場合、セミコロンが挿入され =>
は構文エラーとなる。
async
の後に LineTerminator があり、その後に function
や IdentifierName や (
が続く前に改行がある場合、セミコロンが挿入され async
は後続と同じ式/クラス要素と扱われない。
async
の後に LineTerminator があり、その後に *
が来る場合、セミコロンが挿入され *
は構文エラーとなる。
実務上の指針:
後置 ++
/ --
はオペランドと同じ行に置く。
return
/ throw
/ yield
の後に続く式は同じ行で開始する。
break
/ continue
の LabelIdentifier は同じ行に置く。
アロー関数のパラメータ終端と =>
は同じ行に置く。
非同期関数やメソッドの直前の async
は直後のトークンと同じ行に置く。
12.10.2 自動セミコロン挿入の例 (Examples of Automatic Semicolon Insertion)
この節は規範的でない (non-normative)。
次のソース
{ 1 2 } 3
は自動セミコロン挿入規則を考慮しても ECMAScript 文法の妥当な文ではない。対照的に次のソース
{ 1
2 } 3
も妥当ではないが、自動セミコロン挿入により以下に変換される:
{ 1
;2 ;} 3 ;
これは妥当な ECMAScript 文である。
次のソース
for (a; b
)
は妥当ではなく、自動セミコロン挿入で変更されない。これは for
文ヘッダのセミコロンが必要であり、自動挿入は for
ヘッダ内 2 つのセミコロンのいずれも挿入しないためである。
次のソース
return
a + b
は次に変換される:
return ;
a + b;
Note 1
a + b
は return
文で返される値として扱われない。LineTerminator が return
トークンとそれに続く式を分離するためである。
次のソース
a = b
++c
は以下に変換される:
a = b;
++c;
Note 2
++
トークンは変数 b
への後置演算子として扱われない。b
と ++
の間に LineTerminator があるため。
次のソース
if (a > b)
else c = d
は妥当ではなく、else
トークンの前には自動セミコロン挿入による変化は起こらない。文法生成規則が適用できない地点ではあるが、挿入された場合空文になるため。
次のソース
a = b + c
(d + e).print ()
は自動セミコロン挿入で変換されない 。2 行目冒頭の括弧付き式は関数呼び出しの引数リストと解釈できるためである:
a = b + c (d + e).print ()
代入文が左括弧で始まらなければならない状況では、自動セミコロン挿入に頼らず前の文末に明示的なセミコロンを置くべきである。
12.10.3 自動セミコロン挿入の興味深いケース (Interesting Cases of Automatic Semicolon Insertion)
この節は規範的でない。
ECMAScript プログラムは自動セミコロン挿入に依存することで非常に少ないセミコロンで書くことができる。上述のようにセミコロンはすべての改行で挿入されるわけではなく、挿入は複数トークンにまたがる。
ECMAScript に新しい構文機能が追加されると、追加の構文生成規則が導入され、自動セミコロン挿入に依存する行がパース時に使用する生成規則を変化させる可能性がある。
本節では、前に現れるソーステキストによってセミコロンが挿入されるか否かが変わりうる箇所を興味深いケースとみなす。本バージョンでの自動セミコロン挿入のいくつかの興味深いケースを以下で説明する。
12.10.3.1 文リストにおける自動セミコロン挿入の興味深いケース
StatementList では多くの StatementListItem がセミコロンで終わり、自動セミコロン挿入により省略できる。上記規則の結果、式で終わる行の末尾で、次の行が以下のいずれかで始まる場合セミコロンが必要になる:
12.10.3.2 “[no LineTerminator here]” を伴う自動セミコロン挿入のケース
この節は規範的でない。
ECMAScript には “[no LineTerminator here]” を含む生成規則があり、これらはしばしば文法における省略可能オペランドを実現する手段である。これら位置に LineTerminator を導入すると省略可能オペランドを持たない別生成規則の使用へ切り替わる。
以下では本バージョンの “[no LineTerminator here]” を使用するいくつかの生成規則を列挙する。
12.10.3.2.1 省略可能オペランドと “[no LineTerminator here]” を持つ生成規則一覧
13 ECMAScript 言語: 表現式 (Expressions)
13.1 識別子 (Identifiers)
構文 (Syntax)
IdentifierReference [Yield, Await] :
Identifier
[~Yield]
yield
[~Await]
await
BindingIdentifier [Yield, Await] :
Identifier
yield
await
LabelIdentifier [Yield, Await] :
Identifier
[~Yield]
yield
[~Await]
await
Identifier :
IdentifierName but not ReservedWord
Note
yield
と await
は文法上は BindingIdentifier として許可されるが、以下の静的セマンティクスにより禁止され、次のようなケースで自動セミコロン挿入を許さないためである:
let
await 0 ;
13.1.1 静的セマンティクス: 早期エラー (Early Errors)
BindingIdentifier : Identifier
IsStrict(this production) が true であり、Identifier の StringValue が "arguments" か "eval" のいずれかであるなら構文エラー。
IdentifierReference : yield
BindingIdentifier : yield
LabelIdentifier : yield
IsStrict(this production) が true なら構文エラー。
IdentifierReference : await
BindingIdentifier : await
LabelIdentifier : await
BindingIdentifier [Yield, Await] : yield
この生成規則が [Yield] パラメータを持つなら構文エラー。
BindingIdentifier [Yield, Await] : await
この生成規則が [Await] パラメータを持つなら構文エラー。
IdentifierReference [Yield, Await] : Identifier
BindingIdentifier [Yield, Await] : Identifier
LabelIdentifier [Yield, Await] : Identifier
この生成規則が [Yield] パラメータを持ち、Identifier の StringValue が "yield" なら構文エラー。
この生成規則が [Await] パラメータを持ち、Identifier の StringValue が "await" なら構文エラー。
Identifier : IdentifierName but not ReservedWord
IsStrict(this phrase) が true で、IdentifierName の StringValue が "implements" , "interface" , "let" , "package" , "private" , "protected" , "public" , "static" , "yield" のいずれかなら構文エラー。
構文文法のゴール記号 が Module で、IdentifierName の StringValue が "await" なら構文エラー。
IdentifierName の StringValue が yield
および await
を除くいずれかの ReservedWord の StringValue と同じなら構文エラー。
Note
IdentifierName の StringValue は IdentifierName 内の Unicode エスケープシーケンスを正規化するため、エスケープによって ReservedWord と同じコードポイント列の Identifier を作ることはできない。
13.1.2 静的セマンティクス: StringValue : String
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
IdentifierName ::
IdentifierStart
IdentifierName
IdentifierPart
idTextUnescaped を IdentifierName の IdentifierCodePoints とする。CodePointsToString(idTextUnescaped ) を返す。
IdentifierReference : yield
BindingIdentifier : yield
LabelIdentifier : yield
"yield" を返す。
IdentifierReference : await
BindingIdentifier : await
LabelIdentifier : await
"await" を返す。
Identifier : IdentifierName but not ReservedWord
IdentifierName の StringValue を返す。
PrivateIdentifier ::
#
IdentifierName
0x0023 (NUMBER SIGN) と IdentifierName の StringValue の文字列連結 を返す。
ModuleExportName : StringLiteral
StringLiteral の SV を返す。
13.1.3 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
IdentifierReference : Identifier
? ResolveBinding (StringValue of Identifier ) を返す。
IdentifierReference : yield
? ResolveBinding ("yield" ) を返す。
IdentifierReference : await
? ResolveBinding ("await" ) を返す。
Note 1
IdentifierReference の評価結果は常に Reference 型の値である。
Note 2
非 strict コードではキーワード yield
を識別子として使用できる。IdentifierReference の評価は yield
の束縛を Identifier であるかのように解決する。Early Error によりこの評価は非 strict コードでのみ発生し得ることが保証される。
13.2 一次式 (Primary Expression)
構文 (Syntax)
PrimaryExpression [Yield, Await] :
this
IdentifierReference [?Yield, ?Await]
Literal
ArrayLiteral [?Yield, ?Await]
ObjectLiteral [?Yield, ?Await]
FunctionExpression
ClassExpression [?Yield, ?Await]
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral [?Yield, ?Await, ~Tagged]
CoverParenthesizedExpressionAndArrowParameterList [?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList [Yield, Await] :
(
Expression [+In, ?Yield, ?Await]
)
(
Expression [+In, ?Yield, ?Await]
,
)
(
)
(
...
BindingIdentifier [?Yield, ?Await]
)
(
...
BindingPattern [?Yield, ?Await]
)
(
Expression [+In, ?Yield, ?Await]
,
...
BindingIdentifier [?Yield, ?Await]
)
(
Expression [+In, ?Yield, ?Await]
,
...
BindingPattern [?Yield, ?Await]
)
補助構文 (Supplemental Syntax)
次の生成規則インスタンスを処理する際
PrimaryExpression [Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList [?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList の解釈は次の文法で精緻化される:
ParenthesizedExpression [Yield, Await] :
(
Expression [+In, ?Yield, ?Await]
)
13.2.1 this
キーワード
13.2.1.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
PrimaryExpression : this
? ResolveThisBinding () を返す。
13.2.2 識別子参照 (Identifier Reference)
IdentifierReference については 13.1 を参照。
13.2.3 リテラル (Literals)
構文 (Syntax)
Literal :
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
13.2.3.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
Literal : NullLiteral
null を返す。
Literal : BooleanLiteral
BooleanLiteral がトークン false
なら false を返す。BooleanLiteral がトークン true
なら true を返す。
Literal : NumericLiteral
12.9.3 で定義される NumericLiteral の NumericValue を返す。
Literal : StringLiteral
12.9.4.2 で定義される StringLiteral の SV を返す。
13.2.4 配列初期化子 (Array Initializer)
Note
ArrayLiteral は 0 個以上の式(各々が要素を表す)のリストを角括弧で囲んで配列の初期化を記述する式である。要素はリテラルである必要はなく、配列初期化子の評価ごとに評価される。
配列要素は先頭・中間・末尾で省略(elide)できる。要素リスト中のカンマが直前に AssignmentExpression を伴わないとき(先頭、または別のカンマの後)、欠落した要素は配列の length に寄与し、後続要素のインデックスを増やす。省略された配列要素は定義されない。末尾で要素が省略された場合、その要素は length に寄与しない。
構文 (Syntax)
ArrayLiteral [Yield, Await] :
[
Elision opt
]
[
ElementList [?Yield, ?Await]
]
[
ElementList [?Yield, ?Await]
,
Elision opt
]
ElementList [Yield, Await] :
Elision opt
AssignmentExpression [+In, ?Yield, ?Await]
Elision opt
SpreadElement [?Yield, ?Await]
ElementList [?Yield, ?Await]
,
Elision opt
AssignmentExpression [+In, ?Yield, ?Await]
ElementList [?Yield, ?Await]
,
Elision opt
SpreadElement [?Yield, ?Await]
Elision :
,
Elision
,
SpreadElement [Yield, Await] :
...
AssignmentExpression [+In, ?Yield, ?Await]
13.2.4.1 実行時セマンティクス: ArrayAccumulation : 正常完了で整数を含むか、または突然の完了
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Elision : ,
len を nextIndex + 1 とする。? Set (array , "length" , 𝔽 (len ), true ) を実行する。 注: 上の手順は len が 232 -1 を超えると投げる。 len を返す。
Elision :
Elision
,
引数 array , (nextIndex + 1) で Elision の ArrayAccumulation を実行した結果を返す。
ElementList :
Elision opt
AssignmentExpression
Elision が存在するならnextIndex を 引数 array , nextIndex で Elision の ArrayAccumulation を実行した結果に設定。initResult を AssignmentExpression の Evaluation。initValue を ? GetValue (initResult )。! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (nextIndex )), initValue ) を実行。 nextIndex + 1 を返す。
ElementList :
Elision opt
SpreadElement
Elision が存在するならnextIndex を 引数 array , nextIndex で Elision の ArrayAccumulation を実行した結果に設定。引数 array , nextIndex で SpreadElement の ArrayAccumulation を実行した結果を返す。
ElementList :
ElementList
,
Elision opt
AssignmentExpression
nextIndex を 引数 array , nextIndex で ElementList の ArrayAccumulation を実行した結果に設定。Elision が存在するならnextIndex を 引数 array , nextIndex で Elision の ArrayAccumulation を実行した結果に設定。initResult を AssignmentExpression の Evaluation。initValue を ? GetValue (initResult )。! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (nextIndex )), initValue ) を実行。 nextIndex + 1 を返す。
ElementList :
ElementList
,
Elision opt
SpreadElement
nextIndex を 引数 array , nextIndex で ElementList の ArrayAccumulation を実行した結果に設定。Elision が存在するならnextIndex を 引数 array , nextIndex で Elision の ArrayAccumulation を実行した結果に設定。引数 array , nextIndex で SpreadElement の ArrayAccumulation を実行した結果を返す。
SpreadElement :
...
AssignmentExpression
spreadRef を AssignmentExpression の Evaluation。spreadObj を ? GetValue (spreadRef )。iteratorRecord を ? GetIterator (spreadObj , sync )。反復:next を ? IteratorStepValue (iteratorRecord )。next が done なら nextIndex を返す。! CreateDataPropertyOrThrow (array , ! ToString (𝔽 (nextIndex )), next ) を実行。 nextIndex を nextIndex + 1 に設定。
Note
標準組込み Array prototype が [[Set]] による新たな自身プロパティ生成を妨げるよう改変されていても、自身プロパティ確立を保証するため CreateDataPropertyOrThrow が使用される。
13.2.4.2 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
ArrayLiteral :
[
Elision opt
]
array を ! ArrayCreate (0) とする。Elision が存在するなら引数 array , 0 で Elision の ArrayAccumulation を実行。 array を返す。
ArrayLiteral :
[
ElementList
]
array を ! ArrayCreate (0)。引数 array , 0 で ElementList の ArrayAccumulation を実行。 array を返す。
ArrayLiteral :
[
ElementList
,
Elision opt
]
array を ! ArrayCreate (0)。nextIndex を 引数 array , 0 で ElementList の ArrayAccumulation を実行した結果とする。Elision が存在するなら引数 array , nextIndex で Elision の ArrayAccumulation を実行。 array を返す。
13.2.5 オブジェクト初期化子 (Object Initializer)
Note 1
オブジェクト初期化子はオブジェクトの初期化をリテラル風の書式で表す式であり、波括弧で囲まれた 0 個以上のプロパティキー と対応値の組のリストである。値はリテラルである必要はなく、オブジェクト初期化子の評価ごとに評価される。
構文 (Syntax)
ObjectLiteral [Yield, Await] :
{
}
{
PropertyDefinitionList [?Yield, ?Await]
}
{
PropertyDefinitionList [?Yield, ?Await]
,
}
PropertyDefinitionList [Yield, Await] :
PropertyDefinition [?Yield, ?Await]
PropertyDefinitionList [?Yield, ?Await]
,
PropertyDefinition [?Yield, ?Await]
PropertyDefinition [Yield, Await] :
IdentifierReference [?Yield, ?Await]
CoverInitializedName [?Yield, ?Await]
PropertyName [?Yield, ?Await]
:
AssignmentExpression [+In, ?Yield, ?Await]
MethodDefinition [?Yield, ?Await]
...
AssignmentExpression [+In, ?Yield, ?Await]
PropertyName [Yield, Await] :
LiteralPropertyName
ComputedPropertyName [?Yield, ?Await]
LiteralPropertyName :
IdentifierName
StringLiteral
NumericLiteral
ComputedPropertyName [Yield, Await] :
[
AssignmentExpression [+In, ?Yield, ?Await]
]
CoverInitializedName [Yield, Await] :
IdentifierReference [?Yield, ?Await]
Initializer [+In, ?Yield, ?Await]
Initializer [In, Yield, Await] :
=
AssignmentExpression [?In, ?Yield, ?Await]
Note 2
Note 3
特定の文脈では ObjectLiteral はより制限された二次文法を覆うカバー文法として使われる。CoverInitializedName 生成規則はこれら二次文法を完全に覆うために必要である。しかし通常の実際の ObjectLiteral が期待される場面でこの生成規則が使用されると Early Syntax Error になる。
13.2.5.1 静的セマンティクス: 早期エラー (Early Errors)
PropertyDefinition : MethodDefinition
ObjectLiteral 生成規則は実際のオブジェクト初期化子を記述するだけでなく ObjectAssignmentPattern を覆うカバー文法として、また CoverParenthesizedExpressionAndArrowParameterList の一部として認識され得る。ObjectAssignmentPattern が要求される文脈で ObjectLiteral が現れるとき、以下の Early Error 規則は適用されない 。さらに、CoverParenthesizedExpressionAndArrowParameterList や CoverCallExpressionAndAsyncArrowHead の初期パース時にも適用されない。
PropertyDefinition : CoverInitializedName
この生成規則にマッチするソーステキストが存在するなら構文エラー。
Note 1
この生成規則は ObjectLiteral を ObjectAssignmentPattern のカバー文法として機能させるために存在し、実際のオブジェクト初期化子には現れない。
ObjectLiteral :
{
PropertyDefinitionList
}
{
PropertyDefinitionList
,
}
Note 2
PropertyNameList が返すリストには ComputedPropertyName を用いて定義された名前は含まれない。
13.2.5.2 静的セマンティクス: IsComputedPropertyKey : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
PropertyName : LiteralPropertyName
false を返す。
PropertyName : ComputedPropertyName
true を返す。
13.2.5.3 静的セマンティクス: PropertyNameList : String の List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
PropertyDefinitionList : PropertyDefinition
propName を PropertyDefinition の PropName とする。propName が empty なら新しい空 List を返す。« propName » を返す。
PropertyDefinitionList :
PropertyDefinitionList
,
PropertyDefinition
list を PropertyDefinitionList の PropertyNameList。propName を PropertyDefinition の PropName。propName が empty なら list を返す。list と « propName » のリスト結合 を返す。
13.2.5.4 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
ObjectLiteral :
{
}
OrdinaryObjectCreate (%Object.prototype% ) を返す。
ObjectLiteral :
{
PropertyDefinitionList
}
{
PropertyDefinitionList
,
}
obj を OrdinaryObjectCreate (%Object.prototype% )。引数 obj で PropertyDefinitionList の PropertyDefinitionEvaluation を実行。 obj を返す。
LiteralPropertyName : IdentifierName
IdentifierName の StringValue を返す。
LiteralPropertyName : StringLiteral
StringLiteral の SV を返す。
LiteralPropertyName : NumericLiteral
nbr を NumericLiteral の NumericValue。! ToString (nbr ) を返す。
ComputedPropertyName :
[
AssignmentExpression
]
exprValue を AssignmentExpression の Evaluation。propName を ? GetValue (exprValue )。? ToPropertyKey (propName ) を返す。
13.2.5.5 実行時セマンティクス: PropertyDefinitionEvaluation : 正常完了で unused を含むか、または突然の完了
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
PropertyDefinitionList :
PropertyDefinitionList
,
PropertyDefinition
引数 object で PropertyDefinitionList の PropertyDefinitionEvaluation を実行。 引数 object で PropertyDefinition の PropertyDefinitionEvaluation を実行。 unused を返す。
PropertyDefinition :
...
AssignmentExpression
exprValue を AssignmentExpression の Evaluation。fromValue を ? GetValue (exprValue )。excludedNames を新しい空 List 。? CopyDataProperties (object , fromValue , excludedNames ) を実行。 unused を返す。
PropertyDefinition : IdentifierReference
propName を IdentifierReference の StringValue。exprValue を IdentifierReference の Evaluation。propValue を ? GetValue (exprValue )。事前条件: object は通常 (ordinary) で拡張可能で非 configurable プロパティを持たない。 ! CreateDataPropertyOrThrow (object , propName , propValue ) を実行。 unused を返す。
PropertyDefinition :
PropertyName
:
AssignmentExpression
propKey を PropertyName の Evaluation。この PropertyDefinition が ParseJSON のため評価中の Script 内に含まれるなら(ParseJSON の step 6 参照)isProtoSetter を false 。 それ以外で propKey が "__proto__" かつ PropertyName の IsComputedPropertyKey が false ならisProtoSetter を true 。 それ以外isProtoSetter を false 。 IsAnonymousFunctionDefinition(AssignmentExpression ) が true かつ isProtoSetter が false ならpropValue を 引数 propKey で AssignmentExpression の NamedEvaluation。 それ以外exprValueRef を AssignmentExpression の Evaluation。propValue を ? GetValue (exprValueRef )。 isProtoSetter が true ならpropValue が Object か null なら! object .[[SetPrototypeOf]] (propValue ) を実行。 unused を返す。事前条件: object は通常で拡張可能、非 configurable プロパティなし。 ! CreateDataPropertyOrThrow (object , propKey , propValue ) を実行。 unused を返す。
PropertyDefinition : MethodDefinition
引数 object , true で MethodDefinition の MethodDefinitionEvaluation を実行。 unused を返す。
13.2.6 関数定義式 (Function Defining Expressions)
15.2 の
PrimaryExpression : FunctionExpression
を参照。
15.5 の
PrimaryExpression : GeneratorExpression
を参照。
15.7 の
PrimaryExpression : ClassExpression
を参照。
15.8 の
PrimaryExpression : AsyncFunctionExpression
を参照。
15.6 の
PrimaryExpression : AsyncGeneratorExpression
を参照。
13.2.7 正規表現リテラル (Regular Expression Literals)
構文 (Syntax)
12.9.5 を参照。
13.2.7.1 静的セマンティクス: 早期エラー (Early Errors)
PrimaryExpression : RegularExpressionLiteral
13.2.7.2
静的セマンティクス: IsValidRegularExpressionLiteral (
literal : RegularExpressionLiteral Parse Node,
): Boolean
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
flags を literal の FlagText とする。flags に d
, g
, i
, m
, s
, u
, v
, y
以外のコードポイントが含まれるか、同一コードポイントが複数回含まれるなら false を返す。flags が u
を含むなら u = true 、そうでなければ false 。flags が v
を含むなら v = true 、そうでなければ false 。patternText を literal の BodyText とする。u が false かつ v が false ならstringValue を CodePointsToString(patternText )。patternText を stringValue の 16-bit 要素を Unicode BMP コードポイントとして逐次解釈した結果のコードポイント列に設定(UTF-16 デコードは行わない)。parseResult を ParsePattern(patternText , u , v )。parseResult が Parse Node なら true 、そうでなければ false を返す。
13.2.7.3 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
PrimaryExpression : RegularExpressionLiteral
pattern を CodePointsToString(BodyText of RegularExpressionLiteral )。flags を CodePointsToString(FlagText of RegularExpressionLiteral )。! RegExpCreate (pattern , flags ) を返す。
13.2.8 テンプレートリテラル (Template Literals)
構文 (Syntax)
TemplateLiteral [Yield, Await, Tagged] :
NoSubstitutionTemplate
SubstitutionTemplate [?Yield, ?Await, ?Tagged]
SubstitutionTemplate [Yield, Await, Tagged] :
TemplateHead
Expression [+In, ?Yield, ?Await]
TemplateSpans [?Yield, ?Await, ?Tagged]
TemplateSpans [Yield, Await, Tagged] :
TemplateTail
TemplateMiddleList [?Yield, ?Await, ?Tagged]
TemplateTail
TemplateMiddleList [Yield, Await, Tagged] :
TemplateMiddle
Expression [+In, ?Yield, ?Await]
TemplateMiddleList [?Yield, ?Await, ?Tagged]
TemplateMiddle
Expression [+In, ?Yield, ?Await]
13.2.8.1 静的セマンティクス: 早期エラー (Early Errors)
TemplateLiteral [Yield, Await, Tagged] : NoSubstitutionTemplate
TemplateLiteral [Yield, Await, Tagged] : SubstitutionTemplate [?Yield, ?Await, ?Tagged]
SubstitutionTemplate [Yield, Await, Tagged] :
TemplateHead
Expression [+In, ?Yield, ?Await]
TemplateSpans [?Yield, ?Await, ?Tagged]
TemplateSpans [Yield, Await, Tagged] : TemplateTail
TemplateMiddleList [Yield, Await, Tagged] :
TemplateMiddle
Expression [+In, ?Yield, ?Await]
TemplateMiddleList [?Yield, ?Await, ?Tagged]
TemplateMiddle
Expression [+In, ?Yield, ?Await]
13.2.8.2 静的セマンティクス: TemplateStrings : String または undefined を含む List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
TemplateLiteral : NoSubstitutionTemplate
« TemplateString(NoSubstitutionTemplate , raw ) » を返す。
SubstitutionTemplate :
TemplateHead
Expression
TemplateSpans
head を « TemplateString(TemplateHead , raw ) »。tail を 引数 raw で TemplateSpans の TemplateStrings。head と tail のリスト結合 を返す。
TemplateSpans : TemplateTail
« TemplateString(TemplateTail , raw ) » を返す。
TemplateSpans :
TemplateMiddleList
TemplateTail
middle を 引数 raw で TemplateMiddleList の TemplateStrings。tail を « TemplateString(TemplateTail , raw ) »。middle と tail のリスト結合 を返す。
TemplateMiddleList :
TemplateMiddle
Expression
« TemplateString(TemplateMiddle , raw ) » を返す。
TemplateMiddleList :
TemplateMiddleList
TemplateMiddle
Expression
front を 引数 raw で TemplateMiddleList の TemplateStrings。last を « TemplateString(TemplateMiddle , raw ) »。front と last のリスト結合 を返す。
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
raw が true ならstring を templateToken の TRV。それ以外string を templateToken の TV。 string を返す。
Note
raw が false かつ templateToken が NotEscapeSequence を含む場合、この操作は undefined を返す。それ以外は String を返す。
13.2.8.4 GetTemplateObject ( templateLiteral )
The abstract operation GetTemplateObject takes argument templateLiteral (Parse Node) and returns Array. It performs the following steps when called:
realm を現在の Realm Record 。templateRegistry を realm .[[TemplateMap]] 。templateRegistry の各要素 e についてe .[[Site]] が templateLiteral と同じ Parse Node ならe .[[Array]] を返す。rawStrings を 引数 true で templateLiteral の TemplateStrings。事前条件: rawStrings は String の List 。 cookedStrings を 引数 false で templateLiteral の TemplateStrings。count を cookedStrings の要素数。事前条件: count ≤ 232 -1。 template を ! ArrayCreate (count )。rawObj を ! ArrayCreate (count )。index を 0。index < count の間繰り返す:prop を ! ToString (𝔽 (index ))。cookedValue を cookedStrings [index ]。! DefinePropertyOrThrow (template , prop , PropertyDescriptor { [[Value]] : cookedValue , [[Writable]] : false , [[Enumerable]] : true , [[Configurable]] : false })。 rawValue を String 値 rawStrings [index ]。! DefinePropertyOrThrow (rawObj , prop , PropertyDescriptor { [[Value]] : rawValue , [[Writable]] : false , [[Enumerable]] : true , [[Configurable]] : false })。 index を index + 1。! SetIntegrityLevel (rawObj , frozen )。 ! DefinePropertyOrThrow (template , "raw" , PropertyDescriptor { [[Value]] : rawObj , [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false })。 ! SetIntegrityLevel (template , frozen )。 Record { [[Site]] : templateLiteral , [[Array]] : template } を realm .[[TemplateMap]] に追加。template を返す。
Note 1
テンプレートオブジェクトの生成は突然の完了を引き起こさない。
Note 2
ある realm のプログラムコード内の各 TemplateLiteral はタグ付きテンプレート評価 (13.2.8.6 ) に用いられる一意のテンプレートオブジェクトと関連付けられる。テンプレートオブジェクトは凍結され、同一タグ付きテンプレート評価では同じオブジェクトが再利用される。テンプレートオブジェクトが最初の評価時に遅延生成されるか、事前に eager に生成されるかは ECMAScript コードからは観測不能で実装依存。
Note 3
将来の版ではテンプレートオブジェクトに追加の列挙不可プロパティを定義する可能性がある。
13.2.8.5 実行時セマンティクス: SubstitutionEvaluation
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
TemplateSpans : TemplateTail
新しい空 List を返す。
TemplateSpans :
TemplateMiddleList
TemplateTail
TemplateMiddleList の SubstitutionEvaluation を返す。
TemplateMiddleList :
TemplateMiddle
Expression
subRef を Expression の Evaluation。sub を ? GetValue (subRef )。« sub » を返す。
TemplateMiddleList :
TemplateMiddleList
TemplateMiddle
Expression
preceding を TemplateMiddleList の SubstitutionEvaluation。nextRef を Expression の Evaluation。next を ? GetValue (nextRef )。preceding と « next » のリスト結合 を返す。
13.2.8.6 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
TemplateLiteral : NoSubstitutionTemplate
12.9.6 で定義される NoSubstitutionTemplate の TV を返す。
SubstitutionTemplate :
TemplateHead
Expression
TemplateSpans
head を 12.9.6 で定義される TemplateHead の TV。subRef を Expression の Evaluation。sub を ? GetValue (subRef )。middle を ? ToString (sub )。tail を TemplateSpans の Evaluation。head , middle , tail の文字列連結 を返す。
Note 1
Expression 値への文字列変換は +
演算子ではなく String.prototype.concat
と同様のセマンティクス。
TemplateSpans : TemplateTail
12.9.6 で定義される TemplateTail の TV を返す。
TemplateSpans :
TemplateMiddleList
TemplateTail
head を TemplateMiddleList の Evaluation。tail を 12.9.6 で定義される TemplateTail の TV。head と tail の文字列連結 を返す。
TemplateMiddleList :
TemplateMiddle
Expression
head を 12.9.6 で定義される TemplateMiddle の TV。subRef を Expression の Evaluation。sub を ? GetValue (subRef )。middle を ? ToString (sub )。head と middle の文字列連結 を返す。
Note 2
Expression 値への文字列変換は +
演算子ではなく String.prototype.concat
と同様。
TemplateMiddleList :
TemplateMiddleList
TemplateMiddle
Expression
rest を TemplateMiddleList の Evaluation。middle を 12.9.6 で定義される TemplateMiddle の TV。subRef を Expression の Evaluation。sub を ? GetValue (subRef )。last を ? ToString (sub )。rest , middle , last の文字列連結 を返す。
Note 3
Expression 値への文字列変換は String.prototype.concat
と同様で +
演算子とは異なる。
13.2.9 グルーピング演算子 (The Grouping Operator)
13.2.9.1 静的セマンティクス: 早期エラー (Early Errors)
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
13.2.9.2 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
expr を CoverParenthesizedExpressionAndArrowParameterList により覆われる ParenthesizedExpression とする。expr の Evaluation を返す (必要なら ? を付す)。
ParenthesizedExpression :
(
Expression
)
Expression の Evaluation を返す(Reference 型であり得る)。
Note
このアルゴリズムは Expression の Evaluation に GetValue を適用しない。主な動機は delete
や typeof
などの演算子をかっこ付き式に適用可能とするためである。
13.3 左辺式 (Left-Hand-Side Expressions)
構文 (Syntax)
MemberExpression [Yield, Await] :
PrimaryExpression [?Yield, ?Await]
MemberExpression [?Yield, ?Await]
[
Expression [+In, ?Yield, ?Await]
]
MemberExpression [?Yield, ?Await]
.
IdentifierName
MemberExpression [?Yield, ?Await]
TemplateLiteral [?Yield, ?Await, +Tagged]
SuperProperty [?Yield, ?Await]
MetaProperty
new
MemberExpression [?Yield, ?Await]
Arguments [?Yield, ?Await]
MemberExpression [?Yield, ?Await]
.
PrivateIdentifier
SuperProperty [Yield, Await] :
super
[
Expression [+In, ?Yield, ?Await]
]
super
.
IdentifierName
MetaProperty :
NewTarget
ImportMeta
NewTarget :
new
.
target
ImportMeta :
import
.
meta
NewExpression [Yield, Await] :
MemberExpression [?Yield, ?Await]
new
NewExpression [?Yield, ?Await]
CallExpression [Yield, Await] :
CoverCallExpressionAndAsyncArrowHead [?Yield, ?Await]
SuperCall [?Yield, ?Await]
ImportCall [?Yield, ?Await]
CallExpression [?Yield, ?Await]
Arguments [?Yield, ?Await]
CallExpression [?Yield, ?Await]
[
Expression [+In, ?Yield, ?Await]
]
CallExpression [?Yield, ?Await]
.
IdentifierName
CallExpression [?Yield, ?Await]
TemplateLiteral [?Yield, ?Await, +Tagged]
CallExpression [?Yield, ?Await]
.
PrivateIdentifier
SuperCall [Yield, Await] :
super
Arguments [?Yield, ?Await]
ImportCall [Yield, Await] :
import
(
AssignmentExpression [+In, ?Yield, ?Await]
,opt
)
import
(
AssignmentExpression [+In, ?Yield, ?Await]
,
AssignmentExpression [+In, ?Yield, ?Await]
,opt
)
Arguments [Yield, Await] :
(
)
(
ArgumentList [?Yield, ?Await]
)
(
ArgumentList [?Yield, ?Await]
,
)
ArgumentList [Yield, Await] :
AssignmentExpression [+In, ?Yield, ?Await]
...
AssignmentExpression [+In, ?Yield, ?Await]
ArgumentList [?Yield, ?Await]
,
AssignmentExpression [+In, ?Yield, ?Await]
ArgumentList [?Yield, ?Await]
,
...
AssignmentExpression [+In, ?Yield, ?Await]
OptionalExpression [Yield, Await] :
MemberExpression [?Yield, ?Await]
OptionalChain [?Yield, ?Await]
CallExpression [?Yield, ?Await]
OptionalChain [?Yield, ?Await]
OptionalExpression [?Yield, ?Await]
OptionalChain [?Yield, ?Await]
OptionalChain [Yield, Await] :
?.
Arguments [?Yield, ?Await]
?.
[
Expression [+In, ?Yield, ?Await]
]
?.
IdentifierName
?.
TemplateLiteral [?Yield, ?Await, +Tagged]
?.
PrivateIdentifier
OptionalChain [?Yield, ?Await]
Arguments [?Yield, ?Await]
OptionalChain [?Yield, ?Await]
[
Expression [+In, ?Yield, ?Await]
]
OptionalChain [?Yield, ?Await]
.
IdentifierName
OptionalChain [?Yield, ?Await]
TemplateLiteral [?Yield, ?Await, +Tagged]
OptionalChain [?Yield, ?Await]
.
PrivateIdentifier
LeftHandSideExpression [Yield, Await] :
NewExpression [?Yield, ?Await]
CallExpression [?Yield, ?Await]
OptionalExpression [?Yield, ?Await]
補助構文 (Supplemental Syntax)
次の生成規則インスタンスを処理する際
CallExpression : CoverCallExpressionAndAsyncArrowHead
CoverCallExpressionAndAsyncArrowHead の解釈は以下の文法で精緻化される:
CallMemberExpression [Yield, Await] :
MemberExpression [?Yield, ?Await]
Arguments [?Yield, ?Await]
13.3.1 静的セマンティクス (Static Semantics)
13.3.1.1 静的セマンティクス: 早期エラー (Early Errors)
OptionalChain :
?.
TemplateLiteral
OptionalChain
TemplateLiteral
この生成規則にソーステキストがマッチした場合は構文エラー。
Note
この生成規則は次のコードに自動セミコロン挿入規則(12.10 )が適用されて 2 つの有効な文として解釈されることを防ぐために存在する:
a?.b
`c`
これはオプショナルチェイニングを用いない類似コードとの一貫性を保つ目的である:
a.b
`c`
後者は自動セミコロン挿入が適用されず有効な文である。
ImportMeta :
import
.
meta
13.3.2 プロパティアクセッサ (Property Accessors)
Note
プロパティは名前でアクセスされ、ドット記法:
またはブラケット記法を用いる:
ドット記法は次の構文変換で説明される:
これは動作上次と同一である:
同様に
は次と同一である:
ここで <identifier-name-string > は IdentifierName の StringValue である。
13.3.2.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
MemberExpression :
MemberExpression
[
Expression
]
baseReference を ? MemberExpression の Evaluation。baseValue を ? GetValue (baseReference )。strict を IsStrict(this MemberExpression ) とする。? EvaluatePropertyAccessWithExpressionKey (baseValue , Expression , strict ) を返す。
MemberExpression :
MemberExpression
.
IdentifierName
baseReference を ? MemberExpression の Evaluation。baseValue を ? GetValue (baseReference )。strict を IsStrict(this MemberExpression )。EvaluatePropertyAccessWithIdentifierKey (baseValue , IdentifierName , strict ) を返す。
MemberExpression :
MemberExpression
.
PrivateIdentifier
baseReference を ? MemberExpression の Evaluation。baseValue を ? GetValue (baseReference )。fieldNameString を PrivateIdentifier の StringValue とする。MakePrivateReference (baseValue , fieldNameString ) を返す。
CallExpression :
CallExpression
[
Expression
]
baseReference を ? CallExpression の Evaluation。baseValue を ? GetValue (baseReference )。strict を IsStrict(this CallExpression )。? EvaluatePropertyAccessWithExpressionKey (baseValue , Expression , strict ) を返す。
CallExpression :
CallExpression
.
IdentifierName
baseReference を ? CallExpression の Evaluation。baseValue を ? GetValue (baseReference )。strict を IsStrict(this CallExpression )。EvaluatePropertyAccessWithIdentifierKey (baseValue , IdentifierName , strict ) を返す。
CallExpression :
CallExpression
.
PrivateIdentifier
baseReference を ? CallExpression の Evaluation。baseValue を ? GetValue (baseReference )。fieldNameString を PrivateIdentifier の StringValue。MakePrivateReference (baseValue , fieldNameString ) を返す。
13.3.3 EvaluatePropertyAccessWithExpressionKey ( baseValue , expression , strict )
The abstract operation EvaluatePropertyAccessWithExpressionKey takes arguments baseValue (ECMAScript 言語値), expression (Expression Parse Node), and strict (Boolean) and returns 正常完了で Reference Record を含むか、または突然の完了. It performs the following steps when called:
propertyNameReference を ? expression の Evaluation。propertyNameValue を ? GetValue (propertyNameReference )。注: 多くの場合この直後に ToPropertyKey が propertyNameValue に対して行われるが、a[b] = c
の場合は c
の評価後まで行われない。 Reference Record { [[Base]] : baseValue , [[ReferencedName]] : propertyNameValue , [[Strict]] : strict , [[ThisValue]] : empty } を返す。
13.3.4 EvaluatePropertyAccessWithIdentifierKey ( baseValue , identifierName , strict )
The abstract operation EvaluatePropertyAccessWithIdentifierKey takes arguments baseValue (ECMAScript 言語値), identifierName (IdentifierName Parse Node), and strict (Boolean) and returns Reference Record . It performs the following steps when called:
propertyNameString を identifierName の StringValue。Reference Record { [[Base]] : baseValue , [[ReferencedName]] : propertyNameString , [[Strict]] : strict , [[ThisValue]] : empty } を返す。
13.3.5 new
演算子 (The new
Operator)
13.3.5.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
NewExpression :
new
NewExpression
? EvaluateNew (NewExpression , empty ) を返す。
MemberExpression :
new
MemberExpression
Arguments
? EvaluateNew (MemberExpression , Arguments ) を返す。
13.3.5.1.1 EvaluateNew ( constructExpr , arguments )
The abstract operation EvaluateNew takes arguments constructExpr (NewExpression Parse Node または MemberExpression Parse Node) and arguments (empty 又は Arguments Parse Node) and returns 正常完了で ECMAScript 言語値を含むか、または突然の完了. It performs the following steps when called:
ref を ? constructExpr の Evaluation。constructor を ? GetValue (ref )。arguments が empty ならargList を新しい空 List 。それ以外argList を ? ArgumentListEvaluation(arguments )。 IsConstructor (constructor ) が false なら TypeError 例外を投げる。? Construct(constructor , argList ) を返す。
13.3.6 関数呼び出し (Function Calls)
13.3.6.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
CallExpression : CoverCallExpressionAndAsyncArrowHead
expr を CoverCallExpressionAndAsyncArrowHead により覆われる CallMemberExpression とする。memberExpr を expr の MemberExpression 。arguments を expr の Arguments 。ref を ? memberExpr の Evaluation。func を ? GetValue (ref )。もし ref が Reference Record で IsPropertyReference (ref ) が false かつ ref .[[ReferencedName]] が "eval" ならSameValue (func , %eval% ) が true ならargList を ? ArgumentListEvaluation(arguments )。argList が要素を持たないなら undefined を返す。evalArg を argList の最初の要素。IsStrict(this CallExpression ) が true なら strictCaller = true 、そうでなければ false 。 ? PerformEval (evalArg , strictCaller , true ) を返す。 thisCall を this CallExpression 。tailCall を IsInTailPosition(thisCall )。? EvaluateCall (func , ref , arguments , tailCall ) を返す。
ステップ 6.a.v を実行する CallExpression の評価は direct eval である。
CallExpression :
CallExpression
Arguments
ref を ? CallExpression の Evaluation。func を ? GetValue (ref )。thisCall を this CallExpression 。tailCall を IsInTailPosition(thisCall )。? EvaluateCall (func , ref , Arguments , tailCall ) を返す。
13.3.6.2 EvaluateCall ( func , ref , arguments , tailPosition )
The abstract operation EvaluateCall takes arguments func (ECMAScript 言語値), ref (ECMAScript 言語値または Reference Record ), arguments (Parse Node), and tailPosition (Boolean) and returns 正常完了で ECMAScript 言語値を含むか、または突然の完了. It performs the following steps when called:
もし ref が Reference Record ならIsPropertyReference (ref ) が true ならthisValue を GetThisValue (ref )。それ以外refEnv を ref .[[Base]] 。事前条件: refEnv は Environment Record 。 thisValue を refEnv .WithBaseObject()。 それ以外thisValue を undefined 。 argList を ? ArgumentListEvaluation(arguments )。func が Object でなければ TypeError 例外。IsCallable (func ) が false なら TypeError 例外。tailPosition が true なら PrepareForTailCall () を実行。? Call(func , thisValue , argList ) を返す。
13.3.7 super
キーワード (The super
Keyword)
13.3.7.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
SuperProperty :
super
[
Expression
]
env を GetThisEnvironment ()。actualThis を ? env .GetThisBinding()。propertyNameReference を ? Expression の Evaluation。propertyNameValue を ? GetValue (propertyNameReference )。strict を IsStrict(this SuperProperty )。注: 多くの場合ここですぐ ToPropertyKey が行われるが、super[b] = c
のケースでは c
評価後。 MakeSuperPropertyReference (actualThis , propertyNameValue , strict ) を返す。
SuperProperty :
super
.
IdentifierName
env を GetThisEnvironment ()。actualThis を ? env .GetThisBinding()。propertyKey を IdentifierName の StringValue。strict を IsStrict(this SuperProperty )。MakeSuperPropertyReference (actualThis , propertyKey , strict ) を返す。
SuperCall :
super
Arguments
newTarget を GetNewTarget ()。事前条件: newTarget は constructor。 func を GetSuperConstructor ()。argList を ? ArgumentListEvaluation(Arguments )。IsConstructor (func ) が false なら TypeError 例外。result を ? Construct(func , argList , newTarget )。thisER を GetThisEnvironment ()。事前条件: thisER は Function Environment Record 。 ? BindThisValue (thisER , result )。 F を thisER .[[FunctionObject]] 。事前条件: F は ECMAScript function object。 ? InitializeInstanceElements (result , F )。 result を返す。
13.3.7.2 GetSuperConstructor ( )
The abstract operation GetSuperConstructor takes no arguments and returns ECMAScript 言語値. It performs the following steps when called:
envRec を GetThisEnvironment ()。事前条件: envRec は Function Environment Record 。 activeFunction を envRec .[[FunctionObject]] 。事前条件: activeFunction は ECMAScript function object。 superConstructor を ! activeFunction .[[GetPrototypeOf]] ()。superConstructor を返す。
13.3.7.3 MakeSuperPropertyReference ( actualThis , propertyKey , strict )
The abstract operation MakeSuperPropertyReference takes arguments actualThis (ECMAScript 言語値), propertyKey (ECMAScript 言語値), and strict (Boolean) and returns Super Reference Record . It performs the following steps when called:
env を GetThisEnvironment ()。事前条件: env .HasSuperBinding() は true 。 事前条件: env は Function Environment Record 。 baseValue を GetSuperBase (env )。Reference Record { [[Base]] : baseValue , [[ReferencedName]] : propertyKey , [[Strict]] : strict , [[ThisValue]] : actualThis } を返す。
13.3.8 引数リスト (Argument Lists)
Note
13.3.8.1 実行時セマンティクス: ArgumentListEvaluation — 正常完了で ECMAScript 言語値の List または突然の完了
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Arguments :
(
)
新しい空 List を返す。
ArgumentList : AssignmentExpression
ref を ? AssignmentExpression の Evaluation。arg を ? GetValue (ref )。« arg » を返す。
ArgumentList :
...
AssignmentExpression
list を新しい空 List 。spreadRef を ? AssignmentExpression の Evaluation。spreadObj を ? GetValue (spreadRef )。iteratorRecord を ? GetIterator (spreadObj , sync )。反復:next を ? IteratorStepValue (iteratorRecord )。next が done なら list を返す。next を list に追加。
ArgumentList :
ArgumentList
,
AssignmentExpression
precedingArgs を ? ArgumentListEvaluation(ArgumentList )。ref を ? AssignmentExpression の Evaluation。arg を ? GetValue (ref )。precedingArgs と « arg » のリスト結合 を返す。
ArgumentList :
ArgumentList
,
...
AssignmentExpression
precedingArgs を ? ArgumentListEvaluation(ArgumentList )。spreadRef を ? AssignmentExpression の Evaluation。iteratorRecord を ? GetIterator (? GetValue (spreadRef ), sync )。反復:next を ? IteratorStepValue (iteratorRecord )。next が done なら precedingArgs を返す。next を precedingArgs に追加。
TemplateLiteral : NoSubstitutionTemplate
templateLiteral を this TemplateLiteral 。siteObj を GetTemplateObject (templateLiteral )。« siteObj » を返す。
TemplateLiteral : SubstitutionTemplate
templateLiteral を this TemplateLiteral 。siteObj を GetTemplateObject (templateLiteral )。remaining を ? ArgumentListEvaluation(SubstitutionTemplate )。« siteObj » と remaining のリスト結合 を返す。
SubstitutionTemplate :
TemplateHead
Expression
TemplateSpans
firstSubRef を ? Expression の Evaluation。firstSub を ? GetValue (firstSubRef )。restSub を ? SubstitutionEvaluation(TemplateSpans )。事前条件: restSub は(空かもしれない)List 。 « firstSub » と restSub のリスト結合 を返す。
13.3.9 オプショナルチェイン (Optional Chains)
Note オプショナルチェインは 1 つ以上のプロパティアクセスおよび関数呼び出しの連鎖で、最初のものが ?.
トークンで始まる。
13.3.9.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
OptionalExpression :
MemberExpression
OptionalChain
baseReference を ? MemberExpression の Evaluation。baseValue を ? GetValue (baseReference )。baseValue が undefined または null ならundefined を返す。? ChainEvaluation(OptionalChain , 引数 baseValue , baseReference ) を返す。
OptionalExpression :
CallExpression
OptionalChain
baseReference を ? CallExpression の Evaluation。baseValue を ? GetValue (baseReference )。baseValue が undefined または null ならundefined を返す。? ChainEvaluation(OptionalChain , 引数 baseValue , baseReference ) を返す。
OptionalExpression :
OptionalExpression
OptionalChain
baseReference を ? OptionalExpression の Evaluation。baseValue を ? GetValue (baseReference )。baseValue が undefined または null ならundefined を返す。? ChainEvaluation(OptionalChain , 引数 baseValue , baseReference ) を返す。
13.3.9.2 実行時セマンティクス: ChainEvaluation : 正常完了で ECMAScript 言語値または Reference Record を含むか、または突然の完了
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
OptionalChain :
?.
Arguments
thisChain を this OptionalChain 。tailCall を IsInTailPosition(thisChain )。? EvaluateCall (baseValue , baseReference , Arguments , tailCall ) を返す。
OptionalChain :
?.
[
Expression
]
strict を IsStrict(this OptionalChain )。? EvaluatePropertyAccessWithExpressionKey (baseValue , Expression , strict ) を返す。
OptionalChain :
?.
IdentifierName
strict を IsStrict(this OptionalChain )。EvaluatePropertyAccessWithIdentifierKey (baseValue , IdentifierName , strict ) を返す。
OptionalChain :
?.
PrivateIdentifier
fieldNameString を PrivateIdentifier の StringValue。MakePrivateReference (baseValue , fieldNameString ) を返す。
OptionalChain :
OptionalChain
Arguments
optionalChain を OptionalChain 。newReference を ? ChainEvaluation(optionalChain , 引数 baseValue , baseReference )。newValue を ? GetValue (newReference )。thisChain を this OptionalChain 。tailCall を IsInTailPosition(thisChain )。? EvaluateCall (newValue , newReference , Arguments , tailCall ) を返す。
OptionalChain :
OptionalChain
[
Expression
]
optionalChain を OptionalChain 。newReference を ? ChainEvaluation(optionalChain , 引数 baseValue , baseReference )。newValue を ? GetValue (newReference )。strict を IsStrict(this OptionalChain )。? EvaluatePropertyAccessWithExpressionKey (newValue , Expression , strict ) を返す。
OptionalChain :
OptionalChain
.
IdentifierName
optionalChain を OptionalChain 。newReference を ? ChainEvaluation(optionalChain , 引数 baseValue , baseReference )。newValue を ? GetValue (newReference )。strict を IsStrict(this OptionalChain )。EvaluatePropertyAccessWithIdentifierKey (newValue , IdentifierName , strict ) を返す。
OptionalChain :
OptionalChain
.
PrivateIdentifier
optionalChain を OptionalChain 。newReference を ? ChainEvaluation(optionalChain , 引数 baseValue , baseReference )。newValue を ? GetValue (newReference )。fieldNameString を PrivateIdentifier の StringValue。MakePrivateReference (newValue , fieldNameString ) を返す。
13.3.10 Import 呼び出し (Import Calls)
13.3.10.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
ImportCall :
import
(
AssignmentExpression
,opt
)
? EvaluateImportCall (AssignmentExpression ) を返す。
ImportCall :
import
(
AssignmentExpression
,
AssignmentExpression
,opt
)
? EvaluateImportCall (the first AssignmentExpression , the second AssignmentExpression ) を返す。
13.3.10.2 EvaluateImportCall ( specifierExpression [ , optionsExpression ] )
The abstract operation EvaluateImportCall takes argument specifierExpression (Parse Node) and optional argument optionsExpression (Parse Node) and returns 正常完了で Promise を含むか、または突然の完了. It performs the following steps when called:
referrer を GetActiveScriptOrModule () とする。もし referrer が null であれば、referrer を現在の Realm Record に設定する。 specifierRef を ? specifierExpression の評価結果とする。specifier を ? GetValue (specifierRef ) とする。もし optionsExpression が存在するなら、optionsRef を ? optionsExpression の評価結果とする。options を ? GetValue (optionsRef ) とする。 そうでなければ、options を undefined とする。 promiseCapability を ! NewPromiseCapability (%Promise% ) とする。specifierString を Completion (ToString (specifier )) とする。IfAbruptRejectPromise (specifierString , promiseCapability )。attributes を新しい空の List とする。もし options が undefined でないなら、もし options が Object でないなら、! Call(promiseCapability .[[Reject]] , undefined , « 新たに生成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。 attributesObj を Completion (Get (options , "with" )) とする。IfAbruptRejectPromise (attributesObj , promiseCapability )。もし attributesObj が undefined でないなら、もし attributesObj が Object でないなら、! Call(promiseCapability .[[Reject]] , undefined , « 新たに生成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。 entries を Completion (EnumerableOwnProperties (attributesObj , key+value )) とする。IfAbruptRejectPromise (entries , promiseCapability )。entries の各要素 entry について、次を行うkey を ! Get (entry , "0" ) とする。value を ! Get (entry , "1" ) とする。もし key が String なら、もし value が String でないなら、! Call(promiseCapability .[[Reject]] , undefined , « 新たに生成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。 ImportAttribute Record { [[Key]] : key , [[Value]] : value } を attributes に追加する。 もし AllImportAttributesSupported (attributes ) が false なら、! Call(promiseCapability .[[Reject]] , undefined , « 新たに生成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。 attributes をその各要素の [[Key]] フィールドの文字順 (各値を UTF-16 のコード単位列として扱う) に従ってソートする。注: このソートは、ホスト が属性の列挙順序に基づいて挙動を変更することを禁じられているという点でのみ観測可能である。 moduleRequest を新しい ModuleRequest Record { [[Specifier]] : specifierString , [[Attributes]] : attributes } とする。HostLoadImportedModule (referrer , moduleRequest , empty , promiseCapability ) を実行する。promiseCapability .[[Promise]] を返す。
13.3.10.3 ContinueDynamicImport ( promiseCapability , moduleCompletion )
The abstract operation ContinueDynamicImport takes arguments promiseCapability (PromiseCapability Record ) and moduleCompletion (Module Record を含む正常完了または throw 完了) and returns unused . It performs the following steps when called:
moduleCompletion が abrupt completion なら! Call(promiseCapability .[[Reject]] , undefined , « moduleCompletion .[[Value]] »)。 unused を返す。module を moduleCompletion .[[Value]] 。loadPromise を module .LoadRequestedModules()。rejectedClosure を (reason ) をパラメータとし promiseCapability を捕捉する Abstract Closure とし、呼ばれたら:! Call(promiseCapability .[[Reject]] , undefined , « reason »)。 Return NormalCompletion (undefined )。 onRejected を CreateBuiltinFunction (rejectedClosure , 1, "" , « »)。linkAndEvaluateClosure をパラメータなしで module , promiseCapability , onRejected を捕捉する Abstract Closure とし、呼ばれたら:link を Completion (module .Link())。link が abrupt なら! Call(promiseCapability .[[Reject]] , undefined , « link .[[Value]] »)。 Return NormalCompletion (undefined )。 evaluatePromise を module .Evaluate()。fulfilledClosure をパラメータなしで module , promiseCapability を捕捉する Abstract Closure とし、呼ばれたら:namespace を GetModuleNamespace (module )。! Call (promiseCapability .[[Resolve]] , undefined , « namespace »)。 Return NormalCompletion (undefined )。 onFulfilled を CreateBuiltinFunction (fulfilledClosure , 0, "" , « »)。PerformPromiseThen (evaluatePromise , onFulfilled , onRejected ) を実行。unused を返す。linkAndEvaluate を CreateBuiltinFunction (linkAndEvaluateClosure , 0, "" , « »)。PerformPromiseThen (loadPromise , linkAndEvaluate , onRejected ) を実行。unused を返す。
13.3.11 タグ付きテンプレート (Tagged Templates)
Note
タグ付きテンプレートは TemplateLiteral (13.2.8 ) から導出される引数を持つ関数呼び出しである。実際の引数はテンプレートオブジェクト (13.2.8.4 ) と TemplateLiteral 内に埋め込まれた式の評価結果を含む。
13.3.11.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
MemberExpression :
MemberExpression
TemplateLiteral
tagRef を ? MemberExpression の Evaluation。tagFunc を ? GetValue (tagRef )。thisCall を this MemberExpression 。tailCall を IsInTailPosition(thisCall )。? EvaluateCall (tagFunc , tagRef , TemplateLiteral , tailCall ) を返す。
CallExpression :
CallExpression
TemplateLiteral
tagRef を ? CallExpression の Evaluation。tagFunc を ? GetValue (tagRef )。thisCall を this CallExpression 。tailCall を IsInTailPosition(thisCall )。? EvaluateCall (tagFunc , tagRef , TemplateLiteral , tailCall ) を返す。
13.3.12 メタプロパティ (Meta Properties)
13.3.12.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
NewTarget :
new
.
target
GetNewTarget () を返す。
ImportMeta :
import
.
meta
module を GetActiveScriptOrModule ()。事前条件: module は Source Text Module Record 。 importMeta を module .[[ImportMeta]] 。importMeta が empty ならimportMeta を OrdinaryObjectCreate (null )。importMetaValues を HostGetImportMetaProperties (module )。各 Record { [[Key]] , [[Value]] } p について! CreateDataPropertyOrThrow (importMeta , p .[[Key]] , p .[[Value]] )。 HostFinalizeImportMeta (importMeta , module ) を実行。module .[[ImportMeta]] に importMeta を設定。importMeta を返す。それ以外事前条件: importMeta は Object。 importMeta を返す。
13.3.12.1.1 HostGetImportMetaProperties ( moduleRecord )
The host-defined abstract operation HostGetImportMetaProperties takes argument moduleRecord (Module Record ) and returns 各 [[Key]] (property key), [[Value]] (ECMAScript 言語値) を持つ Record の List .
デフォルト実装は新しい空 List を返す。
13.3.12.1.2 HostFinalizeImportMeta ( importMeta , moduleRecord )
The host-defined abstract operation HostFinalizeImportMeta takes arguments importMeta (Object) and moduleRecord (Module Record ) and returns unused .
多くのホスト は HostGetImportMetaProperties を定義するだけで済み、HostFinalizeImportMeta のデフォルト動作をそのまま利用できる。HostFinalizeImportMeta は公開前に直接オブジェクトを操作する必要があるホスト 向けの「エスケープハッチ」を提供する。
デフォルト実装は unused を返す。
13.4 更新式 (Update Expressions)
構文 (Syntax)
UpdateExpression [Yield, Await] :
LeftHandSideExpression [?Yield, ?Await]
LeftHandSideExpression [?Yield, ?Await]
[no LineTerminator here]
++
LeftHandSideExpression [?Yield, ?Await]
[no LineTerminator here]
--
++
UnaryExpression [?Yield, ?Await]
--
UnaryExpression [?Yield, ?Await]
13.4.1 静的セマンティクス: 早期エラー (Static Semantics: Early Errors)
UpdateExpression :
LeftHandSideExpression
++
LeftHandSideExpression
--
UpdateExpression :
++
UnaryExpression
--
UnaryExpression
13.4.2 後置インクリメント演算子 (Postfix Increment Operator)
13.4.2.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
UpdateExpression :
LeftHandSideExpression
++
lhs を ? LeftHandSideExpression の Evaluation とする。LeftHandSideExpression の AssignmentTargetType が web-compat なら ReferenceError 例外を投げる。oldValue を ? ToNumeric (? GetValue (lhs )) とする。oldValue が Number ならnewValue を Number::add (oldValue , 1 𝔽 ) とする。そうでなければAssert : oldValue は BigInt である。newValue を BigInt::add (oldValue , 1 ℤ ) とする。 ? PutValue (lhs , newValue ) を実行する。 oldValue を返す。
13.4.3 後置デクリメント演算子 (Postfix Decrement Operator)
13.4.3.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
UpdateExpression :
LeftHandSideExpression
--
lhs を ? LeftHandSideExpression の Evaluation とする。LeftHandSideExpression の AssignmentTargetType が web-compat なら ReferenceError 例外を投げる。oldValue を ? ToNumeric (? GetValue (lhs )) とする。oldValue が Number ならnewValue を Number::subtract (oldValue , 1 𝔽 ) とする。そうでなければAssert : oldValue は BigInt。newValue を BigInt::subtract (oldValue , 1 ℤ ) とする。 ? PutValue (lhs , newValue ) を実行。 oldValue を返す。
13.4.4 前置インクリメント演算子 (Prefix Increment Operator)
13.4.4.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
UpdateExpression :
++
UnaryExpression
expr を ? UnaryExpression の Evaluation とする。UnaryExpression の AssignmentTargetType が web-compat なら ReferenceError 例外を投げる。oldValue を ? ToNumeric (? GetValue (expr )) とする。oldValue が Number ならnewValue を Number::add (oldValue , 1 𝔽 ) とする。そうでなければAssert : oldValue は BigInt。newValue を BigInt::add (oldValue , 1 ℤ ) とする。 ? PutValue (expr , newValue ) を実行。 newValue を返す。
13.4.5 前置デクリメント演算子 (Prefix Decrement Operator)
13.4.5.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
UpdateExpression :
--
UnaryExpression
expr を ? UnaryExpression の Evaluation とする。UnaryExpression の AssignmentTargetType が web-compat なら ReferenceError 例外を投げる。oldValue を ? ToNumeric (? GetValue (expr )) とする。oldValue が Number ならnewValue を Number::subtract (oldValue , 1 𝔽 ) とする。そうでなければAssert : oldValue は BigInt。newValue を BigInt::subtract (oldValue , 1 ℤ ) とする。 ? PutValue (expr , newValue ) を実行。 newValue を返す。
13.5 単項演算子 (Unary Operators)
構文 (Syntax)
UnaryExpression [Yield, Await] :
UpdateExpression [?Yield, ?Await]
delete
UnaryExpression [?Yield, ?Await]
void
UnaryExpression [?Yield, ?Await]
typeof
UnaryExpression [?Yield, ?Await]
+
UnaryExpression [?Yield, ?Await]
-
UnaryExpression [?Yield, ?Await]
~
UnaryExpression [?Yield, ?Await]
!
UnaryExpression [?Yield, ?Await]
[+Await]
AwaitExpression [?Yield]
13.5.1 delete
演算子 (The delete
Operator)
13.5.1.1 静的セマンティクス: 早期エラー (Static Semantics: Early Errors)
UnaryExpression :
delete
UnaryExpression
Note
最後の規則により delete (((foo)))
のような式は最初の規則が再帰適用されるため早期エラーになる。
13.5.1.2 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
UnaryExpression :
delete
UnaryExpression
ref を ? UnaryExpression の Evaluation とする。ref が Reference Record でなければ true を返す。IsUnresolvableReference (ref ) が true ならAssert : ref .[[Strict]] は false 。true を返す。IsPropertyReference (ref ) が true ならAssert : IsPrivateReference (ref ) は false 。IsSuperReference (ref ) が true なら ReferenceError 例外を投げる。baseObj を ? ToObject (ref .[[Base]] ) とする。ref .[[ReferencedName]] が property key でなければref .[[ReferencedName]] を ? ToPropertyKey (ref .[[ReferencedName]] ) に設定。deleteStatus を ? baseObj .[[Delete]] (ref .[[ReferencedName]] ) とする。deleteStatus が false かつ ref .[[Strict]] が true なら TypeError 例外。deleteStatus を返す。そうでなければbase を ref .[[Base]] とする。Assert : base は Environment Record 。? base .DeleteBinding (ref .[[ReferencedName]] ) を返す。
Note 1
strict mode コード内で delete
演算子が出現し、その UnaryExpression が変数・引数・関数名への直接参照であると SyntaxError 例外となる。さらに strict mode で delete
の対象プロパティが { [[Configurable]] : false }(または削除不能)である場合 TypeError 例外となる。
Note 2
手順 4.c で生成されうるオブジェクトは上記抽象操作 および通常オブジェクト の [[Delete]] 内部メソッドの外からはアクセスできない。実装はそのオブジェクトの実際の生成を省略してもよい。
13.5.2 void
演算子 (The void
Operator)
13.5.2.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
UnaryExpression :
void
UnaryExpression
expr を ? UnaryExpression の Evaluation とする。? GetValue (expr ) を実行。 undefined を返す。
Note
値を使用しない場合でも副作用が観測され得るため GetValue を呼び出す必要がある。
13.5.3 typeof
演算子 (The typeof
Operator)
13.5.3.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
UnaryExpression :
typeof
UnaryExpression
val を ? UnaryExpression の Evaluation とする。val が Reference Record ならIsUnresolvableReference (val ) が true なら "undefined" を返す。val を ? GetValue (val ) に設定。val が undefined なら "undefined" を返す。val が null なら "object" を返す。val が String なら "string" を返す。val が Symbol なら "symbol" を返す。val が Boolean なら "boolean" を返す。val が Number なら "number" を返す。val が BigInt なら "bigint" を返す。Assert : val は Object。Normative Optional
ホスト がウェブブラウザ又は [[IsHTMLDDA]] 内部スロット をサポートするならval が [[IsHTMLDDA]] 内部スロットを持つ場合 "undefined" を返す。val が [[Call]] 内部メソッドを持つなら "function" を返す。"object" を返す。
13.5.4 単項 +
演算子 (Unary +
Operator)
Note
単項 + 演算子は被演算子を Number 型に変換する。
13.5.4.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
UnaryExpression :
+
UnaryExpression
expr を ? UnaryExpression の Evaluation とする。? ToNumber (? GetValue (expr )) を返す。
13.5.5 単項 -
演算子 (Unary -
Operator)
Note
単項 -
は被演算子を数値へ変換し符号を反転する。+0 𝔽 の反転は -0 𝔽 、-0 𝔽 の反転は +0 𝔽 を生成する。
13.5.5.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
UnaryExpression :
-
UnaryExpression
expr を ? UnaryExpression の Evaluation とする。oldValue を ? ToNumeric (? GetValue (expr )) とする。oldValue が Number ならNumber::unaryMinus (oldValue ) を返す。そうでなければAssert : oldValue は BigInt。BigInt::unaryMinus (oldValue ) を返す。
13.5.6 ビット単位 NOT 演算子 ( ~
) (Bitwise NOT Operator)
13.5.6.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
UnaryExpression :
~
UnaryExpression
expr を ? UnaryExpression の Evaluation とする。oldValue を ? ToNumeric (? GetValue (expr )) とする。oldValue が Number ならNumber::bitwiseNOT (oldValue ) を返す。そうでなければAssert : oldValue は BigInt。BigInt::bitwiseNOT (oldValue ) を返す。
13.5.7 論理 NOT 演算子 ( !
) (Logical NOT Operator)
13.5.7.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
UnaryExpression :
!
UnaryExpression
expr を ? UnaryExpression の Evaluation とする。oldValue を ToBoolean (? GetValue (expr )) とする。oldValue が true なら false を返す。true を返す。
13.6 累乗演算子 (Exponentiation Operator)
構文 (Syntax)
ExponentiationExpression [Yield, Await] :
UnaryExpression [?Yield, ?Await]
UpdateExpression [?Yield, ?Await]
**
ExponentiationExpression [?Yield, ?Await]
13.6.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
ExponentiationExpression :
UpdateExpression
**
ExponentiationExpression
? EvaluateStringOrNumericBinaryExpression (UpdateExpression , **
, ExponentiationExpression ) を返す。
13.7 乗算系演算子 (Multiplicative Operators)
構文 (Syntax)
MultiplicativeExpression [Yield, Await] :
ExponentiationExpression [?Yield, ?Await]
MultiplicativeExpression [?Yield, ?Await]
MultiplicativeOperator
ExponentiationExpression [?Yield, ?Await]
MultiplicativeOperator : one of * / %
Note
*
は乗算で被演算子の積を生成する。
/
は除算で被演算子の商を生成する。
%
は暗黙の除算に基づく剰余を生成する。
13.7.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
MultiplicativeExpression :
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
opText を MultiplicativeOperator にマッチしたソーステキストとする。? EvaluateStringOrNumericBinaryExpression (MultiplicativeExpression , opText , ExponentiationExpression ) を返す。
13.8 加算系演算子 (Additive Operators)
構文 (Syntax)
AdditiveExpression [Yield, Await] :
MultiplicativeExpression [?Yield, ?Await]
AdditiveExpression [?Yield, ?Await]
+
MultiplicativeExpression [?Yield, ?Await]
AdditiveExpression [?Yield, ?Await]
-
MultiplicativeExpression [?Yield, ?Await]
13.8.1 加算演算子 ( +
) (The Addition Operator)
Note
13.8.1.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
AdditiveExpression :
AdditiveExpression
+
MultiplicativeExpression
? EvaluateStringOrNumericBinaryExpression (AdditiveExpression , +
, MultiplicativeExpression ) を返す。
13.8.2 減算演算子 ( -
) (The Subtraction Operator)
Note
13.8.2.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
AdditiveExpression :
AdditiveExpression
-
MultiplicativeExpression
? EvaluateStringOrNumericBinaryExpression (AdditiveExpression , -
, MultiplicativeExpression ) を返す。
13.9 ビットシフト演算子 (Bitwise Shift Operators)
構文 (Syntax)
ShiftExpression [Yield, Await] :
AdditiveExpression [?Yield, ?Await]
ShiftExpression [?Yield, ?Await]
<<
AdditiveExpression [?Yield, ?Await]
ShiftExpression [?Yield, ?Await]
>>
AdditiveExpression [?Yield, ?Await]
ShiftExpression [?Yield, ?Await]
>>>
AdditiveExpression [?Yield, ?Await]
13.9.1 左シフト演算子 ( <<
) (The Left Shift Operator)
Note
左オペランドを右オペランドで指定された回数だけビット左シフトする。
13.9.1.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
ShiftExpression :
ShiftExpression
<<
AdditiveExpression
? EvaluateStringOrNumericBinaryExpression (ShiftExpression , <<
, AdditiveExpression ) を返す。
13.9.2 算術(符号付き)右シフト演算子 ( >>
) (The Signed Right Shift Operator)
Note
左オペランドを右オペランドで指定された回数だけ符号拡張しつつビット右シフトする。
13.9.2.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
ShiftExpression :
ShiftExpression
>>
AdditiveExpression
? EvaluateStringOrNumericBinaryExpression (ShiftExpression , >>
, AdditiveExpression ) を返す。
13.9.3 論理(ゼロ埋め)右シフト演算子 ( >>>
) (The Unsigned Right Shift Operator)
Note
左オペランドを右オペランドで指定回数だけゼロ埋めしつつビット右シフトする。
13.9.3.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
ShiftExpression :
ShiftExpression
>>>
AdditiveExpression
? EvaluateStringOrNumericBinaryExpression (ShiftExpression , >>>
, AdditiveExpression ) を返す。
13.10 関係演算子 (Relational Operators)
Note 1
関係演算子の評価結果は常に Boolean 型で、被演算子間にその関係が成り立つかを示す。
構文 (Syntax)
RelationalExpression [In, Yield, Await] :
ShiftExpression [?Yield, ?Await]
RelationalExpression [?In, ?Yield, ?Await]
<
ShiftExpression [?Yield, ?Await]
RelationalExpression [?In, ?Yield, ?Await]
>
ShiftExpression [?Yield, ?Await]
RelationalExpression [?In, ?Yield, ?Await]
<=
ShiftExpression [?Yield, ?Await]
RelationalExpression [?In, ?Yield, ?Await]
>=
ShiftExpression [?Yield, ?Await]
RelationalExpression [?In, ?Yield, ?Await]
instanceof
ShiftExpression [?Yield, ?Await]
[+In]
RelationalExpression [+In, ?Yield, ?Await]
in
ShiftExpression [?Yield, ?Await]
[+In]
PrivateIdentifier
in
ShiftExpression [?Yield, ?Await]
Note 2
[In] 文法パラメータは関係式内の in
演算子と for
文の in
を混同しないために必要。
13.10.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
RelationalExpression :
RelationalExpression
<
ShiftExpression
lRef を ? RelationalExpression の Evaluation。lVal を ? GetValue (lRef )。rRef を ? ShiftExpression の Evaluation。rVal を ? GetValue (rRef )。r を ? IsLessThan (lVal , rVal , true ) とする。r が undefined なら false 、そうでなければ r を返す。
RelationalExpression :
RelationalExpression
>
ShiftExpression
lRef , lVal , rRef , rVal を上と同様に求める(ただし比較順を反転)。r を ? IsLessThan (rVal , lVal , false ) とする。r が undefined なら false 、そうでなければ r 。
RelationalExpression :
RelationalExpression
<=
ShiftExpression
左右を評価し r を ? IsLessThan (rVal , lVal , false )。 r が true または undefined なら false 、そうでなければ true 。
RelationalExpression :
RelationalExpression
>=
ShiftExpression
左右を評価し r を ? IsLessThan (lVal , rVal , true )。 r が true または undefined なら false 、そうでなければ true 。
RelationalExpression :
RelationalExpression
instanceof
ShiftExpression
左右を評価し lVal , rVal を得る。 ? InstanceofOperator (lVal , rVal ) を返す。
RelationalExpression :
RelationalExpression
in
ShiftExpression
左右を評価し lVal , rVal を得る。 rVal が Object でなければ TypeError 。? HasProperty (rVal , ? ToPropertyKey (lVal )) を返す。
RelationalExpression :
PrivateIdentifier
in
ShiftExpression
privateIdentifier を PrivateIdentifier の StringValue とする。rRef , rVal を評価して得る。rVal が Object でなければ TypeError 。privateEnv を実行中コンテキストの PrivateEnvironment とする。Assert : privateEnv は null でない。privateName を ResolvePrivateIdentifier (privateEnv , privateIdentifier )。PrivateElementFind (rVal , privateName ) が empty でなければ true 。false を返す。
13.10.2 InstanceofOperator ( V , target )
The abstract operation InstanceofOperator takes arguments V (ECMAScript 言語値) and target (ECMAScript 言語値) and returns 正常完了で Boolean を含むか throw 完了. It performs the following steps when called:
target が Object でなければ TypeError 例外。instOfHandler を ? GetMethod (target , %Symbol.hasInstance% ) とする。instOfHandler が undefined でなければToBoolean (? Call(instOfHandler , target , « V »)) を返す。IsCallable (target ) が false なら TypeError 。? OrdinaryHasInstance (target , V ) を返す。
Note
4 と 5 は %Symbol.hasInstance% が存在しなかった以前の版との互換性を提供する。オブジェクトが %Symbol.hasInstance% を定義・継承しない場合は従来の instanceof
既定セマンティクスを用いる。
13.11 等価演算子 (Equality Operators)
Note
等価演算子の評価結果は常に Boolean 型で、演算子が命名する関係が両被演算子間で成り立つかを表す。
構文 (Syntax)
EqualityExpression [In, Yield, Await] :
RelationalExpression [?In, ?Yield, ?Await]
EqualityExpression [?In, ?Yield, ?Await]
==
RelationalExpression [?In, ?Yield, ?Await]
EqualityExpression [?In, ?Yield, ?Await]
!=
RelationalExpression [?In, ?Yield, ?Await]
EqualityExpression [?In, ?Yield, ?Await]
===
RelationalExpression [?In, ?Yield, ?Await]
EqualityExpression [?In, ?Yield, ?Await]
!==
RelationalExpression [?In, ?Yield, ?Await]
13.11.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
EqualityExpression :
EqualityExpression
==
RelationalExpression
左右を評価し lVal , rVal を得る。 ? IsLooselyEqual (rVal , lVal ) を返す。
EqualityExpression :
EqualityExpression
!=
RelationalExpression
左右を評価し lVal , rVal を得る。 r を ? IsLooselyEqual (rVal , lVal )。r が true なら false 、それ以外 true 。
EqualityExpression :
EqualityExpression
===
RelationalExpression
左右を評価し lVal , rVal を得る。 IsStrictlyEqual (rVal , lVal ) を返す。
EqualityExpression :
EqualityExpression
!==
RelationalExpression
左右を評価し lVal , rVal を得る。 r を IsStrictlyEqual (rVal , lVal )。r が true なら false 、それ以外 true 。
Note 1
上記定義に関して:
文字列比較は: \`${a}\` == \`${b}\`
により強制できる。
数値比較は: +a == +b
により強制できる。
Boolean 比較は: !a == !b
により強制できる。
Note 2
等価演算子は次の不変条件を保持する:
A != B
は !(A == B)
と同値。
A == B
は評価順序を除き B == A
と同値。
Note 3
等価演算子は常に推移的とは限らない。例えば同じ String 値を表す異なる 2 つの String オブジェクトは、それぞれがリテラル文字列とは ==
で等しいが、互いには等しくない:
new String("a") == "a"
および "a" == new String("a")
は true 。
new String("a") == new String("a")
は false 。
Note 4
文字列比較はコードユニット列の単純な同値判定であり、Unicode 仕様の正規等価や照合順序は考慮されない。Unicode の正規等価な String が不等と判定され得る。両 String は既に正規化されているものとみなす。
13.12 ビット単位二項演算子 (Binary Bitwise Operators)
構文 (Syntax)
BitwiseANDExpression [In, Yield, Await] :
EqualityExpression [?In, ?Yield, ?Await]
BitwiseANDExpression [?In, ?Yield, ?Await]
&
EqualityExpression [?In, ?Yield, ?Await]
BitwiseXORExpression [In, Yield, Await] :
BitwiseANDExpression [?In, ?Yield, ?Await]
BitwiseXORExpression [?In, ?Yield, ?Await]
^
BitwiseANDExpression [?In, ?Yield, ?Await]
BitwiseORExpression [In, Yield, Await] :
BitwiseXORExpression [?In, ?Yield, ?Await]
BitwiseORExpression [?In, ?Yield, ?Await]
|
BitwiseXORExpression [?In, ?Yield, ?Await]
13.12.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
BitwiseANDExpression :
BitwiseANDExpression
&
EqualityExpression
? EvaluateStringOrNumericBinaryExpression (BitwiseANDExpression , &
, EqualityExpression ) を返す。
BitwiseXORExpression :
BitwiseXORExpression
^
BitwiseANDExpression
? EvaluateStringOrNumericBinaryExpression (BitwiseXORExpression , ^
, BitwiseANDExpression ) を返す。
BitwiseORExpression :
BitwiseORExpression
|
BitwiseXORExpression
? EvaluateStringOrNumericBinaryExpression (BitwiseORExpression , |
, BitwiseXORExpression ) を返す。
13.13 論理二項演算子 (Binary Logical Operators)
構文 (Syntax)
LogicalANDExpression [In, Yield, Await] :
BitwiseORExpression [?In, ?Yield, ?Await]
LogicalANDExpression [?In, ?Yield, ?Await]
&&
BitwiseORExpression [?In, ?Yield, ?Await]
LogicalORExpression [In, Yield, Await] :
LogicalANDExpression [?In, ?Yield, ?Await]
LogicalORExpression [?In, ?Yield, ?Await]
||
LogicalANDExpression [?In, ?Yield, ?Await]
CoalesceExpression [In, Yield, Await] :
CoalesceExpressionHead [?In, ?Yield, ?Await]
??
BitwiseORExpression [?In, ?Yield, ?Await]
CoalesceExpressionHead [In, Yield, Await] :
CoalesceExpression [?In, ?Yield, ?Await]
BitwiseORExpression [?In, ?Yield, ?Await]
ShortCircuitExpression [In, Yield, Await] :
LogicalORExpression [?In, ?Yield, ?Await]
CoalesceExpression [?In, ?Yield, ?Await]
Note
&&
および ||
演算子の結果値は必ずしも Boolean 型ではなく、常に 2 つの被演算子のいずれかの値そのものである。
13.13.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
LogicalANDExpression :
LogicalANDExpression
&&
BitwiseORExpression
lRef を ? LogicalANDExpression の Evaluation。lVal を ? GetValue (lRef )。ToBoolean (lVal ) が false なら lVal を返す。rRef を ? BitwiseORExpression の Evaluation。? GetValue (rRef ) を返す。
LogicalORExpression :
LogicalORExpression
||
LogicalANDExpression
lRef を ? LogicalORExpression の Evaluation。lVal を ? GetValue (lRef )。ToBoolean (lVal ) が true なら lVal を返す。rRef を ? LogicalANDExpression の Evaluation。? GetValue (rRef ) を返す。
CoalesceExpression :
CoalesceExpressionHead
??
BitwiseORExpression
lRef を ? CoalesceExpressionHead の Evaluation。lVal を ? GetValue (lRef )。lVal が undefined または null ならrRef を ? BitwiseORExpression の Evaluation。? GetValue (rRef ) を返す。 そうでなければlVal を返す。
13.14 条件演算子 ( ? :
) (Conditional Operator)
構文 (Syntax)
ConditionalExpression [In, Yield, Await] :
ShortCircuitExpression [?In, ?Yield, ?Await]
ShortCircuitExpression [?In, ?Yield, ?Await]
?
AssignmentExpression [+In, ?Yield, ?Await]
:
AssignmentExpression [?In, ?Yield, ?Await]
Note
ECMAScript の ConditionalExpression の文法は C や Java とわずかに異なる。C / Java では第 2 部分式を Expression とできる一方で第 3 部分式を ConditionalExpression に制限する。ECMAScript が異なるのは、条件のどちらの腕でも代入式を許可し、かつ中央の式として(紛らわしくほとんど有用でない)カンマ式となるケースを排除するためである。
13.14.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
ConditionalExpression :
ShortCircuitExpression
?
AssignmentExpression
:
AssignmentExpression
lRef を ? ShortCircuitExpression の Evaluation とする。lVal を ToBoolean (? GetValue (lRef )) とする。lVal が true ならtrueRef を 1 番目の AssignmentExpression の Evaluation。? GetValue (trueRef ) を返す。 そうでなければfalseRef を 2 番目の AssignmentExpression の Evaluation。? GetValue (falseRef ) を返す。
13.15 代入演算子 (Assignment Operators)
構文 (Syntax)
AssignmentExpression [In, Yield, Await] :
ConditionalExpression [?In, ?Yield, ?Await]
[+Yield]
YieldExpression [?In, ?Await]
ArrowFunction [?In, ?Yield, ?Await]
AsyncArrowFunction [?In, ?Yield, ?Await]
LeftHandSideExpression [?Yield, ?Await]
=
AssignmentExpression [?In, ?Yield, ?Await]
LeftHandSideExpression [?Yield, ?Await]
AssignmentOperator
AssignmentExpression [?In, ?Yield, ?Await]
LeftHandSideExpression [?Yield, ?Await]
&&=
AssignmentExpression [?In, ?Yield, ?Await]
LeftHandSideExpression [?Yield, ?Await]
||=
AssignmentExpression [?In, ?Yield, ?Await]
LeftHandSideExpression [?Yield, ?Await]
??=
AssignmentExpression [?In, ?Yield, ?Await]
AssignmentOperator : one of *= /= %= += -= <<= >>= >>>= &= ^= |= **=
13.15.1 静的セマンティクス: 早期エラー (Static Semantics: Early Errors)
AssignmentExpression :
LeftHandSideExpression
=
AssignmentExpression
AssignmentExpression :
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
AssignmentExpression :
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
13.15.2 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
AssignmentExpression :
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression が ObjectLiteral でも ArrayLiteral でもないならlRef を ? LeftHandSideExpression の Evaluation。LeftHandSideExpression の AssignmentTargetType が web-compat なら ReferenceError 例外。IsAnonymousFunctionDefinition(AssignmentExpression ) が true かつ IsIdentifierRef(LeftHandSideExpression ) が true ならlhs を LeftHandSideExpression の StringValue。rVal を 引数 lhs で AssignmentExpression の NamedEvaluation。 そうでなければrRef を ? AssignmentExpression の Evaluation。rVal を ? GetValue (rRef )。 ? PutValue (lRef , rVal ) を実行。 rVal を返す。assignmentPattern を LeftHandSideExpression が覆う AssignmentPattern とする。rRef を ? AssignmentExpression の Evaluation。rVal を ? GetValue (rRef )。assignmentPattern の DestructuringAssignmentEvaluation を引数 rVal で実行。rVal を返す。
AssignmentExpression :
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
lRef を ? LeftHandSideExpression の Evaluation。LeftHandSideExpression の AssignmentTargetType が web-compat なら ReferenceError 。lVal を ? GetValue (lRef )。rRef を ? AssignmentExpression の Evaluation。rVal を ? GetValue (rRef )。assignmentOpText を AssignmentOperator にマッチしたソーステキスト。opText を次の表で assignmentOpText に対応する Unicode コードポイント列。
assignmentOpText opText
**=
**
*=
*
/=
/
%=
%
+=
+
-=
-
<<=
<<
>>=
>>
>>>=
>>>
&=
&
^=
^
|=
|
r を ? ApplyStringOrNumericBinaryOperator (lVal , opText , rVal ) とする。? PutValue (lRef , r ) を実行。 r を返す。
AssignmentExpression :
LeftHandSideExpression
&&=
AssignmentExpression
lRef を ? LeftHandSideExpression の Evaluation。lVal を ? GetValue (lRef )。ToBoolean (lVal ) が false なら lVal を返す。IsAnonymousFunctionDefinition(AssignmentExpression ) が true かつ IsIdentifierRef(LeftHandSideExpression ) が true ならlhs を LeftHandSideExpression の StringValue。rVal を 引数 lhs で AssignmentExpression の NamedEvaluation。 そうでなければrRef を ? AssignmentExpression の Evaluation。rVal を ? GetValue (rRef )。 ? PutValue (lRef , rVal ) を実行。 rVal を返す。
AssignmentExpression :
LeftHandSideExpression
||=
AssignmentExpression
lRef を ? LeftHandSideExpression の Evaluation。lVal を ? GetValue (lRef )。ToBoolean (lVal ) が true なら lVal を返す。IsAnonymousFunctionDefinition(AssignmentExpression ) が true かつ IsIdentifierRef(LeftHandSideExpression ) が true ならlhs を LeftHandSideExpression の StringValue。rVal を 引数 lhs で AssignmentExpression の NamedEvaluation。 そうでなければrRef を ? AssignmentExpression の Evaluation。rVal を ? GetValue (rRef )。 ? PutValue (lRef , rVal ) を実行。 rVal を返す。
AssignmentExpression :
LeftHandSideExpression
??=
AssignmentExpression
lRef を ? LeftHandSideExpression の Evaluation。lVal を ? GetValue (lRef )。lVal が undefined でも null でもないなら lVal を返す。IsAnonymousFunctionDefinition(AssignmentExpression ) が true かつ IsIdentifierRef(LeftHandSideExpression ) が true ならlhs を LeftHandSideExpression の StringValue。rVal を 引数 lhs で AssignmentExpression の NamedEvaluation。 そうでなければrRef を ? AssignmentExpression の Evaluation。rVal を ? GetValue (rRef )。 ? PutValue (lRef , rVal ) を実行。 rVal を返す。
Note
strict mode コード内でこの式が現れる場合、手順 1.e , 3 , 2 , 2 , 2 の lRef が解決不能参照なら実行時エラー(ReferenceError 例外)。さらに手順 9 , 6 , 6 , 6 の lRef が [[Writable]] :false のデータプロパティ 、[[Set]] :undefined のアクセサプロパティ 、あるいは IsExtensible が false を返すオブジェクト上の存在しないプロパティを参照しているなら TypeError 例外を投げる。
13.15.3 ApplyStringOrNumericBinaryOperator ( lVal , opText , rVal )
The abstract operation ApplyStringOrNumericBinaryOperator takes arguments lVal (ECMAScript 言語値), opText (**
, *
, /
, %
, +
, -
, <<
, >>
, >>>
, &
, ^
, |
), and rVal (ECMAScript 言語値) and returns 正常完了で String / BigInt / Number のいずれか、または throw 完了. It performs the following steps when called:
opText が +
ならlPrim を ? ToPrimitive(lVal )。rPrim を ? ToPrimitive(rVal )。lPrim が String であるか rPrim が String ならlStr を ? ToString (lPrim )。rStr を ? ToString (rPrim )。lStr と rStr の文字列連結 を返す。lVal を lPrim に設定。rVal を rPrim に設定。注: ここからは数値演算である。 lNum を ? ToNumeric (lVal )。rNum を ? ToNumeric (rVal )。SameType (lNum , rNum ) が false なら TypeError 例外。lNum が BigInt ならopText が **
なら ? BigInt::exponentiate (lNum , rNum ) を返す。opText が /
なら ? BigInt::divide (lNum , rNum )。opText が %
なら ? BigInt::remainder (lNum , rNum )。opText が >>>
なら ? BigInt::unsignedRightShift (lNum , rNum )。operation を次の表で opText に対応する抽象操作 とする:
そうでなければAssert : lNum は Number。operation を次の表で opText に対応する抽象操作 とする:
operation (lNum , rNum ) を返す。
Note 1
手順 1.a , 1.b の ToPrimitive 呼出しでは hint を与えない。標準オブジェクト(Date を除く)は hint 省略時 number と同等に扱い、Date は string と同等に扱う。エキゾチックオブジェクト は別の扱いをするかもしれない。
Note 2
手順 1.c は IsLessThan アルゴリズムの手順 3 と異なり、論理積ではなく論理和を用いる。
13.15.4 EvaluateStringOrNumericBinaryExpression ( leftOperand , opText , rightOperand )
The abstract operation EvaluateStringOrNumericBinaryExpression takes arguments leftOperand (Parse Node), opText (Unicode コードポイント列), and rightOperand (Parse Node) and returns 正常完了で String / BigInt / Number のいずれか、または突然の完了. It performs the following steps when called:
lRef を ? leftOperand の Evaluation。lVal を ? GetValue (lRef )。rRef を ? rightOperand の Evaluation。rVal を ? GetValue (rRef )。? ApplyStringOrNumericBinaryOperator (lVal , opText , rVal ) を返す。
13.15.5 分割代入 (Destructuring Assignment)
補助構文 (Supplemental Syntax)
次の生成規則インスタンスを処理する特定状況で
AssignmentExpression :
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression の解釈は以下の文法で精緻化される:
AssignmentPattern [Yield, Await] :
ObjectAssignmentPattern [?Yield, ?Await]
ArrayAssignmentPattern [?Yield, ?Await]
ObjectAssignmentPattern [Yield, Await] :
{
}
{
AssignmentRestProperty [?Yield, ?Await]
}
{
AssignmentPropertyList [?Yield, ?Await]
}
{
AssignmentPropertyList [?Yield, ?Await]
,
AssignmentRestProperty [?Yield, ?Await] opt
}
ArrayAssignmentPattern [Yield, Await] :
[
Elision opt
AssignmentRestElement [?Yield, ?Await] opt
]
[
AssignmentElementList [?Yield, ?Await]
]
[
AssignmentElementList [?Yield, ?Await]
,
Elision opt
AssignmentRestElement [?Yield, ?Await] opt
]
AssignmentRestProperty [Yield, Await] :
...
DestructuringAssignmentTarget [?Yield, ?Await]
AssignmentPropertyList [Yield, Await] :
AssignmentProperty [?Yield, ?Await]
AssignmentPropertyList [?Yield, ?Await]
,
AssignmentProperty [?Yield, ?Await]
AssignmentElementList [Yield, Await] :
AssignmentElisionElement [?Yield, ?Await]
AssignmentElementList [?Yield, ?Await]
,
AssignmentElisionElement [?Yield, ?Await]
AssignmentElisionElement [Yield, Await] :
Elision opt
AssignmentElement [?Yield, ?Await]
AssignmentProperty [Yield, Await] :
IdentifierReference [?Yield, ?Await]
Initializer [+In, ?Yield, ?Await] opt
PropertyName [?Yield, ?Await]
:
AssignmentElement [?Yield, ?Await]
AssignmentElement [Yield, Await] :
DestructuringAssignmentTarget [?Yield, ?Await]
Initializer [+In, ?Yield, ?Await] opt
AssignmentRestElement [Yield, Await] :
...
DestructuringAssignmentTarget [?Yield, ?Await]
DestructuringAssignmentTarget [Yield, Await] :
LeftHandSideExpression [?Yield, ?Await]
13.15.5.1 静的セマンティクス: 早期エラー (Static Semantics: Early Errors)
AssignmentProperty :
IdentifierReference
Initializer opt
AssignmentRestProperty :
...
DestructuringAssignmentTarget
DestructuringAssignmentTarget : LeftHandSideExpression
13.15.5.2 実行時セマンティクス: DestructuringAssignmentEvaluation : 正常完了で unused または突然の完了
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ObjectAssignmentPattern :
{
}
? RequireObjectCoercible (value )。 unused を返す。
ObjectAssignmentPattern :
{
AssignmentPropertyList
}
{
AssignmentPropertyList
,
}
? RequireObjectCoercible (value )。 AssignmentPropertyList の PropertyDestructuringAssignmentEvaluation を引数 value で実行。unused を返す。
ObjectAssignmentPattern :
{
AssignmentRestProperty
}
? RequireObjectCoercible (value )。 excludedNames を空 List 。AssignmentRestProperty の RestDestructuringAssignmentEvaluation を引数 value , excludedNames で返す。
ObjectAssignmentPattern :
{
AssignmentPropertyList
,
AssignmentRestProperty
}
? RequireObjectCoercible (value )。 excludedNames を AssignmentPropertyList の PropertyDestructuringAssignmentEvaluation(引数 value )。AssignmentRestProperty の RestDestructuringAssignmentEvaluation(value , excludedNames ) を返す。
ArrayAssignmentPattern :
[
]
iteratorRecord を ? GetIterator (value , sync )。? IteratorClose (iteratorRecord , NormalCompletion (unused )) を返す。
ArrayAssignmentPattern :
[
Elision
]
iteratorRecord を ? GetIterator (value , sync )。result を Completion (Elision の IteratorDestructuringAssignmentEvaluation(iteratorRecord ))。iteratorRecord .[[Done]] が false なら ? IteratorClose (iteratorRecord , result ) を返す。result を返す。
ArrayAssignmentPattern :
[
Elision opt
AssignmentRestElement
]
iteratorRecord を ? GetIterator (value , sync )。Elision が存在するならstatus を Completion (Elision の IteratorDestructuringAssignmentEvaluation(iteratorRecord ))。status が abrupt ならAssert : iteratorRecord .[[Done]] は true 。? status を返す。 result を Completion (AssignmentRestElement の IteratorDestructuringAssignmentEvaluation(iteratorRecord ))。iteratorRecord .[[Done]] が false なら ? IteratorClose (iteratorRecord , result )。result を返す。
ArrayAssignmentPattern :
[
AssignmentElementList
]
iteratorRecord を ? GetIterator (value , sync )。result を Completion (AssignmentElementList の IteratorDestructuringAssignmentEvaluation(iteratorRecord ))。iteratorRecord .[[Done]] が false なら ? IteratorClose (iteratorRecord , result )。result を返す。
ArrayAssignmentPattern :
[
AssignmentElementList
,
Elision opt
AssignmentRestElement opt
]
iteratorRecord を ? GetIterator (value , sync )。status を Completion (AssignmentElementList の IteratorDestructuringAssignmentEvaluation(iteratorRecord ))。status が abrupt ならiteratorRecord .[[Done]] が false なら ? IteratorClose (iteratorRecord , status ) を返す。? status を返す。 Elision が存在するならstatus を Completion (Elision の IteratorDestructuringAssignmentEvaluation(iteratorRecord )) に設定。status が abrupt ならAssert : iteratorRecord .[[Done]] は true 。? status を返す。 AssignmentRestElement が存在するならstatus を Completion (AssignmentRestElement の IteratorDestructuringAssignmentEvaluation(iteratorRecord )) に設定。iteratorRecord .[[Done]] が false なら ? IteratorClose (iteratorRecord , status )。? status を返す。
13.15.5.3 実行時セマンティクス: PropertyDestructuringAssignmentEvaluation : 正常完了でプロパティキーの List または突然の完了
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
AssignmentPropertyList :
AssignmentPropertyList
,
AssignmentProperty
propertyNames を ? PropertyDestructuringAssignmentEvaluation(AssignmentPropertyList , value )。nextNames を ? PropertyDestructuringAssignmentEvaluation(AssignmentProperty , value )。propertyNames と nextNames のリスト結合 を返す。
AssignmentProperty :
IdentifierReference
Initializer opt
P を IdentifierReference の StringValue。lRef を ? ResolveBinding (P )。v を ? GetV (value , P )。Initializer が存在し v が undefined ならIsAnonymousFunctionDefinition(Initializer ) が true ならv を 引数 P で Initializer の NamedEvaluation。 そうでなければdefaultValue を ? Initializer の Evaluation。v を ? GetValue (defaultValue )。 ? PutValue (lRef , v ) を実行。 « P » を返す。
AssignmentProperty :
PropertyName
:
AssignmentElement
name を ? PropertyName の Evaluation。AssignmentElement の KeyedDestructuringAssignmentEvaluation(value , name ) を実行。« name » を返す。
13.15.5.4 実行時セマンティクス: RestDestructuringAssignmentEvaluation : 正常完了で unused または突然の完了
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
AssignmentRestProperty :
...
DestructuringAssignmentTarget
lRef を ? DestructuringAssignmentTarget の Evaluation。restObj を OrdinaryObjectCreate (%Object.prototype% )。? CopyDataProperties (restObj , value , excludedNames )。 ? PutValue (lRef , restObj ) を返す。
13.15.5.5 実行時セマンティクス: IteratorDestructuringAssignmentEvaluation : 正常完了で unused または突然の完了
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
AssignmentElementList : AssignmentElisionElement
AssignmentElisionElement の IteratorDestructuringAssignmentEvaluation(iteratorRecord ) を返す。
AssignmentElementList :
AssignmentElementList
,
AssignmentElisionElement
AssignmentElementList の IteratorDestructuringAssignmentEvaluation(iteratorRecord ) を実行。AssignmentElisionElement の IteratorDestructuringAssignmentEvaluation(iteratorRecord ) を返す。
AssignmentElisionElement : AssignmentElement
AssignmentElement の IteratorDestructuringAssignmentEvaluation(iteratorRecord ) を返す。
AssignmentElisionElement :
Elision
AssignmentElement
Elision の IteratorDestructuringAssignmentEvaluation(iteratorRecord ) を実行。AssignmentElement の IteratorDestructuringAssignmentEvaluation(iteratorRecord ) を返す。
Elision : ,
iteratorRecord .[[Done]] が false なら? IteratorStep (iteratorRecord )。 unused を返す。
Elision :
Elision
,
Elision の IteratorDestructuringAssignmentEvaluation(iteratorRecord ) を実行。iteratorRecord .[[Done]] が false なら? IteratorStep (iteratorRecord )。 unused を返す。
AssignmentElement :
DestructuringAssignmentTarget
Initializer opt
DestructuringAssignmentTarget が ObjectLiteral / ArrayLiteral のいずれでもないならlRef を ? DestructuringAssignmentTarget の Evaluation。value を undefined 。iteratorRecord .[[Done]] が false ならnext を ? IteratorStepValue (iteratorRecord )。next が done でなければ value を next に設定。Initializer が存在し value が undefined ならIsAnonymousFunctionDefinition(Initializer ) かつ IsIdentifierRef(DestructuringAssignmentTarget ) が true ならtarget を DestructuringAssignmentTarget の StringValue。v を 引数 target で Initializer の NamedEvaluation。 そうでなければdefaultValue を ? Initializer の Evaluation。v を ? GetValue (defaultValue )。 そうでなければv を value 。 DestructuringAssignmentTarget が ObjectLiteral または ArrayLiteral ならnestedAssignmentPattern を DestructuringAssignmentTarget が覆う AssignmentPattern 。? DestructuringAssignmentEvaluation(nestedAssignmentPattern , 引数 v ) を返す。 ? PutValue (lRef , v ) を返す。
Note
DestructuringAssignmentTarget がパターンでない場合にそれを先に評価してからイテレータアクセスや Initializer の評価を行うことで、左から右への評価順序を維持する。
AssignmentRestElement :
...
DestructuringAssignmentTarget
DestructuringAssignmentTarget が ObjectLiteral / ArrayLiteral でないならlRef を ? DestructuringAssignmentTarget の Evaluation。A を ! ArrayCreate (0)。n を 0。iteratorRecord .[[Done]] が false の間繰り返すnext を ? IteratorStepValue (iteratorRecord )。next が done でなければ! CreateDataPropertyOrThrow (A , ! ToString (𝔽 (n )), next )。 n を n + 1 に。DestructuringAssignmentTarget が ObjectLiteral / ArrayLiteral でないなら? PutValue (lRef , A ) を返す。 nestedAssignmentPattern を DestructuringAssignmentTarget が覆う AssignmentPattern 。? DestructuringAssignmentEvaluation(nestedAssignmentPattern , 引数 A ) を返す。
13.15.5.6 実行時セマンティクス: KeyedDestructuringAssignmentEvaluation : 正常完了で unused または突然の完了
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
AssignmentElement :
DestructuringAssignmentTarget
Initializer opt
DestructuringAssignmentTarget が ObjectLiteral / ArrayLiteral でないならlRef を ? DestructuringAssignmentTarget の Evaluation。v を ? GetV (value , propertyName )。Initializer が存在し v が undefined ならIsAnonymousFunctionDefinition(Initializer ) かつ IsIdentifierRef(DestructuringAssignmentTarget ) が true ならtarget を DestructuringAssignmentTarget の StringValue。rhsValue を 引数 target で Initializer の NamedEvaluation。 そうでなければdefaultValue を ? Initializer の Evaluation。rhsValue を ? GetValue (defaultValue )。 そうでなければrhsValue を v 。 DestructuringAssignmentTarget が ObjectLiteral または ArrayLiteral ならassignmentPattern を DestructuringAssignmentTarget が覆う AssignmentPattern 。? DestructuringAssignmentEvaluation(assignmentPattern , 引数 rhsValue ) を返す。 ? PutValue (lRef , rhsValue ) を返す。
13.16 カンマ演算子 ( ,
) (Comma Operator)
構文 (Syntax)
Expression [In, Yield, Await] :
AssignmentExpression [?In, ?Yield, ?Await]
Expression [?In, ?Yield, ?Await]
,
AssignmentExpression [?In, ?Yield, ?Await]
13.16.1 実行時セマンティクス: 評価 (Runtime Semantics: Evaluation)
Expression :
Expression
,
AssignmentExpression
lRef を ? Expression の Evaluation とする。? GetValue (lRef ) を実行する。 rRef を ? AssignmentExpression の Evaluation とする。? GetValue (rRef ) を返す。
Note
値は使用されないが、副作用が観測可能であるため GetValue を呼び出す必要がある。
14 ECMAScript 言語: 文 (Statement) と 宣言 (Declaration)
構文 (Syntax)
Statement [Yield, Await, Return] :
BlockStatement [?Yield, ?Await, ?Return]
VariableStatement [?Yield, ?Await]
EmptyStatement
ExpressionStatement [?Yield, ?Await]
IfStatement [?Yield, ?Await, ?Return]
BreakableStatement [?Yield, ?Await, ?Return]
ContinueStatement [?Yield, ?Await]
BreakStatement [?Yield, ?Await]
[+Return]
ReturnStatement [?Yield, ?Await]
WithStatement [?Yield, ?Await, ?Return]
LabelledStatement [?Yield, ?Await, ?Return]
ThrowStatement [?Yield, ?Await]
TryStatement [?Yield, ?Await, ?Return]
DebuggerStatement
Declaration [Yield, Await] :
HoistableDeclaration [?Yield, ?Await, ~Default]
ClassDeclaration [?Yield, ?Await, ~Default]
LexicalDeclaration [+In, ?Yield, ?Await]
HoistableDeclaration [Yield, Await, Default] :
FunctionDeclaration [?Yield, ?Await, ?Default]
GeneratorDeclaration [?Yield, ?Await, ?Default]
AsyncFunctionDeclaration [?Yield, ?Await, ?Default]
AsyncGeneratorDeclaration [?Yield, ?Await, ?Default]
BreakableStatement [Yield, Await, Return] :
IterationStatement [?Yield, ?Await, ?Return]
SwitchStatement [?Yield, ?Await, ?Return]
14.1 Statement の意味論 (Semantics)
14.1.1 実行時意味論: 評価 (Runtime Semantics: Evaluation)
HoistableDeclaration :
GeneratorDeclaration
AsyncFunctionDeclaration
AsyncGeneratorDeclaration
empty を返す。
HoistableDeclaration : FunctionDeclaration
FunctionDeclaration の Evaluation の結果を ? 付きで返す。
BreakableStatement :
IterationStatement
SwitchStatement
newLabelSet を新しい空の List とする。この BreakableStatement の LabelledEvaluation (引数 newLabelSet ) の結果を ? 付きで返す。
14.2 Block
構文 (Syntax)
BlockStatement [Yield, Await, Return] :
Block [?Yield, ?Await, ?Return]
Block [Yield, Await, Return] :
{
StatementList [?Yield, ?Await, ?Return] opt
}
StatementList [Yield, Await, Return] :
StatementListItem [?Yield, ?Await, ?Return]
StatementList [?Yield, ?Await, ?Return]
StatementListItem [?Yield, ?Await, ?Return]
StatementListItem [Yield, Await, Return] :
Statement [?Yield, ?Await, ?Return]
Declaration [?Yield, ?Await]
14.2.1 静的意味論: 早期エラー (Static Semantics: Early Errors)
Block :
{
StatementList
}
14.2.2 実行時意味論: 評価
Block :
{
}
empty を返す。
Block :
{
StatementList
}
oldEnv を現在実行中コンテキストの LexicalEnvironment とする。blockEnv を NewDeclarativeEnvironment (oldEnv ) とする。BlockDeclarationInstantiation (StatementList , blockEnv ) を実行する。実行中コンテキストの LexicalEnvironment を blockEnv に設定する。 blockValue を StatementList の Evaluation の Completion とする。実行中コンテキストの LexicalEnvironment を oldEnv に戻す。 ? blockValue を返す。
Note 1
どのように Block を抜けても LexicalEnvironment は常に元に復元される。
StatementList :
StatementList
StatementListItem
sl を StatementList の Evaluation を ? 付きで行った結果とする。s を StatementListItem の Evaluation の Completion とする。UpdateEmpty (s , sl ) を ? 付きで返す。
Note 2
StatementList の値はその中で最後に値を生成する項目の値である。例えば以下の eval
呼び出しはいずれも 1 を返す:
eval ("1;;;;;" )
eval ("1;{}" )
eval ("1;var a;" )
14.2.3 BlockDeclarationInstantiation ( code , env )
The abstract operation BlockDeclarationInstantiation takes arguments code (a Parse Node) and env (a Declarative Environment Record ) and returns unused . code はブロック本体に対応する Parse Node。env は束縛を生成する Environment Record 。
Note
Block または CaseBlock が評価される際、新しい Declarative Environment Record が生成され、そのブロック内で宣言された block スコープの変数・定数・関数・クラスの束縛がそこにインスタンス化される。
呼び出されたとき以下の手順を行う:
declarations を code の LexicallyScopedDeclarations とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。declarations の各要素 d について:d の BoundNames の各要素 dn について:IsConstantDeclaration of d が true なら:! env .CreateImmutableBinding(dn , true ) を実行。 それ以外:Normative Optional
ホスト が Web ブラウザまたは ブロックレベル Function 宣言 (Web レガシー互換意味論) をサポートするなら:! env .HasBinding(dn ) が false なら:! env .CreateMutableBinding(dn , false ) を実行。 それ以外:! env .CreateMutableBinding(dn , false ) を実行。 d が FunctionDeclaration , GeneratorDeclaration , AsyncFunctionDeclaration , AsyncGeneratorDeclaration のいずれかであれば:fn を d の BoundNames の唯一の要素とする。fo を 引数 env , privateEnv で d の InstantiateFunctionObject とする。Normative Optional
ホスト が Web ブラウザまたは ブロックレベル Function 宣言 (Web レガシー互換意味論) をサポートするなら:env 内の fn の束縛が未初期化なら:! env .InitializeBinding(fn , fo ) を実行。 それ以外:Assert : d は FunctionDeclaration である。! env .SetMutableBinding(fn , fo , false ) を実行。 それ以外:! env .InitializeBinding(fn , fo ) を実行。 unused を返す。
14.3 Declarations と Variable 文
14.3.1 Let および Const 宣言
Note
let
と const
宣言は、現在実行中コンテキストの LexicalEnvironment にスコープを持つ変数を定義する。変数はその包含 Environment Record がインスタンス化された時に生成されるが、その LexicalBinding が評価されるまでいかなる方法でもアクセスできない。Initializer を伴う LexicalBinding により定義された変数は、その Initializer の AssignmentExpression が評価されたときに値が割り当てられ、生成時ではない。let
宣言内で Initializer を持たない LexicalBinding によって定義された変数は、その LexicalBinding が評価されたとき undefined が割り当てられる。
構文 (Syntax)
LexicalDeclaration [In, Yield, Await] :
LetOrConst
BindingList [?In, ?Yield, ?Await]
;
LetOrConst :
let
const
BindingList [In, Yield, Await] :
LexicalBinding [?In, ?Yield, ?Await]
BindingList [?In, ?Yield, ?Await]
,
LexicalBinding [?In, ?Yield, ?Await]
LexicalBinding [In, Yield, Await] :
BindingIdentifier [?Yield, ?Await]
Initializer [?In, ?Yield, ?Await] opt
BindingPattern [?Yield, ?Await]
Initializer [?In, ?Yield, ?Await]
14.3.1.1 静的意味論: 早期エラー
LexicalDeclaration :
LetOrConst
BindingList
;
LexicalBinding :
BindingIdentifier
Initializer opt
14.3.1.2 実行時意味論: 評価
LexicalDeclaration :
LetOrConst
BindingList
;
BindingList の Evaluation を ? 付きで実行する。empty を返す。
BindingList :
BindingList
,
LexicalBinding
BindingList の Evaluation を ? 付きで実行。LexicalBinding の Evaluation を ? 付きで返す。
LexicalBinding : BindingIdentifier
lhs を ! ResolveBinding (StringValue of BindingIdentifier ) とする。! InitializeReferencedBinding (lhs , undefined ) を実行。 empty を返す。
Note
静的意味論 により、この形の LexicalBinding が const
宣言で現れないことが保証されている。
LexicalBinding :
BindingIdentifier
Initializer
bindingId を BindingIdentifier の StringValue とする。lhs を ! ResolveBinding (bindingId ) とする。IsAnonymousFunctionDefinition(Initializer ) が true なら:value を Initializer の NamedEvaluation (引数 bindingId ) を ? 付きで行った結果とする。 それ以外:rhs を Initializer の Evaluation を ? 付きで行った結果とする。value を ? GetValue (rhs ) とする。 ! InitializeReferencedBinding (lhs , value ) を実行。 empty を返す。
LexicalBinding :
BindingPattern
Initializer
rhs を Initializer の Evaluation を ? 付きで行った結果とする。value を ? GetValue (rhs ) とする。env を実行中コンテキストの LexicalEnvironment とする。BindingPattern の BindingInitialization (引数 value , env ) を ? 付きで返す。
14.3.2 Variable 文 (var 文)
Note
var
文は現在実行中コンテキストの VariableEnvironment にスコープを持つ変数を宣言する。Var 変数は包含 Environment Record のインスタンス化時に生成され、生成時に undefined へ初期化される。同一 VariableEnvironment のスコープ内で同じ BindingIdentifier が複数の VariableDeclaration に現れても、それらは単一の変数のみを定義する。Initializer を持つ VariableDeclaration により定義された変数は、生成時ではなくその VariableDeclaration が実行される際に Initializer の AssignmentExpression の値が割り当てられる。
構文 (Syntax)
VariableStatement [Yield, Await] :
var
VariableDeclarationList [+In, ?Yield, ?Await]
;
VariableDeclarationList [In, Yield, Await] :
VariableDeclaration [?In, ?Yield, ?Await]
VariableDeclarationList [?In, ?Yield, ?Await]
,
VariableDeclaration [?In, ?Yield, ?Await]
VariableDeclaration [In, Yield, Await] :
BindingIdentifier [?Yield, ?Await]
Initializer [?In, ?Yield, ?Await] opt
BindingPattern [?Yield, ?Await]
Initializer [?In, ?Yield, ?Await]
14.3.2.1 実行時意味論: 評価
VariableStatement :
var
VariableDeclarationList
;
VariableDeclarationList の Evaluation を ? 付きで実行。empty を返す。
VariableDeclarationList :
VariableDeclarationList
,
VariableDeclaration
VariableDeclarationList の Evaluation を ? 付きで実行。VariableDeclaration の Evaluation を ? 付きで返す。
VariableDeclaration : BindingIdentifier
empty を返す。
VariableDeclaration :
BindingIdentifier
Initializer
bindingId を BindingIdentifier の StringValue とする。lhs を ? ResolveBinding (bindingId ) とする。IsAnonymousFunctionDefinition(Initializer ) が true なら:value を Initializer の NamedEvaluation (引数 bindingId ) を ? 付きで行った結果とする。 それ以外:rhs を Initializer の Evaluation を ? 付きで行った結果とする。value を ? GetValue (rhs ) とする。 ? PutValue (lhs , value ) を実行。 empty を返す。
Note
VariableDeclaration が with 文内にネストしており、その BindingIdentifier がその with 文の Object Environment Record のバインディングオブジェクトのプロパティ名 と同一である場合、5 のステップは Identifier の VariableEnvironment の束縛ではなくそのプロパティに value を代入する。
VariableDeclaration :
BindingPattern
Initializer
rhs を Initializer の Evaluation を ? 付きで行った結果とする。rVal を ? GetValue (rhs ) とする。BindingPattern の BindingInitialization (引数 rVal , undefined ) を ? 付きで返す。
14.3.3 分割代入用束縛パターン (Destructuring Binding Patterns)
構文 (Syntax)
BindingPattern [Yield, Await] :
ObjectBindingPattern [?Yield, ?Await]
ArrayBindingPattern [?Yield, ?Await]
ObjectBindingPattern [Yield, Await] :
{
}
{
BindingRestProperty [?Yield, ?Await]
}
{
BindingPropertyList [?Yield, ?Await]
}
{
BindingPropertyList [?Yield, ?Await]
,
BindingRestProperty [?Yield, ?Await] opt
}
ArrayBindingPattern [Yield, Await] :
[
Elision opt
BindingRestElement [?Yield, ?Await] opt
]
[
BindingElementList [?Yield, ?Await]
]
[
BindingElementList [?Yield, ?Await]
,
Elision opt
BindingRestElement [?Yield, ?Await] opt
]
BindingRestProperty [Yield, Await] :
...
BindingIdentifier [?Yield, ?Await]
BindingPropertyList [Yield, Await] :
BindingProperty [?Yield, ?Await]
BindingPropertyList [?Yield, ?Await]
,
BindingProperty [?Yield, ?Await]
BindingElementList [Yield, Await] :
BindingElisionElement [?Yield, ?Await]
BindingElementList [?Yield, ?Await]
,
BindingElisionElement [?Yield, ?Await]
BindingElisionElement [Yield, Await] :
Elision opt
BindingElement [?Yield, ?Await]
BindingProperty [Yield, Await] :
SingleNameBinding [?Yield, ?Await]
PropertyName [?Yield, ?Await]
:
BindingElement [?Yield, ?Await]
BindingElement [Yield, Await] :
SingleNameBinding [?Yield, ?Await]
BindingPattern [?Yield, ?Await]
Initializer [+In, ?Yield, ?Await] opt
SingleNameBinding [Yield, Await] :
BindingIdentifier [?Yield, ?Await]
Initializer [+In, ?Yield, ?Await] opt
BindingRestElement [Yield, Await] :
...
BindingIdentifier [?Yield, ?Await]
...
BindingPattern [?Yield, ?Await]
14.3.3.1 実行時意味論: PropertyBindingInitialization : プロパティキーの List を含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 束縛される全プロパティ名 のリストを収集する。 It is defined piecewise over the following productions:
BindingPropertyList :
BindingPropertyList
,
BindingProperty
boundNames を BindingPropertyList の PropertyBindingInitialization(value , environment ) を ? 付きで行った結果とする。nextNames を BindingProperty の PropertyBindingInitialization(value , environment ) を ? 付きで行った結果とする。boundNames と nextNames のリスト連結を返す。
BindingProperty : SingleNameBinding
name を SingleNameBinding の BoundNames の唯一の要素とする。SingleNameBinding の KeyedBindingInitialization(value , environment , name ) を ? 付きで実行。« name » を返す。
BindingProperty :
PropertyName
:
BindingElement
P を PropertyName の Evaluation を ? 付きで行った結果とする。BindingElement の KeyedBindingInitialization(value , environment , P ) を ? 付きで実行。« P » を返す。
14.3.3.2 実行時意味論: RestBindingInitialization : unused を含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
BindingRestProperty :
...
BindingIdentifier
lhs を ? ResolveBinding (StringValue of BindingIdentifier , environment ) とする。restObj を OrdinaryObjectCreate (%Object.prototype% ) とする。? CopyDataProperties (restObj , value , excludedNames ) を実行。 environment が undefined なら ? PutValue (lhs , restObj ) を返す。? InitializeReferencedBinding (lhs , restObj ) を返す。
14.3.3.3 実行時意味論: KeyedBindingInitialization : unused を含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
environment に undefined を渡すのは PutValue を用いて初期化値を代入すべきであることを示す。その例は非 strict 関数の仮引数リストなど。そこでは複数同名パラメータの可能性に対応するため事前初期化が行われる。
It is defined piecewise over the following productions:
BindingElement :
BindingPattern
Initializer opt
v を ? GetV (value , propertyName ) とする。Initializer が存在し v が undefined なら:defaultValue を Initializer の Evaluation を ? 付きで行った結果とする。v を ? GetValue (defaultValue ) に設定。BindingPattern の BindingInitialization(v , environment ) を ? 付きで返す。
SingleNameBinding :
BindingIdentifier
Initializer opt
bindingId を BindingIdentifier の StringValue とする。lhs を ? ResolveBinding (bindingId , environment ) とする。v を ? GetV (value , propertyName ) とする。Initializer が存在し v が undefined なら:IsAnonymousFunctionDefinition(Initializer ) が true なら:v を Initializer の NamedEvaluation (引数 bindingId ) を ? 付きで行った結果とする。 それ以外:defaultValue を Initializer の Evaluation を ? 付きで行った結果とする。v を ? GetValue (defaultValue ) に設定。 environment が undefined なら ? PutValue (lhs , v ) を返す。? InitializeReferencedBinding (lhs , v ) を返す。
14.4 Empty 文 (Empty Statement)
構文 (Syntax)
EmptyStatement :
;
14.4.1 実行時意味論: 評価
EmptyStatement : ;
empty を返す。
14.5 Expression 文 (Expression Statement)
構文 (Syntax)
ExpressionStatement [Yield, Await] :
[lookahead ∉ { { , function , async
[no LineTerminator here]
function , class , let
[ }]
Expression [+In, ?Yield, ?Await]
;
Note
ExpressionStatement は U+007B LEFT CURLY BRACKET で始まれない。これは Block との曖昧さを避けるためである。function
または class
で始めることもできない。これは FunctionDeclaration , GeneratorDeclaration , ClassDeclaration との曖昧さを避けるためである。async function
で始めることは AsyncFunctionDeclaration または AsyncGeneratorDeclaration との曖昧さを避けるため禁止される。let [
の 2 トークン列で始めることは、最初の LexicalBinding が ArrayBindingPattern である let
LexicalDeclaration との曖昧さを避けるため禁止される。
14.5.1 実行時意味論: 評価
ExpressionStatement :
Expression
;
exprRef を Expression の Evaluation を ? 付きで行った結果とする。? GetValue (exprRef ) を返す。
14.6 if
文
構文 (Syntax)
IfStatement [Yield, Await, Return] :
if
(
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
else
Statement [?Yield, ?Await, ?Return]
if
(
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
[lookahead ≠ else ]
Note [lookahead ≠ else
] 制約は古典的な「dangling else」問題を通常の方法で解決する。すなわち曖昧な場合、else
は最も内側の if
に関連付けられる。
14.6.1 静的意味論: 早期エラー
IfStatement :
if
(
Expression
)
Statement
else
Statement
最初の Statement について IsLabelledFunction が true なら構文エラー。
二番目の Statement について IsLabelledFunction が true なら構文エラー。
IfStatement :
if
(
Expression
)
Statement
Statement について IsLabelledFunction が true なら構文エラー。
Note
B.3.1 で規定される拡張が実装されている場合にのみこの規則を適用する必要がある。
14.6.2 実行時意味論: 評価
IfStatement :
if
(
Expression
)
Statement
else
Statement
exprRef を Expression の Evaluation を ? 付きで行った結果とする。exprValue を ToBoolean (? GetValue (exprRef )) とする。exprValue が true なら:stmtCompletion を 最初の Statement の Evaluation の Completion とする。それ以外:stmtCompletion を 二番目の Statement の Evaluation の Completion とする。 ? UpdateEmpty (stmtCompletion , undefined ) を返す。
IfStatement :
if
(
Expression
)
Statement
exprRef を Expression の Evaluation を ? 付きで行った結果とする。exprValue を ToBoolean (? GetValue (exprRef )) とする。exprValue が false なら:undefined を返す。それ以外:stmtCompletion を Statement の Evaluation の Completion とする。? UpdateEmpty (stmtCompletion , undefined ) を返す。
14.7 反復文 (Iteration Statements)
構文 (Syntax)
IterationStatement [Yield, Await, Return] :
DoWhileStatement [?Yield, ?Await, ?Return]
WhileStatement [?Yield, ?Await, ?Return]
ForStatement [?Yield, ?Await, ?Return]
ForInOfStatement [?Yield, ?Await, ?Return]
14.7.1 意味論 (Semantics)
14.7.1.1 LoopContinues ( completion , labelSet )
The abstract operation LoopContinues takes arguments completion (a Completion Record ) and labelSet (a List of Strings) and returns a Boolean. It performs the following steps when called:
completion が normal completion なら true を返す。completion が continue completion でないなら false を返す。completion .[[Target]] が empty なら true を返す。labelSet が completion .[[Target]] を含むなら true を返す。false を返す。
Note
14.7.1.2 実行時意味論: LoopEvaluation : ECMAScript 言語値を含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
IterationStatement : DoWhileStatement
DoWhileStatement の DoWhileLoopEvaluation(labelSet ) を ? 付きで返す。
IterationStatement : WhileStatement
WhileStatement の WhileLoopEvaluation(labelSet ) を ? 付きで返す。
IterationStatement : ForStatement
ForStatement の ForLoopEvaluation(labelSet ) を ? 付きで返す。
IterationStatement : ForInOfStatement
ForInOfStatement の ForIn/OfLoopEvaluation(labelSet ) を ? 付きで返す。
14.7.2 do
-while
文
構文 (Syntax)
DoWhileStatement [Yield, Await, Return] :
do
Statement [?Yield, ?Await, ?Return]
while
(
Expression [+In, ?Yield, ?Await]
)
;
14.7.2.1 静的意味論: 早期エラー
DoWhileStatement :
do
Statement
while
(
Expression
)
;
Statement について IsLabelledFunction が true なら構文エラー。
Note
B.3.1 で規定される拡張が実装されている場合にのみこの規則を適用する。
14.7.2.2 実行時意味論: DoWhileLoopEvaluation : ECMAScript 言語値を含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
DoWhileStatement :
do
Statement
while
(
Expression
)
;
V を undefined とする。繰り返し:stmtResult を Statement の Evaluation の Completion とする。LoopContinues (stmtResult , labelSet ) が false なら ? UpdateEmpty (stmtResult , V ) を返す。stmtResult .[[Value]] が empty でなければ V を stmtResult .[[Value]] に設定。exprRef を Expression の Evaluation を ? 付きで行った結果とする。exprValue を ? GetValue (exprRef ) とする。ToBoolean (exprValue ) が false なら V を返す。
14.7.3 while
文
構文 (Syntax)
WhileStatement [Yield, Await, Return] :
while
(
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
14.7.3.1 静的意味論: 早期エラー
WhileStatement :
while
(
Expression
)
Statement
Statement について IsLabelledFunction が true なら構文エラー。
Note
14.7.3.2 実行時意味論: WhileLoopEvaluation : ECMAScript 言語値を含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
WhileStatement :
while
(
Expression
)
Statement
V を undefined とする。繰り返し:exprRef を Expression の Evaluation を ? 付きで行った結果とする。exprValue を ? GetValue (exprRef ) とする。ToBoolean (exprValue ) が false なら V を返す。stmtResult を Statement の Evaluation の Completion とする。LoopContinues (stmtResult , labelSet ) が false なら ? UpdateEmpty (stmtResult , V ) を返す。stmtResult .[[Value]] が empty でなければ V を stmtResult .[[Value]] に設定。
14.7.4 for
文
構文 (Syntax)
ForStatement [Yield, Await, Return] :
for
(
[lookahead ≠ let
[ ]
Expression [~In, ?Yield, ?Await] opt
;
Expression [+In, ?Yield, ?Await] opt
;
Expression [+In, ?Yield, ?Await] opt
)
Statement [?Yield, ?Await, ?Return]
for
(
var
VariableDeclarationList [~In, ?Yield, ?Await]
;
Expression [+In, ?Yield, ?Await] opt
;
Expression [+In, ?Yield, ?Await] opt
)
Statement [?Yield, ?Await, ?Return]
for
(
LexicalDeclaration [~In, ?Yield, ?Await]
Expression [+In, ?Yield, ?Await] opt
;
Expression [+In, ?Yield, ?Await] opt
)
Statement [?Yield, ?Await, ?Return]
14.7.4.1 静的意味論: 早期エラー
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
Statement について IsLabelledFunction が true なら構文エラー。
Note
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
14.7.4.2 実行時意味論: ForLoopEvaluation : ECMAScript 言語値を含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
最初の Expression が存在するなら:exprRef をその Evaluation を ? 付きで行った結果とする。? GetValue (exprRef ) を実行。 二番目の Expression が存在するなら test をそれに、存在しなければ empty とする。 三番目の Expression が存在するなら increment をそれに、存在しなければ empty とする。 ForBodyEvaluation (test , increment , Statement , « », labelSet ) を ? 付きで返す。
ForStatement :
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
VariableDeclarationList の Evaluation を ? 付きで実行。最初の Expression が存在するなら test をそれに、存在しなければ empty 。 二番目の Expression が存在するなら increment をそれに、存在しなければ empty 。 ForBodyEvaluation (test , increment , Statement , « », labelSet ) を ? 付きで返す。
ForStatement :
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
oldEnv を現在実行中コンテキストの LexicalEnvironment とする。loopEnv を NewDeclarativeEnvironment (oldEnv ) とする。isConst を LexicalDeclaration の IsConstantDeclaration とする。boundNames を LexicalDeclaration の BoundNames とする。boundNames の各 dn について:isConst が true なら:! loopEnv .CreateImmutableBinding(dn , true ) を実行。 それ以外:! loopEnv .CreateMutableBinding(dn , false ) を実行。 実行中コンテキストの LexicalEnvironment を loopEnv に設定。 forDcl を LexicalDeclaration の Evaluation の Completion とする。forDcl が abrupt completion なら:実行中コンテキストの LexicalEnvironment を oldEnv に戻す。 ? forDcl を返す。 isConst が false なら perIterationLets を boundNames 、そうでなければ新しい空 List とする。最初の Expression が存在するなら test をそれに、存在しなければ empty 。 二番目の Expression が存在するなら increment をそれに、存在しなければ empty 。 bodyResult を ForBodyEvaluation (test , increment , Statement , perIterationLets , labelSet ) の Completion とする。実行中コンテキストの LexicalEnvironment を oldEnv に戻す。 ? bodyResult を返す。
14.7.4.3 ForBodyEvaluation ( test , increment , stmt , perIterationBindings , labelSet )
The abstract operation ForBodyEvaluation takes arguments test (an Expression Parse Node or empty ), increment (an Expression Parse Node or empty ), stmt (a Statement Parse Node), perIterationBindings (a List of Strings), and labelSet (a List of Strings) and returns ECMAScript 言語値を含む normal completion または abrupt completion . It performs the following steps when called:
V を undefined とする。? CreatePerIterationEnvironment (perIterationBindings ) を実行。 繰り返し:test が empty でないなら:testRef を test の Evaluation を ? 付きで行った結果とする。testValue を ? GetValue (testRef ) とする。ToBoolean (testValue ) が false なら V を返す。result を stmt の Evaluation の Completion とする。LoopContinues (result , labelSet ) が false なら ? UpdateEmpty (result , V ) を返す。result .[[Value]] が empty でなければ V を result .[[Value]] に設定。? CreatePerIterationEnvironment (perIterationBindings ) を実行。 increment が empty でないなら:incRef を increment の Evaluation を ? 付きで行った結果とする。? GetValue (incRef ) を実行。
14.7.4.4 CreatePerIterationEnvironment ( perIterationBindings )
The abstract operation CreatePerIterationEnvironment takes argument perIterationBindings (a List of Strings) and returns unused を含む normal completion または throw completion . It performs the following steps when called:
perIterationBindings が要素を持つなら:lastIterationEnv を現在実行中コンテキストの LexicalEnvironment とする。outer を lastIterationEnv .[[OuterEnv]] とする。Assert : outer は null ではない。thisIterationEnv を NewDeclarativeEnvironment (outer ) とする。perIterationBindings の各 bn について:! thisIterationEnv .CreateMutableBinding(bn , false ) を実行。 lastValue を ? lastIterationEnv .GetBindingValue(bn , true ) とする。! thisIterationEnv .InitializeBinding(bn , lastValue ) を実行。 実行中コンテキストの LexicalEnvironment を thisIterationEnv に設定。 unused を返す。
14.7.5 for
-in
, for
-of
, for
-await
-of
文
構文 (Syntax)
ForInOfStatement [Yield, Await, Return] :
for
(
[lookahead ≠ let
[ ]
LeftHandSideExpression [?Yield, ?Await]
in
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
var
ForBinding [?Yield, ?Await]
in
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
ForDeclaration [?Yield, ?Await]
in
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
[lookahead ∉ { let , async
of }]
LeftHandSideExpression [?Yield, ?Await]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
var
ForBinding [?Yield, ?Await]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
ForDeclaration [?Yield, ?Await]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
[+Await]
for
await
(
[lookahead ≠ let ]
LeftHandSideExpression [?Yield, ?Await]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
[+Await]
for
await
(
var
ForBinding [?Yield, ?Await]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
[+Await]
for
await
(
ForDeclaration [?Yield, ?Await]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
ForDeclaration [Yield, Await] :
LetOrConst
ForBinding [?Yield, ?Await]
ForBinding [Yield, Await] :
BindingIdentifier [?Yield, ?Await]
BindingPattern [?Yield, ?Await]
Note
14.7.5.1 静的意味論: 早期エラー
ForInOfStatement :
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
Statement について IsLabelledFunction が true なら構文エラー。
Note
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 静的意味論: IsDestructuring : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
MemberExpression : PrimaryExpression
PrimaryExpression が ObjectLiteral または ArrayLiteral なら true を返す。false を返す。
MemberExpression :
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
MemberExpression
TemplateLiteral
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
.
PrivateIdentifier
NewExpression :
new
NewExpression
LeftHandSideExpression :
CallExpression
OptionalExpression
false を返す。
ForDeclaration :
LetOrConst
ForBinding
ForBinding の IsDestructuring を返す。
ForBinding : BindingIdentifier
false を返す。
ForBinding : BindingPattern
true を返す。
Note
14.7.5.3 実行時意味論: ForDeclarationBindingInitialization : unused を含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
environment に undefined を渡すのは PutValue による代入を用いるべきことを示す。これは var
文や一部非 strict 関数(10.2.11 参照)の仮引数リストの場合で、これらでは初期化子評価前にレキシカル束縛がホイストされ事前初期化される。
It is defined piecewise over the following productions:
ForDeclaration :
LetOrConst
ForBinding
ForBinding の BindingInitialization(value , environment ) を ? 付きで返す。
14.7.5.4 実行時意味論: ForDeclarationBindingInstantiation : unused
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ForDeclaration :
LetOrConst
ForBinding
ForBinding の BoundNames の各 name について:LetOrConst の IsConstantDeclaration が true なら:! environment .CreateImmutableBinding(name , true ) を実行。 それ以外:! environment .CreateMutableBinding(name , false ) を実行。 unused を返す。
14.7.5.5 実行時意味論: ForInOfLoopEvaluation : ECMAScript 言語値を含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ForInOfStatement :
for
(
LeftHandSideExpression
in
Expression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (« », Expression , enumerate ) とする。? ForIn/OfBodyEvaluation (LeftHandSideExpression , Statement , keyResult , enumerate , assignment , labelSet ) を返す。
ForInOfStatement :
for
(
var
ForBinding
in
Expression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (« », Expression , enumerate ) とする。? ForIn/OfBodyEvaluation (ForBinding , Statement , keyResult , enumerate , var-binding , labelSet ) を返す。
ForInOfStatement :
for
(
ForDeclaration
in
Expression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (BoundNames of ForDeclaration , Expression , enumerate ) とする。? ForIn/OfBodyEvaluation (ForDeclaration , Statement , keyResult , enumerate , lexical-binding , labelSet ) を返す。
ForInOfStatement :
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (« », AssignmentExpression , iterate ) とする。? ForIn/OfBodyEvaluation (LeftHandSideExpression , Statement , keyResult , iterate , assignment , labelSet ) を返す。
ForInOfStatement :
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (« », AssignmentExpression , iterate ) とする。? ForIn/OfBodyEvaluation (ForBinding , Statement , keyResult , iterate , var-binding , labelSet ) を返す。
ForInOfStatement :
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (BoundNames of ForDeclaration , AssignmentExpression , iterate ) とする。? ForIn/OfBodyEvaluation (ForDeclaration , Statement , keyResult , iterate , lexical-binding , labelSet ) を返す。
ForInOfStatement :
for
await
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (« », AssignmentExpression , async-iterate ) とする。? ForIn/OfBodyEvaluation (LeftHandSideExpression , Statement , keyResult , iterate , assignment , labelSet , async ) を返す。
ForInOfStatement :
for
await
(
var
ForBinding
of
AssignmentExpression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (« », AssignmentExpression , async-iterate ) とする。? ForIn/OfBodyEvaluation (ForBinding , Statement , keyResult , iterate , var-binding , labelSet , async ) を返す。
ForInOfStatement :
for
await
(
ForDeclaration
of
AssignmentExpression
)
Statement
keyResult を ? ForIn/OfHeadEvaluation (BoundNames of ForDeclaration , AssignmentExpression , async-iterate ) とする。? ForIn/OfBodyEvaluation (ForDeclaration , Statement , keyResult , iterate , lexical-binding , labelSet , async ) を返す。
Note
14.7.5.6 ForIn/OfHeadEvaluation ( uninitializedBoundNames , expr , iterationKind )
The abstract operation ForIn/OfHeadEvaluation takes arguments uninitializedBoundNames (a List of Strings), expr (an Expression Parse Node or an AssignmentExpression Parse Node), and iterationKind (enumerate , iterate , or async-iterate ) and returns Iterator Record を含む normal completion または abrupt completion . It performs the following steps when called:
oldEnv を現在実行中コンテキストの LexicalEnvironment とする。uninitializedBoundNames が空でないなら:Assert : 重複はない。newEnv を NewDeclarativeEnvironment (oldEnv ) とする。uninitializedBoundNames の各 String name について:! newEnv .CreateMutableBinding(name , false ) を実行。 実行中コンテキストの LexicalEnvironment を newEnv に設定。 exprRef を expr の Evaluation の Completion とする。実行中コンテキストの LexicalEnvironment を oldEnv に戻す。 exprValue を ? GetValue (? exprRef ) とする。iterationKind が enumerate なら:exprValue が undefined または null なら:Completion Record { [[Type]] : break , [[Value]] : empty , [[Target]] : empty } を返す。obj を ! ToObject (exprValue ) とする。iterator を EnumerateObjectProperties (obj ) とする。nextMethod を ! GetV (iterator , "next" ) とする。Iterator Record { [[Iterator]] : iterator , [[NextMethod]] : nextMethod , [[Done]] : false } を返す。それ以外:Assert : iterationKind は iterate 又は async-iterate 。iterationKind が async-iterate なら iteratorKind を async とする。そうでなければ sync 。? GetIterator (exprValue , iteratorKind ) を返す。
14.7.5.7 ForIn/OfBodyEvaluation ( lhs , stmt , iteratorRecord , iterationKind , lhsKind , labelSet [ , iteratorKind ] )
The abstract operation ForIn/OfBodyEvaluation takes arguments lhs (a Parse Node), stmt (a Statement Parse Node), iteratorRecord (an Iterator Record ), iterationKind (enumerate or iterate ), lhsKind (assignment , var-binding , or lexical-binding ), and labelSet (a List of Strings) and optional argument iteratorKind (sync or async ) and returns ECMAScript 言語値を含む normal completion または abrupt completion . It performs the following steps when called:
iteratorKind が与えられていなければ sync とする。oldEnv を現在実行中コンテキストの LexicalEnvironment とする。V を undefined とする。destructuring を IsDestructuring of lhs とする。destructuring が true かつ lhsKind が assignment なら:Assert : lhs は LeftHandSideExpression 。assignmentPattern を lhs が覆う AssignmentPattern とする。繰り返し:nextResult を ? Call(iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] ) とする。iteratorKind が async なら nextResult を ? Await (nextResult ) とする。nextResult が Object でなければ TypeError を throw。done を ? IteratorComplete (nextResult ) とする。done が true なら V を返す。nextValue を ? IteratorValue (nextResult ) とする。lhsKind が assignment または var-binding の場合:destructuring が true なら:lhsKind が assignment なら:status を DestructuringAssignmentEvaluation of assignmentPattern (nextValue 引数) の Completion 。それ以外:Assert : lhsKind は var-binding 。Assert : lhs は ForBinding 。status を ForBinding の BindingInitialization(nextValue , undefined ) の Completion 。 それ以外:lhsRef を lhs の Evaluation の Completion (繰り返し行われ得る)とする。lhsKind が assignment かつ lhs の AssignmentTargetType が web-compat なら ReferenceError を throw。lhsRef が abrupt completion なら:status を lhsRef とする。それ以外:status を Completion (PutValue (lhsRef .[[Value]] , nextValue )) とする。 それ以外:Assert : lhsKind は lexical-binding 。Assert : lhs は ForDeclaration 。iterationEnv を NewDeclarativeEnvironment (oldEnv ) とする。ForDeclarationBindingInstantiation of lhs (iterationEnv ) を実行。 実行中コンテキストの LexicalEnvironment を iterationEnv に設定。 destructuring が true なら:status を ForDeclarationBindingInitialization of lhs (nextValue , iterationEnv ) の Completion 。それ以外:Assert : lhs は単一名を束縛する。lhsName を lhs の BoundNames の唯一の要素とする。lhsRef を ! ResolveBinding (lhsName ) とする。status を Completion (InitializeReferencedBinding (lhsRef , nextValue )) とする。 status が abrupt completion なら:実行中コンテキストの LexicalEnvironment を oldEnv に戻す。 iteratorKind が async なら ? AsyncIteratorClose (iteratorRecord , status ) を返す。iterationKind が enumerate なら:? status を返す。 それ以外:Assert : iterationKind は iterate 。? IteratorClose (iteratorRecord , status ) を返す。 result を Statement の Evaluation の Completion とする。実行中コンテキストの LexicalEnvironment を oldEnv に戻す。 LoopContinues (result , labelSet ) が false なら:iterationKind が enumerate なら:? UpdateEmpty (result , V ) を返す。 それ以外:Assert : iterationKind は iterate 。status を Completion (UpdateEmpty (result , V )) とする。iteratorKind が async なら ? AsyncIteratorClose (iteratorRecord , status ) を返す。? IteratorClose (iteratorRecord , status ) を返す。 result .[[Value]] が empty でなければ V を result .[[Value]] に設定。
14.7.5.8 実行時意味論: 評価
BindingIdentifier :
Identifier
yield
await
bindingId を BindingIdentifier の StringValue とする。? ResolveBinding (bindingId ) を返す。
14.7.5.9 EnumerateObjectProperties ( O )
The abstract operation EnumerateObjectProperties takes argument O (an Object) and returns 反復子 (iterator object ). It performs the following steps when called:
O の列挙可能なプロパティの String キーを反復する next
メソッドを持つ反復子オブジェクトを返す。この反復子は ECMAScript コードから直接アクセスできない。列挙の機構と順序は下記規則に従う限り規定されない。
反復子の throw
および return
メソッドは null で呼ばれない。next
メソッドはプロパティキー を返すべきか判定する。返されるキーは Symbol を含まない。列挙中にターゲットオブジェクトのプロパティが削除されることがある。削除されたプロパティは無視される。列挙中に新規プロパティが追加されても処理される保証はない。いかなる列挙でも同じプロパティ名 は高々一度だけ返される。
ターゲットオブジェクトの列挙はそのプロトタイプ、さらにそのプロトタイプ…と再帰的に行う。ただし既に next
により処理済みの名前と同名のプロトタイプ上のプロパティは処理しない。処理済み判定に [[Enumerable]] 属性値は考慮しない。プロトタイプオブジェクトの列挙可能プロパティ名 取得には EnumerateObjectProperties をそのプロトタイプに対し呼び出す。ターゲットオブジェクトの own プロパティキー は [[OwnPropertyKeys]] 内部メソッド呼出しで取得し、属性は [[GetOwnProperty]] 内部メソッド呼出しで取得する。
加えて O およびそのプロトタイプ連鎖上のいずれも Proxy, TypedArray , module namespace, 実装提供の exotic object でないなら、以下のいずれかが起こるまで反復子は CreateForInIterator (O ) によるものと同様に振る舞わねばならない:
O またはプロトタイプ連鎖上のオブジェクトの [[Prototype]] 値が変化
O または連鎖上オブジェクトからプロパティが削除
O のプロトタイプ連鎖上のオブジェクトにプロパティが追加
O または連鎖上オブジェクトのプロパティの [[Enumerable]] が変化
Note 1
実装は 14.7.5.10.2.1 のアルゴリズムを直接実装する必要はない。上記制約が破られない限り挙動が一致する任意実装を選べる。
以下はこれら規則に従う ECMAScript generator function の参考定義である:
function * EnumerateObjectProperties (obj) {
const visited = new Set ();
for (const key of Reflect .ownKeys (obj)) {
if (typeof key === "symbol" ) continue ;
const desc = Reflect .getOwnPropertyDescriptor (obj, key);
if (desc) {
visited.add (key);
if (desc.enumerable ) yield key;
}
}
const proto = Reflect .getPrototypeOf (obj);
if (proto === null ) return ;
for (const protoKey of EnumerateObjectProperties (proto)) {
if (!visited.has (protoKey)) yield protoKey;
}
}
Note 2
CreateForInIterator との一致が不要な exotic object のリストは、歴史的に挙動差異があり他については一致していたため選択された。
14.7.5.10 For-In 反復子オブジェクト
For-In Iterator は特定オブジェクト上の特定の列挙を表すオブジェクトである。ECMAScript コードから直接アクセスされず、EnumerateObjectProperties の挙動説明のためのみ存在する。
14.7.5.10.1 CreateForInIterator ( object )
The abstract operation CreateForInIterator takes argument object (an Object) and returns For-In Iterator . object の own および継承された列挙可能な文字列プロパティを特定順序で反復する For-In Iterator オブジェクトを生成する。 It performs the following steps when called:
iterator を OrdinaryObjectCreate (%ForInIteratorPrototype% , « [[Object]] , [[ObjectWasVisited]] , [[VisitedKeys]] , [[RemainingKeys]] ») とする。iterator .[[Object]] を object に設定。iterator .[[ObjectWasVisited]] を false に設定。iterator .[[VisitedKeys]] を空 List に設定。iterator .[[RemainingKeys]] を空 List に設定。iterator を返す。
14.7.5.10.2 %ForInIteratorPrototype% オブジェクト
%ForInIteratorPrototype% オブジェクト:
14.7.5.10.2.1 %ForInIteratorPrototype%.next ( )
O を this 値とする。Assert : O は Object。Assert : O は For-In Iterator インスタンスの内部スロットを全て持つ (14.7.5.10.3 )。object を O .[[Object]] とする。繰り返し:O .[[ObjectWasVisited]] が false なら:keys を ? object .[[OwnPropertyKeys]] () とする。keys の各 key について:key が String なら:O .[[RemainingKeys]] に key を追加。O .[[ObjectWasVisited]] を true に設定。O .[[RemainingKeys]] が空でない間の繰り返し:r を O .[[RemainingKeys]] の先頭要素とする。先頭要素を削除。 O .[[VisitedKeys]] が r を含まないなら:desc を ? object .[[GetOwnProperty]] (r ) とする。desc が undefined でなければ:O .[[VisitedKeys]] に r を追加。desc .[[Enumerable]] が true なら CreateIteratorResultObject (r , false ) を返す。object を ? object .[[GetPrototypeOf]] () とする。O .[[Object]] を object に設定。O .[[ObjectWasVisited]] を false に設定。object が null なら CreateIteratorResultObject (undefined , true ) を返す。
14.7.5.10.3 For-In Iterator インスタンスのプロパティ
For-In Iterator インスタンスは %ForInIteratorPrototype% からプロパティを継承する通常オブジェクト であり、Table 36 に列挙する内部スロットで初期化される。
Table 36: For-In Iterator インスタンスの内部スロット
Internal Slot
Type
説明 (Description)
[[Object]]
an Object
プロパティを列挙中のオブジェクト値。
[[ObjectWasVisited]]
a Boolean
既に [[OwnPropertyKeys]] を呼び出したなら true 、そうでなければ false 。
[[VisitedKeys]]
a List of Strings
これまでにこの反復子が出力した値。
[[RemainingKeys]]
a List of Strings
現在のオブジェクトで未出力の値(プロトタイプ列挙前。プロトタイプが null でなければ)。
14.8 continue
文
構文 (Syntax)
ContinueStatement [Yield, Await] :
continue
;
continue
[no LineTerminator here]
LabelIdentifier [?Yield, ?Await]
;
14.8.1 静的意味論: 早期エラー
ContinueStatement :
continue
;
continue
LabelIdentifier
;
14.8.2 実行時意味論: 評価
ContinueStatement :
continue
;
Completion Record { [[Type]] : continue , [[Value]] : empty , [[Target]] : empty } を返す。
ContinueStatement :
continue
LabelIdentifier
;
label を LabelIdentifier の StringValue とする。Completion Record { [[Type]] : continue , [[Value]] : empty , [[Target]] : label } を返す。
14.9 break
文
構文 (Syntax)
BreakStatement [Yield, Await] :
break
;
break
[no LineTerminator here]
LabelIdentifier [?Yield, ?Await]
;
14.9.1 静的意味論: 早期エラー
BreakStatement :
break
;
14.9.2 実行時意味論: 評価
BreakStatement :
break
;
Completion Record { [[Type]] : break , [[Value]] : empty , [[Target]] : empty } を返す。
BreakStatement :
break
LabelIdentifier
;
label を LabelIdentifier の StringValue とする。Completion Record { [[Type]] : break , [[Value]] : empty , [[Target]] : label } を返す。
14.10 return
文
構文 (Syntax)
ReturnStatement [Yield, Await] :
return
;
return
[no LineTerminator here]
Expression [+In, ?Yield, ?Await]
;
Note
return
文は関数の実行を停止し、通常は呼出し元に値を返す。Expression が省略された場合戻り値は undefined 。存在する場合その値を返す。try
ブロック内など文脈によっては必ずしも呼出し元に値を返さない(finally
で上書きされる等)。
14.10.1 実行時意味論: 評価
ReturnStatement :
return
;
ReturnCompletion (undefined ) を返す。
ReturnStatement :
return
Expression
;
exprRef を Expression の Evaluation を ? 付きで行った結果とする。exprValue を ? GetValue (exprRef ) とする。GetGeneratorKind () が async なら exprValue を ? Await (exprValue ) に設定。ReturnCompletion (exprValue ) を返す。
Legacy
14.11 with
文
Note 1
レガシー with
文の使用は新しい ECMAScript コードでは推奨されない。分割代入 など strict / 非 strict 両方で許容される代替を検討せよ。
構文 (Syntax)
WithStatement [Yield, Await, Return] :
with
(
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
Note 2
with
文は計算されたオブジェクトの Object Environment Record を実行中コンテキストのレキシカル環境に追加し、この拡張環境で Statement を実行し、その後元の環境を復元する。
14.11.1 静的意味論: 早期エラー
WithStatement :
with
(
Expression
)
Statement
IsStrict(this production) が true なら構文エラー。
Statement について IsLabelledFunction が true なら構文エラー。
Note
2 番目の規則は B.3.1 の拡張が実装される場合のみ適用。
14.11.2 実行時意味論: 評価
WithStatement :
with
(
Expression
)
Statement
val を Expression の Evaluation を ? 付きで行った結果とする。obj を ? ToObject (? GetValue (val )) とする。oldEnv を実行中コンテキストの LexicalEnvironment とする。newEnv を NewObjectEnvironment (obj , true , oldEnv ) とする。実行中コンテキストの LexicalEnvironment を newEnv に設定。 C を Statement の Evaluation の Completion とする。実行中コンテキストの LexicalEnvironment を oldEnv に戻す。 ? UpdateEmpty (C , undefined ) を返す。
Note
埋め込まれた Statement をどのように抜けても(通常終了・abrupt completion ・例外)LexicalEnvironment は常に元に戻る。
14.12 switch
文
構文 (Syntax)
SwitchStatement [Yield, Await, Return] :
switch
(
Expression [+In, ?Yield, ?Await]
)
CaseBlock [?Yield, ?Await, ?Return]
CaseBlock [Yield, Await, Return] :
{
CaseClauses [?Yield, ?Await, ?Return] opt
}
{
CaseClauses [?Yield, ?Await, ?Return] opt
DefaultClause [?Yield, ?Await, ?Return]
CaseClauses [?Yield, ?Await, ?Return] opt
}
CaseClauses [Yield, Await, Return] :
CaseClause [?Yield, ?Await, ?Return]
CaseClauses [?Yield, ?Await, ?Return]
CaseClause [?Yield, ?Await, ?Return]
CaseClause [Yield, Await, Return] :
case
Expression [+In, ?Yield, ?Await]
:
StatementList [?Yield, ?Await, ?Return] opt
DefaultClause [Yield, Await, Return] :
default
:
StatementList [?Yield, ?Await, ?Return] opt
14.12.1 静的意味論: 早期エラー
SwitchStatement :
switch
(
Expression
)
CaseBlock
14.12.2 実行時意味論: CaseBlockEvaluation : ECMAScript 言語値を含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
CaseBlock :
{
}
undefined を返す。
CaseBlock :
{
CaseClauses
}
V を undefined とする。A を CaseClauses 内の CaseClause 項目(ソース順)の List とする。found を false とする。各 CaseClause C について:found が false なら:found を ? CaseClauseIsSelected (C , input ) に設定。found が true なら:R を C の Evaluation の Completion とする。R .[[Value]] が empty でなければ V を R .[[Value]] に設定。R が abrupt completion なら ? UpdateEmpty (R , V ) を返す。 V を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
V を undefined とする。最初の CaseClauses が存在するなら:A をその CaseClause 項目(ソース順)List とする。 それ以外:A を空 List とする。 found を false とする。A の各 CaseClause C について:found が false なら:found を ? CaseClauseIsSelected (C , input ) に設定。found が true なら:R を C の Evaluation の Completion とする。R .[[Value]] が empty でなければ V を R .[[Value]] に設定。R が abrupt completion なら ? UpdateEmpty (R , V ) を返す。foundInB を false とする。二番目の CaseClauses が存在するなら:B をその CaseClause 項目(ソース順)List とする。 それ以外:B を空 List とする。 found が false なら:B の各 CaseClause C について:foundInB が false なら:foundInB を ? CaseClauseIsSelected (C , input ) に設定。foundInB が true なら:R を CaseClause C の Evaluation の Completion とする。R .[[Value]] が empty でなければ V を R .[[Value]] に設定。R が abrupt completion なら ? UpdateEmpty (R , V ) を返す。foundInB が true なら V を返す。defaultR を DefaultClause の Evaluation の Completion とする。defaultR .[[Value]] が empty でなければ V を defaultR .[[Value]] に設定。defaultR が abrupt completion なら ? UpdateEmpty (defaultR , V ) を返す。注: ここから二番目の CaseClauses を再度全走査する。 B の各 CaseClause C について:R を CaseClause C の Evaluation の Completion とする。R .[[Value]] が empty でなければ V を R .[[Value]] に設定。R が abrupt completion なら ? UpdateEmpty (R , V ) を返す。V を返す。
14.12.3 CaseClauseIsSelected ( C , input )
The abstract operation CaseClauseIsSelected takes arguments C (a CaseClause Parse Node) and input (an ECMAScript language value) and returns Boolean を含む normal completion または abrupt completion . C が input にマッチするか判定する。 It performs the following steps when called:
Assert : C は
CaseClause :
case
Expression
:
StatementList opt
のインスタンス。exprRef を C の Expression の Evaluation を ? 付きで行った結果とする。clauseSelector を ? GetValue (exprRef ) とする。IsStrictlyEqual (input , clauseSelector ) を返す。
Note
この操作は C の StatementList を実行しない。CaseBlock アルゴリズムは戻り値によりどの StatementList から実行開始するかを決定する。
14.12.4 実行時意味論: 評価
SwitchStatement :
switch
(
Expression
)
CaseBlock
exprRef を Expression の Evaluation を ? 付きで行った結果とする。switchValue を ? GetValue (exprRef ) とする。oldEnv を現在実行中コンテキストの LexicalEnvironment とする。blockEnv を NewDeclarativeEnvironment (oldEnv ) とする。BlockDeclarationInstantiation (CaseBlock , blockEnv ) を実行。実行中コンテキストの LexicalEnvironment を blockEnv に設定。 R を CaseBlockEvaluation of CaseBlock (引数 switchValue ) の Completion とする。実行中コンテキストの LexicalEnvironment を oldEnv に戻す。 R を返す。
Note
SwitchStatement をどのように抜けても LexicalEnvironment は常に元に戻る。
CaseClause :
case
Expression
:
empty を返す。
CaseClause :
case
Expression
:
StatementList
StatementList の Evaluation を ? 付きで返す。
DefaultClause :
default
:
empty を返す。
DefaultClause :
default
:
StatementList
StatementList の Evaluation を ? 付きで返す。
14.13 ラベル付き文 (Labelled Statements)
構文 (Syntax)
LabelledStatement [Yield, Await, Return] :
LabelIdentifier [?Yield, ?Await]
:
LabelledItem [?Yield, ?Await, ?Return]
LabelledItem [Yield, Await, Return] :
Statement [?Yield, ?Await, ?Return]
FunctionDeclaration [?Yield, ?Await, ~Default]
Note
Statement はラベルで前置できる。ラベル付き文はラベル付き break
/ continue
と組み合わせてのみ利用され、ECMAScript には goto
はない。Statement は LabelledStatement の一部となり再帰的にネスト可能。その導入されたラベル集合を「current label set」と呼ぶ。
14.13.1 静的意味論: 早期エラー
LabelledItem : FunctionDeclaration
14.13.2
静的意味論: IsLabelledFunction (
stmt : a Statement Parse Node,
): Boolean
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
stmt が LabelledStatement でなければ false を返す。item を stmt の LabelledItem とする。item が
LabelledItem : FunctionDeclaration
なら true を返す。subStmt を item の Statement とする。IsLabelledFunction(subStmt ) を返す。
14.13.3 実行時意味論: 評価
LabelledStatement :
LabelIdentifier
:
LabelledItem
この LabelledStatement の LabelledEvaluation (引数 « ») を ? 付きで返す。
14.13.4 実行時意味論: LabelledEvaluation : ECMAScript 言語値または empty を含む normal completion あるいは abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
BreakableStatement : IterationStatement
stmtResult を LoopEvaluation of IterationStatement (labelSet ) の Completion とする。stmtResult が break completion なら:stmtResult .[[Target]] が empty なら:stmtResult .[[Value]] が empty なら stmtResult を NormalCompletion (undefined ) に設定。それ以外は NormalCompletion (stmtResult .[[Value]] ) に設定。 ? stmtResult を返す。
BreakableStatement : SwitchStatement
stmtResult を SwitchStatement の Evaluation の Completion とする。stmtResult が break completion なら:stmtResult .[[Target]] が empty なら:stmtResult .[[Value]] が empty なら stmtResult を NormalCompletion (undefined ) に、そうでなければ NormalCompletion (stmtResult .[[Value]] ) に設定。? stmtResult を返す。
Note 1
LabelledStatement :
LabelIdentifier
:
LabelledItem
label を LabelIdentifier の StringValue とする。newLabelSet を labelSet と « label » のリスト連結とする。stmtResult を LabelledItem の LabelledEvaluation(newLabelSet ) の Completion とする。stmtResult が break completion かつ stmtResult .[[Target]] が label なら:stmtResult を NormalCompletion (stmtResult .[[Value]] ) に設定。? stmtResult を返す。
LabelledItem : FunctionDeclaration
FunctionDeclaration の Evaluation を ? 付きで返す。
Statement :
BlockStatement
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
ThrowStatement
TryStatement
DebuggerStatement
Statement の Evaluation を ? 付きで返す。
Note 2
Statement のうち LabelledEvaluation に特別な意味論を持つのは BreakableStatement と LabelledStatement のみ。
14.14 throw
文
構文 (Syntax)
ThrowStatement [Yield, Await] :
throw
[no LineTerminator here]
Expression [+In, ?Yield, ?Await]
;
14.14.1 実行時意味論: 評価
ThrowStatement :
throw
Expression
;
exprRef を Expression の Evaluation を ? 付きで行った結果とする。exprValue を ? GetValue (exprRef ) とする。ThrowCompletion (exprValue ) を返す。
14.15 try
文
構文 (Syntax)
TryStatement [Yield, Await, Return] :
try
Block [?Yield, ?Await, ?Return]
Catch [?Yield, ?Await, ?Return]
try
Block [?Yield, ?Await, ?Return]
Finally [?Yield, ?Await, ?Return]
try
Block [?Yield, ?Await, ?Return]
Catch [?Yield, ?Await, ?Return]
Finally [?Yield, ?Await, ?Return]
Catch [Yield, Await, Return] :
catch
(
CatchParameter [?Yield, ?Await]
)
Block [?Yield, ?Await, ?Return]
catch
Block [?Yield, ?Await, ?Return]
Finally [Yield, Await, Return] :
finally
Block [?Yield, ?Await, ?Return]
CatchParameter [Yield, Await] :
BindingIdentifier [?Yield, ?Await]
BindingPattern [?Yield, ?Await]
Note
try
文は例外(実行時エラーや throw
)が発生し得るコードブロックを囲む。catch
節は例外処理コードを提供し、捕捉時その CatchParameter に例外が束縛される。
14.15.1 静的意味論: 早期エラー
Catch :
catch
(
CatchParameter
)
Block
14.15.2 実行時意味論: CatchClauseEvaluation : ECMAScript 言語値または empty を含む normal completion あるいは abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Catch :
catch
(
CatchParameter
)
Block
oldEnv を実行中コンテキストの LexicalEnvironment とする。catchEnv を NewDeclarativeEnvironment (oldEnv ) とする。CatchParameter の BoundNames の各 argName について:! catchEnv .CreateMutableBinding(argName , false ) を実行。 実行中コンテキストの LexicalEnvironment を catchEnv に設定。 status を CatchParameter の BindingInitialization(thrownValue , catchEnv ) の Completion とする。status が abrupt completion なら:LexicalEnvironment を oldEnv に戻す。 ? status を返す。 B を Block の Evaluation の Completion とする。LexicalEnvironment を oldEnv に戻す。 ? B を返す。
Catch :
catch
Block
Block の Evaluation を ? 付きで返す。
Note
Block をどのように抜けても LexicalEnvironment は常に元に復元される。
14.15.3 実行時意味論: 評価
TryStatement :
try
Block
Catch
B を Block の Evaluation の Completion とする。B が throw completion なら C を CatchClauseEvaluation of Catch (B .[[Value]] 引数) の Completion 、そうでなければ C を B とする。? UpdateEmpty (C , undefined ) を返す。
TryStatement :
try
Block
Finally
B を Block の Evaluation の Completion とする。F を Finally の Evaluation の Completion とする。F が normal completion なら F を B に設定。? UpdateEmpty (F , undefined ) を返す。
TryStatement :
try
Block
Catch
Finally
B を Block の Evaluation の Completion とする。B が throw completion なら C を CatchClauseEvaluation of Catch (B .[[Value]] 引数) の Completion 、そうでなければ C を B とする。F を Finally の Evaluation の Completion とする。F が normal completion なら F を C に設定。? UpdateEmpty (F , undefined ) を返す。
14.16 debugger
文
構文 (Syntax)
DebuggerStatement :
debugger
;
14.16.1 実行時意味論: 評価
Note
DebuggerStatement の評価は、デバッガ下で実行時にブレークポイントを発生させることを実装に許す。デバッガ非存在または非活性なら可視効果はない。
DebuggerStatement :
debugger
;
実装定義 のデバッグ機能が利用可能かつ有効なら:実装定義 のデバッグ動作を実行。新しい実装定義 Completion Record を返す。 それ以外:empty を返す。
15 ECMAScript 言語: 関数とクラス
Note
様々な ECMAScript 言語要素は ECMAScript 関数オブジェクト (10.2 ) を生成する。これらの関数の評価は、その [[Call]] 内部メソッド (10.2.1 ) の実行から開始される。
15.1 仮引数リスト (Parameter Lists)
構文 (Syntax)
UniqueFormalParameters [Yield, Await] :
FormalParameters [?Yield, ?Await]
FormalParameters [Yield, Await] :
[empty]
FunctionRestParameter [?Yield, ?Await]
FormalParameterList [?Yield, ?Await]
FormalParameterList [?Yield, ?Await]
,
FormalParameterList [?Yield, ?Await]
,
FunctionRestParameter [?Yield, ?Await]
FormalParameterList [Yield, Await] :
FormalParameter [?Yield, ?Await]
FormalParameterList [?Yield, ?Await]
,
FormalParameter [?Yield, ?Await]
FunctionRestParameter [Yield, Await] :
BindingRestElement [?Yield, ?Await]
FormalParameter [Yield, Await] :
BindingElement [?Yield, ?Await]
15.1.1 静的意味論: 早期エラー (Early Errors)
UniqueFormalParameters : FormalParameters
FormalParameters : FormalParameterList
Note
同一の BindingIdentifier が FormalParameterList 内に複数回出現することが許されるのは、パラメータリストが「単純 (simple)」であり、かつ strict mode コード内で定義されていない関数の場合に限られる。
15.1.2 静的意味論: ContainsExpression : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ObjectBindingPattern :
{
}
{
BindingRestProperty
}
false を返す。
ObjectBindingPattern :
{
BindingPropertyList
,
BindingRestProperty
}
BindingPropertyList の ContainsExpression を返す。
ArrayBindingPattern :
[
Elision opt
]
false を返す。
ArrayBindingPattern :
[
Elision opt
BindingRestElement
]
BindingRestElement の ContainsExpression を返す。
ArrayBindingPattern :
[
BindingElementList
,
Elision opt
]
BindingElementList の ContainsExpression を返す。
ArrayBindingPattern :
[
BindingElementList
,
Elision opt
BindingRestElement
]
has を BindingElementList の ContainsExpression とする。has が true なら true を返す。BindingRestElement の ContainsExpression を返す。
BindingPropertyList :
BindingPropertyList
,
BindingProperty
has を BindingPropertyList の ContainsExpression とする。has が true なら true を返す。BindingProperty の ContainsExpression を返す。
BindingElementList :
BindingElementList
,
BindingElisionElement
has を BindingElementList の ContainsExpression とする。has が true なら true を返す。BindingElisionElement の ContainsExpression を返す。
BindingElisionElement :
Elision opt
BindingElement
BindingElement の ContainsExpression を返す。
BindingProperty :
PropertyName
:
BindingElement
has を PropertyName の IsComputedPropertyKey とする。has が true なら true を返す。BindingElement の ContainsExpression を返す。
BindingElement :
BindingPattern
Initializer
true を返す。
SingleNameBinding : BindingIdentifier
false を返す。
SingleNameBinding :
BindingIdentifier
Initializer
true を返す。
BindingRestElement :
...
BindingIdentifier
false を返す。
BindingRestElement :
...
BindingPattern
BindingPattern の ContainsExpression を返す。
FormalParameters : [empty]
false を返す。
FormalParameters :
FormalParameterList
,
FunctionRestParameter
FormalParameterList の ContainsExpression が true なら true を返す。FunctionRestParameter の ContainsExpression を返す。
FormalParameterList :
FormalParameterList
,
FormalParameter
FormalParameterList の ContainsExpression が true なら true を返す。FormalParameter の ContainsExpression を返す。
ArrowParameters : BindingIdentifier
false を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
formals を CoverParenthesizedExpressionAndArrowParameterList が覆う ArrowFormalParameters とする。formals の ContainsExpression を返す。
AsyncArrowBindingIdentifier : BindingIdentifier
false を返す。
15.1.3 静的意味論: IsSimpleParameterList : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
BindingElement : BindingPattern
false を返す。
BindingElement :
BindingPattern
Initializer
false を返す。
SingleNameBinding : BindingIdentifier
true を返す。
SingleNameBinding :
BindingIdentifier
Initializer
false を返す。
FormalParameters : [empty]
true を返す。
FormalParameters : FunctionRestParameter
false を返す。
FormalParameters :
FormalParameterList
,
FunctionRestParameter
false を返す。
FormalParameterList :
FormalParameterList
,
FormalParameter
FormalParameterList の IsSimpleParameterList が false なら false を返す。FormalParameter の IsSimpleParameterList を返す。
FormalParameter : BindingElement
BindingElement の IsSimpleParameterList を返す。
ArrowParameters : BindingIdentifier
true を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
formals を CoverParenthesizedExpressionAndArrowParameterList が覆う ArrowFormalParameters とする。formals の IsSimpleParameterList を返す。
AsyncArrowBindingIdentifier : BindingIdentifier
true を返す。
CoverCallExpressionAndAsyncArrowHead :
MemberExpression
Arguments
head を CoverCallExpressionAndAsyncArrowHead が覆う AsyncArrowHead とする。head の IsSimpleParameterList を返す。
15.1.4 静的意味論: HasInitializer : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
BindingElement : BindingPattern
false を返す。
BindingElement :
BindingPattern
Initializer
true を返す。
SingleNameBinding : BindingIdentifier
false を返す。
SingleNameBinding :
BindingIdentifier
Initializer
true を返す。
FormalParameterList :
FormalParameterList
,
FormalParameter
FormalParameterList の HasInitializer が true なら true を返す。FormalParameter の HasInitializer を返す。
15.1.5 静的意味論: ExpectedArgumentCount
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
FormalParameters :
[empty]
FunctionRestParameter
0 を返す。
FormalParameters :
FormalParameterList
,
FunctionRestParameter
FormalParameterList の ExpectedArgumentCount を返す。
Note
FormalParameterList の ExpectedArgumentCount は、rest parameter または初期化子を持つ最初の FormalParameter の左側にある FormalParameters の個数である。初期化子を持つ最初のパラメータの後に初期化子を持たないパラメータを置くことは許されるが、そのようなパラメータはデフォルト値 undefined の任意 (optional) パラメータと見なされる。
FormalParameterList : FormalParameter
FormalParameter の HasInitializer が true なら 0 を返す。1 を返す。
FormalParameterList :
FormalParameterList
,
FormalParameter
count を FormalParameterList の ExpectedArgumentCount とする。FormalParameterList の HasInitializer が true または FormalParameter の HasInitializer が true なら count を返す。count + 1 を返す。
ArrowParameters : BindingIdentifier
1 を返す。
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
formals を CoverParenthesizedExpressionAndArrowParameterList が覆う ArrowFormalParameters とする。formals の ExpectedArgumentCount を返す。
PropertySetParameterList : FormalParameter
FormalParameter の HasInitializer が true なら 0 を返す。1 を返す。
AsyncArrowBindingIdentifier : BindingIdentifier
1 を返す。
15.2 関数定義 (Function Definitions)
構文 (Syntax)
FunctionDeclaration [Yield, Await, Default] :
function
BindingIdentifier [?Yield, ?Await]
(
FormalParameters [~Yield, ~Await]
)
{
FunctionBody [~Yield, ~Await]
}
[+Default]
function
(
FormalParameters [~Yield, ~Await]
)
{
FunctionBody [~Yield, ~Await]
}
FunctionExpression :
function
BindingIdentifier [~Yield, ~Await] opt
(
FormalParameters [~Yield, ~Await]
)
{
FunctionBody [~Yield, ~Await]
}
FunctionBody [Yield, Await] :
FunctionStatementList [?Yield, ?Await]
FunctionStatementList [Yield, Await] :
StatementList [?Yield, ?Await, +Return] opt
15.2.1 静的意味論: 早期エラー (Early Errors)
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
FunctionExpression :
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
Note
FunctionBody の LexicallyDeclaredNames には var 宣言や function 宣言で束縛された識別子は含まれない。
FunctionBody : FunctionStatementList
15.2.2 静的意味論: FunctionBodyContainsUseStrict : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
FunctionBody : FunctionStatementList
FunctionBody の Directive Prologue が Use Strict Directive を含むなら true 、そうでなければ false を返す。
15.2.3 実行時意味論: EvaluateFunctionBody : return completion または throw completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
FunctionBody : FunctionStatementList
? FunctionDeclarationInstantiation (functionObject , argumentsList ) を実行する。 ? FunctionStatementList の Evaluation を実行する。 注: 前の手順が normal completion なら評価は FunctionStatementList 終端まで進み終了している。 ReturnCompletion (undefined ) を返す。
15.2.4 実行時意味論: InstantiateOrdinaryFunctionObject : ECMAScript 関数オブジェクト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
name を BindingIdentifier の StringValue とする。sourceText を FunctionDeclaration にマッチしたソーステキストとする。F を OrdinaryFunctionCreate (%Function.prototype% , sourceText , FormalParameters , FunctionBody , non-lexical-this , env , privateEnv ) とする。SetFunctionName (F , name ) を実行。MakeConstructor (F ) を実行。F を返す。
FunctionDeclaration :
function
(
FormalParameters
)
{
FunctionBody
}
sourceText を FunctionDeclaration にマッチしたソーステキストとする。F を OrdinaryFunctionCreate (%Function.prototype% , sourceText , FormalParameters , FunctionBody , non-lexical-this , env , privateEnv ) とする。SetFunctionName (F , "default" ) を実行。MakeConstructor (F ) を実行。F を返す。
Note
匿名の FunctionDeclaration は export default
宣言の一部としてのみ出現でき、その関数コードは常に strict mode である。
15.2.5 実行時意味論: InstantiateOrdinaryFunctionExpression : ECMAScript 関数オブジェクト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
FunctionExpression :
function
(
FormalParameters
)
{
FunctionBody
}
name が存在しなければ "" を代入。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を FunctionExpression にマッチしたソーステキストとする。closure を OrdinaryFunctionCreate (%Function.prototype% , sourceText , FormalParameters , FunctionBody , non-lexical-this , env , privateEnv ) とする。SetFunctionName (closure , name ) を実行。MakeConstructor (closure ) を実行。closure を返す。
FunctionExpression :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
Assert : name は存在しない。name を BindingIdentifier の StringValue に設定。outerEnv を実行中コンテキストの LexicalEnvironment とする。funcEnv を NewDeclarativeEnvironment (outerEnv ) とする。! funcEnv .CreateImmutableBinding(name , false ) を実行。 privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を FunctionExpression にマッチしたソーステキストとする。closure を OrdinaryFunctionCreate (%Function.prototype% , sourceText , FormalParameters , FunctionBody , non-lexical-this , funcEnv , privateEnv ) とする。SetFunctionName (closure , name ) を実行。MakeConstructor (closure ) を実行。! funcEnv .InitializeBinding(name , closure ) を実行。 closure を返す。
Note
15.2.6 実行時意味論: 評価 (Evaluation)
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
empty を返す。
Note 1
FunctionDeclaration :
function
(
FormalParameters
)
{
FunctionBody
}
empty を返す。
FunctionExpression :
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
InstantiateOrdinaryFunctionExpression of FunctionExpression を返す。
Note 2
FunctionDeclaration または FunctionExpression により定義された全ての関数には自動的に "prototype" プロパティが作成され、その関数がコンストラクタ として利用される可能性を持たせる。
FunctionStatementList : [empty]
undefined を返す。
15.3 アロー関数定義 (Arrow Function Definitions)
構文 (Syntax)
ArrowFunction [In, Yield, Await] :
ArrowParameters [?Yield, ?Await]
[no LineTerminator here]
=>
ConciseBody [?In]
ArrowParameters [Yield, Await] :
BindingIdentifier [?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList [?Yield, ?Await]
ConciseBody [In] :
[lookahead ≠ { ]
ExpressionBody [?In, ~Await]
{
FunctionBody [~Yield, ~Await]
}
ExpressionBody [In, Await] :
AssignmentExpression [?In, ~Yield, ?Await]
補助構文 (Supplemental Syntax)
生成規則
ArrowParameters [Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList [?Yield, ?Await]
のインスタンスを処理するとき、CoverParenthesizedExpressionAndArrowParameterList の解釈は以下の文法で精密化される:
ArrowFormalParameters [Yield, Await] :
(
UniqueFormalParameters [?Yield, ?Await]
)
15.3.1 静的意味論: 早期エラー (Early Errors)
ArrowFunction :
ArrowParameters
=>
ConciseBody
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
15.3.2 静的意味論: ConciseBodyContainsUseStrict : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ConciseBody : ExpressionBody
false を返す。
ConciseBody :
{
FunctionBody
}
FunctionBodyContainsUseStrict of FunctionBody を返す。
15.3.3 実行時意味論: EvaluateConciseBody : return completion または throw completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ConciseBody : ExpressionBody
? FunctionDeclarationInstantiation (functionObject , argumentsList ) を実行。 ExpressionBody の Evaluation を ? 付きで返す。
15.3.4 実行時意味論: InstantiateArrowFunctionExpression : ECMAScript 関数オブジェクト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ArrowFunction :
ArrowParameters
=>
ConciseBody
name が存在しなければ "" を代入。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を ArrowFunction にマッチしたソーステキストとする。closure を OrdinaryFunctionCreate (%Function.prototype% , sourceText , ArrowParameters , ConciseBody , lexical-this , env , privateEnv ) とする。SetFunctionName (closure , name ) を実行。closure を返す。
Note
ArrowFunction は arguments
, super
, this
, new.target
の局所束縛を定義しない。これらへの参照はレキシカルに囲む環境の束縛へ解決される。典型的には直近の(非アロー)関数の Function Environment となる。ArrowFunction が super
を参照し得ても、ステップ 5 で生成される関数オブジェクト は MakeMethod によりメソッド化されない。super
を参照する ArrowFunction は常に非 ArrowFunction 内に含まれ、super
実装に必要な状態はその ArrowFunction の関数オブジェクト が捕捉する env から得られる。
15.3.5 実行時意味論: 評価 (Evaluation)
ArrowFunction :
ArrowParameters
=>
ConciseBody
InstantiateArrowFunctionExpression of ArrowFunction を返す。
ExpressionBody : AssignmentExpression
exprRef を AssignmentExpression の Evaluation を ? 付きで行った結果とする。exprValue を ? GetValue (exprRef ) とする。ReturnCompletion (exprValue ) を返す。
15.4 メソッド定義 (Method Definitions)
構文 (Syntax)
MethodDefinition [Yield, Await] :
ClassElementName [?Yield, ?Await]
(
UniqueFormalParameters [~Yield, ~Await]
)
{
FunctionBody [~Yield, ~Await]
}
GeneratorMethod [?Yield, ?Await]
AsyncMethod [?Yield, ?Await]
AsyncGeneratorMethod [?Yield, ?Await]
get
ClassElementName [?Yield, ?Await]
(
)
{
FunctionBody [~Yield, ~Await]
}
set
ClassElementName [?Yield, ?Await]
(
PropertySetParameterList
)
{
FunctionBody [~Yield, ~Await]
}
PropertySetParameterList :
FormalParameter [~Yield, ~Await]
15.4.1 静的意味論: 早期エラー (Early Errors)
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
MethodDefinition :
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
15.4.2 静的意味論: HasDirectSuper : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
UniqueFormalParameters Contains SuperCall が true なら true を返す。FunctionBody Contains SuperCall を返す。
MethodDefinition :
get
ClassElementName
(
)
{
FunctionBody
}
FunctionBody Contains SuperCall を返す。
MethodDefinition :
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
PropertySetParameterList Contains SuperCall が true なら true を返す。FunctionBody Contains SuperCall を返す。
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
UniqueFormalParameters Contains SuperCall が true なら true を返す。GeneratorBody Contains SuperCall を返す。
AsyncGeneratorMethod :
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
UniqueFormalParameters Contains SuperCall が true なら true を返す。AsyncGeneratorBody Contains SuperCall を返す。
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
UniqueFormalParameters Contains SuperCall が true なら true を返す。AsyncFunctionBody Contains SuperCall を返す。
15.4.3 静的意味論: SpecialMethod : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
false を返す。
MethodDefinition :
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
true を返す。
15.4.4 実行時意味論: DefineMethod を含むか、または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
propKey を ClassElementName の Evaluation を ? 付きで行った結果とする。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。functionPrototype が存在するなら:prototype を functionPrototype とする。そうでなければ:prototype を %Function.prototype% とする。 sourceText を MethodDefinition にマッチしたソーステキストとする。closure を OrdinaryFunctionCreate (prototype , sourceText , UniqueFormalParameters , FunctionBody , non-lexical-this , env , privateEnv ) とする。MakeMethod (closure , object ) を実行。Record { [[Key]] : propKey , [[Closure]] : closure } を返す。
15.4.5 実行時意味論: MethodDefinitionEvaluation : 正常完了なら PrivateElement か unused のいずれか、または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
methodDef を ? DefineMethod of MethodDefinition (引数 object ) とする。SetFunctionName (methodDef .[[Closure]] , methodDef .[[Key]] ) を実行。? DefineMethodProperty (object , methodDef .[[Key]] , methodDef .[[Closure]] , enumerable ) を返す。
MethodDefinition :
get
ClassElementName
(
)
{
FunctionBody
}
propKey を ? Evaluation of ClassElementName とする。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を MethodDefinition にマッチしたソーステキストとする。formalParameterList を
FormalParameters : [empty]
の生成規則インスタンスとする。closure を OrdinaryFunctionCreate (%Function.prototype% , sourceText , formalParameterList , FunctionBody , non-lexical-this , env , privateEnv ) とする。MakeMethod (closure , object ) を実行。SetFunctionName (closure , propKey , "get" ) を実行。propKey が Private Name なら:PrivateElement { [[Key]] : propKey , [[Kind]] : accessor , [[Get]] : closure , [[Set]] : undefined } を返す。そうでなければ:desc を PropertyDescriptor { [[Get]] : closure , [[Enumerable]] : enumerable , [[Configurable]] : true } とする。? DefinePropertyOrThrow (object , propKey , desc ) を実行。 unused を返す。
MethodDefinition :
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
propKey を ? Evaluation of ClassElementName とする。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を MethodDefinition にマッチしたソーステキストとする。closure を OrdinaryFunctionCreate (%Function.prototype% , sourceText , PropertySetParameterList , FunctionBody , non-lexical-this , env , privateEnv ) とする。MakeMethod (closure , object ) を実行。SetFunctionName (closure , propKey , "set" ) を実行。propKey が Private Name なら:PrivateElement { [[Key]] : propKey , [[Kind]] : accessor , [[Get]] : undefined , [[Set]] : closure } を返す。そうでなければ:desc を PropertyDescriptor { [[Set]] : closure , [[Enumerable]] : enumerable , [[Configurable]] : true } とする。? DefinePropertyOrThrow (object , propKey , desc ) を実行。 unused を返す。
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
propKey を ? Evaluation of ClassElementName とする。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を GeneratorMethod にマッチしたソーステキストとする。closure を OrdinaryFunctionCreate (%GeneratorFunction.prototype% , sourceText , UniqueFormalParameters , GeneratorBody , non-lexical-this , env , privateEnv ) とする。MakeMethod (closure , object ) を実行。SetFunctionName (closure , propKey ) を実行。prototype を OrdinaryObjectCreate (%GeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行。 ? DefineMethodProperty (object , propKey , closure , enumerable ) を返す。
AsyncGeneratorMethod :
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
propKey を ? Evaluation of ClassElementName とする。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を AsyncGeneratorMethod にマッチしたソーステキストとする。closure を OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% , sourceText , UniqueFormalParameters , AsyncGeneratorBody , non-lexical-this , env , privateEnv ) とする。MakeMethod (closure , object ) を実行。SetFunctionName (closure , propKey ) を実行。prototype を OrdinaryObjectCreate (%AsyncGeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行。 ? DefineMethodProperty (object , propKey , closure , enumerable ) を返す。
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
propKey を ? Evaluation of ClassElementName とする。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を AsyncMethod にマッチしたソーステキストとする。closure を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , UniqueFormalParameters , AsyncFunctionBody , non-lexical-this , env , privateEnv ) とする。MakeMethod (closure , object ) を実行。SetFunctionName (closure , propKey ) を実行。? DefineMethodProperty (object , propKey , closure , enumerable ) を返す。
15.5 ジェネレーター関数定義 (Generator Function Definitions)
構文 (Syntax)
GeneratorDeclaration [Yield, Await, Default] :
function
*
BindingIdentifier [?Yield, ?Await]
(
FormalParameters [+Yield, ~Await]
)
{
GeneratorBody
}
[+Default]
function
*
(
FormalParameters [+Yield, ~Await]
)
{
GeneratorBody
}
GeneratorExpression :
function
*
BindingIdentifier [+Yield, ~Await] opt
(
FormalParameters [+Yield, ~Await]
)
{
GeneratorBody
}
GeneratorMethod [Yield, Await] :
*
ClassElementName [?Yield, ?Await]
(
UniqueFormalParameters [+Yield, ~Await]
)
{
GeneratorBody
}
GeneratorBody :
FunctionBody [+Yield, ~Await]
YieldExpression [In, Await] :
yield
yield
[no LineTerminator here]
AssignmentExpression [?In, +Yield, ?Await]
yield
[no LineTerminator here]
*
AssignmentExpression [?In, +Yield, ?Await]
Note 1
Note 2
YieldExpression はジェネレーター関数の FormalParameters 内では使用できない。これは FormalParameters に含まれる式が、生成される Generator が再開可能状態になる前に評価されるためである。
Note 3
Generator に関する抽象操作 は 27.5.3 で定義される。
15.5.1 静的意味論: 早期エラー (Early Errors)
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
GeneratorDeclaration :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
GeneratorExpression :
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
15.5.2 実行時意味論: EvaluateGeneratorBody : throw completion または return completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
GeneratorBody : FunctionBody
? FunctionDeclarationInstantiation (functionObject , argumentsList ) を実行する。 G を ? OrdinaryCreateFromConstructor (functionObject , "%GeneratorPrototype%" , « [[GeneratorState]] , [[GeneratorContext]] , [[GeneratorBrand]] ») とする。G .[[GeneratorBrand]] に empty を設定。G .[[GeneratorState]] に suspended-start を設定。GeneratorStart (G , FunctionBody ) を実行。ReturnCompletion (G ) を返す。
15.5.3 実行時意味論: InstantiateGeneratorFunctionObject : ECMAScript 関数オブジェクト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
GeneratorDeclaration :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
name を BindingIdentifier の StringValue とする。sourceText を GeneratorDeclaration にマッチしたソーステキストとする。F を OrdinaryFunctionCreate (%GeneratorFunction.prototype% , sourceText , FormalParameters , GeneratorBody , non-lexical-this , env , privateEnv ) とする。SetFunctionName (F , name ) を実行。prototype を OrdinaryObjectCreate (%GeneratorPrototype% ) とする。! DefinePropertyOrThrow (F , "prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行。 F を返す。
GeneratorDeclaration :
function
*
(
FormalParameters
)
{
GeneratorBody
}
sourceText を GeneratorDeclaration にマッチしたソーステキストとする。F を OrdinaryFunctionCreate (%GeneratorFunction.prototype% , sourceText , FormalParameters , GeneratorBody , non-lexical-this , env , privateEnv ) とする。SetFunctionName (F , "default" ) を実行。prototype を OrdinaryObjectCreate (%GeneratorPrototype% ) とする。! DefinePropertyOrThrow (F , "prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行。 F を返す。
Note
匿名の GeneratorDeclaration は export default
宣言の一部でのみ出現し、その関数コードは常に strict mode である。
15.5.4 実行時意味論: InstantiateGeneratorFunctionExpression : ECMAScript 関数オブジェクト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
GeneratorExpression :
function
*
(
FormalParameters
)
{
GeneratorBody
}
name が存在しなければ name に "" を設定。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を GeneratorExpression にマッチしたソーステキストとする。closure を OrdinaryFunctionCreate (%GeneratorFunction.prototype% , sourceText , FormalParameters , GeneratorBody , non-lexical-this , env , privateEnv ) とする。SetFunctionName (closure , name ) を実行。prototype を OrdinaryObjectCreate (%GeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行。 closure を返す。
GeneratorExpression :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
Assert : name は存在しない。name を BindingIdentifier の StringValue に設定。outerEnv を実行中コンテキストの LexicalEnvironment とする。funcEnv を NewDeclarativeEnvironment (outerEnv ) とする。! funcEnv .CreateImmutableBinding(name , false ) を実行。 privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を GeneratorExpression にマッチしたソーステキストとする。closure を OrdinaryFunctionCreate (%GeneratorFunction.prototype% , sourceText , FormalParameters , GeneratorBody , non-lexical-this , funcEnv , privateEnv ) とする。SetFunctionName (closure , name ) を実行。prototype を OrdinaryObjectCreate (%GeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行。 ! funcEnv .InitializeBinding(name , closure ) を実行。 closure を返す。
Note
15.5.5 実行時意味論: 評価 (Evaluation)
GeneratorExpression :
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
InstantiateGeneratorFunctionExpression of GeneratorExpression を返す。
YieldExpression : yield
? Yield (undefined ) を返す。
YieldExpression :
yield
AssignmentExpression
exprRef を AssignmentExpression の Evaluation を ? 付きで行った結果とする。value を ? GetValue (exprRef ) とする。? Yield (value ) を返す。
YieldExpression :
yield
*
AssignmentExpression
generatorKind を GetGeneratorKind () とする。Assert : generatorKind は sync か async のいずれか。exprRef を AssignmentExpression の Evaluation を ? 付きで行った結果とする。value を ? GetValue (exprRef ) とする。iteratorRecord を ? GetIterator (value , generatorKind ) とする。iterator を iteratorRecord .[[Iterator]] とする。received を NormalCompletion (undefined ) とする。繰り返し:received が normal completion ならinnerResult を ? Call(iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] , « received .[[Value]] ») とする。generatorKind が async なら innerResult を ? Await (innerResult ) に設定。innerResult が Object でなければ TypeError を throw。done を ? IteratorComplete (innerResult ) とする。done が true なら? IteratorValue (innerResult ) を返す。 generatorKind が async なら received を Completion (AsyncGeneratorYield (? IteratorValue (innerResult ))) に設定。それ以外は received を Completion (GeneratorYield (innerResult )) に設定。 それ以外で received が throw completion ならthrow を ? GetMethod (iterator , "throw" ) とする。throw が undefined でなければinnerResult を ? Call(throw , iterator , « received .[[Value]] ») とする。generatorKind が async なら innerResult を ? Await (innerResult ) に設定。注: 内部イテレータ throw
メソッドの例外は伝播し、正常完了は内部 next
と同様に処理される。 innerResult が Object でなければ TypeError を throw。done を ? IteratorComplete (innerResult ) とする。done が true なら? IteratorValue (innerResult ) を返す。 generatorKind が async なら received を Completion (AsyncGeneratorYield (? IteratorValue (innerResult ))) に設定。それ以外は received を Completion (GeneratorYield (innerResult )) に設定。 それ以外:注: iterator に throw
メソッドがない場合、この throw は yield*
ループを終了させる。まずクリーンアップを与える。 closeCompletion を NormalCompletion (empty ) とする。generatorKind が async なら ? AsyncIteratorClose (iteratorRecord , closeCompletion ) を実行。それ以外は ? IteratorClose (iteratorRecord , closeCompletion ) を実行。 注: 次のステップで throw
メソッド欠如による yield*
プロトコル違反として TypeError を投げる。 TypeError を throw。 それ以外:Assert : received は return completion 。return を ? GetMethod (iterator , "return" ) とする。return が undefined ならvalue を received .[[Value]] に設定。generatorKind が async ならvalue を ? Await (value ) に設定。ReturnCompletion (value ) を返す。innerReturnResult を ? Call(return , iterator , « received .[[Value]] ») とする。generatorKind が async なら innerReturnResult を ? Await (innerReturnResult ) に設定。innerReturnResult が Object でなければ TypeError を throw。done を ? IteratorComplete (innerReturnResult ) とする。done が true ならvalue を ? IteratorValue (innerReturnResult ) に設定。ReturnCompletion (value ) を返す。generatorKind が async なら received を Completion (AsyncGeneratorYield (? IteratorValue (innerReturnResult ))) に設定。それ以外は received を Completion (GeneratorYield (innerReturnResult )) に設定。
15.6 非同期ジェネレーター関数定義 (Async Generator Function Definitions)
構文 (Syntax)
AsyncGeneratorDeclaration [Yield, Await, Default] :
async
[no LineTerminator here]
function
*
BindingIdentifier [?Yield, ?Await]
(
FormalParameters [+Yield, +Await]
)
{
AsyncGeneratorBody
}
[+Default]
async
[no LineTerminator here]
function
*
(
FormalParameters [+Yield, +Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression :
async
[no LineTerminator here]
function
*
BindingIdentifier [+Yield, +Await] opt
(
FormalParameters [+Yield, +Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorMethod [Yield, Await] :
async
[no LineTerminator here]
*
ClassElementName [?Yield, ?Await]
(
UniqueFormalParameters [+Yield, +Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorBody :
FunctionBody [+Yield, +Await]
Note 1
非同期ジェネレーター関数の FormalParameters 内では YieldExpression と AwaitExpression は使用できない。FormalParameters 内の式は結果の AsyncGenerator が再開可能となる前に評価されるためである。
Note 2
AsyncGenerator に関する抽象操作 は 27.6.3 で定義される。
15.6.1 静的意味論: 早期エラー (Early Errors)
AsyncGeneratorMethod :
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorDeclaration :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression :
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
15.6.2 実行時意味論: EvaluateAsyncGeneratorBody : throw completion または return completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
AsyncGeneratorBody : FunctionBody
? FunctionDeclarationInstantiation (functionObject , argumentsList ) を実行。 generator を ? OrdinaryCreateFromConstructor (functionObject , "%AsyncGeneratorPrototype%" , « [[AsyncGeneratorState]] , [[AsyncGeneratorContext]] , [[AsyncGeneratorQueue]] , [[GeneratorBrand]] ») とする。generator .[[GeneratorBrand]] に empty を設定。generator .[[AsyncGeneratorState]] に suspended-start を設定।AsyncGeneratorStart (generator , FunctionBody ) を実行。ReturnCompletion (generator ) を返す。
15.6.3 実行時意味論: InstantiateAsyncGeneratorFunctionObject : ECMAScript 関数オブジェクト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
AsyncGeneratorDeclaration :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
name を BindingIdentifier の StringValue とする。sourceText を AsyncGeneratorDeclaration にマッチしたソーステキストとする。F を OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% , sourceText , FormalParameters , AsyncGeneratorBody , non-lexical-this , env , privateEnv ) とする。SetFunctionName (F , name ) を実行。prototype を OrdinaryObjectCreate (%AsyncGeneratorPrototype% ) とする。! DefinePropertyOrThrow (F , "prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行。 F を返す。
AsyncGeneratorDeclaration :
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
sourceText を AsyncGeneratorDeclaration にマッチしたソーステキストとする。F を OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% , sourceText , FormalParameters , AsyncGeneratorBody , non-lexical-this , env , privateEnv ) とする。SetFunctionName (F , "default" ) を実行。prototype を OrdinaryObjectCreate (%AsyncGeneratorPrototype% ) とする。! DefinePropertyOrThrow (F , "prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行。 F を返す。
Note
匿名の AsyncGeneratorDeclaration は export default
宣言の一部でのみ出現する。
15.6.4 実行時意味論: InstantiateAsyncGeneratorFunctionExpression : ECMAScript 関数オブジェクト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
AsyncGeneratorExpression :
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
name が存在しなければ name に "" を設定。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を AsyncGeneratorExpression にマッチしたソーステキストとする。closure を OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% , sourceText , FormalParameters , AsyncGeneratorBody , non-lexical-this , env , privateEnv ) とする。SetFunctionName (closure , name ) を実行。prototype を OrdinaryObjectCreate (%AsyncGeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行。 closure を返す。
AsyncGeneratorExpression :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
Assert : name は存在しない。name を BindingIdentifier の StringValue に設定。outerEnv を実行中コンテキストの LexicalEnvironment とする。funcEnv を NewDeclarativeEnvironment (outerEnv ) とする。! funcEnv .CreateImmutableBinding(name , false ) を実行。 privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を AsyncGeneratorExpression にマッチしたソーステキストとする。closure を OrdinaryFunctionCreate (%AsyncGeneratorFunction.prototype% , sourceText , FormalParameters , AsyncGeneratorBody , non-lexical-this , funcEnv , privateEnv ) とする。SetFunctionName (closure , name ) を実行。prototype を OrdinaryObjectCreate (%AsyncGeneratorPrototype% ) とする。! DefinePropertyOrThrow (closure , "prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行。 ! funcEnv .InitializeBinding(name , closure ) を実行。 closure を返す。
Note
15.6.5 実行時意味論: 評価 (Evaluation)
AsyncGeneratorExpression :
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
InstantiateAsyncGeneratorFunctionExpression of AsyncGeneratorExpression を返す。
15.7 クラス定義 (Class Definitions)
構文 (Syntax)
ClassDeclaration [Yield, Await, Default] :
class
BindingIdentifier [?Yield, ?Await]
ClassTail [?Yield, ?Await]
[+Default]
class
ClassTail [?Yield, ?Await]
ClassExpression [Yield, Await] :
class
BindingIdentifier [?Yield, ?Await] opt
ClassTail [?Yield, ?Await]
ClassTail [Yield, Await] :
ClassHeritage [?Yield, ?Await] opt
{
ClassBody [?Yield, ?Await] opt
}
ClassHeritage [Yield, Await] :
extends
LeftHandSideExpression [?Yield, ?Await]
ClassBody [Yield, Await] :
ClassElementList [?Yield, ?Await]
ClassElementList [Yield, Await] :
ClassElement [?Yield, ?Await]
ClassElementList [?Yield, ?Await]
ClassElement [?Yield, ?Await]
ClassElement [Yield, Await] :
MethodDefinition [?Yield, ?Await]
static
MethodDefinition [?Yield, ?Await]
FieldDefinition [?Yield, ?Await]
;
static
FieldDefinition [?Yield, ?Await]
;
ClassStaticBlock
;
FieldDefinition [Yield, Await] :
ClassElementName [?Yield, ?Await]
Initializer [+In, ?Yield, ?Await] opt
ClassElementName [Yield, Await] :
PropertyName [?Yield, ?Await]
PrivateIdentifier
ClassStaticBlock :
static
{
ClassStaticBlockBody
}
ClassStaticBlockBody :
ClassStaticBlockStatementList
ClassStaticBlockStatementList :
StatementList [~Yield, +Await, ~Return] opt
Note
クラス定義は常に strict mode コードである。
15.7.1 静的意味論: 早期エラー (Early Errors)
ClassTail :
ClassHeritage opt
{
ClassBody
}
ClassBody : ClassElementList
ClassElementList の PrototypePropertyNameList に "constructor" が 2 回以上含まれる場合は構文エラー。
ClassElementList の PrivateBoundIdentifiers に重複があり、その名前がゲッターとセッターの 1 回ずつ(他で未使用)かつ両方 static か両方非 static である場合を除いて構文エラー。
ClassElement : MethodDefinition
ClassElement :
static
MethodDefinition
ClassElement :
FieldDefinition
;
ClassElement :
static
FieldDefinition
;
FieldDefinition :
ClassElementName
Initializer opt
ClassElementName : PrivateIdentifier
ClassStaticBlockBody : ClassStaticBlockStatementList
15.7.2 静的意味論: ClassElementKind : constructor-method , non-constructor-method , または empty
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ClassElement : MethodDefinition
MethodDefinition の PropName が "constructor" であれば constructor-method を返す。non-constructor-method を返す。
ClassElement :
static
MethodDefinition
FieldDefinition
;
static
FieldDefinition
;
non-constructor-method を返す。
ClassElement : ClassStaticBlock
non-constructor-method を返す。
ClassElement : ;
empty を返す。
15.7.3 静的意味論: ConstructorMethod : ClassElement Parse Node または empty
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ClassElementList : ClassElement
ClassElement の ClassElementKind が constructor-method なら ClassElement を返す。empty を返す。
ClassElementList :
ClassElementList
ClassElement
head を ClassElementList の ConstructorMethod とする。head が empty でなければ head を返す。ClassElement の ClassElementKind が constructor-method なら ClassElement を返す。empty を返す。
Note
早期エラー規則 により "constructor" という名前のメソッドは 1 つであり、 accessor や generator ではないことが保証される。
15.7.4 静的意味論: IsStatic : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ClassElement : MethodDefinition
false を返す。
ClassElement :
static
MethodDefinition
true を返す。
ClassElement :
FieldDefinition
;
false を返す。
ClassElement :
static
FieldDefinition
;
true を返す。
ClassElement : ClassStaticBlock
true を返す。
ClassElement : ;
false を返す。
15.7.5 静的意味論: NonConstructorElements : ClassElement Parse Nodes の List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ClassElementList : ClassElement
ClassElement の ClassElementKind が non-constructor-method なら« ClassElement » を返す。 新しい空 List を返す。
ClassElementList :
ClassElementList
ClassElement
list を ClassElementList の NonConstructorElements とする。ClassElement の ClassElementKind が non-constructor-method ならlist の末尾に ClassElement を追加。list を返す。
15.7.6 静的意味論: PrototypePropertyNameList : プロパティキーの List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ClassElementList : ClassElement
propName を ClassElement の PropName とする。propName が empty なら空の新しい List を返す。IsStatic(ClassElement ) が true なら空の新しい List を返す。 « propName » を返す。
ClassElementList :
ClassElementList
ClassElement
list を ClassElementList の PrototypePropertyNameList とする。propName を ClassElement の PropName とする。propName が empty なら list を返す。IsStatic(ClassElement ) が true なら list を返す。 list と « propName » のリスト連結を返す。
15.7.7 静的意味論: AllPrivateIdentifiersValid : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
以下に列挙されない仕様中のすべての生成規則選択肢は、暗黙に次の既定定義を持つ:
この Parse Node の各子ノード child について:child が非終端記号インスタンスならAllPrivateIdentifiersValid(child , names ) が false なら false を返す。 true を返す。
MemberExpression :
MemberExpression
.
PrivateIdentifier
names が PrivateIdentifier の StringValue を含むならAllPrivateIdentifiersValid(MemberExpression , names ) を返す。 false を返す。
CallExpression :
CallExpression
.
PrivateIdentifier
names が PrivateIdentifier の StringValue を含むならAllPrivateIdentifiersValid(CallExpression , names ) を返す。 false を返す。
OptionalChain :
?.
PrivateIdentifier
names が PrivateIdentifier の StringValue を含むなら true を返す。false を返す。
OptionalChain :
OptionalChain
.
PrivateIdentifier
names が PrivateIdentifier の StringValue を含むならAllPrivateIdentifiersValid(OptionalChain , names ) を返す。 false を返す。
ClassBody : ClassElementList
newNames を names と ClassBody の PrivateBoundIdentifiers のリスト連結とする。AllPrivateIdentifiersValid(ClassElementList , newNames ) を返す。
RelationalExpression :
PrivateIdentifier
in
ShiftExpression
names が PrivateIdentifier の StringValue を含むならAllPrivateIdentifiersValid(ShiftExpression , names ) を返す。 false を返す。
15.7.8 静的意味論: PrivateBoundIdentifiers : 文字列 List
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
FieldDefinition :
ClassElementName
Initializer opt
ClassElementName の PrivateBoundIdentifiers を返す。
ClassElementName : PrivateIdentifier
PrivateIdentifier の StringValue 1 要素のみを含む List を返す。
ClassElementName :
PropertyName
ClassElement :
ClassStaticBlock
;
新しい空 List を返す。
ClassElementList :
ClassElementList
ClassElement
names1 を ClassElementList の PrivateBoundIdentifiers とする。names2 を ClassElement の PrivateBoundIdentifiers とする。names1 と names2 のリスト連結を返す。
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
AsyncGeneratorMethod :
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
ClassElementName の PrivateBoundIdentifiers を返す。
15.7.9 静的意味論: ContainsArguments : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
以下に列挙されないすべての生成規則選択肢は暗黙に次の既定定義を持つ:
この Parse Node の各子 child について:child が非終端であればContainsArguments(child ) が true なら true を返す。 false を返す。
IdentifierReference : Identifier
Identifier の StringValue が "arguments" なら true を返す。false を返す。
FunctionDeclaration :
function
BindingIdentifier
(
FormalParameters
)
{
FunctionBody
}
function
(
FormalParameters
)
{
FunctionBody
}
FunctionExpression :
function
BindingIdentifier opt
(
FormalParameters
)
{
FunctionBody
}
GeneratorDeclaration :
function
*
BindingIdentifier
(
FormalParameters
)
{
GeneratorBody
}
function
*
(
FormalParameters
)
{
GeneratorBody
}
GeneratorExpression :
function
*
BindingIdentifier opt
(
FormalParameters
)
{
GeneratorBody
}
AsyncGeneratorDeclaration :
async
function
*
BindingIdentifier
(
FormalParameters
)
{
AsyncGeneratorBody
}
async
function
*
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression :
async
function
*
BindingIdentifier opt
(
FormalParameters
)
{
AsyncGeneratorBody
}
AsyncFunctionDeclaration :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionExpression :
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
false を返す。
MethodDefinition :
ClassElementName
(
UniqueFormalParameters
)
{
FunctionBody
}
get
ClassElementName
(
)
{
FunctionBody
}
set
ClassElementName
(
PropertySetParameterList
)
{
FunctionBody
}
GeneratorMethod :
*
ClassElementName
(
UniqueFormalParameters
)
{
GeneratorBody
}
AsyncGeneratorMethod :
async
*
ClassElementName
(
UniqueFormalParameters
)
{
AsyncGeneratorBody
}
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
ContainsArguments(ClassElementName ) を返す。
15.7.10 実行時意味論: ClassFieldDefinitionEvaluation : ClassFieldDefinition Record を含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
FieldDefinition :
ClassElementName
Initializer opt
name を ? Evaluation of ClassElementName とする。Initializer が存在するなら:formalParameterList を
FormalParameters : [empty]
のインスタンスとする。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を空の Unicode コードポイント列とする。initializer を OrdinaryFunctionCreate (%Function.prototype% , sourceText , formalParameterList , Initializer , non-lexical-this , env , privateEnv ) とする。MakeMethod (initializer , homeObject ) を実行。initializer .[[ClassFieldInitializerName]] に name を設定。それ以外:initializer を empty とする。 ClassFieldDefinition Record { [[Name]] : name , [[Initializer]] : initializer } を返す。
Note
initializer のために生成された関数は ECMAScript コードから直接参照できない。
15.7.11 実行時意味論: ClassStaticBlockDefinitionEvaluation : ClassStaticBlockDefinition Record
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ClassStaticBlock :
static
{
ClassStaticBlockBody
}
lex を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を空の Unicode コードポイント列とする。formalParameters を
FormalParameters : [empty]
のインスタンスとする。bodyFunction を OrdinaryFunctionCreate (%Function.prototype% , sourceText , formalParameters , ClassStaticBlockBody , non-lexical-this , lex , privateEnv ) とする。MakeMethod (bodyFunction , homeObject ) を実行。ClassStaticBlockDefinition Record { [[BodyFunction]] : bodyFunction } を返す。
Note bodyFunction は ECMAScript コードから直接アクセスできない。
15.7.12 実行時意味論: EvaluateClassStaticBlockBody : return completion または throw completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ClassStaticBlockBody : ClassStaticBlockStatementList
Assert : functionObject は ClassStaticBlockDefinitionEvaluation ステップ 5 により生成された合成関数である。! FunctionDeclarationInstantiation (functionObject , « ») を実行。 ? ClassStaticBlockStatementList の Evaluation を実行。 ReturnCompletion (undefined ) を返す。
15.7.13 実行時意味論: ClassElementEvaluation : ClassFieldDefinition Record / ClassStaticBlockDefinition Record / PrivateElement / unused のいずれかを含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ClassElement :
FieldDefinition
;
static
FieldDefinition
;
? ClassFieldDefinitionEvaluation of FieldDefinition (引数 object ) を返す。
ClassElement :
MethodDefinition
static
MethodDefinition
? MethodDefinitionEvaluation of MethodDefinition (引数 object , false ) を返す。
ClassElement : ClassStaticBlock
ClassStaticBlockDefinitionEvaluation of ClassStaticBlock (引数 object ) を返す。
ClassElement : ;
unused を返す。
15.7.14 実行時意味論: ClassDefinitionEvaluation : 関数オブジェクトを含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
仕様を簡潔にするため、private method と accessor はクラスインスタンスの [[PrivateElements]] スロットで private field と並列に扱われる。ただし任意のオブジェクトは、そのクラスで定義された private method / accessor を全部持つか全く持たないかのどちらかである。この設計により実装は各メソッドやアクセサを個別に追跡しない戦略を選択できる。
例として、実装はインスタンスの private method を対応する Private Name と直接関連付け、各オブジェクトに対しどのクラスコンストラクタ が this
として走ったかを追跡できる。オブジェクト上の private method 参照は、そのメソッドを定義するクラスコンストラクタ で初期化されたかを確認し、Private Name に結び付くメソッドを返す手順になる。
これは private field と異なる。field 初期化子はクラスインスタンス化中に例外を投げ得るため、個々のオブジェクトがクラスの private field の真部分集合だけを持つ状況があり、private field は一般に個別追跡する必要がある。
It is defined piecewise over the following productions:
ClassTail :
ClassHeritage opt
{
ClassBody opt
}
env を実行中の実行コンテキストの LexicalEnvironment とする。classEnv を NewDeclarativeEnvironment (env ) とする。classBinding が undefined でない場合、! classEnv .CreateImmutableBinding(classBinding , true ) を実行する。 outerPrivateEnvironment を実行中の実行コンテキストの PrivateEnvironment とする。classPrivateEnvironment を NewPrivateEnvironment (outerPrivateEnvironment ) とする。ClassBody が存在する場合、ClassBody の PrivateBoundIdentifiers の各文字列 dn について、次を行う:classPrivateEnvironment .[[Names]] に、[[Description]] が dn である Private Name pn が含まれているなら、Assert : これは getter/setter ペアの場合にのみ起こり得る。そうでなければ、dn を [[Description]] とする新しい Private Name name を生成する。name を classPrivateEnvironment .[[Names]] に追加する。 ClassHeritage が存在しない場合、protoParent を %Object.prototype% とする。constructorParent を %Function.prototype% とする。そうでなければ、実行中の実行コンテキストの LexicalEnvironment を classEnv に設定する。 注: ClassHeritage の評価中、実行中の実行コンテキストの PrivateEnvironment は outerPrivateEnvironment である。 superclassRef を Completion (Evaluation of ClassHeritage ) とする。実行中の実行コンテキストの LexicalEnvironment を env に戻す。 superclass を ? GetValue (? superclassRef ) とする。もし superclass が null であるなら、protoParent を null とする。constructorParent を %Function.prototype% とする。 そうでなく、かつ IsConstructor (superclass ) が false であるなら、TypeError 例外を投げる。 そうでなければ、protoParent を ? Get (superclass , "prototype" ) とする。もし protoParent がオブジェクトでも null でもないなら、TypeError 例外を投げる。 constructorParent を superclass とする。 proto を OrdinaryObjectCreate (protoParent ) とする。ClassBody が存在しない場合、constructor を empty とする。そうでなければ、constructor を ClassBody の ConstructorMethod とする。 実行中の実行コンテキストの LexicalEnvironment を classEnv に設定する。 実行中の実行コンテキストの PrivateEnvironment を classPrivateEnvironment に設定する。 もし constructor が empty であるなら、引数を持たず、何もキャプチャしない新しい Abstract Closure defaultConstructor を生成し、呼び出された時に次を実行する:args を、この関数に [[Call]] または [[Construct]] で渡された引数のリストとする。もし NewTarget が undefined であるなら、TypeError 例外を投げる。 F をアクティブな関数オブジェクト とする。もし F .[[ConstructorKind]] が derived であるなら、注: この分岐は constructor(...args) { super(...args); }
に類似しているが、前述の ECMAScript ソーステキスト が観測可能に %Array.prototype% の %Symbol.iterator% メソッドを呼び出す一方で、この関数はそれを呼び出さない。 func を ! F .[[GetPrototypeOf]] () とする。もし IsConstructor (func ) が false であるなら、TypeError 例外を投げる。 result を ? Construct(func , args , NewTarget) とする。 そうでなければ、注: この分岐は constructor() {}
に類似している。 result を ? OrdinaryCreateFromConstructor (NewTarget, "%Object.prototype%" ) とする。 ? InitializeInstanceElements (result , F ) を実行する。 NormalCompletion (result ) を返す。 F を CreateBuiltinFunction (defaultConstructor , 0, className , « [[ConstructorKind]] , [[SourceText]] », the current Realm Record , constructorParent ) とする。 そうでなければ、constructorInfo を ! DefineMethod of constructor (引数 proto と constructorParent ) とする。F を constructorInfo .[[Closure]] とする。MakeClassConstructor (F ) を実行する。SetFunctionName (F , className ) を実行する。 F .[[SourceText]] を sourceText に設定する。MakeConstructor (F , false , proto ) を実行する。もし ClassHeritage が存在するなら、F .[[ConstructorKind]] を derived に設定する。 ! DefineMethodProperty (proto , "constructor" , F , false ) を実行する。 もし ClassBody が存在しないなら、elements を新しい空の List とする。 そうでなければ、elements を ClassBody の NonConstructorElements とする。 instancePrivateMethods を新しい空の List とする。staticPrivateMethods を新しい空の List とする。instanceFields を新しい空の List とする。staticElements を新しい空の List とする。elements の各 ClassElement e について、次を行う:もし IsStatic(e ) が false なら、element を Completion (ClassElementEvaluation of e with argument proto ) とする。 そうでなければ、element を Completion (ClassElementEvaluation of e with argument F ) とする。 もし element が abrupt completion なら、実行中の実行コンテキストの LexicalEnvironment を env に戻す。 実行中の実行コンテキストの PrivateEnvironment を outerPrivateEnvironment に戻す。 ? element を返す。 element を ! element に設定する。もし element が PrivateElement であるなら、Assert : element .[[Kind]] は method または accessor のいずれかである。もし IsStatic(e ) が false なら、container を instancePrivateMethods とし、そうでなければ staticPrivateMethods とする。 もし container に、element .[[Key]] と同じ [[Key]] を持つ PrivateElement pe が含まれているなら、Assert : element .[[Kind]] と pe .[[Kind]] は共に accessor である。もし element .[[Get]] が undefined であるなら、combined を PrivateElement { [[Key]] : element .[[Key]] , [[Kind]] : accessor , [[Get]] : pe .[[Get]] , [[Set]] : element .[[Set]] } とする。 そうでなければ、combined を PrivateElement { [[Key]] : element .[[Key]] , [[Kind]] : accessor , [[Get]] : element .[[Get]] , [[Set]] : pe .[[Set]] } とする。 container 内の pe を combined で置き換える。 そうでなければ、element を container に追加する。 そうでなく、もし element が ClassFieldDefinition Record であるなら、もし IsStatic(e ) が false なら、element を instanceFields に追加し、そうでなければ staticElements に追加する。 そうでなく、もし element が ClassStaticBlockDefinition Record であるなら、element を staticElements に追加する。 実行中の実行コンテキストの LexicalEnvironment を env に戻す。 もし classBinding が undefined でないなら、! classEnv .InitializeBinding(classBinding , F ) を実行する。 F .[[PrivateMethods]] を instancePrivateMethods に設定する。F .[[Fields]] を instanceFields に設定する。staticPrivateMethods の各 PrivateElement method について、次を行う:! PrivateMethodOrAccessorAdd (F , method ) を実行する。 staticElements の各要素 elementRecord について、次を行う:もし elementRecord が ClassFieldDefinition Record であるなら、result を Completion (DefineField (F , elementRecord )) とする。 そうでなければ、Assert : elementRecord は ClassStaticBlockDefinition Record である。result を Completion (Call(elementRecord .[[BodyFunction]] , F )) とする。 もし result が abrupt completion であるなら、実行中の実行コンテキストの PrivateEnvironment を outerPrivateEnvironment に戻す。 ? result を返す。 実行中の実行コンテキストの PrivateEnvironment を outerPrivateEnvironment に戻す。 F を返す。
15.7.15 実行時意味論: BindingClassDeclarationEvaluation : 関数オブジェクトを含む normal completion または abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ClassDeclaration :
class
BindingIdentifier
ClassTail
className を BindingIdentifier の StringValue とする。sourceText を ClassDeclaration にマッチしたソースとする。value を ? ClassDefinitionEvaluation(ClassTail , className , className , sourceText ) とする。env を実行中コンテキストの LexicalEnvironment とする。? InitializeBoundName (className , value , env ) を実行。 value を返す。
ClassDeclaration :
class
ClassTail
sourceText を ClassDeclaration にマッチしたソースとする。? ClassDefinitionEvaluation(ClassTail , undefined , "default" , sourceText ) を返す。
Note
ClassDeclaration :
class
ClassTail
は ExportDeclaration の一部としてのみ出現し、その束縛確立は該当生成規則の評価で処理される。16.2.3.7 参照。
15.7.16 実行時意味論: 評価 (Evaluation)
ClassDeclaration :
class
BindingIdentifier
ClassTail
この ClassDeclaration の BindingClassDeclarationEvaluation を ? 付きで実行。 empty を返す。
Note
ClassExpression :
class
ClassTail
sourceText を ClassExpression にマッチしたソースとする。? ClassDefinitionEvaluation(ClassTail , undefined , "" , sourceText ) を返す。
ClassExpression :
class
BindingIdentifier
ClassTail
className を BindingIdentifier の StringValue とする。sourceText を ClassExpression にマッチしたソースとする。? ClassDefinitionEvaluation(ClassTail , className , className , sourceText ) を返す。
ClassElementName : PrivateIdentifier
privateIdentifier を PrivateIdentifier の StringValue とする。privateEnvRec を実行中コンテキストの PrivateEnvironment とする。names を privateEnvRec .[[Names]] とする。Assert : names に [[Description]] = privateIdentifier の Private Name が正確に 1 つ存在。privateName をその Private Name とする。privateName を返す。
ClassStaticBlockStatementList : [empty]
undefined を返す。
15.8 非同期関数定義 (Async Function Definitions)
構文 (Syntax)
AsyncFunctionDeclaration [Yield, Await, Default] :
async
[no LineTerminator here]
function
BindingIdentifier [?Yield, ?Await]
(
FormalParameters [~Yield, +Await]
)
{
AsyncFunctionBody
}
[+Default]
async
[no LineTerminator here]
function
(
FormalParameters [~Yield, +Await]
)
{
AsyncFunctionBody
}
AsyncFunctionExpression :
async
[no LineTerminator here]
function
BindingIdentifier [~Yield, +Await] opt
(
FormalParameters [~Yield, +Await]
)
{
AsyncFunctionBody
}
AsyncMethod [Yield, Await] :
async
[no LineTerminator here]
ClassElementName [?Yield, ?Await]
(
UniqueFormalParameters [~Yield, +Await]
)
{
AsyncFunctionBody
}
AsyncFunctionBody :
FunctionBody [~Yield, +Await]
AwaitExpression [Yield] :
await
UnaryExpression [?Yield, +Await]
Note 1
await
は [Await] パラメータが存在する場合に AwaitExpression のキーワードとして構文解析される。[Await] パラメータは次の文脈のトップレベルで存在し得る(FunctionBody など非終端により欠如し得る):
構文目標記号が Script の場合、[Await] パラメータが無い文脈では await
は識別子として解析され得る。例:
Note 2
YieldExpression と異なり、AwaitExpression のオペランド省略は Syntax Error である。必ず何かを await しなければならない。
15.8.1 静的意味論: 早期エラー (Early Errors)
AsyncMethod :
async
ClassElementName
(
UniqueFormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionDeclaration :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
AsyncFunctionExpression :
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
15.8.2 実行時意味論: InstantiateAsyncFunctionObject : ECMAScript 関数オブジェクト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
AsyncFunctionDeclaration :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
name を BindingIdentifier の StringValue とする。sourceText を AsyncFunctionDeclaration にマッチしたソースとする。F を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , FormalParameters , AsyncFunctionBody , non-lexical-this , env , privateEnv ) とする。SetFunctionName (F , name ) を実行。F を返す。
AsyncFunctionDeclaration :
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
sourceText を AsyncFunctionDeclaration にマッチしたソースとする。F を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , FormalParameters , AsyncFunctionBody , non-lexical-this , env , privateEnv ) とする。SetFunctionName (F , "default" ) を実行。F を返す。
15.8.3 実行時意味論: InstantiateAsyncFunctionExpression : ECMAScript 関数オブジェクト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
AsyncFunctionExpression :
async
function
(
FormalParameters
)
{
AsyncFunctionBody
}
name が存在しなければ "" を設定。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を AsyncFunctionExpression にマッチしたソースとする。closure を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , FormalParameters , AsyncFunctionBody , non-lexical-this , env , privateEnv ) とする。SetFunctionName (closure , name ) を実行。closure を返す。
AsyncFunctionExpression :
async
function
BindingIdentifier
(
FormalParameters
)
{
AsyncFunctionBody
}
Assert : name は存在しない。name を BindingIdentifier の StringValue に設定。outerEnv を実行中コンテキストの LexicalEnvironment とする。funcEnv を NewDeclarativeEnvironment (outerEnv ) とする。! funcEnv .CreateImmutableBinding(name , false ) を実行。 privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を AsyncFunctionExpression にマッチしたソースとする。closure を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , FormalParameters , AsyncFunctionBody , non-lexical-this , funcEnv , privateEnv ) とする。SetFunctionName (closure , name ) を実行。! funcEnv .InitializeBinding(name , closure ) を実行。 closure を返す。
Note
15.8.4 実行時意味論: EvaluateAsyncFunctionBody : return completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
AsyncFunctionBody : FunctionBody
promiseCapability を ! NewPromiseCapability (%Promise% ) とする。completion を Completion (FunctionDeclarationInstantiation (functionObject , argumentsList )) とする。completion が abrupt なら! Call(promiseCapability .[[Reject]] , undefined , « completion .[[Value]] ») を実行。 それ以外AsyncFunctionStart (promiseCapability , FunctionBody ) を実行。 ReturnCompletion (promiseCapability .[[Promise]] ) を返す。
15.8.5 実行時意味論: 評価 (Evaluation)
AsyncFunctionExpression :
async
function
BindingIdentifier opt
(
FormalParameters
)
{
AsyncFunctionBody
}
InstantiateAsyncFunctionExpression of AsyncFunctionExpression を返す。
AwaitExpression :
await
UnaryExpression
exprRef を ? Evaluation of UnaryExpression とする。value を ? GetValue (exprRef ) とする。? Await (value ) を返す。
15.9 非同期アロー関数定義 (Async Arrow Function Definitions)
構文 (Syntax)
AsyncArrowFunction [In, Yield, Await] :
async
[no LineTerminator here]
AsyncArrowBindingIdentifier [?Yield]
[no LineTerminator here]
=>
AsyncConciseBody [?In]
CoverCallExpressionAndAsyncArrowHead [?Yield, ?Await]
[no LineTerminator here]
=>
AsyncConciseBody [?In]
AsyncConciseBody [In] :
[lookahead ≠ { ]
ExpressionBody [?In, +Await]
{
AsyncFunctionBody
}
AsyncArrowBindingIdentifier [Yield] :
BindingIdentifier [?Yield, +Await]
CoverCallExpressionAndAsyncArrowHead [Yield, Await] :
MemberExpression [?Yield, ?Await]
Arguments [?Yield, ?Await]
補助構文 (Supplemental Syntax)
生成規則
AsyncArrowFunction :
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
のインスタンス処理時、CoverCallExpressionAndAsyncArrowHead の解釈は以下の文法で精密化される:
AsyncArrowHead :
async
[no LineTerminator here]
ArrowFormalParameters [~Yield, +Await]
15.9.1 静的意味論: 早期エラー (Early Errors)
AsyncArrowFunction :
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
AsyncArrowFunction :
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
15.9.2 静的意味論: AsyncConciseBodyContainsUseStrict : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
AsyncConciseBody : ExpressionBody
false を返す。
AsyncConciseBody :
{
AsyncFunctionBody
}
FunctionBodyContainsUseStrict of AsyncFunctionBody を返す。
15.9.3 実行時意味論: EvaluateAsyncConciseBody : return completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
AsyncConciseBody : ExpressionBody
promiseCapability を ! NewPromiseCapability (%Promise% ) とする。completion を Completion (FunctionDeclarationInstantiation (functionObject , argumentsList )) とする。completion が abrupt なら! Call(promiseCapability .[[Reject]] , undefined , « completion .[[Value]] ») を実行。 それ以外AsyncFunctionStart (promiseCapability , ExpressionBody ) を実行。 ReturnCompletion (promiseCapability .[[Promise]] ) を返す。
15.9.4 実行時意味論: InstantiateAsyncArrowFunctionExpression : ECMAScript 関数オブジェクト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
AsyncArrowFunction :
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
name が存在しなければ "" を設定。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を AsyncArrowFunction にマッチしたソースとする。parameters を AsyncArrowBindingIdentifier とする。closure を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , parameters , AsyncConciseBody , lexical-this , env , privateEnv ) とする。SetFunctionName (closure , name ) を実行。closure を返す。
AsyncArrowFunction :
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
name が存在しなければ "" を設定。env を実行中コンテキストの LexicalEnvironment とする。privateEnv を実行中コンテキストの PrivateEnvironment とする。sourceText を AsyncArrowFunction にマッチしたソースとする。head を CoverCallExpressionAndAsyncArrowHead が覆う AsyncArrowHead とする。parameters を head の ArrowFormalParameters とする。closure を OrdinaryFunctionCreate (%AsyncFunction.prototype% , sourceText , parameters , AsyncConciseBody , lexical-this , env , privateEnv ) とする。SetFunctionName (closure , name ) を実行。closure を返す。
15.9.5 実行時意味論: 評価 (Evaluation)
AsyncArrowFunction :
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
InstantiateAsyncArrowFunctionExpression of AsyncArrowFunction を返す。
15.10 末尾位置呼び出し (Tail Position Calls)
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
IsStrict(call ) が false なら false を返す。 call が FunctionBody , ConciseBody , AsyncConciseBody の内部に含まれていなければ false を返す。body を call を最も近く包含する FunctionBody / ConciseBody / AsyncConciseBody とする。body が GeneratorBody の FunctionBody なら false を返す。body が AsyncFunctionBody の FunctionBody なら false を返す。body が AsyncGeneratorBody の FunctionBody なら false を返す。body が AsyncConciseBody なら false を返す。HasCallInTailPosition(body , call ) の結果を返す。
Note
末尾位置呼び出しは strict mode コードでのみ定義される。これは caller chain を観測可能にする一般的な非標準拡張(10.2.4 参照)との整合のためである。
15.10.2 静的意味論: HasCallInTailPosition : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note 1
call は特定のソース範囲を表す Parse Node である。以下のアルゴリズムで他の Parse Node と比較する場合、それらが同一ソース範囲を表すかを判定する。
Note 2
潜在的な末尾位置呼び出しの直後が return でその呼び出し結果の GetValue を返している場合も末尾位置呼び出しと見なされる。関数呼び出しは Reference Record を返さないため、その GetValue は呼び出し結果と同じ値を返す。
It is defined piecewise over the following productions:
StatementList :
StatementList
StatementListItem
has を HasCallInTailPosition(StatementList , call ) とする。has が true なら true を返す。HasCallInTailPosition(StatementListItem , call ) を返す。
FunctionStatementList :
[empty]
StatementListItem :
Declaration
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ThrowStatement
DebuggerStatement
Block :
{
}
ReturnStatement :
return
;
LabelledItem :
FunctionDeclaration
ForInOfStatement :
for
(
LeftHandSideExpression
of
AssignmentExpression
)
Statement
for
(
var
ForBinding
of
AssignmentExpression
)
Statement
for
(
ForDeclaration
of
AssignmentExpression
)
Statement
CaseBlock :
{
}
false を返す。
IfStatement :
if
(
Expression
)
Statement
else
Statement
has を最初の Statement の HasCallInTailPosition(…, call ) とする。has が true なら true を返す。2 番目の Statement の HasCallInTailPosition(…, call ) を返す。
IfStatement :
if
(
Expression
)
Statement
DoWhileStatement :
do
Statement
while
(
Expression
)
;
WhileStatement :
while
(
Expression
)
Statement
ForStatement :
for
(
Expression opt
;
Expression opt
;
Expression opt
)
Statement
for
(
var
VariableDeclarationList
;
Expression opt
;
Expression opt
)
Statement
for
(
LexicalDeclaration
Expression opt
;
Expression opt
)
Statement
ForInOfStatement :
for
(
LeftHandSideExpression
in
Expression
)
Statement
for
(
var
ForBinding
in
Expression
)
Statement
for
(
ForDeclaration
in
Expression
)
Statement
WithStatement :
with
(
Expression
)
Statement
HasCallInTailPosition(Statement , call ) を返す。
LabelledStatement :
LabelIdentifier
:
LabelledItem
HasCallInTailPosition(LabelledItem , call ) を返す。
ReturnStatement :
return
Expression
;
HasCallInTailPosition(Expression , call ) を返す。
SwitchStatement :
switch
(
Expression
)
CaseBlock
HasCallInTailPosition(CaseBlock , call ) を返す。
CaseBlock :
{
CaseClauses opt
DefaultClause
CaseClauses opt
}
has を false とする。最初の CaseClauses があれば has = HasCallInTailPosition(その CaseClauses , call )。 has が true なら true を返す。has = HasCallInTailPosition(DefaultClause , call )。has が true なら true を返す。2 番目の CaseClauses があれば has = HasCallInTailPosition(その CaseClauses , call )。 has を返す。
CaseClauses :
CaseClauses
CaseClause
has を HasCallInTailPosition(CaseClauses , call ) とする。has が true なら true を返す。HasCallInTailPosition(CaseClause , call ) を返す。
CaseClause :
case
Expression
:
StatementList opt
DefaultClause :
default
:
StatementList opt
StatementList があれば HasCallInTailPosition(StatementList , call ) を返す。false を返す。
TryStatement :
try
Block
Catch
HasCallInTailPosition(Catch , call ) を返す。
TryStatement :
try
Block
Finally
try
Block
Catch
Finally
HasCallInTailPosition(Finally , call ) を返す。
Catch :
catch
(
CatchParameter
)
Block
HasCallInTailPosition(Block , call ) を返す。
AssignmentExpression :
YieldExpression
ArrowFunction
AsyncArrowFunction
LeftHandSideExpression
=
AssignmentExpression
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
BitwiseANDExpression :
BitwiseANDExpression
&
EqualityExpression
BitwiseXORExpression :
BitwiseXORExpression
^
BitwiseANDExpression
BitwiseORExpression :
BitwiseORExpression
|
BitwiseXORExpression
EqualityExpression :
EqualityExpression
==
RelationalExpression
EqualityExpression
!=
RelationalExpression
EqualityExpression
===
RelationalExpression
EqualityExpression
!==
RelationalExpression
RelationalExpression :
RelationalExpression
<
ShiftExpression
RelationalExpression
>
ShiftExpression
RelationalExpression
<=
ShiftExpression
RelationalExpression
>=
ShiftExpression
RelationalExpression
instanceof
ShiftExpression
RelationalExpression
in
ShiftExpression
PrivateIdentifier
in
ShiftExpression
ShiftExpression :
ShiftExpression
<<
AdditiveExpression
ShiftExpression
>>
AdditiveExpression
ShiftExpression
>>>
AdditiveExpression
AdditiveExpression :
AdditiveExpression
+
MultiplicativeExpression
AdditiveExpression
-
MultiplicativeExpression
MultiplicativeExpression :
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
ExponentiationExpression :
UpdateExpression
**
ExponentiationExpression
UpdateExpression :
LeftHandSideExpression
++
LeftHandSideExpression
--
++
UnaryExpression
--
UnaryExpression
UnaryExpression :
delete
UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
+
UnaryExpression
-
UnaryExpression
~
UnaryExpression
!
UnaryExpression
AwaitExpression
CallExpression :
SuperCall
ImportCall
CallExpression
[
Expression
]
CallExpression
.
IdentifierName
CallExpression
.
PrivateIdentifier
NewExpression :
new
NewExpression
MemberExpression :
MemberExpression
[
Expression
]
MemberExpression
.
IdentifierName
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
.
PrivateIdentifier
PrimaryExpression :
this
IdentifierReference
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
false を返す。
Expression :
AssignmentExpression
Expression
,
AssignmentExpression
HasCallInTailPosition(AssignmentExpression , call ) を返す。
ConditionalExpression :
ShortCircuitExpression
?
AssignmentExpression
:
AssignmentExpression
has を最初の AssignmentExpression の HasCallInTailPosition(…, call ) とする。has が true なら true を返す。2 番目の AssignmentExpression の HasCallInTailPosition(…, call ) を返す。
LogicalANDExpression :
LogicalANDExpression
&&
BitwiseORExpression
HasCallInTailPosition(BitwiseORExpression , call ) を返す。
LogicalORExpression :
LogicalORExpression
||
LogicalANDExpression
HasCallInTailPosition(LogicalANDExpression , call ) を返す。
CoalesceExpression :
CoalesceExpressionHead
??
BitwiseORExpression
HasCallInTailPosition(BitwiseORExpression , call ) を返す。
CallExpression :
CoverCallExpressionAndAsyncArrowHead
CallExpression
Arguments
CallExpression
TemplateLiteral
この CallExpression が call なら true を返す。 false を返す。
OptionalExpression :
MemberExpression
OptionalChain
CallExpression
OptionalChain
OptionalExpression
OptionalChain
HasCallInTailPosition(OptionalChain , call ) を返す。
OptionalChain :
?.
[
Expression
]
?.
IdentifierName
?.
PrivateIdentifier
OptionalChain
[
Expression
]
OptionalChain
.
IdentifierName
OptionalChain
.
PrivateIdentifier
false を返す。
OptionalChain :
?.
Arguments
OptionalChain
Arguments
この OptionalChain が call なら true を返す。 false を返す。
MemberExpression :
MemberExpression
TemplateLiteral
この MemberExpression が call なら true を返す。 false を返す。
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
expr を CoverParenthesizedExpressionAndArrowParameterList が覆う ParenthesizedExpression とする。HasCallInTailPosition(expr , call ) を返す。
ParenthesizedExpression :
(
Expression
)
HasCallInTailPosition(Expression , call ) を返す。
15.10.3 PrepareForTailCall ( )
The abstract operation PrepareForTailCall takes no arguments and returns unused . It performs the following steps when called:
Assert : 現在の実行コンテキストは以後 ECMAScript コードや組込み関数の評価に再利用されない。続いて呼び出される Call はその評価前に新しい実行コンテキストを生成し push する。現在の実行コンテキストに関連する全リソースを破棄する。 unused を返す。
末尾位置呼び出しは、現在実行中の関数実行コンテキストに結び付く一時的内部リソースをターゲット関数の呼び出し前に解放するか、その関数のために再利用しなければならない。
Note
例えば末尾位置呼び出しは、ターゲット関数のアクティベーションレコードが呼出元より大きい差分のみスタックを増加させるべきである。ターゲットの方が小さいなら総スタックサイズは減少すべきである。
16 ECMAScript 言語: スクリプトとモジュール
16.1 スクリプト
構文
Script :
ScriptBody opt
ScriptBody :
StatementList [~Yield, ~Await, ~Return]
16.1.1 静的意味論: 早期エラー
Script : ScriptBody
ScriptBody の LexicallyDeclaredNames に重複するエントリが含まれている場合、構文エラーである。
ScriptBody の LexicallyDeclaredNames の任意の要素が ScriptBody の VarDeclaredNames にも出現する場合、構文エラーである。
ScriptBody : StatementList
16.1.2 静的意味論: ScriptIsStrict : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Script : ScriptBody opt
ScriptBody が存在し、ScriptBody の Directive Prologue に Use Strict Directive が含まれている場合は true を返し、そうでなければ false を返す。
16.1.3 実行時意味論: 評価
Script : [empty]
undefined を返す。
16.1.4 Script Record
Script Record は、評価されるスクリプトに関する情報をカプセル化する。各 Script Record は Table 37 にリストされたフィールドを含む。
Table 37: Script Record フィールド
16.1.5 ParseScript ( sourceText , realm , hostDefined )
The abstract operation ParseScript takes arguments sourceText (ECMAScript ソーステキスト ), realm (Realm Record ), and hostDefined (任意) and returns Script Record または SyntaxError オブジェクトの空でないリスト. sourceText を Script として解析した結果に基づいて Script Record を作成する。 It performs the following steps when called:
script を ParseText(sourceText , Script ) とする。script がエラーのリストである場合、script を返す。Script Record { [[Realm]] : realm , [[ECMAScriptCode]] : script , [[LoadedModules]] : « », [[HostDefined]] : hostDefined } を返す。
Note
実装は、そのスクリプトソーステキストに対する ParseScript の評価より前に、スクリプトソーステキストを解析し早期エラー条件を分析してもよい。ただし、エラーの報告は、この仕様が実際にそのソーステキストに対して ParseScript を実行する時点まで延期されなければならない。
16.1.6 ScriptEvaluation ( scriptRecord )
The abstract operation ScriptEvaluation takes argument scriptRecord (Script Record ) and returns ECMAScript 言語値を含む通常完了か異常完了. It performs the following steps when called:
globalEnv を scriptRecord .[[Realm]] .[[GlobalEnv]] とする。scriptContext を新しい ECMAScript コード実行コンテキスト とする。scriptContext の Function を null に設定する。scriptContext の Realm を scriptRecord .[[Realm]] に設定する。scriptContext の ScriptOrModule を scriptRecord に設定する。scriptContext の VariableEnvironment を globalEnv に設定する。scriptContext の LexicalEnvironment を globalEnv に設定する。scriptContext の PrivateEnvironment を null に設定する。実行中の実行コンテキストを中断する。 scriptContext を実行コンテキストスタックにプッシュする;scriptContext が実行中の実行コンテキストとなる。script を scriptRecord .[[ECMAScriptCode]] とする。result を Completion (GlobalDeclarationInstantiation (script , globalEnv )) とする。result が通常完了の場合、result を Completion (Evaluation of script ) に設定する。result が通常完了で result .[[Value]] が empty の場合、result を NormalCompletion (undefined ) に設定する。scriptContext を中断し、実行コンテキストスタックから除去する。Assert : 実行コンテキストスタックは空でない。実行コンテキストスタックの最上位にあるコンテキストを実行中の実行コンテキストとして再開する。 ? result を返す。
16.1.7 GlobalDeclarationInstantiation ( script , env )
The abstract operation GlobalDeclarationInstantiation takes arguments script (Script Parse Node) and env (Global Environment Record ) and returns unused を含む通常完了か投げ完了. script は実行コンテキストが確立される Script である。env は束縛が作成されるグローバル環境である。
Note 1
スクリプトを評価するために実行コンテキストが確立されるとき、宣言は現在のグローバル環境でインスタンス化される。コードで宣言された各グローバル束縛がインスタンス化される。
呼び出されたとき、次の手順を実行する:
lexNames を script の LexicallyDeclaredNames とする。varNames を script の VarDeclaredNames とする。lexNames の各要素 name について、HasLexicalDeclaration (env , name ) が true の場合、SyntaxError 例外を投げる。hasRestrictedGlobal を ? HasRestrictedGlobalProperty (env , name ) とする。注: グローバル var
および function
束縛(非 strict 直接 eval によって導入されるものを除く)は非設定可能であり、したがって制限されたグローバルプロパティである。 hasRestrictedGlobal が true の場合、SyntaxError 例外を投げる。varNames の各要素 name について、HasLexicalDeclaration (env , name ) が true の場合、SyntaxError 例外を投げる。varDeclarations を script の VarScopedDeclarations とする。functionsToInitialize を新しい空のリストとする。declaredFunctionNames を新しい空のリストとする。varDeclarations の各要素 d について、逆順で、d が VariableDeclaration 、ForBinding 、または BindingIdentifier のいずれでもない場合、Assert : d は FunctionDeclaration 、GeneratorDeclaration 、AsyncFunctionDeclaration 、または AsyncGeneratorDeclaration のいずれかである。注: 同じ名前に対して複数の関数宣言がある場合、最後の宣言が使用される。 fn を d の BoundNames の唯一の要素とする。declaredFunctionNames が fn を含まない場合、fnDefinable を ? CanDeclareGlobalFunction (env , fn ) とする。fnDefinable が false の場合、TypeError 例外を投げる。fn を declaredFunctionNames に追加する。d を functionsToInitialize の最初の要素として挿入する。declaredVarNames を新しい空のリストとする。varDeclarations の各要素 d について、d が VariableDeclaration 、ForBinding 、または BindingIdentifier のいずれかの場合、d の BoundNames の各文字列 vn について、declaredFunctionNames が vn を含まない場合、vnDefinable を ? CanDeclareGlobalVar (env , vn ) とする。vnDefinable が false の場合、TypeError 例外を投げる。declaredVarNames が vn を含まない場合、vn を declaredVarNames に追加する。注: グローバルオブジェクト が通常のオブジェクトの場合、このアルゴリズムステップ以降に異常終了は発生しない。ただし、グローバルオブジェクト が Proxy exotic オブジェクトの場合、以下のステップの一部で異常終了を引き起こす動作を示すことがある。 Normative Optional
ホスト が Web ブラウザであるか、または ブロックレベル Function 宣言 (Web レガシー互換意味論) をサポートする場合、strict を script の ScriptIsStrict とする。strict が false の場合、declaredFunctionOrVarNames を declaredFunctionNames と declaredVarNames のリスト連結とする。script Contains x が true となる任意の Block 、CaseClause 、または DefaultClause x の StatementList に直接含まれる各 FunctionDeclaration f について、F を f の BindingIdentifier の StringValue とする。FunctionDeclaration f を F を BindingIdentifier として持つ VariableStatement で置き換えても script に早期エラーが発生しない場合、HasLexicalDeclaration (env , F ) が false の場合、fnDefinable を ? CanDeclareGlobalVar (env , F ) とする。fnDefinable が true の場合、注: F の var 束縛は、VarDeclaredName でも他の FunctionDeclaration の名前でもない場合にのみここでインスタンス化される。 declaredFunctionOrVarNames が F を含まない場合、? CreateGlobalVarBinding (env , F , false ) を実行する。 F を declaredFunctionOrVarNames に追加する。FunctionDeclaration f が評価されるとき、15.2.6 で提供される FunctionDeclaration 評価アルゴリズムの代わりに次の手順を実行する:gEnv を実行中の実行コンテキストの VariableEnvironment とする。bEnv を実行中の実行コンテキストの LexicalEnvironment とする。fObj を ! bEnv .GetBindingValue(F , false ) とする。? gEnv .SetMutableBinding (F , fObj , false ) を実行する。 unused を返す。lexDeclarations を script の LexicallyScopedDeclarations とする。privateEnv を null とする。lexDeclarations の各要素 d について、注: 字句的に宣言された名前はここでインスタンス化されるが初期化されない。 d の BoundNames の各要素 dn について、d の IsConstantDeclaration が true の場合、? env .CreateImmutableBinding (dn , true ) を実行する。 そうでなければ、? env .CreateMutableBinding (dn , false ) を実行する。 functionsToInitialize の各 Parse Node f について、fn を f の BoundNames の唯一の要素とする。fo を引数 env と privateEnv での f の InstantiateFunctionObject とする。? CreateGlobalFunctionBinding (env , fn , fo , false ) を実行する。 declaredVarNames の各文字列 vn について、? CreateGlobalVarBinding (env , vn , false ) を実行する。 unused を返す。
Note 2
16.1.1 で指定された早期エラーは、単一の Script に含まれる宣言について、function/var 宣言と let/const/class 宣言の間の名前の競合、および let/const/class 束縛の再宣言を防ぐ。ただし、複数の Script にまたがるそのような競合と再宣言は、GlobalDeclarationInstantiation 中に実行時エラーとして検出される。そのようなエラーが検出された場合、スクリプトの束縛はインスタンス化されない。ただし、グローバルオブジェクト が Proxy exotic オブジェクトを使用して定義されている場合、競合する宣言の実行時テストが信頼できない場合があり、異常完了となり一部のグローバル宣言がインスタンス化されない可能性がある。これが発生した場合、Script のコードは評価されない。
明示的な var または function 宣言とは異なり、グローバルオブジェクト に直接作成されるプロパティは、let/const/class 宣言によってシャドウされる可能性があるグローバル束縛をもたらす。
16.2 モジュール
構文
Module :
ModuleBody opt
ModuleBody :
ModuleItemList
ModuleItemList :
ModuleItem
ModuleItemList
ModuleItem
ModuleItem :
ImportDeclaration
ExportDeclaration
StatementListItem [~Yield, +Await, ~Return]
ModuleExportName :
IdentifierName
StringLiteral
16.2.1 モジュール意味論
16.2.1.1 静的意味論: 早期エラー
ModuleBody : ModuleItemList
Note
重複する ExportedNames ルールは、ModuleBody 内で複数の export default
ExportDeclaration 項目が構文エラーであることを意味する。競合または重複する宣言に関する追加のエラー条件は、Module の評価に先立つモジュールリンキング中にチェックされる。そのようなエラーが検出された場合、Module は評価されない。
ModuleExportName : StringLiteral
IsStringWellFormedUnicode(SV of StringLiteral ) が false の場合、構文エラーである。
16.2.1.2
静的意味論: ImportedLocalNames (
importEntries : ImportEntry Record のリスト,
): 文字列のリスト
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. importEntries によって定義されるすべてのローカル名束縛のリストを作成する。 It performs the following steps when called:
localNames を新しい空のリストとする。importEntries の各 ImportEntry Record i について、i .[[LocalName]] を localNames に追加する。localNames を返す。
16.2.1.3 ModuleRequest Record
ModuleRequest Record は、指定されたインポート属性でモジュールをインポートするリクエストを表す。次のフィールドで構成される:
Table 38: ModuleRequest Record フィールド
LoadedModuleRequest Record は、モジュールをインポートするリクエストと結果として得られる Module Record を一緒に表す。表 Table 38 で定義された同じフィールドに加えて、[[Module]] が追加される:
Table 39: LoadedModuleRequest Record フィールド
ImportAttribute Record は次のフィールドで構成される:
Table 40: ImportAttribute Record フィールド
フィールド名
値の型
意味
[[Key]]
文字列
属性キー
[[Value]]
文字列
属性値
16.2.1.3.1 ModuleRequestsEqual ( left , right )
The abstract operation ModuleRequestsEqual takes arguments left (ModuleRequest Record または LoadedModuleRequest Record ) and right (ModuleRequest Record または LoadedModuleRequest Record ) and returns Boolean. It performs the following steps when called:
left .[[Specifier]] が right .[[Specifier]] でない場合、false を返す。leftAttrs を left .[[Attributes]] とする。rightAttrs を right .[[Attributes]] とする。leftAttrsCount を leftAttrs の要素数とする。rightAttrsCount を rightAttrs の要素数とする。leftAttrsCount ≠ rightAttrsCount の場合、false を返す。leftAttrs の各 ImportAttribute Record l について、rightAttrs に l .[[Key]] が r .[[Key]] で l .[[Value]] が r .[[Value]] である ImportAttribute Record r が含まれていない場合、false を返す。true を返す。
16.2.1.4 静的意味論: ModuleRequests : ModuleRequest Record のリスト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Module : [empty]
新しい空のリストを返す。
ModuleItemList : ModuleItem
ModuleItem の ModuleRequests を返す。
ModuleItemList :
ModuleItemList
ModuleItem
requests を ModuleItemList の ModuleRequests とする。additionalRequests を ModuleItem の ModuleRequests とする。additionalRequests の各 ModuleRequest Record mr について、requests に ModuleRequestsEqual (mr , mr2 ) が true である ModuleRequest Record mr2 が含まれていない場合、mr を requests に追加する。requests を返す。
ModuleItem : StatementListItem
新しい空のリストを返す。
ImportDeclaration :
import
ImportClause
FromClause
;
specifier を FromClause の SV とする。唯一の要素が ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : « » } であるリストを返す。
ImportDeclaration :
import
ImportClause
FromClause
WithClause
;
specifier を FromClause の SV とする。attributes を WithClause の WithClauseToAttributes とする。唯一の要素が ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : attributes } であるリストを返す。
ImportDeclaration :
import
ModuleSpecifier
;
specifier を ModuleSpecifier の SV とする。唯一の要素が ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : « » } であるリストを返す。
ImportDeclaration :
import
ModuleSpecifier
WithClause
;
specifier を ModuleSpecifier の SV とする。attributes を WithClause の WithClauseToAttributes とする。唯一の要素が ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : attributes } であるリストを返す。
ExportDeclaration :
export
ExportFromClause
FromClause
;
specifier を FromClause の SV とする。唯一の要素が ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : « » } であるリストを返す。
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause
;
specifier を FromClause の SV とする。attributes を WithClause の WithClauseToAttributes とする。唯一の要素が ModuleRequest Record { [[Specifier]] : specifier , [[Attributes]] : attributes } であるリストを返す。
ExportDeclaration :
export
NamedExports
;
export
VariableStatement
export
Declaration
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
;
新しい空のリストを返す。
16.2.1.5 抽象モジュールレコード
Module Record は、単一のモジュールのインポートとエクスポートの構造情報をカプセル化する。この情報は、接続されたモジュール群のインポートとエクスポートをリンクするために使用される。Module Record には、モジュールを評価するときにのみ使用される4つのフィールドが含まれている。
仕様の目的上、Module Record 値は Record 仕様型の値であり、Module Record が抽象クラスであり、抽象および具象サブクラスの両方を持つ単純なオブジェクト指向階層に存在するものと考えることができる。この仕様では、Cyclic Module Record という名前の抽象サブクラスと、その具象サブクラスである Source Text Module Record を定義している。他の仕様や実装では、それらが定義する代替モジュール定義機能に対応する追加の Module Record サブクラスを定義してもよい。
Module Record は Table 41 にリストされたフィールドを定義する。すべての Module Definition サブクラスには、少なくともこれらのフィールドが含まれる。Module Record はまた、Table 42 の抽象メソッドリストも定義する。すべての Module definition サブクラスは、これらの抽象メソッドの具象実装を提供しなければならない。
Table 41: Module Record フィールド
フィールド名
値の型
意味
[[Realm]]
Realm Record
このモジュールが作成されたレルム。
[[Environment]]
Module Environment Record または empty
このモジュールのトップレベル束縛を含む Environment Record 。このフィールドはモジュールがリンクされるときに設定される。
[[Namespace]]
Object または empty
このモジュールに対して作成されている場合の Module Namespace Object(28.3 )。
[[HostDefined]]
任意(デフォルト値は undefined )
モジュールに追加情報を関連付ける必要があるホスト環境 による使用のために予約されたフィールド。
Table 42: Module Record の抽象メソッド
メソッド
目的
LoadRequestedModules([hostDefined ])
すべての依存関係を再帰的にロードしてモジュールをリンキング用に準備し、プロミスを返す。
GetExportedNames([exportStarSet ])
このモジュールから直接または間接的にエクスポートされるすべての名前のリストを返す。
このメソッドを呼び出す前に LoadRequestedModules が正常に完了している必要がある。
ResolveExport(exportName [, resolveSet ])
このモジュールによってエクスポートされる名前の束縛を返す。束縛は { [[Module]] : Module Record , [[BindingName]] : String | namespace } の形式の ResolvedBinding Record で表される。エクスポートが任意のモジュールに直接束縛を持たない Module Namespace Object の場合、[[BindingName]] は namespace に設定される。名前を解決できない場合は null を返し、複数の束縛が見つかった場合は ambiguous を返す。
この操作が特定の exportName , resolveSet ペアを引数として呼び出されるたびに、同じ結果を返さなければならない。
このメソッドを呼び出す前に LoadRequestedModules が正常に完了している必要がある。
Link()
すべてのモジュール依存関係を遷移的に解決し、Module Environment Record を作成してモジュールを評価用に準備する。
このメソッドを呼び出す前に LoadRequestedModules が正常に完了している必要がある。
Evaluate()
このモジュールとその依存関係の評価のプロミスを返す。評価が成功した場合または既に正常に評価されている場合は解決し、評価エラーまたは既に評価に失敗している場合は拒否する。プロミスが拒否された場合、ホスト はプロミス拒否を処理し、評価エラーを再スローすることが期待される。
このメソッドを呼び出す前に Link が正常に完了している必要がある。
16.2.1.5.1 EvaluateModuleSync ( module )
The abstract operation EvaluateModuleSync takes argument module (Module Record ) and returns unused を含む通常完了か投げ完了. 呼び出し元が module の評価が既に決定されたプロミスを返すことを保証する場合に、module を同期的に評価する。 It performs the following steps when called:
Assert : module は Cyclic Module Record ではない。promise を module .Evaluate() とする。Assert : promise .[[PromiseState]] は fulfilled または rejected のいずれかである。promise .[[PromiseState]] が rejected の場合、promise .[[PromiseIsHandled]] が false の場合、HostPromiseRejectionTracker (promise , "handle" ) を実行する。promise .[[PromiseIsHandled]] を true に設定する。ThrowCompletion (promise .[[PromiseResult]] ) を返す。unused を返す。
16.2.1.6 循環モジュールレコード (Cyclic Module Records)
Cyclic Module Record は、Cyclic Module Record 型のサブクラスである他のモジュールと依存サイクルを形成し得るモジュールに関する情報を表現するために用いられる。Cyclic Module Record 型のサブクラスではない Module Record は、Source Text Module Record との依存サイクルに参加してはならない。
Table 41 で定義されたフィールドに加えて、Cyclic Module Record は Table 43 に列挙される追加フィールドを持つ。
Table 43: Cyclic Module Record の追加フィールド
フィールド名
値の型
意味
[[Status]]
new , unlinked , linking , linked , evaluating , evaluating-async , または evaluated
初期値は new 。モジュールのライフサイクル進行に伴って unlinked , linking , linked , evaluating , (必要に応じて)evaluating-async , evaluated と順に遷移する。evaluating-async は、このモジュールが非同期依存の完了後に実行キューへ入ったか、[[HasTLA]] フィールドが true で実行済みでトップレベル完了待ちであることを示す。
[[EvaluationError]]
throw completion または empty
評価中に発生した例外を表す throw completion 。例外が発生していない、または [[Status]] が evaluated でない場合は undefined 。
[[DFSAncestorIndex]]
整数 または empty
Link と Evaluate 中のみ使用される補助フィールド。[[Status]] が linking または evaluating のとき、モジュール自身の深さ優先走査インデックス、または同じ強連結成分内の「より早い」モジュールのそれ。
[[RequestedModules]]
ModuleRequest Record のリスト
そのモジュール内の import に対応する ModuleRequest Record のリスト。ソーステキスト出現順で並ぶ。
[[LoadedModules]]
LoadedModuleRequest Record のリスト
このレコードが表すモジュールが使用した指定子文字列と解決済み Module Record との(相対的インポート属性を含む)対応。ModuleRequestsEqual (r1 , r2 ) が true となる異なる Record r1 と r2 を同時に含まない。
[[CycleRoot]]
Cyclic Module Record または empty
サイクル内で最初に訪れたモジュール(強連結成分の DFS ルート)。サイクル外ならモジュール自身。Evaluate 完了後、モジュールの [[DFSAncestorIndex]] はその [[CycleRoot]] の深さ優先インデックスとなる。
[[HasTLA]]
Boolean
このモジュール自体が個別に非同期かどうか(例: top-level await を含む Source Text Module Record )。非同期依存があるだけでは true にはならない。パース後に変更されてはならない。
[[AsyncEvaluationOrder]]
unset , 整数 , または done
初期値 unset 。完全同期モジュールでは unset のまま。自身が非同期または非同期依存を持つ場合、16.2.1.6.1.3.4 により保留モジュール実行をキューする順序を決める整数 を設定。保留モジュールが実行されたら done 。
[[TopLevelCapability]]
PromiseCapability Record または empty
あるサイクルの [[CycleRoot]] で、かつそのサイクル内のモジュールに Evaluate() が呼ばれた場合、その全評価の PromiseCapability Record を保持。Evaluate() 抽象メソッドが返す Promise を解決・拒否するために用いる。サイクル内依存でもトップレベル Evaluate() が開始されていなければ empty 。
[[AsyncParentModules]]
Cyclic Module Record のリスト
このモジュールまたは依存に [[HasTLA]] true があり実行進行中の場合、トップレベル実行ジョブにおける親インポーターを追跡。親モジュールはこのモジュールが成功完了するまで実行を開始しない。
[[PendingAsyncDependencies]]
整数 または empty
非同期依存がある場合、残り非同期依存モジュールの数。これが 0 になり実行エラーがなければモジュールは実行される。
Table 42 で定義されたメソッドに加えて、Cyclic Module Record は Table 44 に列挙される追加抽象メソッドを持つ。
Table 44: Cyclic Module Record の追加抽象メソッド
GraphLoadingState Record はモジュールグラフの読み込み過程に関する情報を保持し、HostLoadImportedModule 呼び出し後の読み込み継続に用いる。各 GraphLoadingState Record は Table 45 で定義されるフィールドを持つ:
Table 45: GraphLoadingState Record フィールド
16.2.1.6.1 Module Record 抽象メソッドの実装
以下は Table 42 で定義された Module Record 抽象メソッドを実装する Cyclic Module Record の具象メソッドである。
16.2.1.6.1.1 LoadRequestedModules ( [ hostDefined ] )
The LoadRequestedModules concrete method of Cyclic Module Record module takes optional argument hostDefined (anything) and returns Promise. module の依存グラフ内すべての Module Record の [[LoadedModules]] を埋める(実作業の大半は補助関数 InnerModuleLoading が行う)。オプションの hostDefined は HostLoadImportedModule フックに渡される。 It performs the following steps when called:
hostDefined が与えられないなら hostDefined を empty とする。pc を ! NewPromiseCapability (%Promise% ) とする。state を GraphLoadingState Record { [[IsLoading]] : true , [[PendingModulesCount]] : 1, [[Visited]] : « », [[PromiseCapability]] : pc , [[HostDefined]] : hostDefined } とする。InnerModuleLoading (state , module ) を実行する。pc .[[Promise]] を返す。
Note
hostDefined パラメータはインポートモジュール取得に必要な追加情報を渡すために利用できる。例えば HTML では <link rel="preload" as="...">
の適切な fetch destination 設定に使う。import()
式は hostDefined を設定しない。
16.2.1.6.1.1.1 InnerModuleLoading ( state , module )
The abstract operation InnerModuleLoading takes arguments state (GraphLoadingState Record ) and module (Module Record ) and returns unused . LoadRequestedModules により再帰的に module 依存グラフの実際の読み込みを行うために使用される。 It performs the following steps when called:
Assert : state .[[IsLoading]] は true 。もし module が Cyclic Module Record で、module .[[Status]] が new 、かつ state .[[Visited]] に module を含まないならmodule を state .[[Visited]] に追加する。requestedModulesCount を module .[[RequestedModules]] の要素数とする。state .[[PendingModulesCount]] を state .[[PendingModulesCount]] + requestedModulesCount に設定。module .[[RequestedModules]] の各 ModuleRequest Record request についてAllImportAttributesSupported (request .[[Attributes]] ) が false ならerror を ThrowCompletion (新たに生成した SyntaxError オブジェクト) とする。ContinueModuleLoading (state , error ) を実行。そうでなく module .[[LoadedModules]] に ModuleRequestsEqual (record , request ) が true となる LoadedModuleRequest Record record が含まれるならInnerModuleLoading (state , record .[[Module]] ) を実行。 それ以外HostLoadImportedModule (module , request , state .[[HostDefined]] , state ) を実行。注: HostLoadImportedModule は FinishLoadingImportedModule を呼び、ContinueModuleLoading を通じてグラフ読み込みに再突入する。 state .[[IsLoading]] が false なら unused を返す。 Assert : state .[[PendingModulesCount]] ≥ 1。state .[[PendingModulesCount]] を 1 減らす。もし state .[[PendingModulesCount]] = 0 ならstate .[[IsLoading]] を false に設定。state .[[Visited]] の各 Cyclic Module Record loaded についてもし loaded .[[Status]] が new なら unlinked に設定。 ! Call(state .[[PromiseCapability]] .[[Resolve]] , undefined , « undefined ») を実行。 unused を返す。
16.2.1.6.1.1.2 ContinueModuleLoading ( state , moduleCompletion )
The abstract operation ContinueModuleLoading takes arguments state (GraphLoadingState Record ) and moduleCompletion (モジュール Record を含む通常完了または throw completion ) and returns unused . HostLoadImportedModule 呼び出し後に読み込み処理へ再突入するために用いる。 It performs the following steps when called:
state .[[IsLoading]] が false なら unused を返す。moduleCompletion が通常完了ならInnerModuleLoading (state , moduleCompletion .[[Value]] ) を実行。そうでなければstate .[[IsLoading]] を false に設定。! Call(state .[[PromiseCapability]] .[[Reject]] , undefined , « moduleCompletion .[[Value]] ») を実行。 unused を返す。
16.2.1.6.1.2 Link ( )
The Link concrete method of Cyclic Module Record module takes no arguments and returns unused を含む通常完了または throw completion . 成功時、Link はこのモジュールの [[Status]] を unlinked から linked に遷移させる。失敗時は例外を投げ、[[Status]] は unlinked のまま。(実作業の大半は補助関数 InnerModuleLinking が行う。) It performs the following steps when called:
Assert : module .[[Status]] は unlinked , linked , evaluating-async , evaluated のいずれか。stack を新しい空リストとする。result を Completion (InnerModuleLinking (module , stack , 0)) とする。もし result が abrupt completion ならstack の各 Cyclic Module Record m についてAssert : m .[[Status]] は linking 。m .[[Status]] を unlinked に設定。Assert : module .[[Status]] は unlinked 。? result を返す。 Assert : module .[[Status]] は linked , evaluating-async , evaluated のいずれか。Assert : stack は空。unused を返す。
16.2.1.6.1.2.1 InnerModuleLinking ( module , stack , index )
The abstract operation InnerModuleLinking takes arguments module (Module Record ), stack (Cyclic Module Record のリスト), and index (非負整数 ) and returns 非負整数 を含む通常完了または throw completion . Link により module および依存グラフの他モジュールを再帰的にリンクする。stack と index 、および各モジュールの [[DFSAncestorIndex]] は DFS 走査管理に用いられる。特に [[DFSAncestorIndex]] は強連結成分 (SCC) を発見し、その全モジュールを一括で linked に遷移させるために使われる。 It performs the following steps when called:
module が Cyclic Module Record でないなら? module .Link() を実行。 index を返す。もし module .[[Status]] が linking , linked , evaluating-async , evaluated のいずれかならindex を返す。 Assert : module .[[Status]] は unlinked 。module .[[Status]] を linking に設定。moduleIndex を index とする。module .[[DFSAncestorIndex]] を index に設定。index を index + 1 に更新。module を stack に追加。module .[[RequestedModules]] の各 ModuleRequest Record request についてrequiredModule を GetImportedModule (module , request ) とする。index を ? InnerModuleLinking (requiredModule , stack , index ) に設定。もし requiredModule が Cyclic Module Record ならAssert : requiredModule .[[Status]] は linking , linked , evaluating-async , evaluated のいずれか。Assert : requiredModule .[[Status]] が linking であることと stack に requiredModule を含むことは同値。もし requiredModule .[[Status]] が linking ならmodule .[[DFSAncestorIndex]] を min (module .[[DFSAncestorIndex]] , requiredModule .[[DFSAncestorIndex]] ) に設定。 ? module .InitializeEnvironment() を実行。 Assert : module は stack にちょうど 1 回出現。Assert : module .[[DFSAncestorIndex]] ≤ moduleIndex 。もし module .[[DFSAncestorIndex]] = moduleIndex ならdone を false とする。done が false の間繰り返すrequiredModule を stack の最後の要素とする。最後の要素を stack から除去。 Assert : requiredModule は Cyclic Module Record 。requiredModule .[[Status]] を linked に設定。もし requiredModule と module が同一なら done を true に。 index を返す。
16.2.1.6.1.3 Evaluate ( )
The Evaluate concrete method of Cyclic Module Record module takes no arguments and returns Promise. Evaluate は [[Status]] を linked から evaluating-async または evaluated に遷移させる。与えられた強連結成分で最初に呼ばれたモジュールについては Promise を作成し、評価完了時に解決する。その Promise は成分の [[CycleRoot]] の [[TopLevelCapability]] に保持され、成分内の他モジュールでの後続呼び出しも同じ Promise を返す。(実作業の大半は補助関数 InnerModuleEvaluation が行う。) It performs the following steps when called:
Assert : この Evaluate 呼び出しと同時並行で同エージェント内の別の Evaluate 呼び出しは起こっていない。Assert : module .[[Status]] は linked , evaluating-async , evaluated のいずれか。もし module .[[Status]] が evaluating-async または evaluated なら module を module .[[CycleRoot]] に置き換える。 もし module .[[TopLevelCapability]] が empty でないならmodule .[[TopLevelCapability]] .[[Promise]] を返す。 stack を新しい空リストとする。capability を ! NewPromiseCapability (%Promise% ) とする。module .[[TopLevelCapability]] を capability に設定。result を Completion (InnerModuleEvaluation (module , stack , 0)) とする。もし result が abrupt completion ならstack の各 Cyclic Module Record m についてAssert : m .[[Status]] は evaluating 。Assert : m .[[AsyncEvaluationOrder]] は unset 。m .[[Status]] を evaluated に設定。m .[[EvaluationError]] を result に設定。Assert : module .[[Status]] は evaluated 。Assert : module .[[EvaluationError]] と result は同じ Completion Record 。! Call(capability .[[Reject]] , undefined , « result .[[Value]] ») を実行。 それ以外Assert : module .[[Status]] は evaluating-async または evaluated 。Assert : module .[[EvaluationError]] は empty 。もし module .[[Status]] が evaluated なら注: 評価が同期的に完了したことを意味する。 Assert : module .[[AsyncEvaluationOrder]] は unset 。! Call(capability .[[Resolve]] , undefined , « undefined ») を実行。 Assert : stack は空。 capability .[[Promise]] を返す。
16.2.1.6.1.3.1 InnerModuleEvaluation ( module , stack , index )
The abstract operation InnerModuleEvaluation takes arguments module (Module Record ), stack (Cyclic Module Record のリスト), and index (非負整数 ) and returns 非負整数 を含む通常完了または throw completion . Evaluate が実際の評価処理を module および依存グラフ上の他モジュールへ再帰的に行う。stack , index および module .[[DFSAncestorIndex]] の用途は InnerModuleLinking と同様。 It performs the following steps when called:
module が Cyclic Module Record でないなら? EvaluateModuleSync (module ) を実行。 index を返す。もし module .[[Status]] が evaluating-async または evaluated ならもし module .[[EvaluationError]] が empty なら index を返す。 それ以外なら ? module .[[EvaluationError]] を返す。 もし module .[[Status]] が evaluating なら index を返す。 Assert : module .[[Status]] は linked 。module .[[Status]] を evaluating に設定。moduleIndex を index とする。module .[[DFSAncestorIndex]] を index に設定。module .[[PendingAsyncDependencies]] を 0 に設定。index を index + 1 に。module を stack に追加。module .[[RequestedModules]] の各 ModuleRequest Record request についてrequiredModule を GetImportedModule (module , request ) とする。index を ? InnerModuleEvaluation (requiredModule , stack , index ) に設定。もし requiredModule が Cyclic Module Record ならAssert : requiredModule .[[Status]] は evaluating , evaluating-async , evaluated のいずれか。Assert : requiredModule .[[Status]] が evaluating であることと stack に含まれることは同値。もし requiredModule .[[Status]] が evaluating ならmodule .[[DFSAncestorIndex]] を min (module .[[DFSAncestorIndex]] , requiredModule .[[DFSAncestorIndex]] ) に設定。 それ以外requiredModule を requiredModule .[[CycleRoot]] に設定。Assert : requiredModule .[[Status]] は evaluating-async または evaluated 。もし requiredModule .[[EvaluationError]] が empty でないなら ? requiredModule .[[EvaluationError]] を返す。 もし requiredModule .[[AsyncEvaluationOrder]] が整数 ならmodule .[[PendingAsyncDependencies]] を 1 増やす。requiredModule .[[AsyncParentModules]] に module を追加。 もし module .[[PendingAsyncDependencies]] > 0 または module .[[HasTLA]] が true ならAssert : module .[[AsyncEvaluationOrder]] は unset 。module .[[AsyncEvaluationOrder]] を IncrementModuleAsyncEvaluationCount () に設定。もし module .[[PendingAsyncDependencies]] = 0 なら ExecuteAsyncModule (module ) を実行。 それ以外? module .ExecuteModule() を実行。 Assert : module は stack にちょうど 1 回。Assert : module .[[DFSAncestorIndex]] ≤ moduleIndex 。もし module .[[DFSAncestorIndex]] = moduleIndex ならdone を false とする。done が false の間requiredModule を stack の最後の要素とする。最後の要素を stack から除去。 Assert : requiredModule は Cyclic Module Record 。Assert : requiredModule .[[AsyncEvaluationOrder]] は 整数 または unset 。もし requiredModule .[[AsyncEvaluationOrder]] が unset なら requiredModule .[[Status]] を evaluated に。 それ以外は evaluating-async に。 もし requiredModule と module が同一なら done を true に。 requiredModule .[[CycleRoot]] を module に設定。 index を返す。
Note 1
モジュールは InnerModuleEvaluation に走査されている間 evaluating 。[[HasTLA]] が true か非同期依存がある場合、実行中は evaluating-async 、完了後 evaluated 。
Note 2
非同期サイクルに属するモジュールに依存するモジュールは、サイクルが evaluating でない間、そのサイクルのルート ([[CycleRoot]] ) の実行に依存する。これによりサイクル全体をルート状態を介した単一の強連結成分として扱える。
16.2.1.6.1.3.2 ExecuteAsyncModule ( module )
The abstract operation ExecuteAsyncModule takes argument module (Cyclic Module Record ) and returns unused . It performs the following steps when called:
Assert : module .[[Status]] は evaluating または evaluating-async 。Assert : module .[[HasTLA]] は true 。capability を ! NewPromiseCapability (%Promise% ) とする。fulfilledClosure を、引数なしで module を捕捉し呼び出し時に以下を行う新しい Abstract Closure とする:AsyncModuleExecutionFulfilled (module ) を実行。NormalCompletion (undefined ) を返す。onFulfilled を CreateBuiltinFunction (fulfilledClosure , 0, "" , « ») とする。rejectedClosure を、引数 (error ) を取り module を捕捉し以下を行う Abstract Closure とする:AsyncModuleExecutionRejected (module , error ) を実行。NormalCompletion (undefined ) を返す。onRejected を CreateBuiltinFunction (rejectedClosure , 0, "" , « ») とする。PerformPromiseThen (capability .[[Promise]] , onFulfilled , onRejected ) を実行。! module .ExecuteModule (capability ) を実行。 unused を返す。
16.2.1.6.1.3.3 GatherAvailableAncestors ( module , execList )
The abstract operation GatherAvailableAncestors takes arguments module (Cyclic Module Record ) and execList (Cyclic Module Record のリスト) and returns unused . It performs the following steps when called:
module .[[AsyncParentModules]] の各 Cyclic Module Record m についてもし execList に m を含まず、かつ m .[[CycleRoot]] .[[EvaluationError]] が empty ならAssert : m .[[Status]] は evaluating-async 。Assert : m .[[EvaluationError]] は empty 。Assert : m .[[AsyncEvaluationOrder]] は整数 。Assert : m .[[PendingAsyncDependencies]] > 0。m .[[PendingAsyncDependencies]] を 1 減らす。もし 0 ならexecList に m を追加。もし m .[[HasTLA]] が false なら GatherAvailableAncestors (m , execList ) を実行。 unused を返す。
Note
非同期実行が root module で充足された際、この関数は同期的に一括実行可能なモジュール集合を決定し execList を構築する。
16.2.1.6.1.3.4 AsyncModuleExecutionFulfilled ( module )
The abstract operation AsyncModuleExecutionFulfilled takes argument module (Cyclic Module Record ) and returns unused . It performs the following steps when called:
もし module .[[Status]] が evaluated ならAssert : module .[[EvaluationError]] は empty ではない。unused を返す。 Assert : module .[[Status]] は evaluating-async 。Assert : module .[[AsyncEvaluationOrder]] は整数 。Assert : module .[[EvaluationError]] は empty 。module .[[AsyncEvaluationOrder]] を done に設定。module .[[Status]] を evaluated に設定。もし module .[[TopLevelCapability]] が empty でないならAssert : module .[[CycleRoot]] と module は同一 Module Record 。! Call(module .[[TopLevelCapability]] .[[Resolve]] , undefined , « undefined ») を実行。 execList を空リストとする。GatherAvailableAncestors (module , execList ) を実行。Assert : execList の全要素は [[AsyncEvaluationOrder]] が整数 、[[PendingAsyncDependencies]] が 0、[[EvaluationError]] が empty 。sortedExecList を execList を [[AsyncEvaluationOrder]] 昇順で並べたリストとする。sortedExecList の各 Cyclic Module Record m についてもし m .[[Status]] が evaluated ならAssert : m .[[EvaluationError]] は empty ではない。 Else if m .[[HasTLA]] が true ならExecuteAsyncModule (m ) を実行。 Elseresult を m .ExecuteModule() とする。もし result が abrupt completion ならAsyncModuleExecutionRejected (m , result .[[Value]] ) を実行。 それ以外m .[[AsyncEvaluationOrder]] を done に。m .[[Status]] を evaluated に。もし m .[[TopLevelCapability]] が empty でないならAssert : m .[[CycleRoot]] と m は同一。! Call(m .[[TopLevelCapability]] .[[Resolve]] , undefined , « undefined ») を実行。 unused を返す。
16.2.1.6.1.3.5 AsyncModuleExecutionRejected ( module , error )
The abstract operation AsyncModuleExecutionRejected takes arguments module (Cyclic Module Record ) and error (ECMAScript 言語値) and returns unused . It performs the following steps when called:
もし module .[[Status]] が evaluated ならAssert : module .[[EvaluationError]] は empty ではない。unused を返す。 Assert : module .[[Status]] は evaluating-async 。Assert : module .[[AsyncEvaluationOrder]] は整数 。Assert : module .[[EvaluationError]] は empty 。module .[[EvaluationError]] を ThrowCompletion (error ) に設定。module .[[Status]] を evaluated に設定。module .[[AsyncEvaluationOrder]] を done に設定。注: 対称性のため done 。InnerModuleEvaluation では [[EvaluationError]] が empty でない場合 [[AsyncEvaluationOrder]] は利用されない。 module .[[AsyncParentModules]] の各 Cyclic Module Record m についてAsyncModuleExecutionRejected (m , error ) を実行。もし module .[[TopLevelCapability]] が empty でないならAssert : module .[[CycleRoot]] と module は同一。! Call(module .[[TopLevelCapability]] .[[Reject]] , undefined , « error ») を実行。 unused を返す。
16.2.1.6.2 循環モジュールレコードグラフの例
この非規範節では、よくあるモジュールグラフのリンクおよび評価例と、エラー発生の様態に焦点を当てた事例を示す。
まず次の単純なモジュールグラフを考える:
Figure 2: 単純なモジュールグラフ
先にエラー条件が無いと仮定する。ホスト が最初に A .LoadRequestedModules() を呼ぶと、仮定により成功裏に完了し、再帰的に B と C の依存(それぞれ C となし)をロードし、その後 A .[[Status]] = B .[[Status]] = C .[[Status]] = unlinked に設定する。続いてホスト が A .Link() を呼ぶと、再度成功し、A .[[Status]] = B .[[Status]] = C .[[Status]] = linked となる。これら準備ステップは任意の時点で行える。その後、モジュール副作用を許容するタイミングで A .Evaluate() を呼ぶと、仮定により成功し undefined に解決される Promise を返し、内部的には C 、次に B を評価する。各モジュールの [[Status]] は evaluated 。
次にリンクエラーを含むケースを考える(A .LoadRequestedModules() が成功後)。もし C の InnerModuleLinking が成功した後 B で失敗(例: B が C に存在しないものを import)すれば、当初の A .Link() は失敗し、A と B の [[Status]] は unlinked のまま。C の [[Status]] は linked に達している。
最後に、Link() 成功後の評価エラーを含むケース。C の InnerModuleEvaluation が成功後、B で失敗(例: B のコードが例外を投げる)すると、A .Evaluate() は拒否された Promise を返す。例外は A と B 双方の [[EvaluationError]] に記録され、それらの [[Status]] は evaluated 。一方 C も evaluated になるが、例外はなく [[EvaluationError]] は空。例外を保存することで後続の Evaluate() 呼び出しでも同一例外に遭遇する。(ホスト は Cyclic Module Record を再利用する義務も、例外オブジェクトを外部に露出する義務もないが、仕様として可能にしている。)
次に別種のエラー条件を考える:
Figure 3: 解決不能モジュールを含むモジュールグラフ
このシナリオではモジュール A が他モジュールへの依存を宣言するが、その Module Record が存在しない(HostLoadImportedModule が FinishLoadingImportedModule へ例外で返す)。リソース不存在や ParseModule がエラーを返した場合などが要因。ホスト は FinishLoadingImportedModule へ渡す completion を通じて失敗原因を公開できる。いずれにせよ例外は読み込み失敗を引き起こし、A の [[Status]] は new のまま。
読み込み・リンク・評価エラーの差異は以下の特徴による:
評価は副作用をもたらすため一度だけ行うべきで、成功/失敗を記録しておく必要がある(失敗時も同じ例外を保持しないと後続 Evaluate() が新規例外を合成する必要が出る)。
リンクは副作用がなく、失敗しても後から再試行できる。
読み込みはホスト との緊密な相互作用があり、一時的ネットワーク不調などで失敗したロードをユーザが再試行できることが望まれる場合がある。
次にサイクルを持つモジュールグラフ:
Figure 4: 循環モジュールグラフ
エントリポイントを A と仮定し、ホスト は A .LoadRequestedModules() を呼ぶ。これは A 上で InnerModuleLoading を行い、さらに B , C 上でも呼ぶ。サイクルにより再び A に対する InnerModuleLoading がトリガーされるが、その依存読み込みは既に開始済みなので無操作。グラフ中すべてが正常にロードされると、全ての [[Status]] が同時に new から unlinked に。
続いて A .Link() により A の InnerModuleLinking を行い、B に再帰。サイクルで再度 A に来るが既に linking なので無操作。B が linking のまま制御が A に戻り C の InnerModuleLinking 。C が linked になると A と B は同時に linking から linked へ(強連結成分単位で同時遷移できるよう DFS)。
成功ケースでは評価段階も同様の物語。
次に A がリンクエラー(例: C に存在しない束縛 import)を持つケース。上述のステップは(二度目の InnerModuleLinking (A ) 早期リターン含め)進むが、最初の InnerModuleLinking (A ) に戻って InitializeEnvironment(C .ResolveExport() 後)で失敗。SyntaxError が A .Link へ伝播し、stack 上の linking モジュール(A , B )を unlinked へ戻す。C は linked のまま。
別に A が評価エラー(ソースが例外 throw)ケース。評価版のステップが進み、二度目の InnerModuleEvaluation (A ) から早期戻り後、最初へ戻って失敗。例外は A .Evaluate() へ伝播し、stack 上の evaluating モジュールと [[AsyncParentModules]] 経由(top-level await 連鎖)にエラーを記録。A , B は evaluated となり両 [[EvaluationError]] に記録、C は例外なく evaluated 。
最後に、全モジュールが非同期に完了するサイクル付きグラフ:
Figure 5: 非同期循環モジュールグラフ
読み込みとリンクは同様で全て [[Status]] linked 。
A .Evaluate() は A , B , D に InnerModuleEvaluation を呼び evaluating に。再度 A に当たるが evaluating のため無操作。ここで D .[[PendingAsyncDependencies]] = 0 なので ExecuteAsyncModule (D ) を呼び PromiseCapability 付きで D .ExecuteModule。戻って B の InnerModuleEvaluation で B .[[PendingAsyncDependencies]] = 1, [[AsyncEvaluationOrder]] = 1。さらに A の元へ戻り A .[[PendingAsyncDependencies]] = 1。次に C へ遷移し D (無操作)と E を訪れる。E は依存もサイクル参加もないため ExecuteAsyncModule (E ) を呼び直ちにスタックから除去。戻って C .[[AsyncEvaluationOrder]] = 3。A の依存ループ完了後 A .[[AsyncEvaluationOrder]] = 4 を設定し、強連結成分全体をスタックから除去、全モジュールを一度に evaluating-async 。状態は Table 46 の通り。
Table 46: 初回 Evaluate() 呼び出し後のフィールド
Field
Module
A
B
C
D
E
[[DFSAncestorIndex]]
0
0
0
0
4
[[Status]]
evaluating-async
evaluating-async
evaluating-async
evaluating-async
evaluating-async
[[AsyncEvaluationOrder]]
4
1
3
0
2
[[AsyncParentModules]]
« »
« A »
« A »
« B , C »
« C »
[[PendingAsyncDependencies]]
2 (B と C )
1 (D )
2 (D と E )
0
0
最初に E が終了すると仮定。終了で AsyncModuleExecutionFulfilled が呼ばれ E .[[Status]] = evaluated 、C .[[PendingAsyncDependencies]] が 1 に減少。状態は Table 47 。
Table 47: モジュール E 実行完了後フィールド
Field
Module
C
E
[[DFSAncestorIndex]]
0
4
[[Status]]
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
3
done
[[AsyncParentModules]]
« A »
« C »
[[PendingAsyncDependencies]]
1 (D )
0
次に D が終了(唯一の実行中だった)。AsyncModuleExecutionFulfilled が再度呼ばれ D .[[Status]] = evaluated 。実行可能祖先は B ([[AsyncEvaluationOrder]] 1) と C (3) で B を先に処理: B .[[PendingAsyncDependencies]] が 0、ExecuteAsyncModule (B ) で実行開始。C .[[PendingAsyncDependencies]] も 0 になり C も実行(B が await を含めば並列)。状態は Table 48 。
Table 48: モジュール D 実行完了後フィールド
Field
Module
B
C
D
[[DFSAncestorIndex]]
0
0
0
[[Status]]
evaluating-async
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
1
3
done
[[AsyncParentModules]]
« A »
« A »
« B , C »
[[PendingAsyncDependencies]]
0
0
0
次に C が終了。AsyncModuleExecutionFulfilled が呼ばれ C .[[Status]] = evaluated 、A .[[PendingAsyncDependencies]] が 1 に。状態は Table 49 。
Table 49: モジュール C 実行完了後フィールド
Field
Module
A
C
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
4
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
1 (B )
0
次いで B が終了。AsyncModuleExecutionFulfilled が呼ばれ B .[[Status]] = evaluated 、A .[[PendingAsyncDependencies]] が 0 となり ExecuteAsyncModule が呼ばれ実行開始。状態は Table 50 。
Table 50: モジュール B 実行完了後フィールド
Field
Module
A
B
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluating-async
evaluated
[[AsyncEvaluationOrder]]
4
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
0
0
最後に A が終了し AsyncModuleExecutionFulfilled を再度呼び A .[[Status]] = evaluated 。A .[[TopLevelCapability]] の Promise(A .Evaluate() が返したもの)が解決され終了。状態は Table 51 。
Table 51: モジュール A 実行完了後フィールド
Field
Module
A
[[DFSAncestorIndex]]
0
[[Status]]
evaluated
[[AsyncEvaluationOrder]]
done
[[AsyncParentModules]]
« »
[[PendingAsyncDependencies]]
0
別の失敗例として B 完了前に C がエラーで失敗。AsyncModuleExecutionRejected が呼ばれ C .[[Status]] = evaluated , C .[[EvaluationError]] にエラーを設定し、AsyncParentModules へ伝播。状態は Table 52 。
Table 52: モジュール C がエラー終了後フィールド
Field
Module
A
C
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluated
evaluated
[[AsyncEvaluationOrder]]
done
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
1 (B )
0
[[EvaluationError]]
empty
C の評価エラー
C が A に対しそのエラーで AsyncModuleExecutionRejected を呼ぶため A も同じエラーで拒否され、A .[[Status]] = evaluated 。A .[[TopLevelCapability]] の Promise は拒否。状態は Table 53 。
Table 53: モジュール A が拒否された後フィールド
Field
Module
A
[[DFSAncestorIndex]]
0
[[Status]]
evaluated
[[AsyncEvaluationOrder]]
done
[[AsyncParentModules]]
« »
[[PendingAsyncDependencies]]
0
[[EvaluationError]]
C の Evaluation Error
その後 B がエラーなく完了。AsyncModuleExecutionFulfilled が呼ばれ B .[[Status]] = evaluated 。GatherAvailableAncestors (B ) が呼ばれるが A .[[CycleRoot]] = A が評価エラーを持つため sortedExecList に追加されず処理終了。後続で B を import する者はサイクルルート A に設定された C の評価エラーを参照して拒否を見る。状態は Table 54 。
Table 54: エラーグラフで B 実行完了後フィールド
Field
Module
A
B
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluated
evaluated
[[AsyncEvaluationOrder]]
4
1
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
0
0
[[EvaluationError]]
C の Evaluation Error
empty
16.2.1.7 ソーステキストモジュールレコード (Source Text Module Records)
Source Text Module Record は、ゴール記号 Module でパースされた ECMAScript ソーステキスト (11 ) から定義されたモジュールに関する情報を表す。フィールドにはモジュールが import / export する名前の要約が格納され、具象メソッドはこれを利用してリンクと評価を行う。
Source Text Module Record は抽象 Module Record 型の他サブクラスと同一グラフに存在でき、Cyclic Module Record 型の他サブクラスとのサイクルにも参加できる。
Table 43 で定義されたフィールドに加え、Source Text Module Record は Table 55 に列挙される追加フィールドを持つ。各フィールドは ParseModule で初期設定される。
Table 55: Source Text Module Record の追加フィールド
フィールド名
値の型
意味
[[ECMAScriptCode]]
Parse Node
ゴール記号 Module でソーステキストをパースした結果。
[[Context]]
ECMAScript 実行コンテキストまたは empty
このモジュールに関連付けられる実行コンテキスト。環境初期化まで empty 。
[[ImportMeta]]
Object または empty
import.meta
メタプロパティを通じて公開されるオブジェクト。アクセスされるまで empty 。
[[ImportEntries]]
ImportEntry Record のリスト
モジュールコードから導出された ImportEntry レコードのリスト。
[[LocalExportEntries]]
ExportEntry Record のリスト
モジュール内部宣言に対応する ExportEntry のリスト。
[[IndirectExportEntries]]
ExportEntry Record のリスト
モジュール内の再エクスポート import または export * as namespace
宣言に対応する ExportEntry のリスト。
[[StarExportEntries]]
ExportEntry Record のリスト
export *
宣言(export * as namespace
を除く)に対応する ExportEntry のリスト。
ImportEntry Record は単一の宣言的 import を要約する Record 。各 ImportEntry Record は Table 56 のフィールドを持つ:
Table 56: ImportEntry Record フィールド
Note 1
Table 57 は構文 import 形と ImportEntry フィールドの対応例を示す:
Table 57 (Informative): Import 構文と ImportEntry Record の対応
Import 文形式
[[ModuleRequest]]
[[ImportName]]
[[LocalName]]
import v from "mod";
"mod"
"default"
"v"
import * as ns from "mod";
"mod"
namespace-object
"ns"
import {x} from "mod";
"mod"
"x"
"x"
import {x as v} from "mod";
"mod"
"x"
"v"
import "mod";
ImportEntry Record は作成されない。
ExportEntry Record は単一の宣言的 export を要約する Record 。各 ExportEntry Record は Table 58 のフィールドを持つ:
Table 58: ExportEntry Record フィールド
Note 2
Table 59 は構文 export 形と ExportEntry フィールドの対応例:
Table 59 (Informative): Export 構文と ExportEntry Record の対応
Export 文形式
[[ExportName]]
[[ModuleRequest]]
[[ImportName]]
[[LocalName]]
export var v;
"v"
null
null
"v"
export default function f() {}
"default"
null
null
"f"
export default function () {}
"default"
null
null
"*default*"
export default 42;
"default"
null
null
"*default*"
export {x};
"x"
null
null
"x"
export {v as x};
"x"
null
null
"v"
export {x} from "mod";
"x"
"mod"
"x"
null
export {v as x} from "mod";
"x"
"mod"
"v"
null
export * from "mod";
null
"mod"
all-but-default
null
export * as ns from "mod";
"ns"
"mod"
all
null
以下の定義は Source Text Module Record に必要な具象メソッドおよび抽象操作 を規定する。
16.2.1.7.1 ParseModule ( sourceText , realm , hostDefined )
The abstract operation ParseModule takes arguments sourceText (ECMAScript ソーステキスト ), realm (Realm Record ), and hostDefined (任意) and returns Source Text Module Record または SyntaxError オブジェクトの空でないリスト. sourceText を Module としてパースした結果に基づき Source Text Module Record を生成。 It performs the following steps when called:
body を ParseText(sourceText , Module ) とする。body がエラーのリストなら body を返す。requestedModules を body の ModuleRequests とする。importEntries を body の ImportEntries とする。importedBoundNames を ImportedLocalNames(importEntries ) とする。indirectExportEntries を空リスト。localExportEntries を空リスト。starExportEntries を空リスト。exportEntries を body の ExportEntries とする。各 ExportEntry Record ee についてもし ee .[[ModuleRequest]] が null ならもし importedBoundNames が ee .[[LocalName]] を含まないならee を localExportEntries に追加。 それ以外ie を [[LocalName]] = ee .[[LocalName]] の importEntries 要素とする。もし ie .[[ImportName]] が namespace-object なら注: インポートされたモジュール namespace オブジェクトの再エクスポート。 ee を localExportEntries に追加。 それ以外注: 単一名の再エクスポート。 ExportEntry Record { [[ModuleRequest]] : ie .[[ModuleRequest]] , [[ImportName]] : ie .[[ImportName]] , [[LocalName]] : null , [[ExportName]] : ee .[[ExportName]] } を indirectExportEntries に追加。 それ以外で ee .[[ImportName]] が all-but-default ならAssert : ee .[[ExportName]] は null 。ee を starExportEntries に追加。 それ以外ee を indirectExportEntries に追加。 async を body Contains await
とする。Source Text Module Record { [[Realm]] : realm , [[Environment]] : empty , [[Namespace]] : empty , [[CycleRoot]] : empty , [[HasTLA]] : async , [[AsyncEvaluationOrder]] : unset , [[TopLevelCapability]] : empty , [[AsyncParentModules]] : « », [[PendingAsyncDependencies]] : empty , [[Status]] : new , [[EvaluationError]] : empty , [[HostDefined]] : hostDefined , [[ECMAScriptCode]] : body , [[Context]] : empty , [[ImportMeta]] : empty , [[RequestedModules]] : requestedModules , [[LoadedModules]] : « », [[ImportEntries]] : importEntries , [[LocalExportEntries]] : localExportEntries , [[IndirectExportEntries]] : indirectExportEntries , [[StarExportEntries]] : starExportEntries , [[DFSAncestorIndex]] : empty } を返す。
Note
実装は ParseModule 評価前にモジュールソースをパースし早期エラー解析を行ってもよいが、エラー報告は仕様が実際に ParseModule を行う時点まで遅延しなければならない。
16.2.1.7.2 Module Record 抽象メソッドの実装 (Source Text)
以下は Table 42 に対応する Source Text Module Record の具象メソッド。
16.2.1.7.2.1 GetExportedNames ( [ exportStarSet ] )
The GetExportedNames concrete method of Source Text Module Record module takes optional argument exportStarSet (Source Text Module Record のリスト) and returns 文字列リスト. It performs the following steps when called:
Assert : module .[[Status]] は new でない。exportStarSet が無ければ空リストに設定。もし exportStarSet が module を含むならAssert : export *
循環の開始点に到達。空リストを返す。 module を exportStarSet に追加。exportedNames を空リスト。module .[[LocalExportEntries]] の各 ExportEntry Record e についてAssert : 直接束縛を提供。Assert : e .[[ExportName]] は null でない。e .[[ExportName]] を exportedNames に追加。module .[[IndirectExportEntries]] の各 e についてAssert : 特定束縛 import の再エクスポート。Assert : e .[[ExportName]] は null でない。e .[[ExportName]] を追加。module .[[StarExportEntries]] の各 e についてAssert : e .[[ModuleRequest]] は null でない。requestedModule を GetImportedModule (module , e .[[ModuleRequest]] )。starNames を requestedModule .GetExportedNames(exportStarSet )。各 n についてもし n ≠ "default" ならかつ exportedNames に含まれないなら追加。 exportedNames を返す。
Note
GetExportedNames は曖昧な star export の名前を除去も例外化もしない。
16.2.1.7.2.2 ResolveExport ( exportName [ , resolveSet ] )
The ResolveExport concrete method of Source Text Module Record module takes argument exportName (文字列) and optional argument resolveSet ([[Module]] (Module Record ), [[ExportName]] (文字列) を持つ Record のリスト) and returns ResolvedBinding Record , null , または ambiguous .
ResolveExport は要求されたエクスポート名を最終的な定義モジュールとローカル束縛名へ解決する。定義モジュールは自身または import 先モジュール。resolveSet は循環 import/export 経路検出に使われ、既に同一 (module , exportName ) ペアが存在すれば循環で null を返す。再帰前に (module , exportName ) を追加。
定義が見つかれば ResolvedBinding Record { [[Module]] , [[BindingName]] } を返す。namespace のみでローカル束縛が無い場合 [[BindingName]] は namespace 。定義が見つからない/循環なら null 、曖昧なら ambiguous を返す。
It performs the following steps when called:
Assert : module .[[Status]] は new でない。resolveSet がなければ空リスト。resolveSet の各 Record r についてもし module と r .[[Module]] が同一で exportName = r .[[ExportName]] ならAssert : 循環 import 要求。null を返す。 Record { [[Module]] : module , [[ExportName]] : exportName } を resolveSet に追加。module .[[LocalExportEntries]] の各 e についてもし e .[[ExportName]] = exportName ならAssert : 直接束縛。ResolvedBinding Record { [[Module]] : module , [[BindingName]] : e .[[LocalName]] } を返す。 module .[[IndirectExportEntries]] の各 e についてもし e .[[ExportName]] = exportName ならAssert : e .[[ModuleRequest]] は null でない。importedModule を GetImportedModule (module , e .[[ModuleRequest]] )。もし e .[[ImportName]] が all ならResolvedBinding Record { [[Module]] : importedModule , [[BindingName]] : namespace } を返す。 それ以外Assert : 具体的束縛 import。Assert : e .[[ImportName]] は文字列。importedModule .ResolveExport(e .[[ImportName]] , resolveSet ) を返す。 もし exportName = "default" ならAssert : 明示的な default
export 非定義。null を返す。注: export * from "mod"
で default
は供給されない。 starResolution を null とする。module .[[StarExportEntries]] の各 e についてAssert : e .[[ModuleRequest]] は null でない。importedModule を GetImportedModule (module , e .[[ModuleRequest]] )。resolution を importedModule .ResolveExport(exportName , resolveSet )。resolution が ambiguous なら ambiguous を返す。resolution が null でないならAssert : resolution は ResolvedBinding。もし starResolution が null なら starResolution = resolution 。 それ以外Assert : 複数の *
import が同名を含む。もし resolution .[[Module]] ≠ starResolution .[[Module]] なら ambiguous 。 もし [[BindingName]] が異なり、いずれかが namespace なら ambiguous 。 両方文字列かつ異なれば ambiguous 。 starResolution を返す。
16.2.1.7.3 Cyclic Module Record 抽象メソッドの実装 (Source Text)
Table 44 で定義された Cyclic Module Record 抽象メソッドに対応する Source Text Module Record の具象メソッド。
16.2.1.7.3.1 InitializeEnvironment ( )
The InitializeEnvironment concrete method of Source Text Module Record module takes no arguments and returns unused を含む通常完了または throw completion . It performs the following steps when called:
module .[[IndirectExportEntries]] の各 ExportEntry Record e についてAssert : e .[[ExportName]] は null でない。resolution を module .ResolveExport(e .[[ExportName]] ) とする。もし resolution が null または ambiguous なら SyntaxError を投げる。 Assert : resolution は ResolvedBinding。Assert : すべての名前付き export は解決可能。realm を module .[[Realm]] 。Assert : realm は undefined でない。env を NewModuleEnvironment (realm .[[GlobalEnv]] )。module .[[Environment]] を env に設定。module .[[ImportEntries]] の各 ImportEntry Record in についてimportedModule を GetImportedModule (module , in .[[ModuleRequest]] )。もし in .[[ImportName]] が namespace-object ならnamespace を GetModuleNamespace (importedModule )。! env .CreateImmutableBinding(in .[[LocalName]] , true )。 ! env .InitializeBinding(in .[[LocalName]] , namespace )。 それ以外resolution を importedModule .ResolveExport(in .[[ImportName]] )。もし resolution が null または ambiguous なら SyntaxError 。 もし resolution .[[BindingName]] が namespace ならnamespace を GetModuleNamespace (resolution .[[Module]] )。! env .CreateImmutableBinding(in .[[LocalName]] , true )。 ! env .InitializeBinding(in .[[LocalName]] , namespace )。 それ以外CreateImportBinding (env , in .[[LocalName]] , resolution .[[Module]] , resolution .[[BindingName]] )。 moduleContext を新 ECMAScript 実行コンテキスト。Function を null 。 Assert : module .[[Realm]] は undefined でない。Realm を module .[[Realm]] 。ScriptOrModule を module 。 VariableEnvironment / LexicalEnvironment を module .[[Environment]] 。 PrivateEnvironment を null 。 module .[[Context]] を moduleContext に。moduleContext を実行コンテキストスタックに push。code を module .[[ECMAScriptCode]] 。varDeclarations を code の VarScopedDeclarations。declaredVarNames を空リスト。各 d ∈ varDeclarations についてd の BoundNames 各 dn についてdeclaredVarNames に含まれなければ! env .CreateMutableBinding(dn , false )。 ! env .InitializeBinding(dn , undefined )。 declaredVarNames に追加。 lexDeclarations を code の LexicallyScopedDeclarations。privateEnv を null 。各 d ∈ lexDeclarations についてd の BoundNames 各 dn についてもし IsConstantDeclaration(d ) が true なら! env .CreateImmutableBinding(dn , true )。 それ以外! env .CreateMutableBinding(dn , false )。 もし d が FunctionDeclaration / GeneratorDeclaration / AsyncFunctionDeclaration / AsyncGeneratorDeclaration のいずれかならfo を InstantiateFunctionObject(d , env , privateEnv )。! env .InitializeBinding(dn , fo )。 実行コンテキストスタックから moduleContext を除去。 unused を返す。
16.2.1.7.3.2 ExecuteModule ( [ capability ] )
The ExecuteModule concrete method of Source Text Module Record module takes optional argument capability (PromiseCapability Record ) and returns unused を含む通常完了または throw completion . It performs the following steps when called:
moduleContext を新 ECMAScript 実行コンテキスト。Function を null 。 Realm を module .[[Realm]] 。ScriptOrModule を module 。 Assert : モジュールはリンク済みで環境宣言インスタンス化済み。VariableEnvironment / LexicalEnvironment を module .[[Environment]] 。 実行中コンテキストを中断。 もし module .[[HasTLA]] が false ならAssert : capability は存在しない。moduleContext をスタックへ push。result を Completion (Evaluation of module .[[ECMAScriptCode]] )。moduleContext を中断しスタックから除去。上位コンテキストを再開。 もし result が abrupt completion なら ? result を返す。 それ以外Assert : capability は PromiseCapability Record 。AsyncBlockStart (capability , module .[[ECMAScriptCode]] , moduleContext ) を実行。 unused を返す。
16.2.1.8 シンセティックモジュールレコード (Synthetic Module Records)
Synthetic Module Record は仕様によって定義されるモジュール情報を表す。エクスポート名は作成時に静的定義され、対応値は SetSyntheticModuleExport で変化し得る。インポートや依存は持たない。
Note Synthetic Module Record は JSON モジュールや CSS モジュールなど多様なモジュール形式を定義するために利用できる。
Table 41 で定義されたフィールドに加え、Synthetic Module Record は Table 60 の追加フィールドを持つ。
Table 60: Synthetic Module Record の追加フィールド
16.2.1.8.1 CreateDefaultExportSyntheticModule ( defaultExport )
The abstract operation CreateDefaultExportSyntheticModule takes argument defaultExport (ECMAScript 言語値) and returns Synthetic Module Record . defaultExport を default export とする Synthetic Module Record を生成。 It performs the following steps when called:
realm を現在の Realm Record 。setDefaultExport を引数 (module ) を取り defaultExport を捕捉し以下を行う Abstract Closure :SetSyntheticModuleExport (module , "default" , defaultExport )。NormalCompletion (unused ) を返す。Synthetic Module Record { [[Realm]] : realm , [[Environment]] : empty , [[Namespace]] : empty , [[HostDefined]] : undefined , [[ExportNames]] : « "default" », [[EvaluationSteps]] : setDefaultExport } を返す。
16.2.1.8.2 ParseJSONModule ( source )
The abstract operation ParseJSONModule takes argument source (文字列) and returns Synthetic Module Record を含む通常完了または throw completion . It performs the following steps when called:
json を ? ParseJSON (source ) とする。CreateDefaultExportSyntheticModule (json ) を返す。
16.2.1.8.3 SetSyntheticModuleExport ( module , exportName , exportValue )
The abstract operation SetSyntheticModuleExport takes arguments module (Synthetic Module Record ), exportName (文字列), and exportValue (ECMAScript 言語値) and returns unused . Synthetic Module Record の既存エクスポート値を設定または変更する。 It performs the following steps when called:
Assert : module .[[ExportNames]] は exportName を含む。envRec を module .[[Environment]] 。Assert : envRec は empty でない。envRec .SetMutableBinding(exportName , exportValue , true ) を実行。unused を返す。
16.2.1.8.4 Module Record 抽象メソッドの実装 (Synthetic)
以下は Synthetic Module Record の Module Record 抽象メソッド具象実装。
16.2.1.8.4.1 LoadRequestedModules ( )
The LoadRequestedModules concrete method of Synthetic Module Record module takes no arguments and returns Promise. It performs the following steps when called:
! PromiseResolve (%Promise% , undefined ) を返す。
Note
16.2.1.8.4.2 GetExportedNames ( )
The GetExportedNames concrete method of Synthetic Module Record module takes no arguments and returns 文字列リスト. It performs the following steps when called:
module .[[ExportNames]] を返す。
16.2.1.8.4.3 ResolveExport ( exportName )
The ResolveExport concrete method of Synthetic Module Record module takes argument exportName (文字列) and returns ResolvedBinding Record または null . It performs the following steps when called:
もし module .[[ExportNames]] が exportName を含まなければ null 。 ResolvedBinding Record { [[Module]] : module , [[BindingName]] : exportName } を返す。
16.2.1.8.4.4 Link ( )
The Link concrete method of Synthetic Module Record module takes no arguments and returns unused を含む通常完了. It performs the following steps when called:
realm を module .[[Realm]] 。env を NewModuleEnvironment (realm .[[GlobalEnv]] )。module .[[Environment]] を env に。module .[[ExportNames]] の各文字列 exportName について! env .CreateMutableBinding(exportName , false )。 ! env .InitializeBinding(exportName , undefined )。 NormalCompletion (unused ) を返す。
16.2.1.8.4.5 Evaluate ( )
The Evaluate concrete method of Synthetic Module Record module takes no arguments and returns Promise. It performs the following steps when called:
moduleContext を新 ECMAScript 実行コンテキスト。Function を null 。 Realm を module .[[Realm]] 。ScriptOrModule を module 。 VariableEnvironment / LexicalEnvironment を module .[[Environment]] 。 実行中コンテキストを中断。 moduleContext をスタックに push。steps を module .[[EvaluationSteps]] 。result を Completion (steps (module ))。moduleContext を中断・除去。上位コンテキストを再開。 pc を ! NewPromiseCapability (%Promise% )。IfAbruptRejectPromise (result , pc )。! Call(pc .[[Resolve]] , undefined , « undefined »)。 pc .[[Promise]] を返す。
16.2.1.9 GetImportedModule ( referrer , request )
The abstract operation GetImportedModule takes arguments referrer (Cyclic Module Record ) and request (ModuleRequest Record ) and returns Module Record . It performs the following steps when called:
records を referrer .[[LoadedModules]] のうち ModuleRequestsEqual (r , request ) が true となる各 LoadedModuleRequest Record r からなるリストとする。Assert : LoadRequestedModules が referrer に正常完了しているため records は正確に 1 要素。record をその唯一要素。record .[[Module]] を返す。
16.2.1.10 HostLoadImportedModule ( referrer , moduleRequest , hostDefined , payload )
The host-defined abstract operation HostLoadImportedModule takes arguments referrer (Script Record , Cyclic Module Record , または Realm Record ), moduleRequest (ModuleRequest Record ), hostDefined (任意), and payload (GraphLoadingState Record または PromiseCapability Record ) and returns unused .
Note 1
referrer が Realm Record になり得る例は Web ブラウザホスト 。例えばユーザが
<button type ="button" onclick ="import('./foo.mjs')" > Click me</button >
をクリックすると、import()
式実行時点でアクティブなスクリプトやモジュールが存在しない。ホスト が ScriptOrModule null の実行コンテキストをスタックに積む状況全般で起こり得る。
HostLoadImportedModule の実装は以下要件に従う:
実際の処理はホスト定義 だが、通常は適切な Module Record をロードするための各種 I/O を行う。異なる複数の (referrer , moduleRequest .[[Specifier]] , moduleRequest .[[Attributes]] ) 組が同一 Module Record インスタンスにマップされることがある。マッピングは通常 specifier の正規化(相対・短縮パス展開など)を含む。
Note 2
上記は type: "json"
でインポートされた JSON モジュールをホスト がサポートすることを要求するが、type: "json"
なしでの JSON モジュールサポートを禁止しない。
16.2.1.11 FinishLoadingImportedModule ( referrer , moduleRequest , payload , result )
The abstract operation FinishLoadingImportedModule takes arguments referrer (Script Record 、Cyclic Module Record 、または Realm Record ), moduleRequest (ModuleRequest Record ), payload (GraphLoadingState Record または PromiseCapability Record ), and result (Module Record を含む通常完了または throw completion のいずれか) and returns unused . It performs the following steps when called:
result が通常完了なら、もし referrer .[[LoadedModules]] が ModuleRequestsEqual (record , moduleRequest ) が true となる LoadedModuleRequest Record record を含むなら、Assert : record .[[Module]] と result .[[Value]] は同じ Module Record である。 それ以外なら、LoadedModuleRequest Record { [[Specifier]] : moduleRequest .[[Specifier]] , [[Attributes]] : moduleRequest .[[Attributes]] , [[Module]] : result .[[Value]] } を referrer .[[LoadedModules]] に追加する。 payload が GraphLoadingState Record であれば、ContinueModuleLoading (payload , result ) を実行する。それ以外なら、ContinueDynamicImport (payload , result ) を実行する。 unused を返す。
16.2.1.12 AllImportAttributesSupported ( attributes )
The abstract operation AllImportAttributesSupported takes argument attributes (ImportAttribute Record のリスト) and returns Boolean. It performs the following steps when called:
supported を HostGetSupportedImportAttributes () とする。attributes の各 ImportAttribute Record attribute について、もし supported が attribute .[[Key]] を含まなければ false を返す。 true を返す。
16.2.1.12.1 HostGetSupportedImportAttributes ( )
The host-defined abstract operation HostGetSupportedImportAttributes takes no arguments and returns 文字列リスト. ホスト環境 がサポートする import 属性を指定できる。サポートされるキーを持つ属性のみがホスト へ提供される。
HostGetSupportedImportAttributes の実装は次の要件に従わなければならない:
各要素がサポートされる属性を示す文字列であるリストを返さなければならない。
この操作が呼び出されるたびに、同一内容・同一順序の同一リストを返さなければならない。
HostGetSupportedImportAttributes のデフォルト実装は、新しい空リストを返すことである。
Note ホスト に全ての属性を渡して選別させるのではなく、サポートしている属性キーを
ホスト が明示することを要求する目的は、サポートされない属性の扱いを異なる
ホスト 間で一貫させるためである。
16.2.1.13 GetModuleNamespace ( module )
The abstract operation GetModuleNamespace takes argument module (Module Record の具象サブクラスのインスタンス) and returns Module Namespace Object. module のエクスポートを表す Module Namespace Object を取得する。初回要求時に遅延生成し、以後の取得のために module .[[Namespace]] に格納する。 It performs the following steps when called:
Assert : module が Cyclic Module Record なら module .[[Status]] は new でも unlinked でもない。namespace を module .[[Namespace]] とする。もし namespace が empty ならexportedNames を module .GetExportedNames() とする。unambiguousNames を新しい空リストとする。exportedNames の各要素 name についてresolution を module .ResolveExport(name ) とする。resolution が ResolvedBinding Record なら name を unambiguousNames に追加する。namespace を ModuleNamespaceCreate (module , unambiguousNames ) とする。 namespace を返す。
Note
GetModuleNamespace は例外を投げない。解決不能な名前はこの時点では単に namespace から除外される。それらがすべてどこからも明示的に要求されない曖昧な star export でない限り、後で実際のリンクエラーにつながる。
16.2.1.14 Runtime Semantics: Evaluation
Module : [empty]
undefined を返す。
ModuleBody : ModuleItemList
result を Completion (Evaluation of ModuleItemList ) とする。result が通常完了で result .[[Value]] が empty ならundefined を返す。? result を返す。
ModuleItemList :
ModuleItemList
ModuleItem
sl を ? Evaluation of ModuleItemList とする。s を Completion (Evaluation of ModuleItem ) とする。? UpdateEmpty (s , sl ) を返す。
Note
ModuleItemList の値は、その中で最後に値を生成した項目の値である。
ModuleItem : ImportDeclaration
empty を返す。
16.2.2 インポート
構文
ImportDeclaration :
import
ImportClause
FromClause
WithClause opt
;
import
ModuleSpecifier
WithClause opt
;
ImportClause :
ImportedDefaultBinding
NameSpaceImport
NamedImports
ImportedDefaultBinding
,
NameSpaceImport
ImportedDefaultBinding
,
NamedImports
ImportedDefaultBinding :
ImportedBinding
NameSpaceImport :
*
as
ImportedBinding
NamedImports :
{
}
{
ImportsList
}
{
ImportsList
,
}
FromClause :
from
ModuleSpecifier
ImportsList :
ImportSpecifier
ImportsList
,
ImportSpecifier
ImportSpecifier :
ImportedBinding
ModuleExportName
as
ImportedBinding
ModuleSpecifier :
StringLiteral
ImportedBinding :
BindingIdentifier [~Yield, +Await]
WithClause :
with
{
}
with
{
WithEntries
,opt
}
WithEntries :
AttributeKey
:
StringLiteral
AttributeKey
:
StringLiteral
,
WithEntries
AttributeKey :
IdentifierName
StringLiteral
16.2.2.1 静的意味論: 早期エラー
ModuleItem : ImportDeclaration
WithClause :
with
{
WithEntries
,opt
}
WithClause の WithClauseToAttributes に、a .[[Key]] が b .[[Key]] と同じになる 2 つの異なるエントリ a と b がある場合、構文エラー。
16.2.2.2 静的意味論: ImportEntries : ImportEntry Record のリスト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Module : [empty]
新しい空リストを返す。
ModuleItemList :
ModuleItemList
ModuleItem
entries1 を ModuleItemList の ImportEntries とする。entries2 を ModuleItem の ImportEntries とする。entries1 と entries2 のリスト連結を返す。
ModuleItem :
ExportDeclaration
StatementListItem
新しい空リストを返す。
ImportDeclaration :
import
ImportClause
FromClause
WithClause opt
;
module を ImportDeclaration の ModuleRequests の唯一の要素とする。引数 module で ImportClause の ImportEntriesForModule を返す。
ImportDeclaration :
import
ModuleSpecifier
WithClause opt
;
新しい空リストを返す。
16.2.2.3 静的意味論: ImportEntriesForModule : ImportEntry Record のリスト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ImportClause :
ImportedDefaultBinding
,
NameSpaceImport
entries1 を 引数 module で ImportedDefaultBinding の ImportEntriesForModule とする。entries2 を 引数 module で NameSpaceImport の ImportEntriesForModule とする。entries1 と entries2 のリスト連結を返す。
ImportClause :
ImportedDefaultBinding
,
NamedImports
entries1 を 引数 module で ImportedDefaultBinding の ImportEntriesForModule とする。entries2 を 引数 module で NamedImports の ImportEntriesForModule とする。entries1 と entries2 のリスト連結を返す。
ImportedDefaultBinding : ImportedBinding
localName を ImportedBinding の BoundNames の唯一の要素とする。defaultEntry を ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : "default" , [[LocalName]] : localName } とする。« defaultEntry » を返す。
NameSpaceImport :
*
as
ImportedBinding
localName を ImportedBinding の StringValue とする。entry を ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : namespace-object , [[LocalName]] : localName } とする。« entry » を返す。
NamedImports :
{
}
新しい空リストを返す。
ImportsList :
ImportsList
,
ImportSpecifier
specs1 を 引数 module で ImportsList の ImportEntriesForModule とする。specs2 を 引数 module で ImportSpecifier の ImportEntriesForModule とする。specs1 と specs2 のリスト連結を返す。
ImportSpecifier : ImportedBinding
localName を ImportedBinding の BoundNames の唯一の要素とする。entry を ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : localName , [[LocalName]] : localName } とする。« entry » を返す。
ImportSpecifier :
ModuleExportName
as
ImportedBinding
importName を ModuleExportName の StringValue とする。localName を ImportedBinding の StringValue とする。entry を ImportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : importName , [[LocalName]] : localName } とする。« entry » を返す。
16.2.2.4 静的意味論: WithClauseToAttributes : ImportAttribute Record のリスト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
WithClause :
with
{
}
新しい空リストを返す。
WithClause :
with
{
WithEntries
,opt
}
attributes を WithEntries の WithClauseToAttributes とする。attributes を各 [[Key]] フィールド値を UTF-16 符号単位列として扱い、辞書順でソートする。注: このソートが観測可能なのは、ホスト が列挙順序によって挙動を変えることが禁止されている点のみである。attributes を返す。
WithEntries :
AttributeKey
:
StringLiteral
key を AttributeKey の PropName とする。entry を ImportAttribute Record { [[Key]] : key , [[Value]] : StringLiteral の SV } とする。« entry » を返す。
WithEntries :
AttributeKey
:
StringLiteral
,
WithEntries
key を AttributeKey の PropName とする。entry を ImportAttribute Record { [[Key]] : key , [[Value]] : StringLiteral の SV } とする。rest を WithEntries の WithClauseToAttributes とする。« entry » と rest のリスト連結を返す。
16.2.3 エクスポート
構文
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
export
VariableStatement [~Yield, +Await]
export
Declaration [~Yield, +Await]
export
default
HoistableDeclaration [~Yield, +Await, +Default]
export
default
ClassDeclaration [~Yield, +Await, +Default]
export
default
[lookahead ∉ { function , async
[no LineTerminator here]
function , class }]
AssignmentExpression [+In, ~Yield, +Await]
;
ExportFromClause :
*
*
as
ModuleExportName
NamedExports
NamedExports :
{
}
{
ExportsList
}
{
ExportsList
,
}
ExportsList :
ExportSpecifier
ExportsList
,
ExportSpecifier
ExportSpecifier :
ModuleExportName
ModuleExportName
as
ModuleExportName
16.2.3.1 静的意味論: 早期エラー
ExportDeclaration :
export
NamedExports
;
Note
上記規則により NamedExports の各 ReferencedBindings は IdentifierReference として扱われる。
16.2.3.2 静的意味論: ExportedBindings : 文字列リスト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
ExportedBindings は Module の ExportedNames に明示的に関連付けられるローカル束縛名である。
It is defined piecewise over the following productions:
ModuleItemList :
ModuleItemList
ModuleItem
names1 を ModuleItemList の ExportedBindings とする。names2 を ModuleItem の ExportedBindings とする。names1 と names2 のリスト連結を返す。
ModuleItem :
ImportDeclaration
StatementListItem
新しい空リストを返す。
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
新しい空リストを返す。
ExportDeclaration :
export
NamedExports
;
NamedExports の ExportedBindings を返す。
ExportDeclaration :
export
VariableStatement
VariableStatement の BoundNames を返す。
ExportDeclaration :
export
Declaration
Declaration の BoundNames を返す。
ExportDeclaration :
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
;
この ExportDeclaration の BoundNames を返す。
NamedExports :
{
}
新しい空リストを返す。
ExportsList :
ExportsList
,
ExportSpecifier
names1 を ExportsList の ExportedBindings とする。names2 を ExportSpecifier の ExportedBindings とする。names1 と names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
唯一の要素が ModuleExportName の StringValue であるリストを返す。
ExportSpecifier :
ModuleExportName
as
ModuleExportName
唯一の要素が最初の ModuleExportName の StringValue であるリストを返す。
16.2.3.3 静的意味論: ExportedNames : 文字列リスト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
ExportedNames は Module がローカル束縛名の一つに明示的に対応付ける外部可視名である。
It is defined piecewise over the following productions:
ModuleItemList :
ModuleItemList
ModuleItem
names1 を ModuleItemList の ExportedNames とする。names2 を ModuleItem の ExportedNames とする。names1 と names2 のリスト連結を返す。
ModuleItem : ExportDeclaration
ExportDeclaration の ExportedNames を返す。
ModuleItem :
ImportDeclaration
StatementListItem
新しい空リストを返す。
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
ExportFromClause の ExportedNames を返す。
ExportFromClause : *
新しい空リストを返す。
ExportFromClause :
*
as
ModuleExportName
唯一の要素が ModuleExportName の StringValue であるリストを返す。
ExportFromClause : NamedExports
NamedExports の ExportedNames を返す。
ExportDeclaration :
export
VariableStatement
VariableStatement の BoundNames を返す。
ExportDeclaration :
export
Declaration
Declaration の BoundNames を返す。
ExportDeclaration :
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
;
« "default" » を返す。
NamedExports :
{
}
新しい空リストを返す。
ExportsList :
ExportsList
,
ExportSpecifier
names1 を ExportsList の ExportedNames とする。names2 を ExportSpecifier の ExportedNames とする。names1 と names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
唯一の要素が ModuleExportName の StringValue であるリストを返す。
ExportSpecifier :
ModuleExportName
as
ModuleExportName
唯一の要素が 2つ目の ModuleExportName の StringValue であるリストを返す。
16.2.3.4 静的意味論: ExportEntries : ExportEntry Record のリスト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Module : [empty]
新しい空リストを返す。
ModuleItemList :
ModuleItemList
ModuleItem
entries1 を ModuleItemList の ExportEntries とする。entries2 を ModuleItem の ExportEntries とする。entries1 と entries2 のリスト連結を返す。
ModuleItem :
ImportDeclaration
StatementListItem
新しい空リストを返す。
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
module を ExportDeclaration の ModuleRequests の唯一の要素とする。引数 module で ExportFromClause の ExportEntriesForModule を返す。
ExportDeclaration :
export
NamedExports
;
引数 null で NamedExports の ExportEntriesForModule を返す。
ExportDeclaration :
export
VariableStatement
entries を新しい空リストとする。names を VariableStatement の BoundNames とする。names の各要素 name についてExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : name , [[ExportName]] : name } を entries に追加。entries を返す。
ExportDeclaration :
export
Declaration
entries を新しい空リストとする。names を Declaration の BoundNames とする。names の各要素 name についてExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : name , [[ExportName]] : name } を entries に追加。entries を返す。
ExportDeclaration :
export
default
HoistableDeclaration
names を HoistableDeclaration の BoundNames とする。localName を names の唯一の要素とする。唯一の要素が新しい ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : localName , [[ExportName]] : "default" } であるリストを返す。
ExportDeclaration :
export
default
ClassDeclaration
names を ClassDeclaration の BoundNames とする。localName を names の唯一の要素とする。唯一の要素が新しい ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : localName , [[ExportName]] : "default" } であるリストを返す。
ExportDeclaration :
export
default
AssignmentExpression
;
entry を ExportEntry Record { [[ModuleRequest]] : null , [[ImportName]] : null , [[LocalName]] : "*default*" , [[ExportName]] : "default" } とする。« entry » を返す。
Note
"*default*" は無名の default export 値のための合成名として仕様内で使用される。詳細は このノート を参照。
16.2.3.5 静的意味論: ExportEntriesForModule : ExportEntry Record のリスト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ExportFromClause : *
entry を ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : all-but-default , [[LocalName]] : null , [[ExportName]] : null } とする。« entry » を返す。
ExportFromClause :
*
as
ModuleExportName
exportName を ModuleExportName の StringValue とする。entry を ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : all , [[LocalName]] : null , [[ExportName]] : exportName } とする。« entry » を返す。
NamedExports :
{
}
新しい空リストを返す。
ExportsList :
ExportsList
,
ExportSpecifier
specs1 を 引数 module で ExportsList の ExportEntriesForModule とする。specs2 を 引数 module で ExportSpecifier の ExportEntriesForModule とする。specs1 と specs2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
sourceName を ModuleExportName の StringValue とする。もし module が null ならlocalName を sourceName とする。importName を null とする。 それ以外localName を null とする。importName を sourceName とする。 唯一の要素が ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : importName , [[LocalName]] : localName , [[ExportName]] : sourceName } であるリストを返す。
ExportSpecifier :
ModuleExportName
as
ModuleExportName
sourceName を 最初の ModuleExportName の StringValue とする。exportName を 2つ目の ModuleExportName の StringValue とする。もし module が null ならlocalName を sourceName とする。importName を null とする。 それ以外localName を null とする。importName を sourceName とする。 唯一の要素が ExportEntry Record { [[ModuleRequest]] : module , [[ImportName]] : importName , [[LocalName]] : localName , [[ExportName]] : exportName } であるリストを返す。
16.2.3.6 静的意味論: ReferencedBindings : Parse Node のリスト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
NamedExports :
{
}
新しい空リストを返す。
ExportsList :
ExportsList
,
ExportSpecifier
names1 を ExportsList の ReferencedBindings とする。names2 を ExportSpecifier の ReferencedBindings とする。names1 と names2 のリスト連結を返す。
ExportSpecifier :
ModuleExportName
as
ModuleExportName
最初の ModuleExportName の ReferencedBindings を返す。
ModuleExportName : IdentifierName
唯一の要素が IdentifierName であるリストを返す。
ModuleExportName : StringLiteral
唯一の要素が StringLiteral であるリストを返す。
16.2.3.7 実行時意味論: 評価
ExportDeclaration :
export
ExportFromClause
FromClause
WithClause opt
;
export
NamedExports
;
empty を返す。
ExportDeclaration :
export
VariableStatement
? Evaluation of VariableStatement を返す。
ExportDeclaration :
export
Declaration
? Evaluation of Declaration を返す。
ExportDeclaration :
export
default
HoistableDeclaration
? Evaluation of HoistableDeclaration を返す。
ExportDeclaration :
export
default
ClassDeclaration
value を ? BindingClassDeclarationEvaluation of ClassDeclaration とする。className を ClassDeclaration の BoundNames の唯一の要素とする。もし className が "*default*" ならenv を実行中実行コンテキストの LexicalEnvironment とする。? InitializeBoundName ("*default*" , value , env ) を実行。 empty を返す。
ExportDeclaration :
export
default
AssignmentExpression
;
IsAnonymousFunctionDefinition(AssignmentExpression ) が true ならvalue を 引数 "default" で ? NamedEvaluation of AssignmentExpression とする。 それ以外rhs を ? Evaluation of AssignmentExpression とする。value を ? GetValue (rhs ) とする。 env を実行中実行コンテキストの LexicalEnvironment とする。? InitializeBoundName ("*default*" , value , env ) を実行。 empty を返す。
17 エラー処理と言語拡張
実装は、関連する ECMAScript 言語構成要素が評価される時点でほとんどのエラーを報告しなければならない。早期エラー (early error) とは、そのエラーを含む Script 内のいかなる構成要素の評価よりも前に検出・報告できるエラーである。早期エラーが存在する場合、その構成要素の評価は行われない。実装は ParseScript における Script の構文解析の一部として Script 内の早期エラーを報告しなければならない。Module 内の早期エラーは、その Module が評価される時点で報告され、その Module は決して初期化されない。eval コード内の早期エラーは eval
が呼び出された時点で報告され、eval コードの評価を阻止する。早期エラーでないすべてのエラーは実行時エラーである。
実装は、本仕様の「静的意味論 : 早期エラー」小節に列挙されている条件が発生したあらゆる箇所を早期エラーとして報告しなければならない。
実装は、たとえコンパイラがある構成要素がいかなる状況でもエラーなく実行されないと証明できる場合であっても、他種のエラーを早期エラーとして扱ってはならない。そのような場合、実装は早期警告を発することは許されるが、関連する構成要素が実際に実行されるまでエラーを報告すべきではない。
実装は、以下を除き、規定どおりにすべてのエラーを報告しなければならない:
17.1 による制限を除き、ホスト または実装は Script 構文、Module 構文、正規表現パターンまたはフラグの構文を拡張してよい。これを許容するため、SyntaxError を送出し得るすべての操作(eval
の呼び出し、正規表現リテラルの使用、Function や RegExp コンストラクタ の使用など)は、スクリプト構文または正規表現パターン/フラグ構文に対するホスト定義 拡張に遭遇した際、SyntaxError を送出する代わりにホスト定義 の挙動を示すことが許される。
17.1 による制限を除き、ホスト または実装は本仕様で記述されているものを超える追加の型、値、オブジェクト、プロパティ、関数を提供してよい。これは(グローバルスコープでの変数参照などの)構成要素がエラー(たとえば ReferenceError )を送出する代わりにホスト定義 の挙動を示す原因となり得る。
17.1 禁止される拡張
実装は以下の方法で本仕様を拡張してはならない:
厳格モードコード内の構文コンストラクタ で定義された ECMAScript 関数オブジェクト は、"caller" または "arguments" という名前の独自プロパティを持つように作成されてはならない。ArrowFunction , MethodDefinition , GeneratorDeclaration , GeneratorExpression , AsyncGeneratorDeclaration , AsyncGeneratorExpression , ClassDeclaration , ClassExpression , AsyncFunctionDeclaration , AsyncFunctionExpression , AsyncArrowFunction によって定義された関数オブジェクト についても、定義が厳格モードコード内に含まれるか否かにかかわらず、同様の独自プロパティを作成してはならない。組み込み関数、Function コンストラクタ で生成された厳格関数、Generator コンストラクタ で生成された generator 関数、AsyncFunction コンストラクタ で生成された async 関数、bind
メソッドで生成された関数についても、これらの独自プロパティを持ってはならない。
実装が任意の関数オブジェクト を "caller" という名前の独自プロパティで拡張する場合、そのプロパティ値([[Get]] または [[GetOwnProperty]] で観測される値)は厳格関数オブジェクト であってはならない。それがアクセサプロパティ である場合、その [[Get]] 属性の値である関数は呼び出されたとき決して厳格関数を返してはならない。
対応/非対応引数オブジェクトのいずれも "caller" という名前の独自プロパティを持つように作成されてはならない。
ECMA-402 で規定される組み込みメソッド(toLocaleString
など)の挙動は、ECMA-402 に規定される場合を除き拡張してはならない。
22.2.1 および B.1.2 にある RegExp パターン文法は、[UnicodeMode] 文法パラメータが存在する場合に、ソース文字 A-Z または a-z のいずれかを IdentityEscape [+UnicodeMode] として認識するよう拡張してはならない。
構文文法は、BindingIdentifier 非終端記号でマッチしたソーステキストの直後にトークン :
が続くことを許すいかなる方法でも拡張してはならない。
厳格モードコードを処理する際、実装は 12.9.3.1 の早期エールールを緩和してはならない。
TemplateEscapeSequence を 12.9.4 で定義される LegacyOctalEscapeSequence または NonOctalDecimalEscapeSequence を含むよう拡張してはならない。
厳格モードコードを処理する際、B.3.1 、B.3.2 、B.3.3 、B.3.5 で定義される拡張はサポートしてはならない。
Module ゴール記号 に対する構文解析時、B.1.1 で定義される字句文法拡張はサポートしてはならない。
ImportCall は拡張してはならない。
18 ECMAScript 標準組み込みオブジェクト
ECMAScript の Script または Module が実行を開始するとき、特定の組み込みオブジェクトが利用可能である。1 つはグローバルオブジェクト で、実行中プログラムのグローバル環境の一部である。その他はグローバルオブジェクト の初期プロパティ、またはアクセス可能な組み込みオブジェクトのプロパティとして間接的にアクセスできる。
特に規定がない限り、関数として呼び出し可能な組み込みオブジェクトは 10.3 に記述される特性を持つ組み込み関数オブジェクト である。特に規定がない限り、組み込みオブジェクトの [[Extensible]] 内部スロットは初期値 true を持つ。すべての組み込み関数オブジェクト は、そのオブジェクトが最初に生成されたレルムの Realm Record を値とする [[Realm]] 内部スロットを持つ。
多くの組み込みオブジェクトは関数であり、引数付きで呼び出すことができる。そのうちいくつかはコンストラクタ でもあり、new
演算子とともに使用されることを意図した関数である。各組み込み関数について、本仕様はその関数が要求する引数およびその関数オブジェクト のプロパティを記述する。各組み込みコンストラクタ については、さらにそのコンストラクタ のプロトタイプオブジェクトのプロパティと、そのコンストラクタ を呼び出す new
式が返す特定オブジェクトインスタンスのプロパティを記述する。
特に規定がない限り、ある関数またはコンストラクタ が規定されたより少ない個数の引数を与えられた場合、その関数またはコンストラクタ は不足引数(各々 undefined 値)を与えられたかのように正確に動作しなければならない。これら不足引数は「存在しない (not present)」ものと見なされ、仕様アルゴリズムによってそのように識別され得る。個別の関数の記述において、用語 “this value” および “NewTarget” は 10.3 に示される意味を持つ。
特に規定がない限り、記述された組み込み関数またはコンストラクタ が許容されるより多い引数を与えられた場合、余剰引数は呼び出しにより評価された後その関数によって無視される。ただし、実装は単に余剰引数が存在することだけを条件として TypeError 例外を投げるのでない範囲で、そうした引数に関連する実装固有の挙動を定義してよい。
Note 1
組み込み関数集合に追加能力を加える実装は、既存関数へ新しいパラメータを追加するよりも、新しい関数を追加することで行うことが推奨される。
特に規定がない限り、すべての組み込み関数および組み込みコンストラクタ は、その [[Prototype]] 内部スロットの値として Function プロトタイプオブジェクト (式 Function.prototype
の初期値 (20.2.3 )) を持つ。
特に規定がない限り、すべての組み込みプロトタイプオブジェクトは、その [[Prototype]] 内部スロットの値として Object プロトタイプオブジェクト (式 Object.prototype
の初期値 (20.1.3 ))を持つ。ただし Object プロトタイプオブジェクト 自身は除く。
本仕様が組み込みコンストラクタ の挙動をアルゴリズム手順で定義する場合、[[Call]] と [[Construct]] の双方の目的における挙動はそれである。アルゴリズムが両者を区別する必要がある場合、NewTarget が undefined であるかを確認する(これは [[Call]] 呼び出しを示す)。
コンストラクタ でない組み込み関数オブジェクト は、特別な規定がない限り [[Construct]] 内部メソッドを実装しない。
コンストラクタ でない組み込み関数オブジェクト は、特別な規定がない限り "prototype" プロパティを持たない。
本仕様で定義される各組み込み関数は CreateBuiltinFunction 抽象操作 (10.3.4 ) を呼び出すことで生成される。パラメータ length および name の値は、それぞれ下記で述べられる "length" および "name" プロパティの初期値である。prefix パラメータの値も同様に下記で述べられる。
コンストラクタ を含むすべての組み込み関数オブジェクト は、値が非負整数 Number である "length" プロパティを持つ。特に規定がない限り、この値は関数説明小節見出しに示される必須パラメータ数である。オプションパラメータおよび rest パラメータはカウントに含まれない。
Note 2
例えば、Array プロトタイプオブジェクト の "map" プロパティの初期値である関数オブジェクト は、小節見出し «Array.prototype.map (callback [ , thisArg])» で記述され、ふたつの名前付き引数 callback と thisArg を示し、後者はオプションである;したがってその関数オブジェクト の "length" プロパティ値は 1 𝔽 である。
特に規定がない限り、組み込み関数オブジェクト の "length" プロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
コンストラクタ を含むすべての組み込み関数オブジェクト は、値が String である "name" プロパティを持つ。特に規定がない限り、この値は本仕様でその関数に与えられる名前である。匿名関数として指定される関数は、"name" プロパティ値として空文字列を使用する。オブジェクトのプロパティとして指定される関数については、その関数へアクセスする際に使用されるプロパティ名 文字列が name 値となる。組み込みプロパティの get または set アクセサ関数として指定される関数は、CreateBuiltinFunction を呼ぶ際 prefix パラメータに "get" または "set" (それぞれ)を渡す。
プロパティキー が Symbol 値である各組み込み関数については、"name" プロパティの値が明示的に規定される。明示値が接頭辞 "get " または "set " で始まり、その関数が組み込みプロパティの get / set アクセサ関数である場合、接頭辞を除いた値が name パラメータへ、"get" または "set" (それぞれ)が prefix パラメータへ渡される。
特に規定がない限り、組み込み関数オブジェクト の "name" プロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
19 から 28 、および付録 B.2 に記述されるその他のすべてのデータプロパティ は、特に規定がない限り属性 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
19 から 28 、および付録 B.2 に記述されるその他のすべてのアクセサプロパティ は、特に規定がない限り属性 { [[Enumerable]] : false , [[Configurable]] : true } を持つ。get アクセサ関数のみが記述される場合、set アクセサ関数はデフォルト値 undefined である。set アクセサのみが記述される場合、get アクセサはデフォルト値 undefined である。
19 グローバルオブジェクト
グローバルオブジェクト :
いかなる実行コンテキストへ制御が入る前に作成される。
[[Construct]] 内部メソッドを持たない;new
演算子でコンストラクタ として使用できない。
[[Call]] 内部メソッドを持たない;関数として呼び出せない。
[[Prototype]] 内部スロットを持ち、その値はホスト定義 である。
本仕様で定義されるプロパティに加えてホスト定義 プロパティを持ち得る。これには、その値がグローバルオブジェクト自身であるプロパティを含み得る。
19.1 グローバルオブジェクトの値プロパティ
19.1.1 globalThis
Realm Record realm におけるグローバルオブジェクト の "globalThis" プロパティの初期値は realm .[[GlobalEnv]] .[[GlobalThisValue]] である。
このプロパティは属性 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
19.1.2 Infinity
Infinity
の値は +∞ 𝔽 である (6.1.6.1 参照)。このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
19.1.3 NaN
NaN
の値は NaN である (6.1.6.1 参照)。このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
19.1.4 undefined
undefined
の値は undefined である (6.1.1 参照)。このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
19.2 グローバルオブジェクトの関数プロパティ
19.2.1 eval ( x )
この関数は %eval% 組み込みオブジェクトである。
呼び出されたとき、次の手順を実行する:
? PerformEval (x , false , false ) を返す。
19.2.1.1 PerformEval ( x , strictCaller , direct )
The abstract operation PerformEval takes arguments x (ECMAScript 言語値), strictCaller (Boolean), and direct (Boolean) and returns ECMAScript 言語値を含む通常完了または throw completion . It performs the following steps when called:
Assert : direct が false なら strictCaller も false 。もし x が String でなければ x を返す。 evalRealm を現在の Realm Record とする。注: 直接 eval の場合、evalRealm は eval
呼出元と eval
関数自身の双方のレルムである。 ? HostEnsureCanCompileStrings (evalRealm , « », x , direct ) を実行。 inFunction を false とする。inMethod を false とする。inDerivedConstructor を false とする。inClassFieldInitializer を false とする。もし direct が true ならthisEnvRec を GetThisEnvironment () とする。もし thisEnvRec が Function Environment Record ならF を thisEnvRec .[[FunctionObject]] とする。inFunction を true に設定。inMethod を thisEnvRec .HasSuperBinding() に設定。もし F .[[ConstructorKind]] が derived なら inDerivedConstructor を true に設定。 classFieldInitializerName を F .[[ClassFieldInitializerName]] とする。もし classFieldInitializerName が empty でなければ inClassFieldInitializer を true に設定。 以下のサブステップを実装定義 の順序(構文解析とエラー検出をインタリーブしてもよい)で実行:script を ParseText(x , Script ) とする。もし script がエラーのリストなら SyntaxError 例外を投げる。 もし script Contains ScriptBody が false なら undefined を返す。 body を script の ScriptBody とする。もし inFunction が false かつ body が NewTarget を含むなら SyntaxError を投げる。 もし inMethod が false かつ body が SuperProperty を含むなら SyntaxError を投げる。 もし inDerivedConstructor が false かつ body が SuperCall を含むなら SyntaxError を投げる。 もし inClassFieldInitializer が true かつ body の ContainsArguments が true なら SyntaxError を投げる。 もし strictCaller が true なら strictEval を true とする。 それ以外は strictEval を ScriptIsStrict of script とする。 runningContext を実行中実行コンテキストとする。注: direct が true の場合 runningContext は直接 eval を実行した実行コンテキストである。direct が false の場合 runningContext は eval
呼出の実行コンテキストである。 もし direct が true ならlexEnv を NewDeclarativeEnvironment (runningContext の LexicalEnvironment) とする。varEnv を runningContext の VariableEnvironment とする。privateEnv を runningContext の PrivateEnvironment とする。 それ以外lexEnv を NewDeclarativeEnvironment (evalRealm .[[GlobalEnv]] ) とする。varEnv を evalRealm .[[GlobalEnv]] とする。privateEnv を null とする。 もし strictEval が true なら varEnv を lexEnv に設定。 もし runningContext がまだサスペンドされていなければ runningContext をサスペンド。 evalContext を新 ECMAScript コード実行コンテキスト とする。evalContext .Function を null に設定。evalContext .Realm を evalRealm に設定。evalContext .ScriptOrModule を runningContext .ScriptOrModule に設定。evalContext .VariableEnvironment を varEnv に設定。evalContext .LexicalEnvironment を lexEnv に設定。evalContext .PrivateEnvironment を privateEnv に設定。evalContext を実行コンテキストスタックにプッシュ;evalContext が実行中実行コンテキストとなる。result を Completion (EvalDeclarationInstantiation (body , varEnv , lexEnv , privateEnv , strictEval )) とする。もし result が通常完了ならresult を Completion (Evaluation of body ) に設定。 もし result が通常完了かつ result .[[Value]] が empty ならresult を NormalCompletion (undefined ) に設定。 evalContext をサスペンドし実行コンテキストスタックから除去。スタック最上位のコンテキストを再開。 ? result を返す。
Note
eval コードは、呼び出し側コンテキストまたは eval コードのどちらか一方でも厳格モードコードである場合、呼び出し側の変数環境に変数や関数束縛をインスタンス化できない。代わりに、それら束縛は eval コードからのみアクセス可能な新しい VariableEnvironment にインスタンス化される。let
、const
、class
宣言によって導入される束縛は常に新しい LexicalEnvironment にインスタンス化される。
19.2.1.2 HostEnsureCanCompileStrings ( calleeRealm , parameterStrings , bodyString , direct )
The host-defined abstract operation HostEnsureCanCompileStrings takes arguments calleeRealm (Realm Record ), parameterStrings (文字列リスト), bodyString (文字列), and direct (Boolean) and returns unused を含む通常完了または throw completion . 開発者が文字列を ECMAScript コードとして解釈・評価できる特定の ECMAScript 関数をホスト環境 がブロックすることを可能にする。
parameterStrings は(関数コンストラクタ の一つを使用する際)連結されてパラメータリストを組み立てる文字列群を表す。bodyString は関数本体または eval
呼び出しに渡される文字列を表す。
direct は評価が直接 eval かどうかを示す。
HostEnsureCanCompileStrings のデフォルト実装は NormalCompletion (unused ) を返す。
19.2.1.3 EvalDeclarationInstantiation ( body , varEnv , lexEnv , privateEnv , strict )
The abstract operation EvalDeclarationInstantiation takes arguments body (ScriptBody Parse Node), varEnv (Environment Record ), lexEnv (Declarative Environment Record ), privateEnv (PrivateEnvironment Record または null ), and strict (Boolean) and returns unused を含む通常完了または throw completion . It performs the following steps when called:
varNames を body の VarDeclaredNames とする。varDeclarations を body の VarScopedDeclarations とする。もし strict が false ならもし varEnv が Global Environment Record なら各 name ∈ varNames についてもし HasLexicalDeclaration (varEnv , name ) が true なら SyntaxError 例外を投げる。 注: eval
はグローバル lexical 宣言にシャドーされるグローバル var 宣言を作らない。 thisEnv を lexEnv とする。Assert : 以下のループは終了する。thisEnv と varEnv が同一 Environment Record でない間繰り返すもし thisEnv が Object Environment Record でなければ注: with 文の環境は lexical 宣言を含まないため var/let 衝突検査不要。 各 name ∈ varNames についてもし ! thisEnv .HasBinding(name ) が true ならNormative Optional
ホスト が Web ブラウザまたは Catch ブロック内の VariableStatements をサポートする場合、もし thisEnv が Catch 節の Environment Record でなければ SyntaxError 例外を投げる。 それ以外SyntaxError 例外を投げる。 注: 直接 eval は同名 lexical 宣言を越えて var を巻き上げない。 thisEnv を thisEnv .[[OuterEnv]] に設定。 privateIdentifiers を空リストとする。pointer を privateEnv とする。pointer が null でない間繰り返す各 Private Name binding ∈ pointer .[[Names]] についてもし privateIdentifiers が binding .[[Description]] を含まなければ追加。 pointer を pointer .[[OuterPrivateEnvironment]] に設定。AllPrivateIdentifiersValid of body (引数 privateIdentifiers ) が false なら SyntaxError 例外。 functionsToInitialize を空リストとする。declaredFunctionNames を空リストとする。varDeclarations の各 d を逆順でもし d が VariableDeclaration , ForBinding , BindingIdentifier いずれでもなければAssert : d は FunctionDeclaration , GeneratorDeclaration , AsyncFunctionDeclaration , AsyncGeneratorDeclaration のいずれか。注: 同名関数宣言が複数ある場合、最後が使用される。 fn を d の BoundNames の唯一要素とする。もし declaredFunctionNames が fn を含まなければもし varEnv が Global Environment Record ならfnDefinable を ? CanDeclareGlobalFunction (varEnv , fn ) とする。もし fnDefinable が false なら TypeError 。 fn を declaredFunctionNames に追加。d を functionsToInitialize の先頭に挿入。 declaredVarNames を空リストとする。varDeclarations の各 d についてもし d が VariableDeclaration , ForBinding , BindingIdentifier のいずれかなら各文字列 vn ∈ BoundNames(d ) についてもし declaredFunctionNames が vn を含まなければもし varEnv が Global Environment Record ならvnDefinable を ? CanDeclareGlobalVar (varEnv , vn ) とする。もし vnDefinable が false なら TypeError 。 もし declaredVarNames が vn を含まなければ追加。 Normative Optional
もし strict が false かつホスト が Web ブラウザまたは ブロックレベル Function 宣言 (Web レガシー互換意味論) をサポートするならdeclaredFunctionOrVarNames を declaredFunctionNames と declaredVarNames の連結とする。body Contains x が true となる任意の Block , CaseClause , DefaultClause x の StatementList に直接含まれる各 FunctionDeclaration f についてF を f の BindingIdentifier の StringValue とする。FunctionDeclaration f を BindingIdentifier が F の VariableStatement に置換しても body に早期エラーが生じないならbindingExists を false とする。thisEnv を lexEnv とする。Assert : 以下のループは終了。thisEnv ≠ varEnv の間繰り返すもし thisEnv が Object Environment Record でなければもし ! thisEnv .HasBinding(F ) が true ならNormative Optional
ホスト が Web ブラウザまたは Catch ブロック内の VariableStatements をサポートするならもし thisEnv が Catch 節の Environment Record でなければ bindingExists を true に設定。 それ以外bindingExists を true に設定。 thisEnv を thisEnv .[[OuterEnv]] に設定。もし bindingExists が false かつ varEnv が Global Environment Record ならもし HasLexicalDeclaration (varEnv , F ) が false ならfnDefinable を ? CanDeclareGlobalVar (varEnv , F ) とする。 それ以外fnDefinable を false とする。 それ以外fnDefinable を true とする。 もし bindingExists が false かつ fnDefinable が true ならもし declaredFunctionOrVarNames が F を含まなければもし varEnv が Global Environment Record なら? CreateGlobalVarBinding (varEnv , F , true ) を実行。 それ以外bindingExists を ! varEnv .HasBinding(F ) とする。もし bindingExists が false なら! varEnv .CreateMutableBinding(F , true )。 ! varEnv .InitializeBinding(F , undefined )。 F を declaredFunctionOrVarNames に追加。 FunctionDeclaration f を評価する際、15.2.6 で規定される FunctionDeclaration 評価アルゴリズムの代わりに次を行う:gEnv を実行中実行コンテキストの VariableEnvironment とする。bEnv を実行中実行コンテキストの LexicalEnvironment とする。fObj を ! bEnv .GetBindingValue(F , false ) とする。? gEnv .SetMutableBinding (F , fObj , false ) を実行。 unused を返す。 注: このアルゴリズムステップ以降は、varEnv が Global Environment Record かつグローバルオブジェクト が Proxy exotic でない限り異常終了しない。 lexDeclarations を body の LexicallyScopedDeclarations とする。各 d ∈ lexDeclarations について注: 字句的宣言名はここでインスタンス化されるが初期化されない。 各 dn ∈ BoundNames(d ) についてもし IsConstantDeclaration(d ) が true なら? lexEnv .CreateImmutableBinding(dn , true ) を実行。 それ以外? lexEnv .CreateMutableBinding(dn , false ) を実行。 各 Parse Node f ∈ functionsToInitialize についてfn を BoundNames(f ) の唯一要素とする。fo を InstantiateFunctionObject(f , lexEnv , privateEnv ) とする。もし varEnv が Global Environment Record なら? CreateGlobalFunctionBinding (varEnv , fn , fo , true ) を実行。 それ以外bindingExists を ! varEnv .HasBinding(fn ) とする。もし bindingExists が false なら注: 前段階の検証により以下は異常終了を返さない。 ! varEnv .CreateMutableBinding(fn , true )。 ! varEnv .InitializeBinding(fn , fo )。 それ以外! varEnv .SetMutableBinding(fn , fo , false )。 各文字列 vn ∈ declaredVarNames についてもし varEnv が Global Environment Record なら? CreateGlobalVarBinding (varEnv , vn , true ) を実行。 それ以外bindingExists を ! varEnv .HasBinding(vn ) とする。もし bindingExists が false なら注: 前段階の検証により以下は異常終了しない。 ! varEnv .CreateMutableBinding(vn , true )。 ! varEnv .InitializeBinding(vn , undefined )。 unused を返す。
19.2.2 isFinite ( number )
この関数は %isFinite% 組み込みオブジェクトである。
呼び出されたとき次を実行:
num を ? ToNumber (number ) とする。もし num が有限 でなければ false を返す。 それ以外 true を返す。
19.2.3 isNaN ( number )
この関数は %isNaN% 組み込みオブジェクトである。
呼び出されたとき次を実行:
num を ? ToNumber (number ) とする。もし num が NaN なら true を返す。 それ以外 false を返す。
Note
値 X
が NaN かどうかを ECMAScript コードで信頼性高く判定する方法は、X !== X
という形式の式である。結果は X
が NaN のときかつそのときのみ true となる。
19.2.4 parseFloat ( string )
この関数は string 引数の内容を 10 進リテラルとして解釈した結果により Number 値を生成する。
これは %parseFloat% 組み込みオブジェクトである。
呼び出されたとき次を実行:
inputString を ? ToString (string ) とする。trimmedString を ! TrimString (inputString , start ) とする。trimmed を StringToCodePoints(trimmedString ) とする。trimmedPrefix を StrDecimalLiteral の構文を満たす最長接頭辞(trimmed 自身の場合もある)とする。存在しなければ NaN を返す。parsedNumber を ParseText(trimmedPrefix , StrDecimalLiteral ) とする。Assert : parsedNumber は Parse Node。parsedNumber の StringNumericValue を返す。
Note
この関数は string の先頭部分のみを Number 値として解釈する場合がある;10 進リテラル記法の一部として解釈できないコード単位は無視され、それらが無視されたことは通知されない。
19.2.5 parseInt ( string , radix )
この関数は指定された radix に従って string の内容を解釈した結果により整数 Number を生成する。string 先頭の空白は無視される。radix が 0 に強制変換される(undefined など)場合、数表現が "0x" または "0X" で始まる場合を除き 10 とみなす。その場合は 16 とみなす。radix が 16 の場合、数表現は任意で "0x" または "0X" で始まり得る。
これは %parseInt% 組み込みオブジェクトである。
呼び出されたとき次を実行:
inputString を ? ToString (string ) とする。S を ! TrimString (inputString , start ) とする。sign を 1 とする。もし S が空でなく先頭コード単位が 0x002D (HYPHEN-MINUS) なら sign を -1 に設定。 もし S が空でなく先頭コード単位が 0x002B (PLUS SIGN) または 0x002D (HYPHEN-MINUS) なら S を先頭 1 文字除去後の部分文字列 に設定。 R を ℝ (? ToInt32 (radix )) とする。stripPrefix を true とする。もし R ≠ 0 ならもし R < 2 または R > 36 なら NaN を返す。 もし R ≠ 16 なら stripPrefix を false に設定。 それ以外R を 10 に設定。 もし stripPrefix が true ならもし S の長さが少なくとも 2 で先頭 2 コード単位が "0x" または "0X" ならS をインデックス 2 以降の部分文字列 に設定。R を 16 に設定。 もし S が radix-R の数字でないコード単位を含むなら end をその最初の位置、そうでなければ end を S の長さとする。 Z を S の 0 から end までの部分文字列 とする。もし Z が空なら NaN を返す。 mathInt を Z が radix-R 表記で表す整数 値とする(10〜35 に値を持つ数字には大文字 A 〜Z および小文字 a 〜z を使用)。(ただし R =10 で Z が 20 を超える有効桁を含む場合、20 桁目以降の各有効桁は実装選択で 0 に置き換えてよく、かつ R が 2,4,8,10,16,32 のいずれでもない場合、mathInt は Z の値を表す実装近似 整数 でよい。)もし mathInt = 0 ならもし sign = -1 なら -0 𝔽 を返す。 +0 𝔽 を返す。 𝔽 (sign × mathInt ) を返す。
Note
この関数は string の先頭部分のみを整数 値として解釈する場合がある;整数 表記の一部と解釈できないコード単位は無視され、それらが無視されたことは通知されない。
19.2.6 URI 取扱関数
Uniform Resource Identifier (URI) は(ウェブページやファイル等の)リソースや、それへアクセスするための転送プロトコル(HTTP や FTP など)をインターネット上で識別する文字列である。ECMAScript 言語自体は、本節で説明されるように URI をエンコードおよびデコードする関数を除き URI 使用のためのサポートを提供しない。encodeURI
と decodeURI
は完全な URI を扱うことを意図し、予約文字は特別な意味(区切りなど)を持つことを前提としてエンコードしない。encodeURIComponent
と decodeURIComponent
は 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% 組み込みオブジェクトである。
呼び出されたとき次を実行:
uriString を ? ToString (encodedURI ) とする。preserveEscapeSet を ";/?:@&=+$,#" とする。? Decode (uriString , preserveEscapeSet ) を返す。
19.2.6.2 decodeURIComponent ( encodedURIComponent )
この関数は、encodeURIComponent
によって導入された可能性がある各エスケープシーケンスおよび UTF-8 エンコーディングを、その表すコードポイントの UTF-16 エンコーディングへ置換した新しいバージョンの URI を計算する。
これは %decodeURIComponent% 組み込みオブジェクトである。
呼び出されたとき次を実行:
componentString を ? ToString (encodedURIComponent ) とする。preserveEscapeSet を空文字列とする。? Decode (componentString , preserveEscapeSet ) を返す。
19.2.6.3 encodeURI ( uri )
この関数は、UTF-16 エンコード (6.1.4 ) された URI の新しいバージョンを計算し、特定コードポイントの各出現を、そのコードポイントの UTF-8 エンコーディングを表す 1〜4 個のエスケープシーケンスへ置換する。
これは %encodeURI% 組み込みオブジェクトである。
呼び出されたとき次を実行:
uriString を ? ToString (uri ) とする。extraUnescaped を ";/?:@&=+$,#" とする。? Encode (uriString , extraUnescaped ) を返す。
19.2.6.4 encodeURIComponent ( uriComponent )
この関数は、UTF-16 エンコード (6.1.4 ) された URI 構成要素の新しいバージョンを計算し、特定コードポイントの各出現を、そのコードポイントの UTF-8 エンコーディングを表す 1〜4 個のエスケープシーケンスへ置換する。
これは %encodeURIComponent% 組み込みオブジェクトである。
呼び出されたとき次を実行:
componentString を ? ToString (uriComponent ) とする。extraUnescaped を空文字列とする。? Encode (componentString , extraUnescaped ) を返す。
19.2.6.5 Encode ( string , extraUnescaped )
The abstract operation Encode takes arguments string (文字列) and extraUnescaped (文字列) and returns 文字列を含む通常完了または throw completion . string を 6.1.4 に記述される UTF-16 エンコードされたコードポイント列とみなし URI エンコードとエスケープを行う。文字が RFC 2396 で非予約 (unreserved) と識別されるか extraUnescaped に現れる場合はエスケープされない。 It performs the following steps when called:
len を string の長さとする。R を空文字列とする。alwaysUnescaped を ASCII 単語文字列と "-.!~*'()" の連結とする。unescapedSet を alwaysUnescaped と extraUnescaped の連結とする。k を 0 とする。k < len の間繰り返すC を string のインデックス k のコード単位とする。もし unescapedSet が C を含むならk を k + 1 に。R を R と C の連結に。 それ以外cp を CodePointAt(string , k ) とする。もし cp .[[IsUnpairedSurrogate]] が true なら URIError 例外。 k を k + cp .[[CodeUnitCount]] に。Octets を cp .[[CodePoint]] に UTF-8 変換を適用して得るオクテット列とする。各 octet ∈ Octets についてhex を octet の 16 進大文字表現文字列とする。R を R 、"%" 、StringPad (hex , 2, "0" , start ) の連結に。 R を返す。
Note
パーセントエンコーディングは個々のオクテットを表すため、単一のコードポイントが複数連続エスケープシーケンス(その UTF-8 コードユニット毎に 1 つ)で表現され得る。
19.2.6.6 Decode ( string , preserveEscapeSet )
The abstract operation Decode takes arguments string (文字列) and preserveEscapeSet (文字列) and returns 文字列を含む通常完了または throw completion . preserveEscapeSet 内の Basic Latin 文字に対応するエスケープシーケンスを保持しつつ URI のアンエスケープとデコードを行う。 It performs the following steps when called:
len を string の長さとする。R を空文字列とする。k を 0 とする。k < len の間繰り返すC を string のインデックス k のコード単位とする。S を C とする。もし C がコード単位 0x0025 (PERCENT SIGN) ならもし k + 3 > len なら URIError 例外。 escape を string の k から k + 3 までの部分文字列 とする。B を ParseHexOctet (string , k + 1) とする。もし B が整数 でなければ URIError 例外。 k を k + 2 に。n を B の先頭連続 1 ビット数とする。もし n = 0 ならasciiChar を数値が B のコード単位とする。もし preserveEscapeSet が asciiChar を含むなら S を escape に、そうでなければ S を asciiChar に設定。 それ以外もし n = 1 または n > 4 なら URIError 例外。 Octets を « B » とする。j を 1 とする。j < n の間繰り返すk を k + 1 に。もし k + 3 > len なら URIError 例外。 もし string のインデックス k のコード単位が 0x0025 でなければ URIError 例外。 continuationByte を ParseHexOctet (string , k + 1) とする。もし continuationByte が整数 でなければ URIError 例外。 continuationByte を Octets に追加。k を k + 2 に。j を j + 1 に。Assert : Octets の長さは n 。もし Octets が Unicode コードポイントの有効な UTF-8 エンコーディングを含まなければ URIError 例外。 V を Octets に UTF-8 変換を適用して得るコードポイント(オクテット列から 21 ビット値)とする。S を UTF16EncodeCodePoint(V ) に設定。 R を R と S の連結に。k を k + 1 に。R を返す。
Note
RFC 3629 は無効な UTF-8 オクテットシーケンスのデコードを禁止する。例えば無効なシーケンス 0xC0 0x80 はコード単位 0x0000 にデコードされてはならない。Decode アルゴリズムの実装は、そのような無効シーケンスに遭遇した際 URIError を投げる必要がある。
19.2.6.7 ParseHexOctet ( string , position )
The abstract operation ParseHexOctet takes arguments string (文字列) and position (非負整数 ) and returns 非負整数 または SyntaxError オブジェクトの空でないリスト. string の指定 position にある 2 つの 16 進文字を符号なし 8 ビット整数 にパースする。 It performs the following steps when called:
len を string の長さとする。Assert : position + 2 ≤ len 。hexDigits を string の position から position + 2 までの部分文字列 とする。parseResult を ParseText(hexDigits , HexDigits [~Sep] ) とする。もし parseResult が Parse Node でなければ parseResult を返す。 n を parseResult の MV とする。Assert : n は 0 から 255 の閉区間 内。n を返す。
19.3 グローバルオブジェクトのコンストラクタプロパティ
19.3.1 AggregateError ( . . . )
20.5.7.1 を参照。
19.3.2 Array ( . . . )
23.1.1 を参照。
19.3.3 ArrayBuffer ( . . . )
25.1.4 を参照。
19.3.4 BigInt ( . . . )
21.2.1 を参照。
19.3.5 BigInt64Array ( . . . )
23.2.5 を参照。
19.3.6 BigUint64Array ( . . . )
23.2.5 を参照。
19.3.7 Boolean ( . . . )
20.3.1 を参照。
19.3.8 DataView ( . . . )
25.3.2 を参照。
19.3.9 Date ( . . . )
21.4.2 を参照。
19.3.10 Error ( . . . )
20.5.1 を参照。
19.3.11 EvalError ( . . . )
20.5.5.1 を参照。
19.3.12 FinalizationRegistry ( . . . )
26.2.1 を参照。
19.3.13 Float16Array ( . . . )
23.2.5 を参照。
19.3.14 Float32Array ( . . . )
23.2.5 を参照。
19.3.15 Float64Array ( . . . )
23.2.5 を参照。
19.3.16 Function ( . . . )
20.2.1 を参照。
19.3.17 Int8Array ( . . . )
23.2.5 を参照。
19.3.18 Int16Array ( . . . )
23.2.5 を参照。
19.3.19 Int32Array ( . . . )
23.2.5 を参照。
19.3.20 Iterator ( . . . )
27.1.3.1 を参照。
19.3.21 Map ( . . . )
24.1.1 を参照。
19.3.22 Number ( . . . )
21.1.1 を参照。
19.3.23 Object ( . . . )
20.1.1 を参照。
19.3.24 Promise ( . . . )
27.2.3 を参照。
19.3.25 Proxy ( . . . )
28.2.1 を参照。
19.3.26 RangeError ( . . . )
20.5.5.2 を参照。
19.3.27 ReferenceError ( . . . )
20.5.5.3 を参照。
19.3.28 RegExp ( . . . )
22.2.4 を参照。
19.3.29 Set ( . . . )
24.2.2 を参照。
19.3.30 SharedArrayBuffer ( . . . )
25.2.3 を参照。
19.3.31 String ( . . . )
22.1.1 を参照。
19.3.32 Symbol ( . . . )
20.4.1 を参照。
19.3.33 SyntaxError ( . . . )
20.5.5.4 を参照。
19.3.34 TypeError ( . . . )
20.5.5.5 を参照。
19.3.35 Uint8Array ( . . . )
23.2.5 を参照。
19.3.36 Uint8ClampedArray ( . . . )
23.2.5 を参照。
19.3.37 Uint16Array ( . . . )
23.2.5 を参照。
19.3.38 Uint32Array ( . . . )
23.2.5 を参照。
19.3.39 URIError ( . . . )
20.5.5.6 を参照。
19.3.40 WeakMap ( . . . )
24.3.1 を参照。
19.3.41 WeakRef ( . . . )
26.1.1 を参照。
19.3.42 WeakSet ( . . . )
24.4 を参照。
19.4 グローバルオブジェクトのその他のプロパティ
19.4.1 Atomics
25.4 を参照。
19.4.2 JSON
25.5 を参照。
19.4.3 Math
21.3 を参照。
19.4.4 Reflect
28.1 を参照。
20 基礎オブジェクト (Fundamental Objects)
20.1 Object オブジェクト
20.1.1 Object コンストラクタ
Object コンストラクタ :
20.1.1.1 Object ( [ value ] )
この関数は呼び出されたとき次の手順を行う:
NewTarget が undefined でもアクティブな関数オブジェクト でもないなら? OrdinaryCreateFromConstructor (NewTarget, "%Object.prototype%" ) を返す。 value が undefined または null なら OrdinaryObjectCreate (%Object.prototype% ) を返す。! ToObject (value ) を返す。
20.1.2 Object コンストラクタのプロパティ
Object コンストラクタ :
20.1.2.1 Object.assign ( target , ...sources )
この関数は 1 つ以上のソースオブジェクトの列挙可能な自身のプロパティ(値)を target オブジェクトへコピーする。
呼び出されたとき次を行う:
to を ? ToObject (target ) とする。引数が 1 個だけなら to を返す。 sources の各要素 nextSource についてnextSource が undefined でも null でもなければfrom を ! ToObject (nextSource ) とする。keys を ? from .[[OwnPropertyKeys]] () とする。keys の各 nextKey についてdesc を ? from .[[GetOwnProperty]] (nextKey ) とする。desc が undefined でなく desc .[[Enumerable]] が true ならpropValue を ? Get (from , nextKey ) とする。? Set (to , nextKey , propValue , true ) を実行。 to を返す。
この関数の "length" プロパティは 2 𝔽 。
20.1.2.2 Object.create ( O , Properties )
この関数は指定されたプロトタイプを持つ新しいオブジェクトを生成する。
呼び出されたとき次を行う:
O が Object でなく かつ null でもないなら TypeError 例外を投げる。obj を OrdinaryObjectCreate (O ) とする。Properties が undefined でなければ? ObjectDefineProperties (obj , Properties ) を返す。 obj を返す。
20.1.2.3 Object.defineProperties ( O , Properties )
この関数はオブジェクトに自身のプロパティを追加し/または既存自身プロパティの属性を更新する。
呼び出されたとき次を行う:
O が Object でなければ TypeError 例外。? ObjectDefineProperties (O , Properties ) を返す。
20.1.2.3.1 ObjectDefineProperties ( O , Properties )
The abstract operation ObjectDefineProperties takes arguments O (Object) and Properties (ECMAScript 言語値) and returns オブジェクトを含む通常完了または throw completion . It performs the following steps when called:
props を ? ToObject (Properties ) とする。keys を ? props .[[OwnPropertyKeys]] () とする。descriptors を空リストとする。keys の各 nextKey についてpropDesc を ? props .[[GetOwnProperty]] (nextKey ) とする。propDesc が undefined でなく propDesc .[[Enumerable]] が true ならdescObj を ? Get (props , nextKey ) とする。desc を ? ToPropertyDescriptor (descObj ) とする。Record { [[Key]] : nextKey , [[Descriptor]] : desc } を descriptors に追加。descriptors の各 property について? DefinePropertyOrThrow (O , property .[[Key]] , property .[[Descriptor]] ) を実行。 O を返す。
20.1.2.4 Object.defineProperty ( O , P , Attributes )
この関数は自身のプロパティを追加し/または既存自身プロパティの属性を更新する。
呼び出されたとき次を行う:
O が Object でなければ TypeError 。key を ? ToPropertyKey (P ) とする。desc を ? ToPropertyDescriptor (Attributes ) とする。? DefinePropertyOrThrow (O , key , desc )。 O を返す。
20.1.2.5 Object.entries ( O )
この関数は呼び出されたとき次を行う:
obj を ? ToObject (O ) とする。entryList を ? EnumerableOwnProperties (obj , key+value ) とする。CreateArrayFromList (entryList ) を返す。
20.1.2.6 Object.freeze ( O )
この関数は呼び出されたとき次を行う:
O が Object でなければ O を返す。status を ? SetIntegrityLevel (O , frozen ) とする。status が false なら TypeError 。O を返す。
20.1.2.7 Object.fromEntries ( iterable )
この関数は呼び出されたとき次を行う:
? RequireObjectCoercible (iterable ) を実行。 obj を OrdinaryObjectCreate (%Object.prototype% ) とする。Assert : obj は拡張可能な通常オブジェクト で自身プロパティを持たない。closure を引数 (key , value ) を取り obj を捕捉し次を行う新しい Abstract Closure とする:propertyKey を ? ToPropertyKey (key ) とする。! CreateDataPropertyOrThrow (obj , propertyKey , value )。 NormalCompletion (undefined ) を返す。adder を CreateBuiltinFunction (closure , 2, "" , « ») とする。? AddEntriesFromIterable (obj , iterable , adder ) を返す。
Note
adder 向けに生成された関数は ECMAScript コードから直接はアクセスできない。
20.1.2.8 Object.getOwnPropertyDescriptor ( O , P )
この関数は呼び出されたとき次を行う:
obj を ? ToObject (O ) とする。key を ? ToPropertyKey (P ) とする。desc を ? obj .[[GetOwnProperty]] (key ) とする。FromPropertyDescriptor (desc ) を返す。
20.1.2.9 Object.getOwnPropertyDescriptors ( O )
この関数は呼び出されたとき次を行う:
obj を ? ToObject (O ) とする。ownKeys を ? obj .[[OwnPropertyKeys]] () とする。descriptors を OrdinaryObjectCreate (%Object.prototype% ) とする。ownKeys の各 key についてdesc を ? obj .[[GetOwnProperty]] (key ) とする。descriptor を FromPropertyDescriptor (desc ) とする。descriptor が undefined でなければ ! CreateDataPropertyOrThrow (descriptors , key , descriptor )。descriptors を返す。
20.1.2.10 Object.getOwnPropertyNames ( O )
この関数は呼び出されたとき次を行う:
CreateArrayFromList (? GetOwnPropertyKeys (O , string )) を返す。
20.1.2.11 Object.getOwnPropertySymbols ( O )
この関数は呼び出されたとき次を行う:
CreateArrayFromList (? GetOwnPropertyKeys (O , symbol )) を返す。
20.1.2.11.1 GetOwnPropertyKeys ( O , type )
The abstract operation GetOwnPropertyKeys takes arguments O (ECMAScript 言語値) and type (string または symbol ) and returns プロパティキー リストを含む通常完了または throw completion . It performs the following steps when called:
obj を ? ToObject (O ) とする。keys を ? obj .[[OwnPropertyKeys]] () とする。nameList を空リストとする。keys の各 nextKey についてnextKey が Symbol で type が symbol の場合、または nextKey が String で type が string の場合nextKey を nameList に追加。nameList を返す。
20.1.2.12 Object.getPrototypeOf ( O )
この関数は呼び出されたとき次を行う:
obj を ? ToObject (O ) とする。? obj .[[GetPrototypeOf]] () を返す。
20.1.2.13 Object.groupBy ( items , callback )
Note
callback は 2 引数を受け取る関数であるべき。groupBy
は items の各要素に昇順で 1 回ずつ callback を呼び出し新しいオブジェクトを構築する。callback から返された各値はプロパティキー に変換され、そのキーごとに結果オブジェクトはキーをそのキーに変換された値を持つ要素すべての配列に対応付ける。
callback は (要素の値, そのインデックス) の 2 引数で呼ばれる。
groupBy
の返す値は %Object.prototype% を継承しないオブジェクト。
呼び出されたとき次を行う:
groups を ? GroupBy (items , callback , property ) とする。obj を OrdinaryObjectCreate (null ) とする。各 Record { [[Key]] , [[Elements]] } g ∈ groups についてelements を CreateArrayFromList (g .[[Elements]] ) とする。! CreateDataPropertyOrThrow (obj , g .[[Key]] , elements )。 obj を返す。
20.1.2.14 Object.hasOwn ( O , P )
この関数は呼び出されたとき次を行う:
obj を ? ToObject (O ) とする。key を ? ToPropertyKey (P ) とする。? HasOwnProperty (obj , key ) を返す。
20.1.2.15 Object.is ( value1 , value2 )
この関数は呼び出されたとき次を行う:
SameValue (value1 , value2 ) を返す。
20.1.2.16 Object.isExtensible ( O )
この関数は呼び出されたとき次を行う:
O が Object でなければ false を返す。? IsExtensible (O ) を返す。
20.1.2.17 Object.isFrozen ( O )
この関数は呼び出されたとき次を行う:
O が Object でなければ true を返す。? TestIntegrityLevel (O , frozen ) を返す。
20.1.2.18 Object.isSealed ( O )
この関数は呼び出されたとき次を行う:
O が Object でなければ true を返す。? TestIntegrityLevel (O , sealed ) を返す。
20.1.2.19 Object.keys ( O )
この関数は呼び出されたとき次を行う:
obj を ? ToObject (O ) とする。keyList を ? EnumerableOwnProperties (obj , key ) とする。CreateArrayFromList (keyList ) を返す。
20.1.2.20 Object.preventExtensions ( O )
この関数は呼び出されたとき次を行う:
O が Object でなければ O を返す。status を ? O .[[PreventExtensions]] () とする。status が false なら TypeError 。O を返す。
20.1.2.21 Object.prototype
Object.prototype
の初期値は Object プロトタイプオブジェクト である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
20.1.2.22 Object.seal ( O )
この関数は呼び出されたとき次を行う:
O が Object でなければ O を返す。status を ? SetIntegrityLevel (O , sealed ) とする。status が false なら TypeError 。O を返す。
20.1.2.23 Object.setPrototypeOf ( O , proto )
この関数は呼び出されたとき次を行う:
? RequireObjectCoercible (O ) を実行。 proto が Object でなく かつ null でもないなら TypeError 。O が Object でなければ O を返す。status を ? O .[[SetPrototypeOf]] (proto ) とする。status が false なら TypeError 。O を返す。
20.1.2.24 Object.values ( O )
この関数は呼び出されたとき次を行う:
obj を ? ToObject (O ) とする。valueList を ? EnumerableOwnProperties (obj , value ) とする。CreateArrayFromList (valueList ) を返す。
20.1.3 Object プロトタイプオブジェクトのプロパティ
Object プロトタイプオブジェクト は次を満たす:
%Object.prototype% である。
値 true の [[Extensible]] 内部スロットを持つ。
通常オブジェクト に定義された内部メソッドを持つ(ただし [[SetPrototypeOf]] は 10.4.7.1 で定義されたもの)。(すなわち不変プロトタイプエキゾチックオブジェクト 。)
値 null の [[Prototype]] 内部スロットを持つ。
20.1.3.1 Object.prototype.constructor
Object.prototype.constructor
の初期値は %Object% である。
20.1.3.2 Object.prototype.hasOwnProperty ( V )
このメソッドは呼び出されたとき次を行う:
P を ? ToPropertyKey (V ) とする。O を ? ToObject (this value) とする。? HasOwnProperty (O , P ) を返す。
Note
手順 1 と 2 の順序は、以前の版で最初の手順が投げていた可能性のある例外を this が undefined / null の場合でも維持するために選ばれている。
20.1.3.3 Object.prototype.isPrototypeOf ( V )
このメソッドは呼び出されたとき次を行う:
V が Object でなければ false を返す。O を ? ToObject (this value) とする。繰り返し:V を ? V .[[GetPrototypeOf]] () に設定。V が null なら false を返す。SameValue (O , V ) が true なら true を返す。
Note
手順順序は前版との互換性(V がオブジェクトでない場合の挙動)を保つ。
20.1.3.4 Object.prototype.propertyIsEnumerable ( V )
このメソッドは呼び出されたとき次を行う:
P を ? ToPropertyKey (V ) とする。O を ? ToObject (this value) とする。desc を ? O .[[GetOwnProperty]] (P ) とする。desc が undefined なら false 。desc .[[Enumerable]] を返す。
Note 1
このメソッドはプロトタイプチェーン上のオブジェクトを考慮しない。
Note 2
20.1.3.5 Object.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
このメソッドは呼び出されたとき次を行う:
O を this 値とする。? Invoke(O , "toString" ) を返す。
オプション引数は使用されないが ECMA-402 の toLocaleString
形式と整合させるために予約される。ECMA-402 を実装しない実装は他目的に使ってはならない。
Note 1
ロケール依存の toString
を持たないオブジェクト用の汎用実装。Array
, Number
, Date
, %TypedArray% は固有実装を持つ。
Note 2
ECMA-402 はこのデフォルト実装の代替を意図的に提供しない。
20.1.3.6 Object.prototype.toString ( )
このメソッドは呼び出されたとき次を行う:
this 値が undefined なら "[object Undefined]" を返す。this 値が null なら "[object Null]" を返す。O を ! ToObject (this value) とする。isArray を ? IsArray (O ) とする。isArray が true なら builtinTag を "Array" 。Else O が [[ParameterMap]] 内部スロットを持つなら builtinTag = "Arguments" 。 Else O が [[Call]] 内部メソッドを持つなら builtinTag = "Function" 。 Else O が [[ErrorData]] 内部スロットを持つなら builtinTag = "Error" 。 Else O が [[BooleanData]] 内部スロットを持つなら "Boolean" 。 Else O が [[NumberData]] 内部スロットを持つなら "Number" 。 Else O が [[StringData]] 内部スロットを持つなら "String" 。 Else O が [[DateValue]] 内部スロットを持つなら "Date" 。 Else O が [[RegExpMatcher]] 内部スロットを持つなら "RegExp" 。 Else builtinTag = "Object" 。 tag を ? Get (O , %Symbol.toStringTag% ) とする。tag が String でなければ tag = builtinTag 。"[object " と tag と "]" の連結を返す。
Note
歴史的にこのメソッドは [[Class]] 内部スロットの文字列表現取得に使われた。定義は互換性保持のためであり汎用型判定手段ではない。%Symbol.toStringTag% の利用で信頼性が損なわれ得る。
20.1.3.7 Object.prototype.valueOf ( )
このメソッドは呼び出されたとき次を行う:
? ToObject (this value) を返す。
Normative Optional, Legacy
20.1.3.8 Object.prototype.__proto__
Object.prototype.__proto__
は属性 { [[Enumerable]] : false , [[Configurable]] : true } のアクセサプロパティ で、[[Get]] / [[Set]] は以下:
20.1.3.8.1 get Object.prototype.__proto__
引数不要の組み込み関数。呼び出し時:
O を ? ToObject (this value) とする。? O .[[GetPrototypeOf]] () を返す。
20.1.3.8.2 set Object.prototype.__proto__
引数 proto を取る組み込み関数。呼び出し時:
O を this 値とする。? RequireObjectCoercible (O )。 proto が Object でなく null でもなければ undefined を返す。O が Object でなければ undefined を返す。status を ? O .[[SetPrototypeOf]] (proto ) とする。status が false なら TypeError 。undefined を返す。
Normative Optional, Legacy
20.1.3.9 レガシー Object.prototype アクセサメソッド
20.1.3.9.1 Object.prototype.__defineGetter__ ( P , getter )
呼び出し手順:
O を ? ToObject (this value) とする。IsCallable (getter ) が false なら TypeError 。desc を PropertyDescriptor { [[Get]] : getter , [[Enumerable]] : true , [[Configurable]] : true } とする。key を ? ToPropertyKey (P ) とする。? DefinePropertyOrThrow (O , key , desc )。 undefined を返す。
20.1.3.9.2 Object.prototype.__defineSetter__ ( P , setter )
呼び出し手順:
O を ? ToObject (this value) とする。IsCallable (setter ) が false なら TypeError 。desc を PropertyDescriptor { [[Set]] : setter , [[Enumerable]] : true , [[Configurable]] : true } とする。key を ? ToPropertyKey (P ) とする。? DefinePropertyOrThrow (O , key , desc )。 undefined を返す。
20.1.3.9.3 Object.prototype.__lookupGetter__ ( P )
呼び出し手順:
O を ? ToObject (this value) とする。key を ? ToPropertyKey (P ) とする。繰り返し:desc を ? O .[[GetOwnProperty]] (key ) とする。desc が undefined でなければIsAccessorDescriptor (desc ) が true なら desc .[[Get]] を返す。undefined を返す。O を ? O .[[GetPrototypeOf]] () とする。O が null なら undefined を返す。
20.1.3.9.4 Object.prototype.__lookupSetter__ ( P )
呼び出し手順:
O を ? ToObject (this value)。key を ? ToPropertyKey (P )。繰り返し:desc を ? O .[[GetOwnProperty]] (key )。desc が undefined でなければIsAccessorDescriptor (desc ) が true なら desc .[[Set]] を返す。undefined を返す。O を ? O .[[GetPrototypeOf]] () 。O が null なら undefined を返す。
20.1.4 Object インスタンスのプロパティ
Object インスタンスは Object プロトタイプオブジェクト から継承するもの以外の特別なプロパティを持たない。
20.2 Function オブジェクト
20.2.1 Function コンストラクタ
Function コンストラクタ :
%Function% である。
グローバルオブジェクト の "Function" プロパティの初期値である。
コンストラクタ でなく関数として呼び出されたとき新しい関数オブジェクト を生成し初期化する。すなわち Function(…)
は同じ引数での new Function(…)
と等価。
クラス定義の extends
節値として使用できる。指定の Function 挙動を継承するサブクラスコンストラクタ は内部スロットを持つインスタンス生成と初期化のため super
呼び出しが必要。ECMAScript の全ての構文的関数定義形式は Function のインスタンスを生成し、組み込み GeneratorFunction / AsyncFunction / AsyncGeneratorFunction のサブクラス以外にサブクラスインスタンスを生成する構文はない。
20.2.1.1 Function ( ...parameterArgs , bodyArg )
最後の引数(存在すれば)が関数本体(実行コード)を指定し、それ以前は仮引数を指定する。
呼び出し手順:
C をアクティブな関数オブジェクト とする。bodyArg が与えられなければ空文字列に設定。? CreateDynamicFunction (C , NewTarget, normal , parameterArgs , bodyArg ) を返す。
Note
各仮引数に個別の引数を与える必要はない。以下 3 例は同じ結果:
new Function ("a" , "b" , "c" , "return a+b+c" )
new Function ("a, b, c" , "return a+b+c" )
new Function ("a,b" , "c" , "return a+b+c" )
20.2.1.1.1 CreateDynamicFunction ( constructor , newTarget , kind , parameterArgs , bodyArg )
The abstract operation CreateDynamicFunction takes arguments constructor (コンストラクタ ), newTarget (コンストラクタ または undefined ), kind (normal , generator , async , async-generator ), parameterArgs (ECMAScript 言語値リスト), and bodyArg (ECMAScript 言語値) and returns 関数オブジェクト を含む通常完了または throw completion . constructor はこの操作を実行中のコンストラクタ 。newTarget は最初に new
が適用されたコンストラクタ 。parameterArgs , bodyArg は constructor に渡された引数値。 It performs the following steps when called:
newTarget が undefined なら newTarget = constructor 。kind が normal ならprefix = "function" 。exprSym = FunctionExpression 。bodySym = FunctionBody [~Yield, ~Await] 。parameterSym = FormalParameters [~Yield, ~Await] 。fallbackProto = "%Function.prototype%" 。Else if kind = generator prefix = "function*" 。exprSym = GeneratorExpression 。bodySym = GeneratorBody 。parameterSym = FormalParameters [+Yield, ~Await] 。fallbackProto = "%GeneratorFunction.prototype%" 。 Else if kind = async prefix = "async function" 。exprSym = AsyncFunctionExpression 。bodySym = AsyncFunctionBody 。parameterSym = FormalParameters [~Yield, +Await] 。fallbackProto = "%AsyncFunction.prototype%" 。 ElseAssert : kind = async-generator 。prefix = "async function*" 。exprSym = AsyncGeneratorExpression 。bodySym = AsyncGeneratorBody 。parameterSym = FormalParameters [+Yield, +Await] 。fallbackProto = "%AsyncGeneratorFunction.prototype%" 。 argCount を parameterArgs の要素数とする。parameterStrings を空リストとする。parameterArgs の各 arg について? ToString (arg ) を parameterStrings に追加。 bodyString を ? ToString (bodyArg ) とする。currentRealm を現在の Realm Record とする。? HostEnsureCanCompileStrings (currentRealm , parameterStrings , bodyString , false )。 P を空文字列とする。argCount > 0 ならP = parameterStrings [0]。k = 1。k < argCount の間nextArgString = parameterStrings [k ]。P を (P + "," + nextArgString ) に。k = k + 1。bodyParseString を LF, bodyString , LF の連結とする。sourceString を prefix , " anonymous(" , P , LF, ") {" , bodyParseString , "}" の連結とする。sourceText = StringToCodePoints(sourceString )。parameters = ParseText(P , parameterSym )。parameters がエラーリストなら SyntaxError 。body = ParseText(bodyParseString , bodySym )。body がエラーリストなら SyntaxError 。(注)パラメータと本体を個別にパースすることでそれぞれ単独でも妥当性を保証。 (注)ここに到達したら sourceText は exprSym の構文を満たすはず。次の 2 手順で Early Error を適用。 expr = ParseText(sourceText , exprSym )。expr がエラーリストなら SyntaxError 。proto を ? GetPrototypeFromConstructor (newTarget , fallbackProto ) とする。env を currentRealm .[[GlobalEnv]] 。privateEnv = null 。F = OrdinaryFunctionCreate (proto , sourceText , parameters , body , non-lexical-this , env , privateEnv )。SetFunctionName (F , "anonymous" )。kind = generator ならprototype = OrdinaryObjectCreate (%GeneratorPrototype% )。! DefinePropertyOrThrow (F , "prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false })。 Else if kind = async-generator prototype = OrdinaryObjectCreate (%AsyncGeneratorPrototype% )。! DefinePropertyOrThrow (F , "prototype" , PropertyDescriptor { [[Value]] : prototype , [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false })。 Else if kind = normal MakeConstructor (F ) を実行。 (注)kind = async の関数は構築不能で "prototype" を持たない。 F を返す。
Note
CreateDynamicFunction は kind が async でない関数に "prototype" プロパティを付与しコンストラクタ として利用され得るようにする。
20.2.2 Function コンストラクタのプロパティ
Function コンストラクタ :
20.2.2.1 Function.prototype
Function.prototype
の値は Function プロトタイプオブジェクト 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.2.3 Function プロトタイプオブジェクトのプロパティ
Function プロトタイプオブジェクト :
%Function.prototype% である。
自身が組み込み関数オブジェクト 。
任意の引数を受け取り undefined を返す。
[[Construct]] 内部メソッドを持たず new
でコンストラクタ 使用不可。
[[Prototype]] 内部スロットは %Object.prototype% 。
"prototype" プロパティを持たない。
"length" プロパティ値は +0 𝔽 。
"name" プロパティ値は空文字列。
Note
20.2.3.1 Function.prototype.apply ( thisArg , argArray )
呼び出し手順:
func を this 値とする。IsCallable (func ) が false なら TypeError 。argArray が undefined または null ならPrepareForTailCall () を実行。? Call(func , thisArg ) を返す。 argList を ? CreateListFromArrayLike(argArray ) とする。PrepareForTailCall ()。? Call(func , thisArg , argList ) を返す。
Note 1
thisArg は変換なしに渡される(Edition 3 との違い)。非厳格関数は入口で再度変換を行う。
Note 2
func がアローまたはバウンド関数なら thisArg は手順 6 の [[Call]] に無視される。
20.2.3.2 Function.prototype.bind ( thisArg , ...args )
呼び出し手順:
Target を this 値とする。IsCallable (Target ) が false なら TypeError 。F を ? BoundFunctionCreate (Target , thisArg , args ) とする。L = 0。targetHasLength = ? HasOwnProperty (Target , "length" )。targetHasLength が true ならtargetLen = ? Get (Target , "length" )。targetLen が Number ならtargetLen が +∞ 𝔽 なら L = +∞。Else if targetLen が -∞ 𝔽 なら L = 0。 ElsetargetLenAsInt = ! ToIntegerOrInfinity (targetLen )。Assert : 有限 。argCount = args の要素数。L = max (targetLenAsInt - argCount , 0)。 SetFunctionLength (F , L )。targetName = ? Get (Target , "name" )。targetName が String でなければ空文字列。SetFunctionName (F , targetName , "bound" )。F を返す。
Note 1
bind
で生成される関数はエキゾチックオブジェクト で "prototype" を持たない。
Note 2
Target がアローまたはバウンド関数なら thisArg は後続呼出で使用されない。
20.2.3.3 Function.prototype.call ( thisArg , ...args )
呼び出し手順:
func を this 値とする。IsCallable (func ) が false なら TypeError 。PrepareForTailCall ()。? Call(func , thisArg , args ) を返す。
Note 1
thisArg は変換されないが非厳格関数は入口で変換。
Note 2
func がアロー/バウンド関数なら thisArg は手順 4 で無視。
20.2.3.4 Function.prototype.constructor
Function.prototype.constructor
の初期値は %Function% 。
20.2.3.5 Function.prototype.toString ( )
呼び出し手順:
func を this 値とする。func が Object で [[SourceText]] 内部スロットを持ち Unicode コードポイント列で HostHasSourceTextAvailable (func ) が true ならCodePointsToString(func .[[SourceText]] ) を返す。 func が 組み込み関数オブジェクト なら実装定義 の文字列(構文は NativeFunction )を返す。さらに [[InitialName]] があれば PropertyName 部にそれを用いる。func が Object かつ IsCallable (func ) が true なら実装定義 文字列(NativeFunction 構文)を返す。TypeError 例外。
NativeFunction :
function
NativeFunctionAccessor opt
PropertyName [~Yield, ~Await] opt
(
FormalParameters [~Yield, ~Await]
)
{
[
native
code
]
}
NativeFunctionAccessor :
get
set
20.2.3.6 Function.prototype [ %Symbol.hasInstance% ] ( V )
呼び出し手順:
F を this 値とする。? OrdinaryHasInstance (F , V ) を返す。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
Note
多くの関数が継承するデフォルト実装。instanceof
はこれを用いる。例
v instanceof F
は
F[%Symbol .hasInstance %](v)
と評価される。コンストラクタ は別実装を公開することで判定を制御可能。
改ざん防止のため非書換・非再構成。
このメソッドの "name" プロパティ値は "[Symbol.hasInstance]" 。
20.2.4 Function インスタンス
全 Function インスタンスは ECMAScript 関数オブジェクト であり Table 28 の内部スロットを持つ。Function.prototype.bind
により生成されたものは Table 29 の内部スロットを持つ。
Function インスタンスは以下のプロパティを持つ:
20.2.4.1 length
"length" プロパティ値は典型的に期待される引数個数(整数 )。他個数で呼び出し可能でその挙動は関数次第。このプロパティは { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }。
20.2.4.2 name
"name" プロパティ値は説明的な String。意味的影響はなく定義位置で参照に使われる識別的名称。属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }。
文脈名を持たない匿名関数は空文字列を用いる。
20.2.4.3 prototype
コンストラクタ として使用可能な関数インスタンスは "prototype" プロパティを持ち、生成時に別の通常オブジェクト が作られ初期値となる。特に規定がない限りこの値はコンストラクタ として呼び出されたとき生成オブジェクトの [[Prototype]] 初期化に用いられる。
属性 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }。
Note
20.2.5 HostHasSourceTextAvailable ( func )
The host-defined abstract operation HostHasSourceTextAvailable takes argument func (関数オブジェクト ) and returns Boolean. ホスト が func のソーステキスト提供を防止するために用いる。
HostHasSourceTextAvailable の実装要件:
引数に対して決定的であること。同一 func への各呼出で同じ結果を返す。
デフォルト実装は true を返す。
20.3 Boolean オブジェクト
20.3.1 Boolean コンストラクタ
Boolean コンストラクタ :
%Boolean% である。
グローバルオブジェクト の "Boolean" プロパティ初期値。
コンストラクタ として呼ぶと新 Boolean オブジェクト生成初期化。
関数呼出時は型変換を行う。
extends
節で利用可能。継承意図のサブクラスは super
呼び出しで [[BooleanData]] 内部スロットを持つインスタンスを生成初期化する必要。
20.3.1.1 Boolean ( value )
呼び出し手順:
b を ToBoolean (value ) とする。NewTarget が undefined なら b を返す。 O を ? OrdinaryCreateFromConstructor (NewTarget, "%Boolean.prototype%" , « [[BooleanData]] »)。O .[[BooleanData]] = b 。O を返す。
20.3.2 Boolean コンストラクタのプロパティ
Boolean コンストラクタ :
20.3.2.1 Boolean.prototype
Boolean.prototype
の初期値は Boolean プロトタイプオブジェクト 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.3.3 Boolean プロトタイプオブジェクトのプロパティ
Boolean プロトタイプオブジェクト :
20.3.3.1 Boolean.prototype.constructor
Boolean.prototype.constructor
の初期値は %Boolean% 。
20.3.3.2 Boolean.prototype.toString ( )
呼び出し手順:
b を ? ThisBooleanValue (this value) とする。b が true なら "true" それ以外 "false" を返す。
20.3.3.3 Boolean.prototype.valueOf ( )
呼び出し手順:
? ThisBooleanValue (this value) を返す。
20.3.3.3.1 ThisBooleanValue ( value )
The abstract operation ThisBooleanValue takes argument value (ECMAScript 言語値) and returns Boolean を含む通常完了または throw completion . It performs the following steps when called:
value が Boolean なら返す。value が Object かつ [[BooleanData]] 内部スロットを持つならb = value .[[BooleanData]] 。Assert : b は Boolean。b を返す。TypeError 例外。
20.3.4 Boolean インスタンスのプロパティ
Boolean インスタンスは Boolean プロトタイプオブジェクト を継承する通常オブジェクト で [[BooleanData]] 内部スロットを持つ。これは当該 Boolean オブジェクトが表す値。
20.4 Symbol オブジェクト
20.4.1 Symbol コンストラクタ
Symbol コンストラクタ :
%Symbol% である。
グローバルオブジェクト の "Symbol" プロパティ初期値。
関数呼出で新しい Symbol 値を返す。
new
演算子と共に使うことを意図しない。
サブクラス化を意図しない。
extends
節に使用可能だが super
呼出しは例外を投げる。
20.4.1.1 Symbol ( [ description ] )
呼び出し手順:
NewTarget が undefined でない場合、TypeError 例外を投げる。 description が undefined の場合、descString を undefined とする。それ以外の場合、descString を ? ToString (description ) とする。 [[Description]] が descString である新しい Symbol を返す。
20.4.2 Symbol コンストラクタのプロパティ
Symbol コンストラクタ :
20.4.2.1 Symbol.asyncIterator
Symbol.asyncIterator
の初期値は well-known symbol %Symbol.asyncIterator% (Table 1 )。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.2.2 Symbol.for ( key )
呼び出し手順:
stringKey を ? ToString (key ) とする。GlobalSymbolRegistry List の各 e についてe .[[Key]] が stringKey なら e .[[Symbol]] を返す。Assert : 現時点で stringKey のエントリはない。newSymbol を [[Description]] =stringKey の新しい Symbol とする。Record { [[Key]] : stringKey , [[Symbol]] : newSymbol } を GlobalSymbolRegistry List に追加。newSymbol を返す。
GlobalSymbolRegistry List は全レルム共有の追記専用リスト。ECMAScript コード評価前に空リストで初期化。要素は Table 61 の構造。
Table 61: GlobalSymbolRegistry Record Fields
Field Name
Value
Usage
[[Key]]
a String
シンボルをグローバル識別する文字列キー。
[[Symbol]]
a Symbol
どのレルムからも取得可能なシンボル。
20.4.2.3 Symbol.hasInstance
Symbol.hasInstance
の初期値は well-known symbol %Symbol.hasInstance% 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.2.4 Symbol.isConcatSpreadable
Symbol.isConcatSpreadable
の初期値は well-known symbol %Symbol.isConcatSpreadable% 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.2.5 Symbol.iterator
Symbol.iterator
の初期値は well-known symbol %Symbol.iterator% 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.2.6 Symbol.keyFor ( sym )
呼び出し手順:
sym が Symbol でなければ TypeError 。KeyForSymbol (sym ) を返す。
20.4.2.7 Symbol.match
Symbol.match
初期値は %Symbol.match% 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.2.8 Symbol.matchAll
Symbol.matchAll
初期値は %Symbol.matchAll% 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.2.9 Symbol.prototype
Symbol.prototype
の初期値は Symbol プロトタイプオブジェクト 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.2.10 Symbol.replace
Symbol.replace
初期値は %Symbol.replace% 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.2.11 Symbol.search
Symbol.search
初期値は %Symbol.search% 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.2.12 Symbol.species
Symbol.species
初期値は %Symbol.species% 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.2.13 Symbol.split
Symbol.split
初期値は %Symbol.split% 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.2.14 Symbol.toPrimitive
Symbol.toPrimitive
初期値は %Symbol.toPrimitive% 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.2.15 Symbol.toStringTag
Symbol.toStringTag
初期値は %Symbol.toStringTag% 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.2.16 Symbol.unscopables
Symbol.unscopables
初期値は %Symbol.unscopables% 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.4.3 Symbol プロトタイプオブジェクトのプロパティ
Symbol プロトタイプオブジェクト :
20.4.3.1 Symbol.prototype.constructor
Symbol.prototype.constructor
初期値は %Symbol% 。
20.4.3.2 get Symbol.prototype.description
Symbol.prototype.description
は set アクセサ undefined のアクセサプロパティ で get は次:
s = this 値。sym = ? ThisSymbolValue (s )。sym .[[Description]] を返す。
20.4.3.3 Symbol.prototype.toString ( )
呼び出し手順:
sym = ? ThisSymbolValue (this value)。SymbolDescriptiveString (sym ) を返す。
20.4.3.3.1 SymbolDescriptiveString ( sym )
The abstract operation SymbolDescriptiveString takes argument sym (Symbol) and returns String. It performs the following steps when called:
desc = sym .[[Description]] 。desc が undefined なら空文字列に。Assert : desc は String。"Symbol(" + desc + ")" を返す。
20.4.3.4 Symbol.prototype.valueOf ( )
呼び出し手順:
? ThisSymbolValue (this value) を返す。
20.4.3.4.1 ThisSymbolValue ( value )
The abstract operation ThisSymbolValue takes argument value (ECMAScript 言語値) and returns Symbol を含む通常完了または throw completion . It performs the following steps when called:
value が Symbol なら返す。value が Object かつ [[SymbolData]] 内部スロットを持つならs = value .[[SymbolData]] 。Assert : s は Symbol。s を返す。TypeError 例外。
20.4.3.5 Symbol.prototype [ %Symbol.toPrimitive% ] ( hint )
このメソッドは Symbol オブジェクトをプリミティブに変換する際に呼ばれる。
呼び出し手順:
? ThisSymbolValue (this value) を返す。
Note
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }。
"name" プロパティ値は "[Symbol.toPrimitive]" 。
20.4.3.6 Symbol.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティ初期値は "Symbol" 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }。
20.4.4 Symbol インスタンスのプロパティ
Symbol インスタンスは Symbol プロトタイプオブジェクト を継承する通常オブジェクト で [[SymbolData]] 内部スロットを持ち、その値が表現する Symbol 値である。
20.4.5 Symbol 用抽象操作
20.4.5.1 KeyForSymbol ( sym )
The abstract operation KeyForSymbol takes argument sym (Symbol) and returns String または undefined . sym が GlobalSymbolRegistry List にあるなら登録時の文字列を返す。 It performs the following steps when called:
GlobalSymbolRegistry List の各 e についてSameValue (e .[[Symbol]] , sym ) が true なら e .[[Key]] を返す。Assert : sym のエントリは存在しない。undefined を返す。
20.5 Error オブジェクト
実行時エラー発生時に例外として投げられる。ユーザー定義例外クラスの基底にも利用可能。
実行時エラー検出時、20.5.5 の NativeError か 20.5.7 の AggregateError の新インスタンスが投げられる。
20.5.1 Error コンストラクタ
Error コンストラクタ :
%Error% である。
グローバルオブジェクト の "Error" プロパティ初期値。
関数呼出しでもコンストラクタ と同様に新 Error オブジェクトを生成初期化(Error(…)
は new Error(…)
と等価)。
extends
節で使用可。継承意図のサブクラスは [[ErrorData]] 内部スロット付きで初期化するため super
呼出しが必要。
20.5.1.1 Error ( message [ , options ] )
呼び出し手順:
NewTarget が undefined なら newTarget = アクティブ関数オブジェクト ; Else newTarget = NewTarget。 O を ? OrdinaryCreateFromConstructor (newTarget , "%Error.prototype%" , « [[ErrorData]] ») とする。message が undefined でなければmsg = ? ToString (message )。CreateNonEnumerableDataPropertyOrThrow (O , "message" , msg )。? InstallErrorCause (O , options )。 O を返す。
20.5.2 Error コンストラクタのプロパティ
Error コンストラクタ :
20.5.2.1 Error.isError ( arg )
呼び出し手順:
arg が Object でなければ false 。arg が [[ErrorData]] 内部スロットを持たなければ false 。true を返す。
20.5.2.2 Error.prototype
Error.prototype
初期値は Error プロトタイプオブジェクト 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.5.3 Error プロトタイプオブジェクトのプロパティ
Error プロトタイプオブジェクト :
20.5.3.1 Error.prototype.constructor
Error.prototype.constructor
初期値は %Error% 。
20.5.3.2 Error.prototype.message
Error.prototype.message
初期値は空文字列。
20.5.3.3 Error.prototype.name
Error.prototype.name
初期値は "Error" 。
20.5.3.4 Error.prototype.toString ( )
呼び出し手順:
O = this 値。O が Object でなければ TypeError 。name = ? Get (O , "name" )。name が undefined なら "Error" に; それ以外は ? ToString (name )。msg = ? Get (O , "message" )。msg が undefined なら空文字列; Else ? ToString (msg )。name が空なら msg を返す。msg が空なら name を返す。name , 0x003A, 0x0020, msg の連結を返す。
20.5.4 Error インスタンスのプロパティ
Error インスタンスは Error プロトタイプオブジェクト を継承する通常オブジェクト で [[ErrorData]] 内部スロット値 undefined 。このスロットの唯一の用途は Object.prototype.toString
と Error.isError
による識別。
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.6.1 NativeError コンストラクタ
各 NativeError コンストラクタ :
関数呼出でコンストラクタ 呼出と同等に新 NativeError オブジェクトを生成初期化(NativeError(…)
は new NativeError(…)
と等価)。
extends
節で利用可。継承意図のサブクラスは [[ErrorData]] 付きインスタンス生成のため super
呼出しが必要。
20.5.6.1.1 NativeError ( message [ , options ] )
各 NativeError 関数は呼び出し時次を行う:
NewTarget が undefined なら newTarget = アクティブ関数オブジェクト ; Else newTarget = NewTarget。 O を ? OrdinaryCreateFromConstructor (newTarget , "%NativeError .prototype%"
, « [[ErrorData]] »)。message が undefined でなければmsg = ? ToString (message )。CreateNonEnumerableDataPropertyOrThrow (O , "message" , msg )。? InstallErrorCause (O , options )。 O を返す。
手順 2 の文字列は定義対象に応じ "%EvalError.prototype%" , "%RangeError.prototype%" , "%ReferenceError.prototype%" , "%SyntaxError.prototype%" , "%TypeError.prototype%" , "%URIError.prototype%" のいずれか。
20.5.6.2 NativeError コンストラクタのプロパティ
各 NativeError コンストラクタ :
[[Prototype]] 内部スロット値は %Error% 。
"name" プロパティ値は "NativeError " 。
以下のプロパティを持つ:
20.5.6.2.1 NativeError .prototype
NativeError .prototype
初期値は NativeError プロトタイプオブジェクト (20.5.6.3 )。各コンストラクタ は固有プロトタイプを持つ。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.5.6.3 NativeError プロトタイプオブジェクトのプロパティ
各 NativeError プロトタイプオブジェクト :
20.5.6.3.1 NativeError .prototype.constructor
該当 NativeError コンストラクタ のプロトタイプ "constructor" 初期値はそのコンストラクタ 自身。
20.5.6.3.2 NativeError .prototype.message
"message" 初期値は空文字列。
20.5.6.3.3 NativeError .prototype.name
"name" 初期値はコンストラクタ 名(NativeError の代わりに用いる名称)。
20.5.6.4 NativeError インスタンスのプロパティ
NativeError インスタンスは独自プロトタイプを継承する通常オブジェクト で [[ErrorData]] 内部スロット値 undefined 。用途は Object.prototype.toString
と Error.isError
による識別。
20.5.7 AggregateError オブジェクト
20.5.7.1 AggregateError コンストラクタ
AggregateError コンストラクタ :
%AggregateError% である。
グローバルオブジェクト の "AggregateError" プロパティ初期値。
関数呼出しでも new
と同等。
extends
節に使用可能。継承意図サブクラスは [[ErrorData]] 用に super
呼出しが必要。
20.5.7.1.1 AggregateError ( errors , message [ , options ] )
呼び出し手順:
NewTarget が undefined なら newTarget = アクティブ関数; Else newTarget = NewTarget。 O = ? OrdinaryCreateFromConstructor (newTarget , "%AggregateError.prototype%" , « [[ErrorData]] »)。message が undefined でなければmsg = ? ToString (message )。CreateNonEnumerableDataPropertyOrThrow (O , "message" , msg )。? InstallErrorCause (O , options )。 errorsList = ? IteratorToList (? GetIterator (errors , sync ))。! DefinePropertyOrThrow (O , "errors" , PropertyDescriptor { [[Configurable]] : true , [[Enumerable]] : false , [[Writable]] : true , [[Value]] : CreateArrayFromList (errorsList ) })。 O を返す。
20.5.7.2 AggregateError コンストラクタのプロパティ
AggregateError コンストラクタ :
[[Prototype]] 内部スロット値は %Error% 。
以下のプロパティを持つ:
20.5.7.2.1 AggregateError.prototype
AggregateError.prototype
初期値は %AggregateError.prototype% 。
属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
20.5.7.3 AggregateError プロトタイプオブジェクトのプロパティ
AggregateError プロトタイプオブジェクト :
%AggregateError.prototype% 。
通常オブジェクト 。
Error でも AggregateError インスタンスでもなく [[ErrorData]] を持たない。
[[Prototype]] 内部スロット値は %Error.prototype% 。
20.5.7.3.1 AggregateError.prototype.constructor
AggregateError.prototype.constructor
初期値は %AggregateError% 。
20.5.7.3.2 AggregateError.prototype.message
AggregateError.prototype.message
初期値は空文字列。
20.5.7.3.3 AggregateError.prototype.name
AggregateError.prototype.name
初期値は "AggregateError" 。
20.5.7.4 AggregateError インスタンスのプロパティ
AggregateError インスタンスは AggregateError プロトタイプを継承し [[ErrorData]] 内部スロット値 undefined 。用途は Object.prototype.toString
と Error.isError
での識別。
20.5.8 Error オブジェクト用抽象操作
20.5.8.1 InstallErrorCause ( O , options )
The abstract operation InstallErrorCause takes arguments O (Object) and options (ECMAScript 言語値) and returns unused を含む通常完了または throw completion . options に "cause" プロパティがある場合 O に "cause" プロパティを作成する。 It performs the following steps when called:
options が Object かつ ? HasProperty (options , "cause" ) が true ならcause = ? Get (options , "cause" )。CreateNonEnumerableDataPropertyOrThrow (O , "cause" , cause )。unused を返す。
21 数値と日付 (Numbers and Dates)
21.1 Number オブジェクト
21.1.1 Number コンストラクタ
Number コンストラクタ :
%Number% である。
グローバルオブジェクト の "Number" プロパティの初期値である。
コンストラクタ として呼び出されたとき新しい Number オブジェクトを生成し初期化する。
コンストラクタ ではなく関数として呼び出されたとき型変換を行う。
クラス定義の extends
節の値として使用できる。指定の Number 挙動を継承する意図を持つサブクラスコンストラクタ は、[[NumberData]] 内部スロットを持つサブクラスインスタンスを生成および初期化するために Number コンストラクタ への super
呼び出しを含めなければならない。
21.1.1.1 Number ( value )
この関数は呼び出されたとき次の手順を実行する:
value が存在するなら、prim を ? ToNumeric (value ) とする。prim が BigInt なら n を 𝔽 (ℝ (prim )) とする。それ以外は n を prim とする。 それ以外なら、n を +0 𝔽 とする。 NewTarget が undefined なら n を返す。 O を ? OrdinaryCreateFromConstructor (NewTarget, "%Number.prototype%" , « [[NumberData]] ») とする。O .[[NumberData]] を n に設定する。O を返す。
21.1.2 Number コンストラクタのプロパティ
Number コンストラクタ :
21.1.2.1 Number.EPSILON
Number.EPSILON
の値は、1 と、Number 値として表現可能な 1 より大きい最小の値との差の大きさに相当する Number 値であり、これはおよそ 2.2204460492503130808472633361816 × 10-16 である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.1.2.2 Number.isFinite ( number )
この関数は呼び出されたとき次を実行する:
number が Number でなければ false を返す。number が有限 でなければ false を返す。それ以外なら true を返す。
21.1.2.3 Number.isInteger ( number )
この関数は呼び出されたとき次を実行する:
number が整数 の Number なら true を返す。false を返す。
21.1.2.4 Number.isNaN ( number )
この関数は呼び出されたとき次を実行する:
number が Number でなければ false を返す。number が NaN なら true を返す。それ以外は false を返す。
Note
この関数は、引数を NaN かどうか判定する前に Number へ変換しない点で、グローバルの isNaN 関数 (19.2.3 ) と異なる。
21.1.2.5 Number.isSafeInteger ( number )
Note
整数 n は、その Number 値が他のいかなる整数 の Number 値とも一致しない場合に限り「安全な整数 (safe integer) 」である。
この関数は呼び出されたとき次を実行する:
number が整数 の Number なら、abs (ℝ (number )) ≤ 253 - 1 なら true を返す。false を返す。
21.1.2.6 Number.MAX_SAFE_INTEGER
Note
IEEE 754-2019 の精度制限に起因する丸め挙動のため、Number.MAX_SAFE_INTEGER
より大きいすべての整数 の Number 値は少なくとも 1 つ別の整数 と共有される。そのような大きな整数 は 安全 ではなく、Number 値として正確に表現できる保証も、互いに区別できる保証もない。例えば 9007199254740992
と 9007199254740993
はどちらも Number 値 9007199254740992 𝔽 になる。
Number.MAX_SAFE_INTEGER
の値は 9007199254740991 𝔽 (𝔽 (253 - 1)) である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.1.2.7 Number.MAX_VALUE
Number.MAX_VALUE
の値は Number 型の正の有限 値で最大のものであり、およそ 1.7976931348623157 × 10308 である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.1.2.8 Number.MIN_SAFE_INTEGER
Note
IEEE 754-2019 の精度制限に起因する丸め挙動のため、Number.MIN_SAFE_INTEGER
より小さいすべての整数 の Number 値は少なくとも 1 つ別の整数 と共有される。そのような大きな(絶対値が大きい)整数 は 安全 ではなく、Number 値として正確に表現・相互識別できる保証はない。例えば -9007199254740992
と -9007199254740993
はどちらも Number 値 -9007199254740992 𝔽 になる。
Number.MIN_SAFE_INTEGER
の値は -9007199254740991 𝔽 (𝔽 (-(253 - 1))) である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.1.2.9 Number.MIN_VALUE
Number.MIN_VALUE
の値は Number 型の最小の正の値であり、およそ 5 × 10-324 である。
IEEE 754-2019 倍精度の 2 進表現において最小値は非正規化数である。実装が非正規化数をサポートしない場合、Number.MIN_VALUE
の値はその実装で実際に表現可能な最小の非ゼロ正値でなければならない。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.1.2.10 Number.NaN
Number.NaN
の値は NaN である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.1.2.11 Number.NEGATIVE_INFINITY
Number.NEGATIVE_INFINITY
の値は -∞ 𝔽 である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.1.2.12 Number.parseFloat ( string )
"parseFloat" プロパティの初期値は %parseFloat% である。
21.1.2.13 Number.parseInt ( string , radix )
"parseInt" プロパティの初期値は %parseInt% である。
21.1.2.14 Number.POSITIVE_INFINITY
Number.POSITIVE_INFINITY
の値は +∞ 𝔽 である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.1.2.15 Number.prototype
Number.prototype
の初期値は Number プロトタイプオブジェクト である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.1.3 Number プロトタイプオブジェクトのプロパティ
Number プロトタイプオブジェクト :
%Number.prototype% である。
通常オブジェクト である。
それ自体が Number オブジェクトであり、値 +0 𝔽 を持つ [[NumberData]] 内部スロットを持つ。
値 %Object.prototype% を持つ [[Prototype]] 内部スロットを有する。
明示的に別段の記述がない限り、以下で定義される Number プロトタイプオブジェクトのメソッドはジェネリックではなく、それらに渡される this 値は Number 値か、Number 値で初期化された [[NumberData]] 内部スロットを持つオブジェクトでなければならない。
メソッド仕様内の語句 “this Number value” は、メソッド呼び出しの this 値を引数として抽象操作 ThisNumberValue を呼び出した結果を指す。
21.1.3.1 Number.prototype.constructor
Number.prototype.constructor
の初期値は %Number% である。
21.1.3.2 Number.prototype.toExponential ( fractionDigits )
このメソッドは、この Number 値を 10 進指数表記で仮数部の小数点前 1 桁およびその後に fractionDigits 桁の仮数部桁を伴う形で表現した文字列を返す。fractionDigits が undefined の場合、Number を一意に特定するために必要な仮数桁数(常に指数表記)を含める(ToString と同様だが常に指数表記で出力される点が異なる)。
呼び出されたとき次を実行する:
x を ? ThisNumberValue (this value) とする。f を ? ToIntegerOrInfinity (fractionDigits ) とする。Assert : fractionDigits が undefined なら f は 0。x が有限 でなければ Number::toString (x , 10) を返す。f < 0 または f > 100 なら RangeError 例外。x を ℝ (x ) に設定。s を空文字列とする。x < 0 ならs を "-" に設定。x を -x に設定。x = 0 ならm を f + 1 個のコード単位 0x0030 (DIGIT ZERO) からなる文字列とする。e を 0 とする。それ以外fractionDigits が undefined でなければ10f ≤ n < 10f + 1 かつ n × 10e - f - x がゼロに最も近くなるような整数 e , n をとる。複数あるなら n × 10e - f が大きい方。 それ以外ff ≥ 0, 10ff ≤ n < 10ff + 1 , 𝔽 (n × 10e - ff ) が 𝔽 (x ) に等しく、ff が最小となる整数 e , n , ff をとる。n の 10 進表記は ff + 1 桁で 0 で割り切れない(最下位桁は一意とは限らない)。f を ff に設定。 m を n の 10 進表記の桁(先頭 0 なし)からなる文字列とする。 f ≠ 0 ならa を m の最初のコード単位。b を残りの f 個のコード単位。m を a , "." , b の連結に設定。e = 0 ならc を "+" とする。d を "0" とする。それ以外e > 0 ならc を "+" とする。それ以外Assert : e < 0。c を "-" とする。e を -e に設定。 d を e の 10 進表記(先頭 0 なし)からなる文字列とする。 m を m , "e" , c , d の連結に設定。s と m の連結を返す。
Note
上記規則より高精度な変換を提供する実装では、手順 10.b.i の代替指針として以下を推奨する:
f ≥ 0, 10f ≤ n < 10f + 1 , 𝔽 (n × 10e - f ) が 𝔽 (x ) に等しく、f が最小となる整数 e , n , f をとる。n の候補が複数ある場合、𝔽 (n × 10e - f ) が 𝔽 (x ) に最も近いものを選び、2 つあるなら偶数を選ぶ。
21.1.3.3 Number.prototype.toFixed ( fractionDigits )
Note 1
このメソッドは、この Number 値を 10 進固定小数点表記で小数点以下に fractionDigits 桁を含む文字列を返す。fractionDigits が undefined の場合 0 を仮定する。
呼び出されたとき次を実行する:
x を ? ThisNumberValue (this value) とする。f を ? ToIntegerOrInfinity (fractionDigits ) とする。Assert : fractionDigits が undefined なら f は 0。f が有限 でなければ RangeError 。f < 0 または f > 100 なら RangeError 。x が有限 でなければ Number::toString (x , 10) を返す。x を ℝ (x ) に設定。s を空文字列とする。x < 0 ならs を "-" に設定。x を -x に設定。x ≥ 1021 ならm を ! ToString (𝔽 (x )) とする。それ以外n を n / 10f - x が 0 に最も近くなる整数 とする(2 つあれば大きい方)。n = 0 なら m = "0" 、そうでなければ m を n の 10 進表記(先頭 0 なし)の桁列とする。f ≠ 0 ならk を m の長さとする。k ≤ f ならz を f + 1 - k 個の 0x0030 からなる文字列とする。m を z + m に設定。k を f + 1 に設定。a を m の先頭 k - f 文字。b を残りの f 文字。m を a , "." , b の連結に設定。 s + m を返す。
Note 2
toFixed
の出力は、ある値について toString
より精密になる場合がある。toString
は隣接する Number 値と区別するのに十分な有効桁のみを出力するためである。例:
(1000000000000000128).toString()
は "1000000000000000100" を返す一方、
(1000000000000000128).toFixed(0)
は "1000000000000000128" を返す。
21.1.3.4 Number.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 国際化 API を含む ECMAScript 実装は ECMA-402 仕様に従ってこのメソッドを実装しなければならない。ECMA-402 API を含まない実装では以下の仕様が用いられる:
このメソッドは、この Number 値をホスト環境 の現在のロケール規約に従って書式化した文字列を生成する。このメソッドは実装定義 であり、toString
と同じものを返すことは許容されるが推奨はされない。
このメソッドのオプション引数の意味は ECMA-402 仕様で定義される; ECMA-402 をサポートしない実装はこれらの位置を他目的に使用してはならない。
21.1.3.5 Number.prototype.toPrecision ( precision )
このメソッドは、この Number 値を、仮数部の小数点前 1 桁および precision - 1 桁を小数点後に持つ 10 進指数表記、または precision 個の有効桁を持つ 10 進固定表記で表現した文字列を返す。precision が undefined の場合は代わりに ToString を呼び出す。
呼び出されたとき次を実行する:
x を ? ThisNumberValue (this value) とする。precision が undefined なら ! ToString (x ) を返す。p を ? ToIntegerOrInfinity (precision ) とする。x が有限 でなければ Number::toString (x , 10) を返す。p < 1 または p > 100 なら RangeError 。x を ℝ (x ) に設定。s を空文字列とする。x < 0 ならs をコード単位 0x002D (HYPHEN-MINUS) に設定。x を -x に設定。x = 0 ならm を p 個の 0x0030 (DIGIT ZERO) からなる文字列とする。e を 0 とする。それ以外10p - 1 ≤ n < 10p かつ n × 10e - p + 1 - x が 0 に最も近い整数 e , n をとる(複数あるなら積が大きい方)。 m を n の 10 進表記桁列(先頭 0 なし)とする。e < -6 または e ≥ p ならAssert : e ≠ 0。p ≠ 1 ならa を m の最初のコード単位。b を残りの p - 1 文字。m を a , "." , b の連結に設定。e > 0 ならc をコード単位 0x002B (PLUS SIGN) とする。それ以外Assert : e < 0。c をコード単位 0x002D (HYPHEN-MINUS) とする。e を -e に設定。 d を e の 10 進表記(先頭 0 なし)文字列とする。s , m , コード単位 0x0065 ('e'), c , d の連結を返す。 e = p - 1 なら s + m を返す。e ≥ 0 ならm を 先頭 e + 1 文字, コード単位 0x002E (FULL STOP), 残り p - (e + 1) 文字 の連結に設定。それ以外m を コード単位 0x0030, コード単位 0x002E, -(e + 1) 個の 0x0030, 文字列 m の連結に設定。 s + m を返す。
21.1.3.6 Number.prototype.toString ( [ radix ] )
Note
オプションの radix は 2 𝔽 から 36 𝔽 までの整数 Number 値であるべきである。radix が undefined の場合 radix の値として 10 𝔽 が用いられる。
このメソッドは呼び出されたとき次を実行する:
x を ? ThisNumberValue (this value) とする。radix が undefined なら radixMV = 10。それ以外は radixMV = ? ToIntegerOrInfinity (radix )。 radixMV が 2 から 36 の範囲外なら RangeError 。Number::toString (x , radixMV ) を返す。
このメソッドはジェネリックではなく、this 値が Number または Number オブジェクトでない場合 TypeError を投げる。したがって他種オブジェクトに転用できない。
このメソッドの "length" プロパティは 1 𝔽 である。
21.1.3.7 Number.prototype.valueOf ( )
? ThisNumberValue (this value) を返す。
21.1.3.7.1 ThisNumberValue ( value )
The abstract operation ThisNumberValue takes argument value (ECMAScript 言語値) and returns Number を含む通常完了または throw completion . It performs the following steps when called:
value が Number なら value を返す。value が Object で [[NumberData]] 内部スロットを持つならn を value .[[NumberData]] とする。Assert : n は Number。n を返す。TypeError 例外を投げる。
21.1.4 Number インスタンスのプロパティ
Number インスタンスは Number プロトタイプオブジェクト からプロパティを継承する通常オブジェクト である。Number インスタンスは [[NumberData]] 内部スロットも持つ。[[NumberData]] 内部スロットはこの Number オブジェクトが表す Number 値である。
21.2 BigInt オブジェクト
21.2.1 BigInt コンストラクタ
BigInt コンストラクタ :
%BigInt% である。
グローバルオブジェクト の "BigInt" プロパティの初期値である。
コンストラクタ ではなく関数として呼び出されたとき型変換を行う。
new
演算子で使用することやサブクラス化することを意図しない。クラス定義の extends
節の値として使用することはできるが、BigInt コンストラクタ への super
呼び出しは例外を引き起こす。
21.2.1.1 BigInt ( value )
この関数は呼び出されたとき次の手順を実行する:
NewTarget が undefined でなければ TypeError 例外を投げる。 prim を ? ToPrimitive(value , number ) とする。prim が Number なら ? NumberToBigInt (prim ) を返す。それ以外なら ? ToBigInt (prim ) を返す。
21.2.1.1.1 NumberToBigInt ( number )
The abstract operation NumberToBigInt takes argument number (a Number) and returns either a normal completion containing a BigInt or a throw completion . It performs the following steps when called:
number が整数 の Number でなければ RangeError 例外を投げる。ℤ (ℝ (number )) を返す。
21.2.2 BigInt コンストラクタのプロパティ
BigInt コンストラクタ :
21.2.2.1 BigInt.asIntN ( bits , bigint )
この関数は呼び出されたとき次を実行する:
bits を ? ToIndex (bits ) に設定する。bigint を ? ToBigInt (bigint ) に設定する。mod を ℝ (bigint ) modulo 2bits とする。もし mod ≥ 2bits - 1 なら ℤ (mod - 2bits ) を返す; そうでなければ ℤ (mod ) を返す。
21.2.2.2 BigInt.asUintN ( bits , bigint )
この関数は呼び出されたとき次を実行する:
bits を ? ToIndex (bits ) に設定する。bigint を ? ToBigInt (bigint ) に設定する。ℤ (ℝ (bigint ) modulo 2bits ) を返す。
21.2.2.3 BigInt.prototype
BigInt.prototype
の初期値は BigInt プロトタイプオブジェクト である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.2.3 BigInt プロトタイプオブジェクトのプロパティ
BigInt プロトタイプオブジェクト :
%BigInt.prototype% である。
通常オブジェクト である。
BigInt オブジェクトではない([[BigIntData]] 内部スロットを持たない)。
[[Prototype]] 内部スロットの値は %Object.prototype% である。
メソッド仕様内の語句 “this BigInt value” は、そのメソッド呼び出しの this 値を引数として抽象操作 ThisBigIntValue を呼び出した結果を指す。
21.2.3.1 BigInt.prototype.constructor
BigInt.prototype.constructor
の初期値は %BigInt% である。
21.2.3.2 BigInt.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 国際化 API を含む ECMAScript 実装は、このメソッドを ECMA-402 仕様に従って実装しなければならない。ECMA-402 API を含まない実装では以下の仕様が用いられる:
このメソッドは、この BigInt 値をホスト環境 の現在のロケール規約に従って書式化した文字列値を生成する。実装定義 であり、toString
と同じものを返すことも許容されるが推奨されない。
このメソッドのオプション引数の意味は ECMA-402 仕様で定義される;ECMA-402 をサポートしない実装はこれらの位置を他用途に用いてはならない。
21.2.3.3 BigInt.prototype.toString ( [ radix ] )
Note
オプションの radix は 2 𝔽 から 36 𝔽 までの整数 Number 値であるべきである。radix が undefined なら 10 𝔽 が用いられる。
このメソッドは呼び出されたとき次を実行する:
x を ? ThisBigIntValue (this value) とする。radix が undefined なら radixMV を 10 とする。それ以外なら radixMV を ? ToIntegerOrInfinity (radix ) とする。 radixMV が 2 から 36 の包含区間 にないなら RangeError 例外を投げる。BigInt::toString (x , radixMV ) を返す。
このメソッドはジェネリックではなく、this 値が BigInt でも BigInt オブジェクトでもない場合 TypeError 例外を投げる。したがって他種類のオブジェクトへ移してメソッドとして使用できない。
21.2.3.4 BigInt.prototype.valueOf ( )
? ThisBigIntValue (this value) を返す。
21.2.3.4.1 ThisBigIntValue ( value )
The abstract operation ThisBigIntValue takes argument value (an ECMAScript language value) and returns either a normal completion containing a BigInt or a throw completion . It performs the following steps when called:
value が BigInt なら value を返す。value が Object で [[BigIntData]] 内部スロットを持つならAssert : value .[[BigIntData]] は BigInt である。value .[[BigIntData]] を返す。TypeError 例外を投げる。
21.2.3.5 BigInt.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列 "BigInt" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
21.2.4 BigInt インスタンスのプロパティ
BigInt インスタンスは BigInt プロトタイプオブジェクト からプロパティを継承する通常オブジェクト である。BigInt インスタンスは [[BigIntData]] 内部スロットも持つ。[[BigIntData]] 内部スロットはその BigInt オブジェクトが表す BigInt 値である。
21.3 Math オブジェクト
Math オブジェクト:
Note
本仕様において語句 “the Number value for x ” は 6.1.6.1 で定義される技術的意味を持つ。
21.3.1 Math オブジェクトの値プロパティ
21.3.1.1 Math.E
自然対数の底 e の Number 値(およそ 2.7182818284590452354)。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.3.1.2 Math.LN10
10 の自然対数の Number 値(およそ 2.302585092994046)。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.3.1.3 Math.LN2
2 の自然対数の Number 値(およそ 0.6931471805599453)。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.3.1.4 Math.LOG10E
自然対数の底 e の常用対数(底10)の Number 値(およそ 0.4342944819032518)。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
Note
Math.LOG10E
の値はおよそ Math.LN10
の逆数である。
21.3.1.5 Math.LOG2E
自然対数の底 e の底2対数の Number 値(およそ 1.4426950408889634)。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
Note
Math.LOG2E
の値はおよそ Math.LN2
の逆数である。
21.3.1.6 Math.PI
円周率 π(円の周長と直径の比)の Number 値(およそ 3.1415926535897932)。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.3.1.7 Math.SQRT1_2
1/2 の平方根の Number 値(およそ 0.7071067811865476)。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
Note
Math.SQRT1_2
の値はおよそ Math.SQRT2
の逆数である。
21.3.1.8 Math.SQRT2
2 の平方根の Number 値(およそ 1.4142135623730951)。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
21.3.1.9 Math [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列 "Math" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
21.3.2 Math オブジェクトの関数プロパティ
Note
acos
, acosh
, asin
, asinh
, atan
, atanh
, atan2
, cbrt
, cos
, cosh
, exp
, expm1
, hypot
, log
, log1p
, log2
, log10
, pow
, random
, sin
, sinh
, tan
, tanh
の各関数の動作は、特定の境界的引数値に対する結果を要求する点を除きここでは厳密には規定されない。他の引数値に対しては、これらの関数は周知の数学関数の結果を近似することを意図するが、近似アルゴリズムの選択には一定の裁量が許される。目的は、実装者があるハードウェアプラットフォームにおいて C 言語プログラマが利用できる数学ライブラリを ECMAScript でも利用できるようにすることである。
アルゴリズム選択は実装に委ねられるが(規格では規定しない)、Sun Microsystems の自由配布数学ライブラリ fdlibm
(http://www.netlib.org/fdlibm )に含まれる IEEE 754-2019 演算用近似アルゴリズムを用いることが推奨される。
21.3.2.1 Math.abs ( x )
この関数は x の絶対値を返す。結果は x と同じ大きさで正の符号を持つ。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN なら NaN を返す。n が -0 𝔽 なら +0 𝔽 を返す。n が -∞ 𝔽 なら +∞ 𝔽 を返す。n < -0 𝔽 なら -n を返す。n を返す。
21.3.2.2 Math.acos ( x )
この関数は x の逆余弦を返す。結果はラジアンで +0 𝔽 から 𝔽 (π) の包含区間 内にある。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN または n > 1 𝔽 または n < -1 𝔽 なら NaN を返す。n が 1 𝔽 なら +0 𝔽 を返す。ℝ (n ) の逆余弦を表す実装近似 Number 値を返す。
21.3.2.3 Math.acosh ( x )
この関数は x の逆双曲線余弦を返す。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN または +∞ 𝔽 なら n を返す。n が 1 𝔽 なら +0 𝔽 を返す。n < 1 𝔽 なら NaN を返す。ℝ (n ) の逆双曲線余弦を表す実装近似 Number 値を返す。
21.3.2.4 Math.asin ( x )
この関数は x の逆正弦を返す。結果はラジアンで 𝔽 (-π / 2) から 𝔽 (π / 2) の包含区間 内。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN , +0 𝔽 , -0 𝔽 のいずれかなら n を返す。n > 1 𝔽 または n < -1 𝔽 なら NaN を返す。ℝ (n ) の逆正弦を表す実装近似 Number 値を返す。
21.3.2.5 Math.asinh ( x )
この関数は x の逆双曲線正弦を返す。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が有限 でないか、_n_ が +0 𝔽 または -0 𝔽 の場合 n を返す。ℝ (n ) の逆双曲線正弦を表す実装近似 Number 値を返す。
21.3.2.6 Math.atan ( x )
この関数は x の逆正接を返す。結果はラジアンで 𝔽 (-π / 2) から 𝔽 (π / 2) の包含区間 内。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN , +0 𝔽 , -0 𝔽 のいずれかなら n を返す。n が +∞ 𝔽 なら π / 2 を表す実装近似 Number 値を返す。n が -∞ 𝔽 なら -π / 2 を表す実装近似 Number 値を返す。ℝ (n ) の逆正接を表す実装近似 Number 値を返す。
21.3.2.7 Math.atanh ( x )
この関数は x の逆双曲線正接を返す。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN , +0 𝔽 , -0 𝔽 のいずれかなら n を返す。n > 1 𝔽 または n < -1 𝔽 なら NaN を返す。n が 1 𝔽 なら +∞ 𝔽 を返す。n が -1 𝔽 なら -∞ 𝔽 を返す。ℝ (n ) の逆双曲線正接を表す実装近似 Number 値を返す。
21.3.2.8 Math.atan2 ( y , x )
この関数は引数 y と x の商 y / x の逆正接を返し、y と x の符号で象限を決定する。2 引数逆正接関数において第 1 引数名が y 、第 2 引数名が x であるのは慣習的意図的仕様である。結果はラジアンで -π から +π の包含区間 内。
呼び出されたとき次を実行する:
ny を ? ToNumber (y ) とする。nx を ? ToNumber (x ) とする。ny が NaN か nx が NaN なら NaN を返す。ny が +∞ 𝔽 のときnx が +∞ 𝔽 なら π / 4 を表す実装近似 Number 値を返す。nx が -∞ 𝔽 なら 3π / 4 を表す実装近似 Number 値を返す。π / 2 を表す実装近似 Number 値を返す。 ny が -∞ 𝔽 のときnx が +∞ 𝔽 なら -π / 4 を表す実装近似 Number 値を返す。nx が -∞ 𝔽 なら -3π / 4 を表す実装近似 Number 値を返す。-π / 2 を表す実装近似 Number 値を返す。 ny が +0 𝔽 のときnx > +0 𝔽 または nx が +0 𝔽 なら +0 𝔽 を返す。π を表す実装近似 Number 値を返す。 ny が -0 𝔽 のときnx > +0 𝔽 または nx が +0 𝔽 なら -0 𝔽 を返す。-π を表す実装近似 Number 値を返す。 Assert : ny は有限 で +0 𝔽 でも -0 𝔽 でもない。ny > +0 𝔽 のときnx が +∞ 𝔽 なら +0 𝔽 を返す。nx が -∞ 𝔽 なら π を表す実装近似 Number 値を返す。nx が +0 𝔽 または -0 𝔽 なら π / 2 を表す実装近似 Number 値を返す。ny < -0 𝔽 のときnx が +∞ 𝔽 なら -0 𝔽 を返す。nx が -∞ 𝔽 なら -π を表す実装近似 Number 値を返す。nx が +0 𝔽 または -0 𝔽 なら -π / 2 を表す実装近似 Number 値を返す。Assert : nx は有限 で +0 𝔽 でも -0 𝔽 でもない。r を abs (ℝ (ny ) / ℝ (nx )) の逆正接とする。nx < -0 𝔽 のときny > +0 𝔽 なら r を π - r に設定。それ以外は r を -π + r に設定。 それ以外 (nx ≥ -0 𝔽 ) のときny < -0 𝔽 なら r を -r に設定。 r を表す実装近似 Number 値を返す。
21.3.2.9 Math.cbrt ( x )
この関数は x の立方根を返す。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が有限 でないか _n_ が +0 𝔽 または -0 𝔽 なら n を返す。ℝ (n ) の立方根を表す実装近似 Number 値を返す。
21.3.2.10 Math.ceil ( x )
この関数は x 以上で最も小さい(-∞ に最も近い)整数 Number 値を返す。x が既に整数 なら結果は x である。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が有限 でないか _n_ が +0 𝔽 または -0 𝔽 なら n を返す。n < -0 𝔽 かつ n > -1 𝔽 なら -0 𝔽 を返す。n が整数 の Number なら n を返す。n 以上で最小の整数 Number 値(-∞ に最も近い)を返す。
Note
Math.ceil(x)
の値は -Math.floor(-x)
の値と同じである。
21.3.2.11 Math.clz32 ( x )
この関数は呼び出されたとき次を実行する:
n を ? ToUint32 (x ) とする。p を n の 32 ビット符号なし 2 進表現における先頭の 0 ビット数とする。𝔽 (p ) を返す。
Note
n が +0 𝔽 または -0 𝔽 の場合このメソッドは 32 𝔽 を返す。n の 32 ビット表現の最上位ビットが 1 の場合、このメソッドは +0 𝔽 を返す。
21.3.2.12 Math.cos ( x )
この関数は x の余弦を返す。引数はラジアン。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が有限 でないなら NaN を返す。n が +0 𝔽 または -0 𝔽 なら 1 𝔽 を返す。ℝ (n ) の余弦を表す実装近似 Number 値を返す。
21.3.2.13 Math.cosh ( x )
この関数は x の双曲線余弦を返す。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN なら NaN を返す。n が +∞ 𝔽 または -∞ 𝔽 なら +∞ 𝔽 を返す。n が +0 𝔽 または -0 𝔽 なら 1 𝔽 を返す。ℝ (n ) の双曲線余弦を表す実装近似 Number 値を返す。
Note
Math.cosh(x)
の値は (Math.exp(x) + Math.exp(-x)) / 2
と同じである。
21.3.2.14 Math.exp ( x )
この関数は x の指数関数(自然対数の底 e の x 乗)を返す。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN または +∞ 𝔽 なら n を返す。n が +0 𝔽 または -0 𝔽 なら 1 𝔽 を返す。n が -∞ 𝔽 なら +0 𝔽 を返す。ℝ (n ) の指数関数を表す実装近似 Number 値を返す。
21.3.2.15 Math.expm1 ( x )
この関数は x の指数関数から 1 を引いた結果を返す。x が 0 に近い場合でも精度を保つ方法で計算される。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN , +0 𝔽 , -0 𝔽 , +∞ 𝔽 のいずれかなら n を返す。n が -∞ 𝔽 なら -1 𝔽 を返す。exp を ℝ (n ) の指数関数とする。exp - 1 を表す実装近似 Number 値を返す。
21.3.2.16 Math.floor ( x )
この関数は x 以下で最大(+∞ に最も近い)の整数 Number 値を返す。x が既に整数 なら結果は x 。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が有限 でないか _n_ が +0 𝔽 または -0 𝔽 なら n を返す。n < 1 𝔽 かつ n > +0 𝔽 なら +0 𝔽 を返す。n が整数 Number なら n を返す。n 以下で最大の整数 Number 値(+∞ に最も近い)を返す。
Note
Math.floor(x)
の値は -Math.ceil(-x)
の値と同じである。
21.3.2.17 Math.fround ( x )
この関数は呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN なら NaN を返す。n が +0 𝔽 , -0 𝔽 , +∞ 𝔽 , -∞ 𝔽 のいずれかなら n を返す。n32 を n を丸めモード roundTiesToEven で IEEE 754-2019 binary32 形式に変換した結果とする。n64 を n32 を IEEE 754-2019 binary64 形式に変換した結果とする。n64 に対応する ECMAScript Number 値を返す。
21.3.2.18 Math.f16round ( x )
この関数は呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN なら NaN を返す。n が +0 𝔽 , -0 𝔽 , +∞ 𝔽 , -∞ 𝔽 のいずれかなら n を返す。n16 を n を丸めモード roundTiesToEven で IEEE 754-2019 binary16 形式に変換した結果とする。n64 を n16 を IEEE 754-2019 binary64 形式に変換した結果とする。n64 に対応する ECMAScript Number 値を返す。
Note
この操作は double-rounding の可能性があるため binary32 へ変換後 binary16 へ変換するのと同じではない。例として k = 1.00048828125000022204 𝔽 では Math.f16round(k ) は 1.0009765625 𝔽 だが Math.f16round(Math.fround(k )) は 1 𝔽 となる。
全てのプラットフォームが binary64 から binary16 へのネイティブ変換を提供するわけではない。MIT ライセンスの half ライブラリ等で可能である。別案として、まず roundTiesToEven で binary64 から binary32 に変換し、結果が誤った二重丸めを生む可能性があるか検査できる。該当する場合 binary32 値の仮数を roundTiesToOdd で初期変換した場合に得られる値に調整し、その調整値を binary16 に roundTiesToEven で変換することで正しい値を得られる。
21.3.2.19 Math.hypot ( ...args )
0 個以上の引数について、それらの二乗和の平方根を返す。
呼び出されたとき次を実行する:
coerced を新しい空リストとする。args の各要素 arg についてn を ? ToNumber (arg ) とする。n を coerced に追加。coerced の各要素 number についてnumber が +∞ 𝔽 または -∞ 𝔽 なら +∞ 𝔽 を返す。onlyZero を true とする。coerced の各要素 number についてnumber が NaN なら NaN を返す。number が +0 𝔽 でも -0 𝔽 でもなければ onlyZero を false に設定。onlyZero が true なら +0 𝔽 を返す。coerced の要素の数学的値の二乗和の平方根を表す実装近似 Number 値を返す。
この関数の "length" プロパティは 2 𝔽 である。
Note
複数引数で呼ばれる際のオーバーフローやアンダーフローによる精度損失を避けるよう配慮すべきである。
21.3.2.20 Math.imul ( x , y )
この関数は呼び出されたとき次を実行する:
a を ℝ (? ToUint32 (x )) とする。b を ℝ (? ToUint32 (y )) とする。product を (a × b ) modulo 232 とする。product ≥ 231 なら 𝔽 (product - 232 ) を返す; そうでなければ 𝔽 (product ) を返す。
21.3.2.21 Math.log ( x )
この関数は x の自然対数を返す。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN または +∞ 𝔽 なら n を返す。n が 1 𝔽 なら +0 𝔽 を返す。n が +0 𝔽 または -0 𝔽 なら -∞ 𝔽 を返す。n < -0 𝔽 なら NaN を返す。ℝ (n ) の自然対数を表す実装近似 Number 値を返す。
21.3.2.22 Math.log1p ( x )
この関数は 1 + x の自然対数を返す。x が 0 に近い場合も精度良く計算される。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN , +0 𝔽 , -0 𝔽 , +∞ 𝔽 のいずれかなら n を返す。n が -1 𝔽 なら -∞ 𝔽 を返す。n < -1 𝔽 なら NaN を返す。1 + ℝ (n ) の自然対数を表す実装近似 Number 値を返す。
21.3.2.23 Math.log10 ( x )
この関数は x の常用対数(底 10)を返す。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN または +∞ 𝔽 なら n を返す。n が 1 𝔽 なら +0 𝔽 を返す。n が +0 𝔽 または -0 𝔽 なら -∞ 𝔽 を返す。n < -0 𝔽 なら NaN を返す。ℝ (n ) の常用対数を表す実装近似 Number 値を返す。
21.3.2.24 Math.log2 ( x )
この関数は x の底 2 対数を返す。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN または +∞ 𝔽 なら n を返す。n が 1 𝔽 なら +0 𝔽 を返す。n が +0 𝔽 または -0 𝔽 なら -∞ 𝔽 を返す。n < -0 𝔽 なら NaN を返す。ℝ (n ) の底 2 対数を表す実装近似 Number 値を返す。
21.3.2.25 Math.max ( ...args )
0 個以上の引数について、各引数に ToNumber を適用し最大の値を返す。
呼び出されたとき次を実行する:
coerced を新しい空リストとする。args の各要素 arg についてn を ? ToNumber (arg ) とする。n を coerced に追加。highest を -∞ 𝔽 とする。coerced の各要素 number についてnumber が NaN なら NaN を返す。number が +0 𝔽 かつ highest が -0 𝔽 なら highest を +0 𝔽 に設定。number > highest なら highest を number に設定。highest を返す。
Note
最大値判定の比較は IsLessThan アルゴリズムを用いるが、+0 𝔽 は -0 𝔽 より大きいと見なす点が異なる。
この関数の "length" プロパティは 2 𝔽 である。
21.3.2.26 Math.min ( ...args )
0 個以上の引数について、各引数に ToNumber を適用し最小の値を返す。
呼び出されたとき次を実行する:
coerced を新しい空リストとする。args の各要素 arg についてn を ? ToNumber (arg ) とする。n を coerced に追加。lowest を +∞ 𝔽 とする。coerced の各要素 number についてnumber が NaN なら NaN を返す。number が -0 𝔽 かつ lowest が +0 𝔽 なら lowest を -0 𝔽 に設定。number < lowest なら lowest を number に設定。lowest を返す。
Note
最大値判定と同様、比較は IsLessThan に準じるが +0 𝔽 を -0 𝔽 より大きいと見なす。
この関数の "length" プロパティは 2 𝔽 である。
21.3.2.27 Math.pow ( base , exponent )
この関数は呼び出されたとき次を実行する:
base を ? ToNumber (base ) に設定。exponent を ? ToNumber (exponent ) に設定。Number::exponentiate (base , exponent ) を返す。
21.3.2.28 Math.random ( )
この関数は符号正で +0 𝔽 以上 1 𝔽 未満の Number 値を、その範囲にほぼ一様な分布で(実装定義 のアルゴリズムまたは戦略を用いて)ランダムまたは疑似ランダムに返す。
異なるレルムで生成された各 Math.random
関数は、連続呼び出しで異なる値列を生成しなければならない。
21.3.2.29 Math.round ( x )
この関数は x に最も近い整数 の Number 値を返す。2 つの整数 が同じ距離の場合 +∞ に近い方を返す。x が既に整数 なら結果は x 。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が有限 でないか n が整数 Number なら n を返す。n < 0.5 𝔽 かつ n > +0 𝔽 なら +0 𝔽 を返す。n < -0 𝔽 かつ n ≥ -0.5 𝔽 なら -0 𝔽 を返す。n に最も近い整数 Number を返す(距離が同じ場合は +∞ に近い方)。
Note 1
Math.round(3.5)
は 4 を返すが Math.round(-3.5)
は -3 を返す。
Note 2
Math.round(x)
の値は常に Math.floor(x + 0.5)
の値と同じではない。x
が -0 𝔽 または -0 𝔽 より小さく -0.5 𝔽 以上のとき Math.round(x)
は -0 𝔽 を返すが Math.floor(x + 0.5)
は +0 𝔽 を返す。また x + 0.5
の内部丸めにより差異が生じる場合がある。
21.3.2.30 Math.sign ( x )
この関数は x の符号(正/負/ゼロ)を返す。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN , +0 𝔽 , -0 𝔽 のいずれかなら n を返す。n < -0 𝔽 なら -1 𝔽 を返す。1 𝔽 を返す。
21.3.2.31 Math.sin ( x )
この関数は x の正弦を返す。引数はラジアン。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN , +0 𝔽 , -0 𝔽 のいずれかなら n を返す。n が +∞ 𝔽 または -∞ 𝔽 なら NaN を返す。ℝ (n ) の正弦を表す実装近似 Number 値を返す。
21.3.2.32 Math.sinh ( x )
この関数は x の双曲線正弦を返す。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が有限 でないか _n_ が +0 𝔽 または -0 𝔽 なら n を返す。ℝ (n ) の双曲線正弦を表す実装近似 Number 値を返す。
Note
Math.sinh(x)
の値は (Math.exp(x) - Math.exp(-x)) / 2
と同じである。
21.3.2.33 Math.sqrt ( x )
この関数は x の平方根を返す。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN , +0 𝔽 , -0 𝔽 , +∞ 𝔽 のいずれかなら n を返す。n < -0 𝔽 なら NaN を返す。𝔽 (ℝ (n ) の平方根) を返す。
21.3.2.34 Math.sumPrecise ( items )
Number の iterable が与えられたとき、その各値を加算し合計を返す。任意の値が Number でなければ TypeError 例外を投げる。
呼び出されたとき次を実行する:
? RequireObjectCoercible (items ) を実行。 iteratorRecord を ? GetIterator (items , sync ) とする。state を minus-zero とする。sum を 0 とする。count を 0 とする。next を not-started とする。next が done でない間繰り返すnext を ? IteratorStepValue (iteratorRecord ) とする。next が done でなければcount ≥ 253 - 1 なら注: この段階に到達することは実用上想定されず、実装が「合理的なサイズ」の入力を仮定できるようにするためのみ存在する。 error を ThrowCompletion (新たに生成した RangeError オブジェクト) とする。? IteratorClose (iteratorRecord , error ) を返す。 next が Number でなければerror を ThrowCompletion (新たに生成した TypeError オブジェクト) とする。? IteratorClose (iteratorRecord , error ) を返す。 n を next とする。state が not-a-number でないならn が NaN ならstate を not-a-number に設定。Else if n が +∞ 𝔽 ならstate が minus-infinity なら state を not-a-number に設定。Else state を plus-infinity に設定。 Else if n が -∞ 𝔽 ならstate が plus-infinity なら state を not-a-number に設定。Else state を minus-infinity に設定。 Else if n が -0 𝔽 でなく、state が minus-zero または finite ならstate を finite に設定。sum を sum + ℝ (n ) に設定。 count を count + 1 に設定。state が not-a-number なら NaN を返す。state が plus-infinity なら +∞ 𝔽 を返す。state が minus-infinity なら -∞ 𝔽 を返す。state が minus-zero なら -0 𝔽 を返す。𝔽 (sum ) を返す。
Note
sum の値は任意精度演算なしに多様なアルゴリズムで計算可能である。例として Jonathan Richard Shewchuk による “Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates” の "Grow-Expansion" アルゴリズムがある。より新しい手法は "Fast exact summation using small and large superaccumulators " に示され、コードは https://gitlab.com/radfordneal/xsum で利用可能。
21.3.2.35 Math.tan ( x )
この関数は x の正接を返す。引数はラジアン。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN , +0 𝔽 , -0 𝔽 のいずれかなら n を返す。n が +∞ 𝔽 または -∞ 𝔽 なら NaN を返す。ℝ (n ) の正接を表す実装近似 Number 値を返す。
21.3.2.36 Math.tanh ( x )
この関数は x の双曲線正接を返す。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が NaN , +0 𝔽 , -0 𝔽 のいずれかなら n を返す。n が +∞ 𝔽 なら 1 𝔽 を返す。n が -∞ 𝔽 なら -1 𝔽 を返す。ℝ (n ) の双曲線正接を表す実装近似 Number 値を返す。
Note
Math.tanh(x)
の値は (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x))
と同じである。
21.3.2.37 Math.trunc ( x )
この関数は数 x の小数部分を取り除いた整数 部分を返す。x が既に整数 なら結果は x 。
呼び出されたとき次を実行する:
n を ? ToNumber (x ) とする。n が有限 でないか _n_ が +0 𝔽 または -0 𝔽 なら n を返す。n < 1 𝔽 かつ n > +0 𝔽 なら +0 𝔽 を返す。n < -0 𝔽 かつ n > -1 𝔽 なら -0 𝔽 を返す。+0 𝔽 方向で n に最も近い整数 Number を返す。
21.4 Date オブジェクト
21.4.1 Date オブジェクトの概要と抽象操作の定義
以下の抽象操作 は(21.4.1.1 で定義される)時間値 に対して動作する。いずれの場合も、これらの関数への引数のいずれかが NaN であれば、結果は NaN になることに注意。
21.4.1.1 時間値と時間範囲
ECMAScript における時間計測は POSIX における時間計測に類似し、とくに先発グレゴリオ暦(proleptic Gregorian calendar)、1970 年 1 月 1 日 UTC の開始時刻(真夜中)を エポック として定義し、1 日を正確に 86,400 秒(各秒は 1000 ミリ秒)とする会計的扱いを共有する。
ECMAScript の 時間値 は Number であり、ミリ秒精度での時点を表す有限 な整数 の Number か、特定の時点を表さない NaN のいずれかである。24 × 60 × 60 × 1000 = 86,400,000 の倍数(すなわちある整数 d について 86,400,000 × d )である時間値は、エポック から d 個の完全な UTC 日を経過した UTC 日の開始時点(d が負であればエポック より前)を表す。それ以外の有限 時間値 t は、その値以下で最大のかつ前述の倍数である時間値 s を基準とし、同一の UTC 日内で s の後に (t - s ) ミリ秒経過した時点を表す。
時間値は UTC のうるう秒を考慮しない—正のうるう秒内の瞬間を表す時間値は存在せず、負のうるう秒によって UTC タイムラインから除去された瞬間を表す時間値は存在する。それでもなお、時間値の定義は区分的に UTC と整合し、うるう秒境界のみ不連続で、それ以外では差はゼロである。
Number は -9,007,199,254,740,992 から 9,007,199,254,740,992 までのすべての整数 を正確に表現できる(21.1.2.8 および 21.1.2.6 )。時間値は -8,640,000,000,000,000 から 8,640,000,000,000,000 ミリ秒というやや小さい範囲をサポートする。これは 1970 年 1 月 1 日 UTC の真夜中を基準に正確に -100,000,000 日から 100,000,000 日の範囲を与える。
1970 年 1 月 1 日 UTC の開始時刻の正確な瞬間は時間値 +0 𝔽 で表される。
Note
先発グレゴリオ暦においてうるう年は、4 で割り切れ、かつ 400 で割り切れるか 100 で割り切れない年である。
先発グレゴリオ暦の 400 年周期には 97 のうるう年が含まれる。これは平均 365.2425 日/年(31,556,952,000 ミリ秒)となる。したがって Number がミリ秒精度で正確に表現できる最大範囲は 1970 年を基準に概ね -285,426 年から 285,426 年である。本節で規定される時間値がサポートするより小さい範囲はおよそ -273,790 年から 273,790 年である。
21.4.1.2 時間関連の定数
これらの定数は以下の節のアルゴリズムで参照される。
HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
msPerSecond = 1000 𝔽
21.4.1.3 Day ( t )
The abstract operation Day takes argument t (有限 な時間値 ) and returns 整数 の Number. t が属する日の通し日数(day number)を返す。 It performs the following steps when called:
𝔽 (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:
𝔽 (ℝ (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:
ry を ℝ (y ) とする。(ry modulo 400) = 0 なら 366 𝔽 を返す。 (ry modulo 100) = 0 なら 365 𝔽 を返す。 (ry modulo 4) = 0 なら 366 𝔽 を返す。 365 𝔽 を返す。
21.4.1.6 DayFromYear ( y )
The abstract operation DayFromYear takes argument y (整数 の Number) and returns 整数 の Number. 年 y の初日(1 月 1 日)の day number を返す。 It performs the following steps when called:
ry を ℝ (y ) とする。注: 以降の手順で numYears1 , numYears4 , numYears100 , numYears400 はエポック から年 y の開始までに含まれる、それぞれ 1, 4, 100, 400 で割り切れる年数を表す。y がエポック より前なら負の数。 numYears1 を (ry - 1970) とする。numYears4 を floor ((ry - 1969) / 4) とする。numYears100 を floor ((ry - 1901) / 100) とする。numYears400 を floor ((ry - 1601) / 400) とする。𝔽 (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:
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:
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:
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:
DaysInYear (YearFromTime (t )) が 366 𝔽 なら 1 𝔽 を返し、そうでなければ +0 𝔽 を返す。
21.4.1.11 MonthFromTime ( t )
The abstract operation MonthFromTime takes argument t (有限 な時間値 ) and returns +0 𝔽 から 11 𝔽 まで(両端含む)の整数 の Number. t が属する月を識別する Number を返す。+0 𝔽 は 1 月、1 𝔽 は 2 月、2 𝔽 は 3 月、3 𝔽 は 4 月、4 𝔽 は 5 月、5 𝔽 は 6 月、6 𝔽 は 7 月、7 𝔽 は 8 月、8 𝔽 は 9 月、9 𝔽 は 10 月、10 𝔽 は 11 月、11 𝔽 は 12 月を表す。MonthFromTime(+0 𝔽 ) = +0 𝔽 は 1970 年 1 月 1 日(木曜日)に対応する。 It performs the following steps when called:
inLeapYear を InLeapYear (t ) とする。dayWithinYear を DayWithinYear (t ) とする。dayWithinYear < 31 𝔽 なら +0 𝔽 を返す。dayWithinYear < 59 𝔽 + inLeapYear なら 1 𝔽 を返す。dayWithinYear < 90 𝔽 + inLeapYear なら 2 𝔽 を返す。dayWithinYear < 120 𝔽 + inLeapYear なら 3 𝔽 を返す。dayWithinYear < 151 𝔽 + inLeapYear なら 4 𝔽 を返す。dayWithinYear < 181 𝔽 + inLeapYear なら 5 𝔽 を返す。dayWithinYear < 212 𝔽 + inLeapYear なら 6 𝔽 を返す。dayWithinYear < 243 𝔽 + inLeapYear なら 7 𝔽 を返す。dayWithinYear < 273 𝔽 + inLeapYear なら 8 𝔽 を返す。dayWithinYear < 304 𝔽 + inLeapYear なら 9 𝔽 を返す。dayWithinYear < 334 𝔽 + inLeapYear なら 10 𝔽 を返す。事前条件: dayWithinYear < 365 𝔽 + inLeapYear 。 11 𝔽 を返す。
21.4.1.12 DateFromTime ( t )
The abstract operation DateFromTime takes argument t (有限 な時間値 ) and returns 1 𝔽 から 31 𝔽 まで(両端含む)の整数 の Number. t が属する月の日(day of month)を返す。 It performs the following steps when called:
inLeapYear を InLeapYear (t ) とする。dayWithinYear を DayWithinYear (t ) とする。month を MonthFromTime (t ) とする。month が +0 𝔽 なら dayWithinYear + 1 𝔽 を返す。month が 1 𝔽 なら dayWithinYear - 30 𝔽 を返す。month が 2 𝔽 なら dayWithinYear - 58 𝔽 - inLeapYear を返す。month が 3 𝔽 なら dayWithinYear - 89 𝔽 - inLeapYear を返す。month が 4 𝔽 なら dayWithinYear - 119 𝔽 - inLeapYear を返す。month が 5 𝔽 なら dayWithinYear - 150 𝔽 - inLeapYear を返す。month が 6 𝔽 なら dayWithinYear - 180 𝔽 - inLeapYear を返す。month が 7 𝔽 なら dayWithinYear - 211 𝔽 - inLeapYear を返す。month が 8 𝔽 なら dayWithinYear - 242 𝔽 - inLeapYear を返す。month が 9 𝔽 なら dayWithinYear - 272 𝔽 - inLeapYear を返す。month が 10 𝔽 なら dayWithinYear - 303 𝔽 - inLeapYear を返す。事前条件: month は 11 𝔽 。 dayWithinYear - 333 𝔽 - inLeapYear を返す。
21.4.1.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:
𝔽 (ℝ (Day (t ) + 4 𝔽 ) modulo 7) を返す。
21.4.1.14 HourFromTime ( t )
The abstract operation HourFromTime takes argument t (有限 な時間値 ) and returns +0 𝔽 から 23 𝔽 まで(両端含む)の整数 の Number. t が属する日の時(hour)を返す。 It performs the following steps when called:
𝔽 (floor (ℝ (t / msPerHour )) modulo HoursPerDay ) を返す。
21.4.1.15 MinFromTime ( t )
The abstract operation MinFromTime takes argument t (有限 な時間値 ) and returns +0 𝔽 から 59 𝔽 まで(両端含む)の整数 の Number. t が属する時間の分(minute)を返す。 It performs the following steps when called:
𝔽 (floor (ℝ (t / msPerMinute )) modulo MinutesPerHour ) を返す。
21.4.1.16 SecFromTime ( t )
The abstract operation SecFromTime takes argument t (有限 な時間値 ) and returns +0 𝔽 から 59 𝔽 まで(両端含む)の整数 の Number. t が属する分の秒(second)を返す。 It performs the following steps when called:
𝔽 (floor (ℝ (t / msPerSecond )) modulo SecondsPerMinute ) を返す。
21.4.1.17 msFromTime ( t )
The abstract operation msFromTime takes argument t (有限 な時間値 ) and returns +0 𝔽 から 999 𝔽 まで(両端含む)の整数 の Number. t が属する秒のミリ秒(millisecond)を返す。 It performs the following steps when called:
𝔽 (ℝ (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:
date を MakeDay (𝔽 (year ), 𝔽 (month - 1), 𝔽 (day )) とする。time を MakeTime (𝔽 (hour ), 𝔽 (minute ), 𝔽 (second ), 𝔽 (millisecond )) とする。ms を MakeDate (date , time ) とする。事前条件: ms は整数 の Number。 ℤ (ℝ (ms ) × 106 + microsecond × 103 + nanosecond ) を返す。
21.4.1.19 タイムゾーン識別子
ECMAScript におけるタイムゾーンは タイムゾーン識別子 により表され、これは 0x0000 から 0x007F(両端含む)のコードユニットのみから構成される文字列である。
ECMAScript 実装がサポートするタイムゾーンは、AvailableNamedTimeZoneIdentifiers が返す Time Zone Identifier Record の [[Identifier]] フィールドで表される 利用可能な名前付きタイムゾーン 、または IsTimeZoneOffsetString が true を返す文字列で表される オフセットタイムゾーン のいずれかであり得る。
一次タイムゾーン識別子 は、ある利用可能な名前付きタイムゾーンの推奨識別子である。
非一次タイムゾーン識別子 は、一次タイムゾーン識別子ではない利用可能な名前付きタイムゾーンの識別子である。
利用可能な名前付きタイムゾーン識別子 は一次または非一次のいずれかである。
各利用可能な名前付きタイムゾーン識別子は厳密に 1 つの名前付きタイムゾーンに対応し、
各利用可能な名前付きタイムゾーンは厳密に 1 つの一次タイムゾーン識別子と 0 個以上の非一次タイムゾーン識別子に対応する。
ECMAScript 実装は識別子 "UTC" を持つ利用可能な名前付きタイムゾーンをサポートしなければならず、これは UTC タイムゾーンの一次タイムゾーン識別子でなければならない。
さらに実装は他の任意個数の利用可能な名前付きタイムゾーンをサポートしてもよい。
ECMA-402 Internationalization API 仕様で記述されるタイムゾーン要件に従う実装は タイムゾーン対応 (time zone aware) と呼ばれる。
タイムゾーン対応実装は IANA Time Zone Database の Zone 名および Link 名に対応する利用可能な名前付きタイムゾーンをサポートし、かつそれらのみをサポートしなければならない。
タイムゾーン対応実装では、一次タイムゾーン識別子は Zone 名であり、非一次タイムゾーン識別子は Link 名である(ただし ECMA-402 仕様で規定される AvailableNamedTimeZoneIdentifiers により特に上書きされる場合を除く)。
IANA Time Zone Database 全体をサポートしない実装であっても、タイムゾーンを表す識別子として IANA Time Zone Database の名前を用いることが推奨される。
21.4.1.20 GetNamedTimeZoneEpochNanoseconds ( timeZoneIdentifier , year , month , day , hour , minute , second , millisecond , microsecond , nanosecond )
The implementation-defined abstract operation GetNamedTimeZoneEpochNanoseconds takes arguments timeZoneIdentifier (String), year (整数 ), month (1 から 12(両端含む)の整数 ), day (1 から 31(両端含む)の整数 ), hour (0 から 23(両端含む)の整数 ), minute (0 から 59(両端含む)の整数 ), second (0 から 59(両端含む)の整数 ), millisecond (0 から 999(両端含む)の整数 ), microsecond (0 から 999(両端含む)の整数 ), and nanosecond (0 から 999(両端含む)の整数 ) and returns BigInt の List .
返される List の各要素は、timeZoneIdentifier で識別される名前付きタイムゾーン内で、与えられた ISO 8601 暦日と壁時計時刻に対応する、エポック からのナノ秒数を表す。
入力が負のタイムゾーン遷移(例: 夏時間終了やルール変更によるオフセット減少)により複数回出現するローカル時刻を表す場合、返される List は複数要素を持ち、数値昇順で並ぶ。
入力が正のタイムゾーン遷移(例: 夏時間開始やルール変更によるオフセット増加)でスキップされるローカル時刻を表す場合、返される List は空となる。
それ以外の場合、返される List は 1 要素を持つ。
ローカルの政治的ルールをいかなるタイムゾーンについても含まない ECMAScript 実装で利用される GetNamedTimeZoneEpochNanoseconds のデフォルト実装は、呼び出されたとき次を行う:
事前条件: timeZoneIdentifier は "UTC" 。 epochNanoseconds を GetUTCEpochNanoseconds (year , month , day , hour , minute , second , millisecond , microsecond , nanosecond ) とする。« epochNanoseconds » を返す。
Note
タイムゾーン対応実装(および他のすべての実装にも推奨)は IANA Time Zone Database https://www.iana.org/time-zones/ のタイムゾーン情報を使用することが要求される。
2017 年 11 月 5 日の America/New_York における午前 1:30 は 2 回繰り返されるため、GetNamedTimeZoneEpochNanoseconds("America/New_York" , 2017, 11, 5, 1, 30, 0, 0, 0, 0) は長さ 2 の List を返し、最初の要素は 05:30 UTC(UTC-04:00 の米国東部夏時間の 01:30)を、第二の要素は 06:30 UTC(UTC-05:00 の米国東部標準時の 01:30)を表す。
2017 年 3 月 12 日の America/New_York における午前 2:30 は存在しないので、GetNamedTimeZoneEpochNanoseconds("America/New_York" , 2017, 3, 12, 2, 30, 0, 0, 0, 0) は空の List を返す。
21.4.1.21 GetNamedTimeZoneOffsetNanoseconds ( timeZoneIdentifier , epochNanoseconds )
The implementation-defined abstract operation GetNamedTimeZoneOffsetNanoseconds takes arguments timeZoneIdentifier (String) and epochNanoseconds (BigInt) and returns 整数 .
返される整数 は、timeZoneIdentifier で識別される名前付きタイムゾーンの、エポック からの epochNanoseconds が表す瞬間における UTC からのオフセット(いずれもナノ秒)を表す。
ローカルの政治的ルールをいかなるタイムゾーンについても含まない ECMAScript 実装で利用される GetNamedTimeZoneOffsetNanoseconds のデフォルト実装は、呼び出されたとき次を行う:
事前条件: timeZoneIdentifier は "UTC" 。 0 を返す。
Note
21.4.1.22 タイムゾーン識別子レコード
タイムゾーン識別子レコード は利用可能な名前付きタイムゾーン識別子 とその対応する一次タイムゾーン識別子 を記述するための Record である。
タイムゾーン識別子レコードは Table 62 に掲げるフィールドを持つ。
Table 62: タイムゾーン識別子レコード のフィールド
Note
[[Identifier]] が一次タイムゾーン識別子 である場合、[[Identifier]] は [[PrimaryIdentifier]] と等しい。
21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )
The implementation-defined abstract operation AvailableNamedTimeZoneIdentifiers takes no arguments and returns Time Zone Identifier Record の List .
戻り値はこの実装内のすべての利用可能な名前付きタイムゾーン識別子 と、それぞれに対応する一次タイムゾーン識別子 を記述する。
List は各 Time Zone Identifier Record の [[Identifier]] フィールド順に並ぶ。
タイムゾーン対応実装(ECMA-402 Internationalization API を実装するすべての実装を含む)は AvailableNamedTimeZoneIdentifiers 抽象操作 を ECMA-402 仕様に従って実装しなければならない。
タイムゾーン対応でない実装では、AvailableNamedTimeZoneIdentifiers は呼び出されたとき以下を行う:
実装がいかなるタイムゾーンについてもローカルの政治的ルールを含まないなら« Time Zone Identifier Record { [[Identifier]] : "UTC" , [[PrimaryIdentifier]] : "UTC" } » を返す。 identifiers を、重複しない利用可能な名前付きタイムゾーン識別子 の List (辞書式コードユニット順 にソート)とする。result を新しい空の List とする。identifiers の各要素 identifier について、primary を identifier とする。identifier がこの実装における非一次タイムゾーン識別子 でありかつ identifier が "UTC" でないならprimary を identifier に関連付けられた一次タイムゾーン識別子 に設定する。注: 実装は一次タイムゾーン識別子 を得るために identifier を反復的に解決する必要があるかもしれない。 record を Time Zone Identifier Record { [[Identifier]] : identifier , [[PrimaryIdentifier]] : primary } とする。record を result に追加する。事前条件: result は [[Identifier]] が "UTC" で [[PrimaryIdentifier]] が "UTC" である Time Zone Identifier Record r を含む。 result を返す。
21.4.1.24 SystemTimeZoneIdentifier ( )
The implementation-defined abstract operation SystemTimeZoneIdentifier takes no arguments and returns String.
ホスト環境 の現在のタイムゾーンを表す文字列を返す。それは IsTimeZoneOffsetString が true を返す UTC オフセットを表す文字列、または一次タイムゾーン識別子 のいずれかである。
It performs the following steps when called:
実装が UTC タイムゾーンのみをサポートするなら "UTC" を返す。 systemTimeZoneString をホスト環境 の現在のタイムゾーンを表す文字列(一次タイムゾーン識別子 またはオフセットタイムゾーン 識別子)とする。systemTimeZoneString を返す。
Note
Date オブジェクトのメソッドで一般的に提供される機能レベルを確実にするため、SystemTimeZoneIdentifier はホスト環境 のタイムゾーン設定に対応する IANA タイムゾーン名(存在するなら)を返すことが推奨される。
GetNamedTimeZoneEpochNanoseconds と GetNamedTimeZoneOffsetNanoseconds はそのタイムゾーンの標準時および夏時間のローカル政治的ルールを反映しなければならない(存在する場合)。
例えば、ホスト環境 がユーザが US Eastern Time を選択したシステム上のブラウザである場合、SystemTimeZoneIdentifier は "America/New_York" を返す。
21.4.1.25 LocalTime ( t )
The abstract operation LocalTime takes argument t (有限 な時間値 ) and returns 整数 の Number.
t を UTC からローカル時刻に変換する。
t に有効な標準時と夏時間のローカル政治的ルールを、この節で規定される方法で用いて結果を決定するべきである。
It performs the following steps when called:
systemTimeZoneIdentifier を SystemTimeZoneIdentifier () とする。IsTimeZoneOffsetString (systemTimeZoneIdentifier ) が true ならoffsetNs を ParseTimeZoneOffsetString (systemTimeZoneIdentifier ) とする。そうでなければ、offsetNs を GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier , ℤ (ℝ (t ) × 106 )) とする。 offsetMs を truncate (offsetNs / 106 ) とする。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 つの異なる入力時間値 t UTC が同じローカル時刻 tlocal に変換される。
LocalTime(UTC (t local )) は常に t local と等しいとは限らない。同様に UTC (LocalTime(t UTC )) も常に t UTC と等しいとは限らない。
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:
t が有限 でなければ NaN を返す。systemTimeZoneIdentifier を SystemTimeZoneIdentifier () とする。IsTimeZoneOffsetString (systemTimeZoneIdentifier ) が true ならoffsetNs を ParseTimeZoneOffsetString (systemTimeZoneIdentifier ) とする。そうでなければ、possibleInstants を GetNamedTimeZoneEpochNanoseconds (systemTimeZoneIdentifier , ℝ (YearFromTime (t )), ℝ (MonthFromTime (t )) + 1, ℝ (DateFromTime (t )), ℝ (HourFromTime (t )), ℝ (MinFromTime (t )), ℝ (SecFromTime (t )), ℝ (msFromTime (t )), 0, 0) とする。注: 以下の手順は t が負のタイムゾーン遷移(例: 夏時間終了やオフセット減少)で複数回繰り返されるローカル時刻、または正のタイムゾーン遷移(例: 夏時間開始やオフセット増加)でスキップされるローカル時刻を表すとき、t が遷移前のタイムゾーンオフセットを用いて解釈されることを保証する。 possibleInstants が空でなければdisambiguatedInstant を possibleInstants [0] とする。そうでなければ、注: t は正のタイムゾーン遷移(例: 夏時間開始やオフセット増加)でスキップされたローカル時刻を表す。 possibleInstantsBefore を GetNamedTimeZoneEpochNanoseconds (systemTimeZoneIdentifier , ℝ (YearFromTime (tBefore )), ℝ (MonthFromTime (tBefore )) + 1, ℝ (DateFromTime (tBefore )), ℝ (HourFromTime (tBefore )), ℝ (MinFromTime (tBefore )), ℝ (SecFromTime (tBefore )), ℝ (msFromTime (tBefore )), 0, 0) とし、ここで tBefore は possibleInstantsBefore が空でない最大の整数 Number かつ t より小さいもの(すなわち遷移直前の最後のローカル時刻)である。disambiguatedInstant を possibleInstantsBefore の最後の要素とする。 offsetNs を GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier , disambiguatedInstant ) とする。 offsetMs を truncate (offsetNs / 106 ) とする。t - 𝔽 (offsetMs ) を返す。
入力 t は名目上時間値 だが、任意の Number 値でよい。
アルゴリズムは t を時間値 範囲に制限してはならず、これにより時間値 範囲の境界に対応する入力がローカル UTC オフセットに関わらずサポート可能となる。
例えば最大時間値 は 8.64 × 1015 で "+275760-09-13T00:00:00Z" に対応する。
その瞬間にローカルタイムゾーンオフセットが UTC より 1 時間進んでいる環境では、より大きい入力 8.64 × 1015 + 3.6 × 106 で表され、"+275760-09-13T01:00:00+01:00" に対応する。
実装内にローカル時刻 t の政治的ルールが利用可能でない場合、SystemTimeZoneIdentifier が "UTC" を返し GetNamedTimeZoneOffsetNanoseconds が 0 を返すため、結果は t と同じになる。
Note 1
タイムゾーン対応実装(および他のすべての実装にも推奨)は IANA Time Zone Database https://www.iana.org/time-zones/ のタイムゾーン情報を使用することが要求される。
2017 年 11 月 5 日の America/New_York の午前 1:30 は 2 回繰り返される(秋の戻し)が、UTC(TimeClip (MakeDate (MakeDay (2017, 10, 5), MakeTime (1, 30, 0, 0)))) では offsetMs の値は -4 × msPerHour となり、1:30 AM UTC-04 として解釈されなければならない。
2017 年 3 月 12 日の America/New_York の午前 2:30 は存在しないが、2:30 AM UTC-05(3:30 AM UTC-04 と同等)として解釈されなければならない。
UTC(TimeClip (MakeDate (MakeDay (2017, 2, 12), MakeTime (2, 30, 0, 0)))) において offsetMs の値は -5 × msPerHour である。
Note 2
UTC(LocalTime (t UTC )) は常に t UTC と等しいとは限らない。同様に LocalTime (UTC(t local )) も常に t local と等しいとは限らない。
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:
hour が有限 でない、min が有限 でない、sec が有限 でない、または ms が有限 でないなら NaN を返す。h を 𝔽 (! ToIntegerOrInfinity (hour )) とする。m を 𝔽 (! ToIntegerOrInfinity (min )) とする。s を 𝔽 (! ToIntegerOrInfinity (sec )) とする。milli を 𝔽 (! ToIntegerOrInfinity (ms )) とする。((h × msPerHour + m × msPerMinute ) + s × msPerSecond ) + milli を返す。
Note
MakeTime の算術は浮動小数点算術であり結合的でないため、演算は正しい順序で行われなければならない。
21.4.1.28 MakeDay ( year , month , date )
The abstract operation MakeDay takes arguments year (Number), month (Number), and date (Number) and returns Number. 日数を計算する。 It performs the following steps when called:
year が有限 でない、month が有限 でない、または date が有限 でないなら NaN を返す。y を 𝔽 (! ToIntegerOrInfinity (year )) とする。m を 𝔽 (! ToIntegerOrInfinity (month )) とする。dt を 𝔽 (! ToIntegerOrInfinity (date )) とする。ym を y + 𝔽 (floor (ℝ (m ) / 12)) とする。ym が有限 でなければ NaN を返す。mn を 𝔽 (ℝ (m ) modulo 12) とする。YearFromTime (t ) が ym 、MonthFromTime (t ) が mn 、DateFromTime (t ) が 1 𝔽 である有限 の時間値 t を見つける。ただし(引数が範囲外であるなどにより)不可能なら NaN を返す。Day (t ) + dt - 1 𝔽 を返す。
21.4.1.29 MakeDate ( day , time )
The abstract operation MakeDate takes arguments day (Number) and time (Number) and returns Number. ミリ秒数を計算する。 It performs the following steps when called:
day が有限 でないまたは time が有限 でないなら NaN を返す。tv を day × msPerDay + time とする。tv が有限 でないなら NaN を返す。tv を返す。
21.4.1.30 MakeFullYear ( year )
The abstract operation MakeFullYear takes argument year (Number) and returns 整数 の Number または NaN . year の整数 部分に関連付けられた完全な年(full year)を返す。0 から 99(両端含む)の値は 1900 年の開始からの年数として解釈する。先発グレゴリオ暦との整合のため、「full year」は年 0(紀元前 1 年)の開始からの完了した年の符号付き個数と定義される。 It performs the following steps when called:
year が NaN なら NaN を返す。truncated を ! ToIntegerOrInfinity (year ) とする。truncated が 0 から 99(両端含む)なら 1900 𝔽 + 𝔽 (truncated ) を返す。𝔽 (truncated ) を返す。
21.4.1.31 TimeClip ( time )
The abstract operation TimeClip takes argument time (Number) and returns Number. ミリ秒数を計算する。 It performs the following steps when called:
time が有限 でなければ NaN を返す。abs (ℝ (time )) > 8.64 × 1015 なら NaN を返す。𝔽 (! ToIntegerOrInfinity (time )) を返す。
21.4.1.32 日時文字列フォーマット
ECMAScript は ISO 8601 暦日の拡張形式を単純化した日時の文字列交換フォーマットを定義する。形式は次のとおり: YYYY-MM-DDTHH:mm:ss.sssZ
要素の意味は以下のとおり:
YYYY
0000 から 9999 までの 4 桁の 10 進数、または "+" または "-" に続く 6 桁の 10 進数による 拡張年 としての先発グレゴリオ暦の年。
-
"-" (ハイフン)が文字列中に 2 回字義通りに現れる。
MM
01(1 月)から 12(12 月)までの 2 桁の 10 進数としての月。
DD
01 から 31 までの 2 桁の 10 進数としての月の日。
T
時刻要素の開始を示すために "T" が文字列中に字義通りに現れる。
HH
深夜から経過した完全な時数を 00 から 24 までの 2 桁の 10 進数で表したもの。
:
":" (コロン)が文字列中に 2 回字義通りに現れる。
mm
時の開始から経過した完全な分数を 00 から 59 までの 2 桁の 10 進数で表したもの。
ss
分の開始から経過した完全な秒数を 00 から 59 までの 2 桁の 10 進数で表したもの。
.
"." (ドット)が文字列中に字義通りに現れる。
sss
秒の開始から経過した完全なミリ秒数を 3 桁の 10 進数で表したもの。
Z
UTC オフセット表現。"Z" (UTC でオフセットなし)または "+" もしくは "-" に続く時刻表現 HH:mm
(タイムゾーンオフセット文字列形式 の部分集合で、UTC より進んでいる/遅れているローカル時刻を示す)
この形式には日付のみの形式も含まれる:
YYYY
YYYY-MM
YYYY-MM-DD
また、上記の日付のみの形式に続けて以下のいずれかの時刻形式(オプションの UTC オフセット表現付き)を直後に置いた “日時 (date-time)” 形式も含まれる:
THH:mm
THH:mm:ss
THH:mm:ss.sss
範囲外または不適合な要素を含む文字列はこの形式の有効なインスタンスではない。
Note 1
各日が深夜で始まり終わるため、2 つの深夜を区別するために 00:00
と 24:00
の 2 つの表記が利用可能である。これは 1995-02-04T24:00
と 1995-02-05T00:00
の 2 つの表記が正確に同一の時点を指すことを意味する。この後者形式を「暦日終端」と解釈することは ISO 8601 と整合している(同仕様では時間間隔の記述に予約され、単一時点の表現には許容されないが)。
Note 2
CET や EST などの市民タイムゾーン略称を規定する国際標準は存在せず、同じ略称が別の非常に異なるタイムゾーンに使われることもある。このため ISO 8601 と本形式はいずれもタイムゾーンオフセットの数値表現を規定する。
21.4.1.32.1 拡張年 (Expanded Years)
1 January 1970(21.4.1.1 )から約 273,790 年前後の時間値 範囲全体をカバーするには 0 より前または 9999 より後の年を表現する必要がある。ISO 8601 は年表現の拡張を許容するが、情報交換の当事者間の合意が必要である。単純化された ECMAScript 形式では、そのような拡張年表現は 6 桁であり、常に + または - の符号を前置する。年 0 は正とみなされ + 符号を前置しなければならない。年 0 を -000000 と表すことは無効である。拡張年が時間値 の範囲外の時点を表す 日時文字列形式 にマッチする文字列は Date.parse
によって認識不能として扱われ、実装依存の挙動やヒューリスティクスにフォールバックせず NaN を返す。
Note
拡張年を用いた日時(time values )の例:
-271821-04-20T00:00:00Z
271822 B.C.
-000001-01-01T00:00:00Z
2 B.C.
+000000-01-01T00:00:00Z
1 B.C.
+000001-01-01T00:00:00Z
1 A.D.
+001970-01-01T00:00:00Z
1970 A.D.
+002009-12-15T00:00:00Z
2009 A.D.
+275760-09-13T00:00:00Z
275760 A.D.
21.4.1.33 タイムゾーンオフセット文字列形式
ECMAScript は ISO 8601 に由来する UTC オフセットの文字列交換形式を定義する。
形式は以下の文法で記述される。
構文
UTCOffset :::
ASCIISign
Hour
ASCIISign
Hour
HourSubcomponents [+Extended]
ASCIISign
Hour
HourSubcomponents [~Extended]
ASCIISign ::: one of + -
Hour :::
0
DecimalDigit
1
DecimalDigit
20
21
22
23
HourSubcomponents [Extended] :::
TimeSeparator [?Extended]
MinuteSecond
TimeSeparator [?Extended]
MinuteSecond
TimeSeparator [?Extended]
MinuteSecond
TemporalDecimalFraction opt
TimeSeparator [Extended] ::: [+Extended]
:
[~Extended]
[empty]
MinuteSecond :::
0
DecimalDigit
1
DecimalDigit
2
DecimalDigit
3
DecimalDigit
4
DecimalDigit
5
DecimalDigit
TemporalDecimalFraction :::
TemporalDecimalSeparator
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator ::: one of . ,
21.4.1.33.1 IsTimeZoneOffsetString ( offsetString )
The abstract operation IsTimeZoneOffsetString takes argument offsetString (String) and returns Boolean. 戻り値は offsetString が UTCOffset の文法に適合するかどうかを示す。 It performs the following steps when called:
parseResult を ParseText(offsetString , UTCOffset ) とする。parseResult がエラーの List なら false を返す。true を返す。
21.4.1.33.2 ParseTimeZoneOffsetString ( offsetString )
The abstract operation ParseTimeZoneOffsetString takes argument offsetString (String) and returns 整数 . 戻り値は offsetString に対応する UTC オフセット(ナノ秒数)である。 It performs the following steps when called:
parseResult を ParseText(offsetString , UTCOffset ) とする。事前条件: parseResult はエラーの List ではない。 事前条件: parseResult は ASCIISign の構文ノード を含む。 parsedSign を parseResult に含まれる ASCIISign 構文ノード がマッチしたソーステキストとする。parsedSign が単一コードポイント U+002D (HYPHEN-MINUS) ならsign を -1 とする。そうでなければsign を 1 とする。 注: 以下の StringToNumber の適用は、各解析値が十分に短い 10 進数字列であることが保証されるため精度を失わない。 事前条件: parseResult は Hour 構文ノード を含む。 parsedHours を parseResult に含まれる Hour 構文ノード がマッチしたソーステキストとする。hours を ℝ (StringToNumber (CodePointsToString(parsedHours ))) とする。parseResult が MinuteSecond 構文ノード を含まないならminutes を 0 とする。そうでなければparsedMinutes を parseResult に含まれる最初の MinuteSecond 構文ノード がマッチしたソーステキストとする。minutes を ℝ (StringToNumber (CodePointsToString(parsedMinutes ))) とする。 parseResult が 2 つの MinuteSecond 構文ノード を含まないならseconds を 0 とする。そうでなければparsedSeconds を parseResult に含まれる 2 番目の MinuteSecond 構文ノード がマッチしたソーステキストとする。seconds を ℝ (StringToNumber (CodePointsToString(parsedSeconds ))) とする。 parseResult が TemporalDecimalFraction 構文ノード を含まないならnanoseconds を 0 とする。そうでなければparsedFraction を parseResult に含まれる TemporalDecimalFraction 構文ノード がマッチしたソーステキストとする。fraction を CodePointsToString(parsedFraction ) と "000000000" の文字列連結 とする。nanosecondsString を fraction の先頭から 10 文字の部分文字列 とする。nanoseconds を ℝ (StringToNumber (nanosecondsString )) とする。 sign × (((hours × 60 + minutes ) × 60 + seconds ) × 109 + nanoseconds ) を返す。
21.4.2 Date コンストラクター
Date コンストラクタ ー:
%Date% である。
グローバルオブジェクト の "Date" プロパティの初期値である。
コンストラクタ ーとして呼び出されたとき、新しい Date を作成し初期化する。
コンストラクタ ーではなく関数として呼び出された場合、現在の時刻(UTC)を表す文字列を返す。
引数の数や型によって動作が異なる関数である。
クラス定義の extends
節の値として利用できる。指定された Date の動作を継承したいサブクラスのコンストラクタ ーは、サブクラスインスタンスを [[DateValue]] 内部スロット付きで生成・初期化するために Date コンストラクタ ーへの super
呼び出しを含める必要がある。
21.4.2.1 Date ( ...values )
この関数は呼び出されたとき、以下の手順を実行する:
NewTarget が undefined ならnow を現在時刻(UTC)を示す時刻値とする。ToDateString (now ) を返す。 numberOfArgs を values の要素数とする。numberOfArgs = 0 の場合dv を現在時刻(UTC)を示す時刻値とする。numberOfArgs = 1 の場合value を values [0] とする。value がオブジェクトで [[DateValue]] 内部スロットを持つならtv を value .[[DateValue]] とする。それ以外の場合v を ? ToPrimitive(value ) とする。v が文字列ならばアサート: 次のステップで突然の完了になることはない(v は文字列)。 tv を parse
メソッド (21.4.3.2 ) と全く同じ方法で v を日付としてパースした結果とする。それ以外の場合tv を ? ToNumber (v ) とする。 dv を TimeClip (tv ) とする。それ以外の場合アサート: numberOfArgs ≥ 2。 y を ? ToNumber (values [0]) とする。m を ? ToNumber (values [1]) とする。numberOfArgs > 2 なら dt を ? ToNumber (values [2]); そうでなければ dt を 1 𝔽 とする。numberOfArgs > 3 なら h を ? ToNumber (values [3]); そうでなければ h を +0 𝔽 とする。numberOfArgs > 4 なら min を ? ToNumber (values [4]); そうでなければ min を +0 𝔽 とする。numberOfArgs > 5 なら s を ? ToNumber (values [5]); そうでなければ s を +0 𝔽 とする。numberOfArgs > 6 なら milli を ? ToNumber (values [6]); そうでなければ milli を +0 𝔽 とする。yr を MakeFullYear (y ) とする。finalDate を MakeDate (MakeDay (yr , m , dt ), MakeTime (h , min , s , milli )) とする。dv を TimeClip (UTC (finalDate )) とする。 O を ? OrdinaryCreateFromConstructor (NewTarget, "%Date.prototype%" , « [[DateValue]] ») とする。O .[[DateValue]] に dv を設定する。O を返す。
21.4.3 Date コンストラクターのプロパティ
Date コンストラクタ ー:
21.4.3.1 Date.now ( )
この関数は、呼び出し時点の UTC 日付と時刻を示す時刻値を返す。
21.4.3.2 Date.parse ( string )
この関数は引数に ToString 演算子を適用する。ToString の結果が突然の完了となった場合、その完了レコードを直ちに返す。それ以外の場合、この関数は得られた文字列を日付と時刻として解釈し、その日付と時刻に対応する UTC 時刻値(数値)を返す。文字列は内容に応じてローカル時刻、UTC、その他のタイムゾーンとして解釈されることがある。関数はまず Date Time String Format (21.4.1.32 ) および拡張年の形式に従ってパースを試みる。文字列がその形式に合致しない場合、実装依存のヒューリスティックや日付形式にフォールバックすることがある。判別できない、または範囲外の値を含む文字列は NaN を返す。
文字列が Date Time String Format に適合する場合、代替値が欠落した書式要素の代わりに用いられる。MM
や DD
要素が欠落している場合は "01" 、HH
, mm
, ss
要素が欠落している場合は "00" 、sss
要素がない場合は "000" 、UTC オフセット表現がない場合は日付のみの形式は UTC として、日付時刻形式はローカル時刻として解釈される。
ECMAScript の特定の実装において、任意の Date のミリ秒部分がゼロの場合、以下すべての式はその実装で同じ数値を生成するはずである(すべての参照プロパティが初期値ならば):
x.valueOf ()
Date .parse (x.toString ())
Date .parse (x.toUTCString ())
Date .parse (x.toISOString ())
ただし、次の式
Date .parse (x.toLocaleString ())
は前の3つの式と同じ数値を生成することは要求されず、一般にこの関数が Date Time String Format (21.4.1.32 ) に適合せず、その実装で toString
や toUTCString
メソッドによって生成できない任意の文字列を与えたときの値は実装依存である。
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 ] ] ] ] ] ] )
この関数は呼び出されたとき、以下の手順を実行する:
y を ? ToNumber (year ) とする。month が与えられていれば m を ? ToNumber (month ) とし、なければ m を +0 𝔽 とする。date が与えられていれば dt を ? ToNumber (date ) とし、なければ dt を 1 𝔽 とする。hours が与えられていれば h を ? ToNumber (hours ) とし、なければ h を +0 𝔽 とする。minutes が与えられていれば min を ? ToNumber (minutes ) とし、なければ min を +0 𝔽 とする。seconds が与えられていれば s を ? ToNumber (seconds ) とし、なければ s を +0 𝔽 とする。ms が与えられていれば milli を ? ToNumber (ms ) とし、なければ milli を +0 𝔽 とする。yr を MakeFullYear (y ) とする。TimeClip (MakeDate (MakeDay (yr , m , dt ), MakeTime (h , min , s , milli ))) を返す。
この関数の "length" プロパティは 7 𝔽 である。
Note
この関数は Date コンストラクタ ーと2つの点で異なる。数値として時刻値を返し、引数をローカル時刻ではなく UTC として解釈する。
21.4.4 Date プロトタイプオブジェクトのプロパティ
Date プロトタイプオブジェクト は:
%Date.prototype% である。
それ自体が通常のオブジェクトである。
Date インスタンスではなく [[DateValue]] 内部スロットを持たない。
[[Prototype]] 内部スロットの値は %Object.prototype% である。
特別に定義されていない限り、以下で定義される Date プロトタイプオブジェクトのメソッドはジェネリックではなく、this に渡される値は初期化済みの [[DateValue]] 内部スロットを持つオブジェクトでなければならない。
21.4.4.1 Date.prototype.constructor
Date.prototype.constructor
の初期値は %Date% である。
21.4.4.2 Date.prototype.getDate ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。DateFromTime (LocalTime (t )) を返す。
21.4.4.3 Date.prototype.getDay ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。WeekDay (LocalTime (t )) を返す。
21.4.4.4 Date.prototype.getFullYear ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。YearFromTime (LocalTime (t )) を返す。
21.4.4.5 Date.prototype.getHours ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。HourFromTime (LocalTime (t )) を返す。
21.4.4.6 Date.prototype.getMilliseconds ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。msFromTime (LocalTime (t )) を返す。
21.4.4.7 Date.prototype.getMinutes ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。MinFromTime (LocalTime (t )) を返す。
21.4.4.8 Date.prototype.getMonth ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。MonthFromTime (LocalTime (t )) を返す。
21.4.4.9 Date.prototype.getSeconds ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。SecFromTime (LocalTime (t )) を返す。
21.4.4.10 Date.prototype.getTime ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 dateObject .[[DateValue]] を返す。
21.4.4.11 Date.prototype.getTimezoneOffset ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。(t - LocalTime (t )) / msPerMinute を返す。
21.4.4.12 Date.prototype.getUTCDate ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。DateFromTime (t ) を返す。
21.4.4.13 Date.prototype.getUTCDay ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。WeekDay (t ) を返す。
21.4.4.14 Date.prototype.getUTCFullYear ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。YearFromTime (t ) を返す。
21.4.4.15 Date.prototype.getUTCHours ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。HourFromTime (t ) を返す。
21.4.4.16 Date.prototype.getUTCMilliseconds ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。msFromTime (t ) を返す。
21.4.4.17 Date.prototype.getUTCMinutes ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。MinFromTime (t ) を返す。
21.4.4.18 Date.prototype.getUTCMonth ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。MonthFromTime (t ) を返す。
21.4.4.19 Date.prototype.getUTCSeconds ( )
このメソッドは呼び出されると、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら NaN を返す。SecFromTime (t ) を返す。
21.4.4.20 Date.prototype.setDate ( date )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。dt を ? ToNumber (date ) とする。t が NaN なら、NaN を返す。t を LocalTime (t ) に設定する。newDate を MakeDate (MakeDay (YearFromTime (t ), MonthFromTime (t ), dt ), TimeWithinDay (t )) とする。u を TimeClip (UTC (newDate )) とする。dateObject .[[DateValue]] に u を設定する。u を返す。
21.4.4.21 Date.prototype.setFullYear ( year [ , month [ , date ] ] )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。y を ? ToNumber (year ) とする。t が NaN なら t を +0 𝔽 に設定し、そうでなければ LocalTime (t ) に設定する。month が存在しない場合、m を MonthFromTime (t ) とし、そうでなければ ? ToNumber (month ) とする。date が存在しない場合、dt を DateFromTime (t ) とし、そうでなければ ? ToNumber (date ) とする。newDate を MakeDate (MakeDay (y , m , dt ), TimeWithinDay (t )) とする。u を TimeClip (UTC (newDate )) とする。dateObject .[[DateValue]] に u を設定する。u を返す。
このメソッドの "length" プロパティは 3 𝔽 である。
Note
month が存在しない場合、このメソッドは getMonth()
の値が指定されたかのように振る舞う。date が存在しない場合は getDate()
の値が指定されたかのように振る舞う。
21.4.4.22 Date.prototype.setHours ( hour [ , min [ , sec [ , ms ] ] ] )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。h を ? ToNumber (hour ) とする。min が存在するなら m を ? ToNumber (min ) とする。sec が存在するなら s を ? ToNumber (sec ) とする。ms が存在するなら milli を ? ToNumber (ms ) とする。t が NaN なら NaN を返す。t を LocalTime (t ) に設定する。min が存在しない場合、m を MinFromTime (t ) とする。sec が存在しない場合、s を SecFromTime (t ) とする。ms が存在しない場合、milli を msFromTime (t ) とする。date を MakeDate (Day (t ), MakeTime (h , m , s , milli )) とする。u を TimeClip (UTC (date )) とする。dateObject .[[DateValue]] に u を設定する。u を返す。
このメソッドの "length" プロパティは 4 𝔽 である。
Note
min が存在しない場合、このメソッドは getMinutes()
の値が指定されたかのように振る舞う。sec が存在しない場合は getSeconds()
の値が指定されたかのように振る舞う。ms が存在しない場合は getMilliseconds()
の値が指定されたかのように振る舞う。
21.4.4.23 Date.prototype.setMilliseconds ( ms )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。ms を ? ToNumber (ms ) に設定する。t が NaN なら NaN を返す。t を LocalTime (t ) に設定する。time を MakeTime (HourFromTime (t ), MinFromTime (t ), SecFromTime (t ), ms ) とする。u を TimeClip (UTC (MakeDate (Day (t ), time ))) とする。dateObject .[[DateValue]] に u を設定する。u を返す。
21.4.4.24 Date.prototype.setMinutes ( min [ , sec [ , ms ] ] )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。m を ? ToNumber (min ) とする。sec が存在するなら s を ? ToNumber (sec ) とする。ms が存在するなら milli を ? ToNumber (ms ) とする。t が NaN なら NaN を返す。t を LocalTime (t ) に設定する。sec が存在しない場合、s を SecFromTime (t ) とする。ms が存在しない場合、milli を msFromTime (t ) とする。date を MakeDate (Day (t ), MakeTime (HourFromTime (t ), m , s , milli )) とする。u を TimeClip (UTC (date )) とする。dateObject .[[DateValue]] に u を設定する。u を返す。
このメソッドの "length" プロパティは 3 𝔽 である。
Note
sec が存在しない場合、このメソッドは getSeconds()
の値が指定されたかのように振る舞う。ms が存在しない場合は getMilliseconds()
の値が指定されたかのように振る舞う。
21.4.4.25 Date.prototype.setMonth ( month [ , date ] )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。m を ? ToNumber (month ) とする。date が存在するなら dt を ? ToNumber (date ) とする。t が NaN なら NaN を返す。t を LocalTime (t ) に設定する。date が存在しない場合、dt を DateFromTime (t ) とする。newDate を MakeDate (MakeDay (YearFromTime (t ), m , dt ), TimeWithinDay (t )) とする。u を TimeClip (UTC (newDate )) とする。dateObject .[[DateValue]] に u を設定する。u を返す。
このメソッドの "length" プロパティは 2 𝔽 である。
Note
date が存在しない場合、このメソッドは getDate()
の値が指定されたかのように振る舞う。
21.4.4.26 Date.prototype.setSeconds ( sec [ , ms ] )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。s を ? ToNumber (sec ) とする。ms が存在するなら milli を ? ToNumber (ms ) とする。t が NaN なら NaN を返す。t を LocalTime (t ) に設定する。ms が存在しない場合、milli を msFromTime (t ) とする。date を MakeDate (Day (t ), MakeTime (HourFromTime (t ), MinFromTime (t ), s , milli )) とする。u を TimeClip (UTC (date )) とする。dateObject .[[DateValue]] に u を設定する。u を返す。
このメソッドの "length" プロパティは 2 𝔽 である。
Note
ms が存在しない場合、このメソッドは getMilliseconds()
の値が指定されたかのように振る舞う。
21.4.4.27 Date.prototype.setTime ( time )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を ? ToNumber (time ) とする。v を TimeClip (t ) とする。dateObject .[[DateValue]] に v を設定する。v を返す。
21.4.4.28 Date.prototype.setUTCDate ( date )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。dt を ? ToNumber (date ) とする。t が NaN なら NaN を返す。newDate を MakeDate (MakeDay (YearFromTime (t ), MonthFromTime (t ), dt ), TimeWithinDay (t )) とする。v を TimeClip (newDate ) とする。dateObject .[[DateValue]] に v を設定する。v を返す。
21.4.4.29 Date.prototype.setUTCFullYear ( year [ , month [ , date ] ] )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。t が NaN なら t を +0 𝔽 に設定する。y を ? ToNumber (year ) とする。month が存在しない場合、m を MonthFromTime (t ) とし、そうでなければ ? ToNumber (month ) とする。date が存在しない場合、dt を DateFromTime (t ) とし、そうでなければ ? ToNumber (date ) とする。newDate を MakeDate (MakeDay (y , m , dt ), TimeWithinDay (t )) とする。v を TimeClip (newDate ) とする。dateObject .[[DateValue]] に v を設定する。v を返す。
このメソッドの "length" プロパティは 3 𝔽 である。
Note
month が存在しない場合、このメソッドは getUTCMonth()
の値が指定されたかのように振る舞う。date が存在しない場合は getUTCDate()
の値が指定されたかのように振る舞う。
21.4.4.30 Date.prototype.setUTCHours ( hour [ , min [ , sec [ , ms ] ] ] )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。h を ? ToNumber (hour ) とする。min が存在するなら m を ? ToNumber (min ) とする。sec が存在するなら s を ? ToNumber (sec ) とする。ms が存在するなら milli を ? ToNumber (ms ) とする。t が NaN なら NaN を返す。min が存在しない場合、m を MinFromTime (t ) とする。sec が存在しない場合、s を SecFromTime (t ) とする。ms が存在しない場合、milli を msFromTime (t ) とする。date を MakeDate (Day (t ), MakeTime (h , m , s , milli )) とする。v を TimeClip (date ) とする。dateObject .[[DateValue]] に v を設定する。v を返す。
このメソッドの "length" プロパティは 4 𝔽 である。
Note
min が存在しない場合、このメソッドは getUTCMinutes()
の値が指定されたかのように振る舞う。sec が存在しない場合は getUTCSeconds()
の値が指定されたかのように振る舞う。ms が存在しない場合は getUTCMilliseconds()
の値が指定されたかのように振る舞う。
21.4.4.31 Date.prototype.setUTCMilliseconds ( ms )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。ms を ? ToNumber (ms ) に設定する。t が NaN なら NaN を返す。time を MakeTime (HourFromTime (t ), MinFromTime (t ), SecFromTime (t ), ms ) とする。v を TimeClip (MakeDate (Day (t ), time )) とする。dateObject .[[DateValue]] に v を設定する。v を返す。
21.4.4.32 Date.prototype.setUTCMinutes ( min [ , sec [ , ms ] ] )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。m を ? ToNumber (min ) とする。sec が存在するなら s を ? ToNumber (sec ) とする。ms が存在するなら milli を ? ToNumber (ms ) とする。t が NaN なら NaN を返す。sec が存在しない場合、s を SecFromTime (t ) とする。ms が存在しない場合、milli を msFromTime (t ) とする。date を MakeDate (Day (t ), MakeTime (HourFromTime (t ), m , s , milli )) とする。v を TimeClip (date ) とする。dateObject .[[DateValue]] に v を設定する。v を返す。
このメソッドの "length" プロパティは 3 𝔽 である。
Note
sec が存在しない場合、このメソッドは getUTCSeconds()
の値が指定されたかのように振る舞う。ms が存在しない場合は getUTCMilliseconds()
の値が指定されたかのように振る舞う。
21.4.4.33 Date.prototype.setUTCMonth ( month [ , date ] )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。m を ? ToNumber (month ) とする。date が存在するなら dt を ? ToNumber (date ) とする。t が NaN なら NaN を返す。date が存在しない場合、dt を DateFromTime (t ) とする。newDate を MakeDate (MakeDay (YearFromTime (t ), m , dt ), TimeWithinDay (t )) とする。v を TimeClip (newDate ) とする。dateObject .[[DateValue]] に v を設定する。v を返す。
このメソッドの "length" プロパティは 2 𝔽 である。
Note
date が存在しない場合、このメソッドは getUTCDate()
の値が指定されたかのように振る舞う。
21.4.4.34 Date.prototype.setUTCSeconds ( sec [ , ms ] )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。s を ? ToNumber (sec ) とする。ms が存在するなら milli を ? ToNumber (ms ) とする。t が NaN なら NaN を返す。ms が存在しない場合、milli を msFromTime (t ) とする。date を MakeDate (Day (t ), MakeTime (HourFromTime (t ), MinFromTime (t ), s , milli )) とする。v を TimeClip (date ) とする。dateObject .[[DateValue]] に v を設定する。v を返す。
このメソッドの "length" プロパティは 2 𝔽 である。
Note
ms が存在しない場合、このメソッドは getUTCMilliseconds()
の値が指定されたかのように振る舞う。
21.4.4.35 Date.prototype.toDateString ( )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 tv を dateObject .[[DateValue]] とする。tv が NaN なら "Invalid Date" を返す。t を LocalTime (tv ) とする。DateString (t ) を返す。
21.4.4.36 Date.prototype.toISOString ( )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 tv を dateObject .[[DateValue]] とする。tv が NaN なら RangeError 例外をスローする。アサート: tv は整数 値である。 tv が Date Time String Format で表現できない年に該当するなら RangeError 例外をスローする。tv の Date Time String Format に従ったUTC時刻表現(全ての書式要素およびUTCオフセット "Z" を含む)を返す。
21.4.4.37 Date.prototype.toJSON ( key )
このメソッドは JSON.stringify
(25.5.2 ) で利用するための Date の文字列表現を提供する。
呼び出されると以下の手順を実行する:
O を ? ToObject (this の値) とする。tv を ? ToPrimitive(O , number ) とする。tv が数値かつ有限 でなければ null を返す。? Invoke(O , "toISOString" ) を返す。
Note 1
Note 2
このメソッドは意図的にジェネリックであり、this の値が Date であることを要求しない。そのため他のオブジェクトに転送してメソッドとして利用できる。ただしその場合、toISOString
メソッドが必要である。
21.4.4.38 Date.prototype.toLocaleDateString ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 Internationalization API を含む ECMAScript 実装はこのメソッドを ECMA-402 仕様に従って実装しなければならない。ECMA-402 API を含まない実装の場合、以下の仕様が用いられる:
このメソッドは文字列値を返す。その内容は実装定義 だが、現在のタイムゾーンにおける Date の「日付」部分をホスト環境 の現在のロケールの慣習に従った便利で人間に読みやすい形で表現することを意図している。
このメソッドのオプションパラメータの意味は ECMA-402 仕様で定義されている。ECMA-402 を含まない実装ではこれらのパラメータ位置を他の用途に使ってはならない。
21.4.4.39 Date.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 Internationalization API を含む ECMAScript 実装はこのメソッドを ECMA-402 仕様に従って実装しなければならない。ECMA-402 API を含まない実装の場合、以下の仕様が用いられる:
このメソッドは文字列値を返す。その内容は実装定義 だが、現在のタイムゾーンにおける Date をホスト環境 の現在のロケールの慣習に従った便利で人間に読みやすい形で表現することを意図している。
このメソッドのオプションパラメータの意味は ECMA-402 仕様で定義されている。ECMA-402 を含まない実装ではこれらのパラメータ位置を他の用途に使ってはならない。
21.4.4.40 Date.prototype.toLocaleTimeString ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 Internationalization API を含む ECMAScript 実装はこのメソッドを ECMA-402 仕様に従って実装しなければならない。ECMA-402 API を含まない実装の場合、以下の仕様が用いられる:
このメソッドは文字列値を返す。その内容は実装定義 だが、現在のタイムゾーンにおける Date の「時刻」部分をホスト環境 の現在のロケールの慣習に従った便利で人間に読みやすい形で表現することを意図している。
このメソッドのオプションパラメータの意味は ECMA-402 仕様で定義されている。ECMA-402 を含まない実装ではこれらのパラメータ位置を他の用途に使ってはならない。
21.4.4.41 Date.prototype.toString ( )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 tv を dateObject .[[DateValue]] とする。ToDateString (tv ) を返す。
Note 1
d.[[DateValue]]
が 1000 で割り切れる任意の Date d
について、Date.parse(d.toString())
の結果は d.valueOf()
と等しい。21.4.3.2 を参照。
Note 2
このメソッドはジェネリックではなく、this の値が Date でない場合は TypeError 例外をスローする。そのため他のオブジェクトに転送してメソッドとして利用することはできない。
21.4.4.41.1 TimeString ( tv )
The abstract operation TimeString takes argument tv (a Number, but not NaN ) and returns a String. It performs the following steps when called:
hour を ToZeroPaddedDecimalString (ℝ (HourFromTime (tv )), 2) とする。minute を ToZeroPaddedDecimalString (ℝ (MinFromTime (tv )), 2) とする。second を ToZeroPaddedDecimalString (ℝ (SecFromTime (tv )), 2) とする。hour , ":" , minute , ":" , second , コードユニット 0x0020 (スペース), "GMT" を連結した文字列を返す。
21.4.4.41.2 DateString ( tv )
The abstract operation DateString takes argument tv (a Number, but not NaN ) and returns a String. It performs the following steps when called:
weekday を Table 63 の WeekDay (tv ) の番号に対応する名前とする。month を Table 64 の MonthFromTime (tv ) の番号に対応する名前とする。day を ToZeroPaddedDecimalString (ℝ (DateFromTime (tv )), 2) とする。yv を YearFromTime (tv ) とする。yv が +0 𝔽 または yv > +0 𝔽 なら yearSign を空文字列に、そうでなければ "-" にする。paddedYear を ToZeroPaddedDecimalString (abs (ℝ (yv )), 4) とする。weekday , コードユニット 0x0020 (スペース), month , コードユニット 0x0020 (スペース), day , コードユニット 0x0020 (スペース), yearSign , paddedYear を連結した文字列を返す。
Table 63: 曜日名
Number
Name
+0 𝔽
"Sun"
1 𝔽
"Mon"
2 𝔽
"Tue"
3 𝔽
"Wed"
4 𝔽
"Thu"
5 𝔽
"Fri"
6 𝔽
"Sat"
Table 64: 月名
Number
Name
+0 𝔽
"Jan"
1 𝔽
"Feb"
2 𝔽
"Mar"
3 𝔽
"Apr"
4 𝔽
"May"
5 𝔽
"Jun"
6 𝔽
"Jul"
7 𝔽
"Aug"
8 𝔽
"Sep"
9 𝔽
"Oct"
10 𝔽
"Nov"
11 𝔽
"Dec"
21.4.4.41.3 TimeZoneString ( tv )
The abstract operation TimeZoneString takes argument tv (an integral Number) and returns a String. It performs the following steps when called:
systemTimeZoneIdentifier を SystemTimeZoneIdentifier () とする。IsTimeZoneOffsetString (systemTimeZoneIdentifier ) が true ならoffsetNs を ParseTimeZoneOffsetString (systemTimeZoneIdentifier ) とする。それ以外の場合offsetNs を GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier , ℤ (ℝ (tv ) × 106 )) とする。 offset を 𝔽 (truncate (offsetNs / 106 )) とする。offset が +0 𝔽 または offset > +0 𝔽 ならoffsetSign を "+" とする。absOffset を offset とする。それ以外の場合offsetSign を "-" とする。absOffset を -offset とする。 offsetMin を ToZeroPaddedDecimalString (ℝ (MinFromTime (absOffset )), 2) とする。offsetHour を ToZeroPaddedDecimalString (ℝ (HourFromTime (absOffset )), 2) とする。tzName を空文字列またはコードユニット 0x0020 (スペース)、0x0028 (左括弧)、実装定義 のタイムゾーン名、0x0029 (右括弧) を連結した文字列のいずれかとする。offsetSign , offsetHour , offsetMin , tzName を連結した文字列を返す。
21.4.4.41.4 ToDateString ( tv )
The abstract operation ToDateString takes argument tv (an integral Number or NaN ) and returns a String. It performs the following steps when called:
tv が NaN なら "Invalid Date" を返す。t を LocalTime (tv ) とする。DateString (t )、コードユニット 0x0020 (スペース)、TimeString (t )、TimeZoneString (tv ) を連結した文字列を返す。
21.4.4.42 Date.prototype.toTimeString ( )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 tv を dateObject .[[DateValue]] とする。tv が NaN なら "Invalid Date" を返す。t を LocalTime (tv ) とする。TimeString (t ) と TimeZoneString (tv ) を連結した文字列を返す。
21.4.4.43 Date.prototype.toUTCString ( )
このメソッドは this 値に対応する時点を表す文字列値を返す。文字列の形式は RFC 7231 の "HTTP-date" をベースとし、ECMAScript Dates でサポートされる全範囲の時刻を一般化している。
呼び出されると以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 tv を dateObject .[[DateValue]] とする。tv が NaN なら "Invalid Date" を返す。weekday を Table 63 の WeekDay (tv ) の番号に対応する名前とする。month を Table 64 の MonthFromTime (tv ) の番号に対応する名前とする。day を ToZeroPaddedDecimalString (ℝ (DateFromTime (tv )), 2) とする。yv を YearFromTime (tv ) とする。yv が +0 𝔽 または yv > +0 𝔽 なら yearSign を空文字列に、そうでなければ "-" にする。paddedYear を ToZeroPaddedDecimalString (abs (ℝ (yv )), 4) とする。weekday , "," , コードユニット 0x0020 (スペース), day , コードユニット 0x0020 (スペース), month , コードユニット 0x0020 (スペース), yearSign , paddedYear , コードユニット 0x0020 (スペース), TimeString (tv ) を連結した文字列を返す。
21.4.4.44 Date.prototype.valueOf ( )
このメソッドは呼び出された時、以下の手順を実行する:
dateObject を this の値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 dateObject .[[DateValue]] を返す。
21.4.4.45 Date.prototype [ %Symbol.toPrimitive% ] ( hint )
このメソッドは ECMAScript の演算子によって Date をプリミティブ値へ変換するために呼び出される。hint の許可される値は "default" 、"number" 、"string" である。Date は組み込み ECMAScript オブジェクトの中で唯一 "default" を "string" と同等に扱う。他の組み込みオブジェクトは "default" を "number" と同等に扱う。
呼び出されると以下の手順を実行する:
O を this の値とする。O がオブジェクトでなければ TypeError 例外をスローする。hint が "string" または "default" ならtryFirst を string とする。それ以外で hint が "number" ならtryFirst を number とする。 それ以外の場合TypeError 例外をスローする。 ? OrdinaryToPrimitive (O , tryFirst ) を返す。
このプロパティの属性は { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } である。
このメソッドの "name" プロパティの値は "[Symbol.toPrimitive]" である。
21.4.5 Date インスタンスのプロパティ
Date インスタンスは Date プロトタイプオブジェクト からプロパティを継承する通常のオブジェクトである。Date インスタンスは [[DateValue]] 内部スロットも持ち、[[DateValue]] 内部スロットはこの Date が表す時刻値である。
22 テキスト処理
22.1 String オブジェクト
22.1.1 String コンストラクター
String コンストラクタ ー:
%String% である。
グローバルオブジェクト の "String" プロパティの初期値である。
コンストラクタ ーとして呼び出されたとき、新しい String オブジェクトを生成し初期化する。
コンストラクタ ーではなく関数として呼び出されたとき、型変換を行う。
クラス定義の extends
句の値として利用できる。指定された String の挙動を継承したいサブクラスのコンストラクタ ーは、サブクラスインスタンスを [[StringData]] 内部スロット付きで生成・初期化するために String コンストラクタ ーへの super
呼び出しを含めなければならない。
22.1.1.1 String ( value )
この関数は呼び出されたとき以下の手順を実行する:
value が存在しないならs を空文字列とする。それ以外の場合、NewTarget が undefined で かつ value が Symbol なら、SymbolDescriptiveString (value ) を返す。 s を ? ToString (value ) とする。 NewTarget が undefined なら s を返す。 StringCreate (s , ? GetPrototypeFromConstructor (NewTarget, "%String.prototype%" )) を返す。
22.1.2 String コンストラクターのプロパティ
String コンストラクタ ー:
22.1.2.1 String.fromCharCode ( ...codeUnits )
この関数は残余引数 codeUnits を構成する任意個の引数で呼び出すことができる。
呼び出されたとき以下を行う:
result を空文字列とする。codeUnits の各要素 next についてnextCU を ℝ (? ToUint16 (next )) の数値を持つコードユニットとする。result を result と nextCU の文字列連結 とする。result を返す。
この関数の "length" プロパティは 1 𝔽 である。
22.1.2.2 String.fromCodePoint ( ...codePoints )
この関数は残余引数 codePoints を構成する任意個の引数で呼び出すことができる。
呼び出されたとき以下を行う:
result を空文字列とする。codePoints の各要素 next についてnextCP を ? ToNumber (next ) とする。nextCP が整数 Number でなければ RangeError 例外を投げる。ℝ (nextCP ) < 0 または ℝ (nextCP ) > 0x10FFFF なら RangeError 例外を投げる。result を result と UTF16EncodeCodePoint(ℝ (nextCP )) の文字列連結 とする。アサート: codePoints が空なら result は空文字列。 result を返す。
この関数の "length" プロパティは 1 𝔽 である。
22.1.2.3 String.prototype
String.prototype
の初期値は String プロトタイプオブジェクト である。
このプロパティの属性は { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } である。
22.1.2.4 String.raw ( template , ...substitutions )
この関数は可変個の引数で呼び出される。最初の引数が template 、残りがリスト substitutions を構成する。
呼び出されたとき以下を行う:
substitutionCount を substitutions の要素数とする。cooked を ? ToObject (template ) とする。literals を ? ToObject (? Get (cooked , "raw" )) とする。literalCount を ? LengthOfArrayLike (literals ) とする。literalCount ≤ 0 なら空文字列を返す。R を空文字列とする。nextIndex を 0 とする。繰り返し、nextLiteralVal を ? Get (literals , ! ToString (𝔽 (nextIndex ))) とする。nextLiteral を ? ToString (nextLiteralVal ) とする。R を R と nextLiteral の文字列連結 とする。nextIndex + 1 = literalCount なら R を返す。nextIndex < substitutionCount ならnextSubVal を substitutions [nextIndex ] とする。nextSub を ? ToString (nextSubVal ) とする。R を R と nextSub の文字列連結 とする。nextIndex を nextIndex + 1 とする。
Note
この関数はタグ付きテンプレート (13.3.11 ) のタグ関数として使用することを意図している。その場合最初の引数は正しく整形されたテンプレートオブジェクトであり、残りが置換値となる。
22.1.3 String プロトタイプオブジェクトのプロパティ
String プロトタイプオブジェクト は以下を満たす:
%String.prototype% である。
String エキゾチックオブジェクト であり、そのようなオブジェクトに規定された内部メソッドを持つ。
値が空文字列の [[StringData]] 内部スロットを持つ。
初期値 +0 𝔽 の "length" プロパティを持ち、その属性は { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } である。
[[Prototype]] 内部スロットの値は %Object.prototype% である。
特に明記されない限り、以下で定義される String プロトタイプオブジェクトのメソッドはジェネリックではなく、渡される this 値は String 値か、String 値に初期化された [[StringData]] 内部スロットを持つオブジェクトでなければならない。
22.1.3.1 String.prototype.at ( index )
O を this の値とする。? RequireObjectCoercible (O ) を実行する。 S を ? ToString (O ) とする。len を S の長さとする。relativeIndex を ? ToIntegerOrInfinity (index ) とする。relativeIndex ≥ 0 ならk を relativeIndex とする。それ以外ならk を len + relativeIndex とする。 k < 0 または k ≥ len なら undefined を返す。S の k から k + 1 までの部分文字列 を返す。
22.1.3.2 String.prototype.charAt ( pos )
Note 1
このメソッドは、このオブジェクトを String に変換した値のインデックス pos にあるコードユニットを含む 1 文字の String を返す。その位置に要素がなければ結果は空文字列となる。結果は String オブジェクトではなく String 値である。
pos
が整数 Number なら x.charAt(pos)
の結果は x.substring(pos, pos + 1)
の結果と等価である。
呼び出し時に以下を行う:
O を this の値とする。? RequireObjectCoercible (O )。 S を ? ToString (O ) とする。position を ? ToIntegerOrInfinity (pos ) とする。size を S の長さとする。position < 0 または position ≥ size なら空文字列を返す。S の position から position + 1 までの部分文字列 を返す。
Note 2
このメソッドは意図的にジェネリックであり、this が String オブジェクトであることを要求しない。そのため他のオブジェクトへ転用できる。
22.1.3.3 String.prototype.charCodeAt ( pos )
Note 1
このメソッドは、このオブジェクトを String に変換した結果内のインデックス pos のコードユニットの数値 (0 以上 216 未満の整数 Number) を返す。その位置に要素がなければ NaN を返す。
呼び出し時に以下を行う:
O を this の値とする。? RequireObjectCoercible (O )。 S を ? ToString (O ) とする。position を ? ToIntegerOrInfinity (pos ) とする。size を S の長さとする。position < 0 または position ≥ size なら NaN を返す。S のインデックス position のコードユニットの数値を表す Number を返す。
Note 2
このメソッドは意図的にジェネリックであり、this が String オブジェクトであることを要求しない。
22.1.3.4 String.prototype.codePointAt ( pos )
Note 1
このメソッドは 0x10FFFF 𝔽 以下の非負整数 Number を返し、これはこのオブジェクトを String に変換した結果のインデックス pos で始まる UTF-16 エンコードされたコードポイント (6.1.4 ) の数値である。その位置に要素がなければ undefined を返す。pos で有効なサロゲートペア が開始しなければ、その位置のコードユニットを返す。
呼び出し時の手順:
O を this の値とする。? RequireObjectCoercible (O )。 S を ? ToString (O ) とする。position を ? ToIntegerOrInfinity (pos ) とする。size を S の長さとする。position < 0 または position ≥ size なら undefined を返す。cp を CodePointAt(S , position ) とする。𝔽 (cp .[[CodePoint]] ) を返す。
Note 2
このメソッドはジェネリックであり他オブジェクトに転用可能。
22.1.3.5 String.prototype.concat ( ...args )
Note 1
このメソッドは this の値 (String に変換) のコードユニットに、各引数を String に変換した結果のコードユニットを順に連結した String 値を返す。結果は String オブジェクトではなく String 値。
呼び出し時:
O を this の値とする。? RequireObjectCoercible (O )。 S を ? ToString (O ) とする。R を S とする。args の各要素 next についてnextString を ? ToString (next ) とする。R を R と nextString の文字列連結 とする。R を返す。
このメソッドの "length" は 1 𝔽 。
Note 2
22.1.3.6 String.prototype.constructor
String.prototype.constructor
の初期値は %String% である。
22.1.3.7 String.prototype.endsWith ( searchString [ , endPosition ] )
呼び出し時の手順:
O を this の値とする。? RequireObjectCoercible (O )。 S を ? ToString (O ) とする。isRegExp を ? IsRegExp (searchString ) とする。isRegExp が true なら TypeError を投げる。searchStr を ? ToString (searchString ) とする。len を S の長さとする。endPosition が undefined なら pos を len とし、そうでなければ pos を ? ToIntegerOrInfinity (endPosition ) とする。end を pos を 0 と len の間にクランプした結果とする。searchLength を searchStr の長さとする。searchLength = 0 なら true を返す。start を end - searchLength とする。start < 0 なら false を返す。substring を S の start から end の部分文字列 とする。substring が searchStr なら true を返す。false を返す。
Note 1
endPosition - length(this) から始まる対応するコードユニット列が一致すれば true 。
Note 2
最初の引数が RegExp の場合に例外を投げるのは将来の拡張余地のため。
Note 3
22.1.3.8 String.prototype.includes ( searchString [ , position ] )
呼び出し時:
O を this の値。? RequireObjectCoercible (O )。 S を ? ToString (O )。isRegExp を ? IsRegExp (searchString )。isRegExp が true なら TypeError 。searchStr を ? ToString (searchString )。pos を ? ToIntegerOrInfinity (position )。アサート: position が undefined なら pos は 0。 len を S の長さ。start を pos を 0 と len の間にクランプした結果。index を StringIndexOf (S , searchStr , start )。index が not-found なら false 。true を返す。
Note 1
position 以上の位置で searchString が部分文字列 として現れれば true 。
Note 2
RegExp の場合例外を投げる理由は将来拡張のため。
Note 3
22.1.3.9 String.prototype.indexOf ( searchString [ , position ] )
Note 1
position 以上で最初に現れるインデックスを返し、存在しなければ -1 𝔽 。position が undefined なら +0 𝔽 。
手順:
O を this 。? RequireObjectCoercible (O )。 S を ? ToString (O )。searchStr を ? ToString (searchString )。pos を ? ToIntegerOrInfinity (position )。アサート: position が undefined なら pos は 0。 len を S の長さ。start を pos を 0 と len の間にクランプした結果。result を StringIndexOf (S , searchStr , start )。result が not-found なら -1 𝔽 を返す。𝔽 (result ) を返す。
Note 2
22.1.3.10 String.prototype.isWellFormed ( )
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 S を ? ToString (O )。IsStringWellFormedUnicode(S ) を返す。
22.1.3.11 String.prototype.lastIndexOf ( searchString [ , position ] )
Note 1
position 以下で最後に現れるインデックスを返し、存在しなければ -1 𝔽 。position が undefined なら文字列長を仮定。
手順:
O を this 。? RequireObjectCoercible (O )。 S を ? ToString (O )。searchStr を ? ToString (searchString )。numPos を ? ToNumber (position )。アサート: position が undefined なら numPos は NaN 。 numPos が NaN なら pos を +∞ とし、そうでなければ pos を ! ToIntegerOrInfinity (numPos )。len を S の長さ。searchLen を searchStr の長さ。start を pos を 0 と len - searchLen の間にクランプ。result を StringLastIndexOf (S , searchStr , start )。result が not-found なら -1 𝔽 。𝔽 (result ) を返す。
Note 2
22.1.3.12 String.prototype.localeCompare ( that [ , reserved1 [ , reserved2 ] ] )
ECMA-402 国際化 API を含む実装は ECMA-402 の規定に従う。含まない実装では次を用いる:
このメソッドは this 値 (String に変換した S ) と that (String に変換した thatValue ) のロケール依存比較の結果を NaN 以外の Number で返す。結果はホスト環境 の現在のロケールの慣習に従うソート順 を表し、S が thatValue の前なら負、後なら正、その他は 0(順序なし)となる。
比較の前に以下を行う:
O を this 。? RequireObjectCoercible (O )。 S を ? ToString (O )。thatValue を ? ToString (that )。
第2・第3引数の意味は ECMA-402 仕様に定義され、未実装の場合他用途に用いてはならない。
実際の戻り値は追加情報符号化のため実装定義 だが、このメソッドは全 String 上の全順序を与える一貫した比較子でなければならず、Unicode 標準の正規等価性を尊重し、正規等価な区別可能文字列の比較で +0 𝔽 を返さねばならない。
Note 1
2 引数関数を要求する Array.prototype.sort
の引数に直接適切ではない。
Note 2
このメソッドはホスト環境 の言語・ロケール機能を利用し得るが、常に Unicode の正規等価性を尊重する必要がある。以下はすべて +0 𝔽 を返さねばならない例である:
"\u212B" .localeCompare ("A\u030A" )
"\u2126" .localeCompare ("\u03A9" )
"\u1E69" .localeCompare ("s\u0307\u0323" )
"\u1E0B\u0323" .localeCompare ("\u1E0D\u0307" )
"\u1100\u1161" .localeCompare ("\uAC00" )
正規等価性の定義と議論は Unicode Standard 2章・3章、UAX #15 、UTN #5 、および UTS #10 を参照。
Unicode 互換等価や互換分解は尊重しないことが推奨される。
Note 3
22.1.3.13 String.prototype.match ( regexp )
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 regexp が undefined でも null でもないならmatcher を ? GetMethod (regexp , %Symbol.match% )。matcher が undefined でなければ? Call(matcher , regexp , « O ») を返す。 S を ? ToString (O )。rx を ? RegExpCreate (regexp , undefined )。? Invoke(rx , %Symbol.match% , « S ») を返す。
Note
22.1.3.14 String.prototype.matchAll ( regexp )
このメソッドは this を表す String に対して regexp で正規表現マッチを行い、マッチ結果を生成するイテレータを返す。各結果は最初の要素にマッチ全体、その後にキャプチャグループを含む配列。マッチしなければ結果を生成しない。
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 regexp が undefined でも null でもないならisRegExp を ? IsRegExp (regexp )。isRegExp が true ならflags を ? Get (regexp , "flags" )。? RequireObjectCoercible (flags )。 ? ToString (flags ) が "g" を含まなければ TypeError 。 matcher を ? GetMethod (regexp , %Symbol.matchAll% )。matcher が undefined でなければ? Call(matcher , regexp , « O ») を返す。 S を ? ToString (O )。rx を ? RegExpCreate (regexp , "g" )。? Invoke(rx , %Symbol.matchAll% , « S ») を返す。
Note 1 このメソッドはジェネリックで、this が String オブジェクトである必要はない。
Note 2 String.prototype.split
と同様に通常入力を破壊しないよう設計されている。
22.1.3.15 String.prototype.normalize ( [ form ] )
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 S を ? ToString (O )。form が undefined なら f を "NFC" とする。それ以外なら f を ? ToString (form )。 f が "NFC" , "NFD" , "NFKC" , "NFKD" のいずれでもなければ RangeError 。ns を最新の Unicode Standard の正規化 (Normalization Forms) に従い S を f 指定の正規形に変換した String 値とする。ns を返す。
Note
22.1.3.16 String.prototype.padEnd ( maxLength [ , fillString ] )
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 ? StringPaddingBuiltinsImpl (O , maxLength , fillString , end ) を返す。
22.1.3.17 String.prototype.padStart ( maxLength [ , fillString ] )
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 ? StringPaddingBuiltinsImpl (O , maxLength , fillString , start ) を返す。
22.1.3.17.1 StringPaddingBuiltinsImpl ( O , maxLength , fillString , placement )
The abstract operation StringPaddingBuiltinsImpl takes arguments O (an ECMAScript language value), maxLength (an ECMAScript language value), fillString (an ECMAScript language value), and placement (start or end ) and returns either a normal completion containing a String or a throw completion . It performs the following steps when called:
S を ? ToString (O )。intMaxLength を ℝ (? ToLength (maxLength ))。stringLength を S の長さ。intMaxLength ≤ stringLength なら S を返す。fillString が undefined なら fillString をコードユニット 0x0020 (SPACE) のみからなる String とする。それ以外なら fillString を ? ToString (fillString )。 StringPad (S , intMaxLength , fillString , placement ) を返す。
22.1.3.17.2 StringPad ( S , maxLength , fillString , placement )
The abstract operation StringPad takes arguments S (a String), maxLength (a non-negative integer), fillString (a String), and placement (start or end ) and returns a String. It performs the following steps when called:
stringLength を S の長さ。maxLength ≤ stringLength なら S 。fillString が空文字列なら S 。fillLen を maxLength - stringLength 。truncatedStringFiller を fillString を繰り返し連結し長さ fillLen に切り詰めた String。placement が start なら truncatedStringFiller と S の連結を返す。それ以外は S と truncatedStringFiller の連結を返す。
Note 1
maxLength は S の長さ未満にならないようクランプされる。
Note 2
fillString の既定は " " (0x0020 SPACE)。
22.1.3.17.3 ToZeroPaddedDecimalString ( n , minLength )
The abstract operation ToZeroPaddedDecimalString takes arguments n (a non-negative integer) and minLength (a non-negative integer) and returns a String. It performs the following steps when called:
S を n を 10 進数表記した文字列表現。StringPad (S , minLength , "0" , start ) を返す。
22.1.3.18 String.prototype.repeat ( count )
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 S を ? ToString (O )。n を ? ToIntegerOrInfinity (count )。n < 0 または n = +∞ なら RangeError 。n = 0 なら空文字列。S を n 回連結した String を返す。
Note 1
this の値を繰り返したコードユニット列を生成。
Note 2
22.1.3.19 String.prototype.replace ( searchValue , replaceValue )
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 searchValue が undefined でも null でもないならreplacer を ? GetMethod (searchValue , %Symbol.replace% )。replacer が undefined でなければ? Call(replacer , searchValue , « O , replaceValue ») を返す。 string を ? ToString (O )。searchString を ? ToString (searchValue )。functionalReplace を IsCallable (replaceValue )。functionalReplace が false ならreplaceValue を ? ToString (replaceValue ) に設定。searchLength を searchString の長さ。position を StringIndexOf (string , searchString , 0)。position が not-found なら string を返す。preceding を string の 0 から position まで。following を string の position + searchLength 以降。functionalReplace が true ならreplacement を ? ToString (? Call(replaceValue , undefined , « searchString , 𝔽 (position ), string »))。それ以外アサート: replaceValue は String。 captures を空リスト。replacement を ! GetSubstitution (searchString , string , position , captures , undefined , replaceValue )。 preceding , replacement , following を連結して返す。
Note
22.1.3.19.1 GetSubstitution ( matched , str , position , captures , namedCaptures , replacementTemplate )
The abstract operation GetSubstitution takes arguments matched (a String), str (a String), position (a non-negative integer), captures (a List of either Strings or undefined ), namedCaptures (an Object or undefined ), and replacementTemplate (a String) and returns either a normal completion containing a String or a throw completion . この抽象操作 において decimal digit は 0x0030 (DIGIT ZERO) から 0x0039 (DIGIT NINE) までのコードユニット。 It performs the following steps when called:
stringLength を str の長さ。アサート: position ≤ stringLength 。 result を空文字列。templateRemainder を replacementTemplate 。templateRemainder が空文字列でない間繰り返し、注記: 以下の手順で接頭辞 ref を分離し、その置換 refReplacement を決定し result に追加する。 templateRemainder が "$$" で始まるならref を "$$" 。refReplacement を "$" 。それ以外で "$`" で始まるならref を "$`" 。refReplacement を str の 0 から position まで。 それ以外で "$&" で始まるならref を "$&" 。refReplacement を matched 。 それ以外で "$'" (0x0024 + 0x0027) で始まるならref を "$'" 。matchLength を matched の長さ。tailPos を position + matchLength 。refReplacement を str の min (tailPos , stringLength ) から末尾まで。注: tailPos が stringLength を超えるのは %RegExp.prototype% でない "exec" を持つオブジェクトにより呼ばれた場合のみ。 それ以外で "$" に 1 個以上の 10 進数字が続くなら2 つ以上の数字が続くなら digitCount を 2、そうでなければ 1。 digits を 1 から 1 + digitCount の部分文字列 。index を ℝ (StringToNumber (digits ))。アサート: 0 ≤ index ≤ 99。 captureLen を captures の要素数。index > captureLen かつ digitCount = 2 なら注: 2 桁が範囲外なら 1 桁とリテラル数字に扱い直す。 digitCount を 1。digits をその先頭 1 桁に。index を ℝ (StringToNumber (digits ))。ref を 0 から 1 + digitCount の部分文字列 。1 ≤ index ≤ captureLen ならcapture を captures [index - 1]。capture が undefined ならrefReplacement を空文字列。それ以外refReplacement を capture 。 それ以外refReplacement を ref 。 それ以外で "$<" で始まるならgtPos を StringIndexOf (templateRemainder , ">" , 0)。gtPos が not-found または namedCaptures が undefined ならref を "$<" 。refReplacement を ref 。それ以外ref を 0 から gtPos + 1 の部分。groupName を 2 から gtPos の部分。アサート: namedCaptures はオブジェクト。 capture を ? Get (namedCaptures , groupName )。capture が undefined ならrefReplacement を空文字列。それ以外refReplacement を ? ToString (capture )。 それ以外ref を 0 から 1 の部分。refReplacement を ref 。 refLength を ref の長さ。templateRemainder を refLength 以降の部分へ。result を result と refReplacement の連結。result を返す。
22.1.3.20 String.prototype.replaceAll ( searchValue , replaceValue )
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 searchValue が undefined でも null でもないならisRegExp を ? IsRegExp (searchValue )。isRegExp が true ならflags を ? Get (searchValue , "flags" )。? RequireObjectCoercible (flags )。 ? ToString (flags ) に "g" が含まれなければ TypeError 。 replacer を ? GetMethod (searchValue , %Symbol.replace% )。replacer が undefined でなければ? Call(replacer , searchValue , « O , replaceValue ») を返す。 string を ? ToString (O )。searchString を ? ToString (searchValue )。functionalReplace を IsCallable (replaceValue )。functionalReplace が false ならreplaceValue を ? ToString (replaceValue )。searchLength を searchString の長さ。advanceBy を max (1, searchLength )。matchPositions を空リスト。position を StringIndexOf (string , searchString , 0)。position が not-found でない間繰り返し、matchPositions に position を追加。position を StringIndexOf (string , searchString , position + advanceBy ) に設定。endOfLastMatch を 0。result を空文字列。matchPositions の各 p についてpreserved を string の endOfLastMatch から p まで。functionalReplace が true ならreplacement を ? ToString (? Call(replaceValue , undefined , « searchString , 𝔽 (p ), string »))。それ以外アサート: replaceValue は String。 captures を空リスト。replacement を ! GetSubstitution (searchString , string , p , captures , undefined , replaceValue )。 result を result , preserved , replacement の連結に。endOfLastMatch を p + searchLength に。endOfLastMatch < string の長さ ならresult を result と string の endOfLastMatch 以降の部分の連結に。result を返す。
22.1.3.21 String.prototype.search ( regexp )
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 regexp が undefined でも null でもないならsearcher を ? GetMethod (regexp , %Symbol.search% )。searcher が undefined でなければ? Call(searcher , regexp , « O ») を返す。 string を ? ToString (O )。rx を ? RegExpCreate (regexp , undefined )。? Invoke(rx , %Symbol.search% , « string ») を返す。
Note
22.1.3.22 String.prototype.slice ( start , end )
このメソッドは、このオブジェクトを String に変換した結果の start から (含まない)end まで(end が undefined なら末尾まで)の substring を返す。start が負なら sourceLength + start とみなし、end が負なら sourceLength + end とみなす。結果は String 値。
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 S を ? ToString (O )。len を S の長さ。intStart を ? ToIntegerOrInfinity (start )。intStart = -∞ なら from を 0。それ以外で intStart < 0 なら from を max (len + intStart , 0)。 それ以外は from を min (intStart , len )。 end が undefined なら intEnd を len 、そうでなければ ? ToIntegerOrInfinity (end )。intEnd = -∞ なら to を 0。それ以外で intEnd < 0 なら to を max (len + intEnd , 0)。 それ以外は to を min (intEnd , len )。 from ≥ to なら空文字列。S の from から to の部分文字列 を返す。
Note
22.1.3.23 String.prototype.split ( separator , limit )
このメソッドは、このオブジェクトを String に変換した結果を左から separator の出現で分割した部分文字列 を配列に格納し返す。separator は任意長の String または %Symbol.split% メソッドを持つオブジェクト (例: RegExp)。
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 separator が undefined でも null でもないならsplitter を ? GetMethod (separator , %Symbol.split% )。splitter が undefined でなければ? Call(splitter , separator , « O , limit ») を返す。 S を ? ToString (O )。limit が undefined なら lim を 232 - 1、そうでなければ ℝ (? ToUint32 (limit ))。R を ? ToString (separator )。lim = 0 なら CreateArrayFromList (« »)。separator が undefined なら CreateArrayFromList (« S »)。separatorLength を R の長さ。separatorLength = 0 ならstrLen を S の長さ。outLen を lim を 0 と strLen の間にクランプした結果。head を S の 0 から outLen 。codeUnits を head のコードユニット列リスト。CreateArrayFromList (codeUnits ) を返す。S が空文字列なら CreateArrayFromList (« S »)。substrings を空リスト。i を 0。j を StringIndexOf (S , R , 0)。j が not-found でない間T を S の i から j 。substrings に T を追加。substrings の要素数が lim なら CreateArrayFromList (substrings )。i を j + separatorLength 。j を StringIndexOf (S , R , i )。T を S の i から末尾。substrings に T を追加。CreateArrayFromList (substrings ) を返す。
Note 1
separator が空文字列なら先頭末尾や直前マッチ末尾の空部分文字列 はマッチしない。結果配列長は文字列長で各要素は1コードユニット。
this が空文字列の場合、separator が空文字列にマッチするなら結果は空、そうでなければ 1 要素(空文字列)。
separator が undefined なら結果は 1 要素で this の文字列表現。limit が指定されればサイズ制限。
Note 2
22.1.3.24 String.prototype.startsWith ( searchString [ , position ] )
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 S を ? ToString (O )。isRegExp を ? IsRegExp (searchString )。isRegExp が true なら TypeError 。searchStr を ? ToString (searchString )。len を S の長さ。position が undefined なら pos を 0、そうでなければ ? ToIntegerOrInfinity (position )。start を pos を 0 と len の間にクランプした結果。searchLength を searchStr の長さ。searchLength = 0 なら true 。end を start + searchLength 。end > len なら false 。substring を S の start から end 。substring = searchStr なら true 。false を返す。
Note 1
Note 2
RegExp の場合例外を投げる理由は将来拡張のため。
Note 3
22.1.3.25 String.prototype.substring ( start , end )
このメソッドは、このオブジェクトを String に変換した結果のインデックス start から (含まない)end まで(end が undefined なら末尾まで)の substring を返す。結果は String 値。
どちらかの引数が NaN または負なら 0 に置換。長さを超えるなら長さに置換。
start > end の場合は入れ替える。
手順:
O を this 。? RequireObjectCoercible (O )。 S を ? ToString (O )。len を S の長さ。intStart を ? ToIntegerOrInfinity (start )。end が undefined なら intEnd を len 、そうでなければ ? ToIntegerOrInfinity (end )。finalStart を intStart を 0 と len の間にクランプした結果。finalEnd を intEnd を 0 と len の間にクランプした結果。from を min (finalStart , finalEnd )。to を max (finalStart , finalEnd )。S の from から to の部分文字列 を返す。
Note
22.1.3.26 String.prototype.toLocaleLowerCase ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 実装時はそちらに従う。未実装時は以下。
このメソッドは 6.1.4 に記載の UTF-16 コードポイント列として String を解釈する。
toLowerCase
と同様だがロケール依存(例: トルコ語など特別な場合)。
オプション引数の意味は ECMA-402 に定義され、未実装時は他用途禁止。
Note
22.1.3.27 String.prototype.toLocaleUpperCase ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 実装時はその仕様に従う。未実装時は以下。
String を UTF-16 コードポイント列として解釈。
toUpperCase
と同様だがロケール依存結果を意図。
オプション引数の意味は ECMA-402 にのみ定義。
Note
22.1.3.28 String.prototype.toLowerCase ( )
String を UTF-16 コードポイント列として解釈する (6.1.4 )。
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 S を ? ToString (O )。sText を StringToCodePoints(S )。lowerText を Unicode 既定のケース変換アルゴリズムに従い toLowercase(sText )。L を CodePointsToString(lowerText )。L を返す。
結果は Unicode Character Database のロケール非依存マッピング(UnicodeData.txt
と SpecialCasing.txt
のロケール非依存部分)に従う。
Note 1
一部コードポイントは複数コードポイントへ写像され長さが変わり得る。toUpperCase
と toLowerCase
は文脈依存で対称ではない。
Note 2
22.1.3.29 String.prototype.toString ( )
呼び出し時:
? ThisStringValue (this value) を返す。
Note
String オブジェクトにおいては valueOf
と同じ結果。
22.1.3.30 String.prototype.toUpperCase ( )
String を UTF-16 コードポイント列として解釈する。
String.prototype.toLowerCase
と同様に動作するが Unicode 既定ケース変換の大文字化アルゴリズムを用いる。
Note
22.1.3.31 String.prototype.toWellFormed ( )
このオブジェクトの文字列表現から、サロゲートペア を構成しない孤立した先行・後続サロゲートを U+FFFD (REPLACEMENT CHARACTER) に置換した String を返す。
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 S を ? ToString (O )。strLen を S の長さ。k を 0。result を空文字列。k < strLen の間繰り返しcp を CodePointAt(S , k )。cp .[[IsUnpairedSurrogate]] が true ならresult を result と 0xFFFD の連結。それ以外result を result と UTF16EncodeCodePoint(cp .[[CodePoint]] ) の連結。 k を k + cp .[[CodeUnitCount]] 。result を返す。
22.1.3.32 String.prototype.trim ( )
String を UTF-16 コードポイント列として解釈する。
呼び出し時:
S を this の値。? TrimString (S , start+end ) を返す。
Note
22.1.3.32.1 TrimString ( string , where )
The abstract operation TrimString takes arguments string (an ECMAScript language value) and where (start , end , or start+end ) and returns either a normal completion containing a String or a throw completion . string を UTF-16 コードポイント列として解釈する。 It performs the following steps when called:
? RequireObjectCoercible (string )。 S を ? ToString (string )。where が start ならT を S から前方空白を除去した String。それ以外で where が end ならT を S から後方空白を除去した String。 それ以外アサート: where は start+end 。 T を S の前後空白を除去した String。 T を返す。
空白の定義は WhiteSpace と LineTerminator の和集合。Unicode 一般カテゴリ Space_Separator (“Zs”) の判定は UTF-16 として解釈する。
22.1.3.33 String.prototype.trimEnd ( )
String を UTF-16 コードポイント列として解釈する。
呼び出し時:
S を this の値。? TrimString (S , end ) を返す。
Note
22.1.3.34 String.prototype.trimStart ( )
String を UTF-16 コードポイント列として解釈する。
呼び出し時:
S を this の値。? TrimString (S , start ) を返す。
Note
22.1.3.35 String.prototype.valueOf ( )
呼び出し時:
? ThisStringValue (this value) を返す。
22.1.3.35.1 ThisStringValue ( value )
The abstract operation ThisStringValue takes argument value (an ECMAScript language value) and returns either a normal completion containing a String or a throw completion . It performs the following steps when called:
value が String なら value を返す。value がオブジェクトで [[StringData]] 内部スロットを持つならs を value .[[StringData]] 。アサート: s は String。 s を返す。TypeError 例外を投げる。
22.1.3.36 String.prototype [ %Symbol.iterator% ] ( )
このメソッドは String 値のコードポイントを順次 (各コードポイントを String として) 返すイテレータオブジェクトを返す。
呼び出し時:
O を this 。? RequireObjectCoercible (O )。 s を ? ToString (O )。closure を s を捕捉し、呼び出し時に以下を行う抽象クロージャとする:len を s の長さ。position を 0。position < len の間繰り返しcp を CodePointAt(s , position )。nextIndex を position + cp .[[CodeUnitCount]] 。resultString を s の position から nextIndex 。position を nextIndex 。? GeneratorYield (CreateIteratorResultObject (resultString , false ))。 NormalCompletion (unused ) を返す。CreateIteratorFromClosure (closure , "%StringIteratorPrototype%" , %StringIteratorPrototype% ) を返す。
このメソッドの "name" プロパティの値は "[Symbol.iterator]" である。
22.1.4 String インスタンスのプロパティ
String インスタンスは String エキゾチックオブジェクト であり、その内部メソッドを持つ。String インスタンスは String プロトタイプオブジェクト からプロパティを継承し、[[StringData]] 内部スロットを持つ。この内部スロットはその String オブジェクトが表す String 値である。
String インスタンスは "length" プロパティと整数インデックス 名を持つ列挙可能プロパティ集合を持つ。
22.1.4.1 length
この String オブジェクトが表す String 値の要素数。
一度初期化されると不変。このプロパティの属性は { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
22.1.5 String 反復子オブジェクト
String Iterator は特定の String インスタンス上の特定の反復を表すオブジェクト。名前付きコンストラクタ ーは存在せず、String インスタンスの特定メソッド呼び出しで生成される。
22.1.5.1 %StringIteratorPrototype% オブジェクト
%StringIteratorPrototype% オブジェクト:
22.1.5.1.1 %StringIteratorPrototype%.next ( )
? GeneratorResume (this value, empty , "%StringIteratorPrototype%" ) を返す。
22.1.5.1.2 %StringIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列 "String Iterator" である。
属性は { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }。
22.2 RegExp (正規表現) オブジェクト
RegExp オブジェクトは正規表現パターンと関連するフラグを保持する。
Note
正規表現の形式と機能は Perl 5 の正規表現機能を手本としている。
22.2.1 パターン
RegExp コンストラクタ ーは入力のパターン文字列に対して以下の文法を適用する。文字列が Pattern の展開として解釈できない場合、エラーが発生する。
構文
Pattern [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] ::
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Disjunction [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] ::
Alternative [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Alternative [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
|
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Alternative [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] ::
[empty]
Alternative [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Term [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Term [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] ::
Assertion [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Atom [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Atom [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Quantifier
Assertion [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] ::
^
$
\b
\B
(?=
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?!
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<=
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<!
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
Quantifier ::
QuantifierPrefix
QuantifierPrefix
?
QuantifierPrefix ::
*
+
?
{
DecimalDigits [~Sep]
}
{
DecimalDigits [~Sep]
,}
{
DecimalDigits [~Sep]
,
DecimalDigits [~Sep]
}
Atom [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] ::
PatternCharacter
.
\
AtomEscape [?UnicodeMode, ?NamedCaptureGroups]
CharacterClass [?UnicodeMode, ?UnicodeSetsMode]
(
GroupSpecifier [?UnicodeMode] opt
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
:
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
RegularExpressionModifiers ::
[empty]
RegularExpressionModifiers
RegularExpressionModifier
RegularExpressionModifier :: one of i m s
SyntaxCharacter :: one of ^ $ \ . * + ? ( ) [ ] { } |
PatternCharacter ::
SourceCharacter but not SyntaxCharacter
AtomEscape [UnicodeMode, NamedCaptureGroups] ::
DecimalEscape
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode]
[+NamedCaptureGroups]
k
GroupName [?UnicodeMode]
CharacterEscape [UnicodeMode] ::
ControlEscape
c
AsciiLetter
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
RegExpUnicodeEscapeSequence [?UnicodeMode]
IdentityEscape [?UnicodeMode]
ControlEscape :: one of f n r t v
GroupSpecifier [UnicodeMode] ::
?
GroupName [?UnicodeMode]
GroupName [UnicodeMode] ::
<
RegExpIdentifierName [?UnicodeMode]
>
RegExpIdentifierName [UnicodeMode] ::
RegExpIdentifierStart [?UnicodeMode]
RegExpIdentifierName [?UnicodeMode]
RegExpIdentifierPart [?UnicodeMode]
RegExpIdentifierStart [UnicodeMode] ::
IdentifierStartChar
\
RegExpUnicodeEscapeSequence [+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart [UnicodeMode] ::
IdentifierPartChar
\
RegExpUnicodeEscapeSequence [+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpUnicodeEscapeSequence [UnicodeMode] :: [+UnicodeMode]
u
HexLeadSurrogate
\u
HexTrailSurrogate
[+UnicodeMode]
u
HexLeadSurrogate
[+UnicodeMode]
u
HexTrailSurrogate
[+UnicodeMode]
u
HexNonSurrogate
[~UnicodeMode]
u
Hex4Digits
[+UnicodeMode]
u{
CodePoint
}
UnicodeLeadSurrogate ::
any Unicode code point in the inclusive interval from U+D800 to U+DBFF
UnicodeTrailSurrogate ::
any Unicode code point in the inclusive interval from U+DC00 to U+DFFF
関連付ける \u
HexLeadSurrogate の選択が曖昧である各 \u
HexTrailSurrogate は、他に対応する \u
HexTrailSurrogate を持たない最も近い u
HexLeadSurrogate に関連付けられなければならない。
HexLeadSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is in the inclusive interval from 0xD800 to 0xDBFF
HexNonSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is not in the inclusive interval from 0xD800 to 0xDFFF
IdentityEscape [UnicodeMode] :: [+UnicodeMode]
SyntaxCharacter
[+UnicodeMode]
/
[~UnicodeMode]
SourceCharacter but not UnicodeIDContinue
DecimalEscape ::
NonZeroDigit
DecimalDigits [~Sep] opt
[lookahead ∉ DecimalDigit ]
CharacterClassEscape [UnicodeMode] ::
d
D
s
S
w
W
[+UnicodeMode]
p{
UnicodePropertyValueExpression
}
[+UnicodeMode]
P{
UnicodePropertyValueExpression
}
UnicodePropertyValueExpression ::
UnicodePropertyName
=
UnicodePropertyValue
LoneUnicodePropertyNameOrValue
UnicodePropertyName ::
UnicodePropertyNameCharacters
UnicodePropertyNameCharacters ::
UnicodePropertyNameCharacter
UnicodePropertyNameCharacters opt
UnicodePropertyValue ::
UnicodePropertyValueCharacters
LoneUnicodePropertyNameOrValue ::
UnicodePropertyValueCharacters
UnicodePropertyValueCharacters ::
UnicodePropertyValueCharacter
UnicodePropertyValueCharacters opt
UnicodePropertyValueCharacter ::
UnicodePropertyNameCharacter
DecimalDigit
UnicodePropertyNameCharacter ::
AsciiLetter
_
CharacterClass [UnicodeMode, UnicodeSetsMode] ::
[
[lookahead ≠ ^ ]
ClassContents [?UnicodeMode, ?UnicodeSetsMode]
]
[^
ClassContents [?UnicodeMode, ?UnicodeSetsMode]
]
ClassContents [UnicodeMode, UnicodeSetsMode] ::
[empty]
[~UnicodeSetsMode]
NonemptyClassRanges [?UnicodeMode]
[+UnicodeSetsMode]
ClassSetExpression
NonemptyClassRanges [UnicodeMode] ::
ClassAtom [?UnicodeMode]
ClassAtom [?UnicodeMode]
NonemptyClassRangesNoDash [?UnicodeMode]
ClassAtom [?UnicodeMode]
-
ClassAtom [?UnicodeMode]
ClassContents [?UnicodeMode, ~UnicodeSetsMode]
NonemptyClassRangesNoDash [UnicodeMode] ::
ClassAtom [?UnicodeMode]
ClassAtomNoDash [?UnicodeMode]
NonemptyClassRangesNoDash [?UnicodeMode]
ClassAtomNoDash [?UnicodeMode]
-
ClassAtom [?UnicodeMode]
ClassContents [?UnicodeMode, ~UnicodeSetsMode]
ClassAtom [UnicodeMode] ::
-
ClassAtomNoDash [?UnicodeMode]
ClassAtomNoDash [UnicodeMode] ::
SourceCharacter but not one of \ or ] or -
\
ClassEscape [?UnicodeMode]
ClassEscape [UnicodeMode] ::
b
[+UnicodeMode]
-
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode]
ClassSetExpression ::
ClassUnion
ClassIntersection
ClassSubtraction
ClassUnion ::
ClassSetRange
ClassUnion opt
ClassSetOperand
ClassUnion opt
ClassIntersection ::
ClassSetOperand
&&
[lookahead ≠ & ]
ClassSetOperand
ClassIntersection
&&
[lookahead ≠ & ]
ClassSetOperand
ClassSubtraction ::
ClassSetOperand
--
ClassSetOperand
ClassSubtraction
--
ClassSetOperand
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
ClassSetOperand ::
NestedClass
ClassStringDisjunction
ClassSetCharacter
NestedClass ::
[
[lookahead ≠ ^ ]
ClassContents [+UnicodeMode, +UnicodeSetsMode]
]
[^
ClassContents [+UnicodeMode, +UnicodeSetsMode]
]
\
CharacterClassEscape [+UnicodeMode]
Note 1
最初の二つの行は CharacterClass と同等である。
ClassStringDisjunction ::
\q{
ClassStringDisjunctionContents
}
ClassStringDisjunctionContents ::
ClassString
ClassString
|
ClassStringDisjunctionContents
ClassString ::
[empty]
NonEmptyClassString
NonEmptyClassString ::
ClassSetCharacter
NonEmptyClassString opt
ClassSetCharacter ::
[lookahead ∉ ClassSetReservedDoublePunctuator ]
SourceCharacter but not ClassSetSyntaxCharacter
\
CharacterEscape [+UnicodeMode]
\
ClassSetReservedPunctuator
\b
ClassSetReservedDoublePunctuator :: one of && !! ## $$ %% ** ++ ,, .. :: ;; << == >> ?? @@ ^^ `` ~~
ClassSetSyntaxCharacter :: one of ( ) [ ] { } / - \ |
ClassSetReservedPunctuator :: one of & - ! # % , : ; < = > @ ` ~
Note 2
この節の複数の生成規則は B.1.2 で別定義が与えられる。
22.2.1.1 静的セマンティクス: 早期エラー
Note
Pattern :: Disjunction
CountLeftCapturingParensWithin(Pattern ) ≥ 232 - 1 の場合、構文エラー。
Pattern が互いに異なる二つの GroupSpecifier x と y を含み、それらの CapturingGroupName が等しく、かつ MightBothParticipate(x , y ) が true の場合、構文エラー。
QuantifierPrefix ::
{
DecimalDigits
,
DecimalDigits
}
Atom ::
(?
RegularExpressionModifiers
:
Disjunction
)
Atom ::
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction
)
AtomEscape ::
k
GroupName
GroupSpecifiersThatMatch(GroupName ) が空なら構文エラー。
AtomEscape :: DecimalEscape
NonemptyClassRanges ::
ClassAtom
-
ClassAtom
ClassContents
最初または二番目の ClassAtom の IsCharacterClass が true なら構文エラー。
両方の IsCharacterClass が false で、かつ最初の CharacterValue > 二番目の CharacterValue の場合構文エラー。
NonemptyClassRangesNoDash ::
ClassAtomNoDash
-
ClassAtom
ClassContents
RegExpIdentifierStart ::
\
RegExpUnicodeEscapeSequence
RegExpIdentifierStart ::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart ::
\
RegExpUnicodeEscapeSequence
RegExpIdentifierPart ::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
UnicodePropertyValueExpression ::
UnicodePropertyName
=
UnicodePropertyValue
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
CharacterClassEscape ::
P{
UnicodePropertyValueExpression
}
CharacterClass ::
[^
ClassContents
]
NestedClass ::
[^
ClassContents
]
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
22.2.1.2
静的セマンティクス: CountLeftCapturingParensWithin (
node : a Parse Node,
): 非負整数
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. node 内の左捕捉括弧の個数を返す。左捕捉括弧 とは
Atom ::
(
GroupSpecifier opt
Disjunction
)
生成規則の (
終端にマッチする任意の (
パターン文字である。
Note
It performs the following steps when called:
アサート: node は RegExp パターン文法 の生成規則インスタンスである。 node に含まれる
Atom ::
(
GroupSpecifier opt
Disjunction
)
の構文木ノード数を返す。
22.2.1.3
静的セマンティクス: CountLeftCapturingParensBefore (
node : a Parse Node,
): 非負整数
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 外側のパターン内で node の左側に現れる左捕捉括弧 の数を返す。
Note
It performs the following steps when called:
アサート: node は RegExp パターン文法 の生成規則インスタンスである。 pattern を node を含む Pattern とする。pattern 内で node より前に出現するか、node を包含する
Atom ::
(
GroupSpecifier opt
Disjunction
)
ノードの数を返す。
22.2.1.4
静的セマンティクス: MightBothParticipate (
x : a Parse Node,
y : a Parse Node,
): Boolean
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
アサート: x と y は同じ外側の Pattern を持つ。 外側の Pattern が
Disjunction ::
Alternative
|
Disjunction
ノードを含み、x が Alternative 内に、y が派生した Disjunction 内(または逆)に含まれる場合 false を返す。 true を返す。
22.2.1.5 静的セマンティクス: CapturingGroupNumber : 正の整数
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
It is defined piecewise over the following productions:
DecimalEscape :: NonZeroDigit
NonZeroDigit の MV を返す。
DecimalEscape ::
NonZeroDigit
DecimalDigits
n を DecimalDigits のコードポイント数とする。(NonZeroDigit の MV × 10n + DecimalDigits の MV) を返す。
“NonZeroDigit の MV” と “DecimalDigits の MV” の定義は 12.9.3 にある。
22.2.1.6 静的セマンティクス: IsCharacterClass : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
It is defined piecewise over the following productions:
ClassAtom ::
-
ClassAtomNoDash ::
SourceCharacter but not one of \ or ] or -
ClassEscape ::
b
-
CharacterEscape
false を返す。
ClassEscape :: CharacterClassEscape
true を返す。
22.2.1.7 静的セマンティクス: CharacterValue : 非負整数
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note 1
It is defined piecewise over the following productions:
ClassAtom :: -
U+002D (HYPHEN-MINUS) の数値を返す。
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
ch を SourceCharacter にマッチしたコードポイントとする。ch の数値を返す。
ClassEscape :: b
U+0008 (BACKSPACE) の数値を返す。
ClassEscape :: -
U+002D (HYPHEN-MINUS) の数値を返す。
CharacterEscape :: ControlEscape
Table 65 に従う数値を返す。
Table 65: ControlEscape コードポイント値
ControlEscape
数値
Code Point
Unicode 名
記号
t
9
U+0009
CHARACTER TABULATION
<HT>
n
10
U+000A
LINE FEED (LF)
<LF>
v
11
U+000B
LINE TABULATION
<VT>
f
12
U+000C
FORM FEED (FF)
<FF>
r
13
U+000D
CARRIAGE RETURN (CR)
<CR>
CharacterEscape ::
c
AsciiLetter
ch を AsciiLetter にマッチしたコードポイントとする。i を ch の数値とする。i を 32 で割った余りを返す。
CharacterEscape ::
0
[lookahead ∉ DecimalDigit ]
U+0000 (NULL) の数値を返す。
Note 2
\0
は <NUL> 文字を表し、その後に 10 進数字を続けることはできない。
CharacterEscape :: HexEscapeSequence
HexEscapeSequence の MV を返す。
RegExpUnicodeEscapeSequence ::
u
HexLeadSurrogate
\u
HexTrailSurrogate
lead を HexLeadSurrogate の CharacterValue とする。trail を HexTrailSurrogate の CharacterValue とする。cp を UTF16SurrogatePairToCodePoint(lead , trail ) とする。cp の数値を返す。
RegExpUnicodeEscapeSequence ::
u
Hex4Digits
Hex4Digits の MV を返す。
RegExpUnicodeEscapeSequence ::
u{
CodePoint
}
CodePoint の MV を返す。
HexLeadSurrogate :: Hex4Digits
HexTrailSurrogate :: Hex4Digits
HexNonSurrogate :: Hex4Digits
Hex4Digits の MV を返す。
CharacterEscape :: IdentityEscape
ch を IdentityEscape にマッチしたコードポイントとする。ch の数値を返す。
ClassSetCharacter :: SourceCharacter but not ClassSetSyntaxCharacter
ch を SourceCharacter にマッチしたコードポイントとする。ch の数値を返す。
ClassSetCharacter ::
\
ClassSetReservedPunctuator
ch を ClassSetReservedPunctuator にマッチしたコードポイントとする。ch の数値を返す。
ClassSetCharacter :: \b
U+0008 (BACKSPACE) の数値を返す。
22.2.1.8 静的セマンティクス: MayContainStrings : Boolean
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
CharacterClassEscape ::
d
D
s
S
w
W
P{
UnicodePropertyValueExpression
}
UnicodePropertyValueExpression ::
UnicodePropertyName
=
UnicodePropertyValue
NestedClass ::
[^
ClassContents
]
ClassContents ::
[empty]
NonemptyClassRanges
ClassSetOperand ::
ClassSetCharacter
false を返す。
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
LoneUnicodePropertyNameOrValue が Table 69 の「Property name」欄にある文字列のバイナリプロパティであれば true を返す。false を返す。
ClassUnion ::
ClassSetRange
ClassUnion opt
ClassUnion が存在するならその MayContainStrings を返す。false を返す。
ClassUnion ::
ClassSetOperand
ClassUnion opt
ClassSetOperand の MayContainStrings が true なら true を返す。ClassUnion が存在するならその MayContainStrings を返す。false を返す。
ClassIntersection ::
ClassSetOperand
&&
ClassSetOperand
最初の ClassSetOperand の MayContainStrings が false なら false 。 二番目の ClassSetOperand の MayContainStrings が false なら false 。 true を返す。
ClassIntersection ::
ClassIntersection
&&
ClassSetOperand
ClassIntersection の MayContainStrings が false なら false 。ClassSetOperand の MayContainStrings が false なら false 。true を返す。
ClassSubtraction ::
ClassSetOperand
--
ClassSetOperand
最初の ClassSetOperand の MayContainStrings を返す。
ClassSubtraction ::
ClassSubtraction
--
ClassSetOperand
ClassSubtraction の MayContainStrings を返す。
ClassStringDisjunctionContents ::
ClassString
|
ClassStringDisjunctionContents
ClassString の MayContainStrings が true なら true 。ClassStringDisjunctionContents の MayContainStrings を返す。
ClassString :: [empty]
true を返す。
ClassString :: NonEmptyClassString
NonEmptyClassString の MayContainStrings を返す。
NonEmptyClassString ::
ClassSetCharacter
NonEmptyClassString opt
NonEmptyClassString が存在するなら true 。false を返す。
22.2.1.9
静的セマンティクス: GroupSpecifiersThatMatch (
thisGroupName : a GroupName Parse Node,
): GroupSpecifier 構文ノードのリスト
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
name を thisGroupName の CapturingGroupName とする。pattern を thisGroupName を含む Pattern とする。result を新しい空リストとする。pattern が含む各 GroupSpecifier gs についてgs の CapturingGroupName が name ならgs を result に追加。result を返す。
22.2.1.10 静的セマンティクス: CapturingGroupName : String
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
GroupName ::
<
RegExpIdentifierName
>
idTextUnescaped を RegExpIdentifierName の RegExpIdentifierCodePoints とする。CodePointsToString(idTextUnescaped ) を返す。
22.2.1.11 静的セマンティクス: RegExpIdentifierCodePoints : コードポイントのリスト
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
RegExpIdentifierName :: RegExpIdentifierStart
cp を RegExpIdentifierStart の RegExpIdentifierCodePoint とする。« cp » を返す。
RegExpIdentifierName ::
RegExpIdentifierName
RegExpIdentifierPart
cps を派生した RegExpIdentifierName の RegExpIdentifierCodePoints とする。cp を RegExpIdentifierPart の RegExpIdentifierCodePoint とする。cps に « cp » を連結したリストを返す。
22.2.1.12 静的セマンティクス: RegExpIdentifierCodePoint : コードポイント
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
RegExpIdentifierStart :: IdentifierStartChar
IdentifierStartChar にマッチしたコードポイントを返す。
RegExpIdentifierPart :: IdentifierPartChar
IdentifierPartChar にマッチしたコードポイントを返す。
RegExpIdentifierStart ::
\
RegExpUnicodeEscapeSequence
RegExpIdentifierPart ::
\
RegExpUnicodeEscapeSequence
RegExpUnicodeEscapeSequence の CharacterValue を数値とするコードポイントを返す。
RegExpIdentifierStart ::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart ::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
lead を UnicodeLeadSurrogate にマッチしたコードポイントの数値値を数値とするコードユニットとする。trail を UnicodeTrailSurrogate にマッチしたコードポイントの数値値を数値とするコードユニットとする。UTF16SurrogatePairToCodePoint(lead , trail ) を返す。
22.2.2 パターンのセマンティクス
正規表現パターンは以下で記述される手順を用いて抽象クロージャ (Abstract Closure ) に変換される。実装は、結果が同一である限り、以下に挙げるものより効率的なアルゴリズムを用いることが推奨される。この抽象クロージャは RegExp オブジェクトの [[RegExpMatcher]] 内部スロットの値として使われる。
Pattern は、その関連フラグに u
も v
も含まない場合 BMP パターンである。そうでなければ Unicode パターンである。BMP パターンは、基本多言語面 (BMP) の範囲内の Unicode コードポイントから成る 16 ビット値列として解釈される String に対してマッチを行う。Unicode パターンは UTF-16 でエンコードされた Unicode コードポイント列として解釈される String に対してマッチを行う。BMP パターンの挙動を記述する文脈では「文字」は単一の 16 ビット Unicode BMP コードポイントを意味する。Unicode パターンの挙動を記述する文脈では「文字」は UTF-16 でエンコードされたコードポイント (6.1.4 ) を意味する。いずれの文脈でも「character value」は対応する非エンコードなコードポイントの数値を意味する。
Pattern の構文とセマンティクスは、そのソーステキストが SourceCharacter 値の List であり、各 SourceCharacter が Unicode コードポイントに対応するとして定義される。BMP パターンが非 BMP の SourceCharacter を含む場合、パターン全体は UTF-16 でエンコードされ、そのエンコーディングの個々のコードユニットが List の要素として用いられる。
Note
例えば、ソーステキスト中で単一の非 BMP 文字 U+1D11E (MUSICAL SYMBOL G CLEF) で表されたパターンを考える。Unicode パターンとして解釈されると、それは単一コードポイント U+1D11E を要素とする 1 要素 (1 文字) の List となる。しかし BMP パターンとして解釈される場合、まず UTF-16 にエンコードされ、コードユニット 0xD834 と 0xDD1E から成る 2 要素の List となる。
パターンは非 BMP 文字が UTF-16 エンコードされた ECMAScript の String 値として RegExp コンストラクタ ーに渡される。例えば単一文字 MUSICAL SYMBOL G CLEF のパターンは、長さ 2 の String であり、その要素はコードユニット 0xD834 と 0xDD1E であった。したがって、2 つのパターン文字から成る BMP パターンとして処理するためにこれ以上の変換は不要である。しかし Unicode パターンとして処理するには UTF16SurrogatePairToCodePoint を用いて、その唯一の要素が単一パターン文字 (コードポイント U+1D11E) である List を生成しなければならない。
実装は実際に UTF-16 との間のこのような変換を行わないかもしれないが、本仕様のセマンティクスは、パターンマッチングの結果があたかもそのような変換が行われたかのようであることを要求する。
22.2.2.1 表記
以下の記述では次の内部データ構造を用いる:
CharSetElement は次の 2 種類のいずれかである:
rer .[[UnicodeSets]] が false の場合、CharSetElement は上記「パターンのセマンティクス」における意味での文字。
rer .[[UnicodeSets]] が true の場合、CharSetElement は上記「パターンのセマンティクス」における意味での文字列(要素がそのような文字である列)。これには空列、1 文字列、複数文字列が含まれる。利便性のため、この種の CharSetElement を扱う際、単一文字は 1 文字列と同一視して扱う。
CharSet は CharSetElement の数学的集合。
CaptureRange は { [[StartIndex]] , [[EndIndex]] } という Record で、キャプチャに含まれる文字の範囲を表す。[[StartIndex]] は Input 内での開始インデックス (含む) を表す整数 、[[EndIndex]] は Input 内での終了インデックス (含まない) を表す整数 である。任意の CaptureRange について、これらのインデックスは [[StartIndex]] ≤ [[EndIndex]] という不変条件を満たさなければならない。
MatchState は { [[Input]] , [[EndIndex]] , [[Captures]] } という Record で、[[Input]] はマッチ対象の String を表す文字の List 、[[EndIndex]] は整数 、[[Captures]] はパターン中の各左捕捉括弧 に対応する値の List である。MatchState は正規表現マッチングアルゴリズム中の部分的なマッチ状態を表す。[[EndIndex]] はこれまでにパターンがマッチした最後の入力文字のインデックス + 1 を表し、[[Captures]] は捕捉括弧の結果を保持する。[[Captures]] の n th 要素は n 番目の捕捉括弧が捕捉した文字範囲を表す CaptureRange か、まだ到達していない場合 undefined である。バックトラッキングのため、マッチング過程の任意時点で多数の MatchState が使用され得る。
MatcherContinuation は 1 つの MatchState 引数を取り、MatchState または failure を返す抽象クロージャ。MatcherContinuation はパターンの残り部分(クロージャが捕捉した値で特定される)を、引数の MatchState が示す中間状態から Input に対してマッチさせようとする。成功すれば最終的な MatchState を返し、失敗すれば failure を返す。
Matcher は 2 つの引数(MatchState と MatcherContinuation )を取り、MatchState または failure を返す抽象クロージャ。Matcher はパターンの中間サブパターン(クロージャが捕捉した値で特定される)をその MatchState の [[Input]] に対し、引数の MatchState が示す中間状態からマッチさせる。MatcherContinuation 引数は残りのパターンをマッチさせるクロージャであるべき。サブパターンをマッチさせて新しい MatchState を得た後、Matcher はその新しい MatchState に対して MatcherContinuation を呼び、残りのパターンがマッチできるか確認する。できれば Matcher は MatcherContinuation が返した MatchState を返し、できなければ選択点での別の選択を試み、成功するか全可能性が尽きるまで MatcherContinuation を繰り返し呼ぶ。
22.2.2.1.1 RegExp レコード
RegExp Record は、コンパイル中および必要に応じてマッチング中に RegExp について必要となる情報を保持するために用いられる Record 値である。
次のフィールドを持つ:
Table 66: RegExp Record Fields
Field Name
Value
Meaning
[[IgnoreCase]]
Boolean
フラグに "i" が現れるか
[[Multiline]]
Boolean
フラグに "m" が現れるか
[[DotAll]]
Boolean
フラグに "s" が現れるか
[[Unicode]]
Boolean
フラグに "u" が現れるか
[[UnicodeSets]]
Boolean
フラグに "v" が現れるか
[[CapturingGroupsCount]]
非負整数
パターン内の左捕捉括弧 の数
22.2.2.2 実行時セマンティクス: CompilePattern : 文字の List と非負整数を取り MatchState か failure を返す抽象クロージャ
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Pattern :: Disjunction
m を Disjunction の CompileSubpattern (引数 rer , forward ) とする。rer と m を捕捉し、(Input , index ) を引数に取り呼び出し時に以下を行う新しい抽象クロージャを返す:アサート: Input は文字の List 。 アサート: 0 ≤ index ≤ Input の要素数。 c を (y ) を引数に取り以下を行う新しい MatcherContinuation (何も捕捉しない)とする:アサート: y は MatchState 。 y を返す。cap を rer .[[CapturingGroupsCount]] 個の undefined を 1 から rer .[[CapturingGroupsCount]] で索引付けした List とする。x を MatchState { [[Input]] : Input , [[EndIndex]] : index , [[Captures]] : cap } とする。m (x , c ) を返す。
Note
Pattern は抽象クロージャ値へコンパイルされる。RegExpBuiltinExec はその後、この手続を文字 List とその List 内のオフセットへ適用し、そのパターンがそのオフセットで正確にマッチするか、マッチするなら捕捉括弧の値が何であるかを決定できる。22.2.2 のアルゴリズムは、パターンのコンパイル時に SyntaxError 例外を投げ得るよう設計されている。一方で、一度成功裏にコンパイルされた後、得られる抽象クロージャを用いて文字 List 内でマッチを探索する際には(メモリ不足など実装定義 の例外を除き)例外は投げられない。
22.2.2.3 実行時セマンティクス: CompileSubpattern : Matcher
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note 1
It is defined piecewise over the following productions:
Disjunction ::
Alternative
|
Disjunction
m1 を Alternative の CompileSubpattern (引数 rer , direction ) とする。m2 を Disjunction の CompileSubpattern (引数 rer , direction ) とする。MatchTwoAlternatives (m1 , m2 ) を返す。
Note 2
|
演算子は 2 つの選択肢を分離する。まず左側の Alternative (および正規表現の後続)へのマッチを試み、失敗したら右側の Disjunction (および後続)を試みる。左 Alternative 、右 Disjunction 、後続がいずれも選択点を持つ場合、左 Alternative の次の選択へ進む前に後続内の全ての選択が試される。左 Alternative の選択が尽きたら、左 Alternative の代わりに右 Disjunction が試される。|
によりスキップされたパターン部分内の捕捉括弧は undefined を生成する。例:
/a|ab/.exec ("abc" )
は結果 "a" を返し "ab" ではない。また
/((a)|(ab))((c)|(bc))/.exec ("abc" )
は配列
["abc" , "a" , "a" , undefined , "bc" , undefined , "bc" ]
を返し、
["abc" , "ab" , undefined , "ab" , "c" , "c" , undefined ]
ではない。2 つの選択肢を試す順序は direction の値と無関係。
Alternative :: [empty]
EmptyMatcher () を返す。
Alternative ::
Alternative
Term
m1 を Alternative の CompileSubpattern (引数 rer , direction ) とする。m2 を Term の CompileSubpattern (引数 rer , direction ) とする。MatchSequence (m1 , m2 , direction ) を返す。
Note 3
連続する Term は Input の連続部分に同時にマッチを試みる。direction が forward のとき、左 Alternative 、右 Term 、後続がいずれも選択点を持つ場合、右 Term の次の選択へ進む前に後続内の全選択が試され、左 Alternative の次の選択へ進む前に右 Term の全選択が試される。direction が backward のとき、Alternative と Term の評価順序は逆転する。
Term :: Assertion
Assertion の CompileAssertion (引数 rer ) を返す。
Note 4
得られる Matcher は direction に依存しない。
Term :: Atom
Atom の CompileAtom (引数 rer , direction ) を返す。
Term ::
Atom
Quantifier
m を Atom の CompileAtom (引数 rer , direction ) とする。q を Quantifier の CompileQuantifier とする。アサート: q .[[Min]] ≤ q .[[Max]] . parenIndex を CountLeftCapturingParensBefore(Term ) とする。parenCount を CountLeftCapturingParensWithin(Atom ) とする。(x , c ) を引数に取り m , q , parenIndex , parenCount を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 RepeatMatcher (m , q .[[Min]] , q .[[Max]] , q .[[Greedy]] , x , c , parenIndex , parenCount ) を返す。
22.2.2.3.1 RepeatMatcher ( m , min , max , greedy , x , c , parenIndex , parenCount )
The abstract operation RepeatMatcher takes arguments m (a Matcher ), min (非負整数 ), max (非負整数 または +∞), greedy (Boolean), x (MatchState ), c (MatcherContinuation ), parenIndex (非負整数 ), and parenCount (非負整数 ) and returns MatchState または failure . It performs the following steps when called:
max = 0 なら c (x ) を返す。(y ) を引数に取り m , min , max , greedy , x , c , parenIndex , parenCount を捕捉し以下を行う新しい MatcherContinuation d を作る:アサート: y は MatchState 。 min = 0 かつ y .[[EndIndex]] = x .[[EndIndex]] なら failure を返す。min = 0 なら min2 を 0、そうでなければ min - 1。max = +∞ なら max2 を +∞、そうでなければ max - 1。RepeatMatcher (m , min2 , max2 , greedy , y , c , parenIndex , parenCount ) を返す。 cap を x .[[Captures]] のコピーとする。parenIndex + 1 から parenIndex + parenCount までの各整数 k について cap [k ] に undefined を設定する。Input を x .[[Input]] とする。e を x .[[EndIndex]] とする。xr を MatchState { [[Input]] : Input , [[EndIndex]] : e , [[Captures]] : cap } とする。min ≠ 0 なら m (xr , d ) を返す。greedy が false ならz を c (x ) とする。z が failure でなければ z を返す。m (xr , d ) を返す。z を m (xr , d ) とする。z が failure でなければ z を返す。c (x ) を返す。
Note 1
Atom に Quantifier が続く場合、Quantifier に指定された回数だけ繰り返される。Quantifier は非貪欲 (non-greedy) の場合、後続にマッチしつつ可能な限り少ない回数繰り返され、貪欲 (greedy) の場合、後続にマッチしつつ可能な限り多く繰り返される。繰り返されるのは入力文字列ではなく Atom パターンであるため、各反復で異なる入力部分文字列 にマッチし得る。
Note 2
Atom と後続の正規表現がいずれも選択点を持つ場合、まず Atom は可能な限り多く (非貪欲なら少なく) マッチする。後続内の全選択が試されてから、Atom の最後の反復で次の選択へ進む。最後 (n 回目) の反復の全選択が試されてから (n - 1) 回目の反復で次の選択へ進む。その時点で Atom の反復回数を増減できる可能性があり(再度、少ないか多いかから開始)、それらが尽きてから (n - 1) 回目の反復で次の選択へ進む……。
比較:
/a[a-z]{2 ,4 }/.exec ("abcdefghi" )
は "abcde" を返し、
/a[a-z]{2 ,4 }?/.exec ("abcdefghi" )
は "abc" を返す。
さらに:
/(aa|aabaac|ba|b|c)*/.exec ("aabaac" )
は選択点の順序により配列
["aaba" , "ba" ]
を返し、以下ではない:
["aabaac" , "aabaac" ]
["aabaac" , "c" ]
この選択点の順序は、単項表記の 2 つの数の最大公約数 (GCD) を計算する正規表現を書くのに利用できる。以下は 10 と 15 の gcd を計算する例:
"aaaaaaaaaa,aaaaaaaaaaaaaaa" .replace (/^(a+)\1*,\1+$/ , "$1" )
結果は単項表記の "aaaaa" 。
Note 3
RepeatMatcher のステップ は Atom が繰り返されるたびにその捕捉をクリアする。次の正規表現で挙動が分かる:
/(z)((a+)?(b+)?(c))*/.exec ("zaacbbbcac" )
これは配列
["zaacbbbcac" , "z" , "ac" , "a" , undefined , "c" ]
を返し、
["zaacbbbcac" , "z" , "ac" , "a" , "bbb" , "c" ]
ではない。これは外側の *
の各反復が量指定された Atom に含まれる全捕捉文字列(ここでは 2, 3, 4, 5 番)をクリアするためである。
Note 4
RepeatMatcher のステップ は、最小反復回数が満たされた後、空文字列にマッチする Atom のさらなる展開は追加反復として考慮しないと述べる。これは以下のようなパターンで無限ループに陥るのを防ぐ:
/(a*)*/.exec ("b" )
またはやや複雑な:
/(a*)b\1 +/.exec ("baaaac" )
これは配列
["b" , "" ]
を返す。
22.2.2.3.2 EmptyMatcher ( )
The abstract operation EmptyMatcher takes no arguments and returns Matcher . It performs the following steps when called:
(x , c ) を引数に取り何も捕捉せず以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 c (x ) を返す。
22.2.2.3.3 MatchTwoAlternatives ( m1 , m2 )
The abstract operation MatchTwoAlternatives takes arguments m1 (Matcher ) and m2 (Matcher ) and returns Matcher . It performs the following steps when called:
(x , c ) を引数に取り m1 , m2 を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 r を m1 (x , c ) とする。r が failure でなければ r を返す。m2 (x , c ) を返す。
22.2.2.3.4 MatchSequence ( m1 , m2 , direction )
The abstract operation MatchSequence takes arguments m1 (Matcher ), m2 (Matcher ), and direction (forward または backward ) and returns Matcher . It performs the following steps when called:
direction が forward なら(x , c ) を引数に取り m1 , m2 を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 (y ) を引数に取り c , m2 を捕捉し以下を行う新しい MatcherContinuation d を作る:アサート: y は MatchState 。 m2 (y , c ) を返す。 m1 (x , d ) を返す。 それ以外アサート: direction は backward 。 (x , c ) を引数に取り m1 , m2 を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 (y ) を引数に取り c , m1 を捕捉し以下を行う新しい MatcherContinuation d を作る:アサート: y は MatchState 。 m1 (y , c ) を返す。 m2 (x , d ) を返す。
22.2.2.4 実行時セマンティクス: CompileAssertion : Matcher
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note 1
It is defined piecewise over the following productions:
Assertion :: ^
(x , c ) を引数に取り rer を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 Input を x .[[Input]] とする。e を x .[[EndIndex]] とする。e = 0 または rer .[[Multiline]] が true かつ 文字 Input [e - 1] が LineTerminator にマッチするならc (x ) を返す。failure を返す。
Note 2
y
フラグがパターンに使われている場合でも、^
は常に Input の先頭、または (rer .[[Multiline]] が true の場合) 行頭にのみマッチする。
Assertion :: $
(x , c ) を引数に取り rer を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 Input を x .[[Input]] とする。e を x .[[EndIndex]] とする。InputLength を Input の要素数とする。e = InputLength または rer .[[Multiline]] が true かつ 文字 Input [e ] が LineTerminator にマッチするならc (x ) を返す。failure を返す。
Assertion :: \b
(x , c ) を引数に取り rer を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 Input を x .[[Input]] とする。e を x .[[EndIndex]] とする。a を IsWordChar (rer , Input , e - 1) とする。b を IsWordChar (rer , Input , e ) とする。(a が true かつ b が false ) または (a が false かつ b が true ) なら c (x ) を返す。 failure を返す。
Assertion :: \B
(x , c ) を引数に取り rer を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 Input を x .[[Input]] とする。e を x .[[EndIndex]] とする。a を IsWordChar (rer , Input , e - 1) とする。b を IsWordChar (rer , Input , e ) とする。(a が true かつ b が true ) または (a が false かつ b が false ) なら c (x ) を返す。 failure を返す。
Assertion ::
(?=
Disjunction
)
m を Disjunction の CompileSubpattern (引数 rer , forward ) とする。(x , c ) を引数に取り m を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 (y ) を引数に取り何も捕捉しない新しい MatcherContinuation d を作る:アサート: y は MatchState 。 y を返す。 r を m (x , d ) とする。r が failure なら failure を返す。アサート: r は MatchState 。 cap を r .[[Captures]] とする。Input を x .[[Input]] とする。xe を x .[[EndIndex]] とする。z を MatchState { [[Input]] : Input , [[EndIndex]] : xe , [[Captures]] : cap } とする。c (z ) を返す。
Note 3
(?=
Disjunction )
形式はゼロ幅正の先読み。成功するには Disjunction 内のパターンが現在位置でマッチしなければならないが、後続をマッチする前に現在位置は進まない。Disjunction が現在位置で複数のマッチ方法を持つ場合、最初の 1 つのみ試す。他の演算子と異なり、(?=
形式内へのバックトラッキングは行われない (Perl 由来)。これは Disjunction が捕捉括弧を含み、パターン後続がそれらへの後方参照を含む場合のみ影響する。
例:
/(?=(a+))/.exec ("baaabac" )
は最初の b
の直後で空文字列にマッチし、配列:
["" , "aaa" ]
を返す。先読み内へのバックトラッキング欠如を示すため:
/(?=(a+))a*b\1 /.exec ("baaabac" )
は
["aba" , "a" ]
を返し、
["aaaba" , "a" ]
ではない。
Assertion ::
(?!
Disjunction
)
m を Disjunction の CompileSubpattern (引数 rer , forward ) とする。(x , c ) を引数に取り m を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 (y ) を引数に取り何も捕捉しない MatcherContinuation d を作る:アサート: y は MatchState 。 y を返す。 r を m (x , d ) とする。r が failure でなければ failure を返す。c (x ) を返す。
Note 4
(?!
Disjunction )
形式はゼロ幅負の先読み。成功には Disjunction 内のパターンが現在位置でマッチに失敗する必要がある。現在位置は後続をマッチする前に進まない。Disjunction は捕捉括弧を含み得るが、それらへの後方参照は Disjunction 内部でのみ意味を持つ。この負の先読みが成功するには失敗が必要であり、負の先読み外からのその捕捉への後方参照は常に undefined を返す。例:
/(.*?)a (?!(a+)b\2c)\2 (.*)/.exec ("baaabaac" )
は「a の直後に n (>0) 個の a、b、さらに n 個の a (\2
)、c」が続かない a を探す。2 つ目の \2
は負の先読みの外なので undefined にマッチし常に成功する。式は配列:
["baaabaac" , "ba" , undefined , "abaac" ]
を返す。
Assertion ::
(?<=
Disjunction
)
m を Disjunction の CompileSubpattern (引数 rer , backward ) とする。(x , c ) を引数に取り m を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 (y ) を引数に取り何も捕捉しない MatcherContinuation d を作る:アサート: y は MatchState 。 y を返す。 r を m (x , d ) とする。r が failure なら failure を返す。アサート: r は MatchState 。 cap を r .[[Captures]] とする。Input を x .[[Input]] とする。xe を x .[[EndIndex]] とする。z を MatchState { [[Input]] : Input , [[EndIndex]] : xe , [[Captures]] : cap } とする。c (z ) を返す。
Assertion ::
(?<!
Disjunction
)
m を Disjunction の CompileSubpattern (引数 rer , backward ) とする。(x , c ) を引数に取り m を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 (y ) を引数に取り何も捕捉しない MatcherContinuation d を作る:アサート: y は MatchState 。 y を返す。 r を m (x , d ) とする。r が failure でなければ failure を返す。c (x ) を返す。
22.2.2.4.1 IsWordChar ( rer , Input , e )
The abstract operation IsWordChar takes arguments rer (a RegExp Record ), Input (文字の List ), and e (整数 ) and returns Boolean. It performs the following steps when called:
InputLength を Input の要素数とする。e = -1 または e = InputLength なら false を返す。c を Input [e ] の文字とする。WordCharacters (rer ) に c が含まれるなら true を返す。false を返す。
22.2.2.5 実行時セマンティクス: CompileQuantifier を持つ Record
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
Quantifier :: QuantifierPrefix
qp を QuantifierPrefix の CompileQuantifierPrefix とする。Record { [[Min]] : qp .[[Min]] , [[Max]] : qp .[[Max]] , [[Greedy]] : true } を返す。
Quantifier ::
QuantifierPrefix
?
qp を QuantifierPrefix の CompileQuantifierPrefix とする。Record { [[Min]] : qp .[[Min]] , [[Max]] : qp .[[Max]] , [[Greedy]] : false } を返す。
22.2.2.6 実行時セマンティクス: CompileQuantifierPrefix を持つ Record
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
QuantifierPrefix :: *
Record { [[Min]] : 0, [[Max]] : +∞ } を返す。
QuantifierPrefix :: +
Record { [[Min]] : 1, [[Max]] : +∞ } を返す。
QuantifierPrefix :: ?
Record { [[Min]] : 0, [[Max]] : 1 } を返す。
QuantifierPrefix ::
{
DecimalDigits
}
i を DecimalDigits の MV (12.9.3 参照) とする。Record { [[Min]] : i , [[Max]] : i } を返す。
QuantifierPrefix ::
{
DecimalDigits
,}
i を DecimalDigits の MV とする。Record { [[Min]] : i , [[Max]] : +∞ } を返す。
QuantifierPrefix ::
{
DecimalDigits
,
DecimalDigits
}
i を最初の DecimalDigits の MV とする。j を 2 番目の DecimalDigits の MV とする。Record { [[Min]] : i , [[Max]] : j } を返す。
22.2.2.7 実行時セマンティクス: CompileAtom : Matcher
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note 1
It is defined piecewise over the following productions:
Atom :: PatternCharacter
ch を PatternCharacter にマッチした文字とする。A を文字 ch を含む 1 要素 CharSet とする。CharacterSetMatcher (rer , A , false , direction ) を返す。
Atom :: .
A を AllCharacters (rer ) とする。rer .[[DotAll]] が true でなければLineTerminator 生成規則右辺のコードポイントに対応する全ての文字を A から除去する。CharacterSetMatcher (rer , A , false , direction ) を返す。
Atom :: CharacterClass
cc を CharacterClass の CompileCharacterClass (引数 rer ) とする。cs を cc .[[CharSet]] とする。rer .[[UnicodeSets]] が false または cs の全 CharSetElement が単一文字(cs が空の場合を含む)から成るなら CharacterSetMatcher (rer , cs , cc .[[Invert]] , direction ) を返す。アサート: cc .[[Invert]] は false 。 lm を空の Matcher の List とする。cs 内で 1 文字を超える文字列を含む各 CharSetElement s について長さ降順で:cs2 を s の最後のコードポイントを含む 1 要素 CharSet とする。m2 を CharacterSetMatcher (rer , cs2 , false , direction )。s の 2 番目から最後の 1 つ前までの各コードポイント c1 を逆順で:cs1 を c1 を含む 1 要素 CharSet とする。m1 を CharacterSetMatcher (rer , cs1 , false , direction )。m2 を MatchSequence (m1 , m2 , direction ) に更新。m2 を lm に追加。singles を cs のうち単一文字から成る全 CharSetElement を含む CharSet とする。CharacterSetMatcher (rer , singles , false , direction ) を lm に追加。cs が空文字列を含むなら EmptyMatcher () を lm に追加。m2 を lm の最後の Matcher とする。lm の 2 番目から最後の要素を逆順に各 Matcher m1 についてm2 を MatchTwoAlternatives (m1 , m2 ) に更新。m2 を返す。
Atom ::
(
GroupSpecifier opt
Disjunction
)
m を Disjunction の CompileSubpattern (引数 rer , direction ) とする。parenIndex を CountLeftCapturingParensBefore(Atom ) とする。(x , c ) を引数に取り direction , m , parenIndex を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 (y ) を引数に取り x , c , direction , parenIndex を捕捉し以下を行う新しい MatcherContinuation d を作る:アサート: y は MatchState 。 cap を y .[[Captures]] のコピーとする。Input を x .[[Input]] とする。xe を x .[[EndIndex]] とする。ye を y .[[EndIndex]] とする。direction が forward ならアサート: xe ≤ ye 。 r を CaptureRange { [[StartIndex]] : xe , [[EndIndex]] : ye } とする。それ以外アサート: direction は backward 。 アサート: ye ≤ xe 。 r を CaptureRange { [[StartIndex]] : ye , [[EndIndex]] : xe } とする。 cap [parenIndex + 1] に r を設定。z を MatchState { [[Input]] : Input , [[EndIndex]] : ye , [[Captures]] : cap } とする。c (z ) を返す。 m (x , d ) を返す。
Note 2
(
Disjunction )
形式の括弧は Disjunction パターンの構成要素をグループ化し、マッチ結果を保存する。結果は後方参照(\
+ 非ゼロ 10 進数)、置換文字列で参照、または正規表現マッチ抽象クロージャが返す配列の一部として利用できる。捕捉挙動を抑止するには (?:
Disjunction )
を用いる。
Atom ::
(?
RegularExpressionModifiers
:
Disjunction
)
addModifiers を RegularExpressionModifiers にマッチしたソーステキストとする。removeModifiers を空文字列とする。modifiedRer を UpdateModifiers (rer , CodePointsToString(addModifiers ), removeModifiers ) とする。Disjunction の CompileSubpattern (引数 modifiedRer , direction ) を返す。
Atom ::
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction
)
addModifiers を最初の RegularExpressionModifiers にマッチしたソーステキストとする。removeModifiers を 2 番目の RegularExpressionModifiers にマッチしたソーステキストとする。modifiedRer を UpdateModifiers (rer , CodePointsToString(addModifiers ), CodePointsToString(removeModifiers )) とする。Disjunction の CompileSubpattern (引数 modifiedRer , direction ) を返す。
AtomEscape :: DecimalEscape
n を DecimalEscape の CapturingGroupNumber とする。アサート: n ≤ rer .[[CapturingGroupsCount]] 。 BackreferenceMatcher (rer , « n », direction ) を返す。
Note 3
\
に非ゼロ 10 進数 n が続くエスケープは n 番目の捕捉括弧集合の結果にマッチする (22.2.2.1 )。正規表現内の捕捉括弧数が n 未満ならエラー。n 以上あるが n 番目が何も捕捉せず undefined なら後方参照は常に成功する。
AtomEscape :: CharacterEscape
cv を CharacterEscape の CharacterValue とする。ch を character value が cv の文字とする。A を文字 ch を含む 1 要素 CharSet とする。CharacterSetMatcher (rer , A , false , direction ) を返す。
AtomEscape :: CharacterClassEscape
cs を CharacterClassEscape の CompileToCharSet (引数 rer ) とする。rer .[[UnicodeSets]] が false または cs の全 CharSetElement が単一文字(cs が空の場合含む)から成るなら CharacterSetMatcher (rer , cs , false , direction ) を返す。lm を空の Matcher の List とする。cs 内で 1 文字を超える文字列を含む各 CharSetElement s について長さ降順で:cs2 を s の最後のコードポイントを含む 1 要素 CharSet とする。m2 を CharacterSetMatcher (rer , cs2 , false , direction )。s の 2 番目から最後の 1 つ前までの各コードポイント c1 を逆順で:cs1 を c1 を含む 1 要素 CharSet 。m1 を CharacterSetMatcher (rer , cs1 , false , direction )。m2 を MatchSequence (m1 , m2 , direction ) に更新。m2 を lm に追加。singles を cs のうち単一文字から成る全 CharSetElement を含む CharSet とする。CharacterSetMatcher (rer , singles , false , direction ) を lm に追加。cs が空文字列を含むなら EmptyMatcher () を lm に追加。m2 を lm の最後の Matcher に。lm の 2 番目から最後の要素を逆順に各 m1 についてm2 を MatchTwoAlternatives (m1 , m2 ) に更新。m2 を返す。
AtomEscape ::
k
GroupName
matchingGroupSpecifiers を GroupSpecifiersThatMatch(GroupName ) とする。parenIndices を新しい空 List とする。matchingGroupSpecifiers の各 GroupSpecifier groupSpecifier についてparenIndex を CountLeftCapturingParensBefore(groupSpecifier ) とする。parenIndex を parenIndices に追加。BackreferenceMatcher (rer , parenIndices , direction ) を返す。
22.2.2.7.1 CharacterSetMatcher ( rer , A , invert , direction )
The abstract operation CharacterSetMatcher takes arguments rer (a RegExp Record ), A (CharSet ), invert (Boolean), and direction (forward または backward ) and returns Matcher . It performs the following steps when called:
rer .[[UnicodeSets]] が true ならアサート: invert は false 。 アサート: A の全 CharSetElement は単一文字。 (x , c ) を引数に取り rer , A , invert , direction を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 Input を x .[[Input]] とする。e を x .[[EndIndex]] とする。direction が forward なら f を e + 1 とし、そうでなければ f を e - 1。InputLength を Input の要素数とする。f < 0 または f > InputLength なら failure 。index を min (e , f ) とする。ch を Input [index ] の文字とする。cc を Canonicalize (rer , ch ) とする。A 内に正確に 1 文字 a を含む CharSetElement が存在し、Canonicalize (rer , a ) が cc なら found を true 、そうでなければ false 。invert が false かつ found が false なら failure 。invert が true かつ found が true なら failure 。cap を x .[[Captures]] とする。y を MatchState { [[Input]] : Input , [[EndIndex]] : f , [[Captures]] : cap } とする。c (y ) を返す。
22.2.2.7.2 BackreferenceMatcher ( rer , ns , direction )
The abstract operation BackreferenceMatcher takes arguments rer (a RegExp Record ), ns (正の整数 の List ), and direction (forward または backward ) and returns Matcher . It performs the following steps when called:
(x , c ) を引数に取り rer , ns , direction を捕捉し以下を行う新しい Matcher を返す:アサート: x は MatchState 。 アサート: c は MatcherContinuation 。 Input を x .[[Input]] とする。cap を x .[[Captures]] とする。r を undefined とする。各整数 n ∈ ns についてcap [n ] が undefined でなければアサート: r は undefined 。 r を cap [n ] に設定。 r が undefined なら c (x ) を返す。e を x .[[EndIndex]] とする。rs を r .[[StartIndex]] とする。re を r .[[EndIndex]] とする。len を re - rs とする。direction が forward なら f を e + len 、そうでなければ f を e - len 。InputLength を Input の要素数とする。f < 0 または f > InputLength なら failure 。g を min (e , f ) とする。0 ≤ i < len の整数 i で Canonicalize (rer , Input [rs + i ]) ≠ Canonicalize (rer , Input [g + i ]) となるものが存在するなら failure 。 y を MatchState { [[Input]] : Input , [[EndIndex]] : f , [[Captures]] : cap } とする。c (y ) を返す。
22.2.2.7.3 Canonicalize ( rer , ch )
The abstract operation Canonicalize takes arguments rer (a RegExp Record ) and ch (文字) and returns 文字. It performs the following steps when called:
HasEitherUnicodeFlag (rer ) が true かつ rer .[[IgnoreCase]] が true ならUnicode Character Database の CaseFolding.txt
が ch に単純または共通のケースフォールディングを提供するなら、その写像結果を返す。 ch を返す。rer .[[IgnoreCase]] が false なら ch を返す。アサート: ch は UTF-16 コードユニット。 cp を数値が ch の数値と等しいコードポイントとする。u を Unicode 既定ケース変換アルゴリズムに従い toUppercase(« cp ») とする。uStr を CodePointsToString(u ) とする。uStr の長さ ≠ 1 なら ch を返す。cu を uStr の単一コードユニット要素とする。ch の数値 ≥ 128 かつ cu の数値 < 128 なら ch を返す。cu を返す。
Note
HasEitherUnicodeFlag (rer ) が true の大文字小文字無視マッチでは、比較直前に全ての文字が Unicode 標準の simple case folding により暗黙にフォールディングされる。simple mapping は常に単一コードポイントへ写像するため ß
は ss
や SS
には写らない。基本ラテンブロック外から内へ写像する場合がある (例: ſ
→ s
, K
→ k
)。これらを含む文字列は /[a-z]/ui
などでマッチする。
HasEitherUnicodeFlag (rer ) が false の大文字小文字無視マッチでは toCasefold ではなく toUppercase に基づくため差異がある。例: Ω
は toUppercase では自身、toCasefold では ω
に写るため "\u2126" は /[ω]/ui
や /[\u03A9]/ui
にマッチするが /[ω]/i
や /[\u03A9]/i
にはマッチしない。また基本ラテン外から内への写像は行われないので "\u017F ſ" , "\u212A K" は /[a-z]/i
にマッチしない。
22.2.2.7.4 UpdateModifiers ( rer , add , remove )
The abstract operation UpdateModifiers takes arguments rer (a RegExp Record ), add (String), and remove (String) and returns RegExp Record . It performs the following steps when called:
アサート: add と remove は共通要素を持たない。 ignoreCase を rer .[[IgnoreCase]] 。multiline を rer .[[Multiline]] 。dotAll を rer .[[DotAll]] 。unicode を rer .[[Unicode]] 。unicodeSets を rer .[[UnicodeSets]] 。capturingGroupsCount を rer .[[CapturingGroupsCount]] 。remove に "i" が含まれるなら ignoreCase を false に。そうでなく add に "i" が含まれるなら ignoreCase を true に。 remove に "m" が含まれるなら multiline を false に。そうでなく add に "m" が含まれるなら multiline を true に。 remove に "s" が含まれるなら dotAll を false に。そうでなく add に "s" が含まれるなら dotAll を true に。 RegExp Record { [[IgnoreCase]] : ignoreCase , [[Multiline]] : multiline , [[DotAll]] : dotAll , [[Unicode]] : unicode , [[UnicodeSets]] : unicodeSets , [[CapturingGroupsCount]] : capturingGroupsCount } を返す。
22.2.2.8 実行時セマンティクス: CompileCharacterClass を持つ Record
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
CharacterClass ::
[
ClassContents
]
A を ClassContents の CompileToCharSet (引数 rer ) とする。Record { [[CharSet]] : A , [[Invert]] : false } を返す。
CharacterClass ::
[^
ClassContents
]
A を ClassContents の CompileToCharSet (引数 rer ) とする。rer .[[UnicodeSets]] が true ならRecord { [[CharSet]] : CharacterComplement (rer , A ), [[Invert]] : false } を返す。Record { [[CharSet]] : A , [[Invert]] : true } を返す。
22.2.2.9 実行時セマンティクス: CompileToCharSet : CharSet
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note 1
It is defined piecewise over the following productions:
ClassContents :: [empty]
空の CharSet を返す。
NonemptyClassRanges ::
ClassAtom
NonemptyClassRangesNoDash
A を ClassAtom の CompileToCharSet (引数 rer )。B を NonemptyClassRangesNoDash の CompileToCharSet (引数 rer )。CharSet A と B の和集合を返す。
NonemptyClassRanges ::
ClassAtom
-
ClassAtom
ClassContents
A を最初の ClassAtom の CompileToCharSet (引数 rer )。B を 2 番目の ClassAtom の CompileToCharSet (引数 rer )。C を ClassContents の CompileToCharSet (引数 rer )。D を CharacterRange (A , B )。D と C の和集合を返す。
NonemptyClassRangesNoDash ::
ClassAtomNoDash
NonemptyClassRangesNoDash
A を ClassAtomNoDash の CompileToCharSet (引数 rer )。B を NonemptyClassRangesNoDash の CompileToCharSet (引数 rer )。CharSet A と B の和集合を返す。
NonemptyClassRangesNoDash ::
ClassAtomNoDash
-
ClassAtom
ClassContents
A を ClassAtomNoDash の CompileToCharSet (引数 rer )。B を ClassAtom の CompileToCharSet (引数 rer )。C を ClassContents の CompileToCharSet (引数 rer )。D を CharacterRange (A , B )。D と C の和集合を返す。
Note 2
ClassContents は単一の ClassAtom 、およびダッシュで区切られた 2 つの ClassAtom の範囲になり得る。後者の場合、ClassContents には第 1 と第 2 の ClassAtom 間(含む)の全ての文字が含まれる。どちらかの ClassAtom が単一文字を表さない (例: \w) 場合、または第 1 の ClassAtom の character value が第 2 のそれより大きい場合はエラー。
Note 3
パターンが大文字小文字を無視する場合でも、範囲両端の大文字小文字は範囲に含まれる文字を決定する上で重要。例: /[E-F]/i
は E
, F
, e
, f
のみ、/[E-f]/i
は Unicode Basic Latin ブロックの全大文字小文字および [
, \
, ]
, ^
, _
, `
にマッチ。
Note 4
-
は文字通りにも範囲指定にも使える。ClassContents の先頭または末尾、範囲指定の開始/終了端、または範囲指定直後に現れる場合はリテラルとして扱われる。
ClassAtom :: -
単一文字 -
U+002D (HYPHEN-MINUS) を含む CharSet を返す。
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
SourceCharacter にマッチした文字を含む CharSet を返す。
ClassEscape ::
b
-
CharacterEscape
cv をこの ClassEscape の CharacterValue。c を character value が cv の文字。c を含む 1 要素 CharSet を返す。
Note 5
ClassAtom 内では、\b
, \B
, 後方参照を除く正規表現中で許されるエスケープを利用できる。CharacterClass 内では \b
はバックスペース文字、\B
と後方参照はエラー。ClassAtom 内で後方参照を用いるとエラー。
CharacterClassEscape :: d
文字 0
〜9
を含む 10 要素 CharSet を返す。
CharacterClassEscape :: D
S を
CharacterClassEscape :: d
の返す CharSet とする。CharacterComplement (rer , S ) を返す。
CharacterClassEscape :: s
WhiteSpace または LineTerminator 生成規則右辺のコードポイントに対応する全ての文字を含む CharSet を返す。
CharacterClassEscape :: S
S を
CharacterClassEscape :: s
の返す CharSet とする。CharacterComplement (rer , S ) を返す。
CharacterClassEscape :: w
MaybeSimpleCaseFolding (rer , WordCharacters (rer )) を返す。
CharacterClassEscape :: W
S を
CharacterClassEscape :: w
の返す CharSet とする。CharacterComplement (rer , S ) を返す。
CharacterClassEscape ::
p{
UnicodePropertyValueExpression
}
UnicodePropertyValueExpression の CompileToCharSet (引数 rer ) を返す。
CharacterClassEscape ::
P{
UnicodePropertyValueExpression
}
S を UnicodePropertyValueExpression の CompileToCharSet (引数 rer ) とする。アサート: S は単一コードポイントのみ含む。 CharacterComplement (rer , S ) を返す。
UnicodePropertyValueExpression ::
UnicodePropertyName
=
UnicodePropertyValue
ps を UnicodePropertyName にマッチしたソーステキスト。p を UnicodeMatchProperty (rer , ps )。アサート: p は Table 67 の「Property name and aliases」に列挙される Unicode プロパティ名 またはエイリアス。 vs を UnicodePropertyValue にマッチしたソーステキスト。v を UnicodeMatchPropertyValue (p , vs )。A をプロパティ p が値 v を持つ全 Unicode コードポイントを含む CharSet 。MaybeSimpleCaseFolding (rer , A ) を返す。
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
s を LoneUnicodePropertyNameOrValue にマッチしたソーステキスト。UnicodeMatchPropertyValue (General_Category
, s ) が General_Category (gc) のプロパティ値または値エイリアス(PropertyValueAliases.txt
)ならプロパティ “General_Category” が値 s を持つ全 Unicode コードポイントを含む CharSet を返す。 p を UnicodeMatchProperty (rer , s )。アサート: p は Table 68 の「Property name and aliases」列、または Table 69 の「Property name」列に列挙されるバイナリ Unicode プロパティ / そのエイリアス / 文字列のバイナリプロパティ。 A をプロパティ p が値 “True” を持つ全 CharSetElement を含む CharSet 。MaybeSimpleCaseFolding (rer , A ) を返す。
ClassUnion ::
ClassSetRange
ClassUnion opt
A を ClassSetRange の CompileToCharSet (引数 rer )。ClassUnion が存在するならB を ClassUnion の CompileToCharSet (引数 rer )。CharSet A と B の和集合を返す。A を返す。
ClassUnion ::
ClassSetOperand
ClassUnion opt
A を ClassSetOperand の CompileToCharSet (引数 rer )。ClassUnion が存在するならB を ClassUnion の CompileToCharSet (引数 rer )。CharSet A と B の和集合を返す。A を返す。
ClassIntersection ::
ClassSetOperand
&&
ClassSetOperand
A を最初の ClassSetOperand の CompileToCharSet (引数 rer )。B を 2 番目の ClassSetOperand の CompileToCharSet (引数 rer )。CharSet A と B の共通部分を返す。
ClassIntersection ::
ClassIntersection
&&
ClassSetOperand
A を ClassIntersection の CompileToCharSet (引数 rer )。B を ClassSetOperand の CompileToCharSet (引数 rer )。CharSet A と B の共通部分を返す。
ClassSubtraction ::
ClassSetOperand
--
ClassSetOperand
最初の ClassSetOperand の CompileToCharSet (引数 rer ) を A 。 2 番目の ClassSetOperand の CompileToCharSet (引数 rer ) を B 。 A のうち B でない CharSetElement を含む CharSet を返す。
ClassSubtraction ::
ClassSubtraction
--
ClassSetOperand
A を ClassSubtraction の CompileToCharSet (引数 rer )。B を ClassSetOperand の CompileToCharSet (引数 rer )。A のうち B でない CharSetElement を含む CharSet を返す。
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
A を最初の ClassSetCharacter の CompileToCharSet (引数 rer )。B を 2 番目の ClassSetCharacter の CompileToCharSet (引数 rer )。MaybeSimpleCaseFolding (rer , CharacterRange (A , B )) を返す。
Note 6
結果はしばしば 2 個以上の範囲で構成される。UnicodeSets が true かつ IgnoreCase が true のとき、MaybeSimpleCaseFolding (rer , [Ā-č]) はその範囲の奇数番コードポイントのみを含む。
ClassSetOperand :: ClassSetCharacter
A を ClassSetCharacter の CompileToCharSet (引数 rer )。MaybeSimpleCaseFolding (rer , A ) を返す。
ClassSetOperand :: ClassStringDisjunction
A を ClassStringDisjunction の CompileToCharSet (引数 rer )。MaybeSimpleCaseFolding (rer , A ) を返す。
ClassSetOperand :: NestedClass
NestedClass の CompileToCharSet (引数 rer ) を返す。
NestedClass ::
[
ClassContents
]
ClassContents の CompileToCharSet (引数 rer ) を返す。
NestedClass ::
[^
ClassContents
]
A を ClassContents の CompileToCharSet (引数 rer )。CharacterComplement (rer , A ) を返す。
NestedClass ::
\
CharacterClassEscape
CharacterClassEscape の CompileToCharSet (引数 rer ) を返す。
ClassStringDisjunction ::
\q{
ClassStringDisjunctionContents
}
ClassStringDisjunctionContents の CompileToCharSet (引数 rer ) を返す。
ClassStringDisjunctionContents :: ClassString
s を ClassString の CompileClassSetString (引数 rer )。文字列 s を 1 つだけ含む CharSet を返す。
ClassStringDisjunctionContents ::
ClassString
|
ClassStringDisjunctionContents
s を ClassString の CompileClassSetString (引数 rer )。A を文字列 s を 1 つ含む CharSet 。B を ClassStringDisjunctionContents の CompileToCharSet (引数 rer )。CharSet A と B の和集合を返す。
ClassSetCharacter ::
SourceCharacter but not ClassSetSyntaxCharacter
\
CharacterEscape
\
ClassSetReservedPunctuator
cv をこの ClassSetCharacter の CharacterValue。c を character value が cv の文字。c を含む 1 要素 CharSet を返す。
ClassSetCharacter :: \b
U+0008 (BACKSPACE) を含む 1 要素 CharSet を返す。
22.2.2.9.1 CharacterRange ( A , B )
The abstract operation CharacterRange takes arguments A (CharSet ) and B (CharSet ) and returns CharSet . It performs the following steps when called:
アサート: A , B はそれぞれ正確に 1 文字を含む。 a を CharSet A の唯一の文字。b を CharSet B の唯一の文字。i を文字 a の character value。j を文字 b の character value。アサート: i ≤ j 。 i から j まで(含む)の character value を持つ全ての文字を含む CharSet を返す。
22.2.2.9.2 HasEitherUnicodeFlag ( rer )
The abstract operation HasEitherUnicodeFlag takes argument rer (a RegExp Record ) and returns Boolean. It performs the following steps when called:
rer .[[Unicode]] が true または rer .[[UnicodeSets]] が true ならtrue を返す。false を返す。
22.2.2.9.3 WordCharacters ( rer )
The abstract operation WordCharacters takes argument rer (a RegExp Record ) and returns CharSet . \b
, \B
, \w
, \W
のために「word characters」と見なされる文字を含む CharSet を返す。 It performs the following steps when called:
basicWordChars を ASCII の word characters 全てを含む CharSet 。extraWordChars を、basicWordChars には含まれないが Canonicalize (rer , c ) が basicWordChars に含まれる全ての文字 c を含む CharSet 。アサート: HasEitherUnicodeFlag (rer ) が true かつ rer .[[IgnoreCase]] が true でない限り extraWordChars は空。 basicWordChars と extraWordChars の和集合を返す。
22.2.2.9.4 AllCharacters ( rer )
The abstract operation AllCharacters takes argument rer (a RegExp Record ) and returns CharSet . 正規表現フラグに従う「全ての文字」の集合を返す。 It performs the following steps when called:
rer .[[UnicodeSets]] が true かつ rer .[[IgnoreCase]] が true ならSimple Case Folding を持たない (scf (c ) = c ) 全 Unicode コードポイント c を含む CharSet を返す。 それ以外で HasEitherUnicodeFlag (rer ) が true なら全コードポイント値を含む CharSet を返す。 それ以外全コードユニット値を含む CharSet を返す。
22.2.2.9.5 MaybeSimpleCaseFolding ( rer , A )
The abstract operation MaybeSimpleCaseFolding takes arguments rer (a RegExp Record ) and A (CharSet ) and returns CharSet . rer .[[UnicodeSets]] が false または rer .[[IgnoreCase]] が false なら A を返す。そうでなければ Simple Case Folding (scf(cp ) ) の定義 (CaseFolding.txt
) を用い、A の各 CharSetElement を文字ごとに正規化して得られる CharSet を返す。 It performs the following steps when called:
rer .[[UnicodeSets]] が false または rer .[[IgnoreCase]] が false なら A を返す。B を新しい空の CharSet 。A の各 CharSetElement s についてt を空の文字列シーケンス。s 内の各単一コードポイント cp についてscf (cp ) を t に追加。t を B に追加。B を返す。
22.2.2.9.6 CharacterComplement ( rer , S )
The abstract operation CharacterComplement takes arguments rer (a RegExp Record ) and S (CharSet ) and returns CharSet . It performs the following steps when called:
A を AllCharacters (rer )。A のうち S に含まれない CharSetElement を含む CharSet を返す。
22.2.2.9.7 UnicodeMatchProperty ( rer , p )
The abstract operation UnicodeMatchProperty takes arguments rer (a RegExp Record ) and p (ECMAScript source text) and returns Unicode プロパティ名 . It performs the following steps when called:
rer .[[UnicodeSets]] が true かつ p が Table 69 の「Property name」列にある Unicode property name ならUnicode コードポイント列 p の List を返す。 アサート: p は Table 67 または Table 68 の「Property name and aliases」列に列挙される Unicode property name またはエイリアス。 c を対応行の “Canonical property name ” 列にある正規 property name 。Unicode コードポイント列 c の List を返す。
実装は Table 67 、Table 68 、Table 69 に列挙される Unicode プロパティ名 とエイリアスをサポートしなければならない。相互運用性確保のため、それ以外をサポートしてはならない。
Note 1
例: Script_Extensions
(プロパティ名 ) と scx
(エイリアス) は有効だが script_extensions
や Scx
は無効。
Note 2
列挙プロパティは UTS18 RL1.2 要求のスーパーセット。
Note 3
表中の綴り (大小含む) は Unicode Character Database の PropertyAliases.txt
の綴りと一致し、その正確な綴りは 安定性が保証 されている。
Table 67: Non-binary Unicode property aliases and their canonical property names
Table 68: Binary Unicode property aliases and their canonical property names
Table 69: Binary Unicode properties of strings
Property name
Basic_Emoji
Emoji_Keycap_Sequence
RGI_Emoji_Modifier_Sequence
RGI_Emoji_Flag_Sequence
RGI_Emoji_Tag_Sequence
RGI_Emoji_ZWJ_Sequence
RGI_Emoji
22.2.2.9.8 UnicodeMatchPropertyValue ( p , v )
The abstract operation UnicodeMatchPropertyValue takes arguments p (ECMAScript source text) and v (ECMAScript source text) and returns Unicode プロパティ値. It performs the following steps when called:
アサート: p は Table 67 の “Canonical property name” 列に列挙される正規・非エイリアス Unicode プロパティ名 。 アサート: v は PropertyValueAliases.txt
に列挙される Unicode プロパティ p のプロパティ値または値エイリアス。 value を対応行の “Canonical property value” 列にある正規プロパティ値。Unicode コードポイント列 value の List を返す。
実装は Table 67 に列挙されるプロパティについて、PropertyValueAliases.txt
に列挙される Unicode プロパティ値および値エイリアスをサポートしなければならない。相互運用性確保のため、それ以外の値・エイリアスをサポートしてはならない。
Note 1
例: Xpeo
と Old_Persian
は有効な Script_Extensions
値だが xpeo
や Old Persian
は無効。
Note 2
このアルゴリズムは UAX44 の symbolic 値マッチ規則 と異なり、大小・空白 ・U+002D (HYPHEN-MINUS)・U+005F (LOW LINE) を無視せず、Is
接頭辞をサポートしない。
22.2.2.10 実行時セマンティクス: CompileClassSetString : 文字列シーケンス
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
ClassString :: [empty]
空の文字列シーケンスを返す。
ClassString :: NonEmptyClassString
NonEmptyClassString の CompileClassSetString (引数 rer ) を返す。
NonEmptyClassString ::
ClassSetCharacter
NonEmptyClassString opt
cs を ClassSetCharacter の CompileToCharSet (引数 rer ) とする。s1 を cs の単一 CharSetElement である文字列シーケンスとする。NonEmptyClassString が存在するならs2 を NonEmptyClassString の CompileClassSetString (引数 rer )。s1 と s2 の連結を返す。s1 を返す。
22.2.3 RegExp 生成のための抽象操作
22.2.3.1 RegExpCreate ( P , F )
The abstract operation RegExpCreate takes arguments P (ECMAScript 言語値) and F (String または undefined ) and returns オブジェクトを含む通常完了または throw 完了. It performs the following steps when called:
obj を ! RegExpAlloc (%RegExp% ) とする。? RegExpInitialize (obj , P , F ) を返す。
22.2.3.2 RegExpAlloc ( newTarget )
The abstract operation RegExpAlloc takes argument newTarget (constructor) and returns オブジェクトを含む通常完了または throw 完了. It performs the following steps when called:
obj を ? OrdinaryCreateFromConstructor (newTarget , "%RegExp.prototype%" , « [[OriginalSource]] , [[OriginalFlags]] , [[RegExpRecord]] , [[RegExpMatcher]] ») とする。! DefinePropertyOrThrow (obj , "lastIndex" , PropertyDescriptor { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }) を実行する。 obj を返す。
22.2.3.3 RegExpInitialize ( obj , pattern , flags )
The abstract operation RegExpInitialize takes arguments obj (オブジェクト), pattern (ECMAScript 言語値), and flags (ECMAScript 言語値) and returns オブジェクトを含む通常完了または throw 完了. It performs the following steps when called:
pattern が undefined なら P を空文字列とする。そうでなければ P を ? ToString (pattern ) とする。 flags が undefined なら F を空文字列とする。そうでなければ F を ? ToString (flags ) とする。 F が "d" , "g" , "i" , "m" , "s" , "u" , "v" , "y" 以外のコードユニットを含むか、あるいは同じコードユニットを複数回含むなら SyntaxError 例外を投げる。F が "i" を含むなら i を true 、そうでなければ false とする。F が "m" を含むなら m を true 、そうでなければ false とする。F が "s" を含むなら s を true 、そうでなければ false とする。F が "u" を含むなら u を true 、そうでなければ false とする。F が "v" を含むなら v を true 、そうでなければ false とする。u が true もしくは v が true の場合patternText を StringToCodePoints(P ) とする。そうでなければpatternText を P の各 16-bit 要素を Unicode BMP コードポイントとして解釈した結果とする (UTF-16 デコードは行わない)。 parseResult を ParsePattern(patternText , u , v ) とする。parseResult が空でない SyntaxError オブジェクトの List なら SyntaxError 例外を投げる。アサート: parseResult は Pattern パースノードである。 obj .[[OriginalSource]] に P を設定する。obj .[[OriginalFlags]] に F を設定する。capturingGroupsCount を CountLeftCapturingParensWithin(parseResult ) とする。rer を RegExp Record { [[IgnoreCase]] : i , [[Multiline]] : m , [[DotAll]] : s , [[Unicode]] : u , [[UnicodeSets]] : v , [[CapturingGroupsCount]] : capturingGroupsCount } とする。obj .[[RegExpRecord]] に rer を設定する。obj .[[RegExpMatcher]] に 引数 rer で parseResult の CompilePattern を設定する。? Set (obj , "lastIndex" , +0 𝔽 , true ) を実行する。 obj を返す。
22.2.3.4
静的セマンティクス: ParsePattern (
patternText : Unicode コードポイント列,
u : Boolean,
v : Boolean,
): パースノードまたは空でない SyntaxError オブジェクト List
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
It performs the following steps when called:
v が true かつ u が true ならparseResult を 1 個以上の SyntaxError オブジェクトを含む List とする。そうでなく v が true ならparseResult を ParseText(patternText , Pattern [+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups] ) とする。 そうでなく u が true ならparseResult を ParseText(patternText , Pattern [+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups] ) とする。 それ以外parseResult を ParseText(patternText , Pattern [~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups] ) とする。 parseResult を返す。
22.2.4 RegExp コンストラクター
RegExp コンストラクタ ー:
%RegExp% である。
グローバルオブジェクト の "RegExp" プロパティの初期値である。
コンストラクタ ーとして呼び出されたとき新しい RegExp オブジェクトを生成し初期化する。
関数として呼び出された場合、新しい RegExp オブジェクトを返すか、引数が RegExp オブジェクト 1 つのみならその引数自体を返す。
クラス定義の extends
句の値として使用できる。指定された RegExp の挙動を継承するサブクラスのコンストラクタ ーは、必要な内部スロットを持つサブクラスインスタンスを生成・初期化するため RegExp コンストラクタ ーへの super
呼び出しを含めなければならない。
22.2.4.1 RegExp ( pattern , flags )
この関数は呼び出し時に以下を行う:
patternIsRegExp を ? IsRegExp (pattern ) とする。NewTarget が undefined ならnewTarget をアクティブな関数オブジェクト とする。patternIsRegExp が true かつ flags が undefined ならpatternConstructor を ? Get (pattern , "constructor" ) とする。SameValue (newTarget , patternConstructor ) が true なら pattern を返す。 そうでなければnewTarget を NewTarget とする。 pattern がオブジェクトで [[RegExpMatcher]] 内部スロットを持つならP を pattern .[[OriginalSource]] とする。flags が undefined なら F を pattern .[[OriginalFlags]] とし、そうでなければ F を flags とする。そうでなく patternIsRegExp が true ならP を ? Get (pattern , "source" ) とする。flags が undefined ならF を ? Get (pattern , "flags" ) とする。そうでなければF を flags とする。 それ以外P を pattern とする。F を flags とする。 O を ? RegExpAlloc (newTarget ) とする。? RegExpInitialize (O , P , F ) を返す。
Note
pattern が StringLiteral で与えられる場合、通常のエスケープシーケンス置換が本関数で処理される前に適用される。pattern がこの関数に認識させるためにエスケープシーケンスを含む必要があるなら、StringLiteral 内で U+005C (REVERSE SOLIDUS) は削除されないようエスケープされなければならない。
22.2.5 RegExp コンストラクターのプロパティ
RegExp コンストラクタ ー:
22.2.5.1 RegExp.escape ( S )
この関数は、正規表現 Pattern 内で特別な意味を持ち得る文字が等価なエスケープシーケンスに置換された S のコピーを返す。
呼び出し時に以下を行う:
S が String でなければ TypeError 例外を投げる。escaped を空文字列とする。cpList を StringToCodePoints(S ) とする。cpList の各コードポイント cp についてescaped が空文字列でかつ cp が DecimalDigit または AsciiLetter のいずれかにマッチするなら注記: 先頭の数字をエスケープすることで、\0
や \1
などの DecimalEscape の後で文字列 S をマッチさせる際、前のエスケープシーケンス拡張と解釈されるのを防ぐ。先頭の ASCII 文字も \c
の後の文脈で同様。 numericValue を cp の数値とする。hex を Number::toString (𝔽 (numericValue ), 16) とする。アサート: hex の長さは 2。 escaped を 0x005C (REVERSE SOLIDUS), "x" , hex の連結に設定する。そうでなければescaped を escaped と EncodeForRegExpEscape (cp ) の連結に設定する。 escaped を返す。
Note
名前が類似していても EscapeRegExpPattern と RegExp.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:
cp が SyntaxCharacter にマッチするか、cp が U+002F (SOLIDUS) なら0x005C (REVERSE SOLIDUS) と UTF16EncodeCodePoint(cp ) の連結を返す。 そうでなく cp が Table 65 の “Code Point” 列に列挙されるコードポイントなら0x005C (REVERSE SOLIDUS) と対応行の “ControlEscape” 列の文字列との連結を返す。 otherPunctuators を ",-=<>#&!%:;@~'`" とコードユニット 0x0022 (QUOTATION MARK) の連結とする。toEscape を StringToCodePoints(otherPunctuators ) とする。toEscape が cp を含む、または cp が WhiteSpace もしくは LineTerminator にマッチする、または cp が先行サロゲートまたは後続サロゲートと同じ数値を持つならcpNum を cp の数値とする。cpNum ≤ 0xFF ならhex を Number::toString (𝔽 (cpNum ), 16) とする。0x005C (REVERSE SOLIDUS), "x" , StringPad (hex , 2, "0" , start ) の連結を返す。 escaped を空文字列とする。codeUnits を UTF16EncodeCodePoint(cp ) とする。各コードユニット cu についてescaped を escaped と UnicodeEscape (cu ) の連結にする。 escaped を返す。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 アクセサは呼び出し時以下を行う:
this 値を返す。
この関数の "name" プロパティ値は "get [Symbol.species]" である。
Note
RegExp プロトタイプメソッドは通常 this 値の constructor を用いて派生オブジェクトを生成する。サブクラスの constructor は %Symbol.species% プロパティを再定義することで既定挙動を上書きできる。
22.2.6 RegExp プロトタイプオブジェクトのプロパティ
RegExp プロトタイプオブジェクト :
%RegExp.prototype% である。
通常のオブジェクトである。
RegExp インスタンスではなく [[RegExpMatcher]] 内部スロットや他の RegExp インスタンス内部スロットを持たない。
[[Prototype]] 内部スロットの値は %Object.prototype% である。
Note
RegExp プロトタイプオブジェクトは自身の "valueOf" プロパティを持たないが、Object プロトタイプオブジェクト から継承する。
22.2.6.1 RegExp.prototype.constructor
RegExp.prototype.constructor
の初期値は %RegExp% である。
22.2.6.2 RegExp.prototype.exec ( string )
このメソッドは string 内で正規表現パターンの出現を検索し、マッチ結果を含む Array を返す。マッチしなければ null を返す。
呼び出し時に以下を行う:
R を this 値とする。? RequireInternalSlot (R , [[RegExpMatcher]] ) を実行する。 S を ? ToString (string ) とする。? RegExpBuiltinExec (R , S ) を返す。
22.2.6.3 get RegExp.prototype.dotAll
RegExp.prototype.dotAll
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
R を this 値とする。cu をコードユニット 0x0073 (LATIN SMALL LETTER S) とする。? RegExpHasFlag (R , cu ) を返す。
22.2.6.4 get RegExp.prototype.flags
RegExp.prototype.flags
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
R を this 値とする。R がオブジェクトでなければ TypeError 例外を投げる。codeUnits を空 List とする。hasIndices を ToBoolean (? Get (R , "hasIndices" )) とする。hasIndices が true ならコードユニット 0x0064 (LATIN SMALL LETTER D) を codeUnits に追加。global を ToBoolean (? Get (R , "global" )) とする。global が true なら 0x0067 (LATIN SMALL LETTER G) を追加。ignoreCase を ToBoolean (? Get (R , "ignoreCase" )) とする。ignoreCase が true なら 0x0069 (LATIN SMALL LETTER I) を追加。multiline を ToBoolean (? Get (R , "multiline" )) とする。multiline が true なら 0x006D (LATIN SMALL LETTER M) を追加。dotAll を ToBoolean (? Get (R , "dotAll" )) とする。dotAll が true なら 0x0073 (LATIN SMALL LETTER S) を追加。unicode を ToBoolean (? Get (R , "unicode" )) とする。unicode が true なら 0x0075 (LATIN SMALL LETTER U) を追加。unicodeSets を ToBoolean (? Get (R , "unicodeSets" )) とする。unicodeSets が true なら 0x0076 (LATIN SMALL LETTER V) を追加。sticky を ToBoolean (? Get (R , "sticky" )) とする。sticky が true なら 0x0079 (LATIN SMALL LETTER Y) を追加。codeUnits の要素をコードユニットとする String 値を返す。要素が無ければ空文字列を返す。
22.2.6.4.1 RegExpHasFlag ( R , codeUnit )
The abstract operation RegExpHasFlag takes arguments R (ECMAScript 言語値) and codeUnit (コードユニット) and returns Boolean または undefined を含む通常完了または throw 完了. It performs the following steps when called:
R がオブジェクトでなければ TypeError 例外。R が [[OriginalFlags]] 内部スロットを持たないならSameValue (R , %RegExp.prototype% ) が true なら undefined を返す。そうでなければ TypeError 例外。 flags を R .[[OriginalFlags]] とする。flags が codeUnit を含むなら true を返す。false を返す。
22.2.6.5 get RegExp.prototype.global
RegExp.prototype.global
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
R を this 値。cu を 0x0067 (LATIN SMALL LETTER G)。? RegExpHasFlag (R , cu ) を返す。
22.2.6.6 get RegExp.prototype.hasIndices
RegExp.prototype.hasIndices
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
R を this 値。cu を 0x0064 (LATIN SMALL LETTER D)。? RegExpHasFlag (R , cu ) を返す。
22.2.6.7 get RegExp.prototype.ignoreCase
RegExp.prototype.ignoreCase
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
R を this 値。cu を 0x0069 (LATIN SMALL LETTER I)。? RegExpHasFlag (R , cu ) を返す。
22.2.6.8 RegExp.prototype [ %Symbol.match% ] ( string )
このメソッドは呼び出し時以下を行う:
rx を this 値とする。rx がオブジェクトでなければ TypeError 例外。S を ? ToString (string ) とする。flags を ? ToString (? Get (rx , "flags" )) とする。flags が "g" を含まなければ? RegExpExec (rx , S ) を返す。 そうでなければflags が "u" または "v" を含むなら fullUnicode を true 、そうでなければ false とする。? Set (rx , "lastIndex" , +0 𝔽 , true ) を実行する。 A を ! ArrayCreate (0) とする。n を 0 とする。繰り返し、result を ? RegExpExec (rx , S ) とする。result が null ならn = 0 なら null を返す。A を返す。そうでなければmatchStr を ? ToString (? Get (result , "0" )) とする。! CreateDataPropertyOrThrow (A , ! ToString (𝔽 (n )), matchStr ) を実行。 matchStr が空文字列ならthisIndex を ℝ (? ToLength (? Get (rx , "lastIndex" ))) とする。nextIndex を AdvanceStringIndex (S , thisIndex , fullUnicode ) とする。? Set (rx , "lastIndex" , 𝔽 (nextIndex ), true ) を実行。 n を n + 1 にする。
このメソッドの "name" プロパティ値は "[Symbol.match]" である。
Note
%Symbol.match% プロパティは IsRegExp 抽象操作 が正規表現基本挙動を持つオブジェクトを識別するのに用いられる。%Symbol.match% が存在しないか、その値が真へ強制されない場合、そのオブジェクトは正規表現オブジェクトとして意図されない。
22.2.6.9 RegExp.prototype [ %Symbol.matchAll% ] ( string )
このメソッドは呼び出し時以下を行う:
R を this 値とする。R がオブジェクトでなければ TypeError 例外。S を ? ToString (string ) とする。C を ? SpeciesConstructor (R , %RegExp% ) とする。flags を ? ToString (? Get (R , "flags" )) とする。matcher を ? Construct(C , « R , flags ») とする。lastIndex を ? ToLength (? Get (R , "lastIndex" )) とする。? Set (matcher , "lastIndex" , lastIndex , true ) を実行。 flags が "g" を含むなら global を true 、そうでなければ false 。flags が "u" または "v" を含むなら fullUnicode を true 、そうでなければ false 。CreateRegExpStringIterator (matcher , S , global , fullUnicode ) を返す。
このメソッドの "name" プロパティ値は "[Symbol.matchAll]" である。
22.2.6.10 get RegExp.prototype.multiline
RegExp.prototype.multiline
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
R を this 値。cu を 0x006D (LATIN SMALL LETTER M)。? RegExpHasFlag (R , cu ) を返す。
22.2.6.11 RegExp.prototype [ %Symbol.replace% ] ( string , replaceValue )
このメソッドは呼び出し時以下を行う:
rx を this 値とする。rx がオブジェクトでなければ TypeError 例外。S を ? ToString (string ) とする。lengthS を S の長さとする。functionalReplace を IsCallable (replaceValue ) とする。functionalReplace が false ならreplaceValue を ? ToString (replaceValue ) とする。flags を ? ToString (? Get (rx , "flags" )) とする。flags が "g" を含むなら global を true 、そうでなければ false 。global が true なら? Set (rx , "lastIndex" , +0 𝔽 , true ) を実行。 results を空 List とする。done を false とする。done が false の間繰り返し、result を ? RegExpExec (rx , S ) とする。result が null ならdone を true にする。そうでなければresult を results に追加。global が false ならdone を true にする。そうでなければmatchStr を ? ToString (? Get (result , "0" )) とする。matchStr が空文字列ならthisIndex を ℝ (? ToLength (? Get (rx , "lastIndex" ))) とする。flags が "u" または "v" を含むなら fullUnicode を true 、そうでなければ false 。nextIndex を AdvanceStringIndex (S , thisIndex , fullUnicode ) とする。? Set (rx , "lastIndex" , 𝔽 (nextIndex ), true ) を実行。 accumulatedResult を空文字列。nextSourcePosition を 0。各 result ∈ results についてresultLength を ? LengthOfArrayLike (result )。nCaptures を max (resultLength - 1, 0)。matched を ? ToString (? Get (result , "0" ))。matchLength を matched の長さ。position を ? ToIntegerOrInfinity (? Get (result , "index" ))。position を 0 と lengthS の間にクランプ。captures を新しい空 List 。n を 1。n ≤ nCaptures の間繰り返し、capN を ? Get (result , ! ToString (𝔽 (n )))。capN が undefined でなければcapN を ? ToString (capN )。capN を captures に追加。注記: n = 1 のとき最初のキャプチャが captures [0] に入る。一般に n 番目のキャプチャは captures [n - 1]。 n を n + 1。namedCaptures を ? Get (result , "groups" )。functionalReplace が true ならreplacerArgs を « matched » と captures と « 𝔽 (position ), S » のリスト連結とする。namedCaptures が undefined でなければreplacerArgs に namedCaptures を追加。replacementValue を ? Call(replaceValue , undefined , replacerArgs )。replacementString を ? ToString (replacementValue )。そうでなければnamedCaptures が undefined でなければnamedCaptures を ? ToObject (namedCaptures )。replacementString を ? GetSubstitution (matched , S , position , captures , namedCaptures , replaceValue )。 position ≥ nextSourcePosition なら注記: position が後退するのは通常想定外であり、不正な RegExp サブクラス動作や副作用でフラグ等を変更した兆候である。その場合対応置換は無視される。 accumulatedResult を accumulatedResult と S の nextSourcePosition から position まで、および replacementString の連結にする。nextSourcePosition を position + matchLength にする。 nextSourcePosition ≥ lengthS なら accumulatedResult を返す。accumulatedResult と S の nextSourcePosition から末尾までの部分文字列 の連結を返す。
このメソッドの "name" プロパティ値は "[Symbol.replace]" である。
22.2.6.12 RegExp.prototype [ %Symbol.search% ] ( string )
このメソッドは呼び出し時以下を行う:
rx を this 値。rx がオブジェクトでなければ TypeError 例外。S を ? ToString (string )。previousLastIndex を ? Get (rx , "lastIndex" )。previousLastIndex が +0 𝔽 でなければ? Set (rx , "lastIndex" , +0 𝔽 , true ) を実行。 result を ? RegExpExec (rx , S )。currentLastIndex を ? Get (rx , "lastIndex" )。SameValue (currentLastIndex , previousLastIndex ) が false なら? Set (rx , "lastIndex" , previousLastIndex , true ) を実行。 result が null なら -1 𝔽 を返す。? 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 アクセサは以下を行う:
R を this 値。R がオブジェクトでなければ TypeError 例外。R が [[OriginalSource]] 内部スロットを持たないならSameValue (R , %RegExp.prototype% ) が true なら "(?:)" を返す。そうでなければ TypeError 例外。 アサート: R は [[OriginalFlags]] 内部スロットを持つ。 src を R .[[OriginalSource]] 。flags を R .[[OriginalFlags]] 。EscapeRegExpPattern (src , flags ) を返す。
22.2.6.13.1 EscapeRegExpPattern ( P , F )
The abstract operation EscapeRegExpPattern takes arguments P (String) and F (String) and returns String. It performs the following steps when called:
F が "v" を含むならpatternSymbol を Pattern [+UnicodeMode, +UnicodeSetsMode] とする。そうでなく F が "u" を含むならpatternSymbol を Pattern [+UnicodeMode, ~UnicodeSetsMode] とする。 それ以外patternSymbol を Pattern [~UnicodeMode, ~UnicodeSetsMode] とする。 S を、特定コードポイントが下記のようにエスケープされた、P (UTF-16 エンコードされた Unicode コードポイントと解釈) に等価な patternSymbol 形式の String とする。S は P と同一である場合と異なる場合があるが、S を patternSymbol として評価して得られる抽象クロージャは生成オブジェクトの [[RegExpMatcher]] 内部スロットの抽象クロージャと同一に振る舞わなければならない。同じ P , F での複数回呼び出しは同一結果を生成しなければならない。パターンに現れる /
または任意の LineTerminator コードポイントは、"/ ", S , "/" , F の連結が (適切な字句文脈で) 同一に振る舞う RegularExpressionLiteral としてパース可能となるよう S 内で必要に応じエスケープされる。例: P が "/" の場合 S は "\/" や "\u002F" 等が許されるが "/" は不可 ( ///
+ F が SingleLineComment と解釈されるため )。 P が空文字列なら S を "(?:)" として要件を満たせる。 S を返す。
Note
名前が類似していても RegExp.escape
と EscapeRegExpPattern は異なる。前者は文字列をパターン内部表現用にエスケープし、後者はパターンを文字列表現用にエスケープする。
22.2.6.14 RegExp.prototype [ %Symbol.split% ] ( string , limit )
Note 1
このメソッドは string を String に変換した結果の部分文字列 を格納した配列を返す。部分文字列 は this 値である正規表現のマッチを左から右に探索して決定され、マッチ位置自体は結果配列要素には含まれず文字列を区切る役割をする。
this 値は空の正規表現、または空文字列にマッチする正規表現であり得る。その場合、入力文字列の先頭・末尾、前の区切りマッチ末尾における空 substring にはマッチしない。(例: 正規表現が空文字列にマッチするなら文字列は各コードユニット要素に分割され、結果配列長は文字列長に等しく、各 substring は 1 コードユニット。)あるインデックスで考慮されるマッチは最初の一つのみで、バックトラッキングにより非空マッチが得られても再考しない。(例: /a*?/[Symbol.split]("ab")
は ["a","b"]
、/a*/[Symbol.split]("ab")
は ["","b"]
。)
string が(または変換後)空文字列の場合、正規表現が空文字列にマッチ可能かどうかで結果が異なる。マッチ可能なら結果配列は空、そうでなければ空文字列 1 要素を含む。
正規表現が捕捉括弧を含むとき、separator がマッチする毎にその結果(undefined を含む)が出力配列に挿入される。例:
/<(\/)?([^<> ]+)>/[Symbol.split]("A<B > bold</B > and<CODE > coded</CODE > ")
は配列
["A" , undefined , "B" , "bold" , "/" , "B" , "and" , undefined , "CODE" , "coded" , "/" , "CODE" , "" ]
を生成する。
limit が undefined でなければ、出力配列は limit 要素を超えないよう切り詰められる。
このメソッドは呼び出し時以下を行う:
rx を this 値。rx がオブジェクトでなければ TypeError 例外。S を ? ToString (string )。C を ? SpeciesConstructor (rx , %RegExp% )。flags を ? ToString (? Get (rx , "flags" ))。flags が "u" または "v" を含むなら unicodeMatching を true 、そうでなければ false 。flags が "y" を含むなら newFlags を flags 、そうでなければ newFlags を flags と "y" の連結とする。splitter を ? Construct(C , « rx , newFlags »)。A を ! ArrayCreate (0)。lengthA を 0。limit が undefined なら lim を 232 - 1、そうでなければ ℝ (? ToUint32 (limit ))。lim = 0 なら A を返す。S が空文字列ならz を ? RegExpExec (splitter , S )。z が null でなければ A を返す。! CreateDataPropertyOrThrow (A , "0" , S )。 A を返す。size を S の長さ。p を 0。q を p 。q < size の間繰り返し、? Set (splitter , "lastIndex" , 𝔽 (q ), true )。 z を ? RegExpExec (splitter , S )。z が null ならq を AdvanceStringIndex (S , q , unicodeMatching ) とする。そうでなければe を ℝ (? ToLength (? Get (splitter , "lastIndex" )))。e を min (e , size )。e = p ならq を AdvanceStringIndex (S , q , unicodeMatching )。そうでなければT を S の p から q の部分文字列 。! CreateDataPropertyOrThrow (A , ! ToString (𝔽 (lengthA )), T )。 lengthA を lengthA + 1。lengthA = lim なら A を返す。p を e 。numberOfCaptures を ? LengthOfArrayLike (z )。numberOfCaptures を max (numberOfCaptures - 1, 0)。i を 1。i ≤ numberOfCaptures の間繰り返し、nextCapture を ? Get (z , ! ToString (𝔽 (i )))。! CreateDataPropertyOrThrow (A , ! ToString (𝔽 (lengthA )), nextCapture )。 i を i + 1。lengthA を lengthA + 1。lengthA = lim なら A を返す。q を p に設定。 T を S の p から size の部分文字列 。! CreateDataPropertyOrThrow (A , ! ToString (𝔽 (lengthA )), T )。 A を返す。
このメソッドの "name" プロパティ値は "[Symbol.split]" である。
Note 2
このメソッドは RegExp オブジェクトの "global" および "sticky" プロパティ値を無視する。
22.2.6.15 get RegExp.prototype.sticky
RegExp.prototype.sticky
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
R を this 値。cu を 0x0079 (LATIN SMALL LETTER Y)。? RegExpHasFlag (R , cu ) を返す。
22.2.6.16 RegExp.prototype.test ( S )
このメソッドは呼び出し時以下を行う:
R を this 値。R がオブジェクトでなければ TypeError 例外。string を ? ToString (S )。match を ? RegExpExec (R , string )。match が null でなければ true 、そうでなければ false を返す。
22.2.6.17 RegExp.prototype.toString ( )
R を this 値。R がオブジェクトでなければ TypeError 例外。pattern を ? ToString (? Get (R , "source" ))。flags を ? ToString (? Get (R , "flags" ))。result を "/" , pattern , "/" , flags の連結とする。result を返す。
Note
返される String は RegularExpressionLiteral の形式であり、同じ挙動の別 RegExp オブジェクトを評価する。
22.2.6.18 get RegExp.prototype.unicode
RegExp.prototype.unicode
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
R を this 値。cu を 0x0075 (LATIN SMALL LETTER U)。? RegExpHasFlag (R , cu ) を返す。
22.2.6.19 get RegExp.prototype.unicodeSets
RegExp.prototype.unicodeSets
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
R を this 値。cu を 0x0076 (LATIN SMALL LETTER V)。? RegExpHasFlag (R , cu ) を返す。
22.2.7 RegExp マッチングのための抽象操作
22.2.7.1 RegExpExec ( R , S )
The abstract operation RegExpExec takes arguments R (オブジェクト) and S (String) and returns オブジェクトまたは null を含む通常完了、または throw 完了. It performs the following steps when called:
exec を ? Get (R , "exec" ) とする。IsCallable (exec ) が true ならresult を ? Call(exec , R , « S ») とする。result がオブジェクトでも null でもなければ TypeError 例外。result を返す。? RequireInternalSlot (R , [[RegExpMatcher]] ) を実行。 ? RegExpBuiltinExec (R , S ) を返す。
Note
呼び出し可能な "exec" プロパティが見つからない場合、このアルゴリズムは組み込み正規表現マッチングアルゴリズムにフォールバックする。これは過去版でほとんどの組み込みアルゴリズムが "exec" の動的プロパティ参照を行わなかったコードとの互換性を提供する。
22.2.7.2 RegExpBuiltinExec ( R , S )
The abstract operation RegExpBuiltinExec takes arguments R (初期化済み RegExp インスタンス) and S (String) and returns Array エキゾチックオブジェクト または null を含む通常完了、または throw 完了. It performs the following steps when called:
length を S の長さ。lastIndex を ℝ (? ToLength (! Get (R , "lastIndex" )))。flags を R .[[OriginalFlags]] 。flags が "g" を含むなら global を true 、そうでなければ false 。flags が "y" を含むなら sticky を true 、そうでなければ false 。flags が "d" を含むなら hasIndices を true 、そうでなければ false 。global が false かつ sticky が false なら lastIndex を 0 に設定。matcher を R .[[RegExpMatcher]] 。flags が "u" または "v" を含むなら fullUnicode を true 、そうでなければ false 。matchSucceeded を false 。fullUnicode が true なら input を StringToCodePoints(S )、そうでなければ input を S のコードユニット列 List とする。注記: input の各要素は文字と見なす。 matchSucceeded が false の間繰り返し、lastIndex > length ならglobal または sticky が true なら? Set (R , "lastIndex" , +0 𝔽 , true ) を実行。 null を返す。inputIndex を S の lastIndex 番目要素から得た文字の input 内インデックスとする。r を matcher (input , inputIndex ) とする。r が failure ならsticky が true なら? Set (R , "lastIndex" , +0 𝔽 , true )。 null を返す。lastIndex を AdvanceStringIndex (S , lastIndex , fullUnicode ) に設定。そうでなければアサート: r は MatchState 。 matchSucceeded を true にする。 e を r .[[EndIndex]] 。fullUnicode が true なら e を GetStringIndex (S , e ) に設定。global または sticky が true なら? Set (R , "lastIndex" , 𝔽 (e ), true )。 n を r .[[Captures]] の要素数。アサート: n = R .[[RegExpRecord]] .[[CapturingGroupsCount]] 。 アサート: n < 232 - 1。 A を ! ArrayCreate (n + 1)。アサート: A ."length" の数学的値は n + 1。 ! CreateDataPropertyOrThrow (A , "index" , 𝔽 (lastIndex ))。 ! CreateDataPropertyOrThrow (A , "input" , S )。 match を Match Record { [[StartIndex]] : lastIndex , [[EndIndex]] : e }。indices を空 List 。groupNames を空 List 。indices に match を追加。matchedSubstr を GetMatchString (S , match )。! CreateDataPropertyOrThrow (A , "0" , matchedSubstr )。 R が GroupName を含むならgroups を OrdinaryObjectCreate (null )。hasGroups を true 。そうでなければgroups を undefined 。hasGroups を false 。 ! CreateDataPropertyOrThrow (A , "groups" , groups )。 matchedGroupNames を空 List 。1 ≤ i ≤ n を昇順で各 i についてcaptureI を r .[[Captures]] の i 番目要素。captureI が undefined ならcapturedValue を undefined 。indices に undefined を追加。そうでなければcaptureStart を captureI .[[StartIndex]] 。captureEnd を captureI .[[EndIndex]] 。fullUnicode が true ならcaptureStart を GetStringIndex (S , captureStart )。captureEnd を GetStringIndex (S , captureEnd )。capture を Match Record { [[StartIndex]] : captureStart , [[EndIndex]] : captureEnd }。capturedValue を GetMatchString (S , capture )。indices に capture を追加。 ! CreateDataPropertyOrThrow (A , ! ToString (𝔽 (i )), capturedValue )。 i 番目のキャプチャが GroupName で定義されているならs をその GroupName の CapturingGroupName とする。matchedGroupNames が s を含むならアサート: capturedValue は undefined 。 groupNames に undefined を追加。そうでなければcapturedValue が undefined でなければ s を matchedGroupNames に追加。注記: 同名グループが複数ある場合 groups に既に s プロパティが存在することがあるが、すべて可書きデータプロパティ なので CreateDataPropertyOrThrow は成功する。 ! CreateDataPropertyOrThrow (groups , s , capturedValue )。 groupNames に s を追加。 そうでなければgroupNames に undefined を追加。 hasIndices が true ならindicesArray を MakeMatchIndicesIndexPairArray (S , indices , groupNames , hasGroups ) とする。! CreateDataPropertyOrThrow (A , "indices" , indicesArray )。 A を返す。
22.2.7.3 AdvanceStringIndex ( S , index , unicode )
The abstract operation AdvanceStringIndex takes arguments S (String), index (非負整数 ), and unicode (Boolean) and returns 整数 . It performs the following steps when called:
アサート: index ≤ 253 - 1。 unicode が false なら index + 1 を返す。length を S の長さ。index + 1 ≥ length なら index + 1 を返す。cp を CodePointAt(S , index )。index + cp .[[CodeUnitCount]] を返す。
22.2.7.4 GetStringIndex ( S , codePointIndex )
The abstract operation GetStringIndex takes arguments S (String) and codePointIndex (非負整数 ) and returns 非負整数 . S を UTF-16 エンコードされたコードポイント列として解釈し (6.1.4 )、codePointIndex に対応するコードユニットインデックスが存在すればそれを返し、存在しなければ S の長さを返す。 It performs the following steps when called:
S が空文字列なら 0 を返す。len を S の長さ。codeUnitCount を 0。codePointCount を 0。codeUnitCount < len の間繰り返し、codePointCount = codePointIndex なら codeUnitCount を返す。cp を CodePointAt(S , codeUnitCount )。codeUnitCount を codeUnitCount + cp .[[CodeUnitCount]] に。codePointCount を codePointCount + 1 に。len を返す。
22.2.7.5 Match レコード
Match Record は正規表現のマッチまたはキャプチャの開始・終了インデックスを保持する Record 値である。
Match Record は Table 70 に列挙するフィールドを持つ。
Table 70: Match Record Fields
Field Name
Value
Meaning
[[StartIndex]]
非負整数
マッチ開始位置 (含む) までのコードユニット数。
[[EndIndex]]
[[StartIndex]] 以上の整数
マッチ終了位置 (含まない) までのコードユニット数。
22.2.7.6 GetMatchString ( S , match )
The abstract operation GetMatchString takes arguments S (String) and match (Match Record ) and returns String. It performs the following steps when called:
アサート: match .[[StartIndex]] ≤ match .[[EndIndex]] ≤ S の長さ。 S の match .[[StartIndex]] から match .[[EndIndex]] までの部分文字列 を返す。
22.2.7.7 GetMatchIndexPair ( S , match )
The abstract operation GetMatchIndexPair takes arguments S (String) and match (Match Record ) and returns Array. It performs the following steps when called:
アサート: match .[[StartIndex]] ≤ match .[[EndIndex]] ≤ S の長さ。 CreateArrayFromList (« 𝔽 (match .[[StartIndex]] ), 𝔽 (match .[[EndIndex]] ) ») を返す。
22.2.7.8 MakeMatchIndicesIndexPairArray ( S , indices , groupNames , hasGroups )
The abstract operation MakeMatchIndicesIndexPairArray takes arguments S (String), indices (Match Record または undefined の List ), groupNames (String または undefined の List ), and hasGroups (Boolean) and returns Array. It performs the following steps when called:
n を indices の要素数。アサート: n < 232 - 1。 アサート: groupNames は n - 1 要素を持つ。 注記: groupNames の要素は indices [1] から整列。 A を ! ArrayCreate (n )。hasGroups が true ならgroups を OrdinaryObjectCreate (null )。そうでなければgroups を undefined 。 ! CreateDataPropertyOrThrow (A , "groups" , groups )。 0 ≤ i < n を昇順で各 i についてmatchIndices を indices [i ]。matchIndices が undefined でなければmatchIndexPair を GetMatchIndexPair (S , matchIndices )。そうでなければmatchIndexPair を undefined 。 ! CreateDataPropertyOrThrow (A , ! ToString (𝔽 (i )), matchIndexPair )。 i > 0 ならs を groupNames [i - 1]。s が undefined でなければアサート: groups は undefined でない。 注記: 同名グループが複数ある場合でも groups は通常オブジェクト なので再作成は成功する。 ! CreateDataPropertyOrThrow (groups , s , matchIndexPair )。 A を返す。
22.2.8 RegExp インスタンスのプロパティ
RegExp インスタンスは RegExp プロトタイプオブジェクト からプロパティを継承する通常オブジェクト である。RegExp インスタンスは内部スロット [[OriginalSource]] , [[OriginalFlags]] , [[RegExpRecord]] , [[RegExpMatcher]] を持つ。[[RegExpMatcher]] 内部スロットの値は RegExp オブジェクトの Pattern の抽象クロージャ表現である。
Note
ECMAScript 2015 以前は RegExp インスタンスは独自データプロパティ "source" , "global" , "ignoreCase" , "multiline" を持つと規定されていた。これらは現在 RegExp.prototype
のアクセサプロパティ として規定される。
RegExp インスタンスは次のプロパティも持つ:
22.2.8.1 lastIndex
"lastIndex" プロパティの値は次のマッチを開始する String インデックスを指定する。使用時に整数 Number へ強制される (22.2.7.2 参照)。属性は { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false } とする。
22.2.9 RegExp 文字列イテレータオブジェクト
RegExp String Iterator は、特定の RegExp インスタンスオブジェクトに対して、特定の String インスタンスオブジェクト上の反復処理を表すオブジェクトである。RegExp String Iterator オブジェクトに対する名前付きコンストラクタ ーは存在しない。代わりに、RegExp インスタンスオブジェクトの特定メソッド呼び出しによって生成される。
22.2.9.1 CreateRegExpStringIterator ( R , S , global , fullUnicode )
The abstract operation CreateRegExpStringIterator takes arguments R (オブジェクト), S (String), global (Boolean), and fullUnicode (Boolean) and returns オブジェクト. It performs the following steps when called:
iterator を OrdinaryObjectCreate (%RegExpStringIteratorPrototype% , « [[IteratingRegExp]] , [[IteratedString]] , [[Global]] , [[Unicode]] , [[Done]] ») とする。iterator .[[IteratingRegExp]] に R を設定する。iterator .[[IteratedString]] に S を設定する。iterator .[[Global]] に global を設定する。iterator .[[Unicode]] に fullUnicode を設定する。iterator .[[Done]] に false を設定する。iterator を返す。
22.2.9.2 %RegExpStringIteratorPrototype% オブジェクト
%RegExpStringIteratorPrototype% オブジェクト:
22.2.9.2.1 %RegExpStringIteratorPrototype%.next ( )
O を this 値とする。O がオブジェクトでなければ TypeError 例外を投げる。O が RegExp String Iterator Object Instance の全内部スロット(22.2.9.3 参照)を持たなければ TypeError 例外を投げる。O .[[Done]] が true ならCreateIteratorResultObject (undefined , true ) を返す。R を O .[[IteratingRegExp]] とする。S を O .[[IteratedString]] とする。global を O .[[Global]] とする。fullUnicode を O .[[Unicode]] とする。match を ? RegExpExec (R , S ) とする。match が null ならO .[[Done]] に true を設定する。CreateIteratorResultObject (undefined , true ) を返す。global が false ならO .[[Done]] に true を設定する。CreateIteratorResultObject (match , false ) を返す。matchStr を ? ToString (? Get (match , "0" )) とする。matchStr が空文字列ならthisIndex を ℝ (? ToLength (? Get (R , "lastIndex" ))) とする。nextIndex を AdvanceStringIndex (S , thisIndex , fullUnicode ) とする。? Set (R , "lastIndex" , 𝔽 (nextIndex ), true ) を実行する。 CreateIteratorResultObject (match , false ) を返す。
22.2.9.2.2 %RegExpStringIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列 "RegExp String Iterator" である。
このプロパティの属性は { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } である。
22.2.9.3 RegExp String Iterator インスタンスのプロパティ
RegExp String Iterator インスタンスは %RegExpStringIteratorPrototype% 組込みオブジェクトからプロパティを継承する通常オブジェクト である。RegExp String Iterator インスタンスは初期化時に Table 71 に列挙された内部スロットを持つ。
Table 71: RegExp String Iterator インスタンスの内部スロット
Internal Slot
Type
Description
[[IteratingRegExp]]
an Object
反復に使用される正規表現。IsRegExp ([[IteratingRegExp]] ) は初期状態で true 。
[[IteratedString]]
a String
反復対象となる String 値。
[[Global]]
a Boolean
[[IteratingRegExp]] が global かどうかを示す。
[[Unicode]]
a Boolean
[[IteratingRegExp]] が Unicode モードかどうかを示す。
[[Done]]
a Boolean
反復処理が完了しているかどうかを示す。
23 インデックス付きコレクション
23.1 Array オブジェクト
配列 (Array) は特定種類のプロパティ名 に特別な扱いを与えるエキゾチックオブジェクト である。この特別扱いの定義については 10.4.2 を参照。
23.1.1 Array コンストラクター
Array コンストラクタ ー:
%Array% である。
グローバルオブジェクト の "Array" プロパティの初期値である。
コンストラクタ ーとして呼び出されたとき新しい Array を生成し初期化する。
関数として(コンストラクタ ーではなく)呼び出された場合も新しい Array を生成し初期化する。従って関数呼び出し Array(…)
は、同じ引数のオブジェクト生成式 new Array(…)
と等価である。
その振る舞いが引数の個数と型に依存して変化する関数である。
クラス定義の extends
句の値として利用できる。エキゾチック Array の挙動を継承することを意図したサブクラスコンストラクタ ーは、サブクラスインスタンス(Array エキゾチックオブジェクト )を初期化するために Array コンストラクタ ーへの super
呼び出しを含めなければならない。ただし、Array.prototype
のメソッドの多くは this 値が Array エキゾチックオブジェクト であることに依存しない汎用メソッドである。
23.1.1.1 Array ( ...values )
この関数は呼び出し時に以下の手順を実行する:
NewTarget が undefined なら newTarget をアクティブな関数オブジェクト とし;そうでなければ newTarget を NewTarget とする。 proto を ? GetPrototypeFromConstructor (newTarget , "%Array.prototype%" ) とする。numberOfArgs を values の要素数とする。numberOfArgs = 0 なら! ArrayCreate (0, proto ) を返す。 そうでなく numberOfArgs = 1 ならlen を values [0] とする。array を ! ArrayCreate (0, proto ) とする。len が Number でなければ! CreateDataPropertyOrThrow (array , "0" , len ) を実行。 intLen を 1 𝔽 とする。そうでなければintLen を ! ToUint32 (len ) とする。SameValueZero (intLen , len ) が false なら RangeError 例外を投げる。 ! Set (array , "length" , intLen , true ) を実行。 array を返す。 それ以外の場合アサート: numberOfArgs ≥ 2. array を ? ArrayCreate (numberOfArgs , proto ) とする。k を 0 とする。k < numberOfArgs の間繰り返し、Pk を ! ToString (𝔽 (k )) とする。itemK を values [k ] とする。! CreateDataPropertyOrThrow (array , Pk , itemK ) を実行。 k を k + 1 にする。アサート: array の "length" プロパティの数学的値は numberOfArgs である。 array を返す。
23.1.2 Array コンストラクターのプロパティ
Array コンストラクタ ー:
23.1.2.1 Array.from ( items [ , mapper [ , thisArg ] ] )
このメソッドは呼び出し時に以下を実行する:
C を this 値とする。mapper が undefined ならmapping を false とする。そうでなければIsCallable (mapper ) が false なら TypeError 例外を投げる。mapping を true とする。 usingIterator を ? GetMethod (items , %Symbol.iterator% ) とする。usingIterator が undefined でなければIsConstructor (C ) が true ならA を ? Construct(C ) とする。そうでなければA を ! ArrayCreate (0) とする。 iteratorRecord を ? GetIteratorFromMethod (items , usingIterator ) とする。k を 0 とする。繰り返し、k ≥ 253 - 1 ならerror を ThrowCompletion (新規 TypeError オブジェクト) とする。? IteratorClose (iteratorRecord , error ) を返す。 Pk を ! ToString (𝔽 (k )) とする。next を ? IteratorStepValue (iteratorRecord ) とする。next が done なら? Set (A , "length" , 𝔽 (k ), true ) を実行。 A を返す。mapping が true ならmappedValue を Completion (Call(mapper , thisArg , « next , 𝔽 (k ) »)) とする。IfAbruptCloseIterator (mappedValue , iteratorRecord )。そうでなければmappedValue を next とする。 defineStatus を Completion (CreateDataPropertyOrThrow (A , Pk , mappedValue )) とする。IfAbruptCloseIterator (defineStatus , iteratorRecord )。k を k + 1 にする。 注記: items は iterable ではないので配列ライクオブジェクトとみなす。 arrayLike を ! ToObject (items ) とする。len を ? LengthOfArrayLike (arrayLike ) とする。IsConstructor (C ) が true ならA を ? Construct(C , « 𝔽 (len ) ») とする。そうでなければA を ? ArrayCreate (len ) とする。 k を 0 にする。k < len の間繰り返し、Pk を ! ToString (𝔽 (k )) とする。kValue を ? Get (arrayLike , Pk ) とする。mapping が true ならmappedValue を ? Call(mapper , thisArg , « kValue , 𝔽 (k ) ») とする。そうでなければmappedValue を kValue とする。 ? CreateDataPropertyOrThrow (A , Pk , mappedValue ) を実行。 k を k + 1 にする。? Set (A , "length" , 𝔽 (len ), true ) を実行。 A を返す。
Note
このメソッドは意図的に汎用のファクトリメソッドであり、this 値が Array コンストラクタ ーであることを要求しない。そのため単一の数値引数で呼び出され得る他のコンストラクタ ーに転用または継承できる。
23.1.2.2 Array.isArray ( arg )
この関数は呼び出し時に以下を実行する:
? IsArray (arg ) を返す。
23.1.2.3 Array.of ( ...items )
このメソッドは呼び出し時に以下を実行する:
len を items の要素数とする。lenNumber を 𝔽 (len ) とする。C を this 値とする。IsConstructor (C ) が true ならA を ? Construct(C , « lenNumber ») とする。そうでなければA を ? ArrayCreate (len ) とする。 k を 0。k < len の間繰り返し、kValue を items [k ] とする。Pk を ! ToString (𝔽 (k )) とする。? CreateDataPropertyOrThrow (A , Pk , kValue ) を実行。 k を k + 1。? Set (A , "length" , lenNumber , true ) を実行。 A を返す。
Note
このメソッドは意図的に汎用のファクトリメソッドであり、this 値が Array コンストラクタ ーであることを要求しない。そのため単一の数値引数で呼び出され得る他のコンストラクタ ーへ転用または継承できる。
23.1.2.4 Array.prototype
Array.prototype
の値は Array プロトタイプオブジェクト である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
23.1.2.5 get Array [ %Symbol.species% ]
Array[%Symbol.species%]
は set アクセサ関数が undefined のアクセサプロパティ であり、その get アクセサは以下を行う:
this 値を返す。
この関数の "name" プロパティの値は "get [Symbol.species]" である。
Note
Array プロトタイプメソッドは通常、その this 値の constructor を使って派生オブジェクトを生成する。しかしサブクラスコンストラクタ ーは %Symbol.species% プロパティを再定義することで既定の挙動を上書きできる。
23.1.3 Array プロトタイプオブジェクトのプロパティ
Array プロトタイプオブジェクト :
%Array.prototype% である。
Array エキゾチックオブジェクト であり、そのようなオブジェクトに規定された内部メソッドを持つ。
初期値 +0 𝔽 の "length" プロパティを持ち、その属性は { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false } である。
[[Prototype]] 内部スロットの値は %Object.prototype% である。
Note
Array プロトタイプオブジェクトを Array エキゾチックオブジェクト として規定するのは ECMAScript 2015 以前に作成されたコードとの互換性を確保するためである。
23.1.3.1 Array.prototype.at ( index )
O を ? ToObject (this value) とする。len を ? LengthOfArrayLike (O ) とする。relativeIndex を ? ToIntegerOrInfinity (index ) とする。relativeIndex ≥ 0 ならk を relativeIndex とする。そうでなければk を len + relativeIndex とする。 k < 0 または k ≥ len なら undefined を返す。? Get (O , ! ToString (𝔽 (k ))) を返す。
23.1.3.2 Array.prototype.concat ( ...items )
このメソッドは対象オブジェクトの配列要素に続いて各引数の配列要素を順に含む配列を返す。
呼び出し時に以下を実行する:
O を ? ToObject (this value) とする。A を ? ArraySpeciesCreate (O , 0) とする。n を 0。items の先頭に O を挿入する。各要素 E ∈ items について:spreadable を ? IsConcatSpreadable (E ) とする。spreadable が true ならlen を ? LengthOfArrayLike (E ) とする。n + len > 253 - 1 なら TypeError 例外。k を 0。k < len の間:Pk を ! ToString (𝔽 (k )) とする。exists を ? HasProperty (E , Pk ) とする。exists が true ならsubElement を ? Get (E , Pk ) とする。? CreateDataPropertyOrThrow (A , ! ToString (𝔽 (n )), subElement ) を実行。 n を n + 1。k を k + 1。そうでなければ注記: E は展開されず単一要素として追加される。 n ≥ 253 - 1 なら TypeError 例外。? CreateDataPropertyOrThrow (A , ! ToString (𝔽 (n )), E ) を実行。 n を n + 1。 ? Set (A , "length" , 𝔽 (n ), true ) を実行。 A を返す。
このメソッドの "length" プロパティは 1 𝔽 である。
Note 1
ステップ で "length" を明示的に設定するのは、items の最後の非空要素に後続の hole がある場合や A が組込み Array でない場合の正しい長さを保証するためである。
Note 2
このメソッドは意図的に汎用であり、this 値が Array であることを要求しない。そのため他の種類のオブジェクトへメソッドとして転用可能である。
23.1.3.2.1 IsConcatSpreadable ( O )
The abstract operation IsConcatSpreadable takes argument O (ECMAScript 言語値) and returns Boolean を含む通常完了または throw 完了. It performs the following steps when called:
O がオブジェクトでなければ false を返す。spreadable を ? Get (O , %Symbol.isConcatSpreadable% ) とする。spreadable が undefined でなければ ToBoolean (spreadable ) を返す。? IsArray (O ) を返す。
23.1.3.3 Array.prototype.constructor
Array.prototype.constructor
の初期値は %Array% である。
23.1.3.4 Array.prototype.copyWithin ( target , start [ , end ] )
Note 1
end 引数は省略可。指定されない場合 this 値の長さが使われる。
Note 2
target が負なら配列長を length として length + target と扱う。start が負なら length + start 。end が負なら length + end と扱う。
このメソッドは呼び出し時に以下を実行する:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。relativeTarget を ? ToIntegerOrInfinity (target )。relativeTarget = -∞ なら to = 0。そうでなく relativeTarget < 0 なら to = max (len + relativeTarget , 0)。 それ以外は to = min (relativeTarget , len )。 relativeStart を ? ToIntegerOrInfinity (start )。relativeStart = -∞ なら from = 0。そうでなく relativeStart < 0 なら from = max (len + relativeStart , 0)。 それ以外は from = min (relativeStart , len )。 end が undefined なら relativeEnd = len ;そうでなければ relativeEnd を ? ToIntegerOrInfinity (end )。relativeEnd = -∞ なら final = 0。そうでなく relativeEnd < 0 なら final = max (len + relativeEnd , 0)。 それ以外は final = min (relativeEnd , len )。 count を min (final - from , len - to )。from < to かつ to < from + count ならdirection = -1。from = from + count - 1。to = to + count - 1。そうでなければdirection = 1。 count > 0 の間繰り返し、fromKey を ! ToString (𝔽 (from ))。toKey を ! ToString (𝔽 (to ))。fromPresent を ? HasProperty (O , fromKey )。fromPresent が true ならfromValue を ? Get (O , fromKey )。? Set (O , toKey , fromValue , true )。 そうでなければアサート: fromPresent は false 。 ? DeletePropertyOrThrow (O , toKey )。 from += direction 。to += direction 。count -= 1。O を返す。
Note 3
このメソッドは意図的に汎用であり、this 値が Array である必要はない。他オブジェクトへ転用できる。
23.1.3.5 Array.prototype.entries ( )
このメソッドは呼び出し時以下を実行する:
O を ? ToObject (this value)。CreateArrayIterator (O , key+value ) を返す。
23.1.3.6 Array.prototype.every ( callback [ , thisArg ] )
Note 1
callback は 3 引数を受け取り Boolean へ強制可能な値を返す関数であるべき。every
は昇順で各要素に対し callback を 1 回ずつ呼び、callback が false を返す要素を見つけた時点で直ちに false を返す。見つからなければ true を返す。callback は実際に存在する要素に対してのみ呼ばれ、欠落要素には呼ばれない。
thisArg が指定されれば各呼び出しの this 値として使用され、指定がなければ undefined が用いられる。
callback は (要素値, 要素インデックス, 走査対象オブジェクト) を受け取る。
every
自体は直接対象オブジェクトをミューテートしないが、callback の呼び出しにより変更され得る。
処理される要素の範囲は最初の callback 呼び出し前に固定される。every
開始後に追加された要素は訪問されない。既存要素が変更された場合、その時点の値が渡される;開始後に削除された要素は訪問されない。空配列に対しては true を返し、数学の「全て」量化に相当する。
このメソッドは呼び出し時以下を実行する:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。IsCallable (callback ) が false なら TypeError 例外。k = 0。k < len の間繰り返し、Pk を ! ToString (𝔽 (k ))。kPresent を ? HasProperty (O , Pk )。kPresent が true ならkValue を ? Get (O , Pk )。testResult を ToBoolean (? Call(callback , thisArg , « kValue , 𝔽 (k ), O »))。testResult が false なら false を返す。k を k + 1。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 、end が負なら length + end と扱う。
このメソッドは呼び出し時以下を実行:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。relativeStart を ? ToIntegerOrInfinity (start )。relativeStart = -∞ なら k = 0。そうでなく relativeStart < 0 なら k = max (len + relativeStart , 0)。 それ以外は k = min (relativeStart , len )。 end が undefined なら relativeEnd = len ;そうでなければ relativeEnd = ? ToIntegerOrInfinity (end )。relativeEnd = -∞ なら final = 0。そうでなく relativeEnd < 0 なら final = max (len + relativeEnd , 0)。 それ以外は final = min (relativeEnd , len )。 k < final の間繰り返し、Pk を ! ToString (𝔽 (k ))。? Set (O , Pk , value , true )。 k ++。O を返す。
Note 3
23.1.3.8 Array.prototype.filter ( callback [ , thisArg ] )
Note 1
callback は 3 引数を受け Boolean へ強制可能な値を返す関数であるべき。filter
は昇順で各要素に対し callback を呼び、true を返した値を集め新しい配列を構成する。欠落要素には呼ばれない。
thisArg が提供されれば this として使われ、なければ undefined 。
callback は (値, インデックス, 走査対象) を受け取る。
filter
自体は直接オブジェクトを変更しないが callback により変更され得る。
処理範囲は開始前に固定。開始後に追加された要素は訪問されず、変更された既存要素は訪問時点の値、開始後に削除された要素は訪問されない。
このメソッドは呼び出し時以下を実行:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。IsCallable (callback ) が false なら TypeError 。A を ? ArraySpeciesCreate (O , 0)。k = 0。to = 0。k < len の間繰り返し、Pk を ! ToString (𝔽 (k ))。kPresent を ? HasProperty (O , Pk )。kPresent が true ならkValue を ? Get (O , Pk )。selected を ToBoolean (? Call(callback , thisArg , « kValue , 𝔽 (k ), O »))。selected が true なら? CreateDataPropertyOrThrow (A , ! ToString (𝔽 (to )), kValue )。 to ++。k ++。A を返す。
Note 2
23.1.3.9 Array.prototype.find ( predicate [ , thisArg ] )
Note 1
このメソッドは昇順インデックスで各要素に対し predicate を呼び、true に強制される値を返した最初の要素値を返す。存在しなければ undefined 。
追加情報は FindViaPredicate を参照。
呼び出し時の手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。findRec を ? FindViaPredicate (O , len , ascending , predicate , thisArg )。findRec .[[Value]] を返す。
Note 2
23.1.3.10 Array.prototype.findIndex ( predicate [ , thisArg ] )
Note 1
昇順で predicate を呼び、true に強制される値を返した最初の要素のインデックスを返す。なければ -1。
追加情報は FindViaPredicate 参照。
呼び出し時手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。findRec を ? FindViaPredicate (O , len , ascending , predicate , thisArg )。findRec .[[Index]] を返す。
Note 2
23.1.3.11 Array.prototype.findLast ( predicate [ , thisArg ] )
Note 1
降順で predicate を呼び、true に強制される値を返した最初の要素値を返す。なければ undefined 。
追加情報は FindViaPredicate 参照。
手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。findRec を ? FindViaPredicate (O , len , descending , predicate , thisArg )。findRec .[[Value]] を返す。
Note 2
23.1.3.12 Array.prototype.findLastIndex ( predicate [ , thisArg ] )
Note 1
降順で predicate を呼び、true に強制される値を返した最初の要素のインデックスを返す。なければ -1。
追加情報は FindViaPredicate 参照。
手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。findRec を ? FindViaPredicate (O , len , descending , predicate , thisArg )。findRec .[[Index]] を返す。
Note 2
23.1.3.12.1 FindViaPredicate ( O , len , direction , predicate , thisArg )
The abstract operation FindViaPredicate takes arguments O (オブジェクト), len (非負整数 ), direction (ascending または descending ), predicate (ECMAScript 言語値), and thisArg (ECMAScript 言語値) and returns フィールド [[Index]] (整数 Number) と [[Value]] (ECMAScript 言語値) を持つ Record を含む通常完了または throw 完了.
O は配列ライクまたは TypedArray であるべき。この操作は指定方向で各要素に predicate を 1 回ずつ呼び、true に強制される値を返した時点でそのインデックスと値を含む Record を返す。該当要素がない場合、インデックス -1 𝔽 と値 undefined の Record を返す。
predicate は関数であるべき。呼び出し時 (要素値, インデックス, 対象オブジェクト) が渡され、戻り値は Boolean へ強制される。
thisArg は各呼び出しの this として用いられる。
この操作自体は直接オブジェクトを変更しないが predicate により変更され得る。
処理範囲は走査開始直前に固定される。以降に追加された要素は訪問されない。既存要素が変更された場合はその訪問時の値が渡される。走査開始後に削除された要素は依然訪問され、存在しなければ undefined またはプロトタイプから取得される。
It performs the following steps when called:
IsCallable (predicate ) が false なら TypeError 例外。direction が ascending ならindices を 0 以上 len 未満の整数 の昇順 List とする。そうでなければindices を 0 以上 len 未満の整数 の降順 List とする。 各整数 k ∈ indices についてPk を ! ToString (𝔽 (k ))。注記: O が TypedArray の場合、次の Get 呼び出しは正常完了を返す。 kValue を ? Get (O , Pk )。testResult を ? Call(predicate , thisArg , « kValue , 𝔽 (k ), O »)。ToBoolean (testResult ) が true なら Record { [[Index]] : 𝔽 (k ), [[Value]] : kValue } を返す。 Record { [[Index]] : -1 𝔽 , [[Value]] : undefined } を返す。
23.1.3.13 Array.prototype.flat ( [ depth ] )
このメソッドは呼び出し時以下を実行する:
O を ? ToObject (this value)。sourceLen を ? LengthOfArrayLike (O )。depthNum = 1。depth が undefined でなければdepthNum を ? ToIntegerOrInfinity (depth ) に設定。depthNum < 0 なら depthNum = 0。A を ? ArraySpeciesCreate (O , 0)。? FlattenIntoArray (A , O , sourceLen , 0, depthNum ) を実行。 A を返す。
23.1.3.13.1 FlattenIntoArray ( target , source , sourceLen , start , depth [ , mapperFunction [ , thisArg ] ] )
The abstract operation FlattenIntoArray takes arguments target (オブジェクト), source (オブジェクト), sourceLen (非負整数 ), start (非負整数 ), and depth (非負整数 または +∞) and optional arguments mapperFunction (関数オブジェクト ) and thisArg (ECMAScript 言語値) and returns 非負整数 を含む通常完了または throw 完了. It performs the following steps when called:
アサート: mapperFunction が存在するなら IsCallable (mapperFunction ) は true であり、thisArg が存在し、かつ depth は 1。 targetIndex を start 。sourceIndex を +0 𝔽 。ℝ (sourceIndex ) < sourceLen の間繰り返し、P を ! ToString (sourceIndex )。exists を ? HasProperty (source , P )。exists が true ならelement を ? Get (source , P )。mapperFunction が存在するならelement を ? Call(mapperFunction , thisArg , « element , sourceIndex , source ») に設定。shouldFlatten を false 。depth > 0 ならshouldFlatten を ? IsArray (element ) に設定。shouldFlatten が true ならdepth = +∞ なら newDepth = +∞。そうでなければ newDepth = depth - 1。 elementLen を ? LengthOfArrayLike (element )。targetIndex を ? FlattenIntoArray (target , element , elementLen , targetIndex , newDepth ) に設定。そうでなければtargetIndex ≥ 253 - 1 なら TypeError 例外。? CreateDataPropertyOrThrow (target , ! ToString (𝔽 (targetIndex )), element )。 targetIndex ++。 sourceIndex を sourceIndex + 1 𝔽 。targetIndex を返す。
23.1.3.14 Array.prototype.flatMap ( mapperFunction [ , thisArg ] )
このメソッドは呼び出し時以下を実行する:
O を ? ToObject (this value)。sourceLen を ? LengthOfArrayLike (O )。IsCallable (mapperFunction ) が false なら TypeError 例外。A を ? ArraySpeciesCreate (O , 0)。? FlattenIntoArray (A , O , sourceLen , 0, 1, mapperFunction , thisArg ) を実行。 A を返す。
23.1.3.15 Array.prototype.forEach ( callback [ , thisArg ] )
Note 1
callback は 3 引数を受け取る関数であるべき。forEach
は昇順で存在する各要素に対し callback を 1 回呼ぶ。欠落要素には呼ばれない。
thisArg があれば this 値、なければ undefined 。
callback の引数は (値, インデックス, 対象オブジェクト)。
forEach
自体は直接オブジェクトを変更しないが callback により変更され得る。
処理範囲は開始前に決定。開始後に追加された要素は訪問されず、変更された要素は訪問時の値、開始後に削除されたものは訪問されない。
手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。IsCallable (callback ) が false なら TypeError 。k = 0。k < len の間、Pk を ! ToString (𝔽 (k ))。kPresent を ? HasProperty (O , Pk )。kPresent が true ならkValue を ? Get (O , Pk )。? Call(callback , thisArg , « kValue , 𝔽 (k ), O »)。 k ++。undefined を返す。
Note 2
23.1.3.16 Array.prototype.includes ( searchElement [ , fromIndex ] )
Note 1
このメソッドは SameValueZero アルゴリズムで昇順に searchElement と各要素を比較し、いずれかで一致したら true 、なければ false を返す。
第 2 引数 fromIndex の既定値は +0 𝔽 (全検索)。配列長以上なら false 。 -0 𝔽 未満なら末尾からのオフセットとして扱い、計算結果が +0 𝔽 以下なら全検索。
手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。len = 0 なら false 。n を ? ToIntegerOrInfinity (fromIndex )。アサート: fromIndex が undefined なら n = 0。 n = +∞ なら false 。そうでなく n = -∞ なら n = 0。 n ≥ 0 ならk = n 。そうでなければk = len + n 。k < 0 なら k = 0。 k < len の間、elementK を ? Get (O , ! ToString (𝔽 (k )))。SameValueZero (searchElement , elementK ) が true なら true 。k ++。false を返す。
Note 2
Note 3
このメソッドは indexOf
と異なり、SameValueZero を使うため NaN を検出でき、欠落要素をスキップせず undefined として扱う。
23.1.3.17 Array.prototype.indexOf ( searchElement [ , fromIndex ] )
昇順で IsStrictlyEqual アルゴリズムにより比較し、マッチする最小インデックスを返し、なければ -1 𝔽 を返す。
Note 1
第 2 引数 fromIndex の既定値は +0 𝔽 。配列長以上なら検索せず -1 𝔽 。-0 𝔽 未満なら末尾からのオフセットとして扱い、結果が +0 𝔽 以下なら全検索。
手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。len = 0 なら -1 𝔽 。n を ? ToIntegerOrInfinity (fromIndex )。アサート: fromIndex が undefined なら n = 0。 n = +∞ なら -1 𝔽 。そうでなく n = -∞ なら n = 0。 n ≥ 0 ならk = n 。そうでなければk = len + n 。k < 0 なら k = 0。 k < len の間、Pk を ! ToString (𝔽 (k ))。kPresent を ? HasProperty (O , Pk )。kPresent が true ならelementK を ? Get (O , Pk )。IsStrictlyEqual (searchElement , elementK ) が true なら 𝔽 (k )。k ++。-1 𝔽 を返す。
Note 2
23.1.3.18 Array.prototype.join ( separator )
配列要素を String に変換し separator を挟んで連結した結果を返す。separator 未指定ならカンマ。
呼び出し時手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。separator が undefined なら sep = "," ;そうでなければ sep = ? ToString (separator )。R を空文字列。k = 0。k < len の間、k > 0 なら R を R と sep の連結に更新。element を ? Get (O , ! ToString (𝔽 (k )))。element が undefined でも null でもなければS を ? ToString (element )。R を R と S の連結に。k ++。R を返す。
Note
23.1.3.19 Array.prototype.keys ( )
このメソッドは呼び出し時以下を実行する:
O を ? ToObject (this value)。CreateArrayIterator (O , key ) を返す。
23.1.3.20 Array.prototype.lastIndexOf ( searchElement [ , fromIndex ] )
Note 1
降順で IsStrictlyEqual により比較し、一致した最大インデックスを返し、なければ -1 𝔽 。
第2引数 fromIndex の既定は長さ−1。長さ以上なら全検索。-0 𝔽 未満なら末尾からのオフセット。計算結果が +0 𝔽 以下なら -1 𝔽 。
手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。len = 0 なら -1 𝔽 。fromIndex が存在すれば n = ? ToIntegerOrInfinity (fromIndex );そうでなければ n = len - 1。n = -∞ なら -1 𝔽 。n ≥ 0 ならk = min (n , len - 1)。そうでなければk = len + n 。 k ≥ 0 の間、Pk を ! ToString (𝔽 (k ))。kPresent を ? HasProperty (O , Pk )。kPresent が true ならelementK を ? Get (O , Pk )。IsStrictlyEqual (searchElement , elementK ) が true なら 𝔽 (k )。k --。-1 𝔽 を返す。
Note 2
23.1.3.21 Array.prototype.map ( callback [ , thisArg ] )
Note 1
callback は 3 引数を受ける関数であるべき。map
は昇順に各要素に対し callback を呼び、その結果から新しい配列を作成。欠落要素には呼ばない。
thisArg があれば this 、なければ undefined 。
callback の引数: (値, インデックス, 対象)。
map
自体は直接ミューテーションしないが callback による変更はあり得る。
処理範囲は開始前に固定。開始後追加要素は無視、変更要素は訪問時点の値、開始後削除された要素は訪問されない。
手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。IsCallable (callback ) が false なら TypeError 。A を ? ArraySpeciesCreate (O , len )。k = 0。k < len の間、Pk を ! ToString (𝔽 (k ))。kPresent を ? HasProperty (O , Pk )。kPresent が true ならkValue を ? Get (O , Pk )。mappedValue を ? Call(callback , thisArg , « kValue , 𝔽 (k ), O »)。? CreateDataPropertyOrThrow (A , Pk , mappedValue )。 k ++。A を返す。
Note 2
23.1.3.22 Array.prototype.pop ( )
Note 1
手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。len = 0 なら? Set (O , "length" , +0 𝔽 , true )。 undefined を返す。それ以外アサート: len > 0。 newLen = 𝔽 (len - 1)。index = ! ToString (newLen )。element を ? Get (O , index )。? DeletePropertyOrThrow (O , index )。 ? Set (O , "length" , newLen , true )。 element を返す。
Note 2
23.1.3.23 Array.prototype.push ( ...items )
Note 1
手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。argCount を items の要素数。len + argCount > 253 - 1 なら TypeError 。各 E ∈ items について? Set (O , ! ToString (𝔽 (len )), E , true )。 len ++。 ? Set (O , "length" , 𝔽 (len ), true )。 𝔽 (len ) を返す。
このメソッドの "length" は 1 𝔽 。
Note 2
23.1.3.24 Array.prototype.reduce ( callback [ , initialValue ] )
Note 1
callback は 4 引数を受け取るべき。reduce
は最初の(もしくは初期値を与えた場合その次の)要素以降に対して昇順で 1 回ずつ呼ぶ。
callback の引数: previousValue , currentValue , currentIndex , 走査対象オブジェクト。最初の呼び出し時の previousValue と currentValue は初期値有無で変化。空配列かつ初期値なしは TypeError 。
reduce
自体は直接ミューテートしない。
処理範囲は開始前固定。追加要素は無視。変更要素は訪問時の値。開始後削除された要素は訪問されない。
手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。IsCallable (callback ) が false なら TypeError 。len = 0 かつ initialValue が無ければ TypeError 。k = 0。accumulator = undefined 。initialValue が存在すればaccumulator = initialValue 。そうでなければkPresent = false 。kPresent が false かつ k < len の間、Pk = ! ToString (𝔽 (k ))。kPresent = ? HasProperty (O , Pk )。kPresent が true ならaccumulator = ? Get (O , Pk )。k ++。kPresent が false なら TypeError 。 k < len の間、Pk = ! ToString (𝔽 (k ))。kPresent = ? HasProperty (O , Pk )。kPresent が true ならkValue = ? Get (O , Pk )。accumulator = ? Call(callback , undefined , « accumulator , kValue , 𝔽 (k ), O »)。k ++。accumulator を返す。
Note 2
23.1.3.25 Array.prototype.reduceRight ( callback [ , initialValue ] )
Note 1
説明は reduce の逆方向版。空配列で初期値なしは TypeError 。
手順:
O , len を前節同様に取得。IsCallable (callback ) が false なら TypeError 。len = 0 かつ initialValue 無しなら TypeError 。k = len - 1。accumulator = undefined 。initialValue が存在すればaccumulator = initialValue 。そうでなければkPresent = false 。kPresent が false かつ k ≥ 0 の間、Pk = ! ToString (𝔽 (k ))。kPresent = ? HasProperty (O , Pk )。kPresent が true ならaccumulator = ? Get (O , Pk )。k --。kPresent が false なら TypeError 。 k ≥ 0 の間、Pk = ! ToString (𝔽 (k ))。kPresent = ? HasProperty (O , Pk )。kPresent が true ならkValue = ? Get (O , Pk )。accumulator = ? Call(callback , undefined , « accumulator , kValue , 𝔽 (k ), O »)。k --。accumulator を返す。
Note 2
23.1.3.26 Array.prototype.reverse ( )
Note 1
手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。middle = floor (len / 2)。lower = 0。lower ≠ middle の間、upper = len - lower - 1。upperP = ! ToString (𝔽 (upper ))。lowerP = ! ToString (𝔽 (lower ))。lowerExists = ? HasProperty (O , lowerP )。lowerExists が true なら lowerValue = ? Get (O , lowerP )。upperExists = ? HasProperty (O , upperP )。upperExists が true なら upperValue = ? Get (O , upperP )。両方 true なら? Set (O , lowerP , upperValue , true )。 ? Set (O , upperP , lowerValue , true )。 そうでなく lowerExists false かつ upperExists true なら? Set (O , lowerP , upperValue , true )。 ? DeletePropertyOrThrow (O , upperP )。 そうでなく lowerExists true かつ upperExists false なら? DeletePropertyOrThrow (O , lowerP )。 ? Set (O , upperP , lowerValue , true )。 そうでなければ(両方 false )何もしない。 lower ++。O を返す。
Note 2
23.1.3.27 Array.prototype.shift ( )
最初の要素を削除して返す。
手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。len = 0 なら? Set (O , "length" , +0 𝔽 , true )。 undefined を返す。first を ? Get (O , "0" )。k = 1。k < len の間、from = ! ToString (𝔽 (k ))。to = ! ToString (𝔽 (k - 1))。fromPresent = ? HasProperty (O , from )。fromPresent が true ならfromValue = ? Get (O , from )。? Set (O , to , fromValue , true )。 そうでなければ? DeletePropertyOrThrow (O , to )。 k ++。? DeletePropertyOrThrow (O , ! ToString (𝔽 (len - 1)))。 ? Set (O , "length" , 𝔽 (len - 1), true )。 first を返す。
Note
23.1.3.28 Array.prototype.slice ( start , end )
start から(end が undefined なら末尾まで、そうでなければ end 非含む)要素を含む新しい配列を返す。負値は長さを length として length + start , length + end 。
手順:
O を ? ToObject (this value)。len を ? LengthOfArrayLike (O )。relativeStart を ? ToIntegerOrInfinity (start )。relativeStart = -∞ なら k = 0。そうでなく relativeStart < 0 なら k = max (len + relativeStart , 0)。 それ以外は k = min (relativeStart , len )。 end が undefined なら relativeEnd = len ;そうでなければ relativeEnd = ? ToIntegerOrInfinity (end )。relativeEnd = -∞ なら final = 0。そうでなく relativeEnd < 0 なら final = max (len + relativeEnd , 0)。 それ以外は final = min (relativeEnd , len )。 count = max (final - k , 0)。A を ? ArraySpeciesCreate (O , count )。n = 0。k < final の間、Pk = ! ToString (𝔽 (k ))。kPresent = ? HasProperty (O , Pk )。kPresent が true ならkValue = ? Get (O , Pk )。? CreateDataPropertyOrThrow (A , ! ToString (𝔽 (n )), kValue )。 k ++。n ++。? Set (A , "length" , 𝔽 (n ), true ) を実行。 A を返す。
Note 1
で明示的に長さを設定するのは A が組込み Array でない場合でも正しい長さを保証するため。
Note 2
23.1.3.29 Array.prototype.some ( callback [ , thisArg ] )
Note 1
callback は 3 引数を受け Boolean へ強制可能な値を返す関数であるべき。some
は true を返す最初の要素を見つけるまで昇順で呼び、見つかれば true 、なければ false 。欠落要素は無視。
thisArg があれば this 、なければ undefined 。
引数: (値, インデックス, 対象)。
オブジェクトは直接ミューテートしないが callback により変更され得る。
範囲は開始前に固定。追加要素は無視。変更要素は訪問時の値。削除要素は訪問されない。空配列では false (数学の「存在」量化)。
手順:
O = ? ToObject (this value)。len = ? LengthOfArrayLike (O )。IsCallable (callback ) が false なら TypeError 。k = 0。k < len の間、Pk = ! ToString (𝔽 (k ))。kPresent = ? HasProperty (O , Pk )。kPresent が true ならkValue = ? Get (O , Pk )。testResult = ToBoolean (? Call(callback , thisArg , « kValue , 𝔽 (k ), O »))。testResult が true なら true 。k ++。false を返す。
Note 2
23.1.3.30 Array.prototype.sort ( comparator )
配列要素をソートする。comparator が undefined でなければ 2 引数 (x , y ) を受け負数 / 正数 / 0 を返す関数であるべき。
手順:
comparator が undefined でなく IsCallable (comparator ) が false なら TypeError 。obj = ? ToObject (this value)。len = ? LengthOfArrayLike (obj ) 。SortCompare を (x , y ) を引数に comparator を捕捉し呼出時 CompareArrayElements を返す新しい抽象クロージャとする。sortedList = ? SortIndexedProperties (obj , len , SortCompare , skip-holes ) 。itemCount を sortedList の要素数。j = 0。j < itemCount の間、? Set (obj , ! ToString (𝔽 (j )), sortedList [j ], true )。 j ++。注記: ステップ の呼出は skip-holes を用いる。残りのインデックスは hole 数を保持するため削除する。 j < len の間、? DeletePropertyOrThrow (obj , ! ToString (𝔽 (j )))。 j ++。obj を返す。
Note 1
存在しないプロパティ値は常に undefined より後方、かつ undefined は他の任意値より後方に並ぶため(CompareArrayElements 参照)、undefined が末尾、その後に非存在要素が続く。
Note 2
手順 , の ToString によるメソッド呼出は SortCompare を一貫した比較器 にしない可能性がある。
Note 3
23.1.3.30.1 SortIndexedProperties ( obj , len , SortCompare , holes )
The abstract operation SortIndexedProperties takes arguments obj (オブジェクト), len (非負整数 ), SortCompare (2 パラメータ抽象クロージャ), and holes (skip-holes または read-through-holes ) and returns ECMAScript 言語値の List を含む通常完了または throw 完了. It performs the following steps when called:
items を空 List 。k = 0。k < len の間、Pk = ! ToString (𝔽 (k ))。holes が skip-holes ならkRead = ? HasProperty (obj , Pk )。そうでなければ(read-through-holes )kRead = true 。 kRead が true ならkValue = ? Get (obj , Pk )。items に kValue を追加。k ++。実装定義 の SortCompare 呼出列 を用いて items をソート。いずれかの呼出が異常完了したらそれ以上呼び出さずその Completion Record を返す。items を返す。
ソート順 は上記アルゴリズムのステップ 後の items の順序。SortCompare が一貫した比較器 でない場合は実装定義 。Array.prototype.sort または Array.prototype.toSorted により呼び出された場合で comparator が undefined かつ特定値への全ての ToString 適用結果が同じでない場合も実装定義 。
実装定義 でない場合、次を満たすこと:
非負整数 itemCount 未満の整数 についてある置換 π が存在し、各 j (0 ≤ j < itemCount ) で old[j ] が new[π(j )] と同一。
すべての j , k について ℝ (SortCompare (old[j ], old[k ])) < 0 なら π(j ) < π(k ) 。
j < k < itemCount かつ ℝ (SortCompare (old[j ], old[k ])) = 0 なら π(j ) < π(k ) (安定ソート)。
old[j ] はステップ 前の items [j ] 、new[j ] は後の値。
抽象クロージャまたは関数 comparator が集合 S の 一貫した比較器 であるとは、任意の a , b , c ∈ S について以下を満たすこと。記法 a <C b は ℝ (comparator (a , b )) < 0 を、=C , >C も同様。
同一ペア (a , b ) への呼出は常に同じ Number v (NaN でない)を返し、三つの関係のいずれかのみ成り立つ。
comparator 呼出は obj またはそのプロトタイプチェーン上のオブジェクトを変更しない。
反射律: a =C a 。
対称律: a =C b ⇒ b =C a 。
推移律 (=): a =C b , b =C c ⇒ a =C c 。
推移律 (<): a <C b , b <C c ⇒ a <C c 。
推移律 (>): a >C b , b >C c ⇒ a >C c 。
Note
これら条件は comparator が S を同値類に分割し、それらが全順序付けされるために必要十分。
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:
x と y が共に undefined なら +0 𝔽 。x が undefined なら 1 𝔽 。y が undefined なら -1 𝔽 。comparator が undefined でなければv を ? ToNumber (? Call(comparator , undefined , « x , y »))。v が NaN なら +0 𝔽 を返す。v を返す。xString = ? ToString (x ) 。yString = ? ToString (y ) 。xSmaller = ! IsLessThan (xString , yString , true )。xSmaller が true なら -1 𝔽 。ySmaller = ! IsLessThan (yString , xString , true )。ySmaller が true なら 1 𝔽 。+0 𝔽 を返す。
23.1.3.31 Array.prototype.splice ( start , deleteCount , ...items )
Note 1
start 位置から deleteCount 個を削除し、items を挿入する。削除要素の配列を返す。
手順:
O = ? ToObject (this value)。len = ? LengthOfArrayLike (O )。relativeStart = ? ToIntegerOrInfinity (start )。relativeStart = -∞ なら actualStart = 0。そうでなく relativeStart < 0 なら actualStart = max (len + relativeStart , 0)。 それ以外は actualStart = min (relativeStart , len )。 itemCount を items の要素数。start が存在しなければ actualDeleteCount = 0。そうでなく deleteCount が存在しなければ actualDeleteCount = len - actualStart 。 それ以外dc = ? ToIntegerOrInfinity (deleteCount )。actualDeleteCount = clamp(dc , 0, len - actualStart )。 len + itemCount - actualDeleteCount > 253 - 1 なら TypeError 。A = ? ArraySpeciesCreate (O , actualDeleteCount )。k = 0。k < actualDeleteCount の間、from = ! ToString (𝔽 (actualStart + k ))。? HasProperty (O , from ) が true ならfromValue = ? Get (O , from )。? CreateDataPropertyOrThrow (A , ! ToString (𝔽 (k )), fromValue )。 k ++。? Set (A , "length" , 𝔽 (actualDeleteCount ), true ) を実行。 itemCount < actualDeleteCount の場合k = actualStart 。k < (len - actualDeleteCount ) の間、from = ! ToString (𝔽 (k + actualDeleteCount ))。to = ! ToString (𝔽 (k + itemCount ))。? HasProperty (O , from ) が true ならfromValue = ? Get (O , from )。? Set (O , to , fromValue , true )。 そうでなければ ? DeletePropertyOrThrow (O , to )。 k ++。k = len 。k > (len - actualDeleteCount + itemCount ) の間、? DeletePropertyOrThrow (O , ! ToString (𝔽 (k - 1)))。 k --。そうでなく itemCount > actualDeleteCount の場合k = (len - actualDeleteCount )。k > actualStart の間、from = ! ToString (𝔽 (k + actualDeleteCount - 1))。to = ! ToString (𝔽 (k + itemCount - 1))。? HasProperty (O , from ) が true ならfromValue = ? Get (O , from )。? Set (O , to , fromValue , true )。 そうでなければ ? DeletePropertyOrThrow (O , to )。 k --。 k = actualStart 。各 E ∈ items について? Set (O , ! ToString (𝔽 (k )), E , true )。 k ++。 ? Set (O , "length" , 𝔽 (len - actualDeleteCount + itemCount ), true ) を実行。 A を返す。
Note 2
ステップ , で明示的に長さを設定するのは組込み配列でない場合でも正しい長さを保証するため。
Note 3
23.1.3.32 Array.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
ECMA-402 国際化 API を含む実装は ECMA-402 仕様に従って実装しなければならない。含まない場合は以下の仕様を用いる。
Note 1
ECMA-402 第 1 版はこのメソッドの代替仕様を含まなかった。
オプション引数の意味は ECMA-402 に定義され、未サポート実装は他目的に利用してはならない。
手順:
array = ? ToObject (this value)。len = ? LengthOfArrayLike (array )。separator をホスト ロケールに適切な実装定義 リスト区切り文字列(例 ", " )とする。R を空文字列。k = 0。k < len の間、k > 0 なら R = R + separator 。element = ? Get (array , ! ToString (𝔽 (k )))。element が undefined でも null でもなければS = ? ToString (? Invoke(element , "toLocaleString" ))。R = R + S 。k ++。R を返す。
Note 2
各要素の toLocaleString
結果をロケール依存区切りで連結。toString
のロケール感知版。
Note 3
23.1.3.33 Array.prototype.toReversed ( )
このメソッドは呼び出し時以下を実行する:
O = ? ToObject (this value)。len = ? LengthOfArrayLike (O )。A = ? ArrayCreate (len )。k = 0。k < len の間、from = ! ToString (𝔽 (len - k - 1))。Pk = ! ToString (𝔽 (k ))。fromValue = ? Get (O , from )。! CreateDataPropertyOrThrow (A , Pk , fromValue )。 k ++。A を返す。
23.1.3.34 Array.prototype.toSorted ( comparator )
呼び出し時手順:
comparator が undefined でなく IsCallable (comparator ) が false なら TypeError 。O = ? ToObject (this value)。len = ? LengthOfArrayLike (O )。A = ? ArrayCreate (len )。SortCompare を (x , y ) を引数に comparator を捕捉し CompareArrayElements を呼ぶ抽象クロージャとする。sortedList = ? SortIndexedProperties (O , len , SortCompare , read-through-holes )。j = 0。j < len の間、! CreateDataPropertyOrThrow (A , ! ToString (𝔽 (j )), sortedList [j ])。 j ++。A を返す。
23.1.3.35 Array.prototype.toSpliced ( start , skipCount , ...items )
呼び出し時手順:
O = ? ToObject (this value)。len = ? LengthOfArrayLike (O )。relativeStart = ? ToIntegerOrInfinity (start )。relativeStart = -∞ なら actualStart = 0。そうでなく relativeStart < 0 なら actualStart = max (len + relativeStart , 0)。 それ以外は actualStart = min (relativeStart , len )。 insertCount を items 要素数。start が存在しなければ actualSkipCount = 0。そうでなく skipCount が存在しなければ actualSkipCount = len - actualStart 。 それ以外sc = ? ToIntegerOrInfinity (skipCount )。actualSkipCount = clamp(sc , 0, len - actualStart )。 newLen = len + insertCount - actualSkipCount 。newLen > 253 - 1 なら TypeError 。A = ? ArrayCreate (newLen )。i = 0。r = actualStart + actualSkipCount 。i < actualStart の間、Pi = ! ToString (𝔽 (i ))。iValue = ? Get (O , Pi )。! CreateDataPropertyOrThrow (A , Pi , iValue )。 i ++。各 E ∈ items についてPi = ! ToString (𝔽 (i ))。! CreateDataPropertyOrThrow (A , Pi , E )。 i ++。 i < newLen の間、Pi = ! ToString (𝔽 (i ))。from = ! ToString (𝔽 (r ))。fromValue = ? Get (O , from )。! CreateDataPropertyOrThrow (A , Pi , fromValue )。 i ++。r ++。A を返す。
23.1.3.36 Array.prototype.toString ( )
呼び出し時手順:
array = ? ToObject (this value)。func = ? Get (array , "join" )。IsCallable (func ) が false なら func を %Object.prototype.toString% に設定。? Call(func , array ) を返す。
Note
23.1.3.37 Array.prototype.unshift ( ...items )
引数を配列先頭に順序を保って挿入する。
手順:
O = ? ToObject (this value)。len = ? LengthOfArrayLike (O )。argCount = items の要素数。argCount > 0 ならlen + argCount > 253 - 1 なら TypeError 。k = len 。k > 0 の間、from = ! ToString (𝔽 (k - 1))。to = ! ToString (𝔽 (k + argCount - 1))。fromPresent = ? HasProperty (O , from )。fromPresent が true ならfromValue = ? Get (O , from )。? Set (O , to , fromValue , true )。 そうでなければ ? DeletePropertyOrThrow (O , to )。 k --。j = +0 𝔽 。各 E ∈ items について? Set (O , ! ToString (j ), E , true )。 j += 1 𝔽 。 ? Set (O , "length" , 𝔽 (len + argCount ), true )。 𝔽 (len + argCount ) を返す。
このメソッドの "length" は 1 𝔽 。
Note
23.1.3.38 Array.prototype.values ( )
呼び出し時手順:
O = ? ToObject (this value)。CreateArrayIterator (O , value ) を返す。
23.1.3.39 Array.prototype.with ( index , value )
呼び出し時手順:
O = ? ToObject (this value)。len = ? LengthOfArrayLike (O )。relativeIndex = ? ToIntegerOrInfinity (index )。relativeIndex ≥ 0 なら actualIndex = relativeIndex ;そうでなければ actualIndex = len + relativeIndex 。actualIndex ≥ len または actualIndex < 0 なら RangeError 。A = ? ArrayCreate (len )。k = 0。k < len の間、Pk = ! ToString (𝔽 (k ))。k = actualIndex なら fromValue = value ;そうでなければ fromValue = ? Get (O , Pk )。! CreateDataPropertyOrThrow (A , Pk , fromValue )。 k ++。A を返す。
23.1.3.40 Array.prototype [ %Symbol.iterator% ] ( )
%Symbol.iterator% プロパティの初期値は 23.1.3.38 で定義される %Array.prototype.values% である。
23.1.3.41 Array.prototype [ %Symbol.unscopables% ]
%Symbol.unscopables% データプロパティ の初期値は以下で生成されるオブジェクト:
unscopableList = OrdinaryObjectCreate (null )。! CreateDataPropertyOrThrow (unscopableList , "at" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "copyWithin" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "entries" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "fill" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "find" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "findIndex" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "findLast" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "findLastIndex" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "flat" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "flatMap" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "includes" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "keys" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "toReversed" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "toSorted" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "toSpliced" , true )。 ! CreateDataPropertyOrThrow (unscopableList , "values" , true )。 unscopableList を返す。
このプロパティは { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } 属性を持つ。
Note
このオブジェクトの own プロパティ名 は ECMAScript 2015 以前に Array.prototype
の標準プロパティでなかった名前であり、with
文でシャドウされる既存コードの挙動を守るため無視される。
"with" が含まれないのは既に 予約語 であるため。
23.1.4 Array インスタンスのプロパティ
Array インスタンスは Array エキゾチックオブジェクト であり、その内部メソッドを持つ。Array プロトタイプオブジェクト からプロパティを継承する。
Array インスタンスは "length" プロパティと配列インデックス 名を持つ列挙可能プロパティ集合を有する。
23.1.4.1 length
Array インスタンスの "length" プロパティは、配列インデックス 名を持つ全ての configurable な自プロパティ名 より常に数値的に大きい値を持つデータプロパティ である。
初期属性は { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false }。
Note
"length" の値を減少させると旧値と新値の間のインデックスを持つ自要素が削除される(ただし非設定可能は削除不可)。非設定可能な array-indexed プロパティの最大値以上に "length" を減らそうとすると、その最大値 + 1 に設定される。10.4.2.1 参照。
23.1.5 Array イテレータオブジェクト
Array Iterator は特定の Array インスタンス上の反復を表すオブジェクトである。名前付きコンストラクタ ーは存在せず、Array インスタンスの特定メソッド呼出により生成される。
23.1.5.1 CreateArrayIterator ( array , kind )
The abstract operation CreateArrayIterator takes arguments array (オブジェクト) and kind (key+value , key , または value ) and returns オブジェクト. Array メソッドが返すイテレータオブジェクトを生成するために用いる。 It performs the following steps when called:
iterator を OrdinaryObjectCreate (%ArrayIteratorPrototype% , « [[IteratedArrayLike]] , [[ArrayLikeNextIndex]] , [[ArrayLikeIterationKind]] ») とする。iterator .[[IteratedArrayLike]] = array 。iterator .[[ArrayLikeNextIndex]] = 0。iterator .[[ArrayLikeIterationKind]] = kind 。iterator を返す。
23.1.5.2 %ArrayIteratorPrototype% オブジェクト
%ArrayIteratorPrototype% オブジェクト:
23.1.5.2.1 %ArrayIteratorPrototype%.next ( )
O を this 値。O がオブジェクトでなければ TypeError 。O が Array Iterator Instance の全内部スロットを持たなければ TypeError 。array = O .[[IteratedArrayLike]] 。array が undefined なら CreateIteratorResultObject (undefined , true )。index = O .[[ArrayLikeNextIndex]] 。kind = O .[[ArrayLikeIterationKind]] 。array が [[TypedArrayName]] 内部スロットを持つならtaRecord = MakeTypedArrayWithBufferWitnessRecord (array , seq-cst )。IsTypedArrayOutOfBounds (taRecord ) が true なら TypeError 。len = TypedArrayLength (taRecord )。そうでなければlen = ? LengthOfArrayLike (array )。 index ≥ len ならO .[[IteratedArrayLike]] = undefined 。CreateIteratorResultObject (undefined , true ) を返す。O .[[ArrayLikeNextIndex]] = index + 1。indexNumber = 𝔽 (index )。kind = key ならresult = indexNumber 。そうでなければelementKey = ! ToString (indexNumber )。elementValue = ? Get (array , elementKey )。kind = value ならresult = elementValue 。そうでなければ(key+value )result = CreateArrayFromList (« indexNumber , elementValue »)。 CreateIteratorResultObject (result , false ) を返す。
23.1.5.2.2 %ArrayIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列 "Array Iterator" 。
属性は { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }。
23.1.5.3 Array Iterator インスタンスのプロパティ
Array Iterator インスタンスは %ArrayIteratorPrototype% から継承する通常オブジェクト で、初期化時に Table 72 の内部スロットを持つ。
Table 72: Array Iterator インスタンスの内部スロット
Internal Slot
Type
Description
[[IteratedArrayLike]]
an Object or undefined
反復対象となる配列ライクオブジェクト。
[[ArrayLikeNextIndex]]
a non-negative integer
次に調べる要素の整数インデックス 。
[[ArrayLikeIterationKind]]
key+value , key , or value
各反復で返す内容を識別する値。
23.2 TypedArray オブジェクト
TypedArray は基礎となるバイナリデータバッファ (25.1 ) に対する配列ライクなビューを提供する。TypedArray 要素型 は TypedArray インスタンスのすべての要素が持つ基礎バイナリのスカラーデータ型である。サポートされる各要素型ごとに Table 73 に列挙される別個の TypedArray コンストラクタ ーが存在する。Table 73 内の各コンストラクタ ーはそれぞれ固有のプロトタイプオブジェクトを持つ。
Table 73: TypedArray コンストラクタ ー
コンストラクタ ー名と組込み
要素型
要素サイズ
変換操作
説明
Int8Array
%Int8Array%
int8
1
ToInt8
8 ビット 2 の補数符号付き整数
Uint8Array
%Uint8Array%
uint8
1
ToUint8
8 ビット符号なし整数
Uint8ClampedArray
%Uint8ClampedArray%
uint8clamped
1
ToUint8Clamp
8 ビット符号なし整数 (クランプ変換)
Int16Array
%Int16Array%
int16
2
ToInt16
16 ビット 2 の補数符号付き整数
Uint16Array
%Uint16Array%
uint16
2
ToUint16
16 ビット符号なし整数
Int32Array
%Int32Array%
int32
4
ToInt32
32 ビット 2 の補数符号付き整数
Uint32Array
%Uint32Array%
uint32
4
ToUint32
32 ビット符号なし整数
BigInt64Array
%BigInt64Array%
bigint64
8
ToBigInt64
64 ビット 2 の補数符号付き整数
BigUint64Array
%BigUint64Array%
biguint64
8
ToBigUint64
64 ビット符号なし整数
Float16Array
%Float16Array%
float16
2
16 ビット IEEE 浮動小数点
Float32Array
%Float32Array%
float32
4
32 ビット IEEE 浮動小数点
Float64Array
%Float64Array%
float64
8
64 ビット IEEE 浮動小数点
以下の定義では TypedArray への参照は上表から適切なコンストラクタ ー名に置き換えるものとする。
23.2.1 %TypedArray% 組込みオブジェクト
%TypedArray% 組込みオブジェクト:
23.2.1.1 %TypedArray% ( )
この関数は呼び出し時に次を行う:
TypeError 例外を投げる。
この関数の "length" プロパティは +0 𝔽 である。
23.2.2 %TypedArray% 組込みオブジェクトのプロパティ
%TypedArray% 組込みオブジェクト:
23.2.2.1 %TypedArray%.from ( source [ , mapper [ , thisArg ] ] )
このメソッドは呼び出し時に以下を行う:
C を this 値とする。IsConstructor (C ) が false なら TypeError 例外。mapper が undefined ならmapping を false とする。そうでなければIsCallable (mapper ) が false なら TypeError 例外。mapping を true とする。 usingIterator を ? GetMethod (source , %Symbol.iterator% ) とする。usingIterator が undefined でなければvalues を ? IteratorToList (? GetIteratorFromMethod (source , usingIterator )) とする。len を values の要素数とする。targetObj を ? TypedArrayCreateFromConstructor (C , « 𝔽 (len ) ») とする。k = 0。k < len の間繰り返し、Pk = ! ToString (𝔽 (k ))。kValue を values の先頭要素とする。values から先頭要素を除去。mapping が true ならmappedValue = ? Call(mapper , thisArg , « kValue , 𝔽 (k ) »)。そうでなければmappedValue = kValue 。 ? Set (targetObj , Pk , mappedValue , true )。 k を k + 1 に。アサート: values は空 List 。 targetObj を返す。注: source は iterable でないので配列ライクであるとみなす。 arrayLike = ! ToObject (source )。len = ? LengthOfArrayLike (arrayLike )。targetObj = ? TypedArrayCreateFromConstructor (C , « 𝔽 (len ) »)。k = 0。k < len の間、Pk = ! ToString (𝔽 (k ))。kValue = ? Get (arrayLike , Pk )。mapping が true ならmappedValue = ? Call(mapper , thisArg , « kValue , 𝔽 (k ) »)。そうでなければmappedValue = kValue 。 ? Set (targetObj , Pk , mappedValue , true )。 k ++。targetObj を返す。
23.2.2.2 %TypedArray%.of ( ...items )
このメソッドは呼び出し時に以下を行う:
len を items の要素数とする。C を this 値とする。IsConstructor (C ) が false なら TypeError 例外。newObj = ? TypedArrayCreateFromConstructor (C , « 𝔽 (len ) »)。k = 0。k < len の間、kValue = items [k ]。Pk = ! ToString (𝔽 (k ))。? Set (newObj , Pk , kValue , true )。 k ++。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 アクセサは以下を行う:
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 )
O を this 値とする。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。relativeIndex = ? ToIntegerOrInfinity (index )。relativeIndex ≥ 0 ならk = relativeIndex 。そうでなければk = len + relativeIndex 。 k < 0 または k ≥ len なら undefined を返す。! Get (O , ! ToString (𝔽 (k ))) を返す。
23.2.3.2 get %TypedArray%.prototype.buffer
%TypedArray% .prototype.buffer
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
O を this 値とする。? RequireInternalSlot (O , [[TypedArrayName]] )。 アサート: O は [[ViewedArrayBuffer]] 内部スロットを持つ。 buffer = O .[[ViewedArrayBuffer]] 。buffer を返す。
23.2.3.3 get %TypedArray%.prototype.byteLength
%TypedArray% .prototype.byteLength
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
O を this 値。? RequireInternalSlot (O , [[TypedArrayName]] )。 アサート: O は [[ViewedArrayBuffer]] 内部スロットを持つ。 taRecord = MakeTypedArrayWithBufferWitnessRecord (O , seq-cst )。size = TypedArrayByteLength (taRecord )。𝔽 (size ) を返す。
23.2.3.4 get %TypedArray%.prototype.byteOffset
%TypedArray% .prototype.byteOffset
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
O を this 値。? RequireInternalSlot (O , [[TypedArrayName]] )。 アサート: O は [[ViewedArrayBuffer]] 内部スロットを持つ。 taRecord = MakeTypedArrayWithBufferWitnessRecord (O , seq-cst )。IsTypedArrayOutOfBounds (taRecord ) が true なら +0 𝔽 を返す。offset = O .[[ByteOffset]] 。𝔽 (offset ) を返す。
23.2.3.5 %TypedArray%.prototype.constructor
%TypedArray% .prototype.constructor
の初期値は %TypedArray% である。
23.2.3.6 %TypedArray%.prototype.copyWithin ( target , start [ , end ] )
引数の意味と使用法は 23.1.3.4 に定義された Array.prototype.copyWithin
と同じ。
このメソッドは呼び出し時に次を行う:
O を this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。relativeTarget = ? ToIntegerOrInfinity (target )。relativeTarget = -∞ なら targetIndex = 0。そうでなく relativeTarget < 0 なら targetIndex = max (len + relativeTarget , 0)。 それ以外は targetIndex = min (relativeTarget , len )。 relativeStart = ? ToIntegerOrInfinity (start )。relativeStart = -∞ なら startIndex = 0。そうでなく relativeStart < 0 なら startIndex = max (len + relativeStart , 0)。 それ以外は startIndex = min (relativeStart , len )。 end が undefined なら relativeEnd = len ; そうでなければ relativeEnd = ? ToIntegerOrInfinity (end )。relativeEnd = -∞ なら endIndex = 0。そうでなく relativeEnd < 0 なら endIndex = max (len + relativeEnd , 0)。 それ以外は endIndex = min (relativeEnd , len )。 count = min (endIndex - startIndex , len - targetIndex )。count > 0 なら注: コピーはソースのビットレベルエンコーディングを保持する方法で行わねばならない。 buffer = O .[[ViewedArrayBuffer]] 。taRecord = MakeTypedArrayWithBufferWitnessRecord (O , seq-cst )。IsTypedArrayOutOfBounds (taRecord ) が true なら TypeError 。len = TypedArrayLength (taRecord )。elementSize = TypedArrayElementSize (O )。byteOffset = O .[[ByteOffset]] 。bufferByteLimit = (len × elementSize ) + byteOffset 。toByteIndex = (targetIndex × elementSize ) + byteOffset 。fromByteIndex = (startIndex × elementSize ) + byteOffset 。countBytes = count × elementSize 。もし fromByteIndex < toByteIndex かつ toByteIndex < fromByteIndex + countBytes ならdirection = -1。fromByteIndex = fromByteIndex + countBytes - 1。toByteIndex = toByteIndex + countBytes - 1。 そうでなければdirection = 1。 countBytes > 0 の間繰り返し、もし fromByteIndex < bufferByteLimit かつ toByteIndex < bufferByteLimit ならvalue = GetValueFromBuffer (buffer , fromByteIndex , uint8 , true , unordered )。SetValueInBuffer (buffer , toByteIndex , uint8 , value , true , unordered ) を実行。fromByteIndex += direction 。toByteIndex += direction 。countBytes = countBytes - 1。 そうでなければcountBytes = 0。 O を返す。
23.2.3.7 %TypedArray%.prototype.entries ( )
このメソッドは呼び出し時に次を行う:
O を this 値。? ValidateTypedArray (O , seq-cst )。 CreateArrayIterator (O , key+value ) を返す。
23.2.3.8 %TypedArray%.prototype.every ( callback [ , thisArg ] )
引数の意味と使用法は 23.1.3.6 の Array.prototype.every
と同じ。
このメソッドは呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。IsCallable (callback ) が false なら TypeError 。k = 0。k < len の間、Pk = ! ToString (𝔽 (k ))。kValue = ! Get (O , Pk )。testResult = ToBoolean (? Call(callback , thisArg , « kValue , 𝔽 (k ), O »))。testResult が false なら false 。k ++。true を返す。
このメソッドは汎用ではない。this 値は [[TypedArrayName]] 内部スロットを持つオブジェクトでなければならない。
23.2.3.9 %TypedArray%.prototype.fill ( value [ , start [ , end ] ] )
引数の意味と使用法は 23.1.3.7 の Array.prototype.fill
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。O .[[ContentType]] が bigint なら value = ? ToBigInt (value )。そうでなければ value = ? ToNumber (value )。relativeStart = ? ToIntegerOrInfinity (start )。relativeStart = -∞ なら startIndex = 0。そうでなく relativeStart < 0 なら startIndex = max (len + relativeStart , 0)。 それ以外は startIndex = min (relativeStart , len )。 end が undefined なら relativeEnd = len ; そうでなければ relativeEnd = ? ToIntegerOrInfinity (end )。relativeEnd = -∞ なら endIndex = 0。そうでなく relativeEnd < 0 なら endIndex = max (len + relativeEnd , 0)。 それ以外は endIndex = min (relativeEnd , len )。 taRecord = MakeTypedArrayWithBufferWitnessRecord (O , seq-cst )。IsTypedArrayOutOfBounds (taRecord ) が true なら TypeError 。len = TypedArrayLength (taRecord )。endIndex = min (endIndex , len )。k = startIndex 。k < endIndex の間、Pk = ! ToString (𝔽 (k ))。! Set (O , Pk , value , true )。 k ++。O を返す。
23.2.3.10 %TypedArray%.prototype.filter ( callback [ , thisArg ] )
引数の意味と使用法は 23.1.3.8 の Array.prototype.filter
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。IsCallable (callback ) が false なら TypeError 。kept = 新しい空 List 。captured = 0。k = 0。k < len の間、Pk = ! ToString (𝔽 (k ))。kValue = ! Get (O , Pk )。selected = ToBoolean (? Call(callback , thisArg , « kValue , 𝔽 (k ), O »))。selected が true ならkValue を kept に追加。captured = captured + 1。k ++。A = ? TypedArraySpeciesCreate (O , « 𝔽 (captured ) »)。n = 0。各 e ∈ kept について! Set (A , ! ToString (𝔽 (n )), e , true )。 n ++。 A を返す。
このメソッドは汎用ではない。this 値は [[TypedArrayName]] 内部スロットを持つ必要がある。
23.2.3.11 %TypedArray%.prototype.find ( predicate [ , thisArg ] )
引数の意味と使用法は 23.1.3.9 の Array.prototype.find
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。findRec = ? FindViaPredicate (O , len , ascending , predicate , thisArg )。findRec .[[Value]] を返す。
汎用ではない。
23.2.3.12 %TypedArray%.prototype.findIndex ( predicate [ , thisArg ] )
引数の意味と使用法は 23.1.3.10 の Array.prototype.findIndex
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。findRec = ? FindViaPredicate (O , len , ascending , predicate , thisArg )。findRec .[[Index]] を返す。
汎用ではない。
23.2.3.13 %TypedArray%.prototype.findLast ( predicate [ , thisArg ] )
引数の意味と使用法は 23.1.3.11 の Array.prototype.findLast
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。findRec = ? FindViaPredicate (O , len , descending , predicate , thisArg )。findRec .[[Value]] を返す。
汎用ではない。
23.2.3.14 %TypedArray%.prototype.findLastIndex ( predicate [ , thisArg ] )
引数の意味と使用法は 23.1.3.12 の Array.prototype.findLastIndex
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。findRec = ? FindViaPredicate (O , len , descending , predicate , thisArg )。findRec .[[Index]] を返す。
汎用ではない。
23.2.3.15 %TypedArray%.prototype.forEach ( callback [ , thisArg ] )
引数の意味と使用法は 23.1.3.15 の Array.prototype.forEach
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。IsCallable (callback ) が false なら TypeError 。k = 0。k < len の間、Pk = ! ToString (𝔽 (k ))。kValue = ! Get (O , Pk )。? Call(callback , thisArg , « kValue , 𝔽 (k ), O »)。 k ++。undefined を返す。
汎用ではない。
23.2.3.16 %TypedArray%.prototype.includes ( searchElement [ , fromIndex ] )
引数の意味と使用法は 23.1.3.16 の Array.prototype.includes
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。len = 0 なら false 。n = ? ToIntegerOrInfinity (fromIndex )。アサート: fromIndex が undefined なら n = 0。 n = +∞ なら false 。そうでなく n = -∞ なら n = 0。 n ≥ 0 ならk = n 。そうでなければk = len + n 。k < 0 なら k = 0。 k < len の間、elementK = ! Get (O , ! ToString (𝔽 (k )))。SameValueZero (searchElement , elementK ) が true なら true 。k ++。false を返す。
汎用ではない。
23.2.3.17 %TypedArray%.prototype.indexOf ( searchElement [ , fromIndex ] )
引数の意味と使用法は 23.1.3.17 の Array.prototype.indexOf
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。len = 0 なら -1 𝔽 。n = ? ToIntegerOrInfinity (fromIndex )。アサート: fromIndex undefined → n = 0。 n = +∞ なら -1 𝔽 。そうでなく n = -∞ なら n = 0。 n ≥ 0 ならk = n 。そうでなければk = len + n 。k < 0 なら k = 0。 k < len の間、Pk = ! ToString (𝔽 (k ))。kPresent = ! HasProperty (O , Pk )。kPresent が true ならelementK = ! Get (O , Pk )。IsStrictlyEqual (searchElement , elementK ) が true なら 𝔽 (k )。k ++。-1 𝔽 を返す。
汎用ではない。
23.2.3.18 %TypedArray%.prototype.join ( separator )
引数の意味と使用法は 23.1.3.18 の Array.prototype.join
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。separator が undefined なら sep = "," ;そうでなければ sep = ? ToString (separator )。R = 空文字列。k = 0。k < len の間、k > 0 なら R = R と sep の連結。element = ! Get (O , ! ToString (𝔽 (k )))。element が undefined でないならS = ! ToString (element )。R = R + S 。k ++。R を返す。
汎用ではない。
23.2.3.19 %TypedArray%.prototype.keys ( )
このメソッドは呼び出し時:
O = this 値。? ValidateTypedArray (O , seq-cst )。 CreateArrayIterator (O , key ) を返す。
23.2.3.20 %TypedArray%.prototype.lastIndexOf ( searchElement [ , fromIndex ] )
引数の意味と使用法は 23.1.3.20 の Array.prototype.lastIndexOf
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。len = 0 なら -1 𝔽 。fromIndex が存在するなら n = ? ToIntegerOrInfinity (fromIndex ); そうでなければ n = len - 1。n = -∞ なら -1 𝔽 。n ≥ 0 ならk = min (n , len - 1)。そうでなければk = len + n 。 k ≥ 0 の間、Pk = ! ToString (𝔽 (k ))。kPresent = ! HasProperty (O , Pk )。kPresent が true ならelementK = ! Get (O , Pk )。IsStrictlyEqual (searchElement , elementK ) が true なら 𝔽 (k )。k --。-1 𝔽 を返す。
汎用ではない。
23.2.3.21 get %TypedArray%.prototype.length
%TypedArray% .prototype.length
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
O = this 値。? RequireInternalSlot (O , [[TypedArrayName]] )。 アサート: O は [[ViewedArrayBuffer]] と [[ArrayLength]] を持つ。 taRecord = MakeTypedArrayWithBufferWitnessRecord (O , seq-cst )。IsTypedArrayOutOfBounds (taRecord ) が true なら +0 𝔽 。length = TypedArrayLength (taRecord )。𝔽 (length ) を返す。
この関数は汎用ではない。
23.2.3.22 %TypedArray%.prototype.map ( callback [ , thisArg ] )
引数の意味と使用法は 23.1.3.21 の Array.prototype.map
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。IsCallable (callback ) が false なら TypeError 。A = ? TypedArraySpeciesCreate (O , « 𝔽 (len ) »)。k = 0。k < len の間、Pk = ! ToString (𝔽 (k ))。kValue = ! Get (O , Pk )。mappedValue = ? Call(callback , thisArg , « kValue , 𝔽 (k ), O »)。? Set (A , Pk , mappedValue , true )。 k ++。A を返す。
汎用ではない。
23.2.3.23 %TypedArray%.prototype.reduce ( callback [ , initialValue ] )
引数の意味と使用法は 23.1.3.24 の Array.prototype.reduce
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。IsCallable (callback ) が false なら TypeError 。len = 0 かつ initialValue 非存在なら TypeError 。k = 0。accumulator = undefined 。initialValue 存在ならaccumulator = initialValue 。そうでなければPk = ! ToString (𝔽 (k ))。accumulator = ! Get (O , Pk )。k ++。 k < len の間、Pk = ! ToString (𝔽 (k ))。kValue = ! Get (O , Pk )。accumulator = ? Call(callback , undefined , « accumulator , kValue , 𝔽 (k ), O »)。k ++。accumulator を返す。
汎用ではない。
23.2.3.24 %TypedArray%.prototype.reduceRight ( callback [ , initialValue ] )
引数の意味と使用法は 23.1.3.25 の Array.prototype.reduceRight
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。IsCallable (callback ) が false なら TypeError 。len = 0 かつ initialValue 無しなら TypeError 。k = len - 1。accumulator = undefined 。initialValue 存在ならaccumulator = initialValue 。そうでなければPk = ! ToString (𝔽 (k ))。accumulator = ! Get (O , Pk )。k --。 k ≥ 0 の間、Pk = ! ToString (𝔽 (k ))。kValue = ! Get (O , Pk )。accumulator = ? Call(callback , undefined , « accumulator , kValue , 𝔽 (k ), O »)。k --。accumulator を返す。
汎用ではない。
23.2.3.25 %TypedArray%.prototype.reverse ( )
引数の意味と使用法は 23.1.3.26 の Array.prototype.reverse
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。middle = floor (len / 2)。lower = 0。lower ≠ middle の間、upper = len - lower - 1。upperP = ! ToString (𝔽 (upper ))。lowerP = ! ToString (𝔽 (lower ))。lowerValue = ! Get (O , lowerP )。upperValue = ! Get (O , upperP )。! Set (O , lowerP , upperValue , true )。 ! Set (O , upperP , lowerValue , true )。 lower ++。O を返す。
汎用ではない。
23.2.3.26 %TypedArray%.prototype.set ( source [ , offset ] )
このメソッドは source から値を読み取り複数の値をこの TypedArray に設定する。詳細は source の型に依存する。任意の offset は書き込み開始位置の要素インデックスを示し、省略時 0。
呼び出し時:
target = this 値。? RequireInternalSlot (target , [[TypedArrayName]] )。 アサート: target は [[ViewedArrayBuffer]] を持つ。 targetOffset = ? ToIntegerOrInfinity (offset )。targetOffset < 0 なら RangeError 。もし source が [[TypedArrayName]] を持つオブジェクトなら? SetTypedArrayFromTypedArray (target , targetOffset , source )。 そうでなければ? SetTypedArrayFromArrayLike (target , targetOffset , source )。 undefined を返す。
汎用ではない。
23.2.3.26.1 SetTypedArrayFromArrayLike ( target , targetOffset , source )
The abstract operation SetTypedArrayFromArrayLike takes arguments target (a TypedArray ), targetOffset (a non-negative integer or +∞), and source (an ECMAScript language value, but not a TypedArray ) and returns unused を含む通常完了または throw 完了. target の targetOffset から source の値を複数設定する。 It performs the following steps when called:
targetRecord = MakeTypedArrayWithBufferWitnessRecord (target , seq-cst )。IsTypedArrayOutOfBounds (targetRecord ) が true なら TypeError 。targetLength = TypedArrayLength (targetRecord )。src = ? ToObject (source )。srcLength = ? LengthOfArrayLike (src )。targetOffset = +∞ なら RangeError 。srcLength + targetOffset > targetLength なら RangeError 。k = 0。k < srcLength の間、Pk = ! ToString (𝔽 (k ))。value = ? Get (src , Pk )。targetIndex = 𝔽 (targetOffset + k )。? TypedArraySetElement (target , targetIndex , value )。 k ++。unused を返す。
23.2.3.26.2 SetTypedArrayFromTypedArray ( target , targetOffset , source )
The abstract operation SetTypedArrayFromTypedArray takes arguments target (a TypedArray ), targetOffset (a non-negative integer or +∞), and source (a TypedArray ) and returns unused を含む通常完了または throw 完了. target の targetOffset から source の値を複数設定する。 It performs the following steps when called:
targetBuffer = target .[[ViewedArrayBuffer]] 。targetRecord = MakeTypedArrayWithBufferWitnessRecord (target , seq-cst )。IsTypedArrayOutOfBounds (targetRecord ) が true なら TypeError 。targetLength = TypedArrayLength (targetRecord )。srcBuffer = source .[[ViewedArrayBuffer]] 。srcRecord = MakeTypedArrayWithBufferWitnessRecord (source , seq-cst )。IsTypedArrayOutOfBounds (srcRecord ) が true なら TypeError 。srcLength = TypedArrayLength (srcRecord )。targetType = TypedArrayElementType (target )。targetElementSize = TypedArrayElementSize (target )。targetByteOffset = target .[[ByteOffset]] 。srcType = TypedArrayElementType (source )。srcElementSize = TypedArrayElementSize (source )。srcByteOffset = source .[[ByteOffset]] 。targetOffset = +∞ なら RangeError 。srcLength + targetOffset > targetLength なら RangeError 。target .[[ContentType]] ≠ source .[[ContentType]] なら TypeError 。IsSharedArrayBuffer (srcBuffer ) かつ IsSharedArrayBuffer (targetBuffer ) かつ srcBuffer .[[ArrayBufferData]] = targetBuffer .[[ArrayBufferData]] なら sameSharedArrayBuffer = true 、そうでなければ false 。SameValue (srcBuffer , targetBuffer ) または sameSharedArrayBuffer が true ならsrcByteLength = TypedArrayByteLength (srcRecord )。srcBuffer = ? CloneArrayBuffer (srcBuffer , srcByteOffset , srcByteLength )。srcByteIndex = 0。そうでなければsrcByteIndex = srcByteOffset 。 targetByteIndex = (targetOffset × targetElementSize ) + targetByteOffset 。limit = targetByteIndex + (targetElementSize × srcLength )。srcType = targetType なら注: 転送はビットレベルエンコーディングを保持する形で行う。 targetByteIndex < limit の間、value = GetValueFromBuffer (srcBuffer , srcByteIndex , uint8 , true , unordered )。SetValueInBuffer (targetBuffer , targetByteIndex , uint8 , value , true , unordered )。srcByteIndex ++。targetByteIndex ++。そうでなければtargetByteIndex < limit の間、value = GetValueFromBuffer (srcBuffer , srcByteIndex , srcType , true , unordered )。SetValueInBuffer (targetBuffer , targetByteIndex , targetType , value , true , unordered )。srcByteIndex += srcElementSize 。targetByteIndex += targetElementSize 。 unused を返す。
23.2.3.27 %TypedArray%.prototype.slice ( start , end )
引数の意味と使用法は 23.1.3.28 の Array.prototype.slice
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。srcArrayLength = TypedArrayLength (taRecord )。relativeStart = ? ToIntegerOrInfinity (start )。relativeStart = -∞ なら startIndex = 0。そうでなく relativeStart < 0 なら startIndex = max (srcArrayLength + relativeStart , 0)。 それ以外 startIndex = min (relativeStart , srcArrayLength )。 end が undefined なら relativeEnd = srcArrayLength ; そうでなければ relativeEnd = ? ToIntegerOrInfinity (end )。relativeEnd = -∞ なら endIndex = 0。そうでなく relativeEnd < 0 なら endIndex = max (srcArrayLength + relativeEnd , 0)。 それ以外 endIndex = min (relativeEnd , srcArrayLength )。 countBytes = max (endIndex - startIndex , 0)。A = ? TypedArraySpeciesCreate (O , « 𝔽 (countBytes ) »)。countBytes > 0 ならtaRecord = MakeTypedArrayWithBufferWitnessRecord (O , seq-cst )。IsTypedArrayOutOfBounds (taRecord ) が true なら TypeError 。endIndex = min (endIndex , TypedArrayLength (taRecord ))。countBytes = max (endIndex - startIndex , 0)。srcType = TypedArrayElementType (O )。targetType = TypedArrayElementType (A )。もし srcType = targetType なら注: 転送はビットエンコーディング保持で行う。 srcBuffer = O .[[ViewedArrayBuffer]] 。targetBuffer = A .[[ViewedArrayBuffer]] 。elementSize = TypedArrayElementSize (O )。srcByteOffset = O .[[ByteOffset]] 。srcByteIndex = (startIndex × elementSize ) + srcByteOffset 。targetByteIndex = A .[[ByteOffset]] 。endByteIndex = targetByteIndex + (countBytes × elementSize )。targetByteIndex < endByteIndex の間、value = GetValueFromBuffer (srcBuffer , srcByteIndex , uint8 , true , unordered )。SetValueInBuffer (targetBuffer , targetByteIndex , uint8 , value , true , unordered )。srcByteIndex ++。targetByteIndex ++。 そうでなければn = 0。k = startIndex 。k < endIndex の間、Pk = ! ToString (𝔽 (k ))。kValue = ! Get (O , Pk )。! Set (A , ! ToString (𝔽 (n )), kValue , true )。 k ++。n ++。 A を返す。
汎用ではない。
23.2.3.28 %TypedArray%.prototype.some ( callback [ , thisArg ] )
引数の意味と使用法は 23.1.3.29 の Array.prototype.some
と同じ。
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。IsCallable (callback ) が false なら TypeError 。k = 0。k < len の間、Pk = ! ToString (𝔽 (k ))。kValue = ! Get (O , Pk )。testResult = ToBoolean (? Call(callback , thisArg , « kValue , 𝔽 (k ), O »))。testResult が true なら true 。k ++。false を返す。
汎用ではない。
23.2.3.29 %TypedArray%.prototype.sort ( comparator )
これは独立したメソッドであり、以下に述べる点を除き 23.1.3.30 の Array.prototype.sort
と同じ要件を実装する。実装は this 値が固定長で疎でない整数インデックス 付きプロパティを持つことを利用して最適化できる。
汎用ではない。
呼び出し時:
comparator が undefined でなく IsCallable (comparator ) が false なら TypeError 。obj = this 値。taRecord = ? ValidateTypedArray (obj , seq-cst )。len = TypedArrayLength (taRecord )。注: 以下のクロージャは文字列比較ではなく数値比較を行う。 SortCompare を (x , y ) を取り comparator を捕捉し CompareTypedArrayElements を呼ぶ抽象クロージャとする。sortedList = ? SortIndexedProperties (obj , len , SortCompare , read-through-holes )。j = 0。j < len の間、! Set (obj , ! ToString (𝔽 (j )), sortedList [j ], true )。 j ++。obj を返す。
Note
NaN は他の任意値より常に大きく比較されるため (CompareTypedArrayElements 参照)、comparator 未指定時は NaN 値は末尾に並ぶ。
23.2.3.30 %TypedArray%.prototype.subarray ( start , end )
このメソッドは元の TypedArray と同じ要素型・同じ ArrayBuffer を参照し、start (含む) から end (含まない) までの要素を参照する新しい TypedArray を返す。start または end が負なら配列末尾からのインデックスを示す。
呼び出し時:
O = this 値。? RequireInternalSlot (O , [[TypedArrayName]] )。 アサート: O は [[ViewedArrayBuffer]] を持つ。buffer = O .[[ViewedArrayBuffer]] 。 srcRecord = MakeTypedArrayWithBufferWitnessRecord (O , seq-cst )。IsTypedArrayOutOfBounds (srcRecord ) が true ならsrcLength = 0。そうでなければsrcLength = TypedArrayLength (srcRecord )。 relativeStart = ? ToIntegerOrInfinity (start )。relativeStart = -∞ なら startIndex = 0。そうでなく relativeStart < 0 なら startIndex = max (srcLength + relativeStart , 0)。 それ以外 startIndex = min (relativeStart , srcLength )。 elementSize = TypedArrayElementSize (O )。srcByteOffset = O .[[ByteOffset]] 。beginByteOffset = srcByteOffset + (startIndex × elementSize )。もし O .[[ArrayLength]] が auto かつ end が undefined ならargumentsList = « buffer , 𝔽 (beginByteOffset ) »。 そうでなければend が undefined なら relativeEnd = srcLength ; そうでなければ relativeEnd = ? ToIntegerOrInfinity (end )。relativeEnd = -∞ なら endIndex = 0。そうでなく relativeEnd < 0 なら endIndex = max (srcLength + relativeEnd , 0)。 それ以外 endIndex = min (relativeEnd , srcLength )。 newLength = max (endIndex - startIndex , 0)。argumentsList = « buffer , 𝔽 (beginByteOffset ), 𝔽 (newLength ) »。 ? TypedArraySpeciesCreate (O , argumentsList ) を返す。
汎用ではない。
23.2.3.31 %TypedArray%.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
これは 23.1.3.32 の Array.prototype.toLocaleString
と同アルゴリズムを実装するが、"length" の [[Get]] の代わりに TypedArrayLength を呼ぶ点が異なる。基礎バッファがリサイズ不可で固定長かつ疎でないことを利用した最適化は許されるが、観測可能な仕様上の挙動を変えてはならない。
汎用ではない。アルゴリズム実行前に ValidateTypedArray が this 値と seq-cst で呼ばれ、その結果が異常完了ならアルゴリズムを実行せず例外を投げる。
Note
実装が ECMA-402 国際化 API を含む場合、このメソッドは ECMA-402 における Array.prototype.toLocaleString
アルゴリズムに基づく。
23.2.3.32 %TypedArray%.prototype.toReversed ( )
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。A = ? TypedArrayCreateSameType (O , len )。k = 0。k < len の間、from = ! ToString (𝔽 (len - k - 1))。Pk = ! ToString (𝔽 (k ))。fromValue = ! Get (O , from )。! Set (A , Pk , fromValue , true )。 k ++。A を返す。
23.2.3.33 %TypedArray%.prototype.toSorted ( comparator )
呼び出し時:
comparator が undefined でなく IsCallable (comparator ) が false なら TypeError 。O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。A = ? TypedArrayCreateSameType (O , len )。注: 以下のクロージャは文字列比較でなく数値比較。 SortCompare を (x , y ) を取り comparator を捕捉し CompareTypedArrayElements を呼ぶ抽象クロージャとする。sortedList = ? SortIndexedProperties (O , len , SortCompare , read-through-holes )。j = 0。j < len の間、! Set (A , ! ToString (𝔽 (j )), sortedList [j ], true )。 j ++。A を返す。
23.2.3.34 %TypedArray%.prototype.toString ( )
"toString" プロパティの初期値は 23.1.3.36 で定義される %Array.prototype.toString% である。
23.2.3.35 %TypedArray%.prototype.values ( )
呼び出し時:
O = this 値。? ValidateTypedArray (O , seq-cst )。 CreateArrayIterator (O , value ) を返す。
23.2.3.36 %TypedArray%.prototype.with ( index , value )
呼び出し時:
O = this 値。taRecord = ? ValidateTypedArray (O , seq-cst )。len = TypedArrayLength (taRecord )。relativeIndex = ? ToIntegerOrInfinity (index )。relativeIndex ≥ 0 なら actualIndex = relativeIndex ; そうでなければ actualIndex = len + relativeIndex 。O .[[ContentType]] が bigint なら numericValue = ? ToBigInt (value ); そうでなければ numericValue = ? ToNumber (value )。IsValidIntegerIndex (O , 𝔽 (actualIndex )) が false なら RangeError 。A = ? TypedArrayCreateSameType (O , len )。k = 0。k < len の間、Pk = ! ToString (𝔽 (k ))。k = actualIndex なら fromValue = numericValue ; そうでなければ fromValue = ! Get (O , Pk )。! Set (A , Pk , fromValue , true )。 k ++。A を返す。
23.2.3.37 %TypedArray%.prototype [ %Symbol.iterator% ] ( )
%Symbol.iterator% プロパティの初期値は 23.2.3.35 で定義される %TypedArray.prototype.values% である。
23.2.3.38 get %TypedArray%.prototype [ %Symbol.toStringTag% ]
%TypedArray% .prototype[%Symbol.toStringTag%]
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは以下を行う:
O = this 値。O がオブジェクトでなければ undefined 。O が [[TypedArrayName]] を持たなければ undefined 。name = O .[[TypedArrayName]] 。アサート: name は String。 name を返す。
このプロパティは { [[Enumerable]] : false , [[Configurable]] : true } を持つ。
この関数の "name" プロパティ初期値は "get [Symbol.toStringTag]" 。
23.2.4 TypedArray オブジェクト用抽象操作
23.2.4.1 TypedArrayCreateFromConstructor ( constructor , argumentList )
The abstract operation TypedArrayCreateFromConstructor takes arguments constructor (a constructor) and argumentList (a List of ECMAScript language values ) and returns TypedArray を含む通常完了または throw 完了. コンストラクタ ー関数を用いた新規 TypedArray の作成を規定する。 It performs the following steps when called:
newTypedArray = ? Construct(constructor , argumentList )。taRecord = ? ValidateTypedArray (newTypedArray , seq-cst )。アサート: newTypedArray は TypedArray インスタンスのプロパティ 記載の内部スロットを全て持つ。 argumentList の要素数が 1 で argumentList [0] が Number ならIsTypedArrayOutOfBounds (taRecord ) が true なら TypeError 。length = TypedArrayLength (taRecord )。length < ℝ (argumentList [0]) なら TypeError 。newTypedArray を返す。
23.2.4.2 TypedArrayCreateSameType ( exemplar , length )
The abstract operation TypedArrayCreateSameType takes arguments exemplar (a TypedArray ) and length (a non-negative integer) and returns TypedArray を含む通常完了または throw 完了. exemplar から派生したコンストラクタ ーと length を用いて新しい TypedArray を生成する。TypedArraySpeciesCreate が %Symbol.species% によりカスタムサブクラスを構築できるのに対し常に組込み TypedArray コンストラクタ ーを用いる。 It performs the following steps when called:
constructor を exemplar .[[TypedArrayName]] に対応する Table 73 の組込みオブジェクトとする。result = ? TypedArrayCreateFromConstructor (constructor , « 𝔽 (length ) »)。アサート: result は [[TypedArrayName]] と [[ContentType]] を持つ。 アサート: result .[[ContentType]] は exemplar .[[ContentType]] 。 result を返す。
23.2.4.3 TypedArraySpeciesCreate ( exemplar , argumentList )
The abstract operation TypedArraySpeciesCreate takes arguments exemplar (a TypedArray ) and argumentList (a List of ECMAScript language values ) and returns TypedArray を含む通常完了または throw 完了. exemplar から派生したコンストラクタ ーを用いて新しい TypedArray を作成する。ArraySpeciesCreate と異なり常に実際の TypedArray を生成することを強制する。 It performs the following steps when called:
defaultConstructor を exemplar .[[TypedArrayName]] に対応する組込みオブジェクトとする。constructor = ? SpeciesConstructor (exemplar , defaultConstructor )。result = ? TypedArrayCreateFromConstructor (constructor , argumentList )。result .[[ContentType]] ≠ exemplar .[[ContentType]] なら TypeError 。result を返す。
23.2.4.4 ValidateTypedArray ( O , order )
The abstract operation ValidateTypedArray takes arguments O (an ECMAScript language value) and order (seq-cst or unordered ) and returns TypedArray With Buffer Witness Record を含む通常完了または throw 完了. It performs the following steps when called:
? RequireInternalSlot (O , [[TypedArrayName]] )。 アサート: O は [[ViewedArrayBuffer]] を持つ。 taRecord = MakeTypedArrayWithBufferWitnessRecord (O , order )。IsTypedArrayOutOfBounds (taRecord ) が true なら TypeError 。taRecord を返す。
23.2.4.5 TypedArrayElementSize ( O )
The abstract operation TypedArrayElementSize takes argument O (a TypedArray ) and returns 非負整数 . It performs the following steps when called:
O .[[TypedArrayName]] に対し Table 73 で規定された要素サイズ値を返す。
23.2.4.6 TypedArrayElementType ( O )
The abstract operation TypedArrayElementType takes argument O (a TypedArray ) and returns TypedArray 要素型 . It performs the following steps when called:
O .[[TypedArrayName]] に対し Table 73 で規定された要素型値を返す。
23.2.4.7 CompareTypedArrayElements ( x , y , comparator )
The abstract operation CompareTypedArrayElements takes arguments x (a Number or a BigInt), y (a Number or a BigInt), and comparator (a function object or undefined ) and returns Number を含む通常完了または異常完了. It performs the following steps when called:
アサート: x と y は両方 Number か両方 BigInt。 comparator が undefined でないならv = ? ToNumber (? Call(comparator , undefined , « x , y »))。v が NaN なら +0 𝔽 。v を返す。x と y が両方 NaN なら +0 𝔽 。x が NaN なら 1 𝔽 。y が NaN なら -1 𝔽 。x < y なら -1 𝔽 。x > y なら 1 𝔽 。x が -0 𝔽 かつ y が +0 𝔽 なら -1 𝔽 。x が +0 𝔽 かつ y が -0 𝔽 なら 1 𝔽 。+0 𝔽 を返す。
Note
これは
23.1.3.30.2 の文字列比較ではなく数値比較を行う。
23.2.5 TypedArray コンストラクター
各 TypedArray コンストラクタ ーは:
Table 73 にて TypedArray の代わりに用いられる名称が異なるだけで、以下に記述する構造を持つ組込みオブジェクトである。
引数の数と型により挙動が変わる関数であり、呼び出し時の実際の挙動は渡された引数の数と種類に依存する。
関数として呼び出すことを意図しておらず、その形で呼べば例外を投げる。
クラス定義の extends
句に利用できる。指定された TypedArray の挙動を継承するサブクラスコンストラクタ ーは、%TypedArray% .prototype
組込みメソッドを支える内部状態でインスタンスを初期化するため TypedArray コンストラクタ ーへの super
呼び出しを含めねばならない。
23.2.5.1 TypedArray ( ...args )
各 TypedArray コンストラクタ ーは呼び出し時に以下を行う:
NewTarget が undefined なら TypeError 。 constructorName をこの TypedArray コンストラクタ ーに対応する Table 73 の Constructor Name の String 値とする。proto = "%TypedArray .prototype%"
。numberOfArgs = args の要素数。numberOfArgs = 0 なら? AllocateTypedArray (constructorName , NewTarget, proto , 0) を返す。 それ以外firstArgument = args [0]。firstArgument がオブジェクトならO = ? AllocateTypedArray (constructorName , NewTarget, proto )。firstArgument が [[TypedArrayName]] を持つなら? InitializeTypedArrayFromTypedArray (O , firstArgument )。 そうでなく [[ArrayBufferData]] を持つならnumberOfArgs > 1 なら byteOffset = args [1]; そうでなければ undefined 。numberOfArgs > 2 なら length = args [2]; そうでなければ undefined 。? InitializeTypedArrayFromArrayBuffer (O , firstArgument , byteOffset , length )。 それ以外アサート: firstArgument はオブジェクトで [[TypedArrayName]] も [[ArrayBufferData]] も持たない。 usingIterator = ? GetMethod (firstArgument , %Symbol.iterator% )。usingIterator が undefined でなければvalues = ? IteratorToList (? GetIteratorFromMethod (firstArgument , usingIterator ))。? InitializeTypedArrayFromList (O , values )。 そうでなければ注: firstArgument は iterable でないので配列ライクと仮定。 ? InitializeTypedArrayFromArrayLike (O , firstArgument )。 O を返す。そうでなければアサート: firstArgument はオブジェクトでない。 elementLength = ? ToIndex (firstArgument )。? AllocateTypedArray (constructorName , NewTarget, proto , elementLength ) を返す。
23.2.5.1.1 AllocateTypedArray ( constructorName , newTarget , defaultProto [ , length ] )
The abstract operation AllocateTypedArray takes arguments constructorName (Table 73 にある TypedArray コンストラクタ ー名 String), newTarget (a constructor), and defaultProto (a String) and optional argument length (非負整数 ) and returns TypedArray を含む通常完了または throw 完了. TypedArray コンストラクタ ーインスタンスを検証・生成する。length が渡されればその長さの ArrayBuffer も割当て関連付ける。TypedArray が用いる共通セマンティクスを提供。 It performs the following steps when called:
proto = ? GetPrototypeFromConstructor (newTarget , defaultProto )。obj = TypedArrayCreate (proto )。アサート: obj .[[ViewedArrayBuffer]] は undefined 。 obj .[[TypedArrayName]] = constructorName 。constructorName が "BigInt64Array" または "BigUint64Array" なら obj .[[ContentType]] = bigint 。それ以外は obj .[[ContentType]] = number 。 length 非存在ならobj .[[ByteLength]] = 0。obj .[[ByteOffset]] = 0。obj .[[ArrayLength]] = 0。そうでなければ? AllocateTypedArrayBuffer (obj , length )。 obj を返す。
23.2.5.1.2 InitializeTypedArrayFromTypedArray ( O , srcArray )
The abstract operation InitializeTypedArrayFromTypedArray takes arguments O (a TypedArray ) and srcArray (a TypedArray ) and returns unused を含む通常完了または throw 完了. It performs the following steps when called:
srcData = srcArray .[[ViewedArrayBuffer]] 。elementType = TypedArrayElementType (O )。elementSize = TypedArrayElementSize (O )。srcType = TypedArrayElementType (srcArray )。srcElementSize = TypedArrayElementSize (srcArray )。srcByteOffset = srcArray .[[ByteOffset]] 。srcRecord = MakeTypedArrayWithBufferWitnessRecord (srcArray , seq-cst )。IsTypedArrayOutOfBounds (srcRecord ) が true なら TypeError 。elementLength = TypedArrayLength (srcRecord )。byteLength = elementSize × elementLength 。elementType = srcType ならdata = ? CloneArrayBuffer (srcData , srcByteOffset , byteLength )。そうでなければdata = ? AllocateArrayBuffer (%ArrayBuffer% , byteLength )。srcArray .[[ContentType]] ≠ O .[[ContentType]] なら TypeError 。srcByteIndex = srcByteOffset 。targetByteIndex = 0。count = elementLength 。count > 0 の間、value = GetValueFromBuffer (srcData , srcByteIndex , srcType , true , unordered )。SetValueInBuffer (data , targetByteIndex , elementType , value , true , unordered )。srcByteIndex += srcElementSize 。targetByteIndex += elementSize 。count --。 O .[[ViewedArrayBuffer]] = data 。O .[[ByteLength]] = byteLength 。O .[[ByteOffset]] = 0。O .[[ArrayLength]] = elementLength 。unused を返す。
23.2.5.1.3 InitializeTypedArrayFromArrayBuffer ( O , buffer , byteOffset , length )
The abstract operation InitializeTypedArrayFromArrayBuffer takes arguments O (a TypedArray ), buffer (an ArrayBuffer or a SharedArrayBuffer), byteOffset (an ECMAScript language value), and length (an ECMAScript language value) and returns unused を含む通常完了または throw 完了. It performs the following steps when called:
elementSize = TypedArrayElementSize (O )。offset = ? ToIndex (byteOffset )。offset mod elementSize ≠ 0 なら RangeError 。bufferIsFixedLength = IsFixedLengthArrayBuffer (buffer )。length が undefined でなければnewLength = ? ToIndex (length )。IsDetachedBuffer (buffer ) が true なら TypeError 。bufferByteLength = ArrayBufferByteLength (buffer , seq-cst )。length が undefined かつ bufferIsFixedLength が false ならoffset > bufferByteLength なら RangeError 。O .[[ByteLength]] = auto 。O .[[ArrayLength]] = auto 。そうでなければもし length が undefined ならbufferByteLength mod elementSize ≠ 0 なら RangeError 。newByteLength = bufferByteLength - offset 。newByteLength < 0 なら RangeError 。 そうでなければnewByteLength = newLength × elementSize 。offset + newByteLength > bufferByteLength なら RangeError 。 O .[[ByteLength]] = newByteLength 。O .[[ArrayLength]] = newByteLength / elementSize 。 O .[[ViewedArrayBuffer]] = buffer 。O .[[ByteOffset]] = offset 。unused を返す。
23.2.5.1.4 InitializeTypedArrayFromList ( O , values )
The abstract operation InitializeTypedArrayFromList takes arguments O (a TypedArray ) and values (a List of ECMAScript language values ) and returns unused を含む通常完了または throw 完了. It performs the following steps when called:
len = values の要素数。? AllocateTypedArrayBuffer (O , len )。 k = 0。k < len の間、Pk = ! ToString (𝔽 (k ))。kValue = values の先頭要素。values から先頭を除去。? Set (O , Pk , kValue , true )。 k ++。アサート: values は空。 unused を返す。
23.2.5.1.5 InitializeTypedArrayFromArrayLike ( O , arrayLike )
The abstract operation InitializeTypedArrayFromArrayLike takes arguments O (a TypedArray ) and arrayLike (an Object, but not a TypedArray or an ArrayBuffer) and returns unused を含む通常完了または throw 完了. It performs the following steps when called:
len = ? LengthOfArrayLike (arrayLike )。? AllocateTypedArrayBuffer (O , len )。 k = 0。k < len の間、Pk = ! ToString (𝔽 (k ))。kValue = ? Get (arrayLike , Pk )。? Set (O , Pk , kValue , true )。 k ++。unused を返す。
23.2.5.1.6 AllocateTypedArrayBuffer ( O , length )
The abstract operation AllocateTypedArrayBuffer takes arguments O (a TypedArray ) and length (a non-negative integer) and returns unused を含む通常完了または throw 完了. O に ArrayBuffer を割当て関連付ける。 It performs the following steps when called:
アサート: O .[[ViewedArrayBuffer]] は undefined 。 elementSize = TypedArrayElementSize (O )。byteLength = elementSize × length 。data = ? AllocateArrayBuffer (%ArrayBuffer% , byteLength )。O .[[ViewedArrayBuffer]] = data 。O .[[ByteLength]] = byteLength 。O .[[ByteOffset]] = 0。O .[[ArrayLength]] = length 。unused を返す。
23.2.6 TypedArray コンストラクターのプロパティ
各 TypedArray コンストラクタ ーは:
23.2.6.1 TypedArray .BYTES_PER_ELEMENT
TypedArray .BYTES_PER_ELEMENT
の値は Table 73 における TypedArray の要素サイズ値。
属性は { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
23.2.6.2 TypedArray .prototype
TypedArray .prototype
の初期値は対応する TypedArray プロトタイプ組込みオブジェクト (23.2.7 ) である。
属性は { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
23.2.7 TypedArray プロトタイプオブジェクトのプロパティ
各 TypedArray プロトタイプオブジェクトは:
[[Prototype]] 内部スロット値が %TypedArray.prototype% 。
通常のオブジェクト。
[[ViewedArrayBuffer]] など TypedArray インスタンス固有内部スロットを持たない。
23.2.7.1 TypedArray .prototype.BYTES_PER_ELEMENT
TypedArray .prototype.BYTES_PER_ELEMENT
の値は Table 73 における TypedArray の要素サイズ値。
属性は { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false }。
23.2.7.2 TypedArray .prototype.constructor
与えられた TypedArray コンストラクタ ーのプロトタイプにおける "constructor" プロパティ初期値はそのコンストラクタ ー自身である。
23.2.8 TypedArray インスタンスのプロパティ
TypedArray インスタンスは TypedArray である。各 TypedArray インスタンスは対応する TypedArray プロトタイプオブジェクトからプロパティを継承し、[[ViewedArrayBuffer]] , [[TypedArrayName]] , [[ContentType]] , [[ByteLength]] , [[ByteOffset]] , [[ArrayLength]] の内部スロットを持つ。
24 キー付きコレクション
24.1 Map オブジェクト
Map はキー/値ペアのコレクションであり、キーと値の両方に任意の ECMAScript 言語値を使用できる。Map のコレクション内では、同一のキー値はただ 1 つのキー/値ペアにしか現れない。異なるキー値の判別には SameValueZero 比較アルゴリズムの意味論が用いられる。
Map はハッシュテーブルまたはコレクション内要素数に対して平均で亜線形のアクセス時間を提供する他の機構を用いて実装されなければならない。本仕様で用いるデータ構造は Map の必要な観測可能セマンティクスを記述するためだけのものであり、実際に成立する実装モデルであることを意図しない。
24.1.1 Map コンストラクター
Map コンストラクタ ー:
%Map% である。
グローバルオブジェクト の "Map" プロパティの初期値である。
コンストラクタ ーとして呼ばれたとき新しい Map を生成し初期化する。
関数として呼び出すことは意図されておらず、その形で呼び出されると例外を投げる。
クラス定義の extends
句の値として使用できる。指定された Map の挙動を継承することを意図するサブクラスコンストラクタ ーは、Map.prototype
組込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、Map コンストラクタ ーへの super
呼び出しを含めなければならない。
24.1.1.1 Map ( [ iterable ] )
この関数は呼び出し時に次を行う:
NewTarget が undefined なら TypeError 例外を投げる。 map を ? OrdinaryCreateFromConstructor (NewTarget, "%Map.prototype%" , « [[MapData]] ») とする。map .[[MapData]] を新しい空 List に設定する。iterable が undefined または null なら map を返す。adder を ? Get (map , "set" ) とする。IsCallable (adder ) が false なら TypeError 例外。? AddEntriesFromIterable (map , iterable , adder ) を返す。
Note
引数 iterable が与えられる場合、それは %Symbol.iterator% メソッドを実装し、最初の要素が Map のキーとして用いられる値、2 番目の要素がそのキーに関連付ける値である 2 要素の配列ライクオブジェクトを生成するイテレータオブジェクトを返すオブジェクトであることが期待される。
24.1.1.2 AddEntriesFromIterable ( target , iterable , adder )
The abstract operation AddEntriesFromIterable takes arguments target (an Object), iterable (an ECMAScript language value, but not undefined or null ), and adder (a function object) and returns either a normal completion containing an ECMAScript language value or a throw completion . adder は target をレシーバとして呼び出される。 It performs the following steps when called:
iteratorRecord を ? GetIterator (iterable , sync ) とする。繰り返し、next を ? IteratorStepValue (iteratorRecord ) とする。next が done なら target を返す。next がオブジェクトでないならerror を ThrowCompletion (新規 TypeError オブジェクト) とする。? IteratorClose (iteratorRecord , error ) を返す。 k を Completion (Get (next , "0" )) とする。IfAbruptCloseIterator (k , iteratorRecord )。v を Completion (Get (next , "1" )) とする。IfAbruptCloseIterator (v , iteratorRecord )。status を Completion (Call(adder , target , « k , v »)) とする。IfAbruptCloseIterator (status , iteratorRecord )。
Note
引数 iterable は %Symbol.iterator% メソッドを実装し、最初の要素が Map のキー、2 番目の要素がそのキーに対応する値である 2 要素配列ライクを生成するイテレータオブジェクトを返すオブジェクトであることが期待される。
24.1.2 Map コンストラクターのプロパティ
Map コンストラクタ ー:
24.1.2.1 Map.groupBy ( items , callback )
Note
callback は 2 つの引数を受け取る関数であるべき。groupBy
は items の各要素に対し昇順で callback を 1 度ずつ呼び、新しい Map を構築する。callback が返した各値は Map のキーとして用いられる。そのキーごとに、結果 Map はそのキーをキーとし、callback がそのキーを返した全要素を含む配列を値とするエントリを持つ。
callback は 2 つの引数 (要素の値、要素のインデックス) で呼ばれる。
groupBy
の戻り値は Map である。
この関数は呼び出し時に次を行う:
groups を ? GroupBy (items , callback , collection ) とする。map を ! Construct(%Map% ) とする。各 Record { [[Key]] , [[Elements]] } g ∈ groups についてelements を CreateArrayFromList (g .[[Elements]] ) とする。entry を { [[Key]] : g .[[Key]] , [[Value]] : elements } という Record とする。entry を map .[[MapData]] に追加する。 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 アクセサは呼び出し時に次を行う:
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 ( )
このメソッドは呼び出し時に次を行う:
M を this 値とする。? RequireInternalSlot (M , [[MapData]] ) を実行。 各 Record { [[Key]] , [[Value]] } p ∈ M .[[MapData]] についてp .[[Key]] を empty に設定。p .[[Value]] を empty に設定。 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 )
このメソッドは呼び出し時に次を行う:
M を this 値とする。? RequireInternalSlot (M , [[MapData]] )。 key を CanonicalizeKeyedCollectionKey (key ) に設定。各 Record { [[Key]] , [[Value]] } p ∈ M .[[MapData]] についてp .[[Key]] が empty でなく SameValue (p .[[Key]] , key ) が true ならp .[[Key]] を empty に。p .[[Value]] を empty に。true を返す。 false を返す。
Note
empty はエントリが削除されたことを示す仕様上の装置として用いられる。実装は内部データ構造から物理的にエントリを除去するなど別の手段を取ってもよい。
24.1.3.4 Map.prototype.entries ( )
このメソッドは呼び出し時に次を行う:
M を this 値とする。? CreateMapIterator (M , key+value ) を返す。
24.1.3.5 Map.prototype.forEach ( callback [ , thisArg ] )
このメソッドは呼び出し時に次を行う:
M を this 値。? RequireInternalSlot (M , [[MapData]] )。 IsCallable (callback ) が false なら TypeError 。entries を M .[[MapData]] 。numEntries を entries の要素数。index = 0。index < numEntries の間繰り返し、e = entries [index ]。index を index + 1 に。e .[[Key]] が empty でなければ? Call(callback , thisArg , « e .[[Value]] , e .[[Key]] , M »)。 注: callback の実行中に entries の要素数が増加した可能性がある。 numEntries を entries の要素数に設定。undefined を返す。
Note
callback は 3 引数を受け取る関数であるべき。forEach
は Map に存在する各キー/値ペアについてキー挿入順に 1 度ずつ callback を呼ぶ。削除済みキーについては呼ばれない。
thisArg が与えられれば各呼出しの this 値として用いられ、無ければ undefined 。
callback は (値, キー, 走査対象 Map) で呼ばれる。
forEach
自体は直接オブジェクトをミューテートしないが callback により変更され得る。Map の [[MapData]] の各エントリは 1 度だけ訪問される。forEach
開始後に追加された新しいキーは訪問される。訪問後に削除され再追加されたキーは再訪問され得る。開始後に削除され訪問前のキーは再追加されない限り訪問されない。
24.1.3.6 Map.prototype.get ( key )
このメソッドは呼び出し時に次を行う:
M を this 値。? RequireInternalSlot (M , [[MapData]] )。 key を CanonicalizeKeyedCollectionKey (key ) に設定。各 Record { [[Key]] , [[Value]] } p ∈ M .[[MapData]] についてp .[[Key]] が empty でなく SameValue (p .[[Key]] , key ) が true なら p .[[Value]] を返す。 undefined を返す。
24.1.3.7 Map.prototype.has ( key )
このメソッドは呼び出し時に次を行う:
M を this 値。? RequireInternalSlot (M , [[MapData]] )。 key を CanonicalizeKeyedCollectionKey (key ) に設定。各 Record { [[Key]] , [[Value]] } p ∈ M .[[MapData]] についてp .[[Key]] が empty でなく SameValue (p .[[Key]] , key ) が true なら true を返す。 false を返す。
24.1.3.8 Map.prototype.keys ( )
このメソッドは呼び出し時に次を行う:
M を this 値。? CreateMapIterator (M , key ) を返す。
24.1.3.9 Map.prototype.set ( key , value )
このメソッドは呼び出し時に次を行う:
M を this 値。? RequireInternalSlot (M , [[MapData]] )。 key を CanonicalizeKeyedCollectionKey (key ) に設定。各 Record { [[Key]] , [[Value]] } p ∈ M .[[MapData]] についてp .[[Key]] が empty でなく SameValue (p .[[Key]] , key ) が true ならp .[[Value]] を value に設定。M を返す。 p を { [[Key]] : key , [[Value]] : value } とする Record とする。p を M .[[MapData]] に追加。M を返す。
24.1.3.10 get Map.prototype.size
Map.prototype.size
は set アクセサが undefined のアクセサプロパティ であり、その get アクセサは呼び出し時に次を行う:
M を this 値。? RequireInternalSlot (M , [[MapData]] )。 count を 0 とする。各 Record { [[Key]] , [[Value]] } p ∈ M .[[MapData]] についてp .[[Key]] が empty でなければ count を count + 1 に設定。 𝔽 (count ) を返す。
24.1.3.11 Map.prototype.values ( )
このメソッドは呼び出し時に次を行う:
M を this 値。? CreateMapIterator (M , value ) を返す。
24.1.3.12 Map.prototype [ %Symbol.iterator% ] ( )
%Symbol.iterator% プロパティの初期値は 24.1.3.4 で定義される %Map.prototype.entries% である。
24.1.3.13 Map.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列 "Map" である。
このプロパティは { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } の属性を持つ。
24.1.4 Map インスタンスのプロパティ
Map インスタンスは通常のオブジェクトであり、Map プロトタイプオブジェクト からプロパティを継承する。Map インスタンスは [[MapData]] 内部スロットも持つ。
24.1.5 Map イテレータオブジェクト
Map Iterator は特定の Map インスタンスオブジェクト上の特定の反復を表すオブジェクトである。Map Iterator オブジェクトには名前付きコンストラクタ ーは存在しない。代わりに、Map インスタンスオブジェクトの特定メソッド呼出により生成される。
24.1.5.1 CreateMapIterator ( map , kind )
The abstract operation CreateMapIterator takes arguments map (an ECMAScript language value) and kind (key+value , key , or value ) and returns either a normal completion containing a Generator or a throw completion . Map メソッドのうち、そのようなイテレータを返すもののためのイテレータオブジェクトを生成するために用いられる。 It performs the following steps when called:
? RequireInternalSlot (map , [[MapData]] ) を実行。 引数なしで map と kind を捕捉し呼び出し時に以下を行う新しい抽象クロージャ closure を作成:entries を map .[[MapData]] 。index = 0。numEntries を entries の要素数。index < numEntries の間繰り返し、e = entries [index ]。index を index + 1。e .[[Key]] が empty でなければkind が key ならresult = e .[[Key]] 。そうでなく kind が value ならresult = e .[[Value]] 。 それ以外アサート: kind は key+value 。 result = CreateArrayFromList (« e .[[Key]] , e .[[Value]] »)。 ? GeneratorYield (CreateIteratorResultObject (result , false )) を実行。 注: GeneratorYield による一時停止中に entries の要素数が増加した可能性がある。 numEntries を entries の要素数に設定。NormalCompletion (unused ) を返す。 CreateIteratorFromClosure (closure , "%MapIteratorPrototype%" , %MapIteratorPrototype% ) を返す。
24.1.5.2 %MapIteratorPrototype% オブジェクト
%MapIteratorPrototype% オブジェクト:
24.1.5.2.1 %MapIteratorPrototype%.next ( )
? GeneratorResume (this value, empty , "%MapIteratorPrototype%" ) を返す。
24.1.5.2.2 %MapIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列 "Map Iterator" である。
このプロパティは { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } の属性を持つ。
24.2 Set オブジェクト
Set オブジェクトは ECMAScript 言語値のコレクションである。異なる値は Set のコレクション内で 1 度だけ要素として現れる。異なる値の判別には SameValueZero 比較アルゴリズムの意味論が用いられる。
Set オブジェクトはハッシュテーブルまたはコレクション内要素数に対し平均で亜線形アクセス時間を提供する他の機構を用いて実装されなければならない。本仕様で用いるデータ構造は Set オブジェクトの必要な観測可能セマンティクスを記述するためのみのものであり、実装モデルとなることを意図しない。
24.2.1 Set オブジェクトに関する抽象操作
24.2.1.1 Set Record
Set Record は Set または類似オブジェクトのインターフェースをカプセル化するために用いられる Record 値である。
Set Record は Table 74 に列挙したフィールドを持つ。
Table 74: Set Record のフィールド
フィールド名
値
意味
[[SetObject]]
an Object
Set または類似オブジェクト。
[[Size]]
a non-negative integer or +∞
オブジェクトの報告サイズ。
[[Has]]
a function object
オブジェクトの has
メソッド。
[[Keys]]
a function object
オブジェクトの keys
メソッド。
24.2.1.2 GetSetRecord ( obj )
The abstract operation GetSetRecord takes argument obj (an ECMAScript language value) and returns either a normal completion containing a Set Record or a throw completion . It performs the following steps when called:
obj がオブジェクトでなければ TypeError 例外。rawSize を ? Get (obj , "size" ) とする。numSize を ? ToNumber (rawSize ) とする。注: rawSize が undefined の場合 numSize は NaN になる。 numSize が NaN なら TypeError 例外。intSize を ! ToIntegerOrInfinity (numSize ) とする。intSize < 0 なら RangeError 例外。has を ? Get (obj , "has" )。IsCallable (has ) が false なら TypeError 例外。keys を ? Get (obj , "keys" )。IsCallable (keys ) が false なら TypeError 例外。新しい Set Record { [[SetObject]] : obj , [[Size]] : intSize , [[Has]] : has , [[Keys]] : keys } を返す。
24.2.1.3 SetDataHas ( setData , value )
The abstract operation SetDataHas takes arguments setData (a List of either ECMAScript language values or empty ) and value (an ECMAScript language value) and returns a Boolean. It performs the following steps when called:
SetDataIndex (setData , value ) が not-found なら false を返す。true を返す。
24.2.1.4 SetDataIndex ( setData , value )
The abstract operation SetDataIndex takes arguments setData (a List of either ECMAScript language values or empty ) and value (an ECMAScript language value) and returns a non-negative integer or not-found . It performs the following steps when called:
value を CanonicalizeKeyedCollectionKey (value ) に設定。size を setData の要素数とする。index = 0。index < size の間、e = setData [index ]。e が empty でなく e が value ならindex を返す。index = index + 1。not-found を返す。
24.2.1.5 SetDataSize ( setData )
The abstract operation SetDataSize takes argument setData (a List of either ECMAScript language values or empty ) and returns a non-negative integer. It performs the following steps when called:
count = 0。各要素 e ∈ setData についてe が empty でなければ count = count + 1。 count を返す。
24.2.2 Set コンストラクター
Set コンストラクタ ー:
%Set% である。
グローバルオブジェクト の "Set" プロパティの初期値である。
コンストラクタ ーとして呼ばれたとき新しい Set オブジェクトを生成し初期化する。
関数として呼び出すことは意図されておらず、その形で呼ばれると例外を投げる。
クラス定義の extends
句の値として使用できる。指定された Set の挙動を継承するサブクラスコンストラクタ ーは、Set.prototype
組込みメソッドをサポートするための内部状態でサブクラスインスタンスを生成・初期化するため、Set コンストラクタ ーへの super
呼び出しを含めなければならない。
24.2.2.1 Set ( [ iterable ] )
この関数は呼び出し時に次を行う:
NewTarget が undefined なら TypeError 例外。 set を ? OrdinaryCreateFromConstructor (NewTarget, "%Set.prototype%" , « [[SetData]] ») とする。set .[[SetData]] を新しい空 List に設定。iterable が undefined または null なら set を返す。adder を ? Get (set , "add" ) とする。IsCallable (adder ) が false なら TypeError 例外。iteratorRecord を ? GetIterator (iterable , sync ) とする。繰り返し、next = ? IteratorStepValue (iteratorRecord )。next が done なら set を返す。status を Completion (Call(adder , set , « next »)) とする。IfAbruptCloseIterator (status , iteratorRecord )。
24.2.3 Set コンストラクターのプロパティ
Set コンストラクタ ー:
24.2.3.1 Set.prototype
Set.prototype
の初期値は Set プロトタイプオブジェクト である。
このプロパティは { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } の属性を持つ。
24.2.3.2 get Set [ %Symbol.species% ]
Set[%Symbol.species%]
は set アクセサが undefined のアクセサプロパティ であり、その get アクセサは呼び出し時に次を行う:
this 値を返す。
この関数の "name" プロパティの値は "get [Symbol.species]" である。
Note
派生コレクションオブジェクトを生成するメソッドは %Symbol.species% を呼び出して派生オブジェクトを生成するのに使用するコンストラクタ ーを決定すべき。サブクラスコンストラクタ ーは %Symbol.species% を再定義して既定のコンストラクタ ー割り当てを変更できる。
24.2.4 Set プロトタイプオブジェクトのプロパティ
Set プロトタイプオブジェクト :
%Set.prototype% である。
[[Prototype]] 内部スロットの値が %Object.prototype% である。
通常のオブジェクトである。
[[SetData]] 内部スロットを持たない。
24.2.4.1 Set.prototype.add ( value )
このメソッドは呼び出し時に次を行う:
S を this 値。? RequireInternalSlot (S , [[SetData]] )。 value を CanonicalizeKeyedCollectionKey (value ) に設定。各要素 e ∈ S .[[SetData]] についてe が empty でなく SameValue (e , value ) が true ならS を返す。 value を S .[[SetData]] に追加。S を返す。
24.2.4.2 Set.prototype.clear ( )
このメソッドは呼び出し時に次を行う:
S を this 値。? RequireInternalSlot (S , [[SetData]] )。 各要素 e ∈ S .[[SetData]] について値が e の要素を値が empty の要素で置き換える。 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 )
このメソッドは呼び出し時に次を行う:
S を this 値。? RequireInternalSlot (S , [[SetData]] )。 value を CanonicalizeKeyedCollectionKey (value ) に設定。各要素 e ∈ S .[[SetData]] についてe が empty でなく SameValue (e , value ) が true なら値が e の要素を値が empty の要素で置き換える。 true を返す。 false を返す。
Note
empty は削除済みエントリを示す仕様上の装置。実装は内部構造から実際に除去するなど他の手段を取ってよい。
24.2.4.5 Set.prototype.difference ( other )
このメソッドは呼び出し時に次を行う:
O を this 値。? RequireInternalSlot (O , [[SetData]] )。 otherRec を ? GetSetRecord (other ) とする。resultSetData を O .[[SetData]] のコピーとする。もし SetDataSize (O .[[SetData]] ) ≤ otherRec .[[Size]] ならthisSize を O .[[SetData]] の要素数とする。index = 0。index < thisSize の間、e = resultSetData [index ]。e が empty でなければinOther = ToBoolean (? Call(otherRec .[[Has]] , otherRec .[[SetObject]] , « e »))。inOther が true ならresultSetData [index ] = empty 。index = index + 1。 それ以外keysIter = ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] )。next = not-started 。next が done でない間、next = ? IteratorStepValue (keysIter )。next が done でなければnext = CanonicalizeKeyedCollectionKey (next )。valueIndex = SetDataIndex (resultSetData , next )。valueIndex が not-found でなければresultSetData [valueIndex ] = empty 。 result を OrdinaryObjectCreate (%Set.prototype% , « [[SetData]] ») とする。result .[[SetData]] = resultSetData 。result を返す。
24.2.4.6 Set.prototype.entries ( )
このメソッドは呼び出し時に次を行う:
S を this 値。? CreateSetIterator (S , key+value ) を返す。
Note
反復目的では、Set は各エントリのキーと値が同一である Map に似て見える。
24.2.4.7 Set.prototype.forEach ( callback [ , thisArg ] )
このメソッドは呼び出し時に次を行う:
S を this 値。? RequireInternalSlot (S , [[SetData]] )。 IsCallable (callback ) が false なら TypeError 。entries = S .[[SetData]] 。numEntries = entries の要素数。index = 0。index < numEntries の間、e = entries [index ]。index = index + 1。e が empty でなければ? Call(callback , thisArg , « e , e , S »)。 注: callback 実行中に entries の要素数が増加した可能性がある。 numEntries を entries の要素数に設定。undefined を返す。
Note
callback は 3 引数を受け取る関数であるべき。forEach
は Set オブジェクト内の各値に対して値挿入順で callback を 1 度呼ぶ。削除済みの値については呼ばれない。
thisArg が与えられれば各呼出しの this 値として使用し、無ければ undefined 。
callback は 3 引数で呼ばれる: 最初の 2 引数は Set に含まれる値で同一の値、3 番目は走査対象の Set。
callback が 3 引数で呼ばれるのは Map や Array の forEach
のコールバックと整合性を保つため。Set では各項目値がキーと値の双方であるとみなされる。
forEach
自体は直接オブジェクトを変更しないが、callback により変更され得る。
各値は通常 1 度だけ訪問されるが、訪問後削除され完了前に再追加された場合は再訪問される。開始後に削除され訪問前であった値は完了前に再追加されない限り訪問されない。開始後に追加された新しい値は訪問される。
24.2.4.8 Set.prototype.has ( value )
このメソッドは呼び出し時に次を行う:
S を this 値。? RequireInternalSlot (S , [[SetData]] )。 value を CanonicalizeKeyedCollectionKey (value ) に設定。各要素 e ∈ S .[[SetData]] についてe が empty でなく SameValue (e , value ) が true なら true を返す。 false を返す。
24.2.4.9 Set.prototype.intersection ( other )
このメソッドは呼び出し時に次を行う:
O を this 値。? RequireInternalSlot (O , [[SetData]] )。 otherRec を ? GetSetRecord (other ) とする。resultSetData を新しい空 List とする。もし SetDataSize (O .[[SetData]] ) ≤ otherRec .[[Size]] ならthisSize を O .[[SetData]] の要素数。index = 0。index < thisSize の間、e = O .[[SetData]] [index ]。index = index + 1。e が empty でなければinOther = ToBoolean (? Call(otherRec .[[Has]] , otherRec .[[SetObject]] , « e »))。inOther が true なら注: 以前の otherRec .[[Has]] 呼出しが O .[[SetData]] の要素を削除再追加し、この反復で同じ要素が 2 度訪問され得る。 SetDataHas (resultSetData , e ) が false なら resultSetData に e を追加。注: otherRec .[[Has]] 実行中に O .[[SetData]] の要素数が増えた可能性。 thisSize を O .[[SetData]] の要素数に設定。 それ以外keysIter = ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] )。next = not-started 。next が done でない間、next = ? IteratorStepValue (keysIter )。next が done でなければnext = CanonicalizeKeyedCollectionKey (next )。inThis = SetDataHas (O .[[SetData]] , next )。inThis が true なら注: other は任意のオブジェクトであるためその "keys" イテレータが同じ値を複数回生成し得る。 SetDataHas (resultSetData , next ) が false なら resultSetData に next を追加。 result = OrdinaryObjectCreate (%Set.prototype% , « [[SetData]] »)。result .[[SetData]] = resultSetData 。result を返す。
24.2.4.10 Set.prototype.isDisjointFrom ( other )
このメソッドは呼び出し時に次を行う:
O を this 値。? RequireInternalSlot (O , [[SetData]] )。 otherRec を ? GetSetRecord (other ) とする。もし SetDataSize (O .[[SetData]] ) ≤ otherRec .[[Size]] ならthisSize を O .[[SetData]] の要素数。index = 0。index < thisSize の間、e = O .[[SetData]] [index ]。index = index + 1。e が empty でなければinOther = ToBoolean (? Call(otherRec .[[Has]] , otherRec .[[SetObject]] , « e »))。inOther が true なら false を返す。注: otherRec .[[Has]] 実行中に O .[[SetData]] の要素数が増加した可能性。 thisSize を O .[[SetData]] の要素数に設定。 それ以外keysIter = ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] )。next = not-started 。next が done でない間、next = ? IteratorStepValue (keysIter )。next が done でなければSetDataHas (O .[[SetData]] , next ) が true なら? IteratorClose (keysIter , NormalCompletion (unused )) を実行。 false を返す。 true を返す。
24.2.4.11 Set.prototype.isSubsetOf ( other )
このメソッドは呼び出し時に次を行う:
O を this 値。? RequireInternalSlot (O , [[SetData]] )。 otherRec を ? GetSetRecord (other ) とする。SetDataSize (O .[[SetData]] ) > otherRec .[[Size]] なら false を返す。thisSize を O .[[SetData]] の要素数。index = 0。index < thisSize の間、e = O .[[SetData]] [index ]。index = index + 1。e が empty でなければinOther = ToBoolean (? Call(otherRec .[[Has]] , otherRec .[[SetObject]] , « e »))。inOther が false なら false を返す。注: otherRec .[[Has]] 実行中に O .[[SetData]] の要素数が増加した可能性。 thisSize を O .[[SetData]] の要素数に設定。true を返す。
24.2.4.12 Set.prototype.isSupersetOf ( other )
このメソッドは呼び出し時に次を行う:
O を this 値。? RequireInternalSlot (O , [[SetData]] )。 otherRec を ? GetSetRecord (other ) とする。SetDataSize (O .[[SetData]] ) < otherRec .[[Size]] なら false を返す。keysIter = ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] )。next = not-started 。next が done でない間、next = ? IteratorStepValue (keysIter )。next が done でなければSetDataHas (O .[[SetData]] , next ) が false なら? IteratorClose (keysIter , NormalCompletion (unused ))。 false を返す。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 アクセサは呼び出し時に次を行う:
S を this 値。? RequireInternalSlot (S , [[SetData]] )。 size = SetDataSize (S .[[SetData]] )。𝔽 (size ) を返す。
24.2.4.15 Set.prototype.symmetricDifference ( other )
このメソッドは呼び出し時に次を行う:
O を this 値。? RequireInternalSlot (O , [[SetData]] )。 otherRec を ? GetSetRecord (other ) とする。keysIter = ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] )。resultSetData を O .[[SetData]] のコピーとする。next = not-started 。next が done でない間、next = ? IteratorStepValue (keysIter )。next が done でなければnext = CanonicalizeKeyedCollectionKey (next )。resultIndex = SetDataIndex (resultSetData , next )。resultIndex が not-found なら alreadyInResult = false 、そうでなければ true 。SetDataHas (O .[[SetData]] , next ) が true ならalreadyInResult が true なら resultSetData [resultIndex ] = empty 。そうでなければalreadyInResult が false なら resultSetData に next を追加。 result = OrdinaryObjectCreate (%Set.prototype% , « [[SetData]] »)。result .[[SetData]] = resultSetData 。result を返す。
24.2.4.16 Set.prototype.union ( other )
このメソッドは呼び出し時に次を行う:
O を this 値。? RequireInternalSlot (O , [[SetData]] )。 otherRec を ? GetSetRecord (other ) とする。keysIter = ? GetIteratorFromMethod (otherRec .[[SetObject]] , otherRec .[[Keys]] )。resultSetData を O .[[SetData]] のコピーとする。next = not-started 。next が done でない間、next = ? IteratorStepValue (keysIter )。next が done でなければnext = CanonicalizeKeyedCollectionKey (next )。SetDataHas (resultSetData , next ) が false ならresultSetData に next を追加。result = OrdinaryObjectCreate (%Set.prototype% , « [[SetData]] »)。result .[[SetData]] = resultSetData 。result を返す。
24.2.4.17 Set.prototype.values ( )
このメソッドは呼び出し時に次を行う:
S を this 値。? CreateSetIterator (S , value ) を返す。
24.2.4.18 Set.prototype [ %Symbol.iterator% ] ( )
%Symbol.iterator% プロパティの初期値は 24.2.4.17 で定義される %Set.prototype.values% である。
24.2.4.19 Set.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列 "Set" である。
このプロパティは { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } の属性を持つ。
24.2.5 Set インスタンスのプロパティ
Set インスタンスは通常のオブジェクトであり、Set プロトタイプオブジェクト からプロパティを継承する。Set インスタンスは [[SetData]] 内部スロットも持つ。
24.2.6 Set イテレータオブジェクト
Set Iterator は以下で定義される構造を持つ通常のオブジェクトであり、特定の Set インスタンスオブジェクト上の特定の反復を表す。Set Iterator オブジェクトには名前付きコンストラクタ ーは存在しない。代わりに Set インスタンスオブジェクトの特定メソッド呼出によって生成される。
24.2.6.1 CreateSetIterator ( set , kind )
The abstract operation CreateSetIterator takes arguments set (an ECMAScript language value) and kind (key+value or value ) and returns either a normal completion containing a Generator or a throw completion . Set メソッドのうちイテレータを返すもののためのイテレータオブジェクトを生成するために用いられる。 It performs the following steps when called:
? RequireInternalSlot (set , [[SetData]] ) を実行。 引数なしで set と kind を捕捉し呼び出し時に以下を行う新しい抽象クロージャ closure を作成:index = 0。entries = set .[[SetData]] 。numEntries = entries の要素数。index < numEntries の間、e = entries [index ]。index = index + 1。e が empty でなければkind が key+value ならresult = CreateArrayFromList (« e , e »)。? GeneratorYield (CreateIteratorResultObject (result , false ))。 そうでなければアサート: kind は value 。 ? GeneratorYield (CreateIteratorResultObject (e , false ))。 注: GeneratorYield による一時停止中に entries の要素数が増加した可能性。 numEntries を entries の要素数に設定。NormalCompletion (unused ) を返す。 CreateIteratorFromClosure (closure , "%SetIteratorPrototype%" , %SetIteratorPrototype% ) を返す。
24.2.6.2 %SetIteratorPrototype% オブジェクト
%SetIteratorPrototype% オブジェクト:
24.2.6.2.1 %SetIteratorPrototype%.next ( )
? GeneratorResume (this value, empty , "%SetIteratorPrototype%" ) を返す。
24.2.6.2.2 %SetIteratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列 "Set Iterator" である。
このプロパティは { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } の属性を持つ。
24.3 WeakMap オブジェクト
WeakMap はキーがオブジェクトおよび/またはシンボルであり、値が任意の ECMAScript 言語値であるキー/値ペアのコレクションである。WeakMap は特定のキーを持つキー/値ペアを含むかを問い合わせできるが、保持する値をキーとして列挙する仕組みは提供されない。特定の状況では、9.9.3 に記述されるように、存活していない値は WeakMap のキーとして除去される。
実装は、WeakMap のキー/値ペアが到達不能になってから WeakMap から除去されるまでの間に任意に決定される遅延を課すことができる。もしこの遅延が ECMAScript プログラムから観測可能であれば、プログラム実行に影響する不確定性の原因となり得る。そのため ECMAScript 実装は、観測者が観測対象のキーを提示することなく WeakMap のキーを観測する手段を提供してはならない。
WeakMap はハッシュテーブルまたはコレクション内キー/値ペア数に対し平均で亜線形のアクセス時間を提供する他の機構を用いて実装されなければならない。本仕様で用いられるデータ構造は WeakMap の必要な観測可能セマンティクスを記述するためだけのもので、実装モデルとなることを意図しない。
Note
WeakMap と WeakSet は、WeakMap や WeakSet インスタンスが存在しなかった場合にそのオブジェクトまたはシンボルが到達不能となり実装のガーベジコレクション機構によるリソース回収対象となる状況で、メモリ資源を “リーク” しない形で動的に状態を関連付ける機構を提供することを意図している。この特性は WeakMap または WeakSet インスタンスからキーへの逆方向 per-object/symbol マッピングを用いることで達成できる。あるいは各 WeakMap または WeakSet インスタンスが内部にキーと値データを保持してもよいが、この方法は WeakMap/WeakSet 実装とガーベジコレクタ間の協調を要する。以下の参考文献は WeakMap および WeakSet の実装に有用となり得る機構を記述している:
Barry Hayes. 1997. Ephemerons: a new finalization mechanism. In Proceedings of the 12th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications (OOPSLA '97) , A. Michael Berman (Ed.). ACM, New York, NY, USA, 176-183, http://doi.acm.org/10.1145/263698.263733 .
Alexandra Barros, Roberto Ierusalimschy, Eliminating Cycles in Weak Tables. Journal of Universal Computer Science - J.UCS, vol. 14, no. 21, pp. 3481-3497, 2008, http://www.jucs.org/jucs_14_21/eliminating_cycles_in_weak
24.3.1 WeakMap コンストラクター
WeakMap コンストラクタ ー:
%WeakMap% である。
グローバルオブジェクト の "WeakMap" プロパティの初期値である。
コンストラクタ ーとして呼ばれたとき新しい WeakMap を生成し初期化する。
関数として呼び出すことは意図されておらず、その形で呼ばれると例外を投げる。
クラス定義の extends
句の値として使用できる。指定された WeakMap の挙動を継承するサブクラスコンストラクタ ーは、WeakMap.prototype
組込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、WeakMap コンストラクタ ーへの super
呼び出しを含めなければならない。
24.3.1.1 WeakMap ( [ iterable ] )
この関数は呼び出し時に次を行う:
NewTarget が undefined なら TypeError 例外。 map を ? OrdinaryCreateFromConstructor (NewTarget, "%WeakMap.prototype%" , « [[WeakMapData]] ») とする。map .[[WeakMapData]] を新しい空 List に設定。iterable が undefined または null なら map を返す。adder を ? Get (map , "set" ) とする。IsCallable (adder ) が false なら TypeError 例外。? AddEntriesFromIterable (map , iterable , adder ) を返す。
Note
引数 iterable が与えられる場合、それは %Symbol.iterator% メソッドを実装し、最初の要素が WeakMap のキー、2 番目の要素がそのキーに関連付ける値である 2 要素配列ライクを生成するイテレータオブジェクトを返すオブジェクトであることが期待される。
24.3.2 WeakMap コンストラクターのプロパティ
WeakMap コンストラクタ ー:
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 )
このメソッドは呼び出し時に次を行う:
M を this 値。? RequireInternalSlot (M , [[WeakMapData]] )。 CanBeHeldWeakly (key ) が false なら false を返す。各 Record { [[Key]] , [[Value]] } p ∈ M .[[WeakMapData]] についてp .[[Key]] が empty でなく SameValue (p .[[Key]] , key ) が true ならp .[[Key]] を empty に。p .[[Value]] を empty に。true を返す。 false を返す。
Note
empty は削除を示す仕様上の装置。実装は内部データ構造から物理的に削除するなど別の手段を取ってもよい。
24.3.3.3 WeakMap.prototype.get ( key )
このメソッドは呼び出し時に次を行う:
M を this 値。? RequireInternalSlot (M , [[WeakMapData]] )。 CanBeHeldWeakly (key ) が false なら undefined を返す。各 Record { [[Key]] , [[Value]] } p ∈ M .[[WeakMapData]] についてp .[[Key]] が empty でなく SameValue (p .[[Key]] , key ) が true なら p .[[Value]] を返す。 undefined を返す。
24.3.3.4 WeakMap.prototype.has ( key )
このメソッドは呼び出し時:
M を this 値。? RequireInternalSlot (M , [[WeakMapData]] )。 CanBeHeldWeakly (key ) が false なら false を返す。各 Record { [[Key]] , [[Value]] } p ∈ M .[[WeakMapData]] についてp .[[Key]] が empty でなく SameValue (p .[[Key]] , key ) が true なら true を返す。 false を返す。
24.3.3.5 WeakMap.prototype.set ( key , value )
このメソッドは呼び出し時:
M を this 値。? RequireInternalSlot (M , [[WeakMapData]] )。 CanBeHeldWeakly (key ) が false なら TypeError 例外。各 Record { [[Key]] , [[Value]] } p ∈ M .[[WeakMapData]] についてp .[[Key]] が empty でなく SameValue (p .[[Key]] , key ) が true ならp .[[Value]] を value に設定。M を返す。 p を { [[Key]] : key , [[Value]] : value } という Record とする。p を M .[[WeakMapData]] に追加。M を返す。
24.3.3.6 WeakMap.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列 "WeakMap" である。
このプロパティは { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } の属性を持つ。
24.3.4 WeakMap インスタンスのプロパティ
WeakMap インスタンスは通常のオブジェクトであり、WeakMap プロトタイプオブジェクト からプロパティを継承する。WeakMap インスタンスは [[WeakMapData]] 内部スロットも持つ。
24.4 WeakSet オブジェクト
WeakSet はオブジェクトおよび/またはシンボルのコレクションである。区別されるオブジェクトまたはシンボルは WeakSet のコレクション内で 1 度だけ要素として現れる。WeakSet は特定の値を含むかを問い合わせできるが、保持する値を列挙する仕組みは提供されない。特定の状況では、9.9.3 に記述されるように、存活していない値は WeakSet の要素として除去される。
実装は WeakSet に含まれる値が到達不能になってから WeakSet から除去されるまでの間に任意の遅延を課すことができる。もしこの遅延が ECMAScript プログラムから観測可能であれば、不確定性の原因となり得る。そのため ECMAScript 実装は、観測者が観測対象値を提示することなく WeakSet が特定値を含むか決定する手段を提供してはならない。
WeakSet はハッシュテーブルまたはコレクション内要素数に対し平均で亜線形アクセス時間を提供する他の機構を用いて実装されなければならない。本仕様のデータ構造は WeakSet の必要な観測可能セマンティクスを記述するためだけのもので、実装モデルとなることを意図しない。
Note
24.4.1 WeakSet コンストラクター
WeakSet コンストラクタ ー:
%WeakSet% である。
グローバルオブジェクト の "WeakSet" プロパティの初期値である。
コンストラクタ ーとして呼ばれたとき新しい WeakSet を生成し初期化する。
関数として呼び出すことは意図されておらず、その形で呼ばれると例外を投げる。
クラス定義の extends
句の値として使用できる。指定された WeakSet の挙動を継承するサブクラスコンストラクタ ーは、WeakSet.prototype
組込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、WeakSet コンストラクタ ーへの super
呼び出しを含めなければならない。
24.4.1.1 WeakSet ( [ iterable ] )
この関数は呼び出し時に次を行う:
NewTarget が undefined なら TypeError 例外。 set を ? OrdinaryCreateFromConstructor (NewTarget, "%WeakSet.prototype%" , « [[WeakSetData]] ») とする。set .[[WeakSetData]] を新しい空 List に設定。iterable が undefined または null なら set を返す。adder を ? Get (set , "add" ) とする。IsCallable (adder ) が false なら TypeError 例外。iteratorRecord を ? GetIterator (iterable , sync ) とする。繰り返し、next = ? IteratorStepValue (iteratorRecord )。next が done なら set を返す。status を Completion (Call(adder , set , « next »)) とする。IfAbruptCloseIterator (status , iteratorRecord )。
24.4.2 WeakSet コンストラクターのプロパティ
WeakSet コンストラクタ ー:
24.4.2.1 WeakSet.prototype
WeakSet.prototype
の初期値は WeakSet プロトタイプオブジェクト である。
このプロパティは { [[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 )
このメソッドは呼び出し時に次を行う:
S を this 値。? RequireInternalSlot (S , [[WeakSetData]] )。 CanBeHeldWeakly (value ) が false なら TypeError 例外。各要素 e ∈ S .[[WeakSetData]] についてe が empty でなく SameValue (e , value ) が true ならS を返す。 value を S .[[WeakSetData]] に追加。S を返す。
24.4.3.2 WeakSet.prototype.constructor
WeakSet.prototype.constructor
の初期値は %WeakSet% である。
24.4.3.3 WeakSet.prototype.delete ( value )
このメソッドは呼び出し時に次を行う:
S を this 値。? RequireInternalSlot (S , [[WeakSetData]] )。 CanBeHeldWeakly (value ) が false なら false を返す。各要素 e ∈ S .[[WeakSetData]] についてe が empty でなく SameValue (e , value ) が true なら値が e の要素を値が empty の要素で置き換える。 true を返す。 false を返す。
Note
empty は削除を示す仕様上の装置。実装は内部構造から物理的に除去するなど別手段を取ってよい。
24.4.3.4 WeakSet.prototype.has ( value )
このメソッドは呼び出し時に次を行う:
S を this 値。? RequireInternalSlot (S , [[WeakSetData]] )。 CanBeHeldWeakly (value ) が false なら false 。各要素 e ∈ S .[[WeakSetData]] についてe が empty でなく SameValue (e , value ) が true なら true 。 false を返す。
24.4.3.5 WeakSet.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列 "WeakSet" である。
このプロパティは { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } の属性を持つ。
24.4.4 WeakSet インスタンスのプロパティ
WeakSet インスタンスは通常のオブジェクトであり、WeakSet プロトタイプオブジェクト からプロパティを継承する。WeakSet インスタンスは [[WeakSetData]] 内部スロットも持つ。
24.5 キー付きコレクションに関する抽象操作
24.5.1 CanonicalizeKeyedCollectionKey ( key )
The abstract operation CanonicalizeKeyedCollectionKey takes argument key (an ECMAScript language value) and returns an ECMAScript language value. It performs the following steps when called:
key が -0 𝔽 なら +0 𝔽 を返す。key を返す。
25 構造化データ
25.1 ArrayBuffer オブジェクト
25.1.1 記法
本節、および 25.4 、29 における以下の記述は、read-modify-write 変更関数 (modification function) の内部データ構造を用いる。
read-modify-write 変更関数 とは、2 つのバイト値 List を引数に取り、バイト値 の List を返す抽象クロージャとして表現される数学的関数である。これらの抽象クロージャは以下のすべての性質を満たす:
アルゴリズムの全ステップをアトミックに実行する。
個々のアルゴリズムステップは観測不可能である。
Note
read-modify-write 変更関数のアルゴリズムステップが純粋な数学的関数を成していることの検証を助けるため、次の編集上の慣例を推奨する:
25.1.2 固定長およびリサイズ可能 ArrayBuffer オブジェクト
固定長 ArrayBuffer とは、生成後にバイト長が変化しない ArrayBuffer である。
リサイズ可能 ArrayBuffer とは、ArrayBuffer.prototype.resize ( newLength ) の呼び出しによって生成後にバイト長を変更し得る ArrayBuffer である。
生成される ArrayBuffer オブジェクトの種類は、ArrayBuffer ( length [ , options ] ) に渡された引数に依存する。
25.1.3 ArrayBuffer オブジェクトに関する抽象操作
25.1.3.1 AllocateArrayBuffer ( constructor , byteLength [ , maxByteLength ] )
The abstract operation AllocateArrayBuffer takes arguments constructor (a constructor) and byteLength (a non-negative integer) and optional argument maxByteLength (a non-negative integer or empty ) and returns either a normal completion containing an ArrayBuffer or a throw completion . ArrayBuffer を生成するために使用される。 It performs the following steps when called:
slots を « [[ArrayBufferData]] , [[ArrayBufferByteLength]] , [[ArrayBufferDetachKey]] » とする。maxByteLength が存在し empty でないなら allocatingResizableBuffer を true 、そうでなければ false とする。allocatingResizableBuffer が true ならbyteLength > maxByteLength なら RangeError 例外を投げる。[[ArrayBufferMaxByteLength]] を slots に追加する。 obj を ? OrdinaryCreateFromConstructor (constructor , "%ArrayBuffer.prototype%" , slots ) とする。block を ? CreateByteDataBlock (byteLength ) とする。obj .[[ArrayBufferData]] に block を設定する。obj .[[ArrayBufferByteLength]] に byteLength を設定する。allocatingResizableBuffer が true ならmaxByteLength バイトから成る Data Block block を生成できない場合 RangeError 例外を投げる。注: リサイズ可能 ArrayBuffer はインプレース成長で実装可能となるよう設計されている。実装は例えば仮想メモリを事前確保できない場合に投げてもよい。 obj .[[ArrayBufferMaxByteLength]] に maxByteLength を設定する。obj を返す。
25.1.3.2 ArrayBufferByteLength ( arrayBuffer , order )
The abstract operation ArrayBufferByteLength takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer) and order (seq-cst or unordered ) and returns a non-negative integer. It performs the following steps when called:
IsSharedArrayBuffer (arrayBuffer ) が true かつ arrayBuffer が [[ArrayBufferByteLengthData]] 内部スロットを持つならbufferByteLengthBlock を arrayBuffer .[[ArrayBufferByteLengthData]] とする。rawLength を GetRawBytesFromSharedBlock (bufferByteLengthBlock , 0, biguint64 , true , order ) とする。isLittleEndian を周囲のエージェントの Agent Record の [[LittleEndian]] フィールドの値とする。ℝ (RawBytesToNumeric (biguint64 , rawLength , isLittleEndian )) を返す。アサート: IsDetachedBuffer (arrayBuffer ) は false 。 arrayBuffer .[[ArrayBufferByteLength]] を返す。
25.1.3.3 ArrayBufferCopyAndDetach ( arrayBuffer , newLength , preserveResizability )
The abstract operation ArrayBufferCopyAndDetach takes arguments arrayBuffer (an ECMAScript language value), newLength (an ECMAScript language value), and preserveResizability (preserve-resizability or fixed-length ) and returns either a normal completion containing an ArrayBuffer or a throw completion . It performs the following steps when called:
? RequireInternalSlot (arrayBuffer , [[ArrayBufferData]] ) を実行。 IsSharedArrayBuffer (arrayBuffer ) が true なら TypeError 例外。newLength が undefined ならnewByteLength を arrayBuffer .[[ArrayBufferByteLength]] とする。そうでなければnewByteLength を ? ToIndex (newLength ) とする。 IsDetachedBuffer (arrayBuffer ) が true なら TypeError 例外。preserveResizability が preserve-resizability かつ IsFixedLengthArrayBuffer (arrayBuffer ) が false ならnewMaxByteLength を arrayBuffer .[[ArrayBufferMaxByteLength]] とする。そうでなければnewMaxByteLength を empty とする。 arrayBuffer .[[ArrayBufferDetachKey]] が undefined でなければ TypeError 例外。newBuffer を ? AllocateArrayBuffer (%ArrayBuffer% , newByteLength , newMaxByteLength ) とする。copyLength を min (newByteLength , arrayBuffer .[[ArrayBufferByteLength]] ) とする。fromBlock を arrayBuffer .[[ArrayBufferData]] とする。toBlock を newBuffer .[[ArrayBufferData]] とする。CopyDataBlockBytes (toBlock , 0, fromBlock , 0, copyLength ) を実行。注: 新しい Data Block の生成および旧 Data Block からのコピーは観測不可能。実装はゼロコピー移動や realloc
として実装してよい。 ! DetachArrayBuffer (arrayBuffer ) を実行。 newBuffer を返す。
25.1.3.4 IsDetachedBuffer ( arrayBuffer )
The abstract operation IsDetachedBuffer takes argument arrayBuffer (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. It performs the following steps when called:
arrayBuffer .[[ArrayBufferData]] が null なら true を返す。false を返す。
25.1.3.5 DetachArrayBuffer ( arrayBuffer [ , key ] )
The abstract operation DetachArrayBuffer takes argument arrayBuffer (an ArrayBuffer) and optional argument key (anything) and returns either a normal completion containing unused or a throw completion . It performs the following steps when called:
アサート: IsSharedArrayBuffer (arrayBuffer ) は false 。 key が存在しなければ key を undefined に設定。arrayBuffer .[[ArrayBufferDetachKey]] が key でなければ TypeError 例外。arrayBuffer .[[ArrayBufferData]] を null に設定。arrayBuffer .[[ArrayBufferByteLength]] を 0 に設定。unused を返す。
Note
ArrayBuffer インスタンスをデタッチすることは、裏付けとして使用される Data Block をそのインスタンスから切り離し、バイト長を 0 に設定する。
25.1.3.6 CloneArrayBuffer ( srcBuffer , srcByteOffset , srcLength )
The abstract operation CloneArrayBuffer takes arguments srcBuffer (an ArrayBuffer or a SharedArrayBuffer), srcByteOffset (a non-negative integer), and srcLength (a non-negative integer) and returns either a normal completion containing an ArrayBuffer or a throw completion . srcByteOffset で開始し srcLength バイト継続する範囲の srcBuffer のデータをコピーした新しい ArrayBuffer を作成する。 It performs the following steps when called:
アサート: IsDetachedBuffer (srcBuffer ) は false 。 targetBuffer を ? AllocateArrayBuffer (%ArrayBuffer% , srcLength ) とする。srcBlock を srcBuffer .[[ArrayBufferData]] とする。targetBlock を targetBuffer .[[ArrayBufferData]] とする。CopyDataBlockBytes (targetBlock , 0, srcBlock , srcByteOffset , srcLength ) を実行。targetBuffer を返す。
25.1.3.7 GetArrayBufferMaxByteLengthOption ( options )
The abstract operation GetArrayBufferMaxByteLengthOption takes argument options (an ECMAScript language value) and returns either a normal completion containing either a non-negative integer or empty , or a throw completion . It performs the following steps when called:
options がオブジェクトでなければ empty を返す。maxByteLength を ? Get (options , "maxByteLength" ) とする。maxByteLength が undefined なら empty を返す。? ToIndex (maxByteLength ) を返す。
25.1.3.8 HostResizeArrayBuffer ( buffer , newByteLength )
The host-defined abstract operation HostResizeArrayBuffer takes arguments buffer (an ArrayBuffer) and newByteLength (a non-negative integer) and returns either a normal completion containing either handled or unhandled , or a throw completion . ホスト が buffer の実装定義 のリサイズを行う機会を提供する。ホスト がリサイズを扱わない場合、既定動作のため unhandled を返してよい。
HostResizeArrayBuffer の実装は以下に従わなければならない:
抽象操作 は buffer をデタッチしない。
抽象操作 が handled で正常完了した場合、buffer .[[ArrayBufferByteLength]] は newByteLength である。
HostResizeArrayBuffer の既定実装は NormalCompletion (unhandled ) を返すことである。
25.1.3.9 IsFixedLengthArrayBuffer ( arrayBuffer )
The abstract operation IsFixedLengthArrayBuffer takes argument arrayBuffer (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. It performs the following steps when called:
arrayBuffer が [[ArrayBufferMaxByteLength]] 内部スロットを持つなら false を返す。true を返す。
25.1.3.10 IsUnsignedElementType ( type )
The abstract operation IsUnsignedElementType takes argument type (a TypedArray element type) and returns a Boolean. 引数 type が符号なし TypedArray 要素型 か検証する。 It performs the following steps when called:
type が uint8 , uint8clamped , uint16 , uint32 , biguint64 のいずれかなら true を返す。false を返す。
25.1.3.11 IsUnclampedIntegerElementType ( type )
The abstract operation IsUnclampedIntegerElementType takes argument type (a TypedArray element type) and returns a Boolean. 引数 type が uint8clamped を除く整数 TypedArray 要素型 か検証する。 It performs the following steps when called:
type が int8 , uint8 , int16 , uint16 , int32 , uint32 のいずれかなら true 。false を返す。
25.1.3.12 IsBigIntElementType ( type )
The abstract operation IsBigIntElementType takes argument type (a TypedArray element type) and returns a Boolean. 引数 type が BigInt TypedArray 要素型 か検証する。 It performs the following steps when called:
type が biguint64 または bigint64 のいずれかなら true 。false を返す。
25.1.3.13 IsNoTearConfiguration ( type , order )
The abstract operation IsNoTearConfiguration takes arguments type (a TypedArray element type) and order (seq-cst , unordered , or init ) and returns a Boolean. It performs the following steps when called:
IsUnclampedIntegerElementType (type ) が true なら true を返す。IsBigIntElementType (type ) が true かつ order が init でも unordered でもないなら true を返す。false を返す。
25.1.3.14 RawBytesToNumeric ( type , rawBytes , isLittleEndian )
The abstract operation RawBytesToNumeric takes arguments type (a TypedArray element type), rawBytes (a List of byte values ), and isLittleEndian (a Boolean) and returns a Number or a BigInt. It performs the following steps when called:
elementSize を要素型 type について Table 73 に指定された要素サイズ値とする。isLittleEndian が false なら rawBytes の要素順を反転する。type が float16 ならvalue を rawBytes のバイト要素を連結し IEEE 754-2019 binary16 値のリトルエンディアンビット列エンコーディングとして解釈したものとする。value が NaN なら NaN を返す。value に対応する Number 値を返す。type が float32 ならvalue を rawBytes のバイト要素を連結し IEEE 754-2019 binary32 値のリトルエンディアンビット列エンコーディングとして解釈したものとする。value が NaN なら NaN 。対応する Number 値を返す。 type が float64 ならvalue を rawBytes のバイト要素を連結し IEEE 754-2019 binary64 値のリトルエンディアンビット列エンコーディングとして解釈したものとする。value が NaN なら NaN 。対応する Number 値を返す。 IsUnsignedElementType (type ) が true ならintValue を rawBytes のバイト要素を連結し符号なしリトルエンディアン 2 進数のビット列エンコーディングとして解釈したものとする。そうでなければintValue を rawBytes のバイト要素を連結しビット長 elementSize × 8 のリトルエンディアン 2 の補数表現として解釈したものとする。 IsBigIntElementType (type ) が true なら intValue に対応する BigInt 値を返す。そうでなければ intValue に対応する Number 値を返す。
25.1.3.15 GetRawBytesFromSharedBlock ( block , byteIndex , type , isTypedArray , order )
The abstract operation GetRawBytesFromSharedBlock takes arguments block (a Shared Data Block ), byteIndex (a non-negative integer), type (a TypedArray element type), isTypedArray (a Boolean), and order (seq-cst or unordered ) and returns a List of byte values . It performs the following steps when called:
elementSize を要素型 type について Table 73 に指定された要素サイズ値とする。execution を周囲のエージェントの Agent Record の [[CandidateExecution]] フィールドとする。eventsRecord を execution .[[EventsRecords]] のうち [[AgentSignifier]] が AgentSignifier () である Agent Events Record とする。isTypedArray が true かつ IsNoTearConfiguration (type , order ) が true なら noTear = true 、そうでなければ false 。rawValue を長さ elementSize の List で、その要素が非決定的に選ばれたバイト値 とする。注: 実装では rawValue は基盤ハードウェア上の非アトミックまたはアトミック read 命令の結果。非決定性は弱い一貫性ハードウェアの観測可能動作を記述するメモリモデル上の意味的規定。 readEvent を ReadSharedMemory { [[Order]] : order , [[NoTear]] : noTear , [[Block]] : block , [[ByteIndex]] : byteIndex , [[ElementSize]] : elementSize } とする。readEvent を eventsRecord .[[EventList]] に追加。Chosen Value Record { [[Event]] : readEvent , [[ChosenValue]] : rawValue } を execution .[[ChosenValues]] に追加。rawValue を返す。
25.1.3.16 GetValueFromBuffer ( arrayBuffer , byteIndex , type , isTypedArray , order [ , isLittleEndian ] )
The abstract operation GetValueFromBuffer takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative integer), type (a TypedArray element type), isTypedArray (a Boolean), and order (seq-cst or unordered ) and optional argument isLittleEndian (a Boolean) and returns a Number or a BigInt. It performs the following steps when called:
アサート: IsDetachedBuffer (arrayBuffer ) は false 。 アサート: arrayBuffer の byteIndex から type の値を表現するのに十分なバイトが存在する。 block を arrayBuffer .[[ArrayBufferData]] とする。elementSize を要素型 type について Table 73 に指定された要素サイズ値とする。IsSharedArrayBuffer (arrayBuffer ) が true ならアサート: block は Shared Data Block 。 rawValue を GetRawBytesFromSharedBlock (block , byteIndex , type , isTypedArray , order ) とする。そうでなければrawValue を、byteIndex (含む) から byteIndex + elementSize (含まない) のインデックスにある block のバイトからなる List とする。 アサート: rawValue の要素数は elementSize 。 isLittleEndian が存在しなければ、周囲のエージェントの Agent Record の [[LittleEndian]] フィールドの値を設定。RawBytesToNumeric (type , rawValue , isLittleEndian ) を返す。
25.1.3.17 NumericToRawBytes ( type , value , isLittleEndian )
The abstract operation NumericToRawBytes takes arguments type (a TypedArray element type), value (a Number or a BigInt), and isLittleEndian (a Boolean) and returns a List of byte values . It performs the following steps when called:
type が float16 ならrawBytes を、value を roundTiesToEven モードで IEEE 754-2019 binary16 形式に変換した結果の 2 バイトを要素とする List とする。バイトはリトルエンディアン順。value が NaN の場合、rawBytes は実装が選ぶ任意の IEEE 754-2019 binary16 NaN エンコーディングとなり得る。実装は区別可能な各 NaN 値に常に同じエンコーディングを選択しなければならない。Else if type が float32 なら同様に 4 バイト (binary32)。 Else if type が float64 なら同様に 8 バイト (binary64)。 Elsen を要素型 type について Table 73 に指定された要素サイズ値とする。conversionOperation を Table 73 の変換操作列に type について示された抽象操作 とする。intValue を ℝ (! conversionOperation (value )) とする。intValue ≥ 0 ならrawBytes を intValue の n バイト 2 進エンコーディング (リトルエンディアン) を要素とする List とする。そうでなければrawBytes を intValue の n バイト 2 の補数エンコーディング (リトルエンディアン) を要素とする List とする。 isLittleEndian が false なら rawBytes の順序を反転。rawBytes を返す。
25.1.3.18 SetValueInBuffer ( arrayBuffer , byteIndex , type , value , isTypedArray , order [ , isLittleEndian ] )
The abstract operation SetValueInBuffer takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative integer), type (a TypedArray element type), value (a Number or a BigInt), isTypedArray (a Boolean), and order (seq-cst , unordered , or init ) and optional argument isLittleEndian (a Boolean) and returns unused . It performs the following steps when called:
アサート: IsDetachedBuffer (arrayBuffer ) は false 。 アサート: byteIndex から始まり type の値を表す十分なバイトが存在する。 アサート: IsBigIntElementType (type ) が true なら value は BigInt、そうでなければ Number。 block を arrayBuffer .[[ArrayBufferData]] とする。elementSize を要素型 type について Table 73 に指定された要素サイズ値。isLittleEndian が存在しなければ周囲のエージェントの Agent Record の [[LittleEndian]] フィールド値を設定。rawBytes を NumericToRawBytes (type , value , isLittleEndian ) とする。IsSharedArrayBuffer (arrayBuffer ) が true ならexecution を周囲のエージェントの Agent Record の [[CandidateExecution]] フィールド。eventsRecord を execution .[[EventsRecords]] 内で [[AgentSignifier]] が AgentSignifier () の Agent Events Record 。isTypedArray が true かつ IsNoTearConfiguration (type , order ) が true なら noTear = true 、そうでなければ false 。WriteSharedMemory { [[Order]] : order , [[NoTear]] : noTear , [[Block]] : block , [[ByteIndex]] : byteIndex , [[ElementSize]] : elementSize , [[Payload]] : rawBytes } を eventsRecord .[[EventList]] に追加。そうでなければrawBytes の各バイトを block [byteIndex ] から順に格納。 unused を返す。
25.1.3.19 GetModifySetValueInBuffer ( arrayBuffer , byteIndex , type , value , op )
The abstract operation GetModifySetValueInBuffer takes arguments arrayBuffer (an ArrayBuffer or a SharedArrayBuffer), byteIndex (a non-negative integer), type (a TypedArray element type), value (a Number or a BigInt), and op (a read-modify-write modification function) and returns a Number or a BigInt. It performs the following steps when called:
アサート: IsDetachedBuffer (arrayBuffer ) は false 。 アサート: byteIndex から type の値を表す十分なバイトが存在する。 アサート: IsBigIntElementType (type ) が true なら value は BigInt、そうでなければ Number。 block を arrayBuffer .[[ArrayBufferData]] とする。elementSize を要素型 type について Table 73 に指定された要素サイズ値。isLittleEndian を周囲のエージェントの Agent Record の [[LittleEndian]] フィールド値とする。rawBytes を NumericToRawBytes (type , value , isLittleEndian ) とする。IsSharedArrayBuffer (arrayBuffer ) が true ならexecution を周囲のエージェントの Agent Record の [[CandidateExecution]] 。eventsRecord を execution .[[EventsRecords]] 内で [[AgentSignifier]] が AgentSignifier () の Agent Events Record 。rawBytesRead を長さ elementSize の List (非決定的に選ばれたバイト値 )。注: rawBytesRead は基盤ハードウェア上の read-modify-write 命令、load-link、load-exclusive などのオペランド結果。非決定性は弱い一貫性ハードウェアの観測可能動作を記述。 rmwEvent を ReadModifyWriteSharedMemory { [[Order]] : seq-cst , [[NoTear]] : true , [[Block]] : block , [[ByteIndex]] : byteIndex , [[ElementSize]] : elementSize , [[Payload]] : rawBytes , [[ModifyOp]] : op } とする。rmwEvent を eventsRecord .[[EventList]] に追加。Chosen Value Record { [[Event]] : rmwEvent , [[ChosenValue]] : rawBytesRead } を execution .[[ChosenValues]] に追加。そうでなければrawBytesRead を長さ elementSize の List で、block [byteIndex ] からの elementSize バイト列。rawBytesModified を op (rawBytesRead , rawBytes ) とする。rawBytesModified の各バイトを block [byteIndex ] から格納。 RawBytesToNumeric (type , rawBytesRead , isLittleEndian ) を返す。
25.1.4 ArrayBuffer コンストラクター
ArrayBuffer コンストラクタ ー:
%ArrayBuffer% である。
グローバルオブジェクト の "ArrayBuffer" プロパティの初期値である。
コンストラクタ ーとして呼び出された際、新しい ArrayBuffer を生成し初期化する。
関数として呼び出すことは意図されておらず、その形で呼び出されると例外を投げる。
クラス定義の extends
句の値として使用できる。指定された ArrayBuffer の挙動を継承するサブクラスコンストラクタ ーは、ArrayBuffer.prototype
組込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、ArrayBuffer コンストラクタ ーへの super
呼び出しを含める必要がある。
25.1.4.1 ArrayBuffer ( length [ , options ] )
この関数は呼び出し時に次を行う:
NewTarget が undefined なら TypeError 例外。 byteLength を ? ToIndex (length ) とする。requestedMaxByteLength を ? GetArrayBufferMaxByteLengthOption (options ) とする。? AllocateArrayBuffer (NewTarget, byteLength , requestedMaxByteLength ) を返す。
25.1.5 ArrayBuffer コンストラクターのプロパティ
ArrayBuffer コンストラクタ ー:
25.1.5.1 ArrayBuffer.isView ( arg )
この関数は呼び出し時に次を行う:
arg がオブジェクトでなければ false を返す。arg が [[ViewedArrayBuffer]] 内部スロットを持てば true を返す。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 アクセサは呼び出し時に次を行う:
this 値を返す。
この関数の "name" プロパティ値は "get [Symbol.species]" である。
Note
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 アクセサは呼び出し時に次を行う:
O を this 値とする。? RequireInternalSlot (O , [[ArrayBufferData]] ) を実行。 IsSharedArrayBuffer (O ) が true なら TypeError 例外。IsDetachedBuffer (O ) が true なら +0 𝔽 を返す。length を O .[[ArrayBufferByteLength]] とする。𝔽 (length ) を返す。
25.1.6.2 ArrayBuffer.prototype.constructor
ArrayBuffer.prototype.constructor
の初期値は %ArrayBuffer% である。
25.1.6.3 get ArrayBuffer.prototype.detached
ArrayBuffer.prototype.detached
は set アクセサが undefined のアクセサプロパティ であり、その get アクセサは呼び出し時に次を行う:
O を this 値。? RequireInternalSlot (O , [[ArrayBufferData]] )。 IsSharedArrayBuffer (O ) が true なら TypeError 例外。IsDetachedBuffer (O ) を返す。
25.1.6.4 get ArrayBuffer.prototype.maxByteLength
ArrayBuffer.prototype.maxByteLength
は set アクセサが undefined のアクセサプロパティ であり、その get アクセサは呼び出し時に次を行う:
O を this 値。? RequireInternalSlot (O , [[ArrayBufferData]] )。 IsSharedArrayBuffer (O ) が true なら TypeError 例外。IsDetachedBuffer (O ) が true なら +0 𝔽 を返す。IsFixedLengthArrayBuffer (O ) が true ならlength を O .[[ArrayBufferByteLength]] とする。そうでなければlength を O .[[ArrayBufferMaxByteLength]] とする。 𝔽 (length ) を返す。
25.1.6.5 get ArrayBuffer.prototype.resizable
ArrayBuffer.prototype.resizable
は set アクセサが undefined のアクセサプロパティ であり、その get アクセサは呼び出し時に次を行う:
O を this 値。? RequireInternalSlot (O , [[ArrayBufferData]] )。 IsSharedArrayBuffer (O ) が true なら TypeError 例外。IsFixedLengthArrayBuffer (O ) が false なら true を返し、そうでなければ false を返す。
25.1.6.6 ArrayBuffer.prototype.resize ( newLength )
このメソッドは呼び出し時に次を行う:
O を this 値。? RequireInternalSlot (O , [[ArrayBufferMaxByteLength]] )。 IsSharedArrayBuffer (O ) が true なら TypeError 例外。newByteLength を ? ToIndex (newLength ) とする。IsDetachedBuffer (O ) が true なら TypeError 例外。newByteLength > O .[[ArrayBufferMaxByteLength]] なら RangeError 例外。hostHandled を ? HostResizeArrayBuffer (O , newByteLength ) とする。hostHandled が handled なら undefined を返す。oldBlock を O .[[ArrayBufferData]] とする。newBlock を ? CreateByteDataBlock (newByteLength ) とする。copyLength を min (newByteLength , O .[[ArrayBufferByteLength]] ) とする。CopyDataBlockBytes (newBlock , 0, oldBlock , 0, copyLength ) を実行。注: 新旧 Data Block の生成・コピーは観測不可能。実装はインプレース成長・縮小として実装してもよい。 O .[[ArrayBufferData]] を newBlock に設定。O .[[ArrayBufferByteLength]] を newByteLength に設定。undefined を返す。
25.1.6.7 ArrayBuffer.prototype.slice ( start , end )
このメソッドは呼び出し時に次を行う:
O を this 値。? RequireInternalSlot (O , [[ArrayBufferData]] )。 IsSharedArrayBuffer (O ) が true なら TypeError 例外。IsDetachedBuffer (O ) が true なら TypeError 例外。len を O .[[ArrayBufferByteLength]] とする。relativeStart を ? ToIntegerOrInfinity (start ) とする。relativeStart = -∞ なら first = 0。Else if relativeStart < 0 なら first = max (len + relativeStart , 0)。 Else first = min (relativeStart , len )。 end が undefined なら relativeEnd = len 、そうでなければ ? ToIntegerOrInfinity (end )。relativeEnd = -∞ なら final = 0。Else if relativeEnd < 0 なら final = max (len + relativeEnd , 0)。 Else final = min (relativeEnd , len )。 newLen を max (final - first , 0) とする。ctor を ? SpeciesConstructor (O , %ArrayBuffer% ) とする。new を ? Construct(ctor , « 𝔽 (newLen ) ») とする。? RequireInternalSlot (new , [[ArrayBufferData]] )。 IsSharedArrayBuffer (new ) が true なら TypeError 。IsDetachedBuffer (new ) が true なら TypeError 。SameValue (new , O ) が true なら TypeError 。new .[[ArrayBufferByteLength]] < newLen なら TypeError 。注: 以上の副作用で O がデタッチまたはリサイズされた可能性。 IsDetachedBuffer (O ) が true なら TypeError 。fromBuf を O .[[ArrayBufferData]] 。toBuf を new .[[ArrayBufferData]] 。currentLen を O .[[ArrayBufferByteLength]] 。first < currentLen ならcount を min (newLen , currentLen - first )。CopyDataBlockBytes (toBuf , 0, fromBuf , first , count ) を実行。new を返す。
25.1.6.8 ArrayBuffer.prototype.transfer ( [ newLength ] )
このメソッドは呼び出し時に次を行う:
O を this 値。? ArrayBufferCopyAndDetach (O , newLength , preserve-resizability ) を返す。
25.1.6.9 ArrayBuffer.prototype.transferToFixedLength ( [ newLength ] )
このメソッドは呼び出し時に次を行う:
O を this 値。? ArrayBufferCopyAndDetach (O , newLength , fixed-length ) を返す。
25.1.6.10 ArrayBuffer.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列 "ArrayBuffer" である。
このプロパティは { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } の属性を持つ。
25.1.7 ArrayBuffer インスタンスのプロパティ
ArrayBuffer インスタンスは ArrayBuffer プロトタイプオブジェクト からプロパティを継承する。各 ArrayBuffer インスタンスは [[ArrayBufferData]] 内部スロット、[[ArrayBufferByteLength]] 内部スロット、[[ArrayBufferDetachKey]] 内部スロットを持つ。リサイズ可能な ArrayBuffer インスタンスはさらに [[ArrayBufferMaxByteLength]] 内部スロットを持つ。
[[ArrayBufferData]] が null の ArrayBuffer インスタンスはデタッチされていると見なされ、当該インスタンスに含まれるデータへアクセスまたは変更を試みる演算子はすべて失敗する。
[[ArrayBufferDetachKey]] が undefined 以外に設定されている ArrayBuffer インスタンスでは、その同じ「デタッチキー」を引数として渡す DetachArrayBuffer 呼び出しのみが必要であり、そうでなければ TypeError になる。この内部スロットは特定の埋め込み環境によってのみ設定され、本仕様のアルゴリズムでは設定されない。
25.1.8 リサイズ可能 ArrayBuffer ガイドライン
Note 1
以下はリサイズ可能 ArrayBuffer を扱う ECMAScript プログラマー向けガイドラインである。
可能であれば展開環境でプログラムをテストすることを推奨する。利用可能な物理メモリ量はハードウェアデバイス間で大きく異なる。同様に仮想メモリサブシステムもデバイスや OS により大きく異なる。64 ビットデスクトップ Web ブラウザでメモリ不足を起こさないアプリケーションが 32 ビットモバイル Web ブラウザではメモリ不足になる可能性がある。
リサイズ可能 ArrayBuffer の "maxByteLength" オプション値を選ぶ際、アプリケーションにとって可能な限り小さいサイズを選ぶことを推奨する。"maxByteLength" は 1,073,741,824 (230 バイト, 1GiB) を超えないことを推奨する。
特定の最大サイズでリサイズ可能 ArrayBuffer を生成できても、将来のリサイズが成功する保証はない点に留意されたい。
Note 2
以下はリサイズ可能 ArrayBuffer を実装する ECMAScript 実装者向けガイドラインである。
リサイズ可能 ArrayBuffer は、リサイズ時コピー、仮想メモリを事前確保したインプレース成長、またはコンストラクタ ーの "maxByteLength" オプション値に応じた両者の組み合わせとして実装できる。
ホスト が (多数の ECMAScript アプリケーションを同時に実行する) マルチテナントであり、インプレース成長を仮想メモリ予約で実装する場合、32 ビット/64 ビット実装ともに "maxByteLength" ≥ 1GiB〜1.5GiB の値に対して例外を投げることを推奨する。これは単一アプリケーションによる仮想アドレス空間の枯渇可能性と相互運用性リスクを低減するためである。
ホスト に仮想メモリが無い (MMU 無し組込みデバイスなど) 場合、またはコピーによるリサイズのみを実装する場合、"maxByteLength" オプションに任意の Number value for を受け入れてもよい。ただし要求サイズのメモリブロックを決して割り当てられない場合は RangeError を投げることを推奨する。例えば要求サイズがデバイスで利用可能な最大メモリ量を超える場合など。
25.2 SharedArrayBuffer オブジェクト
25.2.1 固定長および成長可能 (growable) SharedArrayBuffer オブジェクト
固定長 SharedArrayBuffer とは、生成後にそのバイト長が変更できない SharedArrayBuffer である。
成長可能 SharedArrayBuffer とは、SharedArrayBuffer.prototype.grow ( newLength ) の呼び出しによって生成後にバイト長を増やすことができる SharedArrayBuffer である。
生成される SharedArrayBuffer オブジェクトの種別は、SharedArrayBuffer ( length [ , options ] ) に渡された引数に依存する。
25.2.2 SharedArrayBuffer オブジェクト用抽象操作
25.2.2.1 AllocateSharedArrayBuffer ( constructor , byteLength [ , maxByteLength ] )
The abstract operation AllocateSharedArrayBuffer takes arguments constructor (a constructor) and byteLength (a non-negative integer) and optional argument maxByteLength (a non-negative integer or empty ) and returns either a normal completion containing a SharedArrayBuffer or a throw completion . SharedArrayBuffer を生成するために用いられる。 It performs the following steps when called:
slots を « [[ArrayBufferData]] » とする。maxByteLength が存在しかつ empty でないなら allocatingGrowableBuffer = true 、そうでなければ false とする。allocatingGrowableBuffer が true ならbyteLength > maxByteLength なら RangeError 例外を投げる。[[ArrayBufferByteLengthData]] と [[ArrayBufferMaxByteLength]] を slots に追加する。 そうでなければ[[ArrayBufferByteLength]] を slots に追加する。 obj を ? OrdinaryCreateFromConstructor (constructor , "%SharedArrayBuffer.prototype%" , slots ) とする。allocatingGrowableBuffer が true なら allocLength = maxByteLength 、そうでなければ allocLength = byteLength 。block を ? CreateSharedByteDataBlock (allocLength ) とする。obj .[[ArrayBufferData]] に block を設定する。allocatingGrowableBuffer が true ならアサート: byteLength ≤ maxByteLength 。 byteLengthBlock を ? CreateSharedByteDataBlock (8) とする。SetValueInBuffer (byteLengthBlock , 0, biguint64 , ℤ (byteLength ), true , seq-cst ) を実行。obj .[[ArrayBufferByteLengthData]] に byteLengthBlock を設定。obj .[[ArrayBufferMaxByteLength]] に maxByteLength を設定。そうでなければobj .[[ArrayBufferByteLength]] に byteLength を設定。 obj を返す。
25.2.2.2 IsSharedArrayBuffer ( obj )
The abstract operation IsSharedArrayBuffer takes argument obj (an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. オブジェクトが ArrayBuffer / SharedArrayBuffer あるいはそのサブタイプかどうかを判定する。 It performs the following steps when called:
bufferData を obj .[[ArrayBufferData]] とする。bufferData が null なら false を返す。bufferData が Data Block なら false を返す。アサート: bufferData は Shared Data Block である。 true を返す。
25.2.2.3 HostGrowSharedArrayBuffer ( buffer , newByteLength )
The host-defined abstract operation HostGrowSharedArrayBuffer takes arguments buffer (a SharedArrayBuffer) and newByteLength (a non-negative integer) and returns either a normal completion containing either handled or unhandled , or a throw completion . ホスト に buffer の実装定義 の成長処理を行う機会を与える。ホスト が処理しない場合は既定動作として unhandled を返してよい。
HostGrowSharedArrayBuffer の実装は以下の要件に従わなければならない:
抽象操作 が unhandled で正常完了しない(= それ以外で正常完了する)場合で、newByteLength が buffer の現在のバイト長より小さい、または newByteLength > buffer .[[ArrayBufferMaxByteLength]] のいずれかなら RangeError 例外を投げる。
isLittleEndian を周囲のエージェントの Agent Record の [[LittleEndian]] フィールド値とする。抽象操作 が handled で正常完了した場合、[[Order]] が seq-cst 、[[Payload]] が NumericToRawBytes (biguint64 , newByteLength , isLittleEndian )、[[Block]] が buffer .[[ArrayBufferByteLengthData]] 、[[ByteIndex]] が 0、[[ElementSize]] が 8 の WriteSharedMemory または ReadModifyWriteSharedMemory イベントを周囲のエージェントの候補実行 (candidate execution ) に追加し、SharedArrayBuffer.prototype.grow
への競合する呼び出しが「失われない」(沈黙して何もしないことがない)ようにする。
Note
上記 2 つ目の要件は、buffer の現在バイト長をどのよう/いつ読み取るかについて意図的に曖昧にしている。基盤ハードウェア上でバイト長をアトミック read-modify-write で更新する必要があるため、load-link/store-conditional や load-exclusive/store-exclusive 命令対を用いるアーキテクチャでは命令ペアを命令ストリーム内で近接させたい場合がある。そのため SharedArrayBuffer.prototype.grow 自体は HostGrowSharedArrayBuffer を呼ぶ前に newByteLength の境界チェックを行わず、また現在のバイト長をいつ読むかを規定しない。
これは HostResizeArrayBuffer と対照的であり、後者では newByteLength が 0 以上かつ buffer .[[ArrayBufferMaxByteLength]] 以下であることが保証される。
HostGrowSharedArrayBuffer の既定実装は NormalCompletion (unhandled ) を返す。
25.2.3 SharedArrayBuffer コンストラクター
SharedArrayBuffer コンストラクタ ー:
%SharedArrayBuffer% である。
(ホスト がそれを提供する場合)グローバルオブジェクト の "SharedArrayBuffer" プロパティの初期値である。
コンストラクタ ーとして呼ばれたとき新しい SharedArrayBuffer を生成し初期化する。
関数として呼び出すことは意図されておらず、その形で呼び出されると例外を投げる。
クラス定義の extends
句の値として使用できる。指定された SharedArrayBuffer の挙動を継承するサブクラスコンストラクタ ーは SharedArrayBuffer.prototype
の組込みメソッドを支える内部状態でサブクラスインスタンスを生成・初期化するため super
呼び出しを含めねばならない。
ホスト が SharedArrayBuffer への並行アクセスを提供しない場合、グローバルオブジェクト の "SharedArrayBuffer" プロパティを省略してよい。
Note
ArrayBuffer
と異なり、SharedArrayBuffer
はデタッチされず、その内部 [[ArrayBufferData]] スロットが null になることはない。
25.2.3.1 SharedArrayBuffer ( length [ , options ] )
この関数は呼び出し時に次を行う:
NewTarget が undefined なら TypeError 例外。 byteLength を ? ToIndex (length ) とする。requestedMaxByteLength を ? GetArrayBufferMaxByteLengthOption (options ) とする。? AllocateSharedArrayBuffer (NewTarget, byteLength , requestedMaxByteLength ) を返す。
25.2.4 SharedArrayBuffer コンストラクターのプロパティ
SharedArrayBuffer コンストラクタ ー:
25.2.4.1 SharedArrayBuffer.prototype
SharedArrayBuffer.prototype
の初期値は SharedArrayBuffer プロトタイプオブジェクト である。
このプロパティは { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
25.2.4.2 get SharedArrayBuffer [ %Symbol.species% ]
SharedArrayBuffer[%Symbol.species%]
は set アクセサが undefined のアクセサプロパティ であり、その get アクセサの挙動は次の通り:
this 値を返す。
この関数の "name" プロパティ値は "get [Symbol.species]" である。
25.2.5 SharedArrayBuffer プロトタイプオブジェクトのプロパティ
SharedArrayBuffer プロトタイプオブジェクト :
%SharedArrayBuffer.prototype% である。
[[Prototype]] 内部スロット値は %Object.prototype% である。
通常のオブジェクトである。
[[ArrayBufferData]] や [[ArrayBufferByteLength]] 内部スロットを持たない。
25.2.5.1 get SharedArrayBuffer.prototype.byteLength
SharedArrayBuffer.prototype.byteLength
は set アクセサが undefined のアクセサプロパティ であり、その get アクセサは呼び出し時に以下を行う:
O を this 値とする。? RequireInternalSlot (O , [[ArrayBufferData]] )。 IsSharedArrayBuffer (O ) が false なら TypeError 例外。length を ArrayBufferByteLength (O , seq-cst ) とする。𝔽 (length ) を返す。
25.2.5.2 SharedArrayBuffer.prototype.constructor
SharedArrayBuffer.prototype.constructor
の初期値は %SharedArrayBuffer% である。
25.2.5.3 SharedArrayBuffer.prototype.grow ( newLength )
このメソッドは呼び出し時に以下を行う:
O を this 値とする。? RequireInternalSlot (O , [[ArrayBufferMaxByteLength]] )。 IsSharedArrayBuffer (O ) が false なら TypeError 例外。newByteLength を ? ToIndex (newLength ) とする。hostHandled を ? HostGrowSharedArrayBuffer (O , newByteLength ) とする。hostHandled が handled なら undefined を返す。isLittleEndian を周囲のエージェントの Agent Record の [[LittleEndian]] フィールド値とする。byteLengthBlock を O .[[ArrayBufferByteLengthData]] とする。currentByteLengthRawBytes を GetRawBytesFromSharedBlock (byteLengthBlock , 0, biguint64 , true , seq-cst ) とする。newByteLengthRawBytes を NumericToRawBytes (biguint64 , ℤ (newByteLength ), isLittleEndian ) とする。繰り返し、注: 競合する grow を全順序化し、失われたり沈黙して無視されたりしないようにするための compare-and-exchange ループ。 currentByteLength を ℝ (RawBytesToNumeric (biguint64 , currentByteLengthRawBytes , isLittleEndian )) とする。newByteLength = currentByteLength なら undefined を返す。newByteLength < currentByteLength または newByteLength > O .[[ArrayBufferMaxByteLength]] なら RangeError 例外。byteLengthDelta を newByteLength - currentByteLength とする。byteLengthDelta バイトから成る新しい Shared Data Block 値を作成できないなら RangeError 例外。注: ここで新しい Shared Data Block を作って差し替えるわけではない。最大サイズの Shared Data Block を事前確保する仕様上のモデルであり、メモリ不足なら RangeError を投げることを要求するための手順。 readByteLengthRawBytes を AtomicCompareExchangeInSharedBlock (byteLengthBlock , 0, 8, currentByteLengthRawBytes , newByteLengthRawBytes ) とする。ByteListEqual (readByteLengthRawBytes , currentByteLengthRawBytes ) が true なら undefined を返す。currentByteLengthRawBytes を readByteLengthRawBytes に設定。
Note
長さ更新の compare-exchange の擬似的失敗は許されない。新しい長さの境界チェックが通り、実装がメモリ不足でない場合、候補実行には常に ReadModifyWriteSharedMemory イベント(成功した compare-exchange)が追加される。
SharedArrayBuffer.prototype.grow への並列呼び出しは全順序化される。例: sab.grow(10)
と sab.grow(20)
が競合する場合、必ずどちらかが勝つ。sab.grow(10)
が sab.grow(20)
の後でも sab
を縮めることはなく、その場合は RangeError を投げる。
25.2.5.4 get SharedArrayBuffer.prototype.growable
SharedArrayBuffer.prototype.growable
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは次を行う:
O を this 値。? RequireInternalSlot (O , [[ArrayBufferData]] )。 IsSharedArrayBuffer (O ) が false なら TypeError 例外。IsFixedLengthArrayBuffer (O ) が false なら true 、そうでなければ false を返す。
25.2.5.5 get SharedArrayBuffer.prototype.maxByteLength
SharedArrayBuffer.prototype.maxByteLength
は set アクセサが undefined のアクセサプロパティ であり、get アクセサは次を行う:
O を this 値。? RequireInternalSlot (O , [[ArrayBufferData]] )。 IsSharedArrayBuffer (O ) が false なら TypeError 例外。IsFixedLengthArrayBuffer (O ) が true ならlength を O .[[ArrayBufferByteLength]] とする。そうでなければlength を O .[[ArrayBufferMaxByteLength]] とする。 𝔽 (length ) を返す。
25.2.5.6 SharedArrayBuffer.prototype.slice ( start , end )
このメソッドは呼び出し時に以下を行う:
O を this 値。? RequireInternalSlot (O , [[ArrayBufferData]] )。 IsSharedArrayBuffer (O ) が false なら TypeError 例外。len を ArrayBufferByteLength (O , seq-cst ) とする。relativeStart を ? ToIntegerOrInfinity (start ) とする。relativeStart = -∞ なら first = 0。そうでなく relativeStart < 0 なら first = max (len + relativeStart , 0)。 それ以外は first = min (relativeStart , len )。 end が undefined なら relativeEnd = len ; そうでなければ ? ToIntegerOrInfinity (end )。relativeEnd = -∞ なら final = 0。そうでなく relativeEnd < 0 なら final = max (len + relativeEnd , 0)。 それ以外は final = min (relativeEnd , len )。 newLen = max (final - first , 0)。ctor = ? SpeciesConstructor (O , %SharedArrayBuffer% )。new = ? Construct(ctor , « 𝔽 (newLen ) »)。? RequireInternalSlot (new , [[ArrayBufferData]] )。 IsSharedArrayBuffer (new ) が false なら TypeError 。new .[[ArrayBufferData]] が O .[[ArrayBufferData]] と同一なら TypeError 。ArrayBufferByteLength (new , seq-cst ) < newLen なら TypeError 。fromBuf = O .[[ArrayBufferData]] 。toBuf = new .[[ArrayBufferData]] 。CopyDataBlockBytes (toBuf , 0, fromBuf , first , newLen ) を実行。new を返す。
25.2.5.7 SharedArrayBuffer.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列 "SharedArrayBuffer" である。
このプロパティは { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
25.2.6 SharedArrayBuffer インスタンスのプロパティ
SharedArrayBuffer インスタンスは SharedArrayBuffer プロトタイプオブジェクト からプロパティを継承する。各インスタンスは [[ArrayBufferData]] 内部スロットを持つ。成長不可のインスタンスは [[ArrayBufferByteLength]] 内部スロットを持つ。成長可能インスタンスは [[ArrayBufferByteLengthData]] および [[ArrayBufferMaxByteLength]] 内部スロットを持つ。
Note
ArrayBuffer と異なり、SharedArrayBuffer インスタンスは決してデタッチされない。
25.2.7 成長可能 SharedArrayBuffer ガイドライン
Note 1
以下は成長可能 SharedArrayBuffer を扱う ECMAScript プログラマー向けガイドラインである。
可能な限り実際のデプロイ環境でテストすることを推奨する。利用可能な物理メモリ量はハードウェア間で大きく異なる。同様に仮想メモリサブシステムもハードウェアや OS により大きく異なる。64 ビットデスクトップブラウザで正常なアプリが 32 ビットモバイルブラウザではメモリ不足になる可能性がある。
成長可能 SharedArrayBuffer の "maxByteLength" オプション値はアプリで必要な最小限の値を選ぶことを推奨し、1,073,741,824 (1GiB) を超えないことを推奨する。
特定の最大サイズで成長可能 SharedArrayBuffer を生成できても、将来の grow が成功する保証はない。
成長可能 SharedArrayBuffer の長さ読み出しの全てが同期的 (seq-cst ) 読みとは限らない。u8[idx]
のような整数インデックス 付きプロパティアクセスの境界チェックに用いる長さの読み出しは同期化されない。一般に明示的同期が無い場合、あるアクセスがインバウンドでも同じエージェント内の後続アクセスもインバウンドとは限らない。対照的に SharedArrayBuffer の length
/ byteLength
ゲッター、%TypedArray% .prototype、DataView.prototype を介した明示的読み出しは同期化される。TypedArray が完全に out-of-bounds かを確認するための組込みメソッドによる長さの読み出しも同期化される。
Note 2
以下は成長可能 SharedArrayBuffer を実装する実装者向けガイドラインである。
成長可能 SharedArrayBuffer は仮想メモリ事前予約によるインプレース成長で実装することを推奨する。
grow 操作は基盤メモリアクセスと並行し得るため、メモリモデル上の制約として非順序 (unordered) アクセスでも「ティア」(値の一部が混ざる) を起こしてはならない。実際には基盤データブロックをコピーで拡張する(世界停止を伴う)手法では実装しづらい。世界停止は直列化ポイントを導入し遅いため推奨しない。
追加されたメモリは作成直後(競合アクセスに対しても)ゼロ化されているように見えねばならない。ゼロ初期化オンデマンドの仮想メモリページ、または手動ゼロ化時の慎重な同期で実現できる。
成長可能 SharedArrayBuffer 上の TypedArray ビューの整数インデックス 付きプロパティアクセスは、基礎バッファ長へのアクセスが同期化されない(前述)ため、非成長 SharedArrayBuffer 上の場合と同様に最適化可能なことを意図している。例えば境界チェックをループ外へホイストできる。
仮想メモリを持たない(MMU の無い組込み等)ホスト でコピー方式による実装は困難である。そうしたホスト におけるメモリ使用は仮想メモリを持つホスト と大きく異なる可能性があるため、メモリ使用の期待値を明確に伝えるべきである。
25.3 DataView オブジェクト
25.3.1 DataView オブジェクト用抽象操作
25.3.1.1 DataView With Buffer Witness Record
DataView With Buffer Witness Record は、DataView と、その参照バッファのキャッシュされたバイト長をカプセル化するための Record 値である。これは、参照バッファが成長可能 SharedArrayBuffer である場合にバイト長データブロックに対する単一の共有メモリ読み出しイベントを保証する助けとして用いられる。
DataView With Buffer Witness Record は Table 75 に示すフィールドを持つ。
Table 75: DataView With Buffer Witness Record のフィールド
Field Name
Value
Meaning
[[Object]]
a DataView
バッファのバイト長が読み込まれる DataView オブジェクト。
[[CachedBufferByteLength]]
a non-negative integer or detached
Record 作成時点のオブジェクトの [[ViewedArrayBuffer]] のバイト長。
25.3.1.2 MakeDataViewWithBufferWitnessRecord ( obj , order )
The abstract operation MakeDataViewWithBufferWitnessRecord takes arguments obj (a DataView) and order (seq-cst or unordered ) and returns a DataView With Buffer Witness Record . It performs the following steps when called:
buffer を obj .[[ViewedArrayBuffer]] とする。IsDetachedBuffer (buffer ) が true ならbyteLength = detached 。そうでなければbyteLength = ArrayBufferByteLength (buffer , order )。 DataView With Buffer Witness Record { [[Object]] : obj , [[CachedBufferByteLength]] : byteLength } を返す。
25.3.1.3 GetViewByteLength ( viewRecord )
The abstract operation GetViewByteLength takes argument viewRecord (a DataView With Buffer Witness Record ) and returns a non-negative integer. It performs the following steps when called:
アサート: IsViewOutOfBounds (viewRecord ) は false 。 view を viewRecord .[[Object]] とする。view .[[ByteLength]] が auto でないなら view .[[ByteLength]] を返す。アサート: IsFixedLengthArrayBuffer (view .[[ViewedArrayBuffer]] ) は false 。 byteOffset = view .[[ByteOffset]] 。byteLength = viewRecord .[[CachedBufferByteLength]] 。アサート: byteLength は detached ではない。 byteLength - byteOffset を返す。
25.3.1.4 IsViewOutOfBounds ( viewRecord )
The abstract operation IsViewOutOfBounds takes argument viewRecord (a DataView With Buffer Witness Record ) and returns a Boolean. It performs the following steps when called:
view を viewRecord .[[Object]] とする。bufferByteLength を viewRecord .[[CachedBufferByteLength]] とする。アサート: IsDetachedBuffer (view .[[ViewedArrayBuffer]] ) が true であることと bufferByteLength が detached であることは同値。 bufferByteLength が detached なら true を返す。byteOffsetStart = view .[[ByteOffset]] 。view .[[ByteLength]] が auto ならbyteOffsetEnd = bufferByteLength 。そうでなければbyteOffsetEnd = byteOffsetStart + view .[[ByteLength]] 。 byteOffsetStart > bufferByteLength または byteOffsetEnd > bufferByteLength なら true 。注: 長さ 0 の DataView は out-of-bounds とみなさない。 false を返す。
25.3.1.5 GetViewValue ( view , requestIndex , isLittleEndian , type )
The abstract operation GetViewValue takes arguments view (an ECMAScript language value), requestIndex (an ECMAScript language value), isLittleEndian (an ECMAScript language value), and type (a TypedArray element type) and returns either a normal completion containing either a Number or a BigInt, or a throw completion . DataView インスタンス上の関数からビューのバッファから値を取得する際に使用される。 It performs the following steps when called:
? RequireInternalSlot (view , [[DataView]] )。 アサート: view は [[ViewedArrayBuffer]] 内部スロットを持つ。 getIndex = ? ToIndex (requestIndex )。isLittleEndian = ToBoolean (isLittleEndian )。viewOffset = view .[[ByteOffset]] 。viewRecord = MakeDataViewWithBufferWitnessRecord (view , unordered )。注: view のバッファが成長可能 SharedArrayBuffer の場合、境界チェックは同期化されない操作。 IsViewOutOfBounds (viewRecord ) が true なら TypeError 例外。viewSize = GetViewByteLength (viewRecord )。elementSize を Table 73 における要素型 type の要素サイズ値とする。getIndex + elementSize > viewSize なら RangeError 例外。bufferIndex = getIndex + viewOffset 。GetValueFromBuffer (view .[[ViewedArrayBuffer]] , bufferIndex , type , false , unordered , isLittleEndian ) を返す。
25.3.1.6 SetViewValue ( view , requestIndex , isLittleEndian , type , value )
The abstract operation SetViewValue takes arguments view (an ECMAScript language value), requestIndex (an ECMAScript language value), isLittleEndian (an ECMAScript language value), type (a TypedArray element type), and value (an ECMAScript language value) and returns either a normal completion containing undefined or a throw completion . DataView インスタンス上の関数からビューのバッファへ値を書き込むために使用される。 It performs the following steps when called:
? RequireInternalSlot (view , [[DataView]] )。 アサート: view は [[ViewedArrayBuffer]] 内部スロットを持つ。 getIndex = ? ToIndex (requestIndex )。IsBigIntElementType (type ) が true なら numberValue = ? ToBigInt (value )。そうでなければ numberValue = ? ToNumber (value )。 isLittleEndian = ToBoolean (isLittleEndian )。viewOffset = view .[[ByteOffset]] 。viewRecord = MakeDataViewWithBufferWitnessRecord (view , unordered )。注: view のバッファが成長可能 SharedArrayBuffer の場合、境界チェックは同期化されない。 IsViewOutOfBounds (viewRecord ) が true なら TypeError 例外。viewSize = GetViewByteLength (viewRecord )。elementSize を Table 73 の type の要素サイズ値とする。getIndex + elementSize > viewSize なら RangeError 例外。bufferIndex = getIndex + viewOffset 。SetValueInBuffer (view .[[ViewedArrayBuffer]] , bufferIndex , type , numberValue , false , unordered , isLittleEndian ) を実行。undefined を返す。
25.3.2 DataView コンストラクター
DataView コンストラクタ ー:
%DataView% である。
グローバルオブジェクト の "DataView" プロパティの初期値である。
コンストラクタ ーとして呼ばれた際に新しい DataView を生成し初期化する。
関数として呼び出すことは意図されず、その形で呼ぶと例外を投げる。
クラス定義の extends
句の値として使用できる。指定された DataView の挙動を継承するサブクラスコンストラクタ ーは DataView.prototype
の組込みメソッドを支える内部状態でインスタンスを初期化するため super
呼び出しを含めねばならない。
25.3.2.1 DataView ( buffer [ , byteOffset [ , byteLength ] ] )
この関数は呼び出し時に次を行う:
NewTarget が undefined なら TypeError 例外。 ? RequireInternalSlot (buffer , [[ArrayBufferData]] )。 offset = ? ToIndex (byteOffset )。IsDetachedBuffer (buffer ) が true なら TypeError 例外。bufferByteLength = ArrayBufferByteLength (buffer , seq-cst )。offset > bufferByteLength なら RangeError 例外。bufferIsFixedLength = IsFixedLengthArrayBuffer (buffer )。byteLength が undefined ならbufferIsFixedLength が true ならviewByteLength = bufferByteLength - offset 。そうでなければviewByteLength = auto 。 そうでなければviewByteLength = ? ToIndex (byteLength )。offset + viewByteLength > bufferByteLength なら RangeError 例外。 O = ? OrdinaryCreateFromConstructor (NewTarget, "%DataView.prototype%" , « [[DataView]] , [[ViewedArrayBuffer]] , [[ByteLength]] , [[ByteOffset]] »)。IsDetachedBuffer (buffer ) が true なら TypeError 例外。bufferByteLength = ArrayBufferByteLength (buffer , seq-cst ) に再設定。offset > bufferByteLength なら RangeError 例外。byteLength が undefined でないならoffset + viewByteLength > bufferByteLength なら RangeError 例外。O .[[ViewedArrayBuffer]] = buffer 。O .[[ByteLength]] = viewByteLength 。O .[[ByteOffset]] = offset 。O を返す。
25.3.3 DataView コンストラクターのプロパティ
DataView コンストラクタ ー:
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 アクセサは以下を行う:
O を this 値。? RequireInternalSlot (O , [[DataView]] )。 アサート: O は [[ViewedArrayBuffer]] 内部スロットを持つ。 buffer = O .[[ViewedArrayBuffer]] 。buffer を返す。
25.3.4.2 get DataView.prototype.byteLength
DataView.prototype.byteLength
は set アクセサが undefined のアクセサプロパティ であり、その get アクセサは以下を行う:
O を this 値。? RequireInternalSlot (O , [[DataView]] )。 アサート: O は [[ViewedArrayBuffer]] 内部スロットを持つ。 viewRecord = MakeDataViewWithBufferWitnessRecord (O , seq-cst )。IsViewOutOfBounds (viewRecord ) が true なら TypeError 例外。size = GetViewByteLength (viewRecord )。𝔽 (size ) を返す。
25.3.4.3 get DataView.prototype.byteOffset
DataView.prototype.byteOffset
は set アクセサが undefined のアクセサプロパティ であり、その get アクセサは以下を行う:
O を this 値。? RequireInternalSlot (O , [[DataView]] )。 アサート: O は [[ViewedArrayBuffer]] 内部スロットを持つ。 viewRecord = MakeDataViewWithBufferWitnessRecord (O , seq-cst )。IsViewOutOfBounds (viewRecord ) が true なら TypeError 例外。offset = O .[[ByteOffset]] 。𝔽 (offset ) を返す。
25.3.4.4 DataView.prototype.constructor
DataView.prototype.constructor
の初期値は %DataView% である。
25.3.4.5 DataView.prototype.getBigInt64 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。? GetViewValue (view , byteOffset , littleEndian , bigint64 ) を返す。
25.3.4.6 DataView.prototype.getBigUint64 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。? GetViewValue (view , byteOffset , littleEndian , biguint64 ) を返す。
25.3.4.7 DataView.prototype.getFloat16 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? GetViewValue (view , byteOffset , littleEndian , float16 ) を返す。
25.3.4.8 DataView.prototype.getFloat32 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? GetViewValue (view , byteOffset , littleEndian , float32 ) を返す。
25.3.4.9 DataView.prototype.getFloat64 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? GetViewValue (view , byteOffset , littleEndian , float64 ) を返す。
25.3.4.10 DataView.prototype.getInt8 ( byteOffset )
このメソッドは呼び出し時に以下を行う:
view を this 値。? GetViewValue (view , byteOffset , true , int8 ) を返す。
25.3.4.11 DataView.prototype.getInt16 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? GetViewValue (view , byteOffset , littleEndian , int16 ) を返す。
25.3.4.12 DataView.prototype.getInt32 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? GetViewValue (view , byteOffset , littleEndian , int32 ) を返す。
25.3.4.13 DataView.prototype.getUint8 ( byteOffset )
このメソッドは呼び出し時に以下を行う:
view を this 値。? GetViewValue (view , byteOffset , true , uint8 ) を返す。
25.3.4.14 DataView.prototype.getUint16 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? GetViewValue (view , byteOffset , littleEndian , uint16 ) を返す。
25.3.4.15 DataView.prototype.getUint32 ( byteOffset [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? GetViewValue (view , byteOffset , littleEndian , uint32 ) を返す。
25.3.4.16 DataView.prototype.setBigInt64 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。? SetViewValue (view , byteOffset , littleEndian , bigint64 , value ) を返す。
25.3.4.17 DataView.prototype.setBigUint64 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。? SetViewValue (view , byteOffset , littleEndian , biguint64 , value ) を返す。
25.3.4.18 DataView.prototype.setFloat16 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? SetViewValue (view , byteOffset , littleEndian , float16 , value ) を返す。
25.3.4.19 DataView.prototype.setFloat32 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? SetViewValue (view , byteOffset , littleEndian , float32 , value ) を返す。
25.3.4.20 DataView.prototype.setFloat64 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? SetViewValue (view , byteOffset , littleEndian , float64 , value ) を返す。
25.3.4.21 DataView.prototype.setInt8 ( byteOffset , value )
このメソッドは呼び出し時に以下を行う:
view を this 値。? SetViewValue (view , byteOffset , true , int8 , value ) を返す。
25.3.4.22 DataView.prototype.setInt16 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? SetViewValue (view , byteOffset , littleEndian , int16 , value ) を返す。
25.3.4.23 DataView.prototype.setInt32 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? SetViewValue (view , byteOffset , littleEndian , int32 , value ) を返す。
25.3.4.24 DataView.prototype.setUint8 ( byteOffset , value )
このメソッドは呼び出し時に以下を行う:
view を this 値。? SetViewValue (view , byteOffset , true , uint8 , value ) を返す。
25.3.4.25 DataView.prototype.setUint16 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? SetViewValue (view , byteOffset , littleEndian , uint16 , value ) を返す。
25.3.4.26 DataView.prototype.setUint32 ( byteOffset , value [ , littleEndian ] )
このメソッドは呼び出し時に以下を行う:
view を this 値。littleEndian が存在しなければ littleEndian = false 。? SetViewValue (view , byteOffset , littleEndian , uint32 , value ) を返す。
25.3.4.27 DataView.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティ初期値は文字列 "DataView" である。
このプロパティは { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
25.3.5 DataView インスタンスのプロパティ
DataView インスタンスは DataView プロトタイプオブジェクト からプロパティを継承する。各インスタンスは [[DataView]] , [[ViewedArrayBuffer]] , [[ByteLength]] , [[ByteOffset]] 内部スロットを持つ。
Note
[[DataView]] 内部スロットの値自体は仕様内では使用されない。その内部スロットが存在すること自体で DataView コンストラクタ ーにより生成されたオブジェクトであることを識別する。
25.4 Atomics オブジェクト
Atomics オブジェクトは次の通りである:
%Atomics% である。
グローバルオブジェクト の "Atomics" プロパティの初期値である。
通常のオブジェクトである。
その [[Prototype]] 内部スロットの値は %Object.prototype% である。
[[Construct]] 内部メソッドを持たない;new
演算子でコンストラクタ として使用できない。
[[Call]] 内部メソッドを持たない;関数として呼び出せない。
Atomics オブジェクトは共有メモリ配列セルに対して不可分(アトミック)に動作する関数、およびエージェントがプリミティブなイベントを待機・送出するための関数を提供する。規律を守って用いることで、共有メモリを介して通信するマルチエージェントプログラムは、並列 CPU 上であっても理解可能な順序で実行される。共有メモリ通信を支配する規則は後述のメモリモデルで定義される。
Note
ECMAScript での共有メモリのプログラミングおよび実装に関する参考指針については、メモリモデル節末尾の注記を参照のこと。
25.4.1 Waiter Record
Waiter Record は Atomics.wait
または Atomics.waitAsync
への特定の呼び出しを表すために用いられる Record 値である。
Waiter Record は Table 76 に挙げるフィールドを持つ。
Table 76: Waiter Record のフィールド
フィールド名
値
意味
[[AgentSignifier]]
エージェント識別子
Atomics.wait
または Atomics.waitAsync
を呼び出したエージェント。
[[PromiseCapability]]
PromiseCapability Record または blocking
Atomics.waitAsync
の呼び出しを表す場合はその結果の Promise、それ以外は blocking 。
[[TimeoutTime]]
非負の拡張数学的値
タイムアウトが発火し得る最も早い時刻;時間値 を用いて計算される。
[[Result]]
"ok" または "timed-out"
呼び出しの戻り値。
25.4.2 WaiterList Records
WaiterList Record は Atomics.wait
, Atomics.waitAsync
, Atomics.notify
を通じたエージェントの待機と通知を説明するために用いられる。
WaiterList Record は Table 77 に挙げるフィールドを持つ。
Table 77: WaiterList Record のフィールド
同一のエージェント識別子を持つ複数の Waiter Record が 1 つの WaiterList に存在し得る。
エージェントクラスタは WaiterList Record の保管領域を持ち、そのインデックスは (block , i ) であり、block は Shared Data Block 、i はそのメモリ内のバイトオフセットである。WaiterList Record はエージェント非依存であり、(block , i ) による WaiterList Record の参照はクラスタ内どのエージェントからも同一の WaiterList Record を得る。
各 WaiterList Record はその評価中の排他的アクセスを制御する クリティカルセクション を持つ。同時に入場できるのは 1 つのエージェントのみである。クリティカルセクションへの入退場は抽象操作 EnterCriticalSection と LeaveCriticalSection により制御される。待機エージェントの追加/削除、リスト走査、リスト上のエージェントのサスペンドおよび通知、Synchronize event の設定/取得といった WaiterList Record 上の操作は、クリティカルセクションへ入場したエージェントのみが実行できる。
25.4.3 Atomics のための抽象操作
25.4.3.1 ValidateIntegerTypedArray ( typedArray , waitable )
The abstract operation ValidateIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and waitable (a Boolean) and returns 正常完了で TypedArray With Buffer Witness Record を含むか、または throw completion . It performs the following steps when called:
taRecord を ? ValidateTypedArray (typedArray , unordered ) の結果とする。注: typedArray の裏付けバッファが拡張可能な SharedArrayBuffer のとき、境界チェックは同期化操作ではない。 もし waitable が true なら、もし typedArray .[[TypedArrayName]] が "Int32Array" でも "BigInt64Array" でもないなら TypeError 例外を投げる。 それ以外なら、type を TypedArrayElementType (typedArray ) とする。IsUnclampedIntegerElementType (type ) が false かつ IsBigIntElementType (type ) が false なら TypeError 例外を投げる。 taRecord を返す。
25.4.3.2 ValidateAtomicAccess ( taRecord , requestIndex )
The abstract operation ValidateAtomicAccess takes arguments taRecord (a TypedArray With Buffer Witness Record ) and requestIndex (an ECMAScript language value) and returns 正常完了で整数 を含むか、または throw completion . It performs the following steps when called:
length を TypedArrayLength (taRecord ) とする。accessIndex を ? ToIndex (requestIndex ) とする。事前条件: accessIndex ≥ 0. もし accessIndex ≥ length なら RangeError 例外を投げる。 typedArray を taRecord .[[Object]] とする。elementSize を TypedArrayElementSize (typedArray ) とする。offset を typedArray .[[ByteOffset]] とする。(accessIndex × elementSize ) + offset を返す。
25.4.3.3 ValidateAtomicAccessOnIntegerTypedArray ( typedArray , requestIndex )
The abstract operation ValidateAtomicAccessOnIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and requestIndex (an ECMAScript language value) and returns 正常完了で整数 を含むか、または throw completion . It performs the following steps when called:
taRecord を ? ValidateIntegerTypedArray (typedArray , false ) とする。? ValidateAtomicAccess (taRecord , requestIndex ) を返す。
25.4.3.4 RevalidateAtomicAccess ( typedArray , byteIndexInBuffer )
The abstract operation RevalidateAtomicAccess takes arguments typedArray (a TypedArray ) and byteIndexInBuffer (an integer) and returns 正常完了で unused を含むか、または throw completion . この操作は Atomics メソッド内で全ての引数強制が行われた後(それらには任意の副作用があり得て、バッファを out of bounds にし得る)、アトミック操作のための裏付けバッファ内のインデックスを再検証する。typedArray の裏付けバッファが SharedArrayBuffer の場合、この操作は例外を投げない。 It performs the following steps when called:
taRecord を MakeTypedArrayWithBufferWitnessRecord (typedArray , unordered ) とする。注: typedArray の裏付けバッファが拡張可能な SharedArrayBuffer のとき、境界チェックは同期化操作ではない。 もし IsTypedArrayOutOfBounds (taRecord ) が true なら TypeError 例外を投げる。 事前条件: byteIndexInBuffer ≥ typedArray .[[ByteOffset]] . もし byteIndexInBuffer ≥ taRecord .[[CachedBufferByteLength]] なら RangeError 例外を投げる。 unused を返す。
25.4.3.5 GetWaiterList ( block , i )
The abstract operation GetWaiterList takes arguments block (a Shared Data Block ) and i (4 で割り切れる非負整数 ) and returns WaiterList Record . It performs the following steps when called:
事前条件: i および i + 3 は block のメモリ内の有効なバイトオフセットである。 組 (block , i ) により参照される WaiterList Record を返す。
25.4.3.6 EnterCriticalSection ( WL )
The abstract operation EnterCriticalSection takes argument WL (a WaiterList Record ) and returns unused . It performs the following steps when called:
事前条件: 周囲のエージェントはいかなる WaiterList Record のクリティカルセクション にも入っていない。 いずれのエージェントも WL のクリティカルセクション にいないまで待ち、次に(他のエージェントを入れずに)WL のクリティカルセクション へ入る。 もし WL .[[MostRecentLeaveEvent]] が empty でないなら、注: WL のクリティカルセクション が少なくとも一度入場された場合、LeaveCriticalSection により Synchronize event が設定されている。 execution を周囲エージェントの Agent Record の [[CandidateExecution]] フィールドとする。eventsRecord を execution .[[EventsRecords]] のうち [[AgentSignifier]] が AgentSignifier () である Agent Events Record とする。enterEvent を新たな Synchronize event とする。enterEvent を eventsRecord .[[EventList]] に追加する。(WL .[[MostRecentLeaveEvent]] , enterEvent ) を eventsRecord .[[AgentSynchronizesWith]] に追加する。 unused を返す。
EnterCriticalSection は、クリティカルセクション へ入ろうとするエージェントが他のエージェントの退出を待たねばならないとき 競合 (contention) を持つ。競合がないとき、EnterCriticalSection 呼び出しの FIFO 順序は観測可能である。競合があるとき、実装は任意の順序を選択できるが、エージェントを無期限に待たせてはならない。
25.4.3.7 LeaveCriticalSection ( WL )
The abstract operation LeaveCriticalSection takes argument WL (a WaiterList Record ) and returns unused . It performs the following steps when called:
事前条件: 周囲のエージェントは WL のクリティカルセクション 内にいる。 execution を周囲エージェントの Agent Record の [[CandidateExecution]] フィールドとする。eventsRecord を execution .[[EventsRecords]] のうち [[AgentSignifier]] が AgentSignifier () の Agent Events Record とする。leaveEvent を新たな Synchronize event とする。leaveEvent を eventsRecord .[[EventList]] に追加する。WL .[[MostRecentLeaveEvent]] を leaveEvent に設定する。WL のクリティカルセクション を離れる。unused を返す。
25.4.3.8 AddWaiter ( WL , waiterRecord )
The abstract operation AddWaiter takes arguments WL (a WaiterList Record ) and waiterRecord (a Waiter Record ) and returns unused . It performs the following steps when called:
事前条件: 周囲のエージェントは WL のクリティカルセクション 内にいる。 事前条件: WL .[[Waiters]] に [[PromiseCapability]] フィールドが waiterRecord .[[PromiseCapability]] かつ [[AgentSignifier]] フィールドが waiterRecord .[[AgentSignifier]] である Waiter Record は存在しない。 waiterRecord を WL .[[Waiters]] に追加する。unused を返す。
25.4.3.9 RemoveWaiter ( WL , waiterRecord )
The abstract operation RemoveWaiter takes arguments WL (a WaiterList Record ) and waiterRecord (a Waiter Record ) and returns unused . It performs the following steps when called:
事前条件: 周囲のエージェントは WL のクリティカルセクション 内にいる。 事前条件: WL .[[Waiters]] は waiterRecord を含む。 waiterRecord を WL .[[Waiters]] から除去する。unused を返す。
25.4.3.10 RemoveWaiters ( WL , c )
The abstract operation RemoveWaiters takes arguments WL (a WaiterList Record ) and c (非負整数 または +∞) and returns Waiter Record の List . It performs the following steps when called:
事前条件: 周囲のエージェントは WL のクリティカルセクション 内にいる。 len を WL .[[Waiters]] の要素数とする。n を min (c , len ) とする。L を WL .[[Waiters]] の最初の n 要素からなる List とする。WL .[[Waiters]] の最初の n 要素を除去する。L を返す。
25.4.3.11 SuspendThisAgent ( WL , waiterRecord )
The abstract operation SuspendThisAgent takes arguments WL (a WaiterList Record ) and waiterRecord (a Waiter Record ) and returns unused . It performs the following steps when called:
事前条件: 周囲のエージェントは WL のクリティカルセクション 内にいる。 事前条件: WL .[[Waiters]] は waiterRecord を含む。 thisAgent を AgentSignifier () とする。事前条件: waiterRecord .[[AgentSignifier]] は thisAgent である。 事前条件: waiterRecord .[[PromiseCapability]] は blocking である。 事前条件: AgentCanSuspend () は true である。 LeaveCriticalSection (WL ) を行い、サスペンドが有効になる前に通知が到着しても失われない方法で、周囲のエージェントを waiterRecord .[[TimeoutTime]] の時刻までサスペンドし、その後周囲のエージェントはサスペンド解除される。サスペンド解除はタイムアウト、または他のエージェントが NotifyWaiter を WL , thisAgent で呼び出した(つまり Atomics.notify
呼び出し経由)場合のみ起こる。EnterCriticalSection (WL ) を実行する。unused を返す。
25.4.3.12 NotifyWaiter ( WL , waiterRecord )
The abstract operation NotifyWaiter takes arguments WL (a WaiterList Record ) and waiterRecord (a Waiter Record ) and returns unused . It performs the following steps when called:
事前条件: 周囲のエージェントは WL のクリティカルセクション 内にいる。 もし waiterRecord .[[PromiseCapability]] が blocking なら、識別子が waiterRecord .[[AgentSignifier]] であるエージェントをサスペンドから起こす。 注: これによりエージェントは SuspendThisAgent 内の実行を再開する。 そうでなく AgentSignifier () が waiterRecord .[[AgentSignifier]] なら、promiseCapability を waiterRecord .[[PromiseCapability]] とする。! Call(promiseCapability .[[Resolve]] , undefined , « waiterRecord .[[Result]] ») を実行する。 その他の場合、EnqueueResolveInAgentJob (waiterRecord .[[AgentSignifier]] , waiterRecord .[[PromiseCapability]] , waiterRecord .[[Result]] ) を実行する。 unused を返す。
Note
エージェントは、ホスト へ渡す以外の形で他エージェントの promise capability にアクセスしてはならない。
25.4.3.13 EnqueueResolveInAgentJob ( agentSignifier , promiseCapability , resolution )
The abstract operation EnqueueResolveInAgentJob takes arguments agentSignifier (an agent signifier ), promiseCapability (a PromiseCapability Record ), and resolution ("ok" or "timed-out" ) and returns unused . It performs the following steps when called:
resolveJob を、引数なしで agentSignifier , promiseCapability , resolution を捕捉し、呼び出されたとき次を行う新たな Job Abstract Closure とする:事前条件: AgentSignifier () は agentSignifier である。 ! Call(promiseCapability .[[Resolve]] , undefined , « resolution ») を実行する。 unused を返す。realmInTargetAgent を ! GetFunctionRealm (promiseCapability .[[Resolve]] ) とする。事前条件: agentSignifier は realmInTargetAgent .[[AgentSignifier]] である。 HostEnqueueGenericJob (resolveJob , realmInTargetAgent ) を実行する。unused を返す。
25.4.3.14 DoWait ( mode , typedArray , index , value , timeout )
The abstract operation DoWait takes arguments mode (sync or async ), typedArray (an ECMAScript language value), index (an ECMAScript language value), value (an ECMAScript language value), and timeout (an ECMAScript language value) and returns 正常完了で Object, "not-equal" , "timed-out" , "ok" のいずれか、または throw completion . It performs the following steps when called:
taRecord を ? ValidateIntegerTypedArray (typedArray , true ) とする。buffer を taRecord .[[Object]] .[[ViewedArrayBuffer]] とする。もし IsSharedArrayBuffer (buffer ) が false なら TypeError 例外を投げる。 i を ? ValidateAtomicAccess (taRecord , index ) とする。arrayTypeName を typedArray .[[TypedArrayName]] とする。もし arrayTypeName が "BigInt64Array" なら v を ? ToBigInt64 (value ) とする。 そうでなければ v を ? ToInt32 (value ) とする。 q を ? ToNumber (timeout ) とする。もし q が NaN 又は +∞ 𝔽 なら t を +∞ とする;q が -∞ 𝔽 なら t を 0;それ以外は t を max (ℝ (q ), 0) とする。 もし mode が sync かつ AgentCanSuspend () が false なら TypeError 例外を投げる。 block を buffer .[[ArrayBufferData]] とする。offset を typedArray .[[ByteOffset]] とする。byteIndexInBuffer を (i × 4) + offset とする。WL を GetWaiterList (block , byteIndexInBuffer ) とする。もし mode が sync ならpromiseCapability を blocking とする。resultObject を undefined とする。 それ以外ならpromiseCapability を ! NewPromiseCapability (%Promise% ) とする。resultObject を OrdinaryObjectCreate (%Object.prototype% ) とする。 EnterCriticalSection (WL ) を実行する。elementType を TypedArrayElementType (typedArray ) とする。w を GetValueFromBuffer (buffer , byteIndexInBuffer , elementType , true , seq-cst ) とする。もし v ≠ w ならLeaveCriticalSection (WL ) を実行する。もし mode が sync なら "not-equal" を返す。 ! CreateDataPropertyOrThrow (resultObject , "async" , false ) を実行。 ! CreateDataPropertyOrThrow (resultObject , "value" , "not-equal" ) を実行。 resultObject を返す。 もし t = 0 かつ mode が async なら注: 同期即時タイムアウトには特別扱いはない。非同期即時タイムアウトは失敗を速め、不要な Promise ジョブを避ける特別扱いを持つ。 LeaveCriticalSection (WL ) を実行する。! CreateDataPropertyOrThrow (resultObject , "async" , false ) を実行。 ! CreateDataPropertyOrThrow (resultObject , "value" , "timed-out" ) を実行。 resultObject を返す。 thisAgent を AgentSignifier () とする。now を現在時刻 (UTC) を示す time value とする。additionalTimeout を実装定義 の非負数学的値とする。timeoutTime を ℝ (now ) + t + additionalTimeout とする。注: t が +∞ のとき timeoutTime も +∞。 waiterRecord を新たな Waiter Record { [[AgentSignifier]] : thisAgent , [[PromiseCapability]] : promiseCapability , [[TimeoutTime]] : timeoutTime , [[Result]] : "ok" } とする。AddWaiter (WL , waiterRecord ) を実行する。もし mode が sync ならSuspendThisAgent (WL , waiterRecord ) を実行する。 それ以外で timeoutTime が有限 ならEnqueueAtomicsWaitAsyncTimeoutJob (WL , waiterRecord ) を実行する。 LeaveCriticalSection (WL ) を実行する。もし mode が sync なら waiterRecord .[[Result]] を返す。 ! CreateDataPropertyOrThrow (resultObject , "async" , true ) を実行。 ! CreateDataPropertyOrThrow (resultObject , "value" , promiseCapability .[[Promise]] ) を実行。 resultObject を返す。
Note
additionalTimeout は、電力消費削減やタイミング攻撃緩和のためのタイマー分解能粗化など、実装が必要に応じてタイムアウトにパディングを追加することを許容する。値は DoWait の呼び出しごとに異なり得る。
25.4.3.15 EnqueueAtomicsWaitAsyncTimeoutJob ( WL , waiterRecord )
The abstract operation EnqueueAtomicsWaitAsyncTimeoutJob takes arguments WL (a WaiterList Record ) and waiterRecord (a Waiter Record ) and returns unused . It performs the following steps when called:
timeoutJob を、引数なしで WL と waiterRecord を捕捉し、呼び出されたとき以下を行う新たな Job Abstract Closure とする:EnterCriticalSection (WL ) を実行する。もし WL .[[Waiters]] が waiterRecord を含むならtimeOfJobExecution を現在時刻 (UTC) を示す time value とする。事前条件: ℝ (timeOfJobExecution ) ≥ waiterRecord .[[TimeoutTime]] (時間値 の非単調性は無視)。 waiterRecord .[[Result]] を "timed-out" に設定する。RemoveWaiter (WL , waiterRecord ) を実行する。NotifyWaiter (WL , waiterRecord ) を実行する。 LeaveCriticalSection (WL ) を実行する。unused を返す。now を現在時刻 (UTC) を示す time value とする。currentRealm を現在の Realm Record とする。HostEnqueueTimeoutJob (timeoutJob , currentRealm , 𝔽 (waiterRecord .[[TimeoutTime]] ) - now ) を実行する。unused を返す。
25.4.3.16 AtomicCompareExchangeInSharedBlock ( block , byteIndexInBuffer , elementSize , expectedBytes , replacementBytes )
The abstract operation AtomicCompareExchangeInSharedBlock takes arguments block (a Shared Data Block ), byteIndexInBuffer (an integer), elementSize (a non-negative integer), expectedBytes (a List of byte values ), and replacementBytes (a List of byte values ) and returns byte 値の List . It performs the following steps when called:
execution を周囲エージェントの Agent Record の [[CandidateExecution]] フィールドとする。eventsRecord を execution .[[EventsRecords]] のうち [[AgentSignifier]] が AgentSignifier () の Agent Events Record とする。rawBytesRead を長さ elementSize の List とし、要素は非決定的に選ばれるバイト値 とする。注: 実装では rawBytesRead は基盤ハードウェア上のロードリンク、ロード排他、または read-modify-write 命令のオペランドの結果である。この非決定性は弱い一貫性を持つハードウェアの観測可能な振る舞いを記述するための意味的規定。 注: 期待値と読み取った値の比較は read-modify-write 変更関数 の外で行い、期待値不一致の場合に不必要な強い同期化を避ける。 もし ByteListEqual (rawBytesRead , expectedBytes ) が true ならsecond を (oldBytes , newBytes ) を引数に取り何も捕捉せず呼ばれるとアトミックに次を行う新たな read-modify-write 変更関数 とし、newBytes を返す。event を ReadModifyWriteSharedMemory { [[Order]] : seq-cst , [[NoTear]] : true , [[Block]] : block , [[ByteIndex]] : byteIndexInBuffer , [[ElementSize]] : elementSize , [[Payload]] : replacementBytes , [[ModifyOp]] : second } とする。 それ以外ならevent を ReadSharedMemory { [[Order]] : seq-cst , [[NoTear]] : true , [[Block]] : block , [[ByteIndex]] : byteIndexInBuffer , [[ElementSize]] : elementSize } とする。 event を eventsRecord .[[EventList]] に追加する。Chosen Value Record { [[Event]] : event , [[ChosenValue]] : rawBytesRead } を execution .[[ChosenValues]] に追加する。rawBytesRead を返す。
25.4.3.17 AtomicReadModifyWrite ( typedArray , index , value , op )
The abstract operation AtomicReadModifyWrite takes arguments typedArray (an ECMAScript language value), index (an ECMAScript language value), value (an ECMAScript language value), and op (a read-modify-write modification function) and returns 正常完了で Number または BigInt を含むか、または throw completion . op は2つの byte 値 List を引数に取り、byte 値 List を返す。この操作は値をアトミックに読み込み、別の値と結合し、その結合を格納し、読み込んだ値を返す。 It performs the following steps when called:
byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray (typedArray , index ) とする。もし typedArray .[[ContentType]] が bigint なら v を ? ToBigInt (value ) とする。 それ以外は v を 𝔽 (? ToIntegerOrInfinity (value )) とする。 ? RevalidateAtomicAccess (typedArray , byteIndexInBuffer ) を実行する。 buffer を typedArray .[[ViewedArrayBuffer]] とする。elementType を TypedArrayElementType (typedArray ) とする。GetModifySetValueInBuffer (buffer , byteIndexInBuffer , elementType , v , op ) を返す。
25.4.3.18 ByteListBitwiseOp ( op , xBytes , yBytes )
The abstract operation ByteListBitwiseOp takes arguments op (&
, ^
, または |
), xBytes (a List of byte values ), and yBytes (a List of byte values ) and returns byte 値の List . この操作は引数の全てのバイト値 に対してビット単位演算をアトミックに行い、byte 値の List を返す。 It performs the following steps when called:
事前条件: xBytes と yBytes は同じ要素数を持つ。 result を新たな空 List とする。i を 0 とする。各要素 xByte についてyByte を yBytes [i ] とする。もし op が &
ならresultByte を xByte と yByte のビット単位 AND の結果とする。 そうでなく op が ^
ならresultByte を xByte と yByte のビット単位 XOR の結果とする。 それ以外事前条件: op は |
。 resultByte を xByte と yByte のビット単位 OR の結果とする。 i を i + 1 にする。resultByte を result に追加する。 result を返す。
25.4.3.19 ByteListEqual ( xBytes , yBytes )
The abstract operation ByteListEqual takes arguments xBytes (a List of byte values ) and yBytes (a List of byte values ) and returns Boolean. It performs the following steps when called:
もし xBytes と yBytes が同じ要素数でなければ false を返す。 i を 0 とする。各要素 xByte についてyByte を yBytes [i ] とする。もし xByte ≠ yByte なら false を返す。 i を i + 1 にする。 true を返す。
25.4.4 Atomics.add ( typedArray , index , value )
この関数は呼び出されたとき次を行う:
add を (xBytes , yBytes ) を引数に取り typedArray を捕捉し、呼ばれるとアトミックに以下を行う新たな read-modify-write 変更関数 とする:type を TypedArrayElementType (typedArray ) とする。isLittleEndian を周囲エージェントの Agent Record の [[LittleEndian]] フィールドの値とする。x を RawBytesToNumeric (type , xBytes , isLittleEndian ) とする。y を RawBytesToNumeric (type , yBytes , isLittleEndian ) とする。もし x が Number ならsum を Number::add (x , y ) とする。 それ以外事前条件: x は BigInt。 sum を BigInt::add (x , y ) とする。 sumBytes を NumericToRawBytes (type , sum , isLittleEndian ) とする。事前条件: sumBytes , xBytes , yBytes は同じ要素数。 sumBytes を返す。? AtomicReadModifyWrite (typedArray , index , value , add ) を返す。
25.4.5 Atomics.and ( typedArray , index , value )
この関数は呼び出されたとき次を行う:
and を (xBytes , yBytes ) を引数に取り何も捕捉せず、呼ばれるとアトミックに次を行う新たな read-modify-write 変更関数 とし、ByteListBitwiseOp (&
, xBytes , yBytes ) を返す。? AtomicReadModifyWrite (typedArray , index , value , and ) を返す。
25.4.6 Atomics.compareExchange ( typedArray , index , expectedValue , replacementValue )
この関数は呼び出されたとき次を行う:
byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray (typedArray , index ) とする。buffer を typedArray .[[ViewedArrayBuffer]] とする。block を buffer .[[ArrayBufferData]] とする。もし typedArray .[[ContentType]] が bigint ならexpected を ? ToBigInt (expectedValue ) とする。replacement を ? ToBigInt (replacementValue ) とする。 それ以外expected を 𝔽 (? ToIntegerOrInfinity (expectedValue )) とする。replacement を 𝔽 (? ToIntegerOrInfinity (replacementValue )) とする。 ? RevalidateAtomicAccess (typedArray , byteIndexInBuffer ) を実行する。 elementType を TypedArrayElementType (typedArray ) とする。elementSize を TypedArrayElementSize (typedArray ) とする。isLittleEndian を周囲エージェントの Agent Record の [[LittleEndian]] フィールド値とする。expectedBytes を NumericToRawBytes (elementType , expected , isLittleEndian ) とする。replacementBytes を NumericToRawBytes (elementType , replacement , isLittleEndian ) とする。もし IsSharedArrayBuffer (buffer ) が true ならrawBytesRead を AtomicCompareExchangeInSharedBlock (block , byteIndexInBuffer , elementSize , expectedBytes , replacementBytes ) とする。 それ以外rawBytesRead を長さ elementSize の List とし、block [byteIndexInBuffer ] から始まる elementSize バイト列とする。もし ByteListEqual (rawBytesRead , expectedBytes ) が true ならreplacementBytes の各バイトを block の block [byteIndexInBuffer ] から書き込む。 RawBytesToNumeric (elementType , rawBytesRead , isLittleEndian ) を返す。
25.4.7 Atomics.exchange ( typedArray , index , value )
この関数は呼び出されたとき次を行う:
second を (oldBytes , newBytes ) を引数に取り何も捕捉せず、呼ばれるとアトミックに newBytes を返す read-modify-write 変更関数 とする。? AtomicReadModifyWrite (typedArray , index , value , second ) を返す。
25.4.8 Atomics.isLockFree ( size )
この関数は呼び出されたとき次を行う:
n を ? ToIntegerOrInfinity (size ) とする。AR を周囲エージェントの Agent Record とする。もし n = 1 なら AR .[[IsLockFree1]] を返す。 もし n = 2 なら AR .[[IsLockFree2]] を返す。 もし n = 4 なら true を返す。 もし n = 8 なら AR .[[IsLockFree8]] を返す。 false を返す。
Note
この関数は最適化プリミティブである。直感的には、サイズ n バイトのデータに対するアトミックプリミティブ(compareExchange
, load
, store
, add
, sub
, and
, or
, xor
, exchange
)のアトミックステップが、そのデータ n バイト外のロックを取得せずに実行されるなら Atomics.isLockFree
(n ) は true を返す。高性能アルゴリズムはこの関数を用いてクリティカルセクション でロックを使うかアトミック操作を使うかを決定する。アトミックプリミティブがロックフリーでない場合、アルゴリズムが独自のロックを提供する方がしばしば効率的である。
Atomics.isLockFree
(4) は常に true を返し、これは全ての関連ハードウェアでサポート可能である。これを前提できることでプログラムは一般に単純化する。
この関数が返す値に関わらず、全てのアトミック操作はアトミックであることが保証される。例えば、操作の途中で可視な操作が発生(いわゆる「tearing」)することは決してない。
25.4.9 Atomics.load ( typedArray , index )
この関数は呼び出されたとき次を行う:
byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray (typedArray , index ) とする。? RevalidateAtomicAccess (typedArray , byteIndexInBuffer ) を実行する。 buffer を typedArray .[[ViewedArrayBuffer]] とする。elementType を TypedArrayElementType (typedArray ) とする。GetValueFromBuffer (buffer , byteIndexInBuffer , elementType , true , seq-cst ) を返す。
25.4.10 Atomics.or ( typedArray , index , value )
この関数は呼び出されたとき次を行う:
or を (xBytes , yBytes ) を引数に取り何も捕捉せず、呼ばれるとアトミックに ByteListBitwiseOp (|
, xBytes , yBytes ) を返す read-modify-write 変更関数 とする。? AtomicReadModifyWrite (typedArray , index , value , or ) を返す。
25.4.11 Atomics.store ( typedArray , index , value )
この関数は呼び出されたとき次を行う:
byteIndexInBuffer を ? ValidateAtomicAccessOnIntegerTypedArray (typedArray , index ) とする。もし typedArray .[[ContentType]] が bigint なら v を ? ToBigInt (value ) とする。 それ以外は v を 𝔽 (? ToIntegerOrInfinity (value )) とする。 ? RevalidateAtomicAccess (typedArray , byteIndexInBuffer ) を実行する。 buffer を typedArray .[[ViewedArrayBuffer]] とする。elementType を TypedArrayElementType (typedArray ) とする。SetValueInBuffer (buffer , byteIndexInBuffer , elementType , v , true , seq-cst ) を実行する。v を返す。
25.4.12 Atomics.sub ( typedArray , index , value )
この関数は呼び出されたとき次を行う:
subtract を (xBytes , yBytes ) を引数に取り typedArray を捕捉し、呼ばれるとアトミックに以下を行う新たな read-modify-write 変更関数 とする:type を TypedArrayElementType (typedArray ) とする。isLittleEndian を周囲エージェントの Agent Record の [[LittleEndian]] フィールド値とする。x を RawBytesToNumeric (type , xBytes , isLittleEndian ) とする。y を RawBytesToNumeric (type , yBytes , isLittleEndian ) とする。もし x が Number ならdifference を Number::subtract (x , y ) とする。 それ以外事前条件: x は BigInt。 difference を BigInt::subtract (x , y ) とする。 differenceBytes を NumericToRawBytes (type , difference , isLittleEndian ) とする。事前条件: differenceBytes , xBytes , yBytes は同じ要素数。 differenceBytes を返す。? AtomicReadModifyWrite (typedArray , index , value , subtract ) を返す。
25.4.13 Atomics.wait ( typedArray , index , value , timeout )
この関数は周囲のエージェントを待機キューに入れ、通知またはタイムアウトまでサスペンドし、それらを区別する文字列を返す。
呼び出されたとき次を行う:
? DoWait (sync , typedArray , index , value , timeout ) を返す。
25.4.14 Atomics.waitAsync ( typedArray , index , value , timeout )
この関数は、呼び出しエージェントが通知されるかタイムアウトに達したとき解決される Promise を返す。
呼び出されたとき次を行う:
? DoWait (async , typedArray , index , value , timeout ) を返す。
25.4.15 Atomics.notify ( typedArray , index , count )
この関数は待機キューでスリープしている一部のエージェントに通知する。
呼び出されたとき次を行う:
taRecord を ? ValidateIntegerTypedArray (typedArray , true ) とする。byteIndexInBuffer を ? ValidateAtomicAccess (taRecord , index ) とする。もし count が undefined ならc を +∞ とする。 それ以外intCount を ? ToIntegerOrInfinity (count ) とする。c を max (intCount , 0) とする。 buffer を typedArray .[[ViewedArrayBuffer]] とする。block を buffer .[[ArrayBufferData]] とする。もし IsSharedArrayBuffer (buffer ) が false なら +0 𝔽 を返す。 WL を GetWaiterList (block , byteIndexInBuffer ) とする。EnterCriticalSection (WL ) を実行する。S を RemoveWaiters (WL , c ) とする。各 S の要素 W についてNotifyWaiter (WL , W ) を実行する。 LeaveCriticalSection (WL ) を実行する。n を S の要素数とする。𝔽 (n ) を返す。
25.4.16 Atomics.xor ( typedArray , index , value )
この関数は呼び出されたとき次を行う:
xor を (xBytes , yBytes ) を引数に取り何も捕捉せず、呼ばれるとアトミックに ByteListBitwiseOp (^
, xBytes , yBytes ) を返す read-modify-write 変更関数 とする。? AtomicReadModifyWrite (typedArray , index , value , xor ) を返す。
25.4.17 Atomics [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列値 "Atomics" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
25.5 JSON オブジェクト
JSON オブジェクトは次の通りである:
%JSON% である。
グローバルオブジェクト の "JSON" プロパティの初期値である。
通常のオブジェクトである。
parse
と stringify
の 2 つの関数を含み、JSON テキストの構文解析と構築に使用される。
[[Prototype]] 内部スロットの値は %Object.prototype% である。
[[Construct]] 内部メソッドを持たず、new
演算子でコンストラクタ として使用できない。
[[Call]] 内部メソッドを持たず、関数として呼び出せない。
JSON データ交換形式は ECMA-404 に定義される。本仕様で使用される JSON 交換形式は ECMA-404 に記述されるものと正確に同一である。JSON.parse
および JSON.stringify
の適合実装は ECMA-404 仕様に記述された交換形式を、削除や拡張なしにサポートしなければならない。
25.5.1 JSON.parse ( text [ , reviver ] )
この関数は JSON テキスト(JSON 形式の文字列)を構文解析し、ECMAScript 言語値を生成する。JSON 形式はリテラル、配列、オブジェクトを ECMAScript のリテラル、配列初期化子、オブジェクト初期化子に類似した構文で表現する。構文解析後、JSON オブジェクトは ECMAScript オブジェクトとして実体化され、JSON 配列は ECMAScript の Array インスタンスとして実体化される。JSON の文字列、数値、真偽値、および null はそれぞれ ECMAScript の String, Number, Boolean, null として実体化される。
任意の reviver パラメータは 2 つのパラメータ key , value を取る関数であり、結果をフィルタおよび変換できる。構文解析で生成された各 key /value ペアで呼び出され、その戻り値が元の値の代わりに使用される。受け取ったものをそのまま返した場合、構造は変更されない。undefined を返した場合、そのプロパティは結果から削除される。
jsonString を ? ToString (text ) とする。unfiltered を ? ParseJSON (jsonString ) とする。もし IsCallable (reviver ) が true ならroot を OrdinaryObjectCreate (%Object.prototype% ) とする。rootName を空文字列とする。! CreateDataPropertyOrThrow (root , rootName , unfiltered ) を実行する。 ? InternalizeJSONProperty (root , rootName , reviver ) を返す。 それ以外unfiltered を返す。
この関数の "length" プロパティは 2 𝔽 である。
25.5.1.1 ParseJSON ( text )
The abstract operation ParseJSON takes argument text (a String) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion . It performs the following steps when called:
もし StringToCodePoints(text ) が ECMA-404 で規定された有効な JSON テキストでないなら SyntaxError 例外を投げる。 scriptString を "(" , text , ");" の文字列連結 とする。script を ParseText(scriptString , Script ) とする。注: 13.2.5.1 で定義される早期エラールールは上記 ParseText 呼び出しに特別な扱いを持つ。 事前条件: script は Parse Node。 result を ! script の評価 とする。注: 13.2.5.5 で定義される PropertyDefinitionEvaluation の意味論は ParseJSON 中特別な扱いを持つ。 事前条件: result は String, Number, Boolean, ArrayLiteral か ObjectLiteral により定義される Object, または null のいずれかである。 result を返す。
適合実装が JSON.parse
の JSON 文法を拡張することは許されない。修正または拡張された JSON 交換形式をサポートしたい実装は別の parse 関数を定義しなければならない。
Note 1
有効な JSON テキストは ECMAScript PrimaryExpression 構文の部分集合である。ステップ 1 は jsonString がその部分集合に従うことを検証し、ステップ 8 は評価が適切な型の値を返すことを保証する。
しかし、13.2.5.5 が ParseJSON 中で異なる振る舞いをするため、同一のソーステキストを PrimaryExpression として評価した場合と JSON として評価した場合で異なる結果を生むことがある。さらにオブジェクトリテラル内の重複 "__proto__" プロパティの Early Error(ParseJSON 中は適用されない)により、文法に合致していても ParseJSON が受理するすべてのテキストが PrimaryExpression として有効とは限らない。
Note 2
オブジェクト内に重複する name String が存在する場合、字句的に先行する同一キーの値は上書きされる。
25.5.1.2 InternalizeJSONProperty ( holder , name , reviver )
The abstract operation InternalizeJSONProperty takes arguments holder (an Object), name (a String), and reviver (a function object) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion .
Note
このアルゴリズムは [[Delete]] または CreateDataProperty が false を返しても例外を投げないことを意図している。
呼び出されたとき次を行う:
val を ? Get (holder , name ) とする。もし val が Object ならisArray を ? IsArray (val ) とする。もし isArray が true ならlen を ? LengthOfArrayLike (val ) とする。I を 0 とする。I < len の間繰り返す:prop を ! ToString (𝔽 (I )) とする。newElement を ? InternalizeJSONProperty (val , prop , reviver ) とする。もし newElement が undefined なら? val .[[Delete]] (prop ) を実行。 それ以外? CreateDataProperty (val , prop , newElement ) を実行。 I を I + 1 にする。 それ以外keys を ? EnumerableOwnProperties (val , key ) とする。各 String P についてnewElement を ? InternalizeJSONProperty (val , P , reviver ) とする。もし newElement が undefined なら? val .[[Delete]] (P ) を実行。 それ以外? CreateDataProperty (val , P , newElement ) を実行。 ? Call(reviver , holder , « name , val ») を返す。
25.5.2 JSON.stringify ( value [ , replacer [ , space ] ] )
この関数は value を UTF-16 エンコードされた JSON 形式の文字列か undefined で表現して返す。3 つのパラメータを取る。value は通常オブジェクト または配列であるが、String, Boolean, Number, null も指定可能。任意の replacer はオブジェクトや配列の文字列化方法を変更する関数、または文字列と数値の配列であり、文字列化に含めるプロパティを選択する包含リストとして振る舞う。任意の space は String または Number で、人間可読性向上のため結果に空白を挿入できる。
呼び出されたとき次を行う:
stack を新たな空 List とする。indent を空文字列とする。PropertyList を undefined とする。ReplacerFunction を undefined とする。もし replacer が Object ならもし IsCallable (replacer ) が true ならReplacerFunction を replacer に設定する。 それ以外isArray を ? IsArray (replacer ) とする。もし isArray が true ならPropertyList を新たな空 List とする。len を ? LengthOfArrayLike (replacer ) とする。k を 0 とする。k < len の間繰り返す:prop を ! ToString (𝔽 (k )) とする。v を ? Get (replacer , prop ) とする。item を undefined とする。もし v が String ならitem を v とする。 それ以外で v が Number ならitem を ! ToString (v ) とする。 それ以外で v が Object ならもし v が [[StringData]] または [[NumberData]] 内部スロットを持つなら item を ? ToString (v ) とする。 もし item が undefined でなく かつ PropertyList に含まれていなければ item を PropertyList に追加する。 k を k + 1 にする。 もし space が Object ならもし space が [[NumberData]] 内部スロットを持つならspace を ? ToNumber (space ) とする。 それ以外で space が [[StringData]] 内部スロットを持つならspace を ? ToString (space ) とする。 もし space が Number ならspaceMV を ! ToIntegerOrInfinity (space ) とする。spaceMV を min (10, spaceMV ) に設定する。もし spaceMV < 1 なら gap を空文字列、それ以外はコード単位 0x0020 (SPACE) の spaceMV 回繰り返しからなる文字列値とする。 それ以外で space が String ならもし space の長さ ≤ 10 なら gap を space とし、そうでなければ space の 0 から 10 までの部分文字列 とする。 それ以外gap を空文字列とする。 wrapper を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (wrapper , 空文字列, value ) を実行する。 state を JSON Serialization Record { [[ReplacerFunction]] : ReplacerFunction , [[Stack]] : stack , [[Indent]] : indent , [[Gap]] : gap , [[PropertyList]] : PropertyList } とする。? SerializeJSONProperty (state , 空文字列, wrapper ) を返す。
この関数の "length" プロパティは 3 𝔽 である。
Note 1
JSON 構造は任意の深さにネスト可能であるが非循環でなければならない。value が循環構造であるか含む場合、この関数は TypeError 例外を投げねばならない。以下は文字列化できない値の例:
a = [];
a[0 ] = a;
my_text = JSON .stringify (a);
Note 2
シンボリックなプリミティブ値は以下のようにレンダリングされる:
null 値は JSON テキストでは文字列値 "null" として表現される。
undefined 値はレンダリングされない。
true 値は JSON テキストでは文字列値 "true" として表現される。
false 値は JSON テキストでは文字列値 "false" として表現される。
Note 3
文字列値は QUOTATION MARK ("
) コード単位で囲まれる。コード単位 "
と \
は \
接頭辞でエスケープされる。制御文字コード単位は \u
HHHH のエスケープシーケンス、または短い形式 \b
(BACKSPACE), \f
(FORM FEED), \n
(LINE FEED), \r
(CARRIAGE RETURN), \t
(CHARACTER TABULATION) に置換される。
Note 4
有限 の数値は ToString (number ) 呼び出しと同様に文字列化される。NaN と符号に関わらず Infinity は文字列値 "null" として表現される。
Note 5
JSON 表現を持たない値(undefined や関数など)は文字列を生成しない。代わりに undefined を生成する。配列ではこれらの値は文字列値 "null" として表現され、オブジェクトでは表現不能な値はそのプロパティが文字列化から除外される。
Note 6
オブジェクトは U+007B (LEFT CURLY BRACKET) で開始し、0 個以上のプロパティを U+002C (COMMA) で区切り、U+007D (RIGHT CURLY BRACKET) で閉じる。プロパティはプロパティ名 を表す引用符付き String、U+003A (COLON)、およびその文字列化された値で構成される。配列は U+005B (LEFT SQUARE BRACKET) で開始し、0 個以上の値を U+002C (COMMA) で区切り、U+005D (RIGHT SQUARE BRACKET) で閉じる。
25.5.2.1 JSON Serialization Record
JSON Serialization Record は JSON 形式へのシリアライズを可能にするために用いられる Record 値である。
JSON Serialization Record は Table 78 に挙げるフィールドを持つ。
Table 78: JSON Serialization Record のフィールド
フィールド名
値
意味
[[ReplacerFunction]]
関数オブジェクト または undefined
オブジェクトプロパティに代替値を提供できる関数(JSON.stringify の replacer パラメータ)。
[[PropertyList]]
String の List または undefined
非配列オブジェクトをシリアライズする際に含めるプロパティ名 (JSON.stringify の replacer パラメータ)。
[[Gap]]
String
インデント単位(JSON.stringify の space パラメータ)。
[[Stack]]
Object の List
シリアライズ処理中の入れ子オブジェクト集合。循環構造検出に使用。
[[Indent]]
String
現在のインデント。
25.5.2.2 SerializeJSONProperty ( state , key , holder )
The abstract operation SerializeJSONProperty takes arguments state (a JSON Serialization Record ), key (a String), and holder (an Object) and returns 正常完了で String または undefined を含むか、または throw completion . It performs the following steps when called:
value を ? Get (holder , key ) とする。もし value が Object かまたは value が BigInt ならtoJSON を ? GetV (value , "toJSON" ) とする。もし IsCallable (toJSON ) が true ならvalue を ? Call(toJSON , value , « key ») とする。 もし state .[[ReplacerFunction]] が undefined でなければvalue を ? Call(state .[[ReplacerFunction]] , holder , « key , value ») とする。 もし value が Object ならもし value が [[NumberData]] 内部スロットを持つならvalue を ? ToNumber (value ) とする。 それ以外で [[StringData]] 内部スロットを持つならvalue を ? ToString (value ) とする。 それ以外で [[BooleanData]] 内部スロットを持つならvalue を value .[[BooleanData]] とする。 それ以外で [[BigIntData]] 内部スロットを持つならvalue を value .[[BigIntData]] とする。 もし value が null なら "null" を返す。 もし value が true なら "true" を返す。 もし value が false なら "false" を返す。 もし value が String なら QuoteJSONString (value ) を返す。 もし value が Number ならもし value が有限 なら ! ToString (value ) を返す。 "null" を返す。 もし value が BigInt なら TypeError 例外を投げる。 もし value が Object かつ IsCallable (value ) が false ならisArray を ? IsArray (value ) とする。もし isArray が true なら ? SerializeJSONArray (state , value ) を返す。 ? SerializeJSONObject (state , value ) を返す。 undefined を返す。
25.5.2.3 QuoteJSONString ( value )
The abstract operation QuoteJSONString takes argument value (a String) and returns String. value を 0x0022 (QUOTATION MARK) コード単位で囲み、その内部の特定コード単位をエスケープする。この操作は 6.1.4 に記述される通り UTF-16 エンコードされたコードポイント列として value を解釈する。 It performs the following steps when called:
product をコード単位 0x0022 (QUOTATION MARK) だけからなる文字列値とする。StringToCodePoints(value ) の各コードポイント C についてもし C が Table 79 の “Code Point” 列に記載されているならproduct を product と対応行の “Escape Sequence” 列のエスケープシーケンスの文字列連結 とする。 それ以外で C の数値が 0x0020 (SPACE) 未満か、C が前方サロゲートまたは後方サロゲートと同じ数値ならunit を C の数値と同じ数値を持つコード単位とする。product を product と UnicodeEscape (unit ) の文字列連結 とする。 それ以外product を product と UTF16EncodeCodePoint(C ) の文字列連結 とする。 product を product とコード単位 0x0022 (QUOTATION MARK) の文字列連結 とする。product を返す。
Table 79: JSON 単一文字エスケープシーケンス
Code Point
Unicode Character Name
Escape Sequence
U+0008
BACKSPACE
\b
U+0009
CHARACTER TABULATION
\t
U+000A
LINE FEED (LF)
\n
U+000C
FORM FEED (FF)
\f
U+000D
CARRIAGE RETURN (CR)
\r
U+0022
QUOTATION MARK
\"
U+005C
REVERSE SOLIDUS
\\
25.5.2.4 UnicodeEscape ( C )
The abstract operation UnicodeEscape takes argument C (a code unit) and returns String. C を Unicode エスケープシーケンスとして表現する。 It performs the following steps when called:
n を C の数値とする。事前条件: n ≤ 0xFFFF. hex を n の小文字 16 進数形式の文字列表現とする。コード単位 0x005C (REVERSE SOLIDUS), "u" , および StringPad (hex , 4, "0" , start ) の文字列連結 を返す。
25.5.2.5 SerializeJSONObject ( state , value )
The abstract operation SerializeJSONObject takes arguments state (a JSON Serialization Record ) and value (an Object) and returns 正常完了で String を含むか、または throw completion . オブジェクトをシリアライズする。 It performs the following steps when called:
もし state .[[Stack]] が value を含むなら構造が循環しているので TypeError 例外を投げる。 value を state .[[Stack]] に追加する。stepBack を state .[[Indent]] とする。state .[[Indent]] を state .[[Indent]] と state .[[Gap]] の文字列連結 とする。もし state .[[PropertyList]] が undefined でなければK を state .[[PropertyList]] とする。 それ以外K を ? EnumerableOwnProperties (value , key ) とする。 partial を新たな空 List とする。各 K の要素 P についてstrP を ? SerializeJSONProperty (state , P , value ) とする。もし strP が undefined でなければmember を QuoteJSONString (P ) とする。member を member と ":" の文字列連結 とする。もし state .[[Gap]] が空文字列でなければmember を member とコード単位 0x0020 (SPACE) の文字列連結 とする。 member を member と strP の文字列連結 とする。member を partial に追加する。 もし partial が空ならfinal を "{}" とする。 それ以外もし state .[[Gap]] が空文字列ならproperties を partial の全要素文字列をコード単位 0x002C (COMMA) で区切って連結した String 値とし(先頭や末尾には挿入しない)、final を "{" , properties , "}" の文字列連結 とする。 それ以外separator を コード単位 0x002C (COMMA), 0x000A (LINE FEED), state .[[Indent]] の文字列連結 とする。properties を partial の全要素文字列を separator で区切って連結した String 値とし(先頭/末尾には挿入しない)、final を "{" , コード単位 0x000A (LINE FEED), state .[[Indent]] , properties , コード単位 0x000A (LINE FEED), stepBack , "}" の文字列連結 とする。 state .[[Stack]] の最後の要素を除去する。state .[[Indent]] を stepBack に設定する。final を返す。
25.5.2.6 SerializeJSONArray ( state , value )
The abstract operation SerializeJSONArray takes arguments state (a JSON Serialization Record ) and value (an ECMAScript language value) and returns 正常完了で String を含むか、または throw completion . 配列をシリアライズする。 It performs the following steps when called:
もし state .[[Stack]] が value を含むなら構造が循環しているので TypeError 例外を投げる。 value を state .[[Stack]] に追加する。stepBack を state .[[Indent]] とする。state .[[Indent]] を state .[[Indent]] と state .[[Gap]] の文字列連結 とする。partial を新たな空 List とする。len を ? LengthOfArrayLike (value ) とする。index を 0 とする。index < len の間繰り返す:strP を ? SerializeJSONProperty (state , ! ToString (𝔽 (index )), value ) とする。もし strP が undefined なら"null" を partial に追加する。 それ以外strP を partial に追加する。 index を index + 1 にする。もし partial が空ならfinal を "[]" とする。 それ以外もし state .[[Gap]] が空文字列ならproperties を partial の全要素文字列をコード単位 0x002C (COMMA) で区切って連結した String 値とする。final を "[" , properties , "]" の文字列連結 とする。 それ以外separator を コード単位 0x002C (COMMA), コード単位 0x000A (LINE FEED), state .[[Indent]] の文字列連結 とする。properties を partial の全要素文字列を separator で区切って連結した String 値とする。final を "[" , コード単位 0x000A (LINE FEED), state .[[Indent]] , properties , コード単位 0x000A (LINE FEED), stepBack , "]" の文字列連結 とする。 state .[[Stack]] の最後の要素を除去する。state .[[Indent]] を stepBack に設定する。final を返す。
Note
配列の表現には +0 𝔽 (含む)から array.length
(含まない)までの要素のみが含まれる。配列インデックス でないキーのプロパティは文字列化から除外される。配列は左角括弧、要素を COMMA で区切り、右角括弧で表現される。
25.5.3 JSON [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列値 "JSON" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
26 メモリの管理
26.1 WeakRef オブジェクト
WeakRef は、ターゲットとなるオブジェクトまたはシンボルをガベージコレクションから保護せずに参照するためのオブジェクトである。ターゲットがまだガベージコレクションに回収されていない場合、WeakRef は逆参照してターゲット値へアクセスできる。
26.1.1 WeakRef コンストラクタ
WeakRef コンストラクタ は次の通り:
%WeakRef% である。
グローバルオブジェクト の "WeakRef" プロパティの初期値である。
コンストラクタ として呼び出されたとき新しい WeakRef を生成し初期化する。
関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外を投げる。
クラス定義の extends
句における値として使用できる。指定された WeakRef
の挙動を継承することを意図するサブクラスのコンストラクタ は、WeakRef.prototype
組み込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、WeakRef
コンストラクタ への super
呼び出しを含めなければならない。
26.1.1.1 WeakRef ( target )
この関数は呼び出されると次の手順を実行する:
もし NewTarget が undefined なら TypeError 例外を投げる。 もし CanBeHeldWeakly (target ) が false なら TypeError 例外を投げる。 weakRef を ? OrdinaryCreateFromConstructor (NewTarget, "%WeakRef.prototype%" , « [[WeakRefTarget]] ») とする。AddToKeptObjects (target ) を実行する。weakRef .[[WeakRefTarget]] に target を設定する。weakRef を返す。
26.1.2 WeakRef コンストラクタのプロパティ
WeakRef コンストラクタ は次の通り:
26.1.2.1 WeakRef.prototype
WeakRef.prototype
の初期値は WeakRef プロトタイプオブジェクト である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
26.1.3 WeakRef プロトタイプオブジェクトのプロパティ
WeakRef プロトタイプオブジェクト は次の通り:
%WeakRef.prototype% である。
その [[Prototype]] 内部スロットの値は %Object.prototype% である。
通常のオブジェクトである。
[[WeakRefTarget]] 内部スロットを持たない。
Normative Optional
26.1.3.1 WeakRef.prototype.constructor
WeakRef.prototype.constructor
の初期値は %WeakRef% である。
26.1.3.2 WeakRef.prototype.deref ( )
このメソッドは呼び出されると次の手順を実行する:
weakRef を this 値とする。? RequireInternalSlot (weakRef , [[WeakRefTarget]] ) を実行する。 WeakRefDeref (weakRef ) を返す。
Note
WeakRef が undefined でない target 値を返す場合、その target 値は現在の ECMAScript コードの実行が完了するまでガベージコレクションされないべきである。AddToKeptObjects 操作は読み取りの一貫性が維持されることを保証する。
let target = { foo ( ) {} };
let weakRef = new WeakRef (target);
if (weakRef.deref ()) {
weakRef.deref ().foo ();
}
上の例では、最初の deref が undefined で評価されないなら、2 回目の deref も undefined にはなり得ない。
26.1.3.3 WeakRef.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列値 "WeakRef" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
26.1.4 WeakRef 抽象操作
26.1.4.1 WeakRefDeref ( weakRef )
The abstract operation WeakRefDeref takes argument weakRef (a WeakRef ) and returns ECMAScript 言語値. It performs the following steps when called:
target を weakRef .[[WeakRefTarget]] とする。もし target が empty でないならAddToKeptObjects (target ) を実行する。target を返す。 undefined を返す。
Note
この抽象操作 は、WeakRef.prototype.deref と切り離して定義されており、ライブネスを簡潔に定義できるようにしている。
26.1.5 WeakRef インスタンスのプロパティ
WeakRef インスタンスは WeakRef プロトタイプオブジェクト からプロパティを継承する通常のオブジェクトである。WeakRef インスタンスはさらに [[WeakRefTarget]] 内部スロットを持つ。
26.2 FinalizationRegistry オブジェクト
FinalizationRegistry は、ターゲットオブジェクトおよびシンボルがガベージコレクションされた際に実行されるクリーンアップ操作の登録および登録解除を管理するオブジェクトである。
26.2.1 FinalizationRegistry コンストラクタ
FinalizationRegistry コンストラクタ は次の通り:
%FinalizationRegistry% である。
グローバルオブジェクト の "FinalizationRegistry" プロパティの初期値である。
コンストラクタ として呼び出されたとき新しい FinalizationRegistry を生成し初期化する。
関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外を投げる。
クラス定義の extends
句における値として使用できる。指定された FinalizationRegistry
の挙動を継承することを意図するサブクラスのコンストラクタ は、FinalizationRegistry.prototype
組み込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、FinalizationRegistry
コンストラクタ への super
呼び出しを含めなければならない。
26.2.1.1 FinalizationRegistry ( cleanupCallback )
この関数は呼び出されると次の手順を実行する:
もし NewTarget が undefined なら TypeError 例外を投げる。 もし IsCallable (cleanupCallback ) が false なら TypeError 例外を投げる。 finalizationRegistry を ? OrdinaryCreateFromConstructor (NewTarget, "%FinalizationRegistry.prototype%" , « [[Realm]] , [[CleanupCallback]] , [[Cells]] ») とする。fn をアクティブな関数オブジェクト とする。finalizationRegistry .[[Realm]] に fn .[[Realm]] を設定する。finalizationRegistry .[[CleanupCallback]] に HostMakeJobCallback (cleanupCallback ) を設定する。finalizationRegistry .[[Cells]] に新しい空の List を設定する。finalizationRegistry を返す。
26.2.2 FinalizationRegistry コンストラクタのプロパティ
FinalizationRegistry コンストラクタ は次の通り:
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 ] )
このメソッドは呼び出されると次の手順を実行する:
finalizationRegistry を this 値とする。? RequireInternalSlot (finalizationRegistry , [[Cells]] ) を実行する。 もし CanBeHeldWeakly (target ) が false なら TypeError 例外を投げる。 もし SameValue (target , heldValue ) が true なら TypeError 例外を投げる。 もし CanBeHeldWeakly (unregisterToken ) が false ならもし unregisterToken が undefined でないなら TypeError 例外を投げる。 unregisterToken を empty に設定する。 cell を Record { [[WeakRefTarget]] : target , [[HeldValue]] : heldValue , [[UnregisterToken]] : unregisterToken } とする。cell を finalizationRegistry .[[Cells]] に追加する。undefined を返す。
Note
本仕様のアルゴリズムと定義に基づくと、finalizationRegistry .[[Cells]] が cell を含む間、cell .[[HeldValue]] はライブである。しかしこれは必ずしも cell .[[UnregisterToken]] や cell .[[Target]] がライブであることを意味しない。例えば、あるオブジェクトをその自身を unregister token として登録しても、そのオブジェクトを永遠に生存させるわけではない。
26.2.3.3 FinalizationRegistry.prototype.unregister ( unregisterToken )
このメソッドは呼び出されると次の手順を実行する:
finalizationRegistry を this 値とする。? RequireInternalSlot (finalizationRegistry , [[Cells]] ) を実行する。 もし CanBeHeldWeakly (unregisterToken ) が false なら TypeError 例外を投げる。 removed を false とする。finalizationRegistry .[[Cells]] の各 Record { [[WeakRefTarget]] , [[HeldValue]] , [[UnregisterToken]] } である cell についてもし cell .[[UnregisterToken]] が empty でなく、かつ SameValue (cell .[[UnregisterToken]] , unregisterToken ) が true ならcell を finalizationRegistry .[[Cells]] から除去する。removed を true に設定する。 removed を返す。
26.2.3.4 FinalizationRegistry.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列値 "FinalizationRegistry" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
26.2.4 FinalizationRegistry インスタンスのプロパティ
FinalizationRegistry インスタンスは FinalizationRegistry プロトタイプオブジェクト からプロパティを継承する通常のオブジェクトである。FinalizationRegistry インスタンスはさらに [[Cells]] および [[CleanupCallback]] 内部スロットを持つ。
27 制御抽象オブジェクト (Control Abstraction Objects)
27.1 反復 (Iteration)
27.1.1 共通の反復インタフェース (Common Iteration Interfaces)
インタフェースとは、対応する値が特定の仕様に適合するプロパティキー の集合である。インタフェースの仕様で記述されたすべてのプロパティを提供する任意のオブジェクトは、そのインタフェースに適合 する。インタフェースは別個のオブジェクトとして表現されない。そのインタフェースに適合する、個別に実装された多数のオブジェクトが存在し得る。個々のオブジェクトは複数のインタフェースに適合し得る。
27.1.1.1 Iterable インタフェース (The Iterable Interface)
iterable インタフェース は Table 80 に記述されるプロパティを含む:
Table 80: Iterable インタフェース 必須プロパティ (Iterable Interface Required Properties)
プロパティ (Property)
値 (Value)
要件 (Requirements)
%Symbol.iterator%
イテレータオブジェクトを返す関数 (a function that returns an iterator object )
返されるオブジェクトは iterator インタフェース に適合しなければならない (The returned object must conform to the iterator interface).
27.1.1.2 Iterator インタフェース (The Iterator Interface)
iterator インタフェース を実装するオブジェクトは Table 81 のプロパティを含まなければならない。そのようなオブジェクトは Table 82 のプロパティを実装してもよい。
Table 81: Iterator インタフェース 必須プロパティ (Iterator Interface Required Properties)
プロパティ (Property)
値 (Value)
要件 (Requirements)
"next"
IteratorResult オブジェクトを返す関数 (a function that returns an IteratorResult object )
返されるオブジェクトは IteratorResult インタフェース に適合しなければならない。あるイテレータの next
メソッドへの以前の呼び出しが "done" プロパティが true の IteratorResult オブジェクトを返した場合、そのオブジェクトへの以後のすべての next
呼び出しも "done" プロパティが true の IteratorResult オブジェクトを返すべきである。ただしこの要件は強制されない。
Note 1
next
関数に引数を渡すことができるが、その解釈と妥当性は対象イテレータに依存する。for-of 文および他の一般的なイテレータ利用者は引数を渡さないため、そのように利用されることを想定するイテレータオブジェクトは引数なしで呼ばれる状況に対処できなければならない。
Table 82: Iterator インタフェース 任意プロパティ (Iterator Interface Optional Properties)
プロパティ (Property)
値 (Value)
要件 (Requirements)
"return"
IteratorResult オブジェクトを返す関数 (a function that returns an IteratorResult object )
返されるオブジェクトは IteratorResult インタフェース に適合しなければならない。このメソッドの呼び出しは、呼び出し側がこれ以上そのイテレータの next
メソッドを呼び出す意図がないことをイテレータオブジェクトへ通知する。返される IteratorResult オブジェクトは典型的に "done" プロパティが true の値を持ち、return
メソッドの引数として渡された値を持つ "value" プロパティを持つ。しかしこの要件は強制されない。
"throw"
IteratorResult オブジェクトを返す関数 (a function that returns an IteratorResult object )
返されるオブジェクトは IteratorResult インタフェース に適合しなければならない。このメソッドの呼び出しは、呼び出し側がエラー状態を検出したことをイテレータオブジェクトに通知する。引数はエラー状態を識別するために用いることができ、典型的には例外オブジェクトである。典型的な応答はその引数値を throw
することである。メソッドが throw
しない場合、返される IteratorResult オブジェクトは通常 "done" プロパティが true の値を持つ。
Note 2
通常これらのメソッドの呼び出し側は、呼び出す前に存在確認を行うべきである。for
-of
、yield*
、配列の分割代入などの特定の ECMAScript 言語機能は存在確認後にこれらを呼び出す。引数として iterable オブジェクトを受け取る多くの ECMAScript ライブラリ関数も条件付きでそれらを呼び出す。
27.1.1.3 Async Iterable インタフェース (The Async Iterable Interface)
async iterable インタフェース は Table 83 に記述されるプロパティを含む:
Table 83: Async Iterable インタフェース 必須プロパティ (Async Iterable Interface Required Properties)
27.1.1.4 Async Iterator インタフェース (The Async Iterator Interface)
async iterator インタフェース を実装するオブジェクトは Table 84 のプロパティを含まなければならない。そのようなオブジェクトは Table 85 のプロパティを実装してもよい。
Table 84: Async Iterator インタフェース 必須プロパティ (Async Iterator Interface Required Properties)
プロパティ (Property)
値 (Value)
要件 (Requirements)
"next"
IteratorResult オブジェクトの promise を返す関数 (a function that returns a promise for an IteratorResult object )
返される promise は、履行時に IteratorResult インタフェース に適合するオブジェクトで履行されなければならない。ある async イテレータの next
メソッドへの以前の呼び出しが "done" プロパティが true の IteratorResult オブジェクトの promise を返した場合、そのオブジェクトへの以後のすべての next
呼び出しも "done" プロパティが true の IteratorResult オブジェクトの promise を返すべきである。ただしこの要件は強制されない。
さらに、履行値となる IteratorResult オブジェクトの "value" プロパティの値は promise(または「thenable」)でないべきである。これも強制されない。
Note 1
next
関数には引数を渡せるが、その解釈と妥当性は対象となる async イテレータに依存する。for
-await
-of
文および他の一般的な async イテレータ利用者は引数を渡さないため、そのような利用を想定する async イテレータオブジェクトは引数なし呼び出しに備える必要がある。
Table 85: Async Iterator インタフェース 任意プロパティ (Async Iterator Interface Optional Properties)
プロパティ (Property)
値 (Value)
要件 (Requirements)
"return"
IteratorResult オブジェクトの promise を返す関数 (a function that returns a promise for an IteratorResult object )
返される promise は履行時に IteratorResult インタフェース に適合するオブジェクトで履行されなければならない。このメソッドの呼び出しは、呼び出し側がその async イテレータの next
メソッドをこれ以上呼び出す意図がないことを通知する。返される promise は典型的に "done" プロパティが true の IteratorResult オブジェクトで履行され、かつ return
メソッドに渡された引数の値を持つ "value" プロパティを持つ。ただしこの要件は強制されない。
さらに、履行値となる IteratorResult オブジェクトの "value" プロパティの値は promise(または「thenable」)でないべきである。引数値が典型的な方法で使用される場合、もしそれが拒否された promise なら同じ理由で拒否された promise を返すべきであり、履行された promise ならその履行値を返される promise の IteratorResult オブジェクトの "value" プロパティとして使用すべきである。ただしこれらの要件も強制されない。
"throw"
IteratorResult オブジェクトの promise を返す関数 (a function that returns a promise for an IteratorResult object )
返される promise は履行時に IteratorResult インタフェース に適合するオブジェクトで履行されなければならない。このメソッド呼び出しは、呼び出し側がエラー状態を検出したことを async イテレータオブジェクトに通知する。引数はエラー状態を識別するために使用でき、典型的には例外オブジェクトである。典型的な応答は、その引数値で拒否される promise を返すことである。
返される promise が履行された場合、履行値である IteratorResult オブジェクトは通常 "done" プロパティが true の値を持つ。さらに、その "value" プロパティの値は promise(または「thenable」)でないべきだが、この要件は強制されない。
Note 2
通常これらのメソッドの呼び出し側は存在確認を行ってから呼び出すべきである。for
-await
-of
や yield*
を含む特定の ECMAScript 言語機能は存在確認後にこれらを呼び出す。
27.1.1.5 IteratorResult インタフェース (The IteratorResult Interface)
IteratorResult インタフェース は Table 86 に列挙されるプロパティを含む:
Table 86: IteratorResult インタフェース プロパティ (IteratorResult Interface Properties)
プロパティ (Property)
値 (Value)
要件 (Requirements)
"done"
真偽値 (a Boolean)
これはイテレータの next
メソッド呼び出しの結果状態である。イテレータの終端に到達した場合 "done" は true 。終端でない場合 "done" は false で値が利用可能。"done" プロパティ(自身または継承)が存在しない場合、その値は false と見なされる。
"value"
ECMAScript 言語値 (an ECMAScript language value)
done が false の場合、これは現在の反復要素の値。done が true の場合、(提供されたなら)イテレータの戻り値。イテレータに戻り値がない場合 "value" は undefined 。その場合、明示的な "value" プロパティを継承していなければ、適合オブジェクトから "value" プロパティを省いてもよい。
27.1.2 イテレータヘルパーオブジェクト (Iterator Helper Objects)
Iterator Helper オブジェクト は、特定のソースイテレータオブジェクトの遅延変換を表す通常のオブジェクトである。Iterator Helper オブジェクト用の名前付きコンストラクタ はない。代わりに、Iterator Helper オブジェクトは Iterator インスタンスオブジェクトの特定メソッド呼び出しによって生成される。
27.1.2.1 %IteratorHelperPrototype% オブジェクト (The %IteratorHelperPrototype% Object)
%IteratorHelperPrototype% オブジェクト:
27.1.2.1.1 %IteratorHelperPrototype%.next ( )
? GeneratorResume (this value, undefined , "Iterator Helper" ) を返す。
27.1.2.1.2 %IteratorHelperPrototype%.return ( )
O を this 値とする。? RequireInternalSlot (O , [[UnderlyingIterator]] ) を実行する。 事前条件: O は [[GeneratorState]] 内部スロットを持つ。 もし O .[[GeneratorState]] が suspended-start ならO .[[GeneratorState]] を completed に設定する。注: 一度 generator が completed 状態になると離脱せず、その関連実行コンテキストは再開されない。O に関連する任意の実行状態はここで破棄できる。 ? IteratorClose (O .[[UnderlyingIterator]] , NormalCompletion (unused )) を実行する。 CreateIteratorResultObject (undefined , true ) を返す。 C を ReturnCompletion (undefined ) とする。? GeneratorResumeAbrupt (O , C , "Iterator Helper" ) を返す。
27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列値 "Iterator Helper" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.1.3 イテレータオブジェクト (Iterator Objects)
27.1.3.1 Iterator コンストラクタ (The Iterator Constructor)
Iterator コンストラクタ :
%Iterator% である。
グローバルオブジェクト の "Iterator" プロパティの初期値である。
サブクラス化可能として設計されている。クラス定義の extends 句の値として使用できる。
27.1.3.1.1 Iterator ( )
この関数は呼び出されると次を実行する:
もし NewTarget が undefined またはアクティブな関数オブジェクト のいずれかなら TypeError 例外を投げる。 ? OrdinaryCreateFromConstructor (NewTarget, "%Iterator.prototype%" ) を返す。
27.1.3.2 Iterator コンストラクタのプロパティ (Properties of the Iterator Constructor)
Iterator コンストラクタ :
27.1.3.2.1 Iterator.from ( O )
iteratorRecord を ? GetIteratorFlattenable (O , iterate-string-primitives ) とする。hasInstance を ? OrdinaryHasInstance (%Iterator% , iteratorRecord .[[Iterator]] ) とする。もし hasInstance が true ならiteratorRecord .[[Iterator]] を返す。 wrapper を OrdinaryObjectCreate (%WrapForValidIteratorPrototype% , « [[Iterated]] ») とする。wrapper .[[Iterated]] に iteratorRecord を設定する。wrapper を返す。
27.1.3.2.1.1 %WrapForValidIteratorPrototype% オブジェクト (The %WrapForValidIteratorPrototype% Object)
%WrapForValidIteratorPrototype% オブジェクト:
27.1.3.2.1.1.1 %WrapForValidIteratorPrototype%.next ( )
O を this 値とする。? RequireInternalSlot (O , [[Iterated]] ) を実行する。 iteratorRecord を O .[[Iterated]] とする。? Call(iteratorRecord .[[NextMethod]] , iteratorRecord .[[Iterator]] ) を返す。
27.1.3.2.1.1.2 %WrapForValidIteratorPrototype%.return ( )
O を this 値とする。? RequireInternalSlot (O , [[Iterated]] ) を実行する。 iterator を O .[[Iterated]] .[[Iterator]] とする。事前条件: iterator は Object。 returnMethod を ? GetMethod (iterator , "return" ) とする。もし returnMethod が undefined ならCreateIteratorResultObject (undefined , true ) を返す。 ? Call(returnMethod , iterator ) を返す。
27.1.3.2.2 Iterator.prototype
Iterator.prototype の初期値は Iterator プロトタイプオブジェクト である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
27.1.4 Iterator プロトタイプオブジェクトのプロパティ (Properties of the Iterator Prototype Object)
Iterator プロトタイプオブジェクト :
Note
この仕様で iterator インタフェース を実装するすべてのオブジェクトは %Iterator.prototype% を継承する。ECMAScript コードは %Iterator.prototype% を継承するオブジェクトを定義することもできる。%Iterator.prototype% はすべてのイテレータオブジェクトに適用可能な追加メソッドを追加できる場所を提供する。
次の式は ECMAScript コードが %Iterator.prototype% オブジェクトにアクセスする一つの方法である:
Object .getPrototypeOf (Object .getPrototypeOf ([][Symbol .iterator ]()))
27.1.4.1 Iterator.prototype.constructor
Iterator.prototype.constructor
は属性 { [[Enumerable]] : false , [[Configurable]] : true } を持つアクセスプロパティである。[[Get]] および [[Set]] 属性は次のように定義される:
27.1.4.1.1 get Iterator.prototype.constructor
[[Get]] 属性の値は引数を必要としない組み込み関数であり、呼び出されると次を実行する:
%Iterator% を返す。
27.1.4.1.2 set Iterator.prototype.constructor
[[Set]] 属性の値は引数 v を取る組み込み関数であり、呼び出されると次を実行する:
? SetterThatIgnoresPrototypeProperties (this value, %Iterator.prototype% , "constructor" , v ) を実行する。 undefined を返す。
Note
ほとんどの組み込みプロトタイプ上の "constructor" プロパティと異なり、Web 互換性の理由からこのプロパティはアクセサでなければならない。
27.1.4.2 Iterator.prototype.drop ( limit )
このメソッドは呼び出されると次を実行する:
O を this 値とする。もし O が Object でなければ TypeError 例外を投げる。 iterated を Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false } とする。numLimit を Completion (ToNumber (limit )) とする。IfAbruptCloseIterator (numLimit , iterated )。もし numLimit が NaN ならerror を ThrowCompletion (新しく生成された RangeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 integerLimit を ! ToIntegerOrInfinity (numLimit ) とする。もし integerLimit < 0 ならerror を ThrowCompletion (新しく生成された RangeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (O ) に設定する。closure を、引数なしで iterated と integerLimit を捕捉し、呼び出されると次を実行する新たな Abstract Closure とする:remaining を integerLimit とする。remaining > 0 の間繰り返す,もし remaining ≠ +∞ ならremaining を remaining - 1 にする。 next を ? IteratorStep (iterated ) とする。もし next が done なら ReturnCompletion (undefined ) を返す。 繰り返す,value を ? IteratorStepValue (iterated ) とする。もし value が done なら ReturnCompletion (undefined ) を返す。 completion を Completion (Yield (value )) とする。IfAbruptCloseIterator (completion , iterated )。 result を CreateIteratorFromClosure (closure , "Iterator Helper" , %IteratorHelperPrototype% , « [[UnderlyingIterator]] ») とする。result .[[UnderlyingIterator]] に iterated を設定する。result を返す。
27.1.4.3 Iterator.prototype.every ( predicate )
このメソッドは呼び出されると次を実行する:
O を this 値とする。もし O が Object でなければ TypeError 例外を投げる。 iterated を Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false } とする。もし IsCallable (predicate ) が false ならerror を ThrowCompletion (新しく生成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (O ) に設定する。counter を 0 とする。繰り返す,value を ? IteratorStepValue (iterated ) とする。もし value が done なら true を返す。 result を Completion (Call(predicate , undefined , « value , 𝔽 (counter ) »)) とする。IfAbruptCloseIterator (result , iterated )。もし ToBoolean (result ) が false なら ? IteratorClose (iterated , NormalCompletion (false )) を返す。 counter を counter + 1 にする。
27.1.4.4 Iterator.prototype.filter ( predicate )
このメソッドは呼び出されると次を実行する:
O を this 値とする。もし O が Object でなければ TypeError 例外を投げる。 iterated を Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false } とする。もし IsCallable (predicate ) が false ならerror を ThrowCompletion (新しく生成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (O ) に設定する。closure を、引数なしで iterated と predicate を捕捉し呼び出されると次を実行する新たな Abstract Closure とする:counter を 0 とする。繰り返す,value を ? IteratorStepValue (iterated ) とする。もし value が done なら ReturnCompletion (undefined ) を返す。 selected を Completion (Call(predicate , undefined , « value , 𝔽 (counter ) »)) とする。IfAbruptCloseIterator (selected , iterated )。もし ToBoolean (selected ) が true ならcompletion を Completion (Yield (value )) とする。IfAbruptCloseIterator (completion , iterated )。 counter を counter + 1 にする。 result を CreateIteratorFromClosure (closure , "Iterator Helper" , %IteratorHelperPrototype% , « [[UnderlyingIterator]] ») とする。result .[[UnderlyingIterator]] に iterated を設定する。result を返す。
27.1.4.5 Iterator.prototype.find ( predicate )
このメソッドは呼び出されると次を実行する:
O を this 値とする。もし O が Object でなければ TypeError 例外を投げる。 iterated を Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false } とする。もし IsCallable (predicate ) が false ならerror を ThrowCompletion (新しく生成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (O ) に設定する。counter を 0 とする。繰り返す,value を ? IteratorStepValue (iterated ) とする。もし value が done なら undefined を返す。 result を Completion (Call(predicate , undefined , « value , 𝔽 (counter ) »)) とする。IfAbruptCloseIterator (result , iterated )。もし ToBoolean (result ) が true なら ? IteratorClose (iterated , NormalCompletion (value )) を返す。 counter を counter + 1 にする。
27.1.4.6 Iterator.prototype.flatMap ( mapper )
このメソッドは呼び出されると次を実行する:
O を this 値とする。もし O が Object でなければ TypeError 例外を投げる。 iterated を Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false } とする。もし IsCallable (mapper ) が false ならerror を ThrowCompletion (新しく生成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (O ) に設定する。closure を、引数なしで iterated と mapper を捕捉し呼び出されると次を実行する新たな Abstract Closure とする:counter を 0 とする。繰り返す,value を ? IteratorStepValue (iterated ) とする。もし value が done なら ReturnCompletion (undefined ) を返す。 mapped を Completion (Call(mapper , undefined , « value , 𝔽 (counter ) »)) とする。IfAbruptCloseIterator (mapped , iterated )。innerIterator を Completion (GetIteratorFlattenable (mapped , reject-primitives )) とする。IfAbruptCloseIterator (innerIterator , iterated )。innerAlive を true とする。innerAlive が true の間繰り返す,innerValue を Completion (IteratorStepValue (innerIterator )) とする。IfAbruptCloseIterator (innerValue , iterated )。もし innerValue が done ならinnerAlive を false に設定する。 それ以外completion を Completion (Yield (innerValue )) とする。もし completion が abrupt completion ならbackupCompletion を Completion (IteratorClose (innerIterator , completion )) とする。IfAbruptCloseIterator (backupCompletion , iterated )。? IteratorClose (iterated , completion ) を返す。 counter を counter + 1 にする。 result を CreateIteratorFromClosure (closure , "Iterator Helper" , %IteratorHelperPrototype% , « [[UnderlyingIterator]] ») とする。result .[[UnderlyingIterator]] に iterated を設定する。result を返す。
27.1.4.7 Iterator.prototype.forEach ( procedure )
このメソッドは呼び出されると次を実行する:
O を this 値とする。もし O が Object でなければ TypeError 例外を投げる。 iterated を Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false } とする。もし IsCallable (procedure ) が false ならerror を ThrowCompletion (新しく生成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (O ) に設定する。counter を 0 とする。繰り返す,value を ? IteratorStepValue (iterated ) とする。もし value が done なら undefined を返す。 result を Completion (Call(procedure , undefined , « value , 𝔽 (counter ) »)) とする。IfAbruptCloseIterator (result , iterated )。counter を counter + 1 にする。
27.1.4.8 Iterator.prototype.map ( mapper )
このメソッドは呼び出されると次を実行する:
O を this 値とする。もし O が Object でなければ TypeError 例外を投げる。 iterated を Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false } とする。もし IsCallable (mapper ) が false ならerror を ThrowCompletion (新しく生成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (O ) に設定する。closure を、引数なしで iterated と mapper を捕捉し呼び出されると次を実行する新たな Abstract Closure とする:counter を 0 とする。繰り返す,value を ? IteratorStepValue (iterated ) とする。もし value が done なら ReturnCompletion (undefined ) を返す。 mapped を Completion (Call(mapper , undefined , « value , 𝔽 (counter ) »)) とする。IfAbruptCloseIterator (mapped , iterated )。completion を Completion (Yield (mapped )) とする。IfAbruptCloseIterator (completion , iterated )。counter を counter + 1 にする。 result を CreateIteratorFromClosure (closure , "Iterator Helper" , %IteratorHelperPrototype% , « [[UnderlyingIterator]] ») とする。result .[[UnderlyingIterator]] に iterated を設定する。result を返す。
27.1.4.9 Iterator.prototype.reduce ( reducer [ , initialValue ] )
このメソッドは呼び出されると次を実行する:
O を this 値とする。もし O が Object でなければ TypeError 例外を投げる。 iterated を Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false } とする。もし IsCallable (reducer ) が false ならerror を ThrowCompletion (新しく生成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (O ) に設定する。もし initialValue が存在しなければaccumulator を ? IteratorStepValue (iterated ) とする。もし accumulator が done なら TypeError 例外を投げる。 counter を 1 とする。 それ以外accumulator を initialValue とする。counter を 0 とする。 繰り返す,value を ? IteratorStepValue (iterated ) とする。もし value が done なら accumulator を返す。 result を Completion (Call(reducer , undefined , « accumulator , value , 𝔽 (counter ) »)) とする。IfAbruptCloseIterator (result , iterated )。accumulator を result に設定する。counter を counter + 1 にする。
27.1.4.10 Iterator.prototype.some ( predicate )
このメソッドは呼び出されると次を実行する:
O を this 値とする。もし O が Object でなければ TypeError 例外を投げる。 iterated を Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false } とする。もし IsCallable (predicate ) が false ならerror を ThrowCompletion (新しく生成された TypeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (O ) に設定する。counter を 0 とする。繰り返す,value を ? IteratorStepValue (iterated ) とする。もし value が done なら false を返す。 result を Completion (Call(predicate , undefined , « value , 𝔽 (counter ) »)) とする。IfAbruptCloseIterator (result , iterated )。もし ToBoolean (result ) が true なら ? IteratorClose (iterated , NormalCompletion (true )) を返す。 counter を counter + 1 にする。
27.1.4.11 Iterator.prototype.take ( limit )
このメソッドは呼び出されると次を実行する:
O を this 値とする。もし O が Object でなければ TypeError 例外を投げる。 iterated を Iterator Record { [[Iterator]] : O , [[NextMethod]] : undefined , [[Done]] : false } とする。numLimit を Completion (ToNumber (limit )) とする。IfAbruptCloseIterator (numLimit , iterated )。もし numLimit が NaN ならerror を ThrowCompletion (新しく生成された RangeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 integerLimit を ! ToIntegerOrInfinity (numLimit ) とする。もし integerLimit < 0 ならerror を ThrowCompletion (新しく生成された RangeError オブジェクト) とする。? IteratorClose (iterated , error ) を返す。 iterated を ? GetIteratorDirect (O ) に設定する。closure を、引数なしで iterated と integerLimit を捕捉し呼び出されると次を実行する新たな Abstract Closure とする:remaining を integerLimit とする。繰り返す,もし remaining = 0 なら? IteratorClose (iterated , ReturnCompletion (undefined )) を返す。 もし remaining ≠ +∞ ならremaining を remaining - 1 にする。 value を ? IteratorStepValue (iterated ) とする。もし value が done なら ReturnCompletion (undefined ) を返す。 completion を Completion (Yield (value )) とする。IfAbruptCloseIterator (completion , iterated )。 result を CreateIteratorFromClosure (closure , "Iterator Helper" , %IteratorHelperPrototype% , « [[UnderlyingIterator]] ») とする。result .[[UnderlyingIterator]] に iterated を設定する。result を返す。
27.1.4.12 Iterator.prototype.toArray ( )
このメソッドは呼び出されると次を実行する:
O を this 値とする。もし O が Object でなければ TypeError 例外を投げる。 iterated を ? GetIteratorDirect (O ) とする。items を新しい空の List とする。繰り返す,value を ? IteratorStepValue (iterated ) とする。もし value が done なら CreateArrayFromList (items ) を返す。 value を items に追加する。
27.1.4.13 Iterator.prototype [ %Symbol.iterator% ] ( )
この関数は呼び出されると次を実行する:
this 値を返す。
この関数の "name" プロパティの値は "[Symbol.iterator]" である。
27.1.4.14 Iterator.prototype [ %Symbol.toStringTag% ]
Iterator.prototype[%Symbol.toStringTag%]
は属性 { [[Enumerable]] : false , [[Configurable]] : true } を持つアクセスプロパティである。[[Get]] および [[Set]] 属性は次のように定義される:
27.1.4.14.1 get Iterator.prototype [ %Symbol.toStringTag% ]
[[Get]] 属性の値は引数を必要としない組み込み関数であり、呼び出されると次を実行する:
"Iterator" を返す。
27.1.4.14.2 set Iterator.prototype [ %Symbol.toStringTag% ]
[[Set]] 属性の値は引数 v を取る組み込み関数であり、呼び出されると次を実行する:
? SetterThatIgnoresPrototypeProperties (this value, %Iterator.prototype% , %Symbol.toStringTag% , v ) を実行する。 undefined を返す。
Note
ほとんどの組み込みプロトタイプ上の %Symbol.toStringTag% プロパティと異なり、Web 互換性の理由からこのプロパティはアクセサでなければならない。
27.1.5 %AsyncIteratorPrototype% オブジェクト (The %AsyncIteratorPrototype% Object)
%AsyncIteratorPrototype% オブジェクト:
Note
この仕様で async iterator インタフェース を実装するすべてのオブジェクトは %AsyncIteratorPrototype% を継承する。ECMAScript コードは %AsyncIteratorPrototype% を継承するオブジェクトを定義することもできる。%AsyncIteratorPrototype% オブジェクトはすべての async イテレータオブジェクトに適用可能な追加メソッドを追加できる場所を提供する。
27.1.5.1 %AsyncIteratorPrototype% [ %Symbol.asyncIterator% ] ( )
この関数は呼び出されると次を実行する:
this 値を返す。
この関数の "name" プロパティの値は "[Symbol.asyncIterator]" である。
27.1.6 同期イテレータからの非同期イテレータオブジェクト (Async-from-Sync Iterator Objects)
Async-from-Sync Iterator オブジェクト は特定の同期イテレータを適応させる async イテレータである。Async-from-Sync Iterator オブジェクトは ECMAScript コードから直接アクセスされることはない。名前付きコンストラクタ は存在せず、必要に応じて抽象操作 CreateAsyncFromSyncIterator によって生成される。
27.1.6.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )
The abstract operation CreateAsyncFromSyncIterator takes argument syncIteratorRecord (an Iterator Record ) and returns Iterator Record . 同期の Iterator Record から async の Iterator Record を生成するために使用される。 It performs the following steps when called:
asyncIterator を OrdinaryObjectCreate (%AsyncFromSyncIteratorPrototype% , « [[SyncIteratorRecord]] ») とする。asyncIterator .[[SyncIteratorRecord]] に syncIteratorRecord を設定する。nextMethod を ! Get (asyncIterator , "next" ) とする。iteratorRecord を Iterator Record { [[Iterator]] : asyncIterator , [[NextMethod]] : nextMethod , [[Done]] : false } とする。iteratorRecord を返す。
27.1.6.2 %AsyncFromSyncIteratorPrototype% オブジェクト (The %AsyncFromSyncIteratorPrototype% Object)
%AsyncFromSyncIteratorPrototype% オブジェクト:
27.1.6.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )
O を this 値とする。事前条件: O は [[SyncIteratorRecord]] 内部スロットを持つ Object。 promiseCapability を ! NewPromiseCapability (%Promise% ) とする。syncIteratorRecord を O .[[SyncIteratorRecord]] とする。もし value が存在すればresult を Completion (IteratorNext(syncIteratorRecord , value )) とする。 それ以外result を Completion (IteratorNext(syncIteratorRecord )) とする。 IfAbruptRejectPromise (result , promiseCapability )。AsyncFromSyncIteratorContinuation (result , promiseCapability , syncIteratorRecord , true ) を返す。
27.1.6.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )
O を this 値とする。事前条件: O は [[SyncIteratorRecord]] 内部スロットを持つ Object。 promiseCapability を ! NewPromiseCapability (%Promise% ) とする。syncIteratorRecord を O .[[SyncIteratorRecord]] とする。syncIterator を syncIteratorRecord .[[Iterator]] とする。return を Completion (GetMethod (syncIterator , "return" )) とする。IfAbruptRejectPromise (return , promiseCapability )。もし return が undefined ならiteratorResult を CreateIteratorResultObject (value , true ) とする。! Call (promiseCapability .[[Resolve]] , undefined , « iteratorResult ») を実行する。 promiseCapability .[[Promise]] を返す。 もし value が存在すればresult を Completion (Call(return , syncIterator , « value »)) とする。 それ以外result を Completion (Call(return , syncIterator )) とする。 IfAbruptRejectPromise (result , promiseCapability )。もし result が Object でなければ! Call(promiseCapability .[[Reject]] , undefined , « 新しく生成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。 AsyncFromSyncIteratorContinuation (result , promiseCapability , syncIteratorRecord , false ) を返す。
27.1.6.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [ value ] )
Note
O を this 値とする。事前条件: O は [[SyncIteratorRecord]] 内部スロットを持つ Object。 promiseCapability を ! NewPromiseCapability (%Promise% ) とする。syncIteratorRecord を O .[[SyncIteratorRecord]] とする。syncIterator を syncIteratorRecord .[[Iterator]] とする。throw を Completion (GetMethod (syncIterator , "throw" )) とする。IfAbruptRejectPromise (throw , promiseCapability )。もし throw が undefined なら注: syncIterator に throw
メソッドがない場合、capability を拒否する前にクリーンアップの機会を与えるため閉じる。 closeCompletion を NormalCompletion (empty ) とする。result を Completion (IteratorClose (syncIteratorRecord , closeCompletion )) とする。IfAbruptRejectPromise (result , promiseCapability )。注: 次のステップはプロトコル違反(syncIterator に throw
メソッドがない)を示す TypeError を投げる。 注: syncIterator の close が例外を投げない場合、その結果は無視される(拒否された promise を生成しても)。 ! Call(promiseCapability .[[Reject]] , undefined , « 新しく生成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。 もし value が存在すればresult を Completion (Call(throw , syncIterator , « value »)) とする。 それ以外result を Completion (Call(throw , syncIterator )) とする。 IfAbruptRejectPromise (result , promiseCapability )。もし result が Object でなければ! Call(promiseCapability .[[Reject]] , undefined , « 新しく生成された TypeError オブジェクト ») を実行する。 promiseCapability .[[Promise]] を返す。 AsyncFromSyncIteratorContinuation (result , promiseCapability , syncIteratorRecord , true ) を返す。
27.1.6.3 Async-from-Sync Iterator インスタンスのプロパティ (Properties of Async-from-Sync Iterator Instances)
Async-from-Sync Iterator インスタンスは %AsyncFromSyncIteratorPrototype% 組込みオブジェクトからプロパティを継承する通常のオブジェクトである。これらインスタンスは Table 87 に列挙される内部スロットを持って初期化される。
Table 87: Async-from-Sync Iterator インスタンスの内部スロット (Internal Slots of Async-from-Sync Iterator Instances)
内部スロット (Internal Slot)
型 (Type)
説明 (Description)
[[SyncIteratorRecord]]
Iterator Record
適応対象となる元の同期イテレータを表す (Represents the original synchronous iterator which is being adapted).
27.1.6.4 AsyncFromSyncIteratorContinuation ( result , promiseCapability , syncIteratorRecord , closeOnRejection )
The abstract operation AsyncFromSyncIteratorContinuation takes arguments result (an Object), promiseCapability (a PromiseCapability Record for an intrinsic %Promise% ), syncIteratorRecord (an Iterator Record ), and closeOnRejection (a Boolean) and returns Promise. It performs the following steps when called:
注: promiseCapability は組込み %Promise% から派生するので、以下の IfAbruptRejectPromise 使用に伴う promiseCapability .[[Reject]] への呼び出しは throw しないことが保証される。 done を Completion (IteratorComplete (result )) とする。IfAbruptRejectPromise (done , promiseCapability )。value を Completion (IteratorValue (result )) とする。IfAbruptRejectPromise (value , promiseCapability )。valueWrapper を Completion (PromiseResolve (%Promise% , value )) とする。もし valueWrapper が abrupt completion で、done が false , かつ closeOnRejection が true ならvalueWrapper を Completion (IteratorClose (syncIteratorRecord , valueWrapper )) とする。 IfAbruptRejectPromise (valueWrapper , promiseCapability )。unwrap をパラメータ (v ) を持ち done を捕捉し呼び出されると次を実行する新たな Abstract Closure とし、CreateIteratorResultObject (v , done ) を返す。onFulfilled を CreateBuiltinFunction (unwrap , 1, "" , « ») とする。注: onFulfilled は IteratorResult オブジェクトの "value" プロパティを処理する際、その値が promise であれば待機し、新たな「unwrapped」 IteratorResult オブジェクトとして再パッケージするために使用される。 もし done が true または closeOnRejection が false ならonRejected を undefined とする。 それ以外closeIterator をパラメータ (error ) を持ち syncIteratorRecord を捕捉し呼び出されると ? IteratorClose (syncIteratorRecord , ThrowCompletion (error )) を返す新たな Abstract Closure とする。onRejected を CreateBuiltinFunction (closeIterator , 1, "" , « ») とする。注: onRejected は IteratorResult オブジェクトが返す "value" プロパティが拒否された promise である場合に Iterator を close するために使用される。 PerformPromiseThen (valueWrapper , onFulfilled , onRejected , promiseCapability ) を実行する。promiseCapability .[[Promise]] を返す。
27.2 Promise オブジェクト
Promise は、延期された(かつ非同期である可能性のある)計算の最終的な結果に対するプレースホルダーとして使われるオブジェクトである。
任意の Promise は互いに排他的な 3 つの状態のいずれかにある: fulfilled (履行済)、rejected (拒否済)、pending (保留):
Promise p
が fulfilled であるとは、p.then(f, r)
が直ちに関数 f
を呼び出す Job をキューに入れる場合をいう。
Promise p
が rejected であるとは、p.then(f, r)
が直ちに関数 r
を呼び出す Job をキューに入れる場合をいう。
Promise が pending であるとは、それが fulfilled でも rejected でもない場合をいう。
Promise が settled (確定)であるとは、それが pending でない(すなわち fulfilled か rejected である)ことをいう。
Promise が resolved であるとは、それが settled であるか、他の Promise の状態に一致するよう「ロックイン」された場合をいう。resolved な Promise をさらに resolve あるいは reject しようとしても効果はない。Promise が resolved でない場合、それは unresolved である。unresolved な Promise は常に pending 状態である。resolved な Promise は pending / fulfilled / rejected のいずれにもなり得る。
27.2.1 Promise の抽象操作
27.2.1.1 PromiseCapability レコード
PromiseCapability Record は、ある Promise(または Promise 風オブジェクト)と、それを解決または拒否できる関数をカプセル化するために用いられる Record 値である。PromiseCapability Record は抽象操作 NewPromiseCapability によって生成される。
PromiseCapability Record は Table 88 に列挙するフィールドを持つ。
Table 88: PromiseCapability Record フィールド
フィールド名
値
意味
[[Promise]]
Object
Promise として使用可能なオブジェクト。
[[Resolve]]
関数オブジェクト
対象の Promise を解決するために使われる関数。
[[Reject]]
関数オブジェクト
対象の Promise を拒否するために使われる関数。
27.2.1.1.1 IfAbruptRejectPromise ( value , capability )
IfAbruptRejectPromise は PromiseCapability Record を用いるアルゴリズム手順列の短縮記法である。次の形式のアルゴリズム手順:
IfAbruptRejectPromise (value , capability ).
は次と同じ意味である:
事前条件: value は Completion Record である。 もし value が abrupt completion なら? Call(capability .[[Reject]] , undefined , « value .[[Value]] ») を実行する。 capability .[[Promise]] を返す。 それ以外value を ! value に設定する。
27.2.1.2 PromiseReaction レコード
PromiseReaction Record は、ある Promise が特定の値で解決または拒否されたときにどのように反応すべきかを格納するための Record 値である。PromiseReaction Record は抽象操作 PerformPromiseThen によって生成され、NewPromiseReactionJob が返す Abstract Closure によって使用される。
PromiseReaction Record は Table 89 に列挙するフィールドを持つ。
Table 89: PromiseReaction Record フィールド
フィールド名
値
意味
[[Capability]]
PromiseCapability Record または undefined
このレコードがリアクションハンドラを提供する Promise のケイパビリティ。
[[Type]]
fulfill または reject
[[Handler]] が empty のときに、確定種別固有の挙動を可能にするために使用される。
[[Handler]]
JobCallback Record または empty
入力値に適用され、その戻り値が派生 Promise の挙動を決定する関数。[[Handler]] が empty の場合、[[Type]] の値に依存した関数が代わりに使用される。
27.2.1.3 CreateResolvingFunctions ( promise )
The abstract operation CreateResolvingFunctions takes argument promise (a Promise) and returns [[Resolve]] (関数オブジェクト ) および [[Reject]] (関数オブジェクト ) フィールドを持つ Record . It performs the following steps when called:
alreadyResolved を Record { [[Value]] : false } とする。stepsResolve を Promise Resolve 関数 で定義されるアルゴリズム手順とする。lengthResolve を Promise Resolve 関数 にある関数定義の省略不可パラメータ数とする。resolve を CreateBuiltinFunction (stepsResolve , lengthResolve , "" , « [[Promise]] , [[AlreadyResolved]] ») とする。resolve .[[Promise]] に promise を設定する。resolve .[[AlreadyResolved]] に alreadyResolved を設定する。stepsReject を Promise Reject 関数 で定義されるアルゴリズム手順とする。lengthReject を Promise Reject 関数 にある関数定義の省略不可パラメータ数とする。reject を CreateBuiltinFunction (stepsReject , lengthReject , "" , « [[Promise]] , [[AlreadyResolved]] ») とする。reject .[[Promise]] に promise を設定する。reject .[[AlreadyResolved]] に alreadyResolved を設定する。Record { [[Resolve]] : resolve , [[Reject]] : reject } を返す。
27.2.1.3.1 Promise Reject 関数
Promise reject 関数は [[Promise]] と [[AlreadyResolved]] 内部スロットを持つ匿名組み込み関数である。
Promise reject 関数が引数 reason で呼ばれたとき、次を行う:
F をアクティブな関数オブジェクト とする。事前条件: F は値が Object である [[Promise]] 内部スロットを持つ。 promise を F .[[Promise]] とする。alreadyResolved を F .[[AlreadyResolved]] とする。もし alreadyResolved .[[Value]] が true なら undefined を返す。 alreadyResolved .[[Value]] を true に設定する。RejectPromise (promise , reason ) を実行する。undefined を返す。
Promise reject 関数の "length" プロパティは 1 𝔽 である。
27.2.1.3.2 Promise Resolve 関数
Promise resolve 関数は [[Promise]] と [[AlreadyResolved]] 内部スロットを持つ匿名組み込み関数である。
Promise resolve 関数が引数 resolution で呼ばれたとき、次を行う:
F をアクティブな関数オブジェクト とする。事前条件: F は値が Object である [[Promise]] 内部スロットを持つ。 promise を F .[[Promise]] とする。alreadyResolved を F .[[AlreadyResolved]] とする。もし alreadyResolved .[[Value]] が true なら undefined を返す。 alreadyResolved .[[Value]] を true に設定する。もし SameValue (resolution , promise ) が true ならselfResolutionError を新たに生成された TypeError オブジェクトとする。RejectPromise (promise , selfResolutionError ) を実行する。undefined を返す。 もし resolution が Object でなければFulfillPromise (promise , resolution ) を実行する。undefined を返す。 then を Completion (Get (resolution , "then" )) とする。もし then が abrupt completion ならRejectPromise (promise , then .[[Value]] ) を実行する。undefined を返す。 thenAction を then .[[Value]] とする。もし IsCallable (thenAction ) が false ならFulfillPromise (promise , resolution ) を実行する。undefined を返す。 thenJobCallback を HostMakeJobCallback (thenAction ) とする。job を NewPromiseResolveThenableJob (promise , resolution , thenJobCallback ) とする。HostEnqueuePromiseJob (job .[[Job]] , job .[[Realm]] ) を実行する。undefined を返す。
Promise resolve 関数の "length" プロパティは 1 𝔽 である。
27.2.1.4 FulfillPromise ( promise , value )
The abstract operation FulfillPromise takes arguments promise (a Promise) and value (an ECMAScript language value) and returns unused . It performs the following steps when called:
事前条件: promise .[[PromiseState]] は pending である。 reactions を promise .[[PromiseFulfillReactions]] とする。promise .[[PromiseResult]] を value に設定する。promise .[[PromiseFulfillReactions]] を undefined に設定する。promise .[[PromiseRejectReactions]] を undefined に設定する。promise .[[PromiseState]] を fulfilled に設定する。TriggerPromiseReactions (reactions , value ) を実行する。unused を返す。
27.2.1.5 NewPromiseCapability ( C )
The abstract operation NewPromiseCapability takes argument C (an ECMAScript language value) and returns 正常完了で PromiseCapability Record を含むか、または throw completion . これは C を組み込み Promise コンストラクタ と同様の方法でコンストラクタ として用いて Promise を生成し、その resolve
/ reject
関数を取得しようとする。得られた Promise と resolve
/ reject
関数によって新しい PromiseCapability Record を初期化する。 It performs the following steps when called:
もし IsConstructor (C ) が false なら TypeError 例外を投げる。 注: C は Promise コンストラクタ のパラメータ規約(27.2.3.1 参照)をサポートするコンストラクタ 関数であると仮定される。 resolvingFunctions を Record { [[Resolve]] : undefined , [[Reject]] : undefined } とする。executorClosure をパラメータ (resolve , reject ) を持ち resolvingFunctions を捕捉し、呼び出されると次を行う新たな Abstract Closure とする:もし resolvingFunctions .[[Resolve]] が undefined でなければ TypeError 例外を投げる。 もし resolvingFunctions .[[Reject]] が undefined でなければ TypeError 例外を投げる。 resolvingFunctions .[[Resolve]] を resolve に設定する。resolvingFunctions .[[Reject]] を reject に設定する。NormalCompletion (undefined ) を返す。executor を CreateBuiltinFunction (executorClosure , 2, "" , « ») とする。promise を ? Construct(C , « executor ») とする。もし IsCallable (resolvingFunctions .[[Resolve]] ) が false なら TypeError 例外を投げる。 もし IsCallable (resolvingFunctions .[[Reject]] ) が false なら TypeError 例外を投げる。 PromiseCapability Record { [[Promise]] : promise , [[Resolve]] : resolvingFunctions .[[Resolve]] , [[Reject]] : resolvingFunctions .[[Reject]] } を返す。
Note
この抽象操作 は、渡された executor 関数引数を Promise コンストラクタ と同様に呼び出す任意のコンストラクタ に対して総称的であるため、Promise のサブクラス化をサポートする。これは Promise コンストラクタ の静的メソッドを任意のサブクラスへ一般化するために使用される。
27.2.1.6 IsPromise ( x )
The abstract operation IsPromise takes argument x (an ECMAScript language value) and returns Boolean. オブジェクト上の promise ブランドを確認する。 It performs the following steps when called:
もし x が Object でなければ false を返す。 もし x が [[PromiseState]] 内部スロットを持たなければ false を返す。 true を返す。
27.2.1.7 RejectPromise ( promise , reason )
The abstract operation RejectPromise takes arguments promise (a Promise) and reason (an ECMAScript language value) and returns unused . It performs the following steps when called:
事前条件: promise .[[PromiseState]] は pending である。 reactions を promise .[[PromiseRejectReactions]] とする。promise .[[PromiseResult]] を reason に設定する。promise .[[PromiseFulfillReactions]] を undefined に設定する。promise .[[PromiseRejectReactions]] を undefined に設定する。promise .[[PromiseState]] を rejected に設定する。もし promise .[[PromiseIsHandled]] が false なら HostPromiseRejectionTracker (promise , "reject" ) を実行する。 TriggerPromiseReactions (reactions , reason ) を実行する。unused を返す。
27.2.1.8 TriggerPromiseReactions ( reactions , argument )
The abstract operation TriggerPromiseReactions takes arguments reactions (a List of PromiseReaction Records ) and argument (an ECMAScript language value) and returns unused . reactions の各レコードに対して新たな Job をキューに入れる。各 Job は PromiseReaction Record の [[Type]] と [[Handler]] を処理し、[[Handler]] が empty でなければ与えられた引数を渡して呼び出す。[[Handler]] が empty の場合、挙動は [[Type]] によって決定される。 It performs the following steps when called:
reactions の各要素 reaction についてjob を NewPromiseReactionJob (reaction , argument ) とする。HostEnqueuePromiseJob (job .[[Job]] , job .[[Realm]] ) を実行する。unused を返す。
27.2.1.9 HostPromiseRejectionTracker ( promise , operation )
The host-defined abstract operation HostPromiseRejectionTracker takes arguments promise (a Promise) and operation ("reject" or "handle" ) and returns unused . ホスト環境 が Promise の拒否を追跡できるようにする。
HostPromiseRejectionTracker のデフォルト実装は unused を返すことである。
Note 1
HostPromiseRejectionTracker は次の 2 つの状況で呼ばれる:
Promise がハンドラなしで拒否されたとき、operation 引数に "reject" を指定して呼ばれる。
拒否済みの Promise に初めてハンドラが追加されたとき、operation 引数に "handle" を指定して呼ばれる。
典型的な実装は、未処理拒否を開発者に通知しようと試みる一方で、後からハンドラが追加されて以前の通知が無効化される場合にも注意深く通知する。
Note 2
operation が "handle" の場合、実装はガベージコレクションを妨げる形で promise への参照を保持すべきではない。operation が "reject" の場合には、拒否は稀でホットパスではないと期待されるため、実装は promise への参照を保持してもよい。
27.2.2 Promise の Job (Promise Jobs)
27.2.2.1 NewPromiseReactionJob ( reaction , argument )
The abstract operation NewPromiseReactionJob takes arguments reaction (a PromiseReaction Record ) and argument (an ECMAScript language value) and returns フィールド [[Job]] (Job Abstract Closure ) および [[Realm]] (Realm Record または null ) を持つ Record . 受け取った値に適切なハンドラを適用し、その戻り値を用いてそのハンドラに関連付けられた派生 Promise を解決または拒否する新しい Job Abstract Closure を返す。 It performs the following steps when called:
job を、引数なしで reaction と argument を捕捉し、呼び出されると次を実行する新たな Job Abstract Closure とする:promiseCapability を reaction .[[Capability]] とする。type を reaction .[[Type]] とする。handler を reaction .[[Handler]] とする。もし handler が empty ならもし type が fulfill ならhandlerResult を NormalCompletion (argument ) とする。 それ以外事前条件: type は reject である。 handlerResult を ThrowCompletion (argument ) とする。 それ以外handlerResult を Completion (HostCallJobCallback (handler , undefined , « argument »)) とする。 もし promiseCapability が undefined なら事前条件: handlerResult は abrupt completion ではない。 empty を返す。 事前条件: promiseCapability は PromiseCapability Record である。 もし handlerResult が abrupt completion なら? Call(promiseCapability .[[Reject]] , undefined , « handlerResult .[[Value]] ») を返す。 それ以外? Call(promiseCapability .[[Resolve]] , undefined , « handlerResult .[[Value]] ») を返す。 handlerRealm を null とする。もし reaction .[[Handler]] が empty でないならgetHandlerRealmResult を Completion (GetFunctionRealm (reaction .[[Handler]] .[[Callback]] )) とする。もし getHandlerRealmResult が normal completion なら handlerRealm を getHandlerRealmResult .[[Value]] に設定する。 それ以外なら handlerRealm を現在の Realm Record に設定する。 注: handlerRealm が null になるのはハンドラが undefined の場合に限られる。ハンドラが取り消された Proxy で ECMAScript コードが実行されない場合、handlerRealm はエラーオブジェクト生成に用いられる。 Record { [[Job]] : job , [[Realm]] : handlerRealm } を返す。
27.2.2.2 NewPromiseResolveThenableJob ( promiseToResolve , thenable , then )
The abstract operation NewPromiseResolveThenableJob takes arguments promiseToResolve (a Promise), thenable (an Object), and then (a JobCallback Record ) and returns フィールド [[Job]] (Job Abstract Closure ) および [[Realm]] (Realm Record ) を持つ Record . It performs the following steps when called:
job を、引数なしで promiseToResolve , thenable , then を捕捉し、呼び出されると次を実行する新たな Job Abstract Closure とする:resolvingFunctions を CreateResolvingFunctions (promiseToResolve ) とする。thenCallResult を Completion (HostCallJobCallback (then , thenable , « resolvingFunctions .[[Resolve]] , resolvingFunctions .[[Reject]] »)) とする。もし thenCallResult が abrupt completion なら? Call(resolvingFunctions .[[Reject]] , undefined , « thenCallResult .[[Value]] ») を返す。 ! thenCallResult を返す。 getThenRealmResult を Completion (GetFunctionRealm (then .[[Callback]] )) とする。もし getThenRealmResult が normal completion なら thenRealm を getThenRealmResult .[[Value]] とする。 それ以外なら thenRealm を現在の Realm Record とする。 注: thenRealm が null になることはない。then .[[Callback]] が取り消された Proxy でコードが実行されない場合、thenRealm はエラーオブジェクト生成に用いられる。 Record { [[Job]] : job , [[Realm]] : thenRealm } を返す。
Note
この Job は与えられた thenable とその then
メソッドを利用して指定された Promise を解決する。この過程は、then
メソッドの評価が周囲コードの評価完了後に行われることを保証するため、Job として実行されなければならない。
27.2.3 Promise コンストラクタ (The Promise Constructor)
Promise コンストラクタ :
%Promise% である。
グローバルオブジェクト の "Promise" プロパティの初期値である。
コンストラクタ として呼び出されたとき新しい Promise を生成し初期化する。
関数として呼び出すことは意図されておらず、そのように呼び出された場合は例外を投げる。
クラス定義の extends
句における値として使用できる。指定された Promise の挙動を継承することを意図するサブクラスのコンストラクタ は、Promise
および Promise.prototype
の組み込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、Promise コンストラクタ への super
呼び出しを含めなければならない。
27.2.3.1 Promise ( executor )
この関数は呼び出されると次の手順を実行する:
もし NewTarget が undefined なら TypeError 例外を投げる。 もし IsCallable (executor ) が false なら TypeError 例外を投げる。 promise を ? OrdinaryCreateFromConstructor (NewTarget, "%Promise.prototype%" , « [[PromiseState]] , [[PromiseResult]] , [[PromiseFulfillReactions]] , [[PromiseRejectReactions]] , [[PromiseIsHandled]] ») とする。promise .[[PromiseState]] を pending に設定する。promise .[[PromiseResult]] を empty に設定する。promise .[[PromiseFulfillReactions]] を新しい空 List に設定する。promise .[[PromiseRejectReactions]] を新しい空 List に設定する。promise .[[PromiseIsHandled]] を false に設定する。resolvingFunctions を CreateResolvingFunctions (promise ) とする。completion を Completion (Call(executor , undefined , « resolvingFunctions .[[Resolve]] , resolvingFunctions .[[Reject]] »)) とする。もし completion が abrupt completion なら? Call(resolvingFunctions .[[Reject]] , undefined , « completion .[[Value]] ») を実行する。 promise を返す。
Note
executor 引数は関数オブジェクト でなければならない。これはこの Promise が表す、遅延される可能性のある処理の開始と完了報告のために呼び出される。executor は 2 つの引数 resolve と reject で呼び出される。これらは遅延計算の最終的な完了または失敗を報告するために executor が使用できる関数である。executor から復帰することは遅延処理が完了したことを意味せず、遅延処理を最終的に実行する要求が受理されたことのみを意味する。
executor に渡される resolve 関数は 1 つの引数を受け取る。executor コードは最終的に resolve を呼び、関連する Promise を解決したい意図を示すことができる。resolve に渡される引数は遅延処理の最終的な値を表し、実際の履行値か、履行された場合にその値を与える別の Promise のいずれかである。
executor に渡される reject 関数は 1 つの引数を受け取る。executor コードは最終的に reject を呼び、関連する Promise が拒否され決して履行されないことを示すことができる。reject に渡される引数は Promise の拒否理由として用いられ、典型的には Error オブジェクトである。
Promise コンストラクタ が executor に渡す resolve / reject 関数には、関連する Promise を実際に解決/拒否する能力がある。サブクラスは異なるコンストラクタ 挙動を持ち、resolve と reject にカスタマイズされた値を渡す場合がある。
27.2.4 Promise コンストラクタのプロパティ (Properties of the Promise Constructor)
Promise コンストラクタ :
27.2.4.1 Promise.all ( iterable )
この関数は、渡された Promise 群について、その履行値の配列で履行される新しい Promise を返す。あるいは最初に拒否された Promise の理由で拒否される。実行中、渡された iterable の各要素を Promise に解決する。
C を this 値とする。promiseCapability を ? NewPromiseCapability (C ) とする。promiseResolve を Completion (GetPromiseResolve (C )) とする。IfAbruptRejectPromise (promiseResolve , promiseCapability )。iteratorRecord を Completion (GetIterator (iterable , sync )) とする。IfAbruptRejectPromise (iteratorRecord , promiseCapability )。result を Completion (PerformPromiseAll (iteratorRecord , C , promiseCapability , promiseResolve )) とする。もし result が abrupt completion ならもし iteratorRecord .[[Done]] が false なら result を Completion (IteratorClose (iteratorRecord , result )) に設定する。 IfAbruptRejectPromise (result , promiseCapability )。 ! result を返す。
Note
この関数は this 値が Promise コンストラクタ のパラメータ規約をサポートするコンストラクタ 関数であることを要する。
27.2.4.1.1 GetPromiseResolve ( promiseConstructor )
The abstract operation GetPromiseResolve takes argument promiseConstructor (a constructor) and returns 正常完了で関数オブジェクト を含むか、または throw completion . It performs the following steps when called:
promiseResolve を ? Get (promiseConstructor , "resolve" ) とする。もし IsCallable (promiseResolve ) が false なら TypeError 例外を投げる。 promiseResolve を返す。
27.2.4.1.2 PerformPromiseAll ( iteratorRecord , constructor , resultCapability , promiseResolve )
The abstract operation PerformPromiseAll takes arguments iteratorRecord (an Iterator Record ), constructor (a constructor), resultCapability (a PromiseCapability Record ), and promiseResolve (a function object) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion . It performs the following steps when called:
values を新しい空 List とする。remainingElementsCount を Record { [[Value]] : 1 } とする。index を 0 とする。繰り返す,next を ? IteratorStepValue (iteratorRecord ) とする。もし next が done ならremainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。もし remainingElementsCount .[[Value]] = 0 ならvaluesArray を CreateArrayFromList (values ) とする。? Call(resultCapability .[[Resolve]] , undefined , « valuesArray ») を実行する。 resultCapability .[[Promise]] を返す。 undefined を values に追加する。nextPromise を ? Call(promiseResolve , constructor , « next ») とする。steps を Promise.all
Resolve 要素関数 (Promise.all
Resolve Element Functions) で定義されるアルゴリズム手順とする。length を Promise.all
Resolve 要素関数 (Promise.all
Resolve Element Functions) にある関数定義の省略不可パラメータ数とする。onFulfilled を CreateBuiltinFunction (steps , length , "" , « [[AlreadyCalled]] , [[Index]] , [[Values]] , [[Capability]] , [[RemainingElements]] ») とする。onFulfilled .[[AlreadyCalled]] を false に設定する。onFulfilled .[[Index]] を index に設定する。onFulfilled .[[Values]] を values に設定する。onFulfilled .[[Capability]] を resultCapability に設定する。onFulfilled .[[RemainingElements]] を remainingElementsCount に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] + 1 に設定する。? Invoke(nextPromise , "then" , « onFulfilled , resultCapability .[[Reject]] ») を実行する。 index を index + 1 に設定する。
27.2.4.1.3 Promise.all
Resolve 要素関数 (Promise.all
Resolve Element Functions)
Promise.all
Resolve 要素関数は特定の Promise.all
の要素を解決するために使われる匿名組み込み関数である。各 Promise.all
Resolve 要素関数は [[Index]] , [[Values]] , [[Capability]] , [[RemainingElements]] , [[AlreadyCalled]] 内部スロットを持つ。
Promise.all
Resolve 要素関数が引数 x で呼ばれたとき、次を行う:
F をアクティブな関数オブジェクト とする。もし F .[[AlreadyCalled]] が true なら undefined を返す。 F .[[AlreadyCalled]] を true に設定する。index を F .[[Index]] とする。values を F .[[Values]] とする。promiseCapability を F .[[Capability]] とする。remainingElementsCount を F .[[RemainingElements]] とする。values [index ] を x に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。もし remainingElementsCount .[[Value]] = 0 ならvaluesArray を CreateArrayFromList (values ) とする。? Call(promiseCapability .[[Resolve]] , undefined , « valuesArray ») を返す。 undefined を返す。
Promise.all
Resolve 要素関数の "length" プロパティは 1 𝔽 である。
27.2.4.2 Promise.allSettled ( iterable )
この関数は、元のすべての Promise が確定(fulfilled か rejected)した後に、Promise 状態スナップショットの配列で履行される Promise を返す。実行中、渡された iterable の各要素を Promise に解決する。
C を this 値とする。promiseCapability を ? NewPromiseCapability (C ) とする。promiseResolve を Completion (GetPromiseResolve (C )) とする。IfAbruptRejectPromise (promiseResolve , promiseCapability )。iteratorRecord を Completion (GetIterator (iterable , sync )) とする。IfAbruptRejectPromise (iteratorRecord , promiseCapability )。result を Completion (PerformPromiseAllSettled (iteratorRecord , C , promiseCapability , promiseResolve )) とする。もし result が abrupt completion ならもし iteratorRecord .[[Done]] が false なら result を Completion (IteratorClose (iteratorRecord , result )) に設定する。 IfAbruptRejectPromise (result , promiseCapability )。 ! result を返す。
Note
この関数は this 値が Promise コンストラクタ のパラメータ規約をサポートするコンストラクタ 関数であることを要する。
27.2.4.2.1 PerformPromiseAllSettled ( iteratorRecord , constructor , resultCapability , promiseResolve )
The abstract operation PerformPromiseAllSettled takes arguments iteratorRecord (an Iterator Record ), constructor (a constructor), resultCapability (a PromiseCapability Record ), and promiseResolve (a function object) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion . It performs the following steps when called:
values を新しい空 List とする。remainingElementsCount を Record { [[Value]] : 1 } とする。index を 0 とする。繰り返す,next を ? IteratorStepValue (iteratorRecord ) とする。もし next が done ならremainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。もし remainingElementsCount .[[Value]] = 0 ならvaluesArray を CreateArrayFromList (values ) とする。? Call(resultCapability .[[Resolve]] , undefined , « valuesArray ») を実行する。 resultCapability .[[Promise]] を返す。 undefined を values に追加する。nextPromise を ? Call(promiseResolve , constructor , « next ») とする。stepsFulfilled を Promise.allSettled
Resolve 要素関数 (Promise.allSettled
Resolve Element Functions) で定義されるアルゴリズム手順とする。lengthFulfilled を Promise.allSettled
Resolve 要素関数 (Promise.allSettled
Resolve Element Functions) にある関数定義の省略不可パラメータ数とする。onFulfilled を CreateBuiltinFunction (stepsFulfilled , lengthFulfilled , "" , « [[AlreadyCalled]] , [[Index]] , [[Values]] , [[Capability]] , [[RemainingElements]] ») とする。alreadyCalled を Record { [[Value]] : false } とする。onFulfilled .[[AlreadyCalled]] を alreadyCalled に設定する。onFulfilled .[[Index]] を index に設定する。onFulfilled .[[Values]] を values に設定する。onFulfilled .[[Capability]] を resultCapability に設定する。onFulfilled .[[RemainingElements]] を remainingElementsCount に設定する。stepsRejected を Promise.allSettled
Reject 要素関数 (Promise.allSettled
Reject Element Functions) で定義されるアルゴリズム手順とする。lengthRejected を Promise.allSettled
Reject 要素関数 (Promise.allSettled
Reject Element Functions) にある関数定義の省略不可パラメータ数とする。onRejected を CreateBuiltinFunction (stepsRejected , lengthRejected , "" , « [[AlreadyCalled]] , [[Index]] , [[Values]] , [[Capability]] , [[RemainingElements]] ») とする。onRejected .[[AlreadyCalled]] を alreadyCalled に設定する。onRejected .[[Index]] を index に設定する。onRejected .[[Values]] を values に設定する。onRejected .[[Capability]] を resultCapability に設定する。onRejected .[[RemainingElements]] を remainingElementsCount に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] + 1 に設定する。? Invoke(nextPromise , "then" , « onFulfilled , onRejected ») を実行する。 index を index + 1 に設定する。
27.2.4.2.2 Promise.allSettled
Resolve 要素関数 (Promise.allSettled
Resolve Element Functions)
Promise.allSettled
Resolve 要素関数は特定の Promise.allSettled
の要素を解決するために使われる匿名組み込み関数である。各 Promise.allSettled
Resolve 要素関数は [[Index]] , [[Values]] , [[Capability]] , [[RemainingElements]] , [[AlreadyCalled]] 内部スロットを持つ。
Promise.allSettled
Resolve 要素関数が引数 x で呼ばれたとき、次を行う:
F をアクティブな関数オブジェクト とする。alreadyCalled を F .[[AlreadyCalled]] とする。もし alreadyCalled .[[Value]] が true なら undefined を返す。 alreadyCalled .[[Value]] を true に設定する。index を F .[[Index]] とする。values を F .[[Values]] とする。promiseCapability を F .[[Capability]] とする。remainingElementsCount を F .[[RemainingElements]] とする。obj を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (obj , "status" , "fulfilled" ) を実行する。 ! CreateDataPropertyOrThrow (obj , "value" , x ) を実行する。 values [index ] を obj に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。もし remainingElementsCount .[[Value]] = 0 ならvaluesArray を CreateArrayFromList (values ) とする。? Call(promiseCapability .[[Resolve]] , undefined , « valuesArray ») を返す。 undefined を返す。
Promise.allSettled
Resolve 要素関数の "length" プロパティは 1 𝔽 である。
27.2.4.2.3 Promise.allSettled
Reject 要素関数 (Promise.allSettled
Reject Element Functions)
Promise.allSettled
Reject 要素関数は特定の Promise.allSettled
の要素を拒否させるために使われる匿名組み込み関数である。各 Promise.allSettled
Reject 要素関数は [[Index]] , [[Values]] , [[Capability]] , [[RemainingElements]] , [[AlreadyCalled]] 内部スロットを持つ。
Promise.allSettled
Reject 要素関数が引数 x で呼ばれたとき、次を行う:
F をアクティブな関数オブジェクト とする。alreadyCalled を F .[[AlreadyCalled]] とする。もし alreadyCalled .[[Value]] が true なら undefined を返す。 alreadyCalled .[[Value]] を true に設定する。index を F .[[Index]] とする。values を F .[[Values]] とする。promiseCapability を F .[[Capability]] とする。remainingElementsCount を F .[[RemainingElements]] とする。obj を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (obj , "status" , "rejected" ) を実行する。 ! CreateDataPropertyOrThrow (obj , "reason" , x ) を実行する。 values [index ] を obj に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。もし remainingElementsCount .[[Value]] = 0 ならvaluesArray を CreateArrayFromList (values ) とする。? Call(promiseCapability .[[Resolve]] , undefined , « valuesArray ») を返す。 undefined を返す。
Promise.allSettled
Reject 要素関数の "length" プロパティは 1 𝔽 である。
27.2.4.3 Promise.any ( iterable )
この関数は、最初に fulfilled になった渡された Promise の値で履行されるか、すべてが拒否された場合には拒否理由を保持する AggregateError
で拒否される Promise を返す。実行中、渡された iterable の各要素を Promise に解決する。
C を this 値とする。promiseCapability を ? NewPromiseCapability (C ) とする。promiseResolve を Completion (GetPromiseResolve (C )) とする。IfAbruptRejectPromise (promiseResolve , promiseCapability )。iteratorRecord を Completion (GetIterator (iterable , sync )) とする。IfAbruptRejectPromise (iteratorRecord , promiseCapability )。result を Completion (PerformPromiseAny (iteratorRecord , C , promiseCapability , promiseResolve )) とする。もし result が abrupt completion ならもし iteratorRecord .[[Done]] が false なら result を Completion (IteratorClose (iteratorRecord , result )) に設定する。 IfAbruptRejectPromise (result , promiseCapability )。 ! result を返す。
Note
この関数は this 値が Promise
コンストラクタ のパラメータ規約をサポートするコンストラクタ 関数であることを要する。
27.2.4.3.1 PerformPromiseAny ( iteratorRecord , constructor , resultCapability , promiseResolve )
The abstract operation PerformPromiseAny takes arguments iteratorRecord (an Iterator Record ), constructor (a constructor), resultCapability (a PromiseCapability Record ), and promiseResolve (a function object) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion . It performs the following steps when called:
errors を新しい空 List とする。remainingElementsCount を Record { [[Value]] : 1 } とする。index を 0 とする。繰り返す,next を ? IteratorStepValue (iteratorRecord ) とする。もし next が done ならremainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。もし remainingElementsCount .[[Value]] = 0 ならerror を新しく生成された AggregateError オブジェクトとする。! DefinePropertyOrThrow (error , "errors" , PropertyDescriptor { [[Configurable]] : true , [[Enumerable]] : false , [[Writable]] : true , [[Value]] : CreateArrayFromList (errors ) }) を実行する。 Return ThrowCompletion (error )。 resultCapability .[[Promise]] を返す。 undefined を errors に追加する。nextPromise を ? Call(promiseResolve , constructor , « next ») とする。stepsRejected を Promise.any
Reject 要素関数 (Promise.any
Reject Element Functions) で定義されるアルゴリズム手順とする。lengthRejected を Promise.any
Reject 要素関数 (Promise.any
Reject Element Functions) にある関数定義の省略不可パラメータ数とする。onRejected を CreateBuiltinFunction (stepsRejected , lengthRejected , "" , « [[AlreadyCalled]] , [[Index]] , [[Errors]] , [[Capability]] , [[RemainingElements]] ») とする。onRejected .[[AlreadyCalled]] を false に設定する。onRejected .[[Index]] を index に設定する。onRejected .[[Errors]] を errors に設定する。onRejected .[[Capability]] を resultCapability に設定する。onRejected .[[RemainingElements]] を remainingElementsCount に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] + 1 に設定する。? Invoke(nextPromise , "then" , « resultCapability .[[Resolve]] , onRejected ») を実行する。 index を index + 1 に設定する。
27.2.4.3.2 Promise.any
Reject 要素関数 (Promise.any
Reject Element Functions)
Promise.any
Reject 要素関数は特定の Promise.any
要素を拒否するために使われる匿名組み込み関数である。各 Promise.any
Reject 要素関数は [[Index]] , [[Errors]] , [[Capability]] , [[RemainingElements]] , [[AlreadyCalled]] 内部スロットを持つ。
Promise.any
Reject 要素関数が引数 x で呼ばれたとき、次を行う:
F をアクティブな関数オブジェクト とする。もし F .[[AlreadyCalled]] が true なら undefined を返す。 F .[[AlreadyCalled]] を true に設定する。index を F .[[Index]] とする。errors を F .[[Errors]] とする。promiseCapability を F .[[Capability]] とする。remainingElementsCount を F .[[RemainingElements]] とする。errors [index ] を x に設定する。remainingElementsCount .[[Value]] を remainingElementsCount .[[Value]] - 1 に設定する。もし remainingElementsCount .[[Value]] = 0 ならerror を新しく生成された AggregateError オブジェクトとする。! DefinePropertyOrThrow (error , "errors" , PropertyDescriptor { [[Configurable]] : true , [[Enumerable]] : false , [[Writable]] : true , [[Value]] : CreateArrayFromList (errors ) }) を実行する。 ? Call(promiseCapability .[[Reject]] , undefined , « error ») を返す。 undefined を返す。
Promise.any
Reject 要素関数の "length" プロパティは 1 𝔽 である。
27.2.4.4 Promise.prototype
Promise.prototype
の初期値は Promise プロトタイプオブジェクト である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
27.2.4.5 Promise.race ( iterable )
この関数は、渡された Promise 群のうち最初に確定したものと同じ方法で確定する新しい Promise を返す。実行中、渡された iterable の各要素を Promise に解決する。
C を this 値とする。promiseCapability を ? NewPromiseCapability (C ) とする。promiseResolve を Completion (GetPromiseResolve (C )) とする。IfAbruptRejectPromise (promiseResolve , promiseCapability )。iteratorRecord を Completion (GetIterator (iterable , sync )) とする。IfAbruptRejectPromise (iteratorRecord , promiseCapability )。result を Completion (PerformPromiseRace (iteratorRecord , C , promiseCapability , promiseResolve )) とする。もし result が abrupt completion ならもし iteratorRecord .[[Done]] が false なら result を Completion (IteratorClose (iteratorRecord , result )) に設定する。 IfAbruptRejectPromise (result , promiseCapability )。 ! result を返す。
Note 1
iterable 引数が値を一切生成しないか、生成された Promise がいずれも確定しない場合、このメソッドが返す pending 状態の Promise は確定しないままである。
Note 2
この関数は this 値が Promise コンストラクタ のパラメータ規約をサポートするコンストラクタ 関数であり、かつ this 値が resolve
メソッドを提供することを期待する。
27.2.4.5.1 PerformPromiseRace ( iteratorRecord , constructor , resultCapability , promiseResolve )
The abstract operation PerformPromiseRace takes arguments iteratorRecord (an Iterator Record ), constructor (a constructor), resultCapability (a PromiseCapability Record ), and promiseResolve (a function object) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion . It performs the following steps when called:
繰り返す,next を ? IteratorStepValue (iteratorRecord ) とする。もし next が done ならresultCapability .[[Promise]] を返す。 nextPromise を ? Call(promiseResolve , constructor , « next ») とする。? Invoke(nextPromise , "then" , « resultCapability .[[Resolve]] , resultCapability .[[Reject]] ») を実行する。
27.2.4.6 Promise.reject ( r )
この関数は渡された引数で拒否された新しい Promise を返す。
C を this 値とする。promiseCapability を ? NewPromiseCapability (C ) とする。? Call(promiseCapability .[[Reject]] , undefined , « r ») を実行する。 promiseCapability .[[Promise]] を返す。
Note
この関数は this 値が Promise コンストラクタ のパラメータ規約をサポートするコンストラクタ 関数であることを期待する。
27.2.4.7 Promise.resolve ( x )
この関数は、引数がこのコンストラクタ によって生成された Promise であればその引数自体を、そうでなければ引数で解決された新しい Promise を返す。
C を this 値とする。もし C が Object でなければ TypeError 例外を投げる。 ? PromiseResolve (C , x ) を返す。
Note
この関数は this 値が Promise コンストラクタ のパラメータ規約をサポートするコンストラクタ 関数であることを期待する。
27.2.4.7.1 PromiseResolve ( C , x )
The abstract operation PromiseResolve takes arguments C (an Object) and x (an ECMAScript language value) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion . x で解決された新しい Promise を返す。 It performs the following steps when called:
もし IsPromise (x ) が true ならxConstructor を ? Get (x , "constructor" ) とする。もし SameValue (xConstructor , C ) が true なら x を返す。 promiseCapability を ? NewPromiseCapability (C ) とする。? Call(promiseCapability .[[Resolve]] , undefined , « x ») を実行する。 promiseCapability .[[Promise]] を返す。
27.2.4.8 Promise.try ( callback , ...args )
この関数は呼び出されたとき次の手順を実行する:
C を this 値とする。もし C が Object でなければ TypeError 例外を投げる。 promiseCapability を ? NewPromiseCapability (C ) とする。status を Completion (Call(callback , undefined , args )) とする。もし status が abrupt completion なら? Call(promiseCapability .[[Reject]] , undefined , « status .[[Value]] ») を実行する。 それ以外? Call(promiseCapability .[[Resolve]] , undefined , « status .[[Value]] ») を実行する。 promiseCapability .[[Promise]] を返す。
Note
この関数は this 値が Promise コンストラクタ のパラメータ規約をサポートするコンストラクタ 関数であることを期待する。
27.2.4.9 Promise.withResolvers ( )
この関数は 3 つのプロパティ(新しい Promise とそれに結び付けられた resolve
/ reject
関数)を持つオブジェクトを返す。
C を this 値とする。promiseCapability を ? NewPromiseCapability (C ) とする。obj を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (obj , "promise" , promiseCapability .[[Promise]] ) を実行する。 ! CreateDataPropertyOrThrow (obj , "resolve" , promiseCapability .[[Resolve]] ) を実行する。 ! CreateDataPropertyOrThrow (obj , "reject" , promiseCapability .[[Reject]] ) を実行する。 obj を返す。
27.2.4.10 get Promise [ %Symbol.species% ]
Promise[%Symbol.species%]
は set アクセサ関数が undefined であるアクセサプロパティ であり、get アクセサ関数は呼び出されると次の手順を実行する:
this 値を返す。
この関数の "name" プロパティの値は "get [Symbol.species]" である。
Note
Promise プロトタイプメソッドは通常、派生オブジェクト生成に this 値のコンストラクタ を使用する。しかしサブクラスコンストラクタ はその %Symbol.species% プロパティを再定義することで既定の挙動を上書きできる。
27.2.5 Promise プロトタイプオブジェクトのプロパティ
Promise プロトタイプオブジェクト は次の通り:
%Promise.prototype% である。
[[Prototype]] 内部スロットの値は %Object.prototype% である。
通常のオブジェクトである。
[[PromiseState]] 内部スロットや Promise インスタンスの他の内部スロットを持たない。
27.2.5.1 Promise.prototype.catch ( onRejected )
このメソッドは呼び出されると次の手順を実行する:
promise を this 値とする。Return ? Invoke(promise , "then" , « undefined , onRejected »).
27.2.5.2 Promise.prototype.constructor
Promise.prototype.constructor
の初期値は %Promise% である。
27.2.5.3 Promise.prototype.finally ( onFinally )
このメソッドは呼び出されると次の手順を実行する:
promise を this 値とする。もし promise が Object でなければ TypeError 例外を投げる。 C を ? SpeciesConstructor (promise , %Promise% ) とする。事前条件: IsConstructor (C ) は true である。 もし IsCallable (onFinally ) が false ならthenFinally を onFinally とする。catchFinally を onFinally とする。 それ以外thenFinallyClosure をパラメータ (value ) を取り onFinally と C を捕捉し呼び出されると次を行う新たな Abstract Closure とする:result を ? Call(onFinally , undefined ) とする。p を ? PromiseResolve (C , result ) とする。returnValue を引数なしで value を捕捉し呼び出されると次を行う新たな Abstract Closure とし、NormalCompletion (value ) を返す。valueThunk を CreateBuiltinFunction (returnValue , 0, "" , « ») とする。Return ? Invoke(p , "then" , « valueThunk »). thenFinally を CreateBuiltinFunction (thenFinallyClosure , 1, "" , « ») とする。catchFinallyClosure をパラメータ (reason ) を取り onFinally と C を捕捉し呼び出されると次を行う新たな Abstract Closure とする:result を ? Call(onFinally , undefined ) とする。p を ? PromiseResolve (C , result ) とする。throwReason を引数なしで reason を捕捉し呼び出されると次を行う新たな Abstract Closure とし、Return ThrowCompletion (reason )。thrower を CreateBuiltinFunction (throwReason , 0, "" , « ») とする。Return ? Invoke(p , "then" , « thrower »). catchFinally を CreateBuiltinFunction (catchFinallyClosure , 1, "" , « ») とする。 Return ? Invoke(promise , "then" , « thenFinally , catchFinally »).
27.2.5.4 Promise.prototype.then ( onFulfilled , onRejected )
このメソッドは呼び出されると次の手順を実行する:
promise を this 値とする。もし IsPromise (promise ) が false なら TypeError 例外を投げる。 C を ? SpeciesConstructor (promise , %Promise% ) とする。resultCapability を ? NewPromiseCapability (C ) とする。Return PerformPromiseThen (promise , onFulfilled , onRejected , resultCapability )。
27.2.5.4.1 PerformPromiseThen ( promise , onFulfilled , onRejected [ , resultCapability ] )
The abstract operation PerformPromiseThen takes arguments promise (a Promise), onFulfilled (an ECMAScript language value), and onRejected (an ECMAScript language value) and optional argument resultCapability (a PromiseCapability Record ) and returns an ECMAScript language value. promise に対し onFulfilled と onRejected を確定時アクションとして “then” 操作を行う。resultCapability が渡された場合、その Promise を更新して結果を格納する。渡されない場合、結果を不要とする仕様内部操作による呼び出しである。 It performs the following steps when called:
事前条件: IsPromise (promise ) は true である。 もし resultCapability が存在しなければresultCapability を undefined に設定する。 もし IsCallable (onFulfilled ) が false ならonFulfilledJobCallback を empty とする。 それ以外onFulfilledJobCallback を HostMakeJobCallback (onFulfilled ) とする。 もし IsCallable (onRejected ) が false ならonRejectedJobCallback を empty とする。 それ以外onRejectedJobCallback を HostMakeJobCallback (onRejected ) とする。 fulfillReaction を PromiseReaction Record { [[Capability]] : resultCapability , [[Type]] : fulfill , [[Handler]] : onFulfilledJobCallback } とする。rejectReaction を PromiseReaction Record { [[Capability]] : resultCapability , [[Type]] : reject , [[Handler]] : onRejectedJobCallback } とする。もし promise .[[PromiseState]] が pending ならfulfillReaction を promise .[[PromiseFulfillReactions]] に追加する。rejectReaction を promise .[[PromiseRejectReactions]] に追加する。 それ以外で promise .[[PromiseState]] が fulfilled ならvalue を promise .[[PromiseResult]] とする。fulfillJob を NewPromiseReactionJob (fulfillReaction , value ) とする。HostEnqueuePromiseJob (fulfillJob .[[Job]] , fulfillJob .[[Realm]] ) を実行する。 それ以外事前条件: promise .[[PromiseState]] は rejected である。 reason を promise .[[PromiseResult]] とする。もし promise .[[PromiseIsHandled]] が false なら HostPromiseRejectionTracker (promise , "handle" ) を実行する。 rejectJob を NewPromiseReactionJob (rejectReaction , reason ) とする。HostEnqueuePromiseJob (rejectJob .[[Job]] , rejectJob .[[Realm]] ) を実行する。 promise .[[PromiseIsHandled]] を true に設定する。もし resultCapability が undefined ならundefined を返す。 それ以外resultCapability .[[Promise]] を返す。
27.2.5.5 Promise.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列値 "Promise" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.2.6 Promise インスタンスのプロパティ
Promise インスタンスは(組み込み %Promise.prototype% である)Promise プロトタイプオブジェクト からプロパティを継承する通常のオブジェクトである。Promise インスタンスは Table 90 に記述される内部スロットを持って初期化される。
Table 90: Promise インスタンスの内部スロット
Internal Slot
Type
Description
[[PromiseState]]
pending , fulfilled , or rejected
その then
メソッドへの呼び出しに対し Promise がどのように反応するかを制御する。
[[PromiseResult]]
ECMAScript 言語値または empty
Promise が履行または拒否された値(存在する場合)。empty は [[PromiseState]] が pending の場合に限り設定される。
[[PromiseFulfillReactions]]
PromiseReaction Record の List
pending から fulfilled への遷移時(または遷移した場合)に処理されるレコード。
[[PromiseRejectReactions]]
PromiseReaction Record の List
pending から rejected への遷移時(または遷移した場合)に処理されるレコード。
[[PromiseIsHandled]]
Boolean
一度でも履行または拒否ハンドラを持ったことがあるかを示す;未処理拒否の追跡に使用される。
27.3 GeneratorFunction オブジェクト
GeneratorFunction は、通常 GeneratorDeclaration 、GeneratorExpression 、GeneratorMethod を評価することで生成される関数である。また %GeneratorFunction% 組込みを呼び出すことでも生成され得る。
Figure 6 (Informative): Generator オブジェクトの関係
27.3.1 GeneratorFunction コンストラクタ
GeneratorFunction コンストラクタ :
%GeneratorFunction% である。
Function
のサブクラスである。
コンストラクタ としてではなく関数として呼び出されたとき、新しい GeneratorFunction を生成し初期化する。したがって関数呼び出し GeneratorFunction (…)
は同じ引数でのオブジェクト生成式 new GeneratorFunction (…)
と同等である。
クラス定義の extends
句の値として使用できる。指定された GeneratorFunction の挙動を継承することを意図するサブクラスのコンストラクタ は、組込み GeneratorFunction の挙動に必要な内部スロットを持つサブクラスインスタンスを生成・初期化するため、GeneratorFunction コンストラクタ への super
呼び出しを含めなければならない。ジェネレータ関数オブジェクト を定義する全ての ECMAScript 構文形式は GeneratorFunction の直接インスタンスを生成する。GeneratorFunction のサブクラスインスタンスを構文的に生成する手段は存在しない。
27.3.1.1 GeneratorFunction ( ...parameterArgs , bodyArg )
最後の引数(もしあれば)がジェネレータ関数の本体(実行コード)を指定し、それ以前の引数が仮引数を指定する。
この関数は呼び出されると次の手順を実行する:
C をアクティブな関数オブジェクト とする。もし bodyArg が存在しなければ bodyArg を空文字列に設定する。 ? CreateDynamicFunction (C , NewTarget, generator , parameterArgs , bodyArg ) を返す。
Note
27.3.2 GeneratorFunction コンストラクタのプロパティ
GeneratorFunction コンストラクタ :
Function コンストラクタ を継承する標準組込み関数オブジェクト である。
[[Prototype]] 内部スロットの値は %Function% である。
"length" プロパティを持ち、その値は 1 𝔽 である。
"name" プロパティを持ち、その値は "GeneratorFunction" である。
次のプロパティを持つ:
27.3.2.1 GeneratorFunction.prototype
GeneratorFunction.prototype
の初期値は GeneratorFunction プロトタイプオブジェクト である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
27.3.3 GeneratorFunction プロトタイプオブジェクトのプロパティ
GeneratorFunction プロトタイプオブジェクト :
27.3.3.1 GeneratorFunction.prototype.constructor
GeneratorFunction.prototype.constructor
の初期値は %GeneratorFunction% である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.3.3.2 GeneratorFunction.prototype.prototype
GeneratorFunction.prototype.prototype
の初期値は %GeneratorPrototype% である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.3.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列値 "GeneratorFunction" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.3.4 GeneratorFunction インスタンス
すべての GeneratorFunction インスタンスは ECMAScript 関数オブジェクト であり、Table 28 に列挙される内部スロットを持つ。そのすべてのインスタンスにおける [[IsClassConstructor]] 内部スロットの値は false である。
各 GeneratorFunction インスタンスは次の独自プロパティを持つ:
27.3.4.1 length
20.2.4.1 で与えられる Function インスタンスの "length" プロパティの仕様は GeneratorFunction インスタンスにも適用される。
27.3.4.2 name
20.2.4.2 で与えられる Function インスタンスの "name" プロパティの仕様は GeneratorFunction インスタンスにも適用される。
27.3.4.3 prototype
GeneratorFunction インスタンスが生成されるたびに別の通常オブジェクト も生成され、そのジェネレータ関数の "prototype" プロパティの初期値となる。prototype プロパティの値は、そのジェネレータ関数オブジェクト が [[Call]] を用いて呼び出されたとき、新たに生成される Generator の [[Prototype]] 内部スロットを初期化するために用いられる。
このプロパティは属性 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
Note
Function インスタンスと異なり、GeneratorFunction の "prototype" プロパティの値であるオブジェクトは、その値がその GeneratorFunction インスタンスである "constructor" プロパティを持たない。
27.4 AsyncGeneratorFunction オブジェクト
AsyncGeneratorFunction は、通常 AsyncGeneratorDeclaration , AsyncGeneratorExpression , AsyncGeneratorMethod の構文生成物を評価することで生成される関数である。また %AsyncGeneratorFunction% 組込みを呼び出すことでも生成され得る。
27.4.1 AsyncGeneratorFunction コンストラクタ
AsyncGeneratorFunction コンストラクタ :
%AsyncGeneratorFunction% である。
Function
のサブクラスである。
コンストラクタ としてではなく関数として呼び出されたとき、新しい AsyncGeneratorFunction を生成し初期化する。したがって関数呼び出し AsyncGeneratorFunction (...)
は同じ引数でのオブジェクト生成式 new AsyncGeneratorFunction (...)
と同等である。
クラス定義の extends
句の値として使用できる。指定された AsyncGeneratorFunction の挙動を継承することを意図するサブクラスのコンストラクタ は、組込み AsyncGeneratorFunction の挙動に必要な内部スロットを持つサブクラスインスタンスを生成・初期化するため、AsyncGeneratorFunction コンストラクタ への super
呼び出しを含めなければならない。非同期ジェネレータ関数オブジェクト を定義する全ての ECMAScript 構文形式は AsyncGeneratorFunction の直接インスタンスを生成する。AsyncGeneratorFunction サブクラスのインスタンスを構文的に生成する手段は存在しない。
27.4.1.1 AsyncGeneratorFunction ( ...parameterArgs , bodyArg )
最後の引数(もしあれば)が非同期ジェネレータ関数の本体(実行コード)を指定し、それ以前の引数が仮引数を指定する。
この関数は呼び出されると次の手順を実行する:
C をアクティブな関数オブジェクト とする。もし bodyArg が存在しなければ bodyArg を空文字列に設定する。 ? CreateDynamicFunction (C , NewTarget, async-generator , parameterArgs , bodyArg ) を返す。
Note
27.4.2 AsyncGeneratorFunction コンストラクタのプロパティ
AsyncGeneratorFunction コンストラクタ :
Function コンストラクタ を継承する標準組込み関数オブジェクト である。
[[Prototype]] 内部スロットの値は %Function% である。
"length" プロパティを持ち、その値は 1 𝔽 である。
"name" プロパティを持ち、その値は "AsyncGeneratorFunction" である。
次のプロパティを持つ:
27.4.2.1 AsyncGeneratorFunction.prototype
AsyncGeneratorFunction.prototype
の初期値は AsyncGeneratorFunction プロトタイプオブジェクト である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
27.4.3 AsyncGeneratorFunction プロトタイプオブジェクトのプロパティ
AsyncGeneratorFunction プロトタイプオブジェクト :
27.4.3.1 AsyncGeneratorFunction.prototype.constructor
AsyncGeneratorFunction.prototype.constructor
の初期値は %AsyncGeneratorFunction% である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.4.3.2 AsyncGeneratorFunction.prototype.prototype
AsyncGeneratorFunction.prototype.prototype
の初期値は %AsyncGeneratorPrototype% である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.4.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列値 "AsyncGeneratorFunction" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.4.4 AsyncGeneratorFunction インスタンス
すべての AsyncGeneratorFunction インスタンスは ECMAScript 関数オブジェクト であり、Table 28 に列挙される内部スロットを持つ。そのすべてのインスタンスにおける [[IsClassConstructor]] 内部スロットの値は false である。
各 AsyncGeneratorFunction インスタンスは次の独自プロパティを持つ:
27.4.4.1 length
"length" プロパティの値は、その AsyncGeneratorFunction が典型的に期待する引数の数を示す整数 Number である。ただし言語仕様上、他の数の引数で呼び出すことも許される。"length" プロパティで指定された数以外の引数個数で呼び出された際の動作はその関数に依存する。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.4.4.2 name
20.2.4.2 で与えられる Function インスタンスの "name" プロパティの仕様は AsyncGeneratorFunction インスタンスにも適用される。
27.4.4.3 prototype
AsyncGeneratorFunction インスタンスが生成されるたびに別の通常オブジェクト も生成され、その非同期ジェネレータ関数の "prototype" プロパティの初期値となる。prototype プロパティの値は、そのジェネレータ関数オブジェクト が [[Call]] を用いて呼び出されたとき、新たに生成される AsyncGenerator の [[Prototype]] 内部スロットを初期化するために用いられる。
このプロパティは属性 { [[Writable]] : true , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
Note
関数インスタンスと異なり、AsyncGeneratorFunction の "prototype" プロパティの値であるオブジェクトは、その値がその AsyncGeneratorFunction インスタンスである "constructor" プロパティを持たない。
27.5 Generator オブジェクト
Generator はジェネレータ関数を呼び出すことで生成され、イテレータインタフェースおよび iterable インタフェース の双方に適合する。
Generator インスタンスは、それを生成したジェネレータ関数の "prototype" プロパティ初期値から直接プロパティを継承する。Generator インスタンスは間接的に %GeneratorPrototype% からプロパティを継承する。
27.5.1 %GeneratorPrototype% オブジェクト
%GeneratorPrototype% オブジェクト:
%GeneratorFunction.prototype.prototype% である。
通常のオブジェクトである。
Generator インスタンスではなく、[[GeneratorState]] 内部スロットを持たない。
[[Prototype]] 内部スロットの値は %Iterator.prototype% である。
すべての Generator インスタンスが間接的に継承するプロパティを持つ。
27.5.1.1 %GeneratorPrototype%.constructor
%GeneratorPrototype% .constructor
の初期値は %GeneratorFunction.prototype% である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.5.1.2 %GeneratorPrototype%.next ( value )
? GeneratorResume (this value, value , empty ) を返す。
27.5.1.3 %GeneratorPrototype%.return ( value )
このメソッドは呼び出されると次の手順を実行する:
g を this 値とする。C を ReturnCompletion (value ) とする。? GeneratorResumeAbrupt (g , C , empty ) を返す。
27.5.1.4 %GeneratorPrototype%.throw ( exception )
このメソッドは呼び出されると次の手順を実行する:
g を this 値とする。C を ThrowCompletion (exception ) とする。? GeneratorResumeAbrupt (g , C , empty ) を返す。
27.5.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列値 "Generator" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.5.2 Generator インスタンスのプロパティ
Generator インスタンスは Table 91 に記述される内部スロットを持って初期化される。
Table 91: Generator インスタンスの内部スロット
Internal Slot
Type
Description
[[GeneratorState]]
suspended-start , suspended-yield , executing , or completed
ジェネレータの現在の実行状態。
[[GeneratorContext]]
実行コンテキスト
このジェネレータのコードを実行する際に使用される実行コンテキスト。
[[GeneratorBrand]]
文字列または empty
異なる種類のジェネレータを区別するために使用されるブランド。ECMAScript ソーステキスト で宣言されたジェネレータの [[GeneratorBrand]] は常に empty である。
27.5.3 Generator 抽象操作
27.5.3.1 GeneratorStart ( generator , generatorBody )
The abstract operation GeneratorStart takes arguments generator (a Generator) and generatorBody (a FunctionBody Parse Node or an Abstract Closure with no parameters) and returns unused . It performs the following steps when called:
事前条件: generator .[[GeneratorState]] は suspended-start である。 genContext を実行中の実行コンテキストとする。genContext の Generator コンポーネントを generator に設定する。closure を、引数なしで generatorBody を捕捉し、呼び出されると次を行う新たな Abstract Closure とする:acGenContext を実行中の実行コンテキストとする。acGenerator を acGenContext の Generator コンポーネントとする。もし generatorBody が Parse Node ならresult を Completion (Evaluation of generatorBody ) とする。 それ以外事前条件: generatorBody は引数なしの Abstract Closure である。 result を Completion (generatorBody ()) とする。 事前条件: ここに戻ってきたとき、ジェネレータは例外を投げたか、暗黙または明示の return を実行している。 acGenContext を実行コンテキストスタックから除去し、スタックトップの実行コンテキストを実行中の実行コンテキストとして復元する。acGenerator .[[GeneratorState]] を completed に設定する。注: ジェネレータが completed 状態に入ると二度と離れず、その関連実行コンテキストが再開されることはない。acGenerator に関連する任意の実行状態はこの時点で破棄可能。 もし result が normal completion ならresultValue を undefined とする。 それ以外で result が return completion ならresultValue を result .[[Value]] とする。 それ以外事前条件: result は throw completion である。 ? result を返す。 NormalCompletion (CreateIteratorResultObject (resultValue , true )) を返す。genContext のコード評価状態を、評価が再開されたとき引数なしで closure が呼び出されるように設定する。generator .[[GeneratorContext]] を genContext に設定する。unused を返す。
27.5.3.2 GeneratorValidate ( generator , generatorBrand )
The abstract operation GeneratorValidate takes arguments generator (an ECMAScript language value) and generatorBrand (a String or empty ) and returns 正常完了で suspended-start , suspended-yield , completed のいずれかを含むか、または throw completion . It performs the following steps when called:
? RequireInternalSlot (generator , [[GeneratorState]] ) を実行する。 ? RequireInternalSlot (generator , [[GeneratorBrand]] ) を実行する。 もし generator .[[GeneratorBrand]] が generatorBrand でなければ TypeError 例外を投げる。 事前条件: generator は [[GeneratorContext]] 内部スロットも持つ。 state を generator .[[GeneratorState]] とする。もし state が executing なら TypeError 例外を投げる。 state を返す。
27.5.3.3 GeneratorResume ( generator , value , generatorBrand )
The abstract operation GeneratorResume takes arguments generator (an ECMAScript language value), value (an ECMAScript language value or empty ), and generatorBrand (a String or empty ) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion . It performs the following steps when called:
state を ? GeneratorValidate (generator , generatorBrand ) とする。もし state が completed なら CreateIteratorResultObject (undefined , true ) を返す。 事前条件: state は suspended-start または suspended-yield のいずれか。 genContext を generator .[[GeneratorContext]] とする。methodContext を実行中の実行コンテキストとする。methodContext をサスペンドする。generator .[[GeneratorState]] を executing に設定する。genContext を実行コンテキストスタックにプッシュし、genContext を実行中の実行コンテキストとする。genContext のサスペンドされた評価を再開 し、サスペンドを発生させた操作の結果として NormalCompletion (value ) を用いる。result を再開された計算により返された値とする。事前条件: ここに戻るとき、genContext はすでに実行コンテキストスタックから除去され、methodContext が現在の実行中の実行コンテキストである。 ? result を返す。
27.5.3.4 GeneratorResumeAbrupt ( generator , abruptCompletion , generatorBrand )
The abstract operation GeneratorResumeAbrupt takes arguments generator (an ECMAScript language value), abruptCompletion (a return completion or a throw completion ), and generatorBrand (a String or empty ) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion . It performs the following steps when called:
state を ? GeneratorValidate (generator , generatorBrand ) とする。もし state が suspended-start ならgenerator .[[GeneratorState]] を completed に設定する。注: ジェネレータが completed 状態に入ると二度と離れず、その関連実行コンテキストが再開されることはない。generator に関連する任意の実行状態はこの時点で破棄可能。 state を completed に設定する。 もし state が completed ならもし abruptCompletion が return completion ならCreateIteratorResultObject (abruptCompletion .[[Value]] , true ) を返す。 ? abruptCompletion を返す。 事前条件: state は suspended-yield である。 genContext を generator .[[GeneratorContext]] とする。methodContext を実行中の実行コンテキストとする。methodContext をサスペンドする。generator .[[GeneratorState]] を executing に設定する。genContext を実行コンテキストスタックにプッシュし、genContext を実行中の実行コンテキストとする。genContext のサスペンドされた評価を再開 し、サスペンドを発生させた操作の結果として abruptCompletion を用いる。result を再開された計算により返された Completion Record とする。事前条件: ここに戻るとき、genContext はすでに実行コンテキストスタックから除去され、methodContext が現在の実行中の実行コンテキストである。 ? result を返す。
27.5.3.5 GetGeneratorKind ( )
The abstract operation GetGeneratorKind takes no arguments and returns non-generator , sync , or async . It performs the following steps when called:
genContext を実行中の実行コンテキストとする。もし genContext が Generator コンポーネントを持たなければ non-generator を返す。 generator を genContext の Generator コンポーネントとする。もし generator が [[AsyncGeneratorState]] 内部スロットを持てば async を返す。 それ以外は sync を返す。
27.5.3.6 GeneratorYield ( iteratorResult )
The abstract operation GeneratorYield takes argument iteratorResult (an Object that conforms to the IteratorResult interface) and returns 正常完了で ECMAScript 言語値を含むか、または abrupt completion . It performs the following steps when called:
genContext を実行中の実行コンテキストとする。事前条件: genContext はジェネレータの実行コンテキストである。 generator を genContext の Generator コンポーネントの値とする。事前条件: GetGeneratorKind () は sync である。 generator .[[GeneratorState]] を suspended-yield に設定する。genContext を実行コンテキストスタックから除去し、スタックトップの実行コンテキストを実行中の実行コンテキストとして復元する。callerContext を実行中の実行コンテキストとする。callerContext を再開し NormalCompletion (iteratorResult ) を渡す。もし genContext が再度再開されるなら、resumptionValue をそれで再開された Completion Record とする。事前条件: ここに制御が到達したとき、genContext が再び実行中の実行コンテキストである。 resumptionValue を返す。
27.5.3.7 Yield ( value )
The abstract operation Yield takes argument value (an ECMAScript language value) and returns 正常完了で ECMAScript 言語値を含むか、または abrupt completion . It performs the following steps when called:
generatorKind を GetGeneratorKind () とする。もし generatorKind が async なら ? AsyncGeneratorYield (? Await (value )) を返す。 それ以外は ? GeneratorYield (CreateIteratorResultObject (value , false )) を返す。
27.5.3.8 CreateIteratorFromClosure ( closure , generatorBrand , generatorPrototype [ , extraSlots ] )
The abstract operation CreateIteratorFromClosure takes arguments closure (an Abstract Closure with no parameters), generatorBrand (a String or empty ), and generatorPrototype (an Object) and optional argument extraSlots (a List of names of internal slots) and returns a Generator. It performs the following steps when called:
注: closure は IteratorResult オブジェクトを yield するために Yield 操作を使用することができる。 もし extraSlots が存在しなければ extraSlots を新しい空 List に設定する。 internalSlotsList を extraSlots と « [[GeneratorState]] , [[GeneratorContext]] , [[GeneratorBrand]] » のリスト結合 とする。generator を OrdinaryObjectCreate (generatorPrototype , internalSlotsList ) とする。generator .[[GeneratorBrand]] を generatorBrand に設定する。generator .[[GeneratorState]] を suspended-start に設定する。callerContext を実行中の実行コンテキストとする。calleeContext を新しい実行コンテキストとする。calleeContext の Function を null に設定する。calleeContext の Realm を現在の Realm Record に設定する。calleeContext の ScriptOrModule を callerContext の ScriptOrModule に設定する。もし callerContext がまだサスペンドされていなければ callerContext をサスペンドする。 calleeContext を実行コンテキストスタックにプッシュし、calleeContext を実行中の実行コンテキストとする。GeneratorStart (generator , closure ) を実行する。calleeContext を実行コンテキストスタックから除去し、callerContext を実行中の実行コンテキストとして復元する。generator を返す。
27.6 AsyncGenerator オブジェクト
AsyncGenerator は非同期ジェネレータ関数を呼び出すことで生成され、非同期イテレータインタフェースおよび非同期 iterable インタフェース の双方に適合する。
AsyncGenerator インスタンスは、それを生成した非同期ジェネレータ関数の "prototype" プロパティ初期値から直接プロパティを継承し、間接的に %AsyncGeneratorPrototype% からプロパティを継承する。
27.6.1 %AsyncGeneratorPrototype% オブジェクト
%AsyncGeneratorPrototype% オブジェクト:
%AsyncGeneratorFunction.prototype.prototype% である。
通常のオブジェクトである。
AsyncGenerator インスタンスではなく、[[AsyncGeneratorState]] 内部スロットを持たない。
[[Prototype]] 内部スロットの値は %AsyncIteratorPrototype% である。
すべての AsyncGenerator インスタンスが間接的に継承するプロパティを持つ。
27.6.1.1 %AsyncGeneratorPrototype%.constructor
%AsyncGeneratorPrototype% .constructor
の初期値は %AsyncGeneratorFunction.prototype% である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.6.1.2 %AsyncGeneratorPrototype%.next ( value )
generator を this 値とする。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。result を Completion (AsyncGeneratorValidate (generator , empty )) とする。IfAbruptRejectPromise (result , promiseCapability )。state を generator .[[AsyncGeneratorState]] とする。もし state が completed ならiteratorResult を CreateIteratorResultObject (undefined , true ) とする。! Call (promiseCapability .[[Resolve]] , undefined , « iteratorResult ») を実行する。 promiseCapability .[[Promise]] を返す。 completion を NormalCompletion (value ) とする。AsyncGeneratorEnqueue (generator , completion , promiseCapability ) を実行する。もし state が suspended-start または suspended-yield のいずれかならAsyncGeneratorResume (generator , completion ) を実行する。 それ以外事前条件: state は executing または draining-queue のいずれか。 promiseCapability .[[Promise]] を返す。
27.6.1.3 %AsyncGeneratorPrototype%.return ( value )
generator を this 値とする。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。result を Completion (AsyncGeneratorValidate (generator , empty )) とする。IfAbruptRejectPromise (result , promiseCapability )。completion を ReturnCompletion (value ) とする。AsyncGeneratorEnqueue (generator , completion , promiseCapability ) を実行する。state を generator .[[AsyncGeneratorState]] とする。もし state が suspended-start あるいは completed のいずれかならgenerator .[[AsyncGeneratorState]] を draining-queue に設定する。AsyncGeneratorAwaitReturn (generator ) を実行する。 それ以外で state が suspended-yield ならAsyncGeneratorResume (generator , completion ) を実行する。 それ以外事前条件: state は executing または draining-queue のいずれか。 promiseCapability .[[Promise]] を返す。
27.6.1.4 %AsyncGeneratorPrototype%.throw ( exception )
generator を this 値とする。promiseCapability を ! NewPromiseCapability (%Promise% ) とする。result を Completion (AsyncGeneratorValidate (generator , empty )) とする。IfAbruptRejectPromise (result , promiseCapability )。state を generator .[[AsyncGeneratorState]] とする。もし state が suspended-start ならgenerator .[[AsyncGeneratorState]] を completed に設定する。state を completed に設定する。 もし state が completed なら! Call(promiseCapability .[[Reject]] , undefined , « exception ») を実行する。 promiseCapability .[[Promise]] を返す。 completion を ThrowCompletion (exception ) とする。AsyncGeneratorEnqueue (generator , completion , promiseCapability ) を実行する。もし state が suspended-yield ならAsyncGeneratorResume (generator , completion ) を実行する。 それ以外事前条件: state は executing または draining-queue のいずれか。 promiseCapability .[[Promise]] を返す。
27.6.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列値 "AsyncGenerator" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.6.2 AsyncGenerator インスタンスのプロパティ
AsyncGenerator インスタンスは初期化時に以下の内部スロットを持つ:
Table 92: AsyncGenerator インスタンスの内部スロット
Internal Slot
Type
Description
[[AsyncGeneratorState]]
suspended-start , suspended-yield , executing , draining-queue , or completed
非同期ジェネレータの現在の実行状態。
[[AsyncGeneratorContext]]
an execution context
この非同期ジェネレータのコードを実行する際に用いる実行コンテキスト。
[[AsyncGeneratorQueue]]
a List of AsyncGeneratorRequest Records
非同期ジェネレータ再開要求を表すレコード。状態遷移中を除き、[[AsyncGeneratorState]] が executing または draining-queue の場合に限り非空。
[[GeneratorBrand]]
a String or empty
異なる種類の非同期ジェネレータを識別するブランド。ECMAScript ソースで宣言されたものの [[GeneratorBrand]] は常に empty 。
27.6.3 AsyncGenerator 抽象操作
27.6.3.1 AsyncGeneratorRequest レコード
AsyncGeneratorRequest は、非同期ジェネレータをどのように再開すべきかの情報を保持し、対応する promise を履行または拒否するためのケイパビリティを含む Record 値である。
以下のフィールドを持つ:
Table 93: AsyncGeneratorRequest Record フィールド
27.6.3.2 AsyncGeneratorStart ( generator , generatorBody )
The abstract operation AsyncGeneratorStart takes arguments generator (an AsyncGenerator) and generatorBody (a FunctionBody Parse Node or an Abstract Closure with no parameters) and returns unused . It performs the following steps when called:
事前条件: generator .[[AsyncGeneratorState]] は suspended-start 。 genContext を実行中の実行コンテキストとする。genContext の Generator コンポーネントを generator に設定する。closure を、引数なしで generatorBody を捕捉し、呼び出されると次を行う新たな Abstract Closure とする:acGenContext を実行中の実行コンテキストとする。acGenerator を acGenContext の Generator コンポーネントとする。もし generatorBody が Parse Node ならresult を Completion (Evaluation of generatorBody ) とする。 それ以外事前条件: generatorBody は引数なしの Abstract Closure 。 result を Completion (generatorBody ()) とする。 事前条件: ここに戻るとき、非同期ジェネレータは例外送出または暗黙/明示の return を行っている。 acGenContext を実行コンテキストスタックから除去し、スタック頂上の実行コンテキストを実行中として復元する。acGenerator .[[AsyncGeneratorState]] を draining-queue に設定する。もし result が normal completion なら result を NormalCompletion (undefined ) に設定する。 もし result が return completion なら result を NormalCompletion (result .[[Value]] ) に設定する。 AsyncGeneratorCompleteStep (acGenerator , result , true ) を実行する。AsyncGeneratorDrainQueue (acGenerator ) を実行する。NormalCompletion (undefined ) を返す。genContext のコード評価状態を、再開時に引数なしで closure が呼ばれるよう設定する。generator .[[AsyncGeneratorContext]] を genContext に設定する。generator .[[AsyncGeneratorQueue]] を新しい空の List に設定する。unused を返す。
27.6.3.3 AsyncGeneratorValidate ( generator , generatorBrand )
The abstract operation AsyncGeneratorValidate takes arguments generator (an ECMAScript language value) and generatorBrand (a String or empty ) and returns 正常完了で unused を含むか、または throw completion . It performs the following steps when called:
? RequireInternalSlot (generator , [[AsyncGeneratorContext]] ) を実行。 ? RequireInternalSlot (generator , [[AsyncGeneratorState]] ) を実行。 ? RequireInternalSlot (generator , [[AsyncGeneratorQueue]] ) を実行。 もし generator .[[GeneratorBrand]] が generatorBrand でなければ TypeError 例外を投げる。 unused を返す。
27.6.3.4 AsyncGeneratorEnqueue ( generator , completion , promiseCapability )
The abstract operation AsyncGeneratorEnqueue takes arguments generator (an AsyncGenerator), completion (a Completion Record ), and promiseCapability (a PromiseCapability Record ) and returns unused . It performs the following steps when called:
request を AsyncGeneratorRequest { [[Completion]] : completion , [[Capability]] : promiseCapability } とする。request を generator .[[AsyncGeneratorQueue]] に追加する。unused を返す。
27.6.3.5 AsyncGeneratorCompleteStep ( generator , completion , done [ , realm ] )
The abstract operation AsyncGeneratorCompleteStep takes arguments generator (an AsyncGenerator), completion (a Completion Record ), and done (a Boolean) and optional argument realm (a Realm Record ) and returns unused . It performs the following steps when called:
事前条件: generator .[[AsyncGeneratorQueue]] は空でない。 next を generator .[[AsyncGeneratorQueue]] の先頭要素とする。先頭要素を generator .[[AsyncGeneratorQueue]] から除去する。 promiseCapability を next .[[Capability]] とする。value を completion .[[Value]] とする。もし completion が throw completion なら! Call(promiseCapability .[[Reject]] , undefined , « value ») を実行する。 それ以外事前条件: completion は normal completion 。 もし realm が存在すればoldRealm を実行中の実行コンテキストの Realm とする。実行中の実行コンテキストの Realm を realm に設定する。 iteratorResult を CreateIteratorResultObject (value , done ) とする。実行中の実行コンテキストの Realm を oldRealm に戻す。 それ以外iteratorResult を CreateIteratorResultObject (value , done ) とする。 ! Call (promiseCapability .[[Resolve]] , undefined , « iteratorResult ») を実行する。 unused を返す。
27.6.3.6 AsyncGeneratorResume ( generator , completion )
The abstract operation AsyncGeneratorResume takes arguments generator (an AsyncGenerator) and completion (a Completion Record ) and returns unused . It performs the following steps when called:
事前条件: generator .[[AsyncGeneratorState]] は suspended-start か suspended-yield のいずれか。 genContext を generator .[[AsyncGeneratorContext]] とする。callerContext を実行中の実行コンテキストとする。callerContext をサスペンドする。generator .[[AsyncGeneratorState]] を executing に設定する。genContext を実行コンテキストスタックにプッシュし、実行中の実行コンテキストとする。genContext のサスペンドされた評価を再開 し、サスペンドを引き起こした操作の結果として completion を用いる。result を再開計算が返す Completion Record とする。事前条件: result は abrupt completion にはならない。 事前条件: ここに戻るとき genContext はスタックから除去され、callerContext が実行中。 unused を返す。
27.6.3.7 AsyncGeneratorUnwrapYieldResumption ( resumptionValue )
The abstract operation AsyncGeneratorUnwrapYieldResumption takes argument resumptionValue (a Completion Record ) and returns 正常完了で ECMAScript 言語値を含むか、または abrupt completion . It performs the following steps when called:
もし resumptionValue が return completion でなければ ? resumptionValue を返す。 awaited を Completion (Await (resumptionValue .[[Value]] )) とする。もし awaited が throw completion なら ? awaited を返す。 事前条件: awaited は normal completion 。 Return ReturnCompletion (awaited .[[Value]] )。
27.6.3.8 AsyncGeneratorYield ( value )
The abstract operation AsyncGeneratorYield takes argument value (an ECMAScript language value) and returns 正常完了で ECMAScript 言語値を含むか、または abrupt completion . It performs the following steps when called:
genContext を実行中の実行コンテキストとする。事前条件: genContext はジェネレータの実行コンテキスト。 generator を genContext の Generator コンポーネントの値とする。事前条件: GetGeneratorKind () は async 。 completion を NormalCompletion (value ) とする。事前条件: 実行コンテキストスタックは少なくとも 2 要素を持つ。 previousContext をスタック二番目の要素とする。previousRealm を previousContext の Realm とする。AsyncGeneratorCompleteStep (generator , completion , false , previousRealm ) を実行する。queue を generator .[[AsyncGeneratorQueue]] とする。もし queue が空でないなら注: ジェネレータをサスペンドせず実行継続。 toYield を queue の先頭要素とする。resumptionValue を Completion (toYield .[[Completion]] ) とする。? AsyncGeneratorUnwrapYieldResumption (resumptionValue ) を返す。 それ以外generator .[[AsyncGeneratorState]] を suspended-yield に設定する。genContext を実行コンテキストスタックから除去し、頂上の実行コンテキストを実行中として復元する。callerContext を実行中の実行コンテキストとする。callerContext を undefined を渡して再開する。もし genContext が再度再開されるなら resumptionValue をその Completion Record とする。事前条件: ここに到達したとき genContext が再び実行中。 ? AsyncGeneratorUnwrapYieldResumption (resumptionValue ) を返す。
27.6.3.9 AsyncGeneratorAwaitReturn ( generator )
The abstract operation AsyncGeneratorAwaitReturn takes argument generator (an AsyncGenerator) and returns unused . It performs the following steps when called:
事前条件: generator .[[AsyncGeneratorState]] は draining-queue 。 queue を generator .[[AsyncGeneratorQueue]] とする。事前条件: queue は空でない。 next を queue の先頭要素とする。completion を Completion (next .[[Completion]] ) とする。事前条件: completion は return completion 。 promiseCompletion を Completion (PromiseResolve (%Promise% , completion .[[Value]] )) とする。もし promiseCompletion が abrupt completion ならAsyncGeneratorCompleteStep (generator , promiseCompletion , true ) を実行。AsyncGeneratorDrainQueue (generator ) を実行。unused を返す。 事前条件: promiseCompletion は normal completion 。 promise を promiseCompletion .[[Value]] とする。fulfilledClosure をパラメータ (value ) を取り generator を捕捉し呼び出されると次を行う新たな Abstract Closure とする:事前条件: generator .[[AsyncGeneratorState]] は draining-queue 。 result を NormalCompletion (value ) とする。AsyncGeneratorCompleteStep (generator , result , true ) を実行。AsyncGeneratorDrainQueue (generator ) を実行。NormalCompletion (undefined ) を返す。onFulfilled を CreateBuiltinFunction (fulfilledClosure , 1, "" , « ») とする。rejectedClosure をパラメータ (reason ) を取り generator を捕捉し呼び出されると次を行う新たな Abstract Closure とする:事前条件: generator .[[AsyncGeneratorState]] は draining-queue 。 result を ThrowCompletion (reason ) とする。AsyncGeneratorCompleteStep (generator , result , true ) を実行。AsyncGeneratorDrainQueue (generator ) を実行。NormalCompletion (undefined ) を返す。onRejected を CreateBuiltinFunction (rejectedClosure , 1, "" , « ») とする。PerformPromiseThen (promise , onFulfilled , onRejected ) を実行する。unused を返す。
27.6.3.10 AsyncGeneratorDrainQueue ( generator )
The abstract operation AsyncGeneratorDrainQueue takes argument generator (an AsyncGenerator) and returns unused . AsyncGeneratorQueue を、return completion を保持する AsyncGeneratorRequest に遭遇するまで処理する。 It performs the following steps when called:
事前条件: generator .[[AsyncGeneratorState]] は draining-queue 。 queue を generator .[[AsyncGeneratorQueue]] とする。queue が空でない間繰り返す,next を queue の先頭要素とする。completion を Completion (next .[[Completion]] ) とする。もし completion が return completion ならAsyncGeneratorAwaitReturn (generator ) を実行。unused を返す。 それ以外もし completion が normal completion ならcompletion を NormalCompletion (undefined ) に設定。 AsyncGeneratorCompleteStep (generator , completion , true ) を実行。 generator .[[AsyncGeneratorState]] を completed に設定。unused を返す。
27.6.3.11 CreateAsyncIteratorFromClosure ( closure , generatorBrand , generatorPrototype )
The abstract operation CreateAsyncIteratorFromClosure takes arguments closure (an Abstract Closure with no parameters), generatorBrand (a String or empty ), and generatorPrototype (an Object) and returns an AsyncGenerator. It performs the following steps when called:
注: closure は Await 操作および IteratorResult オブジェクトを yield するための Yield 操作を含み得る。 internalSlotsList を « [[AsyncGeneratorState]] , [[AsyncGeneratorContext]] , [[AsyncGeneratorQueue]] , [[GeneratorBrand]] » とする。generator を OrdinaryObjectCreate (generatorPrototype , internalSlotsList ) とする。generator .[[GeneratorBrand]] を generatorBrand に設定する。generator .[[AsyncGeneratorState]] を suspended-start に設定する。callerContext を実行中の実行コンテキストとする。calleeContext を新しい実行コンテキストとする。calleeContext の Function を null に設定する。calleeContext の Realm を現在の Realm Record に設定する。calleeContext の ScriptOrModule を callerContext の ScriptOrModule に設定する。もし callerContext がまだサスペンドされていなければ callerContext をサスペンドする。 calleeContext を実行コンテキストスタックにプッシュし、実行中の実行コンテキストとする。AsyncGeneratorStart (generator , closure ) を実行する。calleeContext を実行コンテキストスタックから除去し、callerContext を実行中として復元する。generator を返す。
27.7 AsyncFunction オブジェクト
AsyncFunction は通常 AsyncFunctionDeclaration 、AsyncFunctionExpression 、AsyncMethod 、AsyncArrowFunction を評価することで生成される。%AsyncFunction% 組込みを呼び出すことでも生成され得る。
27.7.1 AsyncFunction コンストラクタ
AsyncFunction コンストラクタ :
%AsyncFunction% である。
Function
のサブクラスである。
コンストラクタ ではなく関数として呼び出されたとき新しい AsyncFunction を生成し初期化する。したがって関数呼び出し AsyncFunction(…)
は同じ引数での new AsyncFunction(…)
と同等。
クラス定義の extends
句の値として使用できる。指定された AsyncFunction の挙動を継承するサブクラスコンストラクタ は、組込み非同期関数挙動に必要な内部スロットを備えたサブクラスインスタンスを生成・初期化するため AsyncFunction コンストラクタ への super
呼び出しを含めなければならない。非同期関数オブジェクト を定義する全ての構文形式は AsyncFunction の直接インスタンスを生成する。AsyncFunction サブクラスインスタンスを構文的に生成する手段はない。
27.7.1.1 AsyncFunction ( ...parameterArgs , bodyArg )
最後の引数(存在する場合)が非同期関数の本体(実行コード)を指定し、それ以前の引数が仮引数を指定する。
この関数は呼び出されると次を実行する:
C をアクティブな関数オブジェクト とする。もし bodyArg が存在しなければ bodyArg を空文字列に設定する。 ? CreateDynamicFunction (C , NewTarget, async , parameterArgs , bodyArg ) を返す。
Note
27.7.2 AsyncFunction コンストラクタのプロパティ
AsyncFunction コンストラクタ :
Function コンストラクタ を継承する標準組込み関数オブジェクト である。
[[Prototype]] 内部スロットの値は %Function% である。
"length" プロパティを持ち、その値は 1 𝔽 である。
"name" プロパティを持ち、その値は "AsyncFunction" である。
次のプロパティを持つ:
27.7.2.1 AsyncFunction.prototype
AsyncFunction.prototype
の初期値は AsyncFunction プロトタイプオブジェクト である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
27.7.3 AsyncFunction プロトタイプオブジェクトのプロパティ
AsyncFunction プロトタイプオブジェクト :
27.7.3.1 AsyncFunction.prototype.constructor
AsyncFunction.prototype.constructor
の初期値は %AsyncFunction% である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.7.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列値 "AsyncFunction" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
27.7.4 AsyncFunction インスタンス
すべての AsyncFunction インスタンスは ECMAScript 関数オブジェクト であり、Table 28 に列挙される内部スロットを持つ。これらのインスタンスの [[IsClassConstructor]] 内部スロット値は false 。AsyncFunction インスタンスはコンストラクタ ではなく [[Construct]] 内部メソッドを持たない。また構築不可能であるため prototype プロパティを持たない。
各 AsyncFunction インスタンスは次の独自プロパティを持つ:
27.7.4.1 length
20.2.4.1 で与えられる Function インスタンスの "length" プロパティ仕様は AsyncFunction インスタンスにも適用される。
27.7.4.2 name
20.2.4.2 で与えられる Function インスタンスの "name" プロパティ仕様は AsyncFunction インスタンスにも適用される。
27.7.5 Async Function 抽象操作
27.7.5.1 AsyncFunctionStart ( promiseCapability , asyncFunctionBody )
The abstract operation AsyncFunctionStart takes arguments promiseCapability (a PromiseCapability Record ) and asyncFunctionBody (a FunctionBody Parse Node, an ExpressionBody Parse Node, or an Abstract Closure with no parameters) and returns unused . It performs the following steps when called:
runningContext を実行中の実行コンテキストとする。asyncContext を runningContext のコピーとする。注: 現在実行中のコンテキストを再開することは未定義であるため、AsyncBlockStart が再開できるよう実行状態のコピーが必要。 AsyncBlockStart (promiseCapability , asyncFunctionBody , asyncContext ) を実行する。unused を返す。
27.7.5.2 AsyncBlockStart ( promiseCapability , asyncBody , asyncContext )
The abstract operation AsyncBlockStart takes arguments promiseCapability (a PromiseCapability Record ), asyncBody (a Parse Node or an Abstract Closure with no parameters), and asyncContext (an execution context ) and returns unused . It performs the following steps when called:
runningContext を実行中の実行コンテキストとする。closure を、引数なしで promiseCapability と asyncBody を捕捉し呼び出されると次を行う新たな Abstract Closure とする:acAsyncContext を実行中の実行コンテキストとする。もし asyncBody が Parse Node ならresult を Completion (Evaluation of asyncBody ) とする。 それ以外事前条件: asyncBody は引数なしの Abstract Closure 。 result を Completion (asyncBody ()) とする。 事前条件: ここに戻るとき非同期関数は例外送出か暗黙/明示の return を行っており、全ての await は完了。 acAsyncContext を実行コンテキストスタックから除去し、頂上の実行コンテキストを実行中として復元。もし result が normal completion なら! Call(promiseCapability .[[Resolve]] , undefined , « undefined ») を実行。 それ以外で result が return completion なら! Call (promiseCapability .[[Resolve]] , undefined , « result .[[Value]] ») を実行。 それ以外事前条件: result は throw completion 。 ! Call(promiseCapability .[[Reject]] , undefined , « result .[[Value]] ») を実行。 NormalCompletion (unused ) を返す。asyncContext のコード評価状態を、再開時に引数なしで closure が呼ばれるよう設定。asyncContext を実行コンテキストスタックにプッシュし実行中とする。asyncContext のサスペンドされた評価を再開 。result を再開計算が返した値とする。事前条件: ここに戻るとき asyncContext はスタックから除去され runningContext が実行中。 事前条件: result は値 unused を持つ normal completion 。値の起源は Await か(await が無い場合)上記 2.i 。 unused を返す。
27.7.5.3 Await ( value )
The abstract operation Await takes argument value (an ECMAScript language value) and returns 正常完了で ECMAScript 言語値または empty を含むか、または throw completion . It performs the following steps when called:
asyncContext を実行中の実行コンテキストとする。promise を ? PromiseResolve (%Promise% , value ) とする。fulfilledClosure をパラメータ (v ) を取り asyncContext を捕捉し呼び出されると次を行う新たな Abstract Closure とする:prevContext を実行中の実行コンテキストとする。prevContext をサスペンドする。asyncContext を実行コンテキストスタックにプッシュし実行中とする。asyncContext のサスペンドされた評価を再開 し、サスペンドを発生させた操作の結果として NormalCompletion (v ) を用いる。事前条件: この段階で asyncContext はスタックから除去され prevContext が実行中。 NormalCompletion (undefined ) を返す。onFulfilled を CreateBuiltinFunction (fulfilledClosure , 1, "" , « ») とする。rejectedClosure をパラメータ (reason ) を取り asyncContext を捕捉し呼び出されると次を行う新たな Abstract Closure とする:prevContext を実行中の実行コンテキストとする。prevContext をサスペンドする。asyncContext を実行コンテキストスタックにプッシュし実行中とする。asyncContext のサスペンドされた評価を再開 し、サスペンドを発生させた操作の結果として ThrowCompletion (reason ) を用いる。事前条件: この段階で asyncContext はスタックから除去され prevContext が実行中。 NormalCompletion (undefined ) を返す。onRejected を CreateBuiltinFunction (rejectedClosure , 1, "" , « ») とする。PerformPromiseThen (promise , onFulfilled , onRejected ) を実行する。asyncContext を実行コンテキストスタックから除去し、頂上の実行コンテキストを実行中として復元する。callerContext を実行中の実行コンテキストとする。callerContext を empty を渡して再開する。もし asyncContext が再度再開されるなら completion をその Completion Record とする。事前条件: ここに到達したとき asyncContext が再び実行中。 completion を返す。
28 リフレクション (Reflection)
28.1 Reflect オブジェクト (The Reflect Object)
Reflect オブジェクト:
28.1.1 Reflect.apply ( target , thisArgument , argumentsList )
この関数は呼び出されると次の手順を実行する:
もし IsCallable (target ) が false なら TypeError 例外を投げる。 args を ? CreateListFromArrayLike(argumentsList ) とする。PrepareForTailCall () を実行する。? Call(target , thisArgument , args ) を返す。
28.1.2 Reflect.construct ( target , argumentsList [ , newTarget ] )
この関数は呼び出されると次の手順を実行する:
もし IsConstructor (target ) が false なら TypeError 例外を投げる。 もし newTarget が存在しなければ newTarget を target に設定する。 それ以外で IsConstructor (newTarget ) が false なら TypeError 例外を投げる。 args を ? CreateListFromArrayLike(argumentsList ) とする。? Construct(target , args , newTarget ) を返す。
28.1.3 Reflect.defineProperty ( target , propertyKey , attributes )
この関数は呼び出されると次の手順を実行する:
もし target が Object でなければ TypeError 例外を投げる。 key を ? ToPropertyKey (propertyKey ) とする。desc を ? ToPropertyDescriptor (attributes ) とする。? target .[[DefineOwnProperty]] (key , desc ) を返す。
28.1.4 Reflect.deleteProperty ( target , propertyKey )
この関数は呼び出されると次の手順を実行する:
もし target が Object でなければ TypeError 例外を投げる。 key を ? ToPropertyKey (propertyKey ) とする。? target .[[Delete]] (key ) を返す。
28.1.5 Reflect.get ( target , propertyKey [ , receiver ] )
この関数は呼び出されると次の手順を実行する:
もし target が Object でなければ TypeError 例外を投げる。 key を ? ToPropertyKey (propertyKey ) とする。もし receiver が存在しなければreceiver を target に設定する。 ? target .[[Get]] (key , receiver ) を返す。
28.1.6 Reflect.getOwnPropertyDescriptor ( target , propertyKey )
この関数は呼び出されると次の手順を実行する:
もし target が Object でなければ TypeError 例外を投げる。 key を ? ToPropertyKey (propertyKey ) とする。desc を ? target .[[GetOwnProperty]] (key ) とする。FromPropertyDescriptor (desc ) を返す。
28.1.7 Reflect.getPrototypeOf ( target )
この関数は呼び出されると次の手順を実行する:
もし target が Object でなければ TypeError 例外を投げる。 ? target .[[GetPrototypeOf]] () を返す。
28.1.8 Reflect.has ( target , propertyKey )
この関数は呼び出されると次の手順を実行する:
もし target が Object でなければ TypeError 例外を投げる。 key を ? ToPropertyKey (propertyKey ) とする。? target .[[HasProperty]] (key ) を返す。
28.1.9 Reflect.isExtensible ( target )
この関数は呼び出されると次の手順を実行する:
もし target が Object でなければ TypeError 例外を投げる。 ? target .[[IsExtensible]] () を返す。
28.1.10 Reflect.ownKeys ( target )
この関数は呼び出されると次の手順を実行する:
もし target が Object でなければ TypeError 例外を投げる。 keys を ? target .[[OwnPropertyKeys]] () とする。CreateArrayFromList (keys ) を返す。
28.1.11 Reflect.preventExtensions ( target )
この関数は呼び出されると次の手順を実行する:
もし target が Object でなければ TypeError 例外を投げる。 ? target .[[PreventExtensions]] () を返す。
28.1.12 Reflect.set ( target , propertyKey , V [ , receiver ] )
この関数は呼び出されると次の手順を実行する:
もし target が Object でなければ TypeError 例外を投げる。 key を ? ToPropertyKey (propertyKey ) とする。もし receiver が存在しなければreceiver を target に設定する。 ? target .[[Set]] (key , V , receiver ) を返す。
28.1.13 Reflect.setPrototypeOf ( target , proto )
この関数は呼び出されると次の手順を実行する:
もし target が Object でなければ TypeError 例外を投げる。 もし proto が Object でなく かつ proto が null でなければ TypeError 例外を投げる。 ? target .[[SetPrototypeOf]] (proto ) を返す。
28.1.14 Reflect [ %Symbol.toStringTag% ]
%Symbol.toStringTag% プロパティの初期値は文字列値 "Reflect" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true } を持つ。
28.2 Proxy オブジェクト (Proxy Objects)
28.2.1 Proxy コンストラクタ (The Proxy Constructor)
Proxy コンストラクタ :
%Proxy% である。
グローバルオブジェクト の "Proxy" プロパティの初期値である。
コンストラクタ として呼び出されたとき新しい Proxy オブジェクトを生成し初期化する。
関数として呼び出すことは意図されておらず、そのように呼び出されると例外を投げる。
28.2.1.1 Proxy ( target , handler )
この関数は呼び出されると次の手順を実行する:
もし NewTarget が undefined なら TypeError 例外を投げる。 ? ProxyCreate (target , handler ) を返す。
28.2.2 Proxy コンストラクタのプロパティ (Properties of the Proxy Constructor)
Proxy コンストラクタ :
[[Prototype]] 内部スロットの値は %Function.prototype% である。
Proxy オブジェクトは初期化を要する [[Prototype]] 内部スロットを持たないため "prototype" プロパティを持たない。
次のプロパティを持つ:
28.2.2.1 Proxy.revocable ( target , handler )
この関数は取り消し可能な Proxy オブジェクトを生成する。
呼び出されると次の手順を実行する:
proxy を ? ProxyCreate (target , handler ) とする。revokerClosure を、引数無しで何も捕捉せず呼び出されると次を行う新たな Abstract Closure とする:F をアクティブな関数オブジェクト とする。p を F .[[RevocableProxy]] とする。もし p が null なら NormalCompletion (undefined ) を返す。 F .[[RevocableProxy]] を null に設定する。事前条件: p は Proxy エキゾチックオブジェクト である。 p .[[ProxyTarget]] を null に設定する。p .[[ProxyHandler]] を null に設定する。NormalCompletion (undefined ) を返す。revoker を CreateBuiltinFunction (revokerClosure , 0, "" , « [[RevocableProxy]] ») とする。revoker .[[RevocableProxy]] を proxy に設定する。result を OrdinaryObjectCreate (%Object.prototype% ) とする。! CreateDataPropertyOrThrow (result , "proxy" , proxy ) を実行する。 ! CreateDataPropertyOrThrow (result , "revoke" , revoker ) を実行する。 result を返す。
28.3 モジュール名前空間オブジェクト (Module Namespace Objects)
モジュール名前空間オブジェクトはモジュールのエクスポート束縛へ実行時のプロパティベースアクセスを提供する module namespace エキゾチックオブジェクト である。Module Namespace Objects 用のコンストラクタ 関数は存在しない。代わりに、このようなオブジェクトは NameSpaceImport を含む ImportDeclaration によりインポートされた各モジュールごとに生成される。
10.4.6 で規定されるプロパティに加えて、各 Module Namespace Object は次の自前プロパティを持つ:
28.3.1 %Symbol.toStringTag%
%Symbol.toStringTag% プロパティの初期値は文字列値 "Module" である。
このプロパティは属性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : false } を持つ。
29 メモリーモデル (Memory Model)
メモリ一貫性モデル、すなわち memory model は、SharedArrayBuffer に裏付けられた TypedArray インスタンスへのアクセスおよび Atomics オブジェクト上のメソッドにより生じる Shared Data Block イベントの起こり得る順序を規定する。プログラムに(後述の定義による)データ競合がない場合、イベント順序は逐次的一貫性 (sequentially consistent) として現れ、すなわち各エージェントのアクションのインターリーブとして現れる。プログラムにデータ競合がある場合、共有メモリアクセスは逐次的一貫性を欠いて見える可能性がある。例えばプログラムは因果律に反する振る舞いやその他の驚きを示し得る。これらの驚きはコンパイラ変換および CPU 設計(例: 命令のアウトオブオーダ実行や投機)に由来する。メモリーモデルはプログラムが逐次的一貫性を示す正確な条件と、データ競合から読み得る値の可能性を定義する。言い換えると、undefined behaviour は存在しない。
メモリーモデルは SharedArrayBuffer 上の抽象操作 または Atomics オブジェクト上のメソッドによって評価中に導入されるイベントに対する関係制約として定義される。
Note
この節は SharedArrayBuffer 上の抽象操作 によって導入されるイベントに関する公理的モデルを提供する。モデルは仕様の他の部分と異なりアルゴリズム的に表現できないことを強調する。抽象操作 によるイベントの非決定的導入は ECMAScript 評価の操作的意味論とメモリーモデルの公理的意味論とのインタフェースである。これらイベントの意味は評価内の全イベントのグラフを考慮して定義される。これらは静的意味論 でも実行時意味論 でもない。既知のアルゴリズム実装は示されておらず、代わりに特定のイベントグラフが許容されるか否かを決定する制約集合がある。
29.1 メモリーモデルの基本 (Memory Model Fundamentals)
共有メモリアクセス(読み書き)は後述の定義に従い atomic アクセスと data アクセスの 2 群に分けられる。Atomic アクセスは逐次的一貫性を持つ、すなわちエージェントクラスタ内の全エージェントが合意する厳密な全順序が存在する。非 atomic アクセスは全エージェントが合意する厳密な全順序を持たず、すなわち unordered である。
Note 1
逐次的一貫性より弱く、unordered より強い順序(例: release-acquire)はサポートされない。
Shared Data Block event は ReadSharedMemory 、WriteSharedMemory 、または ReadModifyWriteSharedMemory Record のいずれかである。
Table 94: ReadSharedMemory イベントフィールド (ReadSharedMemory Event Fields)
Field Name
Value
Meaning
[[Order]]
seq-cst または unordered
このイベントに対してメモリーモデルが保証する最弱の順序。
[[NoTear]]
Boolean
このイベントが同一範囲を持つ複数の書き込みイベントから読み取ることを許されるかどうか。
[[Block]]
Shared Data Block
イベントが作用するブロック。
[[ByteIndex]]
非負整数
[[Block]] 内での読み取りのバイト位置。
[[ElementSize]]
非負整数
読み取りサイズ。
Table 95: WriteSharedMemory イベントフィールド (WriteSharedMemory Event Fields)
Field Name
Value
Meaning
[[Order]]
seq-cst , unordered , または init
このイベントに対してメモリーモデルが保証する最弱の順序。
[[NoTear]]
Boolean
このイベントが同一範囲を持つ複数の読み取りイベントから読み取られることを許されるかどうか。
[[Block]]
Shared Data Block
イベントが作用するブロック。
[[ByteIndex]]
非負整数
[[Block]] 内での書き込みのバイト位置。
[[ElementSize]]
非負整数
書き込みサイズ。
[[Payload]]
バイト値 の List
他のイベントによって読み取られるバイト値 の List 。
Table 96: ReadModifyWriteSharedMemory イベントフィールド (ReadModifyWriteSharedMemory Event Fields)
Field Name
Value
Meaning
[[Order]]
seq-cst
Read-modify-write イベントは常に逐次的一貫性。
[[NoTear]]
true
Read-modify-write イベントは tear しない。
[[Block]]
Shared Data Block
イベントが作用するブロック。
[[ByteIndex]]
非負整数
[[Block]] 内での read-modify-write のバイト位置。
[[ElementSize]]
非負整数
read-modify-write のサイズ。
[[Payload]]
バイト値 の List
[[ModifyOp]] に渡されるバイト値 の List 。
[[ModifyOp]]
read-modify-write 変更関数
読み取ったバイト値 の List と [[Payload]] から変更後のバイト値 の List を返す抽象クロージャ。
これらのイベントは抽象操作 または Atomics オブジェクト上のメソッドによって導入される。
一部操作は Synchronize イベントも導入し得る。Synchronize event はフィールドを持たず、他イベントの許容順序を直接制約するためだけに存在する。
Shared Data Block イベントと Synchronize イベントに加えて、ホスト 固有イベントが存在する。
ReadSharedMemory / WriteSharedMemory / ReadModifyWriteSharedMemory イベントの範囲はその [[ByteIndex]] から [[ByteIndex]] + [[ElementSize]] - 1 までの連続整数 集合とする。2 つのイベントの範囲が同じ [[Block]] を持ち要素毎に等しいとき、それらの範囲は等しい。2 つのイベントの範囲が同じ [[Block]] を持ち、範囲が等しくなく かつ 交差が空でないとき、範囲は重複 (overlapping) する。2 つのイベントの範囲が同じ [[Block]] を持たないか、範囲が等しくも重複もしていないとき、範囲は素 (disjoint) である。
Note 2
考慮すべきホスト 固有同期イベント例:SharedArrayBuffer を一方のエージェントから他方へ送る(ブラウザでの postMessage
など)、エージェントの開始と停止、共有メモリ以外のチャネルによるエージェントクラスタ内通信。特定の実行 execution において、それらイベントは host-synchronizes-with 厳密半順序を通じてホスト により提供される。さらにホスト は is-agent-order-before 関係に参加するため execution .[[EventList]] にホスト 固有同期イベントを追加できる。
イベントは以下で定義する関係によって候補実行内で順序付けられる。
29.2 Agent Events レコード (Agent Events Records)
Agent Events Record は次のフィールドを持つ Record である。
Table 97: Agent Events Record フィールド (Agent Events Record Fields)
Field Name
Value
Meaning
[[AgentSignifier]]
エージェント識別子
この順序付けに結果した評価を行ったエージェント。
[[EventList]]
イベントの List
評価中にイベントがリストへ追加される。
[[AgentSynchronizesWith]]
Synchronize イベントのペアの List
操作的意味論によって導入された Synchronize 関係。
29.3 Chosen Value レコード (Chosen Value Records)
Chosen Value Record は次のフィールドを持つ Record である。
Table 98: Chosen Value Record フィールド (Chosen Value Record Fields)
29.4 候補実行 (Candidate Executions)
candidate execution とは次のフィールドを持つエージェントクラスタ評価の Record である。
Table 99: Candidate Execution Record フィールド (Candidate Execution Record Fields)
empty candidate execution はフィールドが空 List である candidate execution Record である。
29.5 メモリーモデル用抽象操作 (Abstract Operations for the Memory Model)
29.5.1 EventSet ( execution )
The abstract operation EventSet takes argument execution (a candidate execution ) and returns a Set of events. It performs the following steps when called:
events を空集合とする。execution .[[EventsRecords]] の各 Agent Events Record aer についてaer .[[EventList]] の各イベント E についてE を events に追加する。events を返す。
29.5.2 SharedDataBlockEventSet ( execution )
The abstract operation SharedDataBlockEventSet takes argument execution (a candidate execution ) and returns a Set of events. It performs the following steps when called:
events を空集合とする。EventSet (execution ) の各イベント E についてもし E が ReadSharedMemory / WriteSharedMemory / ReadModifyWriteSharedMemory イベントなら E を events に追加する。 events を返す。
29.5.3 HostEventSet ( execution )
The abstract operation HostEventSet takes argument execution (a candidate execution ) and returns a Set of events. It performs the following steps when called:
events を空集合とする。EventSet (execution ) の各イベント E についてもし E が SharedDataBlockEventSet (execution ) に含まれないなら E を events に追加する。 events を返す。
29.5.4 ComposeWriteEventBytes ( execution , byteIndex , Ws )
The abstract operation ComposeWriteEventBytes takes arguments execution (a candidate execution ), byteIndex (a non-negative integer), and Ws (a List of either WriteSharedMemory or ReadModifyWriteSharedMemory events) and returns a List of byte values . It performs the following steps when called:
byteLocation を byteIndex とする。bytesRead を新しい空の List とする。Ws の各要素 W について事前条件: W はその範囲に byteLocation を含む。 payloadIndex を byteLocation - W .[[ByteIndex]] とする。もし W が WriteSharedMemory イベントならbyte を W .[[Payload]] [payloadIndex ] とする。 それ以外事前条件: W は ReadModifyWriteSharedMemory イベントである。 bytes を ValueOfReadEvent (execution , W ) とする。bytesModified を W .[[ModifyOp]] (bytes , W .[[Payload]] ) とする。byte を bytesModified [payloadIndex ] とする。 byte を bytesRead に追加する。byteLocation を byteLocation + 1 に設定する。bytesRead を返す。
Note 1
read-modify-write 変更 [[ModifyOp]] は ReadModifyWriteSharedMemory イベントを導入する Atomics オブジェクト上の関数プロパティによって与えられる。
Note 2
29.5.5 ValueOfReadEvent ( execution , R )
The abstract operation ValueOfReadEvent takes arguments execution (a candidate execution ) and R (a ReadSharedMemory or ReadModifyWriteSharedMemory event) and returns a List of byte values . It performs the following steps when called:
Ws を execution における reads-bytes-from (R ) とする。事前条件: Ws は R .[[ElementSize]] と同じ長さの WriteSharedMemory または ReadModifyWriteSharedMemory イベントの List 。 ComposeWriteEventBytes (execution , R .[[ByteIndex]] , Ws ) を返す。
29.6 候補実行における関係 (Relations of Candidate Executions)
以下の関係と数学的関数は特定の候補実行をパラメータに取り、そのイベントを順序付ける。
29.6.1 is-agent-order-before
候補実行 execution における is-agent-order-before 関係は次を満たす最小のイベント上の関係である。
イベント E と D について、execution .[[EventsRecords]] 内のある Agent Events Record aer が存在し aer .[[EventList]] に E と D が含まれ かつ E が List 順序で D より前にあるなら、E is-agent-order-before D in execution 。
Note
各エージェントは評価中にエージェント毎の厳密な全順序でイベントを導入する。これはそれら厳密全順序の合併である。
29.6.2 reads-bytes-from
候補実行 execution における reads-bytes-from 関数は SharedDataBlockEventSet (execution ) 内のイベントを同集合内のイベントの List に写像し次の条件を満たす数学的関数である。
候補実行は常に reads-bytes-from 関数を許容する。
29.6.3 reads-from
候補実行 execution における reads-from 関係は次を満たす最小のイベント上の関係である。
29.6.4 host-synchronizes-with
候補実行 execution における host-synchronizes-with 関係はホスト 提供のホスト 固有イベント上の厳密半順序で少なくとも次を満たす。
Note 1
候補実行 execution 内のホスト 固有イベント E と D について、E host-synchronizes-with D in execution は E happens-before D in execution を意味する。
Note 2
この関係はホスト に追加の同期機構(HTML ワーカー間の postMessage
など)を提供させる。
29.6.5 synchronizes-with
候補実行 execution における synchronizes-with 関係は次を満たす最小のイベント上の関係である。
イベント R と W について、R reads-from W in execution , R .[[Order]] が seq-cst , W .[[Order]] が seq-cst , かつ R と W が等しい範囲なら W synchronizes-with R in execution 。
execution .[[EventsRecords]] の各要素 eventsRecord について次が成り立つ。
イベント S と Sw について、eventsRecord .[[AgentSynchronizesWith]] が (S , Sw ) を含むなら S synchronizes-with Sw in execution 。
イベント E と D について、execution .[[HostSynchronizesWith]] が (E , D ) を含むなら E synchronizes-with D in execution 。
Note 1
メモリーモデル文献の慣例により、候補実行 execution では書き込みイベントが読み取りイベントを synchronizes-with する。
Note 2
候補実行 execution では init イベントはこの関係に参加せず、代わりに happens-before により直接制約される。
Note 3
候補実行 execution において reads-from で関連する全 seq-cst イベントが synchronizes-with で関連するとは限らない。等しい範囲を持つイベントのみが synchronizes-with で関連する。
Note 4
候補実行 execution の Shared Data Block イベント R と W で W synchronizes-with R の場合、R は W 以外の書き込みからも reads-from し得る。
29.6.6 happens-before
候補実行 execution における happens-before 関係は次を満たす最小のイベント上の関係である。
Note
happens-before は agent -order の上位集合であるため、候補実行は ECMAScript の単一スレッド評価意味論と整合する。
29.7 有効な実行の性質 (Properties of Valid Executions)
29.7.1 Valid Chosen Reads
候補実行 execution が valid chosen reads を持つとは次のアルゴリズムが true を返す場合である。
SharedDataBlockEventSet (execution ) の各 ReadSharedMemory または ReadModifyWriteSharedMemory イベント R についてchosenValueRecord を execution .[[ChosenValues]] のうち [[Event]] フィールドが R である要素とする。chosenValue を chosenValueRecord .[[ChosenValue]] とする。readValue を ValueOfReadEvent (execution , R ) とする。chosenLen を chosenValue の要素数とする。readLen を readValue の要素数とする。もし chosenLen ≠ readLen ならfalse を返す。 もし 区間 [0, chosenLen ) のある整数 i について chosenValue [i ] ≠ readValue [i ] ならfalse を返す。 true を返す。
29.7.2 Coherent Reads
候補実行 execution が coherent reads を持つとは次のアルゴリズムが true を返す場合である。
SharedDataBlockEventSet (execution ) の各 ReadSharedMemory または ReadModifyWriteSharedMemory イベント R についてWs を reads-bytes-from (R ) in execution とする。byteLocation を R .[[ByteIndex]] とする。Ws の各要素 W についてもし R happens-before W in execution ならfalse を返す。 もし byteLocation をその範囲に含む WriteSharedMemory または ReadModifyWriteSharedMemory イベント V が存在し、W happens-before V かつ V happens-before R in execution ならfalse を返す。 byteLocation を byteLocation + 1 に設定する。true を返す。
29.7.3 Tear Free Reads
候補実行 execution が tear free reads を持つとは次のアルゴリズムが true を返す場合である。
SharedDataBlockEventSet (execution ) の各 ReadSharedMemory または ReadModifyWriteSharedMemory イベント R についてもし R .[[NoTear]] が true なら事前条件: R .[[ByteIndex]] を R .[[ElementSize]] で割った余りは 0。 R reads-from W in execution であり W .[[NoTear]] が true である各イベント W についてもし R と W が等しい範囲を持ち、R と W が同じ Shared Data Block event でなく、R reads-from V in execution を満たす等しい範囲と [[NoTear]] が true のイベント V が存在するならfalse を返す。 true を返す。
Note
イベントの [[NoTear]] フィールドは整数 TypedArray へのアクセスで導入されたとき true 、浮動小数点 TypedArray または DataView で導入されたとき false 。
直感的説明: メモリ範囲が整数 TypedArray によりアラインされた形でアクセスされたとき、その範囲に対する単一の書き込みイベントが同範囲の他の書き込みイベントとのデータ競合で「勝つ」必要がある。より厳密には、アラインされた読み取りイベントが、同一範囲を持つ複数の異なる書き込みイベントのバイトを混合した値を読んではならない。なお、アラインされた読み取りイベントが重複範囲を持つ複数の書き込みイベントから読む可能性は残る。
29.7.4 Sequentially Consistent Atomics
候補実行 execution において、is-memory-order-before は EventSet (execution ) 内の全イベント上の厳密全順序で次を満たす。
候補実行は is-memory-order-before 関係を許容するなら sequentially consistent atomics を持つ。
Note 3
is-memory-order-before は EventSet (execution ) の全イベントを含むが、execution 内で happens-before または synchronizes-with によって制約されないものは順序中の任意位置に現れてよい。
29.7.5 Valid Executions
候補実行 execution が有効実行 (execution) であるとは、以下すべてが真であること。
ホスト が execution に対する host-synchronizes-with 関係を提供する。
execution が厳密半順序である happens-before 関係を許容する。
execution が valid chosen reads を持つ。
execution が coherent reads を持つ。
execution が tear free reads を持つ。
execution が sequentially consistent atomics を持つ。
全てのプログラムは少なくとも 1 つの有効実行を持つ。
29.8 競合 (Races)
実行 execution と SharedDataBlockEventSet (execution ) に含まれるイベント E と D について、次のアルゴリズムが true を返すとき E と D は race にある。
もし E と D が同一の Shared Data Block event でないならもし E happens-before D in execution かつ D happens-before E in execution の双方が成り立たないならもし E と D が共に WriteSharedMemory または ReadModifyWriteSharedMemory イベントで かつ E と D の範囲が素でないならtrue を返す。 もし E reads-from D in execution または D reads-from E in execution ならtrue を返す。 false を返す。
29.9 データ競合 (Data Races)
実行 execution と SharedDataBlockEventSet (execution ) に含まれるイベント E と D について、次のアルゴリズムが true を返すとき E と D は data race にある。
もし E と D が race in execution にあるならもし E .[[Order]] が seq-cst ではない または D .[[Order]] が seq-cst ではないならtrue を返す。 もし E と D が重複する範囲を持つならtrue を返す。 false を返す。
29.10 データ競合の不存在 (Data Race Freedom)
実行 execution が data race free とは SharedDataBlockEventSet (execution ) 内に data race にある 2 つのイベントが存在しないこと。
プログラムが data race free とはそのすべての実行が data race free であること。
メモリーモデルは data race free プログラムの全イベントについて逐次的一貫性を保証する。
29.11 共有メモリ利用指針 (Shared Memory Guidelines)
Note 1
以下は共有メモリを扱う ECMAScript プログラマ向けガイドラインである。
プログラムを data race free に保つ(すなわち同一メモリ位置に対する並行する非 atomic 操作が不可能であるようにする)ことを推奨する。Data race free プログラムは各エージェントの評価意味論ステップが互いにインターリーブされる意味論(インターリービング意味論)を持つ。Data race free プログラムではメモリーモデルの詳細を理解する必要はない。詳細は ECMAScript をより良く書くための直観をほぼ与えない。
より一般には、プログラムが data race free でなくとも、atomic 操作がどのデータ競合にも巻き込まれず、競合する操作がすべて同じアクセスサイズであれば予測可能な振る舞いを持ち得る。Atomic 操作を競合に巻き込まない最も簡単な方法は、atomic と非 atomic の操作が異なるメモリセルを使用し、異なるサイズの atomic アクセスを同じセルに同時利用しないようにすることである。実質的にプログラムは共有メモリを可能な限り強い型付けがあるものとして扱うべきである。依然として競合する非 atomic アクセスの順序やタイミングに依存することはできないが、メモリを強く型付けとして扱えば競合するアクセスは「tear」(値のビット断片の混在)しない。
Note 2
以下は共有メモリを使用するプログラムにコンパイラ変換を適用する ECMAScript 実装者向けガイドラインである。
単一エージェント環境で有効なほとんどのプログラム変換をマルチエージェント環境でも許容することが望ましい。これによりマルチエージェントプログラムにおける各エージェントの性能が単一エージェント環境と同様に良好となる。しばしばこれら変換は判断が難しい。以下にメモリーモデルによって含意される(またはそれより強い)規範的意図を持つが網羅的ではない規則を示す。これらは is-agent-order-before 関係を構成するイベントが導入される以前のプログラム変換に適用されることを意図する。
agent-order slice を単一エージェントに関わる is-agent-order-before 関係の部分集合とする。
読み取りイベントの possible read values を、そのイベントに対する全有効実行における ValueOfReadEvent の値集合とする。
共有メモリが存在しない場合に有効なエージェント順スライスの任意の変換は、以下の例外を除き共有メモリ存在下でも有効である。
Atomic は石版に刻まれている : プログラム変換はエージェント順スライス内の seq-cst イベントを unordered 操作と再順序付けしてはならず、seq-cst 操作同士を再順序付けしてもならず、seq-cst 操作を is-agent-order-before 関係から除去してもならない。
(実際には並べ替え禁止はコンパイラに全 seq-cst 操作が同期であり最終的な is-memory-order-before 関係に含まれると仮定させる。これは相互エージェント解析不在で通常仮定せざるを得ない。さらに呼び出し先の memory-order への影響が未知な呼び出しは seq-cst 操作を含み得ると仮定させる。)
読み取りは安定 : 任意の共有メモリ読み取りは 1 回の実行で単一の値のみ観測しなければならない。
(例: プログラム上意味的に 1 回の読みを複数回実行した場合、後続で観測される値はそのうち 1 つのみ許される。Rematerialization として知られる変換はこの規則に違反し得る。)
書き込みは安定 : 共有メモリへの全ての観測可能な書き込みは実行中のプログラム意味論から導かれていなければならない。
(例: より大きな場所での read-modify-write を用いて小さなデータを書いたり、プログラムが書き得ない値の書き込み、他エージェントにより上書きされ得る位置に直前に読み取った値をそのまま書き戻したりしてはならない。)
Possible read values は空であってはならない : プログラム変換は共有メモリ読み取りの possible read values を空集合にしてはならない。
(直観に反して、この規則は実際には書き込み上の変換を制約する。書き込みは読み取りイベントにより読まれることでメモリーモデル上の効力を持つため。例えば書き込みは seq-cst 操作 2 つの間で移動・合併・時に再順序付けできるが、ある位置を更新する全ての書き込みを除去することはできない;何らかの書き込みは残さねばならない。)
依然として有効な変換例: 同一位置への複数の非 atomic 読み取りのマージ、非 atomic 読み取りの再順序付け、投機的非 atomic 読み取りの導入、同一位置への複数非 atomic 書き込みのマージ、異なる位置への非 atomic 書き込みの再順序付け、非 atomic 読み取りのループ外へのホイスト(終了性に影響があっても)。一般にエイリアスされた TypedArray は位置が異なることの証明を難しくする。
Note 3
以下は共有メモリアクセスに対して機械語生成を行う ECMAScript 実装者向けガイドラインである。
ARM や Power より弱くないメモリーモデルを持つアーキテクチャでは、非 atomic store / load は素の store / load 命令にコンパイルできる。Atomic store / load は逐次的一貫性を保証する命令にコンパイルできる。そうした命令が無い場合、フェンス(両側への配置など)を利用する。Read-modify-write 操作は対象アーキテクチャの read-modify-write 命令列(x86 の LOCK
接頭辞、ARM の load-exclusive/store-exclusive、Power の load-link/store-conditional 等)にコンパイルできる。
具体的に、メモリーモデルは以下のコード生成を許容する意図である。
プログラム中の全 atomic 操作は必要であると仮定する。
Atomic 操作は互い、または非 atomic 操作と再順序付けされない。
関数呼び出しは常に atomic 操作を行うと仮定する。
Atomic 操作はより大きなデータ上の read-modify-write を用いて実装されず、適切なサイズの atomic 操作がプラットフォームにない場合は non-lock-free atomics として実装される。(全ての興味あるサイズの通常メモリアクセス命令は存在すると仮定。)
素朴なコード生成パターン:
通常の load/store は単一の load/store 命令。
ロックフリー atomic load/store は完全フェンス、通常 load/store、完全フェンス。
ロックフリー atomic read-modify-write は完全フェンス、atomic read-modify-write 命令列、完全フェンス。
非ロックフリー atomic はスピンロック獲得、完全フェンス、非 atomic load/store 列、完全フェンス、スピンロック解放。
この写像は、アドレス範囲上の atomic 操作が非 atomic 書き込みまたは異なるサイズの atomic 操作と競合しない限り正しい。それで十分である:メモリーモデルは競合に関与する atomic 操作を非 atomic とみなす。一方素朴な写像は強い:メモリーモデルが実際には保証しない逐次的一貫フェンスとして atomic 操作を使用できる。
これら基本パターンへの局所的改善も、メモリーモデル制約に従う限り許容される。例:
冗長フェンスの除去(x86 では load/store 周りのフェンス省略など、LOCK 接頭辞命令使用により read-modify-write でフェンス不要)や、弱いフェンスの使用。
多くのプラットフォームは必要な全サイズのロックフリー atomic をサポート。非ロックフリーが必要なら atomic 操作本体を囲むフェンスはロック獲得/解放に折り込める。最も簡単なのは SharedArrayBuffer 毎に単一のロック語を持つこと。
2 つの連続フェンスは単一フェンスと同等な場合が多く、連続する 2 つの atomic 操作生成時は間に 1 つで良い。x86 では atomic store 連続間のフェンスを省略可能など。
Annex A (informative) 文法サマリー
A.1 字句文法 (Lexical Grammar)
SourceCharacter ::
any Unicode code point
InputElementDiv ::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
RightBracePunctuator
InputElementRegExp ::
WhiteSpace
LineTerminator
Comment
CommonToken
RightBracePunctuator
RegularExpressionLiteral
InputElementRegExpOrTemplateTail ::
WhiteSpace
LineTerminator
Comment
CommonToken
RegularExpressionLiteral
TemplateSubstitutionTail
InputElementTemplateTail ::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
TemplateSubstitutionTail
InputElementHashbangOrRegExp ::
WhiteSpace
LineTerminator
Comment
CommonToken
HashbangComment
RegularExpressionLiteral
WhiteSpace ::
<TAB>
<VT>
<FF>
<ZWNBSP>
<USP>
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence ::
<LF>
<CR>
[lookahead ≠ <LF> ]
<LS>
<PS>
<CR>
<LF>
Comment ::
MultiLineComment
SingleLineComment
MultiLineComment ::
/*
MultiLineCommentChars opt
*/
MultiLineCommentChars ::
MultiLineNotAsteriskChar
MultiLineCommentChars opt
*
PostAsteriskCommentChars opt
PostAsteriskCommentChars ::
MultiLineNotForwardSlashOrAsteriskChar
MultiLineCommentChars opt
*
PostAsteriskCommentChars opt
MultiLineNotAsteriskChar ::
SourceCharacter but not *
MultiLineNotForwardSlashOrAsteriskChar ::
SourceCharacter but not one of / or *
SingleLineComment ::
//
SingleLineCommentChars opt
SingleLineCommentChars ::
SingleLineCommentChar
SingleLineCommentChars opt
SingleLineCommentChar ::
SourceCharacter but not LineTerminator
HashbangComment ::
#!
SingleLineCommentChars opt
CommonToken ::
IdentifierName
PrivateIdentifier
Punctuator
NumericLiteral
StringLiteral
Template
PrivateIdentifier ::
#
IdentifierName
IdentifierName ::
IdentifierStart
IdentifierName
IdentifierPart
IdentifierStart ::
IdentifierStartChar
\
UnicodeEscapeSequence
IdentifierPart ::
IdentifierPartChar
\
UnicodeEscapeSequence
IdentifierStartChar ::
UnicodeIDStart
$
_
IdentifierPartChar ::
UnicodeIDContinue
$
AsciiLetter :: one of a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
UnicodeIDStart ::
any Unicode code point with the Unicode property “ID_Start”
UnicodeIDContinue ::
any Unicode code point with the Unicode property “ID_Continue”
ReservedWord :: one of await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield
Punctuator ::
OptionalChainingPunctuator
OtherPunctuator
OptionalChainingPunctuator ::
?.
[lookahead ∉ DecimalDigit ]
OtherPunctuator :: one of { ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ?? ? : = += -= *= %= **= <<= >>= >>>= &= |= ^= &&= ||= ??= =>
DivPunctuator ::
/
/=
RightBracePunctuator ::
}
NullLiteral ::
null
BooleanLiteral ::
true
false
NumericLiteralSeparator ::
_
NumericLiteral ::
DecimalLiteral
DecimalBigIntegerLiteral
NonDecimalIntegerLiteral [+Sep]
NonDecimalIntegerLiteral [+Sep]
BigIntLiteralSuffix
LegacyOctalIntegerLiteral
DecimalBigIntegerLiteral ::
0
BigIntLiteralSuffix
NonZeroDigit
DecimalDigits [+Sep] opt
BigIntLiteralSuffix
NonZeroDigit
NumericLiteralSeparator
DecimalDigits [+Sep]
BigIntLiteralSuffix
NonDecimalIntegerLiteral [Sep] ::
BinaryIntegerLiteral [?Sep]
OctalIntegerLiteral [?Sep]
HexIntegerLiteral [?Sep]
BigIntLiteralSuffix ::
n
DecimalLiteral ::
DecimalIntegerLiteral
.
DecimalDigits [+Sep] opt
ExponentPart [+Sep] opt
.
DecimalDigits [+Sep]
ExponentPart [+Sep] opt
DecimalIntegerLiteral
ExponentPart [+Sep] opt
DecimalIntegerLiteral ::
0
NonZeroDigit
NonZeroDigit
NumericLiteralSeparator opt
DecimalDigits [+Sep]
NonOctalDecimalIntegerLiteral
DecimalDigits [Sep] ::
DecimalDigit
DecimalDigits [?Sep]
DecimalDigit
[+Sep]
DecimalDigits [+Sep]
NumericLiteralSeparator
DecimalDigit
DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9
NonZeroDigit :: one of 1 2 3 4 5 6 7 8 9
ExponentPart [Sep] ::
ExponentIndicator
SignedInteger [?Sep]
ExponentIndicator :: one of e E
SignedInteger [Sep] ::
DecimalDigits [?Sep]
+
DecimalDigits [?Sep]
-
DecimalDigits [?Sep]
BinaryIntegerLiteral [Sep] ::
0b
BinaryDigits [?Sep]
0B
BinaryDigits [?Sep]
BinaryDigits [Sep] ::
BinaryDigit
BinaryDigits [?Sep]
BinaryDigit
[+Sep]
BinaryDigits [+Sep]
NumericLiteralSeparator
BinaryDigit
BinaryDigit :: one of 0 1
OctalIntegerLiteral [Sep] ::
0o
OctalDigits [?Sep]
0O
OctalDigits [?Sep]
OctalDigits [Sep] ::
OctalDigit
OctalDigits [?Sep]
OctalDigit
[+Sep]
OctalDigits [+Sep]
NumericLiteralSeparator
OctalDigit
LegacyOctalIntegerLiteral ::
0
OctalDigit
LegacyOctalIntegerLiteral
OctalDigit
NonOctalDecimalIntegerLiteral ::
0
NonOctalDigit
LegacyOctalLikeDecimalIntegerLiteral
NonOctalDigit
NonOctalDecimalIntegerLiteral
DecimalDigit
LegacyOctalLikeDecimalIntegerLiteral ::
0
OctalDigit
LegacyOctalLikeDecimalIntegerLiteral
OctalDigit
OctalDigit :: one of 0 1 2 3 4 5 6 7
NonOctalDigit :: one of 8 9
HexIntegerLiteral [Sep] ::
0x
HexDigits [?Sep]
0X
HexDigits [?Sep]
HexDigits [Sep] ::
HexDigit
HexDigits [?Sep]
HexDigit
[+Sep]
HexDigits [+Sep]
NumericLiteralSeparator
HexDigit
HexDigit :: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
StringLiteral ::
"
DoubleStringCharacters opt
"
'
SingleStringCharacters opt
'
DoubleStringCharacters ::
DoubleStringCharacter
DoubleStringCharacters opt
SingleStringCharacters ::
SingleStringCharacter
SingleStringCharacters opt
DoubleStringCharacter ::
SourceCharacter but not one of " or \ or LineTerminator
<LS>
<PS>
\
EscapeSequence
LineContinuation
SingleStringCharacter ::
SourceCharacter but not one of ' or \ or LineTerminator
<LS>
<PS>
\
EscapeSequence
LineContinuation
LineContinuation ::
\
LineTerminatorSequence
EscapeSequence ::
CharacterEscapeSequence
0
[lookahead ∉ DecimalDigit ]
LegacyOctalEscapeSequence
NonOctalDecimalEscapeSequence
HexEscapeSequence
UnicodeEscapeSequence
CharacterEscapeSequence ::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter :: one of ' " \ b f n r t v
NonEscapeCharacter ::
SourceCharacter but not one of EscapeCharacter or LineTerminator
EscapeCharacter ::
SingleEscapeCharacter
DecimalDigit
x
u
LegacyOctalEscapeSequence ::
0
[lookahead ∈ { 8 , 9 }]
NonZeroOctalDigit
[lookahead ∉ OctalDigit ]
ZeroToThree
OctalDigit
[lookahead ∉ OctalDigit ]
FourToSeven
OctalDigit
ZeroToThree
OctalDigit
OctalDigit
NonZeroOctalDigit ::
OctalDigit but not 0
ZeroToThree :: one of 0 1 2 3
FourToSeven :: one of 4 5 6 7
NonOctalDecimalEscapeSequence :: one of 8 9
HexEscapeSequence ::
x
HexDigit
HexDigit
UnicodeEscapeSequence ::
u
Hex4Digits
u{
CodePoint
}
Hex4Digits ::
HexDigit
HexDigit
HexDigit
HexDigit
RegularExpressionLiteral ::
/
RegularExpressionBody
/
RegularExpressionFlags
RegularExpressionBody ::
RegularExpressionFirstChar
RegularExpressionChars
RegularExpressionChars ::
[empty]
RegularExpressionChars
RegularExpressionChar
RegularExpressionFirstChar ::
RegularExpressionNonTerminator but not one of * or \ or / or [
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionChar ::
RegularExpressionNonTerminator but not one of \ or / or [
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionBackslashSequence ::
\
RegularExpressionNonTerminator
RegularExpressionNonTerminator ::
SourceCharacter but not LineTerminator
RegularExpressionClass ::
[
RegularExpressionClassChars
]
RegularExpressionClassChars ::
[empty]
RegularExpressionClassChars
RegularExpressionClassChar
RegularExpressionClassChar ::
RegularExpressionNonTerminator but not one of ] or \
RegularExpressionBackslashSequence
RegularExpressionFlags ::
[empty]
RegularExpressionFlags
IdentifierPartChar
Template ::
NoSubstitutionTemplate
TemplateHead
NoSubstitutionTemplate ::
`
TemplateCharacters opt
`
TemplateHead ::
`
TemplateCharacters opt
${
TemplateSubstitutionTail ::
TemplateMiddle
TemplateTail
TemplateMiddle ::
}
TemplateCharacters opt
${
TemplateTail ::
}
TemplateCharacters opt
`
TemplateCharacters ::
TemplateCharacter
TemplateCharacters opt
TemplateCharacter ::
$
[lookahead ≠ { ]
\
TemplateEscapeSequence
\
NotEscapeSequence
LineContinuation
LineTerminatorSequence
SourceCharacter but not one of ` or \ or $ or LineTerminator
TemplateEscapeSequence ::
CharacterEscapeSequence
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
UnicodeEscapeSequence
NotEscapeSequence ::
0
DecimalDigit
DecimalDigit but not 0
x
[lookahead ∉ HexDigit ]
x
HexDigit
[lookahead ∉ HexDigit ]
u
[lookahead ∉ HexDigit ]
[lookahead ≠ { ]
u
HexDigit
[lookahead ∉ HexDigit ]
u
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
u
HexDigit
HexDigit
HexDigit
[lookahead ∉ HexDigit ]
u
{
[lookahead ∉ HexDigit ]
u
{
NotCodePoint
[lookahead ∉ HexDigit ]
u
{
CodePoint
[lookahead ∉ HexDigit ]
[lookahead ≠ } ]
NotCodePoint ::
HexDigits [~Sep]
but only if the MV of HexDigits > 0x10FFFF
CodePoint ::
HexDigits [~Sep]
but only if the MV of HexDigits ≤ 0x10FFFF
A.2 式 (Expressions)
IdentifierReference [Yield, Await] :
Identifier
[~Yield]
yield
[~Await]
await
BindingIdentifier [Yield, Await] :
Identifier
yield
await
LabelIdentifier [Yield, Await] :
Identifier
[~Yield]
yield
[~Await]
await
Identifier :
IdentifierName but not ReservedWord
PrimaryExpression [Yield, Await] :
this
IdentifierReference [?Yield, ?Await]
Literal
ArrayLiteral [?Yield, ?Await]
ObjectLiteral [?Yield, ?Await]
FunctionExpression
ClassExpression [?Yield, ?Await]
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral [?Yield, ?Await, ~Tagged]
CoverParenthesizedExpressionAndArrowParameterList [?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList [Yield, Await] :
(
Expression [+In, ?Yield, ?Await]
)
(
Expression [+In, ?Yield, ?Await]
,
)
(
)
(
...
BindingIdentifier [?Yield, ?Await]
)
(
...
BindingPattern [?Yield, ?Await]
)
(
Expression [+In, ?Yield, ?Await]
,
...
BindingIdentifier [?Yield, ?Await]
)
(
Expression [+In, ?Yield, ?Await]
,
...
BindingPattern [?Yield, ?Await]
)
次の生成規則のインスタンスを処理する際
PrimaryExpression [Yield, Await] :
CoverParenthesizedExpressionAndArrowParameterList [?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList の解釈は以下の文法で精密化される:
ParenthesizedExpression [Yield, Await] :
(
Expression [+In, ?Yield, ?Await]
)
Literal :
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
ArrayLiteral [Yield, Await] :
[
Elision opt
]
[
ElementList [?Yield, ?Await]
]
[
ElementList [?Yield, ?Await]
,
Elision opt
]
ElementList [Yield, Await] :
Elision opt
AssignmentExpression [+In, ?Yield, ?Await]
Elision opt
SpreadElement [?Yield, ?Await]
ElementList [?Yield, ?Await]
,
Elision opt
AssignmentExpression [+In, ?Yield, ?Await]
ElementList [?Yield, ?Await]
,
Elision opt
SpreadElement [?Yield, ?Await]
Elision :
,
Elision
,
SpreadElement [Yield, Await] :
...
AssignmentExpression [+In, ?Yield, ?Await]
ObjectLiteral [Yield, Await] :
{
}
{
PropertyDefinitionList [?Yield, ?Await]
}
{
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] :
[
Elision opt
AssignmentRestElement [?Yield, ?Await] opt
]
[
AssignmentElementList [?Yield, ?Await]
]
[
AssignmentElementList [?Yield, ?Await]
,
Elision opt
AssignmentRestElement [?Yield, ?Await] opt
]
AssignmentRestProperty [Yield, Await] :
...
DestructuringAssignmentTarget [?Yield, ?Await]
AssignmentPropertyList [Yield, Await] :
AssignmentProperty [?Yield, ?Await]
AssignmentPropertyList [?Yield, ?Await]
,
AssignmentProperty [?Yield, ?Await]
AssignmentElementList [Yield, Await] :
AssignmentElisionElement [?Yield, ?Await]
AssignmentElementList [?Yield, ?Await]
,
AssignmentElisionElement [?Yield, ?Await]
AssignmentElisionElement [Yield, Await] :
Elision opt
AssignmentElement [?Yield, ?Await]
AssignmentProperty [Yield, Await] :
IdentifierReference [?Yield, ?Await]
Initializer [+In, ?Yield, ?Await] opt
PropertyName [?Yield, ?Await]
:
AssignmentElement [?Yield, ?Await]
AssignmentElement [Yield, Await] :
DestructuringAssignmentTarget [?Yield, ?Await]
Initializer [+In, ?Yield, ?Await] opt
AssignmentRestElement [Yield, Await] :
...
DestructuringAssignmentTarget [?Yield, ?Await]
DestructuringAssignmentTarget [Yield, Await] :
LeftHandSideExpression [?Yield, ?Await]
Expression [In, Yield, Await] :
AssignmentExpression [?In, ?Yield, ?Await]
Expression [?In, ?Yield, ?Await]
,
AssignmentExpression [?In, ?Yield, ?Await]
A.3 文 (Statements)
Statement [Yield, Await, Return] :
BlockStatement [?Yield, ?Await, ?Return]
VariableStatement [?Yield, ?Await]
EmptyStatement
ExpressionStatement [?Yield, ?Await]
IfStatement [?Yield, ?Await, ?Return]
BreakableStatement [?Yield, ?Await, ?Return]
ContinueStatement [?Yield, ?Await]
BreakStatement [?Yield, ?Await]
[+Return]
ReturnStatement [?Yield, ?Await]
WithStatement [?Yield, ?Await, ?Return]
LabelledStatement [?Yield, ?Await, ?Return]
ThrowStatement [?Yield, ?Await]
TryStatement [?Yield, ?Await, ?Return]
DebuggerStatement
Declaration [Yield, Await] :
HoistableDeclaration [?Yield, ?Await, ~Default]
ClassDeclaration [?Yield, ?Await, ~Default]
LexicalDeclaration [+In, ?Yield, ?Await]
HoistableDeclaration [Yield, Await, Default] :
FunctionDeclaration [?Yield, ?Await, ?Default]
GeneratorDeclaration [?Yield, ?Await, ?Default]
AsyncFunctionDeclaration [?Yield, ?Await, ?Default]
AsyncGeneratorDeclaration [?Yield, ?Await, ?Default]
BreakableStatement [Yield, Await, Return] :
IterationStatement [?Yield, ?Await, ?Return]
SwitchStatement [?Yield, ?Await, ?Return]
BlockStatement [Yield, Await, Return] :
Block [?Yield, ?Await, ?Return]
Block [Yield, Await, Return] :
{
StatementList [?Yield, ?Await, ?Return] opt
}
StatementList [Yield, Await, Return] :
StatementListItem [?Yield, ?Await, ?Return]
StatementList [?Yield, ?Await, ?Return]
StatementListItem [?Yield, ?Await, ?Return]
StatementListItem [Yield, Await, Return] :
Statement [?Yield, ?Await, ?Return]
Declaration [?Yield, ?Await]
LexicalDeclaration [In, Yield, Await] :
LetOrConst
BindingList [?In, ?Yield, ?Await]
;
LetOrConst :
let
const
BindingList [In, Yield, Await] :
LexicalBinding [?In, ?Yield, ?Await]
BindingList [?In, ?Yield, ?Await]
,
LexicalBinding [?In, ?Yield, ?Await]
LexicalBinding [In, Yield, Await] :
BindingIdentifier [?Yield, ?Await]
Initializer [?In, ?Yield, ?Await] opt
BindingPattern [?Yield, ?Await]
Initializer [?In, ?Yield, ?Await]
VariableStatement [Yield, Await] :
var
VariableDeclarationList [+In, ?Yield, ?Await]
;
VariableDeclarationList [In, Yield, Await] :
VariableDeclaration [?In, ?Yield, ?Await]
VariableDeclarationList [?In, ?Yield, ?Await]
,
VariableDeclaration [?In, ?Yield, ?Await]
VariableDeclaration [In, Yield, Await] :
BindingIdentifier [?Yield, ?Await]
Initializer [?In, ?Yield, ?Await] opt
BindingPattern [?Yield, ?Await]
Initializer [?In, ?Yield, ?Await]
BindingPattern [Yield, Await] :
ObjectBindingPattern [?Yield, ?Await]
ArrayBindingPattern [?Yield, ?Await]
ObjectBindingPattern [Yield, Await] :
{
}
{
BindingRestProperty [?Yield, ?Await]
}
{
BindingPropertyList [?Yield, ?Await]
}
{
BindingPropertyList [?Yield, ?Await]
,
BindingRestProperty [?Yield, ?Await] opt
}
ArrayBindingPattern [Yield, Await] :
[
Elision opt
BindingRestElement [?Yield, ?Await] opt
]
[
BindingElementList [?Yield, ?Await]
]
[
BindingElementList [?Yield, ?Await]
,
Elision opt
BindingRestElement [?Yield, ?Await] opt
]
BindingRestProperty [Yield, Await] :
...
BindingIdentifier [?Yield, ?Await]
BindingPropertyList [Yield, Await] :
BindingProperty [?Yield, ?Await]
BindingPropertyList [?Yield, ?Await]
,
BindingProperty [?Yield, ?Await]
BindingElementList [Yield, Await] :
BindingElisionElement [?Yield, ?Await]
BindingElementList [?Yield, ?Await]
,
BindingElisionElement [?Yield, ?Await]
BindingElisionElement [Yield, Await] :
Elision opt
BindingElement [?Yield, ?Await]
BindingProperty [Yield, Await] :
SingleNameBinding [?Yield, ?Await]
PropertyName [?Yield, ?Await]
:
BindingElement [?Yield, ?Await]
BindingElement [Yield, Await] :
SingleNameBinding [?Yield, ?Await]
BindingPattern [?Yield, ?Await]
Initializer [+In, ?Yield, ?Await] opt
SingleNameBinding [Yield, Await] :
BindingIdentifier [?Yield, ?Await]
Initializer [+In, ?Yield, ?Await] opt
BindingRestElement [Yield, Await] :
...
BindingIdentifier [?Yield, ?Await]
...
BindingPattern [?Yield, ?Await]
EmptyStatement :
;
ExpressionStatement [Yield, Await] :
[lookahead ∉ { { , function , async
[no LineTerminator here]
function , class , let
[ }]
Expression [+In, ?Yield, ?Await]
;
IfStatement [Yield, Await, Return] :
if
(
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
else
Statement [?Yield, ?Await, ?Return]
if
(
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
[lookahead ≠ else ]
IterationStatement [Yield, Await, Return] :
DoWhileStatement [?Yield, ?Await, ?Return]
WhileStatement [?Yield, ?Await, ?Return]
ForStatement [?Yield, ?Await, ?Return]
ForInOfStatement [?Yield, ?Await, ?Return]
DoWhileStatement [Yield, Await, Return] :
do
Statement [?Yield, ?Await, ?Return]
while
(
Expression [+In, ?Yield, ?Await]
)
;
WhileStatement [Yield, Await, Return] :
while
(
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
ForStatement [Yield, Await, Return] :
for
(
[lookahead ≠ let
[ ]
Expression [~In, ?Yield, ?Await] opt
;
Expression [+In, ?Yield, ?Await] opt
;
Expression [+In, ?Yield, ?Await] opt
)
Statement [?Yield, ?Await, ?Return]
for
(
var
VariableDeclarationList [~In, ?Yield, ?Await]
;
Expression [+In, ?Yield, ?Await] opt
;
Expression [+In, ?Yield, ?Await] opt
)
Statement [?Yield, ?Await, ?Return]
for
(
LexicalDeclaration [~In, ?Yield, ?Await]
Expression [+In, ?Yield, ?Await] opt
;
Expression [+In, ?Yield, ?Await] opt
)
Statement [?Yield, ?Await, ?Return]
ForInOfStatement [Yield, Await, Return] :
for
(
[lookahead ≠ let
[ ]
LeftHandSideExpression [?Yield, ?Await]
in
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
var
ForBinding [?Yield, ?Await]
in
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
ForDeclaration [?Yield, ?Await]
in
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
[lookahead ∉ { let , async
of }]
LeftHandSideExpression [?Yield, ?Await]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
var
ForBinding [?Yield, ?Await]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
for
(
ForDeclaration [?Yield, ?Await]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
[+Await]
for
await
(
[lookahead ≠ let ]
LeftHandSideExpression [?Yield, ?Await]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
[+Await]
for
await
(
var
ForBinding [?Yield, ?Await]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
[+Await]
for
await
(
ForDeclaration [?Yield, ?Await]
of
AssignmentExpression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
ForDeclaration [Yield, Await] :
LetOrConst
ForBinding [?Yield, ?Await]
ForBinding [Yield, Await] :
BindingIdentifier [?Yield, ?Await]
BindingPattern [?Yield, ?Await]
ContinueStatement [Yield, Await] :
continue
;
continue
[no LineTerminator here]
LabelIdentifier [?Yield, ?Await]
;
BreakStatement [Yield, Await] :
break
;
break
[no LineTerminator here]
LabelIdentifier [?Yield, ?Await]
;
ReturnStatement [Yield, Await] :
return
;
return
[no LineTerminator here]
Expression [+In, ?Yield, ?Await]
;
WithStatement [Yield, Await, Return] :
with
(
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
SwitchStatement [Yield, Await, Return] :
switch
(
Expression [+In, ?Yield, ?Await]
)
CaseBlock [?Yield, ?Await, ?Return]
CaseBlock [Yield, Await, Return] :
{
CaseClauses [?Yield, ?Await, ?Return] opt
}
{
CaseClauses [?Yield, ?Await, ?Return] opt
DefaultClause [?Yield, ?Await, ?Return]
CaseClauses [?Yield, ?Await, ?Return] opt
}
CaseClauses [Yield, Await, Return] :
CaseClause [?Yield, ?Await, ?Return]
CaseClauses [?Yield, ?Await, ?Return]
CaseClause [?Yield, ?Await, ?Return]
CaseClause [Yield, Await, Return] :
case
Expression [+In, ?Yield, ?Await]
:
StatementList [?Yield, ?Await, ?Return] opt
DefaultClause [Yield, Await, Return] :
default
:
StatementList [?Yield, ?Await, ?Return] opt
LabelledStatement [Yield, Await, Return] :
LabelIdentifier [?Yield, ?Await]
:
LabelledItem [?Yield, ?Await, ?Return]
LabelledItem [Yield, Await, Return] :
Statement [?Yield, ?Await, ?Return]
FunctionDeclaration [?Yield, ?Await, ~Default]
ThrowStatement [Yield, Await] :
throw
[no LineTerminator here]
Expression [+In, ?Yield, ?Await]
;
TryStatement [Yield, Await, Return] :
try
Block [?Yield, ?Await, ?Return]
Catch [?Yield, ?Await, ?Return]
try
Block [?Yield, ?Await, ?Return]
Finally [?Yield, ?Await, ?Return]
try
Block [?Yield, ?Await, ?Return]
Catch [?Yield, ?Await, ?Return]
Finally [?Yield, ?Await, ?Return]
Catch [Yield, Await, Return] :
catch
(
CatchParameter [?Yield, ?Await]
)
Block [?Yield, ?Await, ?Return]
catch
Block [?Yield, ?Await, ?Return]
Finally [Yield, Await, Return] :
finally
Block [?Yield, ?Await, ?Return]
CatchParameter [Yield, Await] :
BindingIdentifier [?Yield, ?Await]
BindingPattern [?Yield, ?Await]
DebuggerStatement :
debugger
;
A.4 関数とクラス (Functions and Classes)
UniqueFormalParameters [Yield, Await] :
FormalParameters [?Yield, ?Await]
FormalParameters [Yield, Await] :
[empty]
FunctionRestParameter [?Yield, ?Await]
FormalParameterList [?Yield, ?Await]
FormalParameterList [?Yield, ?Await]
,
FormalParameterList [?Yield, ?Await]
,
FunctionRestParameter [?Yield, ?Await]
FormalParameterList [Yield, Await] :
FormalParameter [?Yield, ?Await]
FormalParameterList [?Yield, ?Await]
,
FormalParameter [?Yield, ?Await]
FunctionRestParameter [Yield, Await] :
BindingRestElement [?Yield, ?Await]
FormalParameter [Yield, Await] :
BindingElement [?Yield, ?Await]
FunctionDeclaration [Yield, Await, Default] :
function
BindingIdentifier [?Yield, ?Await]
(
FormalParameters [~Yield, ~Await]
)
{
FunctionBody [~Yield, ~Await]
}
[+Default]
function
(
FormalParameters [~Yield, ~Await]
)
{
FunctionBody [~Yield, ~Await]
}
FunctionExpression :
function
BindingIdentifier [~Yield, ~Await] opt
(
FormalParameters [~Yield, ~Await]
)
{
FunctionBody [~Yield, ~Await]
}
FunctionBody [Yield, Await] :
FunctionStatementList [?Yield, ?Await]
FunctionStatementList [Yield, Await] :
StatementList [?Yield, ?Await, +Return] opt
ArrowFunction [In, Yield, Await] :
ArrowParameters [?Yield, ?Await]
[no LineTerminator here]
=>
ConciseBody [?In]
ArrowParameters [Yield, Await] :
BindingIdentifier [?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList [?Yield, ?Await]
ConciseBody [In] :
[lookahead ≠ { ]
ExpressionBody [?In, ~Await]
{
FunctionBody [~Yield, ~Await]
}
ExpressionBody [In, Await] :
AssignmentExpression [?In, ~Yield, ?Await]
次の生成規則のインスタンスを処理する際
ArrowParameters [Yield, Await] :
CoverParenthesizedExpressionAndArrowParameterList [?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList の解釈は以下の文法で精密化される:
ArrowFormalParameters [Yield, Await] :
(
UniqueFormalParameters [?Yield, ?Await]
)
AsyncArrowFunction [In, Yield, Await] :
async
[no LineTerminator here]
AsyncArrowBindingIdentifier [?Yield]
[no LineTerminator here]
=>
AsyncConciseBody [?In]
CoverCallExpressionAndAsyncArrowHead [?Yield, ?Await]
[no LineTerminator here]
=>
AsyncConciseBody [?In]
AsyncConciseBody [In] :
[lookahead ≠ { ]
ExpressionBody [?In, +Await]
{
AsyncFunctionBody
}
AsyncArrowBindingIdentifier [Yield] :
BindingIdentifier [?Yield, +Await]
CoverCallExpressionAndAsyncArrowHead [Yield, Await] :
MemberExpression [?Yield, ?Await]
Arguments [?Yield, ?Await]
次の生成規則のインスタンスを処理する際
AsyncArrowFunction [In, Yield, Await] :
CoverCallExpressionAndAsyncArrowHead [?Yield, ?Await]
[no LineTerminator here]
=>
AsyncConciseBody [?In]
CoverCallExpressionAndAsyncArrowHead の解釈は以下の文法で精密化される:
AsyncArrowHead :
async
[no LineTerminator here]
ArrowFormalParameters [~Yield, +Await]
MethodDefinition [Yield, Await] :
ClassElementName [?Yield, ?Await]
(
UniqueFormalParameters [~Yield, ~Await]
)
{
FunctionBody [~Yield, ~Await]
}
GeneratorMethod [?Yield, ?Await]
AsyncMethod [?Yield, ?Await]
AsyncGeneratorMethod [?Yield, ?Await]
get
ClassElementName [?Yield, ?Await]
(
)
{
FunctionBody [~Yield, ~Await]
}
set
ClassElementName [?Yield, ?Await]
(
PropertySetParameterList
)
{
FunctionBody [~Yield, ~Await]
}
PropertySetParameterList :
FormalParameter [~Yield, ~Await]
GeneratorDeclaration [Yield, Await, Default] :
function
*
BindingIdentifier [?Yield, ?Await]
(
FormalParameters [+Yield, ~Await]
)
{
GeneratorBody
}
[+Default]
function
*
(
FormalParameters [+Yield, ~Await]
)
{
GeneratorBody
}
GeneratorExpression :
function
*
BindingIdentifier [+Yield, ~Await] opt
(
FormalParameters [+Yield, ~Await]
)
{
GeneratorBody
}
GeneratorMethod [Yield, Await] :
*
ClassElementName [?Yield, ?Await]
(
UniqueFormalParameters [+Yield, ~Await]
)
{
GeneratorBody
}
GeneratorBody :
FunctionBody [+Yield, ~Await]
YieldExpression [In, Await] :
yield
yield
[no LineTerminator here]
AssignmentExpression [?In, +Yield, ?Await]
yield
[no LineTerminator here]
*
AssignmentExpression [?In, +Yield, ?Await]
AsyncGeneratorDeclaration [Yield, Await, Default] :
async
[no LineTerminator here]
function
*
BindingIdentifier [?Yield, ?Await]
(
FormalParameters [+Yield, +Await]
)
{
AsyncGeneratorBody
}
[+Default]
async
[no LineTerminator here]
function
*
(
FormalParameters [+Yield, +Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorExpression :
async
[no LineTerminator here]
function
*
BindingIdentifier [+Yield, +Await] opt
(
FormalParameters [+Yield, +Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorMethod [Yield, Await] :
async
[no LineTerminator here]
*
ClassElementName [?Yield, ?Await]
(
UniqueFormalParameters [+Yield, +Await]
)
{
AsyncGeneratorBody
}
AsyncGeneratorBody :
FunctionBody [+Yield, +Await]
AsyncFunctionDeclaration [Yield, Await, Default] :
async
[no LineTerminator here]
function
BindingIdentifier [?Yield, ?Await]
(
FormalParameters [~Yield, +Await]
)
{
AsyncFunctionBody
}
[+Default]
async
[no LineTerminator here]
function
(
FormalParameters [~Yield, +Await]
)
{
AsyncFunctionBody
}
AsyncFunctionExpression :
async
[no LineTerminator here]
function
BindingIdentifier [~Yield, +Await] opt
(
FormalParameters [~Yield, +Await]
)
{
AsyncFunctionBody
}
AsyncMethod [Yield, Await] :
async
[no LineTerminator here]
ClassElementName [?Yield, ?Await]
(
UniqueFormalParameters [~Yield, +Await]
)
{
AsyncFunctionBody
}
AsyncFunctionBody :
FunctionBody [~Yield, +Await]
AwaitExpression [Yield] :
await
UnaryExpression [?Yield, +Await]
ClassDeclaration [Yield, Await, Default] :
class
BindingIdentifier [?Yield, ?Await]
ClassTail [?Yield, ?Await]
[+Default]
class
ClassTail [?Yield, ?Await]
ClassExpression [Yield, Await] :
class
BindingIdentifier [?Yield, ?Await] opt
ClassTail [?Yield, ?Await]
ClassTail [Yield, Await] :
ClassHeritage [?Yield, ?Await] opt
{
ClassBody [?Yield, ?Await] opt
}
ClassHeritage [Yield, Await] :
extends
LeftHandSideExpression [?Yield, ?Await]
ClassBody [Yield, Await] :
ClassElementList [?Yield, ?Await]
ClassElementList [Yield, Await] :
ClassElement [?Yield, ?Await]
ClassElementList [?Yield, ?Await]
ClassElement [?Yield, ?Await]
ClassElement [Yield, Await] :
MethodDefinition [?Yield, ?Await]
static
MethodDefinition [?Yield, ?Await]
FieldDefinition [?Yield, ?Await]
;
static
FieldDefinition [?Yield, ?Await]
;
ClassStaticBlock
;
FieldDefinition [Yield, Await] :
ClassElementName [?Yield, ?Await]
Initializer [+In, ?Yield, ?Await] opt
ClassElementName [Yield, Await] :
PropertyName [?Yield, ?Await]
PrivateIdentifier
ClassStaticBlock :
static
{
ClassStaticBlockBody
}
ClassStaticBlockBody :
ClassStaticBlockStatementList
ClassStaticBlockStatementList :
StatementList [~Yield, +Await, ~Return] opt
A.5 スクリプトとモジュール (Scripts and Modules)
Script :
ScriptBody opt
ScriptBody :
StatementList [~Yield, ~Await, ~Return]
Module :
ModuleBody opt
ModuleBody :
ModuleItemList
ModuleItemList :
ModuleItem
ModuleItemList
ModuleItem
ModuleItem :
ImportDeclaration
ExportDeclaration
StatementListItem [~Yield, +Await, ~Return]
ModuleExportName :
IdentifierName
StringLiteral
ImportDeclaration :
import
ImportClause
FromClause
WithClause opt
;
import
ModuleSpecifier
WithClause opt
;
ImportClause :
ImportedDefaultBinding
NameSpaceImport
NamedImports
ImportedDefaultBinding
,
NameSpaceImport
ImportedDefaultBinding
,
NamedImports
ImportedDefaultBinding :
ImportedBinding
NameSpaceImport :
*
as
ImportedBinding
NamedImports :
{
}
{
ImportsList
}
{
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
WithClause opt
;
export
NamedExports
;
export
VariableStatement [~Yield, +Await]
export
Declaration [~Yield, +Await]
export
default
HoistableDeclaration [~Yield, +Await, +Default]
export
default
ClassDeclaration [~Yield, +Await, +Default]
export
default
[lookahead ∉ { function , async
[no LineTerminator here]
function , class }]
AssignmentExpression [+In, ~Yield, +Await]
;
ExportFromClause :
*
*
as
ModuleExportName
NamedExports
NamedExports :
{
}
{
ExportsList
}
{
ExportsList
,
}
ExportsList :
ExportSpecifier
ExportsList
,
ExportSpecifier
ExportSpecifier :
ModuleExportName
ModuleExportName
as
ModuleExportName
A.6 数値変換 (Number Conversions)
StringNumericLiteral :::
StrWhiteSpace opt
StrWhiteSpace opt
StrNumericLiteral
StrWhiteSpace opt
StrWhiteSpace :::
StrWhiteSpaceChar
StrWhiteSpace opt
StrWhiteSpaceChar :::
WhiteSpace
LineTerminator
StrNumericLiteral :::
StrDecimalLiteral
NonDecimalIntegerLiteral [~Sep]
StrDecimalLiteral :::
StrUnsignedDecimalLiteral
+
StrUnsignedDecimalLiteral
-
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral :::
Infinity
DecimalDigits [~Sep]
.
DecimalDigits [~Sep] opt
ExponentPart [~Sep] opt
.
DecimalDigits [~Sep]
ExponentPart [~Sep] opt
DecimalDigits [~Sep]
ExponentPart [~Sep] opt
StringNumericLiteral 文法で明示的に定義されていない文法記号は 数値リテラルの字句文法 で用いられる定義を使用する。
StringIntegerLiteral :::
StrWhiteSpace opt
StrWhiteSpace opt
StrIntegerLiteral
StrWhiteSpace opt
StrIntegerLiteral :::
SignedInteger [~Sep]
NonDecimalIntegerLiteral [~Sep]
A.7 タイムゾーンオフセット文字列形式 (Time Zone Offset String Format)
UTCOffset :::
ASCIISign
Hour
ASCIISign
Hour
HourSubcomponents [+Extended]
ASCIISign
Hour
HourSubcomponents [~Extended]
ASCIISign ::: one of + -
Hour :::
0
DecimalDigit
1
DecimalDigit
20
21
22
23
HourSubcomponents [Extended] :::
TimeSeparator [?Extended]
MinuteSecond
TimeSeparator [?Extended]
MinuteSecond
TimeSeparator [?Extended]
MinuteSecond
TemporalDecimalFraction opt
TimeSeparator [Extended] ::: [+Extended]
:
[~Extended]
[empty]
MinuteSecond :::
0
DecimalDigit
1
DecimalDigit
2
DecimalDigit
3
DecimalDigit
4
DecimalDigit
5
DecimalDigit
TemporalDecimalFraction :::
TemporalDecimalSeparator
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator ::: one of . ,
A.8 正規表現 (Regular Expressions)
Pattern [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] ::
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Disjunction [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] ::
Alternative [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Alternative [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
|
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Alternative [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] ::
[empty]
Alternative [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Term [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Term [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] ::
Assertion [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Atom [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Atom [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Quantifier
Assertion [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] ::
^
$
\b
\B
(?=
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?!
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<=
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<!
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
Quantifier ::
QuantifierPrefix
QuantifierPrefix
?
QuantifierPrefix ::
*
+
?
{
DecimalDigits [~Sep]
}
{
DecimalDigits [~Sep]
,}
{
DecimalDigits [~Sep]
,
DecimalDigits [~Sep]
}
Atom [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] ::
PatternCharacter
.
\
AtomEscape [?UnicodeMode, ?NamedCaptureGroups]
CharacterClass [?UnicodeMode, ?UnicodeSetsMode]
(
GroupSpecifier [?UnicodeMode] opt
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
:
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
RegularExpressionModifiers ::
[empty]
RegularExpressionModifiers
RegularExpressionModifier
RegularExpressionModifier :: one of i m s
SyntaxCharacter :: one of ^ $ \ . * + ? ( ) [ ] { } |
PatternCharacter ::
SourceCharacter but not SyntaxCharacter
AtomEscape [UnicodeMode, NamedCaptureGroups] ::
DecimalEscape
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode]
[+NamedCaptureGroups]
k
GroupName [?UnicodeMode]
CharacterEscape [UnicodeMode] ::
ControlEscape
c
AsciiLetter
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
RegExpUnicodeEscapeSequence [?UnicodeMode]
IdentityEscape [?UnicodeMode]
ControlEscape :: one of f n r t v
GroupSpecifier [UnicodeMode] ::
?
GroupName [?UnicodeMode]
GroupName [UnicodeMode] ::
<
RegExpIdentifierName [?UnicodeMode]
>
RegExpIdentifierName [UnicodeMode] ::
RegExpIdentifierStart [?UnicodeMode]
RegExpIdentifierName [?UnicodeMode]
RegExpIdentifierPart [?UnicodeMode]
RegExpIdentifierStart [UnicodeMode] ::
IdentifierStartChar
\
RegExpUnicodeEscapeSequence [+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart [UnicodeMode] ::
IdentifierPartChar
\
RegExpUnicodeEscapeSequence [+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpUnicodeEscapeSequence [UnicodeMode] :: [+UnicodeMode]
u
HexLeadSurrogate
\u
HexTrailSurrogate
[+UnicodeMode]
u
HexLeadSurrogate
[+UnicodeMode]
u
HexTrailSurrogate
[+UnicodeMode]
u
HexNonSurrogate
[~UnicodeMode]
u
Hex4Digits
[+UnicodeMode]
u{
CodePoint
}
UnicodeLeadSurrogate ::
any Unicode code point in the inclusive interval from U+D800 to U+DBFF
UnicodeTrailSurrogate ::
any Unicode code point in the inclusive interval from U+DC00 to U+DFFF
選択される関連 u
HexLeadSurrogate が曖昧な各 \u
HexTrailSurrogate は、他に対応する \u
HexTrailSurrogate を持たない最も近い u
HexLeadSurrogate に関連付けられなければならない。
HexLeadSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is in the inclusive interval from 0xD800 to 0xDBFF
HexTrailSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is in the inclusive interval from 0xDC00 to 0xDFFF
HexNonSurrogate ::
Hex4Digits
but only if the MV of Hex4Digits is not in the inclusive interval from 0xD800 to 0xDFFF
IdentityEscape [UnicodeMode] :: [+UnicodeMode]
SyntaxCharacter
[+UnicodeMode]
/
[~UnicodeMode]
SourceCharacter but not UnicodeIDContinue
DecimalEscape ::
NonZeroDigit
DecimalDigits [~Sep] opt
[lookahead ∉ DecimalDigit ]
CharacterClassEscape [UnicodeMode] ::
d
D
s
S
w
W
[+UnicodeMode]
p{
UnicodePropertyValueExpression
}
[+UnicodeMode]
P{
UnicodePropertyValueExpression
}
UnicodePropertyValueExpression ::
UnicodePropertyName
=
UnicodePropertyValue
LoneUnicodePropertyNameOrValue
UnicodePropertyName ::
UnicodePropertyNameCharacters
UnicodePropertyNameCharacters ::
UnicodePropertyNameCharacter
UnicodePropertyNameCharacters opt
UnicodePropertyValue ::
UnicodePropertyValueCharacters
LoneUnicodePropertyNameOrValue ::
UnicodePropertyValueCharacters
UnicodePropertyValueCharacters ::
UnicodePropertyValueCharacter
UnicodePropertyValueCharacters opt
UnicodePropertyValueCharacter ::
UnicodePropertyNameCharacter
DecimalDigit
UnicodePropertyNameCharacter ::
AsciiLetter
_
CharacterClass [UnicodeMode, UnicodeSetsMode] ::
[
[lookahead ≠ ^ ]
ClassContents [?UnicodeMode, ?UnicodeSetsMode]
]
[^
ClassContents [?UnicodeMode, ?UnicodeSetsMode]
]
ClassContents [UnicodeMode, UnicodeSetsMode] ::
[empty]
[~UnicodeSetsMode]
NonemptyClassRanges [?UnicodeMode]
[+UnicodeSetsMode]
ClassSetExpression
NonemptyClassRanges [UnicodeMode] ::
ClassAtom [?UnicodeMode]
ClassAtom [?UnicodeMode]
NonemptyClassRangesNoDash [?UnicodeMode]
ClassAtom [?UnicodeMode]
-
ClassAtom [?UnicodeMode]
ClassContents [?UnicodeMode, ~UnicodeSetsMode]
NonemptyClassRangesNoDash [UnicodeMode] ::
ClassAtom [?UnicodeMode]
ClassAtomNoDash [?UnicodeMode]
NonemptyClassRangesNoDash [?UnicodeMode]
ClassAtomNoDash [?UnicodeMode]
-
ClassAtom [?UnicodeMode]
ClassContents [?UnicodeMode, ~UnicodeSetsMode]
ClassAtom [UnicodeMode] ::
-
ClassAtomNoDash [?UnicodeMode]
ClassAtomNoDash [UnicodeMode] ::
SourceCharacter but not one of \ or ] or -
\
ClassEscape [?UnicodeMode]
ClassEscape [UnicodeMode] ::
b
[+UnicodeMode]
-
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode]
ClassSetExpression ::
ClassUnion
ClassIntersection
ClassSubtraction
ClassUnion ::
ClassSetRange
ClassUnion opt
ClassSetOperand
ClassUnion opt
ClassIntersection ::
ClassSetOperand
&&
[lookahead ≠ & ]
ClassSetOperand
ClassIntersection
&&
[lookahead ≠ & ]
ClassSetOperand
ClassSubtraction ::
ClassSetOperand
--
ClassSetOperand
ClassSubtraction
--
ClassSetOperand
ClassSetRange ::
ClassSetCharacter
-
ClassSetCharacter
ClassSetOperand ::
NestedClass
ClassStringDisjunction
ClassSetCharacter
NestedClass ::
[
[lookahead ≠ ^ ]
ClassContents [+UnicodeMode, +UnicodeSetsMode]
]
[^
ClassContents [+UnicodeMode, +UnicodeSetsMode]
]
\
CharacterClassEscape [+UnicodeMode]
ClassStringDisjunction ::
\q{
ClassStringDisjunctionContents
}
ClassStringDisjunctionContents ::
ClassString
ClassString
|
ClassStringDisjunctionContents
ClassString ::
[empty]
NonEmptyClassString
NonEmptyClassString ::
ClassSetCharacter
NonEmptyClassString opt
ClassSetCharacter ::
[lookahead ∉ ClassSetReservedDoublePunctuator ]
SourceCharacter but not ClassSetSyntaxCharacter
\
CharacterEscape [+UnicodeMode]
\
ClassSetReservedPunctuator
\b
ClassSetReservedDoublePunctuator :: one of && !! ## $$ %% ** ++ ,, .. :: ;; << == >> ?? @@ ^^ `` ~~
ClassSetSyntaxCharacter :: one of ( ) [ ] { } / - \ |
ClassSetReservedPunctuator :: one of & - ! # % , : ; < = > @ ` ~
Annex B (normative) Web ブラウザ向け追加 ECMAScript 機能
本附属書で定義される ECMAScript 言語の構文および意味論は、ECMAScript ホスト が Web ブラウザである場合には必須である。ホスト が Web ブラウザでない場合、この附属書の内容は規範的だが任意である。
本附属書で定義される一部の機能は本附属書内に記述され、他の一部は本文(メイン仕様)内に記述される。
ある機能が本文で規定されている場合、その機能が文書に影響する各箇所は彩色されたボックス内の "Normative Optional" という語で示される。さらに、アルゴリズムや早期エラー規則 中で特定の文言がその機能に依存する場合、それは「その関連機能を the host supports (ホスト がサポートする)」という条件でガードされる。Web ブラウザはそのような機能をすべてサポートすることが要求される。
Note
この附属書は各種レガシー 機能および Web ブラウザ ECMAScript ホスト の特性を記述する。本附属書に規定される言語機能と挙動は一つ以上の望ましくない特性を持ち、レガシー 利用が存在しなければ仕様から削除されるものである。しかし多数の既存 Web ページがこれら機能を利用しているため、Web ブラウザは継続的なサポートが必要である。本附属書の規定はこれらレガシー 機能の相互運用可能な実装要件を定義する。
これら機能は ECMAScript 言語のコアには含まれないと見なされる。新しい ECMAScript コードを書く際、開発者はこれらの機能や振る舞いの存在を使用・前提とすべきではない。Web ブラウザの一部であるか、Web ブラウザが遭遇する同じレガシー ECMAScript コードを実行する必要がある場合を除き、実装はこれら機能の実装を推奨されない。
B.1 追加構文
B.1.2 正規表現パターン
22.2.1 の構文は以下のように修正・拡張される。これらの変更は文法生成規則の順序および文脈情報で解消される曖昧性を導入する。以下の文法で構文解析する際、各選択肢はそれ以前の生成規則選択肢がマッチしない場合のみ検討される。
この代替パターン文法と意味論は BMP パターンの構文と意味論のみを変更する。以下の文法拡張には [UnicodeMode] パラメータ付き生成規則が含まれる。しかし、これら拡張はゴール記号 に [UnicodeMode] パラメータが存在する場合に認識される Unicode パターンの構文を変更しない。
構文
Term [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: [+UnicodeMode]
Assertion [+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
[+UnicodeMode]
Atom [+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
Quantifier
[+UnicodeMode]
Atom [+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
[~UnicodeMode]
QuantifiableAssertion [?NamedCaptureGroups]
Quantifier
[~UnicodeMode]
Assertion [~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups]
[~UnicodeMode]
ExtendedAtom [?NamedCaptureGroups]
Quantifier
[~UnicodeMode]
ExtendedAtom [?NamedCaptureGroups]
Assertion [UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] ::
^
$
\b
\B
[+UnicodeMode]
(?=
Disjunction [+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
[+UnicodeMode]
(?!
Disjunction [+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
[~UnicodeMode]
QuantifiableAssertion [?NamedCaptureGroups]
(?<=
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
(?<!
Disjunction [?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups]
)
QuantifiableAssertion [NamedCaptureGroups] ::
(?=
Disjunction [~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups]
)
(?!
Disjunction [~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups]
)
ExtendedAtom [NamedCaptureGroups] ::
.
\
AtomEscape [~UnicodeMode, ?NamedCaptureGroups]
\
[lookahead = c ]
CharacterClass [~UnicodeMode, ~UnicodeSetsMode]
(
GroupSpecifier [~UnicodeMode] opt
Disjunction [~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
:
Disjunction [~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups]
)
(?
RegularExpressionModifiers
-
RegularExpressionModifiers
:
Disjunction [~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups]
)
InvalidBracedQuantifier
ExtendedPatternCharacter
InvalidBracedQuantifier ::
{
DecimalDigits [~Sep]
}
{
DecimalDigits [~Sep]
,}
{
DecimalDigits [~Sep]
,
DecimalDigits [~Sep]
}
ExtendedPatternCharacter ::
SourceCharacter but not one of ^
$
\
.
*
+
?
(
)
[
|
AtomEscape [UnicodeMode, NamedCaptureGroups] :: [+UnicodeMode]
DecimalEscape
[~UnicodeMode]
DecimalEscape
but only if the CapturingGroupNumber of DecimalEscape is ≤ CountLeftCapturingParensWithin(the Pattern containing DecimalEscape )
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode, ?NamedCaptureGroups]
[+NamedCaptureGroups]
k
GroupName [?UnicodeMode]
CharacterEscape [UnicodeMode, NamedCaptureGroups] ::
ControlEscape
c
AsciiLetter
0
[lookahead ∉ DecimalDigit ]
HexEscapeSequence
RegExpUnicodeEscapeSequence [?UnicodeMode]
[~UnicodeMode]
LegacyOctalEscapeSequence
IdentityEscape [?UnicodeMode, ?NamedCaptureGroups]
IdentityEscape [UnicodeMode, NamedCaptureGroups] :: [+UnicodeMode]
SyntaxCharacter
[+UnicodeMode]
/
[~UnicodeMode]
SourceCharacterIdentityEscape [?NamedCaptureGroups]
SourceCharacterIdentityEscape [NamedCaptureGroups] :: [~NamedCaptureGroups]
SourceCharacter but not c
[+NamedCaptureGroups]
SourceCharacter but not one of c or k
ClassAtomNoDash [UnicodeMode, NamedCaptureGroups] ::
SourceCharacter but not one of \ or ] or -
\
ClassEscape [?UnicodeMode, ?NamedCaptureGroups]
\
[lookahead = c ]
ClassEscape [UnicodeMode, NamedCaptureGroups] ::
b
[+UnicodeMode]
-
[~UnicodeMode]
c
ClassControlLetter
CharacterClassEscape [?UnicodeMode]
CharacterEscape [?UnicodeMode, ?NamedCaptureGroups]
ClassControlLetter ::
DecimalDigit
_
Note
同一の左辺が [+UnicodeMode] と [~UnicodeMode] の両方で現れるのは曖昧性解消の優先度を制御するためである。
B.1.2.1 静的意味論: 早期エラー
22.2.1.1 の意味論は次のように拡張される:
ExtendedAtom :: InvalidBracedQuantifier
この生成規則にマッチするソーステキストが存在する場合は Syntax Error である。
さらに、以下の生成規則に対する規則は 強調された 追加文言を含むよう修正される:
NonemptyClassRanges ::
ClassAtom
-
ClassAtom
ClassContents
最初の ClassAtom の IsCharacterClass が true または 2 番目の ClassAtom の IsCharacterClass が true かつ本生成規則が [UnicodeMode] パラメータを持つ 場合は Syntax Error。
最初の ClassAtom の IsCharacterClass が false 、2 番目の ClassAtom の IsCharacterClass が false で、最初の ClassAtom の CharacterValue が 2 番目より厳密に大きい場合は Syntax Error。
NonemptyClassRangesNoDash ::
ClassAtomNoDash
-
ClassAtom
ClassContents
B.1.2.2 静的意味論: CountLeftCapturingParensWithin / CountLeftCapturingParensBefore
CountLeftCapturingParensWithin および CountLeftCapturingParensBefore の定義において “
Atom ::
(
GroupSpecifier opt
Disjunction
)
” という参照は “
Atom ::
(
GroupSpecifier opt
Disjunction
)
” または “
ExtendedAtom ::
(
GroupSpecifier opt
Disjunction
)
” を意味するものとして解釈する。
B.1.2.3 静的意味論: IsCharacterClass
22.2.1.6 の意味論は以下のように拡張される:
ClassAtomNoDash ::
\
[lookahead = c ]
false を返す。
B.1.2.4 静的意味論: CharacterValue
22.2.1.7 の意味論は以下のように拡張される:
ClassAtomNoDash ::
\
[lookahead = c ]
U+005C (REVERSE SOLIDUS) の数値値を返す。
ClassEscape ::
c
ClassControlLetter
ch を ClassControlLetter にマッチしたコードポイントとする。i を ch の数値値とする。i を 32 で割った余りを返す。
CharacterEscape :: LegacyOctalEscapeSequence
LegacyOctalEscapeSequence の MV を返す (12.9.4.3 を参照)。
B.1.2.5 実行時意味論: CompileSubpattern
CompileSubpattern の意味論は以下のように拡張される:
Term ::
QuantifiableAssertion
Quantifier
の規則は
Term ::
Atom
Quantifier
の規則と同一だが Atom を QuantifiableAssertion に置き換える。
Term ::
ExtendedAtom
Quantifier
の規則は
Term ::
Atom
Quantifier
の規則と同一だが Atom を ExtendedAtom に置き換える。
Term :: ExtendedAtom
の規則は
Term :: Atom
の規則と同一だが Atom を ExtendedAtom に置き換える。
B.1.2.6 実行時意味論: CompileAssertion
Assertion ::
(?=
Disjunction
)
および
Assertion ::
(?!
Disjunction
)
の CompileAssertion 規則は QuantifiableAssertion 生成規則にも用いられるが、Assertion を QuantifiableAssertion に置き換える。
B.1.2.7 実行時意味論: CompileAtom
Atom 生成規則(
Atom :: PatternCharacter
を除く)に対する CompileAtom 規則は ExtendedAtom 生成規則にも用いられ、Atom を ExtendedAtom に置き換える。さらに parameter direction を伴う以下の規則が追加される:
ExtendedAtom ::
\
[lookahead = c ]
A を単一文字 \
U+005C (REVERSE SOLIDUS) を含む CharSet とする。CharacterSetMatcher (rer , A , false , direction ) を返す。
ExtendedAtom :: ExtendedPatternCharacter
ch を ExtendedPatternCharacter により表される文字とする。A を文字 ch を 1 要素として含む CharSet とする。CharacterSetMatcher (rer , A , false , direction ) を返す。
B.1.2.8 実行時意味論: CompileToCharSet
22.2.2.9 の意味論は以下のように拡張される:
次の 2 つの規則は CompileToCharSet の対応する規則を置き換える。
NonemptyClassRanges ::
ClassAtom
-
ClassAtom
ClassContents
A を第 1 の ClassAtom に対し引数 rer で CompileToCharSet を適用した結果とする。B を第 2 の ClassAtom に対し引数 rer で CompileToCharSet を適用した結果とする。C を ClassContents に対し引数 rer で CompileToCharSet を適用した結果とする。D を CharacterRangeOrUnion (rer , A , B ) とする。D と C の和集合を返す。
NonemptyClassRangesNoDash ::
ClassAtomNoDash
-
ClassAtom
ClassContents
A を ClassAtomNoDash に対し引数 rer で CompileToCharSet を適用した結果とする。B を ClassAtom に対し引数 rer で CompileToCharSet を適用した結果とする。C を ClassContents に対し引数 rer で CompileToCharSet を適用した結果とする。D を CharacterRangeOrUnion (rer , A , B ) とする。D と C の和集合を返す。
加えて、以下の規則が CompileToCharSet に追加される。
ClassEscape ::
c
ClassControlLetter
cv をこの ClassEscape の CharacterValue とする。c を文字値が cv の文字とする。文字 c を単一要素として含む CharSet を返す。
ClassAtomNoDash ::
\
[lookahead = c ]
単一文字 \
U+005C (REVERSE SOLIDUS) を含む CharSet を返す。
Note この生成規則は、受容可能な制御文字が続かない文字クラス内部のシーケンス \c
からのみ到達し得る。
B.1.2.8.1 CharacterRangeOrUnion ( rer , A , B )
The abstract operation CharacterRangeOrUnion takes arguments rer (a RegExp Record ), A (a CharSet ), and B (a CharSet ) and returns a CharSet . It performs the following steps when called:
HasEitherUnicodeFlag (rer ) が false ならもし A がちょうど 1 文字を含むわけではない、または B がちょうど 1 文字を含むわけではないならC を単一文字 -
U+002D (HYPHEN-MINUS) を含む CharSet とする。CharSet A , B , C の和集合を返す。 CharacterRange (A , B ) を返す。
B.1.2.9 静的意味論: ParsePattern ( patternText , u , v )
22.2.3.4 の意味論は以下のように拡張される:
抽象操作 ParsePattern は引数 patternText (Unicode コードポイント列)、u (Boolean)、v (Boolean)を取り、呼び出し時に次を行う:
もし v が true かつ u が true ならparseResult を 1 個以上の SyntaxError オブジェクトを含む List とする。 それ以外で v が true ならparseResult を ParseText(patternText , Pattern [+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups] ) とする。 それ以外で u が true ならparseResult を ParseText(patternText , Pattern [+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups] ) とする。 それ以外parseResult を ParseText(patternText , Pattern [~UnicodeMode, ~UnicodeSetsMode, ~NamedCaptureGroups] ) とする。もし parseResult が Parse Node でかつ GroupName を含むならparseResult を ParseText(patternText , Pattern [~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups] ) に設定する。 parseResult を返す。
B.2 追加の組込みプロパティ
ECMAScript ホスト が Web ブラウザである場合、標準組込みオブジェクトに以下の追加プロパティが定義される。
B.2.1 グローバルオブジェクトの追加プロパティ
Table 100 の項目が Table 6 に追加される。
Table 100: Additional Well-known Intrinsic Objects
B.2.1.1 escape ( string )
この関数はグローバルオブジェクト のプロパティである。特定のコードユニットを 16 進エスケープシーケンスに置換した新しい String 値を生成する。
数値値が 0x00FF 以下のコードユニットを置換する際は %xx
形式の 2 桁エスケープシーケンスを用いる。数値値が 0x00FF を超えるコードユニットを置換する際は %uxxxx
形式の 4 桁エスケープシーケンスを用いる。
これは %escape% イントリンシックオブジェクトである。
呼び出し時、次の手順を実行する:
string を ? ToString (string ) に設定する。len を string の長さとする。R を空文字列とする。unescapedSet を ASCII の単語構成文字と "@*+-./" の文字列連結 とする。k を 0 とする。繰り返し (k < len の間):C を string 内インデックス k のコードユニットとする。もし unescapedSet が C を含むならS を C とする。 それ以外n を C の数値値とする。もし n < 256 ならhex を n の大文字 16 進表現とする。S を "%" と StringPad (hex , 2, "0" , start ) の連結とする。 それ以外hex を n の大文字 16 進表現とする。S を "%u" と StringPad (hex , 4, "0" , start ) の連結とする。 R を R と S の連結に設定する。k を k + 1 に設定する。 R を返す。
Note
このエンコーディングは部分的に RFC 1738 に記述されたエンコーディングに基づくが、本標準で規定されるエンコーディング全体は RFC 1738 の内容を参照せず上記で完結している。このエンコーディングは RFC 3986 による RFC 1738 への変更を反映しない。
B.2.1.2 unescape ( string )
この関数はグローバルオブジェクト のプロパティである。escape
関数によって導入され得る種類の各エスケープシーケンスを、その表すコードユニットへ置換した新しい String 値を生成する。
これは %unescape% イントリンシックオブジェクトである。
呼び出し時、次の手順を実行する:
string を ? ToString (string ) に設定する。len を string の長さとする。R を空文字列とする。k を 0 とする。繰り返し (k < len の間):C を string 内インデックス k のコードユニットとする。もし C がコードユニット 0x0025 (PERCENT SIGN) ならhexDigits を空文字列とする。optionalAdvance を 0 とする。もし k + 5 < len かつ string のインデックス k + 1 のコードユニットが 0x0075 (LATIN SMALL LETTER U) ならhexDigits を string の k + 2 から k + 6 までの部分文字列 とする。optionalAdvance を 5 に設定する。 それ以外で k + 3 ≤ len ならhexDigits を string の k + 1 から k + 3 までの部分文字列 とする。optionalAdvance を 2 に設定する。 parseResult を ParseText(hexDigits , HexDigits [~Sep] ) とする。もし parseResult が Parse Node ならn を parseResult の MV とする。C を数値値 n のコードユニットとする。k を k + optionalAdvance に設定する。 R を R と C の連結に設定する。k を k + 1 に設定する。 R を返す。
B.2.2 String.prototype オブジェクトの追加プロパティ
B.2.2.1 String.prototype.substr ( start , length )
このメソッドは this 値を String に変換した結果の substring を返す。開始インデックス start から length 個のコードユニット(length が undefined の場合末尾まで)を含む。start が負なら sourceLength を文字列長として sourceLength + start として扱う。結果は String 値であり String オブジェクトではない。
呼び出し時、次を行う:
O を this 値とする。? RequireObjectCoercible (O ) を実行する。 S を ? ToString (O ) とする。size を S の長さとする。intStart を ? ToIntegerOrInfinity (start ) とする。もし intStart = -∞ なら intStart を 0 に設定する。 それ以外で intStart < 0 なら intStart を max (size + intStart , 0) に設定する。 それ以外は intStart を min (intStart , size ) に設定する。 もし length が undefined なら intLength を size とする;そうでなければ intLength を ? ToIntegerOrInfinity (length ) とする。 intLength を 0 と size の間にクランプした結果に設定する。intEnd を min (intStart + intLength , size ) とする。S の intStart から intEnd までの substring を返す。
Note
このメソッドは意図的にジェネリックであり、this 値が String オブジェクトであることを要求しない。他オブジェクトへメソッドとして移して使用できる。
B.2.2.2 String.prototype.anchor ( name )
呼び出し時、次を行う:
S を this 値とする。? CreateHTML (S , "a" , "name" , name ) を返す。
B.2.2.2.1 CreateHTML ( string , tag , attribute , value )
The abstract operation CreateHTML takes arguments string (an ECMAScript language value), tag (a String), attribute (a String), and value (an ECMAScript language value) and returns 正常完了で String を含むか、または throw completion . It performs the following steps when called:
? RequireObjectCoercible (string ) を実行する。 S を ? ToString (string ) とする。p1 を "<" と tag の連結とする。もし attribute が空文字列でなければV を ? ToString (value ) とする。escapedV を V 内の各 0x0022 (QUOTATION MARK) を 6 コードユニット列 """ に置換した文字列値とする。p1 を以下の連結とする:p1 0x0020 (SPACE) attribute 0x003D (EQUALS SIGN) 0x0022 (QUOTATION MARK) escapedV 0x0022 (QUOTATION MARK) p2 を p1 と ">" の連結とする。p3 を p2 と S の連結とする。p4 を p3 , "</" , tag , ">" の連結とする。p4 を返す。
B.2.2.3 String.prototype.big ( )
呼び出し時、次を行う:
S を this 値とする。? CreateHTML (S , "big" , "" , "" ) を返す。
B.2.2.4 String.prototype.blink ( )
呼び出し時、次を行う:
S を this 値とする。? CreateHTML (S , "blink" , "" , "" ) を返す。
B.2.2.5 String.prototype.bold ( )
呼び出し時、次を行う:
S を this 値とする。? CreateHTML (S , "b" , "" , "" ) を返す。
B.2.2.6 String.prototype.fixed ( )
呼び出し時、次を行う:
S を this 値とする。? CreateHTML (S , "tt" , "" , "" ) を返す。
B.2.2.7 String.prototype.fontcolor ( colour )
呼び出し時、次を行う:
S を this 値とする。? CreateHTML (S , "font" , "color" , colour ) を返す。
B.2.2.8 String.prototype.fontsize ( size )
呼び出し時、次を行う:
S を this 値とする。? CreateHTML (S , "font" , "size" , size ) を返す。
B.2.2.9 String.prototype.italics ( )
呼び出し時、次を行う:
S を this 値とする。? CreateHTML (S , "i" , "" , "" ) を返す。
B.2.2.10 String.prototype.link ( url )
呼び出し時、次を行う:
S を this 値とする。? CreateHTML (S , "a" , "href" , url ) を返す。
B.2.2.11 String.prototype.small ( )
呼び出し時、次を行う:
S を this 値とする。? CreateHTML (S , "small" , "" , "" ) を返す。
B.2.2.12 String.prototype.strike ( )
呼び出し時、次を行う:
S を this 値とする。? CreateHTML (S , "strike" , "" , "" ) を返す。
B.2.2.13 String.prototype.sub ( )
呼び出し時、次を行う:
S を this 値とする。? CreateHTML (S , "sub" , "" , "" ) を返す。
B.2.2.14 String.prototype.sup ( )
呼び出し時、次を行う:
S を this 値とする。? CreateHTML (S , "sup" , "" , "" ) を返す。
B.2.2.15 String.prototype.trimLeft ( )
Note
"trimStart" プロパティが推奨される。"trimLeft" は主として古いコードとの互換性のために提供される。新しい ECMAScript コードでは "trimStart" の使用が推奨される。
"trimLeft" プロパティの初期値は 22.1.3.34 で定義される %String.prototype.trimStart% である。
B.2.2.16 String.prototype.trimRight ( )
Note
"trimEnd" プロパティが推奨される。"trimRight" は主として古いコードとの互換性のために提供される。新しい ECMAScript コードでは "trimEnd" の使用が推奨される。
"trimRight" プロパティの初期値は 22.1.3.33 で定義される %String.prototype.trimEnd% である。
B.2.3 Date.prototype オブジェクトの追加プロパティ
B.2.3.1 Date.prototype.getYear ( )
Note
“2000 年問題” を回避できるため、ほぼ全ての目的で getFullYear
メソッドが推奨される。
このメソッドは呼び出し時に次を行う:
dateObject を this 値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。もし t が NaN なら NaN を返す。 YearFromTime (LocalTime (t )) - 1900 𝔽 を返す。
B.2.3.2 Date.prototype.setYear ( year )
Note
“2000 年問題” を回避できるため、ほぼ全ての目的で setFullYear
メソッドが推奨される。
このメソッドは呼び出し時に次を行う:
dateObject を this 値とする。? RequireInternalSlot (dateObject , [[DateValue]] ) を実行する。 t を dateObject .[[DateValue]] とする。y を ? ToNumber (year ) とする。もし t が NaN なら t を +0 𝔽 に、そうでなければ t を LocalTime (t ) に設定する。 yyyy を MakeFullYear (y ) とする。d を MakeDay (yyyy , MonthFromTime (t ), DateFromTime (t )) とする。date を MakeDate (d , TimeWithinDay (t )) とする。u を TimeClip (UTC (date )) とする。dateObject .[[DateValue]] を u に設定する。u を返す。
B.2.3.3 Date.prototype.toGMTString ( )
Note
toUTCString
メソッドが推奨される。このメソッドは主として古いコードとの互換性のために提供される。
"toGMTString" プロパティの初期値は 21.4.4.43 で定義される %Date.prototype.toUTCString% である。
B.2.4 RegExp.prototype オブジェクトの追加プロパティ
B.2.4.1 RegExp.prototype.compile ( pattern , flags )
このメソッドは呼び出し時に次を行う:
O を this 値とする。? RequireInternalSlot (O , [[RegExpMatcher]] ) を実行する。 もし pattern が Object で [[RegExpMatcher]] 内部スロットを持つならもし flags が undefined でなければ TypeError 例外を投げる。 P を pattern .[[OriginalSource]] とする。F を pattern .[[OriginalFlags]] とする。 それ以外P を pattern とする。F を flags とする。 ? RegExpInitialize (O , P , F ) を返す。
Note
このメソッドは this の RegExp を新しいパターンとフラグで完全に再初期化する。実装はこのメソッドの使用を、結果の RegExp オブジェクトが複数回使用され最適化候補であるという表明として解釈し得る。
B.3 その他の追加機能
B.3.1 ラベル付き Function 宣言
ECMAScript 2015 以前、LabelledStatement の仕様は FunctionDeclaration にステートメントラベルを関連付けることを許可していなかった。しかし非 strict コード向けの拡張として許容され、多くのブラウザホスト 実装はそれをサポートしていた。ECMAScript 2015 以降、LabelledStatement の文法生成規則は FunctionDeclaration を LabelledItem として許容するが、14.13.1 の早期エラー規則 がそれを Syntax Error とする。その規則はホスト がこの機能をサポートする場合、非 strict コードで Syntax Error を抑制するよう修正される。
Note
B.3.2 ブロックレベル Function 宣言 (Web レガシー互換意味論)
ECMAScript 2015 以前、Block ステートメントの StatementList 要素として FunctionDeclaration が出現することは ECMAScript 仕様で定義されていなかった。しかしその形式は拡張として許容され、多くのブラウザ実装で許可されていた。不幸にも実装間で意味論が異なる。これらの差異のため、Block レベルの function 宣言を用いる既存 Web ソースは、全ブラウザ実装の意味論的交差に依存する場合のみ移植性がある。以下はその交差意味論に属するユースケースである:
関数が宣言され単一のブロック内でのみ参照される。
関数が 1 つの Block 内で宣言され(必要なら使用される)さらに同一 Block 外の内側関数定義から参照される。
関数が 1 つのブロック内で宣言され(必要なら使用され)さらに後続のブロック内で参照される。
最初のユースケースは ECMAScript 2015 が提供する Block レベル function 宣言の意味論と相互運用可能である。このユースケースを用いる既存のソースは 10 、14 、15 で定義される意味論を用いて動作する。
2 番目と 3 番目のユースケースの ECMAScript 2015 相互運用性には、10 、15 、19.2.1 、16.1.7 節の意味論への以下の拡張が必要である。
実装が診断警告メッセージを報告する仕組みを持つ場合、この互換意味論が適用され非互換意味論との差異が観測可能となる FunctionDeclaration を含むコードに対して警告を出すべきである。例えば var バインディングの導入が早期エラーを生むために導入されない場合は警告を出すべきでない。
この機能は次の箇所で特別な意味論を伴う:
B.3.3 IfStatement の節内 FunctionDeclarations
以下は 14.6 の IfStatement 生成規則を拡張する:
IfStatement [Yield, Await, Return] :
if
(
Expression [+In, ?Yield, ?Await]
)
FunctionDeclaration [?Yield, ?Await, ~Default]
else
Statement [?Yield, ?Await, ?Return]
if
(
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
else
FunctionDeclaration [?Yield, ?Await, ~Default]
if
(
Expression [+In, ?Yield, ?Await]
)
FunctionDeclaration [?Yield, ?Await, ~Default]
else
FunctionDeclaration [?Yield, ?Await, ~Default]
if
(
Expression [+In, ?Yield, ?Await]
)
FunctionDeclaration [?Yield, ?Await, ~Default]
[lookahead ≠ else ]
この生成規則は非 strict コードを解析する場合にのみ適用される。この生成規則にマッチするソーステキストは、各 FunctionDeclaration [?Yield, ?Await, ~Default] の一致がその位置に 1 つの BlockStatement の唯一の StatementListItem として存在するかのように処理される。その合成 BlockStatement の意味論は B.3.2 で指定される Web レガシー 互換意味論を含む。
B.3.4 Catch ブロック内の VariableStatements
この機能では、Catch 節の Block が CatchParameter によってもバインドされる名前を var
宣言でバインドできる。これは 14.15.1 内
Catch :
catch
(
CatchParameter
)
Block
の早期エラー規則 を修正することで達成する。
Note
実行時にはそのようなバインディングは VariableDeclarationEnvironment にインスタンス化される。同名の CatchParameter によって導入されたバインディングをシャドウせず、そのような var
宣言の Initializer は catch パラメータに代入する。
この変更は Catch 節の Block 内に含まれる direct eval 呼び出しによって導入される var
および function
宣言にも適用される。この変更は EvalDeclarationInstantiation の 3.d.i.2.a.i および 13.b.ii.4.a.i.i ステップを修正することで行う。
B.3.5 ForIn 文ヘッドの Initializer
以下は 14.7.5 における ForInOfStatement 生成規則を拡張する:
ForInOfStatement [Yield, Await, Return] :
for
(
var
BindingIdentifier [?Yield, ?Await]
Initializer [~In, ?Yield, ?Await]
in
Expression [+In, ?Yield, ?Await]
)
Statement [?Yield, ?Await, ?Return]
この生成規則は非 strict コードを解析する場合にのみ適用される。
8.3.1 の ContainsDuplicateLabels の静的意味論 は以下で拡張される:
ForInOfStatement :
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
Statement の ContainsDuplicateLabels を引数 labelSet で返す。
8.3.2 の ContainsUndefinedBreakTarget の静的意味論 は以下で拡張される:
ForInOfStatement :
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
Statement の ContainsUndefinedBreakTarget を引数 labelSet で返す。
8.3.3 の ContainsUndefinedContinueTarget の静的意味論 は以下で拡張される:
ForInOfStatement :
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
Statement の ContainsUndefinedContinueTarget を引数 iterationSet と « » で返す。
14.7.5.2 の IsDestructuring の静的意味論 は以下で拡張される:
BindingIdentifier :
Identifier
yield
await
false を返す。
8.2.6 の VarDeclaredNames の静的意味論 は以下で拡張される:
ForInOfStatement :
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
names1 を BindingIdentifier の BoundNames とする。names2 を Statement の VarDeclaredNames とする。names1 と names2 のリスト結合 を返す。
8.2.7 の VarScopedDeclarations の静的意味論 は以下で拡張される:
ForInOfStatement :
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
declarations1 を « BindingIdentifier » とする。declarations2 を Statement の VarScopedDeclarations とする。declarations1 と declarations2 のリスト結合 を返す。
14.7.5.5 の ForInOfLoopEvaluation の実行時意味論 は以下で拡張される:
ForInOfStatement :
for
(
var
BindingIdentifier
Initializer
in
Expression
)
Statement
bindingId を BindingIdentifier の StringValue とする。lhs を ? ResolveBinding (bindingId ) とする。もし IsAnonymousFunctionDefinition(Initializer ) が true ならvalue を ? NamedEvaluation(Initializer , 引数 bindingId ) とする。 それ以外rhs を ? Evaluation(Initializer ) とする。value を ? GetValue (rhs ) とする。 ? PutValue (lhs , value ) を実行する。 keyResult を ? ForIn/OfHeadEvaluation (« », Expression , enumerate ) とする。? ForIn/OfBodyEvaluation (BindingIdentifier , Statement , keyResult , enumerate , var-binding , labelSet ) を返す。
B.3.6 [[IsHTMLDDA]] 内部スロット
ホスト定義 オブジェクトに [[IsHTMLDDA]] internal slot が存在する場合がある。この内部スロットを持つオブジェクトは ToBoolean 抽象操作 および IsLooselyEqual 抽象操作 、ならびに typeof
演算子 の被演算子として使用されると undefined のように振る舞う。
Note
[[IsHTMLDDA]] 内部スロットを持つオブジェクトは本仕様によって生成されない。ただし Web 互換性のために存在するブラウザの document.all
オブジェクト はこのスロットを持つホスト定義 エキゾチックオブジェクト である。この種の他の例は知られておらず、実装は document.all
を例外として新たに作成すべきでない。
この機能は次の箇所で特別な意味論を伴う:
B.3.7 HostMakeJobCallback における非デフォルト挙動
HostMakeJobCallback 抽象操作 は Web ブラウザであるホスト が非デフォルト挙動を指定することを許可する。
B.3.8 HostEnsureCanAddPrivateElement における非デフォルト挙動
HostEnsureCanAddPrivateElement 抽象操作 は Web ブラウザであるホスト が非デフォルト挙動を指定することを許可する。
B.3.9 関数呼び出し代入ターゲットの実行時エラー
非 strict コードで関数呼び出し (13.3.6 ) が代入ターゲットとして用いられる場合、早期エラーを生成する代わりに、代入の評価中に ReferenceError がスローされる。
Note
代入ターゲットが AssignmentExpression の LeftHandSideExpression である場合、代入演算子は =
か AssignmentOperator でなければならず、論理代入演算子 (??=
, &&=
, ||=
) には適用されない。
CallExpression : CoverCallExpressionAndAsyncArrowHead
および
CallExpression :
CallExpression
Arguments
に関する AssignmentTargetType の 1 ステップを参照。
Annex C (informative) ECMAScript の Strict Mode
Strict mode の制約と例外
implements
, interface
, let
, package
, private
, protected
, public
, static
, および yield
は strict mode コード内では予約語である (12.7.2 )。
適合実装は strict mode コードを処理する際、生成規則
NumericLiteral :: LegacyOctalIntegerLiteral
および
DecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral
のインスタンスを禁止しなければならない。
適合実装は strict mode コードを処理する際、生成規則
EscapeSequence :: LegacyOctalEscapeSequence
および
EscapeSequence :: NonOctalDecimalEscapeSequence
のインスタンスを禁止しなければならない。
宣言されていない識別子または解決不能な参照への代入はグローバルオブジェクト にプロパティを作成しない。Strict mode コード内で単純代入が行われる場合、その LeftHandSideExpression は解決不能 Reference に評価されてはならない。そうなった場合 ReferenceError 例外が投げられる (6.2.5.6 )。LeftHandSideExpression はまた { [[Writable]] : false } の属性値を持つデータプロパティ 、{ [[Set]] : undefined } の属性値を持つアクセサプロパティ 、あるいは [[Extensible]] 内部スロットが false のオブジェクトに存在しないプロパティを参照してはならない。これらの場合 TypeError
例外が投げられる (13.15 )。
StringValue が "eval" または "arguments" の IdentifierReference は代入演算子 (13.15 ) の LeftHandSideExpression 、UpdateExpression (13.4 )、あるいは Prefix Increment (13.4.4 ) / Prefix Decrement (13.4.5 ) 演算子により操作される UnaryExpression として現れてはならない。
Strict 関数の arguments オブジェクトはアクセス時に TypeError 例外を投げる設定不可能なアクセサプロパティ "callee" を定義する (10.4.4.6 )。
Strict 関数の arguments オブジェクトは対応する仮引数バインディングと 配列インデックス プロパティ値を動的に共有しない (10.4.4 )。
Strict 関数で arguments オブジェクトが生成された場合、ローカル識別子 arguments
のそのオブジェクトへのバインディングは不変であり、代入式のターゲットになり得ない (10.2.11 )。
Strict mode コード内で BindingIdentifier の StringValue が "eval" または "arguments" であると SyntaxError である (13.1.1 )。
Strict mode の eval コードは呼び出し元の variable environment 内に変数や関数をインスタンス化できない。代わりに新しい variable environment が作成され、その環境が eval コードの宣言バインディング初期化に使われる (19.2.1 )。
Strict mode コードで this が評価される場合、その this 値はオブジェクトへ強制変換されない。undefined または null の this 値はグローバルオブジェクト へ変換されず、プリミティブ値はラッパオブジェクトへ変換されない。関数呼び出し(Function.prototype.apply
や Function.prototype.call
を含む)で渡される this 値は強制変換されない (10.2.1.2 , 20.2.3.1 , 20.2.3.3 )。
Strict mode コード内で delete
演算子が現れ、その UnaryExpression が変数・関数引数・関数名への直接参照である場合 SyntaxError が投げられる (13.5.1.1 )。
Strict mode コード内で delete
演算子が現れ、削除対象プロパティが属性 { [[Configurable]] : false } を持つか削除不可能である場合 TypeError が投げられる (13.5.1.2 )。
Strict mode コードは WithStatement を含めてはならない。そのような文脈での WithStatement 出現は SyntaxError である (14.11.1 )。
Strict mode コード内で CatchParameter が現れ、その BoundNames が eval
か arguments
を含むと SyntaxError である (14.15.1 )。
Strict 関数の FormalParameters に同一 BindingIdentifier が複数回現れると SyntaxError である。Function / Generator / AsyncFunction コンストラクタ でそのような関数を作成しようとすると SyntaxError となる (15.2.1 , 20.2.1.1.1 )。
実装は本仕様で定義された範囲を超えて、strict 関数内での関数インスタンスの "caller" または "arguments" という名前のプロパティの意味を拡張してはならない。
Annex D (informative) ホストのレイヤリングポイント
ホスト の定義については 4.2 を参照。
D.1 ホストフック
HostCallJobCallback (...)
HostEnqueueFinalizationRegistryCleanupJob (...)
HostEnqueueGenericJob (...)
HostEnqueuePromiseJob (...)
HostEnqueueTimeoutJob (...)
HostEnsureCanCompileStrings (...)
HostFinalizeImportMeta (...)
HostGetImportMetaProperties (...)
HostGrowSharedArrayBuffer (...)
HostHasSourceTextAvailable (...)
HostLoadImportedModule (...)
HostGetSupportedImportAttributes (...)
HostMakeJobCallback (...)
HostPromiseRejectionTracker (...)
HostResizeArrayBuffer (...)
InitializeHostDefinedRealm (...)
D.2 ホスト定義フィールド
Realm Record の [[HostDefined]] : Table 22 を参照。
Script Record の [[HostDefined]] : Table 37 を参照。
Module Record の [[HostDefined]] : Table 41 を参照。
JobCallback Record の [[HostDefined]] : Table 26 を参照。
Candidate Executions の [[HostSynchronizesWith]] : Table 99 を参照。
[[IsHTMLDDA]] : B.3.6 を参照。
D.3 ホスト定義オブジェクト
グローバルオブジェクト : 19 節を参照。
D.4 ジョブの実行
Job 抽象クロージャ呼び出しの前の準備ステップおよび後のクリーンアップステップ。9.5 を参照。
D.5 エキゾチックオブジェクトの内部メソッド
本仕様内で明示的に規定されていないエキゾチックオブジェクト に対する Table 4 の必須内部メソッドのいずれか。
D.6 組込みオブジェクトとメソッド
17.1 で制限される場合を除き、本仕様で定義されていない組込みオブジェクトおよびメソッド。
Annex E (informative) ECMAScript 2015 における修正と明確化(互換性へ影響し得るもの)
9.1.1.4.14 -9.1.1.4.17 : 第 5 / 5.1 版では新しいグローバル宣言に対応するグローバルオブジェクト プロパティが既に存在するかをプロパティ存在テストで判定していた。ECMAScript 2015 では独自 (own) プロパティ存在テストを使用する。これは多くの Web ブラウザ実装で一般的な挙動に対応する。
10.4.2.1 : 第 5 版は配列インデックス または新しい長さ値の整数 変換前に現在の配列長を捕捉するよう移動した。しかし変換過程が配列長を変化させ得る副作用を持つ場合、その捕捉値は無効になり得た。ECMAScript 2015 はそのような副作用が起こり得た後で現在の配列長を捕捉しなければならないと規定する。
21.4.1.31 : 以前の版では TimeClip 抽象操作 は 0 時刻を +0 𝔽 か -0 𝔽 いずれかで表現してよかった。ECMAScript 2015 は常に +0 𝔽 を返すと規定する。つまり Date の時刻値が観測可能に -0 𝔽 となることはなく、時刻値を返すメソッドも -0 𝔽 を返さない。
21.4.1.32 : UTC オフセット表現が存在しない場合、ローカルタイムゾーンが使用される。第 5.1 版は誤って欠如するタイムゾーンを "z" と解釈すべきと述べていた。
21.4.4.36 : 年が 21.4.1.32 で規定される Date Time String Format で表現できない場合 RangeError 例外を投げる。以前の版はそのケースを規定していなかった。
21.4.4.41 : 以前の版は time value が NaN のとき Date.prototype.toString
が返す値を規定していなかった。ECMAScript 2015 は結果を文字列 "Invalid Date" と規定する。
22.2.4.1 , 22.2.6.13.1 : RegExp インスタンスの "source" プロパティ値内の LineTerminator コードポイントはエスケープシーケンスで表現されなければならない。第 5.1 版は /
のエスケープのみ要求していた。
22.2.6.8 , 22.2.6.11 : 以前の版で String.prototype.match
と String.prototype.replace
の仕様は global
フラグを持つ RegExp 値をパターン引数にした場合の挙動が不正確であった。以前の仕様は各マッチ試行で lastIndex
が変化しなければ 1 増やすべきと述べたが、正しい挙動は空文字列にマッチした場合のみ 1 増やすことである。
23.1.3.30 : 以前の版は _comparator_
が NaN を返した場合の Array.prototype.sort
の解釈を規定していなかった。ECMAScript 2015 はその値を +0 𝔽 が返されたかのように扱うと規定する。また 2015 版は _comparator_
の結果に ToNumber を適用する。以前は Number でない結果の効果は実装依存であり、実際には実装は ToNumber を呼び出していた。
Annex F (informative) 従来版との非互換を導入する追加および変更
6.2.5 : ECMAScript 2015 では関数呼び出しは Reference Record を返すことができない。
7.1.4.1 : ECMAScript 2015 では String 値への ToNumber が BinaryIntegerLiteral と OctalIntegerLiteral の数値文字列を認識して変換する。以前はそれらは NaN へ変換されていた。
9.3 : ECMAScript 2018 ではテンプレートオブジェクトは以前のように Realm 内の全出現横断ではなく Parse Node(ソース位置)に基づき正規化される。
12.2 : ECMAScript 2016 では Unicode 8.0.0 以上が必須になり、2015 版の Unicode 5.1 必須から変更された。特に U+180E MONGOLIAN VOWEL SEPARATOR は Space_Separator
(Zs
) から Format
(Cf
) へ移動(Unicode 6.3.0)し、空白としての扱いが変化した。これは空白に敏感なメソッドの挙動差異を生む。例えば以前は "\u180E".trim().length
は 0
だが 2016 以降は 1
。さらに ECMAScript 2017 は常に Unicode 最新版を使用することを義務付けた。
12.7 : ECMAScript 2015 では IdentifierName の有効コードポイントを Unicode プロパティ “ID_Start” と “ID_Continue” で規定。以前は様々な Unicode カテゴリ列挙で規定されていた。
12.10.1 : ECMAScript 2015 では do-while 文末尾のセミコロンが欠如していると自動セミコロン挿入が追加する。これは実装挙動との整合。
13.2.5.1 : ECMAScript 2015 では Object Initializer で重複プロパティ名 があっても早期エラーではなくなった。
13.15.1 : ECMAScript 2015 では FunctionExpression の関数名のような不変バインディングへの代入を含む strict mode コードは早期エラーではなく実行時エラーを生成する。
14.2 : ECMAScript 2015 ではトークン let に続いて入力要素 LineTerminator その後 Identifier で始まる StatementList は LexicalDeclaration の開始。以前は自動セミコロン挿入が常に Identifier 前にセミコロンを挿入した。
14.5 : ECMAScript 2015 ではトークン let
に続いてトークン [
の並びで始まる StatementListItem は LexicalDeclaration の開始。以前は ExpressionStatement の開始だった。
14.6.2 : ECMAScript 2015 では IfStatement の通常結果が empty になることはない。Statement 部分が評価されないか empty を含む通常完了なら結果は undefined 。
14.7 : ECMAScript 2015 では for 文の (
の直後が let [
トークン列なら let
は LexicalDeclaration の開始。以前は Expression の開始だった。
14.7 : ECMAScript 2015 では for-in 文の ( の直後が let [
なら let
は ForDeclaration の開始。以前は LeftHandSideExpression の開始だった。
14.7 : ECMAScript 2015 以前、初期化式は in
の前の VariableDeclaration の一部として現れ得た。2015 では同位置の ForBinding はそのような初期化子を許さない。2017 では非 strict コードでのみ許容。
14.7 : ECMAScript 2015 では IterationStatement の評価結果が [[Value]] empty の通常完了になることはない。Statement 部分が評価されないか最終評価が empty の場合結果は undefined 。
14.11.2 : ECMAScript 2015 では WithStatement の評価結果が empty の通常完了にならない。Statement 部分が empty の通常完了なら結果は undefined 。
14.12.4 : ECMAScript 2015 では SwitchStatement の評価結果が empty の通常完了にならない。CaseBlock 部分が empty の通常完了なら結果は undefined 。
14.15 : ECMAScript 2015 では Catch 節がパラメータと同じ Identifier の var
宣言を含むと早期エラー。以前はその変数宣言は囲む variable environment にインスタンス化され初期化子値が Catch パラメータへ代入された。
14.15 , 19.2.1.3 : ECMAScript 2015 では Catch 節が非 strict の直接 eval
を評価し、その eval コードが Catch パラメータと同じ Identifier をバインドする var
/ FunctionDeclaration
を含むと実行時 SyntaxError を投げる。
14.15.3 : ECMAScript 2015 では TryStatement の結果が empty 値になることはない。Block 部分が empty を含む通常完了なら結果は undefined 。Block が throw 完了で Catch が empty の通常完了を返し、Finally が無いか empty の通常完了なら結果は undefined 。
15.4.5 : ECMAScript 2015 では ObjectLiteral のアクセサプロパティ [[Get]] / [[Set]] 属性値として作成される関数オブジェクト はコンストラクタ ではなく "prototype" 自身プロパティを持たない。以前はコンストラクタ で "prototype" を持っていた。
20.1.2.6 : ECMAScript 2015 では Object.freeze
引数がオブジェクトでない場合、独自プロパティを持たない非拡張の通常オブジェクト として扱う。以前は常に TypeError 。
20.1.2.8 : ECMAScript 2015 では引数がオブジェクトでない場合 ToObject 変換を試み、成功すればその結果を使用。以前は常に TypeError 。
20.1.2.10 : 同上の挙動。
20.1.2.12 : 同上の挙動。
20.1.2.16 : 引数がオブジェクトでない場合、非拡張の空オブジェクトとして扱う。以前は TypeError 。
20.1.2.17 : 同様。
20.1.2.18 : 同様。
20.1.2.19 : 引数がオブジェクトでない場合 ToObject を試み、成功時その結果を使用。以前は TypeError 。
20.1.2.20 : 引数が非オブジェクトなら非拡張の空オブジェクト扱い。以前は TypeError 。
20.1.2.22 : 同様。
20.2.3.2 : ECMAScript 2015 ではバインド関数の [[Prototype]] はターゲット関数の [[GetPrototypeOf]] の値。以前は常に %Function.prototype% 。
20.2.4.1 : ECMAScript 2015 では関数インスタンスの "length" プロパティは設定可能。以前は不可。
20.5.6.2 : ECMAScript 2015 では NativeError コンストラクタ の [[Prototype]] 内部スロットは Error コンストラクタ 。以前は Function prototype オブジェクト。
21.4.4 ECMAScript 2015 では Date prototype オブジェクトは Date インスタンスではない。以前は TimeValue が NaN の Date インスタンス。
22.1.3.12 ECMAScript 2015 では String.prototype.localeCompare
は Unicode 標準で正規等価な文字列を同一として扱う。以前は正規等価性を無視しビット単位比較も可能だった。
22.1.3.28 および 22.1.3.30 ECMAScript 2015 では大小変換処理はコードポイント単位。以前はコードユニット個別。影響を受けるのは Deseret ブロック。
22.1.3.32 ECMAScript 2015 では String.prototype.trim
は BMP 外に存在し得る空白コードポイントを認識するよう定義(Unicode 7 時点で該当なし)。以前は認識しなかった。
22.2.4.1 ECMAScript 2015 では pattern 引数が RegExp インスタンスで flags が undefined でなければ、新しい RegExp を作成し既存フラグを置換。以前は TypeError 。
22.2.6 ECMAScript 2015 では RegExp prototype オブジェクトは RegExp インスタンスではない。以前は空文字パターンのインスタンス。
22.2.6 ECMAScript 2015 では "source" , "global" , "ignoreCase" , "multiline" は RegExp prototype 上のアクセサプロパティ 。以前はインスタンス上のデータプロパティ 。
25.4.15 : ECMAScript 2019 で Atomics.wake
は Atomics.notify
に改名され Atomics.wait
との混同を防ぐ。
27.1.6.4 , 27.6.3.6 : ECMAScript 2019 で await
によりエンキューされる Job 数が減り、then()
呼び出しと await
式間の解決順序に観測可能な差異を生む可能性がある。
参考文献
IEEE 754-2019 : IEEE Standard for Floating-Point Arithmetic . Institute of Electrical and Electronic Engineers, New York (2019)
Note
IEEE 754-2008 と IEEE 754-2019 の間で ECMA-262 仕様に影響する規範的変更はない。
The Unicode Standard , <https://unicode.org/versions/latest >
Unicode Technical Note #5: Canonical Equivalence in Applications , <https://unicode.org/notes/tn5/ >
Unicode Technical Standard #10: Unicode Collation Algorithm , <https://unicode.org/reports/tr10/ >
Unicode Standard Annex #15, Unicode Normalization Forms , <https://unicode.org/reports/tr15/ >
Unicode Standard Annex #18: Unicode Regular Expressions , <https://unicode.org/reports/tr18/ >
Unicode Standard Annex #24: Unicode Script
Property , <https://unicode.org/reports/tr24/ >
Unicode Standard Annex #31, Unicode Identifiers and Pattern Syntax , <https://unicode.org/reports/tr31/ >
Unicode Standard Annex #44: Unicode Character Database , <https://unicode.org/reports/tr44/ >
Unicode Technical Standard #51: Unicode Emoji , <https://unicode.org/reports/tr51/ >
IANA Time Zone Database , <https://www.iana.org/time-zones >
ISO 8601:2004(E) Data elements and interchange formats — Information interchange — Representation of dates and times
RFC 1738 “Uniform Resource Locators (URL)” , <https://tools.ietf.org/html/rfc1738 >
RFC 2396 “Uniform Resource Identifiers (URI): Generic Syntax” , <https://tools.ietf.org/html/rfc2396 >
RFC 3629 “UTF-8, a transformation format of ISO 10646” , <https://tools.ietf.org/html/rfc3629 >
RFC 7231 “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content” , <https://tools.ietf.org/html/rfc7231 >
奥付
この仕様は GitHub 上で Ecmarkup と呼ばれるプレーンテキストソース形式で作成される。Ecmarkup はこの文書の編集上の慣習に従う完全な HTML レンダリングへ仕様を処理するためのフレームワークおよびツールセットを提供する HTML と Markdown の方言である。Ecmarkup は構文定義に Grammarkdown 、アルゴリズム手順記述に Ecmarkdown など複数のフォーマットおよび技術を統合している。この仕様の PDF レンダリングは CSS Paged Media 仕様を利用する印刷スタイルシートを用いて生成され PrinceXML で変換される。
以前の版は Word を用いて作成されており、本版の基盤となった Ecmarkup ソーステキストは ECMAScript 2015 の Word ドキュメントを自動変換ツールで Ecmarkup へ変換して得られた。
Copyright & Software License
Ecma International
Rue du Rhone 114
CH-1204 Geneva
Tel: +41 22 849 6000
Fax: +41 22 849 6001
Web: https://ecma-international.org/
Copyright Notice
© 2025 Ecma International
This draft document may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published, and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this section are included on all such copies and derivative works. However, this document itself may not be modified in any way, including by removing the copyright notice or references to Ecma International, except as needed for the purpose of developing any document or deliverable produced by Ecma International.
This disclaimer is valid only prior to final version of this document. After approval all rights on the standard are reserved by Ecma International.
The limited permissions are granted through the standardization phase and will not be revoked by Ecma International or its successors or assigns during this time.
This document and the information contained herein is provided on an "AS IS" basis and ECMA INTERNATIONAL DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
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:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the authors nor Ecma International may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.