10 通常オブジェクトとエキゾチックオブジェクトの挙動 (Ordinary and Exotic Objects Behaviours)

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

すべての通常オブジェクト[[Prototype]] という内部スロットを持つ。この内部スロットの値は null かオブジェクトであり、継承を実装するために用いられる。通常オブジェクト O にプロパティ P が存在せず、しかしその [[Prototype]] オブジェクトには存在する状況を仮定する。P[[Prototype]] オブジェクト上のデータプロパティを参照する場合、O は取得アクセスにおいてそれを継承し、PO 自身のプロパティであるかのように振る舞う。P[[Prototype]] オブジェクト上の書き込み可能なデータプロパティを参照する場合、O 上で P に値を設定すると O 上に新しいデータプロパティ P が作成される。P[[Prototype]] オブジェクト上の書き込み不可のデータプロパティを参照する場合、O 上での P への設定は失敗する。P[[Prototype]] オブジェクト上のアクセサプロパティを参照する場合、そのアクセサは取得および設定アクセスの両方について O に継承される。

すべての通常オブジェクトは Boolean 値を取る [[Extensible]] 内部スロットを持ち、これは 6.1.7.3 で規定される拡張可能性に関する内部メソッドの不変条件を満たすために使用される。すなわち、一度オブジェクトの [[Extensible]] 内部スロットの値が false に設定されると、そのオブジェクトに新しいプロパティを追加したり、オブジェクトの [[Prototype]] 内部スロットの値を変更したり、後で [[Extensible]] の値を true に戻したりすることはできない。

以下のアルゴリズム記述では、O通常オブジェクトPプロパティキー値、V は任意の ECMAScript 言語値、DescProperty Descriptor レコードであると仮定する。

通常オブジェクト内部メソッドは同名の抽象操作に委譲する。そのような抽象操作が別の内部メソッドに依存する場合、同名の抽象操作を直接呼ぶ代わりに O 上で内部メソッドが呼び出される。これらのセマンティクスは、通常オブジェクト内部メソッドが適用された際に、エキゾチックオブジェクトではオーバーライドされた内部メソッドが呼ばれることを保証する。

10.1.1 [[GetPrototypeOf]] ( )

The [[GetPrototypeOf]] internal method of 通常オブジェクト O takes no arguments and returns Object か null を含む正常完了. It performs the following steps when called:

  1. OrdinaryGetPrototypeOf(O) を返す。

10.1.1.1 OrdinaryGetPrototypeOf ( O )

The abstract operation OrdinaryGetPrototypeOf takes argument O (an Object) and returns an Object or null. It performs the following steps when called:

  1. O.[[Prototype]] を返す。

10.1.2 [[SetPrototypeOf]] ( V )

The [[SetPrototypeOf]] internal method of 通常オブジェクト O takes argument V (an Object or null) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. OrdinarySetPrototypeOf(O, V) を返す。

10.1.2.1 OrdinarySetPrototypeOf ( O, V )

The abstract operation OrdinarySetPrototypeOf takes arguments O (an Object) and V (an Object or null) and returns a Boolean. It performs the following steps when called:

  1. currentO.[[Prototype]] とする。
  2. SameValue(V, current) が true なら true を返す。
  3. extensibleO.[[Extensible]] とする。
  4. extensiblefalse なら false を返す。
  5. pV とする。
  6. donefalse とする。
  7. donefalse の間、繰り返す:
    1. pnull なら
      1. donetrue に設定する。
    2. そうでなく SameValue(p, O) が true なら
      1. false を返す。
    3. それ以外なら
      1. p.[[GetPrototypeOf]]10.1.1 で定義された通常オブジェクト内部メソッドでないなら donetrue に設定する。
      2. そうでなければ pp.[[Prototype]] に設定する。
  8. O.[[Prototype]]V に設定する。
  9. true を返す。
Note

ステップ 7 のループは、[[GetPrototypeOf]][[SetPrototypeOf]]通常オブジェクト定義を用いるオブジェクトのみから成る任意のプロトタイプ連鎖に循環が存在しないことを保証する。

10.1.3 [[IsExtensible]] ( )

The [[IsExtensible]] internal method of 通常オブジェクト O takes no arguments and returns Boolean を含む正常完了. It performs the following steps when called:

  1. OrdinaryIsExtensible(O) を返す。

10.1.3.1 OrdinaryIsExtensible ( O )

The abstract operation OrdinaryIsExtensible takes argument O (an Object) and returns a Boolean. It performs the following steps when called:

  1. O.[[Extensible]] を返す。

10.1.4 [[PreventExtensions]] ( )

The [[PreventExtensions]] internal method of 通常オブジェクト O takes no arguments and returns true を含む正常完了. It performs the following steps when called:

  1. OrdinaryPreventExtensions(O) を返す。

10.1.4.1 OrdinaryPreventExtensions ( O )

The abstract operation OrdinaryPreventExtensions takes argument O (an Object) and returns true. It performs the following steps when called:

  1. O.[[Extensible]]false に設定する。
  2. true を返す。

10.1.5 [[GetOwnProperty]] ( P )

The [[GetOwnProperty]] internal method of 通常オブジェクト O takes argument P (a property key) and returns Property Descriptorundefined を含む正常完了. It performs the following steps when called:

  1. OrdinaryGetOwnProperty(O, P) を返す。

10.1.5.1 OrdinaryGetOwnProperty ( O, P )

The abstract operation OrdinaryGetOwnProperty takes arguments O (an Object) and P (a property key) and returns a Property Descriptor or undefined. It performs the following steps when called:

  1. O がキー P の自身のプロパティを持たないなら undefined を返す。
  2. フィールドを持たない新しい Property Descriptor D を生成する。
  3. X をキーが P である O の自身のプロパティとする。
  4. Xデータプロパティなら
    1. D.[[Value]]X.[[Value]] 属性の値に設定する。
    2. D.[[Writable]]X.[[Writable]] 属性の値に設定する。
  5. それ以外
    1. アサート: Xアクセサプロパティである。
    2. D.[[Get]]X.[[Get]] 属性の値に設定する。
    3. D.[[Set]]X.[[Set]] 属性の値に設定する。
  6. D.[[Enumerable]]X.[[Enumerable]] 属性の値に設定する。
  7. D.[[Configurable]]X.[[Configurable]] 属性の値に設定する。
  8. D を返す。

10.1.6 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of 通常オブジェクト O takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. OrdinaryDefineOwnProperty(O, P, Desc) を返す。

10.1.6.1 OrdinaryDefineOwnProperty ( O, P, Desc )

The abstract operation OrdinaryDefineOwnProperty takes arguments O (an Object), P (a property key), and Desc (a Property Descriptor) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. current を ? O.[[GetOwnProperty]](P) とする。
  2. extensible を ? IsExtensible(O) とする。
  3. ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) を返す。

10.1.6.2 IsCompatiblePropertyDescriptor ( Extensible, Desc, Current )

The abstract operation IsCompatiblePropertyDescriptor takes arguments Extensible (a Boolean), Desc (a Property Descriptor), and Current (a Property Descriptor or undefined) and returns a Boolean. It performs the following steps when called:

  1. ValidateAndApplyPropertyDescriptor(undefined, "", Extensible, Desc, Current) を返す。

10.1.6.3 ValidateAndApplyPropertyDescriptor ( O, P, extensible, Desc, current )

The abstract operation ValidateAndApplyPropertyDescriptor takes arguments O (an Object or undefined), P (a property key), extensible (a Boolean), Desc (a Property Descriptor), and current (a Property Descriptor or undefined) and returns a Boolean. Desc が、指定された拡張可能性 extensible と現行プロパティ current を持つオブジェクトのプロパティとして 不変条件 を維持しつつ適用できる場合に限り true を返す。そのような適用が可能で Oundefined でない場合、名前 P のプロパティ(必要なら作成される)に対して実行される。 It performs the following steps when called:

  1. アサート: Pプロパティキーである。
  2. currentundefined なら
    1. extensiblefalse なら false を返す。
    2. Oundefined なら true を返す。
    3. IsAccessorDescriptor(Desc) が true なら
      1. オブジェクト O に、Desc に対応フィールドがあればその値、そうでなければその属性の 既定値[[Get]], [[Set]], [[Enumerable]], [[Configurable]] に設定した名前 P の自身のアクセサプロパティを作成する。
    4. それ以外
      1. オブジェクト O に、Desc に対応フィールドがあればその値、そうでなければその属性の 既定値[[Value]], [[Writable]], [[Enumerable]], [[Configurable]] に設定した名前 P の自身のデータプロパティを作成する。
    5. true を返す。
  3. アサート: current は完全に埋められた Property Descriptor である。
  4. Desc がいかなるフィールドも持たないなら true を返す。
  5. current.[[Configurable]]false なら
    1. Desc[[Configurable]] フィールドを持ちかつ Desc.[[Configurable]]true なら false を返す。
    2. Desc[[Enumerable]] フィールドを持ちかつ Desc.[[Enumerable]]current.[[Enumerable]] と異なるなら false を返す。
    3. IsGenericDescriptor(Desc) が false でかつ IsAccessorDescriptor(Desc) が IsAccessorDescriptor(current) と異なるなら false を返す。
    4. IsAccessorDescriptor(current) が true なら
      1. Desc[[Get]] フィールドを持ち SameValue(Desc.[[Get]], current.[[Get]]) が false なら false を返す。
      2. Desc[[Set]] フィールドを持ち SameValue(Desc.[[Set]], current.[[Set]]) が false なら false を返す。
    5. それ以外で current.[[Writable]]false なら
      1. Desc[[Writable]] フィールドを持ち Desc.[[Writable]]true なら false を返す。
      2. 注記: SameValue は他の手段で区別可能な NaN 値について true を返す。ここで返すことで O の既存プロパティが変更されないことを保証する。
      3. Desc[[Value]] フィールドを持つなら SameValue(Desc.[[Value]], current.[[Value]]) を返す。
  6. Oundefined でないなら
    1. IsDataDescriptor(current) が true かつ IsAccessorDescriptor(Desc) が true なら
      1. Desc[[Configurable]] フィールドを持つなら configurableDesc.[[Configurable]] とし、そうでなければ configurablecurrent.[[Configurable]] とする。
      2. Desc[[Enumerable]] フィールドを持つなら enumerableDesc.[[Enumerable]] とし、そうでなければ enumerablecurrent.[[Enumerable]] とする。
      3. オブジェクト O の名前 P のプロパティを、[[Configurable]][[Enumerable]] をそれぞれ configurableenumerable に、[[Get]][[Set]]Desc に対応フィールドがあればその値、なければその属性の 既定値 に設定したアクセサプロパティに置き換える。
    2. それ以外で IsAccessorDescriptor(current) が true かつ IsDataDescriptor(Desc) が true なら
      1. Desc[[Configurable]] フィールドを持つなら configurableDesc.[[Configurable]] とし、そうでなければ configurablecurrent.[[Configurable]] とする。
      2. Desc[[Enumerable]] フィールドを持つなら enumerableDesc.[[Enumerable]] とし、そうでなければ enumerablecurrent.[[Enumerable]] とする。
      3. オブジェクト O の名前 P のプロパティを、[[Configurable]][[Enumerable]] をそれぞれ configurableenumerable に、[[Value]][[Writable]]Desc に対応フィールドがあればその値、なければその属性の 既定値 に設定したデータプロパティに置き換える。
    3. それ以外の場合
      1. Desc の各フィールドについて、オブジェクト O の名前 P のプロパティの対応する属性をそのフィールドの値に設定する。
  7. true を返す。

10.1.7 [[HasProperty]] ( P )

The [[HasProperty]] internal method of 通常オブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. OrdinaryHasProperty(O, P) を返す。

10.1.7.1 OrdinaryHasProperty ( O, P )

The abstract operation OrdinaryHasProperty takes arguments O (an Object) and P (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. hasOwn を ? O.[[GetOwnProperty]](P) とする。
  2. hasOwnundefined でないなら true を返す。
  3. parent を ? O.[[GetPrototypeOf]]() とする。
  4. parentnull でないなら
    1. parent.[[HasProperty]](P) を返す。
  5. false を返す。

10.1.8 [[Get]] ( P, Receiver )

The [[Get]] internal method of 通常オブジェクト O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. OrdinaryGet(O, P, Receiver) を返す。

10.1.8.1 OrdinaryGet ( O, P, Receiver )

The abstract operation OrdinaryGet takes arguments O (an Object), P (a property key), and Receiver (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. desc を ? O.[[GetOwnProperty]](P) とする。
  2. descundefined なら
    1. parent を ? O.[[GetPrototypeOf]]() とする。
    2. parentnull なら undefined を返す。
    3. parent.[[Get]](P, Receiver) を返す。
  3. IsDataDescriptor(desc) が true なら desc.[[Value]] を返す。
  4. アサート: IsAccessorDescriptor(desc) は true である。
  5. getterdesc.[[Get]] とする。
  6. getterundefined なら undefined を返す。
  7. ? Call(getter, Receiver) を返す。

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

The [[Set]] internal method of 通常オブジェクト O takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. OrdinarySet(O, P, V, Receiver) を返す。

10.1.9.1 OrdinarySet ( O, P, V, Receiver )

The abstract operation OrdinarySet takes arguments O (an Object), P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ownDesc を ? O.[[GetOwnProperty]](P) とする。
  2. OrdinarySetWithOwnDescriptor(O, P, V, Receiver, ownDesc) を返す。

10.1.9.2 OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc )

The abstract operation OrdinarySetWithOwnDescriptor takes arguments O (an Object), P (a property key), V (an ECMAScript language value), Receiver (an ECMAScript language value), and ownDesc (a Property Descriptor or undefined) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. ownDescundefined なら
    1. parent を ? O.[[GetPrototypeOf]]() とする。
    2. parentnull でないなら
      1. parent.[[Set]](P, V, Receiver) を返す。
    3. それ以外なら
      1. ownDesc を PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } に設定する。
  2. IsDataDescriptor(ownDesc) が true なら
    1. ownDesc.[[Writable]]false なら false を返す。
    2. Receiver が Object でないなら false を返す。
    3. existingDescriptor を ? Receiver.[[GetOwnProperty]](P) とする。
    4. existingDescriptorundefined でないなら
      1. IsAccessorDescriptor(existingDescriptor) が true なら false を返す。
      2. existingDescriptor.[[Writable]]false なら false を返す。
      3. valueDesc を PropertyDescriptor { [[Value]]: V } とする。
      4. Receiver.[[DefineOwnProperty]](P, valueDesc) を返す。
    5. それ以外なら
      1. アサート: Receiver は現在プロパティ P を持たない。
      2. CreateDataProperty(Receiver, P, V) を返す。
  3. アサート: IsAccessorDescriptor(ownDesc) は true である。
  4. setterownDesc.[[Set]] とする。
  5. setterundefined なら false を返す。
  6. ? Call(setter, Receiver, « V ») を実行する。
  7. true を返す。

10.1.10 [[Delete]] ( P )

The [[Delete]] internal method of 通常オブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. OrdinaryDelete(O, P) を返す。

10.1.10.1 OrdinaryDelete ( O, P )

The abstract operation OrdinaryDelete takes arguments O (an Object) and P (a property key) and returns either a normal completion containing a Boolean or a throw completion. It performs the following steps when called:

  1. desc を ? O.[[GetOwnProperty]](P) とする。
  2. descundefined なら true を返す。
  3. desc.[[Configurable]]true なら
    1. 名前 P の自身のプロパティを O から除去する。
    2. true を返す。
  4. false を返す。

10.1.11 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of 通常オブジェクト O takes no arguments and returns プロパティキーList を含む正常完了. It performs the following steps when called:

  1. OrdinaryOwnPropertyKeys(O) を返す。

10.1.11.1 OrdinaryOwnPropertyKeys ( O )

