He leído que WeakMap y WeakSet no admiten trabajar con toda la recopilación de datos a la vez, lo que significa que keys() , values() , entries() , el size() y los bucles son inaccesibles para este tipo de colecciones. Está escrito que la razón de ese comportamiento es que el desarrollador no puede saber el momento exacto en que funcionará el recolector de basura.
la fuente
...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 realizar la limpieza más tarde cuando ocurran más eliminaciones.
¿Cómo veo esto? Por ejemplo, se eliminó el primer elemento de la recopilación de datos WeakMap/WeakSet . Pero puede suceder que el recolector de basura aún no lo haya eliminado del almacenamiento. Por lo tanto, el elemento eliminado se puede usar en bucles, métodos que funcionan con toda la colección. Para evitar este comportamiento, todos estos métodos y bucles no son compatibles con estas recopilaciones de datos.
let weakMap = new WeakMap(); let obj = {}; //adding some elements weakMap.set(obj, 255); weakMap.set({name: `Rita`}, `Rita`); //deleting the first element obj = null; //we can't use loops for the whole collection //why? because deleted element with `obj` key can still exist in data storage weakMap.get(obj); //it's theoretically possible that deleted element with `obj` key still //exists in the data storage, garbage collector hasn't reached it yetEs completamente comprensible. Pero, ¿qué hay de referirse a un solo elemento? Por cierto, está completamente permitido para este tipo de colecciones. Pero, de hecho, tampoco sabemos el momento exacto en que funcionará el recolector de basura. Como veo, significa que ese elemento se puede eliminar, pero debido al hecho de que el recolector de basura aún no lo ha alcanzado, todavía se puede mostrar.
¿Resulta que la funcionalidad limitada de estas colecciones no puede proteger los errores en forma de salida de elementos eliminados? ¿Estoy en lo correcto?