18

Después de leer esta descripción: http://wiki.ecmascript.org/doku.php?id=harmony:weak_maps¿Qué son los mapas WeakMaps de ECMAScript 6?

Estoy tratando de entenderlo, pero no entiendo la imagen general. ¿Que es todo esto? Parece ser apoyado en Firefox 6: http://kangax.github.com/es5-compat-table/non-standard/

+0

Las respuestas aquí son todas incorrectas. Lo único "débil" en un mapa débil son las teclas. Es decir, si tiene un valor clave en un mapa débil que a diferencia de un "Mapa" regular, no evitará que se recolecte basura. Esto es útil, por ejemplo, para extender objetos desde el exterior sin interferir con la recolección de basura. En particular, la respuesta de Raynos solo explica qué es un Mapa. –

+2

Relacionados: [¿Cuáles son los usos reales de ES6 WeakMap?] (Http://stackoverflow.com/q/29413222/1114) –

+0

** Advertencia: Ambas respuestas aquí son incorrectas **. Consulte la publicación vinculada en el comentario anterior para obtener respuestas significativas. –

Respuesta

11

WeakMap

WeakMaps básicamente le permiten tener una tabla hash con una clave que no es una cadena.

lo que puede establecer la clave para ser, es decir [1] y luego se puede decir Map.get([1])

Ejemplo del 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 clave débil.

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

+5

El motivo de la pérdida de memoria es que para implementarlo usted mismo, debe almacenar las claves en una matriz, lo que significa que nunca serán basura, incluso si todas las demás referencias desaparecen, por lo que no hay forma de acceder al valor correspondiente de todas formas. –

+1

Creo que puede solucionar esta respuesta desde el punto de vista de 2015 :) –

15

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

Una aplicación de referencias débiles se implementan en Mapas débiles:

“El programador JavaScript experimentado notará que esta API podría ser implementado en JavaScript con dos matrices (uno para las llaves, una para valores) que comparten 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 mapas escritos manualmente, la matriz de claves mantendría referencias a los objetos clave, evitando que sean basura recolectada. En WeakMaps nativas, las referencias a objetos clave se llevan a cabo “débilmente”, lo que significa que no impiden la recolección de basura en caso de que no habría ninguna otra referencia al objeto.”Source

(Véase también mi post cuando ECMAScript Armonía era publicado por primera vez con Firefox ...)

0

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

Una advertencia acerca del uso de object como clave es que, dado que todos los objetos son por defecto singletons 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í, en el siguiente escenario, no podemos esperar para obtener el valor

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

Y el siguiente fragmento de código funciona como se esperaba.

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