--- title: WeakMap slug: Web/JavaScript/Reference/Global_Objects/WeakMap tags: - ECMAScript 2015 - JavaScript - WeakMap translation_of: Web/JavaScript/Reference/Global_Objects/WeakMap original_slug: Web/JavaScript/Referencia/Objetos_globales/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.
new WeakMap([iterable])
iterable
Las claves de los WeakMaps solamente pueden ser del tipo Object
. Los {{Glossary("Primitive", "Primitive data types")}} como claves no están permitidos (ej. un {{jsxref("Symbol")}} no pueden ser una clave de 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 {{jsxref("Map")}} o mantenerla tu mismo.
WeakMap.length
length
es 0. WeakMap
. Permite añadir propiedades a todos los objetos WeakMap
.Instancias de WeakMap
Todas las instancias de WeakMap
heredan de {{jsxref("WeakMap.prototype")}}.
{{page('en-US/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Properties')}}
{{page('en-US/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Methods')}}
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
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 } }
Especificación | Estado | Comentario |
---|---|---|
{{SpecName('ES2015', '#sec-weakmap-objects', 'WeakMap')}} | {{Spec2('ES2015')}} | Definición inicial. |
{{CompatibilityTable}}
Característica | Chrome | Firefox (SpiderMonkey) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Soporte básico | 36 | {{CompatGeckoDesktop("6.0")}} | 11 | {{ CompatOpera(23) }} | 7.1 |
new WeakMap(iterable) |
38 | {{CompatGeckoDesktop("36")}} | {{CompatNo}} | {{ CompatOpera(25) }} | {{CompatNo}} |
clear() |
36 | {{CompatGeckoDesktop("20.0")}} | 11 | {{ CompatOpera(23) }} | 7.1 |
Constructor argument: new WeakMap(null) |
{{CompatVersionUnknown}} | {{CompatGeckoDesktop("37")}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} |
Monkey-patched set() in Constructor |
{{CompatVersionUnknown}} | {{CompatGeckoDesktop("37")}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} |
WeakMap() without new throws |
{{CompatVersionUnknown}} | {{CompatGeckoDesktop("42")}} | 11 | {{CompatUnknown}} | {{CompatUnknown}} |
Característica | Android | Firefox Mobile (SpiderMonkey) | IE Mobile | Opera Mobile | Safari Mobile | ||
---|---|---|---|---|---|---|---|
Soporte básico | 35 | {{CompatGeckoMobile("6.0")}} | {{CompatNo}} | {{CompatNo}} | iOS 8 | ||
new WeakMap(iterable) |
38 | {{CompatGeckoMobile("36")}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | ||
clear() |
35 | {{CompatGeckoMobile("20.0")}} | {{CompatNo}} | {{CompatNo}} | iOS 8 | ||
Constructor argument: new WeakMap(null) |
{{CompatUnknown}} | {{CompatVersionUnknown}} | {{CompatGeckoMobile("37")}} | {{CompatUnknown}} | {{CompatUnknown}} | ||
Monkey-patched set() in Constructor |
{{CompatUnknown}} | {{CompatVersionUnknown}} | {{CompatGeckoMobile("37")}} | {{CompatUnknown}} | {{CompatUnknown}} | ||
WeakMap() without new throws |
{{CompatUnknown}} | {{CompatGeckoMobile("42")}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} |