24 키드 컬렉션(Keyed Collections)

24.1 Map 객체

Map 은 키/값 쌍의 컬렉션이며 키와 값 모두 임의의 ECMAScript 언어 값을 사용할 수 있다. 하나의 고유 키 값은 그 Map 컬렉션 안에서 하나의 키/값 쌍에만 등장할 수 있다. 고유 키 값의 구분은 SameValueZero 비교 알고리즘의 의미론을 사용한다.

Map 은 평균적으로 컬렉션의 요소 수에 대해 준선형(sublinear) 접근 시간을 제공하는 해시 테이블 또는 다른 메커니즘을 사용하여 구현되어야 한다. 이 명세에서 사용하는 자료 구조는 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. Return ? AddEntriesFromIterable(map, iterable, adder).
Note

매개변수 iterable 이 존재하면, 첫 번째 요소가 Map 키로 사용될 값이고 두 번째 요소가 그 키에 연결할 값인 2-요소 배열 유사 객체를 생성하는 이터레이터 객체를 반환하는 %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 정상 완료(ECMAScript 언어 값 포함) 또는 throw completion. addertarget 을 receiver 로 하여 호출된다. It performs the following steps when called:

  1. iteratorRecord = ? GetIterator(iterable, sync).
  2. 반복:
    1. next = ? IteratorStepValue(iteratorRecord).
    2. nextdone 이면 target 반환.
    3. next 가 Object 가 아니면
      1. error = ThrowCompletion(새로 생성된 TypeError 객체).
      2. Return ? IteratorClose(iteratorRecord, error).
    4. k = Completion(Get(next, "0")).
    5. IfAbruptCloseIterator(k, iteratorRecord).
    6. v = Completion(Get(next, "1")).
    7. IfAbruptCloseIterator(v, iteratorRecord).
    8. status = Completion(Call(adder, target, « k, v »)).
    9. IfAbruptCloseIterator(status, iteratorRecord).
Note

매개변수 iterable 은 2-요소 배열 유사 객체를 생성하는 이터레이터 객체를 반환하는 %Symbol.iterator% 메서드를 구현한 객체일 것으로 기대된다. 첫 요소는 Map 키로, 두 번째 요소는 그 키에 연결할 값이다.

24.1.2 Map 생성자의 프로퍼티

Map 생성자:

  • 값이 %Function.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 다음 프로퍼티를 가진다:

24.1.2.1 Map.groupBy ( items, callback )

Note

callback 은 두 인자를 받는 함수여야 한다. groupByitems 의 각 요소에 대해 오름차순으로 한 번씩 callback 을 호출하고 새 Map 을 구성한다. callback 이 반환한 각 값은 Map 의 키로 사용된다. 그러한 키마다 결과 Map 은 그 키를 키로 하고 callback 이 그 키를 반환한 모든 요소가 담긴 배열을 값으로 갖는 엔트리를 가진다.

callback 은 요소의 값과 요소의 인덱스 두 인자로 호출된다.

groupBy 의 반환 값은 Map 이다.

이 함수는 호출 시 다음 단계를 수행한다:

  1. groups = ? GroupBy(items, callback, collection).
  2. map = ! Construct(%Map%).
  3. Record { [[Key]], [[Elements]] } ggroups 에 대해
    1. elements = CreateArrayFromList(g.[[Elements]]).
    2. entry = Record { [[Key]]: g.[[Key]], [[Value]]: elements }.
    3. entrymap.[[MapData]] 에 append.
  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% 이다.
  • 값이 %Object.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 일반 객체이다.
  • [[MapData]] 내부 슬롯을 가지지 않는다.

24.1.3.1 Map.prototype.clear ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. M = this 값.
  2. RequireInternalSlot(M, [[MapData]]) 수행.
  3. M.[[MapData]] 의 각 Record { [[Key]], [[Value]] } p 에 대해
    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. M = this 값.
  2. RequireInternalSlot(M, [[MapData]]) 수행.
  3. key = CanonicalizeKeyedCollectionKey(key).
  4. M.[[MapData]] 의 각 Record { [[Key]], [[Value]] } p 에 대해
    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. M = this 값.
  2. Return ? CreateMapIterator(M, key+value).

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

