WeakMap

WeakMap 객체는 키가 약하게 참조되는 키/값 쌍의 컬렉션입니다. 키는 객체여야만 하나 값은 임의 값이 될 수 있습니다.

구문

new WeakMap([iterable])

매개변수

iterable
iterable은 배열 또는 요소가 키-값 쌍(2-요소 배열)인 다른 iterable 객체입니다. 각 키-값 쌍은 새로운 WeakMap에 추가됩니다. null은 undefined로 취급됩니다.

설명

WeakMap의 키는 오직 Object형뿐입니다. 키로 원시 데이터형은 허용되지 않습니다(가령 SymbolWeakMap 키가 될 수 없습니다).

WeakMap 내 키는 약하게 유지됩니다. 이게 뜻하는 바는, 다른 강한 키 참조가 없는 경우, 그러면 모든 항목은 가비지 컬렉터에 의해 WeakMap에서 제거됩니다.

WeakMap인가요?

숙련된 JavaScript 프로그래머는 이 API는 네 API 메서드에 의해 공유되는 두 배열(키에 하나, 값에 하나)로 JavaScript에서 구현될 수 있음을 알 수 있습니다. 이러한 구현은 주로 두 가지가 불편했을 겁니다. 첫 번째는 O(n) 검색(n은 map 내 키 개수)입니다. 두 번째는 메모리 누수 문제입니다. 수동으로 작성된 map이면, 키 배열은 키 객체 참조를 유지하려고 합니다, 가비지 컬렉트되는 것을 방지하는. 원래 WeakMap에서는, 키 객체 참조는 "약하게" 유지되고, 이는 다른 객체 참조가 없는 경우 가비지 컬렉션을 막지 않음을 뜻합니다.

약한 참조로 인해, WeakMap 키는 열거불가입니다(즉 키 목록을 제공하는 메서드가 없습니다). 키가 있다면, 그 목록은 가비지 콜렉션 상태에 달려있습니다, 비결정성(non-determinism, 크기를 결정할 수 없는)을 도입하는. 키 목록을 원하는 경우, Map을 사용해야 합니다.

속성

WeakMap.length
length 속성값은 0.
WeakMap.prototype
WeakMap 생성자에 대한 프로토타입을 나타냅니다. 모든 WeakMap 객체에 속성을 추가할 수 있습니다.

WeakMap 인스턴스

모든 WeakMap 인스턴스는 WeakMap.prototype에서 상속합니다.

속성

WeakMap.prototype.constructor
인스턴스의 프로토타입을 생성한 함수를 반환합니다. 이는 기본으로 WeakMap 함수입니다.

메서드

WeakMap.prototype.delete(key)
key와 관련된 모든 값을 제거합니다. WeakMap.prototype.has(key)는 그 뒤에 false를 반환합니다.
WeakMap.prototype.get(key)
key와 관련된 값 또는 관련 값이 없는 경우 undefined를 반환합니다.
WeakMap.prototype.has(key)
WeakMap 객체 내 key와 관련된 값이 있는지 여부를 주장하는(asserting, 나타내는) boolean을 반환합니다.
WeakMap.prototype.set(key, value)
WeakMap 객체 내 key에 대해 값을 설정합니다. WeakMap 객체를 반환합니다.
WeakMap.prototype.clear()
WeakMap 객체에서 모든 키/값 쌍을 제거합니다. 메서드가 없는 WeakMap 객체를 캡슐화하여 .clear() 메서드가 있는 WeakMap 같은 객체 구현이 가능함을 주의하세요 (WeakMap 페이지 예 참조)

WeakMap 사용

var wm1 = new WeakMap(),
    wm2 = new WeakMap(),
    wm3 = new WeakMap();
var o1 = {},
    o2 = function(){},
    o3 = window;

wm1.set(o1, 37);
wm1.set(o2, "azerty");
wm2.set(o1, o2); // 값은 무엇이든 될 수 있음, 객체 또는 함수 포함
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // 키와 값은 어떤 객체든 될 수 있음. 심지어 WeakMap도!

wm1.get(o2); // "azerty"
wm2.get(o2); // undefined, wm2에 o2에 대한 키가 없기에
wm2.get(o3); // undefined, 이게 설정값이기에

wm1.has(o2); // true
wm2.has(o2); // false
wm2.has(o3); // true (값 자체가 'undefined'이더라도)

wm3.set(o1, 37);
wm3.get(o1); // 37

wm1.has(o1); // true
wm1.delete(o1);
wm1.has(o1); // false

.clear() 메서드로 WeakMap 같은 클래스 구현

설명을 위해, 다음 예는 새로운 ECMAScript 6 class 구조를 사용합니다, 현재 널리 구현되지 않은.

class ClearableWeakMap {
  constructor(init) {
    this._wm = new WeakMap(init)
  }
  clear() {
    this._wm = new WeakMap()
  }
  delete(k) {
    return this._wm.delete(k)
  }
  get(k) {
    return this._wm.get(k)
  }
  has(k) {
    return this._wm.has(k)
  }
  set(k, v) {
    this._wm.set(k, v)
    return this
  }
}

스펙

스펙 상태 설명
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'WeakMap' in that specification.
Standard 초기 정의.
ECMAScript 2017 Draft (ECMA-262)
The definition of 'WeakMap' in that specification.
Draft  

브라우저 호환성

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 36 6.0 (6.0) 11 23 7.1
new WeakMap(iterable) 38 36 (36) No support 25 No support
clear() 36 No support [1] 11 23 7.1
Constructor argument: new WeakMap(null) (Yes) 37 (37) 11 ? ?
Monkey-patched set() in constructor (Yes) 37 (37) ? ? ?
WeakMap() without new throws (Yes) 42 (42) 11 ? ?
Feature Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support 35 6.0 (6.0) No support No support 8
new WeakMap(iterable) 38 36.0 (36) No support No support No support
clear() 35 No support [1] No support No support 8
Constructor argument: new WeakMap(null) ? 37.0 (37) No support ? ?
Monkey-patched set() in constructor ? 37.0 (37) No support ? ?
WeakMap() without new throws ? 42.0 (42) ? ? ?

[1] clear() 메서드는 버전 20부터 45(포함)까지 지원됐습니다.

참조

문서 태그 및 공헌자

 이 페이지의 공헌자: Netaras, billybraga
 최종 변경: Netaras,