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 objeto WeakSet te permite almacenar objetos débiles en una colección.
Descripción
Los objetos WeakSet son colecciones de objetos. Al igual que Set,
cada objecto WeakSet puede estar solo una vez; todos los objetos en una colección WeakSet son unicos.
Las principales diferencias con el objeto Set son:
-
WeakSetson colecciones de objetos solamente. No pueden contener valores arbitrarios de cualquier tipo, como pueden hacerlo losSet. -
El
WeakSetes débil, lo que significa que las referencias a objectos en unWeakSetse mantienen dé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 de protección contra las estructuras de datos circulares mediante el seguimiento de los objetos que ya se han procesado.
Los WeakSet son ideales para este propósito:
// Ejecuta una devolución de llamada en todo lo almacenado dentro de un objeto
function 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 un WeakSet en la primera ejecución, y es pasado con cada llamada
de función subsiguiente (usando el parámetro interno _refs).
El número de objetos o su orden de recorrido es irrelevante, por lo que un WeakSet
es más adecuado (y eficaz) que un Set para rastrear referencias de
objetos, 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); // true
ws.has(bar); // true
ws.delete(foo); // elimina foo del conjunto
ws.has(foo); // false, foo ha sido eliminado
ws.has(bar); // true, bar se mantiene
Tenga en cuenta que foo !== bar. Si bien son objetos similares,
no son el mismo objeto. Y así ambos se añaden al conjunto.
Especificaciones
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-weakset-objects> |
Compatibilidad con navegadores
Loading…