이 메서드는 호출 시 다음 단계를 수행한다:

  1. M = this 값.
  2. RequireInternalSlot(M, [[MapData]]) 수행.
  3. IsCallable(callback) false 이면 TypeError 예외.
  4. entries = M.[[MapData]].
  5. numEntries = entries 요소 수.
  6. index = 0.
  7. 반복, index < numEntries 동안
    1. e = entries[index].
    2. index = index + 1.
    3. e.[[Key]]empty 이면
      1. Call(callback, thisArg, « e.[[Value]], e.[[Key]], M ») 수행.
      2. NOTE: callback 실행 중 entries 요소 수가 증가할 수 있다.
      3. numEntries = entries 요소 수로 재설정.
  8. undefined 반환.
Note

callback 은 세 인자를 받는 함수여야 한다. forEach 는 Map 에 존재하는 각 키/값 쌍을 키 삽입 순서대로 한 번씩 callback 에 전달한다. callback 은 실제 존재하는 키에 대해서만 호출되며 Map 에서 삭제된 키에 대해서는 호출되지 않는다.

thisArg 가 제공되면 각 호출의 this 값으로 사용되며, 제공되지 않으면 undefined 사용.

callback 은 (값, 키, 순회 중인 Map) 세 인자로 호출된다.

forEach 자체는 호출된 객체를 직접 변이하지 않지만 callback 호출에 의해 변이될 수 있다. Map 의 [[MapData]] 각 엔트리는 한 번만 방문된다. 호출 시작 후 추가된 새 키는 방문된다. 이미 방문된 키가 삭제되고 다시 추가되면 다시 방문된다. 시작 후 방문되기 전에 삭제된 키는 재추가되지 않는 한 방문되지 않는다.

24.1.3.6 Map.prototype.get ( key )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. M = this 값.
  2. RequireInternalSlot(M, [[MapData]]) 수행.
  3. key = CanonicalizeKeyedCollectionKey(key).
  4. M.[[MapData]] 의 각 Record { [[Key]], [[Value]] } p 에 대해
    1. p.[[Key]]empty 그리고 SameValue(p.[[Key]], key) = true 이면 p.[[Value]] 반환.
  5. undefined 반환.

24.1.3.7 Map.prototype.has ( key )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. M = this 값.
  2. RequireInternalSlot(M, [[MapData]]) 수행.
  3. key = CanonicalizeKeyedCollectionKey(key).
  4. M.[[MapData]] 의 각 Record { [[Key]], [[Value]] } p 에 대해
    1. p.[[Key]]empty 그리고 SameValue(p.[[Key]], key) = true 이면 true 반환.
  5. false 반환.

24.1.3.8 Map.prototype.keys ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. M = this 값.
  2. Return ? CreateMapIterator(M, key).

24.1.3.9 Map.prototype.set ( key, value )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. M = this 값.
  2. RequireInternalSlot(M, [[MapData]]) 수행.
  3. key = CanonicalizeKeyedCollectionKey(key).
  4. M.[[MapData]] 의 각 Record { [[Key]], [[Value]] } p 에 대해
    1. p.[[Key]]empty 그리고 SameValue(p.[[Key]], key) = true 이면
      1. p.[[Value]] = value.
      2. M 반환.
  5. p = Record { [[Key]]: key, [[Value]]: value }.
  6. pM.[[MapData]] 에 append.
  7. M 반환.

24.1.3.10 get Map.prototype.size

Map.prototype.size 는 set 접근자 함수가 undefined접근자 프로퍼티이다. 그 get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. M = this 값.
  2. RequireInternalSlot(M, [[MapData]]) 수행.
  3. count = 0.
  4. M.[[MapData]] 의 각 Record { [[Key]], [[Value]] } p 에 대해
    1. p.[[Key]]empty 이면 count = count + 1.
  5. 𝔽(count) 반환.

24.1.3.11 Map.prototype.values ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. M = this 값.
  2. Return ? 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% 프로퍼티 초기 값은 String "Map" 이다.

이 프로퍼티 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.

