Our volunteers haven't translated this article into বাংলা (বাংলাদেশ) yet. Join us and help get the job done!
You can also read the article in English (US).
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 WeakMap
s in the section WeakMap object in Keyed collections.
Syntax
new WeakMap([iterable])
Parameters
iterable
- Iterable is an Array or other iterable object whose elements are key-value pairs (2-element Arrays). Each key-value pair will be added to the new WeakMap. null is treated as undefined.
Description
Keys 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).
Why WeakMap?
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
.
Properties
WeakMap.length
- The value of the
length
property is 0. WeakMap.prototype
- Represents the prototype for the
WeakMap
constructor. Allows the addition of properties to allWeakMap
objects.
WeakMap
instances
All WeakMap
instances inherit from WeakMap.prototype
.
Properties
WeakMap.prototype.constructor
- Returns the function that created an instance's prototype. This is the
WeakMap
function by default.
Methods
WeakMap.prototype.delete(key)
- Removes any value associated to the
key
.WeakMap.prototype.has(key)
will returnfalse
afterwards. WeakMap.prototype.get(key)
- Returns the value associated to the
key
, orundefined
if there is none. WeakMap.prototype.has(key)
- Returns a Boolean asserting whether a value has been associated to the
key
in theWeakMap
object or not. WeakMap.prototype.set(key, value)
- Sets the value for the
key
in theWeakMap
object. Returns theWeakMap
object. WeakMap.prototype.clear()
Removes all key/value pairs from theWeakMap
object. Note that it is possible to implement aWeakMap
-like object that has a.clear()
method by encapsulating aWeakMap
object that hasn't it (see example on pageWeakMap
)
Examples
Using 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
Implementing a WeakMap
-like class with a .clear() method
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 } }
Specifications
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 |
Browser compatibility
Desktop | Mobile | Server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Basic support | Chrome Full support 36 | Edge Full support 12 | Firefox Full support 6 | IE Full support 11 | Opera Full support 23 | Safari Full support 8 | WebView Android Full support 37 | Chrome Android Full support 36 | Edge Mobile Full support 12 | Firefox Android Full support 6 | Opera Android Full support 23 | Safari iOS Full support 8 | Samsung Internet Android Full support Yes | nodejs
Full support
0.12
|
new WeakMap(iterable) | Chrome Full support 38 | Edge Full support 12 | Firefox Full support 36 | IE No support No | Opera Full support 25 | Safari Full support 9 | WebView Android Full support 38 | Chrome Android Full support 38 | Edge Mobile Full support 12 | Firefox Android Full support 36 | Opera Android Full support 25 | Safari iOS Full support 9 | Samsung Internet Android Full support Yes | nodejs Full support 0.12 |
new WeakMap(null) | Chrome Full support Yes | Edge Full support 12 | Firefox Full support 37 | IE Full support 11 | Opera ? | Safari Full support 8 | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support 12 | Firefox Android Full support 37 | Opera Android ? | Safari iOS Full support 8 | Samsung Internet Android Full support Yes | nodejs
Full support
0.12
|
WeakMap() without new throws | Chrome Full support Yes | Edge Full support 12 | Firefox Full support 42 | IE Full support 11 | Opera Full support Yes | Safari Full support 9 | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support 12 | Firefox Android Full support 42 | Opera Android Full support Yes | Safari iOS Full support 9 | Samsung Internet Android Full support Yes | nodejs Full support 0.12 |
clear | Chrome No support 36 — 43 | Edge No support No | Firefox No support 20 — 46 | IE Full support 11 | Opera No support 25 — 30 | Safari No support 8 — 9 | WebView Android No support 37 — 43 | Chrome Android No support 36 — 43 | Edge Mobile No support No | Firefox Android No support 20 — 46 | Opera Android No support 25 — 30 | Safari iOS No support 8 — 9 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
delete | Chrome Full support 36 | Edge Full support 12 | Firefox
Full support
6
| IE Full support 11 | Opera Full support 23 | Safari Full support 8 | WebView Android Full support 37 | Chrome Android Full support 36 | Edge Mobile Full support Yes | Firefox Android
Full support
6
| Opera Android Full support 23 | Safari iOS Full support 8 | Samsung Internet Android Full support Yes | nodejs
Full support
0.12
|
get | Chrome Full support 36 | Edge Full support 12 | Firefox
Full support
6
| IE Full support 11 | Opera Full support 23 | Safari Full support 8 | WebView Android Full support 37 | Chrome Android Full support 36 | Edge Mobile Full support Yes | Firefox Android
Full support
6
| Opera Android Full support 23 | Safari iOS Full support 8 | Samsung Internet Android Full support Yes | nodejs
Full support
0.12
|
has | Chrome Full support 36 | Edge Full support 12 | Firefox
Full support
6
| IE Full support 11 | Opera Full support 23 | Safari Full support 8 | WebView Android Full support 37 | Chrome Android Full support 36 | Edge Mobile Full support Yes | Firefox Android
Full support
6
| Opera Android Full support 23 | Safari iOS Full support 8 | Samsung Internet Android Full support Yes | nodejs
Full support
0.12
|
prototype | Chrome Full support 36 | Edge Full support Yes | Firefox Full support 6 | IE Full support 11 | Opera Full support 23 | Safari Full support 8 | WebView Android Full support 37 | Chrome Android Full support 36 | Edge Mobile Full support Yes | Firefox Android Full support 6 | Opera Android Full support 23 | Safari iOS Full support 8 | Samsung Internet Android Full support Yes | nodejs
Full support
0.12
|
set | Chrome Full support 36 | Edge Full support 12 | Firefox
Full support
6
| IE
Partial support
11
| Opera Full support 23 | Safari Full support 8 | WebView Android Full support 37 | Chrome Android Full support 36 | Edge Mobile Full support Yes | Firefox Android
Full support
6
| Opera Android Full support 23 | Safari iOS Full support 8 | Samsung Internet Android Full support Yes | nodejs
Full support
0.12
|
Legend
- Full support
- Full support
- Partial support
- Partial support
- No support
- No support
- Compatibility unknown
- Compatibility unknown
- Non-standard. Expect poor cross-browser support.
- Non-standard. Expect poor cross-browser support.
- Deprecated. Not for use in new websites.
- Deprecated. Not for use in new websites.
- See implementation notes.
- See implementation notes.
- User must explicitly enable this feature.
- User must explicitly enable this feature.