このページはECMAScript® 2020 Language Specification6 ECMAScript Data Types and Values章をJavaScriptの学習目的で私的に日本語訳したものであり、直訳と意訳および推測が混在しています。そのため内容については正確ではない可能性があります。正確な情報を知りたい場合は、原文をご覧ください。また一部訳者によるコメントが含まれていることがあります。※このサイトの内容で損害や不利益を受けたとしても当方は一切の責任を負いません。

この仕様内のアルゴリズムは、それぞれに関連する型を持つ値を操作します。使用可能な値の型は、この章で定義しています。型はECMAScript言語タイプと仕様タイプに分類されます。

Type(x)

この仕様では、「Type(x)」という表記は「xの型」という意味です。「型」または「type」は、この章で定義されているECMAScriptの言語型仕様型を指します。

empty

「empty」という用語が値の名前であるかのように使用される場合、「どの型の値もない」と言う意味です。

6.1 ECMAScript言語型(ECMAScript Language Types)

ECMAScript言語型は、プログラマーがECMAScript言語を使用して直接操作する値に対応しています。ECMAScript言語型は、未定義、Null、ブール、文字列、シンボル、数値、BigInt、およびオブジェクトです。ECMAScript言語値は、ECMAScript言語型によって特徴付けられる値です。

6.1.1 Undefined型(The Undefined Type)

Undefined型は、undefinedと呼ばれる値を1つだけ所持します。値が割り当てられていない変数の値はundefinedです。

6.1.2 Null型(The Null Type)

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

6.1.3 ブール型(The Boolean Type)

ブール型は、trueとfalseの2つの値を持つ論理エンティティです。

6.1.4 文字列型(The String Type)

文字列型は、順番付けされた16ビット符号なし整数値のシーケンスで、最大253-1要素まで取り扱うことができます。

文字列型は、通常、実行中のECMAScriptプログラムでテキストデータを取り扱うために使用されます。
この場合、文字列の各要素はUTF-16コードポイント値として扱われます、シーケンス内の位置を占めると見なされます。
これらの位置には、負でない整数でインデックスが付けられます。
最初の要素はインデックス0で、次の要素はインデックス1です。
文字列の長さは、文字列内の要素(つまり、16ビット値)の数です。
空の文字列は長さがゼロであり、実要素は含まれていません。

文字列の内容を解釈しないECMAScript操作は、それ以上のセマンティクスを適用しません。
文字列値を解釈する操作は、各要素を単一のUTF-16コードポイントとして扱います。

ただし、ECMAScriptはこれらのコードポイントの値または関係を制限しないため、UTF-16のUnicodeコードポイントとしてさらに解釈する操作では、不正なサブシーケンスを考慮する必要があります。

上位サロゲート

下位サロゲート

サロゲートペア

このような操作は、0xD800から0xDBFFまでの数値(Unicode規格によって上位サロゲートとして、またはより正式には高サロゲートコードユニットとして定義)、0xDC00から0xDFFFまでの範囲(下位サロゲートとして、またはより正式には低サロゲートコードポイントとして定義)のすべてのコードユニットと数値を持つすべてのコードユニットに次のルールを使用して特別な処理を適用します。

  • 上位サロゲートでも下位サロゲートでもないコードポイントは、同じ値のコードポイントとして解釈されます。
  • 最初のコードユニットc1が上位サロゲートで、2番目のコードユニットc2が下位サロゲートである2つのコードユニットのシーケンスは、サロゲートペアであり、値は(c1-0xD800)× 0x400 +( c2 - 0xDC00 )+ 0x10000です (10.1.3を参照)
  • 上位サロゲートまたは下位サロゲートであるが、サロゲートペアの一部ではないコードポイントは、同じ値のコードポイントとして解釈されます。

関数String.prototype.normalize(21.1.3.13を参照)を使用して、String値を明示的に正規化できます。 String.prototype.localeCompare(21.1.3.10を参照)はString値を内部的に正規化しますが、他の操作では、それらが操作する文字列を暗黙的に正規化しません。言語またはロケール依存であることが明示的に指定されている操作のみが、言語依存の結果を生成します。

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

この仕様では、「A、B、...の文字列連結」という句(各引数は文字列値、コード単位、またはコード単位のシーケンス)は、各引数の順序で連結された文字列値を示します。

6.1.5 シンボル型(The Symbol Type)

シンボル型は、Objectプロパティ(6.1.7)のキーとして使用できる、すべての非文字列値のセットです。

シンボル型が所持するシンボルの値は、他のシンボルと被らず(一意)、一度設定されたら変更されません。

各シンボル値は、undefinedまたは文字列値が関連付けられた[[Description]] と呼ばれる、値が変わらないプロパティを保持します。

6.1.5.1 既知シンボル(Well-Known Symbols)

既知シンボルは、この仕様のアルゴリズムによって明示的に使用される、組み込みシンボル値です。
通常、仕様アルゴリズムの拡張ポイントとして機能するプロパティのキーとして使用されます。

仕様アルゴリズムの拡張ポイントとして機能するプロパティ:シンボルをプロパティ名の代わりに使用していることもあるよ、という意味。

特に指定がない限り、既知シンボル値はすべてのレルムで共有されます (8.2)。

この仕様内では、@@nameという形式の表記法を使用して、既知シンボルを参照しています。「name」は、表1にリストされている値の1つです。

表1: 既知シンボル
仕様名 [[Description]] 値と使用目的
@@asyncIterator "Symbol.asyncIterator" オブジェクトのデフォルトのAsyncIteratorを返すメソッド。
for-await-of ステートメントのセマンティクスによって呼び出されます。
@@hasInstance "Symbol.hasInstance" コンストラクターオブジェクトが指定されたオブジェクトを
コンストラクターのインスタンスとして認識するかどうかを決定するメソッド。
instanceof演算子のセマンティクスによって呼び出されます。
@@isConcatSpreadable "Symbol.isConcatSpreadable" ブール値のプロパティ。
trueなら、オブジェクトはArray.prototype.concatによって、
その配列要素にフラット化される必要があることを示します。
@@iterator "Symbol.iterator" for-of ステートメントによって呼び出される。
オブジェクトの既定の反復処理を返すメソッド。
@@match "Symbol.match" String.prototype.matchメソッドによって呼び出される。
文字列に対して正規表現を照合する正規表現メソッド。
@@matchAll "Symbol.matchAll" String.prototype.matchAll メソッドによって呼び出される。
文字列に対して正規表現の一致を生成する
反復処理を返す正規表現メソッド。
@@replace "Symbol.replace" String.prototype.replaceメソッドによって呼び出される。
文字列の一致した部分文字列を置き換える正規表現メソッド。
@@search "Symbol.search" String.prototype.searchメソッドによって呼び出される。
一致する文字列内のインデックスを返す正規表現メソッド。
@@species "Symbol.species" 派生オブジェクトの作成に使用されるコンストラクター関数
@@split "Symbol.split" String.prototype.splitメソッドによって呼び出されます。
一致するインデックスで文字列を分割する正規表現メソッド。
@@toPrimitive "Symbol.toPrimitive" ToPrimitive抽象操作によって呼び出される。
オブジェクトを対応するプリミティブ値に変換するメソッド。
@@toStringTag "Symbol.toStringTag" 組み込みメソッドObject.prototype.toStringによってアクセスされる。
オブジェクトのデフォルトの文字列説明の
作成に使用される文字列値プロパティ。
@@unscopables "Symbol.unscopables" 自身および継承されたプロパティ名が、
関連付けられたオブジェクトの
環境バインディングから
除外されるオブジェクト値プロパティ。

6.1.6 二つの数値型(Numeric Types)

T:unit

ECMAScriptには、NumberとBigIntの2つの組み込み数値型があります。
この仕様では、すべての数値型 T(NumberかBigInt) には、T::unitで示される乗算 ID 値が含まれています。
仕様型には、T::op という表記された、次の表のような抽象操作があります。

次表のすべての引数の型は T です。結果 列には、戻り値の型が表示され、操作の呼び出しによって突然の完了が返される可能性があるかどうかが示されます。

表2: 数値型演算
呼び出しの概要
(リンク先はNumber型です)
コード例 呼び出し元 結果
T::unaryMinus(x)
(*BigInt)
-x 単項 - 演算 T
T::bitwiseNOT(x)
(*BigInt)
~x ビットごとのNOT演算子(~) T
T::exponentiate(x, y)
(*BigInt)
x ** y べき乗演算子Math.pow( base, exponent ) T,
throw RangeError
T::multiply(x, y)
(*BigInt)
x * y 乗法演算子 T
T::divide(x, y)
(*BigInt)
x / y 乗法演算子 T,
throw RangeError
T::remainder(x, y)
(*BigInt)
x % y 乗法演算子 T,
throw RangeError
T::add(x, y)
(*BigInt)
x ++
++ x
x + y
後置インクリメント演算子
前置インクリメント演算子
加算演算子
T
T::subtract(x, y)
(*BigInt)
x --
-- x
x - y
後置デクリメント演算子
前置デクリメント演算子
減算演算子
T
T::leftShift(x, y)
(*BigInt)
x << y 左シフト演算子(<<) T
T::signedRightShift(x, y)
(*BigInt)
x >> y 符号付き右シフト演算子(>>) T
T::unsignedRightShift(x, y)
(*BigInt)
x >>> y 符号なし右シフト演算子(>>>)

T,
throw TypeError
T::lessThan(x, y)
(*BigInt)
x < y
x > y
x <= y
x >= y
関係演算子
抽象的関係比較
ブール値、
undefined
(順序なし入力の場合)
T::equal(x, y)
(*BigInt)
x == y
x != y
x === y
x !== y
等価演算子
厳密な等価比較
Boolean
T::sameValue(x, y)
(*BigInt)
正確な値の等価性をテストするための
SameValue ( x, y )を介した
オブジェクト内部メソッド

+0と-0は異なる値とみなす
Boolean
T::sameValueZero(x, y)
(*BigInt)
SameValueZero(xy)を介した
Array、Map、およびセットメソッド。
ゼロコホートのメンバー間の差異を無視して
値の等価性をテストします(例:-0および+0)。

+0と-0は同じ値とみなす
Boolean
T::bitwiseAND(x, y)
(*BigInt)
x & y バイナリビット演算子 T
T::bitwiseXOR(x, y)
(*BigInt)
x ^ y バイナリビット演算子 T
T::bitwiseOR(x, y)
(*BigInt)
x | y バイナリビット演算子 T
T::toString(x)
(*BigInt)
String(x) ToString(argument)を介した、多くの式と組み込み関数 String

T::unit値とT::op操作は、ECMAScript言語の一部ではありません。
ここでは、ECMAScript言語のセマンティクスの仕様を支援する目的でのみ定義されています。
他の抽象操作は、この仕様全体で定義されています。

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

ECMAScriptの最初および後続のエディションでは、特定の演算子に対して、精度を失うか切り捨てられる可能性のある暗黙の数値変換が提供されていました。これらは、下位互換性のために維持されていますが、プログラマエラーを最小限に抑え、将来のエディションで一般化された値タイプのオプションを開いたままにするために、BigIntでは提供されません。

6.1.6.1 数値型(The Number Type)