24.1.4 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 Generator 또는 throw completion. Map 메서드 중 그러한 이터레이터를 반환하는 것들이 사용할 이터레이터 객체를 생성한다. It performs the following steps when called:

  1. RequireInternalSlot(map, [[MapData]]) 수행.
  2. closure 를 매개변수 없고 map, kind 를 캡처하며 호출 시 다음 단계를 수행하는 새 추상 클로저로 둔다:
    1. entries = map.[[MapData]].
    2. index = 0.
    3. numEntries = entries 요소 수.
    4. 반복, index < numEntries 동안
      1. e = entries[index].
      2. index = index + 1.
      3. e.[[Key]]empty 이면
        1. kindkey 이면
          1. result = e.[[Key]].
        2. Else if kind = value 이면
          1. result = e.[[Value]].
        3. Else
          1. Assert: kind = key+value.
          2. result = CreateArrayFromListe.[[Key]], e.[[Value]] »).
        4. GeneratorYield(CreateIteratorResultObject(result, false)) 수행.
        5. NOTE: GeneratorYield 로 일시 중단된 동안 entries 요소 수가 증가할 수 있다.
        6. numEntries = entries 요소 수로 재설정.
    5. Return NormalCompletion(unused).
  3. Return CreateIteratorFromClosure(closure, "%MapIteratorPrototype%", %MapIteratorPrototype%).

24.1.5.2 %MapIteratorPrototype% 객체

%MapIteratorPrototype% 객체:

24.1.5.2.1 %MapIteratorPrototype%.next ( )

  1. Return ? 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 컬렉션에서 한 번만 요소로 등장할 수 있다. 고유 값의 구분은 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 Set Record 또는 throw completion. 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 (a List of either ECMAScript language values or empty) and value (an ECMAScript language value) 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 (a List of either ECMAScript language values or empty) and value (an ECMAScript language value) and returns 음이 아닌 정수 또는 not-found. It performs the following steps when called:

  1. value = CanonicalizeKeyedCollectionKey(value).
  2. size = setData 요소 수.
  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 음이 아닌 정수. It performs the following steps when called:

  1. count = 0.
  2. setData 의 각 요소 e 에 대해
    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. 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 프로토타입 객체이다.

