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 が与えられる場合、それは %Symbol.iterator% メソッドを実装し、最初の要素が Map のキーとして用いられる値、2 番目の要素がそのキーに関連付ける値である 2 要素の配列ライクオブジェクトを生成するイテレータオブジェクトを返すオブジェクトであることが期待される。

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 ECMAScript language value or a throw completion. addertarget をレシーバとして呼び出される。 It performs the following steps when called:

  1. iteratorRecord を ? GetIterator(iterable, sync) とする。
  2. 繰り返し、
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone なら target を返す。
    3. next がオブジェクトでないなら
      1. errorThrowCompletion(新規 TypeError オブジェクト) とする。
      2. IteratorClose(iteratorRecord, error) を返す。
    4. kCompletion(Get(next, "0" )) とする。
    5. IfAbruptCloseIterator(k, iteratorRecord)。
    6. vCompletion(Get(next, "1" )) とする。
    7. IfAbruptCloseIterator(v, iteratorRecord)。
    8. statusCompletion(Call(adder, target, « k, v »)) とする。
    9. IfAbruptCloseIterator(status, iteratorRecord)。
Note

引数 iterable%Symbol.iterator% メソッドを実装し、最初の要素が Map のキー、2 番目の要素がそのキーに対応する値である 2 要素配列ライクを生成するイテレータオブジェクトを返すオブジェクトであることが期待される。

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

Map コンストラクター:

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

24.1.2.1 Map.groupBy ( items, callback )

Note

callback は 2 つの引数を受け取る関数であるべき。groupByitems の各要素に対し昇順で callback を 1 度ずつ呼び、新しい Map を構築する。callback が返した各値は Map のキーとして用いられる。そのキーごとに、結果 Map はそのキーをキーとし、callback がそのキーを返した全要素を含む配列を値とするエントリを持つ。

callback は 2 つの引数 (要素の値、要素のインデックス) で呼ばれる。

groupBy の戻り値は Map である。

この関数は呼び出し時に次を行う:

  1. groups を ? GroupBy(items, callback, collection) とする。
  2. map を ! Construct(%Map%) とする。
  3. Record { [[Key]], [[Elements]] } ggroups について
    1. elementsCreateArrayFromList(g.[[Elements]]) とする。
    2. entry を { [[Key]]: g.[[Key]], [[Value]]: elements } という Record とする。
    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. Mthis 値とする。
  2. RequireInternalSlot(M, [[MapData]]) を実行。
  3. Record { [[Key]], [[Value]] } pM.[[MapData]] について
    1. p.[[Key]]empty に設定。
    2. p.[[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. Mthis 値とする。
  2. RequireInternalSlot(M, [[MapData]])。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定。
  4. Record { [[Key]], [[Value]] } pM.[[MapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら
      1. p.[[Key]]empty に。
      2. p.[[Value]]empty に。
      3. true を返す。
  5. false を返す。
Note

empty はエントリが削除されたことを示す仕様上の装置として用いられる。実装は内部データ構造から物理的にエントリを除去するなど別の手段を取ってもよい。

24.1.3.4 Map.prototype.entries ( )

このメソッドは呼び出し時に次を行う:

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

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

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[MapData]])。
  3. IsCallable(callback) が false なら TypeError
  4. entriesM.[[MapData]]
  5. numEntriesentries の要素数。
  6. index = 0。
  7. index < numEntries の間繰り返し、
    1. e = entries[index]。
    2. indexindex + 1 に。
    3. e.[[Key]]empty でなければ
      1. ? Call(callback, thisArg, « e.[[Value]], e.[[Key]], M »)。
      2. 注: callback の実行中に entries の要素数が増加した可能性がある。
      3. numEntriesentries の要素数に設定。
  8. undefined を返す。
Note

callback は 3 引数を受け取る関数であるべき。forEach は Map に存在する各キー/値ペアについてキー挿入順に 1 度ずつ callback を呼ぶ。削除済みキーについては呼ばれない。

thisArg が与えられれば各呼出しの this 値として用いられ、無ければ undefined

callback は (値, キー, 走査対象 Map) で呼ばれる。

forEach 自体は直接オブジェクトをミューテートしないが callback により変更され得る。Map の [[MapData]] の各エントリは 1 度だけ訪問される。forEach 開始後に追加された新しいキーは訪問される。訪問後に削除され再追加されたキーは再訪問され得る。開始後に削除され訪問前のキーは再追加されない限り訪問されない。

24.1.3.6 Map.prototype.get ( key )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[MapData]])。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定。
  4. Record { [[Key]], [[Value]] } pM.[[MapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら p.[[Value]] を返す。
  5. undefined を返す。

24.1.3.7 Map.prototype.has ( key )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[MapData]])。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定。
  4. Record { [[Key]], [[Value]] } pM.[[MapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら true を返す。
  5. false を返す。

24.1.3.8 Map.prototype.keys ( )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. CreateMapIterator(M, key) を返す。

24.1.3.9 Map.prototype.set ( key, value )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[MapData]])。
  3. keyCanonicalizeKeyedCollectionKey(key) に設定。
  4. Record { [[Key]], [[Value]] } pM.[[MapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら
      1. p.[[Value]]value に設定。
      2. M を返す。
  5. p を { [[Key]]: key, [[Value]]: value } とする Record とする。
  6. pM.[[MapData]] に追加。
  7. M を返す。

24.1.3.10 get Map.prototype.size

Map.prototype.size は set アクセサが undefinedアクセサプロパティであり、その get アクセサは呼び出し時に次を行う:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[MapData]])。
  3. count を 0 とする。
  4. Record { [[Key]], [[Value]] } pM.[[MapData]] について
    1. p.[[Key]]empty でなければ countcount + 1 に設定。
  5. 𝔽(count) を返す。

