
En termes simples, si une variable ou un objet est « inaccessible », alors il n’est pas nécessaire que la variable ou l’objet continue à être stocké en mémoire et doit être recyclé.
Par exemple :
laissez xiaoming = {name:'xiaoming'}//Créez un objet et utilisez la variable xiaoming pour référencer xiaoming = null //Rendez la variable xiaoming vide, rendant l'objet {name:'xiaoming'} inaccessible//{ name:'xiaoming'} L'objet est recyclé Si un objet est référencé par un tableau et d'autres objets, tant que le tableau et l'objet qui le référence existent dans le tableau, alors l'objet est considéré comme accessible.
Objets dans le tableau :
let xiaoming = {name:'xiaoming'}
laissez arr = [xiaoming]
xiaoming = null //Rendre la variable xiaoming vide //L'objet {name:'xiaoming'} ne sera pas libéré car il existe dans le tableau De même, si nous utilisons un objet comme clé de Map , si Map existe. , alors L'objet ne sera pas recyclé par le moteur.
Objet clé dans Map :
let xiaoming = {name:'xiaoming'}
laissez map = new Map()
map.set (xiaoming, 'un garçon')
xiaoming = null //Rendre la variable xiaoming vide //L'objet {name:'xiaoming'} ne sera pas libéré car c'est la clé de la carte. WeapMap est fondamentalement différent de Map dans le traitement de libération des objets clés. c'est simplement que WeapMap n'empêchera pas le garbage collection à cause des objets comme clés.
La différence entre WeakMap et Map peut être divisée en trois aspects :
WeakMap ne peut utiliser que des objets comme cléslet lowMap = new WeakMap()
laissez obj = {nom: 'obj'}
faibleMap.set(obj,'obj comme clé')
faibleMap.set('str','str as the key')//Les résultats de l'exécution du code d'erreur sont les suivants :

On peut voir que lorsque nous utilisons des chaînes comme key , le programme ne peut pas s'exécuter normalement.
Autrement dit, si un objet n'a pas d'autres références que WeakMap , alors l'objet sera recyclé par le système.
Par exemple :
laissez lowMap = new WeakMap()
laissez obj = {nom: 'obj'}
faibleMap.set(obj,'obj comme clé')
obj = null //Rendre la variable obj vide //À ce moment, l'objet {name:'obj'} sera recyclé WeakMap prend en charge les méthodes limitéesWeakMap ne prend pas en charge l'itérationWeakMap ne prend pas en charge keys()WeakMap ne prend pas en charge values()WeakMap ne prend pas en charge entires(), nous n'avons donc aucun moyen d'obtenir toutes les paires clé-valeur.
WeakMap ne peut utiliser que les méthodes suivantes :
weakMap.get(key) Récupère la paire clé-valeurweakMap.set(key,val) Définit la paire clé-valeurweakMap.delete(key) Supprime la paire clé-valeurweakMap.has(key) Déterminer s'ilexiste. La méthode d'accès aux données de WeakMap doit être restreinte car le moment où le moteur JavaScript libère l'objet ne peut pas être déterminé.
Lorsqu'un objet perd toutes ses références, JavaScript peut libérer immédiatement l'espace occupé par l'objet ou attendre un moment.
Ainsi, à un certain moment, le nombre d’éléments de WeakMap ne peut pas être déterminé. (Imaginez, si nous parcourons les éléments de WeakMap après qu'un objet a perdu toutes les références, nous pouvons obtenir des résultats différents.)
Le scénario d'application de WeakMap consiste généralement à stocker des données qui « appartiennent » à un objet lorsque l'objet n'en fait pas partie. Lorsqu'elles sont présentes, les données « appartenant » à cet objet doivent également être diffusées.
Il existe une histoire historique qui convient très bien à l'utilisation de WeakMap` : "Le lapin rusé meurt, les laquais sont cuits ; les oiseaux sont partis et le bon arc est caché."
Si nous décrivons cette histoire en code JavaScript , nous devrions utiliser WeakMap :
let lowMap = new WeakMap()
let Rabbit = {name:'rabbit'} //Le lapin rusé let runDog = {name:'runDog'} //Le chien qui court let flyBird = {name:'flyBird'} //L'oiseau volant let goodBow = {name :'goodBow'} //Liang Gong lowMap.set(lapin,runDog)
faibleMap.set (flyBird, goodBow)
lapin = null //Le lapin rusé meurt flyBird = null //Les oiseaux sont partis//Bientôt, les laquais et le bon arc seront relâchés, peut-être pas immédiatement //Cette histoire nous dit qu'il n'y a pas de bonne fin à être un laquais, peut-être pas immédiatement Tué par //, mais il sera tué tôt ou tard. Par rapport à Set, Set WeakSet différences suivantes :
WeakSet ne peut ajouter que des éléments d'objetWeakSet n'empêche pas le système de recycler les éléments.WeakSet prend en charge add() , has() , delete()WeakSet ne prend pas en charge size et la méthode keys()Nous pouvons utiliser WeakMap pour vérifier certaines informations d'existence, ou vérifier WeakMap statut tel que "oui/non". pour déterminer si l'utilisateur est en ligne :
let onlineUser = new WeakMap()
laissez zhangSan = {nom: 'Zhang San'}
laissez liSi = {name:'李思'}
laissez wangEr = {name:'王二'}
laissez maZi = {nom: 'Mazi'}
fonction connexion (utilisateur) {
... ...
onlineUser.add(utilisateur)
}
//Déterminez si l'utilisateur est en ligne, fonction isOnline(user){
retourner onlineUser.has (utilisateur)
} La limitation de WeakMap et WeakSet est qu'ils ne peuvent pas itérer et obtenir tous les éléments en même temps, ce qui n'affecte pas leur rôle important dans des endroits très critiques.
WeakMap ne peut utiliser des objets que comme clés. Lorsque toutes les références externes à la clé sont perdues (aucune autre variable à l'exception de WeakMap ne fait référence à l'objet clé), WeakMap n'empêchera pas le moteur de recycler la valeur de la clé. Une fois recyclés, les éléments correspondants du WeakMap n’existent plus.WeakSet ne peut stocker que des objets. Une fois que l'élément objet perd toutes les références externes (à l'exception de WeakSet , aucune autre variable ne fait référence à l'objet élément), WeakSet n'empêchera pas le moteur de recycler l'élément. Une fois recyclés, les éléments correspondants dans WeakSet disparaissent.clear() , size , keys() , values() ne sont pas prises en charge. WeakMap et WeakSet sont souvent utilisées pour stocker les structures de données associées à l'objet "main" Une fois que l'objet "main" perd sa signification, l'objet "main" correspondant. La structure de données associée est naturellement supprimée.