9
votes

Comprendre des cartes faibles

ECMAScript 6 introduit des cartes faibles, disponibles dans Node.js V0.11.3 avec le drapeau - Harmony code>. Considérons les suivants.

let weakMap = WeakMap();
let key = [];
let rubbish = 'fish cans';

weakMap.set(key, rubbish);
rubbish = 'empty bottle';

// Prints "fish cans"
console.log(weakMap.get(key));


2 commentaires

Je suppose que la valeur toujours peut être consultée simplement parce que le gars à ordures ne passait pas encore par la rue. En d'autres termes, peut-être que si vous deviez essayer cela un peu de temps après cela ne fonctionnerait pas?


Un moyen de vérifier si c'est le cas, il s'agirait d'exécuter une boucle sadique d'allocations où le moteur serait forcé de gc de trucs. Si c'est toujours là, alors quelque chose le tiennent.


4 Réponses :


12
votes

Pourquoi alors est la valeur '' poissons des canettes ' toujours accessible et non à la poubelle collectée? Les ordures variables ne se réfèrent plus et la référence de la clé de 'canaux de poisson' est faible, c'est-à-dire non existant du point de vue du collecteur des ordures. Qu'est-ce que je manque?

La variable déchets n'a jamais été celui qui devait y référoir. L'association (référence) de la clé de la valeur existe toujours tant que la clé n'est pas collectée. La faible référence, que la GC ne peut pas voir, est celle de la carte à la paire de la clé / de la valeur (celle qui rendrait la carte enumérable). Pourtant, votre clé existe toujours et vous pouvez obtenir chaque valeur que vous avez enregistrée pour elle sur la carte: xxx

pour démontrer la faiblesse, vous " d doivent utiliser ce qui suit: xxx


0 commentaires

17
votes

La partie faible concerne les touches, pas les valeurs. Du projet actuel:

La faiblesse est destinée à fournir un mécanisme d'association d'un état de manière dynamique avec un objet de manière à ne pas "fuir" ressources de mémoire si, en l'absence de la faiblesse, l'objet est devenu inaccessible et soumis à une récupération des ressources par la mise en œuvre de la mise en œuvre Mécanismes de collecte des ordures.

Dites que vous avez un élément DOM et que vous souhaitez associer certaines données avec elle et utiliser un affaibli pour celui-ci: faiblap.set (domenement, données); . Lorsque l'élément DOM est supprimé, l'entrée dans la carte faible est également supprimée.

D'autre part, vous ne voudrez pas que les données soient supprimées le long de l'élément DOM existent, simplement parce qu'il n'y a pas d'autre référence à l'extérieur de la carte faible.

En dehors de ce 'poissons des canettes' est un type primitif et qui n'est pas soumis à la collection de déchets.


0 commentaires

0
votes

J'essaie de comprendre cela aussi. Je pense que le paragraphe dit comme suit: xxx

en raison de la faiblesse n'a aucun moyen de récupérer les clés, vous n'avez aucun moyen d'obtenir cette "valeur".

si Nous utilisons la carte (), en raison des touches (), des entrées (), bien que la référence perdue de la clé variable, la "valeur" puisse toujours être récupérée. xxx

Conclusion:

Si la clé d'objet de faibles de la faiblesse a perdu sa référence, cette clé et la valeur seront également recueillies (car logiquement inaccessibles). De cette façon, peut empêcher la fuite de mémoire.

Si la clé d'objet de carte a perdu sa référence, cette clé et la valeur seront toujours disponibles jusqu'à ce que vous ayez supprimé ou effacé. Vous devez donc être au courant des fuites de mémoire pendant le développement

juste trouver un lien sur la compréhension de la faiblesse de la faiblesse et des cas d'utilisation: http://ilikekillnerds.com/2015/02/what-are- faiblaps-in-es6 /


0 commentaires

0
votes

J'ajoute cette réponse à l'adresse / clarifiez le point suivant:

La valeur initiale de la variable ' déchets ' n'a jamais été muté; Tout ce que vous avez accompli sur déchets = "bouteille vide"; était d'associer l'alias alias orbbis à une valeur différente. D'où même après déchets = 'vides bouteille'; a été exécuté, le affaibli saisie avec la touche ' clé ' a toujours une valeur associée à celle qui Références La valeur initiale de déchets .

Puis pour faire perdre la valeur de son association avec la clé, vous devez modifier la valeur de la variable de clé (comme indiqué précédemment dans la réponse de @ Bergi).

Notez que clé.Push ("quoi que ce soit"); ne correspond pas à un changer . Toutefois, clé = []; répété à nouveau ferait aussi bien que clé = null; . Généralement, toute réaffectation équivaudra au changement souhaité.


0 commentaires