24 キー付きコレクション

24.1 Mapオブジェクト

Mapはキー/値ペアのコレクションであり、キーと値はいずれも任意のECMAScript言語値であってよいです。異なるキー値は、Mapのコレクション内の1つのキー/値ペアにのみ出現できます。異なるキー値は、SameValueZero比較アルゴリズムの意味論を使用して区別されます。

Mapは、平均してコレクション内の要素数に対してサブリニアなアクセス時間を提供するハッシュテーブルまたはその他の機構を使用して実装されなければなりません。この仕様で使用されるデータ構造は、Mapに要求される観察可能な意味論を記述することのみを意図しています。実行可能な実装モデルであることは意図していません。

24.1.1 Mapコンストラクター

Mapコンストラクターは以下の通りです:

  • %Map%である。
  • グローバルオブジェクト"Map"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいMapを作成して初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローする。
  • クラス定義のextends節の値として使用できる。指定されたMapの動作を継承することを意図するサブクラスコンストラクターは、Map.prototype組み込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するために、Mapコンストラクターへのsuper呼び出しを含めなければならない。

24.1.1.1 Map ( [ iterable ] )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. map を ? OrdinaryCreateFromConstructor(NewTarget, "%Map.prototype%", « [[MapData]] ») とする。
  3. map.[[MapData]] を新しい空のListに設定する。
  4. iterableundefined または null のいずれかである場合、map を返す。
  5. adder を ? Get(map, "set") とする。
  6. IsCallable(adder) が false の場合、TypeError 例外をスローする。
  7. AddEntriesFromIterable(map, iterable, adder) を返す。
Note

パラメーター iterable が存在する場合、それは、Mapキーとして使用される値を第1要素とし、そのキーに関連付ける値を第2要素とする2要素のarray-like objectを生成するイテレーターオブジェクトを返す %Symbol.iterator% メソッドを実装するオブジェクトであることが期待されます。

24.1.1.2 AddEntriesFromIterable ( target, iterable, adder )

The abstract operation AddEntriesFromIterable takes arguments target (an Object), iterable (an ECMAScript language value, but not undefined or null), and adder (a function object) and returns either a normal completion containing an Object or a throw completion. adder は、target をレシーバーとして起動されます。 It performs the following steps when called:

  1. iteratorRecord を ? GetIterator(iterable, sync) とする。
  2. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone の場合、target を返す。
    3. next がObjectでない場合、次を行う:
      1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
      2. IteratorClose(iteratorRecord, error) を返す。
    4. keyCompletion(Get(next, "0")) とする。
    5. IfAbruptCloseIterator(key, iteratorRecord)。
    6. valueCompletion(Get(next, "1")) とする。
    7. IfAbruptCloseIterator(value, iteratorRecord)。
    8. statusCompletion(Call(adder, target, « key, value »)) とする。
    9. IfAbruptCloseIterator(status, iteratorRecord)。
Note

パラメーター iterable は、Mapキーとして使用される値を第1要素とし、そのキーに関連付ける値を第2要素とする2要素のarray-like objectを生成するイテレーターオブジェクトを返す %Symbol.iterator% メソッドを実装するオブジェクトであることが期待されます。

24.1.2 Mapコンストラクターのプロパティ

Mapコンストラクターは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

24.1.2.1 Map.groupBy ( items, callback )

Note

callback は2つの引数を受け取る関数であるべきです。groupByは、items 内の各要素について昇順に callback を1回ずつ呼び出し、新しいMapを構築します。callback によって返される各値は、Map内のキーとして使用されます。そのような各キーについて、結果のMapは、そのキーをキーとし、そのキーを返した callback のすべての要素を含む配列を値とするエントリーを持ちます。

callback は2つの引数、すなわち要素の値と要素のインデックスで呼び出されます。

groupByの戻り値はMapです。

この関数は呼び出されたとき、次の手順を実行します:

  1. groups を ? GroupBy(items, callback, collection) とする。
  2. map を ! Construct(%Map%) とする。
  3. groups の各Record { [[Key]], [[Elements]] } group について、次を行う:
    1. elementsCreateArrayFromList(group.[[Elements]]) とする。
    2. entryRecord { [[Key]]: group.[[Key]], [[Value]]: elements } とする。
    3. entrymap.[[MapData]] に追加する。
  4. map を返す。

24.1.2.2 Map.prototype

Map.prototypeの初期値はMapプロトタイプオブジェクトです。

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

24.1.2.3 get Map [ %Symbol.species% ]

Map[%Symbol.species%]は、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. this値を返す。

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

Note

派生コレクションオブジェクトを作成するメソッドは、派生オブジェクトを作成するために使用するコンストラクターを決定するため、%Symbol.species% を呼び出すべきです。サブクラスコンストラクターは、既定のコンストラクター割り当てを変更するために %Symbol.species% を上書きできます。

24.1.3 Mapプロトタイプオブジェクトのプロパティ

Mapプロトタイプオブジェクトは以下の通りです:

  • %Map.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[MapData]]内部スロットを持たない。

24.1.3.1 Map.prototype.clear ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty に設定する。
    2. entry.[[Value]]empty に設定する。
  4. undefined を返す。
Note

既存の[[MapData]] Listは保持されます。なぜなら、そのListの反復途中で中断されている既存のMap Iteratorオブジェクトが存在する可能性があるためです。

24.1.3.2 Map.prototype.constructor

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

24.1.3.3 Map.prototype.delete ( key )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定する。
  4. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、次を行う:
      1. entry.[[Key]]empty に設定する。
      2. entry.[[Value]]empty に設定する。
      3. true を返す。
  5. false を返す。