이 프로퍼티는 { [[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% 이다.
  • 값이 %Object.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 일반 객체이다.
  • [[SetData]] 내부 슬롯을 가지지 않는다.

24.2.4.1 Set.prototype.add ( value )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. S = this 값.
  2. RequireInternalSlot(S, [[SetData]]) 수행.
  3. value = CanonicalizeKeyedCollectionKey(value).
  4. S.[[SetData]] 의 각 요소 e 에 대해
    1. eempty 그리고 SameValue(e, value) = true 이면
      1. S 반환.
  5. valueS.[[SetData]] 에 append.
  6. S 반환.

24.2.4.2 Set.prototype.clear ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. S = this 값.
  2. RequireInternalSlot(S, [[SetData]]) 수행.
  3. S.[[SetData]] 의 각 요소 e 에 대해
    1. 값이 eS.[[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. S = this 값.
  2. RequireInternalSlot(S, [[SetData]]) 수행.
  3. value = CanonicalizeKeyedCollectionKey(value).
  4. S.[[SetData]] 의 각 요소 e 에 대해
    1. eempty 그리고 SameValue(e, value) = true 이면
      1. 값이 eS.[[SetData]] 요소를 값이 empty 인 요소로 교체.
      2. true 반환.
  5. false 반환.
Note

empty 는 엔트리가 삭제되었음을 나타내는 명세 기법이다. 실제 구현은 내부 자료 구조에서 물리적으로 제거하는 등의 다른 동작을 할 수 있다.

24.2.4.5 Set.prototype.difference ( other )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O = this 값.
  2. RequireInternalSlot(O, [[SetData]]) 수행.
  3. otherRec = ? GetSetRecord(other).
  4. resultSetData = O.[[SetData]] 의 복사본.
  5. If SetDataSize(O.[[SetData]]) ≤ otherRec.[[Size]] 이면
    1. thisSize = O.[[SetData]] 요소 수.
    2. index = 0.
    3. 반복, index < thisSize 동안
      1. e = resultSetData[index].
      2. eempty 이면
        1. inOther = ToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « e »)).
        2. inOther = true 이면
          1. resultSetData[index] = empty.
      3. index = index + 1.
  6. Else
    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. result = OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »).
  8. result.[[SetData]] = resultSetData.
  9. result 반환.

24.2.4.6 Set.prototype.entries ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. S = this 값.
  2. Return ? CreateSetIterator(S, key+value).
Note

순회 목적상 Set 은 각 엔트리의 키와 값이 같은 Map 과 유사하게 보인다.

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

이 메서드는 호출 시 다음 단계를 수행한다:

  1. S = this 값.
  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. NOTE: callback 실행 중 entries 요소 수가 증가할 수 있다.
      3. numEntries = entries 요소 수로 재설정.
  8. undefined 반환.
Note

callback 은 세 인자를 받는 함수여야 한다. forEach 는 Set 객체에 존재하는 각 값을 값 삽입 순서대로 한 번씩 callback 에 전달한다. callback 은 실제 존재하는 값에 대해서만 호출되며 삭제된 값에 대해서는 호출되지 않는다.

thisArg 가 제공되면 각 호출의 this 값으로 사용되고, 제공되지 않으면 undefined 사용.

callback 은 세 인자로 호출되며 처음 두 인자는 Set 에 포함된 같은 값이고 세 번째 인자는 순회 중인 Set 객체이다.

세 인자 호출 형태는 Map 과 Array 의 forEach 콜백 형태와 일관성을 유지하기 위함이다. Set 에서는 각 항목 값이 키이자 값으로 간주된다.

forEach 는 대상 객체를 직접 변이하지 않지만 callback 호출에 의해 변이될 수 있다.

각 값은 일반적으로 한 번만 방문된다. 그러나 방문 후 삭제됐다가 forEach 완료 전에 재추가되면 다시 방문된다. 시작 후 방문되기 전에 삭제된 값은 재추가되지 않는 한 방문되지 않는다. 시작 후 추가된 새 값은 방문된다.

24.2.4.8 Set.prototype.has ( value )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. S = this 값.
  2. RequireInternalSlot(S, [[SetData]]) 수행.
  3. value = CanonicalizeKeyedCollectionKey(value).
  4. S.[[SetData]] 의 각 요소 e 에 대해
    1. eempty 그리고 SameValue(e, value) = true 이면 true 반환.
  5. false 반환.

24.2.4.9 Set.prototype.intersection ( other )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O = this 값.
  2. RequireInternalSlot(O, [[SetData]]) 수행.
  3. otherRec = ? GetSetRecord(other).
  4. resultSetData = 새 빈 List.
  5. If SetDataSize(O.[[SetData]]) ≤ otherRec.[[Size]] 이면
    1. thisSize = O.[[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. inOther = true 이면
          1. NOTE: 이전 otherRec.[[Has]] 호출이 O.[[SetData]] 요소를 제거 후 재추가하여 같은 요소가 두 번 방문될 수 있다.
          2. SetDataHas(resultSetData, e) = false 이면
            1. eresultSetData 에 append.
        3. NOTE: otherRec.[[Has]] 실행 중 O.[[SetData]] 요소 수가 증가할 수 있다.
        4. thisSize = O.[[SetData]] 요소 수로 재설정.
  6. Else
    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. inThis = true 이면
          1. NOTE: other 는 임의 객체이므로 "keys" 이터레이터가 같은 값을 여러 번 낼 수 있다.
          2. SetDataHas(resultSetData, next) = false 이면
            1. nextresultSetData 에 append.
  7. result = OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »).
  8. result.[[SetData]] = resultSetData.
  9. result 반환.

24.2.4.10 Set.prototype.isDisjointFrom ( other )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O = this 값.
  2. RequireInternalSlot(O, [[SetData]]) 수행.
  3. otherRec = ? GetSetRecord(other).
  4. If SetDataSize(O.[[SetData]]) ≤ otherRec.[[Size]] 이면
    1. thisSize = O.[[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. inOther = true 이면 false 반환.
        3. NOTE: otherRec.[[Has]] 실행 중 O.[[SetData]] 요소 수가 증가할 수 있다.
        4. thisSize = O.[[SetData]] 요소 수로 재설정.
  5. Else
    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. O = this 값.
  2. RequireInternalSlot(O, [[SetData]]) 수행.
  3. otherRec = ? GetSetRecord(other).
  4. SetDataSize(O.[[SetData]]) > otherRec.[[Size]] 이면 false 반환.
  5. thisSize = O.[[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. inOther = false 이면 false 반환.
      3. NOTE: otherRec.[[Has]] 실행 중 O.[[SetData]] 요소 수가 증가할 수 있다.
      4. thisSize = O.[[SetData]] 요소 수로 재설정.
  8. true 반환.

24.2.4.12 Set.prototype.isSupersetOf ( other )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O = this 값.
  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. S = this 값.
  2. RequireInternalSlot(S, [[SetData]]) 수행.
  3. size = SetDataSize(S.[[SetData]]).
  4. 𝔽(size) 반환.

24.2.4.15 Set.prototype.symmetricDifference ( other )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O = this 값.
  2. RequireInternalSlot(O, [[SetData]]) 수행.
  3. otherRec = ? GetSetRecord(other).
  4. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]).
  5. resultSetData = O.[[SetData]] 의 복사본.
  6. next = not-started.
  7. 반복, nextdone 동안
    1. next = ? IteratorStepValue(keysIter).
    2. nextdone 이면
      1. next = CanonicalizeKeyedCollectionKey(next).
      2. resultIndex = SetDataIndex(resultSetData, next).
      3. resultIndex = not-found 이면 alreadyInResult = false; 아니면 true.
      4. SetDataHas(O.[[SetData]], next) = true 이면
        1. alreadyInResult = true 이고 resultIndexnot-found 이 아님이면 resultSetData[resultIndex] = empty.
      5. Else
        1. alreadyInResult = false 이면 nextresultSetData 에 append.
  8. result = OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »).
  9. result.[[SetData]] = resultSetData.
  10. result 반환.

24.2.4.16 Set.prototype.union ( other )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O = this 값.
  2. RequireInternalSlot(O, [[SetData]]) 수행.
  3. otherRec = ? GetSetRecord(other).
  4. keysIter = ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]]).
  5. resultSetData = O.[[SetData]] 의 복사본.
  6. next = not-started.
  7. 반복, nextdone 동안
    1. next = ? IteratorStepValue(keysIter).
    2. nextdone 이면
      1. next = CanonicalizeKeyedCollectionKey(next).
      2. SetDataHas(resultSetData, next) = false 이면
        1. nextresultSetData 에 append.
  8. result = OrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »).
  9. result.[[SetData]] = resultSetData.
  10. result 반환.