The abstract operation OrdinaryOwnPropertyKeys takes argument O (an Object) and returns a List of property keys. It performs the following steps when called:

  1. keys を新しい空の List とする。
  2. O の各自身のプロパティキー P で、P配列インデックスであるものについて、数値的インデックス昇順で:
    1. keysP を追加する。
  3. O の各自身のプロパティキー P で、P が String かつ配列インデックスでないものについて、作成順(時間順)昇順で:
    1. keysP を追加する。
  4. O の各自身のプロパティキー P で、P が Symbol であるものについて、作成順(時間順)昇順で:
    1. keysP を追加する。
  5. keys を返す。

10.1.12 OrdinaryObjectCreate ( proto [ , additionalInternalSlotsList ] )

The abstract operation OrdinaryObjectCreate takes argument proto (an Object or null) and optional argument additionalInternalSlotsList (a List of names of internal slots) and returns an Object. 新しい通常オブジェクトの実行時生成を規定するために使用される。additionalInternalSlotsList には [[Prototype]] および [[Extensible]] に加えてオブジェクトの一部として定義されるべき追加内部スロットの名前が含まれる。additionalInternalSlotsList が与えられない場合、新しい空の List が使用される。 It performs the following steps when called:

  1. internalSlotsList を « [[Prototype]], [[Extensible]] » とする。
  2. additionalInternalSlotsList が存在するなら internalSlotsListinternalSlotsListadditionalInternalSlotsListリスト結合結果に設定する。
  3. OMakeBasicObject(internalSlotsList) とする。
  4. O.[[Prototype]]proto に設定する。
  5. O を返す。
Note

OrdinaryObjectCreate は MakeBasicObject を呼ぶ以上の多くをしないが、エキゾチックではない通常オブジェクトを生成する意図を示す。そのため本仕様内では、結果を非通常にする形で後から内部メソッドを変更するアルゴリズムからは呼ばれない。エキゾチックオブジェクトを生成する操作は直接 MakeBasicObject を呼び出す。

10.1.13 OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] )

The abstract operation OrdinaryCreateFromConstructor takes arguments constructor (a function object) and intrinsicDefaultProto (a String) and optional argument internalSlotsList (a List of names of internal slots) and returns Object を含む正常完了または throw 完了. 存在するならコンストラクタ"prototype" プロパティから取得した [[Prototype]] 値を持つ通常オブジェクトを生成する。存在しない場合 intrinsicDefaultProto で名付けられた intrinsic が [[Prototype]] として使用される。internalSlotsList には追加内部スロット名が含まれる。未指定の場合は空の List が使用される。 It performs the following steps when called:

  1. アサート: intrinsicDefaultProto はこの仕様で定義された intrinsic オブジェクトの名前である。該当オブジェクトは [[Prototype]] 値として使用されることを意図した intrinsic でなければならない。
  2. proto を ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) とする。
  3. internalSlotsList が存在するなら slotsListinternalSlotsList とし、そうでなければ slotsList を新しい空の List とする。
  4. OrdinaryObjectCreate(proto, slotsList) を返す。

10.1.14 GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto )

The abstract operation GetPrototypeFromConstructor takes arguments constructor (a function object) and intrinsicDefaultProto (a String) and returns Object を含む正常完了または throw 完了. 特定のコンストラクタに対応するオブジェクトを作成する際に使用すべき [[Prototype]] 値を決定する。値はコンストラクタ"prototype" プロパティから取得され、存在しない場合 intrinsicDefaultProto で名付けられた intrinsic が [[Prototype]] に用いられる。 It performs the following steps when called:

  1. アサート: intrinsicDefaultProto はこの仕様で定義された intrinsic オブジェクトの名前である。該当オブジェクトはオブジェクトの [[Prototype]] として使われることを意図した intrinsic でなければならない。
  2. proto を ? Get(constructor, "prototype") とする。
  3. proto が Object でないなら
    1. realm を ? GetFunctionRealm(constructor) とする。
    2. protorealmintrinsicDefaultProto という名前の intrinsic オブジェクトに設定する。
  4. proto を返す。
Note

constructor[[Prototype]] 値を提供しない場合、使用される既定値は実行中実行コンテキストではなく constructor 関数の realm から取得される。

10.1.15 RequireInternalSlot ( O, internalSlot )

The abstract operation RequireInternalSlot takes arguments O (an ECMAScript language value) and internalSlot (an internal slot name) and returns unused を含む正常完了または throw 完了. O が Object であり、かつ指定された内部スロットを持つ場合を除いて例外を投げる。 It performs the following steps when called:

  1. O が Object でないなら TypeError 例外を投げる。
  2. OinternalSlot 内部スロットを持たないなら TypeError 例外を投げる。
  3. unused を返す。

10.2 ECMAScript 関数オブジェクト (ECMAScript Function Objects)

ECMAScript 関数オブジェクトは、レキシカル環境を閉じ込めたパラメータ化 ECMAScript コードをカプセル化し、そのコードの動的評価をサポートする。ECMAScript 関数オブジェクト通常オブジェクトであり、他の通常オブジェクトと同じ内部スロットおよび内部メソッドを持つ。ECMAScript 関数オブジェクトのコードは strict mode コード(11.2.2)か非 strict コードのいずれかである。コードが strict mode コードである ECMAScript 関数オブジェクトstrict function と呼ばれる。コードが strict mode コードでないものは non-strict function と呼ばれる。

[[Extensible]][[Prototype]] に加えて、ECMAScript 関数オブジェクトTable 28 に列挙される内部スロットも持つ。

Table 28: ECMAScript 関数オブジェクトの内部スロット (Internal Slots of ECMAScript Function Objects)
Internal Slot Type Description
[[Environment]] an Environment Record 関数がクロージャ化した Environment Record。関数のコードを評価する際の外側環境として使用される。
[[PrivateEnvironment]] a PrivateEnvironment Record or null 関数がクロージャ化した Private Name 用の PrivateEnvironment Record。関数が構文上クラス内に含まれない場合は null。関数のコードを評価するときに内部クラスの外側 PrivateEnvironment として使用される。
[[FormalParameters]] a Parse Node 関数の仮引数リストを定義するソーステキストのルートパースノード。
[[ECMAScriptCode]] a Parse Node 関数本体を定義するソーステキストのルートパースノード。
[[ConstructorKind]] base or derived 関数が派生クラスコンストラクタかどうか。
[[Realm]] a Realm Record 関数が生成された realm。関数評価時にアクセスされる intrinsic オブジェクトを提供する。
[[ScriptOrModule]] a Script Record or a Module Record 関数が生成された script または module。
[[ThisMode]] lexical, strict, or global 関数の仮引数およびコード本体内での this 参照の解釈方法を定義する。lexicalthis がレキシカルに内包する関数の this 値を指すことを意味する。strict は関数呼び出しで与えられた this 値をそのまま用いる。globalthis 値が undefined または null の場合グローバルオブジェクト参照と解釈し、その他の場合は ToObject に渡すことを意味する。
[[Strict]] a Boolean strict function なら truenon-strict function なら false
[[HomeObject]] an Object 関数が super を使用する場合、super プロパティ探索が開始されるオブジェクトを提供する [[GetPrototypeOf]] を持つオブジェクト。
[[SourceText]] a sequence of Unicode code points 関数を定義する source text
[[Fields]] a List of ClassFieldDefinition Records 関数がクラスである場合、その非 static field と対応する初期化子の Record のリスト。
[[PrivateMethods]] a List of PrivateElements 関数がクラスである場合、その非 static private method と accessor を表すリスト。
[[ClassFieldInitializerName]] a String, a Symbol, a Private Name, or empty 関数がクラスフィールドの初期化子として作成される場合、そのフィールドの NamedEvaluation で用いる名前。そうでなければ empty
[[IsClassConstructor]] a Boolean 関数が class constructor かどうか(true の場合、その [[Call]] 呼び出しは直ちに TypeError 例外を投げる)。

すべての ECMAScript 関数オブジェクトはここで定義される [[Call]] 内部メソッドを持つ。コンストラクタでもある ECMAScript 関数は加えて [[Construct]] 内部メソッドを持つ。

10.2.1 [[Call]] ( thisArgument, argumentsList )

The [[Call]] internal method of ECMAScript 関数オブジェクト F takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. callerContext を実行中実行コンテキストとする。
  2. calleeContextPrepareForOrdinaryCall(F, undefined) とする。
  3. アサート: calleeContext が現在の実行中実行コンテキストである。
  4. F.[[IsClassConstructor]]true なら
    1. error を新たに生成された TypeError オブジェクトとする。
    2. 注記: errorF の関連 Realm Record を持つ calleeContext 内で生成される。
    3. 実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。
    4. ThrowCompletion(error) を返す。
  5. OrdinaryCallBindThis(F, calleeContext, thisArgument) を実行する。
  6. resultCompletion(OrdinaryCallEvaluateBody(F, argumentsList)) とする。
  7. 実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。
  8. resultreturn completion なら result.[[Value]] を返す。
  9. アサート: resultthrow completion である。
  10. result を返す。
Note

ステップ 7calleeContext が実行コンテキストスタックから除去されるとき、到達可能な Generator により後で再開のためにサスペンド保持されている場合は破棄されてはならない。

10.2.1.1 PrepareForOrdinaryCall ( F, newTarget )

The abstract operation PrepareForOrdinaryCall takes arguments F (an ECMAScript function object) and newTarget (an Object or undefined) and returns an execution context. It performs the following steps when called:

  1. callerContext を実行中実行コンテキストとする。
  2. calleeContext を新しい ECMAScript コード実行コンテキストとする。
  3. calleeContext の Function を F に設定する。
  4. calleeRealmF.[[Realm]] とする。
  5. calleeContextRealmcalleeRealm に設定する。
  6. calleeContext の ScriptOrModule を F.[[ScriptOrModule]] に設定する。
  7. localEnvNewFunctionEnvironment(F, newTarget) とする。
  8. calleeContext の LexicalEnvironment を localEnv に設定する。
  9. calleeContext の VariableEnvironment を localEnv に設定する。
  10. calleeContext の PrivateEnvironment を F.[[PrivateEnvironment]] に設定する。
  11. callerContext がまだサスペンドされていないなら callerContext をサスペンドする。
  12. 実行コンテキストスタックに calleeContext を push する;calleeContext が実行中実行コンテキストとなる。
  13. 注記: この地点以降に生成される例外オブジェクトは calleeRealm に関連付けられる。
  14. calleeContext を返す。

10.2.1.2 OrdinaryCallBindThis ( F, calleeContext, thisArgument )

The abstract operation OrdinaryCallBindThis takes arguments F (an ECMAScript function object), calleeContext (an execution context), and thisArgument (an ECMAScript language value) and returns unused. It performs the following steps when called:

  1. thisModeF.[[ThisMode]] とする。
  2. thisModelexical なら unused を返す。
  3. calleeRealmF.[[Realm]] とする。
  4. localEnvcalleeContext の LexicalEnvironment とする。
  5. thisModestrict なら
    1. thisValuethisArgument とする。
  6. それ以外
    1. thisArgumentundefinednull のいずれかなら
      1. globalEnvcalleeRealm.[[GlobalEnv]] とする。
      2. アサート: globalEnvGlobal Environment Record である。
      3. thisValueglobalEnv.[[GlobalThisValue]] とする。
    2. それ以外
      1. thisValue を ! ToObject(thisArgument) とする。
      2. 注記: ToObjectcalleeRealm を用いてラッパーオブジェクトを生成する。
  7. アサート: localEnvFunction Environment Record である。
  8. アサート: 次のステップは localEnv.[[ThisBindingStatus]]initialized でないため決して abrupt completion を返さない。
  9. BindThisValue(localEnv, thisValue) を実行する。
  10. unused を返す。

10.2.1.3 Runtime Semantics: EvaluateBody

The syntax-directed operation EvaluateBody takes arguments functionObject (an ECMAScript function object) and argumentsList (a List of ECMAScript language values) and returns a return completion or a throw completion. It is defined piecewise over the following productions:

FunctionBody : FunctionStatementList
  1. FunctionBody の EvaluateFunctionBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
ConciseBody : ExpressionBody
  1. ConciseBody の EvaluateConciseBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
GeneratorBody : FunctionBody
  1. GeneratorBody の EvaluateGeneratorBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
AsyncGeneratorBody : FunctionBody
  1. AsyncGeneratorBody の EvaluateAsyncGeneratorBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
AsyncFunctionBody : FunctionBody
  1. AsyncFunctionBody の EvaluateAsyncFunctionBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
AsyncConciseBody : ExpressionBody
  1. AsyncConciseBody の EvaluateAsyncConciseBody を引数 functionObject および argumentsList で評価し ? を付して結果を返す。
Initializer : = AssignmentExpression
  1. アサート: argumentsList は空である。
  2. アサート: functionObject.[[ClassFieldInitializerName]]empty ではない。
  3. IsAnonymousFunctionDefinition(AssignmentExpression) が true なら
    1. valueInitializer の NamedEvaluation を引数 functionObject.[[ClassFieldInitializerName]] で行い ? を付して得られる値とする。
  4. それ以外
    1. rhsAssignmentExpression の Evaluation を ? 付きで行った結果とする。
    2. value を ? GetValue(rhs) とする。
  5. ReturnCompletion(value) を返す。
Note

フィールド初期化子は関数境界を構成するが、FunctionDeclarationInstantiation を呼び出しても観測可能な効果はないため省略される。

ClassStaticBlockBody : ClassStaticBlockStatementList
  1. アサート: argumentsList は空である。
  2. ClassStaticBlockBody の EvaluateClassStaticBlockBody を引数 functionObject で評価し ? を付して結果を返す。

10.2.1.4 OrdinaryCallEvaluateBody ( F, argumentsList )

The abstract operation OrdinaryCallEvaluateBody takes arguments F (an ECMAScript function object) and argumentsList (a List of ECMAScript language values) and returns a return completion or a throw completion. It performs the following steps when called:

  1. F.[[ECMAScriptCode]]EvaluateBody を引数 F および argumentsList で評価し ? を付して結果を返す。

10.2.2 [[Construct]] ( argumentsList, newTarget )

The [[Construct]] internal method of ECMAScript 関数オブジェクト F takes arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns Object を含む正常完了または throw 完了. It performs the following steps when called:

  1. callerContext を実行中実行コンテキストとする。
  2. kindF.[[ConstructorKind]] とする。
  3. kindbase なら
    1. thisArgument を ? OrdinaryCreateFromConstructor(newTarget, "%Object.prototype%") とする。
  4. calleeContextPrepareForOrdinaryCall(F, newTarget) とする。
  5. アサート: calleeContext が現在の実行中実行コンテキストである。
  6. kindbase なら
    1. OrdinaryCallBindThis(F, calleeContext, thisArgument) を実行する。
    2. initializeResultCompletion(InitializeInstanceElements(thisArgument, F)) とする。
    3. initializeResultabrupt completion なら
      1. 実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。
      2. initializeResult を返す。
  7. constructorEnvcalleeContext の LexicalEnvironment とする。
  8. resultCompletion(OrdinaryCallEvaluateBody(F, argumentsList)) とする。
  9. 実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。
  10. resultthrow completion なら
    1. result を返す。
  11. アサート: resultreturn completion である。
  12. result.[[Value]] が Object なら result.[[Value]] を返す。
  13. kindbase なら thisArgument を返す。
  14. result.[[Value]]undefined でないなら TypeError 例外を投げる。
  15. thisBinding を ? constructorEnv.GetThisBinding() とする。
  16. アサート: thisBinding は Object である。
  17. thisBinding を返す。

10.2.3 OrdinaryFunctionCreate ( functionPrototype, sourceText, ParameterList, Body, thisMode, env, privateEnv )

