?um/p1-90`この仕様内のアルゴリズムは、それぞれに関連する型を持つ値を操作する。取り得る値の型は、この節で定義されるものに限られる。型はさらに
ECMAScript 言語型は、ECMAScript 言語を用いて ECMAScript プログラマが直接操作する値に対応する。ECMAScript 言語型は Undefined、Null、Boolean、String、Symbol、Number、BigInt、および Object である。ECMAScript 言語値とは、ECMAScript 言語型によって特徴づけられる値である。
Undefined 型は、
Null 型は、
Boolean 型は、
String 型は、0 個以上の 16 ビット符号なし整数値(“elements”)の順序付き列すべての集合であり、その最大長は 253 - 1 要素である。String 型は一般に、実行中の ECMAScript プログラムにおけるテキストデータを表現するために用いられ、その場合、String 内の各要素は UTF-16 コードユニット値として扱われる。各要素は、その列の中の位置を占めるものとみなされる。これらの位置には非負整数で添字が付けられる。最初の要素(存在する場合)は添字 0 にあり、次の要素(存在する場合)は添字 1 にあり、以下同様である。String の長さは、その中に含まれる要素(すなわち 16 ビット値)の個数である。空文字列の長さは 0 であり、したがって要素を含まない。
String の内容を解釈しない ECMAScript の操作は、それ以上の意味づけを行わない。String 値を解釈する操作は、各要素を単一の UTF-16 コードユニットとして扱う。しかし ECMAScript は、これらのコードユニットの値や相互関係を制限しないため、String の内容を UTF-16 で符号化された Unicode コードポイント列としてさらに解釈する操作は、不正な形式の部分列を考慮しなければならない。そのような操作は、数値が 0xD800 から 0xDBFF までの包含区間にある各コードユニット(Unicode Standard では leading surrogate、より正式には high-surrogate code unit と定義される)と、数値が 0xDC00 から 0xDFFF までの包含区間にある各コードユニット(trailing surrogate、より正式には low-surrogate code unit と定義される)に対して、次の規則に従って特別な取り扱いを適用する。
関数 String.prototype.normalize(String.prototype.localeCompare(
この設計の根拠は、String の実装を可能な限り単純かつ高性能に保つことにあった。ECMAScript のソーステキストが Normalized Form C であれば、Unicode エスケープシーケンスを含まない限り、文字列リテラルも正規化されることが保証される。
この仕様において、“A, B, ... の string-concatenation” という句(各引数は String 値、コードユニット、またはコードユニット列である)は、各引数のコードユニットを(順に)連結したコードユニット列を持つ String 値を表す。
“inclusiveStart から exclusiveEnd までの str の substring” という句(str は String 値またはコードユニット列であり、inclusiveStart および exclusiveEnd は整数である)は、str のうち添字 inclusiveStart から始まり、添字 exclusiveEnd の直前で終わる連続したコードユニットから成る String 値を表す(inclusiveStart = exclusiveEnd のときは空文字列である)。“to” の接尾辞が省略された場合、str の長さが exclusiveEnd の値として用いられる。
“the ASCII word characters” という句は、Unicode Basic Latin ブロック内のすべての英字と数字、および U+005F(LOW LINE)のみから成る次の String 値を表す。
歴史的な理由により、これはさまざまなアルゴリズムにおいて意味を持つ。
The
searchValue が空文字列であり、かつ fromIndex ≤ string の長さである場合、このアルゴリズムは fromIndex を返す。空文字列は、最後のコードユニットの後を含め、文字列内のあらゆる位置で見つかるものとして実質的に扱われる。
このアルゴリズムは、fromIndex + searchValue の長さ > string の長さ である場合、常に
The
searchValue が空文字列である場合、このアルゴリズムは fromIndex を返す。空文字列は、最後のコードユニットの後を含め、文字列内のあらゆる位置で見つかるものとして実質的に扱われる。
Symbol 型は、Object のプロパティのキーとして使用できるすべての非 String 値の集合である(
各 Symbol は一意であり、不変である。
各 Symbol は不変の [[Description]] 内部スロットを持ち、その値は String または
well-known symbol は、この仕様のアルゴリズムによって明示的に参照される組込み Symbol 値である。これらは通常、その値が仕様アルゴリズムの拡張ポイントとして機能するプロパティのキーとして使用される。特に指定がない限り、well-known symbol 値はすべての
この仕様では、well-known symbol は、
%Symbol.name% を使用する。特に、次の名前が使用されていた: @@asyncIterator, @@hasInstance, @@isConcatSpreadable, @@| 仕様名 | [[Description]] | 値と目的 |
|---|---|---|
| %Symbol.asyncIterator% |
|
オブジェクトの既定の for-await-of 文の意味論によって呼び出される。
|
| %Symbol.hasInstance% |
|
instanceof 演算子の意味論によって呼び出される。
|
| %Symbol.isConcatSpreadable% |
|
Array.prototype.concat |
| %Symbol.iterator% |
|
オブジェクトの既定の |
| %Symbol.match% |
|
正規表現を文字列に対して照合する正規表現メソッド。String.prototype.match |
| %Symbol.matchAll% |
|
正規表現を文字列に対して照合したマッチ結果を yield する String.prototype.matchAll |
| %Symbol.replace% |
|
文字列中の一致した部分文字列を置換する正規表現メソッド。String.prototype.replace |
| %Symbol.search% |
|
文字列内で正規表現に一致する位置の添字を返す正規表現メソッド。String.prototype.search |
| %Symbol.species% |
|
派生オブジェクトの生成に使用される |
| %Symbol.split% |
|
正規表現に一致する位置で文字列を分割する正規表現メソッド。String.prototype.split |
| %Symbol.toPrimitive% |
|
オブジェクトを対応する primitive 値へ変換するメソッド。 |
| %Symbol.toStringTag% |
|
オブジェクトの既定の文字列表現の生成に用いられる String 値プロパティ。組込みメソッド Object.prototype.toString |
| %Symbol.unscopables% |
|
その own および継承プロパティ名が、関連付けられたオブジェクトの with 環境バインディングから除外されるプロパティ名である object 値プロパティ。
|
ECMAScript には 2 つの組込み数値型がある: Number と BigInt。以下の抽象操作は、これらの数値型に対して定義される。“Result” 列には戻り値の型が示され、さらにその操作の一部の呼出しにおいて
数値型は一般に、精度の喪失または切り捨てなしには相互変換できないため、ECMAScript 言語はこれらの型の間で暗黙変換を提供しない。プログラマは、別の型を必要とする関数を呼び出す際には、Number および BigInt 関数を明示的に呼び出して型変換しなければならない。
ECMAScript の初版およびその後の各版は、特定の演算子について、精度を失うか切り捨てる可能性のある暗黙の数値変換を提供してきた。これらのレガシーな暗黙変換は後方互換性のために維持されているが、BigInt には提供されない。これは、プログラマの誤りの機会を最小化し、将来の版において一般化された value types の選択肢を残すためである。
Number 型は、正確に 18,437,736,874,454,810,627 個(すなわち NaN によって生成されることに注意。)一部の実装では、外部コードがさまざまな NaN 値の違いを検出できる場合があるが、そのような挙動は
これ以外に、+Infinity(または単に Infinity)および -Infinity によって生成されることに注意。)
残りの 18,437,736,874,454,810,624 個(すなわち
+0(または単に 0)および -0 によって生成されることに注意。)
18,437,736,874,454,810,622 個(すなわち
そのうち 18,428,729,675,200,069,632 個(すなわち
ここで s は 1 または -1、m は 252(inclusive)から 253(exclusive)までの区間にある整数、e は -1074 から 971 までの包含区間にある整数である。
残りの 9,007,199,254,740,990 個(すなわち
ここで s は 1 または -1、m は 0(exclusive)から 252(exclusive)までの区間にある整数、e は -1074 である。
大きさが 253 以下のすべての正負整数は Number 型で表現可能であることに注意。整数 0 は Number 型において 2 つの表現を持つ:
有限数は、それが非ゼロであり、(上に示した 2 つの形式のいずれかで)それを表すために用いられる整数 m が奇数である場合、odd significand を持つ。それ以外の場合、それは even significand を持つ。
この仕様において、“x の Number value for” という句は、x が正確な実数の数学的量(π のような無理数である場合もある)を表すとき、次の方法で選ばれた Number 値を意味する。Number 型の有限値すべての集合を考え、そこから
+∞ の Number value は
一部の ECMAScript 演算子は、
The
The
The
base が ** exponent の結果は、
The
有限精度の乗算は可換であるが、常に結合的とは限らない。
The
The
C および C++ では、remainder 演算子は整数オペランドのみを受け付ける。ECMAScript では浮動小数点オペランドも受け付ける。
% 演算子によって計算される浮動小数点 remainder 演算の結果は、% を、Java の The
有限精度の加算は可換であるが、常に結合的とは限らない。
The
x - y が x + (-y) と同じ結果を生成することは常に成り立つ。
The
The
The
The
The
The
The
The &, ^, or |), x (a Number), and y (a Number) and returns an
& の場合、^ の場合、| である。The
&, x, y) を返す。The
^, x, y) を返す。The
|, x, y) を返す。The
1.2e+3 のような科学的 E 記法で表される。ECMAScript の実装者にとって、浮動小数点数の二進数から十進数への変換に関して David M. Gay によって書かれた論文とコードは有用である可能性がある。
Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary Conversions. Numerical Analysis, Manuscript 90-10. AT&T Bell Laboratories (Murray Hill, New Jersey). 30 November 1990. Available as
https://ampl.com/_archive/first-website/REFS/rounding.pdf. Associated code available as
http://netlib.sandia.gov/fp/dtoa.c and as
http://netlib.sandia.gov/fp/g_fmt.c and may also be found at the various netlib mirror sites.
BigInt 型は整数値を表す。その値は任意の大きさを取りうるものであり、特定のビット幅には制限されない。一般に、特に注記がない限り、各演算は数学的に正確な答えを返すよう設計されている。二項演算において、BigInt は 2 の補数の二進文字列として振る舞い、負数は左側に無限にビットが立っているものとして扱われる。
The
The
The
The
The
The
The
The
The
The
The
The
The
The
The
The
The &, ^, or |), x (a BigInt), and y (a BigInt) and returns a BigInt. It performs the following steps when called:
& の場合、| の場合、The
&, x, y) を返す。The
^, x, y) を返す。The
|, x, y) を返す。The
Object 型の各インスタンスは、単に “an Object” とも呼ばれ、プロパティの集合を表す。各プロパティは、data property または accessor property のいずれかである。
オブジェクトのプロパティは、
integer index とは、
すべての非負 safe
すべてのオブジェクトは論理的にはプロパティの集合であるが、プロパティへのアクセスおよび操作に関する意味論が異なる複数の形式のオブジェクトが存在する。オブジェクトの複数の形式の定義については
さらに、一部のオブジェクトは callable であり、これらは functions または
属性は、この仕様において、
| 属性名 | その属性が存在するプロパティの種類 | 値域 | 既定値 | 説明 |
|---|---|---|---|---|
| [[Value]] |
|
an ECMAScript language value |
|
そのプロパティに対する get アクセスによって取得される値。 |
| [[Writable]] |
|
a Boolean |
|
|
| [[Get]] |
|
an Object or |
|
値が Object であるなら、それは |
| [[Set]] |
|
an Object or |
|
値が Object であるなら、それは |
| [[Enumerable]] |
|
a Boolean |
|
|
| [[Configurable]] |
|
a Boolean |
|
|
ECMAScript におけるオブジェクトの実際の意味論は、internal methods と呼ばれるアルゴリズムによって規定される。ECMAScript エンジン内の各オブジェクトは、その実行時の挙動を定義する内部メソッドの集合と関連付けられている。これらの内部メソッドは ECMAScript 言語の一部ではない。これらは純粋に説明のためにこの仕様で定義される。しかし、ECMAScript の実装内の各オブジェクトは、それに関連付けられた内部メソッドに従って振る舞わなければならない。これをどのように正確に達成するかは、実装によって決定される。
内部メソッド名は多相的である。これは、共通の内部メソッド名が適用されたときに、異なるオブジェクト値が異なるアルゴリズムを実行しうることを意味する。内部メソッドが呼び出される実際のオブジェクトは、その呼出しの “target” である。実行時に、あるアルゴリズムの実装が、そのオブジェクトがサポートしていない内部メソッドを使用しようとした場合、
内部スロットは、オブジェクト、Symbol、または
すべてのオブジェクトは [[PrivateElements]] という名前の内部スロットを持ち、これは
内部メソッドおよび内部スロットは、この仕様の中では二重角括弧 [[ ]] で囲まれた名前を用いて識別される。
ordinary object とは、次の基準をすべて満たすオブジェクトである。
exotic object とは、
この仕様は、異なる種類の
内部メソッドは、そのパラメータに加えて、常にメソッド呼出しの target であるオブジェクトへアクセスできる。
内部メソッドは暗黙に
| Internal Method | Signature | 説明 |
|---|---|---|
| [[GetPrototypeOf]] | ( ) → Object | Null |
このオブジェクトに継承プロパティを提供するオブジェクトを決定する。 |
| [[SetPrototypeOf]] | (Object | Null) → Boolean |
このオブジェクトを、継承プロパティを提供する別のオブジェクトと関連付ける。 |
| [[IsExtensible]] | ( ) → Boolean | このオブジェクトに追加のプロパティを加えることが許可されているかどうかを判定する。 |
| [[PreventExtensions]] | ( ) → Boolean |
このオブジェクトに新しいプロパティを追加できるかどうかを制御する。操作が成功した場合は |
| [[GetOwnProperty]] |
(propertyKey) → Undefined | |
キーが propertyKey であるこのオブジェクトの own property に対する |
| [[DefineOwnProperty]] | (propertyKey, propertyDescriptor) → Boolean |
キーが propertyKey である own property を作成または変更し、propertyDescriptor によって記述される状態を持たせる。そのプロパティが正常に作成/更新された場合は |
| [[HasProperty]] | (propertyKey) → Boolean | キーが propertyKey である own property または inherited property のいずれかをこのオブジェクトがすでに持っているかどうかを示す Boolean 値を返す。 |
| [[Get]] | (propertyKey, receiver) → any |
キーが propertyKey であるプロパティの値をこのオブジェクトから返す。プロパティ値を取得するために ECMAScript コードを実行しなければならない場合、receiver はそのコードを評価するときの |
| [[Set]] | (propertyKey, value, receiver) → Boolean |
キーが propertyKey であるプロパティの値を value に設定する。プロパティ値を設定するために ECMAScript コードを実行しなければならない場合、receiver はそのコードを評価するときの |
| [[Delete]] | (propertyKey) → Boolean |
キーが propertyKey である own property をこのオブジェクトから削除する。プロパティが削除されず、なお存在している場合は |
| [[OwnPropertyKeys]] |
( ) → |
そのオブジェクトのすべての own |
| Internal Method | Signature | 説明 |
|---|---|---|
| [[Call]] |
(any, a |
このオブジェクトに関連付けられたコードを実行する。関数呼出し式を介して起動される。内部メソッドへの引数は |
| [[Construct]] |
(a |
オブジェクトを生成する。new 演算子または super 呼出しを介して起動される。内部メソッドへの第 1 引数は、super 呼出しの引数を要素とする new 演算子が適用されたオブジェクトである。この内部メソッドを実装するオブジェクトは |
ECMAScript エンジンの Object の Internal Methods は、以下に規定される不変条件の一覧に適合しなければならない。この仕様における ordinary ECMAScript Object およびすべての標準
実装によって提供される
実装は、これらの不変条件を強制することなく essential internal methods の機能を実装する代替インターフェースを提供するなどして、これらの不変条件がいかなる方法によっても回避されることを許してはならない。
任意の内部メソッドによって返される値は、次のいずれかを持つ
内部メソッドは
オブジェクトの prototype chain は有限長であるべきである(すなわち、任意のオブジェクトから始めて、その結果に [[GetPrototypeOf]] 内部メソッドを再帰的に適用すると、最終的に値
第 3 の不変条件の帰結として、あるプロパティが
well-known intrinsic は、この仕様のアルゴリズムによって明示的に参照され、通常
この仕様において、%name% のような参照は、その名前に対応する現在の
仕様型は、ECMAScript 言語構成要素および
Enum は、仕様内部の値であり、ECMAScript コードから直接観測することはできない。Enum は、
List 型は、new 式、関数呼出し、および単純な順序付き値リストが必要な他のアルゴリズムにおける引数リストの評価(
アルゴリズムが順序を明示せずに List の要素を反復するとき、用いられる順序は List 内の要素の順序である。
この仕様内での記法上の便宜のため、新しい List 値を表現するためにリテラル構文を用いることができる。たとえば、« 1, 2 » は、2 つの要素を持ち、それぞれが特定の値に初期化された List 値を定義する。新しい空の List は « » と表現できる。
この仕様において、“A, B, ... の list-concatenation” という句(各引数は空であってよい List である)は、各引数の要素を(順に)連結した要素を持つ新しい List 値を表す。
String の List に適用される “lexicographic code unit order に従って sorted される” という句は、短い方の文字列の長さまで各コードユニットの数値で比較し、すべて等しい場合には短い文字列を長い文字列より前に並べることを意味し、これは抽象操作
Record 型は、この仕様のアルゴリズム内におけるデータ集約を記述するために使用される。Record 型の値は、1 つ以上の名前付きフィールドから成る。各フィールドの値は
この仕様内での記法上の便宜のため、オブジェクトリテラルに似た構文を用いて Record 値を表現できる。たとえば、{ [[Field1]]: 42, [[Field2]]:
仕様本文およびアルゴリズムでは、ドット記法を用いて Record 値の特定フィールドを参照できる。たとえば、R が前段落で示した record であるなら、R.[[Field2]] は “R の [[Field2]] という名前のフィールド” の略記である。
よく使用される Record フィールドの組合せに対する schema には名前を付けることができ、その名前はリテラル Record 値の接頭辞として使用され、記述されている集約の具体的な種類を識別できる。たとえば: PropertyDescriptor { [[Value]]: 42, [[Writable]]:
Set 型は、
Relation 型は、Set 上の制約を説明するために使用される。Relation 型の値は、その値域から取られた値の順序対の Set である。たとえば、
strict partial order は、次を満たす Relation 値 R である。
R の定義域に属するすべての a, b, および c について:
上の 2 つの性質は、それぞれ irreflexivity および transitivity と呼ばれる。
strict total order は、次を満たす Relation 値 R である。
R の定義域に属するすべての a, b, および c について:
上の 3 つの性質は、それぞれ totality、irreflexivity、および transitivity と呼ばれる。
Completion Record 仕様型は、値の実行時伝播および、非局所的な制御移動を行う文(break、continue、return、throw)の挙動のような制御フローを説明するために使用される。
Completion Record は
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[Type]] |
|
発生した completion の種類。 |
| [[Value]] |
|
生成された値。 |
| [[Target]] |
a String or |
指向的な制御移動の target ラベル。 |
次の略記用語は、ときどき Completion Record を参照するために使用される。
この仕様で定義される callable object は、normal completion または throw completion のみを返す。他の種類の Completion Record を返すことは編集上の誤りとみなされる。
The
The
The
The
Reference Record 型は、delete、typeof、代入演算子、super キーワード、およびその他の言語機能のような演算子の挙動を説明するために使用される。たとえば、代入の左側オペランドは Reference Record を生成することが期待される。
Reference Record は解決済みの名前、または(まだ解決されていない可能性のある)プロパティバインディングであり、そのフィールドは
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[Base]] | an ECMAScript language value, an |
バインディングを保持する値または |
| [[ReferencedName]] | an ECMAScript language value or a |
そのバインディングの名前。[[Base]] の値が |
| [[Strict]] | a Boolean | |
| [[ThisValue]] | an ECMAScript language value or |
super キーワードを用いて表現されたプロパティバインディングを表し、Super Reference Record と呼ばれる。その [[Base]] 値が |
以下の抽象操作が、この仕様において Reference Record を操作するために使用される。
The
The
The
The
The
手順
The
手順
The
The
The
Property Descriptor 型は、Object のプロパティ属性の操作および具現化を説明するために使用される。Property Descriptor は 0 個以上のフィールドを持つ
Property Descriptor 値は、特定のフィールドの存在または使用に基づいて、data Property Descriptor と accessor Property Descriptor にさらに分類できる。data Property Descriptor とは、[[Value]] または [[Writable]] のいずれかのフィールドを含むものである。accessor Property Descriptor とは、[[Get]] または [[Set]] のいずれかのフィールドを含むものである。任意の Property Descriptor は [[Enumerable]] および [[Configurable]] という名前のフィールドを持っていてよい。Property Descriptor 値は、data Property Descriptor と accessor Property Descriptor の両方であることはできないが、そのいずれでもないことはありうる(この場合、それは generic Property Descriptor である)。fully populated Property Descriptor とは、accessor Property Descriptor または data Property Descriptor のいずれかであり、かつ
以下の抽象操作は、この仕様において Property Descriptor 値を操作するために使用される。
The
The
The
The
The
The
Abstract Closure 仕様型は、値の集合とともにアルゴリズム手順を参照するために使用される。Abstract Closure はメタ値であり、closure(arg1, arg2) のような関数適用形式を用いて呼び出される。抽象操作と同様に、呼出しはその Abstract Closure によって記述されたアルゴリズム手順を実行する。
Abstract Closure を作成するアルゴリズム手順では、値は “capture” という動詞に続く別名のリストを用いて捕捉される。Abstract Closure が作成されるとき、その時点で各別名に関連付けられている値を捕捉する。Abstract Closure が呼び出されたときに実行されるアルゴリズムを規定する手順では、各捕捉値は、その値を捕捉するために使用された別名によって参照される。
Abstract Closure が
Abstract Closure は、他のアルゴリズムの一部としてインラインで作成される。次の例に示す。
Data Block 仕様型は、バイト単位(8 ビット)の数値の、独立した可変の列を記述するために使用される。byte value とは、0 から 255 までの包含区間にある整数である。Data Block 値は、各バイトの初期値が 0 である固定個数のバイトで作成される。
この仕様内での記法上の便宜のため、配列風の構文を用いて Data Block 値の個々のバイトへアクセスできる。この記法は、Data Block 値を 0 始まりの
複数の
Shared Data Block の意味論は、
Shared Data Block event は、
以下の抽象操作は、この仕様において Data Block 値を操作するために使用される。
The
The
The
PrivateElement 型は、private class field、method、および accessor の仕様において使用される
PrivateElement 型の値は、
| フィールド名 | そのフィールドが存在する [[Kind]] フィールドの値 | 値 | 意味 |
|---|---|---|---|
| [[Key]] | All |
a |
field、method、または accessor の名前。 |
| [[Kind]] | All |
|
要素の種類。 |
| [[Value]] |
|
an ECMAScript language value | field の値。 |
| [[Get]] |
|
a |
private accessor の getter。 |
| [[Set]] |
|
a |
private accessor の setter。 |
ClassFieldDefinition 型は、class field の仕様において使用される
ClassFieldDefinition 型の値は、
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[Name]] |
a |
field の名前。 |
| [[Initializer]] |
an ECMAScript |
存在する場合、その field の initializer。 |
Private Name 仕様型は、private class element(field、method、または accessor)のキーを表す、グローバルに一意な値(たとえ他の点で区別不能であっても、他のあらゆる Private Name と異なる値)を記述するために使用される。各 Private Name は、不変の [[Description]] 内部スロットを持ち、その値は String である。Private Name は、任意の ECMAScript object に対して
ClassStaticBlockDefinition Record は、class static initialization block の実行可能コードをカプセル化するために使用される
ClassStaticBlockDefinition Record は、
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[BodyFunction]] |
an ECMAScript |
class の static 初期化中に呼び出される |