WeakMap 對象是一組鍵/值對的集合,其中的鍵是弱引用的。其鍵必須是對象,而值可以是任意的。
語法
1
|
new WeakMap([iterable]) |
參數
iterable
Iterable 是一個數組(二元數組)或者其他可迭代的且其元素是鍵值對的對象。每個鍵值對會被加到新的 WeakMap 里。null 會被當做 undefined。
描述
WeakMap 的 key 只能是 Object 類型。 原始數據類型 是不能作為 key 的(比如 Symbol)。
Why WeakMap?
在 JavaScript 里,map API 可以通過使其四個 API 方法共用兩個數組(一個存放鍵,一個存放值)來實現。給這種 map 設置值時會同時將鍵和值添加到這兩個數組的末尾。從而使得鍵和值的索引在兩個數組中相對應。當從該 map 取值的時候,需要遍歷所有的鍵,然后使用索引從存儲值的數組中檢索出相應的值。
但這樣的實現會有兩個很大的缺點,首先賦值和搜索操作都是 O(n) 的時間復雜度( n 是鍵值對的個數),因為這兩個操作都需要遍歷全部整個數組來進行匹配。另外一個缺點是可能會導致內存泄漏,因為數組會一直引用著每個鍵和值。這種引用使得垃圾回收算法不能回收處理他們,即使沒有其他任何引用存在了。
相比之下,原生的 WeakMap 持有的是每個鍵對象的“弱引用”,這意味著在沒有其他引用存在時垃圾回收能正確進行。原生 WeakMap 的結構是特殊且有效的,其用于映射的 key 只有在其沒有被回收時才是有效的。
正由于這樣的弱引用,WeakMap 的 key 是不可枚舉的 (沒有方法能給出所有的 key)。如果key 是可枚舉的話,其列表將會受垃圾回收機制的影響,從而得到不確定的結果。因此,如果你想要這種類型對象的 key 值的列表,你應該使用 Map。
基本上,如果你要往對象上添加數據,又不想干擾垃圾回收機制,就可以使用 WeakMap。
屬性
- WeakMap.length
length 屬性的值為 0。
- WeakMap.prototype
WeakMap 構造器的原型。 允許添加屬性到所有的 WeakMap 對象。
WeakMap 實例
所有 WeakMap 實例繼承自 WeakMap.prototype.
屬性
WeakMap.prototype.constructor
返回創建WeakMap實例的原型函數。 WeakMap函數是默認的。
方法
- WeakMap.prototype.delete(key)
移除key的關聯對象。執行后 WeakMap.prototype.has(key)返回false。
- WeakMap.prototype.get(key)
返回key關聯對象, 或者 undefined(沒有key關聯對象時)。
- WeakMap.prototype.has(key)
根據是否有key關聯對象返回一個Boolean值。
- WeakMap.prototype.set(key, value)
在WeakMap中設置一組key關聯對象,返回這個 WeakMap對象。
示例
使用 WeakMap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
const wm1 = new WeakMap(), wm2 = new WeakMap(), wm3 = new WeakMap(); const o1 = {}, o2 = function (){}, o3 = window; wm1.set(o1, 37); wm1.set(o2, "azerty" ); wm2.set(o1, o2); // value可以是任意值,包括一個對象或一個函數 wm2.set(o3, undefined); wm2.set(wm1, wm2); // 鍵和值可以是任意對象,甚至另外一個WeakMap對象 wm1.get(o2); // "azerty" wm2.get(o2); // undefined,wm2中沒有o2這個鍵 wm2.get(o3); // undefined,值就是undefined wm1.has(o2); // true wm2.has(o2); // false wm2.has(o3); // true (即使值是undefined) wm3.set(o1, 37); wm3.get(o1); // 37 wm1.has(o1); // true wm1. delete (o1); wm1.has(o1); // false |
實現一 個帶有 .clear() 方法的類 WeakMap 類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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 } } |
規范
Specification | Status | Comment |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) WeakMap |
Standard | Initial definition. |
ECMAScript (ECMA-262) WeakMap |
Living Standard |
以上就是JavaScript WeakMap使用詳解的詳細內容,更多關于JavaScript WeakMap的資料請關注服務器之家其它相關文章!
原文鏈接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WeakMap