ページ表示設定

7 抽象操作

これらの操作は ECMAScript 言語の一部ではありません。これらは、ECMAScript 言語の意味論の仕様を支援する目的のためだけに、ここで定義されています。その他の、より専門化された抽象操作は、この仕様全体の各所で定義されています。

7.1 型変換

ECMAScript 言語は、必要に応じて暗黙的に自動型変換を実行します。特定の構成要素の意味論を明確にするため、変換用の抽象操作の集合を定義すると便利です。変換用の抽象操作は多態的であり、任意の ECMAScript 言語型の値を受け入れることができます。ただし、その他の仕様型はこれらの操作では使用されません。

BigInt 型には ECMAScript 言語における暗黙の変換はありません。他の型から値を変換するには、プログラマーが明示的に BigInt を呼び出さなければなりません。

7.1.1 ToPrimitive ( input [ , preferredType ] )

抽象操作 ToPrimitive。引数 input (ECMAScript 言語値)および省略可能な引数 preferredType ((string または number))。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 input 引数を Object ではない型に変換します。オブジェクトが複数のプリミティブ型に変換できる場合、省略可能なヒント preferredType を使用して、その型を優先することができます。 呼び出されると、次の手順を実行する。

  1. input が Object である場合、
    1. exoticToPrimitive を ? GetMethod(input, %Symbol.toPrimitive%) とする。
    2. exoticToPrimitive が undefined でない場合、
      1. preferredType が存在しない場合、
        1. hint を "default" とする。
      2. そうでなく、preferredType が string である場合、
        1. hint を "string" とする。
      3. そうでない場合、
        1. 表明: preferredType は number である。
        2. hint を "number" とする。
      4. result を ? Call(exoticToPrimitive, input, « hint ») とする。
      5. result が Object でない場合、result を返す。
      6. TypeError 例外をスローする。
    3. preferredType が存在しない場合、preferredType を number に設定する。
    4. ? OrdinaryToPrimitive(input, preferredType) を返す。
  2. input を返す。
注

ToPrimitive がヒントなしで呼び出された場合、一般にはヒントが number であるかのように動作します。ただし、オブジェクトは %Symbol.toPrimitive% メソッドを定義することでこの動作を上書きできます。この仕様で定義されるオブジェクトのうち、既定の ToPrimitive の動作を上書きするのは Date(21.4.4.45 を参照)と Symbol オブジェクト(20.4.3.5 を参照)だけです。Date は、ヒントが存在しない場合を、ヒントが string であるかのように扱います。

7.1.1.1 OrdinaryToPrimitive ( obj, hint )

抽象操作 OrdinaryToPrimitive。引数 obj (Object) および hint ((string または number))。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. hint が string である場合、
    1. methodNames を « "toString", "valueOf" » とする。
  2. そうでない場合、
    1. methodNames を « "valueOf", "toString" » とする。
  3. methodNames の各要素 name について、次を行う。
    1. method を ? Get(obj, name) とする。
    2. IsCallable(method) が true である場合、
      1. result を ? Call(method, obj) とする。
      2. result が Object でない場合、result を返す。
  4. TypeError 例外をスローする。

7.1.2 ToBoolean ( arg )

抽象操作 ToBoolean。引数 arg (ECMAScript 言語値)。戻り値:Boolean。 arg を Boolean 型の値に変換します。 呼び出されると、次の手順を実行する。

  1. arg が Boolean である場合、arg を返す。
  2. arg が undefined、null、+0𝔽、-0𝔽、NaN、0ℤ、または空の String のいずれかである場合、false を返す。
  3. Normative Optional
    ホストが Web ブラウザーであるか、その他の方法で [[IsHTMLDDA]] 内部スロット をサポートする場合、
    1. arg が Object であり、arg が [[IsHTMLDDA]] 内部スロットを持つ場合、false を返す。
  4. true を返す。

7.1.3 ToNumeric ( arg )

抽象操作 ToNumeric。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:(Number または BigInt)) または throw 完了)。 arg を Number または BigInt に変換して返します。 呼び出されると、次の手順を実行する。

  1. primitiveValue を ? ToPrimitive(arg, number) とする。
  2. primitiveValue が BigInt である場合、primitiveValue を返す。
  3. ? ToNumber(primitiveValue) を返す。

7.1.4 ToNumber ( arg )

抽象操作 ToNumber。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:Number) または throw 完了)。 arg を Number 型の値に変換します。 呼び出されると、次の手順を実行する。

  1. arg が Number である場合、arg を返す。
  2. arg が Symbol または BigInt のいずれかである場合、TypeError 例外をスローする。
  3. arg が undefined である場合、NaN を返す。
  4. arg が null または false のいずれかである場合、+0𝔽 を返す。
  5. arg が true である場合、1𝔽 を返す。
  6. arg が String である場合、StringToNumber(arg) を返す。
  7. 表明: arg は Object である。
  8. primitiveValue を ? ToPrimitive(arg, number) とする。
  9. 表明: primitiveValue は Object ではない。
  10. ? ToNumber(primitiveValue) を返す。

7.1.4.1 String 型に適用される ToNumber

抽象操作 StringToNumber は、次の文法を使用して String 値を Number 値に変換する方法を規定します。

構文

StringNumericLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt StrWhiteSpace ::: StrWhiteSpaceChar StrWhiteSpaceopt StrWhiteSpaceChar ::: WhiteSpace LineTerminator StrNumericLiteral ::: StrDecimalLiteral NonDecimalIntegerLiteral[~Sep] StrDecimalLiteral ::: StrUnsignedDecimalLiteral + StrUnsignedDecimalLiteral - StrUnsignedDecimalLiteral StrUnsignedDecimalLiteral ::: Infinity DecimalDigits[~Sep] . DecimalDigits[~Sep]opt ExponentPart[~Sep]opt . DecimalDigits[~Sep] ExponentPart[~Sep]opt DecimalDigits[~Sep] ExponentPart[~Sep]opt

上記で明示的に定義されていないすべての文法記号は、数値リテラルの字句文法(12.9.3)で使用される定義を持ちます。

注

StringNumericLiteral と NumericLiteral の構文には、次のようないくつかの違いがあることに注意してください。

7.1.4.1.1 StringToNumber ( string )

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

  1. literal を ParseText(string, StringNumericLiteral) とする。
  2. literal がエラーの List である場合、NaN を返す。
  3. literal の StringNumericValue を返す。

7.1.4.1.2 Runtime Semantics: StringNumericValue

構文指向操作 StringNumericValue。引数なし。戻り値:Number。

注

StringNumericLiteral から Number 値への変換は、全体として NumericLiteral の NumericValue の決定(12.9.3 を参照)に似ていますが、いくつかの詳細は異なります。

次の生成規則ごとに定義される。

StringNumericLiteral ::: StrWhiteSpaceopt
  1. +0𝔽 を返す。
StringNumericLiteral ::: StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt
  1. StrNumericLiteral の StringNumericValue を返す。
StrNumericLiteral ::: NonDecimalIntegerLiteral
  1. 𝔽(NonDecimalIntegerLiteral の MV) を返す。
StrDecimalLiteral ::: - StrUnsignedDecimalLiteral
  1. a を StrUnsignedDecimalLiteral の StringNumericValue とする。
  2. a が +0𝔽 である場合、-0𝔽 を返す。
  3. -a を返す。
StrUnsignedDecimalLiteral ::: Infinity
  1. +∞𝔽 を返す。
StrUnsignedDecimalLiteral ::: DecimalDigits . DecimalDigitsopt ExponentPartopt
  1. a を最初の DecimalDigits の MV とする。
  2. 2番目の DecimalDigits が存在する場合、
    1. b を2番目の DecimalDigits の MV とする。
    2. n を2番目の DecimalDigits 内のコードポイント数とする。
  3. そうでない場合、
    1. b を 0 とする。
    2. n を 0 とする。
  4. ExponentPart が存在する場合、e を ExponentPart の MV とする。それ以外の場合、e を 0 とする。
  5. RoundMVResult((a + (b × 10-n)) × 10e) を返す。
StrUnsignedDecimalLiteral ::: . DecimalDigits ExponentPartopt
  1. b を DecimalDigits の MV とする。
  2. ExponentPart が存在する場合、e を ExponentPart の MV とする。それ以外の場合、e を 0 とする。
  3. n を DecimalDigits 内のコードポイント数とする。
  4. RoundMVResult(b × 10e - n) を返す。
StrUnsignedDecimalLiteral ::: DecimalDigits ExponentPartopt
  1. a を DecimalDigits の MV とする。
  2. ExponentPart が存在する場合、e を ExponentPart の MV とする。それ以外の場合、e を 0 とする。
  3. RoundMVResult(a × 10e) を返す。

7.1.4.1.3 RoundMVResult ( n )

抽象操作 RoundMVResult。引数 n (数学的な値)。戻り値:Number。 n を実装定義の方法で Number に変換します。この抽象操作では、ある桁がゼロでないか、またはその左側と右側の両方にゼロではない桁がある場合、その桁は有効桁です。この抽象操作では、数学的値の表現によって「表される数学的値」は、数学的値の「10進表現」の逆変換です。 呼び出されると、次の手順を実行する。

  1. n の10進表現の有効桁が20桁以下である場合、𝔽(n) を返す。
  2. option1 を、n の10進表現における20桁目より後の各有効桁を 0 に置換した結果によって表される数学的値とする。
  3. option2 を、n の10進表現における20桁目より後の各有効桁を 0 に置換し、その後20桁目の位置を1増加させた結果(必要に応じて繰り上げる)によって表される数学的値とする。
  4. chosen を、option1 または option2 のいずれかを実装定義で選択したものとする。
  5. 𝔽(chosen) を返す。

7.1.5 ToIntegerOrInfinity ( arg )

抽象操作 ToIntegerOrInfinity。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:(整数、+∞ または -∞)) または throw 完了)。 arg を、その Number 値の小数部分を切り捨てた整数に変換し、その Number 値が無限大の場合は +∞ または -∞ に変換します。 呼び出されると、次の手順を実行する。

  1. number を ? ToNumber(arg) とする。
  2. number が NaN、+0𝔽、または -0𝔽 のいずれかである場合、0 を返す。
  3. number が +∞𝔽 である場合、+∞ を返す。
  4. number が -∞𝔽 である場合、-∞ を返す。
  5. truncate(ℝ(number)) を返す。
注
𝔽(ToIntegerOrInfinity(x)) は、x のどの値についても -0𝔽 を返しません。小数部分の切り捨ては、x を数学的値に変換した後に実行されます。

7.1.6 SnapToInteger ( arg, nonIntHandling [ , minimum [ , maximum ] ] )

