ページ表示設定

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. iterable が undefined または null のいずれかである場合、map を返す。
  5. adder を ? Get(map, "set") とする。
  6. IsCallable(adder) が false である場合、TypeError 例外をスローする。
  7. ? AddEntriesFromIterable(map, iterable, adder) を返す。
注

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

24.1.1.2 AddEntriesFromIterable ( target, iterable, adder )

抽象操作 AddEntriesFromIterable。引数 target (Object)、iterable (an ECMAScript language value, but not undefined or null) および adder (関数オブジェクト)。戻り値:(正常完了 (値:Object) または throw 完了)。 adder は target を receiver として呼び出されます。 呼び出されると、次の手順を実行する。

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

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

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

Map コンストラクターは:

  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持ちます。
  • 次のプロパティを持ちます。

24.1.2.1 Map.groupBy ( items, callback )

注

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. elements を CreateArrayFromList(group.[[Elements]]) とする。
    2. entry を Record { [[Key]]: group.[[Key]], [[Value]]: elements } とする。
    3. entry を map.[[MapData]] に追加する。
  4. map を返す。

24.1.2.2 Map.prototype

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

このプロパティは属性 { [[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]" です。

注

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

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

Map prototype オブジェクトは:

24.1.3.1 Map.prototype.clear ( )

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

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

既存の [[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. map を this 値とする。
  2. ? RequireInternalSlot(map, [[MapData]]) を実行する。
  3. key を CanonicalizeKeyedCollectionKey(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 を返す。
注

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

24.1.3.4 Map.prototype.entries ( )

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

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

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

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

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

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

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

callback は、項目の値、項目のキー、および走査中の Map という3つの引数で呼び出されます。

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

24.1.3.6 Map.prototype.get ( key )

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

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

24.1.3.8 Map.prototype.getOrInsertComputed ( key, callback )

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

  1. map を this 値とする。
  2. ? RequireInternalSlot(map, [[MapData]]) を実行する。
  3. IsCallable(callback) が false である場合、TypeError 例外をスローする。
  4. key を CanonicalizeKeyedCollectionKey(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. 注記: 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. entry を Record { [[Key]]: key, [[Value]]: value } とする。
  10. entry を map.[[MapData]] に追加する。
  11. value を返す。

24.1.3.9 Map.prototype.has ( key )

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

  1. map を this 値とする。
  2. ? RequireInternalSlot(map, [[MapData]]) を実行する。
  3. key を CanonicalizeKeyedCollectionKey(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. map を this 値とする。
  2. ? CreateMapIterator(map, key) を返す。

24.1.3.11 Map.prototype.set ( key, value )

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

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

24.1.3.12 get Map.prototype.size

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

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

24.1.3.13 Map.prototype.values ( )

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

  1. map を this 値とする。
  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 prototype オブジェクトからプロパティを継承する通常オブジェクトです。Map インスタンスは [[MapData]] 内部スロットも持ちます。

24.1.5 Map Iterator オブジェクト

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

24.1.5.1 CreateMapIterator ( map, kind )

抽象操作 CreateMapIterator。引数 map (ECMAScript 言語値) および kind ((key+value、key または value))。戻り値:(正常完了 (値:Generator) または throw 完了)。 そのような iterator を返す Map メソッドの iterator オブジェクトを作成するために使用されます。 呼び出されると、次の手順を実行する。

  1. ? RequireInternalSlot(map, [[MapData]]) を実行する。
  2. closure を、map と kind を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. entries を map.[[MapData]] とする。
    2. index を 0 とする。
    3. entriesCount を entries の要素数とする。
    4. index < entriesCount の間、次を繰り返す。
      1. entry を entries[index] とする。
      2. index を index + 1 に設定する。
      3. entry.[[Key]] が empty でない場合、
        1. kind が key である場合、
          1. result を entry.[[Key]] とする。
        2. そうでなく、kind が value である場合、
          1. result を entry.[[Value]] とする。
        3. そうでない場合、
          1. 表明: kind は key+value である。
          2. result を CreateArrayFromList(« entry.[[Key]], entry.[[Value]] ») とする。
        4. ? GeneratorYield(CreateIteratorResultObject(result, false)) を実行する。
        5. 注記: GeneratorYield によってこの抽象操作の実行が一時停止している間に、entries の要素数が増加している可能性がある。
        6. entriesCount を entries の要素数に設定する。
    5. NormalCompletion(unused) を返す。
  3. CreateIteratorFromClosure(closure, "%MapIteratorPrototype%", %MapIteratorPrototype%) を返す。

24.1.5.2 %MapIteratorPrototype% オブジェクト

%MapIteratorPrototype% オブジェクトは:

24.1.5.2.1 %MapIteratorPrototype%.next ( )

  1. ? GeneratorResume(this 値, 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 は 表 72 に列挙されるフィールドを持ちます。

表 72: Set Record のフィールド
フィールド名 値 意味
[[SetObject]] an Object Set または類似オブジェクト。
[[Size]] a non-negative integer or +∞ オブジェクトから報告されたサイズ。
[[Has]] a function object オブジェクトの has メソッド。
[[Keys]] a function object オブジェクトの keys メソッド。

24.2.1.2 GetSetRecord ( obj )

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

  1. obj が Object でない場合、TypeError 例外をスローする。
  2. rawSize を ? Get(obj, "size") とする。
  3. numberSize を ? ToNumber(rawSize) とする。
  4. 注記: rawSize が undefined である場合、numberSize は NaN になる。
  5. numberSize が NaN である場合、TypeError 例外をスローする。
  6. intSize を ! ToIntegerOrInfinity(numberSize) とする。
  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 )

抽象操作 SetDataHas。引数 setData (リスト (要素:(ECMAScript 言語値 または empty))) および value (ECMAScript 言語値)。戻り値:Boolean。 呼び出されると、次の手順を実行する。

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

24.2.1.4 SetDataIndex ( setData, value )

抽象操作 SetDataIndex。引数 setData (リスト (要素:(ECMAScript 言語値 または empty))) および value (ECMAScript 言語値)。戻り値:(非負整数 または not-found)。 呼び出されると、次の手順を実行する。

  1. value を CanonicalizeKeyedCollectionKey(value) に設定する。
  2. size を setData の要素数とする。
  3. index を 0 とする。
  4. index < size の間、次を繰り返す。
    1. element を setData[index] とする。
    2. element が empty でなく、element が value である場合、
      1. index を返す。
    3. index を index + 1 に設定する。
  5. not-found を返す。

24.2.1.5 SetDataSize ( setData )

抽象操作 SetDataSize。引数 setData (リスト (要素:(ECMAScript 言語値 または empty)))。戻り値:非負整数。 呼び出されると、次の手順を実行する。

  1. count を 0 とする。
  2. setData の各要素 element について、次を行う。
    1. element が empty でない場合、count を count + 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. iterable が undefined または null のいずれかである場合、set を返す。
  5. adder を ? Get(set, "add") とする。
  6. IsCallable(adder) が false である場合、TypeError 例外をスローする。
  7. iteratorRecord を ? GetIterator(iterable, sync) とする。
  8. 次を繰り返す。
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. next が done である場合、set を返す。
    3. status を Completion(Call(adder, set, « next »)) とする。
    4. IfAbruptCloseIterator(status, iteratorRecord)。

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

Set コンストラクターは:

  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持ちます。
  • 次のプロパティを持ちます。

24.2.3.1 Set.prototype

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

このプロパティは属性 { [[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]" です。

注

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

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

Set prototype オブジェクトは:

24.2.4.1 Set.prototype.add ( value )

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

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

24.2.4.2 Set.prototype.clear ( )

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

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

既存の [[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. set を this 値とする。
  2. ? RequireInternalSlot(set, [[SetData]]) を実行する。
  3. value を CanonicalizeKeyedCollectionKey(value) に設定する。
  4. set.[[SetData]] の各要素 entry について、次を行う。
    1. entry が empty でなく、SameValue(entry, value) が true である場合、
      1. 値が entry である set.[[SetData]] の要素を、値が empty である要素に置き換える。
      2. true を返す。
  5. false を返す。
注

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

24.2.4.5 Set.prototype.difference ( other )

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

  1. set を this 値とする。
  2. ? RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRecord を ? GetSetRecord(other) とする。
  4. resultSetData を set.[[SetData]] のコピーとする。
  5. SetDataSize(set.[[SetData]]) ≤ otherRecord.[[Size]] である場合、
    1. thisSize を set.[[SetData]] の要素数とする。
    2. index を 0 とする。
    3. index < thisSize の間、次を繰り返す。
      1. entry を resultSetData[index] とする。
      2. entry が empty でない場合、
        1. inOther を ToBoolean(? Call(otherRecord.[[Has]], otherRecord.[[SetObject]], « entry »)) とする。
        2. inOther が true である場合、
          1. resultSetData[index] を empty に設定する。
      3. index を index + 1 に設定する。
  6. そうでない場合、
    1. keysIterator を ? GetIteratorFromMethod(otherRecord.[[SetObject]], otherRecord.[[Keys]]) とする。
    2. next を not-started とする。
    3. next が done でない間、次を繰り返す。
      1. next を ? IteratorStepValue(keysIterator) に設定する。
      2. next が done でない場合、
        1. next を CanonicalizeKeyedCollectionKey(next) に設定する。
        2. valueIndex を SetDataIndex(resultSetData, next) とする。
        3. valueIndex が not-found でない場合、
          1. resultSetData[valueIndex] を empty に設定する。
  7. result を OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») とする。
  8. result.[[SetData]] を resultSetData に設定する。
  9. result を返す。

24.2.4.6 Set.prototype.entries ( )

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

  1. set を this 値とする。
  2. ? CreateSetIterator(set, key+value) を返す。
注

反復の目的では、Set は各エントリのキーと値が同じ値である Map に似たものとして見えます。

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

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

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

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

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

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

callback が3つの引数で呼び出されるのは、Map および Array の forEach メソッドで使用される callback 関数との一貫性を保つためです。Set では、各項目の値はキーと値の両方であるとみなされます。

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

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

24.2.4.8 Set.prototype.has ( value )

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

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

24.2.4.9 Set.prototype.intersection ( other )

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

  1. set を this 値とする。
  2. ? RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRecord を ? GetSetRecord(other) とする。
  4. resultSetData を新しい空の List とする。
  5. SetDataSize(set.[[SetData]]) ≤ otherRecord.[[Size]] である場合、
    1. thisSize を set.[[SetData]] の要素数とする。
    2. index を 0 とする。
    3. index < thisSize の間、次を繰り返す。
      1. entry を set.[[SetData]][index] とする。
      2. index を index + 1 に設定する。
      3. entry が empty でない場合、
        1. inOther を ToBoolean(? Call(otherRecord.[[Has]], otherRecord.[[SetObject]], « entry »)) とする。
        2. inOther が true である場合、
          1. 注記: 以前の otherRecord.[[Has]] 呼出しが set.[[SetData]] の要素を削除して再追加する可能性があり、それによってこの反復中に同じ要素が2回訪問される場合がある。
          2. SetDataHas(resultSetData, entry) が false である場合、
            1. entry を resultSetData に追加する。
        3. 注記: otherRecord.[[Has]] の実行中に set.[[SetData]] の要素数が増加している可能性がある。
        4. thisSize を set.[[SetData]] の要素数に設定する。
  6. そうでない場合、
    1. keysIterator を ? GetIteratorFromMethod(otherRecord.[[SetObject]], otherRecord.[[Keys]]) とする。
    2. next を not-started とする。
    3. next が done でない間、次を繰り返す。
      1. next を ? IteratorStepValue(keysIterator) に設定する。
      2. next が done でない場合、
        1. next を CanonicalizeKeyedCollectionKey(next) に設定する。
        2. inThis を SetDataHas(set.[[SetData]], next) とする。
        3. inThis が true である場合、
          1. 注記: other は任意のオブジェクトであるため、その "keys" iterator が同じ値を複数回生成する可能性がある。
          2. SetDataHas(resultSetData, next) が false である場合、
            1. next を resultSetData に追加する。
  7. result を OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») とする。
  8. result.[[SetData]] を resultSetData に設定する。
  9. result を返す。

24.2.4.10 Set.prototype.isDisjointFrom ( other )

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

  1. set を this 値とする。
  2. ? RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRecord を ? GetSetRecord(other) とする。
  4. SetDataSize(set.[[SetData]]) ≤ otherRecord.[[Size]] である場合、
    1. thisSize を set.[[SetData]] の要素数とする。
    2. index を 0 とする。
    3. index < thisSize の間、次を繰り返す。
      1. entry を set.[[SetData]][index] とする。
      2. index を index + 1 に設定する。
      3. entry が empty でない場合、
        1. inOther を ToBoolean(? Call(otherRecord.[[Has]], otherRecord.[[SetObject]], « entry »)) とする。
        2. inOther が true である場合、false を返す。
        3. 注記: otherRecord.[[Has]] の実行中に set.[[SetData]] の要素数が増加している可能性がある。
        4. thisSize を set.[[SetData]] の要素数に設定する。
  5. そうでない場合、
    1. keysIterator を ? GetIteratorFromMethod(otherRecord.[[SetObject]], otherRecord.[[Keys]]) とする。
    2. next を not-started とする。
    3. next が done でない間、次を繰り返す。
      1. next を ? IteratorStepValue(keysIterator) に設定する。
      2. next が done でない場合、
        1. SetDataHas(set.[[SetData]], next) が true である場合、
          1. ? IteratorClose(keysIterator, NormalCompletion(unused)) を実行する。
          2. false を返す。
  6. true を返す。

24.2.4.11 Set.prototype.isSubsetOf ( other )

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

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

24.2.4.12 Set.prototype.isSupersetOf ( other )

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

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

24.2.4.13 Set.prototype.keys ( )

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

注

反復の目的では、Set は各エントリのキーと値が同じ値である Map に似たものとして見えます。

24.2.4.14 get Set.prototype.size

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

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

24.2.4.15 Set.prototype.symmetricDifference ( other )

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

  1. set を this 値とする。
  2. ? RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRecord を ? GetSetRecord(other) とする。
  4. keysIterator を ? GetIteratorFromMethod(otherRecord.[[SetObject]], otherRecord.[[Keys]]) とする。
  5. resultSetData を set.[[SetData]] のコピーとする。
  6. next を not-started とする。
  7. next が done でない間、次を繰り返す。
    1. next を ? IteratorStepValue(keysIterator) に設定する。
    2. next が done でない場合、
      1. next を CanonicalizeKeyedCollectionKey(next) に設定する。
      2. resultIndex を SetDataIndex(resultSetData, next) とする。
      3. resultIndex が not-found である場合、alreadyInResult を false とする。そうでない場合、alreadyInResult を true とする。
      4. SetDataHas(set.[[SetData]], next) が true である場合、
        1. alreadyInResult が true である場合、resultSetData[resultIndex] を empty に設定する。
      5. そうでない場合、
        1. alreadyInResult が false である場合、next を resultSetData に追加する。
  8. result を OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») とする。
  9. result.[[SetData]] を resultSetData に設定する。
  10. result を返す。

24.2.4.16 Set.prototype.union ( other )

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

  1. set を this 値とする。
  2. ? RequireInternalSlot(set, [[SetData]]) を実行する。
  3. otherRecord を ? GetSetRecord(other) とする。
  4. keysIterator を ? GetIteratorFromMethod(otherRecord.[[SetObject]], otherRecord.[[Keys]]) とする。
  5. resultSetData を set.[[SetData]] のコピーとする。
  6. next を not-started とする。
  7. next が done でない間、次を繰り返す。
    1. next を ? IteratorStepValue(keysIterator) に設定する。
    2. next が done でない場合、
      1. next を CanonicalizeKeyedCollectionKey(next) に設定する。
      2. SetDataHas(resultSetData, next) が false である場合、
        1. next を resultSetData に追加する。
  8. result を OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] ») とする。
  9. result.[[SetData]] を resultSetData に設定する。
  10. result を返す。

24.2.4.17 Set.prototype.values ( )

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

  1. set を this 値とする。
  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 prototype オブジェクトからプロパティを継承する通常オブジェクトです。Set インスタンスは [[SetData]] 内部スロットも持ちます。

24.2.6 Set Iterator オブジェクト

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

24.2.6.1 CreateSetIterator ( set, kind )

抽象操作 CreateSetIterator。引数 set (ECMAScript 言語値) および kind ((key+value または value))。戻り値:(正常完了 (値:Generator) または throw 完了)。 そのような iterator を返す Set メソッドの iterator オブジェクトを作成するために使用されます。 呼び出されると、次の手順を実行する。

  1. ? RequireInternalSlot(set, [[SetData]]) を実行する。
  2. closure を、set と kind を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. index を 0 とする。
    2. entries を set.[[SetData]] とする。
    3. entriesCount を entries の要素数とする。
    4. index < entriesCount の間、次を繰り返す。
      1. entry を entries[index] とする。
      2. index を index + 1 に設定する。
      3. entry が empty でない場合、
        1. kind が key+value である場合、
          1. result を CreateArrayFromList(« entry, entry ») とする。
          2. ? GeneratorYield(CreateIteratorResultObject(result, false)) を実行する。
        2. そうでない場合、
          1. 表明: kind は value である。
          2. ? GeneratorYield(CreateIteratorResultObject(entry, false)) を実行する。
        3. 注記: GeneratorYield によってこの抽象操作の実行が一時停止している間に、entries の要素数が増加している可能性がある。
        4. entriesCount を entries の要素数に設定する。
    5. NormalCompletion(unused) を返す。
  3. CreateIteratorFromClosure(closure, "%SetIteratorPrototype%", %SetIteratorPrototype%) を返す。

24.2.6.2 %SetIteratorPrototype% オブジェクト

%SetIteratorPrototype% オブジェクトは:

24.2.6.2.1 %SetIteratorPrototype%.next ( )

  1. ? GeneratorResume(this 値, 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 に特定のキーを持つキーと値のペアが含まれているかどうかを問い合わせることはできますが、キーとして保持している値を列挙する機構は提供されません。特定の条件では、9.9.3 で説明するように、生存していない値は WeakMap のキーから削除されます。

実装は、WeakMap のキーと値のペアがアクセス不能になってから、そのキーと値のペアが WeakMap から削除されるまでの間に、任意に決定された遅延を設けてもかまいません。この遅延を ECMAScript プログラムから観測できると、プログラム実行に影響を与える不確定性の原因になります。そのため、ECMAScript 実装は、観測者が観測対象のキーを提示することを必要とせずに WeakMap のキーを観測する手段を提供してはなりません。

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

注

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. iterable が undefined または null のいずれかである場合、map を返す。
  5. adder を ? Get(map, "set") とする。
  6. IsCallable(adder) が false である場合、TypeError 例外をスローする。
  7. ? AddEntriesFromIterable(map, iterable, adder) を返す。
注

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

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

WeakMap コンストラクターは:

  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持ちます。
  • 次のプロパティを持ちます。

24.3.2.1 WeakMap.prototype

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

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

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

WeakMap prototype オブジェクトは:

24.3.3.1 WeakMap.prototype.constructor

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

24.3.3.2 WeakMap.prototype.delete ( key )

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

  1. weakMap を this 値とする。
  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 を返す。
注

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

24.3.3.3 WeakMap.prototype.get ( key )

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

  1. weakMap を this 値とする。
  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. weakMap を this 値とする。
  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. entry を Record { [[Key]]: key, [[Value]]: value } とする。
  6. entry を weakMap.[[WeakMapData]] に追加する。
  7. value を返す。

24.3.3.5 WeakMap.prototype.getOrInsertComputed ( key, callback )

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

  1. weakMap を this 値とする。
  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. 注記: 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. entry を Record { [[Key]]: key, [[Value]]: value } とする。
  10. entry を weakMap.[[WeakMapData]] に追加する。
  11. value を返す。

24.3.3.6 WeakMap.prototype.has ( key )

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

  1. weakMap を this 値とする。
  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. weakMap を this 値とする。
  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. entry を Record { [[Key]]: key, [[Value]]: value } とする。
  6. entry を weakMap.[[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 prototype オブジェクトからプロパティを継承する通常オブジェクトです。WeakMap インスタンスは [[WeakMapData]] 内部スロットも持ちます。

24.4 WeakSet オブジェクト

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

実装は、WeakSet に含まれる値がアクセス不能になってから、その値が WeakSet から削除されるまでの間に、任意に決定された遅延を設けてもかまいません。この遅延を ECMAScript プログラムから観測できると、プログラム実行に影響を与える不確定性の原因になります。そのため、ECMAScript 実装は、観測者が観測対象の値を提示することを必要とせずに WeakSet に特定の値が含まれるかどうかを判定する手段を提供してはなりません。

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

注

24.3 の注記を参照してください。

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. iterable が undefined または null のいずれかである場合、set を返す。
  5. adder を ? Get(set, "add") とする。
  6. IsCallable(adder) が false である場合、TypeError 例外をスローする。
  7. iteratorRecord を ? GetIterator(iterable, sync) とする。
  8. 次を繰り返す。
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. next が done である場合、set を返す。
    3. status を Completion(Call(adder, set, « next »)) とする。
    4. IfAbruptCloseIterator(status, iteratorRecord)。

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

WeakSet コンストラクターは:

  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持ちます。
  • 次のプロパティを持ちます。

24.4.2.1 WeakSet.prototype

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

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

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

WeakSet prototype オブジェクトは:

24.4.3.1 WeakSet.prototype.add ( value )

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

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

24.4.3.2 WeakSet.prototype.constructor

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

24.4.3.3 WeakSet.prototype.delete ( value )

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

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

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

24.4.3.4 WeakSet.prototype.has ( value )

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

  1. weakSet を this 値とする。
  2. ? RequireInternalSlot(weakSet, [[WeakSetData]]) を実行する。
  3. CanBeHeldWeakly(value) が false である場合、false を返す。
  4. weakSet.[[WeakSetData]] の各要素 entry について、次を行う。
    1. entry が empty でなく、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 prototype オブジェクトからプロパティを継承する通常オブジェクトです。WeakSet インスタンスは [[WeakSetData]] 内部スロットも持ちます。

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

24.5.1 CanonicalizeKeyedCollectionKey ( key )

抽象操作 CanonicalizeKeyedCollectionKey。引数 key (ECMAScript 言語値)。戻り値:ECMAScript 言語値。 呼び出されると、次の手順を実行する。

  1. key が -0𝔽 である場合、+0𝔽 を返す。
  2. key を返す。