JavaScript WeakSet
L'objet WeakSet
Un WeakSet en JavaScript est une collection de valeurs où les valeurs doivent être des objets .
Un WeakSet conserve des références faibles à ses valeurs.
Exemples
// Créer un WeakSet
let mySet = new WeakSet();
// Créer un objet
let myObj = {fname:"John", lname:"Doe"};
// Ajouter l'objet
mySet.add(myObj);
// Ai-je myObj dans le mySet ?
let answer = mySet.has(myObj);
// Créer un WeakSet
let mySet = new WeakSet();
// Créer un objet
let myObj = {fname:"John", lname:"Doe"};
// Ajouter l'objet
mySet.add(myObj);
// Supprimer l'objet
mySet.delete(myObj);
// Ai-je myObj dans le mySet ?
let answer = mySet.has(myObj);
Collecte des déchets
JavaScript utilise un mécanisme de gestion de la mémoire connu sous le nom de Collecte des déchets .
Les fonctions principales sont :
- Assurer une utilisation efficace des ressources mémoire
- Récupérer la mémoire occupée par des variables qui ne sont plus utilisées
- Prévenir les fuites de mémoire
Références faibles
Contrairement à un Set ordinaire, un WeakSet ne prévient pas ses valeurs d'être collectées comme déchets.
Si une valeur (un objet) n'a pas de références dans un programme, elle devient éligible à la collecte des déchets.
Lorsque la valeur est collectée comme déchet, elle est supprimée du WeakSet.
Exemple
// Créer un WeakSet
let mySet = new WeakSet();
// Créer un objet
let myObj = {fname:"John", lname:"Doe"};
// Ajouter l'objet
mySet.add(myObj);
// Supprimer l'objet de la mémoire
myObj = null;
// Maintenant, myObj dans mySet sera collecté comme déchet Les valeurs doivent être des objets
Les valeurs primitives ne peuvent pas être des valeurs dans un WeakSet.
Les valeurs doivent être des objets .
Cette restriction est liée au mécanisme de collecte des déchets ; les primitives ne sont pas collectées comme déchets de la même manière que les objets.
Suivi des objets
Un WeakSet est similaire à un Set, mais il ne stocke que des objets et les conserve faiblement. S'il n'y a pas d'autres références à un objet, il est automatiquement collecté comme déchet.
Cela le rend pratique pour suivre des objets sans stocker de données supplémentaires (comme des comptes).
Suivi des visiteurs :
let text = "";
// Créer un WeakSet pour suivre les personnes
const persons = new WeakSet();
// Objets visiteurs
const John = {name:"John", age:40};
const Paul = {name:"Paul", age:41};
const Ringo = {name:"Ringo", age:42};
const George = {name:"George", age:43};
// Suivre les visites
track(Paul);
track(Ringo);
track(Paul);
// Fonction pour suivre les visiteurs
function track(visitor) {
if (persons.has(visitor)) {
text += visitor.name + " visite à nouveau.<br>";
} else {
persons.add(visitor);
text += visitor.name + ", âgé de " + visitor.age + ", visite pour la première fois<br>";
}
}
Remarque
Si vous souhaitez également compter les visites :
Nettoyage automatique
Si vous supprimez toutes les références à un objet visiteur :
Suivi des visiteurs :
John = null;
// L'entrée pour John est maintenant supprimée du WeakMap (persons) Non itérable
Les WeakSets ne sont pas énumérables .
Vous ne pouvez pas itérer sur les valeurs avec des boucles for, forEach() ou values().
Vous ne pouvez pas accéder à la taille. Les WeakSets n'ont pas de propriété de taille .
Méthodes limitées
Un WeakSet est minimal, sûr pour la mémoire et conçu pour suivre des objets de manière privée et efficace.
WeakSet fournit un ensemble limité de méthodes :
| new WeakSet() | Crée un nouvel objet WeakSet |
| add(object) | Ajoute un objet à un WeakSet |
| delete(object) | Supprime un objet WeakSet |
| has(object) | Renvoie true si un objet existe dans un WeakSet |
WeakSet n'a pas :
- Une propriété de taille
- Un opérateur de propagation (...)
- Une méthode clear()
- Des méthodes logiques (union, différence, intersection)
- Des méthodes d'itération (forEach, keys, values, entries)
Ce qui précède est intentionnel : les objets peuvent disparaître lors de la collecte des déchets, il n'est pas logique de les itérer ou de les compter.
Support des navigateurs
WeakSet est une fonctionnalité ES6 .
ES6 est entièrement pris en charge dans tous les navigateurs modernes depuis juin 2017 :
| Chrome 51 | Edge 15 | Firefox 54 | Safari 10 | Opera 38 |
| Mai 2016 | Avr 2017 | Juin 2017 | Sep 2016 | Juin 2016 |