JavaScript WeakMap使用詳解
WeakMap 對象是一組鍵/值對的集合,其中的鍵是弱引用的。其鍵必須是對象,而值可以是任意的。
語法
new WeakMap([iterable])
參數(shù)
iterable
Iterable 是一個(gè)數(shù)組(二元數(shù)組)或者其他可迭代的且其元素是鍵值對的對象。每個(gè)鍵值對會被加到新的 WeakMap 里。null 會被當(dāng)做 undefined。
描述
WeakMap 的 key 只能是 Object 類型。 原始數(shù)據(jù)類型 是不能作為 key 的(比如 Symbol)。
Why WeakMap?
在 JavaScript 里,map API 可以通過使其四個(gè) API 方法共用兩個(gè)數(shù)組(一個(gè)存放鍵,一個(gè)存放值)來實(shí)現(xiàn)。給這種 map 設(shè)置值時(shí)會同時(shí)將鍵和值添加到這兩個(gè)數(shù)組的末尾。從而使得鍵和值的索引在兩個(gè)數(shù)組中相對應(yīng)。當(dāng)從該 map 取值的時(shí)候,需要遍歷所有的鍵,然后使用索引從存儲值的數(shù)組中檢索出相應(yīng)的值。
但這樣的實(shí)現(xiàn)會有兩個(gè)很大的缺點(diǎn),首先賦值和搜索操作都是 O(n) 的時(shí)間復(fù)雜度( n 是鍵值對的個(gè)數(shù)),因?yàn)檫@兩個(gè)操作都需要遍歷全部整個(gè)數(shù)組來進(jìn)行匹配。另外一個(gè)缺點(diǎn)是可能會導(dǎo)致內(nèi)存泄漏,因?yàn)閿?shù)組會一直引用著每個(gè)鍵和值。這種引用使得垃圾回收算法不能回收處理他們,即使沒有其他任何引用存在了。
相比之下,原生的 WeakMap 持有的是每個(gè)鍵對象的“弱引用”,這意味著在沒有其他引用存在時(shí)垃圾回收能正確進(jìn)行。原生 WeakMap 的結(jié)構(gòu)是特殊且有效的,其用于映射的 key 只有在其沒有被回收時(shí)才是有效的。
正由于這樣的弱引用,WeakMap 的 key 是不可枚舉的 (沒有方法能給出所有的 key)。如果key 是可枚舉的話,其列表將會受垃圾回收機(jī)制的影響,從而得到不確定的結(jié)果。因此,如果你想要這種類型對象的 key 值的列表,你應(yīng)該使用 Map。
基本上,如果你要往對象上添加數(shù)據(jù),又不想干擾垃圾回收機(jī)制,就可以使用 WeakMap。
屬性
- WeakMap.length
length 屬性的值為 0。
- WeakMap.prototype
WeakMap 構(gòu)造器的原型。 允許添加屬性到所有的 WeakMap 對象。
WeakMap 實(shí)例
所有 WeakMap 實(shí)例繼承自 WeakMap.prototype.
屬性
WeakMap.prototype.constructor
返回創(chuàng)建WeakMap實(shí)例的原型函數(shù)。 WeakMap函數(shù)是默認(rèn)的。
方法
- WeakMap.prototype.delete(key)
移除key的關(guān)聯(lián)對象。執(zhí)行后 WeakMap.prototype.has(key)返回false。
- WeakMap.prototype.get(key)
返回key關(guān)聯(lián)對象, 或者 undefined(沒有key關(guān)聯(lián)對象時(shí))。
- WeakMap.prototype.has(key)
根據(jù)是否有key關(guān)聯(lián)對象返回一個(gè)Boolean值。
- WeakMap.prototype.set(key, value)
在WeakMap中設(shè)置一組key關(guān)聯(lián)對象,返回這個(gè) WeakMap對象。
示例
使用 WeakMap
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可以是任意值,包括一個(gè)對象或一個(gè)函數(shù) wm2.set(o3, undefined); wm2.set(wm1, wm2); // 鍵和值可以是任意對象,甚至另外一個(gè)WeakMap對象 wm1.get(o2); // "azerty" wm2.get(o2); // undefined,wm2中沒有o2這個(gè)鍵 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
實(shí)現(xiàn)一 個(gè)帶有 .clear() 方法的類 WeakMap 類
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 } }
規(guī)范
Specification | Status | Comment |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) WeakMap |
Standard | Initial definition. |
ECMAScript (ECMA-262) WeakMap |
Living Standard |
以上就是JavaScript WeakMap使用詳解的詳細(xì)內(nèi)容,更多關(guān)于JavaScript WeakMap的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript實(shí)現(xiàn)控制并發(fā)請求數(shù)量的方法詳解
這篇文章主要為大家詳細(xì)介紹了JavaScript如何實(shí)現(xiàn)控制并發(fā)請求數(shù)量,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02javascript表格隔行變色加鼠標(biāo)移入移出及點(diǎn)擊效果的方法
這篇文章主要介紹了javascript表格隔行變色加鼠標(biāo)移入移出及點(diǎn)擊效果的方法,涉及javascript實(shí)現(xiàn)隔行變色及鼠標(biāo)點(diǎn)擊效果的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04JavaScript 模塊化開發(fā)實(shí)例詳解【seajs、requirejs庫使用】
這篇文章主要介紹了JavaScript 模塊化開發(fā),結(jié)合實(shí)例形式詳細(xì)分析了基于seajs、requirejs庫的JavaScript模塊化使用相關(guān)操作技巧,需要的朋友可以參考下2020-05-05JavaScript基本類型值-Undefined、Null、Boolean
本文主要介紹了JavaScript基本類型值-Undefined、Null、Boolean的相關(guān)知識,具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-02-02javascript 操作文件 實(shí)現(xiàn)方法小結(jié)
可以通過瀏覽器在訪問者的硬盤上創(chuàng)建文件 JavaScript操作文件系統(tǒng)創(chuàng)建快捷方式2009-07-07