ページ表示設定

6 ECMAScript のデータ型と値

この仕様内のアルゴリズムは値を操作し、それぞれの値には関連付けられた型があります。取り得る値の型は、この箇条で定義されているものだけです。型はさらに、ECMAScript 言語型と仕様型に分類されます。

6.1 ECMAScript 言語型

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

6.1.1 Undefined 型

Undefined 型は、undefined と呼ばれる値を1つだけ持ちます。値が代入されていない変数は、値 undefined を持ちます。

6.1.2 Null 型

Null 型は、null と呼ばれる値を1つだけ持ちます。

6.1.3 Boolean 型

Boolean 型は、true および false と呼ばれる2つの値を持つ論理的実体を表します。

6.1.4 String 型

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

String の内容を解釈しない ECMAScript の操作は、それ以上の意味論を適用しません。String 値を解釈する操作は、各要素を単一の UTF-16 コード単位として扱います。ただし、ECMAScript はこれらのコード単位の値や相互関係を制限しないため、String の内容を UTF-16 で符号化された Unicode コードポイントの列としてさらに解釈する操作では、不正な部分列を考慮しなければなりません。このような操作では、数値が 0xD800 以上 0xDBFF 以下の区間にあるすべてのコード単位(Unicode 標準で先行サロゲート、より正式には上位サロゲートコード単位として定義されます)と、数値が 0xDC00 以上 0xDFFF 以下の区間にあるすべてのコード単位(後続サロゲート、より正式には下位サロゲートコード単位として定義されます)を、次の規則を使用して特別に扱います。

関数 String.prototype.normalize(22.1.3.15 を参照)を使用して、String 値を明示的に正規化できます。String.prototype.localeCompare(22.1.3.12 を参照)は内部で String 値を正規化しますが、それ以外の操作は、操作対象の文字列を暗黙的に正規化しません。特に明記されていない限り、操作結果は言語やロケールに依存しません。

注

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

この仕様では、「A、B、... の文字列連結」(各引数は String 値、コード単位、またはコード単位の列です)という語句は、各引数(順番どおり)のコード単位(順番どおり)を連結したコード単位列を持つ String 値を表します。

「string の inclusiveStart から exclusiveEnd までの部分文字列」(string は String 値またはコード単位の列であり、inclusiveStart と exclusiveEnd は整数です)という語句は、インデックス inclusiveStart から始まり、インデックス exclusiveEnd の直前で終わる string の連続したコード単位からなる String 値を表します(inclusiveStart = exclusiveEnd の場合は空の String です)。「to」に相当する末尾部分が省略されている場合、string の長さが exclusiveEnd の値として使用されます。

「ASCII 単語文字」という語句は、Unicode 基本ラテンブロック内のすべての英字と数字、および U+005F (LOW LINE) のみからなる、次の String 値を表します。
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_".
歴史的な理由により、これはさまざまなアルゴリズムにおいて重要な意味を持ちます。

6.1.4.1 StringIndexOf ( string, searchValue, fromIndex )

抽象操作 StringIndexOf。引数 string (String)、searchValue (String) および fromIndex (非負整数)。戻り値:(非負整数 または not-found)。 呼び出されると、次の手順を実行する。

  1. length を string の長さとする。
  2. searchValue が空の String であり、fromIndex ≤ length である場合、fromIndex を返す。
  3. searchLength を searchValue の長さとする。
  4. fromIndex ≤ i ≤ length - searchLength を満たす各整数 i について、昇順に、次を行う。
    1. candidate を string の i から i + searchLength までの部分文字列とする。
    2. candidate が searchValue である場合、i を返す。
  5. not-found を返す。
注 1

searchValue が空の String であり、fromIndex ≤ string の長さである場合、このアルゴリズムは fromIndex を返します。空の String は、最後のコード単位の後を含め、文字列内のすべての位置で実質的に見つかります。

注 2

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

6.1.4.2 StringLastIndexOf ( string, searchValue, fromIndex )

抽象操作 StringLastIndexOf。引数 string (String)、searchValue (String) および fromIndex (非負整数)。戻り値:(非負整数 または not-found)。 呼び出されると、次の手順を実行する。

  1. length を string の長さとする。
  2. searchLength を searchValue の長さとする。
  3. 表明: fromIndex + searchLength ≤ length。
  4. 0 ≤ i ≤ fromIndex を満たす各整数 i について、降順に、次を行う。
    1. candidate を string の i から i + searchLength までの部分文字列とする。
    2. candidate が searchValue である場合、i を返す。
  5. not-found を返す。
注

searchValue が空の String である場合、このアルゴリズムは fromIndex を返します。空の String は、最後のコード単位の後を含め、文字列内のすべての位置で実質的に見つかります。

6.1.5 Symbol 型

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

各 Symbol は一意かつ不変です。

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

6.1.5.1 ウェルノウンシンボル

ウェルノウンシンボルは、この仕様のアルゴリズムによって明示的に参照される組込み Symbol 値です。これらは通常、仕様アルゴリズムの拡張ポイントとして機能する値を持つプロパティのキーとして使用されます。特に指定されていない限り、ウェルノウンシンボルの値はすべての Realm で共有されます(9.3)。

この仕様内では、ウェルノウンシンボルは標準のイントリンシック表記を使用して参照され、そのイントリンシックは 表 1 に列挙された値のいずれかです。

注
この仕様の以前の版では @@name という形式の表記が使用されていましたが、現行版では %Symbol.name% が使用されます。具体的には、@@asyncIterator、@@hasInstance、@@isConcatSpreadable、@@iterator、@@match、@@matchAll、@@replace、@@search、@@species、@@split、@@toPrimitive、@@toStringTag、および @@unscopables という名前が使用されていました。
表 1: ウェルノウンシンボル
仕様上の名前 [[Description]] 値と目的
%Symbol.asyncDispose% "Symbol.asyncDispose" オブジェクトに対するリソースのクリーンアップを非同期に実行するメソッドです。AsyncDisposableStack オブジェクト、およびそれを含むスコープの評価が完了したときの await using 宣言によって呼び出されます。
%Symbol.asyncIterator% "Symbol.asyncIterator" オブジェクトの既定の非同期イテレーターを返すメソッドです。for-await-of 文の意味論によって呼び出されます。
%Symbol.dispose% "Symbol.dispose" オブジェクトに対する明示的なリソースのクリーンアップを実行するメソッドです。DisposableStack オブジェクト、AsyncDisposableStack オブジェクト、およびそれを含むスコープの評価が完了したときの using 宣言によって呼び出されます。
%Symbol.hasInstance% "Symbol.hasInstance" コンストラクターオブジェクトが、あるオブジェクトをそのコンストラクターのインスタンスの1つとして認識するかどうかを判定するメソッドです。instanceof 演算子の意味論によって呼び出されます。
%Symbol.isConcatSpreadable% "Symbol.isConcatSpreadable" true の場合に、オブジェクトを Array.prototype.concat によってその配列要素へ展開するべきであることを示す Boolean 値のプロパティです。
%Symbol.iterator% "Symbol.iterator" オブジェクトの既定のイテレーターを返すメソッドです。for-of 文の意味論によって呼び出されます。
%Symbol.match% "Symbol.match" 文字列に対して正規表現を照合する正規表現メソッドです。String.prototype.match メソッドによって呼び出されます。
%Symbol.matchAll% "Symbol.matchAll" 文字列に対する正規表現の一致を生成するイテレーターを返す正規表現メソッドです。String.prototype.matchAll メソッドによって呼び出されます。
%Symbol.replace% "Symbol.replace" 文字列内で一致した部分文字列を置換する正規表現メソッドです。String.prototype.replace メソッドによって呼び出されます。
%Symbol.search% "Symbol.search" 文字列内で正規表現に一致するインデックスを返す正規表現メソッドです。String.prototype.search メソッドによって呼び出されます。
%Symbol.species% "Symbol.species" 派生オブジェクトを作成するために使用されるコンストラクター関数である、関数値のプロパティです。
%Symbol.split% "Symbol.split" 正規表現に一致するインデックスで文字列を分割する正規表現メソッドです。String.prototype.split メソッドによって呼び出されます。
%Symbol.toPrimitive% "Symbol.toPrimitive" オブジェクトを対応するプリミティブ値に変換するメソッドです。ToPrimitive 抽象操作によって呼び出されます。
%Symbol.toStringTag% "Symbol.toStringTag" オブジェクトの既定の文字列記述を作成する際に使用される String 値のプロパティです。組込みメソッド Object.prototype.toString によってアクセスされます。
%Symbol.unscopables% "Symbol.unscopables" 自身および継承されたプロパティ名が、関連付けられたオブジェクトの with 環境束縛から除外されるプロパティ名である、オブジェクト値のプロパティです。

6.1.6 数値型

ECMAScript には、Number と BigInt という2つの組込み数値型があります。次の抽象操作は、これらの数値型に対して定義されています。「結果」列には戻り値の型とともに、その操作の一部の呼出しが中断完了を返す可能性があるかどうかが示されています。

表 2: 数値型の操作
操作 ソースの例 ... の Evaluation 意味論による呼出し 結果
Number::unaryMinus -x 単項 - 演算子 Number
BigInt::unaryMinus BigInt
Number::bitwiseNOT ~x ビット単位 NOT 演算子 ( ~ ) Number
BigInt::bitwiseNOT BigInt
Number::exponentiate x ** y べき乗演算子 および Math.pow ( base, exponent ) Number
BigInt::exponentiate BigInt を含む正常完了またはスロー完了
Number::multiply x * y 乗法演算子 Number
BigInt::multiply BigInt
Number::divide x / y 乗法演算子 Number
BigInt::divide BigInt を含む正常完了またはスロー完了
Number::remainder x % y 乗法演算子 Number
BigInt::remainder BigInt を含む正常完了またはスロー完了
Number::add x ++
++ x
x + y
後置インクリメント演算子、 前置インクリメント演算子、 および 加算演算子 ( + ) Number
BigInt::add BigInt
Number::subtract x --
-- x
x - y
後置デクリメント演算子、 前置デクリメント演算子、 および 減算演算子 ( - ) Number
BigInt::subtract BigInt
Number::leftShift x << y 左シフト演算子 ( << ) Number
BigInt::leftShift BigInt
Number::signedRightShift x >> y 符号付き右シフト演算子 ( >> ) Number
BigInt::signedRightShift BigInt
Number::unsignedRightShift x >>> y 符号なし右シフト演算子 ( >>> ) Number
BigInt::unsignedRightShift スロー完了
Number::lessThan x < y
x > y
x <= y
x >= y
関係演算子、 IsLessThan ( x, y, leftFirst ) を介して Boolean または undefined(順序付けられない入力の場合)
BigInt::lessThan Boolean
Number::equal x == y
x != y
x === y
x !== y
等価演算子、 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 二項ビット演算子 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 ( arg ) を介する、多くの式および組込み関数 String
BigInt::toString

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