Note

empty は、エントリーが削除されたことを示す仕様上の道具として使用されます。実際の実装は、内部データ構造からエントリーを物理的に削除するなど、他の処理を行ってもよいです。

24.1.3.4 Map.prototype.entries ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. CreateMapIterator(map, key+value) を返す。

24.1.3.5 Map.prototype.forEach ( callback [ , thisArg ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  4. entriesmap.[[MapData]] とする。
  5. numEntriesentries 内の要素数とする。
  6. index を 0 とする。
  7. index < numEntries の間、繰り返す:
    1. eentries[index] とする。
    2. indexindex + 1 に設定する。
    3. e.[[Key]]empty でない場合、次を行う:
      1. Call(callback, thisArg, « e.[[Value]], e.[[Key]], map ») を実行する。
      2. NOTE: callback の実行中に entries 内の要素数が増加している可能性がある。
      3. numEntriesentries 内の要素数に設定する。
  8. undefined を返す。
Note

callback は3つの引数を受け取る関数であるべきです。forEachは、Mapに存在する各キー/値ペアについて、キーの挿入順に callback を1回ずつ呼び出します。callback は実際に存在するMapのキーについてのみ呼び出され、Mapから削除されたキーについては呼び出されません。

thisArg パラメーターが提供された場合、それは callback の各呼び出しのthis値として使用されます。提供されない場合、代わりに undefined が使用されます。

callback は3つの引数、すなわち項目の値、項目のキー、および走査されているMapで呼び出されます。

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

24.1.3.6 Map.prototype.get ( key )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定する。
  4. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、entry.[[Value]] を返す。
  5. undefined を返す。

24.1.3.7 Map.prototype.getOrInsert ( key, value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定する。
  4. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、entry.[[Value]] を返す。
  5. entryRecord { [[Key]]: key, [[Value]]: value } とする。
  6. entrymap.[[MapData]] に追加する。
  7. value を返す。

24.1.3.8 Map.prototype.getOrInsertComputed ( key, callback )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  4. keyCanonicalizeKeyedCollectionKey(key) に設定する。
  5. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、entry.[[Value]] を返す。
  6. value を ? Call(callback, undefined, « key ») とする。
  7. NOTE: callback の実行中にMapが変更されている可能性がある。
  8. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、次を行う:
      1. entry.[[Value]]value に設定する。
      2. value を返す。
  9. entryRecord { [[Key]]: key, [[Value]]: value } とする。
  10. entrymap.[[MapData]] に追加する。
  11. value を返す。

24.1.3.9 Map.prototype.has ( key )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定する。
  4. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、true を返す。
  5. false を返す。

24.1.3.10 Map.prototype.keys ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. CreateMapIterator(map, key) を返す。

24.1.3.11 Map.prototype.set ( key, value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定する。
  4. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、次を行う:
      1. entry.[[Value]]value に設定する。
      2. map を返す。
  5. entryRecord { [[Key]]: key, [[Value]]: value } とする。
  6. entrymap.[[MapData]] に追加する。
  7. map を返す。

24.1.3.12 get Map.prototype.size

Map.prototype.sizeは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. RequireInternalSlot(map, [[MapData]]) を実行する。
  3. count を 0 とする。
  4. map.[[MapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でない場合、countcount + 1 に設定する。
  5. 𝔽(count) を返す。

24.1.3.13 Map.prototype.values ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. mapthis値とする。
  2. CreateMapIterator(map, value) を返す。

24.1.3.14 Map.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator%プロパティの初期値は、24.1.3.4 で定義される %Map.prototype.entries% です。

24.1.3.15 Map.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値はString値 "Map" です。

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

24.1.4 Mapインスタンスのプロパティ

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

24.1.5 Map Iteratorオブジェクト

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

24.1.5.1 CreateMapIterator ( map, kind )

The abstract operation CreateMapIterator takes arguments map (ECMAScript言語値) and kind (key+valuekey、または value) and returns Generatorを含む正常完了またはスロー完了のいずれか. これは、そのようなイテレーターを返すMapメソッドのためにイテレーターオブジェクトを作成するために使用されます。 It performs the following steps when called:

  1. RequireInternalSlot(map, [[MapData]]) を実行する。
  2. closure を、mapkind を捕捉し、呼び出されたときに次の手順を実行する、パラメーターを持たない新しいAbstract Closureとする:
    1. entriesmap.[[MapData]] とする。
    2. index を 0 とする。
    3. numEntriesentries 内の要素数とする。
    4. index < numEntries の間、繰り返す:
      1. entryentries[index] とする。
      2. indexindex + 1 に設定する。
      3. entry.[[Key]]empty でない場合、次を行う:
        1. kindkey である場合、次を行う:
          1. resultentry.[[Key]] とする。
        2. そうでなく kindvalue である場合、次を行う:
          1. resultentry.[[Value]] とする。
        3. それ以外の場合、
          1. Assert: kindkey+value である。
          2. resultCreateArrayFromListentry.[[Key]], entry.[[Value]] ») とする。
        4. GeneratorYield(CreateIteratorResultObject(result, false)) を実行する。
        5. NOTE: GeneratorYieldによってこの抽象操作の実行が一時停止されている間に、entries 内の要素数が増加している可能性がある。
        6. numEntriesentries 内の要素数に設定する。
    5. NormalCompletion(unused) を返す。
  3. CreateIteratorFromClosure(closure, "%MapIteratorPrototype%", %MapIteratorPrototype%) を返す。

24.1.5.2 %MapIteratorPrototype%オブジェクト

%MapIteratorPrototype%オブジェクトは以下の通りです:

  • すべてのMap Iteratorオブジェクトによって継承されるプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]]内部スロットを持ち、その値は %Iterator.prototype% である。
  • 以下のプロパティを持つ:

24.1.5.2.1 %MapIteratorPrototype%.next ( )

  1. GeneratorResume(this value, empty, "%MapIteratorPrototype%") を返す。

24.1.5.2.2 %MapIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値はString値 "Map Iterator" です。

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

24.2 Setオブジェクト

SetオブジェクトはECMAScript言語値のコレクションです。Setは、各異なる値を高々1回だけ含むことができます。異なる値は、SameValueZero比較アルゴリズムの意味論を使用して区別されます。

Setオブジェクトは、平均してコレクション内の要素数に対してサブリニアなアクセス時間を提供するハッシュテーブルまたはその他の機構を使用して実装されなければなりません。この仕様で使用されるデータ構造は、Setオブジェクトに要求される観察可能な意味論を記述することのみを意図しています。実行可能な実装モデルであることは意図していません。

24.2.1 Setオブジェクトのための抽象操作

24.2.1.1 Set Record

Set Recordは、Setまたは類似オブジェクトのインターフェースをカプセル化するために使用されるRecord値です。

Set Recordは、Table 71 に列挙されるフィールドを持ちます。

Table 71: Set Record Fields
フィールド名 意味
[[SetObject]] Object Setまたは類似オブジェクト。
[[Size]] 非負整数または +∞ オブジェクトの報告されるサイズ。
[[Has]] 関数オブジェクト オブジェクトのhasメソッド。
[[Keys]] 関数オブジェクト オブジェクトのkeysメソッド。

24.2.1.2 GetSetRecord ( obj )

The abstract operation GetSetRecord takes argument obj (ECMAScript言語値) and returns Set Recordを含む正常完了またはスロー完了のいずれか. It performs the following steps when called:

  1. obj がObjectでない場合、TypeError 例外をスローする。
  2. rawSize を ? Get(obj, "size") とする。
  3. numSize を ? ToNumber(rawSize) とする。
  4. NOTE: rawSizeundefined である場合、numSizeNaN になる。
  5. numSizeNaN の場合、TypeError 例外をスローする。
  6. intSize を ! ToIntegerOrInfinity(numSize) とする。
  7. intSize < 0 の場合、RangeError 例外をスローする。
  8. has を ? Get(obj, "has") とする。
  9. IsCallable(has) が false の場合、TypeError 例外をスローする。
  10. keys を ? Get(obj, "keys") とする。
  11. IsCallable(keys) が false の場合、TypeError 例外をスローする。
  12. 新しいSet Record { [[SetObject]]: obj, [[Size]]: intSize, [[Has]]: has, [[Keys]]: keys } を返す。

24.2.1.3 SetDataHas ( setData, value )

The abstract operation SetDataHas takes arguments setData (ECMAScript言語値または empty のいずれかのList) and value (ECMAScript言語値) and returns Boolean. It performs the following steps when called:

  1. SetDataIndex(setData, value) が not-found である場合、false を返す。
  2. true を返す。

24.2.1.4 SetDataIndex ( setData, value )

The abstract operation SetDataIndex takes arguments setData (ECMAScript言語値または empty のいずれかのList) and value (ECMAScript言語値) and returns 非負整数または not-found. It performs the following steps when called:

  1. valueCanonicalizeKeyedCollectionKey(value) に設定する。
  2. sizesetData 内の要素数とする。
  3. index を 0 とする。
  4. index < size の間、繰り返す:
    1. esetData[index] とする。
    2. eempty でなく、evalue である場合、次を行う:
      1. index を返す。
    3. indexindex + 1 に設定する。
  5. not-found を返す。

24.2.1.5 SetDataSize ( setData )

The abstract operation SetDataSize takes argument setData (ECMAScript言語値または empty のいずれかのList) and returns 非負整数. It performs the following steps when called:

  1. count を 0 とする。
  2. setData の各要素 e について、次を行う:
    1. eempty でない場合、countcount + 1 に設定する。
  3. count を返す。

24.2.2 Setコンストラクター

Setコンストラクターは以下の通りです:

  • %Set%である。
  • グローバルオブジェクト"Set"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいSetオブジェクトを作成して初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローする。
  • クラス定義のextends節の値として使用できる。指定されたSetの動作を継承することを意図するサブクラスコンストラクターは、Set.prototype組み込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するために、Setコンストラクターへのsuper呼び出しを含めなければならない。

24.2.2.1 Set ( [ iterable ] )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. set を ? OrdinaryCreateFromConstructor(NewTarget, "%Set.prototype%", « [[SetData]] ») とする。
  3. set.[[SetData]] を新しい空のListに設定する。
  4. iterableundefined または null のいずれかである場合、set を返す。
  5. adder を ? Get(set, "add") とする。
  6. IsCallable(adder) が false の場合、TypeError 例外をスローする。
  7. iteratorRecord を ? GetIterator(iterable, sync) とする。
  8. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone の場合、set を返す。
    3. statusCompletion(Call(adder, set, « next »)) とする。
    4. IfAbruptCloseIterator(status, iteratorRecord)。

24.2.3 Setコンストラクターのプロパティ

Setコンストラクターは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

24.2.3.1 Set.prototype

Set.prototypeの初期値はSetプロトタイプオブジェクトです。

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

24.2.3.2 get Set [ %Symbol.species% ]

Set[%Symbol.species%]は、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. this値を返す。

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

Note

派生コレクションオブジェクトを作成するメソッドは、派生オブジェクトを作成するために使用するコンストラクターを決定するため、%Symbol.species% を呼び出すべきです。サブクラスコンストラクターは、既定のコンストラクター割り当てを変更するために %Symbol.species% を上書きできます。

24.2.4 Setプロトタイプオブジェクトのプロパティ

Setプロトタイプオブジェクトは以下の通りです:

  • %Set.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[SetData]]内部スロットを持たない。

24.2.4.1 Set.prototype.add ( value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. valueCanonicalizeKeyedCollectionKey(value) に設定する。
  4. set.[[SetData]] の各要素 entry について、次を行う:
    1. entryempty でなく、SameValue(entry, value) が true である場合、次を行う:
      1. set を返す。
  5. valueset.[[SetData]] に追加する。
  6. set を返す。

24.2.4.2 Set.prototype.clear ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. set.[[SetData]] の各要素 entry について、次を行う:
    1. 値が entry である set.[[SetData]] の要素を、値が empty である要素で置き換える。
  4. undefined を返す。
Note

既存の[[SetData]] Listは保持されます。なぜなら、そのListの反復途中で中断されている既存のSet Iteratorオブジェクトが存在する可能性があるためです。

24.2.4.3 Set.prototype.constructor

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

24.2.4.4 Set.prototype.delete ( value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. valueCanonicalizeKeyedCollectionKey(value) に設定する。
  4. set.[[SetData]] の各要素 entry について、次を行う:
    1. entryempty でなく、SameValue(entry, value) が true である場合、次を行う:
      1. 値が entry である set.[[SetData]] の要素を、値が empty である要素で置き換える。
      2. true を返す。
  5. false を返す。
Note

empty は、エントリーが削除されたことを示す仕様上の道具として使用されます。実際の実装は、内部データ構造からエントリーを物理的に削除するなど、他の処理を行ってもよいです。

24.2.4.5 Set.prototype.difference ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. resultSetDataset.[[SetData]] のコピーとする。
  5. SetDataSize(set.[[SetData]]) ≤ otherRec.[[Size]] の場合、次を行う:
    1. thisSizeset.[[SetData]] 内の要素数とする。
    2. index を 0 とする。
    3. index < thisSize の間、繰り返す:
      1. entryresultSetData[index] とする。
      2. entryempty でない場合、次を行う:
        1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « entry »)) とする。
        2. inOthertrue である場合、次を行う:
          1. resultSetData[index] を empty に設定する。
      3. indexindex + 1 に設定する。
  6. それ以外の場合、
    1. keysIter を ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]) とする。
    2. nextnot-started とする。
    3. nextdone でない間、繰り返す:
      1. next を ? IteratorStepValue(keysIter) に設定する。
      2. nextdone でない場合、次を行う:
        1. nextCanonicalizeKeyedCollectionKey(next) に設定する。
        2. valueIndexSetDataIndex(resultSetData, next) とする。
        3. valueIndexnot-found でない場合、次を行う:
          1. resultSetData[valueIndex] を empty に設定する。
  7. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») とする。
  8. result.[[SetData]]resultSetData に設定する。
  9. result を返す。

