--- title: WeakMap slug: Web/JavaScript/Reference/Global_Objects/WeakMap tags: - ECMAScript6 - Experimental - JavaScript - NeedsTranslation - TopicStub - WeakMap translation_of: Web/JavaScript/Reference/Global_Objects/WeakMap ---
{{JSRef}}

L'objecte WeakMap és una col·lecció de parelles clau/valor on les claus són dèbilment referenciades. Les claus han de ser objectes i els valors poden ser valors aribitraris.

Sintaxi

new WeakMap([iterable])

Paràmetres

iterable
Iterable és un Array o un altre objecte iterable el qual els seus elements són parelles clau/valor (Array de 2 elements). Cada parella clau/valor serà afegida al nou WeakMap. null és tractat com a undefined.

Descripció

Les claus de WeakMaps són només de tipus Object. {{Glossary("Primitive", "Primitive data types")}} com a claus no són permesos (e.g. a {{jsxref("Symbol")}} no pot ser una clau WeakMap).

La clau d'un WeakMap es sostè dèbilment.  El que significa que, si no hi ha altres referències fortes a la clau, llavors la entrada sencera serà eliminada del WeakMap pel recol·lector de brossa (garbage collector).

Per què WeakMap?

El programador expert en JavaScript s'adonarà que aquesta API es podria implementar en JavaScript amb dos arrays (una per a claus, i una per valors) compartides pels quatre mètodes de l'API. Tal implementació tindria dos inconvenients principals. El primer és que la cerca té un cost de O(n) (on n és el nombre de claus al mapa). El segon és que té problemes de fuita de memòria (memory leak). Amb els mapes mantinguts manualment, l'array de claus mantindria referències a le objectes clau, evitant que aquests fóssin eliminats de memòria pel recol·lector de brossa. Als WeakMaps natius, les referències als objectes clau són "dèbils", que vol dir que el recol·lector de brossa pot eliminar l'objecte de memòria si aquest només és referenciat per referències dèbils.

Degut a que les referències són dèbils les claus del WeakMap no són enumerables (és a dir, no hi ha cap mètode que us retornarà un llistat de claus). Si aquest mètode existís, aquest dependria de l'estat del recol·lector de brossa, introduïnt un comportament no determinista. Si voleu tenir un llistat amb les claus, l'haureu de mantenir pel vostre compte.

Propietats

WeakMap.length
El valor de la propietat length és 0.
{{jsxref("WeakMap.prototype")}}
Representa el prototip pel constructor WeakMap. Permet l'adició de propietats a tots els objectes WeakMap.

Instàncies WeakMap

Totes les instàncies WeakMap hereten de {{jsxref("WeakMap.prototype")}}.

Propietats

{{page('ca/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Properties')}}

Mètodes

{{page('ca/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Methods')}}

Exemples

Utilitzar 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 pot ser qualsevol cosa, incloent un objecte object o una funció
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // claus i valors poden ser qualsevol objecte. Fins i tot WeakMaps!

wm1.get(o2); // "azerty"
wm2.get(o2); // undefined, ja que no hi ha cap valor per o2 a wm2
wm2.get(o3); // undefined, al tenir assignat aquest valor

wm1.has(o2); // true
wm2.has(o2); // false
wm2.has(o3); // true (encara que el valor en si sigui 'undefined')

wm3.set(o1, 37);
wm3.get(o1); // 37

wm1.has(o1); // true
wm1.delete(o1);
wm1.has(o1); // false

Implementar una classe tipus WeakMap amb un mètode .clear()

Amb fins expositius, l'exemple següent utilitza el nou constructor class d' ECMAScript 6, el qual no està àmpliament implementat.

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
  }
}

Especificacions

Especificació Estat Comentaris
{{SpecName('ES6', '#sec-weakmap-objects', 'WeakMap')}} {{Spec2('ES6')}} Definició inicial.

Compatibilitat amb navegadors

{{CompatibilityTable}}

Característica Chrome Firefox (Gecko) Internet Explorer Opera Safari
Suport bàsic 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")}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}
Característica Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Suport bàsic 35 {{CompatGeckoMobile("6.0")}} {{CompatNo}} {{CompatNo}} 8
new WeakMap(iterable) 38 {{CompatGeckoMobile("36")}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
clear() 35 {{CompatGeckoMobile("20.0")}} {{CompatNo}} {{CompatNo}} 8
Constructor argument: new WeakMap(null) {{CompatUnknown}} {{CompatGeckoMobile("37")}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Monkey-patched set() in constructor {{CompatUnknown}} {{CompatGeckoMobile("37")}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
WeakMap() without new throws {{CompatUnknown}} {{CompatGeckoMobile("42")}} {{CompatUnknown}} {{CompatUnknown}} {{CompatUnknown}}

Vegeu també