注

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

6.1.6.1 Number 型

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

注

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

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

残りの 18,437,736,874,454,810,624 個(すなわち 264 - 253 個)の各値は有限 Numberである。その半分は正の数で、半分は負の数であり、各正の有限 Number には、同じ絶対値を持つ対応する負の Number が存在する。

正のゼロと負のゼロの両方が存在することに注意。簡潔にするため、説明上、これらの値はそれぞれ記号 +0𝔽 および -0𝔽 でも表される。(これら 2 つの異なるゼロの Number 値は、プログラム式 +0(または単に 0)および -0 によって生成されることに注意。)

18,437,736,874,454,810,622 個(すなわち 264 - 253 - 2 個)の有限な非ゼロ値には、次の 2 種類がある。

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

s × m × 2e

ここで s は 1 または -1、m は 252(以上)から 253(未満)までの区間にある整数、e は -1074 から 971 までの両端を含む区間にある整数である。

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

s × m × 2e

ここで s は 1 または -1、m は 0(より大きい)から 252(未満)までの区間にある整数、e は -1074 である。

絶対値が 253 以下であるすべての正および負の整数は、Number 型で表現可能であることに注意。整数 0 は Number 型において 2 つの表現、すなわち +0𝔽 と -0𝔽 を持つ。

有限 Number が非ゼロであり、それを表すために(上記の 2 つの形式のいずれかで)使用される整数 m が奇数である場合、その有限 Number は奇数仮数を持つ。それ以外の場合、偶数仮数を持つ。

この仕様において、「x に対するNumber 値」という語句で、x が正確な実数の数学的量(π のような無理数である場合もある)を表す場合、それは次の方法で選択される Number 値を意味する。-0𝔽 を除くすべての有限 Number の集合に、Number 型では表現できない 2 つの追加の値、すなわち 21024(これは +1 × 253 × 2971)および -21024(これは -1 × 253 × 2971)を加えた和集合からなる集合を考える。この集合の要素のうち、値が x に最も近いものを選択する。集合の 2 つの値が等しく近い場合は、偶数仮数を持つ方を選択する。この目的では、2 つの追加の値 21024 および -21024 は偶数仮数を持つものとみなす。最後に、21024 が選択された場合は、それを +∞𝔽 に置き換える。-21024 が選択された場合は、それを -∞𝔽 に置き換える。+0𝔽 が選択された場合は、x < 0 の場合に限り、それを -0𝔽 に置き換える。それ以外の選択された値は変更せずに使用する。その結果が x に対する Number 値である。(この手順は IEEE 754-2019 の roundTiesToEven モードの動作に正確に対応する。)

+∞ に対する Number 値は +∞𝔽 であり、-∞ に対する Number 値は -∞𝔽 である。

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

6.1.6.1.1 Number::unaryMinus ( number )

抽象操作 Number::unaryMinus。引数 number (Number)。戻り値:Number。 呼び出されると、次の手順を実行する。

  1. number が NaN である場合、NaN を返す。
  2. number の否定を返す。すなわち、同じ大きさで反対の符号を持つ Number を計算する。

6.1.6.1.2 Number::bitwiseNOT ( number )

抽象操作 Number::bitwiseNOT。引数 number (Number)。戻り値:整数の Number。 呼び出されると、次の手順を実行する。

  1. oldValue を ! ToInt32(number) とする。
  2. oldValue のビット単位の補数を返す。結果の数学的値は、32ビットの2の補数ビット列として正確に表現できる。

6.1.6.1.3 Number::exponentiate ( base, exponent )

抽象操作 Number::exponentiate。引数 base (Number) および exponent (Number)。戻り値:Number。 base を exponent 乗した結果を表す実装近似値を返します。 呼び出されると、次の手順を実行する。

  1. exponent が NaN である場合、NaN を返す。
  2. exponent が +0𝔽 または -0𝔽 のいずれかである場合、1𝔽 を返す。
  3. base が NaN である場合、NaN を返す。
  4. base が +∞𝔽 である場合、
    1. exponent > +0𝔽 である場合、+∞𝔽 を返す。
    2. +0𝔽 を返す。
  5. base が -∞𝔽 である場合、
    1. exponent > +0𝔽 である場合、
      1. exponent が奇数の整数 Number である場合、-∞𝔽 を返す。
      2. +∞𝔽 を返す。
    2. exponent が奇数の整数 Number である場合、-0𝔽 を返す。
    3. +0𝔽 を返す。
  6. base が +0𝔽 である場合、
    1. exponent > +0𝔽 である場合、+0𝔽 を返す。
    2. +∞𝔽 を返す。
  7. base が -0𝔽 である場合、
    1. exponent > +0𝔽 である場合、
      1. exponent が奇数の整数 Number である場合、-0𝔽 を返す。
      2. +0𝔽 を返す。
    2. exponent が奇数の整数 Number である場合、-∞𝔽 を返す。
    3. +∞𝔽 を返す。
  8. 表明: base は有限 Number であり、+0𝔽 でも -0𝔽 でもない。
  9. exponent が +∞𝔽 である場合、
    1. abs(ℝ(base)) > 1 である場合、+∞𝔽 を返す。
    2. abs(ℝ(base)) = 1 である場合、NaN を返す。
    3. +0𝔽 を返す。
  10. exponent が -∞𝔽 である場合、
    1. abs(ℝ(base)) > 1 である場合、+0𝔽 を返す。
    2. abs(ℝ(base)) = 1 である場合、NaN を返す。
    3. +∞𝔽 を返す。
  11. 表明: exponent は有限 Number であり、+0𝔽 でも -0𝔽 でもない。
  12. base < -0𝔽 であり、かつ exponent が整数 Number でない場合、NaN を返す。
  13. ℝ(base) を ℝ(exponent) 乗した結果を表す、実装によって近似された Number 値を返す。
注

base が 1𝔽 または -1𝔽 で、exponent が +∞𝔽 または -∞𝔽 である場合、あるいは base が 1𝔽 で exponent が NaN である場合の base ** exponent の結果は、IEEE 754-2019 と異なります。ECMAScript の初版では、この操作の結果として NaN が規定されていましたが、IEEE 754 の後の改訂では 1𝔽 が規定されました。互換性のため、歴史的な ECMAScript の動作が維持されています。

6.1.6.1.4 Number::multiply ( x, y )

抽象操作 Number::multiply。引数 x (Number) および y (Number)。戻り値:Number。 IEEE 754-2019 の2進倍精度算術の規則に従って乗算を実行し、x と y の積を生成します。 呼び出されると、次の手順を実行する。

  1. x が NaN または y が NaN である場合、NaN を返す。
  2. x が +∞𝔽 または -∞𝔽 のいずれかである場合、
    1. y が +0𝔽 または -0𝔽 のいずれかである場合、NaN を返す。
    2. y > +0𝔽 である場合、x を返す。
    3. -x を返す。
  3. y が +∞𝔽 または -∞𝔽 のいずれかである場合、
    1. x が +0𝔽 または -0𝔽 のいずれかである場合、NaN を返す。
    2. x > +0𝔽 である場合、y を返す。
    3. -y を返す。
  4. x が -0𝔽 である場合、
    1. y が -0𝔽 または y < -0𝔽 である場合、+0𝔽 を返す。
    2. -0𝔽 を返す。
  5. y が -0𝔽 である場合、
    1. x < -0𝔽 である場合、+0𝔽 を返す。
    2. -0𝔽 を返す。
  6. 𝔽(ℝ(x) × ℝ(y)) を返す。
注

有限精度の乗算は可換ですが、常に結合的であるとは限りません。

6.1.6.1.5 Number::divide ( x, y )

抽象操作 Number::divide。引数 x (Number) および y (Number)。戻り値:Number。 IEEE 754-2019 の2進倍精度算術の規則に従って除算を実行し、x を被除数、y を除数とした x と y の商を生成します。 呼び出されると、次の手順を実行する。

  1. x が NaN または y が NaN である場合、NaN を返す。
  2. x が +∞𝔽 または -∞𝔽 のいずれかである場合、
    1. y が +∞𝔽 または -∞𝔽 のいずれかである場合、NaN を返す。
    2. y が +0𝔽 または y > +0𝔽 である場合、x を返す。
    3. -x を返す。
  3. y が +∞𝔽 である場合、
    1. x が +0𝔽 または x > +0𝔽 である場合、+0𝔽 を返す。
    2. -0𝔽 を返す。
  4. y が -∞𝔽 である場合、
    1. x が +0𝔽 または x > +0𝔽 である場合、-0𝔽 を返す。
    2. +0𝔽 を返す。
  5. x が +0𝔽 または -0𝔽 のいずれかである場合、
    1. y が +0𝔽 または -0𝔽 のいずれかである場合、NaN を返す。
    2. y > +0𝔽 である場合、x を返す。
    3. -x を返す。
  6. y が +0𝔽 である場合、
    1. x > +0𝔽 である場合、+∞𝔽 を返す。
    2. -∞𝔽 を返す。
  7. y が -0𝔽 である場合、
    1. x > +0𝔽 である場合、-∞𝔽 を返す。
    2. +∞𝔽 を返す。
  8. 𝔽(ℝ(x) / ℝ(y)) を返す。

6.1.6.1.6 Number::remainder ( numerator, denominator )

