? Références fortes en JavaScript : La référence d'un objet est une référence forte en JavaScript, c'est-à-dire que lorsqu'un将一个引用对象通过变量或常量保存
, alors la variable ou la constante est une référence forte, et l'objet ne sera pas recyclé.
Références faibles en JavaScript : WeakMaps et WeakSets sont les seuls moyens d'utiliser des références faibles en JavaScript.将一个对象作为键添加
à un WeakMap ou WeakSet n'empêche pas le recyclage de ces objets.
.Une référence forte est un enfant A tenant un chien, et ils sont reliés par une chaîne de chien.
Une référence faible est qu'il y a une personne B montrant le chien tenu par A et disant : Hé, il y a un chien là-bas, et B montre le chien, mais il n'y a rien de lié entre eux.
Lorsque A lâche la laisse du chien, le chien s'enfuit (a été ramassé les ordures), que B soit toujours en train de pointer du doigt.
Cependant, lorsque B ne désigne plus le chien, le chien est toujours retenu par A, ce qui n'affectera pas sa fuite.
let people = {name:'Zhang San',age:25} let people1 = people;
Dans le code ci-dessus, lorsque nous attribuons {name:'张三',age:25}
à la variable people, il y aura une ligne les reliant dans la mémoire :
Créez ensuite la variable people1 et attribuez people à people1, ce qui équivaut à people1 faisant également référence à cet objet :
Jetons un coup d'œil à ce qui se passe lorsque nous utilisons les nouveaux types WeakSet et WeakMap dans ES6 pour stocker les valeurs de référence.
laissez les gens = {nom : 'Zhang San', âge : 25} soit people1 = people ; laissez set = new WeakSet(); set.add(people);
Nous avons créé une nouvelle instance WeakSet() et ajouté des personnes via la méthode add. La valeur de référence correspondant aux personnes est {name:'张三',age:25}
.
On peut voir que la valeur {name:'张三',age:25}
dans l'instance définie fait référence à {name:'张三',age:25}
(dans la mémoire réelle, elle pointe vers la pile des données Référence de pointeur, la pile pointe vers la valeur de l'adresse correspondante dans le tas correspondant). Et il est important de noter que cette « ligne » de références faibles est transparente. Qu’est-ce que cela signifie ? Quelle est la différence entre une cotation forte et une cotation forte ?
Résumé en une phrase : Une référence forte est reconnue comme une « connexion » par la référence {name:'张三',age:25}
, tandis qu'une référence faible n'est pas reconnue. Autrement dit, la référence ne sait pas qu'elle est référencée par l'instance définie.
Cela signifie que le garbage collection ne sait pas que la référence est référencée par l'instance définie. Ensuite, si toutes les connexions de référence fortes de la référence sont déconnectées (la variable est affectée à null ou à d'autres circonstances), alors la référence sera détruite comme un déchet, même si l'instance définie fait toujours référence à la référence.
laissez les gens = {nom : 'Zhang San', âge : 25} soit people1 = people ; laissez set = new WeakSet(); set.add(personnes); personnes = nul ; people1 = null;
Que se passera-t-il si nous déconnectons toutes les références fortes ?
Étant donné que toutes les références fortes sont déconnectées, le garbage collection considère que la référence {name:'张三',age:25}
n'est plus nécessaire et la détruira. Ensuite, la référence utilisée par l'instance d'ensemble correspondante n'existe plus, même si l'instance d'ensemble utilise toujours la référence.
1. La référence à l'objet dans le WeakSet est une référence faible, c'est-à-dire que même si le jeu faible "référence" à un objet, le garbage collection ne compte pas cette référence comme une "référence". tant qu'il n'y a pas de références fortes ailleurs. Cet objet est inaccessible et peut être recyclé à tout moment, il ne peut stocker que des types de référence et ne peut pas être énuméré ou effacé.
2. WeakMap est similaire à Map, mais il n'est pas énumérable, ne peut pas être effacé et l'objet référencé par key est une référence faible.
3. WeakSet convient pour stocker temporairement un groupe d'objets et stocker des informations liées aux objets. Tant que ces objets disparaissent extérieurement, leurs références dans le WeakSet disparaîtront automatiquement. En raison des caractéristiques ci-dessus, les membres de WeakSet ne conviennent pas comme référence car ils disparaîtront à tout moment.
4. Les références fortes oublient parfois de déréférencer, ce qui empêche la libération de la mémoire, ce qui peut provoquer des fuites de mémoire. Les références faibles ne sont pas incluses dans le mécanisme de récupération de place, ce problème n'existe donc pas.