24.2.4.17 Set.prototype.values ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. S = this 값.
  2. Return ? 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% 프로퍼티 초기 값은 String "Set" 이다.

이 프로퍼티 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.

24.2.5 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 Generator 또는 throw completion. Set 메서드 중 그러한 이터레이터를 반환하는 것들이 사용할 이터레이터 객체를 생성한다. It performs the following steps when called:

  1. RequireInternalSlot(set, [[SetData]]) 수행.
  2. closure 를 매개변수 없고 set, kind 를 캡처하며 호출 시 다음 단계를 수행하는 새 추상 클로저로 둔다:
    1. index = 0.
    2. entries = set.[[SetData]].
    3. numEntries = entries 요소 수.
    4. 반복, index < numEntries 동안
      1. e = entries[index].
      2. index = index + 1.
      3. eempty 이면
        1. kind = key+value 이면
          1. result = CreateArrayFromListe, e »).
          2. GeneratorYield(CreateIteratorResultObject(result, false)) 수행.
        2. Else
          1. Assert: kind = value.
          2. GeneratorYield(CreateIteratorResultObject(e, false)) 수행.
        3. NOTE: GeneratorYield 로 일시 중단된 동안 entries 요소 수가 증가할 수 있다.
        4. numEntries = entries 요소 수로 재설정.
    5. Return NormalCompletion(unused).
  3. Return CreateIteratorFromClosure(closure, "%SetIteratorPrototype%", %SetIteratorPrototype%).

24.2.6.2 %SetIteratorPrototype% 객체

%SetIteratorPrototype% 객체:

24.2.6.2.1 %SetIteratorPrototype%.next ( )

  1. Return ? 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 의 키/값 쌍이 더 이상 접근 불가능(inaccessible) 해진 시점과 그 키/값 쌍이 WeakMap 에서 제거되는 시점 사이에 임의로 결정된 지연(latency)을 부과할 수 있다. 이 지연이 ECMAScript 프로그램에 관측 가능하다면 프로그램 실행에 영향을 줄 수 있는 불확정성의 원천이 될 것이다. 이러한 이유로 ECMAScript 구현은 관찰자가 관찰하려는 키를 제시하지 않고 WeakMap 의 키를 관찰할 수 있는 어떤 수단도 제공해서는 안 된다.

