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型は、truefalseという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.localeCompare22.1.3.12参照)は内部でString値を正規化しますが、他の操作は暗黙に正規化しません。操作結果は、特に記載がない限り言語・ロケールに依存しません。

Note

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

本仕様では、「AB...の文字列連結」(各引数がString値・コード単位・コード単位列)は、各引数(順番通り)のコード単位を連結した並びを持つString値を指します。

SinclusiveStartからexclusiveEndまでの部分文字列」(SはString値またはコード単位列、inclusiveStartexclusiveEnd整数)は、SinclusiveStartインデックスからexclusiveEndの直前までの連続コード単位からなるString値(inclusiveStart = exclusiveEndなら空文字列)を指します。「to」接尾語が省略された場合はexclusiveEndSの長さが使われます。

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:

  1. stringの長さをlenとする。
  2. searchValueが空文字列でかつfromIndexlenなら、fromIndexを返す。
  3. searchValueの長さをsearchLenとする。
  4. fromIndexilen - searchLenを満たす各整数iについて、昇順で:
    1. stringiからi + searchLenまでの部分文字列candidateとする。
    2. candidatesearchValueならiを返す。
  5. not-foundを返す。
Note 1

searchValueが空文字列でかつfromIndexstringの長さなら、このアルゴリズムはfromIndexを返します。空文字列は、文字列内のすべての位置(最後のコード単位の後も含む)で「見つかる」ものとみなされます。

Note 2

このアルゴリズムは、fromIndex + searchValueの長さがstringの長さを超える場合、必ずnot-foundを返します。

6.1.4.2 StringLastIndexOf ( string, searchValue, fromIndex )

The abstract operation StringLastIndexOf takes arguments string (String), searchValue (String), and fromIndex (非負整数) and returns 非負整数またはnot-found. It performs the following steps when called:

  1. stringの長さをlenとする。
  2. searchValueの長さをsearchLenとする。
  3. Assert: fromIndex + searchLenlen
  4. 0 ≤ ifromIndexを満たす各整数iについて、降順で:
    1. stringiからi + searchLenまでの部分文字列candidateとする。
    2. candidatesearchValueならiを返す。
  5. not-foundを返す。
Note

searchValueが空文字列の場合、このアルゴリズムはfromIndexを返します。空文字列は、文字列内のすべての位置(最後のコード単位の後も含む)で「見つかる」ものとみなされます。

6.1.5 Symbol型

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

各Symbolは一意で不変です。

各Symbolは、不変の[[Description]]内部スロットを持ち、その値はStringまたはundefinedです。

6.1.5.1 Well-known Symbol

Well-known Symbolは、本仕様のアルゴリズムから明示的に参照される組み込みのSymbol値です。これらは、値が仕様アルゴリズムの拡張ポイントとなるプロパティのキーとして使われることが一般的です。特に記載がない限り、Well-known Symbol値は全Realmで共有されます(9.3)。

本仕様では、Well-known Symbolは標準のintrinsic記法で参照されます。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言語ではこれらの型間の暗黙的な変換は提供されません。プログラマーは、別の型を必要とする関数を呼び出す際に、型間の変換を明示的にNumberBigInt関数で行う必要があります。

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:

  1. xNaNであれば、NaNを返す。
  2. 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:

  1. oldValueを! ToInt32(x)とする。
  2. 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. baseexponent乗した結果を表す実装依存の近似値を返す。 It performs the following steps when called:

  1. exponentNaNならNaNを返す。
  2. exponent+0𝔽または-0𝔽なら1𝔽を返す。
  3. baseNaNならNaNを返す。
  4. base+∞𝔽なら
    1. exponent > +0𝔽なら+∞𝔽、それ以外は+0𝔽を返す。
  5. base-∞𝔽なら
    1. exponent > +0𝔽なら
      1. exponentが奇数の整数Numberなら-∞𝔽、それ以外は+∞𝔽を返す。
    2. それ以外なら
      1. exponentが奇数の整数Numberなら-0𝔽、それ以外は+0𝔽を返す。
  6. base+0𝔽なら
    1. exponent > +0𝔽なら+0𝔽、それ以外は+∞𝔽を返す。
  7. base-0𝔽なら
    1. exponent > +0𝔽なら
      1. exponentが奇数の整数Numberなら-0𝔽、それ以外は+0𝔽を返す。
    2. それ以外なら
      1. exponentが奇数の整数Numberなら-∞𝔽、それ以外は+∞𝔽を返す。
  8. (アサート)base有限であり+0𝔽でも-0𝔽でもない。
  9. exponent+∞𝔽なら
    1. abs((base)) > 1なら+∞𝔽を返す。
    2. abs((base)) = 1ならNaNを返す。
    3. abs((base)) < 1なら+0𝔽を返す。
  10. exponent-∞𝔽なら
    1. abs((base)) > 1なら+0𝔽を返す。
    2. abs((base)) = 1ならNaNを返す。
    3. abs((base)) < 1なら+∞𝔽を返す。
  11. (アサート)exponent有限であり+0𝔽でも-0𝔽でもない。
  12. base < -0𝔽かつexponent整数Numberでない場合、NaNを返す。
  13. (base)の(exponent)乗の結果を表す実装依存の近似Number値を返す。
