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 (en-US)
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 (en-US).

Propiedades

{{page('en-US/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Properties')}}

Métodos

{{page('en-US/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Methods')}}

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! (en-US)

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