
Simplificando, se uma variável ou objeto estiver "inacessível", então não há necessidade de a variável ou objeto continuar a ser armazenado na memória e deve ser reciclado.
Por exemplo:
let xiaomiing = {name:'xiaoming'}//Crie um objeto e use a variável xiaomiing para fazer referência xiaomiing = null //Deixe a variável xiaomiing em branco, tornando o objeto {name:'xiaoming'} inacessível //{ name:'xiaoming'} O objeto é reciclado Se um objeto for referenciado por um array e outros objetos, desde que o array e o objeto que o referencia existam no array, então o objeto é considerado alcançável.
Objetos na matriz:
let xiaomiing = {name:'xiaoming'}
deixe arr = [xiaoming]
xiaomiing = null //Deixa a variável xiaomiing em branco //O objeto {name:'xiaoming'} não será liberado porque existe no array Da mesma forma, se usarmos um objeto como chave do Map , se Map existir. , então O objeto não será reciclado pelo mecanismo.
Objeto-chave no Map :
let xiaomiing = {name:'xiaoming'}
deixe mapa = novo mapa()
map.set(xiaoming,'um menino')
xiaomiing = null //Deixar a variável xiaomiing em branco //O objeto {name:'xiaoming'} não será liberado porque é a chave do mapa WeapMap é fundamentalmente diferente do Map no processamento de liberação de objetos-chave. simplesmente, WeapMap não impedirá a coleta de lixo por causa de objetos como chaves.
A diferença entre WeakMap e Map pode ser dividida em três aspectos:
WeakMap só pode usar objetos como chaveslet fracoMap = new WeakMap()
deixe obj = {nome:'obj'}
fracoMap.set(obj,'obj como a chave')
fracoMap.set('str','str as the key')//Os resultados da execução do código de erro são os seguintes:

Pode-se observar que quando usamos strings como key , o programa não pode ser executado normalmente.
Em outras palavras, se um objeto não tiver outras referências exceto WeakMap , então o objeto será reciclado pelo sistema.
Por exemplo:
deixe fracoMap = new WeakMap()
deixe obj = {nome:'obj'}
fracoMap.set(obj,'obj como a chave')
obj = null //Deixa a variável obj vazia //Neste momento, o objeto {nome:'obj'} será reciclado WeakMap suporta métodos limitadosWeakMap não suporta iteraçãoWeakMap não suporta keys()WeakMap não suporta values()WeakMap não suporta entires(), portanto não temos como obter todos os pares de valores-chave.
WeakMap só pode usar os seguintes métodos:
weakMap.get(key) Obtenha o par de valores-chaveweakMap.set(key,val) Defina o par de valores-chaveweakMap.delete(key) Exclua o par de valores-chaveweakMap.has(key) Determine seexiste O método de acesso a dados do WeakMap deve ser restrito porque o tempo de liberação do objeto pelo mecanismo JavaScript não pode ser determinado.
Quando um objeto perde todas as referências, JavaScript pode liberar o espaço ocupado pelo objeto imediatamente ou pode esperar um pouco.
Portanto, em determinado momento, o número de elementos do WeakMap não pode ser determinado. (Imagine, se percorrermos os elementos do WeakMap depois que um objeto perder todas as referências, poderemos obter resultados diferentes.)
O cenário de aplicação do WeakMap geralmente é armazenar dados que "pertencem" a um objeto quando o objeto não pertence. Quando presentes, os dados “pertencentes” a este objeto também deverão ser divulgados.
Há uma história histórica que é muito adequada para usar o WeakMap`: "O coelho astuto morre, os lacaios são cozidos; os pássaros se foram e o arco bom está escondido."
Se descrevermos esta história em código JavaScript , devemos usar WeakMap :
let fracoMap = new WeakMap()
let coelho = {name:'rabbit'} //O coelho astuto let runDog = {name:'runDog'} //O cachorro correndo let flyBird = {name:'flyBird'} //O pássaro voador let goodBow = {name :'goodBow'} //Liang Gong fracoMap.set(coelho,runDog)
fracoMap.set(flyBird,goodBow)
coelho = null //O coelho astuto morre flyBird = null //Os pássaros se foram //Em breve, os lacaios e o arco bom serão libertados, talvez não imediatamente //Esta história nos diz que não há um bom final para ser um lacaio, talvez não seja morto imediatamente por //, mas será morto mais cedo ou mais tarde Comparado com Set, Set WeakSet seguintes diferenças:
WeakSet só pode adicionar elementos de objetoadd() WeakSetWeakSet impede que o sistema recicle elementos.add() , has() , delete()WeakSet não suporta size e o método keys()WeakMap usar WeakMap para verificar algumas informações de existência ou verificar status como "sim/não". para determinar se o usuário está online:
let onlineUser = new WeakMap()
deixe zhangSan = {nome:'Zhang San'}
deixe liSi = {nome:'李思'}
deixe wangEr = {nome:'王二'}
deixe maZi = {nome:'Mazi'}
função login(usuário){
... ...
onlineUser.add(usuário)
}
//Determina se o usuário está online function isOnline(user){
retornar onlineUser.has(usuário)
} A limitação do WeakMap e WeakSet é que eles não podem iterar e obter todos os elementos de uma vez, o que não afeta seu importante papel em locais muito críticos.
WeakMap só pode usar objetos como chaves Quando todas as referências externas à chave são perdidas (nenhuma outra variável, exceto WeakMap se refere ao objeto-chave), WeakMap não impedirá que o mecanismo recicle o valor da chave. Uma vez reciclados, os elementos correspondentes WeakMap não existem mais.WeakSet só pode armazenar objetos. Uma vez que o elemento do objeto perde todas as referências externas (exceto WeakSet , nenhuma outra variável se refere ao objeto do elemento), WeakSet não impedirá que o mecanismo recicle o elemento. Uma vez reciclados, os elementos correspondentes no WeakSet desaparecem.clear() , size , keys() , values() não são suportados. WeakMap e WeakSet são frequentemente usados para armazenar estruturas de dados associadas ao objeto "principal". a estrutura de dados associada é naturalmente excluída.