The abstract operation OrdinaryFunctionCreate takes arguments functionPrototype (an Object), sourceText (a sequence of Unicode code points), ParameterList (a Parse Node), Body (a Parse Node), thisMode (lexical-this or non-lexical-this), env (an Environment Record), and privateEnv (a PrivateEnvironment Record or null) and returns an ECMAScript function object. 新しい関数を(既定の [[Call]] 内部メソッドと、後で MakeConstructor などの操作によって追加されうる場合を除き [[Construct]] 内部メソッドなしで)実行時生成することを規定する。sourceText は生成対象関数の構文定義のソーステキストである。 It performs the following steps when called:

  1. internalSlotsListTable 28 に列挙された内部スロットとする。
  2. FOrdinaryObjectCreate(functionPrototype, internalSlotsList) とする。
  3. F.[[Call]]10.2.1 で規定される定義に設定する。
  4. F.[[SourceText]]sourceText に設定する。
  5. F.[[FormalParameters]]ParameterList に設定する。
  6. F.[[ECMAScriptCode]]Body に設定する。
  7. Strict を IsStrict(Body) とする。
  8. F.[[Strict]]Strict に設定する。
  9. thisModelexical-this なら F.[[ThisMode]]lexical に設定する。
  10. それ以外で Stricttrue なら F.[[ThisMode]]strict に設定する。
  11. それ以外なら F.[[ThisMode]]global に設定する。
  12. F.[[IsClassConstructor]]false に設定する。
  13. F.[[Environment]]env に設定する。
  14. F.[[PrivateEnvironment]]privateEnv に設定する。
  15. F.[[ScriptOrModule]]GetActiveScriptOrModule() に設定する。
  16. F.[[Realm]]current Realm Record に設定する。
  17. F.[[HomeObject]]undefined に設定する。
  18. F.[[Fields]] を新しい空の List に設定する。
  19. F.[[PrivateMethods]] を新しい空の List に設定する。
  20. F.[[ClassFieldInitializerName]]empty に設定する。
  21. lenParameterList の ExpectedArgumentCount とする。
  22. SetFunctionLength(F, len) を実行する。
  23. F を返す。

10.2.4 AddRestrictedFunctionProperties ( F, realm )