数値型は正確に18437736874454810627(つまり、264-253+3)の値を持ち、2進浮動小数点演算のIEEE標準で指定されている倍精度64ビット形式IEEE 754-2019 の値を表します。
ただし、IEEE標準の9007199254740990(つまり、253-2)を除く「Not-a-Number」値は、ECMAScriptでは単一の特別なNaN値として表されます。(NaN 値はプログラム式 NaN によって生成されることに注意してください。一部の実装では、外部コードはさまざまな Not-a-Number 値の違いを検出できる場合がありますが、そのような動作は実装に依存します。ECMAScriptコードに対して、すべてのNaN値は互いに区別できません。

Number値が格納された後にArrayBuffer(24.1を参照)またはSharedArrayBuffer(24.2による参照でアクセスされる可能性があるビットパターンは、ECMAScript実装で使用されるそのNumber値の内部表現と必ずしも同じではありません。

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

その他の18437736874454810624(つまり、264-253)の値は有限数と呼ばれます。これらの半分は正の数で、半分は負の数です。すべての有限の正の数値に対して、同じ大きさの対応する負の値があります。

正のゼロと負のゼロの両方があることに注意してください。 これらの値は、それぞれ記号+0および-0と記述されます。
(これらの2つの異なるゼロの数値は、プログラム式+0(または単に0)と-0によって生成されます。)

18437736874454810622(つまり、264-253-2)の有限非ゼロ値には、次の2種類があります。

18428729675200069632(つまり、264-254)は、次の形式で正規化されます

s × m × 2e

sは+1または-1mは253より小さく252以上の正の数学的整数eは-1074から971までの数学的整数です。

残りの9007199254740990(つまり、253-2)の値は、次の形式で非正規化されます

s × m × 2e

ここで、sは+1または-1mは252未満の正の数学的整数eは-1074です。

絶対値が253以下の正と負の数学的整数はすべて、数値型で表現できます(実際、数学整数0には+0と-0の2つの表現があります)。

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

数値

この仕様書では、「xの数値」という語句は、xが正確な実際の数学的量(πなどの無理数でさえあり得る)を表す場合、次の方法で選択された数値を意味します。

数値型のすべての有限値のセットを考えます。
-0が削除され、数値型で表現できない2つの追加値、つまり21024(+1×253×2971)と-21024(-1×253×2971)です。
xに値が最も近いこのセットのメンバーを選択します。
セットの2つの値が等しく近い場合は、仮数が偶数の値が選択されます。
この目的のために、2つの追加の値21024と-21024は、仮数をもつと見なされます。
最後に、21024を選択した場合は、それを+∞に置き換えます。
-21024を選択した場合は、それを-∞に置き換えます。
+0が選択された場合、xがゼロより小さい場合にのみ、それを-0で置き換えます。
他の選択された値は変更されずに使用されます。
結果は、xの数値です。
(この手順は、IEEE 754-2019 roundTiesToEvenモードの動作に正確に対応しています。)

一部のECMAScriptオペレーターは、-231から231-1まで、または0から216-1までの範囲など、特定範囲の整数のみを扱います。
これらの演算子はNumber型の任意の値を受け入れますが、最初に各値を範囲の整数値に変換します。7.1項の数値変換演算の説明を参照してください。

Number::unitの値は1です。

6.1.6.1.1 Number::unaryMinus ( x )
  1. xNaNなら、NaNを返す。
  2. xを否定した結果を返します。 (同じ大きさで反対の符号を持つ数値を返す)
6.1.6.1.2 Number::bitwiseNOT ( x )
  1. ! ToInt32(x)の結果をoldValueとする。
  2. oldValueにビットごとの補数を適用した結果を返す。(結果は符号付き32ビット整数)
6.1.6.1.3 Number::exponentiate ( base, exponent )

baseexponent乗した結果を実装依存の近似値で返します。

  • exponentNaNなら、結果はNaN
  • exponent+0なら、結果は1(※baseがNaNでも)
  • exponent-0なら、結果は1(※baseがNaNでも)
  • baseNaNexponentがゼロでないなら、結果はNaN
  • abs(base) > 1 でexponent+∞なら、結果は+∞
  • abs(base) > 1 でexponent-∞なら、結果は+0
  • abs(base) が 1 でexponent+∞なら、結果はNaN
  • abs(base) が 1 でexponent-∞なら、結果はNaN
  • abs(base) < 1 でexponent+∞なら、結果は+0
  • abs(base) < 1 でexponent-∞なら、結果は+∞
  • base+∞exponent > 0 なら、結果は+∞
  • base+∞exponent < 0 なら、結果は+0
  • base-∞exponent > 0 で、exponentが奇数の整数なら結果は-∞
  • base-∞exponent > 0 で、exponentが奇数の整数でないなら結果は+∞
  • base-∞exponent < 0 で、exponentが奇数の整数なら結果は-0
  • base-∞exponent < 0 で、exponentが奇数の整数でないなら結果は+0
  • base+0exponent > 0なら、結果は+0
  • base+0exponent < 0なら、結果は+∞
  • base-0exponent > 0 で、exponentが奇数の整数なら結果は-0
  • base-0exponent > 0 で、exponentが奇数の整数でないなら結果は+0
  • base-0exponent < 0 で、exponentが奇数の整数なら結果は-∞
  • base-0exponent < 0 で、exponentが奇数の整数でないなら結果は+∞
  • base < 0 で baseが有限の値で、exponentが有限の値で、exponent整数でないなら、結果はNaN
baseが1または-1で、exponent+Infinityまたは-Infinityである場合のbase ** exponentの結果は、IEEE 754-2019とは異なります。 ECMAScriptの最初のエディションでは、この操作に対してNaNの結果を指定しましたが、IEEE 754-2019のそれ以降のバージョンでは1を指定しました。互換性の理由から、ECMAScriptの履歴の動作は保持されます。
6.1.6.1.4 Number::multiply ( x, y )

* MultiplicativeOperatorは乗算を実行し、xとyの積を生成します。乗算は可換です。乗算の精度は有限であるため、ECMAScriptでは常に関連付けられるとは限りません。

可換(性):前後を入れ替えても結果が変わらないこと

浮動小数点乗算の結果は、IEEE 754-2019バイナリ倍精度演算の規則によって制御されます。

  • x,yいずれかがNaNの場合、結果はNaNになります。
  • 結果の符号は、両方のオペランドの符号が同じ場合は正、オペランドの符号が異なる場合は負になります。
  • 無限大にゼロを掛けると、NaNになります。
  • 無限大同士の乗算は、無限大になります。符号は、上で述べたルールによって決定されます。
  • 有限の非ゼロ値と無限大の乗算は、符号付き無限大になります。符号は、上で述べたルールによって決定されます。
  • 有限の非ゼロ値と無限大の乗算は、符号付き無限大になります。符号は、上で述べたルールによって決定されます。
  • 無限大もNaNも含まれない残りのケースでは、IEEE 754-2019 roundTiesToEvenモードを使用して積が計算され、最も近い表現可能な値に丸められます。値が大きすぎて表現できない場合、結果は無限大の適切な符号になります。値が小さすぎて表現できない場合、結果は適切な符号のゼロになります。ECMAScript言語は、IEEE 754-2019で定義されている段階的なアンダーフローのサポートを必要とします。
6.1.6.1.5 Number::divide ( x, y )

/ MultiplicativeOperatorは除算を実行し、xとyの商を生成します。xは被除数で、yは除数です。ECMAScriptは整数での除算をおこないません。すべての除算演算のオペランドと結果は、倍精度浮動小数点数です。除算の結果は、IEEE 754-2019演算の仕様によって決まります。

被除数x / 除数y
  • x,yいずれかがNaNの場合、結果はNaNになります。
  • 結果の符号は、両方のオペランドの符号が同じ場合は正、オペランドの符号が異なる場合は負になります。
  • 無限大同士の除算はNaNになります。
  • 無限大をゼロで除算すると、無限大になります。 符号は、上で述べたルールによって決定されます。
  • ゼロ以外の有限値と無限大の除算は、符号付き無限大になります。 符号は、上で述べたルールによって決定されます。
  • 有限値を無限大で除算するとゼロになります。 符号は、上で述べたルールによって決定されます。
  • ゼロをゼロで除算するとNaNになります。ゼロを他の有限値で除算すると、結果はゼロになり、符号は上で述べたルールによって決定されます。
  • ゼロ以外の有限値をゼロで除算すると、符号付きの無限大になります。符号は、上で述べたルールによって決定されます。
  • 無限、ゼロ、NaNのいずれも含まれていない残りのケースでは、商が計算されて、IEEE 754-2019 roundTiesToEvenモードを使用して最も近い表現可能な値に丸められます。値が大きすぎて表現できない場合、演算はオーバーフローします。 その結果、適切な適切な符号の無限大になります。値が小さすぎて表現できない場合、演算はアンダーフローし、結果は適切な符号のゼロになります。 ECMAScript言語は、IEEE 754-2019で定義されている段階的なアンダーフローのサポートを必要とします。
6.1.6.1.6 Number::remainder ( n, d )

% MultiplicativeOperatorは、暗黙の除算から残りのオペランドを生成します。 nは被除数、dは除数です。

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

% 演算子で計算された浮動小数点剰余演算の結果は、IEEE 754-2019 で定義された「剰余」操作とは異なります。IEEE 754-2019 の「剰余」演算は、切り捨て除算ではなく丸め除算から剰余を計算するため、その動作は通常の整数剰余演算子の動作とは異なります。代わりにECMAScriptは、Javaの整数剰余演算子に類似した動作をする % を定義しています。これは、Cライブラリ関数 fmod と比較できます。

ECMAScript浮動小数点剰余演算の結果は、IEEE演算の規則によって決まります。

  • n,dいずれかがNaNの場合、結果はNaNになります。
  • 結果の符号は被除数の符号と同じです。
  • 被除数が無限大、または除数がゼロ、またはその両方の場合、結果はNaNになります。
  • 被除数が有限で除数が無限大の場合、結果は被除数と等しくなります。
  • 被除数がゼロで、除数が非ゼロで有限の場合、結果は被除数と同じになります。
  • 無限大もゼロもNaNも含まれない残りのケースでは、被除数nおよび除数dからの浮動小数点剰余rは、数学的な関係 r = n -( d × q )によって定義されます。ここで、qn / dが負の場合に負、n / dが正の場合に正で、nとdの真の数学的商の大きさを超えずに、その大きさが可能な限り大きい整数です。 rは、IEEE 754-2019 roundTiesToEvenモードを使用して計算され、最も近い表現可能な値に丸められます。
nとdの真の数学的商の大きさを超えずに、その大きさが可能な限り大きい整数
→n/d(小数)の結果を超えない整数。
6.1.6.1.7 Number::add ( x, y )

+演算子は、xyの加算を実行し、オペランドの合計を生成します。

加算は可換演算ですが、必ずしも連想的ではありません。

加算の結果は、IEEE 754-2019バイナリ倍精度演算の規則を使用して決定されます。

  • いずれかのオペランドがNaNの場合、結果はNaNになります。
  • 符号が異なる無限大同士の合計結果はNaNです。
  • 符号が同じ無限大の合計結果は、同じ符号の無限大です。
  • 無限大と有限値の合計結果は、無限値のオペランドと同値です。
  • 負のゼロ同士の合計結果は-0です。 正のゼロ同士、または符号が異なるゼロの合計結果は+0です。
  • ゼロとゼロ以外の有限値の合計は、ゼロ以外の有限値と同値です。
  • 同じ大きさの非ゼロ有限値で符号が異なる値の合計結果は+0です。
  • 無限大もゼロもNaNも含まれず、オペランドの符号が同じであるか、大きさが異なる残りのケースでは、合計が計算され、IEEE 754-2019 roundTiesToEvenモードを使用して最も近い表現可能な値に丸められます。値が大きすぎて表現できない場合、演算はオーバーフローし、結果は無限大の適切な符号になります。 ECMAScript言語は、IEEE 754-2019で定義されている段階的なアンダーフローのサポートを必要とします。
6.1.6.1.8 Number::subtract ( x, y )

-演算子は、数値型の2つのオペランドに適用されると減算を実行し、その差を生成します。 xは被減数で、yは減数です。 x-yx +(-y)は常に同じ結果を生成します。

-演算子の結果は x +(-y)になります。

6.1.6.1.9 Number::leftShift ( x, y )
  1. ! ToInt32(x)の結果をlnumとする。
  2. ! ToUint32(y)の結果をrnumとする。
  3. rnumの最下位5ビット以外のすべてをマスク(rnum & 0x1F)した結果をshiftCountとします。
  4. lnumshiftCountビットだけ左シフトした結果を符号付き32ビット整数で返します。
6.1.6.1.10 Number::signedRightShift ( x, y )
  1. ! ToInt32(x)の結果をlnumとする。
  2. ! ToUint32(y)の結果をrnumとする。
  3. rnumの最下位5ビット以外のすべてをマスク(rnum & 0x1F)した結果をshiftCountとします。
  4. lnumshiftCountビットだけ符号拡張右シフトした結果を符号付き32ビット整数で返します。
符号拡張右シフト:右に1ビットシフトごとに、空いたビットにシフト前のビットと同じものをセットする。
(符号ビットを維持する)
6.1.6.1.11 Number::unsignedRightShift ( x, y )
  1. ! ToInt32(x)の結果をlnumとする。
  2. ! ToUint32(y)の結果をrnumとする。
  3. rnumの最下位5ビット以外のすべてをマスク(rnum & 0x1F)した結果をshiftCountとします。
  4. lnumshiftCountビットだけゼロ埋め右シフトした結果を符号なし32ビット整数で返します。
ゼロ埋め右シフト:右に1ビットシフトごとに、空いたビットに0をセットする。
(マイナス値はプラスになる)
6.1.6.1.12 Number::lessThan ( x, y )
  1. xNaNなら、undefinedを返す。
  2. yNaNなら、undefinedを返す。
  3. xyが同じNumber値なら、falseを返す。
  4. x+0y-0なら、falseを返す。
  5. x-0y+0なら、falseを返す。
  6. x+∞なら、falseを返す。
  7. y+∞なら、trueを返す。
  8. y-∞なら、falseを返す。
  9. x-∞なら、trueを返す。
  10. x数学値y数学値よりも小さい場合trueを返します。 それ以外の場合は、falseを返す。(数学値は有限であり、両方がゼロではないことに注意)
6.1.6.1.13 Number::equal ( x, y )
  1. xNaNなら、falseを返す。
  2. yNaNなら、falseを返す。
  3. xyが同じNumber値なら、trueを返す。
  4. x+0y-0なら、trueを返す。
  5. x-0y+0なら、trueを返す。
  6. falseを返す
6.1.6.1.14 Number::sameValue ( x, y )
  1. xNaNおよびyNaNなら、trueを返す。
  2. x+0y-0なら、falseを返す。
  3. x-0y+0なら、falseを返す。
  4. xyが同じNumber値なら、trueを返す。
  5. falseを返す
6.1.6.1.15 Number::sameValueZero ( x, y )
  1. xNaNおよびyNaNなら、trueを返す。
  2. x+0y-0なら、trueを返す。
  3. x-0y+0なら、trueを返す。
  4. xyが同じNumber値なら、trueを返す。
  5. falseを返す
6.1.6.1.16 NumberBitwiseOp ( op, x, y )
  1. ! ToInt32(x)の結果をlnumとする。
  2. ! ToUint32(y)の結果をrnumとする。
  3. lnumrnumにビット演算子opを適用した結果を符号付き32ビット整数で返す。
6.1.6.1.17 Number::bitwiseAND ( x, y )
  1. ! NumberBitwiseOp( & , x, y )の結果を返す。
6.1.6.1.18 Number::bitwiseXOR ( x, y )
  1. ! NumberBitwiseOp( ^ , x, y )の結果を返す。
6.1.6.1.19 Number::bitwiseOR ( x, y )
  1. ! NumberBitwiseOp( | , x, y )の結果を返す。
6.1.6.1.20 Number::toString ( x )

抽象演算Number::toStringは、次のように数値xをString形式に変換します。

  1. xがNaNなら、文字列"NaN"を返す
  2. xが+0または-0なら、文字列"0"を返す
  3. xがゼロより小さいなら、文字列"-"! Number::toString( - x ) の結果を文字列連結して返す。
    xはマイナスなので、-xはプラス
  4. xが+∞なら、文字列"Infinity"を返す
  5. nk、および sを次のように定義します。k ≧ 1、10k - 1s < 10k、でx=(s) × 10(n) - (k)で、kは一番小さい値。
    ksの10進数表現の桁数であり、sは10で割り切れないこと、およびsの最下位桁はこれらの基準によって必ずしも一意に決定されるわけではない。

    x = 123 のとき、x:123 = s:123 * 10n:3 - k:3
    x = 123.45 のとき、x:123.45 = s:12345 * 10n:3 - k:5
    x = 100 のとき、x:100 = s:1 * 10 n:3 - k:1
    x = 0.0123 のとき、x:0.0123 = s:123 * 10 n:-1 - k:3
  6. kn ≦ 21 のとき、次の文字列を順番に連結して返します。
    xが整数
    1. sの10進数表現をk桁で文字列化(先行ゼロなし)
    2. n - k 回 0x0030(DIGIT ZERO:"0" )を付加
  7. 0 ≦ n ≦ 21 のとき、次の文字列を順番に連結して返します。
    xが小数で0より大きい
    1. sの10進数表現を上からn桁だけ文字列化
    2. 0x002E(FULL STOP:"." )を付加
    3. sの10進数表現の残りのk - n桁を文字列化
  8. -6 ≦ n ≦ 0 のとき、次の文字列を順番に連結して返します。
    xが小数で0より小さい
    1. 0x0030(DIGIT ZERO:"0" )を付加
    2. 0x002E(FULL STOP:"." )を付加
    3. -n 回 0x0030(DIGIT ZERO:"0" )を付加
    4. sの10進数表現をk桁で文字列化
  9. k = 1 のとき、次の文字列を順番に連結して返します。
    xの桁が大きく10で割り切れる
    1. sを1桁文字列化
    2. 0x0065(LATIN SMALL LETTER E:"e" )を付加
    3. n - 1が正のとき0x002B(PLUS SIGN:"+")、負のとき0x002D(HYPHEN-MINUS:"-")を付加
    4. abs( n - 1 ) を10進整数で文字列化(先行ゼロなし)
  10. k = 1 のとき、次の文字列を順番に連結して返します。
    xの桁が大きく10で割り切れない
    1. sの10進表現で最上位桁を1文字だけ文字列化
    2. 0x002E(FULL STOP:"." )を付加
    3. sの10進数表現の残りのk - 1桁を文字列化
    4. 0x0065(LATIN SMALL LETTER E:"e" )を付加
    5. n - 1が正のとき0x002B(PLUS SIGN:"+")、負のとき0x002D(HYPHEN-MINUS:"-")を付加
    6. abs( n - 1 ) を10進整数で文字列化(先行ゼロなし)

次の項目は実装のガイドラインとして役立つかもしれませんが、この標準の規範的な要件の一部ではありません:

  • xが-0以外の数値の場合、ToNumber(ToString(x))の結果は、xと同じ数値です。
  • sの最下位桁は、ステップ5にリストされている要件によって常に一意に決定されるわけではありません。
上記のルールよりも正確な変換を提供する実装では、次の要件を手順5のガイドラインとして使用することをお勧めします。5.それ以外の場合、n、k、およびsをk ≧ 1、10k - 1 ≦ s < 10k のような整数とし、(s) × 10(n)-(k)の数値はxであり、kは可能な限り小さい値です。
sに複数の可能性がある場合は、(s) × 10(n) - (k)(x)に最も近いsの値を選択します。
そのようなsの値が2つある場合は、偶数の値を選択します。
kはsの10進数表現の桁数であり、sは10で割り切れないことに注意してください。
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). November 30, 1990. Available as
http://ampl.com/REFS/abstracts.html#rounding. Associated code available as
http://netlib.sandia.gov/fp/dtoa.c and as
http://netlib.sandia.gov/fp/g_fmt.c and may also be found at the various netlib mirror sites.

6.1.6.2 The BigInt Type

BigInt型は、数学的整数を表します。 値は任意のサイズにすることができ、特定のビット幅に限定されません。特に明記されていない限り、演算は数学に基づく正確な答えを返すように設計されています。バイナリ演算の場合、BigIntsは2の補数のバイナリ文字列として機能し、負の数はビットが無限に左側に設定されているものとして扱われます。

BigInt::unit の値は 1nです。

6.1.6.2.1 BigInt::unaryMinus ( x )
  1. x0n なら、0nを返す
  2. xを否定した数学的な値をBigInt値で返します。
6.1.6.2.2 BigInt::bitwiseNOT ( x )

引数xはBigInt型です。
抽象演算BigInt :: bitwiseNOTは、xの補数を返します。 つまり、-x-1です。

6.1.6.2.3 BigInt::exponentiate ( base, exponent )
  1. exponent0n なら、RangeError例外をスローする
  2. base0nexponent0nなら、1nを返す
  3. baseexponent乗した数値を表すBigInt値を返します
6.1.6.2.4 BigInt::multiply ( x, y )
掛け算

xyはBigInt型。
抽象演算BigInt :: multiplyは、xyの乗算の結果を表すBigInt値を返します。

結果のビット幅が入力よりはるかに大きい場合でも、正確な数学的数値が得られます。
6.1.6.2.5 BigInt::divide ( x, y )
割り算
  1. y0n なら、0nを返す
  2. xyで割った数学的数値を、quotientとする
  3. quotientを0に向かって丸め、得られたBigInt値を返します。
3.で丸めるため、2.の割り算の結果は整数ではない。
6.1.6.2.6 BigInt::remainder ( n, d )
余り
  1. d0n なら、0nを返す
  2. n0n なら、0n を返す
  3. n-(d×q)の結果をrとする。
    rおよびqはBigInt。
    またqは、n / dの値を正として考えたとき、その値を超えない一番大きい整数で、符号はn / dが負のとき負、正のとき正。
  4. rを返す
結果の符号は被除数の符号と同じです。
6.1.6.2.7 BigInt::add ( x, y )

xyはBigInt型。
抽象演算BigInt :: addは、xyの合計をBigInt値で返します。

6.1.6.2.8 BigInt::subtract ( x, y )

xyはBigInt型。
抽象演算BigInt :: subtractは、xからyを減算した結果をBigInt値で返します。

6.1.6.2.9 BigInt::leftShift ( x, y )

xyはBigInt型。
抽象演算BigInt :: leftShiftは、次の手順を実行します。

  1. y0nなら、
    x ÷ 2-yの結果をBigInt値を返す。負の数も含めて、最も近い整数に切り捨てられる。
  2. x × 2yの結果をBigInt値を返す。
ここでのセマンティクスはビット単位のシフトと同等であり、BigIntを2の2の補数の無限長の文字列として扱います。
6.1.6.2.10 BigInt::signedRightShift ( x, y )

xyはBigInt型。
抽象演算BigInt :: signedRightShiftは、次の手順を実行します。

  1. BigInt::leftShift(x, -y)の結果を返す。
6.1.6.2.11 BigInt::unsignedRightShift ( x, y )

xyはBigInt型。
抽象演算BigInt :: unsignedRightShiftは、次の手順を実行します。

BigInt型は実質的に符号なし右シフト演算子がない

  1. TypeError例外をスローする
BigInt型に符号なし右シフトはない!!
6.1.6.2.12 BigInt::lessThan ( x, y )

xyはBigInt型。
抽象演算BigInt :: lessThanは、xyより小さい場合はtrueを返し、そうでない場合はfalseを返します。

6.1.6.2.13 BigInt::equal ( x, y )

xyはBigInt型。
抽象演算BigInt :: equalは、xyが同じ数学整数値を持つ場合はtrueを返し、そうでない場合はfalseを返します。

6.1.6.2.14 BigInt::sameValue ( x, y )

xyはBigInt型。
抽象操作BigInt :: sameValueは、次の手順を実行します。

  1. BigInt::equal(x, y)の結果を返す。
6.1.6.2.15 BigInt::sameValueZero ( x, y )

xyはBigInt型。
抽象操作BigInt :: sameValueは、次の手順を実行します。

  1. BigInt::equal(x, y)の結果を返す。
6.1.6.2.16 BinaryAnd ( x, y )
  1. Assert: x は 0 または 1
  2. Assert: y は 0 または 1
  3. xy、両方1なら1を返す
  4. 0を返す
6.1.6.2.17 BinaryOr ( x, y )
  1. Assert: x は 0 または 1
  2. Assert: y は 0 または 1
  3. xy、どちらかが1なら1を返す
  4. 0を返す
6.1.6.2.18 BinaryXor ( x, y )
  1. Assert: x は 0 または 1
  2. Assert: y は 0 または 1
  3. xが1、yが0なら、1を返す
  4. xが0、yが1なら、1を返す
  5. 0を返す
6.1.6.2.19 BigIntBitwiseOp ( op, x, y )
    1. Assert: op は "&"、"|"、"^"のどれかひとつ
    2. 0nresultとする
    3. 0shiftとする
    4. (x = 0 or x = -1) and (y = 0 or y = -1) の条件を満たす間、次を繰り返す
      1. x modulo 2 の結果を xDigit とする
      2. y modulo 2 の結果を xDigit とする
      3. もしopが"&" なら
        result + 2shift × BinaryAnd(xDigit, yDigit)の結果を、resultにセット
      4. 上と異なり、もしopが"|" なら
        result + 2shift × BinaryOr(xDigit, yDigit)の結果を、resultにセット
      5. これまでの条件と一致しないなら
        1. Assert: op は "^"
        2. result + 2shift × BinaryXor(xDigit, yDigit)の結果を、resultにセット
      6. shift + 1shift にセット
      7. (x - xDigit) / 2x にセット
      8. (y - yDigit) / 2y にセット

もしopが"&" なら
BinaryAnd(x modulo 2, y modulo 2) の結果を tmp とする

上と異なり、もしopが"|" なら
BinaryOr(x modulo 2, y modulo 2) の結果を tmp とする

  • これまでの条件と一致しないなら
    1. Assert: op は "^"
    2. BinaryXor(x modulo 2, y modulo 2) の結果を tmp とする
  • tmpが0でないなら、
    1. result - 2shiftresult にセット
    2. 注:この処理は符号拡張をおこないます
  • result を返す

 

6.1.6.2.20 BigInt::bitwiseAND ( x, y )
  1. BigIntBitwiseOp("&", x, y)の結果を返す
6.1.6.2.21 BigInt::bitwiseXOR ( x, y )
  1. BigIntBitwiseOp("^", x, y)の結果を返す
6.1.6.2.22 BigInt::bitwiseOR ( x, y )
  1. BigIntBitwiseOp("|", x, y)の結果を返す
6.1.6.2.23 BigInt::toString ( x )

抽象演算BigInt :: toStringは、BigInt型のxを次の手順で文字列形式に変換します。

  1. x0より小さい場合、BigInt::toString( - x )の結果を返す
  2. xの10進数表現で構成される文字列値を返します。

6.1.7 オブジェクト型(The Object Type)

アクセサプロパティ

データプロパティ

オブジェクトは論理的にはプロパティのコレクションです。
各プロパティは、データプロパティまたはアクセサプロパティのどちらかです。

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

プロパティ名

プロパティはキー値を使用して識別されます。プロパティキー値は、ECMAScript文字列値またはシンボル値のいずれかです。空の文字列を含むすべての文字列と記号の値は、プロパティキーとして有効です。プロパティ名は、文字列値であるプロパティキーです。

整数インデックス

配列インデックス

整数インデックスは、正規の数値文字列(7.1.21を参照)で、+0または0 ≦ 253-1である整数文字列値のプロパティキーです。配列インデックスは、+0 ≦ i < 232-1の範囲にある数値iの整数インデックスです。

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

すべてのオブジェクトは論理的にプロパティのコレクションですが、プロパティにアクセスする方法が異なるオブジェクトがあります。オブジェクトの複数の形式の定義については、6.1.7.2を参照してください。

6.1.7.1 プロパティ属性(Property Attributes)

ここでは、オブジェクトプロパティの状態の定義および説明をおこないます。
データプロパティのキー値は、表3に示す属性に関連付けられます。

表3: データプロパティの属性
属性名 説明
[[Value]] ECMAScript言語型 プロパティのgetアクセスによって取得された値。
[[Writable]] Boolean falseの場合、次の操作は成功しません。
ECMAScriptコードが[[Set]]を使用して、
プロパティの[[Value]]属性を変更
[[Enumerable]] Boolean trueの場合、
プロパティはfor-in列挙によって列挙される(13.7.5を参照)。
それ以外の場合、プロパティは列挙されない。
(アクセサープロパティの[[Enumerable]]属性も参照)
[[Configurable]] Boolean falseの場合、次の操作は失敗する。
・プロパティの削除
・プロパティをアクセサプロパティへ変更
[[Value]]以外の属性の変更
(例えば[[Writable]]をfalseへ変更)
(アクセサープロパティの[[Configurable]]属性も参照)

アクセサープロパティは、キー値を表4にリストされている属性に関連付けます。

表4: アクセサープロパティの属性
属性名 説明
[[Get]] Object | Undefined 値がオブジェクトの場合、関数オブジェクトのみ設定可能です。
関数の[[Call]]内部メソッド(表7)は、
空の引数リストを指定して呼び出され、
プロパティのgetアクセスが実行されるたびに
プロパティ値を取得します。
(重要な内部メソッド[[Get]]参照)
[[Set]] Object | Undefined 値がオブジェクトの場合、関数オブジェクトのみ設定可能です。
関数の[[Call]]内部メソッド(表7)は、
プロパティのsetアクセスが実行されるたびに、
割り当てられた値を唯一の引数として呼び出されます。
プロパティの[[Set]] 内部メソッドは、
[[Get]]内部メソッドが返す値に影響を与える場合があります。
しかし必須ではありません。
(重要な内部メソッド[[Set]]参照)
[[Enumerable]] Boolean trueの場合、
プロパティはfor-in列挙によって列挙される(13.7.5を参照)。
それ以外の場合、プロパティは列挙されない。
[[Configurable]] Boolean falseの場合、次の操作は失敗する。
・プロパティの削除
・プロパティをデータプロパティへ変更
・属性の変更

プロパティの属性の初期値が明示されていない場合は、表5で定義されているデフォルト値が使用されます。

表5: 属性値のデフォルト
属性名 デフォルト値
[[Value]] undefined
[[Get]] undefined
[[Set]] undefined
[[Writable]] false
[[Enumerable]] false
[[Configurable]] false

6.1.7.2 オブジェクトの内部メソッドと内部スロット(Object Internal Methods and Internal Slots)

内部メソッド

ECMAScriptでのオブジェクトのセマンティクスは、内部メソッドと呼ばれるアルゴリズムによって指定されます。

ECMAScriptエンジンの各オブジェクトは、実行時の動作を定義する一連の内部メソッドに関連付けられています。
これらの内部メソッドはECMAScript言語の一部ではありません。これらは、この仕様によって説明目的で定義されています。
ただし、ECMAScriptの実装内の各オブジェクトは、それに関連付けられた内部メソッドの指定どおりに動作する必要があります。
これが実行方法は、実装によって決まります。

内部メソッド名は多態的です。つまり、異なるオブジェクトなら、同じ名前の内部メソッドでも異なるアルゴリズムが実行される可能性があります。内部メソッドを呼び出す実際のオブジェクトは、呼び出しの「ターゲット」です。オブジェクトがサポートしていない内部メソッドを使用しようとすると、TypeError例外がスローされます。

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

内部スロット

内部スロットは、オブジェクトに関連付けられ、さまざまなECMAScript仕様アルゴリズムによって使用される内部ステータスに対応しています。
内部スロットはオブジェクトのプロパティではなく、継承されません。

特定の内部スロット仕様に応じて、内部ステータスは、ECMAScript言語型の値または特定のECMAScript仕様型の値で構成されます。
特に明記されていない限り、内部スロットはオブジェクト作成時に割り当てられ、後から動的に追加されません。

特に指定のない限り、内部スロットの初期値はundefinedです。
この仕様内のアルゴリズムは、内部スロットを持つオブジェクトを作成します。
ただし、ECMAScript言語では、内部スロットをオブジェクトに直接関連付ける方法はありません。

二重角括弧[[]]

この仕様内で内部メソッドと内部スロットは、名前を二重角括弧[[]]で囲んで表現しています。

表6は、ECMAScriptコードによって作成または操作されるすべてのオブジェクトで使用される重要な内部メソッドをまとめたものです。
すべてのオブジェクトには、すべての重要な内部メソッドのアルゴリズムが必要です。
ただし、すべてのオブジェクトが必ずしも同じアルゴリズムを使用するわけではありません。

通常のオブジェクト

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

  • 表6にリストされている内部メソッドの場合、オブジェクトは9.1で定義されているメソッドを使用します。
  • オブジェクトに[[Call]]内部メソッドがある場合、9.2.1で定義されたものを使用します。
  • オブジェクトに[[Construct]]内部メソッドがある場合、9.2.2で定義されたメソッドを使用します。

エキゾチックなオブジェクト

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

この仕様では、オブジェクトの内部メソッドによって、エキゾチックオブジェクトの種類を特定しています。

Arrayエキゾチックオブジェクトバウンド関数エキゾチックオブジェクトなどはエキゾチックなオブジェクトですが、これらは内部メソッドが指定されています。これらのオブジェクトと同じ動作をするとしても、指定されたメソッドを持たないオブジェクトは、同じ種類とはみなされません。

表6などの「シグニチャー」列は、各内部メソッドの呼び出しパターンを説明しています。
呼び出しパターンには、括弧で囲まれた説明的なパラメーター名のリストが記載されています。パラメーター名がECMAScript型名と同じ場合、名前は型を示します。内部メソッドが明示的に値を返す場合、パラメーターリストの後に、記号「→」と戻り値の型名が記載されています。
「any」は、任意のECMAScript言語型であることを意味します。

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

内部メソッドは、通常の完了またはスロー完了で、暗黙的に戻り値をラップした完了レコードを返します。

表6: 重要な内部メソッド
内部メソッド シグニチャー 説明
[[GetPrototypeOf]] ( ) Object | Null オブジェクトの継承されたプロパティを提供するオブジェクトを返します。
継承されたプロパティがないならnull値を返します。
[[SetPrototypeOf]] (Object | Null) Boolean オブジェクトを、継承されたプロパティを提供する別のオブジェクトに関連付けます。
nullを渡すと、継承されたプロパティがないことを示します。
操作が正常に完了したことを示すtrueまたは操作が成功しなかったことを示すfalseを返します。
[[IsExtensible]] ( ) Boolean プロパティを追加することが許可されているかどうかを返します
[[PreventExtensions]] ( ) Boolean このオブジェクトに新しいプロパティを追加できるかどうかを制御します。
操作が成功した場合はtrueを返し、操作が失敗した場合はfalseを返します。
[[GetOwnProperty]] (propertyKey) Undefined | プロパティ記述子 キーがpropertyKeyである独自プロパティプロパティ記述子を返すか、
プロパティが存在しない場合はundefinedを返します。
[[DefineOwnProperty]] (propertyKey, PropertyDescriptor) Boolean キーがpropertyKeyである独自プロパティを作成または変更して、
PropertyDescriptorで記述された状態にします。
正常に処理された場合はtrueを返し、
処理できなかった場合はfalseを返します。
[[HasProperty]] (propertyKey) Boolean キーがpropertyKeyである独自プロパティまたは継承プロパティ
あるかどうかを示すブール値を返します。
[[Get]] (propertyKey, Receiver) any キーがpropertyKeyであるプロパティの値を返します。
プロパティ値を取得するためにECMAScriptコードを実行する必要がある場合、
コードを評価するときにthis値としてReceiverが使用されます。
[[Set]] (propertyKey, value, Receiver) Boolean キーがpropertyKeyであるプロパティの値をvalueに設定します。
プロパティ値を設定するためにECMAScriptコードを実行する必要がある場合、
コードを評価するときにthis値としてReceiverが使用されます。
プロパティ値が設定されている場合はtrueを返し、
設定できなかった場合はfalseを返します。
[[Delete]] (propertyKey) Boolean キーがpropertyKeyである独自プロパティを削除します。
プロパティが削除されておらず、まだ存在する場合はfalseを返します。
プロパティが削除されたか、存在しない場合はtrueを返します。
[[OwnPropertyKeys]] ( ) List型 of propertyKey すべての独自プロパティのキーList型を返します。

関数オブジェクト

コンストラクター

表7は、関数として呼び出されるオブジェクトがサポートすべき追加の内部メソッドをまとめたものです。
関数オブジェクトは、[[Call]]内部メソッドをサポートするオブジェクトです。
コンストラクタは、[[Construct]]内部メソッドをサポートするオブジェクトです。
[[Construct]]をサポートするすべてのオブジェクトは[[Call]]をサポートする必要があります。
つまり、すべてのコンストラクターは関数オブジェクトです。
したがって、コンストラクターは、コンストラクター関数またはコンストラクター関数オブジェクトと呼ばれることもあります。

表7: 関数オブジェクトの重要な追加内部メソッド
内部メソッド シグニチャー 説明
[[Call]] (any, a List型 of any) any このオブジェクトに関連付けられたコードを実行します。
関数呼び出し式を介して呼び出されます。
内部メソッドへの引数はthis値と、呼び出し式によって関数に渡された引数等のリストです。
この内部メソッドを実装するオブジェクトは呼び出し可能です。
[[Construct]] (a List型 of any, Object) Object オブジェクトを作成します。
new演算子またはsuper呼び出しを介して呼び出されます。
内部メソッドの最初の引数は、コンストラクター呼び出しまたはスーパー呼び出しの引数等のリストです。
2番目の引数は、new演算子が最初に適用されたオブジェクトです。
この内部メソッドを実装するオブジェクトは、コンストラクターと呼ばれます。
関数オブジェクトは必ずしもコンストラクタである必要はなく、
そのような非コンストラクタ関数オブジェクトには[[Construct]]内部メソッドはありません。

通常のオブジェクトと標準のエキゾチックなオブジェクトの基本的な内部メソッドのセマンティクスは、9章で指定されています。仕様で定義されているエキゾチックなオブジェクトの内部メソッドが実装でサポートされていない場合、その使用を試みるとTypeError例外をスローする必要があります。

6.1.7.3 重要な内部メソッドの不変条件(Invariants of the Essential Internal Methods)

ECMAScriptエンジンのオブジェクトの内部メソッドは、以下に指定する不変条件のリストに準拠する必要があります。
通常のオブジェクトと、この仕様のすべての標準エキゾチックなオブジェクトは、これらの不変条件を維持します。
ECMAScriptプロキシオブジェクトは、[[ProxyHandler]]オブジェクトで呼び出されたトラップの結果に対するランタイムチェックによってこれらの不変条件を維持します。

エキゾチックなオブジェクトを提供する実装は、不変条件を維持する必要があります。
不変条件に違反すると、ECMAScriptコードに予期しない動作が発生し、セキュリティの問題が発生する可能性があります。
ただし、これらの不変条件に違反しても、実装のメモリの安全性が損なわれることはありません。

実装では、不変条件を適用せずに必須の内部メソッドの機能を実行する代替インターフェースを提供するなどの方法で、不変条件を回避できないようにする必要があります。

定義:
  • 内部メソッドのターゲットは、内部メソッドが呼び出されるオブジェクトです。
  • [[IsExtensible]]内部メソッドからfalseを返すか、[[PreventExtensions]]内部メソッドからtrueを返すことが確認されている場合、拡張できません。
  • 存在しないプロパティとは、拡張不可能なターゲット上で独自プロパティとして存在しないプロパティです。
  • SameValueへのすべての参照は、SameValueアルゴリズムの定義に従っています。
拡張とは?
IsExtensibleが、プロパティを追加することが許可されているかどうかを返すので、拡張はプロパティの追加についてと思われる。
戻り値:

内部メソッドによって返される値は、次のいずれかを含む完了レコードです。

[[Type]] = normal、[[Target]] = empty、および[[Value]] =以降に示す内部メソッド「通常の戻り値の型」の値または、

[[Type]] = throw, [[Target]] = empty、および[[Value]] = any ECMAScript言語値

内部メソッドは、[[Type]] = continue、break、またはreturnを返してはいけません。
[[GetPrototypeOf]] ( )
  • 通常の戻り値の型はObjectまたはNullです。
  • targetが拡張不可能で、[[GetPrototypeOf]]が値Vを返す場合、[[GetPrototypeOf]]への今後の呼び出しは、Vと同じSameValueを返す必要があります。
オブジェクトのプロトタイプチェーンは有限である必要があります(つまり、任意のオブジェクトから開始して、[[GetPrototypeOf]]内部メソッドをその結果に再帰的に適用すると、最終的に値nullになります)。 ただし、プロトタイプチェーンに[[GetPrototypeOf]]の通常のオブジェクト定義を使用しないエキゾチックオブジェクトが含まれている場合、この要件はオブジェクトレベルの不変条件として適用できません。 このような循環プロトタイプチェーンは、無限ループになる可能性があります。
[[SetPrototypeOf]] ( V )
  • 通常の戻り値の型はブールです。
  • ターゲットが拡張できない場合、Vがターゲットの[[GetPrototypeOf]]値と同じ値でない限り、[[SetPrototypeOf]]はfalseを返す必要があります。
[[IsExtensible]] ( )
  • 通常の戻り値の型はブールです。
  • [[IsExtensible]]がfalseを返す場合、ターゲットでの[[IsExtensible]]への今後の呼び出しはすべてfalseを返す必要があります。
[[PreventExtensions]] ( )
  • 通常の戻り値の型はブールです。
  • [[PreventExtensions]]がtrueを返す場合、ターゲットでの[[IsExtensible]]への今後の呼び出しはすべてfalseを返す必要があり、ターゲットは拡張不可能と見なされます。
[[GetOwnProperty]] ( P )
  • 通常の戻り値の型はプロパティ記述子またはundefinedです。
  • 戻り値がプロパティ記述子である場合、その値はCompletePropertyDescriptorでなければなりません。
  • Pが構成および書き込みができないデータプロパティの場合、今後の[[GetOwnProperty]]P)の呼び出しはすべて、[[Value]]がSameValueであるプロパティ記述子をPの[[Value]]属性として返す必要があります。
  • [[Writable]]以外のPの属性が変更される可能性がある場合、またはプロパティが削除される可能性がある場合、Pの[[Configurable]]属性はtrueでなければなりません。
  • [[Writable]]属性がfalseからtrueに変わる可能性がある場合、[[Configurable]]属性はtrueでなければなりません。
  • ターゲットが拡張可能でなく、Pが存在しない場合、ターゲットの[[GetOwnProperty]]P)への今後の呼び出しはすべて、Pが存在しないことを示す必要があります(つまり、[[GetOwnProperty]]P)はundefinedを返す必要があります )。