24.1.3.11 Map.prototype.values ( )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. CreateMapIterator(M, value) を返す。

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

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

24.1.3.13 Map.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "Map" である。

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

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

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

24.1.5 Map イテレータオブジェクト

Map Iterator は特定の Map インスタンスオブジェクト上の特定の反復を表すオブジェクトである。Map Iterator オブジェクトには名前付きコンストラクターは存在しない。代わりに、Map インスタンスオブジェクトの特定メソッド呼出により生成される。

24.1.5.1 CreateMapIterator ( map, kind )

The abstract operation CreateMapIterator takes arguments map (an ECMAScript language value) and kind (key+value, key, or value) and returns either a normal completion containing a Generator or a throw completion. Map メソッドのうち、そのようなイテレータを返すもののためのイテレータオブジェクトを生成するために用いられる。 It performs the following steps when called:

  1. RequireInternalSlot(map, [[MapData]]) を実行。
  2. 引数なしで mapkind を捕捉し呼び出し時に以下を行う新しい抽象クロージャ closure を作成:
    1. entriesmap.[[MapData]]
    2. index = 0。
    3. numEntriesentries の要素数。
    4. index < numEntries の間繰り返し、
      1. e = entries[index]。
      2. indexindex + 1。
      3. e.[[Key]]empty でなければ
        1. kindkey なら
          1. result = e.[[Key]]
        2. そうでなく kindvalue なら
          1. result = e.[[Value]]
        3. それ以外
          1. アサート: kindkey+value
          2. result = CreateArrayFromListe.[[Key]], e.[[Value]] »)。
        4. GeneratorYield(CreateIteratorResultObject(result, false)) を実行。
        5. 注: 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% プロパティの初期値は文字列 "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 74 に列挙したフィールドを持つ。

Table 74: 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 )

The abstract operation GetSetRecord takes argument obj (an ECMAScript language value) and returns either a normal completion containing a Set Record or a throw completion. It performs the following steps when called:

  1. obj がオブジェクトでなければ TypeError 例外。
  2. rawSize を ? Get(obj, "size") とする。
  3. numSize を ? ToNumber(rawSize) とする。
  4. 注: 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 (a List of either ECMAScript language values or empty) and value (an ECMAScript language value) and returns a 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 (a List of either ECMAScript language values or empty) and value (an ECMAScript language value) and returns a non-negative integer or not-found. It performs the following steps when called:

  1. valueCanonicalizeKeyedCollectionKey(value) に設定。
  2. sizesetData の要素数とする。
  3. index = 0。
  4. index < size の間、
    1. e = setData[index]。
    2. eempty でなく evalue なら
      1. index を返す。
    3. index = index + 1。
  5. not-found を返す。