The abstract operation AddRestrictedFunctionProperties takes arguments F (a function object) and realm (a Realm Record) and returns unused. It performs the following steps when called:

  1. アサート: realm.[[Intrinsics]].[[%ThrowTypeError%]] が存在し初期化済みである。
  2. throwerrealm.[[Intrinsics]].[[%ThrowTypeError%]] とする。
  3. DefinePropertyOrThrow(F, "caller", PropertyDescriptor { [[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  4. DefinePropertyOrThrow(F, "arguments", PropertyDescriptor { [[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  5. unused を返す。

10.2.4.1 %ThrowTypeError% ( )

この関数は %ThrowTypeError% intrinsic オブジェクトである。

realm ごとに一度定義される匿名の組み込み関数オブジェクトである。

呼び出されたとき次の手順を実行する:

  1. TypeError 例外を投げる。

この関数の [[Extensible]] 内部スロットの値は false である。

この関数の "length" プロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

この関数の "name" プロパティは属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } を持つ。

10.2.5 MakeConstructor ( F [ , writablePrototype [ , prototype ] ] )

The abstract operation MakeConstructor takes argument F (an ECMAScript function object or a built-in function object) and optional arguments writablePrototype (a Boolean) and prototype (an Object) and returns unused. Fコンストラクタに変換する。 It performs the following steps when called:

  1. F が ECMAScript 関数オブジェクトなら
    1. アサート: IsConstructor(F) は false
    2. アサート: F"prototype" 自身プロパティを持たない拡張可能オブジェクトである。
    3. F.[[Construct]]10.2.2 で規定される定義に設定する。
  2. それ以外
    1. F.[[Construct]]10.3.2 で規定される定義に設定する。
  3. F.[[ConstructorKind]]base に設定する。
  4. writablePrototype が与えられていなければ writablePrototypetrue に設定する。
  5. prototype が与えられていないなら
    1. prototypeOrdinaryObjectCreate(%Object.prototype%) に設定する。
    2. DefinePropertyOrThrow(prototype, "constructor", PropertyDescriptor { [[Value]]: F, [[Writable]]: writablePrototype, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  6. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: writablePrototype, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  7. unused を返す。

10.2.6 MakeClassConstructor ( F )

The abstract operation MakeClassConstructor takes argument F (an ECMAScript function object) and returns unused. It performs the following steps when called:

  1. アサート: F.[[IsClassConstructor]]false
  2. F.[[IsClassConstructor]]true に設定する。
  3. unused を返す。

10.2.7 MakeMethod ( F, homeObject )

The abstract operation MakeMethod takes arguments F (an ECMAScript function object) and homeObject (an Object) and returns unused. F を method として構成する。 It performs the following steps when called:

  1. アサート: homeObject通常オブジェクトである。
  2. F.[[HomeObject]]homeObject に設定する。
  3. unused を返す。

10.2.8 DefineMethodProperty ( homeObject, key, closure, enumerable )

The abstract operation DefineMethodProperty takes arguments homeObject (an Object), key (a property key or Private Name), closure (a function object), and enumerable (a Boolean) and returns PrivateElement または unused を含む正常完了、または abrupt completion. It performs the following steps when called:

  1. アサート: homeObject は通常で拡張可能なオブジェクトである。
  2. keyPrivate Name なら
    1. PrivateElement { [[Key]]: key, [[Kind]]: method, [[Value]]: closure } を返す。
  3. それ以外
    1. desc を PropertyDescriptor { [[Value]]: closure, [[Writable]]: true, [[Enumerable]]: enumerable, [[Configurable]]: true } とする。
    2. DefinePropertyOrThrow(homeObject, key, desc) を実行する。
    3. 注記: DefinePropertyOrThrowkey"prototype" であるクラス static method の定義を試みる場合のみ abrupt completion を返しうる。
    4. unused を返す。

10.2.9 SetFunctionName ( F, name [ , prefix ] )

The abstract operation SetFunctionName takes arguments F (a function object) and name (a property key or Private Name) and optional argument prefix (a String) and returns unused. F"name" プロパティを追加する。 It performs the following steps when called:

  1. アサート: F"name" 自身プロパティを持たない拡張可能オブジェクトである。
  2. name が Symbol なら
    1. descriptionname.[[Description]] とする。
    2. descriptionundefined なら name を空文字列に設定する。
    3. それ以外なら name"[", description, "]"文字列連結に設定する。
  3. それ以外で namePrivate Name なら
    1. namename.[[Description]] に設定する。
  4. F[[InitialName]] 内部スロットを持つなら
    1. F.[[InitialName]]name に設定する。
  5. prefix が与えられているなら
    1. nameprefix、コード単位 0x0020 (SPACE)、name の連結に設定する。
    2. F[[InitialName]] 内部スロットを持つなら
      1. 注記: 以下のステップでの選択は本抽象操作呼び出し毎に独立に行われる。
      2. 任意で F.[[InitialName]]name に設定してよい。
  6. DefinePropertyOrThrow(F, "name", PropertyDescriptor { [[Value]]: name, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  7. unused を返す。

10.2.10 SetFunctionLength ( F, length )

The abstract operation SetFunctionLength takes arguments F (a function object) and length (a non-negative integer or +∞) and returns unused. F"length" プロパティを追加する。 It performs the following steps when called:

  1. アサート: F"length" 自身プロパティを持たない拡張可能オブジェクトである。
  2. DefinePropertyOrThrow(F, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  3. unused を返す。

10.2.11 FunctionDeclarationInstantiation ( func, argumentsList )

The abstract operation FunctionDeclarationInstantiation takes arguments func (an ECMAScript function object) and argumentsList (a List of ECMAScript language values) and returns unused を含む正常完了または throw 完了. func は実行コンテキストが確立される関数オブジェクトである。

Note

ECMAScript 関数の評価のために実行コンテキストが確立されると、新しい Function Environment Record が作成され、各仮引数の束縛がその Environment Record にインスタンス化される。関数本体内の各宣言もインスタンス化される。関数の仮引数に既定値初期化子が含まれない場合、本体宣言は仮引数と同じ Environment Record 内にインスタンス化される。既定値パラメータ初期化子が存在する場合、本体宣言用に 2 つ目の Environment Record が作成される。仮引数および関数は FunctionDeclarationInstantiation の一部として初期化される。その他の束縛は関数本体の評価中に初期化される。

呼び出されたとき次の手順を実行する:

  1. calleeContext を実行中実行コンテキストとする。
  2. codefunc.[[ECMAScriptCode]] とする。
  3. strictfunc.[[Strict]] とする。
  4. formalsfunc.[[FormalParameters]] とする。
  5. parameterNamesformals の BoundNames とする。
  6. parameterNames が重複要素を持つなら hasDuplicatestrue、そうでなければ false とする。
  7. simpleParameterList を IsSimpleParameterList of formals とする。
  8. hasParameterExpressions を ContainsExpression of formals とする。
  9. varNamescode の VarDeclaredNames とする。
  10. varDeclarationscode の VarScopedDeclarations とする。
  11. lexicalNamescode の LexicallyDeclaredNames とする。
  12. functionNames を新しい空の List とする。
  13. functionsToInitialize を新しい空の List とする。
  14. varDeclarations の各要素 d について、List の逆順で:
    1. dVariableDeclaration でも ForBinding でも BindingIdentifier でもないなら
      1. アサート: dFunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration のいずれかである。
      2. fnd の BoundNames の唯一の要素とする。
      3. functionNamesfn を含まないなら
        1. fnfunctionNames の先頭に挿入する。
        2. 注記: 同名の複数の関数宣言がある場合、最後の宣言が使用される。
        3. dfunctionsToInitialize の先頭に挿入する。
  15. argumentsObjectNeededtrue とする。
  16. func.[[ThisMode]]lexical なら
    1. 注記: Arrow function は arguments オブジェクトを持たない。
    2. argumentsObjectNeededfalse に設定する。
  17. それ以外で parameterNames"arguments" を含むなら
    1. argumentsObjectNeededfalse に設定する。
  18. それ以外で hasParameterExpressionsfalse なら
    1. functionNames"arguments" を含むか lexicalNames"arguments" を含むなら
      1. argumentsObjectNeededfalse に設定する。
  19. stricttrue または hasParameterExpressionsfalse なら
    1. 注記: strict mode コードでの eval 呼び出しは外側に可視な新しい束縛を生成できないため、仮引数には単一の Environment Record だけが必要。
    2. envcalleeContext の LexicalEnvironment とする。
  20. それ以外
    1. 注記: 形式パラメータリスト内の direct eval 呼び出しで生成される束縛がパラメータ宣言環境外になるよう別の Environment Record が必要。
    2. calleeEnvcalleeContext の LexicalEnvironment とする。
    3. envNewDeclarativeEnvironment(calleeEnv) とする。
    4. アサート: calleeContext の VariableEnvironment と calleeEnv は同じ Environment Record
    5. calleeContext の LexicalEnvironment を env に設定する。
  21. parameterNames の各 String paramName について
    1. alreadyDeclared を ! env.HasBinding(paramName) とする。
    2. 注記: 早期エラーにより重複パラメータ名はデフォルト値または rest パラメータを持たない non-strict 関数でのみ許される。
    3. alreadyDeclaredfalse なら
      1. env.CreateMutableBinding(paramName, false) を実行する。
      2. hasDuplicatestrue なら
        1. env.InitializeBinding(paramName, undefined) を実行する。
  22. argumentsObjectNeededtrue なら
    1. stricttrue または simpleParameterListfalse なら
      1. aoCreateUnmappedArgumentsObject(argumentsList) とする。
    2. それ以外
      1. 注記: mapped arguments オブジェクトは rest パラメータ・デフォルト値初期化子・分割代入パラメータを持たない non-strict 関数にのみ提供される。
      2. aoCreateMappedArgumentsObject(func, formals, argumentsList, env) とする。
    3. stricttrue なら
      1. env.CreateImmutableBinding("arguments", false) を実行する。
      2. 注記: strict mode では早期エラーによりこの束縛への代入試行が防がれるため不変性は観測できない。
    4. それ以外
      1. env.CreateMutableBinding("arguments", false) を実行する。
    5. env.InitializeBinding("arguments", ao) を実行する。
    6. parameterBindingsparameterNames と « "arguments" » のリスト結合とする。
  23. それ以外
    1. parameterBindingsparameterNames とする。
  24. iteratorRecordCreateListIteratorRecord(argumentsList) とする。
  25. hasDuplicatestrue なら
    1. usedEnvundefined とする。
  26. それ以外
    1. usedEnvenv とする。
  27. 注記: 次のステップは ReturnCompletion を返しえない。expression 位置でそのような completion が生じる唯一の方法は YieldExpression の使用だが、これは 15.5.115.6.1 の Early Error 規則でパラメータリスト内で禁止される。
  28. ? IteratorBindingInitialization of formals with arguments iteratorRecord and usedEnv を実行する。
  29. hasParameterExpressionsfalse なら
    1. 注記: 仮引数とトップレベル var には単一 Environment Record でよい。
    2. instantiatedVarNamesList parameterBindings のコピーとする。
    3. varNames の各要素 n について
      1. instantiatedVarNamesn を含まないなら
        1. ninstantiatedVarNames に追加する。
        2. env.CreateMutableBinding(n, false) を実行する。
        3. env.InitializeBinding(n, undefined) を実行する。
    4. varEnvenv とする。
  30. それ以外
    1. 注記: 形式パラメータリスト内の式で生成されるクロージャが関数本体内の宣言を可視化しないよう別 Environment Record が必要。
    2. varEnvNewDeclarativeEnvironment(env) とする。
    3. calleeContext の VariableEnvironment を varEnv に設定する。
    4. instantiatedVarNames を新しい空の List とする。
    5. varNames の各要素 n について
      1. instantiatedVarNamesn を含まないなら
        1. ninstantiatedVarNames に追加する。
        2. varEnv.CreateMutableBinding(n, false) を実行する。
        3. parameterBindingsn を含まない、または functionNamesn を含むなら
          1. initialValueundefined とする。
        4. それ以外
          1. initialValue を ! env.GetBindingValue(n, false) とする。
        5. varEnv.InitializeBinding(n, initialValue) を実行する。
        6. 注記: 仮引数と同じ名前の var は初期的に対応する初期化済み仮引数と同じ値を持つ。
  31. stricttrue なら
    1. lexEnvvarEnv とする。
  32. それ以外
    1. Normative Optional
      ホストが web ブラウザであるか、または ブロックレベル Function 宣言 (Web レガシー互換意味論) をサポートするなら
      1. code Contains xtrue である任意の Block, CaseClause, DefaultClauseStatementList に直接含まれる各 FunctionDeclaration f について
        1. FfBindingIdentifier の StringValue とする。
        2. FunctionDeclaration fFBindingIdentifier とする VariableStatement に置き換えても func に Early Errors を生じさせず、かつ parameterNamesF を含まないなら
          1. 注記: F の var 束縛は VarDeclaredName、仮引数名、別の FunctionDeclaration のいずれでもない場合のみここでインスタンス化される。
          2. instantiatedVarNamesF を含まずかつ F"arguments" でないなら
            1. varEnv.CreateMutableBinding(F, false) を実行する。
            2. varEnv.InitializeBinding(F, undefined) を実行する。
            3. FinstantiatedVarNames に追加する。
          3. FunctionDeclaration f が評価されるとき、15.2.6 で提供される FunctionDeclaration Evaluation アルゴリズムの代わりに次を行う:
            1. fEnv を実行中実行コンテキストの VariableEnvironment とする。
            2. bEnv を実行中実行コンテキストの LexicalEnvironment とする。
            3. fObj を ! bEnv.GetBindingValue(F, false) とする。
            4. fEnv.SetMutableBinding(F, fObj, false) を実行する。
            5. unused を返す。
    2. lexEnvNewDeclarativeEnvironment(varEnv) とする。
    3. 注記: Non-strict 関数はトップレベル lexical 宣言用に別の Environment Record を使用し、direct eval が eval コードで導入される var スコープ宣言が既存のトップレベル lexical 宣言と衝突するか判別できるようにする。strict 関数では strict direct eval がすべての宣言を新しい Environment Record に置くため不要。
  33. calleeContext の LexicalEnvironment を lexEnv に設定する。
  34. lexDeclarationscode の LexicallyScopedDeclarations とする。
  35. lexDeclarations の各要素 d について
    1. 注記: lexical に宣言された名前は function/generator 宣言、仮引数、var 名と同一になりえない。lexical 宣言された名前はここでインスタンス化されるが初期化されない。
    2. d の BoundNames の各要素 dn について
      1. IsConstantDeclaration of dtrue なら
        1. lexEnv.CreateImmutableBinding(dn, true) を実行する。
      2. それ以外
        1. lexEnv.CreateMutableBinding(dn, false) を実行する。
  36. privateEnvcalleeContext の PrivateEnvironment とする。
  37. functionsToInitialize の各 Parse Node f について
    1. fnf の BoundNames の唯一の要素とする。
    2. fo を InstantiateFunctionObject of f with arguments lexEnv and privateEnv とする。
    3. varEnv.SetMutableBinding(fn, fo, false) を実行する。
  38. unused を返す。

10.3 組み込み関数オブジェクト (Built-in Function Objects)

組み込み関数オブジェクト通常オブジェクトであり、10.1 で定められる通常オブジェクトの要件を満たさなければならない。

すべての通常オブジェクトに要求される内部スロット(10.1 参照)に加えて、組み込み関数オブジェクトは次の内部スロットも持たなければならない:

  • [[Realm]]: その関数が生成された realm を表す Realm Record
  • [[InitialName]]: 関数の初期名である String。20.2.3.5 で使用される。

組み込み関数オブジェクト[[Prototype]] 内部スロットの初期値は、特に指定がない限り %Function.prototype% である。

組み込み関数オブジェクト10.3.1 の定義に適合する [[Call]] 内部メソッドを持たなければならない。

組み込み関数オブジェクトは “constructor” と記述される場合、または本仕様のあるアルゴリズムが明示的にその [[Construct]] 内部メソッドを設定する場合に限り [[Construct]] 内部メソッドを持つ。そうした [[Construct]] 内部メソッドは 10.3.2 の定義に適合しなければならない。

実装は本仕様で定義されない追加の組み込み関数オブジェクトを提供してもよい。

10.3.1 [[Call]] ( thisArgument, argumentsList )

The [[Call]] internal method of 組み込み関数オブジェクト F takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. BuiltinCallOrConstruct(F, thisArgument, argumentsList, undefined) を返す。

10.3.2 [[Construct]] ( argumentsList, newTarget )

The [[Construct]] internal method of (このメソッドを持つ場合の)組み込み関数オブジェクト F takes arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns Object を含む正常完了または throw 完了. It performs the following steps when called:

  1. result を ? BuiltinCallOrConstruct(F, uninitialized, argumentsList, newTarget) とする。
  2. アサート: result は Object である。
  3. result を返す。

10.3.3 BuiltinCallOrConstruct ( F, thisArgument, argumentsList, newTarget )

The abstract operation BuiltinCallOrConstruct takes arguments F (a built-in function object), thisArgument (an ECMAScript language value or uninitialized), argumentsList (a List of ECMAScript language values), and newTarget (a constructor or undefined) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. callerContext を実行中実行コンテキストとする。
  2. callerContext がまだサスペンドされていないなら callerContext をサスペンドする。
  3. calleeContext を新しい実行コンテキストとする。
  4. calleeContext の Function を F に設定する。
  5. calleeRealmF.[[Realm]] とする。
  6. calleeContextRealmcalleeRealm に設定する。
  7. calleeContext の ScriptOrModule を null に設定する。
  8. 必要な実装定義の初期化を calleeContext に対して行う。
  9. 実行コンテキストスタックに calleeContext を push する;calleeContext が実行中実行コンテキストとなる。
  10. result を、F の仕様に適合する形で F を評価した結果である Completion Record とする。thisArgumentuninitialized なら this 値は未初期化、それ以外の場合 thisArgumentthis 値を提供する。argumentsList は名前付き引数を提供し、newTarget は NewTarget 値を提供する。
  11. 注記: F がこの文書内で定義されている場合、「F の仕様」とはアルゴリズム手順や他の手段で指定されたその挙動である。
  12. 実行コンテキストスタックから calleeContext を除去し callerContext を実行中実行コンテキストとして復元する。
  13. result を返す。
Note

calleeContext が実行コンテキストスタックから除去されるとき、アクセス可能な Generator により後で再開するためサスペンド保持されている場合は破棄されてはならない。

10.3.4 CreateBuiltinFunction ( behaviour, length, name, additionalInternalSlotsList [ , realm [ , prototype [ , prefix ] ] ] )

The abstract operation CreateBuiltinFunction takes arguments behaviour (an Abstract Closure, a set of algorithm steps, or some other definition of a function's behaviour provided in this specification), length (a non-negative integer or +∞), name (a property key or a Private Name), and additionalInternalSlotsList (a List of names of internal slots) and optional arguments realm (a Realm Record), prototype (an Object or null), and prefix (a String) and returns a built-in function object. additionalInternalSlotsList にはオブジェクトの一部として定義されなければならない追加内部スロット名が含まれる。この操作は組み込み関数オブジェクトを生成する。 It performs the following steps when called:

  1. realm が与えられていなければ realmcurrent Realm Record に設定する。
  2. prototype が与えられていなければ prototyperealm.[[Intrinsics]].[[%Function.prototype%]] に設定する。
  3. internalSlotsList を、これから生成する組み込み関数オブジェクト10.3 が要求するすべての内部スロット名を含む List とする。
  4. additionalInternalSlotsList の要素を internalSlotsList に追加する。
  5. func を新しい組み込み関数オブジェクトとし、呼び出されたとき behaviour で指定された対応パラメータに与えられた引数を渡して behaviour に記述された動作を行うものとする。この新しい関数オブジェクトは名前が internalSlotsList の要素である内部スロット群と [[InitialName]] 内部スロットを持つ。
  6. func.[[Prototype]]prototype に設定する。
  7. func.[[Extensible]]true に設定する。
  8. func.[[Realm]]realm に設定する。
  9. func.[[InitialName]]null に設定する。
  10. SetFunctionLength(func, length) を実行する。
  11. prefix が与えられていないなら
    1. SetFunctionName(func, name) を実行する。
  12. それ以外
    1. SetFunctionName(func, name, prefix) を実行する。
  13. func を返す。

本仕様で定義される各組み込み関数は CreateBuiltinFunction 抽象操作を呼び出すことで生成される。

10.4 組み込みエキゾチックオブジェクトの内部メソッドとスロット (Built-in Exotic Object Internal Methods and Slots)

本仕様はいくつかの種類の組み込みエキゾチックオブジェクトを定義する。これらのオブジェクトは特定の状況を除いて一般に通常オブジェクトと同様に振る舞う。以下のエキゾチックオブジェクトは、下で明示的に別途指定される場合を除き通常オブジェクト内部メソッドを使用する:

10.4.1 束縛関数エキゾチックオブジェクト (Bound Function Exotic Objects)

束縛関数エキゾチックオブジェクトは別の関数オブジェクトを包むエキゾチックオブジェクトである。束縛関数エキゾチックオブジェクトは呼び出し可能([[Call]] 内部メソッドを持ち、[[Construct]] 内部メソッドを持つ場合がある)。束縛関数エキゾチックオブジェクトを呼び出すことは一般に包まれた関数の呼び出しをもたらす。

オブジェクトの [[Call]] および(該当する場合)[[Construct]] 内部メソッドが以下の実装を使用し、その他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは 束縛関数エキゾチックオブジェクト である。これらのメソッドは BoundFunctionCreate で設定される。

束縛関数エキゾチックオブジェクトTable 28 に列挙される ECMAScript 関数オブジェクトの内部スロットを持たない。代わりに [[Prototype]][[Extensible]] に加えて Table 29 に列挙される内部スロットを持つ。

Table 29: 束縛関数エキゾチックオブジェクトの内部スロット (Internal Slots of Bound Function Exotic Objects)
Internal Slot Type Description
[[BoundTargetFunction]] a callable Object 包まれている関数オブジェクト
[[BoundThis]] an ECMAScript language value 包まれた関数を呼ぶ際に常に this 値として渡される値。
[[BoundArguments]] a List of ECMAScript language values 包まれた関数へのあらゆる呼び出しで最初の引数として使用される要素のリスト。

10.4.1.1 [[Call]] ( thisArgument, argumentsList )

The [[Call]] internal method of 束縛関数エキゾチックオブジェクト F takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. targetF.[[BoundTargetFunction]] とする。
  2. boundThisF.[[BoundThis]] とする。
  3. boundArgsF.[[BoundArguments]] とする。
  4. argsboundArgsargumentsListリスト結合とする。
  5. ? Call(target, boundThis, args) を返す。

10.4.1.2 [[Construct]] ( argumentsList, newTarget )

The [[Construct]] internal method of 束縛関数エキゾチックオブジェクト F takes arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns Object を含む正常完了または throw 完了. It performs the following steps when called:

  1. targetF.[[BoundTargetFunction]] とする。
  2. アサート: IsConstructor(target) は true
  3. boundArgsF.[[BoundArguments]] とする。
  4. argsboundArgsargumentsListリスト結合とする。
  5. SameValue(F, newTarget) が true なら newTargettarget に設定する。
  6. ? Construct(target, args, newTarget) を返す。

10.4.1.3 BoundFunctionCreate ( targetFunction, boundThis, boundArgs )

The abstract operation BoundFunctionCreate takes arguments targetFunction (a function object), boundThis (an ECMAScript language value), and boundArgs (a List of ECMAScript language values) and returns function object を含む正常完了または throw 完了. 新しい束縛関数エキゾチックオブジェクトの生成を規定する。 It performs the following steps when called:

  1. proto を ? targetFunction.[[GetPrototypeOf]]() とする。
  2. internalSlotsList を « [[Prototype]], [[Extensible]] » と Table 29 に列挙される内部スロットのリスト結合とする。
  3. objMakeBasicObject(internalSlotsList) とする。
  4. obj.[[Prototype]]proto に設定する。
  5. obj.[[Call]]10.4.1.1 で述べるとおりに設定する。
  6. IsConstructor(targetFunction) が true なら
    1. obj.[[Construct]]10.4.1.2 で述べるとおりに設定する。
  7. obj.[[BoundTargetFunction]]targetFunction に設定する。
  8. obj.[[BoundThis]]boundThis に設定する。
  9. obj.[[BoundArguments]]boundArgs に設定する。
  10. obj を返す。

10.4.2 配列エキゾチックオブジェクト (Array Exotic Objects)

Array は配列インデックスプロパティキー6.1.7 参照)に特別な扱いを与えるエキゾチックオブジェクトである。プロパティ名配列インデックスであるプロパティは 要素 (element) とも呼ばれる。すべての Array は設定不可 ("length") プロパティを持ち、その値は常に 232 より厳密に小さい非負整数的 Number である。"length" プロパティの値は、自身の名前が配列インデックスであるすべての自身プロパティ名より数値的に大きい;Array の自身プロパティが生成または変更されたとき、この不変条件を維持するために他のプロパティが必要に応じ調整される。具体的には、名前が配列インデックスである自身プロパティが追加されるたび、必要なら "length" プロパティの値はその配列インデックスの数値値 + 1 に変更され;"length" プロパティの値が変更されるたび、新しい length 以上の値を持つ配列インデックス名の自身プロパティはすべて削除される。この制約は Array の自身プロパティにのみ適用され、そのプロトタイプから継承される "length"配列インデックスプロパティには影響されない。

オブジェクトの [[DefineOwnProperty]] 内部メソッドが以下の実装を使用し、他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは Array エキゾチックオブジェクト(単に Array)である。これらのメソッドは ArrayCreate で設定される。

10.4.2.1 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of Array エキゾチックオブジェクト A takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. P"length" なら
    1. ArraySetLength(A, Desc) を返す。
  2. それ以外で P配列インデックスなら
    1. lengthDescOrdinaryGetOwnProperty(A, "length") とする。
    2. アサート: lengthDescundefined ではない。
    3. アサート: IsDataDescriptor(lengthDesc) は true
    4. アサート: lengthDesc.[[Configurable]]false
    5. lengthlengthDesc.[[Value]] とする。
    6. アサート: length は非負整数的 Number である。
    7. index を ! ToUint32(P) とする。
    8. indexlength かつ lengthDesc.[[Writable]]false なら false を返す。
    9. succeeded を ! OrdinaryDefineOwnProperty(A, P, Desc) とする。
    10. succeededfalse なら false を返す。
    11. indexlength なら
      1. lengthDesc.[[Value]]index + 1𝔽 に設定する。
      2. succeeded を ! OrdinaryDefineOwnProperty(A, "length", lengthDesc) に設定する。
      3. アサート: succeededtrue
    12. true を返す。
  3. OrdinaryDefineOwnProperty(A, P, Desc) を返す。

10.4.2.2 ArrayCreate ( length [ , proto ] )

The abstract operation ArrayCreate takes argument length (a non-negative integer) and optional argument proto (an Object) and returns Array エキゾチックオブジェクトまたは throw 完了. 新しい Array の生成を規定する。 It performs the following steps when called:

  1. length > 232 - 1 なら RangeError 例外を投げる。
  2. proto が与えられていなければ proto%Array.prototype% に設定する。
  3. AMakeBasicObject[[Prototype]], [[Extensible]] ») とする。
  4. A.[[Prototype]]proto に設定する。
  5. A.[[DefineOwnProperty]]10.4.2.1 で規定されるとおりに設定する。
  6. OrdinaryDefineOwnProperty(A, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  7. A を返す。

10.4.2.3 ArraySpeciesCreate ( originalArray, length )

The abstract operation ArraySpeciesCreate takes arguments originalArray (an Object) and length (a non-negative integer) and returns Object を含む正常完了または throw 完了. originalArray から派生したコンストラクタ関数を用いて新しい Array または類似オブジェクトを生成することを規定する。コンストラクタが Array を返すことは強制されない。 It performs the following steps when called:

  1. isArray を ? IsArray(originalArray) とする。
  2. isArrayfalse なら ? ArrayCreate(length) を返す。
  3. C を ? Get(originalArray, "constructor") とする。
  4. IsConstructor(C) が true なら
    1. thisRealmcurrent Realm Record とする。
    2. realmC を ? GetFunctionRealm(C) とする。
    3. thisRealmrealmC が同じ Realm Record でないなら
      1. SameValue(C, realmC.[[Intrinsics]].[[%Array%]]) が true なら Cundefined に設定する。
  5. C が Object なら
    1. C を ? Get(C, %Symbol.species%) に設定する。
    2. Cnull なら Cundefined に設定する。
  6. Cundefined なら ? ArrayCreate(length) を返す。
  7. IsConstructor(C) が false なら TypeError 例外を投げる。
  8. ? Construct(C, « 𝔽(length) ») を返す。
Note

originalArray が実行中実行コンテキストの realm ではない realm の標準組み込み Array コンストラクタを用いて生成されていた場合、実行中実行コンテキストの realm を用いて新しい Array が生成される。これは歴史的に Array.prototype メソッドがそのような動作をしていた Web ブラウザとの互換性を維持する。

10.4.2.4 ArraySetLength ( A, Desc )

The abstract operation ArraySetLength takes arguments A (an Array) and Desc (a Property Descriptor) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. Desc[[Value]] フィールドを持たないなら
    1. OrdinaryDefineOwnProperty(A, "length", Desc) を返す。
  2. newLenDescDesc のコピーとする。
  3. newLen を ? ToUint32(Desc.[[Value]]) とする。
  4. numberLen を ? ToNumber(Desc.[[Value]]) とする。
  5. SameValueZero(newLen, numberLen) が false なら RangeError 例外を投げる。
  6. newLenDesc.[[Value]]newLen に設定する。
  7. oldLenDescOrdinaryGetOwnProperty(A, "length") とする。
  8. アサート: oldLenDescundefined ではない。
  9. アサート: IsDataDescriptor(oldLenDesc) は true
  10. アサート: oldLenDesc.[[Configurable]]false
  11. oldLenoldLenDesc.[[Value]] とする。
  12. newLenoldLen なら
    1. OrdinaryDefineOwnProperty(A, "length", newLenDesc) を返す。
  13. oldLenDesc.[[Writable]]false なら false を返す。
  14. newLenDesc[[Writable]] フィールドを持たないか newLenDesc.[[Writable]]true なら
    1. newWritabletrue とする。
  15. それ以外
    1. 注記: [[Writable]] 属性を false に設定するのは、要素が削除できない場合に備えて遅延される。
    2. newWritablefalse とする。
    3. newLenDesc.[[Writable]]true に設定する。
  16. succeeded を ! OrdinaryDefineOwnProperty(A, "length", newLenDesc) とする。
  17. succeededfalse なら false を返す。
  18. A の各自身プロパティキー PP配列インデックスかつ ! ToUint32(P) ≥ newLen であるものについて、数値インデックス降順で:
    1. deleteSucceeded を ! A.[[Delete]](P) とする。
    2. deleteSucceededfalse なら
      1. newLenDesc.[[Value]] を ! ToUint32(P) + 1𝔽 に設定する。
      2. newWritablefalse なら newLenDesc.[[Writable]]false に設定する。
      3. OrdinaryDefineOwnProperty(A, "length", newLenDesc) を実行する。
      4. false を返す。
  19. newWritablefalse なら
    1. succeeded を ! OrdinaryDefineOwnProperty(A, "length", PropertyDescriptor { [[Writable]]: false }) に設定する。
    2. アサート: succeededtrue
  20. true を返す。
Note

ステップ 3 および 4 では、Desc.[[Value]] がオブジェクトの場合その valueOf メソッドが 2 回呼び出される。これは本仕様第 2 版以降この効果を伴うよう規定されたレガシー動作である。

10.4.3 文字列エキゾチックオブジェクト (String Exotic Objects)

String オブジェクトは String 値をカプセル化し、その String 値の個々のコード単位要素に対応する仮想の整数インデックス付きデータプロパティを公開するエキゾチックオブジェクトである。String エキゾチックオブジェクトは常に "length" という名前のデータプロパティを持ち、その値はカプセル化された String 値の長さである。コード単位データプロパティ"length" プロパティはいずれも書き込み不可かつ設定不可である。

オブジェクトの [[GetOwnProperty]][[DefineOwnProperty]][[OwnPropertyKeys]] 内部メソッドが以下の実装を使用し、他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは String エキゾチックオブジェクト(単に String オブジェクト)である。これらのメソッドは StringCreate で設定される。

String エキゾチックオブジェクト通常オブジェクトと同じ内部スロットを持つ。また [[StringData]] 内部スロットを持つ。

10.4.3.1 [[GetOwnProperty]] ( P )

The [[GetOwnProperty]] internal method of String エキゾチックオブジェクト S takes argument P (a property key) and returns Property Descriptorundefined を含む正常完了. It performs the following steps when called:

  1. descOrdinaryGetOwnProperty(S, P) とする。
  2. descundefined でないなら desc を返す。
  3. StringGetOwnProperty(S, P) を返す。

10.4.3.2 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of String エキゾチックオブジェクト S takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. stringDescStringGetOwnProperty(S, P) とする。
  2. stringDescundefined でないなら
    1. extensibleS.[[Extensible]] とする。
    2. IsCompatiblePropertyDescriptor(extensible, Desc, stringDesc) を返す。
  3. OrdinaryDefineOwnProperty(S, P, Desc) を返す。

10.4.3.3 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of String エキゾチックオブジェクト O takes no arguments and returns プロパティキーList を含む正常完了. It performs the following steps when called:

  1. keys を新しい空の List とする。
  2. strO.[[StringData]] とする。
  3. アサート: str は String である。
  4. lenstr の長さとする。
  5. 0 ≤ i < len を満たす各整数 i について昇順で:
    1. ToString(𝔽(i)) を keys に追加する。
  6. O の各自身プロパティキー PP配列インデックスかつ ! ToIntegerOrInfinity(P) ≥ len であるものについて、数値インデックス昇順で:
    1. Pkeys に追加する。
  7. O の各自身プロパティキー PP が String かつ配列インデックスでないものについて、作成順昇順で:
    1. Pkeys に追加する。
  8. O の各自身プロパティキー PP が Symbol であるものについて、作成順昇順で:
    1. Pkeys に追加する。
  9. keys を返す。

10.4.3.4 StringCreate ( value, prototype )

The abstract operation StringCreate takes arguments value (a String) and prototype (an Object) and returns a String exotic object. 新しい String エキゾチックオブジェクトの生成を規定する。 It performs the following steps when called:

  1. SMakeBasicObject[[Prototype]], [[Extensible]], [[StringData]] ») とする。
  2. S.[[Prototype]]prototype に設定する。
  3. S.[[StringData]]value に設定する。
  4. S.[[GetOwnProperty]]10.4.3.1 で規定されるとおりに設定する。
  5. S.[[DefineOwnProperty]]10.4.3.2 で規定されるとおりに設定する。
  6. S.[[OwnPropertyKeys]]10.4.3.3 で規定されるとおりに設定する。
  7. lengthvalue の長さとする。
  8. DefinePropertyOrThrow(S, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  9. S を返す。

10.4.3.5 StringGetOwnProperty ( S, P )

The abstract operation StringGetOwnProperty takes arguments S (an Object that has a [[StringData]] internal slot) and P (a property key) and returns a Property Descriptor or undefined. It performs the following steps when called:

  1. P が String でなければ undefined を返す。
  2. indexCanonicalNumericIndexString(P) とする。
  3. index整数的 Number でなければ undefined を返す。
  4. index-0𝔽 または index < -0𝔽 なら undefined を返す。
  5. strS.[[StringData]] とする。
  6. アサート: str は String。
  7. lenstr の長さとする。
  8. (index) ≥ len なら undefined を返す。
  9. resultStrstr(index) から (index) + 1 までの部分文字列とする。
  10. PropertyDescriptor { [[Value]]: resultStr, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false } を返す。

10.4.4 arguments エキゾチックオブジェクト (Arguments Exotic Objects)

ほとんどの ECMAScript 関数はそのコードに arguments オブジェクトを利用可能にする。関数定義の特性に応じて、その arguments オブジェクトは通常オブジェクトarguments エキゾチックオブジェクトのいずれかである。arguments エキゾチックオブジェクトは、配列インデックスプロパティが関連 ECMAScript 関数の呼び出しでの仮引数束縛に対応付けられるエキゾチックオブジェクトである。

オブジェクトの内部メソッドが以下の実装を使用し、ここで指定されないものが 10.1 の定義を使用する場合、そのオブジェクトは arguments エキゾチックオブジェクト である。これらのメソッドは CreateMappedArgumentsObject で設定される。

Note 1

CreateUnmappedArgumentsObject はこの節にまとめられているが、通常オブジェクトを生成し arguments エキゾチックオブジェクトは生成しない。

arguments エキゾチックオブジェクト通常オブジェクトと同じ内部スロットを持つ。また [[ParameterMap]] 内部スロットを持つ。通常の arguments オブジェクトも常に undefined である [[ParameterMap]] 内部スロットを持つ。通常の arguments オブジェクトでは [[ParameterMap]] 内部スロットは Object.prototype.toString (20.1.3.6) によりその識別にのみ使われる。

Note 2

対応する関数オブジェクトの仮引数数より小さい数値名を持つ arguments エキゾチックオブジェクト整数インデックスデータプロパティは、初期状態で関数の実行コンテキスト内の対応する引数束縛の値を共有する。これはそのプロパティを変更すると対応する引数束縛の値も変わり、逆も同様であることを意味する。この対応はそのようなプロパティが削除され再定義された場合、またはアクセサプロパティに変換された場合に失われる。arguments オブジェクトが通常オブジェクトであれば、そのプロパティ値は単に関数に渡された引数のコピーであり、プロパティ値と仮引数値の動的リンクは存在しない。

Note 3

ParameterMap オブジェクトとそのプロパティ値は arguments オブジェクトと引数束縛間の対応を仕様化するための装置として使用される。ParameterMap オブジェクトやそのプロパティ値であるオブジェクトは ECMAScript コードから直接観測できない。実装は指定されたセマンティクスを実現するために実際にそれらを生成または使用する必要はない。

Note 4

通常の arguments オブジェクトはアクセス時に TypeError 例外を投げる設定不可のアクセサプロパティ "callee" を定義する。"callee" プロパティは non-strict 関数の一部にのみ生成される arguments エキゾチックオブジェクトではより特定の意味を持つ。通常バリアントでこのプロパティを定義するのは、適合実装が他のいかなる形でも定義しないことを保証するためである。

Note 5

arguments エキゾチックオブジェクトの実装は歴史的に "caller" というアクセサプロパティを含んでいた。ECMAScript 2017 以前、この仕様は通常 arguments オブジェクト上の投げる "caller" プロパティの定義を含んでいた。実装がもはやこの拡張を含まないため、ECMAScript 2017 は投げる "caller" アクセサの要件を削除した。

10.4.4.1 [[GetOwnProperty]] ( P )

The [[GetOwnProperty]] internal method of arguments エキゾチックオブジェクト args takes argument P (a property key) and returns Property Descriptorundefined を含む正常完了. It performs the following steps when called:

  1. descOrdinaryGetOwnProperty(args, P) とする。
  2. descundefined なら undefined を返す。
  3. mapargs.[[ParameterMap]] とする。
  4. isMapped を ! HasOwnProperty(map, P) とする。
  5. isMappedtrue なら
    1. desc.[[Value]] を ! Get(map, P) に設定する。
  6. desc を返す。

10.4.4.2 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of arguments エキゾチックオブジェクト args takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. mapargs.[[ParameterMap]] とする。
  2. isMapped を ! HasOwnProperty(map, P) とする。
  3. newArgDescDesc とする。
  4. isMappedtrue かつ IsDataDescriptor(Desc) が true の場合、
    1. Desc[[Value]] フィールドを持たず [[Writable]] フィールドを持ち Desc.[[Writable]]false なら
      1. newArgDescDesc のコピーとする。
      2. newArgDesc.[[Value]] を ! Get(map, P) に設定する。
  5. allowed を ! OrdinaryDefineOwnProperty(args, P, newArgDesc) とする。
  6. allowedfalse なら false を返す。
  7. isMappedtrue なら
    1. IsAccessorDescriptor(Desc) が true なら
      1. map.[[Delete]](P) を実行する。
    2. それ以外
      1. Desc[[Value]] フィールドを持つなら
        1. アサート: arguments オブジェクトによりマップされる仮引数は常に書き込み可能であるため以下の Set は成功する。
        2. Set(map, P, Desc.[[Value]], false) を実行する。
      2. Desc[[Writable]] フィールドを持ち Desc.[[Writable]]false なら
        1. map.[[Delete]](P) を実行する。
  8. true を返す。

10.4.4.3 [[Get]] ( P, Receiver )

The [[Get]] internal method of arguments エキゾチックオブジェクト args takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. mapargs.[[ParameterMap]] とする。
  2. isMapped を ! HasOwnProperty(map, P) とする。
  3. isMappedfalse なら
    1. OrdinaryGet(args, P, Receiver) を返す。
  4. それ以外
    1. アサート: mapP に対する仮引数マッピングを含む。
    2. Get(map, P) を返す。

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

The [[Set]] internal method of arguments エキゾチックオブジェクト args takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. SameValue(args, Receiver) が false なら
    1. isMappedfalse とする。
  2. それ以外
    1. mapargs.[[ParameterMap]] とする。
    2. isMapped を ! HasOwnProperty(map, P) とする。
  3. isMappedtrue なら
    1. アサート: 以下の Set は成功する。なぜなら arguments オブジェクトによりマップされる仮引数は常に書き込み可能だからである。
    2. Set(map, P, V, false) を実行する。
  4. OrdinarySet(args, P, V, Receiver) を返す。

10.4.4.5 [[Delete]] ( P )

The [[Delete]] internal method of arguments エキゾチックオブジェクト args takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. mapargs.[[ParameterMap]] とする。
  2. isMapped を ! HasOwnProperty(map, P) とする。
  3. result を ? OrdinaryDelete(args, P) とする。
  4. resulttrue かつ isMappedtrue なら
    1. map.[[Delete]](P) を実行する。
  5. result を返す。

10.4.4.6 CreateUnmappedArgumentsObject ( argumentsList )

The abstract operation CreateUnmappedArgumentsObject takes argument argumentsList (a List of ECMAScript language values) and returns an ordinary object. It performs the following steps when called:

  1. lenargumentsList の要素数とする。
  2. objOrdinaryObjectCreate(%Object.prototype%, « [[ParameterMap]] ») とする。
  3. obj.[[ParameterMap]]undefined に設定する。
  4. DefinePropertyOrThrow(obj, "length", PropertyDescriptor { [[Value]]: 𝔽(len), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  5. index を 0 とする。
  6. index < len の間繰り返す:
    1. valargumentsList[index] とする。
    2. CreateDataPropertyOrThrow(obj, ! ToString(𝔽(index)), val) を実行する。
    3. indexindex + 1 に設定する。
  7. DefinePropertyOrThrow(obj, %Symbol.iterator%, PropertyDescriptor { [[Value]]: %Array.prototype.values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  8. DefinePropertyOrThrow(obj, "callee", PropertyDescriptor { [[Get]]: %ThrowTypeError%, [[Set]]: %ThrowTypeError%, [[Enumerable]]: false, [[Configurable]]: false }) を実行する。
  9. obj を返す。

10.4.4.7 CreateMappedArgumentsObject ( func, formals, argumentsList, env )

The abstract operation CreateMappedArgumentsObject takes arguments func (an Object), formals (a Parse Node), argumentsList (a List of ECMAScript language values), and env (an Environment Record) and returns an arguments exotic object. It performs the following steps when called:

  1. アサート: formals は rest パラメータ、任意の binding pattern、任意の initializer を含まず、重複識別子を含んでもよい。
  2. lenargumentsList の要素数とする。
  3. objMakeBasicObject[[Prototype]], [[Extensible]], [[ParameterMap]] ») とする。
  4. obj.[[GetOwnProperty]]10.4.4.1 で規定されるとおりに設定する。
  5. obj.[[DefineOwnProperty]]10.4.4.2 で規定されるとおりに設定する。
  6. obj.[[Get]]10.4.4.3 で規定されるとおりに設定する。
  7. obj.[[Set]]10.4.4.4 で規定されるとおりに設定する。
  8. obj.[[Delete]]10.4.4.5 で規定されるとおりに設定する。
  9. obj.[[Prototype]]%Object.prototype% に設定する。
  10. mapOrdinaryObjectCreate(null) とする。
  11. obj.[[ParameterMap]]map に設定する。
  12. parameterNamesformals の BoundNames とする。
  13. numberOfParametersparameterNames の要素数とする。
  14. index を 0 とする。
  15. index < len の間繰り返す:
    1. valargumentsList[index] とする。
    2. CreateDataPropertyOrThrow(obj, ! ToString(𝔽(index)), val) を実行する。
    3. indexindex + 1 に設定する。
  16. DefinePropertyOrThrow(obj, "length", PropertyDescriptor { [[Value]]: 𝔽(len), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  17. mappedNames を新しい空の List とする。
  18. indexnumberOfParameters - 1 に設定する。
  19. index ≥ 0 の間繰り返す:
    1. nameparameterNames[index] とする。
    2. mappedNamesname を含まないなら
      1. mappedNamesname を追加する。
      2. index < len なら
        1. gMakeArgGetter(name, env) とする。
        2. pMakeArgSetter(name, env) とする。
        3. map.[[DefineOwnProperty]](! ToString(𝔽(index)), PropertyDescriptor { [[Set]]: p, [[Get]]: g, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
    3. indexindex - 1 に設定する。
  20. DefinePropertyOrThrow(obj, %Symbol.iterator%, PropertyDescriptor { [[Value]]: %Array.prototype.values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  21. DefinePropertyOrThrow(obj, "callee", PropertyDescriptor { [[Value]]: func, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }) を実行する。
  22. obj を返す。

10.4.4.7.1 MakeArgGetter ( name, env )

The abstract operation MakeArgGetter takes arguments name (a String) and env (an Environment Record) and returns a function object. env において name に束縛された値を返す組み込み関数オブジェクトを生成する。 It performs the following steps when called:

  1. getterClosure を、新しい引数なし Abstract Closure とし、nameenv を捕捉し呼び出されたとき次を行うものとする:
    1. NormalCompletion(! env.GetBindingValue(name, false)) を返す。
  2. getterCreateBuiltinFunction(getterClosure, 0, "", « ») とする。
  3. 注記: getter は ECMAScript コードから直接アクセスされない。
  4. getter を返す。

10.4.4.7.2 MakeArgSetter ( name, env )

The abstract operation MakeArgSetter takes arguments name (a String) and env (an Environment Record) and returns a function object. env において name に束縛された値を設定する組み込み関数オブジェクトを生成する。 It performs the following steps when called:

  1. setterClosure を、パラメータ (value) を持ち nameenv を捕捉し呼び出されたとき次を行う新しい Abstract Closure とする:
    1. NormalCompletion(! env.SetMutableBinding(name, value, false)) を返す。
  2. setterCreateBuiltinFunction(setterClosure, 1, "", « ») とする。
  3. 注記: setter は ECMAScript コードから直接アクセスされない。
  4. setter を返す。

10.4.5 TypedArray エキゾチックオブジェクト (TypedArray Exotic Objects)

TypedArray は正準数値文字列であるプロパティキーを特別扱いし、そのうち境界内の整数インデックス集合を用いて均一型要素をインデックス付けし、残りがプロトタイプ連鎖走査を発生させずに欠落しているという不変条件を強制するエキゾチックオブジェクトである。

Note

任意の Number n に対する ToString(n) は正準数値文字列であるため、実装は実際に文字列変換を行わずに Number を TypedArrayプロパティキーとして扱ってもよい。

TypedArray通常オブジェクトと同じ内部スロットを持ち、さらに [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] 内部スロットを持つ。

オブジェクトの [[PreventExtensions]], [[GetOwnProperty]], [[HasProperty]], [[DefineOwnProperty]], [[Get]], [[Set]], [[Delete]], [[OwnPropertyKeys]] 内部メソッドが本節の定義を使用し、他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは TypedArray である。これらのメソッドは TypedArrayCreate により設定される。

10.4.5.1 [[PreventExtensions]] ( )

The [[PreventExtensions]] internal method of TypedArray O takes no arguments and returns Boolean を含む正常完了. It performs the following steps when called:

  1. 注記: 6.1.7.3 に規定される拡張可能性関連の不変条件は、基礎バッファがリサイズされ整数インデックス名のプロパティを獲得(または失い再獲得)し得る場合に true を返すことを許さない。
  2. IsTypedArrayFixedLength(O) が false なら false を返す。
  3. OrdinaryPreventExtensions(O) を返す。

10.4.5.2 [[GetOwnProperty]] ( P )

The [[GetOwnProperty]] internal method of TypedArray O takes argument P (a property key) and returns Property Descriptorundefined を含む正常完了. It performs the following steps when called:

  1. P が String なら
    1. numericIndexCanonicalNumericIndexString(P) とする。
    2. numericIndexundefined でないなら
      1. valueTypedArrayGetElement(O, numericIndex) とする。
      2. valueundefined なら undefined を返す。
      3. PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } を返す。
  2. OrdinaryGetOwnProperty(O, P) を返す。

10.4.5.3 [[HasProperty]] ( P )

The [[HasProperty]] internal method of TypedArray O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. P が String なら
    1. numericIndexCanonicalNumericIndexString(P) とする。
    2. numericIndexundefined でないなら IsValidIntegerIndex(O, numericIndex) を返す。
  2. OrdinaryHasProperty(O, P) を返す。

10.4.5.4 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of TypedArray O takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. P が String なら
    1. numericIndexCanonicalNumericIndexString(P) とする。
    2. numericIndexundefined でないなら
      1. IsValidIntegerIndex(O, numericIndex) が false なら false を返す。
      2. Desc[[Configurable]] フィールドを持ち Desc.[[Configurable]]false なら false を返す。
      3. Desc[[Enumerable]] フィールドを持ち Desc.[[Enumerable]]false なら false を返す。
      4. IsAccessorDescriptor(Desc) が true なら false を返す。
      5. Desc[[Writable]] フィールドを持ち Desc.[[Writable]]false なら false を返す。
      6. Desc[[Value]] フィールドを持つなら ? TypedArraySetElement(O, numericIndex, Desc.[[Value]]) を実行する。
      7. true を返す。
  2. OrdinaryDefineOwnProperty(O, P, Desc) を返す。

10.4.5.5 [[Get]] ( P, Receiver )

The [[Get]] internal method of TypedArray O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. P が String なら
    1. numericIndexCanonicalNumericIndexString(P) とする。
    2. numericIndexundefined でないなら
      1. TypedArrayGetElement(O, numericIndex) を返す。
  2. OrdinaryGet(O, P, Receiver) を返す。

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

The [[Set]] internal method of TypedArray O takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. P が String なら
    1. numericIndexCanonicalNumericIndexString(P) とする。
    2. numericIndexundefined でないなら
      1. SameValue(O, Receiver) が true なら
        1. TypedArraySetElement(O, numericIndex, V) を実行する。
        2. true を返す。
      2. IsValidIntegerIndex(O, numericIndex) が false なら true を返す。
  2. OrdinarySet(O, P, V, Receiver) を返す。

10.4.5.7 [[Delete]] ( P )

The [[Delete]] internal method of TypedArray O takes argument P (a property key) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. P が String なら
    1. numericIndexCanonicalNumericIndexString(P) とする。
    2. numericIndexundefined でないなら
      1. IsValidIntegerIndex(O, numericIndex) が false なら true を返す;そうでなければ false を返す。
  2. OrdinaryDelete(O, P) を返す。

10.4.5.8 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of TypedArray O takes no arguments and returns プロパティキーList を含む正常完了. It performs the following steps when called:

  1. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst) とする。
  2. keys を新しい空の List とする。
  3. IsTypedArrayOutOfBounds(taRecord) が false なら
    1. lengthTypedArrayLength(taRecord) とする。
    2. 0 ≤ i < length の各整数 i について昇順で:
      1. ToString(𝔽(i)) を keys に追加する。
  4. O の各自身プロパティキー PP が String かつ整数インデックスでないものについて、作成順昇順で:
    1. Pkeys に追加する。
  5. O の各自身プロパティキー PP が Symbol であるものについて、作成順昇順で:
    1. Pkeys に追加する。
  6. keys を返す。

10.4.5.9 バッファ監視付き TypedArray レコード (TypedArray With Buffer Witness Records)

TypedArray With Buffer Witness Record は、TypedArray と、ビュー対象バッファのキャッシュされたバイト長をカプセル化する Record 値である。Growable SharedArrayBuffer をビューしている場合に、そのバイト長データブロックの単一の共有メモリ読取イベントがあることを保証する助けとなる。

TypedArray With Buffer Witness Record は Table 30 に列挙されるフィールドを持つ。

Table 30: TypedArray With Buffer Witness Record Fields
Field Name Value Meaning
[[Object]] a TypedArray バッファのバイト長が読み出される TypedArray
[[CachedBufferByteLength]] a non-negative integer or detached Record 作成時点のオブジェクトの [[ViewedArrayBuffer]] のバイト長。

10.4.5.10 MakeTypedArrayWithBufferWitnessRecord ( obj, order )

The abstract operation MakeTypedArrayWithBufferWitnessRecord takes arguments obj (a TypedArray) and order (seq-cst or unordered) and returns a TypedArray With Buffer Witness Record. It performs the following steps when called:

  1. bufferobj.[[ViewedArrayBuffer]] とする。
  2. IsDetachedBuffer(buffer) が true なら
    1. byteLengthdetached とする。
  3. それ以外
    1. byteLengthArrayBufferByteLength(buffer, order) とする。
  4. TypedArray With Buffer Witness Record { [[Object]]: obj, [[CachedBufferByteLength]]: byteLength } を返す。

10.4.5.11 TypedArrayCreate ( prototype )

The abstract operation TypedArrayCreate takes argument prototype (an Object) and returns a TypedArray. 新しい TypedArray の生成を規定する。 It performs the following steps when called:

  1. internalSlotsList を « [[Prototype]], [[Extensible]], [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] » とする。
  2. AMakeBasicObject(internalSlotsList) とする。
  3. A.[[PreventExtensions]]10.4.5.1 で規定されるとおりに設定する。
  4. A.[[GetOwnProperty]]10.4.5.2 で規定されるとおりに設定する。
  5. A.[[HasProperty]]10.4.5.3 で規定されるとおりに設定する。
  6. A.[[DefineOwnProperty]]10.4.5.4 で規定されるとおりに設定する。
  7. A.[[Get]]10.4.5.5 で規定されるとおりに設定する。
  8. A.[[Set]]10.4.5.6 で規定されるとおりに設定する。
  9. A.[[Delete]]10.4.5.7 で規定されるとおりに設定する。
  10. A.[[OwnPropertyKeys]]10.4.5.8 で規定されるとおりに設定する。
  11. A.[[Prototype]]prototype に設定する。
  12. A を返す。

10.4.5.12 TypedArrayByteLength ( taRecord )

The abstract operation TypedArrayByteLength takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a non-negative integer. It performs the following steps when called:

  1. IsTypedArrayOutOfBounds(taRecord) が true なら 0 を返す。
  2. lengthTypedArrayLength(taRecord) とする。
  3. length = 0 なら 0 を返す。
  4. OtaRecord.[[Object]] とする。
  5. O.[[ByteLength]]auto でないなら O.[[ByteLength]] を返す。
  6. elementSizeTypedArrayElementSize(O) とする。
  7. length × elementSize を返す。

10.4.5.13 TypedArrayLength ( taRecord )

The abstract operation TypedArrayLength takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a non-negative integer. It performs the following steps when called:

  1. アサート: IsTypedArrayOutOfBounds(taRecord) は false
  2. OtaRecord.[[Object]] とする。
  3. O.[[ArrayLength]]auto でないなら O.[[ArrayLength]] を返す。
  4. アサート: IsFixedLengthArrayBuffer(O.[[ViewedArrayBuffer]]) は false
  5. byteOffsetO.[[ByteOffset]] とする。
  6. elementSizeTypedArrayElementSize(O) とする。
  7. byteLengthtaRecord.[[CachedBufferByteLength]] とする。
  8. アサート: byteLengthdetached ではない。
  9. floor((byteLength - byteOffset) / elementSize) を返す。

10.4.5.14 IsTypedArrayOutOfBounds ( taRecord )

The abstract operation IsTypedArrayOutOfBounds takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a Boolean. オブジェクトの数値プロパティのいずれかが基礎バッファの境界外のインデックスを参照するかを確認する。 It performs the following steps when called:

  1. OtaRecord.[[Object]] とする。
  2. bufferByteLengthtaRecord.[[CachedBufferByteLength]] とする。
  3. アサート: IsDetachedBuffer(O.[[ViewedArrayBuffer]]) は bufferByteLengthdetached の場合かつその場合に限り true
  4. bufferByteLengthdetached なら true を返す。
  5. byteOffsetStartO.[[ByteOffset]] とする。
  6. O.[[ArrayLength]]auto なら
    1. byteOffsetEndbufferByteLength とする。
  7. それ以外
    1. elementSizeTypedArrayElementSize(O) とする。
    2. byteOffsetEndbyteOffsetStart + O.[[ArrayLength]] × elementSize とする。
  8. byteOffsetStart > bufferByteLength または byteOffsetEnd > bufferByteLength なら true を返す。
  9. 注記: 長さ 0 の TypedArray は境界外とは見なされない。
  10. false を返す。

10.4.5.15 IsTypedArrayFixedLength ( O )

The abstract operation IsTypedArrayFixedLength takes argument O (a TypedArray) and returns a Boolean. It performs the following steps when called:

  1. O.[[ArrayLength]]auto なら false を返す。
  2. bufferO.[[ViewedArrayBuffer]] とする。
  3. IsFixedLengthArrayBuffer(buffer) が false かつ IsSharedArrayBuffer(buffer) が false なら false を返す。
  4. true を返す。

10.4.5.16 IsValidIntegerIndex ( O, index )

The abstract operation IsValidIntegerIndex takes arguments O (a TypedArray) and index (a Number) and returns a Boolean. It performs the following steps when called:

  1. IsDetachedBuffer(O.[[ViewedArrayBuffer]]) が true なら false を返す。
  2. index整数的 Number でなければ false を返す。
  3. index-0𝔽 または index < -0𝔽 なら false を返す。
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(O, unordered) とする。
  5. 注記: O の裏付けバッファが growable SharedArrayBuffer の場合、境界チェックは同期化操作ではない。
  6. IsTypedArrayOutOfBounds(taRecord) が true なら false を返す。
  7. lengthTypedArrayLength(taRecord) とする。
  8. (index) ≥ length なら false を返す。
  9. true を返す。

10.4.5.17 TypedArrayGetElement ( O, index )

The abstract operation TypedArrayGetElement takes arguments O (a TypedArray) and index (a Number) and returns a Number, a BigInt, or undefined. It performs the following steps when called:

  1. IsValidIntegerIndex(O, index) が false なら undefined を返す。
  2. offsetO.[[ByteOffset]] とする。
  3. elementSizeTypedArrayElementSize(O) とする。
  4. byteIndexInBuffer を ((index) × elementSize) + offset とする。
  5. elementTypeTypedArrayElementType(O) とする。
  6. GetValueFromBuffer(O.[[ViewedArrayBuffer]], byteIndexInBuffer, elementType, true, unordered) を返す。

10.4.5.18 TypedArraySetElement ( O, index, value )

The abstract operation TypedArraySetElement takes arguments O (a TypedArray), index (a Number), and value (an ECMAScript language value) and returns unused を含む正常完了または throw 完了. It performs the following steps when called:

  1. O.[[ContentType]]bigint なら numValue を ? ToBigInt(value) とする。
  2. それ以外は numValue を ? ToNumber(value) とする。
  3. IsValidIntegerIndex(O, index) が true なら
    1. offsetO.[[ByteOffset]] とする。
    2. elementSizeTypedArrayElementSize(O) とする。
    3. byteIndexInBuffer を ((index) × elementSize) + offset とする。
    4. elementTypeTypedArrayElementType(O) とする。
    5. SetValueInBuffer(O.[[ViewedArrayBuffer]], byteIndexInBuffer, elementType, numValue, true, unordered) を実行する。
  4. unused を返す。
Note

この操作は常に成功するように見えるが、TypedArray の末尾を超えて書こうとしたり、切り離された ArrayBuffer を裏付けとする TypedArray に書こうとした場合は何の効果もない。

10.4.5.19 IsArrayBufferViewOutOfBounds ( O )

The abstract operation IsArrayBufferViewOutOfBounds takes argument O (a TypedArray or a DataView) and returns a Boolean. TypedArray の数値プロパティまたは DataView オブジェクトのメソッドのいずれかが基礎データブロック境界外のインデックス値を参照し得るかを確認する。上位仕様向け利便性のために存在する抽象操作。 It performs the following steps when called:

  1. O[[DataView]] 内部スロットを持つなら
    1. viewRecordMakeDataViewWithBufferWitnessRecord(O, seq-cst) とする。
    2. IsViewOutOfBounds(viewRecord) を返す。
  2. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst) とする。
  3. IsTypedArrayOutOfBounds(taRecord) を返す。

10.4.6 モジュール名前空間エキゾチックオブジェクト (Module Namespace Exotic Objects)

モジュール名前空間エキゾチックオブジェクトは ECMAScript Module からエクスポートされた束縛を公開するエキゾチックオブジェクトである(16.2.3 参照)。モジュール名前空間エキゾチックオブジェクトの String キー自身プロパティと Module がエクスポートする束縛名には 1 対 1 の対応がある。エクスポートされた束縛には export * による間接エクスポートも含まれる。各 String 値自身プロパティキーは対応するエクスポート束縛名の StringValue である。これらはモジュール名前空間エキゾチックオブジェクトの唯一の String キー付きプロパティである。各プロパティは属性 { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false } を持つ。モジュール名前空間エキゾチックオブジェクトは拡張不可能である。

オブジェクトの [[GetPrototypeOf]], [[SetPrototypeOf]], [[IsExtensible]], [[PreventExtensions]], [[GetOwnProperty]], [[DefineOwnProperty]], [[HasProperty]], [[Get]], [[Set]], [[Delete]], [[OwnPropertyKeys]] 内部メソッドが本節の定義を使用し、他の必須内部メソッドが 10.1 の定義を使用する場合、そのオブジェクトは モジュール名前空間エキゾチックオブジェクト である。これらのメソッドは ModuleNamespaceCreate により設定される。

モジュール名前空間エキゾチックオブジェクトTable 31 に定義される内部スロットを持つ。

Table 31: モジュール名前空間エキゾチックオブジェクトの内部スロット (Internal Slots of Module Namespace Exotic Objects)
Internal Slot Type Description
[[Module]] a Module Record この名前空間が公開するエクスポートを持つ Module Record
[[Exports]] a List of Strings このオブジェクトの自身プロパティとして公開されるエクスポートされた名前の String 値のリスト。コードユニットの辞書式順にソートされる。

10.4.6.1 [[GetPrototypeOf]] ( )

The [[GetPrototypeOf]] internal method of モジュール名前空間エキゾチックオブジェクト takes no arguments and returns null を含む正常完了. It performs the following steps when called:

  1. null を返す。

10.4.6.2 [[SetPrototypeOf]] ( V )

The [[SetPrototypeOf]] internal method of モジュール名前空間エキゾチックオブジェクト O takes argument V (an Object or null) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. SetImmutablePrototype(O, V) を返す。

10.4.6.3 [[IsExtensible]] ( )

The [[IsExtensible]] internal method of モジュール名前空間エキゾチックオブジェクト takes no arguments and returns false を含む正常完了. It performs the following steps when called:

  1. false を返す。

10.4.6.4 [[PreventExtensions]] ( )

The [[PreventExtensions]] internal method of モジュール名前空間エキゾチックオブジェクト takes no arguments and returns true を含む正常完了. It performs the following steps when called:

  1. true を返す。

10.4.6.5 [[GetOwnProperty]] ( P )

The [[GetOwnProperty]] internal method of モジュール名前空間エキゾチックオブジェクト O takes argument P (a property key) and returns Property Descriptorundefined を含む正常完了、または throw 完了. It performs the following steps when called:

  1. P が Symbol なら OrdinaryGetOwnProperty(O, P) を返す。
  2. exportsO.[[Exports]] とする。
  3. exportsP を含まないなら undefined を返す。
  4. value を ? O.[[Get]](P, O) とする。
  5. PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false } を返す。

10.4.6.6 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of モジュール名前空間エキゾチックオブジェクト O takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. P が Symbol なら ! OrdinaryDefineOwnProperty(O, P, Desc) を返す。
  2. current を ? O.[[GetOwnProperty]](P) とする。
  3. currentundefined なら false を返す。
  4. Desc[[Configurable]] フィールドを持ち Desc.[[Configurable]]true なら false を返す。
  5. Desc[[Enumerable]] フィールドを持ち Desc.[[Enumerable]]false なら false を返す。
  6. IsAccessorDescriptor(Desc) が true なら false を返す。
  7. Desc[[Writable]] フィールドを持ち Desc.[[Writable]]false なら false を返す。
  8. Desc[[Value]] フィールドを持つなら SameValue(Desc.[[Value]], current.[[Value]]) を返す。
  9. true を返す。

10.4.6.7 [[HasProperty]] ( P )

The [[HasProperty]] internal method of モジュール名前空間エキゾチックオブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. P が Symbol なら ! OrdinaryHasProperty(O, P) を返す。
  2. exportsO.[[Exports]] とする。
  3. exportsP を含むなら true を返す。
  4. false を返す。

10.4.6.8 [[Get]] ( P, Receiver )

The [[Get]] internal method of モジュール名前空間エキゾチックオブジェクト O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. P が Symbol なら
    1. OrdinaryGet(O, P, Receiver) を返す。
  2. exportsO.[[Exports]] とする。
  3. exportsP を含まないなら undefined を返す。
  4. mO.[[Module]] とする。
  5. bindingm.ResolveExport(P) とする。
  6. アサート: bindingResolvedBinding Record
  7. targetModulebinding.[[Module]] とする。
  8. アサート: targetModuleundefined ではない。
  9. binding.[[BindingName]]namespace なら
    1. GetModuleNamespace(targetModule) を返す。
  10. targetEnvtargetModule.[[Environment]] とする。
  11. targetEnvempty なら ReferenceError 例外を投げる。
  12. targetEnv.GetBindingValue(binding.[[BindingName]], true) を返す。
Note

ResolveExport は副作用がない。同一の exportName, resolveSet 引数組で呼ばれるたびに同じ結果を返さなければならない。実装は各モジュール名前空間エキゾチックオブジェクト[[Exports]] について ResolveExport 結果を事前計算またはキャッシュしてもよい。

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

The [[Set]] internal method of モジュール名前空間エキゾチックオブジェクト takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns false を含む正常完了. It performs the following steps when called:

  1. false を返す。

10.4.6.10 [[Delete]] ( P )

The [[Delete]] internal method of モジュール名前空間エキゾチックオブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了. It performs the following steps when called:

  1. P が Symbol なら
    1. OrdinaryDelete(O, P) を返す。
  2. exportsO.[[Exports]] とする。
  3. exportsP を含むなら false を返す。
  4. true を返す。

10.4.6.11 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of モジュール名前空間エキゾチックオブジェクト O takes no arguments and returns プロパティキーList を含む正常完了. It performs the following steps when called:

  1. exportsO.[[Exports]] とする。
  2. symbolKeysOrdinaryOwnPropertyKeys(O) とする。
  3. exportssymbolKeysリスト結合を返す。

10.4.6.12 ModuleNamespaceCreate ( module, exports )

The abstract operation ModuleNamespaceCreate takes arguments module (a Module Record) and exports (a List of Strings) and returns a module namespace exotic object. 新しいモジュール名前空間エキゾチックオブジェクトの生成を規定する。 It performs the following steps when called:

  1. アサート: module.[[Namespace]]empty
  2. internalSlotsListTable 31 に列挙される内部スロットとする。
  3. MMakeBasicObject(internalSlotsList) とする。
  4. M の必須内部メソッドを 10.4.6 で規定される定義に設定する。
  5. M.[[Module]]module に設定する。
  6. sortedExportsexports の要素をコードユニット辞書式順でソートした List とする。
  7. M.[[Exports]]sortedExports に設定する。
  8. 28.3 の定義に対応する M の自身プロパティを生成する。
  9. module.[[Namespace]]M に設定する。
  10. M を返す。

10.4.7 不変プロトタイプエキゾチックオブジェクト (Immutable Prototype Exotic Objects)

不変プロトタイプエキゾチックオブジェクトは、初期化後に変更されない [[Prototype]] 内部スロットを持つエキゾチックオブジェクトである。

オブジェクトの [[SetPrototypeOf]] 内部メソッドが以下の実装を使用する場合、そのオブジェクトは 不変プロトタイプエキゾチックオブジェクト である。(その他の必須内部メソッドは対象となる不変プロトタイプエキゾチックオブジェクトに応じて任意の実装を使用しうる。)

Note

他のエキゾチックオブジェクトと異なり、不変プロトタイプエキゾチックオブジェクト用の専用生成抽象操作は提供されない。これはそれらが %Object.prototype%ホスト環境でのみ使用され、ホスト環境では関連オブジェクトが他の点でもエキゾチックであり専用生成操作を必要とするためである。

10.4.7.1 [[SetPrototypeOf]] ( V )

The [[SetPrototypeOf]] internal method of 不変プロトタイプエキゾチックオブジェクト O takes argument V (an Object or null) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. SetImmutablePrototype(O, V) を返す。

10.4.7.2 SetImmutablePrototype ( O, V )

The abstract operation SetImmutablePrototype takes arguments O (an Object) and V (an Object or null) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. current を ? O.[[GetPrototypeOf]]() とする。
  2. SameValue(V, current) が true なら true を返す。
  3. false を返す。

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

Proxy オブジェクトは、本質的内部メソッドの一部が ECMAScript コードで部分的に実装されるエキゾチックオブジェクトである。すべての Proxy オブジェクトは [[ProxyHandler]] という内部スロットを持つ。[[ProxyHandler]] の値はプロキシの ハンドラーオブジェクト (handler object) と呼ばれるオブジェクトか null である。ハンドラーオブジェクトのメソッド(Table 32 参照)は、1 つ以上の Proxy オブジェクト内部メソッドの実装を拡張するために用いられうる。すべての Proxy オブジェクトはまた [[ProxyTarget]] という内部スロットを持ち、その値はオブジェクトまたは null である。このオブジェクトはプロキシの ターゲットオブジェクト (target object) と呼ばれる。

オブジェクトの本質的内部メソッド(該当する場合は [[Call]][[Construct]] を含む)が本節の定義を使用する場合、そのオブジェクトは Proxy エキゾチックオブジェクト である。これらの内部メソッドは ProxyCreate により設定される。

Table 32: Proxy ハンドラーメソッド (Proxy Handler Methods)
Internal Method Handler Method
[[GetPrototypeOf]] getPrototypeOf
[[SetPrototypeOf]] setPrototypeOf
[[IsExtensible]] isExtensible
[[PreventExtensions]] preventExtensions
[[GetOwnProperty]] getOwnPropertyDescriptor
[[DefineOwnProperty]] defineProperty
[[HasProperty]] has
[[Get]] get
[[Set]] set
[[Delete]] deleteProperty
[[OwnPropertyKeys]] ownKeys
[[Call]] apply
[[Construct]] construct

ハンドラーメソッドが Proxy オブジェクト内部メソッドの実装提供のために呼び出されるとき、ハンドラーメソッドにはプロキシのターゲットオブジェクトがパラメータとして渡される。プロキシのハンドラーオブジェクトは必ずしもすべての本質的内部メソッドに対応するメソッドを持つとは限らない。ハンドラーオブジェクトが内部トラップに対応するメソッドを持たない場合、プロキシ上の内部メソッド呼び出しは対応する内部メソッドをターゲットオブジェクト上で呼び出すことになる。

Proxy オブジェクトの [[ProxyHandler]] および [[ProxyTarget]] 内部スロットはオブジェクト生成時に常に初期化され、通常は変更できない。いくつかの Proxy オブジェクトは後に revoked(無効化) できる形で生成される。プロキシが無効化されると、その [[ProxyHandler]][[ProxyTarget]] 内部スロットは null に設定され、その Proxy オブジェクトに対する後続の内部メソッド呼び出しは TypeError 例外を投げる。

Proxy オブジェクトは内部メソッド実装を任意の ECMAScript コードで提供できるため、6.1.7.3 で定義される不変条件に違反するハンドラーメソッドを持つ Proxy オブジェクトを定義することが可能である。6.1.7.3 で定義される内部メソッド不変条件の一部は本質的整合性不変条件である。これらの不変条件は本節で規定される Proxy オブジェクト内部メソッドによって明示的に強制される。ECMAScript 実装はあらゆる不変条件違反が存在しても堅牢でなければならない。

以下のアルゴリズム記述では、O は ECMAScript Proxy オブジェクト、Pプロパティキー値、V は任意の ECMAScript 言語値、DescProperty Descriptor レコードであると仮定する。

10.5.1 [[GetPrototypeOf]] ( )

The [[GetPrototypeOf]] internal method of Proxy エキゾチックオブジェクト O takes no arguments and returns Object か null を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "getPrototypeOf") とする。
  6. trapundefined なら
    1. target.[[GetPrototypeOf]]() を返す。
  7. handlerProto を ? Call(trap, handler, « target ») とする。
  8. handlerProto が Object でなく null でもないなら TypeError 例外を投げる。
  9. extensibleTarget を ? IsExtensible(target) とする。
  10. extensibleTargettrue なら handlerProto を返す。
  11. targetProto を ? target.[[GetPrototypeOf]]() とする。
  12. SameValue(handlerProto, targetProto) が false なら TypeError 例外を投げる。
  13. handlerProto を返す。
Note

Proxy オブジェクトの [[GetPrototypeOf]] は以下の不変条件を強制する:

  • [[GetPrototypeOf]] の結果は Object か null でなければならない。
  • ターゲットオブジェクトが拡張不可能な場合、Proxy オブジェクトに適用した [[GetPrototypeOf]] はターゲットオブジェクトに適用した [[GetPrototypeOf]] と同じ値を返さなければならない。

10.5.2 [[SetPrototypeOf]] ( V )

The [[SetPrototypeOf]] internal method of Proxy エキゾチックオブジェクト O takes argument V (an Object or null) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "setPrototypeOf") とする。
  6. trapundefined なら
    1. target.[[SetPrototypeOf]](V) を返す。
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target, V »)) とする。
  8. booleanTrapResultfalse なら false を返す。
  9. extensibleTarget を ? IsExtensible(target) とする。
  10. extensibleTargettrue なら true を返す。
  11. targetProto を ? target.[[GetPrototypeOf]]() とする。
  12. SameValue(V, targetProto) が false なら TypeError 例外を投げる。
  13. true を返す。
Note

Proxy オブジェクトの [[SetPrototypeOf]] は以下の不変条件を強制する:

  • [[SetPrototypeOf]] の結果は Boolean である。
  • ターゲットオブジェクトが拡張不可能である場合、引数値はターゲットオブジェクトに適用した [[GetPrototypeOf]] の結果と同じでなければならない。

10.5.3 [[IsExtensible]] ( )

The [[IsExtensible]] internal method of Proxy エキゾチックオブジェクト O takes no arguments and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "isExtensible") とする。
  6. trapundefined なら
    1. IsExtensible(target) を返す。
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target »)) とする。
  8. targetResult を ? IsExtensible(target) とする。
  9. booleanTrapResulttargetResult と異なるなら TypeError 例外を投げる。
  10. booleanTrapResult を返す。
Note

Proxy オブジェクトの [[IsExtensible]] は以下の不変条件を強制する:

  • [[IsExtensible]] の結果は Boolean である。
  • Proxy オブジェクトに適用した [[IsExtensible]] は、同じ引数でターゲットオブジェクトに適用した [[IsExtensible]] と同じ値を返さなければならない。

10.5.4 [[PreventExtensions]] ( )

The [[PreventExtensions]] internal method of Proxy エキゾチックオブジェクト O takes no arguments and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "preventExtensions") とする。
  6. trapundefined なら
    1. target.[[PreventExtensions]]() を返す。
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target »)) とする。
  8. booleanTrapResulttrue なら
    1. extensibleTarget を ? IsExtensible(target) とする。
    2. extensibleTargettrue なら TypeError 例外を投げる。
  9. booleanTrapResult を返す。
Note

Proxy オブジェクトの [[PreventExtensions]] は以下の不変条件を強制する:

  • [[PreventExtensions]] の結果は Boolean である。
  • Proxy オブジェクトに適用した [[PreventExtensions]]true を返すのは、ターゲットオブジェクトに適用した [[IsExtensible]]false の場合のみである。

10.5.5 [[GetOwnProperty]] ( P )

The [[GetOwnProperty]] internal method of Proxy エキゾチックオブジェクト O takes argument P (a property key) and returns Property Descriptorundefined を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "getOwnPropertyDescriptor") とする。
  6. trapundefined なら
    1. target.[[GetOwnProperty]](P) を返す。
  7. trapResultObj を ? Call(trap, handler, « target, P ») とする。
  8. trapResultObj が Object でなく undefined でもないなら TypeError 例外を投げる。
  9. targetDesc を ? target.[[GetOwnProperty]](P) とする。
  10. trapResultObjundefined なら
    1. targetDescundefined なら undefined を返す。
    2. targetDesc.[[Configurable]]false なら TypeError 例外を投げる。
    3. extensibleTarget を ? IsExtensible(target) とする。
    4. extensibleTargetfalse なら TypeError 例外を投げる。
    5. undefined を返す。
  11. extensibleTarget を ? IsExtensible(target) とする。
  12. resultDesc を ? ToPropertyDescriptor(trapResultObj) とする。
  13. CompletePropertyDescriptor(resultDesc) を実行する。
  14. validIsCompatiblePropertyDescriptor(extensibleTarget, resultDesc, targetDesc) とする。
  15. validfalse なら TypeError 例外を投げる。
  16. resultDesc.[[Configurable]]false なら
    1. targetDescundefined または targetDesc.[[Configurable]]true なら
      1. TypeError 例外を投げる。
    2. resultDesc[[Writable]] フィールドを持ちかつ resultDesc.[[Writable]]false なら
      1. アサート: targetDesc[[Writable]] フィールドを持つ。
      2. targetDesc.[[Writable]]true なら TypeError 例外を投げる。
  17. resultDesc を返す。
Note

Proxy オブジェクトの [[GetOwnProperty]] は以下の不変条件を強制する:

  • [[GetOwnProperty]] の結果は Object か undefined でなければならない。
  • ターゲットオブジェクトに設定不可な自身プロパティとして存在する場合、そのプロパティを不存在と報告してはならない。
  • ターゲットオブジェクトが拡張不可能であり、そのプロパティが自身プロパティとして存在する場合、そのプロパティを不存在と報告してはならない。
  • ターゲットオブジェクトが拡張不可能でなく、かつそのプロパティがターゲットの自身プロパティに存在しない場合、存在すると報告してはならない。
  • ターゲットオブジェクトに対応する設定不可な自身プロパティが存在しない限り、プロパティを設定不可と報告してはならない。
  • 対応するターゲットオブジェクトの設定不可・非書き込み自身プロパティが存在しない限り、プロパティを同時に設定不可かつ非書き込みと報告してはならない。

10.5.6 [[DefineOwnProperty]] ( P, Desc )

The [[DefineOwnProperty]] internal method of Proxy エキゾチックオブジェクト O takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "defineProperty") とする。
  6. trapundefined なら
    1. target.[[DefineOwnProperty]](P, Desc) を返す。
  7. descObjFromPropertyDescriptor(Desc) とする。
  8. booleanTrapResultToBoolean(? Call(trap, handler, « target, P, descObj »)) とする。
  9. booleanTrapResultfalse なら false を返す。
  10. targetDesc を ? target.[[GetOwnProperty]](P) とする。
  11. extensibleTarget を ? IsExtensible(target) とする。
  12. Desc[[Configurable]] フィールドを持ちかつ Desc.[[Configurable]]false なら
    1. settingConfigFalsetrue とする。
  13. それ以外
    1. settingConfigFalsefalse とする。
  14. targetDescundefined なら
    1. extensibleTargetfalse なら TypeError 例外を投げる。
    2. settingConfigFalsetrue なら TypeError 例外を投げる。
  15. それ以外
    1. IsCompatiblePropertyDescriptor(extensibleTarget, Desc, targetDesc) が false なら TypeError 例外を投げる。
    2. settingConfigFalsetrue かつ targetDesc.[[Configurable]]true なら TypeError 例外を投げる。
    3. IsDataDescriptor(targetDesc) が true かつ targetDesc.[[Configurable]]false かつ targetDesc.[[Writable]]true なら
      1. Desc[[Writable]] フィールドを持ちかつ Desc.[[Writable]]false なら TypeError 例外を投げる。
  16. true を返す。
Note

Proxy オブジェクトの [[DefineOwnProperty]] は以下の不変条件を強制する:

  • [[DefineOwnProperty]] の結果は Boolean である。
  • ターゲットオブジェクトが拡張不可能ならプロパティは追加できない。
  • 対応する設定不可な自身プロパティがターゲット上に存在しない限り、プロパティを設定不可にできない。
  • 対応する設定不可かつ非書き込みな自身プロパティがターゲット上に存在しない限り、プロパティを設定不可かつ非書き込みにできない。
  • 対応するターゲットプロパティが存在する場合、その Property Descriptor[[DefineOwnProperty]] でターゲットに適用しても例外は投げられない。

10.5.7 [[HasProperty]] ( P )

The [[HasProperty]] internal method of Proxy エキゾチックオブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "has") とする。
  6. trapundefined なら
    1. target.[[HasProperty]](P) を返す。
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target, P »)) とする。
  8. booleanTrapResultfalse なら
    1. targetDesc を ? target.[[GetOwnProperty]](P) とする。
    2. targetDescundefined でないなら
      1. targetDesc.[[Configurable]]false なら TypeError 例外を投げる。
      2. extensibleTarget を ? IsExtensible(target) とする。
      3. extensibleTargetfalse なら TypeError 例外を投げる。
  9. booleanTrapResult を返す。
Note

Proxy オブジェクトの [[HasProperty]] は以下の不変条件を強制する:

  • [[HasProperty]] の結果は Boolean である。
  • ターゲットオブジェクトに設定不可な自身プロパティとして存在する場合、プロパティを不存在と報告してはならない。
  • ターゲットオブジェクトが拡張不可能で、そのプロパティが自身プロパティとして存在する場合、プロパティを不存在と報告してはならない。

10.5.8 [[Get]] ( P, Receiver )

The [[Get]] internal method of Proxy エキゾチックオブジェクト O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "get") とする。
  6. trapundefined なら
    1. target.[[Get]](P, Receiver) を返す。
  7. trapResult を ? Call(trap, handler, « target, P, Receiver ») とする。
  8. targetDesc を ? target.[[GetOwnProperty]](P) とする。
  9. targetDescundefined でなくかつ targetDesc.[[Configurable]]false なら
    1. IsDataDescriptor(targetDesc) が true かつ targetDesc.[[Writable]]false なら
      1. SameValue(trapResult, targetDesc.[[Value]]) が false なら TypeError 例外を投げる。
    2. IsAccessorDescriptor(targetDesc) が true かつ targetDesc.[[Get]]undefined なら
      1. trapResultundefined でないなら TypeError 例外を投げる。
  10. trapResult を返す。
Note

Proxy オブジェクトの [[Get]] は以下の不変条件を強制する:

  • 対応するターゲットオブジェクトプロパティが非書き込み・設定不可な自身データプロパティである場合、報告される値はターゲットプロパティの値と同じでなければならない。
  • 対応するターゲットオブジェクトプロパティが設定不可な自身 accessor プロパティでその [[Get]] 属性が undefined の場合、報告される値は undefined でなければならない。

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

The [[Set]] internal method of Proxy エキゾチックオブジェクト O takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "set") とする。
  6. trapundefined なら
    1. target.[[Set]](P, V, Receiver) を返す。
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target, P, V, Receiver »)) とする。
  8. booleanTrapResultfalse なら false を返す。
  9. targetDesc を ? target.[[GetOwnProperty]](P) とする。
  10. targetDescundefined でなくかつ targetDesc.[[Configurable]]false なら
    1. IsDataDescriptor(targetDesc) が true かつ targetDesc.[[Writable]]false なら
      1. SameValue(V, targetDesc.[[Value]]) が false なら TypeError 例外を投げる。
    2. IsAccessorDescriptor(targetDesc) が true なら
      1. targetDesc.[[Set]]undefined なら TypeError 例外を投げる。
  11. true を返す。
