24 키 기반 컬렉션

24.1 Map 객체

Map은 키와 값이 모두 임의의 ECMAScript 언어 값일 수 있는 키/값 쌍의 컬렉션이다. 서로 다른 키 값은 Map의 컬렉션 안에서 하나의 키/값 쌍에만 나타날 수 있다. 서로 다른 키 값은 SameValueZero 비교 알고리즘의 의미론을 사용하여 구별된다.

Map은 평균적으로 컬렉션의 요소 수에 대해 준선형보다 빠른 접근 시간을 제공하는 해시 테이블이나 다른 메커니즘을 사용하여 구현되어야 한다. 이 명세에서 사용되는 자료 구조는 Map의 요구되는 관찰 가능한 의미론을 설명하기 위한 것일 뿐이다. 실행 가능한 구현 모델로 의도된 것이 아니다.

24.1.1 Map 생성자

Map 생성자는:

  • %Map%이다.
  • 전역 객체"Map" 속성의 초기값이다.
  • 생성자로 호출될 때 새로운 Map을 생성하고 초기화한다.
  • 함수로 호출되도록 의도되지 않았으며, 그런 방식으로 호출되면 예외를 던진다.
  • 클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 Map 동작을 상속하려는 서브클래스 생성자는 Map.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 Map 생성자에 대한 super 호출을 포함해야 한다.

24.1.1.1 Map ( [ iterable ] )

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

  1. NewTarget이 undefined이면, TypeError 예외를 던진다.
  2. map을 ? OrdinaryCreateFromConstructor(NewTarget, "%Map.prototype%", « [[MapData]] »)라고 하자.
  3. map.[[MapData]]를 새로운 빈 List로 설정한다.
  4. iterableundefined 또는 null이면, map을 반환한다.
  5. adder를 ? Get(map, "set")이라고 하자.
  6. IsCallable(adder)가 false이면, TypeError 예외를 던진다.
  7. AddEntriesFromIterable(map, iterable, adder)를 반환한다.
Note

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

24.1.1.2 AddEntriesFromIterable ( target, iterable, adder )

The abstract operation AddEntriesFromIterable takes arguments target (an Object), iterable (an ECMAScript language value, but not undefined or null), and adder (a function object) and returns either a normal completion containing an Object or a throw completion. addertarget을 수신자로 하여 호출된다. It performs the following steps when called:

  1. iteratorRecord를 ? GetIterator(iterable, sync)라고 하자.
  2. 반복한다,
    1. next를 ? IteratorStepValue(iteratorRecord)라고 하자.
    2. nextdone이면, target을 반환한다.
    3. next가 Object가 아니면,
      1. errorThrowCompletion(새로 생성된 TypeError 객체)라고 하자.
      2. IteratorClose(iteratorRecord, error)를 반환한다.
    4. keyCompletion(Get(next, "0")).
    5. IfAbruptCloseIterator(key, iteratorRecord).
    6. valueCompletion(Get(next, "1")).
    7. IfAbruptCloseIterator(value, iteratorRecord).
    8. statusCompletion(Call(adder, target, « key, value »))라고 하자.
    9. IfAbruptCloseIterator(status, iteratorRecord).
Note

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

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. groups의 각 Record { [[Key]], [[Elements]] } group에 대해, 다음을 수행한다.
    1. elementsCreateArrayFromList(group.[[Elements]])라고 하자.
    2. entryRecord { [[Key]]: group.[[Key]], [[Value]]: elements }라고 하자.
    3. entrymap.[[MapData]]에 추가한다.
  4. map을 반환한다.

24.1.2.2 Map.prototype

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

이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성 특성을 가진다.

24.1.2.3 get Map [ %Symbol.species% ]

Map[%Symbol.species%]는 set 접근자 함수가 undefined인 접근자 속성이다. 그 get 접근자 함수는 호출될 때 다음 단계를 수행한다:

  1. this 값을 반환한다.

이 함수의 "name" 속성의 값은 "get [Symbol.species]"이다.

Note

파생 컬렉션 객체를 생성하는 메서드는 파생 객체를 생성하는 데 사용할 생성자를 결정하기 위해 %Symbol.species%를 호출해야 한다. 서브클래스 생성자는 %Symbol.species%를 재정의하여 기본 생성자 할당을 변경할 수 있다.

24.1.3 Map 프로토타입 객체의 속성

Map 프로토타입 객체는:

  • %Map.prototype%이다.
  • 값이 %Object.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 보통 객체이다.
  • [[MapData]] 내부 슬롯을 가지지 않는다.

