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.nullest traité commeundefined.
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 Set sont les suivantes :
- Contrairement aux
Sets, lesWeakSetssont des ensembles uniquement constitués d'objets et ne peuvent pas contenir des valeurs de n'importe quel type. - L'objet
WeakSetest 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 duWeakSet, 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 objetsWeakSetsne sont pas énumérables.
Propriétés
WeakSet.length- La valeur de la propriété
lengthest 0. WeakSet.prototype- Cette propriété représente le prototype pour le constructeur
WeakSet. Il permet d'ajouter des propriétés pour tous les objetsWeakSet.
Instances de WeakSet
Toutes les instances de WeakSet héritent de WeakSet.prototype.
Propriétés
Méthodes
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 Set, notamment si un grand nombre d'objets sont concernés.
Spécifications
| Spécification | État | Commentaires |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) La définition de 'WeakSet' dans cette spécification. |
Standard | Définition initiale. |
| ECMAScript (ECMA-262) La définition de 'WeakSet' dans cette spécification. |
Standard évolutif |
Compatibilité des navigateurs
| Ordinateur | Mobile | Serveur | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
WeakSet | Chrome Support complet 36 | Edge Support complet 12 | Firefox Support complet 34 | IE Aucun support Non | Opera Support complet 23 | Safari Support complet 9 | WebView Android Support complet 37 | Chrome Android Support complet 36 | Firefox Android Support complet 34 | Opera Android Support complet 24 | Safari iOS Support complet 9 | Samsung Internet Android Support complet 3.0 | nodejs Support complet 0.12 |
WeakSet() constructor | Chrome Support complet 36 | Edge Support complet 12 | Firefox Support complet 34 | IE Aucun support Non | Opera Support complet 23 | Safari Support complet 9 | WebView Android Support complet 37 | Chrome Android Support complet 36 | Firefox Android Support complet 34 | Opera Android Support complet 24 | Safari iOS Support complet 9 | Samsung Internet Android Support complet 3.0 | nodejs Support complet 0.12 |
add | Chrome Support complet 36 | Edge Support complet 12 | Firefox Support complet 34 | IE Aucun support Non | Opera Support complet 23 | Safari Support complet 9 | WebView Android Support complet 37 | Chrome Android Support complet 36 | Firefox Android Support complet 34 | Opera Android Support complet 24 | Safari iOS Support complet 9 | Samsung Internet Android Support complet 3.0 | nodejs Support complet 0.12 |
clear | Chrome Aucun support 36 — 41 | Edge Aucun support Non | Firefox Aucun support 34 — 46 | IE Aucun support Non | Opera Aucun support 23 — 28 | Safari Aucun support Non | WebView Android Aucun support 37 — 41 | Chrome Android Aucun support 36 — 41 | Firefox Android Aucun support 34 — 46 | Opera Android Aucun support 24 — 28 | Safari iOS Aucun support Non | Samsung Internet Android Aucun support 3.0 — 4.0 | nodejs Aucun support Non |
delete | Chrome Support complet 36 | Edge Support complet 12 | Firefox Support complet 34 | IE Aucun support Non | Opera Support complet 23 | Safari Support complet 9 | WebView Android Support complet 37 | Chrome Android Support complet 36 | Firefox Android Support complet 34 | Opera Android Support complet 24 | Safari iOS Support complet 9 | Samsung Internet Android Support complet 3.0 | nodejs Support complet 0.12 |
has | Chrome Support complet 36 | Edge Support complet 12 | Firefox Support complet 34 | IE Aucun support Non | Opera Support complet 23 | Safari Support complet 9 | WebView Android Support complet 37 | Chrome Android Support complet 36 | Firefox Android Support complet 34 | Opera Android Support complet 24 | Safari iOS Support complet 9 | Samsung Internet Android Support complet 3.0 | nodejs Support complet 0.12 |
Légende
- Support complet
- Support complet
- Aucun support
- Aucun support
- Fonctionnalité non-standard. Celle-ci peut être incorrectement supportée par les autres navigateurs.
- Fonctionnalité non-standard. Celle-ci peut être incorrectement supportée par les autres navigateurs.
- Obsolète. Les nouveaux sites web ne doivent pas utiliser cette fonctionnalité.
- Obsolète. Les nouveaux sites web ne doivent pas utiliser cette fonctionnalité.