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);
Essayez-le vous-même »
// 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);
Essayez-le vous-même »

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>";
}
}
Essayez-le vous-même »

Remarque

Si vous souhaitez également compter les visites :

Essayez d'utiliser un WeakMap à la place .

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