24.1.3.1 Map.prototype.clear ( )

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

  1. mapthis 값이라고 하자.
  2. RequireInternalSlot(map, [[MapData]])를 수행한다.
  3. map.[[MapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty로 설정한다.
    2. entry.[[Value]]empty로 설정한다.
  4. undefined를 반환한다.
Note

기존 [[MapData]] List는 보존된다. 그 List를 순회하는 도중에 중단된 기존 Map Iterator 객체가 있을 수 있기 때문이다.

24.1.3.2 Map.prototype.constructor

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

24.1.3.3 Map.prototype.delete ( key )

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

  1. mapthis 값이라고 하자.
  2. RequireInternalSlot(map, [[MapData]])를 수행한다.
  3. keyCanonicalizeKeyedCollectionKey(key)로 설정한다.
  4. map.[[MapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면,
      1. entry.[[Key]]empty로 설정한다.
      2. entry.[[Value]]empty로 설정한다.
      3. true를 반환한다.
  5. false를 반환한다.
Note

empty는 엔트리가 삭제되었음을 나타내기 위한 명세상의 장치로 사용된다. 실제 구현은 내부 자료 구조에서 엔트리를 물리적으로 제거하는 것과 같은 다른 동작을 취할 수 있다.

24.1.3.4 Map.prototype.entries ( )

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

  1. mapthis 값이라고 하자.
  2. CreateMapIterator(map, key+value)를 반환한다.

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

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

  1. mapthis 값이라고 하자.
  2. RequireInternalSlot(map, [[MapData]])를 수행한다.
  3. IsCallable(callback)가 false이면, TypeError 예외를 던진다.
  4. entriesmap.[[MapData]]라고 하자.
  5. numEntriesentries의 요소 개수라고 하자.
  6. index를 0이라고 하자.
  7. index < numEntries인 동안 반복한다,
    1. eentries[index]라고 하자.
    2. indexindex + 1로 설정한다.
    3. e.[[Key]]empty가 아니면,
      1. Call(callback, thisArg, « e.[[Value]], e.[[Key]], map »)를 수행한다.
      2. NOTE: callback 실행 중에 entries의 요소 개수가 증가했을 수 있다.
      3. numEntriesentries의 요소 개수로 설정한다.
  8. undefined를 반환한다.
Note

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

thisArg 매개변수가 제공되면, callback의 각 호출에서 this 값으로 사용된다. 제공되지 않으면, 대신 undefined가 사용된다.

callback은 항목의 값, 항목의 키, 그리고 순회 중인 Map이라는 세 인자와 함께 호출된다.

forEach는 호출 대상 객체를 직접 변경하지 않지만, callback 호출에 의해 객체가 변경될 수 있다. Map의 [[MapData]]의 각 엔트리는 한 번만 방문된다. forEach 호출이 시작된 뒤 추가된 새 키도 방문된다. 어떤 키가 방문된 뒤 삭제되고 forEach 호출이 완료되기 전에 다시 추가되면 그 키는 다시 방문된다. forEach 호출이 시작된 뒤 방문되기 전에 삭제된 키는 forEach 호출이 완료되기 전에 그 키가 다시 추가되지 않는 한 방문되지 않는다.

24.1.3.6 Map.prototype.get ( key )

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

  1. mapthis 값이라고 하자.
  2. RequireInternalSlot(map, [[MapData]])를 수행한다.
  3. keyCanonicalizeKeyedCollectionKey(key)로 설정한다.
  4. map.[[MapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면, entry.[[Value]]를 반환한다.
  5. undefined를 반환한다.

24.1.3.7 Map.prototype.getOrInsert ( key, value )

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

  1. mapthis 값이라고 하자.
  2. RequireInternalSlot(map, [[MapData]])를 수행한다.
  3. keyCanonicalizeKeyedCollectionKey(key)로 설정한다.
  4. map.[[MapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면, entry.[[Value]]를 반환한다.
  5. entryRecord { [[Key]]: key, [[Value]]: value }라고 하자.
  6. entrymap.[[MapData]]에 추가한다.
  7. value를 반환한다.

24.1.3.8 Map.prototype.getOrInsertComputed ( key, callback )

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

  1. mapthis 값이라고 하자.
  2. RequireInternalSlot(map, [[MapData]])를 수행한다.
  3. IsCallable(callback)가 false이면, TypeError 예외를 던진다.
  4. keyCanonicalizeKeyedCollectionKey(key)로 설정한다.
  5. map.[[MapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면, entry.[[Value]]를 반환한다.
  6. value를 ? Call(callback, undefined, « key »)라고 하자.
  7. NOTE: callback 실행 중에 Map이 변경되었을 수 있다.
  8. map.[[MapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면,
      1. entry.[[Value]]value로 설정한다.
      2. value를 반환한다.
  9. entryRecord { [[Key]]: key, [[Value]]: value }라고 하자.
  10. entrymap.[[MapData]]에 추가한다.
  11. value를 반환한다.

24.1.3.9 Map.prototype.has ( key )

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

  1. mapthis 값이라고 하자.
  2. RequireInternalSlot(map, [[MapData]])를 수행한다.
  3. keyCanonicalizeKeyedCollectionKey(key)로 설정한다.
  4. map.[[MapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면, true를 반환한다.
  5. false를 반환한다.

24.1.3.10 Map.prototype.keys ( )

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

  1. mapthis 값이라고 하자.
  2. CreateMapIterator(map, key)를 반환한다.

24.1.3.11 Map.prototype.set ( key, value )

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

  1. mapthis 값이라고 하자.
  2. RequireInternalSlot(map, [[MapData]])를 수행한다.
  3. keyCanonicalizeKeyedCollectionKey(key)로 설정한다.
  4. map.[[MapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면,
      1. entry.[[Value]]value로 설정한다.
      2. map을 반환한다.
  5. entryRecord { [[Key]]: key, [[Value]]: value }라고 하자.
  6. entrymap.[[MapData]]에 추가한다.
  7. map을 반환한다.

24.1.3.12 get Map.prototype.size

Map.prototype.size는 set 접근자 함수가 undefined인 접근자 속성이다. 그 get 접근자 함수는 호출될 때 다음 단계를 수행한다:

  1. mapthis 값이라고 하자.
  2. RequireInternalSlot(map, [[MapData]])를 수행한다.
  3. count를 0이라고 하자.
  4. map.[[MapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니면, countcount + 1로 설정한다.
  5. 𝔽(count)를 반환한다.

24.1.3.13 Map.prototype.values ( )

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

  1. mapthis 값이라고 하자.
  2. CreateMapIterator(map, value)를 반환한다.

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

%Symbol.iterator% 속성의 초기값은 24.1.3.4에 정의된 %Map.prototype.entries%이다.

24.1.3.15 Map.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 속성의 초기값은 String 값 "Map"이다.

이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.

24.1.4 Map 인스턴스의 속성

Map 인스턴스는 Map 프로토타입 객체로부터 속성을 상속하는 보통 객체이다. Map 인스턴스는 또한 [[MapData]] 내부 슬롯을 가진다.

24.1.5 Map Iterator 객체

Map Iterator는 어떤 특정 Map 인스턴스 객체에 대한 특정 반복을 나타내는 객체이다. Map Iterator 객체에는 이름 있는 생성자가 없다. 대신, Map Iterator 객체는 Map 인스턴스 객체의 특정 메서드를 호출하여 생성된다.

24.1.5.1 CreateMapIterator ( map, kind )

The abstract operation CreateMapIterator takes arguments map (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 메서드를 위한 iterator 객체를 생성하는 데 사용된다. It performs the following steps when called:

  1. RequireInternalSlot(map, [[MapData]])를 수행한다.
  2. closuremapkind를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closure라고 하자:
    1. entriesmap.[[MapData]]라고 하자.
    2. index를 0이라고 하자.
    3. numEntriesentries의 요소 개수라고 하자.
    4. index < numEntries인 동안 반복한다,
      1. entryentries[index]라고 하자.
      2. indexindex + 1로 설정한다.
      3. entry.[[Key]]empty가 아니면,
        1. kindkey이면,
          1. resultentry.[[Key]]라고 하자.
        2. 그렇지 않고 kindvalue이면,
          1. resultentry.[[Value]]라고 하자.
        3. 그렇지 않으면,
          1. Assert: kindkey+value이다.
          2. resultCreateArrayFromListentry.[[Key]], entry.[[Value]] »)라고 하자.
        4. GeneratorYield(CreateIteratorResultObject(result, false))를 수행한다.
        5. NOTE: GeneratorYield에 의해 이 추상 연산의 실행이 일시 중단된 동안 entries의 요소 개수가 증가했을 수 있다.
        6. numEntriesentries의 요소 개수로 설정한다.
    5. NormalCompletion(unused)를 반환한다.
  3. CreateIteratorFromClosure(closure, "%MapIteratorPrototype%", %MapIteratorPrototype%)를 반환한다.

24.1.5.2 %MapIteratorPrototype% 객체

%MapIteratorPrototype% 객체는:

  • 모든 Map Iterator 객체가 상속하는 속성을 가진다.
  • 보통 객체이다.
  • 값이 %Iterator.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 다음 속성들을 가진다:

24.1.5.2.1 %MapIteratorPrototype%.next ( )

  1. GeneratorResume(this value, empty, "%MapIteratorPrototype%")를 반환한다.

24.1.5.2.2 %MapIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 속성의 초기값은 String 값 "Map Iterator"이다.

이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.

24.2 Set 객체

Set 객체는 ECMAScript 언어 값의 컬렉션이다. Set은 서로 다른 각 값을 최대 한 번만 포함할 수 있다. 서로 다른 값은 SameValueZero 비교 알고리즘의 의미론을 사용하여 구별된다.

Set 객체는 평균적으로 컬렉션의 요소 수에 대해 준선형보다 빠른 접근 시간을 제공하는 해시 테이블이나 다른 메커니즘을 사용하여 구현되어야 한다. 이 명세에서 사용되는 자료 구조는 Set 객체의 요구되는 관찰 가능한 의미론을 설명하기 위한 것일 뿐이다. 실행 가능한 구현 모델로 의도된 것이 아니다.

24.2.1 Set 객체를 위한 추상 연산

24.2.1.1 Set Records

Set Record는 Set 또는 유사 객체의 인터페이스를 캡슐화하는 데 사용되는 Record 값이다.

Set Record는 Table 71에 나열된 필드를 가진다.

Table 71: Set Record 필드
필드 이름 의미
[[SetObject]] Object Set 또는 유사 객체.
[[Size]] 음이 아닌 정수 또는 +∞ 객체의 보고된 크기.
[[Has]] 함수 객체 객체의 has 메서드.
[[Keys]] 함수 객체 객체의 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가 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 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. esetData[index]라고 하자.
    2. eempty가 아니고 evalue이면,
      1. index를 반환한다.
    3. indexindex + 1로 설정한다.
  5. not-found를 반환한다.

24.2.1.5 SetDataSize ( setData )

The abstract operation SetDataSize takes argument setData (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. setData의 각 요소 e에 대해, 다음을 수행한다.
    1. eempty가 아니면, countcount + 1로 설정한다.
  3. count를 반환한다.

24.2.2 Set 생성자

Set 생성자는:

  • %Set%이다.
  • 전역 객체"Set" 속성의 초기값이다.
  • 생성자로 호출될 때 새로운 Set 객체를 생성하고 초기화한다.
  • 함수로 호출되도록 의도되지 않았으며, 그런 방식으로 호출되면 예외를 던진다.
  • 클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 Set 동작을 상속하려는 서브클래스 생성자는 Set.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 Set 생성자에 대한 super 호출을 포함해야 한다.

24.2.2.1 Set ( [ iterable ] )

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

  1. NewTarget이 undefined이면, TypeError 예외를 던진다.
  2. set을 ? OrdinaryCreateFromConstructor(NewTarget, "%Set.prototype%", « [[SetData]] »)라고 하자.
  3. set.[[SetData]]를 새로운 빈 List로 설정한다.
  4. iterableundefined 또는 null이면, set을 반환한다.
  5. adder를 ? Get(set, "add")라고 하자.
  6. IsCallable(adder)가 false이면, TypeError 예외를 던진다.
  7. iteratorRecord를 ? GetIterator(iterable, sync)라고 하자.
  8. 반복한다,
    1. next를 ? IteratorStepValue(iteratorRecord)라고 하자.
    2. nextdone이면, set을 반환한다.
    3. statusCompletion(Call(adder, set, « next »))라고 하자.
    4. IfAbruptCloseIterator(status, iteratorRecord).

24.2.3 Set 생성자의 속성

Set 생성자는:

  • 값이 %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. setthis 값이라고 하자.
  2. RequireInternalSlot(set, [[SetData]])를 수행한다.
  3. valueCanonicalizeKeyedCollectionKey(value)로 설정한다.
  4. set.[[SetData]]의 각 요소 entry에 대해, 다음을 수행한다.
    1. entryempty가 아니고 SameValue(entry, value)가 true이면,
      1. set을 반환한다.
  5. valueset.[[SetData]]에 추가한다.
  6. set을 반환한다.

24.2.4.2 Set.prototype.clear ( )

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

  1. setthis 값이라고 하자.
  2. RequireInternalSlot(set, [[SetData]])를 수행한다.
  3. set.[[SetData]]의 각 요소 entry에 대해, 다음을 수행한다.
    1. 값이 entryset.[[SetData]]의 요소를 값이 empty인 요소로 대체한다.
  4. undefined를 반환한다.
Note

기존 [[SetData]] List는 보존된다. 그 List를 순회하는 도중에 중단된 기존 Set Iterator 객체가 있을 수 있기 때문이다.

24.2.4.3 Set.prototype.constructor

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

24.2.4.4 Set.prototype.delete ( value )

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

  1. setthis 값이라고 하자.
  2. RequireInternalSlot(set, [[SetData]])를 수행한다.
  3. valueCanonicalizeKeyedCollectionKey(value)로 설정한다.
  4. set.[[SetData]]의 각 요소 entry에 대해, 다음을 수행한다.
    1. entryempty가 아니고 SameValue(entry, value)가 true이면,
      1. 값이 entryset.[[SetData]]의 요소를 값이 empty인 요소로 대체한다.
      2. true를 반환한다.
  5. false를 반환한다.
Note

empty는 엔트리가 삭제되었음을 나타내기 위한 명세상의 장치로 사용된다. 실제 구현은 내부 자료 구조에서 엔트리를 물리적으로 제거하는 것과 같은 다른 동작을 취할 수 있다.

24.2.4.5 Set.prototype.difference ( other )

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

  1. setthis 값이라고 하자.
  2. RequireInternalSlot(set, [[SetData]])를 수행한다.
  3. otherRec를 ? GetSetRecord(other)라고 하자.
  4. resultSetDataset.[[SetData]]의 사본이라고 하자.
  5. SetDataSize(set.[[SetData]]) ≤ otherRec.[[Size]]이면,
    1. thisSizeset.[[SetData]]의 요소 개수라고 하자.
    2. index를 0이라고 하자.
    3. index < thisSize인 동안 반복한다,
      1. entryresultSetData[index]라고 하자.
      2. entryempty가 아니면,
        1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « entry »))라고 하자.
        2. inOthertrue이면,
          1. resultSetData[index]를 empty로 설정한다.
      3. indexindex + 1로 설정한다.
  6. 그렇지 않으면,
    1. keysIter를 ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])라고 하자.
    2. nextnot-started라고 하자.
    3. nextdone이 아닌 동안 반복한다,
      1. next를 ? IteratorStepValue(keysIter)로 설정한다.
      2. nextdone이 아니면,
        1. nextCanonicalizeKeyedCollectionKey(next)로 설정한다.
        2. valueIndexSetDataIndex(resultSetData, next)라고 하자.
        3. valueIndexnot-found가 아니면,
          1. resultSetData[valueIndex]를 empty로 설정한다.
  7. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)라고 하자.
  8. result.[[SetData]]resultSetData로 설정한다.
  9. result를 반환한다.

24.2.4.6 Set.prototype.entries ( )

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

  1. setthis 값이라고 하자.
  2. CreateSetIterator(set, key+value)를 반환한다.
Note

반복 목적상 Set은 각 엔트리가 키와 값으로 같은 값을 가지는 Map과 유사하게 보인다.

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

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

  1. setthis 값이라고 하자.
  2. RequireInternalSlot(set, [[SetData]])를 수행한다.
  3. IsCallable(callback)가 false이면, TypeError 예외를 던진다.
  4. entriesset.[[SetData]]라고 하자.
  5. numEntriesentries의 요소 개수라고 하자.
  6. index를 0이라고 하자.
  7. index < numEntries인 동안 반복한다,
    1. entryentries[index]라고 하자.
    2. indexindex + 1로 설정한다.
    3. entryempty가 아니면,
      1. Call(callback, thisArg, « entry, entry, set »)를 수행한다.
      2. NOTE: callback 실행 중에 entries의 요소 개수가 증가했을 수 있다.
      3. numEntriesentries의 요소 개수로 설정한다.
  8. undefined를 반환한다.
Note

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

thisArg 매개변수가 제공되면, callback의 각 호출에서 this 값으로 사용된다. 제공되지 않으면, 대신 undefined가 사용된다.

callback은 세 인자와 함께 호출된다: 첫 두 인자는 Set에 포함된 값이다. 두 인자 모두에 같은 값이 전달된다. 순회 중인 Set 객체가 세 번째 인자로 전달된다.

callback은 Map과 Array의 forEach 메서드가 사용하는 콜백 함수와 일관되도록 세 인자와 함께 호출된다. Set의 경우, 각 항목 값은 키이자 값으로 간주된다.

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

각 값은 보통 한 번만 방문된다. 그러나 어떤 값이 방문된 뒤 삭제되고 forEach 호출이 완료되기 전에 다시 추가되면 그 값은 다시 방문된다. forEach 호출이 시작된 뒤 방문되기 전에 삭제된 값은 forEach 호출이 완료되기 전에 그 값이 다시 추가되지 않는 한 방문되지 않는다. forEach 호출이 시작된 뒤 추가된 새 값은 방문된다.

24.2.4.8 Set.prototype.has ( value )

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

  1. setthis 값이라고 하자.
  2. RequireInternalSlot(set, [[SetData]])를 수행한다.
  3. valueCanonicalizeKeyedCollectionKey(value)로 설정한다.
  4. set.[[SetData]]의 각 요소 entry에 대해, 다음을 수행한다.
    1. entryempty가 아니고 SameValue(entry, value)가 true이면, true를 반환한다.
  5. false를 반환한다.

24.2.4.9 Set.prototype.intersection ( other )

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

  1. setthis 값이라고 하자.
  2. RequireInternalSlot(set, [[SetData]])를 수행한다.
  3. otherRec를 ? GetSetRecord(other)라고 하자.
  4. resultSetData를 새로운 빈 List라고 하자.
  5. SetDataSize(set.[[SetData]]) ≤ otherRec.[[Size]]이면,
    1. thisSizeset.[[SetData]]의 요소 개수라고 하자.
    2. index를 0이라고 하자.
    3. index < thisSize인 동안 반복한다,
      1. entryset.[[SetData]][index]라고 하자.
      2. indexindex + 1로 설정한다.
      3. entryempty가 아니면,
        1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « entry »))라고 하자.
        2. inOthertrue이면,
          1. NOTE: 이전의 otherRec.[[Has]] 호출이 set.[[SetData]]의 요소를 제거하고 다시 추가할 수 있으며, 이는 이 반복 중 같은 요소가 두 번 방문되게 할 수 있다.
          2. SetDataHas(resultSetData, entry)가 false이면,
            1. entryresultSetData에 추가한다.
        3. NOTE: otherRec.[[Has]] 실행 중에 set.[[SetData]]의 요소 개수가 증가했을 수 있다.
        4. thisSizeset.[[SetData]]의 요소 개수로 설정한다.
  6. 그렇지 않으면,
    1. keysIter를 ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])라고 하자.
    2. nextnot-started라고 하자.
    3. nextdone이 아닌 동안 반복한다,
      1. next를 ? IteratorStepValue(keysIter)로 설정한다.
      2. nextdone이 아니면,
        1. nextCanonicalizeKeyedCollectionKey(next)로 설정한다.
        2. inThisSetDataHas(set.[[SetData]], next)라고 하자.
        3. inThistrue이면,
          1. NOTE: other는 임의의 객체이므로, 그 "keys" iterator가 같은 값을 두 번 이상 생성할 수 있다.
          2. SetDataHas(resultSetData, next)가 false이면,
            1. nextresultSetData에 추가한다.
  7. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)라고 하자.
  8. result.[[SetData]]resultSetData로 설정한다.
  9. result를 반환한다.

24.2.4.10 Set.prototype.isDisjointFrom ( other )

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

  1. setthis 값이라고 하자.
  2. RequireInternalSlot(set, [[SetData]])를 수행한다.
  3. otherRec를 ? GetSetRecord(other)라고 하자.
  4. SetDataSize(set.[[SetData]]) ≤ otherRec.[[Size]]이면,
    1. thisSizeset.[[SetData]]의 요소 개수라고 하자.
    2. index를 0이라고 하자.
    3. index < thisSize인 동안 반복한다,
      1. entryset.[[SetData]][index]라고 하자.
      2. indexindex + 1로 설정한다.
      3. entryempty가 아니면,
        1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « entry »))라고 하자.
        2. inOthertrue이면, false를 반환한다.
        3. NOTE: otherRec.[[Has]] 실행 중에 set.[[SetData]]의 요소 개수가 증가했을 수 있다.
        4. thisSizeset.[[SetData]]의 요소 개수로 설정한다.
  5. 그렇지 않으면,
    1. keysIter를 ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])라고 하자.
    2. nextnot-started라고 하자.
    3. nextdone이 아닌 동안 반복한다,
      1. next를 ? IteratorStepValue(keysIter)로 설정한다.
      2. nextdone이 아니면,
        1. SetDataHas(set.[[SetData]], next)가 true이면,
          1. IteratorClose(keysIter, NormalCompletion(unused))를 수행한다.
          2. false를 반환한다.
  6. true를 반환한다.

24.2.4.11 Set.prototype.isSubsetOf ( other )

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

  1. setthis 값이라고 하자.
  2. RequireInternalSlot(set, [[SetData]])를 수행한다.
  3. otherRec를 ? GetSetRecord(other)라고 하자.
  4. SetDataSize(set.[[SetData]]) > otherRec.[[Size]]이면, false를 반환한다.
  5. thisSizeset.[[SetData]]의 요소 개수라고 하자.
  6. index를 0이라고 하자.
  7. index < thisSize인 동안 반복한다,
    1. entryset.[[SetData]][index]라고 하자.
    2. indexindex + 1로 설정한다.
    3. entryempty가 아니면,
      1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « entry »))라고 하자.
      2. inOtherfalse이면, false를 반환한다.
      3. NOTE: otherRec.[[Has]] 실행 중에 set.[[SetData]]의 요소 개수가 증가했을 수 있다.
      4. thisSizeset.[[SetData]]의 요소 개수로 설정한다.
  8. true를 반환한다.

24.2.4.12 Set.prototype.isSupersetOf ( other )

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

  1. setthis 값이라고 하자.
  2. RequireInternalSlot(set, [[SetData]])를 수행한다.
  3. otherRec를 ? GetSetRecord(other)라고 하자.
  4. SetDataSize(set.[[SetData]]) < otherRec.[[Size]]이면, false를 반환한다.
  5. keysIter를 ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])라고 하자.
  6. nextnot-started라고 하자.
  7. nextdone이 아닌 동안 반복한다,
    1. next를 ? IteratorStepValue(keysIter)로 설정한다.
    2. nextdone이 아니면,
      1. SetDataHas(set.[[SetData]], next)가 false이면,
        1. IteratorClose(keysIter, NormalCompletion(unused))를 수행한다.
        2. false를 반환한다.
  8. true를 반환한다.

24.2.4.13 Set.prototype.keys ( )

"keys" 속성의 초기값은 24.2.4.17에 정의된 %Set.prototype.values%이다.

Note

반복 목적상 Set은 각 엔트리가 키와 값으로 같은 값을 가지는 Map과 유사하게 보인다.

24.2.4.14 get Set.prototype.size

Set.prototype.size는 set 접근자 함수가 undefined인 접근자 속성이다. 그 get 접근자 함수는 호출될 때 다음 단계를 수행한다:

  1. setthis 값이라고 하자.
  2. RequireInternalSlot(set, [[SetData]])를 수행한다.
  3. sizeSetDataSize(set.[[SetData]])라고 하자.
  4. 𝔽(size)를 반환한다.

24.2.4.15 Set.prototype.symmetricDifference ( other )

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

  1. setthis 값이라고 하자.
  2. RequireInternalSlot(set, [[SetData]])를 수행한다.
  3. otherRec를 ? GetSetRecord(other)라고 하자.
  4. keysIter를 ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])라고 하자.
  5. resultSetDataset.[[SetData]]의 사본이라고 하자.
  6. nextnot-started라고 하자.
  7. nextdone이 아닌 동안 반복한다,
    1. next를 ? IteratorStepValue(keysIter)로 설정한다.
    2. nextdone이 아니면,
      1. nextCanonicalizeKeyedCollectionKey(next)로 설정한다.
      2. resultIndexSetDataIndex(resultSetData, next)라고 하자.
      3. resultIndexnot-found이면 alreadyInResultfalse라고 하자; 그렇지 않으면 alreadyInResulttrue라고 하자.
      4. SetDataHas(set.[[SetData]], next)가 true이면,
        1. alreadyInResulttrue이면, resultSetData[resultIndex]를 empty로 설정한다.
      5. 그렇지 않으면,
        1. alreadyInResultfalse이면, nextresultSetData에 추가한다.
  8. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)라고 하자.
  9. result.[[SetData]]resultSetData로 설정한다.
  10. result를 반환한다.