Note

base1𝔽-1𝔽exponent+∞𝔽または-∞𝔽の場合、またはbase1𝔽exponentNaNの場合の**演算の結果は、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. xyの積をIEEE 754-2019バイナリ倍精度演算規則に従って計算します。 It performs the following steps when called:

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

有限精度の乗算は可換ですが、常に結合法則が成り立つわけではありません。

6.1.6.1.5 Number::divide ( x, y )

The abstract operation Number::divide takes arguments x (a Number) and y (a Number) and returns a Number. x(被除数)とy(除数)の商をIEEE 754-2019バイナリ倍精度演算規則に従って計算します。 It performs the following steps when called:

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

6.1.6.1.6 Number::remainder ( n, d )

The abstract operation Number::remainder takes arguments n (a Number) and d (a Number) and returns a Number. n(被除数)とd(除数)の暗黙的な割り算から余りを返します。 It performs the following steps when called:

  1. nNaNまたはdNaNならNaNを返す。
  2. n+∞𝔽または-∞𝔽ならNaNを返す。
  3. d+∞𝔽または-∞𝔽ならnを返す。
  4. d+0𝔽または-0𝔽ならNaNを返す。
  5. n+0𝔽または-0𝔽ならnを返す。
  6. (アサート)nd有限かつ非ゼロ。
  7. quotient(n) / (d)とする。
  8. qtruncate(quotient)とする。
  9. r(n) - ((d) × q)とする。
  10. r = 0かつn < -0𝔽なら-0𝔽を返す。
  11. 𝔽(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. xyの和をIEEE 754-2019バイナリ倍精度演算規則に従って計算します。 It performs the following steps when called:

  1. xNaNまたはyNaNならNaNを返す。
  2. x+∞𝔽かつy-∞𝔽ならNaNを返す。
  3. x-∞𝔽かつy+∞𝔽ならNaNを返す。
  4. x+∞𝔽または-∞𝔽ならxを返す。
  5. y+∞𝔽または-∞𝔽ならyを返す。
  6. (アサート)xyはともに有限
  7. x-0𝔽かつy-0𝔽なら-0𝔽を返す。
  8. 𝔽((x) + (y))を返す。
Note

有限精度の加算は可換ですが、常に結合法則が成り立つわけではありません。

6.1.6.1.8 Number::subtract ( x, y )

The abstract operation Number::subtract takes arguments x (a Number) and y (a Number) and returns a Number. 減算を行い、x(被減数)とy(減数)の差を返します。 It performs the following steps when called:

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

x - 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:

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

6.1.6.1.10 Number::signedRightShift ( x, y )

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

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

6.1.6.1.11 Number::unsignedRightShift ( x, y )

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

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

6.1.6.1.12 Number::lessThan ( x, y )

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

  1. xNaNならundefinedを返す。
  2. yNaNならundefinedを返す。
  3. xyと等しいならfalseを返す。
  4. x+0𝔽かつy-0𝔽ならfalseを返す。
  5. x-0𝔽かつy+0𝔽ならfalseを返す。
  6. x+∞𝔽ならfalseを返す。
  7. y+∞𝔽ならtrueを返す。
  8. y-∞𝔽ならfalseを返す。
  9. x-∞𝔽ならtrueを返す。
  10. (アサート)xy有限
  11. (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:

  1. xNaNならfalseを返す。
  2. yNaNならfalseを返す。
  3. xyと等しいならtrueを返す。
  4. x+0𝔽かつy-0𝔽ならtrueを返す。
  5. x-0𝔽かつy+0𝔽ならtrueを返す。
  6. falseを返す。

6.1.6.1.14 Number::sameValue ( x, y )

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

  1. xyがともにNaNならtrueを返す。
  2. x+0𝔽かつy-0𝔽ならfalseを返す。
  3. x-0𝔽かつy+0𝔽ならfalseを返す。
  4. xyと等しいならtrueを返す。
  5. falseを返す。

6.1.6.1.15 Number::sameValueZero ( x, y )

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

  1. xyがともにNaNならtrueを返す。
  2. x+0𝔽かつy-0𝔽ならtrueを返す。
  3. x-0𝔽かつy+0𝔽ならtrueを返す。
  4. xyと等しいならtrueを返す。
  5. falseを返す。

6.1.6.1.16 NumberBitwiseOp ( op, x, y )

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

  1. lNumを! ToInt32(x)とする。
  2. rNumを! ToInt32(y)とする。
  3. lBits(lNum)の32ビット2の補数ビット列とする。
  4. rBits(rNum)の32ビット2の補数ビット列とする。
  5. op&なら
    1. resultlBitsrBitsのビットごとのAND演算結果とする。
  6. そうでなくop^なら
    1. resultlBitsrBitsのビットごとの排他的論理和(XOR)演算結果とする。
  7. それ以外(アサート:op|
    1. resultlBitsrBitsのビットごとの論理和(OR)演算結果とする。
  8. 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:

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

6.1.6.1.18 Number::bitwiseXOR ( x, y )

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

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

6.1.6.1.19 Number::bitwiseOR ( x, y )

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

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

6.1.6.1.20 Number::toString ( x, radix )

The abstract operation Number::toString takes arguments x (a Number) and radix (an integer in the inclusive interval from 2 to 36) and returns a String. xradix進法の位置記数法でStringとして表現します。r進法での数字は"0123456789abcdefghijklmnopqrstuvwxyz"の最初のr個のコードユニットが順に用いられます。絶対値が1𝔽以上の数値の表現は先頭ゼロを含みません。 It performs the following steps when called:

  1. xNaNなら"NaN"を返す。
  2. x+0𝔽または-0𝔽なら"0"を返す。
  3. x < -0𝔽なら、文字列連結"-"Number::toString(-x, radix)を返す。
  4. x+∞𝔽なら"Infinity"を返す。
  5. nks整数として、k ≥ 1、radixk - 1s < radixk𝔽(s × radixn - k)がx、かつkが可能な限り最小となるようにする。kradix進法でのsの桁数で、sradixで割り切れない。最下位桁が一意に決まるとは限らない。
  6. radix ≠ 10またはnが-5から21の範囲なら
    1. nkなら
      1. 次の文字列連結で返す:
        • sradix進法表現のk
        • 0x0030(数字ゼロ)のコードユニットをn - k
    2. それ以外でn > 0なら
      1. 次の文字列連結で返す:
        • sradix進法表現の最上位n
        • 0x002E(ピリオド)
        • 残りk - n
    3. それ以外(n ≤ 0をアサート)
      1. 次の文字列連結で返す:
        • 0x0030(数字ゼロ)
        • 0x002E(ピリオド)
        • 0x0030(数字ゼロ)を-n
        • sradix進法表現のk
  7. 注:この場合、入力は科学的E表記(例:1.2e+3)で表現される。
  8. (アサート)radixは10。
  9. n < 0なら
    1. exponentSignを0x002D(ハイフンマイナス)とする。
  10. それ以外
    1. exponentSignを0x002B(プラス記号)とする。
  11. k = 1なら
    1. 次の文字列連結で返す:
      • sの1桁目
      • 0x0065(小文字e)
      • exponentSign
      • abs(n - 1)の10進表現
  12. 次の文字列連結で返す:
    • sの最上位桁(10進表現)
    • 0x002E(ピリオド)
    • 残りk - 1桁(10進表現)
    • 0x0065(小文字e)
    • exponentSign
    • abs(n - 1)の10進表現
Note 1

次の点は実装の指針となり得ますが、この規格の規範的要件の一部ではありません:

  • xが-0𝔽以外の任意のNumber値の場合、ToNumber(ToString(x))はxとなる。
  • sの最下位桁はstep 5の要件では一意に決まるとは限らない。
Note 2

規定よりも高精度の変換が可能な実装には、step 5の次の代替手順が指針となります:

  1. nks整数として、k ≥ 1、radixk - 1s < radixk𝔽(s × radixn - k)がxkが最小となるようにする。sの値が複数ある場合、s × radixn - k(x)に最も近いものを選ぶ。2つの可能な値がある場合は偶数の方を選ぶ。kradix進法でのsの桁数であり、sradixで割り切れない。
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:

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

6.1.6.2.2 BigInt::bitwiseNOT ( x )

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

  1. -x - 1を返す。

6.1.6.2.3 BigInt::exponentiate ( base, exponent )

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

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

6.1.6.2.4 BigInt::multiply ( x, y )

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

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

6.1.6.2.5 BigInt::divide ( x, y )

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

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

6.1.6.2.6 BigInt::remainder ( n, d )

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

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

6.1.6.2.7 BigInt::add ( x, y )

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

  1. x + yを返す。

6.1.6.2.8 BigInt::subtract ( x, y )

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

  1. x - yを返す。

6.1.6.2.9 BigInt::leftShift ( x, y )

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

  1. y < 0なら
    1. (floor((x) / 2-(y)))を返す。
  2. x × 2yを返す。
Note
ここでの意味論は、BigIntを無限長の2の補数バイナリ文字列として扱うビットシフトと同等です。

6.1.6.2.10 BigInt::signedRightShift ( x, y )

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

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

6.1.6.2.11 BigInt::unsignedRightShift ( x, y )

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

  1. TypeError例外を投げる。

6.1.6.2.12 BigInt::lessThan ( x, y )

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

  1. (x) < (y)ならtrue、それ以外はfalseを返す。

6.1.6.2.13 BigInt::equal ( x, y )

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

  1. (x) = (y)ならtrue、それ以外はfalseを返す。

6.1.6.2.14 BinaryAnd ( x, y )

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

  1. x = 1かつy = 1なら1を返す。
  2. それ以外は0を返す。

6.1.6.2.15 BinaryOr ( x, y )

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

  1. x = 1またはy = 1なら1を返す。
  2. それ以外は0を返す。

6.1.6.2.16 BinaryXor ( x, y )

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

  1. x = 1かつy = 0なら1を返す。
  2. それ以外でx = 0かつy = 1なら1を返す。
  3. それ以外は0を返す。

6.1.6.2.17 BigIntBitwiseOp ( op, x, y )

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

  1. x(x)に設定する。
  2. y(y)に設定する。
  3. resultを0とする。
  4. shiftを0とする。
  5. (x = 0またはx = -1)かつ(y = 0またはy = -1)になるまで繰り返す:
    1. xDigitx modulo 2とする。
    2. yDigity modulo 2とする。
    3. op&なら
      1. resultresult + 2shift × BinaryAnd(xDigit, yDigit)に設定する。
    4. それ以外でop|なら
      1. resultresult + 2shift × BinaryOr(xDigit, yDigit)に設定する。
    5. それ以外
      1. アサート:op^である。
      2. resultresult + 2shift × BinaryXor(xDigit, yDigit)に設定する。
    6. shiftshift + 1に設定する。
    7. xを(x - xDigit) / 2に設定する。
    8. yを(y - yDigit) / 2に設定する。
  6. op&なら
    1. tmpBinaryAnd(x modulo 2, y modulo 2)とする。
  7. それ以外でop|なら
    1. tmpBinaryOr(x modulo 2, y modulo 2)とする。
  8. それ以外
    1. アサート:op^である。
    2. tmpBinaryXor(x modulo 2, y modulo 2)とする。
  9. tmp ≠ 0なら
    1. resultresult - 2shiftに設定する。
    2. 注:これは符号拡張となる。
  10. resultBigInt値を返す。

6.1.6.2.18 BigInt::bitwiseAND ( x, y )

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

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

6.1.6.2.19 BigInt::bitwiseXOR ( x, y )

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

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

6.1.6.2.20 BigInt::bitwiseOR ( x, y )

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

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

6.1.6.2.21 BigInt::toString ( x, radix )

The abstract operation BigInt::toString takes arguments x (a BigInt) and radix (an integer in the inclusive interval from 2 to 36) and returns a String. xradix進法の位置記数法でStringとして表現します。r進法でのBigIntの表現に使われる数字は"0123456789abcdefghijklmnopqrstuvwxyz"の最初のr個のコードユニットが順番に使われます。0以外のBigIntの表現には先頭ゼロは含まれません。 It performs the following steps when called:

  1. x < 0なら、文字列連結"-"BigInt::toString(-x, radix)を返す。
  2. xradixで表現した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に記載された内部メソッドについて、10.1で定義されたものを使用する。
  • オブジェクトが[[Call]]内部メソッドを持つ場合、10.2.1または10.3.1で定義されたものを使用する。
  • オブジェクトが[[Construct]]内部メソッドを持つ場合、10.2.2または10.3.2で定義されたものを使用する。

エキゾチックオブジェクトは、通常オブジェクトでないオブジェクトです。

本仕様では、エキゾチックオブジェクトの種類はその内部メソッドによって認識されます。特定の種類のエキゾチックオブジェクト(配列エキゾチックオブジェクト束縛関数エキゾチックオブジェクトなど)と振る舞いが同等でも、その種類に指定された内部メソッド群を持たない場合は、その種類のエキゾチックオブジェクトとして認識されません。

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コードの実行が必要な場合、Receiverthis値として使用される。
[[Set]] (propertyKey, value, Receiver) Boolean このオブジェクトのpropertyKeyプロパティ値をvalueに設定する。値の設定にECMAScriptコードの実行が必要な場合、Receiverthis値として使われる。値の設定ができれば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]]呼び出しもVSameValueな値を返すべきです。
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]]属性がSameValueProperty 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を返さなければなりません:
    1. Pが書き込み可能データプロパティである。非設定可能な書き込み可能データプロパティは非設定可能な非書き込み可能データプロパティに変更できる。
    2. Descの全属性がPの属性とSameValueである。
  • ターゲットが非拡張かつPが非存在自身プロパティの場合、[[DefineOwnProperty]] (P, Desc)はfalseを返さなければならない。つまり非拡張ターゲットオブジェクトに新しいプロパティは追加できない。

