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

23.1 Mapオブジェクト(Map Objects)

Mapオブジェクトは、キーと値のペアのコレクションです。キーと値の両方が任意のECMAScript言語値にすることができます。 個別のキー値は、マップのコレクション内の1つのキー/値のペアです。 個別のキー値は、SameValueZero比較アルゴリズムを使用して識別されます。

Mapオブジェクトは、ハッシュテーブルまたはコレクション内の要素数に対して平均してサブリニアのアクセス時間を提供するその他のメカニズムを使用して実装する必要があります。このMapオブジェクト仕様で使用されるデータ構造は、Mapオブジェクトに必要な監視可能なセマンティクスを説明することのみを目的としています。 これは、実行可能な実装モデルを意図したものではありません。

23.1.1 Mapコンストラクター(The Map Constructor)

Mapコンストラクターーは、次の特徴があります。

  • 組み込みオブジェクト%Map%です。
  • グローバルオブジェクト"Map"プロパティの初期値です。
  • コンストラクターとして呼び出されると、新しいMapオブジェクトを作成して初期化します。
  • 関数として呼び出されることを意図していません。呼び出されると例外がスローされます。
  • サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。サブクラスコンストラクターは、super呼び出してMap.prototype組み込みメソッドをサポートし、サブクラスインスタンスを作成および初期化する必要があります。

23.1.1.1 Map ( [ iterable ] )

オプションの引数iterableを指定してMap関数を呼び出すと、次の手順が実行されます。

  1. NewTargetundefined なら、TypeError例外をスローする
  2. ? OrdinaryCreateFromConstructor(NewTarget, "%Map.prototype%", « [[MapData]] ») を map とする
  3. 空の新規Listmap.[[MapData]] にセットする
  4. iterableundefined または null なら、 map を返す
  5. ? Get(map, "set") を adder とする
  6. ? AddEntriesFromIterable(map, iterable, adder) を返す
引数iterableは、@@iteratorメソッドを実装するオブジェクトであることが期待されます。@@iteratorメソッドは2要素のarrayライクオブジェクト(最初の要素はMapキー、2番目の要素は、そのキーに関連付ける値)を生成するイテレータオブジェクトを返します。

23.1.1.2 AddEntriesFromIterable ( target, iterable, adder )

抽象操作AddEntriesFromIterableは、targetオブジェクト、エントリのiterable、および呼び出されるadder関数を受け入れ、targetをレシーバーとします。

  1. IsCallable(adder) が false なら、TypeError例外をスローする
  2. Assert: iterable は存在し、 undefined でも null でもない
  3. ? GetIterator(iterable) を iteratorRecord とする
  4. 繰り返し
    1. ? IteratorStep(iteratorRecord) を next とする
    2. nextfalse なら、 target を返す
    3. ? IteratorValue(next) を nextItem とする
    4. Type(nextItem) が Object型 でないなら、
      1. ThrowCompletion(新規作成した TypeError オブジェクト) を error とする
      2. ? IteratorClose(iteratorRecord, error) を返す
    5. Get(nextItem, "0") を k とする
    6. k突然の完了 なら、 ? IteratorClose(iteratorRecord, k) を返す
    7. Get(nextItem, "1") を v とする
    8. v突然の完了 なら、 ? IteratorClose(iteratorRecord, v) を返す
    9. Call(adder, target, « k.[[Value]], v.[[Value]] ») を status とする
    10. status突然の完了 なら、 ? IteratorClose(iteratorRecord, status) を返す
引数iterableは、@@iteratorメソッドを実装するオブジェクトであることが期待されます。このオブジェクトは、最初の要素がMapキーとして使用される値であり、2番目の要素が そのキーに関連付けられる値です。

23.1.2 Mapコンストラクターのプロパティ(Properties of the Map Constructor)

