Esta página ha sido traducida del inglés por la comunidad.Aprende más y únete a la comunidad de MDN Web Docs.
WeakSet
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since septiembre de 2015.
* Some parts of this feature may have varying levels of support.
El objetoWeakSet te permite almacenarobjetos débiles en una colección.
In this article
Descripción
Los objetosWeakSet son colecciones de objetos. Al igual queSet,cada objectoWeakSet puede estar solo una vez; todos los objetos en una colecciónWeakSet son unicos.
Las principales diferencias con el objetoSet son:
WeakSetson colecciones deobjetos solamente. No pueden contener valores arbitrarios de cualquier tipo, como pueden hacerlo losSet.El
WeakSetesdébil, lo que significa que las referencias a objectos en unWeakSetse mantienendébilmente. Si no existen otras referencias a un objecto almacenado enWeakSet, esos objectos pueden ser recolectados como basura.Nota:Esto también significa que no hay una lista de objectos actuales almacenados en la colección. Los
WeakSetsno son enumerables.
Caso de uso: Detección de referencias circulares
Las funciones que se llaman recursivamente necesitan una forma deprotección contra las estructuras de datos circulares mediante el seguimientode los objetos que ya se han procesado.
LosWeakSet son ideales para este propósito:
// Ejecuta una devolución de llamada en todo lo almacenado dentro de un objetofunction execRecursively(fn, subject, _refs = null) { if (!_refs) _refs = new WeakSet(); // Evita la recursividad infinita 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 foo = { foo: "Foo", bar: { bar: "Bar", },};foo.bar.baz = foo; // ¡Referencia circular!execRecursively((obj) => console.log(obj), foo);Aquí, se crea unWeakSet en la primera ejecución, y es pasado con cada llamadade función subsiguiente (usando el parámetro interno_refs).
El número de objetos o su orden de recorrido es irrelevante, por lo que unWeakSetes más adecuado (y eficaz) que unSet para rastrear referencias deobjetos, especialmente si hay una gran cantidad de objetos involucrados.
Constructor
WeakSet()Crea un nuevo objeto
WeakSet.
Métodos de instancia
WeakSet.prototype.add(value)Añade
valoral objetoWeakSet.WeakSet.prototype.delete(value)Elimina
valuedelWeakSet.WeakSet.prototype.has(value)devolveráfalsedespués.WeakSet.prototype.has(value)Devuelve un valor booleano que afirma si
valueestá presente en el objetoWeakSeto no.
Ejemplos
>Usando el objeto WeakSet
const ws = new WeakSet();const foo = {};const bar = {};ws.add(foo);ws.add(bar);ws.has(foo); // truews.has(bar); // truews.delete(foo); // elimina foo del conjuntows.has(foo); // false, foo ha sido eliminadows.has(bar); // true, bar se mantieneTenga en cuenta quefoo !== bar. Si bien son objetos similares,no sonel mismo objeto. Y así ambos se añaden al conjunto.
Especificaciones
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-weakset-objects> |