24.2.4.16 Set.prototype.union ( other )

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

  1. setthis 값이라고 하자.
  2. RequireInternalSlot(set, [[SetData]])를 수행한다.
  3. otherRec를 ? GetSetRecord(other)라고 하자.
  4. keysIter를 ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])라고 하자.
  5. resultSetDataset.[[SetData]]의 사본이라고 하자.
  6. nextnot-started라고 하자.
  7. nextdone이 아닌 동안 반복한다,
    1. next를 ? IteratorStepValue(keysIter)로 설정한다.
    2. nextdone이 아니면,
      1. nextCanonicalizeKeyedCollectionKey(next)로 설정한다.
      2. SetDataHas(resultSetData, next)가 false이면,
        1. nextresultSetData에 추가한다.
  8. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)라고 하자.
  9. result.[[SetData]]resultSetData로 설정한다.
  10. result를 반환한다.

24.2.4.17 Set.prototype.values ( )

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

  1. setthis 값이라고 하자.
  2. CreateSetIterator(set, value)를 반환한다.

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

%Symbol.iterator% 속성의 초기값은 24.2.4.17에 정의된 %Set.prototype.values%이다.

24.2.4.19 Set.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 속성의 초기값은 String 값 "Set"이다.

이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.

24.2.5 Set 인스턴스의 속성