Mapコンストラクターは、次の特徴があります。

  • [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
  • 以下のプロパティがあります。

23.1.2.1 Map.prototype

Map.prototypeの初期値は%Map.prototype%です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。

23.1.2.2 get Map [ @@species ]

Map[@@species]はsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を返す

この関数の"name"プロパティの値は"get [Symbol.species]"です。

派生コレクションオブジェクトを作成するメソッドは、@@speciesを呼び出して、派生オブジェクトの作成に使用するコンストラクターを決定する必要があります。 サブクラスコンストラクターは、@@speciesをオーバーライドしてデフォルトのコンストラクター割り当てを変更する場合があります。

23.1.3 Mapプロトタイプオブジェクトのプロパティ(Properties of the Map Prototype Object)

Mapプロトタイプオブジェクトは、次の特徴があります。

23.1.3.1 Map.prototype.clear ( )

次の手順が実行されます。

  1. this値 を M とする
  2. ? RequireInternalSlot(M, [[MapData]]) を実行する
  3. M.[[MapData]] を entries とする
  4. entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
    1. emptyp.[[Key]] にセットする
    2. emptyp.[[Value]] にセットする
  5. undefined を返す
既存の[[MapData]]リストは保持されます。これは、リストの反復処理の途中で中断されているMapIteratorオブジェクトが存在する可能性があるためです。

23.1.3.2 Map.prototype.constructor

Map.prototype.constructorの初期値は%Map%です。

23.1.3.3 Map.prototype.delete ( key )

次の手順が実行されます。

  1. this値 を M とする
  2. ? RequireInternalSlot(M, [[MapData]]) を実行する
  3. M.[[MapData]] を entries とする
  4. entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
    1. p.[[Key]] が empty ではなく、 SameValueZero(p.[[Key]], key) が true なら、
      1. emptyp.[[Key]] にセットする
      2. emptyp.[[Value]] にセットする
      3. true を返す
  5. false を返す
値emptyは、エントリが削除されたことを示すための指定デバイスとして使用されます。 実装では、内部データ構造からエントリを物理的に削除するなど、他のアクションを実行する場合があります。

23.1.3.4 Map.prototype.entries ( )

次の手順が実行されます。

  1. this値 を M とする
  2. ? CreateMapIterator(M, key+value) を返す

23.1.3.5 Map.prototype.forEach ( callbackfn [ , thisArg ] )

forEachメソッドが1つまたは2つの引数で呼び出されると、次の手順が実行されます。

  1. this値 を M とする
  2. ? RequireInternalSlot(M, [[MapData]]) を実行する
  3. IsCallable(callbackfn) が false なら、TypeError例外をスローする
  4. M.[[MapData]] を entries とする
  5. entries 内の各 Record { [[Key]], [[Value]] } 要素を e とし、e を元のキーの挿入順序で次を実行する
    1. e.[[Key]] が empty でないなら、
      1. ? Call(callbackfn, thisArg, « e.[[Value]], e.[[Key]], M ») を実行する
  6. undefined を返す

callbackfnは、3つの引数を受け入れる関数です。 forEachは、マップオブジェクトに存在するキーと値のペアごとに、キーの挿入順序でcallbackfnを1回呼び出します。 callbackfnは、実際に存在するマップのキーに対してのみ呼び出されます。マップから削除されたキーについては呼び出されません。

thisArgパラメーターは、callbackfnの呼び出しのthis値として使用されます。指定されていない場合は、undefinedが使用されます。

callbackfnは、アイテムの値、アイテムのキー、および対象となっているMapオブジェクトの3つの引数で呼び出されます。

forEachは、呼び出されたオブジェクトを直接変更しません。ただし、callbackfnの呼び出しによってオブジェクトが変更される場合があります。Mapの[[MapData]]の各エントリは、一度だけアクセスされます。 forEachの呼び出しが開始された後に追加された新しいキーにアクセスします。キーにアクセスした後に削除され、forEach呼び出しが完了する前に再度追加された場合、キーは再アクセスされます。forEachの呼び出しが開始された後、アクセスされる前に削除されたキーは、forEachの呼び出しが完了する前にキーが再度追加されない限り、アクセスされません。

23.1.3.6 Map.prototype.get ( key )

次の手順が実行されます。

  1. this値 を M とする
  2. ? RequireInternalSlot(M, [[MapData]]) を実行する
  3. M.[[MapData]] を entries とする
  4. entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
    1. p.[[Key]] が empty でなく、 SameValueZero(p.[[Key]], key) が true なら、 p.[[Value]] を返す
  5. undefined を返す

23.1.3.7 Map.prototype.has ( key )

次の手順が実行されます。

  1. this値 を M とする
  2. ? RequireInternalSlot(M, [[MapData]]) を実行する
  3. M.[[MapData]] を entries とする
  4. entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
    1. p.[[Key]] が empty でなく、 SameValueZero(p.[[Key]], key) が true なら、 true を返す
  5. false を返す

23.1.3.8 Map.prototype.keys ( )

次の手順が実行されます。

  1. this値 を M とする
  2. ? CreateMapIterator(M, key) を返す

23.1.3.9 Map.prototype.set ( key, value )

次の手順が実行されます。

  1. this値 を M とする
  2. ? RequireInternalSlot(M, [[MapData]]) を実行する
  3. M.[[MapData]] を entries とする
  4. entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
    1. p.[[Key]] が empty ではなく、 SameValueZero(p.[[Key]], key) が true なら、
      1. valuep.[[Value]] にセットする
      2. M を返す
  5. key-0 なら +0key にセットする
  6. Record { [[Key]]: key, [[Value]]: value } を p とする
  7. entries の最後に p を追加する
  8. M を返す

23.1.3.10 get Map.prototype.size

Map.prototype.sizeはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を M とする
  2. ? RequireInternalSlot(M, [[MapData]]) を実行する
  3. M.[[MapData]] を entries とする
  4. 0 を count とする
  5. entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
    1. p.[[Key]] が empty でないなら、 count + 1 を count にセットする
  6. count を返す

23.1.3.11 Map.prototype.values ( )

次の手順が実行されます。

  1. this値 を M とする
  2. ? CreateMapIterator(M, value) を返す

23.1.3.12 Map.prototype [ @@iterator ] ( )

@@iteratorプロパティの初期値は、"entries"プロパティの初期値と同じ関数オブジェクトです。

23.1.3.13 Map.prototype [ @@toStringTag ]

@@ toStringTagプロパティの初期値は、文字列値"Map"です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

23.1.4 Mapインスタンスのプロパティ(Properties of Map Instances)

Mapインスタンスは、Mapプロトタイプからプロパティを継承する通常のオブジェクトです。 Mapインスタンスには、[[MapData]]内部スロットがあります。

23.1.5 Mapイテレータオブジェクト(Map Iterator Objects)

Mapイテレータはオブジェクトであり、特定のMapインスタンスオブジェクトに対する特定の反復を表します。 Mapイテレータオブジェクトの名前付きコンストラクターはありません。 代わりに、Mapインスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。

23.1.5.1 CreateMapIterator ( map, kind )

Mapオブジェクトのいくつかのメソッドは、Iteratorオブジェクトを返します。 このIteratorオブジェクトは、引数mapkindを指定した抽象操作CreateMapIteratorで作成します。 次の手順を実行します。

  1. ? RequireInternalSlot(map, [[MapData]]) を実行する
  2. OrdinaryObjectCreate(%MapIteratorPrototype%, « [[IteratedMap]], [[MapNextIndex]], [[MapIterationKind]] ») を iterator とする
  3. mapiterator.[[IteratedMap]] にセットする
  4. 0 を iterator.[[MapNextIndex]] にセットする
  5. kinditerator.[[MapIterationKind]] にセットする
  6. iterator を返す

23.1.5.2 %MapIteratorPrototype%オブジェクト(The %MapIteratorPrototype% Object)

%MapIteratorPrototype%オブジェクトは、次の特徴があります。

  • すべてのMapイテレータオブジェクトに継承されるプロパティがあります。
  • 通常のオブジェクトです。
  • [[Prototype]]内部スロットがあり、値は%IteratorPrototype% です。
  • 以下のプロパティがあります。
23.1.5.2.1 %MapIteratorPrototype%.next ( )
  1. this値 を O とする
  2. Type(O) が Object型でないなら、TypeError例外をスローする
  3. O が Mapイテレータインスタンス(23.1.5.3)のすべての内部スロットを持っていないなら TypeError例外をスローする
  4. O.[[IteratedMap]] を m とする
  5. O.[[MapNextIndex]] を index とする
  6. O.[[MapIterationKind]] を itemKind とする
  7. mundefined なら、 CreateIterResultObject(undefined, true) を返す
  8. Assert: m は [[MapData]] 内部スロットがある
  9. m.[[MapData]] を entries とする
  10. entries の要素数を numEntries とする
  11. NOTE: このメソッドを評価するたびに、numEntriesを再決定する必要がある
  12. indexnumEntries 未満の間繰り返し
    1. entries[index] の値( Record { [[Key]], [[Value]] } ) を e とする
    2. index + 1 を index にセットする
    3. indexO.[[MapNextIndex]] にセットする
    4. e.[[Key]] が empty でないなら、
      1. itemKindkey なら、 eresult とする [[Key]]
      2. i. と異なり、 itemKindvalue なら e.[[Value]] を result とする
      3. ii. と異なるなら、
        1. Assert: itemKindkey+value
        2. ! CreateArrayFromList(« e.[[Key]], e.[[Value]] ») を result とする
      4. CreateIterResultObject(result, false) を返す
  13. undefinedO.[[IteratedMap]] にセットする
  14. CreateIterResultObject(undefined, true) を返す
23.1.5.2.2 %MapIteratorPrototype% [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"Map Iterator"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

23.1.5.3 Mapイテレータインスタンスのプロパティ(Properties of Map Iterator Instances)

Mapイテレータインスタンスは、%MapIteratorPrototype%組み込みオブジェクトからプロパティを継承する通常のオブジェクトです。 Mapイテレータインスタンスは、最初に表62の内部スロットが作成されます。

表62: Mapイテレータインスタンスの内部スロット
内部スロット 内容
[[IteratedMap]] 対象となっているMapオブジェクト
[[MapNextIndex]] 次にイテレータが確認する[[MapData]]要素の整数インデックス
[[MapIterationKind]] 反復の各要素に対して返される要素を識別する文字列値。 使用できる値は、keyvaluekey+value

23.2 Setオブジェクト(Set Objects)

Setオブジェクトは、ECMAScript言語値のコレクションです。 個別の値は、Setのコレクションの要素として1回だけ発生します。 個別の値は、SameValueZero比較アルゴリズムを使用して識別されます。

Setオブジェクトは、ハッシュテーブルまたは他のメカニズムを使用して実装する必要があります。これらのメカニズムは、平均して、コレクション内の要素の数に対して劣線形のアクセス時間を提供します。 このSetオブジェクト仕様で使用されるデータ構造は、Setオブジェクトに必要な監視可能なセマンティクスを説明することのみを目的としています。 これは、実行可能な実装モデルを意図したものではありません。

23.2.1 Setコンストラクター(The Set Constructor)

Setコンストラクターは、次の特徴があります。

  • 組み込みオブジェクト%Set%です。
  • グローバルオブジェクト"Set"プロパティの初期値です。
  • コンストラクターとして呼び出されると、新しいSetオブジェクトを作成して初期化します。
  • 関数として呼び出されることを意図していません。呼び出されると例外がスローされます。
  • サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。サブクラスコンストラクターには、super呼び出しをおこない、Set.prototype組み込みメソッドをサポートし、サブクラスインスタンスを作成および初期化する必要があります。

23.2.1.1 Set ( [ iterable ] )

オプションの引数iterableを指定してSet関数を呼び出すと、次の手順が実行されます。

  1. NewTargetundefined なら、TypeError例外をスローする
  2. ? OrdinaryCreateFromConstructor(NewTarget, "%Set.prototype%", « [[SetData]] ») を set とする
  3. 空の新規Listset.[[SetData]] にセットする
  4. iterableundefined または null なら、 set を返す
  5. ? Get(set, "add") を adder とする
  6. IsCallable(adder) が false なら、TypeError例外をスローする
  7. ? GetIterator(iterable) を iteratorRecord とする
  8. 繰り返し
    1. ? IteratorStep(iteratorRecord) を next とする
    2. nextfalse なら、 set を返す
    3. ? IteratorValue(next) を nextValue とする
    4. Call(adder, set, « nextValue ») を status とする
    5. status突然の完了 なら ? IteratorClose(iteratorRecord, status) を返す

23.2.2 Setコンストラクターのプロパティ(Properties of the Set Constructor)

Setコンストラクターは、次の特徴があります。

  • [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
  • 以下のプロパティがあります。

23.2.2.1 Set.prototype

Set.prototypeの初期値は、組み込みの%SetPrototype%オブジェクトです。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。

23.2.2.2 get Set [ @@species ]

Set[@@species]はsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を返す

この関数の"name"プロパティの値は"get [Symbol.species]"です。

派生コレクションオブジェクトを作成するメソッドは、@@speciesを呼び出して、派生オブジェクトの作成に使用するコンストラクターを決定する必要があります。 サブクラスコンストラクターは、@@speciesをオーバーライドしてデフォルトのコンストラクター割り当てを変更する場合があります。

23.2.3 Setプロトタイプオブジェクトのプロパティ(Properties of the Set Prototype Object)

Setプロトタイプオブジェクトは、次の特徴があります。

23.2.3.1 Set.prototype.add ( value )

次の手順が実行されます。

  1. this値 を S とする
  2. ? RequireInternalSlot(S, [[SetData]]) を実行する
  3. S.[[SetData]] を entries とする
  4. entries 内の各要素を e とし、e ごとに次を実行する
    1. eempty ではなく、 SameValueZero(e, value) が true なら、
      1. S を返す
  5. value-0 なら +0value にセットする
  6. entries の最後に value を追加する
  7. S を返す

23.2.3.2 Set.prototype.clear ( )

次の手順が実行されます。

  1. this値 を S とする
  2. ? RequireInternalSlot(S, [[SetData]]) を実行する
  3. S.[[SetData]] を entries とする
  4. entries 内の各要素を e とし、e ごとに次を実行する
    1. entries 内の値 eempty に置き換える
  5. undefined を返す
既存の[[SetData]]リストは保持されます。これは、反復処理の途中で中断されているSetイテレーターオブジェクトが存在する可能性があるためです。

23.2.3.3 Set.prototype.constructor

Set.prototype.constructorの初期値は%Set%です。

23.2.3.4 Set.prototype.delete ( value )

次の手順が実行されます。

  1. this値 を S とする
  2. ? RequireInternalSlot(S, [[SetData]]) を実行する
  3. S.[[SetData]] を entries とする
  4. entries 内の各要素を e とし、e ごとに次を実行する
    1. eempty ではなく、 SameValueZero(e, value) が true なら、
      1. entries 内の値 eempty に置き換える
      2. true を返す
  5. false を返す
emptyは、エントリが削除されたことを示すための指定デバイスとして使用されます。 実装では、内部データ構造からエントリを物理的に削除するなど、他のアクションを実行する場合があります。

23.2.3.5 Set.prototype.entries ( )

次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateSetIterator(S, key+value) を返す
反復処理では、Setはエントリのキーと値が同じMapのように扱われます。

23.2.3.6 Set.prototype.forEach ( callbackfn [ , thisArg ] )

forEachメソッドが1つまたは2つの引数で呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? RequireInternalSlot(S, [[SetData]]) を実行する
  3. IsCallable(callbackfn) が false なら、TypeError例外をスローする
  4. S.[[SetData]] を entries とする
  5. entries 内の各要素を e とし元の要素の挿入順に次を実行する
    1. eempty でないなら、
      1. ? Call(callbackfn, thisArg, « e, e, S ») を実行する
  6. undefined を返す

callbackfnは、3つの引数を受け入れる関数である必要があります。 forEachは、値の挿入順にcallbackfnを1回呼び出します。 callbackfnは、実際に存在する値に対してのみ呼び出されます。 削除されたキーについては呼び出されません。

thisArgパラメーターは、callbackfnthis値として使用されます。指定されていない場合は、undefinedが使用されます。

callbackfnは、3つの引数で呼び出されます。最初の2つの引数はセットに含まれる値で、両方の引数に同じ値が渡されます。対象となっているSetオブジェクトは、3番目の引数として渡されます。

callbackfnの引数は、MapおよびArrayのforEachメソッドと一致します。setの場合、各アイテム値はキーと値の両方であると見なされます。

forEachは、呼び出されたオブジェクトを直接変更しませ。ただし、callbackfnの呼び出しによってオブジェクトが変更される場合があります。

各値は1回だけアクセスされます。ただし、値がアクセスされた後に削除され、forEach呼び出しが完了する前に再追加された場合、値は再アクセスされます。 forEachの呼び出しが開始された後、アクセスされる前に削除された値は、forEachの呼び出しが完了する前に再追加されない限り、アクセスされません。 forEachの呼び出しが開始された後に追加された新しい値はアクセスします。

23.2.3.7 Set.prototype.has ( value )

次の手順が実行されます。

  1. this値 を S とする
  2. ? RequireInternalSlot(S, [[SetData]]) を実行する
  3. S.[[SetData]] を entries とする
  4. entries 内の各要素を e とし、e ごとに次を実行する
    1. eempty でなく SameValueZero(e, value) が true なら true を返す
  5. false を返す

23.2.3.8 Set.prototype.keys ( )

"keys"プロパティの初期値は、"values"プロパティの初期値と同じ関数オブジェクトです。

反復処理では、SetはMapのように扱われます。各エントリのキーと値は同じです。

23.2.3.9 get Set.prototype.size

Set.prototype.sizeはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を S とする
  2. ? RequireInternalSlot(S, [[SetData]]) を実行する
  3. S.[[SetData]] を entries とする
  4. 0 を count とする
  5. entries 内の各要素を e とし、e ごとに次を実行する
    1. eempty でないなら、 count + 1 を count にセットする
  6. count を返す

23.2.3.10 Set.prototype.values ( )

次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateSetIterator(S, value) を返す

23.2.3.11 Set.prototype [ @@iterator ] ( )

@@iteratorプロパティの初期値は、"values"プロパティの初期値と同じ関数オブジェクトです。

23.2.3.12 Set.prototype [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"Set"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

23.2.4 Setインスタンスのプロパティ(Properties of Set Instances)

Setインスタンスは、Setプロトタイプからプロパティを継承する通常のオブジェクトです。 Setインスタンスには、[[SetData]]内部スロットがあります。

23.2.5 Setイテレーターオブジェクト(Set Iterator Objects)

Setイテレーターは、以下に定義されている構造を持つ通常のオブジェクトであり、特定のSetインスタンスオブジェクトに対する特定の反復を表します。 Setイテレーターオブジェクトの名前付きコンストラクターはありません。 代わりに、Setインスタンスオブジェクトの特定のメソッドを呼び出すことで作成されます。

23.2.5.1 CreateSetIterator ( set, kind )

Setオブジェクトのいくつかのメソッドは、Iteratorオブジェクトを返します。 このIteratorオブジェクトは、引数がsetkindが指定された抽象演算CreateSetIteratorで作成されます。 次の手順を実行します。

  1. ? RequireInternalSlot(set, [[SetData]]) を実行する
  2. OrdinaryObjectCreate(%SetIteratorPrototype%, « [[IteratedSet]], [[SetNextIndex]], [[SetIterationKind]] ») を iterator とする
  3. setiterator.[[IteratedSet]] にセットする
  4. 0 を iterator.[[SetNextIndex]] にセットする
  5. kinditerator.[[SetIterationKind]] にセットする
  6. iterator を返す

23.2.5.2 The %SetIteratorPrototype% Object

%SetIteratorPrototype%オブジェクトは、次の特徴があります。

  • すべてのSetイテレーターオブジェクトに継承されるプロパティがあります。
  • 通常のオブジェクトです。
  • [[Prototype]]内部スロットがあり、値は%IteratorPrototype% です。
  • 以下のプロパティがあります。
23.2.5.2.1 %SetIteratorPrototype%.next ( )
  1. this値 を O とする
  2. Type(O) が Object型でないなら、TypeError例外をスローする
  3. O がSetイテレーターインスタンス(23.2.5.3)のすべての内部スロットを持っていないなら TypeError例外をスローする
  4. O.[[IteratedSet]] を s とする
  5. O.[[SetNextIndex]] を index とする
  6. O.[[SetIterationKind]] を itemKind とする
  7. sundefined なら、 CreateIterResultObject(undefined, true) を返す
  8. Assert: s は [[SetData]] 内部スロットがある
  9. s.[[SetData]] を entries とする
  10. entries の要素数を numEntries とする
  11. NOTE: このメソッドを評価するたびに、numEntriesを再決定する
  12. indexnumEntries 未満の間繰り返し
    1. entries[index] を e とする
    2. index + 1 を index にセットする
    3. indexO.[[SetNextIndex]] にセットする
    4. eempty でないなら、
      1. itemKindkey+value なら、
        1. CreateIterResultObject( CreateArrayFromList(« e, e »), false) を返す
      2. Assert: itemKindvalue
      3. CreateIterResultObject(e, false) を返す
  13. undefinedO.[[IteratedSet]] にセットする
  14. CreateIterResultObject(undefined, true) を返す
23.2.5.2.2 %SetIteratorPrototype% [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"SetIterator"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

23.2.5.3 Setイテレータインスタンスのプロパティ(Properties of Set Iterator Instances)

Setイテレータインスタンスは、%SetIteratorPrototype%組み込みオブジェクトからプロパティを継承する通常のオブジェクトです。 Setイテレータインスタンスは、最初に表63で指定された内部スロットが作成されます。

表63: Setイテレータインスタンスの内部スロット
内部スロット 内容
[[IteratedSet]] 対象となっているオブジェクト
[[SetNextIndex]] 次回参照する[[SetData]]要素の整数インデックス
[[SetIterationKind]] 返される値を識別する文字列値。 使用可能な値は、valueおよびkey+value

23.3 WeakMapオブジェクト(WeakMap Objects)

WeakMapオブジェクトは、キーと値のペアのコレクションです。キーはオブジェクト、値は任意のECMAScript言語値です。 WeakMapは、特定のキーが含まれているかどうかを確認するためにクエリされる場合がありますが、キーとして保持しているオブジェクトを列挙するメカニズムは提供されていません。 キーとして使用されているオブジェクトが、WeakMapからの参照のみである場合、そのキー/値ペアはアクセスできず、WeakMapから自動的に削除されます。 WeakMapの実装では、このようなキーと値のペアおよび関連するリソースを検出して削除する必要があります。

実装では、WeakMapのキーと値のペアにアクセスできなくなってから、キーと値のペアがWeakMapから削除されるまでの間に、任意に決定された待機時間が課される場合があります。 この待ち時間がECMAScriptプログラムで確認可能である場合、プログラムの実行に影響を与える原因になります。 そのため、ECMAScript実装は、WeakMapのキーを監視する手段を提供してはなりません。

WeakMapオブジェクトは、ハッシュテーブルまたは他のメカニズムを使用して実装する必要があります。これらのメカニズムは、平均して、コレクション内のキーと値のペアの数に対して劣線形のアクセス時間を提供します。 このWeakMapオブジェクト仕様で使用されるデータ構造は、WeakMapオブジェクトに必要な監視可能なセマンティクスを説明することのみを目的としています。 これは、実行可能な実装モデルを意図したものではありません。

WeakMapおよびWeakSetsは、オブジェクトにアクセスできなくなり実装のガベージコレクションメカニズムによるリソースの再利用の対象になった場合に、メモリリソースを「リーク」させないように、状態をオブジェクトに動的に関連付けるメカニズムを提供することを目的としています。この特性は、弱いマップインスタンスのキーへのオブジェクトごとの反転マッピングを使用することで実現できます。 あるいは、各ウィークマップはそのキーから値へのマッピングを内部的に格納する場合がありますが、このアプローチでは、WeakMapまたはWeakSetの実装とガベージコレクターの間の調整が必要です。 次のリファレンスでは、WeakMapおよびWeakSetsの実装に役立つ可能性のあるメカニズムについて説明しています。

Barry Hayes. 1997.エフェメロン:新しいファイナライズメカニズム。 オブジェクト指向プログラミング、システム、言語、およびアプリケーションに関する第12回ACM SIGPLAN会議(OOPSLA '97)の議事録で、A. Michael Berman (Ed.). ACM, New York, NY, USA, 176-183、http://doi.acm.org/10.1145/263698.263733。

Alexandra Barros, Roberto Ierusalimschy,弱いテーブルでのサイクルの排除。 Journal of Universal Computer Science-J.UCS、vol. 14, no. 21, pp. 3481-3497, 2008, http://www.jucs.org/jucs_14_21/eliminating_cycles_in_weak

23.3.1 WeakMapコンストラクター(The WeakMap Constructor)

WeakMapコンストラクターは、次の特徴があります。

  • 組み込みオブジェクト%WeakMap%です。
  • グローバルオブジェクト"WeakMap"プロパティの初期値です。
  • コンストラクターとして呼び出されると、新しいWeakMapオブジェクトを作成して初期化します。
  • 関数として呼び出すと例外がスローされます。
  • サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターには、WeakMap.prototype組み込みメソッドをサポートし、サブクラスインスタンスを作成および初期化するためにsuper呼び出しをおこなう必要があります。

23.3.1.1 WeakMap ( [ iterable ] )

オプションの引数iterableを指定してWeakMap関数を呼び出すと、次の手順が実行されます。

  1. NewTargetundefined なら、TypeError例外をスローする
  2. ? OrdinaryCreateFromConstructor(NewTarget, "%WeakMap.prototype%", « [[WeakMapData]] ») を map とする
  3. 空の新規Listmap.[[WeakMapData]] にセットする
  4. iterableundefinednull なら、 map を返す
  5. ? Get(map, "set") を adder とする
  6. ? AddEntriesFromIterable(map, iterable, adder) を返す
パラメータiterableは、2要素のarrayライクオブジェクト(最初の要素がWeakMapキー、2番目の要素がキーに関連付ける値)を生成するイテレータオブジェクトを返す@@iteratorメソッドを実装するオブジェクトです。

23.3.2 WeakMapコンストラクターのプロパティ(Properties of the WeakMap Constructor)

WeakMapコンストラクターは、次の特徴があります。

  • [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
  • 以下のプロパティがあります。

23.3.2.1 WeakMap.prototype

WeakMap.prototypeの初期値は%WeakMap.prototype%です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。

23.3.3 WeakMapプロトタイプオブジェクトのプロパティ(Properties of the WeakMap Prototype Object)

WeakMapプロトタイプオブジェクトは、次の特徴があります。

  • 組み込みオブジェクト%WeakMapPrototype%です。
  • [[Prototype]]内部スロットがあり、値が%Object.prototype%です。
  • 通常のオブジェクトです。
  • [[WeakMapData]]内部スロットがありません。

23.3.3.1 WeakMap.prototype.constructor

WeakMap.prototype.constructorの初期値は%WeakMap%です。

23.3.3.2 WeakMap.prototype.delete ( key )

次の手順が実行されます。

  1. this値 を M とする
  2. ? RequireInternalSlot(M, [[WeakMapData]]) を実行する
  3. M.[[WeakMapData]] を entries とする
  4. Type(key) が Object型 でないなら、 false を返す
  5. entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
    1. p.[[Key]] が empty ではなく、 SameValue(p.[[Key]], key) が true なら、
      1. emptyp.[[Key]] にセットする
      2. emptyp.[[Value]] にセットする
      3. true を返す
  6. false を返す
値emptyは、エントリが削除されたことを示すための指定デバイスとして使用されます。 実装では、内部データ構造からエントリを物理的に削除するなど、他のアクションを実行する場合があります。

23.3.3.3 WeakMap.prototype.get ( key )

次の手順が実行されます。

  1. this値 を M とする
  2. ? RequireInternalSlot(M, [[WeakMapData]]) を実行する
  3. M.[[WeakMapData]] を entries とする
  4. Type(key) が Object型 でないなら、 undefined を返す
  5. entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
    1. p.[[Key]] が empty でなく SameValue(p.[[Key]], key) が true なら、 p.[[Value]] を返す
  6. undefined を返す

23.3.3.4 WeakMap.prototype.has ( key )

次の手順が実行されます。

  1. this値 を M とする
  2. ? RequireInternalSlot(M, [[WeakMapData]]) を実行する
  3. M.[[WeakMapData]] を entries とする
  4. Type(key) が Object型 でないなら、 false を返す
  5. entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
    1. p.[[Key]] が empty でなく SameValue(p.[[Key]], key) is true なら、 true を返す
  6. false を返す

23.3.3.5 WeakMap.prototype.set ( key, value )

次の手順が実行されます。

  1. this値 を M とする
  2. ? RequireInternalSlot(M, [[WeakMapData]]) を実行する
  3. M.[[WeakMapData]] を entries とする
  4. Type(key) が Object型でないなら、TypeError例外をスローする
  5. entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
    1. p.[[Key]] が empty ではなく、 SameValue(p.[[Key]], key) が true なら、
      1. valuep.[[Value]] にセットする
      2. M を返す
  6. Record { [[Key]]: key, [[Value]]: value } を p とする
  7. entries の最後に p を追加する
  8. M を返す

23.3.3.6 WeakMap.prototype [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"WeakMap"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

23.3.4 WeakMapインスタンスのプロパティ(Properties of WeakMap Instances)

WeakMapインスタンスは、WeakMapプロトタイプからプロパティを継承する通常のオブジェクトです。 WeakMapインスタンスには、[[WeakMapData]]内部スロットがあります。

23.4 WeakSetオブジェクト(WeakSet Objects)

WeakSetオブジェクトは、オブジェクトのコレクションです。 個別のオブジェクトは、WeakSetのコレクションの要素として1つだけセットできます。 WeakSetは、特定のオブジェクトが含まれているかどうかの確認はできますが、保持しているオブジェクトを列挙するためのメカニズムは提供されていません。 WeakSetに含まれるオブジェクトが、WeakSet内からの参照のみの場合、そのオブジェクトにはアクセスできず、WeakSetから自動的に削除されます。 WeakSetの実装では、そのようなオブジェクトと関連するリソースを検出して削除する必要があります。

実装は、WeakSetに含まれるオブジェクトにアクセスできなくなってから、オブジェクトがWeakSetから削除されるまでの間に、任意に決定された待ち時間を課す場合があります。 この待ち時間がECMAScriptプログラムで確認可能である場合、プログラムの実行に影響を与える原因になります。 そのためECMAScript実装はWeakSetに、使用できないオブジェクトが含まれているかどうかを判断する手段を提供してはなりません。

WeakSetオブジェクトは、ハッシュテーブルまたは他のメカニズムを使用して実装する必要があります。これらのメカニズムは、平均して、コレクション内の要素の数に対して劣線形のアクセス時間を提供します。 このWeakSetオブジェクト仕様で使用されるデータ構造は、WeakSetオブジェクトに必要な監視可能なセマンティクスを説明することのみを目的としています。 これは、実行可能な実装モデルを意図したものではありません。

23.3の備考を参照

23.4.1 WeakSetコンストラクター(The WeakSet Constructor)

WeakSetコンストラクターは、次の特徴があります。

  • 組み込みオブジェクト%WeakSet%です。
  • グローバルオブジェクト"WeakSet"プロパティの初期値です。
  • コンストラクターとして呼び出されると、新しいWeakSetオブジェクトを作成して初期化します。
  • 関数として呼び出されると例外がスローされます。
  • サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターには、WeakSet.prototype組み込みメソッドをサポートし、サブクラスインスタンスを作成および初期化するためにsuper呼び出しを含める必要があります。

23.4.1.1 WeakSet ( [ iterable ] )

オプションの引数iterableを指定してWeakSet関数を呼び出すと、次の手順が実行されます。

  1. NewTargetundefined なら、TypeError例外をスローする
  2. ? OrdinaryCreateFromConstructor(NewTarget, "%WeakSet.prototype%", « [[WeakSetData]] ») を set とする
  3. 空の新規Listset.[[WeakSetData]] にセットする
  4. iterableundefinednull なら、 set を返す
  5. ? Get(set, "add") を adder とする
  6. IsCallable(adder) が false なら、TypeError例外をスローする
  7. ? GetIterator(iterable) を iteratorRecord とする
  8. 繰り返し
    1. ? IteratorStep(iteratorRecord) を next とする
    2. nextfalse なら、 set を返す
    3. ? IteratorValue(next) を nextValue とする
    4. Call(adder, set, « nextValue ») を status とする
    5. status が an 突然の完了 なら、 ? IteratorClose(iteratorRecord, status) を返す

23.4.2 WeakSetコンストラクターのプロパティ(Properties of the WeakSet Constructor)

WeakSetコンストラクターは、次の特徴があります。

  • [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
  • 以下のプロパティがあります。

23.4.2.1 WeakSet.prototype

WeakSet.prototypeの初期値は、組み込みの%WeakSetPrototype%オブジェクトです。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。

23.4.3 WeakSetプロトタイプオブジェクトのプロパティ(Properties of the WeakSet Prototype Object)

WeakSetプロトタイプオブジェクトは、次の特徴があります。

  • 組み込みオブジェクト%WeakSetPrototype%です。
  • [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
  • 通常のオブジェクトです。
  • [[WeakSetData]]内部スロットがありません。

23.4.3.1 WeakSet.prototype.add ( value )

次の手順が実行されます。

  1. this値 を S とする
  2. ? RequireInternalSlot(S, [[WeakSetData]]) を実行する
  3. Type(value) が Object型でないなら、TypeError例外をスローする
  4. S.[[WeakSetData]] を entries とする
  5. entries 内の各要素を e とし、e ごとに次を実行する
    1. eempty ではなく、 SameValue(e, value) が true なら、
      1. S を返す
  6. entries の最後に value を追加する
  7. S を返す

23.4.3.2 WeakSet.prototype.constructor

WeakSet.prototype.constructorの初期値は、%WeakSet%組み込みオブジェクトです。

23.4.3.3 WeakSet.prototype.delete ( value )

次の手順が実行されます。

  1. this値 を S とする
  2. ? RequireInternalSlot(S, [[WeakSetData]]) を実行する
  3. Type(value) が Object型 でないなら、 false を返す
  4. S.[[WeakSetData]] を entries とする
  5. entries 内の各要素を e とし、e ごとに次を実行する
    1. eempty ではなく、 SameValue(e, value) が true なら、
      1. entries の 要素eempty と置き換える
      2. true を返す
  6. false を返す
値emptyは、エントリが削除されたことを示すための指定デバイスとして使用されます。 実際の実装では、内部データ構造からエントリを物理的に削除するなど、他のアクションを実行する場合があります。

23.4.3.4 WeakSet.prototype.has ( value )

次の手順が実行されます。

  1. this値 を S とする
  2. ? RequireInternalSlot(S, [[WeakSetData]]) を実行する
  3. S.[[WeakSetData]] を entries とする
  4. Type(value) が Object型 でないなら、 false を返す
  5. entries 内の各要素を e とし、e ごとに次を実行する
    1. eempty でなく SameValue(e, value) is true なら、 true を返す
  6. false を返す

23.4.3.5 WeakSet.prototype [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"WeakSet"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

23.4.4 WeakSetインスタンスのプロパティ(Properties of WeakSet Instances)

WeakSetインスタンスは、WeakSetプロトタイプからプロパティを継承する通常のオブジェクトです。 WeakSetインスタンスには、[[WeakSetData]]内部スロットがあります。