javascript
ecmascript-6
ecmascript-harmony
weakmap
Dmitrii Sorin
fonte
fonte
key
não pode ser coletado, porque é referenciado por você.Respostas:
Na mesma página, seção " Por que o mapa fraco ? " :
[E é por isso que eles também não têm
size
propriedade]- quais seriam os "normais"
Map
s . Não mencionados no MDN, mas na proposta harmonia , aqueles também têmitems
,keys
evalues
métodos de geradores e implementar aIterator
interface de .fonte
new Map().get(x)
tem aproximadamente o mesmo tempo look-up como a leitura de uma propriedade de um objeto simples?WeakMap
ainda tem um array (ou outra coleção) de entradas, ele apenas informa ao coletor de lixo que essas são referências fracas .Ambos se comportam de maneira diferente quando um objeto referenciado por suas chaves / valores é excluído. Vamos pegar o código de exemplo abaixo:
O IIFE acima é executado, não há como fazer referência
{x: 12}
e{y: 12}
mais. O coletor de lixo vai em frente e exclui o ponteiro-chave b do “WeakMap” e também remove{y: 12}
da memória. Mas no caso do “Mapa”, o coletor de lixo não remove um ponteiro do “Mapa” e também não remove{x: 12}
da memória.Resumo: WeakMap permite que o coletor de lixo faça sua tarefa, mas não Mapeie.
Referências: http://qnimate.com/difference-between-map-and-weakmap-in-javascript/
fonte
map.entries().next().value // [{x:12}, 1]
WeakMap
só pode ter chaves não primitivas (sem strings ou números ouSymbol
s como chaves, apenas arrays, objetos, outros mapas, etc.).Map
mas não noWeakMap
Talvez a próxima explicação seja mais clara para alguém.
Como você pode ver, após remover a
k1
chave da memória, ainda podemos acessá-la dentro do mapa. Ao mesmo tempo, remover ak2
chave do WeakMap também a removewm
por referência.É por isso que o WeakMap não tem métodos enumeráveis como forEach, porque não existe uma lista de chaves do WeakMap, elas são apenas referências a outros objetos.
fonte
forEach
,(key, val)
deveria ser realmente(val, key)
Outra diferença (fonte: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap ):
Nem uma string, número ou booleano podem ser usados como uma
WeakMap
chave. AMap
pode usar valores primitivos para chaves.fonte
De Javascript.info
Mapa - se usarmos um objeto como a chave em um mapa normal, então, enquanto o mapa existir, esse objeto também existe. Ele ocupa memória e não pode ser coletado como lixo.
Semelhante a isso, se usarmos um objeto como a chave em um Mapa normal, então, enquanto o Mapa existir, esse objeto também existe. Ele ocupa memória e não pode ser coletado
WeakMap - Agora, se usarmos um objeto como a chave nele, e não houver outras referências a esse objeto - ele será removido da memória (e do mapa) automaticamente.
fonte
WeapMap em javascript não contém nenhuma chave ou valor, ele apenas manipula o valor da chave usando um id único e define uma propriedade para o objeto chave.
porque define a propriedade
key object
por métodoObject.definePropert()
, a chave não deve ser do tipo primitivo .e também porque WeapMap não contém pares de valores-chave, não podemos obter a propriedade de comprimento de mapa fraco.
e também o valor manipulado é atribuído de volta ao objeto-chave, o coletor de lixo pode facilmente coletar a chave se não estiver em uso.
Código de amostra para implementação.
referência de implementação
fonte
id
, mas isso deve ser exclusivo usando algo Math.random e Date.now (), etc. E adicionando este id dinâmico, o primeiro ponto pode ser resolvido. Você poderia me fornecer uma solução para os dois últimos pontos.WeakMap
as chaves devem ser objetos, não valores primitivos.Por quê????
Vamos ver o exemplo abaixo.
WeakMap
não suporta iteração e métodos keys () , values () , entradas () , portanto, não há como obter todas as chaves ou valores dele.O WeakMap possui apenas os seguintes métodos:
Isso é óbvio, como se um objeto tivesse perdido todas as outras referências (como 'usuário' no código acima), então ele deve ser coletado como lixo automaticamente. Mas tecnicamente não é exatamente especificado quando a limpeza acontece.
O mecanismo JavaScript decide isso. Ele pode optar por realizar a limpeza da memória imediatamente ou aguardar e fazer a limpeza mais tarde, quando ocorrerem mais exclusões. Portanto, tecnicamente, a contagem atual de elementos de a
WeakMap
não é conhecida. O motor pode ter limpado ou não ou feito parcialmente. Por esse motivo, os métodos que acessam todas as chaves / valores não são suportados.fonte