operador new mapa es6 crear javascript ecmascript-6 ecmascript-harmony weakmap

new - operador map javascript



¿Cuál es la diferencia entre ES6 Map y WeakMap? (5)

Al mirar this y this páginas de MDN, parece que la única diferencia entre Maps y WeakMaps es que falta una propiedad de "tamaño" para WeakMaps. ¿Pero es esto cierto? ¿Cual es la diferencia entre ellos?


Ambos se comportan de manera diferente cuando un objeto al que se hace referencia por sus claves / valores se elimina. Tomemos el siguiente código de ejemplo:

var map = new Map(); var weakmap = new WeakMap(); (function(){ var a = {x: 12}; var b = {y: 12}; map.set(a, 1); weakmap.set(b, 2); })()

El IIFE anterior se ejecuta, no hay manera de que podamos hacer referencia a {x: 12} y {y: 12} más. El recopilador de basura continúa y borra el puntero de la tecla b de "WeakMap" y también elimina {y: 12} de la memoria. Pero en el caso de "Mapa", el recolector de basura no elimina un puntero de "Mapa" y tampoco elimina {x: 12} de la memoria.

Resumen: WeakMap permite que el recolector de basura haga su tarea pero no Map.

Referencias: http://qnimate.com/difference-between-map-and-weakmap-in-javascript/


De la misma página, sección " ¿Por qué mapa débil ? " :

El programador experimentado de JavaScript notará que esta API podría implementarse en JavaScript con dos matrices (una para claves, una para valores) compartida por los 4 métodos API. Tal implementación tendría dos inconvenientes principales. El primero es una búsqueda O (n) (n es el número de claves en el mapa). El segundo es un problema de pérdida de memoria. Con mapas escritos manualmente, la matriz de claves mantendría referencias a los objetos clave, evitando que sean basura recolectada. En WeakMaps nativos, las referencias a objetos clave se mantienen "débilmente" , lo que significa que no impiden la recolección de basura en caso de que no haya otra referencia al objeto.

Debido a que las referencias son débiles, las claves WeakMap no son enumerables (es decir, no hay ningún método que le proporcione una lista de las claves). Si lo fueran, la lista dependería del estado de la recolección de basura, introduciendo el no determinismo.

[Y es por eso que no tienen propiedad de size también]

Si desea tener una lista de claves, debe mantenerla usted mismo. También hay una propuesta de ECMAScript destinada a introducir conjuntos simples y mapas que no usarían referencias débiles y serían enumerables.

- que sería el this . No se menciona en MDN, pero en la propuesta de armonía , también tienen items , keys y métodos de generación de values e implementan la interfaz Iterator .


Otra diferencia:

Las claves de WeakMaps son del tipo Solo objeto. Los tipos de datos primitivos como claves no están permitidos (por ejemplo, un símbolo no puede ser una clave WeakMap).

Tampoco se puede usar una cadena, número o booleano como una clave WeakMap . Un Map puede usar valores primitivos para claves.

w = new WeakMap; w.set(''a'', ''b''); // Uncaught TypeError: Invalid value used as weak map key m = new Map m.set(''a'', ''b''); // Works


Quizás la siguiente explicación sea más clara para alguien.

var k1 = {a: 1}; var k2 = {b: 2}; var map = new Map(); var wm = new WeakMap(); map.set(k1, ''k1''); wm.set(k2, ''k2''); k1 = null; map.forEach(function (val, key) { console.log(key, val); // k1 {a: 1} }); k2 = null; wm.get(k2); // undefined

Como puede ver, después de eliminar la clave k1 de la memoria, aún podemos acceder a ella dentro del mapa. Al mismo tiempo, la eliminación de la clave k2 de WeakMap también lo elimina de wm por referencia.

Es por eso que WeakMap no tiene métodos enumerables como forEach, porque no existe una lista de teclas WeakMap, solo son referencias a otros objetos.


WeapMap en javascript no contiene ninguna clave o valor, simplemente manipula el valor de la clave usando una identificación única y define la propiedad del objeto clave.

porque define propiedad a key mediante el método Object.definePropert() , la clave no debe ser de tipo primitivo.

y también porque WeapMap no contiene pares de valores clave, no podemos obtener la propiedad de longitud de los mapas débiles.

y también el valor manipulado se asigna a la llave, el recolector de basura puede recoger la llave fácilmente si no se usa.

Código de muestra para la implementación.

if(typeof WeapMap != undefined){ return; } (function(){ var WeapMap = function(){ this.__id = ''__weakmap__''; } weakmap.set = function(key,value){ var pVal = key[this.__id]; if(pVal && pVal[0] == key){ pVal[1]=value; }else{ Object.defineProperty(key, this.__id, {value:[key,value]}); return this; } } window.WeakMap = WeakMap; })();

referencia de implementation