[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/WeakSet [Back]  [Original]

WeakSet - JavaScript | MDN

Cette page a t traduite partir de l'anglais par la communaut. Vous pouvez contribuer en rejoignant la communaut francophone sur MDN Web Docs.

View in English Always switch to English

WeakSet

Baseline Large disponibilit *

Cette fonctionnalit est bien tablie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis septembre 2015.

* Certaines parties de cette fonctionnalit peuvent bnficier de prise en charge variables.

Un objet WeakSet est une collection de valeurs pouvant tre collectes par le ramasse-miette (garbage collector en anglais), incluant des objets et des symboles non enregistrs. Une valeur dans le WeakSet ne peut apparatre qu'une seule fois. Elle est unique dans la collection du WeakSet.

Dans cet article

Description

Les valeurs d'un WeakSet doivent pouvoir tre collectes par le ramasse-miette. La plupart des types de donnes primitives peuvent tre cres arbitrairement et n'ont pas de dure de vie, elles ne peuvent donc pas tre stockes. Les objets et les symboles non enregistrs peuvent tre stocks car ils sont collectables par le ramasse-miette.

Les principales diffrences avec l'objet Set sont :

  • Les WeakSet sont des collections uniquement d'objets et de symboles. Ils ne peuvent pas contenir des valeurs de n'importe quel type, contrairement aux Set.

  • Le WeakSet est faible, ce qui signifie que les rfrences aux objets dans un WeakSet sont maintenues faiblement. Si aucune autre rfrence une valeur stocke dans le WeakSet n'existe, ces valeurs peuvent tre collectes par le ramasse-miette.

    Note : Cela signifie galement qu'il n'existe pas de liste des valeurs actuellement stockes dans la collection. Les WeakSet ne sont pas numrables.

galit des cls

Comme pour un Set, l'galit des valeurs est base sur l'algorithme SameValueZero, qui est quivalent l'oprateur === car un WeakSet ne peut contenir que des objets et des symboles. Cela signifie que pour les objets, l'galit est base sur l'identit de l'objet. Ils sont compars par rfrence, et non par valeur.

Constructeur

WeakSet()

Cre un nouvel objet WeakSet.

Proprits d'instance

Ces proprits sont dfinies sur le WeakSet.prototype et partages par toutes les instances de WeakSet.

WeakSet.prototype.constructor

La fonction constructeur qui a cr l'objet instance. Pour les instances de WeakSet, la valeur initiale est le constructeur WeakSet.

WeakSet.prototype[Symbol.toStringTag]

La valeur initiale de la proprit [Symbol.toStringTag] est la chane de caractres "WeakSet". Cette proprit est utilise dans Object.prototype.toString().

Mthodes des instances

WeakSet.prototype.add()

Ajoute valeur l'ensemble WeakSet.

WeakSet.prototype.delete()

Retire valeur de l'ensemble WeakSet. Suite cette opration, WeakSet.prototype.has(valeur) renverra false.

WeakSet.prototype.has()

Retourne un boolen indiquant si valeur est (ou non) au sein de l'ensemble WeakSet.

Exemples

Utiliser un objet WeakSet

js
const ws = new WeakSet();
const toto = {};
const 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
ws.has(truc); // toujours true

On notera que toto !== truc. Bien que ce soient des objets similaires, ce ne sont pas les mmes objets. Aussi, les deux sont ajouts l'ensemble.

Dtecter les rfrences circulaires

Les fonctions rcursives doivent faire attention aux structures de donnes circulaires qu'elles consommeraient. Les objets WeakSets peuvent tre utiliss pour a :

js
// Appeler un callback sur ce qui est stock dans un objet
function execRecursively(fn, subject, _refs = new WeakSet()) {
  // On vite une rcursion infinie
  if (_refs.has(subject)) {
    return;
  }

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

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

toto.truc.machin = toto; // Rfrence circulaire !
execRecursively((obj) => console.log(obj), toto);

Ici, on a un objet WeakSet qui est cr lors de la premire excution 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 Set, notamment si un grand nombre d'objets sont concerns.

Spcifications

Spcification
ECMAScript 2027 LanguageSpecification
# sec-weakset-objects

Compatibilit des navigateurs

Voir aussi


Web Proxy Viewer  |  New URL  |  Original Page