3番目の不変条件の結果として、プロパティがデータプロパティとして記述され、時間の経過とともに異なる値を返す可能性がある場合、 [[Writable]]属性と[[Configurable]]属性のいずれかまたは両方がtrueでなければなりません。値を変更するメカニズムは、他の重要な内部メソッドを介して公開されます。
[[DefineOwnProperty]] ( P, Desc )
  • 通常の戻り値の型はブールです。
  • [[DefineOwnProperty]]は、Pがターゲットの構成不可能な独自プロパティとして以前に参照されている場合、以下のいずれかでない限り、falseを返す必要があります。
    1. Pは書き込み可能なデータプロパティです。 設定不可能な書き込み可能なデータプロパティは、設定不可能な書き込み不可能なデータプロパティに変更できます。
    2. Descのすべての属性は、Pの属性とSameValueです。
  • [[DefineOwnProperty]]PDesc)は、ターゲットが拡張不可能で、P独自プロパティとして存在しない場合、falseを返す必要があります。つまり、拡張不可能なターゲットオブジェクトを新しいプロパティで拡張することはできません。
9.1.6通常のオブジェクト.[[DefineOwnProperty]] ( P, Desc )
9.4.2.1Arrayエキゾチックオブジェクト.[[DefineOwnProperty]] ( P, Desc )
9.4.3.2Stringエキゾチックオブジェクト.[[DefineOwnProperty]] ( P, Desc )
9.4.4.2Argumentsエキゾチックオブジェクト.[[DefineOwnProperty]] ( P, Desc )
9.4.5.3Integer-Indexedエキゾチックオブジェクト.[[DefineOwnProperty]] ( P, Desc )
9.4.6.5Module Namespaceエキゾチックオブジェクト.[[DefineOwnProperty]] ( P, Desc )
9.5.6Proxyエキゾチックオブジェクト.[[DefineOwnProperty]] ( P, Desc )
[[HasProperty]] ( P )
  • 通常の戻り値の型はブールです。
  • Pが以前に構成が許可されていないデータまたはアクセサープロパティとして参照されていた場合、[[HasProperty]]はtrueを返す必要があります。