Note

Proxy オブジェクトの [[Set]] は以下の不変条件を強制する:

  • [[Set]] の結果は Boolean である。
  • 対応するターゲットオブジェクトプロパティが非書き込み・設定不可な自身データプロパティである場合、その値と異なる値に変更することはできない。
  • 対応するターゲットオブジェクトプロパティが設定不可な自身 accessor プロパティでその [[Set]] 属性が undefined の場合、値を設定できない。

10.5.10 [[Delete]] ( P )

The [[Delete]] internal method of Proxy エキゾチックオブジェクト O takes argument P (a property key) and returns Boolean を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "deleteProperty") とする。
  6. trapundefined なら
    1. target.[[Delete]](P) を返す。
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target, P »)) とする。
  8. booleanTrapResultfalse なら false を返す。
  9. targetDesc を ? target.[[GetOwnProperty]](P) とする。
  10. targetDescundefined なら true を返す。
  11. targetDesc.[[Configurable]]false なら TypeError 例外を投げる。
  12. extensibleTarget を ? IsExtensible(target) とする。
  13. extensibleTargetfalse なら TypeError 例外を投げる。
  14. true を返す。
Note

Proxy オブジェクトの [[Delete]] は以下の不変条件を強制する:

  • [[Delete]] の結果は Boolean である。
  • ターゲットオブジェクトに設定不可な自身プロパティとして存在する場合、そのプロパティを削除済みと報告してはならない。
  • ターゲットオブジェクトが拡張不可能でそのプロパティが自身プロパティとして存在する場合、そのプロパティを削除済みと報告してはならない。

