weakset sets new mapa es6 javascript ecmascript-6 enumerable weakmap

sets - symbol() javascript



¿Por qué ES6 WeakMap no es enumerable? (2)

Es una compensación. Si introduce el objeto <-> diccionarios de objetos que admiten la posibilidad de enumeración, tiene dos opciones con relación a la recolección de basura:

  1. Considere la entrada clave como una referencia sólida que evita la recolección de basura del objeto que se está utilizando como clave.

  2. Conviértalo en una referencia débil que permita que sus claves se recojan cuando cada otra referencia haya desaparecido.

Si haces el número 1, te será extremadamente fácil dispararte en el pie al filtrar objetos grandes en la memoria por todo el lugar. Por otro lado, si elige la opción # 2, su diccionario de claves se vuelve dependiente del estado de recolección de basura en la aplicación, lo que inevitablemente hará que sea imposible localizar errores.

Antes de mi reingreso en JavaScript (y relacionado) he hecho un montón de ActionScript 3 y allí tenían un objeto de diccionario que tenía claves débiles como el próximo WeakMap; pero la versión de AS3 aún era enumerable como un objeto genérico regular, mientras que WeakMap específicamente no tiene .keys() o .values() .

La versión AS3 nos permitió armar algunas construcciones realmente interesantes y útiles, pero creo que la versión JS es algo limitada. ¿Porqué es eso?

Si Flash VM podría hacerlo, ¿qué impide que los navegadores hagan lo mismo? Leí cómo sería "no determinista", pero ese es el punto, ¿no?


Finalmente encontré la respuesta real: http://tc39wiki.calculist.org/es6/weak-map/

Una propiedad clave de Weak Maps es la incapacidad de enumerar sus claves. Esto es necesario para evitar que los atacantes observen el comportamiento interno de otros sistemas en el entorno que comparten objetos débilmente asignados. Si el número o los nombres de los elementos de la colección son visibles desde la API, incluso si los valores no lo son, las instancias de WeakMap pueden crear un canal lateral donde uno no estaba disponible anteriormente.