Set 인스턴스는 Set 프로토타입 객체로부터 속성을 상속하는 보통 객체이다. Set 인스턴스는 또한 [[SetData]] 내부 슬롯을 가진다.

24.2.6 Set Iterator 객체

Set Iterator는 아래에 정의된 구조를 가지는 보통 객체로, 어떤 특정 Set 인스턴스 객체에 대한 특정 반복을 나타낸다. Set Iterator 객체에는 이름 있는 생성자가 없다. 대신, Set Iterator 객체는 Set 인스턴스 객체의 특정 메서드를 호출하여 생성된다.

24.2.6.1 CreateSetIterator ( set, kind )

The abstract operation CreateSetIterator takes arguments set (an ECMAScript language value) and kind (key+value or value) and returns either a normal completion containing a Generator or a throw completion. 그러한 반복자를 반환하는 Set 메서드를 위한 iterator 객체를 생성하는 데 사용된다. It performs the following steps when called:

  1. RequireInternalSlot(set, [[SetData]])를 수행한다.
  2. closuresetkind를 캡처하고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closure라고 하자:
    1. index를 0이라고 하자.
    2. entriesset.[[SetData]]라고 하자.
    3. numEntriesentries의 요소 개수라고 하자.
    4. index < numEntries인 동안 반복한다,
      1. entryentries[index]라고 하자.
      2. indexindex + 1로 설정한다.
      3. entryempty가 아니면,
        1. kindkey+value이면,
          1. resultCreateArrayFromListentry, entry »)라고 하자.
          2. GeneratorYield(CreateIteratorResultObject(result, false))를 수행한다.
        2. 그렇지 않으면,
          1. Assert: kindvalue이다.
          2. GeneratorYield(CreateIteratorResultObject(entry, false))를 수행한다.
        3. NOTE: GeneratorYield에 의해 이 추상 연산의 실행이 일시 중단된 동안 entries의 요소 개수가 증가했을 수 있다.
        4. numEntriesentries의 요소 개수로 설정한다.
    5. NormalCompletion(unused)를 반환한다.
  3. CreateIteratorFromClosure(closure, "%SetIteratorPrototype%", %SetIteratorPrototype%)를 반환한다.