[[Get]] ( P, Receiver )
[[Set]] ( P, V, Receiver )
  • 通常の戻り値の型はブールです。
  • Pが構成不可能で書き込み不可なデータプロパティとして参照されている場合、VPの[[Value]]属性としてSameValueでない限り、[[Set]]はfalseを返す必要があります。
  • P[[Set]]属性がundefinedで構成不可能で書き込み不可なアクセサプロパティとして参照されている場合、[[Set]]操作はfalseを返す必要があります。
[[Delete]] ( P )
[[OwnPropertyKeys]] ( )
  • 通常の戻り値の型はList型です。
  • 返されるリストに、重複するエントリが含まれていてはいけません。
  • 返されるリストの各要素の型は、文字列またはシンボルです。
  • 返されるリストには、少なくとも、以前に確認されたすべての設定変更が許可されていないな独自プロパティのキーが含まれている必要があります。
  • オブジェクトが拡張可能でない場合、返されるリストには、[[GetOwnProperty]]を使用して参照できるすべてのプロパティのキーのみが含まれている必要があります。
[[Call]] ( )
[[Construct]] ( )
  • 通常の戻り値の型は オブジェクトです。

6.1.7.4 既知組み込みオブジェクト(Well-Known Intrinsic Objects)

既知組み込みオブジェクトは、この仕様のアルゴリズムで明示的に参照される組み込みオブジェクトであり、通常は固有のIDを持っています。
特に指定されていない限り、各組み込みオブジェクトは実際には、レルムごとに1つずつ、類似したオブジェクトのセットに対応しています。

