support es6 ecmascript ecma6 differences browsers javascript data-structures specifications ecmascript-6 weakmap

javascript - es6 - ¿Qué son los mapas débiles de ECMAScript 6?



es6 definition (3)

Después de leer esta descripción: http://wiki.ecmascript.org/doku.php?id=harmony:weak_maps

Estoy tratando de entenderlo, pero no entiendo el panorama general. ¿Que es todo esto? Parece que es compatible con Firefox 6: http://kangax.github.com/es5-compat-table/non-standard/


Una referencia débil es un objeto especial que contiene un puntero de objeto, pero no lo mantiene vivo.

Una aplicación de referencias débiles se implementa en los mapas débiles:

“El experimentado programador 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 de 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 los mapas escritos manualmente, la matriz de claves mantendría las referencias a los objetos clave, evitando que se recolecten basura. En WeakMaps nativos, las referencias a objetos clave se mantienen "débilmente", lo que significa que no evitan la recolección de basura en caso de que no haya otra referencia al objeto ". WeakMap

(Véase también mi post cuando ECMAScript Harmony se lanzó por primera vez con Firefox ...)


WeakMap permite utilizar objetos como claves. No tiene ningún método para conocer la longitud del mapa. La longitud es siempre 1. La clave no puede ser valores primitivos.

Una advertencia sobre el uso del objeto como clave es que, dado que todos los objetos están por defecto en JavaScript, deberíamos crear una referencia de objeto y usarla.

Esto se debe a que cuando creamos objetos anónimos son diferentes.

if ( {} !== {} ) { console.log(''Objects are singletons'') }; // will print "Objects are singletons"

Así que en el siguiente escenario, no podemos esperar obtener el valor

var wm = new WeakMap() wm.set([1],''testVal''); wm.get([1]); // will be undefined

Y el siguiente fragmento funcionará como se espera.

var a = [1]; wm.set(a, ''testVal''); wm.get(a); // will return ''testVal''


WeakMap

Básicamente, los mapas débiles te permiten tener una tabla hash con una clave que no es una cadena.

Así que puedes configurar la clave para que sea, es decir, [1] y luego puedes decir Map.get([1])

Ejemplo de la MDN:

var wm1 = new WeakMap(), wm2 = new WeakMap(); var o1 = {}, o2 = function(){}, o3 = window; wm1.set(o1, 37); wm1.set(o2, "azerty"); wm2.set(o1, o2); // a value can be anything, including an object or a function wm2.set(o3, undefined); wm2.set(wm1, wm2); // keys and values can be any objects. Even WeakMaps! wm1.get(o2); // "azerty" wm2.get(o2); // undefined, because there is no value for o2 on wm2 wm2.get(o3); // undefined, because that is the set value wm1.has(o2); // true wm2.has(o2); // false wm2.has(o3); // true (even if the value itself is ''undefined'') wm1.has(o1); // true wm1.delete(o1); wm1.has(o1); // false

La razón de su existencia es:

para arreglar una pérdida de memoria presente en muchos usos de tablas de teclas débiles.

Al parecer, la emulación de mapas débiles provoca pérdidas de memoria. No sé los detalles de esas fugas de memoria.