En capítulos anteriores hemos estado viendo los nuevos tipos de datos que nos trajo Javascript a partir de ES6. Vimos los Symbols, los Sets (parecidos a los Arrays) y los Maps (parecidos a los Objetos).
Estos Sets y Maps tienen una especie de hermano pequeño el cual se llama WeakSet y WeakMap, los cuales sólo pueden almacenar referencias débiles, es decir, las llaves han de ser de tipo objeto, y al ser una referencia débil, ésto le permite al recolector de basura de Javascript, que en el momento de que alguna de las referencias débiles ya se hayan nulificado o limpiado dentro de la lógica de nuestra programación, cuando el recolector de basura ejecute su proceso (esto lo hace cada navegador a su manera) todas estas referencias débiles, al no existir, las va a limpiar, y ésto hace una mejora del rendimiento de nuestra aplicación.
Carencias
Estos nuevos tipos de datos tienen algunas carencias. No podemos iterar sobre las claves o valores, no son elementos iterables, por lo tanto, no podemos utilizar bucles forof, ni forin, ni forEach, como lo veíamos con los Maps y Sets normales.
Tampoco podemos borrar todos los elementos a la vez, es decir, no podemos utilizar el método clear(). Solamente podemos eliminarlos de uno en uno.
Tampoco podemos verificar su tamaño, no tienen la propiedad size.
Sí que pueden hacer uso de los métodos:
Métodos para WeakSet
Se puede hacer uso de estos métodos.
- has(): para comprobar si existe un elemento.
- add(): para agregar elementos.
- delete(): eliminar uno por uno.
Métodos para WeakMap
Se puede hacer uso de estos elementos.
- get(): podemos obtener una llave.
- set(): podemos establecer valores.
- has(): comprobar si existe una llave.
- delete(): eliminar una llave.
Crear un WeakSet
Mientras que en la función constructora de los Sets podíamos pasar los datos, esto no ocurre para los WeakSets. Para almacenar los valores, tenemos que hacerlo uno por uno con el método add().
Ejm
constws = newWeakSet() let valor1 = {"Valor 1":1}; let valor2 = {"Valor 2":2}; let valor3 = {"Valor 3":3}; ws.add(valor1); ws.add(valor2); ws.add(valor3); console.log(ws);
Crear un WeakMap
Veamos un ejm para ver su sintaxis.
Ejm
const wm = new WeakMap(); let llave1 = {}; let llave2 = {}; let llave3 = {}; wm.set(llave1, 1); wm.set(llave2, 2); console.log(wm); // Ver si existe un valor console.log(wm.has(llave1)); // Output true // Devuelve un valor console.log(wm.get(llave1)); // Output 1 // Eliminar una llave en particular wm.delete(llave1); console.log(wm);
Nota: los WeakSets funcionan como Arrays mientras que los WeakMaps funcionan como objetos.