Baseline Widely available *
El objeto WeakSet
te permite almacenar objetos débiles en una colecció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:
WeakSet
son colecciones de objetos solamente. No pueden contener valores arbitrarios de cualquier tipo, como pueden hacerlo los Set
.
El WeakSet
es débil, lo que significa que las referencias a objectos en un WeakSet
se mantienen débilmente. Si no existen otras referencias a un objecto almacenado en WeakSet
, 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 WeakSets
no son enumerables.
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.
WeakSet()
Crea un nuevo objeto WeakSet
.
WeakSet.prototype.add(value)
Añade valor
al objeto WeakSet
.
WeakSet.prototype.delete(value)
Elimina value
del WeakSet
. WeakSet.prototype.has(value)
devolverá false
después.
WeakSet.prototype.has(value)
Devuelve un valor booleano que afirma si value
está presente en el objeto WeakSet
o no.
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.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4