WeakMap 은 평균적으로 컬렉션의 키/값 쌍 수에 대해 준선형 접근 시간을 제공하는 해시 테이블 또는 다른 메커니즘으로 구현되어야 한다. 명세에서 사용하는 자료 구조는 WeakMap 의 요구되는 관측 가능 의미를 설명하기 위한 것이며 실제 구현 모델을 의도하지 않는다.

Note

WeakMap 과 WeakSet 은 WeakMap 또는 WeakSet 인스턴스가 없었다면 해당 객체 혹은 심볼이 접근 불가능해져서 구현의 가비지 컬렉션 메커니즘에 의해 자원 회수 대상이 되었을 경우 메모리 자원을 “누출”하지 않는 방식으로 객체나 심볼에 상태를 동적으로 연관시키기 위한 메커니즘을 제공하기 위해 설계되었다. 이 특성은 WeakMap 또는 WeakSet 인스턴스에서 키로 객체/심볼을 역으로 매핑(inverted per-object/symbol mapping)하는 방식으로 달성할 수 있다. 또는 각 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. Return ? AddEntriesFromIterable(map, iterable, adder).
Note

매개변수 iterable 이 존재하면 첫 요소가 WeakMap 키로 사용될 값이고 두 번째 요소가 그 키에 연결할 값인 2-요소 배열 유사 객체를 생성하는 이터레이터 객체를 반환하는 %Symbol.iterator% 메서드를 구현한 객체일 것으로 기대된다.

24.3.2 WeakMap 생성자의 프로퍼티

WeakMap 생성자:

  • 값이 %Function.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 다음 프로퍼티를 가진다:

24.3.2.1 WeakMap.prototype

WeakMap.prototype 의 초기 값은 WeakMap 프로토타입 객체이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

24.3.3 WeakMap 프로토타입 객체의 프로퍼티

WeakMap 프로토타입 객체는:

  • %WeakMap.prototype% 이다.
  • 값이 %Object.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 일반 객체이다.
  • [[WeakMapData]] 내부 슬롯을 가지지 않는다.

24.3.3.1 WeakMap.prototype.constructor

WeakMap.prototype.constructor 의 초기 값은 %WeakMap% 이다.

24.3.3.2 WeakMap.prototype.delete ( key )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. M = this 값.
  2. RequireInternalSlot(M, [[WeakMapData]]) 수행.
  3. CanBeHeldWeakly(key) false 이면 false 반환.
  4. M.[[WeakMapData]] 의 각 Record { [[Key]], [[Value]] } p 에 대해
    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. M = this 값.
  2. RequireInternalSlot(M, [[WeakMapData]]) 수행.
  3. CanBeHeldWeakly(key) false 이면 undefined 반환.
  4. M.[[WeakMapData]] 의 각 Record { [[Key]], [[Value]] } p 에 대해
    1. p.[[Key]]empty 그리고 SameValue(p.[[Key]], key) = true 이면 p.[[Value]] 반환.
  5. undefined 반환.

24.3.3.4 WeakMap.prototype.has ( key )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. M = this 값.
  2. RequireInternalSlot(M, [[WeakMapData]]) 수행.
  3. CanBeHeldWeakly(key) false 이면 false 반환.
  4. M.[[WeakMapData]] 의 각 Record { [[Key]], [[Value]] } p 에 대해
    1. p.[[Key]]empty 그리고 SameValue(p.[[Key]], key) = true 이면 true 반환.
  5. false 반환.

24.3.3.5 WeakMap.prototype.set ( key, value )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. M = this 값.
  2. RequireInternalSlot(M, [[WeakMapData]]) 수행.
  3. CanBeHeldWeakly(key) false 이면 TypeError 예외.
  4. M.[[WeakMapData]] 의 각 Record { [[Key]], [[Value]] } p 에 대해
    1. p.[[Key]]empty 그리고 SameValue(p.[[Key]], key) = true 이면
      1. p.[[Value]] = value.
      2. M 반환.
  5. p = Record { [[Key]]: key, [[Value]]: value }.
  6. pM.[[WeakMapData]] 에 append.
  7. M 반환.