24.2.1.5 SetDataSize ( setData )

The abstract operation SetDataSize takes argument setData (a List of either ECMAScript language values or empty) and returns a non-negative integer. It performs the following steps when called:

  1. count = 0。
  2. 各要素 esetData について
    1. eempty でなければ 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. 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. Sthis 値。
  2. RequireInternalSlot(S, [[SetData]])。
  3. valueCanonicalizeKeyedCollectionKey(value) に設定。
  4. 各要素 eS.[[SetData]] について
    1. eempty でなく SameValue(e, value) が true なら
      1. S を返す。
  5. valueS.[[SetData]] に追加。
  6. S を返す。

24.2.4.2 Set.prototype.clear ( )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[SetData]])。
  3. 各要素 eS.[[SetData]] について
    1. 値が e の要素を値が 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. Sthis 値。
  2. RequireInternalSlot(S, [[SetData]])。
  3. valueCanonicalizeKeyedCollectionKey(value) に設定。
  4. 各要素 eS.[[SetData]] について
    1. eempty でなく SameValue(e, value) が true なら
      1. 値が e の要素を値が empty の要素で置き換える。
      2. true を返す。
  5. false を返す。
Note

empty は削除済みエントリを示す仕様上の装置。実装は内部構造から実際に除去するなど他の手段を取ってよい。

24.2.4.5 Set.prototype.difference ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. resultSetDataO.[[SetData]] のコピーとする。
  5. もし SetDataSize(O.[[SetData]]) ≤ otherRec.[[Size]] なら
    1. thisSizeO.[[SetData]] の要素数とする。
    2. index = 0。
    3. index < thisSize の間、
      1. e = resultSetData[index]。
      2. eempty でなければ
        1. inOther = ToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « e »))。
        2. inOthertrue なら
          1. resultSetData[index] = empty
      3. index = index + 1。
  6. それ以外
    1. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])。
    2. next = not-started
    3. nextdone でない間、
      1. next = ? IteratorStepValue(keysIter)。
      2. nextdone でなければ
        1. next = CanonicalizeKeyedCollectionKey(next)。
        2. valueIndex = SetDataIndex(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. Sthis 値。
  2. CreateSetIterator(S, key+value) を返す。
Note

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

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

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[SetData]])。
  3. IsCallable(callback) が false なら TypeError
  4. entries = S.[[SetData]]
  5. numEntries = entries の要素数。
  6. index = 0。
  7. index < numEntries の間、
    1. e = entries[index]。
    2. index = index + 1。
    3. eempty でなければ
      1. ? Call(callback, thisArg, « e, e, S »)。
      2. 注: callback 実行中に entries の要素数が増加した可能性がある。
      3. numEntriesentries の要素数に設定。
  8. undefined を返す。
Note

callback は 3 引数を受け取る関数であるべき。forEach は Set オブジェクト内の各値に対して値挿入順で callback を 1 度呼ぶ。削除済みの値については呼ばれない。

thisArg が与えられれば各呼出しの this 値として使用し、無ければ undefined

callback は 3 引数で呼ばれる: 最初の 2 引数は Set に含まれる値で同一の値、3 番目は走査対象の Set。

callback が 3 引数で呼ばれるのは Map や Array の forEach のコールバックと整合性を保つため。Set では各項目値がキーと値の双方であるとみなされる。

forEach 自体は直接オブジェクトを変更しないが、callback により変更され得る。

各値は通常 1 度だけ訪問されるが、訪問後削除され完了前に再追加された場合は再訪問される。開始後に削除され訪問前であった値は完了前に再追加されない限り訪問されない。開始後に追加された新しい値は訪問される。

24.2.4.8 Set.prototype.has ( value )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[SetData]])。
  3. valueCanonicalizeKeyedCollectionKey(value) に設定。
  4. 各要素 eS.[[SetData]] について
    1. eempty でなく SameValue(e, value) が true なら true を返す。
  5. false を返す。

