The WeakMap object is a collection of key/value pairs in which the keys are weakly referenced. The keys must be objects and the values can be arbitrary values.
You can learn more about WeakMaps in the section WeakMap object in Keyed collections.
new WeakMap([iterable])
iterableKeys of WeakMaps are of the type Object only. Primitive data types as keys are not allowed (e.g. a Symbol can't be a WeakMap key).
A map API could be implemented in JavaScript with two arrays (one for keys, one for values) shared by the four API methods. Setting elements on this map would involve pushing a key and value onto the end of each of those arrays simultaneously. As a result, the indices of the key and value would correspond to both arrays. Getting values from the map would involve iterating through all keys to find a match, then using the index of this match to retrieve the corresponding value from the array of values.
Such an implementation would have two main inconveniences. The first one is an O(n) set and search (n being the number of keys in the map) since both operations must iterate through the list of keys to find a matching value. The second inconvenience is a memory leak because the arrays ensure that references to each key and each value are maintained indefinitely. These references prevent the keys from being garbage collected, even if there are no other references to the object. This would also prevent the corresponding values from being garbage collected.
By contrast, native WeakMaps hold "weak" references to key objects, which means that they do not prevent garbage collection in case there would be no other reference to the key object. This also avoids preventing garbage collection of values in the map. Native WeakMaps can be particularly useful constructs when mapping keys to information about the key that is valuable only if the key has not been garbage collected.
Because of references being weak, WeakMap keys are not enumerable (i.e. there is no method giving you a list of the keys). If they were, the list would depend on the state of garbage collection, introducing non-determinism. If you want to have a list of keys, you should use a Map.
WeakMap.lengthlength property is 0.WeakMap.prototypeWeakMap constructor. Allows the addition of properties to all WeakMap objects.WeakMap instancesAll WeakMap instances inherit from WeakMap.prototype.
WeakMap.prototype.constructorWeakMap function by default.WeakMap.prototype.delete(key)key. WeakMap.prototype.has(key) will return false afterwards.WeakMap.prototype.get(key)key, or undefined if there is none.WeakMap.prototype.has(key)key in the WeakMap object or not.WeakMap.prototype.set(key, value)key in the WeakMap object. Returns the WeakMap object.WeakMap.prototype.clear() WeakMap object. Note that it is possible to implement a WeakMap-like object that has a .clear() method by encapsulating a WeakMap object that hasn't it (see example on page 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); // a value can be anything, including an object or a function
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // keys and values can be any objects. Even WeakMaps!
wm1.get(o2); // "azerty"
wm2.get(o2); // undefined, because there is no key for o2 on wm2
wm2.get(o3); // undefined, because that is the set value
wm1.has(o2); // true
wm2.has(o2); // false
wm2.has(o3); // true (even if the value itself is 'undefined')
wm3.set(o1, 37);
wm3.get(o1); // 37
wm1.has(o1); // true
wm1.delete(o1);
wm1.has(o1); // false
WeakMap-like class with a .clear() methodclass 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 | Status | Comment |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'WeakMap' in that specification. | Standard | Initial definition. |
| ECMAScript Latest Draft (ECMA-262) The definition of 'WeakMap' in that specification. | Draft |
| Desktop | ||||||
|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | |
| Basic support | 36 | 12 | 6 | 11 | 23 | 8 |
new WeakMap(iterable) |
38 | 12 | 36 | No | 25 | 9 |
new WeakMap(null) |
Yes | 12 | 37 | 11 | ? | 8 |
WeakMap() without new throws |
Yes | 12 | 42 | 11 | Yes | 9 |
clear
|
36 — 43 | No | 20 — 46 | 11 | 25 — 30 | 8 — 9 |
delete |
36 | Yes | 6
|
11 | 23 | 8 |
get |
36 | Yes | 6
|
11 | 23 | 8 |
has |
36 | Yes | 6
|
11 | 23 | 8 |
prototype |
36 | Yes | 6 | 11 | 23 | 8 |
set |
36 | Yes | 6
|
11
|
23 | 8 |
| Mobile | |||||||
|---|---|---|---|---|---|---|---|
| Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | iOS Safari | Samsung Internet | |
| Basic support | 37 | 36 | 12 | 6 | 23 | 8 | Yes |
new WeakMap(iterable) |
38 | 38 | 12 | 36 | 25 | 9 | Yes |
new WeakMap(null) |
Yes | Yes | 12 | 37 | ? | 8 | Yes |
WeakMap() without new throws |
Yes | Yes | 12 | 42 | Yes | 9 | Yes |
clear
|
37 — 43 | 36 — 43 | No | 20 — 46 | 25 — 30 | 8 — 9 | Yes |
delete |
37 | 36 | Yes | 6
|
23 | 8 | Yes |
get |
37 | 36 | Yes | 6
|
23 | 8 | Yes |
has |
37 | 36 | Yes | 6
|
23 | 8 | Yes |
prototype |
37 | 36 | Yes | 6 | 23 | 8 | Yes |
set |
37 | 36 | Yes | 6
|
23 | 8 | Yes |
| Server | |
|---|---|
| Node.js | |
| Basic support | 0.12
|
new WeakMap(iterable) |
0.12 |
new WeakMap(null) |
0.12
|
WeakMap() without new throws |
0.12 |
clear
|
Yes |
delete |
0.12
|
get |
0.12
|
has |
0.12
|
prototype |
0.12
|
set |
0.12
|
WeakMap in the JavaScript guideMapSetWeakSet
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap