javascript
ecmascript-6
ecmascript-harmony
weakmap
Dmitrii Sorin
fuente
fuente
key
no se puede recopilar porque usted hace referencia a él.Respuestas:
De la misma página, sección " ¿Por qué Weak Map? " :
[Y es por eso que tampoco tienen
size
propiedad]- que serían los "normales"
Map
s . No se menciona en el MDN, pero en la propuesta de la armonía , los que también tienenitems
,keys
yvalues
métodos de generador y poner en práctica laIterator
interfaz .fuente
new Map().get(x)
Tiene aproximadamente el mismo tiempo de búsqueda que leer una propiedad de un objeto simple?WeakMap
todavía tiene una matriz (u otra colección) de entradas, solo le dice al recolector de basura que esas son referencias débiles .Ambos se comportan de manera diferente cuando se elimina un objeto al que hacen referencia sus claves / valores. Tomemos el siguiente código de ejemplo:
El IIFE anterior se ejecuta, no hay forma de que podamos hacer referencia
{x: 12}
y{y: 12}
más. El recolector de basura sigue adelante y elimina el puntero clave b de "WeakMap" y también lo elimina{y: 12}
de la memoria. Pero en el caso de "Mapa", el recolector de basura no elimina un puntero de "Mapa" y tampoco lo 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/
fuente
map.entries().next().value // [{x:12}, 1]
WeakMap
que solo puede tener claves no primitivas (sin cadenas o números oSymbol
s como claves, solo matrices, objetos, otros mapas, etc.).Map
pero no en elWeakMap
Quizás la siguiente explicación sea más clara para alguien.
Como ves, después de quitar la
k1
llave de la memoria todavía podemos acceder a ella dentro del mapa. Al mismo tiempo, al eliminar lak2
clave de WeakMap, también se eliminawm
por referencia.Es por eso que WeakMap no tiene métodos enumerables como forEach, porque no existe una lista de claves WeakMap, son solo referencias a otros objetos.
fuente
forEach
,(key, val)
debería ser en realidad(val, key)
Otra diferencia (fuente: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap ):
Tampoco se puede usar una cadena, un número o un valor booleano como
WeakMap
clave. AMap
puede usar valores primitivos para claves.fuente
De Javascript.info
Mapa : si usamos un objeto como clave en un mapa normal, mientras el mapa existe, ese objeto también existe. Ocupa memoria y no se puede recolectar basura.
De manera similar, si usamos un objeto como clave en un mapa normal, mientras el mapa existe, ese objeto también existe. Ocupa memoria y no se puede recolectar basura
WeakMap : ahora, si usamos un objeto como clave y no hay otras referencias a ese objeto, se eliminará de la memoria (y del mapa) automáticamente.
fuente
WeapMap en javascript no contiene claves ni valores, solo manipula el valor de la clave usando una identificación única y define una propiedad para el objeto clave.
debido a que define la propiedad
key object
por métodoObject.definePropert()
, la clave no debe ser de tipo primitivo .y también debido a que WeapMap no contiene pares de valores clave, no podemos obtener la propiedad de longitud del mapa débil.
y también el valor manipulado se asigna de nuevo al objeto clave, el recolector de basura puede recolectar la clave fácilmente si no se usa.
Código de muestra para implementación.
referencia de implementación
fuente
id
, pero esto debería ser único usando algo Math.random y Date.now (), etc. Y agregando esta identificación dinámica, el primer punto puede resolverse. ¿Podría darme una solución para los dos últimos puntos?WeakMap
las claves deben ser objetos, no valores primitivos.¿¿¿¿Por qué????
Veamos el siguiente ejemplo.
WeakMap
no admite iteración y métodos keys () , valores () , entradas () , por lo que no hay forma de obtener todas las claves o valores de él.WeakMap solo tiene los siguientes métodos:
Eso es obvio, como si un objeto hubiera perdido todas las demás referencias (como 'usuario' en el código anterior), entonces debe ser recolectado automáticamente. Pero técnicamente no se especifica exactamente cuándo ocurre la limpieza.
El motor de JavaScript decide eso. Puede optar por realizar la limpieza de la memoria inmediatamente o esperar y hacer la limpieza más tarde cuando ocurran más eliminaciones. Por lo tanto, técnicamente
WeakMap
no se conoce el recuento actual de elementos de a . El motor puede haberlo limpiado o no o lo hizo parcialmente. Por esa razón, no se admiten los métodos que acceden a todas las claves / valores.fuente