--- title: WeakMap slug: Web/JavaScript/Reference/Global_Objects/WeakMap tags: - ECMAScript6 - JavaScript - WeakMap translation_of: Web/JavaScript/Reference/Global_Objects/WeakMap ---
WeakMap
객체는 키가 약하게 참조되는 키/값 쌍의 컬렉션입니다. 키는 객체여야만 하나 값은 임의 값이 될 수 있습니다.
new WeakMap([iterable])
iterable
WeakMap의 키는 오직 Object
형뿐입니다. 키로 {{Glossary("Primitive", "원시 데이터형")}}은 허용되지 않습니다(가령 {{jsxref("Symbol")}}은 WeakMap
키가 될 수 없습니다).
WeakMap 내 키는 약하게 유지됩니다. 이게 뜻하는 바는, 다른 강한 키 참조가 없는 경우, 그러면 모든 항목은 가비지 컬렉터에 의해 WeakMap에서 제거됩니다.
숙련된 JavaScript 프로그래머는 이 API는 네 API 메서드에 의해 공유되는 두 배열(키에 하나, 값에 하나)로 JavaScript에서 구현될 수 있음을 알 수 있습니다. 이러한 구현은 주로 두 가지가 불편했을 겁니다. 첫 번째는 O(n) 검색(n은 map 내 키 개수)입니다. 두 번째는 메모리 누수 문제입니다. 수동으로 작성된 map이면, 키 배열은 키 객체 참조를 유지하려고 합니다, 가비지 컬렉트되는 것을 방지하는. 원래 WeakMap에서는, 키 객체 참조는 "약하게" 유지되고, 이는 다른 객체 참조가 없는 경우 가비지 컬렉션을 막지 않음을 뜻합니다.
약한 참조로 인해, WeakMap
키는 열거불가입니다(즉 키 목록을 제공하는 메서드가 없습니다). 키가 있다면, 그 목록은 가비지 콜렉션 상태에 달려있습니다, 비결정성(non-determinism, 크기를 결정할 수 없는)을 도입하는. 키 목록을 원하는 경우, {{jsxref("Map")}}을 사용해야 합니다.
WeakMap.length
length
속성값은 0.WeakMap
생성자에 대한 프로토타입을 나타냅니다. 모든 WeakMap
객체에 속성을 추가할 수 있습니다.WeakMap
인스턴스모든 WeakMap
인스턴스는 {{jsxref("WeakMap.prototype")}}에서 상속합니다.
{{page('ko/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','속성')}}
{{page('ko/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','메서드')}}
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
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 } }
스펙 | 상태 | 설명 |
---|---|---|
{{SpecName('ES6', '#sec-weakmap-objects', 'WeakMap')}} | {{Spec2('ES6')}} | 초기 정의. |
{{SpecName('ESDraft', '#sec-weakmap-objects', 'WeakMap')}} | {{Spec2('ESDraft')}} |
{{CompatibilityTable}}
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 36 | {{CompatGeckoDesktop("6.0")}} | 11 | {{ CompatOpera(23) }} | 7.1 |
new WeakMap(iterable) |
38 | {{CompatGeckoDesktop("36")}} | {{CompatNo}} | {{ CompatOpera(25) }} | {{CompatNo}} |
clear() |
36 | {{CompatNo}} [1] | 11 | {{ CompatOpera(23) }} | 7.1 |
Constructor argument: new WeakMap(null) |
{{CompatVersionUnknown}} | {{CompatGeckoDesktop("37")}} | 11 | {{CompatUnknown}} | {{CompatUnknown}} |
Monkey-patched set() in constructor |
{{CompatVersionUnknown}} | {{CompatGeckoDesktop("37")}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} |
WeakMap() without new throws |
{{CompatVersionUnknown}} | {{CompatGeckoDesktop("42")}} | 11 | {{CompatUnknown}} | {{CompatUnknown}} |
Feature | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Basic support | 35 | {{CompatGeckoMobile("6.0")}} | {{CompatNo}} | {{CompatNo}} | 8 |
new WeakMap(iterable) |
38 | {{CompatGeckoMobile("36")}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
clear() |
35 | {{CompatNo}} [1] | {{CompatNo}} | {{CompatNo}} | 8 |
Constructor argument: new WeakMap(null) |
{{CompatUnknown}} | {{CompatGeckoMobile("37")}} | {{CompatNo}} | {{CompatUnknown}} | {{CompatUnknown}} |
Monkey-patched set() in constructor |
{{CompatUnknown}} | {{CompatGeckoMobile("37")}} | {{CompatNo}} | {{CompatUnknown}} | {{CompatUnknown}} |
WeakMap() without new throws |
{{CompatUnknown}} | {{CompatGeckoMobile("42")}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} |
[1] clear() 메서드는 버전 20부터 45(포함)까지 지원됐습니다.