WeakMap
Une map avec des objets comme clés, qui ne les retient pas en mémoire : l’entrée disparaît avec l’objet inutilisé.
- Renvoie
- Un nouvel objet
WeakMap.
Exemple
#const visits = new WeakMap()
function trackVisit(user) {
visits.set(user, (visits.get(user) ?? 0) + 1)
return visits.get(user)
}
const léa = { name: 'Léa' }
trackVisit(léa)
console.log(trackVisit(léa))
console.log(visits.has({ name: 'Léa' }))Définition et utilisation
#WeakMap fonctionne comme Map, mais elle sert à associer des données à des objets : les clés sont des objets, et essayer d’utiliser une chaîne ou un nombre déclenche une TypeError. La map retient ses clés « faiblement » : dès qu’il n’existe plus aucune autre référence vers l’objet utilisé comme clé, le moteur JavaScript peut le retirer de la mémoire avec la valeur associée.
Grâce à cela, WeakMap convient bien pour attacher des données supplémentaires à des objets que vous ne contrôlez pas, comme des éléments du DOM ou des objets venant d’une bibliothèque, sans risque de fuite de mémoire. Quand un élément est retiré de la page et oublié, ses données disparaissent avec lui.
WeakMap n’a que quatre méthodes : set(), get(), has() et delete(). Elle n’a ni size, ni clear(), ni aucun moyen de parcourir ses entrées, car son contenu peut changer à tout moment à cause du ramasse-miettes. Si vous avez besoin de la liste de toutes les entrées, utilisez une Map ordinaire.
Syntaxe
#new WeakMap()
new WeakMap(iterable)
weakMap.set(key, value)
weakMap.get(key)
weakMap.has(key)
weakMap.delete(key)Paramètres
#iterable
optionnel
Un tableau de paires[objet, valeur]dont la map est remplie au départ.
Plus d’exemples
#const cache = new WeakMap()
try {
cache.set('Léa', 1)
} catch (error) {
console.log(error.name)
}
console.log(cache)const passwords = new WeakMap()
class Account {
constructor(login, password) {
this.login = login
passwords.set(this, password)
}
checkPassword(attempt) {
return passwords.get(this) === attempt
}
}
const account = new Account('lea', 'secret123')
console.log(account)
console.log(account.checkPassword('secret123'))Le mot de passe n’est pas une propriété de l’objet, donc il n’apparaît ni dans la console ni dans Object.keys(). Dans les classes récentes, le champ privé #password donne le même résultat.
Compatibilité des navigateurs
#Largement disponible
Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.
- Chrome
- Edge
- Firefox
- Safari
Bonnes pratiques
#- Utilisez
WeakMappour les caches et les données attachées à des objets qui peuvent disparaître, comme des éléments du DOM. - Dans les classes récentes, les champs privés
#champsont plus pratiques pour cacher des données. - Si vous avez besoin de
size, de la liste des clés ou de parcourir les entrées en boucle, choisissez uneMapordinaire.
Entrées associées
#- MapUne collection de paires clé-valeur dans laquelle la clé peut être n’importe quelle valeur, et où l’ordre d’ajout est conservé.
- SetUne collection de valeurs uniques : chaque valeur ne peut apparaître qu’une fois dans l’ensemble.
- classDéfinit une classe, c’est-à-dire un modèle pour créer des objets avec les mêmes champs et méthodes.
- Object.create()Crée un nouvel objet avec le prototype donné.
- WeakSetUn ensemble d’objets qui ne les retient pas en mémoire. Sert à marquer des objets, par ex. déjà traités.
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.