これらの操作はECMAScript言語の一部ではありません。ここでは、ECMAScript言語のセマンティクスの仕様を支援する目的で定義されています。その他の、より専門的な抽象操作は、この仕様全体で定義しています。
7.1 型変換(Type Conversion)
ECMAScript言語は、必要に応じて暗黙的に自動型変換を実行します。特定の構造のセマンティクスを明確にするには、一連の変換抽象演算を定義します。 変換の抽象操作は多態的です。 ECMAScript言語型の値を受け入れることができます。 ただし、これらの操作では他の仕様型は使用されません。
BigInt型には、ECMAScript言語での暗黙的な変換はありません。 プログラマーはBigIntを明示的に呼び出して、他の型から値を変換する必要があります。
7.1.1 ToPrimitive ( input [ , PreferredType ] )
抽象演算ToPrimitiveは、引数inputとオプション引数PreferredTypeを取ります。 抽象演算ToPrimitiveは、そのinputを非オブジェクト型に変換します。 オブジェクトが複数のプリミティブ型に変換できる場合は、オプションのヒントPreferredTypeを使用してその型を優先することができます。 次のアルゴリズムに従って変換が行われます。
- Assert: inputはECMAScript言語値
- Type(input)がオブジェクトなら
- PreferredType がないなら、"default"をhint とする。
- PreferredType がヒントStringなら、"string"をhint とする。
- a,b以外なら、
- ? GetMethod(input, @@toPrimitive)の結果をexoticToPrimとする
- exoticToPrimがundefinedでないなら
- hintが"default"なら、"number"をhintにセットする
- ? OrdinaryToPrimitive(input, hint)の結果を返す
- inputを返す
7.1.1.1 OrdinaryToPrimitive ( O, hint )
抽象操作OrdinaryToPrimitiveが引数Oとヒントhintを指定して呼び出されると、次の手順が実行されます。
7.1.2 ToBoolean ( argument )
抽象演算ToBooleanは、表10に従ってargumentをBoolean型の値に変換します。
Argumentの型 | 変換結果 |
---|---|
Undefined | falseを返す |
Null | falseを返す |
Boolean | Argumentを返す |
Number | Argumentが+0か-0かNaNなら、falseを、そ例外はtrueを返す |
String | Argumentが長さ0の空文字ならfalseを、それ以外ならtrueを返す |
Symbol | trueを返す |
BigInt | Argumentが0nならfalseを、それ以外ならtrueを返す |
Object | trueを返す |
7.1.3 ToNumeric ( value )
抽象演算ToNumericは、数値型またはBigInt型の数値に変換した値を返します。この抽象操作は次のように機能します。
7.1.4 ToNumber ( argument )
抽象演算ToNumberは、表11に従ってargumentを数値型の値に変換します。
Argumentの型 | 変換結果 |
---|---|
Undefined | NaNを返す |
Null | +0を返す |
Boolean | Argumentがtrueなら1を、falseなら+0を返す |
Number | Argumentをそのまま返す |
String | 以下の文法と変換アルゴリズムを参照してください。(7.1.4.1) |
Symbol | TypeError例外をスロー |
BigInt | TypeError例外をスロー |
Object | 次の手順をおこなう
|
7.1.4.1 ToNumberに文字列型を適用する(ToNumber Applied to the String Type)
ToNumberに文字列型を適用する場合、UTF-16エンコードされたコードポイントのシーケンスとして解釈される入力文字列に次の文法を適用します(6.1.4)。
文法が文字列をStringNumericLiteralの拡張として解釈できない場合、ToNumberの結果はNaNになります。
StrDecimalLiteral :::
StrUnsignedDecimalLiteral
+ StrUnsignedDecimalLiteral
- StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral :::
Infinity
DecimalDigits . DecimalDigitsopt ExponentPartopt
. DecimalDigitsopt ExponentPartopt
DecimalDigitsopt ExponentPartopt
上記で定義されていないすべての文法記号は、数値リテラルのレキシカル文法で定義されています(11.8.3)
StringNumericLiteralとNumericLiteralの構文にはいくつかの違いがあります。
- StringNumericLiteralは、先頭と末尾に空白または行末記号を含めることができます。
- 10進数のStringNumericLiteralは、任意の数の先行0を持つことができます。
- 10進数のStringNumericLiteralには、符号を示す+または-を含めることができます。
- 空または空白のみを含むStringNumericLiteralは+0に変換されます。
- Infinityおよび-InfinityはStringNumericLiteralとして認識されますが、NumericLiteralとしては認識されません
- StringNumericLiteralにBigIntLiteralSuffix
を含めることはできません。
7.1.4.1.1 実行時セマンティクス:MV(Runtime Semantics: MV)
文字列から数値への変換は、数値リテラルから実際の数値に変換(11.8.3を参照)と似ています。しかし詳細の一部が異なるため、ここでは文字列数値リテラルを数値型の値に変換するプロセスを示します。
この値は2つのステップで決定されます。最初に、文字列数値リテラルが数学的数値(MV)に変換されます。 次に、変換した値を以下の方法で丸められます。以下に記載されていない文法記号のMVは、11.8.3.1で定義されています。
- StringNumericLiteral ::: [empty] のMVは、0
- StringNumericLiteral ::: StrWhiteSpace のMVは、0
- StringNumericLiteral ::: StrWhiteSpaceopt class="em"StrNumericLiteral StrWhiteSpaceopt のMVは、空白が存在するかどうかに関係なく、StringNumericLiteral のMV
- StrNumericLiteral ::: StrDecimalLiteral のMVは、StrDecimalLiteral のMV
- StrNumericLiteral ::: NonDecimalIntegerLiteral のMVは、NonDecimalIntegerLiteralのMV
- TStrDecimalLiteral ::: StrUnsignedDecimalLiteral のMVは、StrUnsignedDecimalLiteral のMV
- StrDecimalLiteral ::: +StrUnsignedDecimalLiteral のMVは StrUnsignedDecimalLiteral のMV
- StrDecimalLiteral ::: -StrUnsignedDecimalLiteral のMVは StrUnsignedDecimalLiteral のMVの負数。
(StrUnsignedDecimalLiteralのMVが0の場合、このMVの負の値も0です。以下で説明する丸め規則は、この符号なし数学的ゼロから浮動小数点+0または-0への変換を適切に処理します。) - StrUnsignedDecimalLiteral ::: Infinity のMVは 1010000 (+∞に丸めるほど大きな値).
- StrUnsignedDecimalLiteral ::: DecimalDigits . のMVは、DecimalDigitsのMV
- StrUnsignedDecimalLiteral ::: DecimalDigits . DecimalDigits のMVは、一番目のDecimalDigitsのMVと、2番目のDecimalDigitsのMVに10-nを掛けたものを足したもの。(nは2番目のDecimalDigitsのコードポイント数(桁数)の数学的値)
- StrUnsignedDecimalLiteral ::: DecimalDigits . ExponentPart のMVは、 DecimalDigitsに10eを掛けたMV(eはExponentPartのMV)
- StrUnsignedDecimalLiteral ::: DecimalDigits . DecimalDigits ExponentPart のMVは、一番目のDecimalDigitsのMVと、2番目のDecimalDigitsのMVに10-nを掛けたものを足した値に、10eを掛けたもの(nは2番目のDecimalDigitsのコードポイント数(桁数)の数学的値。eはExponentPartのMV)
- StrUnsignedDecimalLiteral ::: . DecimalDigits のMVは、DecimalDigitsのMVに10-nを掛けたもの(nはDecimalDigitsのコードポイント数(桁数)の数学的値。)
- StrUnsignedDecimalLiteral ::: . DecimalDigits ExponentPart のMVは、DecimalDigitsのMVに10e-ℝnを掛けた値。nはDecimalDigitsのコードポイント数の数学的値、eはExponentPartのMV。
- StrUnsignedDecimalLiteral ::: DecimalDigits のMVは、DecimalDigitsのMV
- StrUnsignedDecimalLiteral ::: DecimalDigits ExponentPart のMVは、DecimalDigitsに10eを掛けたMV(eはExponentPartのMV)
文字列数値リテラルの正確なMVが決定されると、数値型の値に丸められます。MVが0で、文字列数値リテラルの最初の非空白コードポイントが-でないなら、丸めた値は+0です。-なら、丸めた値は-0です。
MVが0でないなら、丸めた値はMVの数値(6.1.6.1参照)です。
ただし、リテラルにStrUnsignedDecimalLiteralが含まれ、リテラルの有効数字20桁以上の場合、 リテラルの20文字以降は0に置き換える、または0に置き換えて20番目を+1して得たリテラルをMVの数値とします。
数字がExponentPartの一部ではなく0でない、または(0のとき)、左方向にゼロ以外の数字があり、右方向にExponentPartではないゼロ以外の数字があるとき、その数字は有効です。
7.1.5 ToInteger ( argument )
抽象演算ToIntegerは、argumentを整数の数値に変換します。 この抽象操作は次のように処理します。
7.1.6 ToInt32 ( argument )
抽象演算ToInt32は、argumentを-231~231-1の範囲の232個の整数値のいずれかに変換します。 この抽象操作は次のように処理します。
上記のToInt32の定義を前提とします。
- ToInt32抽象操作はべき等です。生成された値は、2回目の呼び出しで変更されません。
- ToInt32( ToUint32( x ) )は、xのすべての値でToInt32( x )と等しくなります。(+∞と-∞が+0にマッピングされるのは、この後者のプロパティを保持するためです。)
- ToInt32は-0~+0をマッピングします。
7.1.7 ToUint32 ( argument )
抽象演算ToUint32は、argumentを0~232-1の範囲の232個の整数値のいずれかに変換します。 この抽象操作は次のように処理します。
上記のToUint32の定義より、
- ToUint32とToInt32は手順5が異なります。
- ToUint32抽象操作はべき等です。生成された値は、2回目の呼び出しで変更されません。
- ToUint32( ToUint32( x ) )は、xのすべての値でToUint32( x )と等しくなります。(+∞と-∞が+0にマッピングされるのは、この後者のプロパティを保持するためです。)
- ToUint32は-0~+0をマッピングします。
7.1.8 ToInt16 ( argument )
抽象演算ToInt16は、argumentを-32768~32767の範囲の216個の整数値のいずれかに変換します。この抽象操作は次のように処理します。
7.1.9 ToUint16 ( argument )
抽象演算ToUint16は、argumentを0〜216-1の範囲の216個の整数値のいずれかに変換します。この抽象操作は次のように処理します。
上記のToUint16の定義を前提とします。
- ToUint32とToUint16の違いは、手順4の232を216に置き換えた点だけです。
- ToUint16は-0~+0をマッピングします。
7.1.10 ToInt8 ( argument )
抽象演算ToInt8は、argumentを-128から127までの範囲の28個の整数値のいずれかに変換します。 この抽象操作は次のように処理します。
7.1.11 ToUint8 ( argument )
抽象演算ToUint8は、argumentを0〜255の範囲の28の整数値のいずれかに変換します。 この抽象操作は次のように処理します。
7.1.12 ToUint8Clamp ( argument )
抽象演算ToUint8Clampは、argumentを0〜255の範囲の28の整数値のいずれかに変換します。 この抽象操作は次のように機能します。
number:3.6 => f:3 => (3 + 0.5 < 3.6) なので、4を返す
number:3.4 => f:3 => (3.4 < 3 + 0.5) なので、3を返す
number の小数が.5のとき、6.と7.は一致しない。
このとき8.は、
number:3.5 => f:3 => 奇数なので4を返す
number:2.5 => f:2 => 偶数なので2を返す
7.1.13 ToBigInt ( argument )
抽象演算ToBigIntは、argumentをBigInt値に変換するか、Numberからの暗黙的な変換が必要な場合にスローします。
- ? ToPrimitive(argument , ヒント Number ) の結果を prim とする
- 表12に対応する値を返します。
argumentの型 | 結果 |
---|---|
Undefined | TypeError例外をスロー |
Null | TypeError例外をスロー |
Boolean | primが true なら 1n を、false なら 0n を返す |
BigInt | primを返す |
Number | TypeError例外をスロー |
String |
|
Symbol | TypeError例外をスロー |
7.1.14 StringToBigInt ( argument )
7.1.4.1のアルゴリズムに次の変更を加えて処理します。
- StrUnsignedDecimalLiteral
プロダクションをDecimalDigitsに置き換まる。これにより無限大、小数点、指数が除外される。 - MVがNaNのとき、NaNを返す。それ以外の場合、数値に丸めるのではなく、MVに正確に対応するBigIntを返す。
7.1.15 ToBigInt64 ( argument )
抽象演算ToBigInt64は、引数を-263から263-1までの範囲の264個の整数値の1つに変換します。 この抽象操作は次のように処理します。
7.1.16 ToBigUint64 ( argument )
抽象演算ToBigUint64は、引数を0から264-1までの範囲の264個の整数値のひとつに変換します。 この抽象操作は次のように処理します。
7.1.17 ToString ( argument )
抽象演算ToStringは、表13に従ってargumentをString型の値に変換します。
argumentの型 | 結果 |
---|---|
Undefined | "Undefined"を返す |
Null | "Null"を返す |
Boolean | argumentが true なら "true" を、false なら "false" を返す |
Number | ! Number::toString(argument) の結果を返す |
String | argumentを返す |
Symbol | TypeError例外を返す |
BigInt | ! BigInt::toString(argument) の結果を返す |
Object | 次の手順を適用します。
|
7.1.18 ToObject ( argument )
抽象演算ToObjectは、表14に従ってargumentをObject型の値に変換します。
argumentの型 | 結果 |
---|---|
Undefined | TypeError例外をスローする |
Null | TypeError例外をスローする |
Boolean | [[BooleanData]]内部スロットにargumentが設定されている、新しいブールオブジェクトを返す。ブール型オブジェクトの説明については、19.3を参照。 |
Number | [[NumberData]]内部スロットにargumentが設定されている、新しいNumberオブジェクトを返す。Numberオブジェクトの説明については、20.1を参照。 |
String | [[StringData]]内部スロットにargumentが設定されている、新しいStringオブジェクトを返す。 Stringオブジェクトの説明については、21.1を参照。 |
Symbol | [[SymbolData]]内部スロットにargumentが設定されている、新しいSymbolオブジェクトを返す。 Symbolオブジェクトの説明については、19.4を参照。 |
BigInt | [[BigIntData]]内部スロットにargumentが設定されている、新しいBigIntオブジェクトを返す。 BigIntオブジェクトの説明については、20.2を参照。 |
Object | argumentを返す |
7.1.19 ToPropertyKey ( argument )
抽象操作ToPropertyKeyは、次の手順を実行して、argumentをプロパティキーとして使用できる値に変換します。
7.1.20 ToLength ( argument )
抽象演算ToLengthは、argumentを配列のようなオブジェクトの長さとして使用するのに適した整数に変換します。 次の手順を実行します。
7.1.21 CanonicalNumericIndexString ( argument )
抽象演算CanonicalNumericIndexStringは、argumentがToStringによって生成される数値の文字列表現である場合、または文字列 "-0"の場合、argumentを数値に変換した値を返します。 それ以外の場合は、undefinedを返します。 この抽象操作は次のように処理します。
正規の数値文字列は、CanonicalNumericIndexString抽象操作がundefinedを返さない文字列値です。
7.1.22 ToIndex ( value )
抽象演算ToIndexは、valueが有効な整数インデックスである場合、valueを負でない整数に変換して返します。この抽象操作は次のように処理します。
7.2 テストと比較の操作(Testing and Comparison Operations)
7.2.1 RequireObjectCoercible ( argument )
argumentがToObjectを使用してオブジェクトに変換できない値である場合、抽象操作RequireObjectCoercibleはエラーをスローします。 これは、表15で定義されています。
argumentの型 | 結果 |
---|---|
Undefined | TypeError例外をスロー |
Null | TypeError例外をスロー |
Boolean | argumentを返す |
Number | argumentを返す |
String | argumentを返す |
Symbol | argumentを返す |
BigInt | argumentを返す |
Object | argumentを返す |
7.2.2 IsArray ( argument )
抽象演算IsArrayは引数argumentを取り、次の手順を実行します。
- Type(argument)がObjectでないなら、falseを返す
- argumentがArrayエキゾチックオブジェクトなら、trueを返す
- argumentがProxyエキゾチックオブジェクトなら
- falseを返す
7.2.3 IsCallable ( argument )
抽象操作IsCallableは、ECMAScript言語値であるargumentが、[[Call]]内部メソッドを持つ呼び出し可能な関数であるかどうかを判別します。
- Type(argument)がObjectでないなら、falseを返す
- argumentが[[Call]]内部メソッドを持っているなら、trueを返す
- falseを返す
7.2.4 IsConstructor ( argument )
抽象演算IsConstructorは、ECMAScript言語値であるargumentが、[[Construct]]内部メソッドを持つ関数オブジェクトであるかどうかを判別します。
- Type(argument)がObjectでないなら、falseを返す
- argumentが[[Construct]]内部メソッドを持っているなら、trueを返す
- falseを返す
7.2.5 IsExtensible ( O )
抽象演算IsExtensibleは、あるオブジェクトOにプロパティを追加できるかどうかを判別します。ブール値が返されます。 この抽象操作は、次の手順を実行します。
- Assert: Type(O)はObject型
- ? O.[[IsExtensible]]()の実行結果を返す
7.2.6 IsInteger ( argument )
抽象演算IsIntegerは、argumentが有限整数の数値であるかどうかを判別します。
7.2.7 IsNonNegativeInteger ( argument )
抽象演算IsNonNegativeIntegerは、argumentが負でない整数の数値であるかどうかを判別します。
7.2.8 IsPropertyKey ( argument )
抽象操作IsPropertyKeyは、ECMAScript言語値である引数argumentが、プロパティキーとして使用できる値であるかどうかをを判別します。
7.2.9 IsRegExp ( argument )
引数argumentを持つ抽象操作IsRegExpは、次の手順を実行します。
7.2.10 IsStringPrefix ( p, q )
抽象演算IsStringPrefixは、文字列pが文字列qのプレフィックス(接頭辞)であるかどうかを判別します。
7.2.11 SameValue ( x, y )
内部比較抽象演算SameValue(x、y)(xとyはECMAScript言語値)は、trueまたはfalseを返します。 次のように実行されます。
7.2.12 SameValueZero ( x, y )
内部比較抽象演算SameValueZero(x, y)(xとyはECMAScript言語値)は、trueまたはfalseを返します。 この比較は次のように実行されます。
- Type(x)とType(y)が異なるなら、falseを返す
- Type(x)がNumber型またはBigInt型なら、
- ! Type(x)::sameValueZero(x, y)の結果を返す
- ! SameValueNonNumeric(x, y)の結果を返す
7.2.13 SameValueNonNumeric ( x, y )
内部比較抽象演算SameValueNonNumeric(x, y)は、xとy共に数値型の値ではないとき、trueまたはfalseを返します。 この比較は次のように実行されます。
- Assert: Type(x)はNumber型またはBigInt型ではない
- Assert: Type(x)とType(y)は同じ型
- Type(x)が Undefined型なら、trueを返す
- Type(x)が Null型なら、trueを返す
- Type(x)が String型なら、
- xとyがまったく同じコード単位のシーケンスである場合(対応するインデックスで同じ長さと同じコード単位)、trueを返す。 それ以外は、falseを返す。
- Type(x)が Boolean型なら、
- xとyが両方ともtrueまたはfalseなら、trueを返す。 それ以外は、falseを返す。
- Type(x)が Symbol型なら、
- xとyが同じSymbol 値なら、trueを返す。 それ以外は、falseを返す。
- xとyが同じObject値なら、trueを返す。 それ以外は、falseを返す。
7.2.14 抽象関係比較(Abstract Relational Comparison)
x < y(xとyは値)の比較では、true、false、またはundefined(少なくとも1つのオペランドがNaNであることを示します)が生成されます。
アルゴリズム上では xとyに加えて、LeftFirstという名前のブールフラグをパラメーターとして受け取ります。フラグは、潜在的に目に見える副作用を伴う操作がxおよびyに対して実行される順序を制御するために使用されます。 ECMAScriptは式の左から右への評価を指定するため、これは必要です。 LeftFirstのデフォルト値はtrueであり、xパラメーターが、yパラメーターの対応する式の左側にある式に対応することを示します。 LeftFirstがfalseの場合は、その逆であり、xの前にyに対して操作を実行する必要があります。 このような比較は次のように実行されます。
- LeftFirstがtrueなら、
- ? ToPrimitive(x, ヒント Number)の結果をpxとする
- ? ToPrimitive(y, ヒント Number)の結果をpyとする
- 1.と異なるなら、
- 注:評価の順序を逆にして、左から右への評価を維持する必要があります。
- ? ToPrimitive(y, ヒント Number)の結果をpyとする
- ? ToPrimitive(x, ヒント Number)の結果をpxとする
- Type(px)と Type(py)ともにString型なら、
- IsStringPrefix(py, px)の結果がtrueなら、falseを返す
- IsStringPrefix(px, py)の結果がtrueなら、trueを返す
- pxとpyの同じインデックスのコード値が異なる負でない最小の整数を、kとする。(どちらのStringも他方の接頭辞ではないため、このようなkが必要です。)
- pxのインデックスkのコード値を、mとする。
- pyのインデックスkのコード値を、nとする。
- m < nならtrue、それ以外ならfalseを返す
- 3.と異なるなら
- Type(px)がBigInt型、 Type(py)がString型なら、
- ! StringToBigInt(py)の結果をnyとする
- nyが NaNなら、undefinedを返す
- BigInt::lessThan(px, ny)の結果を返す
- Type(px)がString型、 Type(py)がBigInt型なら、
- ! StringToBigInt(px)の結果をnxとする
- nxが NaNなら、undefinedを返す
- BigInt::lessThan(bx, py)の結果を返す
- 注:pxとpyはプリミティブ値であるため、評価順序は重要ではありません。
- ? ToNumeric(px)の結果をnxとする
- ? ToNumeric(py)の結果をnyとする
- Type(nx)とType(ny)の型が同じなら、Type(nx)::lessThan(nx, ny)の結果を返す
- Assert: Type(nx)がBigInt型でType(ny)がNumber型、またはType(nx)がNumber型でType(ny)がBigInt型
- nxまたはnyがNaNなら、undefinedを返す
- nxが -∞ または ny が +∞ なら、trueを返す
- nxが +∞ または ny が -∞ なら、falseを返す
- nxの数学的数値がnyの数学的数値より小さいならtrueを、それ以外ならfalseを返す
- Type(px)がBigInt型、 Type(py)がString型なら、
ステップ3:Type(px)とType(py)ともにString型
加算演算子のステップ7:Type(lprim)とType(rprim)どちらかがString型
7.2.15 抽象等値比較(Abstract Equality Comparison)
比較x == y(xとyは値)は、trueまたはfalseを生成します。 この比較は次のように実行されます。
- Type(x)とType(y)が同じ型なら、
- 厳密等値比較 x === yの結果を返す
- x が null で y が undefinedなら、trueを返す
- x が undefined で y が nullなら、trueを返す
- Type(x)がNumber型で、Type(y)がString型なら、x == ! ToNumber(y)の比較結果を返す
- Type(x)がString型で、Type(y)がNumber型なら、! ToNumber(x) == y の比較結果を返す
- Type(x)がBigInt型で、Type(y)がString型なら
- ! StringToBigInt(y)の結果をnとする
- nがNaNなら、falseを返す
- x == nの比較結果を返す
- Type(x)がString型で、Type(y)がBigInt型なら、y == xの比較結果を返す
- Type(x)がBoolean型なら、! ToNumber(x) == y の比較結果を返す
- Type(y)がBoolean型なら、x == ! ToNumber(y) の比較結果を返す
- Type(x)が String、Number、BigInt、Symbolのどれかで、Type(y)がObjectなら、x == ToPrimitive(y)の比較結果を返す
- Type(x)がObjectで、Type(y)がString、Number、BigInt、Symbolのどれかなら、ToPrimitive(x) == yの比較結果を返す
- Type(x)が BigInt型で、Type(y)がNumber型、またはその逆なら、
- xまたはyがNaN、+∞、-∞のどれかなら、falseを返す。
- xとyの数学的数値が同じ値ならtrueを、異なるならfalseを返す
- falseを返す
7.2.16 厳密等値比較(Strict Equality Comparison)
比較x === y(xとyは値)は、trueまたはfalseを生成します。 この比較は次のように実行されます。
7.3 オブジェクト操作(Operations on Objects)
7.3.1 MakeBasicObject ( internalSlotsList )
抽象操作MakeBasicObjectは、通常のオブジェクトとエキゾチックなオブジェクトの両方を含む、アルゴリズムによって作成されるすべてのECMAScriptオブジェクトの中核となるもので、オブジェクトの作成を一元化します。
- Assert: internalSlotsListは、内部スロット名のListです。
- internalSlotsList内の全ての名前を内部スロットとして持つ、新しく作成されたオブジェクトをobjとします
- 9.1で指定されている、通常のオブジェクトのデフォルトメソッド定義を、objの基本的な内部メソッドとしてセットします。
- Assert: 呼び出し元がobjの[[GetPrototypeOf]]と[[SetPrototypeOf]] の両方の必須内部メソッドをオーバーライドしない場合、internalSlotsListには[[Prototype]]が含まれます。
- Assert: 呼び出し元がobjのすべての[[SetPrototypeOf]] 、[[IsExtensible]]、および[[PreventExtensions]]の必須内部メソッドをオーバーライドしない場合、internalSlotsListには[[Extensible]]が含まれます。
- internalSlotsListに[[Extensible]]が含まれるなら、trueをobj.[[Extensible]]にセットします
- objを返します
エキゾチックなオブジェクトの作成をカプセル化するために、オブジェクトの基本的な内部メソッドは、これらの操作以外では変更されません。
7.3.2 Get ( O, P )
抽象操作Getは、オブジェクトの特定のプロパティの値を取得します。操作は引数OとPで呼び出されます。Oはオブジェクト、Pはプロパティキーです。 この抽象操作は、次の手順を実行します。
7.3.3 GetV ( V, P )
抽象操作GetVは、ECMAScript言語値の特定のプロパティの値を取得します。 値がオブジェクトでない場合、プロパティの検索は、値の型に適したラッパーオブジェクトを使用して実行されます。操作は引数VとPで呼び出されます。Vは値で、Pはプロパティキーです。 この抽象操作は、次の手順を実行します。
7.3.4 Set ( O, P, V, Throw )
抽象操作Setは、オブジェクトの特定のプロパティの値を設定します。 操作は引数O、P、V、およびThrowで呼び出されます。ここで、Oはオブジェクト、Pはプロパティキー、Vはプロパティの新しい値、Throwはブールフラグです。 この抽象操作は、次の手順を実行します。
7.3.5 CreateDataProperty ( O, P, V )
抽象操作CreateDataPropertyは、オブジェクトに独自プロパティを作成します。 この操作は、引数Oはオブジェクト、Pはプロパティキー、Vはプロパティの値です。 この抽象操作は、次の手順を実行します。
- Assert: Type(O)はObject型
- Assert: IsPropertyKey(P)はtrue
- PropertyDescriptor型{ [[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }を、newDescとする
- ? O.[[DefineOwnProperty]] (P, newDesc)の結果を返す
7.3.6 CreateMethodProperty ( O, P, V )
抽象操作CreateMethodPropertyは、オブジェクトに独自プロパティを作成します。 引数Oはオブジェクト、Pはプロパティキー、Vはプロパティの値です。 この抽象操作は、次の手順を実行します。
- Assert: Type(O)はObject型
- Assert: IsPropertyKey(P)はtrue
- PropertyDescriptor型{ [[Value]]: V, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }を、newDescとする
- ? O.[[DefineOwnProperty]] (P, newDesc)の結果を返す
CreateMethodPropertyは[[Enumerable]]がfalseのため、for-inで列挙されない
7.3.7 CreateDataPropertyOrThrow ( O, P, V )
抽象操作CreateDataPropertyOrThrowは、オブジェクトに独自プロパティを作成します。プロパティの更新を実行できない場合は、TypeError例外をスローします。 引数Oはオブジェクト、Pはプロパティキー、Vはプロパティの値です。 この抽象操作は、次の手順を実行します。
- Assert: Type(O)はObject型
- Assert: IsPropertyKey(P)はtrue
- ? CreateDataProperty(O, P, V)の結果をsuccessとする
- successがfalseなら、TypeError例外をスローする
- successを返す
7.3.8 DefinePropertyOrThrow ( O, P, desc )
抽象操作DefinePropertyOrThrowは、オブジェクトの[[DefineOwnProperty]]内部メソッドを呼び出し要求されたプロパティを更新します。更新できない場合はTypeError例外をスローします。 引数Oはオブジェクト、Pはプロパティキー、descはプロパティのプロパティ記述子です。 この抽象操作は、次の手順を実行します。
- Assert: Type(O)はObject型
- Assert: IsPropertyKey(P)はtrue
- ? O.[[DefineOwnProperty]] (P, desc)の結果をsuccessとする
- successがfalseなら、TypeError例外をスローする
- successを返す
7.3.9 DeletePropertyOrThrow ( O, P )
抽象操作DeletePropertyOrThrowは、オブジェクトの特定の独自プロパティを削除します。プロパティを削除できない場合は、例外がスローされます。 引数Oはオブジェクト、Pはプロパティキーです。 この抽象操作は、次の手順を実行します。
- Assert: Type(O)はObject型
- Assert: IsPropertyKey(P)はtrue
- ? O.[[Delete]] (P, newDesc)の結果をsuccessとする
- successがfalseなら、TypeError例外をスローする
- successを返す
7.3.10 GetMethod ( V, P )
抽象操作GetMethodは、特定のプロパティの値が関数のとき、プロパティの値を取得します。 引数VはECMAScript言語値、Pはプロパティキーです。 この抽象操作は、次の手順を実行します。
- Assert: IsPropertyKey(P)はtrue
- ? GetV(V, P)の結果をfuncとする
- funcがundefinedまたはnullなら、undefinedを返す
- IsCallable(func)がfalseなら、TypeError例外をスロー
- funcを返す
7.3.11 HasProperty ( O, P )
抽象操作HasPropertyは、オブジェクトが指定されたキーを持つプロパティがあるかどうかを判断します。 プロパティは、独自プロパティだけでなく継承プロパティも対象です。 ブール値が返されます。 操作は引数OとPで呼び出されます。Oはオブジェクト、Pはプロパティキーです。 この抽象操作は、次の手順を実行します。
- Assert: Type(O)はObject型
- Assert: IsPropertyKey(P)はtrue
- ? O.[[HasProperty]](P)の結果を返す
7.3.12 HasOwnProperty ( O, P )
抽象演算HasOwnPropertyは、オブジェクトが指定されたキーに対応する独自プロパティがあるかどうかを判断します。 引数Oはオブジェクト、Pはプロパティキーです。 この抽象操作は、次の手順を実行します。
- Assert: Type(O)はObject型
- Assert: IsPropertyKey(P)はtrue
- ? O.[[GetOwnProperty]] (P)の結果をdescとする
- descがundefinedなら、false例を返す
- trueを返す
7.3.13 Call ( F, V [ , argumentsList ] )
抽象操作Callは、関数オブジェクトの[[Call]] 内部メソッドを呼び出します。 引数Fは関数オブジェクト、Vは[[Call]]のthis値であるECMAScript言語値、argumentsListはオプションで、[[Call]] 内部メソッドに渡される値です。 argumentsListが存在しない場合、空のListが渡されます。この抽象操作は、次の手順を実行します。
- argumentsList が存在しないなら、空のListをargumentsListにセットする
- IsCallable(F)がfalseなら、TypeError例外をスロー
- ? F.[[Call]] (V, argumentsList)の結果を返す
7.3.14 Construct ( F [ , argumentsList [ , newTarget ] ] )
抽象操作Constructは、関数オブジェクトの[[Construct]] 内部メソッドを呼び出します。 引数Fは関数オブジェクト、 argumentsListおよびnewTargetは、[[Construct]] 内部メソッドに引数として渡される値です。 argumentsListが存在しない場合、新しい空のListが使用されます。 newTargetが存在しない場合、Fが使用されます。 この抽象操作は、次の手順を実行します。
- newTargetが存在しないなら、FをnewTargetにセットする
- argumentsListが存在しないなら、空のListをargumentsListにセットする
- Assert: IsConstructor(F)はtrue
- Assert: IsConstructor(newTarget)はtrue
- ? F.[[Construct]] (argumentsList, newTarget)の結果を返す
7.3.15 SetIntegrityLevel ( O, level )
抽象操作SetIntegrityLevelは、levelの値に応じてオブジェクトOが持っている独自プロパティの[[Writable]]および[[Configurable]]属性を更新します。この抽象操作は、次の手順を実行します。
- Assert: Type(O) は Object型
- Assert: levelはsealedまたはfrozen
- ? O.[[PreventExtensions]]()の結果をstatusとする
- statusがfalseなら、falseを返す
- ? O.[[OwnPropertyKeys]] ()の結果をkeysとする
- levelがsealedなら
- keysから取り出した値をkとして、それぞれ次を実行
- ? DefinePropertyOrThrow(O, k, PropertyDescriptor型{ [[Configurable]]: false })を実行
- keysから取り出した値をkとして、それぞれ次を実行
- 6.でないなら
- Assert: levelはfrozen
- keysから取り出した値をkとして、それぞれ次を実行
- ? O.[[GetOwnProperty]](k)の結果をcurrentDescとする
- currentDescがundefinedでないなら、
- IsAccessorDescriptor(currentDesc)がtrueなら、
- PropertyDescriptor型{ [[Configurable]]: false }をdescとする
- 上と異なるなら
- PropertyDescriptor型{ [[Configurable]]: false, [[Writable]]: false }をdescとする
- ? DefinePropertyOrThrow(O, k, desc)を実行する
- IsAccessorDescriptor(currentDesc)がtrueなら、
- trueを返す
7.3.16 TestIntegrityLevel ( O, level )
抽象演算TestIntegrityLevelは、オブジェクトの一連の独自のプロパティが修正されているかどうかを判断します。この抽象操作は、次の手順を実行します。
- Assert: Type(O) は Object型
- Assert: levelはsealedまたはfrozen
- ? [[IsExtensible]](O)の結果をextensibleとする
- extensibleがtrueなら、falseを返す
- 注:オブジェクトが拡張可能な場合、そのプロパティは検査されません。
- ? O.[[OwnPropertyKeys]]()の結果を keysとする
- keysから取り出した値をkとして、それぞれ次を実行
- ? O.[[GetOwnProperty]](k)の結果をcurrentDescとする
- currentDescがundefinedでないなら
- currentDesc.[[Configurable]]がtrueなら、falseを返す
- levelがfrozen で、IsDataDescriptor(currentDesc) がtrueなら、
- currentDesc.[[Writable]]がtrueなら、falseを返す
- trueを返す
7.3.17 CreateArrayFromList ( elements )
抽象操作CreateArrayFromListは、リストelementsからArrayオブジェクトを作成します。 この抽象操作は、次の手順を実行します。
- Assert: elementsは、すべての要素がECMAScript言語値であるList
- ! ArrayCreate(0)の結果を array とする
- 0 を n とする
- elementsから取り出した値を e として、それぞれ次を実行
- ! CreateDataPropertyOrThrow(array, ! ToString(n), e)を実行
- n + 1 を n にセット
- array を返す
7.3.18 LengthOfArrayLike ( obj )
抽象操作LengthOfArrayLikeは、配列のようなオブジェクトの「length」プロパティの値を返します。
配列のようなオブジェクト(array-like object)
配列のようなオブジェクト(array-like object)とは、この操作で突然の完了で終了せずに、整数を返すオブジェクトです。
オブジェクトが整数のインデックスを持っていなくても、LengthOfArrayLikeが整数を返せばarray-likeということ
7.3.19 CreateListFromArrayLike ( obj [ , elementTypes ] )
抽象オペレーションCreateListFromArrayLikeは、配列のようなオブジェクトobjのインデックス付きプロパティの一連の値をListで取得します。 オプションの引数elementTypesは、取得対象となる型名のリストです。 この抽象操作は、次の手順を実行します。
7.3.20 Invoke ( V, P [ , argumentsList ] )
抽象演算Invokeは、ECMAScript言語値のメソッドプロパティを呼び出します。 引数Vはプロパティのルックアップポイントであり、Callメソッドにthis値として渡されます。Pはプロパティキー、argumentsListはCallメソッドに渡される引数値のリストです。 argumentsListが存在しない場合、新しい空のリストが使用されます。この抽象操作は、次の手順を実行します。
7.3.21 OrdinaryHasInstance ( C, O )
抽象オペレーションOrdinaryHasInstanceは、オブジェクトOがコンストラクターCから継承されているかどうかを判断する規定のアルゴリズムです。判定はプロトタイプチェーンを辿ります。この抽象オペレーションは、次の手順を実行します。
- IsCallable(C)がfalseなら、falseを返す
- C が [[BoundTargetFunction]]内部スロットを持っているなら
- C.[[BoundTargetFunction]] を BC とする
- ? InstanceofOperator(O, BC) の結果を返す
- Type(O) がObject型でないなら、 false を返す
- ? Get(C, "prototype") の結果を P とする
- Type(P) がObject型でないなら、 TypeError をスロー
- 以下を繰り返す
- ? O.[[GetPrototypeOf]] () の結果を O とする
- O が nullなら、falseを返す
- SameValue(P, O)の結果がtrueなら 、trueを返す
7.3.22 SpeciesConstructor ( O, defaultConstructor )
抽象演算SpeciesConstructorは、オブジェクトOから新しいオブジェクトを作成するために必要なコンストラクターを取得します。defaultConstructor引数は、コンストラクターが見つからない場合の規定値です。 抽象操作は次の手順を実行します。
7.3.23 EnumerableOwnPropertyNames ( O, kind )
抽象演算EnumerableOwnPropertyNamesは、オブジェクトOと、key、 value、 key+valueのいずれかの値であるkindで呼び出されると、次の手順が実行されます。
- Assert: Type(O) は Object型
- ? O.[[OwnPropertyKeys]]() の結果をownKeysとする
- 空のリストをpropertiesとする
- ownKeysから順番に値を取り出しkeyとし、それぞれ次の処理をおこなう
- Type(key)が、String型なら
- ? O.[[GetOwnProperty]] (key) の結果を desc とする
- desc が undefined ではなく、desc.[[Enumerable]] が true なら、
- Type(key)が、String型なら
- properties を返す
7.3.24 GetFunctionRealm ( obj )
引数objを指定した抽象操作GetFunctionRealmは、次の手順を実行します。
- Assert: ! IsCallable(obj) は true
- obj が [[Realm]]内部スロットを持っているなら
- obj.[[Realm]] を返す
- obj が バインド関数エキゾチックオブジェクトなら
- obj.[[BoundTargetFunction]] を target とする
- ? GetFunctionRealm(target) を返す
- obj が Proxyエキゾチックオブジェクトなら
- obj.[[ProxyHandler]] が null なら、TypeError例外をスローする
- obj.[[ProxyTarget]] を proxyTarget とする
- ? GetFunctionRealm(proxyTarget) を返す
- 現在のレルムレコードを返す
7.3.25 CopyDataProperties ( target, source, excludedItems )
抽象操作CopyDataPropertiesが引数target、source、excludeItemsを指定して呼び出されると、次の手順が実行されます。
- Assert: Type(target) は Object型
- Assert: excludedItems は プロパティキーのリスト
- source が undefined または null なら、 target を返す
- ! ToObject(source) を from とする
- ? from.[[OwnPropertyKeys]] () を keys とする
- keys から値を取り出して nextKey とし、それぞれ次を処理する
- false を excluded とする
- excludedItems から値を取り出して e とし、それぞれ次を処理する
- SameValue(e, nextKey) が true なら
- true を excluded にセット
- SameValue(e, nextKey) が true なら
- excluded が false なら
- ? from.[[GetOwnProperty]](nextKey) の結果を desc とする
- desc が undefined でなく、 desc.[[Enumerable]] が true なら
- ? Get(from, nextKey) の結果を propValue とする
- ! CreateDataPropertyOrThrow(target, nextKey, propValue) を実行する
- target を返す
7.4 イテレータオブジェクトの操作(Operations on Iterator Objects)
Common Iteration Interfaces(25.1)を参照してください。
7.4.1 GetIterator ( obj [ , hint [ , method ] ] )
抽象操作GetIteratorは、引数objとオプション引数hintおよびmethodを受け取り、次の手順を実行します。
- hintが指定されなかったら、sync を hint とする
- Assert: hint は sync または async
- method が指定されなかったら、
- hint が asyncなら
- ? GetMethod(obj, @@asyncIterator) の結果を method とする
- method が undefined なら
- ? GetMethod(obj, @@iterator) の結果をsyncMethodとする
- ? GetIterator(obj, sync, syncMethod) の結果を syncIteratorRecord とする
- ! CreateAsyncFromSyncIterator(syncIteratorRecord) の結果を返す
- a.でなければ ? GetMethod(obj, @@iterator) の結果を method にセット
- hint が asyncなら
- ? Call(method, obj) の結果を iterator とする
- Type(iterator) が Object型でないなら, TypeError例外をスローする
- ? GetV(iterator, "next") の結果を nextMethod とする
- Record型 { [[Iterator]]: iterator, [[NextMethod]]: nextMethod, [[Done]]: false } を iteratorRecord とする
- iteratorRecordを返す
7.4.2 IteratorNext ( iteratorRecord [ , value ] )
抽象操作IteratorNextは引数iteratorRecordとオプションの引数valueで呼び出されると、次の手順を実行します。
7.4.3 IteratorComplete ( iterResult )
引数iterResultを持つ抽象操作IteratorCompleteは、次の手順を実行します。
7.4.4 IteratorValue ( iterResult )
引数iterResultを持つ抽象操作IteratorValueは、次の手順を実行します。
7.4.5 IteratorStep ( iteratorRecord )
抽象オペレーションIteratorStepは、引数iteratorRecordで呼び出されます。
手順ではiteratorRecord.[[NextMethod]]を呼び出すことにより、iteratorRecord.[[Iterator]]の次の値を要求します。
イテレータが最後に到達するとfalseを、次の値が利用可能な場合はIteratorResultオブジェクトを返します。
IteratorStepは次の手順を実行します。
- ? IteratorNext(iteratorRecord) の結果を result とする
- ? IteratorComplete(result) の結果を done とする
- done が true なら false を返す
- result を返す
7.4.6 IteratorClose ( iteratorRecord, completion )
引数iteratorRecordとcompletionを持つ抽象オペレーションIteratorCloseは、完了時に通常実行するアクションを実行する必要があることをイテレータに通知します。
- Assert: Type(iteratorRecord.[[Iterator]]) は Object型
- Assert: completion は 完了レコード
- iteratorRecord.[[Iterator]] を iterator とする
- ? GetMethod(iterator, "return") の結果を return とする
- "return" が undefined なら Completion(completion) を返す
- Call(return, iterator) の結果を innerResult とする
- completion.[[Type]] が throw なら Completion(completion) を返す
- innerResult.[[Type]] が throw なら return Completion(innerResult) を返す
- IType(innerResult.[[Value]]) がObject型でないなら TypeError例外をスローする.
- Completion(completion) を返す
7.4.7 AsyncIteratorClose ( iteratorRecord, completion )
引数iteratorRecordとcompletionを持つ抽象操作AsyncIteratorCloseは、完了状態に達したときに通常実行するアクションを実行する必要があることを非同期イテレーターに通知します。
- Assert: Type(iteratorRecord.[[Iterator]]) が Object型
- Assert: completion は 完了レコード
- iteratorRecord.[[Iterator]] を iterator とする
- ? GetMethod(iterator, "return") の結果を return とする
- Ireturn が undefined なら Completion(completion) を返す
- Call(return, iterator) を innerResult とする
- innerResult.[[Type]] が normal なら Await(innerResult.[[Value]]) の結果を innerResult にセット
- completion.[[Type]] が throw なら Completion(completion) を返す
- innerResult.[[Type]] が throw なら Completion(innerResult) を返す
- If Type(innerResult.[[Value]]) Object型でないなら TypeError例外をスローする.
- Completion(completion) を返す
7.4.8 CreateIterResultObject ( value, done )
引数valueとdoneを指定して実行する抽象操作CreateIterResultObjectは、次の手順を実行して、IteratorResultインターフェースをサポートするオブジェクトを作成します。
- Assert: Type(done) は Boolean型
- OrdinaryObjectCreate(%Object.prototype%) の結果を obj とする
- ! CreateDataPropertyOrThrow(obj, "value", value) を実行する
- ! CreateDataPropertyOrThrow(obj, "done", done) を実行する
- obj を返す
7.4.9 CreateListIteratorRecord ( list )
引数listで呼び出される抽象操作CreateListIteratorRecordは、次のメソッドがlistの連続する要素を返すIterator(25.1.1.2)オブジェクトレコードを作成します。 次の手順を実行します。
- OrdinaryObjectCreate(%IteratorPrototype%, « [[IteratedList]], [[ListNextIndex]] ») の結果を iterator とする
- list を iterator.[[IteratedList]] にセット
- Set iterator.[[ListNextIndex]] to 0.
- ListIteratorNext Functionsで定義しているアルゴリズムステップを steps とする
- ! CreateBuiltinFunction(steps, « ») の結果を next とする
- Record型{ [[Iterator]]: iterator, [[NextMethod]]: next, [[Done]]: false } を返す
7.4.9.1 ListIteratorNext Functions
ListIteratorNext関数は、匿名の組み込み関数です。 引数なしで呼び出されると、次の手順を実行します。
- this値を O とする
- Assert: Type(O) は Object型
- Assert: O は [[IteratedList]]内部スロットを持っている
- O.[[IteratedList]] を list とする
- O.[[ListNextIndex]] を index とする
- list の要素数を len とする
- index ≧ len なら
- CreateIterResultObject(undefined, true) の結果を返す
- index + 1 を O.[[ListNextIndex]] にセット
- CreateIterResultObject(list[index], false) の結果を返す
ListIteratorNext関数の「length」プロパティは0です。