抽象操作 Number::remainder。引数 numerator (Number) および denominator (Number)。戻り値:Number。 numerator を被除数、denominator を除数とする、オペランドの暗黙の除算から余りを生成します。 呼び出されると、次の手順を実行する。

  1. numerator が NaN または denominator が NaN である場合、NaN を返す。
  2. numerator が +∞𝔽 または -∞𝔽 のいずれかである場合、NaN を返す。
  3. denominator が +∞𝔽 または -∞𝔽 のいずれかである場合、numerator を返す。
  4. denominator が +0𝔽 または -0𝔽 のいずれかである場合、NaN を返す。
  5. numerator が +0𝔽 または -0𝔽 のいずれかである場合、numerator を返す。
  6. 表明: numerator は有限 Number であり、+0𝔽 でも -0𝔽 でもない。
  7. 表明: denominator は有限 Number であり、+0𝔽 でも -0𝔽 でもない。
  8. quotient を ℝ(numerator) / ℝ(denominator) とする。
  9. truncatedQuotient を truncate(quotient) とする。
  10. remainder を ℝ(numerator) - (ℝ(denominator) × truncatedQuotient) とする。
  11. remainder = 0 かつ numerator < -0𝔽 である場合、-0𝔽 を返す。
  12. 𝔽(remainder) を返す。
注 1

C および C++ では、剰余演算子は整数オペランドだけを受け入れます。ECMAScript では、浮動小数点オペランドも受け入れます。

注 2
% 演算子によって計算される浮動小数点剰余演算の結果は、IEEE 754-2019 で定義される「remainder」演算と同じではありません。IEEE 754-2019 の「remainder」演算は、切り捨て除算ではなく丸め除算によって余りを計算するため、その動作は通常の整数剰余演算子の動作とは類似していません。その代わり、ECMAScript 言語では、浮動小数点演算に対する % が Java の整数剰余演算子と類似した方法で動作するよう定義されています。これは C ライブラリ関数 fmod と比較できます。

6.1.6.1.7 Number::add ( x, y )

抽象操作 Number::add。引数 x (Number) および y (Number)。戻り値:Number。 IEEE 754-2019 の2進倍精度算術の規則に従って加算を実行し、引数の和を生成します。 呼び出されると、次の手順を実行する。

  1. x が NaN または y が NaN である場合、NaN を返す。
  2. x が +∞𝔽 であり、y が -∞𝔽 である場合、NaN を返す。
  3. x が -∞𝔽 であり、y が +∞𝔽 である場合、NaN を返す。
  4. x が +∞𝔽 または -∞𝔽 のいずれかである場合、x を返す。
  5. y が +∞𝔽 または -∞𝔽 のいずれかである場合、y を返す。
  6. 表明: x および y は有限 Number である。
  7. x が -0𝔽 であり、y が -0𝔽 である場合、-0𝔽 を返す。
  8. 𝔽(ℝ(x) + ℝ(y)) を返す。
注

有限精度の加算は可換ですが、常に結合的であるとは限りません。

6.1.6.1.8 Number::subtract ( x, y )

抽象操作 Number::subtract。引数 x (Number) および y (Number)。戻り値:Number。 減算を実行し、そのオペランドの差を生成します。x は被減数、y は減数です。 呼び出されると、次の手順を実行する。

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

x - y は常に x + (-y) と同じ結果を生成します。

6.1.6.1.9 Number::leftShift ( x, y )

抽象操作 Number::leftShift。引数 x (Number) および y (Number)。戻り値:整数の Number。 呼び出されると、次の手順を実行する。

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

6.1.6.1.10 Number::signedRightShift ( x, y )

抽象操作 Number::signedRightShift。引数 x (Number) および y (Number)。戻り値:整数の Number。 呼び出されると、次の手順を実行する。

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

6.1.6.1.11 Number::unsignedRightShift ( x, y )

抽象操作 Number::unsignedRightShift。引数 x (Number) および y (Number)。戻り値:整数の Number。 呼び出されると、次の手順を実行する。

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

6.1.6.1.12 Number::lessThan ( x, y )

抽象操作 Number::lessThan。引数 x (Number) および y (Number)。戻り値:(Boolean または undefined)。 呼び出されると、次の手順を実行する。

  1. x が NaN である場合、undefined を返す。
  2. y が NaN である場合、undefined を返す。
  3. x が y である場合、false を返す。
  4. x が +0𝔽 であり、y が -0𝔽 である場合、false を返す。
  5. x が -0𝔽 であり、y が +0𝔽 である場合、false を返す。
  6. x が +∞𝔽 である場合、false を返す。
  7. y が +∞𝔽 である場合、true を返す。
  8. y が -∞𝔽 である場合、false を返す。
  9. x が -∞𝔽 である場合、true を返す。
  10. 表明: x および y は有限 Number である。
  11. ℝ(x) < ℝ(y) である場合、true を返す。
  12. false を返す。

6.1.6.1.13 Number::equal ( x, y )

抽象操作 Number::equal。引数 x (Number) および y (Number)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. x が NaN である場合、false を返す。
  2. y が NaN である場合、false を返す。
  3. x が y である場合、true を返す。
  4. x が +0𝔽 かつ y が -0𝔽 である場合、true を返す。
  5. x が -0𝔽 かつ y が +0𝔽 である場合、true を返す。
  6. false を返す。

6.1.6.1.14 Number::sameValue ( x, y )

抽象操作 Number::sameValue。引数 x (Number) および y (Number)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. x が NaN かつ y が NaN である場合、true を返す。
  2. x が +0𝔽 かつ y が -0𝔽 である場合、false を返す。
  3. x が -0𝔽 かつ y が +0𝔽 である場合、false を返す。
  4. x が y である場合、true を返す。
  5. false を返す。

6.1.6.1.15 Number::sameValueZero ( x, y )

抽象操作 Number::sameValueZero。引数 x (Number) および y (Number)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. x が NaN かつ y が NaN である場合、true を返す。
  2. x が +0𝔽 かつ y が -0𝔽 である場合、true を返す。
  3. x が -0𝔽 かつ y が +0𝔽 である場合、true を返す。
  4. x が y である場合、true を返す。
  5. false を返す。

6.1.6.1.16 NumberBitwiseOp ( op, x, y )

抽象操作 NumberBitwiseOp。引数 op ((&、^ または |))、x (Number) および y (Number)。戻り値:整数の Number。 呼び出されると、次の手順を実行する。

  1. leftNumber を ! ToInt32(x) とする。
  2. rightNumber を ! ToInt32(y) とする。
  3. leftBits を ℝ(leftNumber) を表す32ビットの2の補数ビット列とする。
  4. rightBits を ℝ(rightNumber) を表す32ビットの2の補数ビット列とする。
  5. op が & である場合、
    1. result を leftBits と rightBits にビット単位 AND 演算を適用した結果とする。
  6. そうでなく、op が ^ である場合、
    1. result を leftBits と rightBits にビット単位排他的 OR(XOR)演算を適用した結果とする。
  7. そうでない場合、
    1. 表明: op は | である。
    2. result を leftBits と rightBits にビット単位包含 OR 演算を適用した結果とする。
  8. 32ビットの2の補数ビット列 result によって表される整数に対応する Number 値を返す。

6.1.6.1.17 Number::bitwiseAND ( x, y )

抽象操作 Number::bitwiseAND。引数 x (Number) および y (Number)。戻り値:整数の Number。 呼び出されると、次の手順を実行する。

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

6.1.6.1.18 Number::bitwiseXOR ( x, y )

抽象操作 Number::bitwiseXOR。引数 x (Number) および y (Number)。戻り値:整数の Number。 呼び出されると、次の手順を実行する。

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

6.1.6.1.19 Number::bitwiseOR ( x, y )

抽象操作 Number::bitwiseOR。引数 x (Number) および y (Number)。戻り値:整数の Number。 呼び出されると、次の手順を実行する。

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

6.1.6.1.20 Number::toString ( x, radix )

抽象操作 Number::toString。引数 x (Number) および radix (an integer in the inclusive interval from 2 to 36)。戻り値:String。 基数 radix の位取り記数法を使用して x を String として表します。基数 r を使用した数値の表現に用いる数字は、"0123456789abcdefghijklmnopqrstuvwxyz" の先頭 r 個のコード単位から順番に取得されます。大きさが 1𝔽 以上の数値の表現には、先頭のゼロは含まれません。 呼び出されると、次の手順を実行する。

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

以下の所見は実装の指針として役立つ場合がありますが、この標準の規範的要件の一部ではありません。

  • x が -0𝔽 以外の任意の Number 値である場合、ToNumber(ToString(x)) は x です。
  • s の最下位桁は、手順 5 に列挙されている要件によって、常に一意に決定されるとは限りません。
注 2

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

  1. k ≥ 1、radixk - 1 ≤ s < radixk、𝔽(s × radixn - k) が x であり、かつ k が可能な限り小さくなるような整数 n、k、および s とする。s に複数の可能性がある場合は、s × radixn - k が ℝ(x) に最も近くなる s を選択する。そのような s の値が2つある場合は、偶数である方を選択する。k は基数 radix を使用した s の表現の桁数であり、s は radix で割り切れないことに注意する。
注 3

ECMAScript の実装者には、浮動小数点数の2進数から10進数への変換について David M. Gay が執筆した論文とコードが役立つ場合があります。

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

6.1.6.2 BigInt 型

BigInt 型は整数値を表します。値は任意の大きさを持つことができ、特定のビット幅に制限されません。一般に、特に明記されていない限り、操作は数学的に正確な結果を返すように設計されています。二項演算では、BigInt は2の補数の2進文字列として動作し、負の数は左側に無限にビットが設定されているものとして扱われます。

6.1.6.2.1 BigInt::unaryMinus ( bigint )