この仕様で、%name%などの記述は、その名前に対応する、現在のレルムに関連付けられた組み込みオブジェクトを意味します。
%name.a.b%などの記述は、ECMAScriptコードが評価される前に、組み込みオブジェクト%name%が持つ aプロパティが持つ bプロパティにアクセスされることを意味します。カレントのレルムとその組み込みの決定については、8.3で説明します。

既知組み込みオブジェクトを表8に示します。

表8: 既知組み込みオブジェクト
固有名 グローバル名 ECMAScript言語との関連
%Array% Array Array コンストラクター
(22.1.1)
%ArrayBuffer% ArrayBuffer ArrayBuffer コンストラクター
(24.1.2)
%ArrayBufferPrototype% ArrayBuffer.prototype %ArrayBuffer%"prototype" データプロパティ の初期値。
つまり %ArrayBuffer.prototype%
%ArrayIteratorPrototype% Arrayイテレーターオブジェクトのプロトタイプ (22.1.5)。
つまり、 %ArrayIterator.prototype%
%ArrayPrototype% Array.prototype %Array%"prototype" データプロパティ の初期値(22.1.3)
つまり、 %Array.prototype%
%ArrayProto_entries% Array.prototype.entries %Array.prototype%"entries" データプロパティの初期値
(22.1.3.4)
つまり、 %Array.prototype.entries%
%ArrayProto_forEach% Array.prototype.forEach %Array.prototype%"forEach" データプロパティの初期値
(22.1.3.12);
つまり、 %Array.prototype.forEach%
%ArrayProto_keys% Array.prototype.keys %Array.prototype%"keys" データプロパティの初期値
(22.1.3.16)
つまり、 %Array.prototype.keys%
%ArrayProto_values% Array.prototype.values %Array.prototype%の"values" データプロパティの初期値
(22.1.3.32)
つまり、 %Array.prototype.values%
%AsyncFromSyncIteratorPrototype% async-from-syncイテレーターオブジェクトのプロトタイプ
(25.1.4)
%AsyncFunction% async関数オブジェクトのコンストラクター
(25.7.1)
%AsyncFunctionPrototype% %AsyncFunction%"prototype" データプロパティの初期値。
つまり、 %AsyncFunction.prototype%
%AsyncGenerator% %AsyncGeneratorFunction%"prototype"プロパティの初期値。
つまり、 %AsyncGeneratorFunction.prototype%
%AsyncGeneratorFunction% asyncイテレーターオブジェクトのコンストラクター
(25.3.1)
%AsyncGeneratorPrototype% %AsyncGenerator%"prototype"プロパティの初期値。
つまり、 %AsyncGenerator.prototype%
%AsyncIteratorPrototype% すべての標準の組み込みasyncイテレータオブジェクトが間接的に継承するオブジェクト
%Atomics% Atomics The Atomicsオブジェクト
(24.4)
%BigInt% BigInt BigInt コンストラクター
(20.2.1)
%BigInt64Array% BigInt64Array BigInt64Array コンストラクター
(22.2)
%BigUint64Array% BigUint64Array BigUint64Array コンストラクター
(22.2)
%Boolean% Boolean Boolean コンストラクター
(19.3.1)
%BooleanPrototype% Boolean.prototype %Boolean%"prototype" データプロパティの初期値
(19.3.3)
つまり、 %Boolean.prototype%
%DataView% DataView DataView コンストラクター
(24.3.2)
%DataViewPrototype% DataView.prototype %DataView%"prototype" データプロパティの初期値
つまり、 %DataView.prototype%
%Date% Date Date コンストラクター
(20.4.2)
%DatePrototype% Date.prototype %Date%"prototype" データプロパティの初期値
つまり、 %Date.prototype%
%decodeURI% decodeURI decodeURI関数
(18.2.6.2)
%decodeURIComponent% decodeURIComponent decodeURIComponent関数
(18.2.6.3)
%encodeURI% encodeURI encodeURI関数
(18.2.6.4)
%encodeURIComponent% encodeURIComponent encodeURIComponent関数
(18.2.6.5)
%Error% Error Error コンストラクター
(19.5.1)
%ErrorPrototype% Error.prototype %Error%"prototype" データプロパティの初期値
つまり、 %Error.prototype%
%eval% eval eval関数
(18.2.1)
%EvalError% EvalError EvalError コンストラクター
(19.5.5.1)
%EvalErrorPrototype% EvalError.prototype %EvalError%"prototype" データプロパティの初期値
つまり、 %EvalError.prototype%
%Float32Array% Float32Array Float32Array コンストラクター
(22.2)
%Float32ArrayPrototype% Float32Array.prototype %Float32Array%"prototype" データプロパティの初期値
つまり、 %Float32Array.prototype%
%Float64Array% Float64Array Float64Array コンストラクター
(22.2)
%Float64ArrayPrototype% Float64Array.prototype %Float64Array%"prototype" データプロパティの初期値
つまり、 %Float64Array.prototype%
%ForInIteratorPrototype% For-Inイテレーターオブジェクトのプロトタイプ
(13.7.5.16)
%Function% Function Function コンストラクター
(19.2.1)
%FunctionPrototype% Function.prototype %Function%"prototype" データプロパティの初期値
つまり、 %Function.prototype%
%Generator% %GeneratorFunction%"prototype" データプロパティの初期値
%GeneratorFunction% generatorオブジェクトのコンストラクター
(25.2.1)
%GeneratorPrototype% %Generator%"prototype" データプロパティの初期値
つまり、 %Generator.prototype%
%Int8Array% Int8Array Int8Array コンストラクター
(22.2)
%Int8ArrayPrototype% Int8Array.prototype %Int8Array%"prototype" データプロパティの初期値
つまり、 %Int8Array.prototype%
%Int16Array% Int16Array Int16Array コンストラクター
(22.2)
%Int16ArrayPrototype% Int16Array.prototype %Int16Array%"prototype" データプロパティの初期値
つまり、 %Int16Array.prototype%
%Int32Array% Int32Array Int32Array コンストラクター
(22.2)
%Int32ArrayPrototype% Int32Array.prototype %Int32Array%"prototype" データプロパティの初期値
つまり、 %Int32Array.prototype%
%isFinite% isFinite isFinite関数
(18.2.2)
%isNaN% isNaN isNaN関数
(18.2.3)
%IteratorPrototype% すべての標準の組み込みイテレータオブジェクトが間接的に継承するオブジェクト
%JSON% JSON JSONオブジェクト
(24.5)
%JSONParse% JSON.parse %JSON%"parse" データプロパティの初期値
つまり、 %JSON.parse%
%JSONStringify% JSON.stringify %JSON%"stringify" データプロパティの初期値
つまり、 %JSON.stringify%
%Map% Map Map コンストラクター
(23.1.1)
%MapIteratorPrototype% Mapイテレーターオブジェクトのプロトタイプ
(23.1.5)
%MapPrototype% Map.prototype %Map%"prototype" データプロパティの初期値
つまり、 %Map.prototype%
%Math% Math Mathオブジェクト
(20.3)
%Number% Number Number コンストラクター
(20.1.1)
%NumberPrototype% Number.prototype %Number%"prototype" データプロパティの初期値
つまり、 %Number.prototype%
%Object% Object Object コンストラクター
(19.1.1)
%ObjectPrototype% Object.prototype %Object%"prototype" データプロパティの初期値
つまり、 %Object.prototype%
%ObjProto_toString% Object.prototype.toString %Object.prototype%"toString" データプロパティの初期値
つまり、 %Object.prototype.toString%
%ObjProto_valueOf% Object.prototype.valueOf %Object.prototype%"valueOf" データプロパティの初期値
つまり、 %Object.prototype.valueOf%
%parseFloat% parseFloat parseFloat 関数
(18.2.4)
%parseInt% parseInt parseInt 関数
(18.2.5)
%Promise% Promise Promise コンストラクター
(25.6.3)
%PromisePrototype% Promise.prototype %Promise%"prototype" データプロパティの初期値
つまり、 %Promise.prototype%
%PromiseProto_then% Promise.prototype.then %Promise.prototype%"then" データプロパティの初期値
つまり、 %Promise.prototype.then%
%Promise_all% Promise.all %Promise%"all" データプロパティの初期値
(25.6.4.1)
つまり、 %Promise.all%
%Promise_reject% Promise.reject %Promise%"reject" データプロパティの初期値
(25.6.4.5)
つまり、 %Promise.reject%
%Promise_resolve% Promise.resolve %Promise%"resolve" データプロパティの初期値
(25.6.4.6)
つまり、 %Promise.resolve%
%Proxy% Proxy Proxy コンストラクター
(26.2.1)
%RangeError% RangeError RangeError コンストラクター
(19.5.5.2)
%RangeErrorPrototype% RangeError.prototype %RangeError%"prototype" データプロパティの初期値
つまり、 %RangeError.prototype%
%ReferenceError% ReferenceError ReferenceError コンストラクター
(19.5.5.3)
%ReferenceErrorPrototype% ReferenceError.prototype %ReferenceError%"prototype" データプロパティの初期値
つまり、 %ReferenceError.prototype%
%Reflect% Reflect Reflect オブジェクト
(26.1)
%RegExp% RegExp RegExp コンストラクター
(21.2.3)
%RegExpPrototype% RegExp.prototype %RegExp%"prototype" データプロパティ の初期値
つまり、 %RegExp.prototype%
%RegExpStringIteratorPrototype% RegExp Stringイテレーターオブジェクトのプロトタイプ
(21.2.7)
%Set% Set Set コンストラクター
(23.2.1)
%SetIteratorPrototype% Setイテレーターオブジェクトのプロトタイプ
(23.2.5)
%SetPrototype% Set.prototype %Set%"prototype" データプロパティの初期値
つまり、 %Set.prototype%
%SharedArrayBuffer% SharedArrayBuffer SharedArrayBuffer コンストラクター
(24.2.2)
%SharedArrayBufferPrototype% SharedArrayBuffer.prototype %SharedArrayBuffer%"prototype" データプロパティの初期値
つまり、 %SharedArrayBuffer.prototype%
%String% String String コンストラクター
(21.1.1)
%StringIteratorPrototype% Stringイテレーターオブジェクトのプロトタイプ
(21.1.5)
%StringPrototype% String.prototype %String%"prototype" データプロパティの初期値
つまり、 %String.prototype%
%Symbol% Symbol Symbol コンストラクター
(19.4.1)
%SymbolPrototype% Symbol.prototype %Symbol%"prototype" データプロパティの初期値
つまり、 %Symbol.prototype%
%SyntaxError% SyntaxError SyntaxError コンストラクター
(19.5.5.4)
%SyntaxErrorPrototype% SyntaxError.prototype %SyntaxError%"prototype" データプロパティの初期値
つまり、 %SyntaxError.prototype%
%ThrowTypeError% %TypeError%の新しいインスタンスを無条件にスローする関数オブジェクト
%TypedArray% 全てのtyped Array コンストラクターのスーパークラス
(22.2.1)
%TypedArrayPrototype% %TypedArray%"prototype" データプロパティの初期値
つまり、 %TypedArray.prototype%
%TypeError% TypeError TypeError コンストラクター
(19.5.5.5)
%TypeErrorPrototype% TypeError.prototype %TypeError%"prototype" データプロパティの初期値
つまり、 %TypeError.prototype%
%Uint8Array% Uint8Array Uint8Array コンストラクター
(22.2)
%Uint8ArrayPrototype% Uint8Array.prototype %Uint8Array%"prototype" データプロパティの初期値
つまり、 %Uint8Array.prototype%
%Uint8ClampedArray% Uint8ClampedArray Uint8ClampedArray コンストラクター
(22.2)
%Uint8ClampedArrayPrototype% Uint8ClampedArray.prototype %Uint8ClampedArray%"prototype" データプロパティの初期値
つまり、 %Uint8ClampedArray.prototype%
%Uint16Array% Uint16Array Uint16Array コンストラクター
(22.2)
%Uint16ArrayPrototype% Uint16Array.prototype %Uint16Array%"prototype" データプロパティの初期値
つまり、 %Uint16Array.prototype%
%Uint32Array% Uint32Array Uint32Array コンストラクター
(22.2)
%Uint32ArrayPrototype% Uint32Array.prototype %Uint32Array%"prototype" データプロパティの初期値
つまり、 %Uint32Array.prototype%
%URIError% URIError URIError コンストラクター
(19.5.5.6)
%URIErrorPrototype% URIError.prototype %URIError%"prototype" データプロパティの初期値
つまり、 %URIError.prototype%
%WeakMap% WeakMap WeakMap コンストラクター
(23.3.1)
%WeakMapPrototype% WeakMap.prototype %WeakMap%"prototype" データプロパティの初期値
つまり、 %WeakMap.prototype%
%WeakSet% WeakSet WeakSet コンストラクター
(23.4.1)
%WeakSetPrototype% WeakSet.prototype %WeakSet%"prototype" データプロパティの初期値
つまり、 %WeakSet.prototype%