抽象操作 SnapToInteger。引数 arg (ECMAScript 言語値) および nonIntHandling ((reject または truncate))および省略可能な引数 minimum (整数) および maximum (整数)。戻り値:(正常完了 (値:整数) または throw 完了)。 arg をその Number 値を表す整数に変換します。有限でない値は拒否し、有限だが整数でない値は、拒否するか切り捨てるかのいずれかで処理し、必要に応じて閉区間の制約境界を適用します。 呼び出されると、次の手順を実行する。

  1. number を ? ToNumber(arg) とする。
  2. number が NaN、+∞𝔽、または -∞𝔽 のいずれかである場合、RangeError 例外をスローする。
  3. mv を ℝ(number) とする。
  4. nonIntHandling が truncate である場合、mv を truncate(mv) に設定する。
  5. mv が整数でない場合、RangeError 例外をスローする。
  6. minimum が存在し、mv < minimum である場合、RangeError 例外をスローする。
  7. maximum が存在し、mv > maximum である場合、RangeError 例外をスローする。
  8. mv を返す。

7.1.7 ToFixedSizeInteger ( int, signed, bitWidth )

抽象操作 ToFixedSizeInteger。引数 int ((整数、+∞ または -∞))、signed ((unsigned または signed)) および bitWidth (正の整数)。戻り値:整数。 int を、signed が unsigned の場合は 0 から 2bitWidth - 1 までの閉区間、signed が signed の場合は -2bitWidth - 1 から 2bitWidth - 1 - 1 までの閉区間に含まれる、2bitWidth 個の整数のいずれかに写像します。 呼び出されると、次の手順を実行する。

  1. int = +∞ または int = -∞ である場合、0 を返す。
  2. fixedInt を int modulo 2bitWidth とする。
  3. 注記: 次の手順は fixedInt の2の補数表現を変更しない。
  4. signed が signed かつ fixedInt ≥ 2bitWidth - 1 である場合、fixedInt を fixedInt - 2bitWidth に設定する。
  5. fixedInt を返す。
注

ToFixedSizeInteger は冪等です。任意の ECMAScript 言語値 x について、ToFixedSizeInteger(ToFixedSizeInteger(x, signed, bitWidth), signed, bitWidth) は ToFixedSizeInteger(x, signed, bitWidth) と同じです。実際、+∞ および -∞ は 0 に写像されるため、この不変条件は signed を反転しても維持されます(たとえば、ToFixedSizeInteger(ToFixedSizeInteger(x, signed, 32), unsigned, 32) は ToFixedSizeInteger(x, unsigned, 32) と同じです)。

7.1.8 ToInt32 ( arg )

抽象操作 ToInt32。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:整数の Number) または throw 完了)。 arg を、𝔽(-231) から 𝔽(231 - 1) までの閉区間にある、-0𝔽 を除く 232 個の整数 Number 値のいずれかに変換します。 呼び出されると、次の手順を実行する。

  1. int を ? ToIntegerOrInfinity(arg) とする。
  2. 𝔽(ToFixedSizeInteger(int, signed, 32)) を返す。

7.1.9 ToUint32 ( arg )

抽象操作 ToUint32。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:整数の Number) または throw 完了)。 arg を、+0𝔽 から 𝔽(232 - 1) までの閉区間にある 232 個の整数 Number 値のいずれかに変換します。 呼び出されると、次の手順を実行する。

  1. int を ? ToIntegerOrInfinity(arg) とする。
  2. 𝔽(ToFixedSizeInteger(int, unsigned, 32)) を返す。

7.1.10 ToInt16 ( arg )

抽象操作 ToInt16。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:整数の Number) または throw 完了)。 arg を、𝔽(-215) から 𝔽(215 - 1) までの閉区間にある、-0𝔽 を除く 216 個の整数 Number 値のいずれかに変換します。 呼び出されると、次の手順を実行する。

  1. int を ? ToIntegerOrInfinity(arg) とする。
  2. 𝔽(ToFixedSizeInteger(int, signed, 16)) を返す。

7.1.11 ToUint16 ( arg )

抽象操作 ToUint16。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:整数の Number) または throw 完了)。 arg を、+0𝔽 から 𝔽(216 - 1) までの閉区間にある 216 個の整数 Number 値のいずれかに変換します。 呼び出されると、次の手順を実行する。

  1. int を ? ToIntegerOrInfinity(arg) とする。
  2. 𝔽(ToFixedSizeInteger(int, unsigned, 16)) を返す。

7.1.12 ToInt8 ( arg )

抽象操作 ToInt8。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:整数の Number) または throw 完了)。 arg を、-128𝔽 から 127𝔽 までの閉区間にある、-0𝔽 を除く 28 個の整数 Number 値のいずれかに変換します。 呼び出されると、次の手順を実行する。

  1. int を ? ToIntegerOrInfinity(arg) とする。
  2. 𝔽(ToFixedSizeInteger(int, signed, 8)) を返す。

7.1.13 ToUint8 ( arg )

抽象操作 ToUint8。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:整数の Number) または throw 完了)。 arg を、+0𝔽 から 255𝔽 までの閉区間にある 28 個の整数 Number 値のいずれかに変換します。 呼び出されると、次の手順を実行する。

  1. int を ? ToIntegerOrInfinity(arg) とする。
  2. 𝔽(ToFixedSizeInteger(int, unsigned, 8)) を返す。

7.1.14 ToUint8Clamp ( arg )

抽象操作 ToUint8Clamp。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:整数の Number) または throw 完了)。 arg を、+0𝔽 から 255𝔽 までの閉区間にある 28 個の整数 Number 値のいずれかに制限して丸めます。 呼び出されると、次の手順を実行する。

  1. number を ? ToNumber(arg) とする。
  2. number が NaN である場合、+0𝔽 を返す。
  3. mv を number の拡張数学的値とする。
  4. clamped を mv を 0 と 255 の間に制限した結果とする。
  5. f を floor(clamped) とする。
  6. clamped < f + 0.5 である場合、𝔽(f) を返す。
  7. clamped > f + 0.5 である場合、𝔽(f + 1) を返す。
  8. f が偶数である場合、𝔽(f) を返す。
  9. 𝔽(f + 1) を返す。
注

他のほとんどの ECMAScript 整数変換操作とは異なり、ToUint8Clamp は整数でない値を切り捨てるのではなく丸めます。また、「五捨五入して偶数に丸める」タイブレークを使用します。これは Math.round の「五捨五入して上に丸める」タイブレークとは異なります。

7.1.15 ToBigInt ( arg )

抽象操作 ToBigInt。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:BigInt) または throw 完了)。 arg を BigInt 値に変換します。ただし、Number からの暗黙の変換が必要になる場合はスローします。 呼び出されると、次の手順を実行する。

  1. primitive を ? ToPrimitive(arg, number) とする。
  2. 表 12 で primitive に対応する値を返す。
表 12: BigInt 変換
引数の型 結果
Undefined TypeError 例外をスローする。
Null TypeError 例外をスローする。
Boolean primitive が true である場合は 1n を返し、primitive が false である場合は 0n を返す。
BigInt primitive を返す。
Number TypeError 例外をスローする。
String
  1. n を StringToBigInt(primitive) とする。
  2. n が undefined である場合、SyntaxError 例外をスローする。
  3. n を返す。
Symbol TypeError 例外をスローする。

7.1.16 StringToBigInt ( string )

抽象操作 StringToBigInt。引数 string (String)。戻り値:(BigInt または undefined)。 呼び出されると、次の手順を実行する。

  1. literal を ParseText(string, StringIntegerLiteral) とする。
  2. literal がエラーの List である場合、undefined を返す。
  3. mv を literal の MV とする。
  4. 表明: mv は整数である。
  5. ℤ(mv) を返す。

7.1.16.1 StringIntegerLiteral 文法

StringToBigInt は次の文法を使用します。

構文

StringIntegerLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrIntegerLiteral StrWhiteSpaceopt StrIntegerLiteral ::: SignedInteger[~Sep] NonDecimalIntegerLiteral[~Sep]

7.1.16.2 Runtime Semantics: MV

7.1.17 ToBigInt64 ( arg )

抽象操作 ToBigInt64。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:BigInt) または throw 完了)。 arg を、ℤ(-263) から ℤ(263 - 1) までの閉区間にある 264 個の BigInt 値のいずれかに変換します。 呼び出されると、次の手順を実行する。

  1. int を ℝ(? ToBigInt(arg)) とする。
  2. ℤ(ToFixedSizeInteger(int, signed, 64)) を返す。

7.1.18 ToBigUint64 ( arg )

抽象操作 ToBigUint64。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:BigInt) または throw 完了)。 arg を、0ℤ から ℤ(264 - 1) までの閉区間にある 264 個の BigInt 値のいずれかに変換します。 呼び出されると、次の手順を実行する。

  1. int を ℝ(? ToBigInt(arg)) とする。
  2. ℤ(ToFixedSizeInteger(int, unsigned, 64)) を返す。

7.1.19 ToString ( arg )

抽象操作 ToString。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:String) または throw 完了)。 arg を String 型の値に変換します。 呼び出されると、次の手順を実行する。

  1. arg が String である場合、arg を返す。
  2. arg が Symbol である場合、TypeError 例外をスローする。
  3. arg が undefined である場合、"undefined" を返す。
  4. arg が null である場合、"null" を返す。
  5. arg が true である場合、"true" を返す。
  6. arg が false である場合、"false" を返す。
  7. arg が Number である場合、Number::toString(arg, 10) を返す。
  8. arg が BigInt である場合、BigInt::toString(arg, 10) を返す。
  9. 表明: arg は Object である。
  10. primitiveValue を ? ToPrimitive(arg, string) とする。
  11. 表明: primitiveValue は Object ではない。
  12. ? ToString(primitiveValue) を返す。

7.1.20 ToObject ( arg )

抽象操作 ToObject。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:Object) または throw 完了)。 arg を Object 型の値に変換します。 呼び出されると、次の手順を実行する。

  1. arg が undefined または null のいずれかである場合、TypeError 例外をスローする。
  2. arg が Boolean である場合、[[BooleanData]] 内部スロットが arg に設定された新しい Boolean オブジェクトを返す。Boolean オブジェクトの説明については 20.3 を参照。
  3. arg が Number である場合、[[NumberData]] 内部スロットが arg に設定された新しい Number オブジェクトを返す。Number オブジェクトの説明については 21.1 を参照。
  4. arg が String である場合、[[StringData]] 内部スロットが arg に設定された新しい String オブジェクトを返す。String オブジェクトの説明については 22.1 を参照。
  5. arg が Symbol である場合、[[SymbolData]] 内部スロットが arg に設定された新しい Symbol オブジェクトを返す。Symbol オブジェクトの説明については 20.4 を参照。
  6. arg が BigInt である場合、[[BigIntData]] 内部スロットが arg に設定された新しい BigInt オブジェクトを返す。BigInt オブジェクトの説明については 21.2 を参照。
  7. 表明: arg は Object である。
  8. arg を返す。

