Novedades ES6

Novedades de ES6 - WeakSet y WeakMap

El objeto WeakSet te deja almacenar y mantener objectos debilmente en una colección.

Los objetos WeakSet son colecciones de objetos. Un objecto en WeakSet solo puede ser agregado una vez; Esto quiere decir que es unico en la coleccion WeakSet.

Las principales diferencias con el objeto Set son:

  • A diferencia de  Sets, WeakSets  son solamente colecciones de objetos y no contienen valores arbitrarios de cualquier otro tipo.
  • El WeakSet  es débil: Las referencias a objetos en la colección se mantienen débilmente.. Si ya no hay otra referencia a un objeto almacenado en el  WeakSet, ellos pueden ser removidos por el recolector de basura. Esto también significa que no hay ninguna lista de objetos almacenados en la colección. Los WeakSets no son enumerables.

¿Por qué WeakMap?

El programador de JavaScript experimentado se habrá dado cuenta que esta API podría ser implementada en JavaScript con dos arrays (uno para las claves, otro para los valores) compartidos por los cuatro métodos de la API. Dicha implementación habría tenido dos inconvenientes principales: El primero es una búsqueda O(n) (siendo n el número de claves en el mapa). El segundo es un problema de pérdida de memoria. Con mapas escritos manualmente, el array de las claves mantendría referencias a la objetos clave, impidiéndoles ser recolectados. En los WeakMap nativos, las referencias a los objetos clave son mantenidas "débilmente", lo que quiere decir que no impiden la recolección de basura en caso de que no haya otras referencias al objeto.

Dado que las referencias son débiles, las claves de WeakMap no son enumerables (ej: no existe un método que te devuelva la lista de las claves). Si existiera, la lista dependería de la recolección de basura, introduciendo indeterminismo. Si quieres una lista de las claves, se debe usar un  Map o mantenerla tu mismo.

Son dos objetos con funcionalidades similares a Map y Set pero con la capacidad de que el recolector de basura de JavaScript elimine elementos de los mismos cuando lo considere oportuno.

  • WeakSet: Solo pueden almacenar datos de tipo objeto (es lógico ésto debido a que los tipos de datos primitivos no pueden tener la referencia de más de una variable)
    Las referencias a objetos en la colección de tipo WeakSet se mantienen débilmente, ésto significa que si en algún momento durante la ejecución del algoritmo se deja de tener referencias del objeto, luego el recolector de basura de JavaScript libera espacio de la colección WeakSet.

        const conjunto1 = new WeakSet();
        let usuario1 = {
          nombre: "juan",
          puntos: 200
        };
        conjunto1.add(usuario1);
        console.log(conjunto1.has(usuario1)); //true
        usuario1 = null;
        ....
    

    Una vez que la variable 'usuario1' se elimina al asignar el valor null, el "garbage collector" (recolector de basura) de JavaScript se encarga de eliminar el elemento del objeto conjunto1.

  • WeakMap Solo se puenden almacenar en la clave del mapa un valor de tipo objeto. JavaScript se encarga de eliminar elementos del mapa cuando se dejan de tener referencias al objeto que actúa como clave dentro del WeakMap.

Acotaciones

Los objetos WeakMap y WeakSet no disponen la capacidas de recorrer sus elementos mediante la estructura for of, tampoco podemos conocer la cantidad de elementos.

Podemos eliminar un elemento de la colección mediante el método 'delete', pero no dispone de un método para borrar todos los elementos.

El uso de estos objetos tiene sentido cuando sabemos que durante la ejecución del algoritmo se eliminarán muchos objetos que actúan como claves, en caso contrario es conveniente emplear los objetos Map y Set.