WeakMap
las claves deben ser objetos, no valores primitivos.
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
¿¿¿¿Por qué????
Veamos el siguiente ejemplo.
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 usamos un objeto como clave en un programa regular Map
, mientras
Map
exista, ese objeto también existe. Ocupa memoria y no se puede recolectar basura.
WeakMap
es fundamentalmente diferente en este aspecto. No evita la recolección de basura de objetos clave.
let user = { name: "User" };
let weakMap = new WeakMap();
weakMap.set(user, "...");
user = null; // overwrite the reference
// 'user' is removed from memory!
si usamos un objeto como clave en él y no hay otras referencias a ese objeto, se eliminará de la memoria (y del mapa) automáticamente.
WeakMap
no admite iteración y métodos keys () , valores () , entradas () , por lo que no hay forma de obtener todas las claves o valores de él.
WeakMap solo tiene los siguientes métodos:
- debilMap.get (clave)
- débilMap.set (clave, valor)
- debilMap.delete (clave)
- debilMap.has (clave)
Eso es obvio, como si un objeto hubiera perdido todas las demás referencias (como 'usuario' en el código anterior), entonces debe ser recolectado automáticamente. Pero técnicamente no se especifica exactamente cuándo ocurre la limpieza.
El motor de JavaScript decide eso. Puede optar por realizar la limpieza de la memoria inmediatamente o esperar y hacer la limpieza más tarde cuando ocurran más eliminaciones. Por lo tanto, técnicamente WeakMap
no se conoce el recuento actual de elementos de a . El motor puede haberlo limpiado o no o lo hizo parcialmente. Por esa razón, no se admiten los métodos que acceden a todas las claves / valores.
Nota: - El área principal de aplicación de WeakMap es un almacenamiento de datos adicional. Como almacenar en caché un objeto hasta que ese objeto sea recolectado como basura.