6.2 ECMAScript仕様型(ECMAScript Specification Types)

仕様型は、ECMAScript言語構造およびECMAScript言語型のセマンティクスを記述するために、アルゴリズム内で使用されるメタ値に対応します。
仕様型には、参照、リスト、完了、プロパティ記述子、字句環境、環境レコード、抽象クロージャ、およびデータブロックが含まれます。
仕様型値は仕様上で有効で、ECMAScriptの実装上の特定のエンティティーに必ず対応しているわけではありません。
仕様型の値は、ECMAScript式評価の中間結果を記述するために使用できますが、そのような値は、オブジェクトのプロパティまたはECMAScript言語変数の値として格納できません。

6.2.1 リストとレコードの仕様型(The List and Record Specification Types)

List型

List型は、new式、関数呼び出し、および、単純な順序付きリストが必要なアルゴリズムで、引数リスト(12.3.8を参照)について説明するために使用されます。
List型の値は、リスト要素を単純に順序付けたシーケンスです。シーケンスの長さは任意です。要素は、0から始まるインデックスを使用してランダムにアクセスできます。表記上の便宜上、配列のような構文を使用してリスト要素にアクセスできます。たとえば、arguments [2]は、List引数の3番目の要素を表します。

«

»

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

Record型

Record型は、この仕様のアルゴリズム内のデータ構造を定義します。Recordタイプの値は、1つ以上の名前付きフィールドで構成されています。各フィールドの値は、ECMAScript値、またはRecord型に関連付けられた名前で表される抽象値です。フィールド名は常に[[Value]]のように二重括弧で囲まれます。

この仕様では、オブジェクトリテラルのような構文を使用してRecord値を表します。 たとえば、{[[Field1]]:42,[[Field2]]:false,[[Field3]]:empty}は、それぞれが特定の値に初期化される3つのフィールドを持つRecord値を定義します。 フィールド名の順序は重要ではありません。 明示的にリストされていないフィールドは存在しないと見なされます。

仕様テキストとアルゴリズムでは、ドット表記を使用してRecord値の特定のフィールドを参照できます。たとえば、R.[[Field2]]は「Rが所有する[[Field2]]という名前のフィールド」という意味です。

Record型には名前を付けることができ、その名前は、プレフィックスとして記述します。
例:PropertyDescriptor {[[Value]]:42,[[Writable]]:false,[[Configurable]]:true}

6.2.2 Set仕様型とRelation仕様型(The Set and Relation Specification Types)

Set型

Set型は、メモリモデルで使用する、順序付けられていない要素のコレクションです。Set型の値は要素の単純なコレクションで、要素は2回以上出現しません。 要素をSet型に追加したり、Set型から削除したりできます。 Set型は、結合、交差、または互いに差し引かれます。

Relation型

Relation型は、Set型の制約を説明するために使用されます。Relation型の値は、値領域内の値を順序付けたペアのSet型です。
たとえば、イベントのRelation型は、順番を保持したイベントのペアのSet型です。
Relation型Rと、Rの値領域に2つの値abがある場合、a R bは順序付けられたペア(ab)がRのメンバーであることを表します。
条件がいくつかある場合、Relation型は、一番小さな条件になります。