10.5.11 [[OwnPropertyKeys]] ( )

The [[OwnPropertyKeys]] internal method of Proxy エキゾチックオブジェクト O takes no arguments and returns プロパティキーList を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "ownKeys") とする。
  6. trapundefined なら
    1. target.[[OwnPropertyKeys]]() を返す。
  7. trapResultArray を ? Call(trap, handler, « target ») とする。
  8. trapResult を ? CreateListFromArrayLike(trapResultArray, property-key) とする。
  9. trapResult が重複要素を含むなら TypeError 例外を投げる。
  10. extensibleTarget を ? IsExtensible(target) とする。
  11. targetKeys を ? target.[[OwnPropertyKeys]]() とする。
  12. アサート: targetKeysプロパティキーList である。
  13. アサート: targetKeys は重複要素を含まない。
  14. targetConfigurableKeys を新しい空の List とする。
  15. targetNonconfigurableKeys を新しい空の List とする。
  16. targetKeys の各要素 key について
    1. desc を ? target.[[GetOwnProperty]](key) とする。
    2. descundefined でなくかつ desc.[[Configurable]]false なら
      1. keytargetNonconfigurableKeys に追加する。
    3. それ以外
      1. keytargetConfigurableKeys に追加する。
  17. extensibleTargettrue かつ targetNonconfigurableKeys が空なら
    1. trapResult を返す。
  18. uncheckedResultKeystrapResult の要素からなる List とする。
  19. targetNonconfigurableKeys の各要素 key について
    1. uncheckedResultKeyskey を含まないなら TypeError 例外を投げる。
    2. uncheckedResultKeys から key を除去する。
  20. extensibleTargettrue なら trapResult を返す。
  21. targetConfigurableKeys の各要素 key について
    1. uncheckedResultKeyskey を含まないなら TypeError 例外を投げる。
    2. uncheckedResultKeys から key を除去する。
  22. uncheckedResultKeys が空でないなら TypeError 例外を投げる。
  23. trapResult を返す。
