Map
and WeakMap
are two data structures that can be used to manipulate the relationship between keys and values.Map
.WeakMap
keys only accept objects. It means that we can't use the primitive types as keys of WeakMap
.const attrs = new WeakMap();
// ERROR
attrs.set('color', 'red');
Map
, WeakMap
does not support iteration on both keys and values. It is not possible to get all keys or values of a WeakMap
.
Also, there is no way to clear a WeakMap
.WeakMap
does not prevent the keys from being garbage collected when there is no references to the keys. 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.let id = { value: 1 };
const people = new Map();
people.set(id, { name: 'Foo', age: 20, address: 'Bar' });
// Remove the id
id = null;
id
, it is still able to access its reference via the map keys:people.keys().next().value; // { value: 1 }
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.