24.2.4.6 Set.prototype.entries ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. CreateSetIterator(set, key+value) を返す。
Note

反復目的では、Setは各エントリーがキーと値に同じ値を持つMapに似て見えます。

24.2.4.7 Set.prototype.forEach ( callback [ , thisArg ] )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  4. entriesset.[[SetData]] とする。
  5. numEntriesentries 内の要素数とする。
  6. index を 0 とする。
  7. index < numEntries の間、繰り返す:
    1. entryentries[index] とする。
    2. indexindex + 1 に設定する。
    3. entryempty でない場合、次を行う:
      1. Call(callback, thisArg, « entry, entry, set ») を実行する。
      2. NOTE: callback の実行中に entries 内の要素数が増加している可能性がある。
      3. numEntriesentries 内の要素数に設定する。
  8. undefined を返す。
Note

callback は3つの引数を受け取る関数であるべきです。forEachは、Setオブジェクト内に存在する各値について、値の挿入順に callback を1回ずつ呼び出します。callback は実際に存在するSetの値についてのみ呼び出され、setから削除されたキーについては呼び出されません。

thisArg パラメーターが提供された場合、それは callback の各呼び出しのthis値として使用されます。提供されない場合、代わりに undefined が使用されます。

callback は3つの引数で呼び出されます。最初の2つの引数はSetに含まれる値です。同じ値が両方の引数に渡されます。走査されているSetオブジェクトは第3引数として渡されます。