Note

Proxy オブジェクトの [[OwnPropertyKeys]] は以下の不変条件を強制する:

  • [[OwnPropertyKeys]] の結果は List である。
  • 返される List は重複要素を含まない。
  • 返される List の各要素はプロパティキーである。
  • 結果の List はターゲットオブジェクトのすべての設定不可な自身プロパティのキーを含まなければならない。
  • ターゲットオブジェクトが拡張不可能である場合、結果の List はターゲットオブジェクトの自身プロパティすべてのキーのみを含まなければならない。

10.5.12 [[Call]] ( thisArgument, argumentsList )

The [[Call]] internal method of Proxy エキゾチックオブジェクト O takes arguments thisArgument (an ECMAScript language value) and argumentsList (a List of ECMAScript language values) and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. handlerO.[[ProxyHandler]] とする。
  4. アサート: handler は Object である。
  5. trap を ? GetMethod(handler, "apply") とする。
  6. trapundefined なら
    1. ? Call(target, thisArgument, argumentsList) を返す。
  7. argArrayCreateArrayFromList(argumentsList) とする。
  8. ? Call(trap, handler, « target, thisArgument, argArray ») を返す。
Note

Proxy エキゾチックオブジェクトは、その [[ProxyTarget]] 内部スロットの初期値が [[Call]] 内部メソッドを持つオブジェクトである場合にのみ [[Call]] 内部メソッドを持つ。

