WeakMap

Did you know that you can read content offline by using one of these tools? If you would like to read offline MDN content in another format, let us know by commenting on Bug 665750.

Dash App

This is an experimental technology, part of the Harmony (EcmaScript 6) proposal.
Because this technology's specification has not stabilized, check the compatibility table for usage in various browsers. Also note that the syntax and behavior of an experimental technology is subject to change in future version of browsers as the spec changes.

Introduction

WeakMaps are key/value maps in which keys are objects.

API

Method Description
myWeakMap.get(key [, defaultValue]) Returns the value associated to the key object, defaultValue if there is none.
myWeakMap.set(key, value) Set the value for the key object in myWeakMap. Returns undefined.
myWeakMap.has(key) Returns a boolean asserting whether a value has been associated to the key object in myWeakMap or not
myWeakMap.delete(key) Removes any value associated to the key object. After such a call, myWeakMap.has(key) will return false.
myWeakMap.clear() Empty the myWeakMap from all its elements. Returns undefined.

Example

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 value 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
wm3.clear();
wm3.get(o1); // undefined, because wm3 was cleared and there is no value for o1 anymore

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

Why WeakMap?

The experienced JavaScript programmer will notice that this API could be implemented in JavaScript with two arrays (one for keys, one for values) shared by the 4 API methods. Such an implementation would have two main inconveniences. The first one is an O(n) search (n being the number of keys in the map). The second one is a memory leak issue. With manually written maps, the array of keys would keep references to key objects, preventing them from being garbage collected. In native WeakMaps, references to key objects are held "weakly", which means that they do not prevent garbage collection in case there would be no other reference to the object.

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 maintain it yourself. There is also an ECMAScript proposal aiming at introducing simple sets and maps which would not use weak references and would be enumerable.

Specifications

Specification Status Comment
EcmaScript Language Specification Draft 6th Edition Draft  

Browser compatibility

Feature Chrome Firefox (SpiderMonkey) Internet Explorer Opera Safari
Basic support (Yes)[1] 6.0 (6.0) Not supported Not supported Not supported
clear() Not supported 20.0 (20.0) Not supported Not supported Not supported
Feature Android Firefox Mobile (SpiderMonkey) IE Mobile Opera Mobile Safari Mobile
Basic support Not supported 6.0 (6.0) Not supported Not supported Not supported
clear() Not supported 20.0 (20.0) Not supported Not supported Not supported

[1] The feature is available behind a pref. Go to chrome://flags and activate the entry “Enable Experimental JavaScript”.

See also

Tags (3)