厳密な部分的順序

厳密な部分的順序とは、次の条件を満たすRelation型です。

    • Relation型Rabcを持っているとき
      • a R aではない
      • a R bかつb R cなら、a R c
上記の2つのプロパティは、順に、非反射性と推移性と呼ばれます。

厳密な総順序

厳密な総順序とは、次の条件を満たすRelation型です。

    • Relation型Rabcを持っているとき
      • abまたは、a R bまたはb R aと同じ
      • a R aではない
      • a R bかつb R cなら、a R c
上記の3つのプロパティは、順番に、全体性、非反射性、推移性と呼ばれます。

6.2.3 完了レコード仕様型(The Completion Record Specification Type)

Completion型

完了レコード

Completion型は、ローカルでない制御転送を実行するステートメント(breakcontinuereturnthrow)の動作などの値と制御フローの実行時伝搬を説明するために使用されるRelation型です。

Completion型の値は、フィールドが表9で定義されているレコード値です。このような値は、完了レコードと呼ばれます。

表9: 完了レコードのフィールド
フィールド名 意味
[[Type]] normalbreakcontinuereturnthrowのどれかひとつ 発生した完了のタイプ
[[Value]] ECMAScript言語値empty 結果の値
[[Target]] ECMAScript stringかempty 指示された制御転送のターゲットラベル

突然の完了

「突然の完了」という用語は、[[Type]]値がnormal以外の完了を指します。

6.2.3.1 Await

アルゴリズムは次の通り。

  1. Await(value)の結果をcompletionとする。

詳細は次の通り。

  1. 実行中の実行コンテキストasyncContextとする。
  2. ? PromiseResolve( %Promise% , value ) の結果をpromise とする。
  3. Await Fulfilled Functionsで定義されたアルゴリズムのステップをstepsFulfilled とする。
  4. ! CreateBuiltinFunction(stepsFulfilled, « [[AsyncContext]] »)の結果をonFulfilled とする。
  5. asyncContextonFulfilled.[[AsyncContext]]にセット。
  6. Await Rejected Functions定義されたアルゴリズムのステップをstepsRejectedとする。
  7. ! CreateBuiltinFunction(stepsRejected, « [[AsyncContext]] »)の結果をonRejected とする。
  8. asyncContext onRejected.[[AsyncContext]]にセット。
  9. ! PerformPromiseThen(promise, onFulfilled, onRejected)を実行。
  10. 実行コンテキストスタックからasyncContextを削除し、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する。
  11. Completion型completionで評価が再開されたとき、Awaitを呼び出したアルゴリズムの次の手順が実行され、completionが使用可能になるように、asyncContext のコード評価状態を設定します。
  12. リターンします
  13. 注:asyncContextの実行を再開した操作の実行に戻ります。

上記の手順のすべての変数は、完了を除き、一時的であり、Awaitに関連する手順でのみ表示されます。

Await は ? および ! プレフィックスと組み合わせることができます。
たとえば

  1. ? Await(value)の結果をresultとする

これは、次の意味です。

  1. Await(value)の結果をresultとする
  2. ReturnIfAbrupt(result)
6.2.3.1.1 Await Fulfilled Functions

Await Fulfilled Functionsは匿名の組み込み関数であり、Await仕様デバイスの一部として使用され、promiseの解決を通常の完了として呼び出し元に伝達します。Await Fulfilled Functionsには、[[AsyncContext]]内部スロットがあります。

引数値を指定してAwait Fulfilled Functionsが呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトFとする
  2. F.[[AsyncContext]]をasyncContext とする
  3. 実行中の実行コンテキストprevContext とする
  4. Suspend prevContext
  5. asyncContext実行コンテキストスタックにプッシュする。asyncContext実行中の実行コンテキストになる。
  6. NormalCompletion(value)を中断した操作の結果として、asyncContextの評価を再開します。
  7. Assert: このステップに到達すると、asyncContextはすでに実行コンテキストスタックから削除されている。またprevContext実行中の実行コンテキストである
  8. undefinedを返す

Await Fulfilled Functionsの「length」プロパティは1です。

6.2.3.1.2 Await Rejected Functions

Await Rejected Functionsは匿名の組み込み関数であり、Await仕様デバイスの一部として使用され、突然のスロー完了として、promise拒否理由を呼び出し元に伝達します。Await Rejected Functionsには、[[AsyncContext]]内部スロットがあります。

引数reasonを指定してAwait Rejected Functionsが呼び出されると、以下のステップが実行されます。

  1. アクティブ関数オブジェクトFとする
  2. F.[[AsyncContext]]をasyncContext とする
  3. 実行中の実行コンテキストprevContext とする
  4. Suspend prevContext
  5. asyncContext実行コンテキストスタックにプッシュする。asyncContext実行中の実行コンテキストになる。
  6. ThrowCompletion(reason)を中断した操作の結果として、asyncContextの評価を再開します。
  7. Assert: このステップに到達すると、asyncContextはすでに実行コンテキストスタックから削除されている。またprevContext実行中の実行コンテキストである
  8. undefinedを返す

Await Rejected Functionsの「length」プロパティは1です。

6.2.3.2 NormalCompletion

NormalCompletionは単一の引数を持つ抽象操作です。

  1. NormalCompletion(argument)の結果を返す

これは以下のように定義されます。

  1. Completion型{ [[Type]]: normal, [[Value]]: argument, [[Target]]: empty }を返す

6.2.3.3 ThrowCompletion

ThrowCompletionは単一の引数を持つ抽象操作です。

  1. ThrowCompletion(argument)の結果を返す

これは以下のように定義されます。

  1. Completion型{ [[Type]]: throw, [[Value]]: argument, [[Target]]: empty }を返す

6.2.3.4 UpdateEmpty ( completionRecord, value )

引数completeRecordvalueを持つ抽象操作UpdateEmptyは、以下のステップを実行します。

  1. Assert: completionRecord.[[Type]]がreturnまたはthrowなら、completionRecord.[[Value]]はemptyではない
  2. completionRecord.[[Value]]はemptyではないなら、completionRecordを返す
  3. Completion型{ [[Type]]: completionRecord.[[Type]], [[Value]]: value, [[Target]]: completionRecord.[[Target]] }を返す

6.2.4 Reference仕様型(The Reference Specification Type)

Reference型

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

基本値コンポーネント

参照名コンポーネント

厳密参照フラグ

Reference型は解決済みの名前またはプロパティバインディングです。Reference型は、基本値コンポーネント、参照名コンポーネント、ブール値の厳密参照フラグの3つのコンポーネントで構成されます。 基本値コンポーネントは、undefined、オブジェクト、ブール、文字列、シンボル、数値、BigInt、または環境レコードのいずれかです。 基本値コンポーネントがundefinedのとき、バインディングの解決ができなかったことを示します。 参照名コンポーネントは、文字列またはシンボルの値です。

スーパーリファレンス

スーパーリファレンスは、superキーワードを使用して作成される名前バインディングであるReference型です。 スーパーリファレンスにはthisValueコンポーネントが追加されており、そのベース値コンポーネントが環境レコードになることはありません。

この仕様では、次の抽象操作を使用して参照を操作します。

6.2.4.1 GetBase ( V )

6.2.4.2 GetReferencedName ( V )

6.2.4.3 IsStrictReference ( V )

6.2.4.4 HasPrimitiveBase ( V )

  1. Assert: Type(V)はReference型
  2. Type(V基本値コンポーネント)が、Boolean型、String型、Symbol型、 BigInt型、 Number型のどれかならtrueを、それ以外はfalseを返す。

6.2.4.5 IsPropertyReference ( V )

  1. Assert: Type(V)はReference型
  2. V基本値コンポーネントがオブジェクト、またはHasPrimitiveBase(V)の結果がtrueなら、trueを、それ以外はfalseを返す。

6.2.4.6 IsUnresolvableReference ( V )

  1. Assert: Type(V)はReference型
  2. V基本値コンポーネントundefinedならtrueを、それ以外はfalseを返す。

6.2.4.7 IsSuperReference ( V )

  1. Assert: Type(V)はReference型
  2. VthisValueコンポーネントならtrueを、それ以外はfalseを返す。

6.2.4.8 GetValue ( V )

  1. ReturnIfAbrupt(V)
  2. Type(V)がReference型でないなら、Vを返す
  3. GetBase(V)の結果をbaseとする
  4. IsUnresolvableReference(V)の結果がtrueなら、ReferenceError例外をスロー
  5. IsPropertyReference(V)の結果がtrueなら、
    1. HasPrimitiveBase(V)の結果がtrueなら、
      1. Assert: baseundefinedまたはnullではない
      2. ! ToObject(base)の結果をbaseにセット
    2. ? base.[[Get]](GetReferencedName(V), GetThisValue(V))を返す
  6. 5以外のとき
    1. Assert: base環境レコード
    2. ? base.GetBindingValue(GetReferencedName(V), IsStrictReference(V))を返す(8.1.1参照)
ステップ5.a.iiで作成されるオブジェクトは、上記の抽象操作と、通常のオブジェクト[[Get]]内部メソッド以外ではアクセスできません。 実装では、オブジェクトの作成を回避させる場合があります。

6.2.4.9 PutValue ( V, W )

  1. ReturnIfAbrupt(V)
  2. ReturnIfAbrupt(w)
  3. Type(V)がReference型でないなら、Vを返す
  4. GetBase(V)の結果をbaseとする
  5. IsUnresolvableReference(V)の結果がtrueなら、
    1. IsStrictReference(V))がtrueなら、
      1. ReferenceError例外をスローする
    2. GetGlobalObject()の結果をglobalObjとする
    3. ? Set(globalObj, GetReferencedName(V), W, false)の結果を返す
  6. IsPropertyReference(V)の結果がtrueなら、
    1. HasPrimitiveBase(V)の結果がtrueなら、
      1. Assert: baseundefinedまたはnullではない
      2. ! ToObject(base)の結果をbaseにセット
    2. ? base.[[Set]](GetReferencedName(V), W, GetThisValue(V))の結果をsucceeded とする
    3. succeeded falseIsStrictReference(V))がtrueなら、TypeError例外をスロー
    4. リターンする
  7. 5,6以外のとき
    1. Assert: base環境レコード
    2. ? base.SetMutableBinding(GetReferencedName(V), W ,IsStrictReference(V))を返す(8.1.1参照)
ステップ6.a.iiで作成される可能性のあるオブジェクトは、上記のアルゴリズムおよび通常のオブジェクト[[Set]]内部メソッドの外部からはアクセスできません。実装では、オブジェクトの作成を回避させる場合があります。

6.2.4.10 GetThisValue ( V )

  1. Assert: IsPropertyReference(V)の結果がtrue
  2. IsSuperReference(V)の結果がtrueなら
    1. VのthisValueコンポーネントを返す
  3. GetBase( V )の結果を返す

6.2.4.11 InitializeReferencedBinding ( V, W )

  1. ReturnIfAbrupt(V)
  2. ReturnIfAbrupt(w)
  3. Assert: Type(V)はReference型
  4. Assert: IsUnresolvableReference(V)の結果がfalse
  5. GetBase( V )の結果を baseとする
  6. Assert: base環境レコード
  7. base.InitializeBinding(GetReferencedName(V),W)の結果を返す

6.2.5 プロパティ記述子仕様型(The Property Descriptor Specification Type)

プロパティ記述子

PropertyDescriptor型

プロパティ記述子型は、オブジェクトプロパティ属性の操作と具体化を説明するために使用されます。プロパティ記述子型の値はレコードです。各フィールドの名前は属性名であり、その値は6.1.7.1で指定している属性値です。さらに、任意のフィールドが存在する場合と存在しない場合があります。この仕様内でプロパティ記述子レコードのリテラル記述にタグを付けるために使用されるスキーマ名は「PropertyDescriptor」です。

