WeakMap
WeakMap 객체는 키가 약하게 참조되는 키/값 쌍의 컬렉션입니다. 키는 객체여야만 하나 값은 임의 값이 될 수 있습니다.
구문
new WeakMap([iterable])
매개변수
iterable- iterable은 배열 또는 요소가 키-값 쌍(2-요소 배열)인 다른 iterable 객체입니다. 각 키-값 쌍은 새로운 WeakMap에 추가됩니다. null은 undefined로 취급됩니다.
설명
WeakMap의 키는 오직 Object형뿐입니다. 키로 원시 데이터형은 허용되지 않습니다(가령 Symbol은 WeakMap 키가 될 수 없습니다).
WeakMap 내 키는 약하게 유지됩니다. 이게 뜻하는 바는, 다른 강한 키 참조가 없는 경우, 그러면 모든 항목은 가비지 컬렉터에 의해 WeakMap에서 제거됩니다.
왜 WeakMap인가요?
숙련된 JavaScript 프로그래머는 이 API는 네 API 메서드에 의해 공유되는 두 배열(키에 하나, 값에 하나)로 JavaScript에서 구현될 수 있음을 알 수 있습니다. 이러한 구현은 주로 두 가지가 불편했을 겁니다. 첫 번째는 O(n) 검색(n은 map 내 키 개수)입니다. 두 번째는 메모리 누수 문제입니다. 수동으로 작성된 map이면, 키 배열은 키 객체 참조를 유지하려고 합니다, 가비지 컬렉트되는 것을 방지하는. 원래 WeakMap에서는, 키 객체 참조는 "약하게" 유지되고, 이는 다른 객체 참조가 없는 경우 가비지 컬렉션을 막지 않음을 뜻합니다.
약한 참조로 인해, WeakMap 키는 열거불가입니다(즉 키 목록을 제공하는 메서드가 없습니다). 키가 있다면, 그 목록은 가비지 콜렉션 상태에 달려있습니다, 비결정성(non-determinism, 크기를 결정할 수 없는)을 도입하는. 키 목록을 원하는 경우, Map을 사용해야 합니다.
속성
WeakMap.lengthlength속성값은 0.WeakMap.prototypeWeakMap생성자에 대한 프로토타입을 나타냅니다. 모든WeakMap객체에 속성을 추가할 수 있습니다.
WeakMap 인스턴스
모든 WeakMap 인스턴스는 WeakMap.prototype에서 상속합니다.
속성
WeakMap.prototype.constructor- 인스턴스의 프로토타입을 생성한 함수를 반환합니다. 이는 기본으로
WeakMap함수입니다.
메서드
WeakMap.prototype.delete(key)key와 관련된 모든 값을 제거합니다.WeakMap.prototype.has(key)는 그 뒤에false를 반환합니다.WeakMap.prototype.get(key)(en-US)key와 관련된 값 또는 관련 값이 없는 경우undefined를 반환합니다.WeakMap.prototype.has(key)(en-US)WeakMap객체 내key와 관련된 값이 있는지 여부를 주장하는(asserting, 나타내는) boolean을 반환합니다.WeakMap.prototype.set(key, value)(en-US)WeakMap객체 내key에 대해 값을 설정합니다.WeakMap객체를 반환합니다.WeakMap.prototype.clear()(en-US)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
}
}
명세
| Specification |
|---|
| Unknown specification # sec-weakmap-objects |
브라우저 호환성
BCD tables only load in the browser