[[HasProperty]] ( P )

  • 正常返却型はBooleanです。
  • Pが過去に非設定可能自身データまたはアクセサプロパティだった場合、[[HasProperty]]trueを返さなければなりません。

[[Get]] ( P, Receiver )

  • 正常返却型は任意のECMAScript言語型です。
  • Pが過去に非設定可能・非書き込み可能な自身データプロパティで値Vを持っていた場合、[[Get]]VSameValueな値を返さなければなりません。
  • Pが過去に非設定可能な自身アクセサプロパティ[[Get]]属性がundefinedだった場合、[[Get]]操作はundefinedを返さなければなりません。

[[Set]] ( P, V, Receiver )

  • 正常返却型はBooleanです。
  • Pが過去に非設定可能・非書き込み可能な自身データプロパティだった場合、VP[[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: 著名な組み込みオブジェクト
組み込み名 グローバル名 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
%AsyncFromSyncIteratorPrototype% Async-from-Sync Iteratorオブジェクトのプロトタイプ(27.1.6
%AsyncFunction% 非同期関数オブジェクトコンストラクタ27.7.1
%AsyncGeneratorFunction% 非同期ジェネレーター関数オブジェクトコンストラクタ27.4.1
%AsyncGeneratorPrototype% 非同期ジェネレーターオブジェクトのプロトタイプ(27.6
%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
%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.3.1
%GeneratorPrototype% ジェネレーターオブジェクトのプロトタイプ(27.5
%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.2.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
%Symbol% Symbol Symbolコンストラクタ20.4.1
%SyntaxError% SyntaxError SyntaxErrorコンストラクタ20.5.5.4
%ThrowTypeError% 必ず新しい%TypeError%インスタンスを投げる関数オブジェクト
%TypedArray% 全ての型付き配列コンストラクタのスーパークラス(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.1.1
Note

追加のエントリはTable 100にあります。

6.2 ECMAScript仕様型

仕様型は、ECMAScript言語構造やECMAScript言語型の意味論を記述するためにアルゴリズム内で使用されるメタ値を表します。仕様型にはReference RecordListCompletion RecordProperty DescriptorEnvironment RecordAbstract ClosureData Blockが含まれます。仕様型の値は仕様上のアーティファクトであり、ECMAScript実装内の特定の実体に必ずしも対応しません。仕様型の値はECMAScript式評価の中間結果の記述に使われることがありますが、オブジェクトのプロパティやECMAScript言語変数の値として保存することはできません。

6.2.1 Enum仕様型

Enumは仕様内部の値であり、ECMAScriptコードから直接観測することはできません。Enumはsans-serifフォントで表記されます。例えば、Completion Record[[Type]]フィールドはnormalreturnthrowなどの値を取ります。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は« »で表現できます。

この仕様書では、「AB、...のリスト結合」という表現(各引数は空リストの場合もある)は、各引数の要素(順序通り)を連結した新しい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つの値abについて、a R bは順序付きペア(a, b)がRに含まれることの略記です。Relationがある条件に関して最小Relationであるとは、その条件を満たす最小のRelationであることを意味します。

狭義半順序は、Relation値Rが以下を満たす場合です。

  • Rの値域内の全てのabcについて:

    • a R aであることはない
    • a R bかつb R cならa R c
Note 1

上記2つの性質は、それぞれ反射性の否定(非自反性)と推移性と呼ばれます。

狭義全順序は、Relation値Rが以下を満たす場合です。

  • Rの値域内の全てのabcについて:

    • abであるか、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仕様型は、値や制御フロー(breakcontinuereturnthrowによる非局所的な制御移動)のランタイム伝播などを説明するために使われます。

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

Table 7: Completion Recordフィールド
フィールド名 意味
[[Type]] normalbreakcontinuereturnthrow 発生した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:

  1. 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:

  1. 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:

  1. 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:

  1. completionRecordreturn completionまたはthrow completionの場合、completionRecord.[[Value]]emptyでないことをアサートする。
  2. completionRecord.[[Value]]emptyでないなら、? completionRecordを返す。
  3. Completion Record { [[Type]]: completionRecord.[[Type]], [[Value]]: value, [[Target]]: completionRecord.[[Target]] }を返す。

6.2.5 Reference Record仕様型

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

Reference Recordは解決済みの名前や(未解決の場合もある)プロパティバインディングであり、そのフィールドはTable 8で定義されます。

Table 8: Reference Recordフィールド
フィールド名 意味
[[Base]] ECMAScript言語値Environment Recordunresolvable バインディングを保持する値またはEnvironment Record[[Base]]unresolvableの場合、バインディングが解決できなかったことを示す。
[[ReferencedName]] ECMAScript言語値またはPrivate Name バインディング名。[[Base]]値がEnvironment Recordの場合は常にString。それ以外の場合、ToPropertyKeyが実行されるまではStringやSymbol以外のECMAScript言語値の場合もある。
[[Strict]] 真偽値 Reference Recordがstrict modeコードから生成された場合はtrue、それ以外はfalse
[[ThisValue]] ECMAScript言語値またはempty emptyでない場合、Reference Recordsuperキーワードで表現されたプロパティバインディングを表す(Super Reference Record)となり、[[Base]]値はEnvironment Recordにならない。その場合、[[ThisValue]]フィールドはReference Record生成時のthis値を保持する。

この仕様で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:

  1. V.[[Base]]unresolvableならfalseを返す。
  2. 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:

  1. 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:

  1. 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:

  1. 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 completionECMAScript言語値含む)またはabrupt completion. It performs the following steps when called:

  1. VReference RecordでなければVを返す。
  2. IsUnresolvableReference(V)がtrueならReferenceError例外を投げる。
  3. IsPropertyReference(V)がtrueなら
    1. baseObjを? ToObject(V.[[Base]])とする。
    2. IsPrivateReference(V)がtrueなら
      1. PrivateGet(baseObj, V.[[ReferencedName]])を返す。
    3. V.[[ReferencedName]]プロパティキーでない場合
      1. V.[[ReferencedName]]を? ToPropertyKey(V.[[ReferencedName]])に設定する。
    4. baseObj.[[Get]](V.[[ReferencedName]], GetThisValue(V))を返す。
  4. それ以外の場合
    1. baseV.[[Base]]とする。
    2. アサート:baseEnvironment Record
    3. 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 completionunused含む)またはabrupt completion. It performs the following steps when called:

  1. VReference RecordでなければReferenceError例外を投げる。
  2. IsUnresolvableReference(V)がtrueなら
    1. V.[[Strict]]trueならReferenceError例外を投げる。
    2. globalObjGetGlobalObject()とする。
    3. Set(globalObj, V.[[ReferencedName]], W, false)を実行する。
    4. unusedを返す。
  3. IsPropertyReference(V)がtrueなら
    1. baseObjを? ToObject(V.[[Base]])とする。
    2. IsPrivateReference(V)がtrueなら
      1. PrivateSet(baseObj, V.[[ReferencedName]], W)を返す。
    3. V.[[ReferencedName]]プロパティキーでない場合
      1. V.[[ReferencedName]]を? ToPropertyKey(V.[[ReferencedName]])に設定する。
    4. succeededを? baseObj.[[Set]](V.[[ReferencedName]], W, GetThisValue(V))とする。
    5. succeededfalseかつV.[[Strict]]trueならTypeError例外を投げる。
    6. unusedを返す。
  4. それ以外の場合
    1. baseV.[[Base]]とする。
    2. アサート:baseEnvironment Record
    3. 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:

  1. IsPropertyReference(V)がtrueであることをアサートする。
  2. 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 completionunused含む)またはabrupt completion. It performs the following steps when called:

  1. IsUnresolvableReference(V)がfalseであることをアサートする。
  2. baseV.[[Base]]とする。
  3. アサート:baseEnvironment Record
  4. 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:

  1. privateEnvを実行中の実行コンテキストのPrivateEnvironmentとする。
  2. アサート:privateEnvnullではない。
  3. privateNameResolvePrivateIdentifier(privateEnv, privateIdentifier)とする。
  4. 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:

  1. Desc[[Get]]フィールドを持つならtrueを返す。
  2. Desc[[Set]]フィールドを持つならtrueを返す。
  3. 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:

  1. Desc[[Value]]フィールドを持つならtrueを返す。
  2. Desc[[Writable]]フィールドを持つならtrueを返す。
  3. 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:

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

6.2.6.4 FromPropertyDescriptor ( Desc )

The abstract operation FromPropertyDescriptor takes argument Desc (Property Descriptorまたはundefined) and returns Objectまたはundefined. It performs the following steps when called:

  1. Descundefinedならundefinedを返す。
  2. objOrdinaryObjectCreate(%Object.prototype%)とする。
  3. アサート:objは自身プロパティを持たない拡張可能な通常オブジェクト
  4. Desc[[Value]]フィールドを持つなら
    1. CreateDataPropertyOrThrow(obj, "value", Desc.[[Value]])を実行する。
  5. Desc[[Writable]]フィールドを持つなら
    1. CreateDataPropertyOrThrow(obj, "writable", Desc.[[Writable]])を実行する。
  6. Desc[[Get]]フィールドを持つなら
    1. CreateDataPropertyOrThrow(obj, "get", Desc.[[Get]])を実行する。
  7. Desc[[Set]]フィールドを持つなら
    1. CreateDataPropertyOrThrow(obj, "set", Desc.[[Set]])を実行する。
  8. Desc[[Enumerable]]フィールドを持つなら
    1. CreateDataPropertyOrThrow(obj, "enumerable", Desc.[[Enumerable]])を実行する。
  9. Desc[[Configurable]]フィールドを持つなら
    1. CreateDataPropertyOrThrow(obj, "configurable", Desc.[[Configurable]])を実行する。
  10. objを返す。

6.2.6.5 ToPropertyDescriptor ( Obj )

The abstract operation ToPropertyDescriptor takes argument Obj (ECMAScript言語値) and returns normal completionProperty Descriptor含む)またはthrow completion. It performs the following steps when called:

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

6.2.6.6 CompletePropertyDescriptor ( Desc )

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

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

6.2.7 Environment Record仕様型

Environment Record型は、入れ子関数やブロックにおける名前解決の動作を説明するために使われます。この型および操作は9.1で定義されています。

6.2.8 Abstract Closure仕様型

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

Abstract Closureを生成するアルゴリズム手順では、"capture"という動詞とエイリアスのリストで値をキャプチャします。Abstract Closure生成時には各エイリアスに関連付けられた値をキャプチャします。Abstract Closureの呼び出しで実行されるアルゴリズム手順には、キャプチャした値をエイリアス名で参照します。

Abstract ClosureがCompletion Recordを返す場合、それはnormal completionまたはthrow completionでなければなりません。

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

  1. addendを41とする。
  2. closureをパラメータ(x)でaddendをキャプチャし、呼び出し時に次の手順を実行する新しいAbstract Closureとする:
    1. x + addendを返す。
  3. valclosure(1)とする。
  4. アサート: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 completionData Block含む)またはthrow completion. It performs the following steps when called:

  1. size > 253 - 1ならRangeError例外を投げる。
  2. dbsizeバイトからなる新しいData Block値とする。作成不可能ならRangeError例外を投げる。
  3. dbの全バイトを0に設定する。
  4. dbを返す。

6.2.9.2 CreateSharedByteDataBlock ( size )

The abstract operation CreateSharedByteDataBlock takes argument size (非負整数) and returns normal completionShared Data Block含む)またはthrow completion. It performs the following steps when called:

  1. dbsizeバイトからなる新しいShared Data Block値とする。作成不可能ならRangeError例外を投げる。
  2. executionを周囲エージェントのAgent Record[[CandidateExecution]]フィールドとする。
  3. eventsRecordagentAgent Events Recordexecution.[[EventsRecords]]中で[[AgentSignifier]]AgentSignifier()となるもの)とする。
  4. zeroを« 0 »とする。
  5. dbの各インデックスiについて:
    1. WriteSharedMemory { [[Order]]: init, [[NoTear]]: true, [[Block]]: db, [[ByteIndex]]: i, [[ElementSize]]: 1, [[Payload]]: zero }をeventsRecord.[[EventList]]に追加する。
  6. 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:

  1. fromBlocktoBlockが異なる値であることをアサートする。
  2. fromSizefromBlockのバイト数とする。
  3. fromIndex + countfromSizeをアサートする。
  4. toSizetoBlockのバイト数とする。
  5. toIndex + counttoSizeをアサートする。
  6. count > 0の間、繰り返す:
    1. fromBlockShared Data Blockの場合
      1. executionを周囲エージェントのAgent Record[[CandidateExecution]]フィールドとする。
      2. eventsRecordagentAgent Events Recordexecution.[[EventsRecords]]中で[[AgentSignifier]]AgentSignifier()となるもの)とする。
      3. bytesを、非決定的に選ばれたバイト値を唯一の要素とするListとする。
      4. 注:実装では、bytesは基底ハードウェアで非アトミックな読込命令の結果。非決定性は、弱い一貫性ハードウェアの観測可能挙動を記述するメモリモデルの意味論的規定。
      5. readEventReadSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: fromBlock, [[ByteIndex]]: fromIndex, [[ElementSize]]: 1 }とする。
      6. readEventeventsRecord.[[EventList]]に追加する。
      7. Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: bytes }をexecution.[[ChosenValues]]に追加する。
      8. toBlockShared Data Blockなら
        1. WriteSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: toBlock, [[ByteIndex]]: toIndex, [[ElementSize]]: 1, [[Payload]]: bytes }をeventsRecord.[[EventList]]に追加する。
      9. それ以外の場合
        1. toBlock[toIndex]にbytes[0]を設定する。
    2. それ以外の場合
      1. toBlockShared Data Blockでないことをアサートする。
      2. toBlock[toIndex]にfromBlock[fromIndex]を設定する。
    3. toIndextoIndex + 1に設定する。
    4. fromIndexfromIndex + 1に設定する。
    5. countcount - 1に設定する。
  7. unusedを返す。