24.2.4.9 Set.prototype.intersection ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. resultSetData を新しい空 List とする。
  5. もし SetDataSize(O.[[SetData]]) ≤ otherRec.[[Size]] なら
    1. thisSizeO.[[SetData]] の要素数。
    2. index = 0。
    3. index < thisSize の間、
      1. e = O.[[SetData]][index]。
      2. index = index + 1。
      3. eempty でなければ
        1. inOther = ToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « e »))。
        2. inOthertrue なら
          1. 注: 以前の otherRec.[[Has]] 呼出しが O.[[SetData]] の要素を削除再追加し、この反復で同じ要素が 2 度訪問され得る。
          2. SetDataHas(resultSetData, e) が false なら resultSetDatae を追加。
        3. 注: otherRec.[[Has]] 実行中に O.[[SetData]] の要素数が増えた可能性。
        4. thisSizeO.[[SetData]] の要素数に設定。
  6. それ以外
    1. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])。
    2. next = not-started
    3. nextdone でない間、
      1. next = ? IteratorStepValue(keysIter)。
      2. nextdone でなければ
        1. next = CanonicalizeKeyedCollectionKey(next)。
        2. inThis = SetDataHas(O.[[SetData]], next)。
        3. inThistrue なら
          1. 注: other は任意のオブジェクトであるためその "keys" イテレータが同じ値を複数回生成し得る。
          2. SetDataHas(resultSetData, next) が false なら resultSetDatanext を追加。
  7. result = OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)。
  8. result.[[SetData]] = resultSetData
  9. result を返す。

24.2.4.10 Set.prototype.isDisjointFrom ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. もし SetDataSize(O.[[SetData]]) ≤ otherRec.[[Size]] なら
    1. thisSizeO.[[SetData]] の要素数。
    2. index = 0。
    3. index < thisSize の間、
      1. e = O.[[SetData]][index]。
      2. index = index + 1。
      3. eempty でなければ
        1. inOther = ToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « e »))。
        2. inOthertrue なら false を返す。
        3. 注: otherRec.[[Has]] 実行中に O.[[SetData]] の要素数が増加した可能性。
        4. thisSizeO.[[SetData]] の要素数に設定。
  5. それ以外
    1. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])。
    2. next = not-started
    3. nextdone でない間、
      1. next = ? IteratorStepValue(keysIter)。
      2. nextdone でなければ
        1. SetDataHas(O.[[SetData]], next) が true なら
          1. IteratorClose(keysIter, NormalCompletion(unused)) を実行。
          2. false を返す。
  6. true を返す。

24.2.4.11 Set.prototype.isSubsetOf ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. SetDataSize(O.[[SetData]]) > otherRec.[[Size]] なら false を返す。
  5. thisSizeO.[[SetData]] の要素数。
  6. index = 0。
  7. index < thisSize の間、
    1. e = O.[[SetData]][index]。
    2. index = index + 1。
    3. eempty でなければ
      1. inOther = ToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « e »))。
      2. inOtherfalse なら false を返す。
      3. 注: otherRec.[[Has]] 実行中に O.[[SetData]] の要素数が増加した可能性。
      4. thisSizeO.[[SetData]] の要素数に設定。
  8. true を返す。

24.2.4.12 Set.prototype.isSupersetOf ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. SetDataSize(O.[[SetData]]) < otherRec.[[Size]] なら false を返す。
  5. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])。
  6. next = not-started
  7. nextdone でない間、
    1. next = ? IteratorStepValue(keysIter)。
    2. nextdone でなければ
      1. SetDataHas(O.[[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. Sthis 値。
  2. RequireInternalSlot(S, [[SetData]])。
  3. size = SetDataSize(S.[[SetData]])。
  4. 𝔽(size) を返す。

24.2.4.15 Set.prototype.symmetricDifference ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])。
  5. resultSetDataO.[[SetData]] のコピーとする。
  6. next = not-started
  7. nextdone でない間、
    1. next = ? IteratorStepValue(keysIter)。
    2. nextdone でなければ
      1. next = CanonicalizeKeyedCollectionKey(next)。
      2. resultIndex = SetDataIndex(resultSetData, next)。
      3. resultIndexnot-found なら alreadyInResult = false、そうでなければ true
      4. SetDataHas(O.[[SetData]], next) が true なら
        1. alreadyInResulttrue なら resultSetData[resultIndex] = empty
      5. そうでなければ
        1. alreadyInResultfalse なら resultSetDatanext を追加。
  8. result = OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)。
  9. result.[[SetData]] = resultSetData
  10. result を返す。