callback が3つの引数で呼び出されるのは、MapおよびArrayのforEachメソッドで使用されるコールバック関数と整合させるためです。Setでは、各項目値はキーでも値でもあるとみなされます。

forEachは、それが呼び出されたオブジェクトを直接変更しませんが、callback の呼び出しによってそのオブジェクトが変更される可能性があります。

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

24.2.4.8 Set.prototype.has ( value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. valueCanonicalizeKeyedCollectionKey(value) に設定する。
  4. set.[[SetData]] の各要素 entry について、次を行う:
    1. entryempty でなく、SameValue(entry, value) が true である場合、true を返す。
  5. false を返す。

24.2.4.9 Set.prototype.intersection ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. resultSetData を新しい空のListとする。
  5. SetDataSize(set.[[SetData]]) ≤ otherRec.[[Size]] の場合、次を行う:
    1. thisSizeset.[[SetData]] 内の要素数とする。
    2. index を 0 とする。
    3. index < thisSize の間、繰り返す:
      1. entryset.[[SetData]][index] とする。
      2. indexindex + 1 に設定する。
      3. entryempty でない場合、次を行う:
        1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « entry »)) とする。
        2. inOthertrue である場合、次を行う:
          1. NOTE: otherRec.[[Has]] への以前の呼び出しが set.[[SetData]] の要素を削除して再追加する可能性があり、それによりこの反復中に同じ要素が2回訪問されることがある。
          2. SetDataHas(resultSetData, entry) が false である場合、次を行う:
            1. entryresultSetData に追加する。
        3. NOTE: otherRec.[[Has]] の実行中に set.[[SetData]] 内の要素数が増加している可能性がある。
        4. thisSizeset.[[SetData]] 内の要素数に設定する。
  6. それ以外の場合、
    1. keysIter を ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]) とする。
    2. nextnot-started とする。
    3. nextdone でない間、繰り返す:
      1. next を ? IteratorStepValue(keysIter) に設定する。
      2. nextdone でない場合、次を行う:
        1. nextCanonicalizeKeyedCollectionKey(next) に設定する。
        2. inThisSetDataHas(set.[[SetData]], next) とする。
        3. inThistrue である場合、次を行う:
          1. NOTE: other は任意のオブジェクトであるため、その"keys"イテレーターが同じ値を複数回生成する可能性がある。
          2. SetDataHas(resultSetData, next) が false である場合、次を行う:
            1. nextresultSetData に追加する。
  7. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») とする。
  8. result.[[SetData]]resultSetData に設定する。
  9. result を返す。

