WeakMap

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 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).

¬Ņ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 valores) compartidos por los cuatro m√©todos de la API. Dicha implementaci√≥n habr√≠a tenido dos inconvenientes principales: 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 (ej: 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, se debe usar un  Map o mantenerla tu mismo.

Propiedades

WeakMap.length
El valor de la propiedad length es 0.
WeakMap.prototype
Representa el prototipo para el nuevo constructor WeakMap. Permite a√Īadir propiedades a todos los objetos WeakMap.

Instancias de WeakMap

Todas las instancias de WeakMap heredan de WeakMap.prototype.

Propiedades

Métodos

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 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 2015, 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 2015 (6th Edition, ECMA-262)
La definición de 'WeakMap' en esta especificación.
Standard Definición inicial.

Compatibilidad de navegadores

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!
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) Sin soporte 25 Sin soporte
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) ? ? ?
WeakMap() without new throws (Yes) 42 (42) 11 ? ?
Característica Android Firefox Mobile (SpiderMonkey) IE Mobile Opera Mobile Safari Mobile
Soporte b√°sico 35 6.0 (6.0) Sin soporte Sin soporte iOS 8
new WeakMap(iterable) 38 36.0 (36) Sin soporte Sin soporte Sin soporte
clear() 35 20.0 (20.0) Sin soporte Sin soporte iOS 8
Constructor argument: new WeakMap(null) ? (Yes) 37.0 (37) ? ?
Monkey-patched set() in Constructor ? (Yes) 37.0 (37) ? ?
WeakMap() without new throws ? 42.0 (42) ? ? ?

Ver también