mapa - symbol() javascript
Implementación de WeakMap en EcmaScript5? (1)
Tardé un poco en asimilar el código, pero luego me golpeó: la clave en sí se usa para almacenar una referencia al valor.
Por ejemplo, varias capas en set
lo hace
defProp(obj, globalID, { value: store });
donde defProp
se ha definido como Object.defineProperty
, obj
es la clave, globalID
es un guid y store
es un objeto de almacenamiento que contiene el valor.
Luego hacia abajo en la get
, busca el valor con
obj[globalID];
Esto es muy inteligente. El WeakMap no contiene realmente una referencia a nada (débil o de otro tipo), simplemente establece una política de dónde almacenar el valor en secreto. El uso de Object.defineProperty
significa que no descubrirá accidentalmente el valor del almacenamiento, debe conocer la guía mágica para buscarlo.
Dado que la clave se refiere directamente al valor (y WeakMap no se refiere a él), cuando todas las referencias a la clave han desaparecido, se pone a GCed como normal.
Me he encontrado con una biblioteca de JavaScript que implementa un navegador WeakMap en ES5 . (WeakMap está programado para ES6 ).
¿Cómo puede funcionar esto sin soporte en el lenguaje JavaScript?
Edición: para que quede claro, me refiero a un mapa débil , no a un mapa regular. Probé este proyecto utilizando el generador de perfiles de Chrome y las claves no están respaldadas por referencias sólidas. Obtienen GC''ed sin tener que eliminarlos de WeakMap.