24.2.4.10 Set.prototype.isDisjointFrom ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. SetDataSize(set.[[SetData]]) ≤ otherRec.[[Size]] の場合、次を行う:
    1. thisSizeset.[[SetData]] 内の要素数とする。
    2. index を 0 とする。
    3. index < thisSize の間、繰り返す:
      1. entryset.[[SetData]][index] とする。
      2. indexindex + 1 に設定する。
      3. entryempty でない場合、次を行う:
        1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « entry »)) とする。
        2. inOthertrue である場合、false を返す。
        3. NOTE: otherRec.[[Has]] の実行中に set.[[SetData]] 内の要素数が増加している可能性がある。
        4. thisSizeset.[[SetData]] 内の要素数に設定する。
  5. それ以外の場合、
    1. keysIter を ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]) とする。
    2. nextnot-started とする。
    3. nextdone でない間、繰り返す:
      1. next を ? IteratorStepValue(keysIter) に設定する。
      2. nextdone でない場合、次を行う:
        1. SetDataHas(set.[[SetData]], next) が true である場合、次を行う:
          1. IteratorClose(keysIter, NormalCompletion(unused)) を実行する。
          2. false を返す。
  6. true を返す。

24.2.4.11 Set.prototype.isSubsetOf ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. SetDataSize(set.[[SetData]]) > otherRec.[[Size]] の場合、false を返す。
  5. thisSizeset.[[SetData]] 内の要素数とする。
  6. index を 0 とする。
  7. index < thisSize の間、繰り返す:
    1. entryset.[[SetData]][index] とする。
    2. indexindex + 1 に設定する。
    3. entryempty でない場合、次を行う:
      1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « entry »)) とする。
      2. inOtherfalse である場合、false を返す。
      3. NOTE: otherRec.[[Has]] の実行中に set.[[SetData]] 内の要素数が増加している可能性がある。
      4. thisSizeset.[[SetData]] 内の要素数に設定する。
  8. true を返す。

24.2.4.12 Set.prototype.isSupersetOf ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. SetDataSize(set.[[SetData]]) < otherRec.[[Size]] の場合、false を返す。
  5. keysIter を ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]) とする。
  6. nextnot-started とする。
  7. nextdone でない間、繰り返す:
    1. next を ? IteratorStepValue(keysIter) に設定する。
    2. nextdone でない場合、次を行う:
      1. SetDataHas(set.[[SetData]], next) が false である場合、次を行う:
        1. IteratorClose(keysIter, NormalCompletion(unused)) を実行する。
        2. false を返す。
  8. true を返す。

24.2.4.13 Set.prototype.keys ( )

"keys"プロパティの初期値は、24.2.4.17 で定義される %Set.prototype.values% です。

Note

反復目的では、Setは各エントリーがキーと値に同じ値を持つMapに似て見えます。

24.2.4.14 get Set.prototype.size

Set.prototype.sizeは、setアクセサー関数が undefined であるアクセサープロパティです。そのgetアクセサー関数は呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. sizeSetDataSize(set.[[SetData]]) とする。
  4. 𝔽(size) を返す。

24.2.4.15 Set.prototype.symmetricDifference ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. keysIter を ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]) とする。
  5. resultSetDataset.[[SetData]] のコピーとする。
  6. nextnot-started とする。
  7. nextdone でない間、繰り返す:
    1. next を ? IteratorStepValue(keysIter) に設定する。
    2. nextdone でない場合、次を行う:
      1. nextCanonicalizeKeyedCollectionKey(next) に設定する。
      2. resultIndexSetDataIndex(resultSetData, next) とする。
      3. resultIndexnot-found である場合、alreadyInResultfalse とする。そうでない場合、alreadyInResulttrue とする。
      4. SetDataHas(set.[[SetData]], next) が true である場合、次を行う:
        1. alreadyInResulttrue である場合、resultSetData[resultIndex] を empty に設定する。
      5. それ以外の場合、
        1. alreadyInResultfalse である場合、nextresultSetData に追加する。
  8. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») とする。
  9. result.[[SetData]]resultSetData に設定する。
  10. result を返す。