24.2.4.16 Set.prototype.union ( other )

このメソッドは呼び出し時に次を行う:

  1. Othis 値。
  2. RequireInternalSlot(O, [[SetData]])。
  3. otherRec を ? GetSetRecord(other) とする。
  4. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])。
  5. resultSetDataO.[[SetData]] のコピーとする。
  6. next = not-started
  7. nextdone でない間、
    1. next = ? IteratorStepValue(keysIter)。
    2. nextdone でなければ
      1. next = CanonicalizeKeyedCollectionKey(next)。
      2. SetDataHas(resultSetData, next) が false なら
        1. resultSetDatanext を追加。
  8. result = OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)。
  9. result.[[SetData]] = resultSetData
  10. result を返す。

24.2.4.17 Set.prototype.values ( )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. CreateSetIterator(S, 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% プロパティの初期値は文字列 "Set" である。

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

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

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

24.2.6 Set イテレータオブジェクト

Set Iterator は以下で定義される構造を持つ通常のオブジェクトであり、特定の Set インスタンスオブジェクト上の特定の反復を表す。Set Iterator オブジェクトには名前付きコンストラクターは存在しない。代わりに Set インスタンスオブジェクトの特定メソッド呼出によって生成される。

24.2.6.1 CreateSetIterator ( set, kind )

The abstract operation CreateSetIterator takes arguments set (an ECMAScript language value) and kind (key+value or value) and returns either a normal completion containing a Generator or a throw completion. Set メソッドのうちイテレータを返すもののためのイテレータオブジェクトを生成するために用いられる。 It performs the following steps when called:

  1. RequireInternalSlot(set, [[SetData]]) を実行。
  2. 引数なしで setkind を捕捉し呼び出し時に以下を行う新しい抽象クロージャ closure を作成:
    1. index = 0。
    2. entries = set.[[SetData]]
    3. numEntries = entries の要素数。
    4. index < numEntries の間、
      1. e = entries[index]。
      2. index = index + 1。
      3. eempty でなければ
        1. kindkey+value なら
          1. result = CreateArrayFromListe, e »)。
          2. GeneratorYield(CreateIteratorResultObject(result, false))。
        2. そうでなければ
          1. アサート: kindvalue
          2. GeneratorYield(CreateIteratorResultObject(e, false))。
        3. 注: 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% プロパティの初期値は文字列 "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 の必要な観測可能セマンティクスを記述するためだけのもので、実装モデルとなることを意図しない。

Note

