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.
Sur cette page

Exemple

#
JavaScript
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' }))
Console
2
false

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

#
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

#
Une chaîne ne peut pas être une clé
JavaScript
const cache = new WeakMap()

try {
  cache.set('Léa', 1)
} catch (error) {
  console.log(error.name)
}

console.log(cache)
Console
TypeError
WeakMap {}
Des données cachées en dehors de l’objet
JavaScript
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'))
Console
Account { login: 'lea' }
true

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 WeakMap pour 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 #champ sont 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 une Map ordinaire.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.