JavaScript WeakMap

L'objet WeakMap

Un WeakMap en JavaScript est une collection de paires clé/valeur où les clés doivent être des objets .

Un WeakMap conserve des références faibles à ses clés.

Exemple

// Créer un WeakMap
let myMap = new WeakMap();

// Créer un objet
let myObj = {fname:"John", lname:"Doe"};

// Définir une valeur dans le WeakMap
myMap.set(myObj, "player");

// Obtenir la valeur du WeakMap
let type = myMap.get(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 à une carte normale, un WeakMap ne prévient pas ses clés d'être collectées par le ramasse-miettes.

Si une clé (un objet) n'a plus de références dans un programme, elle devient éligible à la collecte des déchets.

Lorsque la clé est collectée, sa paire clé-valeur est supprimée du WeakMap.

Exemple

let myMap = new WeakMap();
let myObj = {fname:"John", lname:"Doe"};

myMap.set(myObj, "secret");
myObj = null;
// maintenant myObj (et ses valeurs) dans myMap peuvent être collectés

Les clés doivent être des objets

Les valeurs primitives ne peuvent pas être utilisées comme clés dans un WeakMap.

Les clés doivent être des objets ou des symboles non enregistrés.

Cette restriction est liée au mécanisme de collecte des déchets ; les primitives ne sont pas collectées de la même manière que les objets.


Suivi des objets

Les entrées dans un WeakMap sont faiblement conservées : si la clé de l'objet devient inaccessible, son mappage est supprimé automatiquement.

C'est parfait pour suivre des données sur des objets sans empêcher la collecte des déchets.

Suivi des visiteurs

let text = "";

// Créer un WeakMap pour stocker les comptes de visites
const visitsCount = new WeakMap();

// Créer des 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);
track(Paul);
track(John);

// Fonction pour suivre les visiteurs
function track(visitor) {
let count = visitsCount.get(visitor) || 0;
count++;
visitsCount.set(visitor, count);
text += visitor.name + ", âge " + visitor.age + ", a visité " + count + " fois.<br>";
}
Essayez-le vous-même »

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 WeakMaps sont non énumérables .

Vous ne pouvez pas itérer sur les clés et les valeurs avec des boucles for, forEach() ou keys().

Vous ne pouvez pas accéder à la taille.


Méthodes limitées

WeakMap fournit un ensemble limité de méthodes :

new WeakMap() Crée un nouvel objet WeakMap
get(key) Obtient la valeur pour une clé dans un WeakMap
set(key, value) Définit la valeur pour une clé dans un WeakMap
delete(key) Supprime un élément spécifié par une clé
has(key) Renvoie vrai si une clé existe dans un WeakMap

Données secrètes de Weak Map

Exemple

// Créer un WeakMap
const myMap = new WeakMap();

// Simulation de champs privés
class User {
constructor(name) {
myMap.set(this, {secret:"données cachées"});
this.name = name;
}
getSecret() {
return myMap.get(this).secret;
}
}

const user1 = new User("John");
secret = user1.getSecret();
Essayez-le vous-même »

Exemple expliqué

Un WeakMap ne permet pas l'itération.

Le code extérieur ne peut pas "découvrir" quels objets sont stockés à l'intérieur d'un WeakMap.

Pour obtenir le secret, vous avez besoin de la référence this qui a été utilisée dans le constructeur.

Le code externe a accès à user1 et myMap, mais pas à la référence this à l'intérieur de myMap, à moins que vous ne l'exposiez explicitement, comme via getSecret(); la valeur secrète est inaccessibile.


Confidentialité

WeakMap a été intentionnellement conçu pour la confidentialité : vous pouvez définir, obtenir, vérifier et supprimer en utilisant une clé d'objet, mais pas inspecter ce qui est à l'intérieur.

C'était un excellent outil pour simuler des propriétés privées dans les classes JavaScript (avant que les champs #privés ne soient ajoutés au langage).



Support des navigateurs

WeakMap 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