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 tardeComparado com Set,
Set
WeakSet
seguintes diferenças:
WeakSet
só pode adicionar elementos de objetoadd()
WeakSet
WeakSet
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.