WeakMap
les clés doivent être des objets et non des valeurs primitives.
let weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, "ok"); // works fine (object key)
// can't use a string as the key
weakMap.set("test", "Not ok"); // Error, because "test" is not an object
Pourquoi????
Voyons l'exemple ci-dessous.
let user = { name: "User" };
let map = new Map();
map.set(user, "...");
user = null; // overwrite the reference
// 'user' is stored inside the map,
// We can get it by using map.keys()
Si nous utilisons un objet comme clé dans un régulier Map
, alors tant que le
Map
existe, cet objet existe également. Il occupe de la mémoire et ne peut pas être récupéré.
WeakMap
est fondamentalement différent à cet égard. Cela n'empêche pas le garbage collection d'objets clés.
let user = { name: "User" };
let weakMap = new WeakMap();
weakMap.set(user, "...");
user = null; // overwrite the reference
// 'user' is removed from memory!
si nous utilisons un objet comme clé, et qu'il n'y a pas d'autres références à cet objet - il sera automatiquement supprimé de la mémoire (et de la carte).
WeakMap
ne prend pas en charge l'itération et les méthodes keys () , values () , entries () , il n'y a donc aucun moyen d'en obtenir toutes les clés ou valeurs.
WeakMap n'a que les méthodes suivantes:
- lowMap.get (clé)
- lowMap.set (clé, valeur)
- lowMap.delete (clé)
- lowMap.has (clé)
C'est évident, comme si un objet avait perdu toutes les autres références (comme «utilisateur» dans le code ci-dessus), alors il doit être récupéré automatiquement. Mais techniquement, ce n'est pas exactement spécifié quand le nettoyage a lieu.
Le moteur JavaScript décide cela. Il peut choisir d'effectuer le nettoyage de la mémoire immédiatement ou d'attendre et de le faire plus tard lorsque d'autres suppressions se produisent. Donc, techniquement, le nombre d'éléments actuel de a WeakMap
n'est pas connu. Le moteur peut l'avoir nettoyé ou non ou l'a fait partiellement. Pour cette raison, les méthodes qui accèdent à toutes les clés / valeurs ne sont pas prises en charge.
Remarque: - Le principal domaine d'application de WeakMap est un stockage de données supplémentaire. Comme mettre en cache un objet jusqu'à ce que cet objet soit récupéré.