aboutsummaryrefslogtreecommitdiff
path: root/files/fr/web/javascript/reference/global_objects/weakset/index.md
blob: 3d4e82650cbb9193fbc521db10eed3cb94f8fc1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
---
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](/fr/docs/Web/JavaScript/Reference/Les_protocoles_iteration#Le_protocole_.C2.AB_it.C3.A9rable_.C2.BB) est présent comme argument, ses éléments seront ajoutés au nouvel objet `WeakSet`. {{jsxref("null")}} est traité comme {{jsxref("undefined")}}.

## Exemples

```js
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 :

- Contrairement aux `Sets`, les `WeakSets` sont des **ensembles uniquement constitués d'objets** et ne peuvent pas contenir des valeurs de n'importe quel type.
- L'objet `WeakSet` est _faible :_ Les références vers les objets de l'ensemble sont des références faibles. Si aucune autre référence vers l'objet n'est présente en dehors du `WeakSet`, l'objet pourra alors être nettoyé par le ramasse-miette. Cela signifie également qu'on ne peut pas lister les objets contenus à un instant donné dans l'ensemble. Les objets `WeakSets` ne sont pas énumérables.

## 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 :

```js
// 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

- {{jsxref("Map")}}
- {{jsxref("Set")}}
- {{jsxref("WeakMap")}}