プロパティ記述子の値は、特定のフィールドの有無で、データプロパティ記述子とアクセサープロパティ記述子に分類できます。データプロパティ記述子は、[[Value]]または[[Writable]]というフィールドを持つ記述子です。アクセサープロパティ記述子は、[[Get]]または[[Set]]というフィールドを持つ記述子です。プロパティ記述子には、[[Enumerable]]および[[Configurable]]というフィールドがあります。プロパティ記述子の値は、データプロパティ記述子とアクセサープロパティ記述子の両方になることはできません。ただし、どちらでもない場合もあります。汎用プロパティ記述子は、データプロパティ記述子でもアクセサープロパティ記述子でもないプロパティ記述子値です。完全に入力されたプロパティ記述子は、アクセサープロパティ記述子またはデータプロパティ記述子のどちらかであり、それぞれ対応する表3または表4で定義されているすべてのフィールドを持っています。

この仕様では、次の抽象操作を使用して、プロパティ記述子の値を操作します。

6.2.5.1 IsAccessorDescriptor ( Desc )

抽象操作IsAccessorDescriptorがプロパティ記述子Descで呼び出されると、次の手順が実行されます。

  1. Descundefinedなら、falseを返す
  2. Desc.[[Get]]Desc.[[Set]]の両方が存在しない場合は、falseを返す。
  3. trueを返す

6.2.5.2 IsDataDescriptor ( Desc )

抽象演算IsDataDescriptorがプロパティ記述子Descで呼び出されると、次の手順が実行されます。

  1. Descundefinedなら、falseを返す
  2. Desc.[[Value]]Desc.[[Writable]]の両方が存在しない場合は、falseを返す。
  3. trueを返す

6.2.5.3 IsGenericDescriptor ( Desc )

抽象操作IsGenericDescriptorがプロパティ記述子Descで呼び出されると、次の手順が実行されます。

  1. Descundefinedなら、falseを返す
  2. IsAccessorDescriptor(Desc)とIsDataDescriptor(Desc)の両方の結果がfalseなら、trueを返す。
  3. falseを返す

6.2.5.4 FromPropertyDescriptor ( Desc )

抽象操作FromPropertyDescriptorがプロパティ記述子Descで呼び出されると、次の手順が実行されます。

  1. Descundefinedならundefinedを返す
  2. OrdinaryObjectCreate(%Object.prototype%)をobjとする
  3. Assert: 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.5.5 ToPropertyDescriptor ( Obj )

抽象演算ToPropertyDescriptorがオブジェクトObjで呼び出されると、次の手順が実行されます。

  1. Type(Obj)がオブジェクトでないなら、TypeError例外をスロー
  2. フィールドを持たない新しいプロパティ記述子descとする
  3. ? HasProperty(Obj, "enumerable")の結果をhasEnumerableとする
  4. hasEnumerabletrueなら
    1. ! ToBoolean(? Get(Obj, "enumerable"))の結果をenumerable とする
    2. enumerabledesc.[[Enumerable]]にセット
  5. ? HasProperty(Obj, "configurable")の結果をhasConfigurableとする
  6. hasConfigurabletrueなら
    1. ! ToBoolean(? Get(Obj, "configurable"))の結果をconfigurable とする
    2. configurabledesc.[[Configurable]]にセット
  7. ? HasProperty(Obj, "value")の結果をhasValueとする
  8. hasValuetrueなら
    1. ! ToBoolean(? Get(Obj, "value"))の結果をvalue とする
    2. valuedesc.[[Value]]にセット
  9. ? HasProperty(Obj, "writable")の結果をhasWritableとする
  10. hasWritabletrueなら
    1. ! ToBoolean(? Get(Obj, "writable"))の結果をwritable とする
    2. writabledesc.[[Writable]]にセット
  11. ? HasProperty(Obj, "get")の結果をhasGetとする
  12. hasGettrueなら
    1. ! ToBoolean(? Get(Obj, "get"))の結果をgetter とする
    2. IsCallable(getter)がfalseで、getterundefinedでないならTypeError例外をスロー
    3. getterdesc.[[Get]]にセット
  13. ? HasProperty(Obj, "set")の結果をhasSetとする
  14. hasSettrueなら
    1. ! ToBoolean(? Get(Obj, "set"))の結果をsetter とする
    2. IsCallable(setter)がfalseで、setterundefinedでないならTypeError例外をスロー
    3. setterdesc.[[Set]]にセット
  15. desc.[[Get]]desc.[[Set]]のどちらかが存在するなら
    1. desc.[[Value]]またはdesc.[[Writable]]が存在するなら、TypeError例外をスロー
  16. descを返す

6.2.5.6 CompletePropertyDescriptor ( Desc )

抽象操作CompletePropertyDescriptorがプロパティ記述子 Descで呼び出されると、次の手順が実行されます。

  1. Assert: Descプロパティ記述子
  2. Reference型{ [[Value]]: undefined, [[Writable]]: false, [[Get]]: undefined, [[Set]]: undefined, [[Enumerable]]: false, [[Configurable]]: false }をlikeとする
  3. IsGenericDescriptor( Desc )がtrue、またはIsDataDescriptor( Desc )がtrueなら
    1. Desc[[Value]]フィールドを持っていないなら、like.[[Value]]をDesc.[[Value]]にセット
    2. Desc[[Writable]]フィールドを持っていないなら、like.[[Writable]]をDesc.[[Writable]]にセット
  4. 3でないとき
    1. Desc[[Get]]フィールドを持っていないなら、like.[[Get]]Desc.[[Get]]にセット
    2. Desc[[Set]]フィールドを持っていないなら、like.[[Set]]Desc.[[Set]]にセット
  5. Desc[[Enumerable]] フィールドを持っていないなら、like.[[Enumerable]]をDesc.[[Enumerable]]にセット
  6. Desc[[Configurable]]フィールドを持っていないなら、like.[[Configurable]]をDesc.[[Configurable]]にセット
  7. Descを返す

6.2.6 レキシカル環境と環境レコードの仕様型(The Lexical Environment and Environment Record Specification Types)

レキシカル環境環境レコード型は、ネストされた関数とブロックでの名前解決の動作を説明するために使用されます。これらの型とそれらに対する操作は、8.1で定義されています。

6.2.7 抽象クロージャ仕様型(The Abstract Closure Specification Type)

抽象クロージャ

抽象クロージャ仕様型は、値のコレクションとともにアルゴリズムのステップを参照するために使用されます。抽象クロージャはメタ値であり、closurearg1arg2)などの関数アプリケーションスタイルを使用して呼び出されます。抽象操作と同様に、呼び出しは、抽象クロージャによって記述されたアルゴリズムのステップを実行します。

抽象クロージャを作成するアルゴリズムステップでは、値は「キャプチャ」という動詞でキャプチャされ、その後にエイリアスのリストが続きます。 抽象クロージャが作成されると、その時点で各エイリアスに関連付けられている値が取得されます。抽象クロージャが呼び出されたときに実行されるアルゴリズムを指定する手順では、キャプチャされた各値は、値のキャプチャに使用されたエイリアスによって参照されます。

抽象クロージャが完了レコードを返す場合、そのレコードの[[Type]]はnormalまたはthrowでなければなりません。

次の例のように、抽象クロージャは他のアルゴリズムの一部としてインラインで作成されます。

  1. 41をaddendとする
  2. 呼び出されたときに、キャプチャーしたaddendとパラメーターxを使って次のコードを実行する抽象クロージャを、closureとする
    1. x + addendの結果を返す
  3. closure(1)の結果をvalとする
  4. Assert: valは42

6.2.8 データブロック(Data Blocks)

データブロック仕様型は、バイトサイズ(8ビット)の数値の明確で変更可能なシーケンスを記述するために使用されます。データブロック値は、初期値が0である固定バイト数で作成されます。

この仕様内では、配列のような構文を使用して、データブロック値の個々のバイトにアクセスします。この表記は、データブロック値を、0から始まる整数インデックス付きのバイトシーケンスとして表します。 たとえば、dbが5バイトのデータブロック値の場合、db [2]を使用して3番目のバイトにアクセスできます。

共有データブロック

複数のエージェントから同時に参照可能なメモリに常駐するデータブロックを、共有データブロックと呼びます。共有データブロックには、(共有データブロックの値を同等にテストするための)IDがあります。これはアドレスフリーです。つまりプロセスでマップしているブロックの仮想アドレスではなく、メモリ内の一連の場所に関連付けられています。2つのデータブロックが等しいのは、それらに含まれる場所のセットが等しい場合のみです。そうでない場合、それらは等しくなく、それらに含まれるロケーションのセットの共通部分は空になります。
共有データブロックはデータブロックと区別できます。

共有データブロックのセマンティクスは、メモリモデルによって共有データブロックイベントを使用して定義されます。以下の抽象操作は、共有データブロックイベントを参照し、評価セマンティクスとメモリモデルのイベントセマンティクスの間のインターフェイスとして機能します。イベントは、メモリモデルがフィルターとして機能する実行候補を形成します。 完全なセマンティクスについては、メモリモデルを参照してください。

共有データブロックイベントは、メモリモデルで定義されたレコードによってモデル化されます。

この仕様では、次の抽象演算を使用して、データブロックの値を操作します。

6.2.8.1 CreateByteDataBlock ( size )

抽象操作CreateByteDataBlockが整数の引数sizeで呼び出されると、次の手順が実行されます。

  1. Assert: size ≧ 0
  2. sizeバイトで構成される新しいデータブロック値をdbとする。データブロックを作成できないときは、RangeError例外をスローする
  3. dbの全てのバイトに0をセットする
  4. dbを返す

6.2.8.2 CreateSharedByteDataBlock ( size )

抽象操作CreateSharedByteDataBlockが整数の引数sizeで呼び出されると、次の手順が実行されます。

  1. Assert: size ≧ 0
  2. sizeバイトで構成される新しい共有データブロック値をdbとする。共有データブロックを作成できないときは、RangeError例外をスローする
  3. サラウンディングエージェントエージェントレコードの[[CandidateExecution]] フィールドをexecutionとする
  4. [[AgentSignifier]]AgentSignifier()の結果と同じexecution.[[EventsRecords]]の[[EventList]]をeventListとする。
  5. « 0 »zeroとする
  6. dbのインデックスをiでfor eachする
    1. eventListWriteSharedMemoryレコード型 { [[Order]]: Init, [[NoTear]]: true, [[Block]]: db, [[ByteIndex]]: i, [[ElementSize]]: 1, [[Payload]]: zero }
  7. dbを返す

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

抽象操作CopyDataBlockBytesが呼び出されると、次の手順が実行されます。

  1. Assert: fromBlocktoBlockは、データブロックまたは共有データブロック
  2. Assert: fromIndextoIndexcount は、0以上の整数
  3. fromBlockのバイト数をfromSizeとする
  4. Assert: fromIndex + count fromSize
  5. toBlockのバイト数をtoSizeとする
  6. Assert: toIndex + count toSize
  7. countが0より大きい間、次を繰り返す
    1. fromBlock共有データブロックなら
      1. サラウンディングエージェントエージェントレコードの[[CandidateExecution]] フィールドをexecutionとする
      2. [[AgentSignifier]]AgentSignifier()の結果と同じexecution.[[EventsRecords]]の[[EventList]]をeventListとする。
      3. 非決定的に選択されたバイト値を含む長さ1 のListbytesとする。
      4. 注 : 実装では、バイトは、基になるハードウェア上の非アトミック読み取り命令の結果である。非決定性は、弱い一貫性を持つハードウェアの観察可能な挙動を記述するためのメモリモデルの意味的処方である
      5. ReadSharedMemoryレコード型{ [[Order]]: Unordered, [[NoTear]]: true, [[Block]]: fromBlock, [[ByteIndex]]: fromIndex, [[ElementSize]]: 1 }をreadEventとする
      6. readEventeventListに追加
      7. 選択値レコード型{ [[Event]]: readEvent, [[ChosenValue]]: bytes }をexecution.[[ChosenValues]]に追加
      8. toBlock共有データブロックなら
        1. WriteSharedMemoryレコード型{ [[Order]]: Unordered, [[NoTear]]: true, [[Block]]: toBlock, [[ByteIndex]]: toIndex, [[ElementSize]]: 1, [[Payload]]: bytes }をeventListに追加
      9. ⅷの条件とは異なるなら
        1. bytes[0]をtoBlock[toIndex]にセット
    2. aの条件と異なるなら
      1. Assert: toBlock共有データブロックではない
      2. fromBlock[fromIndex]をtoBlock[toIndex]にセット
    3. toIndex + 1toIndexにセット
    4. fromIndex + 1fromIndexにセット
    5. count - 1countにセット
  8. NormalCompletion(empty)の結果を返す