7.1.21 ToPropertyKey ( arg )

抽象操作 ToPropertyKey。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:プロパティキー) または throw 完了)。 arg をプロパティキーとして使用できる値に変換します。 呼び出されると、次の手順を実行する。

  1. key を ? ToPrimitive(arg, string) とする。
  2. key が Symbol である場合、
    1. key を返す。
  3. ! ToString(key) を返す。

7.1.22 ToLength ( arg )

抽象操作 ToLength。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:非負整数の Number) または throw 完了)。 arg を、配列状オブジェクトの長さとして使用するのに適した非負の整数 Number に制限して切り捨てます。 呼び出されると、次の手順を実行する。

  1. length を ? ToIntegerOrInfinity(arg) とする。
  2. clampedLength を length を 0 と 253 - 1 の間に制限した結果とする。
  3. 𝔽(clampedLength) を返す。

7.1.23 CanonicalNumericIndexString ( arg )

抽象操作 CanonicalNumericIndexString。引数 arg (String)。戻り値:(Number または undefined)。 arg が "-0" であるか、ある Number 値 n に対する ToString(n) と正確に一致する場合、それぞれ対応する Number 値を返します。それ以外の場合は undefined を返します。 呼び出されると、次の手順を実行する。

  1. arg が "-0" である場合、-0𝔽 を返す。
  2. n を ! ToNumber(arg) とする。
  3. ! ToString(n) が arg である場合、n を返す。
  4. undefined を返す。

正準数値文字列とは、CanonicalNumericIndexString 抽象操作が undefined を返さない任意の String です。

7.1.24 ToIndex ( arg )

抽象操作 ToIndex。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:非負整数) または throw 完了)。 arg を整数に変換し、それが非負で整数インデックスに対応する場合、その整数を返します。それ以外の場合は例外をスローします。 呼び出されると、次の手順を実行する。

  1. int を ? ToIntegerOrInfinity(arg) とする。
  2. int が 0 から 253 - 1 までの閉区間にない場合、RangeError 例外をスローする。
  3. int を返す。

7.1.25 ToAbsoluteIndex ( value, length )

抽象操作 ToAbsoluteIndex。引数 value (ECMAScript 言語値) および length (非負整数)。戻り値:(正常完了 (値:(整数、+∞ または -∞)) または throw 完了)。 value を整数、+∞、または -∞ に変換し、負の値を length に対する相対値として解釈します。 呼び出されると、次の手順を実行する。

  1. int を ? ToIntegerOrInfinity(value) とする。
  2. int が有限であり、int < 0 である場合、int を length + int に設定する。
  3. int を返す。

7.1.26 ToClampedIndex ( value, length )

抽象操作 ToClampedIndex。引数 value (ECMAScript 言語値) および length (非負整数)。戻り値:(正常完了 (値:非負整数) または throw 完了)。 value を整数に変換し(負の値は length に対する相対値として解釈します)、その結果を 0 から length までの閉区間に制限します。 呼び出されると、次の手順を実行する。

  1. index を ? ToAbsoluteIndex(value, length) とする。
  2. index を 0 と length の間に制限した結果を返す。

7.2 検査および比較操作

7.2.1 RequireObjectCoercible ( arg )

抽象操作 RequireObjectCoercible。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:unused) または throw 完了)。 arg が ToObject を使用して Object に変換できない値である場合、エラーをスローします。 呼び出されると、次の手順を実行する。

  1. arg が undefined または null のいずれかである場合、TypeError 例外をスローする。
  2. unused を返す。

7.2.2 IsArray ( arg )

抽象操作 IsArray。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. arg が Object でない場合、false を返す。
  2. arg が Array 特殊オブジェクトである場合、true を返す。
  3. arg が Proxy 特殊オブジェクトである場合、
    1. ? ValidateNonRevokedProxy(arg) を実行する。
    2. proxyTarget を arg.[[ProxyTarget]] とする。
    3. ? IsArray(proxyTarget) を返す。
  4. false を返す。

7.2.3 IsCallable ( arg )

抽象操作 IsCallable。引数 arg (ECMAScript 言語値)。戻り値:Boolean。 arg が [[Call]] 内部メソッドを持つ呼出し可能な関数であるかどうかを判定します。 呼び出されると、次の手順を実行する。

  1. arg が Object でない場合、false を返す。
  2. arg が [[Call]] 内部メソッドを持つ場合、true を返す。
  3. false を返す。

7.2.4 IsConstructor ( arg )

抽象操作 IsConstructor。引数 arg (ECMAScript 言語値)。戻り値:Boolean。 arg が [[Construct]] 内部メソッドを持つ関数オブジェクトであるかどうかを判定します。 呼び出されると、次の手順を実行する。

  1. arg が Object でない場合、false を返す。
  2. arg が [[Construct]] 内部メソッドを持つ場合、true を返す。
  3. false を返す。

7.2.5 IsExtensible ( obj )

抽象操作 IsExtensible。引数 obj (Object)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 obj に追加のプロパティを追加できるかどうかを判定するために使用されます。 呼び出されると、次の手順を実行する。

  1. ? obj.[[IsExtensible]]() を返す。

7.2.6 IsRegExp ( arg )

抽象操作 IsRegExp。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. arg が Object でない場合、false を返す。
  2. matcher を ? Get(arg, %Symbol.match%) とする。
  3. matcher が undefined でない場合、ToBoolean(matcher) を返す。
  4. arg が [[RegExpMatcher]] 内部スロットを持つ場合、true を返す。
  5. false を返す。

7.2.7 Static Semantics: IsStringWellFormedUnicode ( string )

抽象操作 IsStringWellFormedUnicode。引数 string (String)。戻り値:Boolean。 6.1.4 で説明されているように、string を UTF-16 で符号化されたコードポイントの列として解釈し、それが整形式の UTF-16 列であるかどうかを判定します。 呼び出されると、次の手順を実行する。

  1. length を string の長さとする。
  2. k を 0 とする。
  3. k < length の間、次を繰り返す。
    1. codePoint を CodePointAt(string, k) とする。
    2. codePoint.[[IsUnpairedSurrogate]] が true である場合、false を返す。
    3. k を k + codePoint.[[CodeUnitCount]] に設定する。
  4. true を返す。

7.2.8 SameType ( x, y )

抽象操作 SameType。引数 x (ECMAScript 言語値) および y (ECMAScript 言語値)。戻り値:Boolean。 2つの引数が同じ型であるかどうかを判定します。 呼び出されると、次の手順を実行する。

  1. x が undefined かつ y が undefined である場合、true を返す。
  2. x が null かつ y が null である場合、true を返す。
  3. x が Boolean かつ y が Boolean である場合、true を返す。
  4. x が Number かつ y が Number である場合、true を返す。
  5. x が BigInt かつ y が BigInt である場合、true を返す。
  6. x が Symbol かつ y が Symbol である場合、true を返す。
  7. x が String かつ y が String である場合、true を返す。
  8. x が Object かつ y が Object である場合、true を返す。
  9. false を返す。

7.2.9 SameValue ( x, y )

抽象操作 SameValue。引数 x (ECMAScript 言語値) および y (ECMAScript 言語値)。戻り値:Boolean。 2つの引数が同じ値であるかどうかを判定します。 呼び出されると、次の手順を実行する。

  1. SameType(x, y) が false である場合、false を返す。
  2. x が Number である場合、
    1. Number::sameValue(x, y) を返す。
  3. SameValueNonNumber(x, y) を返す。
注

このアルゴリズムは、すべての NaN 値を等価として扱い、+0𝔽 と -0𝔽 を区別する点で、IsStrictlyEqual アルゴリズムと異なります。

7.2.10 SameValueZero ( x, y )

抽象操作 SameValueZero。引数 x (ECMAScript 言語値) および y (ECMAScript 言語値)。戻り値:Boolean。 2つの引数が同じ値であるかどうかを判定します(+0𝔽 と -0𝔽 の違いは無視します)。 呼び出されると、次の手順を実行する。

  1. SameType(x, y) が false である場合、false を返す。
  2. x が Number である場合、
    1. Number::sameValueZero(x, y) を返す。
  3. SameValueNonNumber(x, y) を返す。
注

SameValueZero は、+0𝔽 と -0𝔽 を等価として扱う点だけが SameValue と異なります。

7.2.11 SameValueNonNumber ( x, y )

抽象操作 SameValueNonNumber。引数 x (an ECMAScript language value, but not a Number) および y (an ECMAScript language value, but not a Number)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. 表明: SameType(x, y) は true である。
  2. x が undefined または null のいずれかである場合、true を返す。
  3. x が BigInt である場合、
    1. BigInt::equal(x, y) を返す。
  4. x が String である場合、
    1. x と y の長さが同じで、同じ位置に同じコード単位を持つ場合、true を返す。
    2. false を返す。
  5. x が Boolean である場合、
    1. x が true かつ y が true である場合、true を返す。
    2. x が false かつ y が false である場合、true を返す。
    3. false を返す。
  6. 注記: その他すべての ECMAScript 言語値は同一性によって比較される。
  7. x が y である場合、true を返す。
  8. false を返す。
注 1
説明上の目的のため、不要であっても、このアルゴリズム内では一部のケースを個別に処理しています。
注 2
「x が y である」が具体的に何を意味するかは、5.2.8 で詳しく説明されています。

7.2.12 IsLessThan ( x, y, leftFirst )

