Usualmente cuando pienso en almacenar información en JavaScript pienso en hacerlo en objetos o en arrays. Actualmente existen otras estructuras de datos que nos permiten almacenar información en JavaScript, una de ellas es el Map
y el WeakMap
, que ponen en relación una clave con un valor, pero con diferencias importantes.
Map
Los objetos Map
1 son como un tipo de diccionarios en donde nosotros asociamos un key o una llave con un valor. Los objetos Map
se construyen utilizando el keyword new
y llamando a la clase Map
. Una ventaja es que con los Map
podemos utilizar cualquier tipo de dato como key.
Métodos
Los objetos Map
tienen una serie de métodos que nos permiten interactuar con el mismo. Aquí tenemos una lista de los métodos que podemos utilizar con los objetos Map
.
Set
Para asignar un key a un valor utilizamos el método set
.
Clear
Elimina todos los valores asociados al objeto Map
.
Delete
Elimina un valor asociado al objeto Map
.
Has
Devuelve true
si el objeto map tiene un valor asociado al key que se le pasa como parámetro. En caso contrario devuelve false
.
forEach
Permite iterar sobre los valores asociados al objeto map. El método forEach
recibe una función que recibe dos parámetros: el key y el value. El método forEach
no devuelve ningún valor.
WeakMap
El objeto WeakMap
2 es similar al Map
, que solo aceptan objetos como key y que pueden ser recolectados por el garbage collector.
Garbage Collector
El garbage collector es un proceso que se ejecuta en el navegador que elimina los objetos que ya no están referenciados de la memoria, esto ayuda a no consumir recursos innecesarios y que no colapse la memoria.
Características de WeakMap
Son similares a los objetos Map
pero con algunas diferencias esenciales:
- Solo se pueden asociar objetos como key.
Uncaught TypeError: Invalid value used as weak map key
at WeakMap.set (<anonymous>)
at new WeakMap (<anonymous>)
at <anonymous>:1:17
- No tiene el método
keys()
por lo que no podemos acceder avalues()
,entries()
,clear()
o la propiedadsize
WeakMap
y tampoco es iterable. - Los objetos asociados a un objeto
WeakMap
será recolectado por el garbage collector cuando ya no existan más referencias a ellos.
Ya que la consola de chrome es lazy, es probable que podamos ver actuar al garbage collector con el siguiente ejemplo al ver lo que pasa al convertir el objecto a null
.
Al convertir el objeto a null
, weakMap perdio la única propiedad que tenía con referencia a ese objeto
Diferencias entre Map y Object
- Los objetos solo permiten asociar como key los strings o symbol. Si pasamos otro valor, JavaScript hará una coerción de datos para convertir el valor en un string.
- Podemos acceder al tamaño de un Map con el método
size
, algo que con los objetos no podemos hacer. - La forma en la que podemos iterarlos es diferente.
- La forma de eliminar un valor de un Map es mediante el método
delete
y con los objetos mediante el operador delete.
Precaución: El operador delete
en varios escenarios puede cambiar la velocidad arbitrariamente, por lo que no es muy recomendable de usar cuando se requiere un buen rendimiento de la aplicación.
Conclusión
Las estructuras de datos Map
y WeakMap
son otra alternativa para almacenar datos en forma de clave-valor, que pueden servir para casos especiales, según las necesidades de nuestra aplicación. Existen también estructuras de datos Set
y WeakSet
que son similares a estas, por lo que le puedes echar un vistazo.