Baseline Widely available *
El objeto WeakMap
es una colección de pares llave/valor en la que las llaves deben ser objetos con valores de cualquier tipo de dato en JavaScript, y el cual no crea fuertes referencias a sus llaves. Es decir, la presencia de un objeto como llave en un WeakMap
no evita que el objeto sea recolectado como basura. Una vez que se ha recopilado un objeto utilizado como llave, sus valores correspondientes en cualquier WeakMap
se convierten en candidatos para la recolección de basura â siempre y cuando no se les mencione fuertemente en otros lugares.
WeakMap
permite asociar datos a objectos de una manera que no impide que se recopilen los objectos llaves, incluso si los valores hacen referencia a las llaves. Sin embargo, un WeakMap
no permite observar la vitalidad de sus llaves, por lo que no permite la enumeración; Si un WeakMap
expusiera algún método para obtener una lista de sus llaves, la lista dependerÃa del estado de la recolección de basura, introduciendo indeterminismo. Si quieres una lista de llaves, se debe usar un Map
en lugar de un WeakMap
.
Puedes aprender más acerca de WeakMap
en la sección de objeto WeakMap de la guÃa colecciónes con llaves
Las llaves de los WeakMaps solamente pueden ser del tipo Object
. Los Primitive data types como claves no están permitidos (ej. un Symbol
no pueden ser una clave de WeakMap
).
Una API de mapeo podrÃa ser implementada en JavaScript con dos arreglos (uno para las llaves, otro para los valores) compartidos por los cuatro métodos de la API. Establecer elementos en este mapa implicarÃa colocar una llave y valor al final de cada uno de los arreglos simultáneamente. Como resultado, los Ãndices de la llave y el valor corresponderÃan a ambas matrices. Obtener valores del mapa implicarÃa iterar a través de todas las llaves hasta encontrar una coincidencia, luego usar el Ãndice de esta coincidencia para recuperar el valor correspondiente del arreglo de valores.
Tal implementación tendrÃa dos inconvenientes principales:
Por el contrario, en un WeakMap
, un objeto llave se refiere fuertemente a su contenido siempre que la llave no se recolecte como basura, pero débilmente a partir de ese momento. Como tal, un WeakMap
:
WeakMap
.WeakMap
puede ser una construcción particularmente útil cuando se asignan llaves a información sobre la llave que es valiosa solo si la llave no ha sido recolectada como basura.
Pero debido a que un WeakMap
no permite observar la vida de sus llaves, sus llaves no son enumerables. No existe ningún método para obtener una lista de las llaves. Si lo hubiera, la lista dependerÃa del estado de recolección de basura, introduciendo indeterminismo. Si desea tener una lista de llaves, debe usar Map
.
WeakMap()
Crea un nuevo objeto WeakMap
.
WeakMap.prototype.delete(key)
Elimina cualquier valor asociado a la key
. WeakMap.prototype.has(key)
regresará false
después.
WeakMap.prototype.get(key)
Regresa el valor asociado a la key
, o undefined
si no hay ninguno.
WeakMap.prototype.has(key)
Devuelve un valor booleano que afirma si se ha asociado un valor a la key
en el objeto WeakMap
o no.
WeakMap.prototype.set(key, value)
Establece el value
para la key
en el objeto WeakMap
. Devuelve el objeto WeakMap
.
const wm1 = new WeakMap(),
wm2 = new WeakMap(),
wm3 = new WeakMap();
const o1 = {},
o2 = function () {},
o3 = window;
wm1.set(o1, 37);
wm1.set(o2, "azerty");
wm2.set(o1, o2); // El valor puede ser cualquier cosa, incluyendo un objeto o una función
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // Las llaves y los valores pueden ser cualquier objeto. ¡Incluso WeakMaps!
wm1.get(o2); // "azerty"
wm2.get(o2); // undefined, porque no hay llave para `o2` en `wm2`
wm2.get(o3); // undefined, porque ese es el valor estabecido
wm1.has(o2); // true
wm2.has(o2); // false
wm2.has(o3); // true (incluso si el valor en sà es 'undefined')
wm3.set(o1, 37);
wm3.get(o1); // 37
wm1.has(o1); // true
wm1.delete(o1);
wm1.has(o1); // false
Implementando una clase tipo-WeakMap con el método .clear()
class ClearableWeakMap {
constructor(init) {
this._wm = new WeakMap(init);
}
clear() {
this._wm = new WeakMap();
}
delete(k) {
return this._wm.delete(k);
}
get(k) {
return this._wm.get(k);
}
has(k) {
return this._wm.has(k);
}
set(k, v) {
this._wm.set(k, v);
return this;
}
}
Especificaciones Compatibilidad con navegadores Véase también
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