抽象操作 IsLessThan。引数 x (ECMAScript 言語値)、y (ECMAScript 言語値) および leftFirst (Boolean)。戻り値:(正常完了 (値:(Boolean または undefined)) または throw 完了)。 比較 x < y の意味論を提供し、true、false、または undefined(オペランドを同じ数値型の比較可能な値に型強制できなかったことを示します)を返します。leftFirst フラグは、x および y に対して実行される、観測可能な副作用を持つ可能性がある操作の順序を制御するために使用されます。ECMAScript は式を左から右へ評価すると規定しているため、これは必要です。leftFirst が true である場合、x パラメーターは y パラメーターに対応する式より左側に現れる式に対応します。leftFirst が false である場合は逆であり、x より前に y に対する操作を実行しなければなりません。 呼び出されると、次の手順を実行する。

  1. leftFirst が true である場合、
    1. px を ? ToPrimitive(x, number) とする。
    2. py を ? ToPrimitive(y, number) とする。
  2. そうでない場合、
    1. 注記: 左から右への評価を維持するため、評価順序を反転する必要がある。
    2. py を ? ToPrimitive(y, number) とする。
    3. px を ? ToPrimitive(x, number) とする。
  3. px が String かつ py が String である場合、
    1. lx を px の長さとする。
    2. ly を py の長さとする。
    3. 0 ≤ i < min(lx, ly) を満たす各整数 i について、昇順に、次を行う。
      1. cx を px 内のインデックス i にあるコード単位の数値とする。
      2. cy を py 内のインデックス i にあるコード単位の数値とする。
      3. cx < cy である場合、true を返す。
      4. cx > cy である場合、false を返す。
    4. lx < ly である場合、true を返す。
    5. false を返す。
  4. px が BigInt かつ py が String である場合、
    1. ny を StringToBigInt(py) とする。
    2. ny が undefined である場合、undefined を返す。
    3. BigInt::lessThan(px, ny) を返す。
  5. px が String かつ py が BigInt である場合、
    1. nx を StringToBigInt(px) とする。
    2. nx が undefined である場合、undefined を返す。
    3. BigInt::lessThan(nx, py) を返す。
  6. 注記: px と py はプリミティブ値であるため、評価順序は重要ではない。
  7. nx を ? ToNumeric(px) とする。
  8. ny を ? ToNumeric(py) とする。
  9. SameType(nx, ny) が true である場合、
    1. nx が Number である場合、Number::lessThan(nx, ny) を返す。
    2. 表明: nx は BigInt である。
    3. BigInt::lessThan(nx, ny) を返す。
  10. 表明: nx が BigInt かつ ny が Number であるか、nx が Number かつ ny が BigInt である。
  11. nx が NaN または ny が NaN である場合、undefined を返す。
  12. nx が -∞𝔽 または ny が +∞𝔽 である場合、true を返す。
  13. nx が +∞𝔽 または ny が -∞𝔽 である場合、false を返す。
  14. ℝ(nx) < ℝ(ny) である場合、true を返す。
  15. false を返す。
注 1

手順 3 は、加算演算子 + を処理するアルゴリズム(13.15.3)の手順 1.c と異なり、論理 OR 演算ではなく論理 AND 演算を使用します。

注 2

String の比較では、UTF-16 コード単位値の列に対して単純な辞書式順序を使用します。Unicode 仕様で定義される、より複雑で意味指向の文字または文字列の等価性や照合順序の定義を使用しようとはしません。そのため、Unicode 標準に従って正準的に等価であっても、同じ正規化形式ではない String 値は不等と判定される場合があります。また、サロゲートペアを含む String では、コード単位による辞書式順序とコードポイントによる順序が異なることにも注意してください。

7.2.13 IsLooselyEqual ( x, y )

抽象操作 IsLooselyEqual。引数 x (ECMAScript 言語値) および y (ECMAScript 言語値)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 == 演算子の意味論を提供します。 呼び出されると、次の手順を実行する。

  1. SameType(x, y) が true である場合、
    1. IsStrictlyEqual(x, y) を返す。
  2. x が null であり、y が undefined である場合、true を返す。
  3. x が undefined であり、y が null である場合、true を返す。
  4. Normative Optional
    ホストがウェブブラウザーであるか、またはその他の方法で [[IsHTMLDDA]] 内部スロット をサポートする場合、
    1. x が Object であり、x が [[IsHTMLDDA]] 内部スロットを持ち、かつ y が undefined または null のいずれかである場合、true を返す。
    2. x が undefined または null のいずれかであり、y が Object であり、かつ y が [[IsHTMLDDA]] 内部スロットを持つ場合、true を返す。
  5. x が Number であり、y が String である場合、! IsLooselyEqual(x, ! ToNumber(y)) を返す。
  6. x が String であり、y が Number である場合、! IsLooselyEqual(! ToNumber(x), y) を返す。
  7. x が BigInt であり、y が String である場合、
    1. n を StringToBigInt(y) とする。
    2. n が undefined である場合、false を返す。
    3. ! IsLooselyEqual(x, n) を返す。
  8. x が String であり、y が BigInt である場合、! IsLooselyEqual(y, x) を返す。
  9. x が Boolean である場合、! IsLooselyEqual(! ToNumber(x), y) を返す。
  10. y が Boolean である場合、! IsLooselyEqual(x, ! ToNumber(y)) を返す。
  11. x が String、Number、BigInt、または Symbol のいずれかであり、y が Object である場合、! IsLooselyEqual(x, ? ToPrimitive(y)) を返す。
  12. x が Object であり、y が String、Number、BigInt、または Symbol のいずれかである場合、! IsLooselyEqual(? ToPrimitive(x), y) を返す。
  13. x が BigInt であり、y が有限 Number である場合、または x が有限 Number であり、y が BigInt である場合、
    1. ℝ(x) = ℝ(y) である場合、true を返す。
    2. false を返す。
  14. false を返す。

7.2.14 IsStrictlyEqual ( x, y )

抽象操作 IsStrictlyEqual。引数 x (ECMAScript 言語値) および y (ECMAScript 言語値)。戻り値:Boolean。 === 演算子の意味論を提供します。 呼び出されると、次の手順を実行する。

  1. SameType(x, y) が false である場合、false を返す。
  2. x が Number である場合、
    1. Number::equal(x, y) を返す。
  3. SameValueNonNumber(x, y) を返す。
注

このアルゴリズムは、符号付きゼロおよび NaN の扱いが SameValue アルゴリズムと異なります。

7.3 オブジェクトに対する操作

7.3.1 MakeBasicObject ( internalSlotsList )

抽象操作 MakeBasicObject。引数 internalSlotsList (リスト (要素:内部スロット名))。戻り値:Object。 通常オブジェクトと特殊オブジェクトの両方を含め、アルゴリズムによって作成されるすべての ECMAScript オブジェクトの生成元です。すべてのオブジェクトの作成で使用される共通の手順を切り出し、オブジェクト作成を一元化します。 呼び出されると、次の手順を実行する。

  1. internalSlotsList を、internalSlotsList と « [[PrivateElements]] » のリスト連結に設定する。
  2. obj を、internalSlotsList 内の各名前に対応する内部スロットを持つ、新しく作成されたオブジェクトとする。
  3. 注記: Object の内部メソッドと内部スロット で説明されているように、特に指定されていない限り、このような各内部スロットの初期値は undefined である。
  4. obj.[[PrivateElements]] を新しい空の List に設定する。
  5. obj の必須内部メソッドを、10.1 で規定される通常オブジェクトの既定の定義に設定する。
  6. 表明: 呼出し元が obj の [[GetPrototypeOf]] および [[SetPrototypeOf]] の両方の必須内部メソッドを上書きしない場合、internalSlotsList は [[Prototype]] を含む。
  7. 表明: 呼出し元が obj の [[SetPrototypeOf]]、[[IsExtensible]]、および [[PreventExtensions]] のすべての必須内部メソッドを上書きしない場合、internalSlotsList は [[Extensible]] を含む。
  8. internalSlotsList が [[Extensible]] を含む場合、obj.[[Extensible]] を true に設定する。
  9. obj を返す。
注

この仕様内では、特殊オブジェクトは ArrayCreate や BoundFunctionCreate などの抽象操作内で、まず MakeBasicObject を呼び出して基本的な基盤オブジェクトを取得し、その後そのオブジェクトの内部メソッドの一部または全部を上書きすることで作成されます。特殊オブジェクトの作成をカプセル化するため、オブジェクトの必須内部メソッドはこれらの操作の外部では変更されません。

7.3.2 Get ( obj, propertyKey )

抽象操作 Get。引数 obj (Object) および propertyKey (プロパティキー)。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 オブジェクトの特定のプロパティの値を取得するために使用されます。 呼び出されると、次の手順を実行する。

  1. ? obj.[[Get]](propertyKey, obj) を返す。

7.3.3 GetV ( value, propertyKey )

抽象操作 GetV。引数 value (ECMAScript 言語値) および propertyKey (プロパティキー)。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 ECMAScript 言語値の特定のプロパティの値を取得するために使用されます。値がオブジェクトでない場合、その値の型に適したラッパーオブジェクトを使用してプロパティ検索が実行されます。 呼び出されると、次の手順を実行する。

  1. obj を ? ToObject(value) とする。
  2. ? obj.[[Get]](propertyKey, value) を返す。

7.3.4 Set ( obj, propertyKey, value, throw )

抽象操作 Set。引数 obj (Object)、propertyKey (プロパティキー)、value (ECMAScript 言語値) および throw (Boolean)。戻り値:(正常完了 (値:unused) または throw 完了)。 オブジェクトの特定のプロパティの値を設定するために使用されます。value はそのプロパティの新しい値です。 呼び出されると、次の手順を実行する。

  1. success を ? obj.[[Set]](propertyKey, value, obj) とする。
  2. success が false かつ throw が true である場合、TypeError 例外をスローする。
  3. unused を返す。

7.3.5 CreateDataProperty ( obj, propertyKey, value )

抽象操作 CreateDataProperty。引数 obj (Object)、propertyKey (プロパティキー) および value (ECMAScript 言語値)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 オブジェクトに新しい自身のプロパティを作成するために使用されます。 呼び出されると、次の手順を実行する。

  1. newDesc を PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } とする。
  2. ? obj.[[DefineOwnProperty]](propertyKey, newDesc) を返す。
注

この抽象操作は、ECMAScript 言語の代入演算子によって作成されるプロパティと同じ既定値に属性が設定されたプロパティを作成します。通常、そのプロパティはまだ存在していません。すでに存在し、構成不可である場合、または obj が拡張可能でない場合、[[DefineOwnProperty]] は false を返します。

7.3.6 CreateDataPropertyOrThrow ( obj, propertyKey, value )

抽象操作 CreateDataPropertyOrThrow。引数 obj (Object)、propertyKey (プロパティキー) および value (ECMAScript 言語値)。戻り値:(正常完了 (値:unused) または throw 完了)。 オブジェクトに新しい自身のプロパティを作成するために使用されます。要求されたプロパティの更新を実行できない場合、TypeError 例外をスローします。 呼び出されると、次の手順を実行する。

  1. success を ? CreateDataProperty(obj, propertyKey, value) とする。
  2. success が false である場合、TypeError 例外をスローする。
  3. unused を返す。
注

この抽象操作は、ECMAScript 言語の代入演算子によって作成されるプロパティと同じ既定値に属性が設定されたプロパティを作成します。通常、そのプロパティはまだ存在していません。すでに存在し、構成不可である場合、または obj が拡張可能でない場合、[[DefineOwnProperty]] は false を返し、この操作は TypeError 例外をスローします。

7.3.7 CreateNonEnumerableDataPropertyOrThrow ( obj, propertyKey, value )

抽象操作 CreateNonEnumerableDataPropertyOrThrow。引数 obj (Object)、propertyKey (プロパティキー) および value (ECMAScript 言語値)。戻り値:unused。 通常オブジェクトに、新しい列挙不可の自身のプロパティを作成するために使用されます。 呼び出されると、次の手順を実行する。

  1. 表明: obj は、構成不可のプロパティを持たない通常の拡張可能なオブジェクトである。
  2. newDesc を PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true } とする。
  3. ! DefinePropertyOrThrow(obj, propertyKey, newDesc) を実行する。
  4. unused を返す。