24.2.4.16 Set.prototype.union ( other )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRec を ? GetSetRecord(other) とする。
  4. keysIter を ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]) とする。
  5. resultSetDataset.[[SetData]] のコピーとする。
  6. nextnot-started とする。
  7. nextdone でない間、繰り返す:
    1. next を ? IteratorStepValue(keysIter) に設定する。
    2. nextdone でない場合、次を行う:
      1. nextCanonicalizeKeyedCollectionKey(next) に設定する。
      2. SetDataHas(resultSetData, next) が false である場合、次を行う:
        1. nextresultSetData に追加する。
  8. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») とする。
  9. result.[[SetData]]resultSetData に設定する。
  10. result を返す。

24.2.4.17 Set.prototype.values ( )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. setthis値とする。
  2. CreateSetIterator(set, value) を返す。

24.2.4.18 Set.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator%プロパティの初期値は、24.2.4.17 で定義される %Set.prototype.values% です。

24.2.4.19 Set.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値はString値 "Set" です。

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

24.2.5 Setインスタンスのプロパティ

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

24.2.6 Set Iteratorオブジェクト

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

24.2.6.1 CreateSetIterator ( set, kind )

The abstract operation CreateSetIterator takes arguments set (ECMAScript言語値) and kind (key+value または value) and returns Generatorを含む正常完了またはスロー完了のいずれか. これは、そのようなイテレーターを返すSetメソッドのためにイテレーターオブジェクトを作成するために使用されます。 It performs the following steps when called:

  1. RequireInternalSlot(set, [[SetData]]) を実行する。
  2. closure を、setkind を捕捉し、呼び出されたときに次の手順を実行する、パラメーターを持たない新しいAbstract Closureとする:
    1. index を 0 とする。
    2. entriesset.[[SetData]] とする。
    3. numEntriesentries 内の要素数とする。
    4. index < numEntries の間、繰り返す:
      1. entryentries[index] とする。
      2. indexindex + 1 に設定する。
      3. entryempty でない場合、次を行う:
        1. kindkey+value である場合、次を行う:
          1. resultCreateArrayFromListentry, entry ») とする。
          2. GeneratorYield(CreateIteratorResultObject(result, false)) を実行する。
        2. それ以外の場合、
          1. Assert: kindvalue である。
          2. GeneratorYield(CreateIteratorResultObject(entry, false)) を実行する。
        3. NOTE: GeneratorYieldによってこの抽象操作の実行が一時停止されている間に、entries 内の要素数が増加している可能性がある。
        4. numEntriesentries 内の要素数に設定する。
    5. NormalCompletion(unused) を返す。
  3. CreateIteratorFromClosure(closure, "%SetIteratorPrototype%", %SetIteratorPrototype%) を返す。

24.2.6.2 %SetIteratorPrototype%オブジェクト

%SetIteratorPrototype%オブジェクトは以下の通りです:

  • すべてのSet Iteratorオブジェクトによって継承されるプロパティを持つ。
  • 通常のオブジェクトである。
  • [[Prototype]]内部スロットを持ち、その値は %Iterator.prototype% である。
  • 以下のプロパティを持つ:

24.2.6.2.1 %SetIteratorPrototype%.next ( )

  1. GeneratorResume(this value, empty, "%SetIteratorPrototype%") を返す。

24.2.6.2.2 %SetIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値はString値 "Set Iterator" です。

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

24.3 WeakMapオブジェクト

WeakMapは、キーがオブジェクトおよび/またはシンボルであり、値が任意のECMAScript言語値であってよいキー/値ペアのコレクションです。WeakMapは、特定のキーを持つキー/値ペアを含むかどうかを問い合わせることができますが、それがキーとして保持する値を列挙する機構は提供されません。特定の条件では、liveでない値は、9.9.3 に記述されるように、WeakMapキーとして削除されます。

実装は、WeakMapのキー/値ペアがアクセス不能になった時点から、そのキー/値ペアがWeakMapから削除される時点までの間に、任意に決定された遅延を課してもよいです。この遅延がECMAScriptプログラムから観察可能であった場合、それはプログラム実行に影響し得る不確定性の源となります。そのため、ECMAScript実装は、観察者が観察対象のキーを提示することを要求しない方法でWeakMapのキーを観察する手段を提供してはなりません。

WeakMapは、平均してコレクション内のキー/値ペア数に対してサブリニアなアクセス時間を提供するハッシュテーブルまたはその他の機構を使用して実装されなければなりません。この仕様で使用されるデータ構造は、WeakMapに要求される観察可能な意味論を記述することのみを意図しています。実行可能な実装モデルであることは意図していません。

Note

WeakMapおよびWeakSetは、WeakMapまたはWeakSetインスタンスが存在しない場合にはそのオブジェクトまたはシンボルがアクセス不能になり、実装のガベージコレクション機構によるリソース回収の対象となるような状況で、メモリリソースを「リーク」しない方法で、オブジェクトまたはシンボルに状態を動的に関連付けるための機構を提供することを意図しています。この特性は、WeakMapまたはWeakSetインスタンスからキーへの、オブジェクト/シンボルごとの反転マッピングを使用することで達成できます。あるいは、各WeakMapまたはWeakSetインスタンスが内部的にそのキーおよび値データを格納してもよいですが、この方法ではWeakMapまたはWeakSetの実装とガベージコレクターの間の調整が必要です。以下の参照文献は、WeakMapおよびWeakSetの実装に有用である可能性のある機構を記述しています:

Barry Hayes. 1997. Ephemerons: a new finalization mechanism. In Proceedings of the 12th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications (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, Eliminating Cycles in Weak Tables. 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

24.3.1 WeakMapコンストラクター

WeakMapコンストラクターは以下の通りです:

  • %WeakMap%である。
  • グローバルオブジェクト"WeakMap"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいWeakMapを作成して初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローする。
  • クラス定義のextends節の値として使用できる。指定されたWeakMapの動作を継承することを意図するサブクラスコンストラクターは、WeakMap.prototype組み込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するために、WeakMapコンストラクターへのsuper呼び出しを含めなければならない。

24.3.1.1 WeakMap ( [ iterable ] )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. map を ? OrdinaryCreateFromConstructor(NewTarget, "%WeakMap.prototype%", « [[WeakMapData]] ») とする。
  3. map.[[WeakMapData]] を新しい空のListに設定する。
  4. iterableundefined または null のいずれかである場合、map を返す。
  5. adder を ? Get(map, "set") とする。
  6. IsCallable(adder) が false の場合、TypeError 例外をスローする。
  7. AddEntriesFromIterable(map, iterable, adder) を返す。
Note

パラメーター iterable が存在する場合、それは、WeakMapキーとして使用される値を第1要素とし、そのキーに関連付ける値を第2要素とする2要素のarray-like objectを生成するイテレーターオブジェクトを返す %Symbol.iterator% メソッドを実装するオブジェクトであることが期待されます。

24.3.2 WeakMapコンストラクターのプロパティ

WeakMapコンストラクターは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

24.3.2.1 WeakMap.prototype

WeakMap.prototypeの初期値はWeakMapプロトタイプオブジェクトです。

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

24.3.3 WeakMapプロトタイプオブジェクトのプロパティ

WeakMapプロトタイプオブジェクトは以下の通りです:

  • %WeakMap.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[WeakMapData]]内部スロットを持たない。

24.3.3.1 WeakMap.prototype.constructor

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

24.3.3.2 WeakMap.prototype.delete ( key )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakMapthis値とする。
  2. RequireInternalSlot(weakMap, [[WeakMapData]]) を実行する。
  3. CanBeHeldWeakly(key) が false の場合、false を返す。
  4. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、次を行う:
      1. entry.[[Key]]empty に設定する。
      2. entry.[[Value]]empty に設定する。
      3. true を返す。
  5. false を返す。
Note

empty は、エントリーが削除されたことを示す仕様上の道具として使用されます。実際の実装は、内部データ構造からエントリーを物理的に削除するなど、他の処理を行ってもよいです。

24.3.3.3 WeakMap.prototype.get ( key )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakMapthis値とする。
  2. RequireInternalSlot(weakMap, [[WeakMapData]]) を実行する。
  3. CanBeHeldWeakly(key) が false の場合、undefined を返す。
  4. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、entry.[[Value]] を返す。
  5. undefined を返す。

