WeakSet

Un ensemble d’objets qui ne les retient pas en mémoire. Sert à marquer des objets, par ex. déjà traités.

Renvoie
Un nouvel objet WeakSet.
Sur cette page

Exemple

#
JavaScript
const completed = new WeakSet()

const lesson1 = { title: 'Variables' }
const lesson2 = { title: 'Boucles' }

completed.add(lesson1)

console.log(completed.has(lesson1))
console.log(completed.has(lesson2))
console.log(completed.has({ title: 'Variables' }))
Console
true
false
false

La troisième vérification porte sur un nouvel objet avec le même contenu. L’ensemble compare les objets par référence, donc il ne le trouve pas.

Définition et utilisation

#

WeakSet est un ensemble semblable à Set, mais il stocke des objets, pas des chaînes ou des nombres : essayer d’ajouter une chaîne ou un nombre déclenche une TypeError. L’ensemble retient ses objets « faiblement ». Dès qu’il n’existe plus aucune autre référence vers un objet dans le programme, le moteur peut le retirer de la mémoire, et l’objet disparaît simplement de l’ensemble.

Il n’a que trois méthodes : add(), has() et delete(). Il n’a ni size, ni clear(), ni forEach(), ni aucun moyen de parcourir ses éléments, car son contenu peut changer à tout moment pendant que le ramasse-miettes fonctionne. Vous ne pouvez donc demander que si un objet précis se trouve dans l’ensemble.

Un usage typique consiste à marquer des objets sans les modifier : retenir quels éléments du DOM ont déjà été traités, quels objets vous avez visités en parcourant des données imbriquées, ou quels élèves ont déjà reçu une récompense. Quand un objet n’est plus nécessaire, son entrée disparaît avec lui, sans risque de fuite de mémoire.

Syntaxe

#
Syntaxe
new WeakSet()
new WeakSet(iterable)

weakSet.add(object)
weakSet.has(object)
weakSet.delete(object)

Paramètres

#
  • iterable

    optionnel

    Un tableau ou un autre objet itérable d’objets dont l’ensemble est rempli au départ.

Plus d’exemples

#
Seulement des objets, sans aperçu du contenu
JavaScript
const seen = new WeakSet()

try {
  seen.add('Léa')
} catch (error) {
  console.log(error.name)
}

seen.add({ id: 1 })
console.log(seen.size)
console.log(seen)
Console
TypeError
undefined
WeakSet {}
Une récompense accordée une seule fois
JavaScript
const rewarded = new WeakSet()

function award(student) {
  if (rewarded.has(student)) {
    return `${student.name} a déjà le badge`
  }
  rewarded.add(student)
  return `Badge pour ${student.name}`
}

const léa = { name: 'Léa' }

console.log(award(léa))
console.log(award(léa))
Console
Badge pour Léa
Léa a déjà le badge
Détecter les cycles dans les données
JavaScript
function hasCycle(value, path = new WeakSet()) {
  if (typeof value !== 'object' || value === null) return false
  if (path.has(value)) return true
  path.add(value)
  const found = Object.values(value).some((child) => hasCycle(child, path))
  path.delete(value)
  return found
}

const course = { title: 'JS', modules: [] }
console.log(hasCycle(course))

course.modules.push({ parent: course })
console.log(hasCycle(course))
Console
false
true

JSON.stringify() lève une erreur pour des données avec un cycle, et une fonction comme celle-ci permet de le vérifier avant. L’ensemble ne retient que les objets du chemin en cours, donc chaque objet en est retiré une fois ses enfants vérifiés.

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

#
  • Choisissez WeakSet quand vous avez seulement besoin de savoir « cet objet est-il marqué ». Si vous voulez attacher des données supplémentaires à l’objet, utilisez WeakMap.
  • Si vous devez connaître le nombre d’éléments ou les parcourir en boucle, choisissez un Set ordinaire. WeakSet l’interdit volontairement.
  • Impossible de prévoir quand un objet inutilisé disparaîtra de l’ensemble. Ne basez pas la logique de votre programme sur le moment du ramassage des miettes.

Entrées associées

#

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