注

この抽象操作は、列挙不可であることを除き、ECMAScript 言語の代入演算子によって作成されるプロパティと同じ既定値に属性が設定されたプロパティを作成します。通常、そのプロパティはまだ存在していません。すでに存在する場合でも、DefinePropertyOrThrow は正常に完了することが保証されています。

7.3.8 DefinePropertyOrThrow ( obj, propertyKey, propertyDesc )

抽象操作 DefinePropertyOrThrow。引数 obj (Object)、propertyKey (プロパティキー) および propertyDesc (プロパティ記述子)。戻り値:(正常完了 (値:unused) または throw 完了)。 要求されたプロパティの更新を実行できない場合に TypeError 例外をスローする方法で、オブジェクトの [[DefineOwnProperty]] 内部メソッドを呼び出すために使用されます。 呼び出されると、次の手順を実行する。

  1. success を ? obj.[[DefineOwnProperty]](propertyKey, propertyDesc) とする。
  2. success が false である場合、TypeError 例外をスローする。
  3. unused を返す。

7.3.9 DeletePropertyOrThrow ( obj, propertyKey )

抽象操作 DeletePropertyOrThrow。引数 obj (Object) および propertyKey (プロパティキー)。戻り値:(正常完了 (値:unused) または throw 完了)。 オブジェクトの特定の自身のプロパティを削除するために使用されます。そのプロパティが構成不可である場合、例外をスローします。 呼び出されると、次の手順を実行する。

  1. success を ? obj.[[Delete]](propertyKey) とする。
  2. success が false である場合、TypeError 例外をスローする。
  3. unused を返す。

7.3.10 GetMethod ( value, propertyKey )

抽象操作 GetMethod。引数 value (ECMAScript 言語値) および propertyKey (プロパティキー)。戻り値:(正常完了 (値:(関数オブジェクト または undefined)) または throw 完了)。 プロパティの値が関数であることが期待される場合に、ECMAScript 言語値の特定のプロパティの値を取得するために使用されます。 呼び出されると、次の手順を実行する。

  1. func を ? GetV(value, propertyKey) とする。
  2. func が undefined または null のいずれかである場合、undefined を返す。
  3. IsCallable(func) が false である場合、TypeError 例外をスローする。
  4. func を返す。

7.3.11 HasProperty ( obj, propertyKey )

抽象操作 HasProperty。引数 obj (Object) および propertyKey (プロパティキー)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 オブジェクトが指定されたプロパティキーを持つプロパティを持っているかどうかを判定するために使用されます。そのプロパティは自身のプロパティまたは継承プロパティのいずれでもかまいません。 呼び出されると、次の手順を実行する。

  1. ? obj.[[HasProperty]](propertyKey) を返す。

7.3.12 HasOwnProperty ( obj, propertyKey )

抽象操作 HasOwnProperty。引数 obj (Object) および propertyKey (プロパティキー)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 オブジェクトが指定されたプロパティキーを持つ自身のプロパティを持っているかどうかを判定するために使用されます。 呼び出されると、次の手順を実行する。

  1. propertyDesc を ? obj.[[GetOwnProperty]](propertyKey) とする。
  2. propertyDesc が undefined である場合、false を返す。
  3. true を返す。

7.3.13 Call ( func, thisValue [ , argList ] )

抽象操作 Call。引数 func (ECMAScript 言語値) および thisValue (ECMAScript 言語値)および省略可能な引数 argList (リスト (要素:ECMAScript 言語値))。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 関数オブジェクトの [[Call]] 内部メソッドを呼び出すために使用されます。func は関数オブジェクト、thisValue は [[Call]] の this 値となる ECMAScript 言語値、argList は内部メソッドの対応する引数に渡される値です。argList が存在しない場合、新しい空の List がその値として使用されます。 呼び出されると、次の手順を実行する。

  1. argList が存在しない場合、argList を新しい空の List に設定する。
  2. IsCallable(func) が false である場合、TypeError 例外をスローする。
  3. ? func.[[Call]](thisValue, argList) を返す。

7.3.14 Construct ( ctor [ , argList [ , newTarget ] ] )

抽象操作 Construct。引数 ctor (コンストラクター)および省略可能な引数 argList (リスト (要素:ECMAScript 言語値)) および newTarget (コンストラクター)。戻り値:(正常完了 (値:Object) または throw 完了)。 関数オブジェクトの [[Construct]] 内部メソッドを呼び出すために使用されます。argList と newTarget は、内部メソッドの対応する引数として渡される値です。argList が存在しない場合、新しい空の List がその値として使用されます。newTarget が存在しない場合、ctor がその値として使用されます。 呼び出されると、次の手順を実行する。

  1. newTarget が存在しない場合、newTarget を ctor に設定する。
  2. argList が存在しない場合、argList を新しい空の List に設定する。
  3. ? ctor.[[Construct]](argList, newTarget) を返す。
注

newTarget が存在しない場合、この操作は new F(...argumentsList) と同等です。

7.3.15 SetIntegrityLevel ( obj, level )

抽象操作 SetIntegrityLevel。引数 obj (Object) および level ((sealed または frozen))。戻り値:(正常完了 (値:Boolean) または throw 完了)。 オブジェクト自身のプロパティの集合を固定するために使用されます。 呼び出されると、次の手順を実行する。

  1. status を ? obj.[[PreventExtensions]]() とする。
  2. status が false である場合、false を返す。
  3. keys を ? obj.[[OwnPropertyKeys]]() とする。
  4. level が sealed である場合、
    1. keys の各要素 key について、次を行う。
      1. ? DefinePropertyOrThrow(obj, key, PropertyDescriptor { [[Configurable]]: false }) を実行する。
  5. そうでない場合、
    1. 表明: level は frozen である。
    2. keys の各要素 key について、次を行う。
      1. currentDesc を ? obj.[[GetOwnProperty]](key) とする。
      2. currentDesc が undefined でない場合、
        1. IsAccessorDescriptor(currentDesc) が true である場合、
          1. propertyDesc を PropertyDescriptor { [[Configurable]]: false } とする。
        2. そうでない場合、
          1. propertyDesc を PropertyDescriptor { [[Configurable]]: false, [[Writable]]: false } とする。
        3. ? DefinePropertyOrThrow(obj, key, propertyDesc) を実行する。
  6. true を返す。

7.3.16 TestIntegrityLevel ( obj, level )

抽象操作 TestIntegrityLevel。引数 obj (Object) および level ((sealed または frozen))。戻り値:(正常完了 (値:Boolean) または throw 完了)。 オブジェクト自身のプロパティの集合が固定されているかどうかを判定するために使用されます。 呼び出されると、次の手順を実行する。

  1. extensible を ? IsExtensible(obj) とする。
  2. extensible が true である場合、false を返す。
  3. 注記: オブジェクトが拡張可能である場合、そのプロパティはいずれも検査されない。
  4. keys を ? obj.[[OwnPropertyKeys]]() とする。
  5. keys の各要素 key について、次を行う。
    1. currentDesc を ? obj.[[GetOwnProperty]](key) とする。
    2. currentDesc が undefined でない場合、
      1. currentDesc.[[Configurable]] が true である場合、false を返す。
      2. level が frozen かつ IsDataDescriptor(currentDesc) が true である場合、
        1. currentDesc.[[Writable]] が true である場合、false を返す。
  6. true を返す。

7.3.17 CreateArrayFromList ( elements )

抽象操作 CreateArrayFromList。引数 elements (リスト (要素:ECMAScript 言語値))。戻り値:Array。 elements によって要素が提供される Array を作成するために使用されます。 呼び出されると、次の手順を実行する。

  1. array を ! ArrayCreate(0) とする。
  2. n を 0 とする。
  3. elements の各要素 element について、次を行う。
    1. ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(n)), element) を実行する。
    2. n を n + 1 に設定する。
  4. array を返す。

7.3.18 LengthOfArrayLike ( obj )

抽象操作 LengthOfArrayLike。引数 obj (Object)。戻り値:(正常完了 (値:非負整数) または throw 完了)。 配列状オブジェクトの "length" プロパティの値を返します。 呼び出されると、次の手順を実行する。

  1. ℝ(? ToLength(? Get(obj, "length"))) を返す。

配列状オブジェクトとは、この操作が正常完了を返す任意のオブジェクトです。

注 1
通常、配列状オブジェクトは整数インデックス名を持ついくつかのプロパティも持ちます。ただし、これはこの定義の要件ではありません。
注 2
Array および String オブジェクトは、配列状オブジェクトの例です。

7.3.19 CreateListFromArrayLike ( obj [ , validElementTypes ] )

抽象操作 CreateListFromArrayLike。引数 obj (ECMAScript 言語値)および省略可能な引数 validElementTypes ((all または property-key))。戻り値:(正常完了 (値:リスト (要素:ECMAScript 言語値)) または throw 完了)。 obj のインデックス付きプロパティによって要素が提供される List 値を作成するために使用されます。validElementTypes は、要素として許可される値の型を示します。 呼び出されると、次の手順を実行する。

  1. validElementTypes が存在しない場合、validElementTypes を all に設定する。
  2. obj が Object でない場合、TypeError 例外をスローする。
  3. length を ? LengthOfArrayLike(obj) とする。
  4. list を新しい空の List とする。
  5. index を 0 とする。
  6. index < length の間、次を繰り返す。
    1. indexName を ! ToString(𝔽(index)) とする。
    2. next を ? Get(obj, indexName) とする。
    3. validElementTypes が property-key かつ next がプロパティキーでない場合、TypeError 例外をスローする。
    4. next を list に追加する。
    5. index を index + 1 に設定する。
  7. list を返す。

7.3.20 Invoke ( value, propertyKey [ , argList ] )

抽象操作 Invoke。引数 value (ECMAScript 言語値) および propertyKey (プロパティキー)および省略可能な引数 argList (リスト (要素:ECMAScript 言語値))。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 ECMAScript 言語値のメソッドプロパティを呼び出すために使用されます。value は、プロパティ検索位置と呼出しの this 値の両方として機能します。argList はメソッドに渡される引数値の List です。argList が存在しない場合、新しい空の List がその値として使用されます。 呼び出されると、次の手順を実行する。

  1. argList が存在しない場合、argList を新しい空の List に設定する。
  2. func を ? GetV(value, propertyKey) とする。
  3. ? Call(func, value, argList) を返す。

7.3.21 OrdinaryHasInstance ( ctor, instance )

