L'oggetto WeakMap è una collezione di coppie chiave/valore in cui le chiavi hanno una referenza debole. Le chiavi devono essere oggetti e il tipo dei valori è arbitrario.
Puoi leggere altri dettagli sulle WeakMap nella sezione WeakMap object in Keyed collections.
Sintassi
new WeakMap([iterable])
Parametri
iterable- Iterable è un array o altro oggetto iterabile i cui elementi sono coppie chiave/valore (array di due elementi). Ogni coppia è aggiunta ad una nuova WeakMap. Null è trattato come undefined.
Descrizione
Keys of WeakMaps are of the type Object only. Primitive data types as keys are not allowed (e.g. a Symbol can't be a WeakMap key).
Perché WeakMap?
Una API per una mappa può essere implementata in Javascript con due array (uno per le chiavi, uno per i valori) condivisi dai quattro metodi dell'API. Settare gli elementi di questa mappa vorrebbe dire effettuare un push di una coppia chiave/valore in coda a ciascuno dei due array simultaneamente, in modo che gli indici delle chiavi e dei valori corrispondano nei due array. Trovare un valore dalla mappa vorrebbe dire iterare su tutte le chiavi per trovare quella desiderata e poi usare l'indice di questo match per recuperare il valore corrispondente dall'array dei valori.
Una tale implementazione avrebbe due principali aspetti negatiivi. Il primo è che il tempo di settaggio o ricerca sarebbe O(n) dato che entrambe le operazioni dovrebbero iterare sulle liste delle chiavi per trovare il valore corretto. Il secondo è un memory leak perché con gli array i riferimenti ad ogni chiave e valore sono mantenuti indefinitivamente e non possono essere soggetti a garbage collection.
Al contrario, WeakMaps mantengono referenze "deboli" ad oggetti che fungono da chiavi e che possono essere garbage collected quando questi oggetti non hanno altri riferimenti. Questo permette anche la garbage collection dei valori della WeakMap. Le WeakMap possono essere particolarmente utili quando si mappano chiavi ad informazioni sulle chiavi che sono importanti solo se la chiave non è stata garbage collected.
Dato che i riferimenti sono deboli, le chiavi WeakMap non sono enumerabili (non esiste un metodo che fornisce una lista delle chiavi). Se le chiavi fossero enumerabili, la lista dipenderebbe dallo stato della garbage collection e sarebbe quindi non-deterministica. Se si vuole ottenere una lista delle chiavi, è consigliato usare una Map.
Proprietà
WeakMap.length- Il valore della proprietà
lengthè 0. WeakMap.prototype- Rappresenta il prototipo per il costruttore
WeakMap. Consente l'aggiunta di proprietà a tutti gli oggettiWeakMap.
Istanze WeakMap
Tutte le istanze WeakMap ereditano da WeakMap.prototype.
Properties
WeakMap.prototype.constructor- Returns the function that created an instance's prototype. This is the
WeakMapfunction by default.
Methods
WeakMap.prototype.delete(key)- Removes any value associated to the
key.WeakMap.prototype.has(key)will returnfalseafterwards. WeakMap.prototype.get(key)- Returns the value associated to the
key, orundefinedif there is none. WeakMap.prototype.has(key)- Returns a Boolean asserting whether a value has been associated to the
keyin theWeakMapobject or not. WeakMap.prototype.set(key, value)- Sets the value for the
keyin theWeakMapobject. Returns theWeakMapobject. WeakMap.prototype.clear()Removes all key/value pairs from theWeakMapobject. Note that it is possible to implement aWeakMap-like object that has a.clear()method by encapsulating aWeakMapobject that hasn't it (see example on pageWeakMap)
Esempi
Usare 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 valore può essere anche un oggetto o funzione
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // chiavi e valori possono essere un oggetto qualunque, incluso una WeakMap!
wm1.get(o2); // "azerty"
wm2.get(o2); // undefined, perché non c'è chiave per o2 in wm2
wm2.get(o3); // undefined, perché questo è il valore settato
wm1.has(o2); // true
wm2.has(o2); // false
wm2.has(o3); // true (anche se il valore è 'undefined')
wm3.set(o1, 37);
wm3.get(o1); // 37
wm1.has(o1); // true
wm1.delete(o1);
wm1.has(o1); // false
Implementare una classe WeakMap-like con un metodo .clear()
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
}
}
Specifiche
| Specifica | Stato | Commento |
|---|---|---|
| ECMAScript Latest Draft (ECMA-262) The definition of 'WeakMap' in that specification. |
Draft | |
| ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'WeakMap' in that specification. |
Standard | Definizione iniziale |
Compatibilità browser
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
WeakMap | Chrome Full support 36 | Edge Full support 12 | Firefox Full support 6 | IE Full support 11 | Opera Full support 23 | Safari Full support 8 | WebView Android Full support 37 | Chrome Android Full support 36 | Firefox Android Full support 6 | Opera Android Full support 24 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs
Full support
0.12
|
clear | Chrome No support 36 — 43 | Edge No support No | Firefox No support 20 — 46 | IE Full support 11 | Opera No support 25 — 30 | Safari No support 8 — 9 | WebView Android No support 37 — 43 | Chrome Android No support 36 — 43 | Firefox Android No support 20 — 46 | Opera Android No support 25 — 30 | Safari iOS No support 8 — 9 | Samsung Internet Android No support 3.0 — 4.0 | nodejs Full support Yes |
delete | Chrome Full support 36 | Edge Full support 12 | Firefox
Full support
6
| IE Full support 11 | Opera Full support 23 | Safari Full support 8 | WebView Android Full support 37 | Chrome Android Full support 36 | Firefox Android
Full support
6
| Opera Android Full support 24 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs
Full support
0.12
|
get | Chrome Full support 36 | Edge Full support 12 | Firefox
Full support
6
| IE Full support 11 | Opera Full support 23 | Safari Full support 8 | WebView Android Full support 37 | Chrome Android Full support 36 | Firefox Android
Full support
6
| Opera Android Full support 24 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs
Full support
0.12
|
has | Chrome Full support 36 | Edge Full support 12 | Firefox
Full support
6
| IE Full support 11 | Opera Full support 23 | Safari Full support 8 | WebView Android Full support 37 | Chrome Android Full support 36 | Firefox Android
Full support
6
| Opera Android Full support 24 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs
Full support
0.12
|
prototype | Chrome Full support 36 | Edge Full support 12 | Firefox Full support 6 | IE Full support 11 | Opera Full support 23 | Safari Full support 8 | WebView Android Full support 37 | Chrome Android Full support 36 | Firefox Android Full support 6 | Opera Android Full support 24 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs
Full support
0.12
|
set | Chrome Full support 36 | Edge Full support 12 | Firefox
Full support
6
| IE
Partial support
11
| Opera Full support 23 | Safari Full support 8 | WebView Android Full support 37 | Chrome Android Full support 36 | Firefox Android
Full support
6
| Opera Android Full support 24 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs
Full support
0.12
|
new WeakMap(iterable) | Chrome Full support 38 | Edge Full support 12 | Firefox Full support 36 | IE No support No | Opera Full support 25 | Safari Full support 9 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android Full support 36 | Opera Android Full support 25 | Safari iOS Full support 9 | Samsung Internet Android Full support 3.0 | nodejs Full support 0.12 |
new WeakMap(null) | Chrome Full support 36 | Edge Full support 12 | Firefox Full support 37 | IE Full support 11 | Opera Full support 23 | Safari Full support 8 | WebView Android Full support 37 | Chrome Android Full support 36 | Firefox Android Full support 37 | Opera Android Full support 24 | Safari iOS Full support 8 | Samsung Internet Android Full support 3.0 | nodejs
Full support
0.12
|
WeakMap() without new throws | Chrome Full support 36 | Edge Full support 12 | Firefox Full support 42 | IE Full support 11 | Opera Full support 23 | Safari Full support 9 | WebView Android Full support 37 | Chrome Android Full support 36 | Firefox Android Full support 42 | Opera Android Full support 24 | Safari iOS Full support 9 | Samsung Internet Android Full support 3.0 | nodejs Full support 0.12 |
Legend
- Full support
- Full support
- Partial support
- Partial support
- No support
- No support
- Non-standard. Expect poor cross-browser support.
- Non-standard. Expect poor cross-browser support.
- Deprecated. Not for use in new websites.
- Deprecated. Not for use in new websites.
- See implementation notes.
- See implementation notes.
- User must explicitly enable this feature.
- User must explicitly enable this feature.