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関数を呼び出すと、次の手順が実行されます。
- NewTarget が undefined なら、TypeError例外をスローする
- ? OrdinaryCreateFromConstructor(NewTarget, "%Map.prototype%", « [[MapData]] ») を map とする
- 空の新規List を map.[[MapData]] にセットする
- iterable が undefined または null なら、 map を返す
- ? Get(map, "set") を adder とする
- ? AddEntriesFromIterable(map, iterable, adder) を返す
23.1.1.2 AddEntriesFromIterable ( target, iterable, adder )
抽象操作AddEntriesFromIterableは、targetオブジェクト、エントリのiterable、および呼び出されるadder関数を受け入れ、targetをレシーバーとします。
- IsCallable(adder) が false なら、TypeError例外をスローする
- Assert: iterable は存在し、 undefined でも null でもない
- ? GetIterator(iterable) を iteratorRecord とする
- 繰り返し
- ? IteratorStep(iteratorRecord) を next とする
- next が false なら、 target を返す
- ? IteratorValue(next) を nextItem とする
- Type(nextItem) が Object型 でないなら、
- ThrowCompletion(新規作成した TypeError オブジェクト) を error とする
- ? IteratorClose(iteratorRecord, error) を返す
- Get(nextItem, "0") を k とする
- k が 突然の完了 なら、 ? IteratorClose(iteratorRecord, k) を返す
- Get(nextItem, "1") を v とする
- v が 突然の完了 なら、 ? IteratorClose(iteratorRecord, v) を返す
- Call(adder, target, « k.[[Value]], v.[[Value]] ») を status とする
- status が 突然の完了 なら、 ? IteratorClose(iteratorRecord, status) を返す
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アクセス関数は、次の手順を実行します。
- this値 を返す
この関数の"name"プロパティの値は"get [Symbol.species]"です。
23.1.3 Mapプロトタイプオブジェクトのプロパティ(Properties of the Map Prototype Object)
Mapプロトタイプオブジェクトは、次の特徴があります。
- 組み込みオブジェクト%MapPrototype%です。
- [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
- 通常のオブジェクトです。
- [[MapData]]内部スロットがありません。
23.1.3.1 Map.prototype.clear ( )
次の手順が実行されます。
- this値 を M とする
- ? RequireInternalSlot(M, [[MapData]]) を実行する
- M.[[MapData]] を entries とする
- entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
- empty を p.[[Key]] にセットする
- empty を p.[[Value]] にセットする
- undefined を返す
23.1.3.2 Map.prototype.constructor
Map.prototype.constructorの初期値は%Map%です。
23.1.3.3 Map.prototype.delete ( key )
次の手順が実行されます。
- this値 を M とする
- ? RequireInternalSlot(M, [[MapData]]) を実行する
- M.[[MapData]] を entries とする
- entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
- p.[[Key]] が empty ではなく、 SameValueZero(p.[[Key]], key) が true なら、
- empty を p.[[Key]] にセットする
- empty を p.[[Value]] にセットする
- true を返す
- p.[[Key]] が empty ではなく、 SameValueZero(p.[[Key]], key) が true なら、
- false を返す
23.1.3.4 Map.prototype.entries ( )
次の手順が実行されます。
- this値 を M とする
- ? CreateMapIterator(M, key+value) を返す
23.1.3.5 Map.prototype.forEach ( callbackfn [ , thisArg ] )
forEachメソッドが1つまたは2つの引数で呼び出されると、次の手順が実行されます。
- this値 を M とする
- ? RequireInternalSlot(M, [[MapData]]) を実行する
- IsCallable(callbackfn) が false なら、TypeError例外をスローする
- M.[[MapData]] を entries とする
- entries 内の各 Record { [[Key]], [[Value]] } 要素を e とし、e を元のキーの挿入順序で次を実行する
- 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 )
次の手順が実行されます。
- this値 を M とする
- ? RequireInternalSlot(M, [[MapData]]) を実行する
- M.[[MapData]] を entries とする
- entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
- p.[[Key]] が empty でなく、 SameValueZero(p.[[Key]], key) が true なら、 p.[[Value]] を返す
- undefined を返す
23.1.3.7 Map.prototype.has ( key )
次の手順が実行されます。
- this値 を M とする
- ? RequireInternalSlot(M, [[MapData]]) を実行する
- M.[[MapData]] を entries とする
- entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
- p.[[Key]] が empty でなく、 SameValueZero(p.[[Key]], key) が true なら、 true を返す
- false を返す
23.1.3.8 Map.prototype.keys ( )
次の手順が実行されます。
- this値 を M とする
- ? CreateMapIterator(M, key) を返す
23.1.3.9 Map.prototype.set ( key, value )
次の手順が実行されます。
- this値 を M とする
- ? RequireInternalSlot(M, [[MapData]]) を実行する
- M.[[MapData]] を entries とする
- entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
- p.[[Key]] が empty ではなく、 SameValueZero(p.[[Key]], key) が true なら、
- value を p.[[Value]] にセットする
- M を返す
- p.[[Key]] が empty ではなく、 SameValueZero(p.[[Key]], key) が true なら、
- key が -0 なら +0 を key にセットする
- Record { [[Key]]: key, [[Value]]: value } を p とする
- entries の最後に p を追加する
- M を返す
23.1.3.10 get Map.prototype.size
Map.prototype.sizeはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値 を M とする
- ? RequireInternalSlot(M, [[MapData]]) を実行する
- M.[[MapData]] を entries とする
- 0 を count とする
- entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
- p.[[Key]] が empty でないなら、 count + 1 を count にセットする
- count を返す
23.1.3.11 Map.prototype.values ( )
次の手順が実行されます。
- this値 を M とする
- ? 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オブジェクトは、引数mapとkindを指定した抽象操作CreateMapIteratorで作成します。 次の手順を実行します。
- ? RequireInternalSlot(map, [[MapData]]) を実行する
- OrdinaryObjectCreate(%MapIteratorPrototype%, « [[IteratedMap]], [[MapNextIndex]], [[MapIterationKind]] ») を iterator とする
- map を iterator.[[IteratedMap]] にセットする
- 0 を iterator.[[MapNextIndex]] にセットする
- kind を iterator.[[MapIterationKind]] にセットする
- iterator を返す
23.1.5.2 %MapIteratorPrototype%オブジェクト(The %MapIteratorPrototype% Object)
%MapIteratorPrototype%オブジェクトは、次の特徴があります。
- すべてのMapイテレータオブジェクトに継承されるプロパティがあります。
- 通常のオブジェクトです。
- [[Prototype]]内部スロットがあり、値は%IteratorPrototype% です。
- 以下のプロパティがあります。
23.1.5.2.1 %MapIteratorPrototype%.next ( )
- this値 を O とする
- Type(O) が Object型でないなら、TypeError例外をスローする
- O が Mapイテレータインスタンス(23.1.5.3)のすべての内部スロットを持っていないなら TypeError例外をスローする
- O.[[IteratedMap]] を m とする
- O.[[MapNextIndex]] を index とする
- O.[[MapIterationKind]] を itemKind とする
- m が undefined なら、 CreateIterResultObject(undefined, true) を返す
- Assert: m は [[MapData]] 内部スロットがある
- m.[[MapData]] を entries とする
- entries の要素数を numEntries とする
- NOTE: このメソッドを評価するたびに、numEntriesを再決定する必要がある
- index が numEntries 未満の間繰り返し
- entries[index] の値( Record { [[Key]], [[Value]] } ) を e とする
- index + 1 を index にセットする
- index を O.[[MapNextIndex]] にセットする
- e.[[Key]] が empty でないなら、
- itemKind が key なら、 e を result とする [[Key]]
- i. と異なり、 itemKind が value なら e.[[Value]] を result とする
- ii. と異なるなら、
- Assert: itemKind は key+value
- ! CreateArrayFromList(« e.[[Key]], e.[[Value]] ») を result とする
- CreateIterResultObject(result, false) を返す
- undefined を O.[[IteratedMap]] にセットする
- 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の内部スロットが作成されます。
内部スロット | 内容 |
---|---|
[[IteratedMap]] | 対象となっているMapオブジェクト |
[[MapNextIndex]] | 次にイテレータが確認する[[MapData]]要素の整数インデックス |
[[MapIterationKind]] | 反復の各要素に対して返される要素を識別する文字列値。 使用できる値は、key、value、key+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関数を呼び出すと、次の手順が実行されます。
- NewTarget が undefined なら、TypeError例外をスローする
- ? OrdinaryCreateFromConstructor(NewTarget, "%Set.prototype%", « [[SetData]] ») を set とする
- 空の新規List を set.[[SetData]] にセットする
- iterable が undefined または null なら、 set を返す
- ? Get(set, "add") を adder とする
- IsCallable(adder) が false なら、TypeError例外をスローする
- ? GetIterator(iterable) を iteratorRecord とする
- 繰り返し
- ? IteratorStep(iteratorRecord) を next とする
- next が false なら、 set を返す
- ? IteratorValue(next) を nextValue とする
- Call(adder, set, « nextValue ») を status とする
- 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アクセス関数は、次の手順を実行します。
- this値 を返す
この関数の"name"プロパティの値は"get [Symbol.species]"です。
23.2.3 Setプロトタイプオブジェクトのプロパティ(Properties of the Set Prototype Object)
Setプロトタイプオブジェクトは、次の特徴があります。
- 組み込みオブジェクト%SetPrototype%です。
- [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
- 通常のオブジェクトです。
- [[SetData]]内部スロットがありません。
23.2.3.1 Set.prototype.add ( value )
次の手順が実行されます。
- this値 を S とする
- ? RequireInternalSlot(S, [[SetData]]) を実行する
- S.[[SetData]] を entries とする
- entries 内の各要素を e とし、e ごとに次を実行する
- e が empty ではなく、 SameValueZero(e, value) が true なら、
- S を返す
- e が empty ではなく、 SameValueZero(e, value) が true なら、
- value が -0 なら +0 を value にセットする
- entries の最後に value を追加する
- S を返す
23.2.3.2 Set.prototype.clear ( )
次の手順が実行されます。
- this値 を S とする
- ? RequireInternalSlot(S, [[SetData]]) を実行する
- S.[[SetData]] を entries とする
- entries 内の各要素を e とし、e ごとに次を実行する
- entries 内の値 e を empty に置き換える
- undefined を返す
23.2.3.3 Set.prototype.constructor
Set.prototype.constructorの初期値は%Set%です。
23.2.3.4 Set.prototype.delete ( value )
次の手順が実行されます。
- this値 を S とする
- ? RequireInternalSlot(S, [[SetData]]) を実行する
- S.[[SetData]] を entries とする
- entries 内の各要素を e とし、e ごとに次を実行する
- e が empty ではなく、 SameValueZero(e, value) が true なら、
- entries 内の値 e を empty に置き換える
- true を返す
- e が empty ではなく、 SameValueZero(e, value) が true なら、
- false を返す
23.2.3.5 Set.prototype.entries ( )
次の手順が実行されます。
- this値 を S とする
- ? CreateSetIterator(S, key+value) を返す
23.2.3.6 Set.prototype.forEach ( callbackfn [ , thisArg ] )
forEachメソッドが1つまたは2つの引数で呼び出されると、次の手順が実行されます。
- this値 を S とする
- ? RequireInternalSlot(S, [[SetData]]) を実行する
- IsCallable(callbackfn) が false なら、TypeError例外をスローする
- S.[[SetData]] を entries とする
- entries 内の各要素を e とし元の要素の挿入順に次を実行する
- undefined を返す
callbackfnは、3つの引数を受け入れる関数である必要があります。 forEachは、値の挿入順にcallbackfnを1回呼び出します。 callbackfnは、実際に存在する値に対してのみ呼び出されます。 削除されたキーについては呼び出されません。
thisArgパラメーターは、callbackfnのthis値として使用されます。指定されていない場合は、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 )
次の手順が実行されます。
- this値 を S とする
- ? RequireInternalSlot(S, [[SetData]]) を実行する
- S.[[SetData]] を entries とする
- entries 内の各要素を e とし、e ごとに次を実行する
- e が empty でなく SameValueZero(e, value) が true なら true を返す
- false を返す
23.2.3.8 Set.prototype.keys ( )
"keys"プロパティの初期値は、"values"プロパティの初期値と同じ関数オブジェクトです。
23.2.3.9 get Set.prototype.size
Set.prototype.sizeはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値 を S とする
- ? RequireInternalSlot(S, [[SetData]]) を実行する
- S.[[SetData]] を entries とする
- 0 を count とする
- entries 内の各要素を e とし、e ごとに次を実行する
- e が empty でないなら、 count + 1 を count にセットする
- count を返す
23.2.3.10 Set.prototype.values ( )
次の手順が実行されます。
- this値 を S とする
- ? 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オブジェクトは、引数がsetとkindが指定された抽象演算CreateSetIteratorで作成されます。 次の手順を実行します。
- ? RequireInternalSlot(set, [[SetData]]) を実行する
- OrdinaryObjectCreate(%SetIteratorPrototype%, « [[IteratedSet]], [[SetNextIndex]], [[SetIterationKind]] ») を iterator とする
- set を iterator.[[IteratedSet]] にセットする
- 0 を iterator.[[SetNextIndex]] にセットする
- kind を iterator.[[SetIterationKind]] にセットする
- iterator を返す
23.2.5.2 The %SetIteratorPrototype% Object
%SetIteratorPrototype%オブジェクトは、次の特徴があります。
- すべてのSetイテレーターオブジェクトに継承されるプロパティがあります。
- 通常のオブジェクトです。
- [[Prototype]]内部スロットがあり、値は%IteratorPrototype% です。
- 以下のプロパティがあります。
23.2.5.2.1 %SetIteratorPrototype%.next ( )
- this値 を O とする
- Type(O) が Object型でないなら、TypeError例外をスローする
- O がSetイテレーターインスタンス(23.2.5.3)のすべての内部スロットを持っていないなら TypeError例外をスローする
- O.[[IteratedSet]] を s とする
- O.[[SetNextIndex]] を index とする
- O.[[SetIterationKind]] を itemKind とする
- s が undefined なら、 CreateIterResultObject(undefined, true) を返す
- Assert: s は [[SetData]] 内部スロットがある
- s.[[SetData]] を entries とする
- entries の要素数を numEntries とする
- NOTE: このメソッドを評価するたびに、numEntriesを再決定する
- index が numEntries 未満の間繰り返し
- entries[index] を e とする
- index + 1 を index にセットする
- index を O.[[SetNextIndex]] にセットする
- e が empty でないなら、
- itemKind が key+value なら、
- CreateIterResultObject( CreateArrayFromList(« e, e »), false) を返す
- Assert: itemKind は value
- CreateIterResultObject(e, false) を返す
- itemKind が key+value なら、
- undefined を O.[[IteratedSet]] にセットする
- 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で指定された内部スロットが作成されます。
内部スロット | 内容 |
---|---|
[[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オブジェクトに必要な監視可能なセマンティクスを説明することのみを目的としています。 これは、実行可能な実装モデルを意図したものではありません。
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関数を呼び出すと、次の手順が実行されます。
- NewTarget が undefined なら、TypeError例外をスローする
- ? OrdinaryCreateFromConstructor(NewTarget, "%WeakMap.prototype%", « [[WeakMapData]] ») を map とする
- 空の新規List を map.[[WeakMapData]] にセットする
- iterable が undefined か null なら、 map を返す
- ? Get(map, "set") を adder とする
- ? AddEntriesFromIterable(map, iterable, adder) を返す
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 )
次の手順が実行されます。
- this値 を M とする
- ? RequireInternalSlot(M, [[WeakMapData]]) を実行する
- M.[[WeakMapData]] を entries とする
- Type(key) が Object型 でないなら、 false を返す
- entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
- p.[[Key]] が empty ではなく、 SameValue(p.[[Key]], key) が true なら、
- empty を p.[[Key]] にセットする
- empty を p.[[Value]] にセットする
- true を返す
- p.[[Key]] が empty ではなく、 SameValue(p.[[Key]], key) が true なら、
- false を返す
23.3.3.3 WeakMap.prototype.get ( key )
次の手順が実行されます。
- this値 を M とする
- ? RequireInternalSlot(M, [[WeakMapData]]) を実行する
- M.[[WeakMapData]] を entries とする
- Type(key) が Object型 でないなら、 undefined を返す
- entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
- p.[[Key]] が empty でなく SameValue(p.[[Key]], key) が true なら、 p.[[Value]] を返す
- undefined を返す
23.3.3.4 WeakMap.prototype.has ( key )
次の手順が実行されます。
- this値 を M とする
- ? RequireInternalSlot(M, [[WeakMapData]]) を実行する
- M.[[WeakMapData]] を entries とする
- Type(key) が Object型 でないなら、 false を返す
- entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
- p.[[Key]] が empty でなく SameValue(p.[[Key]], key) is true なら、 true を返す
- false を返す
23.3.3.5 WeakMap.prototype.set ( key, value )
次の手順が実行されます。
- this値 を M とする
- ? RequireInternalSlot(M, [[WeakMapData]]) を実行する
- M.[[WeakMapData]] を entries とする
- Type(key) が Object型でないなら、TypeError例外をスローする
- entries 内の各 Record { [[Key]], [[Value]] } 要素を p とし、 p ごとに次を実行する
- p.[[Key]] が empty ではなく、 SameValue(p.[[Key]], key) が true なら、
- value を p.[[Value]] にセットする
- M を返す
- p.[[Key]] が empty ではなく、 SameValue(p.[[Key]], key) が true なら、
- Record { [[Key]]: key, [[Value]]: value } を p とする
- entries の最後に p を追加する
- 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.4.1 WeakSetコンストラクター(The WeakSet Constructor)
WeakSetコンストラクターは、次の特徴があります。
- 組み込みオブジェクト%WeakSet%です。
- グローバルオブジェクトの"WeakSet"プロパティの初期値です。
- コンストラクターとして呼び出されると、新しいWeakSetオブジェクトを作成して初期化します。
- 関数として呼び出されると例外がスローされます。
- サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターには、WeakSet.prototype組み込みメソッドをサポートし、サブクラスインスタンスを作成および初期化するためにsuper呼び出しを含める必要があります。
23.4.1.1 WeakSet ( [ iterable ] )
オプションの引数iterableを指定してWeakSet関数を呼び出すと、次の手順が実行されます。
- NewTarget が undefined なら、TypeError例外をスローする
- ? OrdinaryCreateFromConstructor(NewTarget, "%WeakSet.prototype%", « [[WeakSetData]] ») を set とする
- 空の新規List を set.[[WeakSetData]] にセットする
- iterable が undefined か null なら、 set を返す
- ? Get(set, "add") を adder とする
- IsCallable(adder) が false なら、TypeError例外をスローする
- ? GetIterator(iterable) を iteratorRecord とする
- 繰り返し
- ? IteratorStep(iteratorRecord) を next とする
- next が false なら、 set を返す
- ? IteratorValue(next) を nextValue とする
- Call(adder, set, « nextValue ») を status とする
- 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 )
次の手順が実行されます。
- this値 を S とする
- ? RequireInternalSlot(S, [[WeakSetData]]) を実行する
- Type(value) が Object型でないなら、TypeError例外をスローする
- S.[[WeakSetData]] を entries とする
- entries 内の各要素を e とし、e ごとに次を実行する
- e が empty ではなく、 SameValue(e, value) が true なら、
- S を返す
- e が empty ではなく、 SameValue(e, value) が true なら、
- entries の最後に value を追加する
- S を返す
23.4.3.2 WeakSet.prototype.constructor
WeakSet.prototype.constructorの初期値は、%WeakSet%組み込みオブジェクトです。
23.4.3.3 WeakSet.prototype.delete ( value )
次の手順が実行されます。
- this値 を S とする
- ? RequireInternalSlot(S, [[WeakSetData]]) を実行する
- Type(value) が Object型 でないなら、 false を返す
- S.[[WeakSetData]] を entries とする
- entries 内の各要素を e とし、e ごとに次を実行する
- e が empty ではなく、 SameValue(e, value) が true なら、
- entries の 要素e を empty と置き換える
- true を返す
- e が empty ではなく、 SameValue(e, value) が true なら、
- false を返す
23.4.3.4 WeakSet.prototype.has ( value )
次の手順が実行されます。
- this値 を S とする
- ? RequireInternalSlot(S, [[WeakSetData]]) を実行する
- S.[[WeakSetData]] を entries とする
- Type(value) が Object型 でないなら、 false を返す
- entries 内の各要素を e とし、e ごとに次を実行する
- e が empty でなく SameValue(e, value) is true なら、 true を返す
- 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]]内部スロットがあります。