抽象操作 OrdinaryHasInstance。引数 ctor (ECMAScript 言語値) および instance (ECMAScript 言語値)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 instance が ctor によって提供されるインスタンスオブジェクトの継承経路から継承しているかどうかを判定する既定のアルゴリズムを実装します。 呼び出されると、次の手順を実行する。

  1. IsCallable(ctor) が false である場合、false を返す。
  2. ctor が [[BoundTargetFunction]] 内部スロットを持つ場合、
    1. boundCtor を ctor.[[BoundTargetFunction]] とする。
    2. ? InstanceofOperator(instance, boundCtor) を返す。
  3. instance が Object でない場合、false を返す。
  4. proto を ? Get(ctor, "prototype") とする。
  5. proto が Object でない場合、TypeError 例外をスローする。
  6. 次を繰り返す。
    1. instance を ? instance.[[GetPrototypeOf]]() に設定する。
    2. instance が null である場合、false を返す。
    3. SameValue(proto, instance) が true である場合、true を返す。

7.3.22 SpeciesConstructor ( obj, defaultCtor )

抽象操作 SpeciesConstructor。引数 obj (Object) および defaultCtor (コンストラクター)。戻り値:(正常完了 (値:コンストラクター) または throw 完了)。 obj から派生する新しいオブジェクトを作成するために使用するべきコンストラクターを取得するために使用されます。defaultCtor は、obj から開始してコンストラクターの %Symbol.species% プロパティを見つけられない場合に使用するコンストラクターです。 呼び出されると、次の手順を実行する。

  1. ctor を ? Get(obj, "constructor") とする。
  2. ctor が undefined である場合、defaultCtor を返す。
  3. ctor が Object でない場合、TypeError 例外をスローする。
  4. species を ? Get(ctor, %Symbol.species%) とする。
  5. species が undefined または null のいずれかである場合、defaultCtor を返す。
  6. IsConstructor(species) が true である場合、species を返す。
  7. TypeError 例外をスローする。

7.3.23 EnumerableOwnProperties ( obj, kind )

