成人视屏在线观看-国产99精品-国产精品1区2区-欧美一级在线观看-国产一区二区日韩-色九九九

您的位置:首頁技術文章
文章詳情頁

JavaScript WeakMap使用詳解

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

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

語法

new WeakMap([iterable])參數

iterableIterable 是一個數組(二元數組)或者其他可迭代的且其元素是鍵值對的對象。每個鍵值對會被加到新的 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

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,值就是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實現一 個帶有 .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 }}規范

Specification Status Comment ECMAScript 2015 (6th Edition, ECMA-262) WeakMap Standard Initial definition. ECMAScript (ECMA-262) WeakMap Living Standard

以上就是JavaScript WeakMap使用詳解的詳細內容,更多關于JavaScript WeakMap的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 高清欧美一级在线观看 | 国产九九精品 | 亚洲国产欧美日韩精品一区二区三区 | 日韩日b视频 | 全球成人网 | 国产午夜亚洲精品第一区 | 天天视频一区二区三区 | 国产精品国内免费一区二区三区 | 久久免费小视频 | 怡红院成人在线 | 精品视频在线看 | 在线观看久草视频 | 久久精品国产精品青草不卡 | 亚洲国产精品综合久久一线 | 自拍国内 | 一级做a毛片在线看 | 99久久国产免费 - 99久久国产免费 | 美国免费高清一级毛片 | 国产精品亚洲高清一区二区 | 1769视频在线观看国产 | aaa一级毛片 | 波多野结衣在线观看一区二区 | 女人张开双腿让男人桶爽免 | 免费人成在线观看视频不卡 | 久久精品爱 | 欧美激情伦妇在线观看 | 国产亚洲精品久久久久久久 | 午夜三级a三点 | 国产夫妇精品自在线 | 在线观看国产一区二三区 | 亚洲欧美日本视频 | 亚洲国产综合人成综合网站00 | 日韩一级一欧美一级国产 | 日本黄色大片在线播放视频免费观看 | 免费真实播放国产乱子伦 | 国内真实愉拍系列情侣自拍 | 成人午夜视频在线播放 | 国产成人免费高清在线观看 | 日韩综合| 国产精品久久免费观看 | 本道久久综合88全国最大色 |