av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript WeakMap使用詳解

瀏覽:91日期:2023-10-04 13:49:03

WeakMap 對象是一組鍵/值對的集合,其中的鍵是弱引用的。其鍵必須是對象,而值可以是任意的。

語法

new WeakMap([iterable])參數(shù)

iterableIterable 是一個數(shù)組(二元數(shù)組)或者其他可迭代的且其元素是鍵值對的對象。每個鍵值對會被加到新的 WeakMap 里。null 會被當(dāng)做 undefined。

描述

WeakMap 的 key 只能是 Object 類型。 原始數(shù)據(jù)類型 是不能作為 key 的(比如 Symbol)。

Why WeakMap?

在 JavaScript 里,map API 可以通過使其四個 API 方法共用兩個數(shù)組(一個存放鍵,一個存放值)來實現(xiàn)。給這種 map 設(shè)置值時會同時將鍵和值添加到這兩個數(shù)組的末尾。從而使得鍵和值的索引在兩個數(shù)組中相對應(yīng)。當(dāng)從該 map 取值的時候,需要遍歷所有的鍵,然后使用索引從存儲值的數(shù)組中檢索出相應(yīng)的值。

但這樣的實現(xiàn)會有兩個很大的缺點,首先賦值和搜索操作都是 O(n) 的時間復(fù)雜度( n 是鍵值對的個數(shù)),因為這兩個操作都需要遍歷全部整個數(shù)組來進行匹配。另外一個缺點是可能會導(dǎo)致內(nèi)存泄漏,因為數(shù)組會一直引用著每個鍵和值。這種引用使得垃圾回收算法不能回收處理他們,即使沒有其他任何引用存在了。

相比之下,原生的 WeakMap 持有的是每個鍵對象的“弱引用”,這意味著在沒有其他引用存在時垃圾回收能正確進行。原生 WeakMap 的結(jié)構(gòu)是特殊且有效的,其用于映射的 key 只有在其沒有被回收時才是有效的。

正由于這樣的弱引用,WeakMap 的 key 是不可枚舉的 (沒有方法能給出所有的 key)。如果key 是可枚舉的話,其列表將會受垃圾回收機制的影響,從而得到不確定的結(jié)果。因此,如果你想要這種類型對象的 key 值的列表,你應(yīng)該使用 Map。

基本上,如果你要往對象上添加數(shù)據(jù),又不想干擾垃圾回收機制,就可以使用 WeakMap。

屬性 WeakMap.length

length 屬性的值為 0。

WeakMap.prototype

WeakMap 構(gòu)造器的原型。 允許添加屬性到所有的 WeakMap 對象。

WeakMap 實例

所有 WeakMap 實例繼承自 WeakMap.prototype.

屬性

WeakMap.prototype.constructor返回創(chuàng)建WeakMap實例的原型函數(shù)。 WeakMap函數(shù)是默認的。

方法 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)對象時)。

WeakMap.prototype.has(key)

根據(jù)是否有key關(guān)聯(lián)對象返回一個Boolean值。

WeakMap.prototype.set(key, value)

在WeakMap中設(shè)置一組key關(guān)聯(lián)對象,返回這個 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可以是任意值,包括一個對象或一個函數(shù)wm2.set(o3, undefined);wm2.set(wm1, wm2); // 鍵和值可以是任意對象,甚至另外一個WeakMap對象wm1.get(o2); // 'azerty'wm2.get(o2); // undefined,wm2中沒有o2這個鍵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實現(xiàn)一 個帶有 .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使用詳解的詳細內(nèi)容,更多關(guān)于JavaScript WeakMap的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 日本少妇一区二区 | 亚洲欧美日韩国产精品 | 日本久久精品视频 | 久久精品毛片 | 国产在线黄色 | 一区在线视频 | 日本激情网站 | 午夜伦理视频 | 欧美日韩精品一区二区在线播放 | 日本免费在线视频 | 亚洲精品久久久久久久久 | 国产精品久久久国产盗摄 | 成人在线免费看 | 国产一区二区三区免费 | 日本中文字幕在线播放 | 福利在线播放 | 日韩在线综合 | 国产suv一区二区 | 亚洲天堂免费 | 玖玖在线播放 | 国产福利在线观看 | 伊人999| 亚洲天堂久久 | 国产一区在线播放 | 性做久久久久久久免费看 | 精品在线播放 | 国产精品成人免费一区久久羞羞 | 亚洲亚洲人成综合网络 | 亚洲一区二区三区在线播放 | 成人免费网站黄 | 欧美精品一区在线观看 | 国产精品海角社区 | 毛片在线免费播放 | 国产区一区 | 四虎成人在线 | 免费看色片 | 天天操狠狠干 | 色综合视频在线观看 | 国产成人区 | 国产成人精品一区二区三区视频 | 国产欧美日本 |