--- title: WeakMap slug: Web/JavaScript/Reference/Global_Objects/WeakMap tags: - ECMAScript6 - Experimental - JavaScript - NeedsTranslation - TopicStub - WeakMap translation_of: Web/JavaScript/Reference/Global_Objects/WeakMap ---
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.
new WeakMap([iterable])
iterable
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).
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.
WeakMap.length
length
és 0.WeakMap.
Permet l'adició de propietats a tots els objectes WeakMap.
WeakMap
Totes les instàncies WeakMap
hereten de {{jsxref("WeakMap.prototype")}}.
{{page('ca/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Properties')}}
{{page('ca/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 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
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 } }
Especificació | Estat | Comentaris |
---|---|---|
{{SpecName('ES6', '#sec-weakmap-objects', 'WeakMap')}} | {{Spec2('ES6')}} | Definició inicial. |
{{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}} |