--- title: WeakSet slug: Web/JavaScript/Reference/Global_Objects/WeakSet tags: - ECMAScript 2015 - JavaScript - Reference - WeakSet translation_of: Web/JavaScript/Reference/Global_Objects/WeakSet original_slug: Web/JavaScript/Reference/Objets_globaux/WeakSet ---
{{JSRef}}

L'objet WeakSet permet de créer un ensemble dont les objets sont contenus avec des références faibles.

Syntaxe

new WeakSet([itérable]);

Paramètre

itérable
Si un objet itérable est présent comme argument, ses éléments seront ajoutés au nouvel objet WeakSet. {{jsxref("null")}} est traité comme {{jsxref("undefined")}}.

Exemples

var ws = new WeakSet();
var toto = {};
var truc = {};

ws.add(toto);
ws.add(truc);

ws.has(toto);  // true
ws.has(truc);  // true

ws.delete(toto); // retire toto de l'ensemble
ws.has(toto);    // false, toto a été enlevé

On notera que toto !== truc. Bien que ce soient des objets similaires, ce ne sont pas les mêmes objets. Aussi, les deux sont ajoutés à l'ensemble.

Description

Les WeakSet sont des ensembles d'objets. Un objet présent dans un objet WeakSet ne peut apparaître qu'une seule fois, il est unique pour un WeakSet donné.

Les principales différences avec l'objet {{jsxref("Set")}} sont les suivantes :

Propriétés

WeakSet.length
La valeur de la propriété length est 0.
{{jsxref("WeakSet.prototype")}}
Cette propriété représente le prototype pour le constructeur WeakSet. Il permet d'ajouter des propriétés pour tous les objets WeakSet.

Instances de WeakSet

Toutes les instances de WeakSet héritent de {{jsxref("WeakSet.prototype")}}.

Propriétés

{{page('fr/docs/Web/JavaScript/Reference/Objets_globaux/WeakSet/prototype','Propri.C3.A9t.C3.A9s')}}

Méthodes

{{page('fr/docs/Web/JavaScript/Reference/Objets_globaux/WeakSet/prototype','M.C3.A9thodes')}}

Exemples

Détecter les références circulaires

Les fonctions récursives doivent faire attention aux structures de données circulaire qu'elles consommeraient. Les objets WeakSets peuvent être utilisé pour ça :

// Appeler un callback sur ce qui est stocké dans un objet
function execRecursively(fn, subject, _refs = null){
  if(!_refs)
    _refs = new WeakSet();

  // On évite une récursion infinie
  if(_refs.has(subject))
    return;

  fn(subject);
  if("object" === typeof subject){
    _refs.add(subject);
    for(let key in subject)
      execRecursively(fn, subject[key], _refs);
  }
}

const toto = {
  toto: "Toto",
  truc: {
    truc: "Truc"
  }
};

toto.truc.machin = toto; // Référence circulaire !
execRecursively(obj => console.log(obj), toto);

Ici, on a un objet WeakSet qui est créé lors de la première exécution et qui est passé ensuite à chaque appel qui suit (via l'argument interne _refs). Le nombre d'objets ou l'ordre de parcours n'a pas d'importance et un objet WeakSet est donc plus adapté (y compris en termes de performances) qu'un {{jsxref("Set")}}, notamment si un grand nombre d'objets sont concernés.

Spécifications

Spécification État Commentaires
{{SpecName('ES2015', '#sec-weakset-objects', 'WeakSet')}} {{Spec2('ES2015')}} Définition initiale.
{{SpecName('ESDraft', '#sec-weakset-objects', 'WeakSet')}} {{Spec2('ESDraft')}}

Compatibilité des navigateurs

{{Compat("javascript.builtins.WeakSet")}}

Voir aussi