24.2.6.2 %SetIteratorPrototype% 객체

%SetIteratorPrototype% 객체는:

  • 모든 Set Iterator 객체가 상속하는 속성을 가진다.
  • 보통 객체이다.
  • 값이 %Iterator.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 다음 속성들을 가진다:

24.2.6.2.1 %SetIteratorPrototype%.next ( )

  1. GeneratorResume(this value, empty, "%SetIteratorPrototype%")를 반환한다.

24.2.6.2.2 %SetIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 속성의 초기값은 String 값 "Set Iterator"이다.

이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.

24.3 WeakMap 객체

WeakMap은 키가 객체 및/또는 심벌이고 값은 임의의 ECMAScript 언어 값일 수 있는 키/값 쌍의 컬렉션이다. WeakMap은 특정 키를 가진 키/값 쌍을 포함하는지 조회할 수 있지만, 키로 보유한 값들을 열거하는 메커니즘은 제공되지 않는다. 특정 조건에서는 live가 아닌 값들이 9.9.3에 설명된 대로 WeakMap 키에서 제거된다.

구현은 WeakMap의 키/값 쌍이 접근 불가능해진 시점과 그 키/값 쌍이 WeakMap에서 제거되는 시점 사이에 임의로 결정된 지연을 부과할 수 있다. 이 지연이 ECMAScript 프로그램에 관찰 가능하다면, 프로그램 실행에 영향을 줄 수 있는 비결정성의 원천이 될 것이다. 그러므로 ECMAScript 구현은 관찰자가 관찰되는 키를 제시할 것을 요구하지 않는 방식으로 WeakMap의 키를 관찰할 수단을 제공해서는 안 된다.

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

