Map vs WeakMap
Map
and WeakMap
are two data structures that can be used to manipulate the relationship between keys and values.
Differences
We can use object or any primitive types for both keys and values of a
Map
.However,
WeakMap
keys only accept objects. It means that we can't use the primitive types as keys ofWeakMap
.const attrs = new WeakMap();
// ERROR
attrs.set('color', 'red');Unlike
Map
,WeakMap
does not support iteration on both keys and values. It is not possible to get all keys or values of aWeakMap
. Also, there is no way to clear aWeakMap
.The most important difference is that
WeakMap
does not prevent the keys from being garbage collected when there is no references to the keys.On the other hand,
Map
maintains the references to keys and values indefinitely. Once the keys and values are created, they will take the memory and will not be garbage collected even if there is no references to them. This could leads to a memory leak issue.Consider a simple code below where we map an unique id to particular person's information:
let id = { value: 1 };
const people = new Map();
people.set(id, { name: 'Foo', age: 20, address: 'Bar' });
// Remove the id
id = null;After removing the key object
id
, it is still able to access its reference via the map keys:people.keys().next().value; // { value: 1 }
Because of this difference,
WeakMap
as its name implies holds the weak references to the keys. It explains why its keys are not enumerable which is mentioned in the previous difference.