6.2.10 PrivateElement仕様型

PrivateElement型は、privateクラスフィールド・メソッド・アクセサの仕様で使用されるRecordです。Property Descriptorはprivate要素には使われませんが、privateフィールドは非設定可能・非列挙・書き込み可能なデータプロパティ、privateメソッドは非設定可能・非列挙・非書き込み可能なデータプロパティ、privateアクセサは非設定可能・非列挙なアクセサプロパティと同様に振る舞います。

PrivateElement型の値は、Table 9で定義されたフィールドを持つRecord値です。これらの値はPrivateElementと呼ばれます。

Table 9: PrivateElementフィールド
フィールド名 [[Kind]]フィールドが存在する場合の値 意味
[[Key]] 全て Private Name フィールド・メソッド・アクセサの名前。
[[Kind]] 全て fieldmethodaccessor 要素の種類。
[[Value]] fieldmethod 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でインストールでき、PrivateGetPrivateSetで読み書きできます。

6.2.13 ClassStaticBlockDefinition Record仕様型

ClassStaticBlockDefinition Recordは、クラスのstatic初期化ブロック用実行コードをカプセル化するRecord値です。

ClassStaticBlockDefinition RecordはTable 11で挙げられるフィールドを持ちます。

Table 11: ClassStaticBlockDefinition Recordフィールド
フィールド名 意味
[[BodyFunction]] ECMAScript関数オブジェクト クラスのstatic初期化時に呼び出される関数オブジェクト