抽象操作 EnumerableOwnProperties。引数 obj (Object) および kind ((key、value または key+value))。戻り値:(正常完了 (値:リスト (要素:ECMAScript 言語値)) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. ownKeys を ? obj.[[OwnPropertyKeys]]() とする。
  2. results を新しい空の List とする。
  3. ownKeys の各要素 key について、次を行う。
    1. key が String である場合、
      1. propertyDesc を ? obj.[[GetOwnProperty]](key) とする。
      2. propertyDesc が undefined でなく、propertyDesc.[[Enumerable]] が true である場合、
        1. kind が key である場合、
          1. key を results に追加する。
        2. そうでない場合、
          1. value を ? Get(obj, key) とする。
          2. kind が value である場合、
            1. value を results に追加する。
          3. そうでない場合、
            1. 表明: kind は key+value である。
            2. entry を CreateArrayFromList(« key, value ») とする。
            3. entry を results に追加する。
  4. results を返す。

7.3.24 GetFunctionRealm ( func )

抽象操作 GetFunctionRealm。引数 func (関数オブジェクト)。戻り値:(正常完了 (値:Realmレコード) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. func が [[Realm]] 内部スロットを持つ場合、
    1. func.[[Realm]] を返す。
  2. func が束縛関数特殊オブジェクトである場合、
    1. boundTargetFunc を func.[[BoundTargetFunction]] とする。
    2. ? GetFunctionRealm(boundTargetFunc) を返す。
  3. func が Proxy 特殊オブジェクトである場合、
    1. ? ValidateNonRevokedProxy(func) を実行する。
    2. proxyTarget を func.[[ProxyTarget]] とする。
    3. 表明: proxyTarget は関数オブジェクトである。
    4. ? GetFunctionRealm(proxyTarget) を返す。
  4. 現在の Realm Record を返す。
注

手順 4 に到達するのは、func が [[Realm]] 内部スロットを持たない非標準の関数特殊オブジェクトである場合に限られます。

7.3.25 CopyDataProperties ( target, source, excludedItems )

抽象操作 CopyDataProperties。引数 target (Object)、source (ECMAScript 言語値) および excludedItems (リスト (要素:プロパティキー))。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. source が undefined または null のいずれかである場合、unused を返す。
  2. from を ! ToObject(source) とする。
  3. keys を ? from.[[OwnPropertyKeys]]() とする。
  4. keys の各要素 nextKey について、次を行う。
    1. excluded を false とする。
    2. excludedItems の各要素 element について、次を行う。
      1. SameValue(element, nextKey) が true である場合、
        1. excluded を true に設定する。
    3. excluded が false である場合、
      1. propertyDesc を ? from.[[GetOwnProperty]](nextKey) とする。
      2. propertyDesc が undefined でなく、propertyDesc.[[Enumerable]] が true である場合、
        1. propertyValue を ? Get(from, nextKey) とする。
        2. ! CreateDataPropertyOrThrow(target, nextKey, propertyValue) を実行する。
  5. unused を返す。
注

ここに渡されるターゲットは常に新しく作成されたオブジェクトであり、エラーがスローされた場合には直接アクセスできません。

7.3.26 PrivateElementFind ( obj, privateName )

抽象操作 PrivateElementFind。引数 obj (Object) および privateName (プライベート名)。戻り値:(PrivateElement または empty)。 呼び出されると、次の手順を実行する。

  1. obj.[[PrivateElements]] が、entry.[[Key]] が privateName であるような PrivateElement entry を含む場合、
    1. entry を返す。
  2. empty を返す。

7.3.27 PrivateFieldAdd ( obj, privateName, value )

抽象操作 PrivateFieldAdd。引数 obj (Object)、privateName (プライベート名) および value (ECMAScript 言語値)。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. ホストが Web ブラウザーである場合、
    1. ? HostEnsureCanAddPrivateElement(obj) を実行する。
  2. entry を PrivateElementFind(obj, privateName) とする。
  3. entry が empty でない場合、TypeError 例外をスローする。
  4. PrivateElement { [[Key]]: privateName, [[Kind]]: field, [[Value]]: value } を obj.[[PrivateElements]] に追加する。
  5. unused を返す。

7.3.28 PrivateMethodOrAccessorAdd ( obj, method )

抽象操作 PrivateMethodOrAccessorAdd。引数 obj (Object) および method (PrivateElement)。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. 表明: method.[[Kind]] は method または accessor のいずれかである。
  2. ホストが Web ブラウザーである場合、
    1. ? HostEnsureCanAddPrivateElement(obj) を実行する。
  3. entry を PrivateElementFind(obj, method.[[Key]]) とする。
  4. entry が empty でない場合、TypeError 例外をスローする。
  5. method を obj.[[PrivateElements]] に追加する。
  6. unused を返す。
注

プライベートメソッドおよびアクセサーの値は、インスタンス間で共有されます。この操作は、メソッドまたはアクセサーの新しいコピーを作成しません。

7.3.29 HostEnsureCanAddPrivateElement ( obj )

ホスト定義の抽象操作 HostEnsureCanAddPrivateElement。引数 obj (Object)。戻り値:(正常完了 (値:unused) または throw 完了)。 ホスト環境が、特定のホスト定義特殊オブジェクトへのプライベート要素の追加を防止できるようにします。

HostEnsureCanAddPrivateElement の実装は、次の要件に適合しなければなりません。

HostEnsureCanAddPrivateElement の既定の実装は、NormalCompletion(unused) を返すことです。

この抽象操作は、Web ブラウザーである ECMAScript ホストによってのみ呼び出されます。

7.3.30 PrivateGet ( obj, privateName )

抽象操作 PrivateGet。引数 obj (Object) および privateName (プライベート名)。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. entry を PrivateElementFind(obj, privateName) とする。
  2. entry が empty である場合、TypeError 例外をスローする。
  3. entry.[[Kind]] が field または method のいずれかである場合、
    1. entry.[[Value]] を返す。
  4. 表明: entry.[[Kind]] は accessor である。
  5. entry.[[Getter]] が undefined である場合、TypeError 例外をスローする。
  6. getter を entry.[[Getter]] とする。
  7. ? Call(getter, obj) を返す。

7.3.31 PrivateSet ( obj, privateName, value )

抽象操作 PrivateSet。引数 obj (Object)、privateName (プライベート名) および value (ECMAScript 言語値)。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. entry を PrivateElementFind(obj, privateName) とする。
  2. entry が empty である場合、TypeError 例外をスローする。
  3. entry.[[Kind]] が method である場合、TypeError 例外をスローする。
  4. entry.[[Kind]] が field である場合、
    1. entry.[[Value]] を value に設定する。
  5. そうでない場合、
    1. 表明: entry.[[Kind]] は accessor である。
    2. entry.[[Setter]] が undefined である場合、TypeError 例外をスローする。
    3. setter を entry.[[Setter]] とする。
    4. ? Call(setter, obj, « value ») を実行する。
  6. unused を返す。

7.3.32 DefineField ( receiver, fieldRecord )

抽象操作 DefineField。引数 receiver (Object) および fieldRecord (ClassFieldDefinitionレコード)。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. fieldName を fieldRecord.[[Name]] とする。
  2. initializer を fieldRecord.[[Initializer]] とする。
  3. initializer が empty でない場合、
    1. initValue を ? Call(initializer, receiver) とする。
  4. そうでない場合、
    1. initValue を undefined とする。
  5. fieldName が Private Name である場合、
    1. ? PrivateFieldAdd(receiver, fieldName, initValue) を実行する。
  6. そうでない場合、
    1. 表明: fieldName はプロパティキーである。
    2. ? CreateDataPropertyOrThrow(receiver, fieldName, initValue) を実行する。
  7. unused を返す。

7.3.33 InitializeInstanceElements ( obj, ctor )

抽象操作 InitializeInstanceElements。引数 obj (Object) および ctor ((ECMAScript 関数オブジェクト または 組込み関数オブジェクト))。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. methods を ctor.[[PrivateMethods]] とする。
  2. methods の各 PrivateElement method について、次を行う。
    1. ? PrivateMethodOrAccessorAdd(obj, method) を実行する。
  3. fields を ctor.[[Fields]] とする。
  4. fields の各要素 fieldRecord について、次を行う。
    1. ? DefineField(obj, fieldRecord) を実行する。
  5. unused を返す。

7.3.34 AddValueToKeyedGroup ( groups, key, value )

抽象操作 AddValueToKeyedGroup。引数 groups (リスト (要素:レコード (フィールド:[[Key]] (ECMAScript 言語値), [[Elements]] (リスト (要素:ECMAScript 言語値)))))、key (ECMAScript 言語値) および value (ECMAScript 言語値)。戻り値:unused。 呼び出されると、次の手順を実行する。

  1. groups の各 Record { [[Key]], [[Elements]] } group について、次を行う。
    1. SameValue(group.[[Key]], key) が true である場合、
      1. 表明: groups のうち、この基準を満たす要素は正確に1つである。
      2. value を group.[[Elements]] に追加する。
      3. unused を返す。
  2. group を Record { [[Key]]: key, [[Elements]]: « value » } とする。
  3. group を groups に追加する。
  4. unused を返す。

7.3.35 GroupBy ( items, callback, keyCoercion )

抽象操作 GroupBy。引数 items (ECMAScript 言語値)、callback (ECMAScript 言語値) および keyCoercion ((property または collection))。戻り値:(正常完了 (値:リスト (要素:レコード (フィールド:[[Key]] (ECMAScript 言語値), [[Elements]] (リスト (要素:ECMAScript 言語値))))) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. ? RequireObjectCoercible(items) を実行する。
  2. IsCallable(callback) が false である場合、TypeError 例外をスローする。
  3. groups を新しい空の List とする。
  4. iteratorRecord を ? GetIterator(items, sync) とする。
  5. k を 0 とする。
  6. 次を繰り返す。
    1. k ≥ 253 - 1 である場合、
      1. error を ThrowCompletion(新しく作成された TypeError オブジェクト) とする。
      2. ? IteratorClose(iteratorRecord, error) を返す。
    2. next を ? IteratorStepValue(iteratorRecord) とする。
    3. next が done である場合、
      1. groups を返す。
    4. value を next とする。
    5. key を Completion(Call(callback, undefined, « value, 𝔽(k) »)) とする。
    6. IfAbruptCloseIterator(key, iteratorRecord)。
    7. keyCoercion が property である場合、
      1. key を Completion(ToPropertyKey(key)) に設定する。
      2. IfAbruptCloseIterator(key, iteratorRecord)。
    8. そうでない場合、
      1. 表明: keyCoercion は collection である。
      2. key を CanonicalizeKeyedCollectionKey(key) に設定する。
    9. AddValueToKeyedGroup(groups, key, value) を実行する。
    10. k を k + 1 に設定する。

7.3.36 GetOptionsObject ( options )

抽象操作 GetOptionsObject。引数 options (ECMAScript 言語値)。戻り値:(正常完了 (値:Object) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. options が undefined である場合、
    1. OrdinaryObjectCreate(null) を返す。
  2. options が Object である場合、
    1. options を返す。
  3. TypeError 例外をスローする。

7.3.37 SetterThatIgnoresPrototypeProperties ( thisValue, home, propertyKey, value )

抽象操作 SetterThatIgnoresPrototypeProperties。引数 thisValue (ECMAScript 言語値)、home (Object)、propertyKey (プロパティキー) および value (ECMAScript 言語値)。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. thisValue が Object でない場合、
    1. TypeError 例外をスローする。
  2. SameValue(thisValue, home) が true である場合、
    1. 注記: ここでのスローは、strict モードのコードで home オブジェクト上の書込み不可のデータプロパティに代入することを模倣する。
    2. TypeError 例外をスローする。
  3. propertyDesc を ? thisValue.[[GetOwnProperty]](propertyKey) とする。
  4. propertyDesc が undefined である場合、
    1. ? CreateDataPropertyOrThrow(thisValue, propertyKey, value) を実行する。
  5. そうでない場合、
    1. ? Set(thisValue, propertyKey, value, true) を実行する。
  6. unused を返す。

7.4 Iterator オブジェクトに対する操作

共通反復インターフェース(27.1)を参照してください。

7.4.1 Iterator Record

Iterator Record は、イテレーターまたは非同期イテレーターを、その next メソッドとともにカプセル化するために使用される Record です。

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

表 13: Iterator Record のフィールド
フィールド名 値 意味
[[Iterator]] Object イテレーターインターフェースまたは非同期イテレーターインターフェースに適合するオブジェクトです。
[[NextMethod]] ECMAScript 言語値 [[Iterator]] オブジェクトの next メソッドです。
[[Done]] Boolean イテレーターが完了したか、または閉じられたかどうかを示します。

7.4.2 GetIteratorDirect ( obj )

抽象操作 GetIteratorDirect。引数 obj (Object)。戻り値:(正常完了 (値:Iteratorレコード) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. nextMethod を ? Get(obj, "next") とする。
  2. iteratorRecord を Iterator Record { [[Iterator]]: obj, [[NextMethod]]: nextMethod, [[Done]]: false } とする。
  3. iteratorRecord を返す。

7.4.3 GetIteratorFromMethod ( obj, method )

抽象操作 GetIteratorFromMethod。引数 obj (ECMAScript 言語値) および method (関数オブジェクト)。戻り値:(正常完了 (値:Iteratorレコード) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. iterator を ? Call(method, obj) とする。
  2. iterator が Object でない場合、TypeError 例外をスローする。
  3. ? GetIteratorDirect(iterator) を返す。

7.4.4 GetIterator ( obj, kind )

抽象操作 GetIterator。引数 obj (ECMAScript 言語値) および kind ((sync または async))。戻り値:(正常完了 (値:Iteratorレコード) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. kind が async である場合、
    1. method を ? GetMethod(obj, %Symbol.asyncIterator%) とする。
    2. method が undefined である場合、
      1. syncMethod を ? GetMethod(obj, %Symbol.iterator%) とする。
      2. syncMethod が undefined である場合、TypeError 例外をスローする。
      3. syncIteratorRecord を ? GetIteratorFromMethod(obj, syncMethod) とする。
      4. CreateAsyncFromSyncIterator(syncIteratorRecord) を返す。
  2. そうでない場合、
    1. method を ? GetMethod(obj, %Symbol.iterator%) とする。
  3. method が undefined である場合、TypeError 例外をスローする。
  4. ? GetIteratorFromMethod(obj, method) を返す。

7.4.5 GetIteratorFlattenable ( obj, primitiveHandling )

抽象操作 GetIteratorFlattenable。引数 obj (ECMAScript 言語値) および primitiveHandling ((iterate-string-primitives または reject-primitives))。戻り値:(正常完了 (値:Iteratorレコード) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. obj が Object でない場合、
    1. primitiveHandling が reject-primitives である場合、TypeError 例外をスローする。
    2. 表明: primitiveHandling は iterate-string-primitives である。
    3. obj が String でない場合、TypeError 例外をスローする。
  2. method を ? GetMethod(obj, %Symbol.iterator%) とする。
  3. method が undefined である場合、
    1. iterator を obj とする。
  4. そうでない場合、
    1. iterator を ? Call(method, obj) とする。
  5. iterator が Object でない場合、TypeError 例外をスローする。
  6. ? GetIteratorDirect(iterator) を返す。

7.4.6 IteratorNext ( iteratorRecord [ , value ] )

抽象操作 IteratorNext。引数 iteratorRecord (Iteratorレコード)および省略可能な引数 value (ECMAScript 言語値)。戻り値:(正常完了 (値:Object) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. value が存在しない場合、
    1. result を Completion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]])) とする。
  2. そうでない場合、
    1. result を Completion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « value »)) とする。
  3. result がスロー完了である場合、
    1. iteratorRecord.[[Done]] を true に設定する。
    2. ? result を返す。
  4. result を ! result に設定する。
  5. result が Object でない場合、
    1. iteratorRecord.[[Done]] を true に設定する。
    2. TypeError 例外をスローする。
  6. result を返す。

7.4.7 IteratorComplete ( iteratorResult )

抽象操作 IteratorComplete。引数 iteratorResult (Object)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. ToBoolean(? Get(iteratorResult, "done")) を返す。

7.4.8 IteratorValue ( iteratorResult )

抽象操作 IteratorValue。引数 iteratorResult (Object)。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. ? Get(iteratorResult, "value") を返す。

7.4.9 IteratorStep ( iteratorRecord )

抽象操作 IteratorStep。引数 iteratorRecord (Iteratorレコード)。戻り値:(正常完了 (値:(Object または done)) または throw 完了)。 iteratorRecord.[[NextMethod]] を呼び出して iteratorRecord.[[Iterator]] に次の値を要求し、イテレーターが末尾に到達したことを示す done、または次の値が利用できる場合は IteratorResult オブジェクトのいずれかを返します。 呼び出されると、次の手順を実行する。

  1. result を ? IteratorNext(iteratorRecord) とする。
  2. done を Completion(IteratorComplete(result)) とする。
  3. done がスロー完了である場合、
    1. iteratorRecord.[[Done]] を true に設定する。
    2. ? done を返す。
  4. done を ! done に設定する。
  5. done が true である場合、
    1. iteratorRecord.[[Done]] を true に設定する。
    2. done を返す。
  6. result を返す。

7.4.10 IteratorStepValue ( iteratorRecord )

抽象操作 IteratorStepValue。引数 iteratorRecord (Iteratorレコード)。戻り値:(正常完了 (値:(ECMAScript 言語値 または done)) または throw 完了)。 iteratorRecord.[[NextMethod]] を呼び出して iteratorRecord.[[Iterator]] に次の値を要求し、イテレーターが末尾に到達したことを示す done、または次の値が利用できる場合は IteratorResult オブジェクトからの値のいずれかを返します。 呼び出されると、次の手順を実行する。

  1. result を ? IteratorStep(iteratorRecord) とする。
  2. result が done である場合、
    1. done を返す。
  3. value を Completion(IteratorValue(result)) とする。
  4. value がスロー完了である場合、
    1. iteratorRecord.[[Done]] を true に設定する。
  5. ? value を返す。

7.4.11 IteratorClose ( iteratorRecord, completion )

抽象操作 IteratorClose。引数 iteratorRecord (Iteratorレコード) および completion (完了レコード)。戻り値:完了レコード。 イテレーターが完了状態に到達したときに通常実行する処理を実行するべきであることを、そのイテレーターに通知するために使用されます。 呼び出されると、次の手順を実行する。

  1. 表明: iteratorRecord.[[Iterator]] は Object である。
  2. iterator を iteratorRecord.[[Iterator]] とする。
  3. innerResult を Completion(GetMethod(iterator, "return")) とする。
  4. innerResult が正常完了である場合、
    1. return を innerResult.[[Value]] とする。
    2. return が undefined である場合、? completion を返す。
    3. innerResult を Completion(Call(return, iterator)) に設定する。
  5. completion がスロー完了である場合、? completion を返す。
  6. innerResult がスロー完了である場合、? innerResult を返す。
  7. innerResult.[[Value]] が Object でない場合、TypeError 例外をスローする。
  8. ? completion を返す。

7.4.12 IteratorCloseAll ( iterators, completion )

抽象操作 IteratorCloseAll。引数 iterators (リスト (要素:Iteratorレコード)) および completion (完了レコード)。戻り値:完了レコード。 呼び出されると、次の手順を実行する。

  1. iterators の各要素 iterator について、List の逆順に、次を行う。
    1. completion を Completion(IteratorClose(iterator, completion)) に設定する。
  2. ? completion を返す。

7.4.13 IfAbruptCloseIterator ( value, iteratorRecord )

IfAbruptCloseIterator は、Iterator Record を使用する一連のアルゴリズム手順の短縮表記です。次の形式のアルゴリズム手順:

  1. IfAbruptCloseIterator(value, iteratorRecord).

は、次と同じ意味です。

  1. 表明: value は Completion Record である。
  2. value が中断完了である場合、? IteratorClose(iteratorRecord, value) を返す。
  3. value を ! value に設定する。

7.4.14 IfAbruptCloseIterators ( value, iteratorRecords )

IfAbruptCloseIterators は、Iterator Record のリストを使用する一連のアルゴリズム手順の短縮表記です。次の形式のアルゴリズム手順:

  1. IfAbruptCloseIterators(value, iteratorRecords).

は、次と同じ意味です。

  1. 表明: value は Completion Record である。
  2. value が中断完了である場合、? IteratorCloseAll(iteratorRecords, value) を返す。
  3. value を ! value に設定する。

7.4.15 AsyncIteratorClose ( iteratorRecord, completion )

抽象操作 AsyncIteratorClose。引数 iteratorRecord (Iteratorレコード) および completion (完了レコード)。戻り値:完了レコード。 非同期イテレーターが完了状態に到達したときに通常実行する処理を実行するべきであることを、その非同期イテレーターに通知するために使用されます。 呼び出されると、次の手順を実行する。

  1. 表明: iteratorRecord.[[Iterator]] は Object である。
  2. iterator を iteratorRecord.[[Iterator]] とする。
  3. innerResult を Completion(GetMethod(iterator, "return")) とする。
  4. innerResult が正常完了である場合、
    1. return を innerResult.[[Value]] とする。
    2. return が undefined である場合、? completion を返す。
    3. innerResult を Completion(Call(return, iterator)) に設定する。
    4. innerResult が正常完了である場合、innerResult を Completion(Await(innerResult.[[Value]])) に設定する。
  5. completion がスロー完了である場合、? completion を返す。
  6. innerResult がスロー完了である場合、? innerResult を返す。
  7. innerResult.[[Value]] が Object でない場合、TypeError 例外をスローする。
  8. ? completion を返す。

7.4.16 IfAbruptCloseAsyncIterator ( value, iteratorRecord )

IfAbruptCloseAsyncIterator は、Iterator Record を使用する一連のアルゴリズム手順の短縮表記です。次の形式のアルゴリズム手順:

  1. IfAbruptCloseAsyncIterator(value, iteratorRecord).

は、次と同じ意味です。

  1. 表明: value は Completion Record である。
  2. value が中断完了である場合、? AsyncIteratorClose(iteratorRecord, value) を返す。
  3. value を ! value に設定する。

7.4.17 CreateIteratorResultObject ( value, done )

抽象操作 CreateIteratorResultObject。引数 value (ECMAScript 言語値) および done (Boolean)。戻り値:an Object that conforms to the IteratorResult interface。 IteratorResult インターフェースに適合するオブジェクトを作成します。 呼び出されると、次の手順を実行する。

  1. obj を OrdinaryObjectCreate(%Object.prototype%) とする。
  2. ! CreateDataPropertyOrThrow(obj, "value", value) を実行する。
  3. ! CreateDataPropertyOrThrow(obj, "done", done) を実行する。
  4. obj を返す。

7.4.18 CreateListIteratorRecord ( list )

抽象操作 CreateListIteratorRecord。引数 list (リスト (要素:ECMAScript 言語値))。戻り値:Iteratorレコード。 [[NextMethod]] が list の連続する要素を返す Iterator Record を作成します。 呼び出されると、次の手順を実行する。

  1. closure を、パラメーターを持たず、list を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. list の各要素 value について、次を行う。
      1. ? GeneratorYield(CreateIteratorResultObject(value, false)) を実行する。
    2. NormalCompletion(undefined) を返す。
  2. iterator を CreateIteratorFromClosure(closure, empty, %Iterator.prototype%) とする。
  3. Iterator Record { [[Iterator]]: iterator, [[NextMethod]]: %GeneratorPrototype.next%, [[Done]]: false } を返す。
注

リストイテレーターオブジェクトには、ECMAScript コードから直接アクセスすることはできません。

7.4.19 IteratorToList ( iteratorRecord )

抽象操作 IteratorToList。引数 iteratorRecord (Iteratorレコード)。戻り値:(正常完了 (値:リスト (要素:ECMAScript 言語値)) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. values を新しい空の List とする。
  2. 次を繰り返す。
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. next が done である場合、
      1. values を返す。
    3. next を values に追加する。

7.5 破棄可能オブジェクトに対する操作

共通リソース管理インターフェース(27.2.1)を参照してください。

7.5.1 DisposableResource Record

DisposableResource Record は、破棄可能なオブジェクトを、そのオブジェクトを破棄するために使用されるメソッドとともにカプセル化するために使用される Record 値です。DisposableResource Record は CreateDisposableResource 抽象操作によって生成されます。

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

表 14: DisposableResource Record のフィールド
フィールド名 値 意味
[[ResourceValue]] Object または undefined 破棄される値です。
[[Kind]] sync-dispose or async-dispose リソースが using 宣言または DisposableStack オブジェクト(sync-dispose)によって追加されたのか、それとも await using 宣言または AsyncDisposableStack オブジェクト(async-dispose)によって追加されたのかを示します。
[[DisposeMethod]] 関数オブジェクトまたは undefined リソースが破棄されるときに、[[ResourceValue]] を this 値として呼び出される関数オブジェクトです。

7.5.2 AddDisposableResource ( disposableResourceStack, value, kind [ , method ] )

抽象操作 AddDisposableResource。引数 disposableResourceStack (リスト (要素:DisposableResourceレコード))、value (ECMAScript 言語値) および kind ((sync-dispose または async-dispose))および省略可能な引数 method (関数オブジェクト)。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. method が存在する場合、
    1. 表明: value は undefined である。
    2. resource を ? CreateDisposableResource(undefined, kind, method) とする。
  2. そうでない場合、
    1. value が null または undefined のいずれかであり、kind が sync-dispose である場合、unused を返す。
    2. 注記: value が null または undefined のいずれかであり、kind が async-dispose である場合、後でリソースが破棄されるときにも Await を実行することを保証するため、そのリソースが評価されたことを記録する。
    3. resource を ? CreateDisposableResource(value, kind) とする。
  3. resource を disposableResourceStack に追加する。
  4. unused を返す。

7.5.3 CreateDisposableResource ( value, kind [ , method ] )

抽象操作 CreateDisposableResource。引数 value (ECMAScript 言語値) および kind ((sync-dispose または async-dispose))および省略可能な引数 method (関数オブジェクト)。戻り値:(正常完了 (値:DisposableResourceレコード) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. method が存在しない場合、
    1. value が null または undefined のいずれかである場合、
      1. value を undefined に設定する。
      2. method を undefined に設定する。
    2. そうでない場合、
      1. method を ? GetDisposeMethod(value, kind) に設定する。
      2. method が undefined である場合、TypeError 例外をスローする。
  2. DisposableResource Record { [[ResourceValue]]: value, [[Kind]]: kind, [[DisposeMethod]]: method } を返す。

7.5.4 GetDisposeMethod ( value, kind )

抽象操作 GetDisposeMethod。引数 value (ECMAScript 言語値) および kind ((sync-dispose または async-dispose))。戻り値:(正常完了 (値:(関数オブジェクト または undefined)) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. value が Object でない場合、TypeError 例外をスローする。
  2. kind が sync-dispose である場合、? GetMethod(value, %Symbol.dispose%) を返す。
  3. 表明: kind は async-dispose である。
  4. asyncMethod を ? GetMethod(value, %Symbol.asyncDispose%) とする。
  5. asyncMethod が undefined でない場合、asyncMethod を返す。
  6. syncMethod を ? GetMethod(value, %Symbol.dispose%) とする。
  7. syncMethod が undefined である場合、undefined を返す。
  8. closure を、パラメーターを持たず、syncMethod を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. obj を this 値とする。
    2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
    3. result を Completion(Call(syncMethod, obj)) とする。
    4. IfAbruptRejectPromise(result, promiseCapability)。
    5. ! Call(promiseCapability.[[Resolve]], undefined, « undefined ») を実行する。
    6. promiseCapability.[[Promise]] を返す。
  9. 注記: この関数はユーザーコードから観測できない。同期 %Symbol.dispose% メソッドから返される Promise が await されないこと、および同期例外が拒否された Promise に変換されることを保証するために使用される。
  10. CreateBuiltinFunction(closure, 0, "", « ») を返す。

7.5.5 DisposeResources ( disposableResourceStack, completion )

抽象操作 DisposeResources。引数 disposableResourceStack (リスト (要素:DisposableResourceレコード)) および completion ((正常完了 (値:(ECMAScript 言語値 または empty)) または 中途完了))。戻り値:(正常完了 (値:(ECMAScript 言語値 または empty)) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. needsAwait を false とする。
  2. hasAwaited を false とする。
  3. outputCompletion を completion とする。
  4. disposableResourceStack の各要素 resource について、List の逆順に、次を行う。
    1. value を resource.[[ResourceValue]] とする。
    2. kind を resource.[[Kind]] とする。
    3. method を resource.[[DisposeMethod]] とする。
    4. kind が sync-dispose、needsAwait が true、かつ hasAwaited が false である場合、
      1. ! Await(undefined) を実行する。
      2. needsAwait を false に設定する。
    5. method が undefined でない場合、
      1. result を Completion(Call(method, value)) とする。
      2. result が正常完了かつ kind が async-dispose である場合、
        1. result を Completion(Await(result.[[Value]])) に設定する。
        2. hasAwaited を true に設定する。
      3. result がスロー完了である場合、
        1. outputCompletion がスロー完了である場合、
          1. result を result.[[Value]] に設定する。
          2. suppressed を outputCompletion.[[Value]] とする。
          3. error を新しく作成された SuppressedError オブジェクトとする。
          4. CreateNonEnumerableDataPropertyOrThrow(error, "error", result) を実行する。
          5. CreateNonEnumerableDataPropertyOrThrow(error, "suppressed", suppressed) を実行する。
          6. outputCompletion を ThrowCompletion(error) に設定する。
        2. そうでない場合、
          1. outputCompletion を result に設定する。
    6. そうでない場合、
      1. 表明: kind は async-dispose である。
      2. needsAwait を true に設定する。
      3. 注記: これは、await using 宣言の初期化値が null または undefined のいずれかであった場合だけを示し得る。
  5. needsAwait が true かつ hasAwaited が false である場合、
    1. ! Await(undefined) を実行する。
  6. 注記: この時点以降、disposableResourceStack が再び使用されることはない。実装では、ガベージコレクションなどによって disposableResourceStack の内容を破棄できる。
  7. ? outputCompletion を返す。