Saltar al contenido

JavaScript WeakMap y WeakSet

Introducción a JavaScript WeakMap y WeakSet

JavaScript ofrece varias estructuras de datos, cada una adecuada para diferentes propósitos. Entre ellas se encuentran WeakMap y WeakSet, versiones especializadas de Map y Set. Son únicas en su manejo de memoria y referencias, especialmente en el contexto de la recolección de basura. Este artículo profundiza en los matices de estas estructuras, proporcionando una comprensión completa junto con ejemplos prácticos.

Comprensión de WeakMap en JavaScript

Definición y uso básico

Un WeakMap es una colección de pares clave-valor donde las claves deben ser objetos (los valores primitivos no se pueden usar) y los valores pueden ser valores arbitrarios. La parte "débil" de su nombre se refiere a la forma en que hace referencia a las claves. A diferencia de un Map regular, donde las claves permanecen en memoria mientras exista el mapa, en un WeakMap, las claves se mantienen de forma débil. Esto significa que si no hay otra referencia al objeto clave, puede ser recolectado como basura. Esta característica única convierte a WeakMap en la opción preferida para ciertos escenarios de programación.

Ejemplo:


javascript
let weakMap = new WeakMap();
let obj = { name: "JavaScript" };
weakMap.set(obj, "Learning");
// obj is the key to "Learning" value

Casos de uso para WeakMap

  • Almacenamiento en caché: Almacena resultados calculados para objetos sin impedir que esos objetos sean recolectados como basura.
  • Almacenamiento de datos privados: Adjunta datos privados a un objeto sin modificar el objeto en sí.

Ejemplo de almacenamiento en caché:


javascript
let cache = new WeakMap();
async function computeExpensiveData(obj) {
    if (!cache.has(obj)) {
        let result = await fetch(`/api/data?id=${obj.id}`).then(r => r.json());
        cache.set(obj, result);
    }
    return cache.get(obj);
}

INFO

Para una visión más completa de los objetos Map y Set de JavaScript, que ofrecen opciones robustas para el manejo de colecciones, consulta nuestra guía detallada sobre JavaScript Map y Set.

Explorando WeakSet en JavaScript

Definición y características

WeakSet es similar a Set, pero con algunas diferencias clave. Es una colección de objetos, no de valores de tipos arbitrarios. Al igual que WeakMap, los objetos en un WeakSet se mantienen de forma débil. Esto significa que si un objeto en un WeakSet deja de ser accesible por cualquier otro medio, puede ser recolectado como basura. Ten en cuenta que las claves deben ser objetos; no se pueden usar valores primitivos. Además, WeakSet no admite métodos de iteración ni una propiedad .size, lo que lo hace menos versátil que Set, pero útil para ciertas aplicaciones específicas.

Ejemplo:


javascript
let weakSet = new WeakSet();
let obj = { name: "JavaScript" };
weakSet.add(obj);
// obj is now part of the weakSet

Casos de uso para WeakSet

  • Seguimiento de objetos: Realiza un seguimiento de objetos sin impedir su recolección como basura.
  • Almacenamiento de objetos únicos: Mantén una colección de objetos asegurando que sean únicos.

Ejemplo de seguimiento:


javascript
let trackedObjects = new WeakSet();
function track(obj) {
    if (!trackedObjects.has(obj)) {
        trackedObjects.add(obj);
        // Perform tracking actions
    }
}

Conclusión:

WeakMap y WeakSet son herramientas especializadas en el arsenal de un desarrollador de JavaScript. No son adecuadas para todos los escenarios, pero son invaluables cuando necesitas sus características específicas de gestión de memoria y referencia de objetos. Al comprender y aplicar WeakMap y WeakSet de manera adecuada, los desarrolladores pueden escribir código JavaScript más eficiente y optimizado.

Recuerda, la elección entre usar WeakMap/WeakSet y sus contrapartes fuertes (Map/Set) depende de los requisitos de tu aplicación para la gestión de memoria y los patrones de acceso a datos. Dominar estas estructuras elevará tus habilidades de codificación en JavaScript, especialmente en escenarios que involucran grandes conjuntos de datos y operaciones intensivas en memoria.

Práctica

¿Cuáles son algunas características clave de WeakMap y WeakSet en JavaScript?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.