10.5.13 [[Construct]] ( argumentsList, newTarget )

The [[Construct]] internal method of Proxy エキゾチックオブジェクト O takes arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns Object を含む正常完了または throw 完了. It performs the following steps when called:

  1. ValidateNonRevokedProxy(O) を実行する。
  2. targetO.[[ProxyTarget]] とする。
  3. アサート: IsConstructor(target) は true
  4. handlerO.[[ProxyHandler]] とする。
  5. アサート: handler は Object である。
  6. trap を ? GetMethod(handler, "construct") とする。
  7. trapundefined なら
    1. ? Construct(target, argumentsList, newTarget) を返す。
  8. argArrayCreateArrayFromList(argumentsList) とする。
  9. newObj を ? Call(trap, handler, « target, argArray, newTarget ») とする。
  10. newObj が Object でないなら TypeError 例外を投げる。
  11. newObj を返す。
Note 1

Proxy エキゾチックオブジェクトは、その [[ProxyTarget]] 内部スロットの初期値が [[Construct]] 内部メソッドを持つオブジェクトである場合にのみ [[Construct]] 内部メソッドを持つ。

Note 2

Proxy オブジェクトの [[Construct]] は以下の不変条件を強制する:

  • [[Construct]] の結果は Object でなければならない。

10.5.14 ValidateNonRevokedProxy ( proxy )

The abstract operation ValidateNonRevokedProxy takes argument proxy (a Proxy exotic object) and returns unused を含む正常完了または throw 完了. proxy が無効化されている場合 TypeError 例外を投げる。 It performs the following steps when called:

  1. proxy.[[ProxyTarget]]null なら TypeError 例外を投げる。
  2. アサート: proxy.[[ProxyHandler]]null ではない。
  3. unused を返す。

10.5.15 ProxyCreate ( target, handler )

The abstract operation ProxyCreate takes arguments target (an ECMAScript language value) and handler (an ECMAScript language value) and returns Proxy エキゾチックオブジェクトを含む正常完了または throw 完了. 新しい Proxy オブジェクトの生成を規定する。 It performs the following steps when called:

  1. target が Object でないなら TypeError 例外を投げる。
  2. handler が Object でないなら TypeError 例外を投げる。
  3. PMakeBasicObject[[ProxyHandler]], [[ProxyTarget]] ») とする。
  4. P の本質的内部メソッド([[Call]][[Construct]] を除く)を 10.5 で規定される定義に設定する。
  5. IsCallable(target) が true なら
    1. P.[[Call]]10.5.12 で規定されるとおりに設定する。
    2. IsConstructor(target) が true なら
      1. P.[[Construct]]10.5.13 で規定されるとおりに設定する。
  6. P.[[ProxyTarget]]target に設定する。
  7. P.[[ProxyHandler]]handler に設定する。
  8. P を返す。