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.
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.
Primitive data types com a claus no són permesos (e.g. a 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. WeakMap.prototype
- Representa el prototip pel constructor
WeakMap.
Permet l'adició de propietats a tots els objectesWeakMap.
Instàncies WeakMap
Totes les instàncies WeakMap
hereten de 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 |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'WeakMap' in that specification. |
Standard | Definició inicial. |
Compatibilitat amb navegadors
Característica | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Suport bàsic | 36 | 6.0 (6.0) | 11 | 23 | 7.1 |
new WeakMap(iterable) |
38 | 36 (36) | No support | 25 | No support |
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) | ? | ? | ? |
Característica | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Suport bàsic | 35 | 6.0 (6.0) | No support | No support | 8 |
new WeakMap(iterable) |
38 | 36.0 (36) | No support | No support | No support |
clear() |
35 | 20.0 (20.0) | No support | No support | 8 |
Constructor argument: new WeakMap(null) |
? | 37.0 (37) | No support | ? | ? |
Monkey-patched set() in constructor |
? | 37.0 (37) | No support | ? | ? |
WeakMap() without new throws |
? | 42.0 (42) | ? | ? | ? |