This is an experimental technology, part of the ECMAScript 6 (Harmony) proposal.
Because this technology's specification has not stabilized, check the compatibility table for usage in various browsers. Also note that the syntax and behavior of an experimental technology is subject to change in future version of browsers as the spec changes.
El objeto WeakMap es una colección de pares clave/valor en la que las claves son objetos y los valores son valores arbitrarios.
Sintaxis
new WeakMap([iterable])
Parámetros
iterable- Iterable es un Array u otro objeto iterable cuyos elementos son pares clave-valor (Arrays de dos elementos). Cada par clave-valor será añadido al nuevo WeakMap. null es tratado como undefined.
Descripción
Las claves de los WeakMaps pueden ser del tipo Object solamente. Los Primitive data types como claves no están permitidos (e.g. a Symbol no pueden ser una clave de WeakMap).
¿Por qué WeakMap?
El programador de JavaScript experimentado se habrá dado cuenta que esta API podría ser implementada en JavaScript con dos arrays (uno para las claves, otro para los arrays) compartidos por los cuatro métodos de la API. Dicha implementación habría tenido dos inconvenientes principalmente. El primero es una búsqueda O(n) (siendo n el número de claves en el mapa). El segundo es un problema de pérdida de memoria. Con mapas escritos manualmente, el array de las claves mantendría referencias a la objetos clave, impidiéndoles ser recolectados. En los WeakMap nativos, las referencias a los objetos clave son mantenidas "débilmente", lo que quiere decir que no impiden la recolección de basura en caso de que no haya otras referencias al objeto.
Dado que las referencias son débiles, las claves de WeakMap no son enumerables (i.e. no existe un método que te devuelva la lista de las claves). Si existiera, la lista dependería de la recolección de basura, introduciendo indeterminismo. Si quieres una lista de las claves, debes mantenerla tu mismo.
Propiedades
WeakMap.length- El valor de la propiedad
lengthes 0. WeakMap.prototype- Representa el prototipo para el nuevo constructor
WeakMap. Permite añadir propiedades a todos los objetosWeakMap.
Instancias de WeakMap
Todas las instancias de WeakMap heredan de WeakMap.prototype.
Propiedades
WeakMap.prototype.constructor- Returns the function that created an instance's prototype. This is the
WeakMapfunction by default.
Métodos
WeakMap.prototype.delete(key)- Removes any value associated to the
key.WeakMap.prototype.has(key)will returnfalseafterwards. WeakMap.prototype.get(key)- Returns the value associated to the
key, orundefinedif there is none. WeakMap.prototype.has(key)- Returns a Boolean asserting whether a value has been associated to the
keyin theWeakMapobject or not. WeakMap.prototype.set(key, value)- Sets the value for the
keyin theWeakMapobject. Returns theWeakMapobject. WeakMap.prototype.clear()Removes all key/value pairs from theWeakMapobject. Note that it is possible to implement aWeakMap-like object that has a.clear()method by encapsulating aWeakMapobject that hasn't it (see example on pageWeakMap)
Ejemplos
Usando WeakMap
var wm1 = new WeakMap(),
wm2 = new WeakMap(),
wm3 = new WeakMap();
var o1 = {},
o2 = function(){},
o3 = window;
wm1.set(o1, 37);
wm1.set(o2, "azerty");
wm2.set(o1, o2); // un valor puede ser cualquier cosa, incluidos objetos o funciones
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // claves y valores pueden ser objetos cualesquiera. !Incluso WeakMaps!
wm1.get(o2); // "azerty"
wm2.get(o2); // undefined, porque no hay valor para o2 en wm2
wm2.get(o3); // undefined, porque es es el valor del conjunto
wm1.has(o2); // true
wm2.has(o2); // false
wm2.has(o3); // true (incluso si el valor mismo 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 un método .clear()
Con propósito expositivo, el siguiente ejemplo usa el nuevo costruct class de ECMAScript 6, que actualmente no ha sido implementado de forma amplia.
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
| Especificación | Estado | Comentario |
|---|---|---|
| ECMAScript 6 (ECMA-262) The definition of 'WeakMap' in that specification. |
Release Candidate | Definición inicial. |
Compatibilidad de navegadores
| Característica | Chrome | Firefox (SpiderMonkey) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| Soporte básico | 36 | 6.0 (6.0) | 11 | 23 | 7.1 |
new WeakMap(iterable) |
38 | 36 (36) | Not supported | 25 | Not supported |
clear() |
36 | 20.0 (20.0) | 11 | 23 | 7.1 |
Constructor argument: new WeakMap(null) |
(Yes) | 37 (37) | ? | ? | ? |
Monkey-patched set() in Constructor |
(Yes) | 37 (37) | ? | ? | ? |
| Característica | Android | Firefox Mobile (SpiderMonkey) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|
| Soporte básico | 35 | 6.0 (6.0) | Not supported | Not supported | iOS 8 |
new WeakMap(iterable) |
38 | 36.0 (36) | Not supported | Not supported | Not supported |
clear() |
35 | 20.0 (20.0) | Not supported | Not supported | iOS 8 |
Constructor argument: new WeakMap(null) |
? | (Yes) | 37.0 (37) | ? | ? |
Monkey-patched set() in Constructor |
? | (Yes) | 37.0 (37) | ? | ? |