24.3.3.4 WeakMap.prototype.getOrInsert ( key, value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakMapthis値とする。
  2. RequireInternalSlot(weakMap, [[WeakMapData]]) を実行する。
  3. CanBeHeldWeakly(key) が false の場合、TypeError 例外をスローする。
  4. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、entry.[[Value]] を返す。
  5. entryRecord { [[Key]]: key, [[Value]]: value } とする。
  6. entryweakMap.[[WeakMapData]] に追加する。
  7. value を返す。

24.3.3.5 WeakMap.prototype.getOrInsertComputed ( key, callback )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakMapthis値とする。
  2. RequireInternalSlot(weakMap, [[WeakMapData]]) を実行する。
  3. CanBeHeldWeakly(key) が false の場合、TypeError 例外をスローする。
  4. IsCallable(callback) が false の場合、TypeError 例外をスローする。
  5. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、entry.[[Value]] を返す。
  6. value を ? Call(callback, undefined, « key ») とする。
  7. NOTE: callback の実行中にWeakMapが変更されている可能性がある。
  8. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、次を行う:
      1. entry.[[Value]]value に設定する。
      2. value を返す。
  9. entryRecord { [[Key]]: key, [[Value]]: value } とする。
  10. entryweakMap.[[WeakMapData]] に追加する。
  11. value を返す。

24.3.3.6 WeakMap.prototype.has ( key )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakMapthis値とする。
  2. RequireInternalSlot(weakMap, [[WeakMapData]]) を実行する。
  3. CanBeHeldWeakly(key) が false の場合、false を返す。
  4. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、true を返す。
  5. false を返す。

24.3.3.7 WeakMap.prototype.set ( key, value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakMapthis値とする。
  2. RequireInternalSlot(weakMap, [[WeakMapData]]) を実行する。
  3. CanBeHeldWeakly(key) が false の場合、TypeError 例外をスローする。
  4. weakMap.[[WeakMapData]] の各Record { [[Key]], [[Value]] } entry について、次を行う:
    1. entry.[[Key]]empty でなく、SameValue(entry.[[Key]], key) が true である場合、次を行う:
      1. entry.[[Value]]value に設定する。
      2. weakMap を返す。
  5. entryRecord { [[Key]]: key, [[Value]]: value } とする。
  6. entryweakMap.[[WeakMapData]] に追加する。
  7. weakMap を返す。

24.3.3.8 WeakMap.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値はString値 "WeakMap" です。

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

24.3.4 WeakMapインスタンスのプロパティ

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

24.4 WeakSetオブジェクト

WeakSetはオブジェクトおよび/またはシンボルのコレクションです。異なるオブジェクトまたはシンボルは、WeakSetのコレクションの要素として一度だけ出現できます。WeakSetは、特定の値を含むかどうかを問い合わせることができますが、それが保持する値を列挙する機構は提供されません。特定の条件では、liveでない値は、9.9.3 に記述されるように、WeakSet要素として削除されます。

実装は、WeakSetに含まれる値がアクセス不能になった時点から、その値がWeakSetから削除される時点までの間に、任意に決定された遅延を課してもよいです。この遅延がECMAScriptプログラムから観察可能であった場合、それはプログラム実行に影響し得る不確定性の源となります。そのため、ECMAScript実装は、観察者が観察対象の値を提示することを要求しない方法で、WeakSetが特定の値を含むかどうかを判定する手段を提供してはなりません。

WeakSetは、平均してコレクション内の要素数に対してサブリニアなアクセス時間を提供するハッシュテーブルまたはその他の機構を使用して実装されなければなりません。この仕様で使用されるデータ構造は、WeakSetに要求される観察可能な意味論を記述することのみを意図しています。実行可能な実装モデルであることは意図していません。

Note

24.3NOTEを参照してください。

24.4.1 WeakSetコンストラクター

WeakSetコンストラクターは以下の通りです:

  • %WeakSet%である。
  • グローバルオブジェクト"WeakSet"プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しいWeakSetを作成して初期化する。
  • 関数として呼び出されることを意図しておらず、そのように呼び出された場合は例外をスローする。
  • クラス定義のextends節の値として使用できる。指定されたWeakSetの動作を継承することを意図するサブクラスコンストラクターは、WeakSet.prototype組み込みメソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成して初期化するために、WeakSetコンストラクターへのsuper呼び出しを含めなければならない。

24.4.1.1 WeakSet ( [ iterable ] )

この関数は呼び出されたとき、次の手順を実行します:

  1. NewTarget が undefined の場合、TypeError 例外をスローする。
  2. set を ? OrdinaryCreateFromConstructor(NewTarget, "%WeakSet.prototype%", « [[WeakSetData]] ») とする。
  3. set.[[WeakSetData]] を新しい空のListに設定する。
  4. iterableundefined または null のいずれかである場合、set を返す。
  5. adder を ? Get(set, "add") とする。
  6. IsCallable(adder) が false の場合、TypeError 例外をスローする。
  7. iteratorRecord を ? GetIterator(iterable, sync) とする。
  8. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone の場合、set を返す。
    3. statusCompletion(Call(adder, set, « next »)) とする。
    4. IfAbruptCloseIterator(status, iteratorRecord)。

24.4.2 WeakSetコンストラクターのプロパティ

WeakSetコンストラクターは以下の通りです:

  • [[Prototype]]内部スロットを持ち、その値は %Function.prototype% である。
  • 以下のプロパティを持つ:

24.4.2.1 WeakSet.prototype

WeakSet.prototypeの初期値はWeakSetプロトタイプオブジェクトです。

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

24.4.3 WeakSetプロトタイプオブジェクトのプロパティ

WeakSetプロトタイプオブジェクトは以下の通りです:

  • %WeakSet.prototype%である。
  • [[Prototype]]内部スロットを持ち、その値は %Object.prototype% である。
  • 通常のオブジェクトである。
  • [[WeakSetData]]内部スロットを持たない。

24.4.3.1 WeakSet.prototype.add ( value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakSetthis値とする。
  2. RequireInternalSlot(weakSet, [[WeakSetData]]) を実行する。
  3. CanBeHeldWeakly(value) が false の場合、TypeError 例外をスローする。
  4. weakSet.[[WeakSetData]] の各要素 entry について、次を行う:
    1. entryempty でなく、SameValue(entry, value) が true である場合、次を行う:
      1. weakSet を返す。
  5. valueweakSet.[[WeakSetData]] に追加する。
  6. weakSet を返す。

24.4.3.2 WeakSet.prototype.constructor

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

24.4.3.3 WeakSet.prototype.delete ( value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakSetthis値とする。
  2. RequireInternalSlot(weakSet, [[WeakSetData]]) を実行する。
  3. CanBeHeldWeakly(value) が false の場合、false を返す。
  4. weakSet.[[WeakSetData]] の各要素 entry について、次を行う:
    1. entryempty でなく、SameValue(entry, value) が true である場合、次を行う:
      1. 値が entry である weakSet.[[WeakSetData]] の要素を、値が empty である要素で置き換える。
      2. true を返す。
  5. false を返す。
Note

empty は、エントリーが削除されたことを示す仕様上の道具として使用されます。実際の実装は、内部データ構造からエントリーを物理的に削除するなど、他の処理を行ってもよいです。

24.4.3.4 WeakSet.prototype.has ( value )

このメソッドは呼び出されたとき、次の手順を実行します:

  1. weakSetthis値とする。
  2. RequireInternalSlot(weakSet, [[WeakSetData]]) を実行する。
  3. CanBeHeldWeakly(value) が false の場合、false を返す。
  4. weakSet.[[WeakSetData]] の各要素 entry について、次を行う:
    1. entryempty でなく、SameValue(entry, value) が true である場合、true を返す。
  5. false を返す。

24.4.3.5 WeakSet.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag%プロパティの初期値はString値 "WeakSet" です。

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

24.4.4 WeakSetインスタンスのプロパティ

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

24.5 キー付きコレクションのための抽象操作

24.5.1 CanonicalizeKeyedCollectionKey ( key )

The abstract operation CanonicalizeKeyedCollectionKey takes argument key (ECMAScript言語値) and returns ECMAScript言語値. It performs the following steps when called:

  1. key-0𝔽 の場合、+0𝔽 を返す。
  2. key を返す。