24.3.3.6 WeakMap.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티 초기 값은 String "WeakMap" 이다.

이 프로퍼티 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.

24.3.4 WeakMap 인스턴스의 프로퍼티

WeakMap 인스턴스는 일반 객체이며 WeakMap 프로토타입 객체로부터 프로퍼티를 상속한다. 또한 [[WeakMapData]] 내부 슬롯을 가진다.

24.4 WeakSet 객체

WeakSet 은 객체 및/또는 심볼의 컬렉션이다. 하나의 고유 객체나 심볼은 WeakSet 컬렉션에서 한 번만 요소로 등장할 수 있다. WeakSet 은 특정 값을 포함하는지 질의할 수 있지만, 보유한 값을 열거하는 메커니즘은 제공되지 않는다. 특정 조건에서 live 가 아닌 값들은 9.9.3 에 설명된 바와 같이 WeakSet 요소로서 제거된다.

구현은 WeakSet 이 포함한 값이 접근 불가능하게 된 시점과 그 값이 WeakSet 에서 제거되는 시점 사이에 임의로 결정된 지연을 부과할 수 있다. 이 지연이 ECMAScript 프로그램에 관측 가능하다면 프로그램 실행에 영향을 줄 수 있는 불확정성의 원인이 된다. 이러한 이유로 ECMAScript 구현은 관찰자가 관찰된 값을 제시하지 않고 WeakSet 이 특정 값을 포함하는지 결정할 수 있는 수단을 제공해서는 안 된다.

WeakSet 은 평균적으로 컬렉션 요소 수에 대해 준선형 접근 시간을 제공하는 해시 테이블 또는 다른 메커니즘으로 구현되어야 한다. 명세에서 사용하는 자료 구조는 WeakSet 의 요구되는 관측 가능 의미를 설명하기 위한 것이며 실제 구현 모델을 의도하지 않는다.

Note

24.3 의 NOTE 참고.

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. 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 프로토타입 객체이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

24.4.3 WeakSet 프로토타입 객체의 프로퍼티

WeakSet 프로토타입 객체는:

  • %WeakSet.prototype% 이다.
  • 값이 %Object.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 일반 객체이다.
  • [[WeakSetData]] 내부 슬롯을 가지지 않는다.

24.4.3.1 WeakSet.prototype.add ( value )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. S = this 값.
  2. RequireInternalSlot(S, [[WeakSetData]]) 수행.
  3. CanBeHeldWeakly(value) false 이면 TypeError 예외.
  4. S.[[WeakSetData]] 의 각 요소 e 에 대해
    1. eempty 그리고 SameValue(e, value) = true 이면
      1. S 반환.
  5. valueS.[[WeakSetData]] 에 append.
  6. S 반환.

24.4.3.2 WeakSet.prototype.constructor

WeakSet.prototype.constructor 의 초기 값은 %WeakSet% 이다.

24.4.3.3 WeakSet.prototype.delete ( value )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. S = this 값.
  2. RequireInternalSlot(S, [[WeakSetData]]) 수행.
  3. CanBeHeldWeakly(value) false 이면 false 반환.
  4. S.[[WeakSetData]] 의 각 요소 e 에 대해
    1. eempty 그리고 SameValue(e, value) = true 이면
      1. 값이 eS.[[WeakSetData]] 요소를 값이 empty 인 요소로 교체.
      2. true 반환.
  5. false 반환.
Note

empty 는 엔트리가 삭제되었음을 나타내는 명세 기법이다. 실제 구현은 내부 자료 구조에서 물리적으로 제거하는 등의 다른 동작을 할 수 있다.

24.4.3.4 WeakSet.prototype.has ( value )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. S = this 값.
  2. RequireInternalSlot(S, [[WeakSetData]]) 수행.
  3. CanBeHeldWeakly(value) false 이면 false 반환.
  4. S.[[WeakSetData]] 의 각 요소 e 에 대해
    1. eempty 그리고 SameValue(e, 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 프로토타입 객체로부터 프로퍼티를 상속한다. 또한 [[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 반환.