抽象操作 BigInt::unaryMinus。引数 bigint (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。

  1. bigint = 0ℤ である場合、0ℤ を返す。
  2. -bigint を返す。

6.1.6.2.2 BigInt::bitwiseNOT ( bigint )

抽象操作 BigInt::bitwiseNOT。引数 bigint (BigInt)。戻り値:BigInt。 bigint の1の補数を返します。 呼び出されると、次の手順を実行する。

  1. -bigint - 1ℤ を返す。

6.1.6.2.3 BigInt::exponentiate ( base, exponent )

抽象操作 BigInt::exponentiate。引数 base (BigInt) および exponent (BigInt)。戻り値:(正常完了 (値:BigInt) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. exponent < 0ℤ である場合、RangeError 例外をスローする。
  2. base = 0ℤ かつ exponent = 0ℤ である場合、1ℤ を返す。
  3. base の exponent 乗を返す。

6.1.6.2.4 BigInt::multiply ( x, y )

抽象操作 BigInt::multiply。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。

  1. x × y を返す。
注
結果のビット幅が入力よりはるかに大きくなった場合でも、数学的に正確な結果が与えられます。

6.1.6.2.5 BigInt::divide ( x, y )

抽象操作 BigInt::divide。引数 x (BigInt) および y (BigInt)。戻り値:(正常完了 (値:BigInt) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. y = 0ℤ である場合、RangeError 例外をスローする。
  2. quotient を ℝ(x) / ℝ(y) とする。
  3. ℤ(truncate(quotient)) を返す。

6.1.6.2.6 BigInt::remainder ( numerator, denominator )

抽象操作 BigInt::remainder。引数 numerator (BigInt) および denominator (BigInt)。戻り値:(正常完了 (値:BigInt) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. denominator = 0ℤ である場合、RangeError 例外をスローする。
  2. numerator = 0ℤ である場合、0ℤ を返す。
  3. quotient を ℝ(numerator) / ℝ(denominator) とする。
  4. truncatedQuotient を ℤ(truncate(quotient)) とする。
  5. numerator - (denominator × truncatedQuotient) を返す。
注
結果の符号は被除数の符号です。

6.1.6.2.7 BigInt::add ( x, y )

抽象操作 BigInt::add。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。

  1. x + y を返す。

6.1.6.2.8 BigInt::subtract ( x, y )

抽象操作 BigInt::subtract。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。

  1. x - y を返す。

6.1.6.2.9 BigInt::leftShift ( x, y )

抽象操作 BigInt::leftShift。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。

  1. y < 0ℤ である場合、
    1. ℤ(floor(ℝ(x) / 2-ℝ(y))) を返す。
  2. x × 2ℤy を返す。
注
ここでの意味論は、BigInt を無限長の2進2の補数の数字列として扱うビット単位シフトと同等であるべきです。

6.1.6.2.10 BigInt::signedRightShift ( x, y )

抽象操作 BigInt::signedRightShift。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。

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

6.1.6.2.11 BigInt::unsignedRightShift ( x, y )

抽象操作 BigInt::unsignedRightShift。引数 x (BigInt) および y (BigInt)。戻り値:throw 完了。 呼び出されると、次の手順を実行する。

  1. TypeError 例外をスローする。

6.1.6.2.12 BigInt::lessThan ( x, y )

抽象操作 BigInt::lessThan。引数 x (BigInt) および y (BigInt)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. ℝ(x) < ℝ(y) である場合、true を返す。
  2. false を返す。

6.1.6.2.13 BigInt::equal ( x, y )

抽象操作 BigInt::equal。引数 x (BigInt) および y (BigInt)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. ℝ(x) = ℝ(y) である場合、true を返す。
  2. false を返す。

6.1.6.2.14 BinaryAnd ( x, y )

抽象操作 BinaryAnd。引数 x ((0 または 1)) および y ((0 または 1))。戻り値:(0 または 1)。 呼び出されると、次の手順を実行する。

  1. x = 1 かつ y = 1 である場合、1 を返す。
  2. 0 を返す。

6.1.6.2.15 BinaryOr ( x, y )

抽象操作 BinaryOr。引数 x ((0 または 1)) および y ((0 または 1))。戻り値:(0 または 1)。 呼び出されると、次の手順を実行する。

  1. x = 1 または y = 1 である場合、1 を返す。
  2. 0 を返す。

6.1.6.2.16 BinaryXor ( x, y )

抽象操作 BinaryXor。引数 x ((0 または 1)) および y ((0 または 1))。戻り値:(0 または 1)。 呼び出されると、次の手順を実行する。

  1. x = 1 かつ y = 0 である場合、1 を返す。
  2. x = 0 かつ y = 1 である場合、1 を返す。
  3. 0 を返す。

6.1.6.2.17 BigIntBitwiseOp ( op, x, y )

抽象操作 BigIntBitwiseOp。引数 op ((&、^ または |))、x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。

  1. x を ℝ(x) に設定する。
  2. y を ℝ(y) に設定する。
  3. result を 0 とする。
  4. shift を 0 とする。
  5. (x = 0 または x = -1) かつ (y = 0 または y = -1) になるまで、次を繰り返す。
    1. xDigit を x modulo 2 とする。
    2. yDigit を y modulo 2 とする。
    3. op が & である場合、
      1. result を result + 2shift × BinaryAnd(xDigit, yDigit) に設定する。
    4. そうでなく、op が | である場合、
      1. result を result + 2shift × BinaryOr(xDigit, yDigit) に設定する。
    5. そうでない場合、
      1. 表明: op は ^ である。
      2. result を result + 2shift × BinaryXor(xDigit, yDigit) に設定する。
    6. shift を shift + 1 に設定する。
    7. x を (x - xDigit) / 2 に設定する。
    8. y を (y - yDigit) / 2 に設定する。
  6. op が & である場合、
    1. signBit を BinaryAnd(x modulo 2, y modulo 2) とする。
  7. そうでなく、op が | である場合、
    1. signBit を BinaryOr(x modulo 2, y modulo 2) とする。
  8. そうでない場合、
    1. 表明: op は ^ である。
    2. signBit を BinaryXor(x modulo 2, y modulo 2) とする。
  9. signBit ≠ 0 である場合、
    1. result を result - 2shift に設定する。
    2. 注記: これにより符号が拡張される。
  10. result に対応する BigInt 値を返す。

6.1.6.2.18 BigInt::bitwiseAND ( x, y )

抽象操作 BigInt::bitwiseAND。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。

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

6.1.6.2.19 BigInt::bitwiseXOR ( x, y )

抽象操作 BigInt::bitwiseXOR。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。

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

6.1.6.2.20 BigInt::bitwiseOR ( x, y )

抽象操作 BigInt::bitwiseOR。引数 x (BigInt) および y (BigInt)。戻り値:BigInt。 呼び出されると、次の手順を実行する。

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

6.1.6.2.21 BigInt::toString ( x, radix )

抽象操作 BigInt::toString。引数 x (BigInt) および radix (an integer in the inclusive interval from 2 to 36)。戻り値:String。 基数 radix の位取り記数法を使用して x を String として表します。基数 r を使用した BigInt の表現に用いる数字は、"0123456789abcdefghijklmnopqrstuvwxyz" の先頭 r 個のコード単位から順番に取得されます。0ℤ 以外の BigInt の表現には、先頭のゼロは含まれません。 呼び出されると、次の手順を実行する。

  1. x < 0ℤ である場合、"-" と BigInt::toString(-x, radix) の文字列連結を返す。
  2. 基数 radix を使用した x の表現からなる String 値を返す。

6.1.7 Object 型

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

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

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

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

注

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

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

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

さらに、一部のオブジェクトは呼出し可能です。これらは関数または関数オブジェクトと呼ばれ、以下でさらに説明します。ECMAScript のすべての関数は Object 型のメンバーです。

6.1.7.1 プロパティ属性

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

表 3: Object プロパティの属性
属性名 その属性が存在するプロパティの種類 値の領域 既定値 説明
[[Value]] データプロパティ ECMAScript 言語値 undefined プロパティへの get アクセスによって取得される値です。
[[Writable]] データプロパティ Boolean false false の場合、ECMAScript コードが [[Set]] を使用してプロパティの [[Value]] 属性を変更しようとしても成功しません。
[[Getter]] アクセサープロパティ 関数オブジェクトまたは undefined undefined 値が undefined でない場合、プロパティへの get アクセスが実行されるたびに、プロパティ値を取得するため、その [[Call]] 内部メソッド(表 5)が空の引数リストで呼び出されます。
[[Setter]] アクセサープロパティ 関数オブジェクトまたは undefined undefined 値が undefined でない場合、プロパティへの set アクセスが実行されるたびに、代入された値を唯一の引数として含む引数リストで、その [[Call]] 内部メソッド(表 5)が呼び出されます。プロパティの [[Setter]] 内部メソッドの効果は、その後のプロパティの [[Getter]] 内部メソッドの呼出しによって返される値に影響を与える場合がありますが、その必要はありません。
[[Enumerable]] データプロパティまたはアクセサープロパティ Boolean false true の場合、そのプロパティは for-in 列挙(14.7.5 を参照)によって列挙されます。それ以外の場合、そのプロパティは列挙不可であるといいます。
[[Configurable]] データプロパティまたはアクセサープロパティ Boolean false false の場合、プロパティを削除する試み、データプロパティからアクセサープロパティまたはアクセサープロパティからデータプロパティに変更する試み、あるいはその属性を変更する試み(既存の [[Value]] を置換する場合、または [[Writable]] を false に設定する場合を除く)は失敗します。

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

ECMAScript におけるオブジェクトの実際の意味論は、内部メソッドと呼ばれるアルゴリズムによって規定されます。ECMAScript エンジン内の各オブジェクトには、その実行時の動作を定義する内部メソッドの集合が関連付けられています。これらの内部メソッドは ECMAScript 言語の一部ではありません。これらは純粋に説明のため、この仕様によって定義されています。ただし、ECMAScript の実装内の各オブジェクトは、それに関連付けられた内部メソッドによって規定されるとおりに動作しなければなりません。これを実現する正確な方法は実装によって決定されます。

内部メソッド名は多態的です。これは、共通の内部メソッド名を異なるオブジェクト値に対して呼び出したとき、それぞれが異なるアルゴリズムを実行する場合があることを意味します。内部メソッドが呼び出される実際のオブジェクトが、その呼出しの「ターゲット」です。実行時に、アルゴリズムの実装が、オブジェクトがサポートしていない内部メソッドを使用しようとすると、TypeError 例外がスローされます。

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

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

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

表 4 は、ECMAScript コードによって作成または操作されるすべてのオブジェクトに適用される、この仕様で使用される必須内部メソッドをまとめたものです。すべてのオブジェクトは、すべての必須内部メソッドに対するアルゴリズムを持たなければなりません。ただし、すべてのオブジェクトがそれらのメソッドに同じアルゴリズムを使用するとは限りません。

通常オブジェクトは、次の基準をすべて満たすオブジェクトです。

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

特殊オブジェクトは、通常オブジェクトではないオブジェクトです。

この仕様では、特殊オブジェクトの種類を、それらのオブジェクトの内部メソッドによって区別します。特定の種類の特殊オブジェクト(Array 特殊オブジェクトや束縛関数特殊オブジェクトなど)と動作上は同等であっても、その種類について規定された内部メソッドと同じ集合を持たないオブジェクトは、その種類の特殊オブジェクトとして認識されません。

表 4 およびその他の同様の表は、各内部メソッドの呼出しパターンを説明します。呼出しパターンには、常に括弧で囲まれた説明的なパラメーター名のリストが含まれます。

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

内部メソッドは、呼出しパターンに示された戻り値型の値をラップする正常完了、またはスロー完了のいずれかである Completion Record を暗黙的に返します。

表 4: 必須内部メソッド
内部メソッド 説明 定義
[[GetPrototypeOf]] ( )

内部メソッド [[GetPrototypeOf]]。引数なし。戻り値:(正常完了 (値:(Object または null)) または throw 完了)。

このオブジェクトに継承プロパティを提供するオブジェクトを決定します。null 値は、そのようなオブジェクトが存在しないことを示します。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
[[SetPrototypeOf]] ( proto )

内部メソッド [[SetPrototypeOf]]。引数 proto ((Object または null))。戻り値:(正常完了 (値:Boolean) または throw 完了)。

このオブジェクトを、継承プロパティを提供する別のオブジェクトに関連付けます。null を渡すと、継承プロパティを提供するオブジェクトが存在しないことを示します。操作が正常に完了したことを示す true、または操作が成功しなかったことを示す false を返します。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
[[IsExtensible]] ( )

内部メソッド [[IsExtensible]]。引数なし。戻り値:(正常完了 (値:Boolean) または throw 完了)。

このオブジェクトに追加のプロパティを追加することが許可されているかどうかを判定します。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
[[PreventExtensions]] ( )

内部メソッド [[PreventExtensions]]。引数なし。戻り値:(正常完了 (値:Boolean) または throw 完了)。

このオブジェクトに新しいプロパティを追加できるかどうかを制御します。操作が成功した場合は true、操作が失敗した場合は false を返します。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
[[GetOwnProperty]] ( propertyKey )

内部メソッド [[GetOwnProperty]]。引数 propertyKey (プロパティキー)。戻り値:(正常完了 (値:(プロパティ記述子 または undefined)) または throw 完了)。

キーが propertyKey であるこのオブジェクト自身のプロパティについて Property Descriptor を返し、そのようなプロパティが存在しない場合は undefined を返します。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
[[DefineOwnProperty]] ( propertyKey, propertyDesc )

内部メソッド [[DefineOwnProperty]]。引数 propertyKey (プロパティキー) および propertyDesc (プロパティ記述子)。戻り値:(正常完了 (値:Boolean) または throw 完了)。

キーが propertyKey である自身のプロパティを、propertyDesc に記述された状態を持つよう作成または変更します。操作が成功した場合は true、プロパティを作成または更新できなかった場合は false を返します。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
[[HasProperty]] ( propertyKey )

内部メソッド [[HasProperty]]。引数 propertyKey (プロパティキー)。戻り値:(正常完了 (値:Boolean) または throw 完了)。

このオブジェクトが、キーが propertyKey である自身のプロパティまたは継承プロパティのいずれかを既に持っているかどうかを示す Boolean を返します。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
[[Get]] ( propertyKey, receiver )

内部メソッド [[Get]]。引数 propertyKey (プロパティキー) および receiver (ECMAScript 言語値)。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。

このオブジェクトから、キーが propertyKey であるプロパティの値を返します。プロパティ値を取得するために ECMAScript コードを実行する必要がある場合、コードの評価時に receiver が this 値として使用されます。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
[[Set]] ( propertyKey, value, receiver )

内部メソッド [[Set]]。引数 propertyKey (プロパティキー)、value (ECMAScript 言語値) および receiver (ECMAScript 言語値)。戻り値:(正常完了 (値:Boolean) または throw 完了)。

キーが propertyKey であるプロパティの値を value に設定します。プロパティ値を設定するために ECMAScript コードを実行する必要がある場合、コードの評価時に receiver が this 値として使用されます。プロパティ値が設定された場合は true、設定できなかった場合は false を返します。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
[[Delete]] ( propertyKey )

内部メソッド [[Delete]]。引数 propertyKey (プロパティキー)。戻り値:(正常完了 (値:Boolean) または throw 完了)。

このオブジェクトから、キーが propertyKey である自身のプロパティを削除します。プロパティが削除されず、まだ存在する場合は false を返します。プロパティが削除されたか、存在しない場合は true を返します。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
[[OwnPropertyKeys]] ( )

内部メソッド [[OwnPropertyKeys]]。引数なし。戻り値:(正常完了 (値:リスト (要素:プロパティキー)) または throw 完了)。

要素がオブジェクト自身のすべてのプロパティキーである List を返します。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。

表 5 は、関数として呼び出すことができるオブジェクトによってサポートされる追加の必須内部メソッドをまとめたものです。関数オブジェクトは、[[Call]] 内部メソッドをサポートするオブジェクトです。コンストラクターは、[[Construct]] 内部メソッドをサポートするオブジェクトです。[[Construct]] をサポートするすべてのオブジェクトは [[Call]] をサポートしなければなりません。すなわち、すべてのコンストラクターは関数オブジェクトでなければなりません。したがって、コンストラクターをコンストラクター関数またはコンストラクター関数オブジェクトと呼ぶこともできます。

表 5: 関数オブジェクトの追加の必須内部メソッド
内部メソッド 説明 定義
[[Call]] ( thisArg, argList )

内部メソッド [[Call]]。引数 thisArg (ECMAScript 言語値) および argList (リスト (要素:ECMAScript 言語値))。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。

このオブジェクトに関連付けられたコードを実行します。関数呼出し式を介して呼び出されます。内部メソッドへの引数は、this 値と、関数呼出し式によって関数に渡された引数を要素とする List です。この内部メソッドを実装するオブジェクトは呼出し可能です。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
[[Construct]] ( argList, newTarget )

内部メソッド [[Construct]]。引数 argList (リスト (要素:ECMAScript 言語値)) および newTarget (コンストラクター)。戻り値:(正常完了 (値:Object) または throw 完了)。

オブジェクトを作成します。new 演算子または super 呼出しを介して呼び出されます。内部メソッドへの最初の引数は、コンストラクター呼出しまたは super 呼出しの引数を要素とする List です。2番目の引数は、new 演算子が最初に適用されたオブジェクトです。この内部メソッドを実装するオブジェクトをコンストラクターと呼びます。関数オブジェクトは必ずしもコンストラクターではなく、そのような非コンストラクター関数オブジェクトは [[Construct]] 内部メソッドを持ちません。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。

通常オブジェクトおよび標準特殊オブジェクトの必須内部メソッドの意味論は、箇条 10 で規定されています。特殊オブジェクトの内部メソッドの規定された使用を実装がサポートしていない場合、その使用を試みたときに TypeError 例外をスローしなければなりません。

6.1.7.3 必須内部メソッドの不変条件

ECMAScript エンジンの Object の内部メソッドは、以下に規定する不変条件の一覧に適合しなければなりません。通常の ECMAScript Object と、この仕様のすべての標準特殊オブジェクトは、これらの不変条件を維持します。ECMAScript Proxy オブジェクトは、[[ProxyHandler]] オブジェクト上で呼び出されるトラップの結果に対する実行時検査によって、これらの不変条件を維持します。

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

実装は、必須内部メソッドの機能を、その不変条件を強制せずに実装する代替インターフェースを提供するなど、いかなる方法によってもこれらの不変条件を回避できるようにしてはなりません。

定義:

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

戻り値:

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

  • [[Type]] = normal、[[Target]] = empty、および [[Value]] = その内部メソッドについて以下に示される「正常戻り値型」の値、または
  • [[Type]] = throw、[[Target]] = empty、および [[Value]] = 任意の ECMAScript 言語値。
注 1

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

[[GetPrototypeOf]] ( )

  • 正常戻り値型は Object または Null のいずれかです。
  • ターゲットが拡張不可であり、[[GetPrototypeOf]] が値 proto を返した場合、それ以降の [[GetPrototypeOf]] の呼出しはすべて、proto と SameValue である値を返すべきです。
注 2

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

[[SetPrototypeOf]] ( proto )

  • 正常戻り値型は Boolean です。
  • ターゲットが拡張不可である場合、proto がターゲットで観測された [[GetPrototypeOf]] 値と SameValue でない限り、[[SetPrototypeOf]] は false を返さなければなりません。

[[IsExtensible]] ( )

  • 正常戻り値型は Boolean です。
  • [[IsExtensible]] が false を返した場合、そのターゲットに対する以後の [[IsExtensible]] の呼出しはすべて false を返さなければなりません。

[[PreventExtensions]] ( )

  • 正常戻り値型は Boolean です。
  • [[PreventExtensions]] が true を返した場合、そのターゲットに対する以後の [[IsExtensible]] の呼出しはすべて false を返さなければならず、そのターゲットは以後、拡張不可とみなされます。

[[GetOwnProperty]] ( propertyKey )

  • 正常戻り値型は Property Descriptor または Undefined のいずれかです。
  • 戻り値が Property Descriptor である場合、完全に設定された Property Descriptor でなければなりません。
  • propertyKey が構成不可かつ書込み不可の自身のデータプロパティとして記述された場合、それ以降の [[GetOwnProperty]] ( propertyKey ) の呼出しはすべて、[[Value]] が propertyKey の [[Value]] 属性と SameValue である Property Descriptor を返さなければなりません。
  • [[Writable]] および [[Value]] 以外の propertyKey の属性が時間の経過とともに変化する可能性がある場合、またはそのプロパティが削除される可能性がある場合、propertyKey の [[Configurable]] 属性は true でなければなりません。
  • [[Writable]] 属性が false から true に変更される可能性がある場合、[[Configurable]] 属性は true でなければなりません。
  • ターゲットが拡張不可であり、propertyKey が存在しない場合、そのターゲットに対する以後の [[GetOwnProperty]] (propertyKey) の呼出しはすべて、propertyKey を存在しないものとして記述しなければなりません(すなわち [[GetOwnProperty]] (propertyKey) は undefined を返さなければなりません)。
注 3

3番目の不変条件の結果として、プロパティがデータプロパティとして記述され、その値が時間の経過とともに異なる可能性がある場合、他の必須内部メソッドを介して値を変更する仕組みが公開されていない場合でも、[[Writable]] 属性と [[Configurable]] 属性の一方または両方が true でなければなりません。

[[DefineOwnProperty]] ( propertyKey, propertyDesc )

  • 正常戻り値型は Boolean です。
  • propertyKey が以前にターゲットの構成不可の自身のプロパティとして観測されている場合、次のいずれかの場合を除き、[[DefineOwnProperty]] は false を返さなければなりません。
    1. propertyKey が書込み可能なデータプロパティである場合。構成不可で書込み可能なデータプロパティは、構成不可で書込み不可のデータプロパティに変更できます。
    2. propertyDesc のすべての属性が propertyKey の属性と SameValue である場合。
  • ターゲットが拡張不可であり、propertyKey が存在しない自身のプロパティである場合、[[DefineOwnProperty]] (propertyKey, propertyDesc) は false を返さなければなりません。すなわち、拡張不可のターゲットオブジェクトを新しいプロパティで拡張することはできません。

[[HasProperty]] ( propertyKey )

  • 正常戻り値型は Boolean です。
  • propertyKey が以前にターゲットの構成不可の自身のデータプロパティまたはアクセサープロパティとして観測されている場合、[[HasProperty]] は true を返さなければなりません。

[[Get]] ( propertyKey, receiver )

  • 正常戻り値型は任意の ECMAScript 言語型です。
  • propertyKey が以前に値 value を持つ、ターゲットの構成不可かつ書込み不可の自身のデータプロパティとして観測されている場合、[[Get]] は value と SameValue である値を返さなければなりません。
  • propertyKey が以前に、[[Getter]] 属性が undefined であるターゲットの構成不可の自身のアクセサープロパティとして観測されている場合、[[Get]] 操作は undefined を返さなければなりません。

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

  • 正常戻り値型は Boolean です。
  • propertyKey が以前にターゲットの構成不可かつ書込み不可の自身のデータプロパティとして観測されている場合、value が propertyKey の [[Value]] 属性と SameValue でない限り、[[Set]] は false を返さなければなりません。
  • propertyKey が以前に、[[Setter]] 属性が undefined であるターゲットの構成不可の自身のアクセサープロパティとして観測されている場合、[[Set]] 操作は false を返さなければなりません。

[[Delete]] ( propertyKey )

  • 正常戻り値型は Boolean です。
  • propertyKey が以前にターゲットの構成不可の自身のデータプロパティまたはアクセサープロパティとして観測されている場合、[[Delete]] は false を返さなければなりません。

[[OwnPropertyKeys]] ( )

  • 正常戻り値型は List です。
  • 返される List に重複する項目を含めてはなりません。
  • 返される List の各要素はプロパティキーでなければなりません。
  • 返される List には、以前に観測された構成不可のすべての自身のプロパティのキーが少なくとも含まれていなければなりません。
  • ターゲットが拡張不可である場合、返される List には [[GetOwnProperty]] を使用して観測可能なターゲット自身のすべてのプロパティのキーだけが含まれていなければなりません。

[[Call]] ( )

[[Construct]] ( )

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

6.1.7.4 ウェルノウンイントリンシックオブジェクト

ウェルノウンイントリンシックは、この仕様のアルゴリズムによって明示的に参照され、通常は Realm 固有の同一性を持つ組込みオブジェクトです。特に指定されていない限り、各イントリンシックオブジェクトは実際には Realm ごとに1つずつ存在する、類似するオブジェクトの集合に対応します。

この仕様内では、%name% のような参照は、その名前に対応する、現在の Realm に関連付けられたイントリンシックオブジェクトを意味します。%name.a.b% のような参照は、ECMAScript コードが評価される前に、イントリンシックオブジェクト %name% の "a" プロパティの値の "b" プロパティにアクセスしたかのような意味を持ちます。現在の Realm とそのイントリンシックの決定については、9.4 で説明します。ウェルノウンイントリンシックは 表 6 に列挙されています。

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

表 103 に追加の項目があります。

6.2 ECMAScript 仕様型

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

6.2.1 Enum 仕様型

Enum は、仕様内部の値であり、ECMAScript コードから直接観測することはできません。Enum は、サンセリフ 書体を使用した大文字ケバブケースで表記されます。たとえば、Completion Record の [[Type]] フィールドは、normal、return、または throw などの値を取ります。Enum は、その名前以外の特性を持ちません。Enum の名前は、他の Enum と区別する以外の目的を持たず、文脈におけるその使用法や意味について何も示唆しません。

6.2.2 List および Record 仕様型

List 型は、new 式、関数呼出し、および単純な順序付き値リストが必要なその他のアルゴリズムにおける引数リスト(13.3.8 を参照)の評価を説明するために使用されます。List 型の値は、個々の値を含むリスト要素の単純な順序付き列です。これらの列は任意の長さを持つことができます。リストの要素には、0 を起点とするインデックスを使用してランダムアクセスできます。表記上の便宜のため、配列に似た構文を使用して List の要素にアクセスできます。たとえば、args[2] は List args の第3要素を表す短縮表記です。

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

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

この仕様では、「A、B、... のリスト連結」(各引数は空であってもよい List)という語句は、各引数(順番どおり)の要素(順番どおり)を連結した要素を持つ新しい List 値を表します。

String の List に適用される場合、「辞書式コード単位順に従ってソートする」という語句は、短い方の文字列の長さまで各コード単位の数値によってソートし、それらがすべて等しい場合は、IsLessThan 抽象操作で説明されるように、短い文字列を長い文字列より前にソートすることを意味します。

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

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

仕様の本文およびアルゴリズムでは、ドット表記を使用して Record の特定のフィールドを参照できます。たとえば、R が前の段落に示した Record である場合、R.[[Field2]] は「R の [[Field2]] という名前のフィールド」を表す短縮表記です。

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

6.2.3 Set および Relation 仕様型

Set 型は、メモリモデルで使用する順序のない要素の集合を説明するために使用されます。これは同じ名前を持つ ECMAScript のコレクション型とは異なります。曖昧さを避けるため、この仕様内では ECMAScript コレクションのインスタンスを一貫して「Set オブジェクト」と呼びます。Set 型の値は要素の単純な集合であり、同じ要素が複数回現れることはありません。要素は Set に追加したり、Set から削除したりできます。Set 同士に対して和集合、積集合、または差集合を取ることができます。

Relation 型は、Set に対する制約を説明するために使用されます。Relation 型の値は、その値域に含まれる値の順序対からなる Set です。たとえば、Memory イベント上の Relation は、Memory イベントの順序対の集合です。Relation R と、R の値域に含まれる2つの値 a および b について、a R b は、順序対 (a, b) が R の要素であることを表す短縮表記です。ある条件に関して Relation が最小 Relationであるとは、その条件を満たす最小の Relation であることを意味します。

厳密半順序は、以下を満たす Relation 値 R です。

  • R の定義域内のすべての a、b、および c について:

    • a R a ではなく、かつ
    • a R b かつ b R c である場合、a R c です。
注 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 です。
注 2

上記の3つの性質は、それぞれ完全性、非反射性、および推移性と呼ばれます。

6.2.4 Completion Record 仕様型

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

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

表 7: Completion Record のフィールド
フィールド名 値 意味
[[Type]] normal, break, continue, return, or throw 発生した完了の種類です。
[[Value]] Completion Record を除く任意の値 生成された値です。
[[Target]] String または empty 指向性のある制御移動の対象ラベルです。

Completion Record を参照するために、次の短縮用語が使用されることがあります。

  • 正常完了とは、[[Type]] 値が normal である任意の Completion Record を指します。
  • break 完了とは、[[Type]] 値が break である任意の Completion Record を指します。
  • continue 完了とは、[[Type]] 値が continue である任意の Completion Record を指します。
  • return 完了とは、[[Type]] 値が return である任意の Completion Record を指します。
  • throw 完了とは、[[Type]] 値が throw である任意の Completion Record を指します。
  • 中断完了とは、[[Type]] 値が normal 以外である任意の Completion Record を指します。
  • ある型の値を含む正常完了とは、その [[Value]] フィールドにその型の値を持つ正常完了を指します。

この仕様で定義される呼出し可能オブジェクトは、正常完了またはスロー完了のみを返します。それ以外の種類の Completion Record を返すことは編集上の誤りとみなされます。

実装定義の呼出し可能オブジェクトは、正常完了またはスロー完了のいずれかを返さなければなりません。

6.2.4.1 NormalCompletion ( value )

抽象操作 NormalCompletion。引数 value (any value except a Completionレコード)。戻り値:正常完了。 呼び出されると、次の手順を実行する。

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

6.2.4.2 ThrowCompletion ( value )

抽象操作 ThrowCompletion。引数 value (ECMAScript 言語値)。戻り値:throw 完了。 呼び出されると、次の手順を実行する。

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

6.2.4.3 ReturnCompletion ( value )

抽象操作 ReturnCompletion。引数 value (ECMAScript 言語値)。戻り値:return 完了。 呼び出されると、次の手順を実行する。

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

6.2.4.4 UpdateEmpty ( completionRecord, value )

抽象操作 UpdateEmpty。引数 completionRecord (完了レコード) および value (any value except a Completionレコード)。戻り値:完了レコード。 呼び出されると、次の手順を実行する。

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

6.2.5 Reference Record 仕様型

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

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

表 8: Reference Record のフィールド
フィールド名 値 意味
[[Base]] ECMAScript 言語値、Environment Record、または unresolvable 束縛を保持する値または Environment Record です。[[Base]] が unresolvable である場合、束縛を解決できなかったことを示します。
[[ReferencedName]] ECMAScript 言語値または Private Name 束縛の名前です。[[Base]] 値が Environment Record である場合は常に String です。それ以外の場合、ToPropertyKey が実行されるまでは String または Symbol 以外の ECMAScript 言語値である場合があります。
[[Strict]] Boolean Reference Record が strict モードのコードに由来する場合は true、それ以外の場合は false です。
[[ThisValue]] ECMAScript 言語値または empty empty でない場合、Reference Record は super キーワードを使用して表現されたプロパティ束縛を表します。これは Super Reference Record と呼ばれ、その [[Base]] 値が Environment Record になることはありません。この場合、[[ThisValue]] フィールドは Reference Record が作成された時点の this 値を保持します。

この仕様では、Reference Record を操作するために次の抽象操作を使用します。

6.2.5.1 IsPropertyReference ( refRecord )

抽象操作 IsPropertyReference。引数 refRecord (Referenceレコード)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. refRecord.[[Base]] が unresolvable である場合、false を返す。
  2. refRecord.[[Base]] が Environment Record である場合、false を返す。
  3. true を返す。

6.2.5.2 IsUnresolvableReference ( refRecord )

抽象操作 IsUnresolvableReference。引数 refRecord (Referenceレコード)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. refRecord.[[Base]] が unresolvable である場合、true を返す。
  2. false を返す。

6.2.5.3 IsSuperReference ( refRecord )

抽象操作 IsSuperReference。引数 refRecord (Referenceレコード)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. refRecord.[[ThisValue]] が empty である場合、false を返す。
  2. true を返す。

6.2.5.4 IsPrivateReference ( refRecord )

抽象操作 IsPrivateReference。引数 refRecord (Referenceレコード)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. refRecord.[[ReferencedName]] が Private Name である場合、true を返す。
  2. false を返す。

6.2.5.5 GetValue ( refRecord )

抽象操作 GetValue。引数 refRecord ((Referenceレコード または ECMAScript 言語値))。戻り値:(正常完了 (値:ECMAScript 言語値) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. refRecord が Reference Record でない場合、refRecord を返す。
  2. IsUnresolvableReference(refRecord) が true である場合、ReferenceError 例外をスローする。
  3. IsPropertyReference(refRecord) が true である場合、
    1. baseObj を ? ToObject(refRecord.[[Base]]) とする。
    2. IsPrivateReference(refRecord) が true である場合、
      1. ? PrivateGet(baseObj, refRecord.[[ReferencedName]]) を返す。
    3. refRecord.[[ReferencedName]] がプロパティキーでない場合、
      1. refRecord.[[ReferencedName]] を ? ToPropertyKey(refRecord.[[ReferencedName]]) に設定する。
    4. ? baseObj.[[Get]](refRecord.[[ReferencedName]], GetThisValue(refRecord)) を返す。
  4. base を refRecord.[[Base]] とする。
  5. 表明: base は Environment Record である。
  6. ? base.GetBindingValue(refRecord.[[ReferencedName]], refRecord.[[Strict]]) を返す(9.1 を参照)。
注

手順 3.a で作成される可能性のあるオブジェクトには、上記の抽象操作および通常オブジェクトの [[Get]] 内部メソッドの外部からアクセスすることはできません。実装は、実際にオブジェクトを作成することを避けてもかまいません。

6.2.5.6 PutValue ( refRecord, value )

抽象操作 PutValue。引数 refRecord ((Referenceレコード または ECMAScript 言語値)) および value (ECMAScript 言語値)。戻り値:(正常完了 (値:unused) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. refRecord が Reference Record でない場合、ReferenceError 例外をスローする。
  2. IsUnresolvableReference(refRecord) が true である場合、
    1. refRecord.[[Strict]] が true である場合、ReferenceError 例外をスローする。
    2. globalObj を GetGlobalObject() とする。
    3. ? Set(globalObj, refRecord.[[ReferencedName]], value, false) を実行する。
    4. unused を返す。
  3. IsPropertyReference(refRecord) が true である場合、
    1. baseObj を ? ToObject(refRecord.[[Base]]) とする。
    2. IsPrivateReference(refRecord) が true である場合、
      1. ? PrivateSet(baseObj, refRecord.[[ReferencedName]], value) を返す。
    3. refRecord.[[ReferencedName]] がプロパティキーでない場合、
      1. refRecord.[[ReferencedName]] を ? ToPropertyKey(refRecord.[[ReferencedName]]) に設定する。
    4. succeeded を ? baseObj.[[Set]](refRecord.[[ReferencedName]], value, GetThisValue(refRecord)) とする。
    5. succeeded が false かつ refRecord.[[Strict]] が true である場合、TypeError 例外をスローする。
    6. unused を返す。
  4. base を refRecord.[[Base]] とする。
  5. 表明: base は Environment Record である。
  6. ? base.SetMutableBinding(refRecord.[[ReferencedName]], value, refRecord.[[Strict]]) を返す(9.1 を参照)。
注

手順 3.a で作成される可能性のあるオブジェクトには、上記の抽象操作および通常オブジェクトの [[Set]] 内部メソッドの外部からアクセスすることはできません。実装は、そのオブジェクトを実際に作成することを避けてもかまいません。

6.2.5.7 GetThisValue ( refRecord )

抽象操作 GetThisValue。引数 refRecord (Referenceレコード)。戻り値:ECMAScript 言語値。 呼び出されると、次の手順を実行する。

  1. 表明: IsPropertyReference(refRecord) は true である。
  2. IsSuperReference(refRecord) が true である場合、refRecord.[[ThisValue]] を返す。
  3. refRecord.[[Base]] を返す。

6.2.5.8 InitializeReferencedBinding ( refRecord, value )

抽象操作 InitializeReferencedBinding。引数 refRecord (Referenceレコード) および value (ECMAScript 言語値)。戻り値:(正常完了 (値:unused) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. 表明: IsUnresolvableReference(refRecord) は false である。
  2. base を refRecord.[[Base]] とする。
  3. 表明: base は Environment Record である。
  4. ? base.InitializeBinding(refRecord.[[ReferencedName]], value) を返す。

6.2.5.9 MakePrivateReference ( baseValue, privateIdentifier )

抽象操作 MakePrivateReference。引数 baseValue (ECMAScript 言語値) および privateIdentifier (String)。戻り値:Referenceレコード。 呼び出されると、次の手順を実行する。

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

6.2.6 Property Descriptor 仕様型

Property Descriptor 型は、Object プロパティ属性の操作および実体化を説明するために使用されます。Property Descriptor は0個以上のフィールドを持つ Record であり、各フィールドの名前は属性名、その値は 6.1.7.1 で規定される対応する属性値です。この仕様内で Property Descriptor Record のリテラル記述に印を付けるために使用されるスキーマ名は「PropertyDescriptor」です。

Property Descriptor 値は、特定のフィールドの存在または使用に基づいて、データ Property Descriptor とアクセサー Property Descriptor にさらに分類できます。データ Property Descriptor は、[[Value]] または [[Writable]] という名前のフィールドのいずれかを含むものです。アクセサー Property Descriptor は、[[Getter]] または [[Setter]] という名前のフィールドのいずれかを含むものです。任意の Property Descriptor は [[Enumerable]] および [[Configurable]] という名前のフィールドを持つことができます。Property Descriptor 値が、データ Property Descriptor とアクセサー Property Descriptor の両方になることはできません。ただし、どちらでもない場合があります(この場合は汎用 Property Descriptor です)。完全に設定された Property Descriptorとは、アクセサー Property Descriptor またはデータ Property Descriptor のいずれかであり、表 3 で定義される対応するすべてのフィールドを持つものです。

この仕様では、Property Descriptor 値を操作するために次の抽象操作を使用します。

6.2.6.1 IsAccessorDescriptor ( propertyDesc )

抽象操作 IsAccessorDescriptor。引数 propertyDesc (プロパティ記述子)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. propertyDesc が [[Getter]] フィールドを持つ場合、true を返す。
  2. propertyDesc が [[Setter]] フィールドを持つ場合、true を返す。
  3. false を返す。

6.2.6.2 IsDataDescriptor ( propertyDesc )

抽象操作 IsDataDescriptor。引数 propertyDesc (プロパティ記述子)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. propertyDesc が [[Value]] フィールドを持つ場合、true を返す。
  2. propertyDesc が [[Writable]] フィールドを持つ場合、true を返す。
  3. false を返す。

6.2.6.3 IsGenericDescriptor ( propertyDesc )

抽象操作 IsGenericDescriptor。引数 propertyDesc (プロパティ記述子)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. IsAccessorDescriptor(propertyDesc) が true である場合、false を返す。
  2. IsDataDescriptor(propertyDesc) が true である場合、false を返す。
  3. true を返す。

6.2.6.4 FromPropertyDescriptor ( propertyDesc )

抽象操作 FromPropertyDescriptor。引数 propertyDesc ((プロパティ記述子 または undefined))。戻り値:(Object または undefined)。 呼び出されると、次の手順を実行する。

  1. propertyDesc が undefined である場合、undefined を返す。
  2. obj を OrdinaryObjectCreate(%Object.prototype%) とする。
  3. 表明: obj は、自身のプロパティを持たない拡張可能な通常オブジェクトである。
  4. propertyDesc が [[Value]] フィールドを持つ場合、
    1. ! CreateDataPropertyOrThrow(obj, "value", propertyDesc.[[Value]]) を実行する。
  5. propertyDesc が [[Writable]] フィールドを持つ場合、
    1. ! CreateDataPropertyOrThrow(obj, "writable", propertyDesc.[[Writable]]) を実行する。
  6. propertyDesc が [[Getter]] フィールドを持つ場合、
    1. ! CreateDataPropertyOrThrow(obj, "get", propertyDesc.[[Getter]]) を実行する。
  7. propertyDesc が [[Setter]] フィールドを持つ場合、
    1. ! CreateDataPropertyOrThrow(obj, "set", propertyDesc.[[Setter]]) を実行する。
  8. propertyDesc が [[Enumerable]] フィールドを持つ場合、
    1. ! CreateDataPropertyOrThrow(obj, "enumerable", propertyDesc.[[Enumerable]]) を実行する。
  9. propertyDesc が [[Configurable]] フィールドを持つ場合、
    1. ! CreateDataPropertyOrThrow(obj, "configurable", propertyDesc.[[Configurable]]) を実行する。
  10. obj を返す。

6.2.6.5 ToPropertyDescriptor ( obj )

抽象操作 ToPropertyDescriptor。引数 obj (ECMAScript 言語値)。戻り値:(正常完了 (値:プロパティ記述子) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. obj が Object でない場合、TypeError 例外をスローする。
  2. propertyDesc を、初期状態でフィールドを持たない新しい Property Descriptor とする。
  3. hasEnumerable を ? HasProperty(obj, "enumerable") とする。
  4. hasEnumerable が true である場合、
    1. enumerable を ToBoolean(? Get(obj, "enumerable")) とする。
    2. propertyDesc.[[Enumerable]] を enumerable に設定する。
  5. hasConfigurable を ? HasProperty(obj, "configurable") とする。
  6. hasConfigurable が true である場合、
    1. configurable を ToBoolean(? Get(obj, "configurable")) とする。
    2. propertyDesc.[[Configurable]] を configurable に設定する。
  7. hasValue を ? HasProperty(obj, "value") とする。
  8. hasValue が true である場合、
    1. value を ? Get(obj, "value") とする。
    2. propertyDesc.[[Value]] を value に設定する。
  9. hasWritable を ? HasProperty(obj, "writable") とする。
  10. hasWritable が true である場合、
    1. writable を ToBoolean(? Get(obj, "writable")) とする。
    2. propertyDesc.[[Writable]] を writable に設定する。
  11. hasGet を ? HasProperty(obj, "get") とする。
  12. hasGet が true である場合、
    1. getter を ? Get(obj, "get") とする。
    2. IsCallable(getter) が false かつ getter が undefined でない場合、TypeError 例外をスローする。
    3. propertyDesc.[[Getter]] を getter に設定する。
  13. hasSet を ? HasProperty(obj, "set") とする。
  14. hasSet が true である場合、
    1. setter を ? Get(obj, "set") とする。
    2. IsCallable(setter) が false かつ setter が undefined でない場合、TypeError 例外をスローする。
    3. propertyDesc.[[Setter]] を setter に設定する。
  15. propertyDesc が [[Getter]] フィールドを持つか、propertyDesc が [[Setter]] フィールドを持つ場合、
    1. propertyDesc が [[Value]] フィールドを持つか、propertyDesc が [[Writable]] フィールドを持つ場合、TypeError 例外をスローする。
  16. propertyDesc を返す。

6.2.6.6 CompletePropertyDescriptor ( propertyDesc )

抽象操作 CompletePropertyDescriptor。引数 propertyDesc (プロパティ記述子)。戻り値:unused。 呼び出されると、次の手順を実行する。

  1. like を Record { [[Value]]: undefined, [[Writable]]: false, [[Getter]]: undefined, [[Setter]]: undefined, [[Enumerable]]: false, [[Configurable]]: false } とする。
  2. IsGenericDescriptor(propertyDesc) が true または IsDataDescriptor(propertyDesc) が true である場合、
    1. propertyDesc が [[Value]] フィールドを持たない場合、propertyDesc.[[Value]] を like.[[Value]] に設定する。
    2. propertyDesc が [[Writable]] フィールドを持たない場合、propertyDesc.[[Writable]] を like.[[Writable]] に設定する。
  3. そうでない場合、
    1. propertyDesc が [[Getter]] フィールドを持たない場合、propertyDesc.[[Getter]] を like.[[Getter]] に設定する。
    2. propertyDesc が [[Setter]] フィールドを持たない場合、propertyDesc.[[Setter]] を like.[[Setter]] に設定する。
  4. propertyDesc が [[Enumerable]] フィールドを持たない場合、propertyDesc.[[Enumerable]] を like.[[Enumerable]] に設定する。
  5. propertyDesc が [[Configurable]] フィールドを持たない場合、propertyDesc.[[Configurable]] を like.[[Configurable]] に設定する。
  6. unused を返す。

6.2.7 Environment Record 仕様型

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

6.2.8 Abstract Closure 仕様型

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

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

Abstract Closure が Completion Record を返す場合、その Completion Record は正常完了またはスロー完了のいずれかでなければなりません。

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

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

6.2.9 データブロック

Data Block 仕様型は、バイトサイズ(8ビット)の数値からなる、独立した可変の列を記述するために使用されます。バイト値は、0 から 255 までの閉区間内の整数です。Data Block 値は固定数のバイトで作成され、各バイトの初期値は 0 です。

この仕様内での表記上の便宜のため、配列に似た構文を使用して Data Block 値の個々のバイトにアクセスできます。この表記では、Data Block 値を 0 を起点とする整数インデックス付きのバイト列として表します。たとえば、dataBlock が5バイトの Data Block 値である場合、dataBlock[2] を使用してその第3バイトにアクセスできます。

複数のエージェントから同時に参照できるメモリに存在する Data Block は、Shared Data Block と指定されます。Shared Data Block は、Shared Data Block 値の等価性を検査する目的でアドレス非依存の同一性を持ちます。これは、ブロックが任意のプロセス内でマッピングされている仮想アドレスではなく、そのブロックが表すメモリ内の位置の集合に結び付けられます。2つの Data Block が等しいのは、それらが含む位置の集合が等しい場合に限ります。それ以外の場合、それらは等しくなく、それらが含む位置の集合の共通部分は空です。最後に、Shared Data Block は Data Block と区別できます。

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

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

この仕様では、Data Block 値を操作するために次の抽象操作を使用します。

6.2.9.1 CreateByteDataBlock ( size )

抽象操作 CreateByteDataBlock。引数 size (非負整数)。戻り値:(正常完了 (値:データブロック) または throw 完了)。 呼び出されると、次の手順を実行する。

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

6.2.9.2 CreateSharedByteDataBlock ( size )

抽象操作 CreateSharedByteDataBlock。引数 size (非負整数)。戻り値:(正常完了 (値:共有データブロック) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. dataBlock を size バイトからなる新しい Shared Data Block 値とする。そのような Shared Data Block を作成できない場合、RangeError 例外をスローする。
  2. agentRecord を周囲のエージェントの Agent Record とする。
  3. execution を agentRecord.[[CandidateExecution]] とする。
  4. eventsRecord を、[[AgentSignifier]] が AgentSignifier() である execution.[[EventsRecords]] の Agent Events Record とする。
  5. zero を « 0 » とする。
  6. dataBlock の各インデックス index について、次を行う。
    1. WriteSharedMemory { [[Order]]: init, [[NoTear]]: true, [[Block]]: dataBlock, [[ByteIndex]]: index, [[ElementSize]]: 1, [[Payload]]: zero } を eventsRecord.[[EventList]] に追加する。
  7. dataBlock を返す。

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

抽象操作 CopyDataBlockBytes。引数 toBlock ((データブロック または 共有データブロック))、toIndex (非負整数)、fromBlock ((データブロック または 共有データブロック))、fromIndex (非負整数) および count (非負整数)。戻り値:unused。 呼び出されると、次の手順を実行する。

  1. 表明: fromBlock と toBlock は異なる値である。
  2. fromSize を fromBlock 内のバイト数とする。
  3. 表明: fromIndex + count ≤ fromSize。
  4. toSize を toBlock 内のバイト数とする。
  5. 表明: toIndex + count ≤ toSize。
  6. count > 0 の間、次を繰り返す。
    1. fromBlock が Shared Data Block である場合、
      1. agentRecord を周囲のエージェントの Agent Record とする。
      2. execution を agentRecord.[[CandidateExecution]] とする。
      3. eventsRecord を、[[AgentSignifier]] が AgentSignifier() である execution.[[EventsRecords]] の Agent Events Record とする。
      4. bytes を、非決定的に選択されたバイト値を唯一の要素とする List とする。
      5. 注記: 実装では、bytes は基盤となるハードウェア上の非アトミックな読み取り命令の結果です。この非決定性は、弱い整合性を持つハードウェアの観測可能な動作を記述するための、メモリモデルによる意味論的な規定です。
      6. readEvent を ReadSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: fromBlock, [[ByteIndex]]: fromIndex, [[ElementSize]]: 1 } とする。
      7. readEvent を eventsRecord.[[EventList]] に追加する。
      8. Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: bytes } を execution.[[ChosenValues]] に追加する。
      9. toBlock が Shared Data Block である場合、
        1. WriteSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: toBlock, [[ByteIndex]]: toIndex, [[ElementSize]]: 1, [[Payload]]: bytes } を eventsRecord.[[EventList]] に追加する。
      10. そうでない場合、
        1. toBlock[toIndex] を bytes[0] に設定する。
    2. そうでない場合、
      1. 表明: toBlock は Shared Data Block ではない。
      2. toBlock[toIndex] を fromBlock[fromIndex] に設定する。
    3. toIndex を toIndex + 1 に設定する。
    4. fromIndex を fromIndex + 1 に設定する。
    5. count を count - 1 に設定する。
  7. unused を返す。

6.2.10 PrivateElement 仕様型

PrivateElement 型は、private クラスフィールド、メソッド、およびアクセサーの仕様で使用される Record です。private element は Property Descriptor と関連付けられておらず、またプロパティでもありませんが、それらを参照する式の実行時意味論は、いくつかの点で configurable でないプロパティのものと似ています(private field は書込み可能なデータプロパティに類似し、private method は書込み不可能なデータプロパティに類似し、private accessor はアクセサープロパティに類似します)。対応する Record フィールドも同様の目的で使用されます。

PrivateElement 型の値は、表 9 によってフィールドが定義される Record です。このような値は PrivateElements と呼ばれます。

表 9: PrivateElement のフィールド
フィールド名 そのフィールドが存在する [[Kind]] フィールドの値 値 意味
[[Key]] すべて Private Name フィールド、メソッド、またはアクセサーの名前です。
[[Kind]] すべて field, method, or accessor 要素の種類です。
[[Value]] field and method ECMAScript 言語値 フィールドの値です。
[[Getter]] accessor 関数オブジェクトまたは undefined プライベートアクセサーの getter です。
[[Setter]] accessor 関数オブジェクトまたは undefined プライベートアクセサーの setter です。

6.2.11 ClassFieldDefinition Record 仕様型

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

ClassFieldDefinition 型の値は、表 10 によってフィールドが定義される Record です。このような値は ClassFieldDefinition Records と呼ばれます。

表 10: ClassFieldDefinition Record のフィールド
フィールド名 値 意味
[[Name]] Private Name、String、または Symbol フィールドの名前です。
[[Initializer]] ECMAScript 関数オブジェクトまたは empty 存在する場合、フィールドの初期化子です。

6.2.12 Private Name

Private Name 仕様型は、プライベートクラス要素(フィールド、メソッド、またはアクセサー)のキーを表す、グローバルに一意な値(その他の点では区別できない場合でも、他のどの Private Name とも異なる値)を記述するために使用されます。各 Private Name は、String である不変の [[Description]] 内部スロットを持ちます。Private Name は、PrivateFieldAdd または PrivateMethodOrAccessorAdd を使用して任意の ECMAScript オブジェクトにインストールでき、その後 PrivateGet および PrivateSet を使用して読み書きできます。

6.2.13 ClassStaticBlockDefinition Record 仕様型

ClassStaticBlockDefinition Record は、クラスの静的初期化ブロックの実行可能コードをカプセル化するために使用される Record です。

ClassStaticBlockDefinition Record は、表 11 に列挙されるフィールドを持ちます。

表 11: ClassStaticBlockDefinition Record のフィールド
フィールド名 値 意味
[[BodyFunction]] ECMAScript 関数オブジェクト クラスの静的初期化中に呼び出される関数オブジェクトです。