Note

WeakMap과 WeakSet은, WeakMap 또는 WeakSet 인스턴스가 없었다면 객체 또는 심벌이 다른 방식으로 접근 불가능해져 구현의 가비지 컬렉션 메커니즘에 의해 자원 회수 대상이 되었을 경우 메모리 자원을 “누수”하지 않는 방식으로, 객체 또는 심벌에 상태를 동적으로 연결하는 메커니즘을 제공하기 위한 것이다. 이 특성은 WeakMap 또는 WeakSet 인스턴스에서 키로의 역방향 객체별/심벌별 매핑을 사용하여 달성할 수 있다. 또는 각 WeakMap 또는 WeakSet 인스턴스가 내부적으로 키와 값 데이터를 저장할 수도 있지만, 이 접근 방식은 WeakMap 또는 WeakSet 구현과 가비지 컬렉터 사이의 조정을 요구한다. 다음 참조들은 WeakMap과 WeakSet 구현에 유용할 수 있는 메커니즘을 설명한다:

Barry Hayes. 1997. Ephemerons: a new finalization mechanism. In Proceedings of the 12th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications (OOPSLA '97), A. Michael Berman (Ed.). ACM, New York, NY, USA, 176-183, http://doi.acm.org/10.1145/263698.263733.

Alexandra Barros, Roberto Ierusalimschy, Eliminating Cycles in Weak Tables. Journal of Universal Computer Science - J.UCS, vol. 14, no. 21, pp. 3481-3497, 2008, http://www.jucs.org/jucs_14_21/eliminating_cycles_in_weak

24.3.1 WeakMap 생성자

WeakMap 생성자는:

  • %WeakMap%이다.
  • 전역 객체"WeakMap" 속성의 초기값이다.
  • 생성자로 호출될 때 새로운 WeakMap을 생성하고 초기화한다.
  • 함수로 호출되도록 의도되지 않았으며, 그런 방식으로 호출되면 예외를 던진다.
  • 클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 WeakMap 동작을 상속하려는 서브클래스 생성자는 WeakMap.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 WeakMap 생성자에 대한 super 호출을 포함해야 한다.

24.3.1.1 WeakMap ( [ iterable ] )

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

  1. NewTarget이 undefined이면, TypeError 예외를 던진다.
  2. map을 ? OrdinaryCreateFromConstructor(NewTarget, "%WeakMap.prototype%", « [[WeakMapData]] »)라고 하자.
  3. map.[[WeakMapData]]를 새로운 빈 List로 설정한다.
  4. iterableundefined 또는 null이면, map을 반환한다.
  5. adder를 ? Get(map, "set")이라고 하자.
  6. IsCallable(adder)가 false이면, TypeError 예외를 던진다.
  7. AddEntriesFromIterable(map, iterable, adder)를 반환한다.
Note

매개변수 iterable이 존재하면, WeakMap 키로 사용될 값인 첫 번째 요소와 그 키에 연결할 값인 두 번째 요소를 가진 2요소 배열 유사 객체를 생성하는 iterator 객체를 반환하는 %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. weakMapthis 값이라고 하자.
  2. RequireInternalSlot(weakMap, [[WeakMapData]])를 수행한다.
  3. CanBeHeldWeakly(key)가 false이면, false를 반환한다.
  4. weakMap.[[WeakMapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면,
      1. entry.[[Key]]empty로 설정한다.
      2. entry.[[Value]]empty로 설정한다.
      3. true를 반환한다.
  5. false를 반환한다.
Note

empty는 엔트리가 삭제되었음을 나타내기 위한 명세상의 장치로 사용된다. 실제 구현은 내부 자료 구조에서 엔트리를 물리적으로 제거하는 것과 같은 다른 동작을 취할 수 있다.

24.3.3.3 WeakMap.prototype.get ( key )

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

  1. weakMapthis 값이라고 하자.
  2. RequireInternalSlot(weakMap, [[WeakMapData]])를 수행한다.
  3. CanBeHeldWeakly(key)가 false이면, undefined를 반환한다.
  4. weakMap.[[WeakMapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면, entry.[[Value]]를 반환한다.
  5. undefined를 반환한다.

24.3.3.4 WeakMap.prototype.getOrInsert ( key, value )

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

  1. weakMapthis 값이라고 하자.
  2. RequireInternalSlot(weakMap, [[WeakMapData]])를 수행한다.
  3. CanBeHeldWeakly(key)가 false이면, TypeError 예외를 던진다.
  4. weakMap.[[WeakMapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면, entry.[[Value]]를 반환한다.
  5. entryRecord { [[Key]]: key, [[Value]]: value }라고 하자.
  6. entryweakMap.[[WeakMapData]]에 추가한다.
  7. value를 반환한다.

24.3.3.5 WeakMap.prototype.getOrInsertComputed ( key, callback )

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

  1. weakMapthis 값이라고 하자.
  2. RequireInternalSlot(weakMap, [[WeakMapData]])를 수행한다.
  3. CanBeHeldWeakly(key)가 false이면, TypeError 예외를 던진다.
  4. IsCallable(callback)가 false이면, TypeError 예외를 던진다.
  5. weakMap.[[WeakMapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면, entry.[[Value]]를 반환한다.
  6. value를 ? Call(callback, undefined, « key »)라고 하자.
  7. NOTE: callback 실행 중에 WeakMap이 변경되었을 수 있다.
  8. weakMap.[[WeakMapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면,
      1. entry.[[Value]]value로 설정한다.
      2. value를 반환한다.
  9. entryRecord { [[Key]]: key, [[Value]]: value }라고 하자.
  10. entryweakMap.[[WeakMapData]]에 추가한다.
  11. value를 반환한다.

24.3.3.6 WeakMap.prototype.has ( key )

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

  1. weakMapthis 값이라고 하자.
  2. RequireInternalSlot(weakMap, [[WeakMapData]])를 수행한다.
  3. CanBeHeldWeakly(key)가 false이면, false를 반환한다.
  4. weakMap.[[WeakMapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면, true를 반환한다.
  5. false를 반환한다.

24.3.3.7 WeakMap.prototype.set ( key, value )

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

  1. weakMapthis 값이라고 하자.
  2. RequireInternalSlot(weakMap, [[WeakMapData]])를 수행한다.
  3. CanBeHeldWeakly(key)가 false이면, TypeError 예외를 던진다.
  4. weakMap.[[WeakMapData]]의 각 Record { [[Key]], [[Value]] } entry에 대해, 다음을 수행한다.
    1. entry.[[Key]]empty가 아니고 SameValue(entry.[[Key]], key)가 true이면,
      1. entry.[[Value]]value로 설정한다.
      2. weakMap을 반환한다.
  5. entryRecord { [[Key]]: key, [[Value]]: value }라고 하자.
  6. entryweakMap.[[WeakMapData]]에 추가한다.
  7. weakMap을 반환한다.

24.3.3.8 WeakMap.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 속성의 초기값은 String 값 "WeakMap"이다.

이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.

24.3.4 WeakMap 인스턴스의 속성

WeakMap 인스턴스는 WeakMap 프로토타입 객체로부터 속성을 상속하는 보통 객체이다. WeakMap 인스턴스는 또한 [[WeakMapData]] 내부 슬롯을 가진다.

24.4 WeakSet 객체

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

구현은 WeakSet에 포함된 값이 접근 불가능해진 시점과 그 값이 WeakSet에서 제거되는 시점 사이에 임의로 결정된 지연을 부과할 수 있다. 이 지연이 ECMAScript 프로그램에 관찰 가능하다면, 프로그램 실행에 영향을 줄 수 있는 비결정성의 원천이 될 것이다. 그러므로 ECMAScript 구현은 관찰자가 관찰되는 값을 제시할 것을 요구하지 않는 방식으로 WeakSet이 특정 값을 포함하는지 결정할 수단을 제공해서는 안 된다.

WeakSet은 평균적으로 컬렉션의 요소 수에 대해 준선형보다 빠른 접근 시간을 제공하는 해시 테이블이나 다른 메커니즘을 사용하여 구현되어야 한다. 이 명세에서 사용되는 자료 구조는 WeakSet의 요구되는 관찰 가능한 의미론을 설명하기 위한 것일 뿐이다. 실행 가능한 구현 모델로 의도된 것이 아니다.

Note

24.3NOTE를 보라.

24.4.1 WeakSet 생성자

WeakSet 생성자는:

  • %WeakSet%이다.
  • 전역 객체"WeakSet" 속성의 초기값이다.
  • 생성자로 호출될 때 새로운 WeakSet을 생성하고 초기화한다.
  • 함수로 호출되도록 의도되지 않았으며, 그런 방식으로 호출되면 예외를 던진다.
  • 클래스 정의의 extends 절의 값으로 사용될 수 있다. 지정된 WeakSet 동작을 상속하려는 서브클래스 생성자는 WeakSet.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성하고 초기화하기 위해 WeakSet 생성자에 대한 super 호출을 포함해야 한다.

24.4.1.1 WeakSet ( [ iterable ] )

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

  1. NewTarget이 undefined이면, TypeError 예외를 던진다.
  2. set을 ? OrdinaryCreateFromConstructor(NewTarget, "%WeakSet.prototype%", « [[WeakSetData]] »)라고 하자.
  3. set.[[WeakSetData]]를 새로운 빈 List로 설정한다.
  4. iterableundefined 또는 null이면, set을 반환한다.
  5. adder를 ? Get(set, "add")라고 하자.
  6. IsCallable(adder)가 false이면, TypeError 예외를 던진다.
  7. iteratorRecord를 ? GetIterator(iterable, sync)라고 하자.
  8. 반복한다,
    1. next를 ? IteratorStepValue(iteratorRecord)라고 하자.
    2. nextdone이면, set을 반환한다.
    3. statusCompletion(Call(adder, set, « next »))라고 하자.
    4. IfAbruptCloseIterator(status, iteratorRecord).

24.4.2 WeakSet 생성자의 속성

WeakSet 생성자는:

  • 값이 %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. weakSetthis 값이라고 하자.
  2. RequireInternalSlot(weakSet, [[WeakSetData]])를 수행한다.
  3. CanBeHeldWeakly(value)가 false이면, TypeError 예외를 던진다.
  4. weakSet.[[WeakSetData]]의 각 요소 entry에 대해, 다음을 수행한다.
    1. entryempty가 아니고 SameValue(entry, value)가 true이면,
      1. weakSet을 반환한다.
  5. valueweakSet.[[WeakSetData]]에 추가한다.
  6. weakSet을 반환한다.

24.4.3.2 WeakSet.prototype.constructor

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

24.4.3.3 WeakSet.prototype.delete ( value )

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

  1. weakSetthis 값이라고 하자.
  2. RequireInternalSlot(weakSet, [[WeakSetData]])를 수행한다.
  3. CanBeHeldWeakly(value)가 false이면, false를 반환한다.
  4. weakSet.[[WeakSetData]]의 각 요소 entry에 대해, 다음을 수행한다.
    1. entryempty가 아니고 SameValue(entry, value)가 true이면,
      1. 값이 entryweakSet.[[WeakSetData]]의 요소를 값이 empty인 요소로 대체한다.
      2. true를 반환한다.
  5. false를 반환한다.
Note

empty는 엔트리가 삭제되었음을 나타내기 위한 명세상의 장치로 사용된다. 실제 구현은 내부 자료 구조에서 엔트리를 물리적으로 제거하는 것과 같은 다른 동작을 취할 수 있다.

24.4.3.4 WeakSet.prototype.has ( value )

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

  1. weakSetthis 값이라고 하자.
  2. RequireInternalSlot(weakSet, [[WeakSetData]])를 수행한다.
  3. CanBeHeldWeakly(value)가 false이면, false를 반환한다.
  4. weakSet.[[WeakSetData]]의 각 요소 entry에 대해, 다음을 수행한다.
    1. entryempty가 아니고 SameValue(entry, value)가 true이면, true를 반환한다.
  5. false를 반환한다.

24.4.3.5 WeakSet.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 속성의 초기값은 String 값 "WeakSet"이다.

이 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성 특성을 가진다.

24.4.4 WeakSet 인스턴스의 속성

WeakSet 인스턴스는 WeakSet 프로토타입 객체로부터 속성을 상속하는 보통 객체이다. WeakSet 인스턴스는 또한 [[WeakSetData]] 내부 슬롯을 가진다.

24.5 키 기반 컬렉션을 위한 추상 연산

24.5.1 CanonicalizeKeyedCollectionKey ( key )

The abstract operation CanonicalizeKeyedCollectionKey takes argument key (an ECMAScript language value) and returns an ECMAScript language value. It performs the following steps when called:

  1. key-0𝔽이면, +0𝔽을 반환한다.
  2. key를 반환한다.