? Referências fortes em JavaScript: A referência de um objeto é uma referência forte em JavaScript, ou seja, quando将一个引用对象通过变量或常量保存
, então a variável ou constante é uma referência forte, e o objeto não será Reciclar.
Referências fracas em JavaScript: WeakMaps e WeakSets são as únicas maneiras pelas quais podemos usar referências fracas em JavaScript.将一个对象作为键添加
para um WeakMap ou WeakSet não evita que esses objetos sejam reciclados.
é uma criança A segurando um cachorro e eles estão conectados por uma corrente de cachorro.
Uma referência fraca é que há uma pessoa B apontando para o cachorro segurado por A e dizendo: Ei, tem um cachorro aí, e B aponta para o cachorro, mas não há nada amarrado entre eles.
Quando A soltar a coleira, o cachorro fugirá (foi coletado como lixo), independentemente de B ainda estar apontando.
No entanto, quando B não aponta mais para o cachorro, o cachorro ainda está sendo segurado por A, o que não afetará sua fuga.
deixe as pessoas = {nome:'Zhang San',idade:25} let people1 = people;
No código acima, quando atribuirmos {name:'张三',age:25}
à variável people, haverá uma linha conectando-os na memória:
Em seguida, crie a variável people1 e atribua pessoas a people1, o que equivale a people1 também referenciando este objeto:
Vamos dar uma olhada no que acontece quando usamos os tipos recém-introduzidos WeakSet e WeakMap no ES6 para armazenar valores de referência.
deixe pessoas = {nome:'Zhang San',idade:25} deixe pessoas1 = pessoas; deixe definir = new WeakSet(); set.add(people);
Criamos uma nova instância WeakSet() e adicionamos pessoas através do método add. O valor de referência correspondente a people é {name:'张三',age:25}
.
Pode-se ver que o valor {name:'张三',age:25}
na instância do conjunto refere-se a {name:'张三',age:25}
(na memória real, aponta para a pilha de dados Referência de ponteiro, a pilha aponta para o valor do endereço correspondente no heap correspondente). E é importante notar que esta “linha” de referências fracas é transparente. O que isso significa? Qual é a diferença entre ela e uma citação forte?
Resumo de uma frase: uma referência forte é reconhecida como uma "conexão" pela referência {name:'张三',age:25}
, enquanto uma referência fraca não é reconhecida. Ou seja, a referência não sabe que é referenciada pela instância definida.
Isso significa que a coleta de lixo não sabe que a referência é referenciada pela instância definida. Então, se todas as conexões de referência fortes da referência forem desconectadas (a variável for atribuída a nulo ou outras circunstâncias), a referência será destruída como lixo, mesmo que a instância definida ainda se refira à referência.
deixe pessoas = {nome:'Zhang San',idade:25} deixe pessoas1 = pessoas; deixe definir = new WeakSet(); set.add(pessoas); pessoas = nulo; people1 = null;
O que acontecerá se desconectarmos todas as referências fortes?
Como todas as referências fortes estão desconectadas, a coleta de lixo considera que a referência {name:'张三',age:25}
não é mais necessária e a destruirá. Então a referência usada pela instância de conjunto correspondente não existe mais, mesmo que a instância de conjunto ainda esteja usando a referência.
1. A referência ao objeto no WeakSet é uma referência fraca. Ou seja, mesmo que o conjunto fraco "referencie" um objeto, a coleta de lixo não conta essa referência como uma "referência". desde que não haja referências fortes em outro lugar. Este objeto é inacessível e pode ser reciclado a qualquer momento; ele só pode armazenar tipos de referência e não pode ser enumerado ou apagado.
2. WeakMap é semelhante ao Map, mas não é enumerável, não pode ser limpo e o objeto referenciado pela chave é uma referência fraca.
3. WeakSet é adequado para armazenar temporariamente um grupo de objetos e armazenar informações vinculadas aos objetos. Enquanto esses objetos desaparecerem externamente, suas referências no WeakSet desaparecerão automaticamente. Devido às características acima, os membros do WeakSet não são adequados para referência porque irão desaparecer a qualquer momento.
4. Referências fortes às vezes esquecem de desreferenciar, fazendo com que a memória não possa ser liberada, o que pode causar vazamentos de memória. Referências fracas não são incluídas no mecanismo de coleta de lixo, portanto esse problema não existe.