WeakMap と WeakSet は、WeakMap や WeakSet インスタンスが存在しなかった場合にそのオブジェクトまたはシンボルが到達不能となり実装のガーベジコレクション機構によるリソース回収対象となる状況で、メモリ資源を “リーク” しない形で動的に状態を関連付ける機構を提供することを意図している。この特性は WeakMap または WeakSet インスタンスからキーへの逆方向 per-object/symbol マッピングを用いることで達成できる。あるいは各 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 が与えられる場合、それは %Symbol.iterator% メソッドを実装し、最初の要素が WeakMap のキー、2 番目の要素がそのキーに関連付ける値である 2 要素配列ライクを生成するイテレータオブジェクトを返すオブジェクトであることが期待される。

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. Mthis 値。
  2. RequireInternalSlot(M, [[WeakMapData]])。
  3. CanBeHeldWeakly(key) が false なら false を返す。
  4. Record { [[Key]], [[Value]] } pM.[[WeakMapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら
      1. p.[[Key]]empty に。
      2. p.[[Value]]empty に。
      3. true を返す。
  5. false を返す。
Note

empty は削除を示す仕様上の装置。実装は内部データ構造から物理的に削除するなど別の手段を取ってもよい。

24.3.3.3 WeakMap.prototype.get ( key )

このメソッドは呼び出し時に次を行う:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[WeakMapData]])。
  3. CanBeHeldWeakly(key) が false なら undefined を返す。
  4. Record { [[Key]], [[Value]] } pM.[[WeakMapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら p.[[Value]] を返す。
  5. undefined を返す。

24.3.3.4 WeakMap.prototype.has ( key )

このメソッドは呼び出し時:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[WeakMapData]])。
  3. CanBeHeldWeakly(key) が false なら false を返す。
  4. Record { [[Key]], [[Value]] } pM.[[WeakMapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら true を返す。
  5. false を返す。

24.3.3.5 WeakMap.prototype.set ( key, value )

このメソッドは呼び出し時:

  1. Mthis 値。
  2. RequireInternalSlot(M, [[WeakMapData]])。
  3. CanBeHeldWeakly(key) が false なら TypeError 例外。
  4. Record { [[Key]], [[Value]] } pM.[[WeakMapData]] について
    1. p.[[Key]]empty でなく SameValue(p.[[Key]], key) が true なら
      1. p.[[Value]]value に設定。
      2. M を返す。
  5. p を { [[Key]]: key, [[Value]]: value } という Record とする。
  6. pM.[[WeakMapData]] に追加。
  7. M を返す。

24.3.3.6 WeakMap.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "WeakMap" である。

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

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

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

24.4 WeakSet オブジェクト

WeakSet はオブジェクトおよび/またはシンボルのコレクションである。区別されるオブジェクトまたはシンボルは WeakSet のコレクション内で 1 度だけ要素として現れる。WeakSet は特定の値を含むかを問い合わせできるが、保持する値を列挙する仕組みは提供されない。特定の状況では、9.9.3 に記述されるように、存活していない値は WeakSet の要素として除去される。

実装は WeakSet に含まれる値が到達不能になってから WeakSet から除去されるまでの間に任意の遅延を課すことができる。もしこの遅延が ECMAScript プログラムから観測可能であれば、不確定性の原因となり得る。そのため ECMAScript 実装は、観測者が観測対象値を提示することなく WeakSet が特定値を含むか決定する手段を提供してはならない。

WeakSet はハッシュテーブルまたはコレクション内要素数に対し平均で亜線形アクセス時間を提供する他の機構を用いて実装されなければならない。本仕様のデータ構造は WeakSet の必要な観測可能セマンティクスを記述するためだけのもので、実装モデルとなることを意図しない。

Note

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. 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. Sthis 値。
  2. RequireInternalSlot(S, [[WeakSetData]])。
  3. CanBeHeldWeakly(value) が false なら TypeError 例外。
  4. 各要素 eS.[[WeakSetData]] について
    1. eempty でなく SameValue(e, value) が true なら
      1. S を返す。
  5. valueS.[[WeakSetData]] に追加。
  6. S を返す。

24.4.3.2 WeakSet.prototype.constructor

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

24.4.3.3 WeakSet.prototype.delete ( value )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[WeakSetData]])。
  3. CanBeHeldWeakly(value) が false なら false を返す。
  4. 各要素 eS.[[WeakSetData]] について
    1. eempty でなく SameValue(e, value) が true なら
      1. 値が e の要素を値が empty の要素で置き換える。
      2. true を返す。
  5. false を返す。
Note

empty は削除を示す仕様上の装置。実装は内部構造から物理的に除去するなど別手段を取ってよい。

24.4.3.4 WeakSet.prototype.has ( value )

このメソッドは呼び出し時に次を行う:

  1. Sthis 値。
  2. RequireInternalSlot(S, [[WeakSetData]])。
  3. CanBeHeldWeakly(value) が false なら false
  4. 各要素 eS.[[WeakSetData]] について
    1. eempty でなく SameValue(e, value) が true なら true
  5. false を返す。

24.4.3.5 WeakSet.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は文字列 "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 (an ECMAScript language value) and returns an ECMAScript language value. It performs the following steps when called:

  1. key-0𝔽 なら +0𝔽 を返す。
  2. key を返す。