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.
Exemple
#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' }))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
#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
#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)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))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))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
WeakSetquand vous avez seulement besoin de savoir « cet objet est-il marqué ». Si vous voulez attacher des données supplémentaires à l’objet, utilisezWeakMap. - Si vous devez connaître le nombre d’éléments ou les parcourir en boucle, choisissez un
Setordinaire.WeakSetl’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
#- SetUne collection de valeurs uniques : chaque valeur ne peut apparaître qu’une fois dans l’ensemble.
- WeakMapUne map avec des objets comme clés, qui ne les retient pas en mémoire : l’entrée disparaît avec l’objet inutilisé.
- MapUne collection de paires clé-valeur dans laquelle la clé peut être n’importe quelle valeur, et où l’ordre d’ajout est conservé.
- JSON.stringify()Transforme une valeur JavaScript, comme un objet ou un tableau, en chaîne de caractères au format JSON.
- classDéfinit une classe, c’est-à-dire un modèle pour créer des objets avec les mêmes champs et méthodes.
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.