JavaScript WeakMap使用詳解
WeakMap 對(duì)象是一組鍵/值對(duì)的集合,其中的鍵是弱引用的。其鍵必須是對(duì)象,而值可以是任意的。
語(yǔ)法new WeakMap([iterable])參數(shù)
iterableIterable 是一個(gè)數(shù)組(二元數(shù)組)或者其他可迭代的且其元素是鍵值對(duì)的對(duì)象。每個(gè)鍵值對(duì)會(huì)被加到新的 WeakMap 里。null 會(huì)被當(dāng)做 undefined。
描述WeakMap 的 key 只能是 Object 類(lèi)型。 原始數(shù)據(jù)類(lèi)型 是不能作為 key 的(比如 Symbol)。
Why WeakMap?在 JavaScript 里,map API 可以通過(guò)使其四個(gè) API 方法共用兩個(gè)數(shù)組(一個(gè)存放鍵,一個(gè)存放值)來(lái)實(shí)現(xiàn)。給這種 map 設(shè)置值時(shí)會(huì)同時(shí)將鍵和值添加到這兩個(gè)數(shù)組的末尾。從而使得鍵和值的索引在兩個(gè)數(shù)組中相對(duì)應(yīng)。當(dāng)從該 map 取值的時(shí)候,需要遍歷所有的鍵,然后使用索引從存儲(chǔ)值的數(shù)組中檢索出相應(yīng)的值。
但這樣的實(shí)現(xiàn)會(huì)有兩個(gè)很大的缺點(diǎn),首先賦值和搜索操作都是 O(n) 的時(shí)間復(fù)雜度( n 是鍵值對(duì)的個(gè)數(shù)),因?yàn)檫@兩個(gè)操作都需要遍歷全部整個(gè)數(shù)組來(lái)進(jìn)行匹配。另外一個(gè)缺點(diǎn)是可能會(huì)導(dǎo)致內(nèi)存泄漏,因?yàn)閿?shù)組會(huì)一直引用著每個(gè)鍵和值。這種引用使得垃圾回收算法不能回收處理他們,即使沒(méi)有其他任何引用存在了。
相比之下,原生的 WeakMap 持有的是每個(gè)鍵對(duì)象的“弱引用”,這意味著在沒(méi)有其他引用存在時(shí)垃圾回收能正確進(jìn)行。原生 WeakMap 的結(jié)構(gòu)是特殊且有效的,其用于映射的 key 只有在其沒(méi)有被回收時(shí)才是有效的。
正由于這樣的弱引用,WeakMap 的 key 是不可枚舉的 (沒(méi)有方法能給出所有的 key)。如果key 是可枚舉的話(huà),其列表將會(huì)受垃圾回收機(jī)制的影響,從而得到不確定的結(jié)果。因此,如果你想要這種類(lèi)型對(duì)象的 key 值的列表,你應(yīng)該使用 Map。
基本上,如果你要往對(duì)象上添加數(shù)據(jù),又不想干擾垃圾回收機(jī)制,就可以使用 WeakMap。
屬性 WeakMap.lengthlength 屬性的值為 0。
WeakMap.prototypeWeakMap 構(gòu)造器的原型。 允許添加屬性到所有的 WeakMap 對(duì)象。
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)對(duì)象。執(zhí)行后 WeakMap.prototype.has(key)返回false。
WeakMap.prototype.get(key)返回key關(guān)聯(lián)對(duì)象, 或者 undefined(沒(méi)有key關(guān)聯(lián)對(duì)象時(shí))。
WeakMap.prototype.has(key)根據(jù)是否有key關(guān)聯(lián)對(duì)象返回一個(gè)Boolean值。
WeakMap.prototype.set(key, value)在WeakMap中設(shè)置一組key關(guān)聯(lián)對(duì)象,返回這個(gè) WeakMap對(duì)象。
示例使用 WeakMapconst 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è)對(duì)象或一個(gè)函數(shù)wm2.set(o3, undefined);wm2.set(wm1, wm2); // 鍵和值可以是任意對(duì)象,甚至另外一個(gè)WeakMap對(duì)象wm1.get(o2); // 'azerty'wm2.get(o2); // undefined,wm2中沒(méi)有o2這個(gè)鍵wm2.get(o3); // undefined,值就是undefinedwm1.has(o2); // truewm2.has(o2); // falsewm2.has(o3); // true (即使值是undefined)wm3.set(o1, 37);wm3.get(o1); // 37wm1.has(o1); // truewm1.delete(o1);wm1.has(o1); // false實(shí)現(xiàn)一 個(gè)帶有 .clear() 方法的類(lèi) WeakMap 類(lèi)
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的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. IntelliJ IDEA導(dǎo)入項(xiàng)目的方法2. 使用Android Studio創(chuàng)建OpenCV4.1.0 項(xiàng)目的步驟3. 父div高度不能自適應(yīng)子div高度的解決方案4. vue-路由精講 二級(jí)路由和三級(jí)路由的作用5. express框架通過(guò)ejs模板渲染輸出頁(yè)面實(shí)例分析6. Spring Boot設(shè)置支持跨域請(qǐng)求過(guò)程詳解7. Vue+express+Socket實(shí)現(xiàn)聊天功能8. Pycharm中安裝wordcloud等庫(kù)失敗問(wèn)題及終端通過(guò)pip安裝的Python庫(kù)如何添加到Pycharm解釋器中(推薦)9. Python獲取百度熱搜的完整代碼10. 詳解Python IO口多路復(fù)用

網(wǎng)公網(wǎng)安備