Ejemplo con valor "anulado". ¿Por qué el elemento todavía existe en la colección WeakMap en este caso?
let weakMap = new WeakMap(); let obj = {name: 'Ivan'}; //adding some new element weakMap.set({}, obj); obj = null; console.log(weakMap); console.log(weakMap.get({}));colección completa
un elemento
Ejemplo con la tecla "anular":
¿Que está pasando aqui? ¿De qué viene? ¿El recolector de basura no tiene tiempo para limpiar todo o qué?
En primer lugar weakMap.set({}, obj); y weakMap.get({}); nunca se referirá al mismo elemento en WeakMap porque son literales de objetos anónimos separados. Para que WeakMap sea útil, debe almacenar una referencia al objeto que se utilizará como clave 1 .
let weakMap = new WeakMap(); let obj = {name: 'Ivan'}; weakMap.set({}, obj); console.log('has anonymous key:', weakMap.has({})); console.log(weakMap.get({})); let key = {}; weakMap.set(key, obj); console.log('has assigned key:', weakMap.has(key)); console.log(weakMap.get(key)); En segundo lugar, es la clave a la que se hace referencia débilmente en WeakMap, no el valor, por lo que establecer el valor en null no tendrá ningún efecto en WeakMap. En su lugar, debe 'anular' la clave 2 (otra razón por la que necesita una referencia almacenada).
let weakMap = new WeakMap(); let obj = { name: 'Ivan' }; let key = {}; weakMap.set(key, obj); console.log(weakMap); key = null; // no good way to indicate this, but debugging in the console will reveal an empty WeakMap pending garbage collection console.log(weakMap); 1 Su ejemplo que usa un objeto inalcanzable como clave desaparecerá del WeakMap en la recolección de elementos no utilizados, pero no porque establezca obj=null sino porque la única referencia al objeto existe en el WeakMap.
2 No hay una buena forma de demostrar el comportamiento del segundo fragmento porque, según la documentación, "... un WeakMap no permite observar la actividad de sus claves, sus claves no son enumerables". No obstante, la depuración en la consola revelará el comportamiento, aunque de manera incómoda dada la variedad de formas en que los diferentes navegadores tratan los objetos en la consola, es decir. Objetos vivos de Chrome.