国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

ES6 系列之 WeakMap的使用示例

2024-05-06 15:32:07
字體:
供稿:網(wǎng)友

前言

我們先從 WeakMap 的特性說起,然后聊聊 WeakMap 的一些應用場景。

特性

1. WeakMap 只接受對象作為鍵名

const map = new WeakMap();map.set(1, 2);// TypeError: Invalid value used as weak map keymap.set(null, 2);// TypeError: Invalid value used as weak map key

2. WeakMap 的鍵名所引用的對象是弱引用

這句話其實讓我非常費解,我個人覺得這句話真正想表達的意思應該是:

WeakMaps hold "weak" references to key objects,

翻譯過來應該是 WeakMaps 保持了對鍵名所引用的對象的弱引用。

我們先聊聊弱引用:

在計算機程序設計中,弱引用與強引用相對,是指不能確保其引用的對象不會被垃圾回收器回收的引用。 一個對象若只被弱引用所引用,則被認為是不可訪問(或弱可訪問)的,并因此可能在任何時刻被回收。

在 JavaScript 中,一般我們創(chuàng)建一個對象,都是建立一個強引用:

var obj = new Object();

只有當我們手動設置 obj = null 的時候,才有可能回收 obj 所引用的對象。

而如果我們能創(chuàng)建一個弱引用的對象:

// 假設可以這樣創(chuàng)建一個var obj = new WeakObject();

我們什么都不用做,只用靜靜的等待垃圾回收機制執(zhí)行,obj 所引用的對象就會被回收。

我們再來看看這句:

WeakMaps 保持了對鍵名所引用的對象的弱引用

正常情況下,我們舉個例子:

const key = new Array(5 * 1024 * 1024);const arr = [ [key, 1]];

使用這種方式,我們其實建立了 arr 對 key 所引用的對象(我們假設這個真正的對象叫 Obj)的強引用。

所以當你設置 key = null 時,只是去掉了 key 對 Obj 的強引用,并沒有去除 arr 對 Obj 的強引用,所以 Obj 還是不會被回收掉。

Map 類型也是類似:

let map = new Map();let key = new Array(5 * 1024 * 1024);// 建立了 map 對 key 所引用對象的強引用map.set(key, 1);// key = null 不會導致 key 的原引用對象被回收key = null;

我們可以通過 Node 來證明一下這個問題:

// 允許手動執(zhí)行垃圾回收機制node --expose-gcglobal.gc();// 返回 Nodejs 的內(nèi)存占用情況,單位是 bytesprocess.memoryUsage(); // heapUsed: 4640360 ≈ 4.4Mlet map = new Map();let key = new Array(5 * 1024 * 1024);map.set(key, 1);global.gc();process.memoryUsage(); // heapUsed: 46751472 注意這里大約是 44.6Mkey = null;global.gc();process.memoryUsage(); // heapUsed: 46754648 ≈ 44.6M// 這句話其實是無用的,因為 key 已經(jīng)是 null 了map.delete(key);global.gc();process.memoryUsage(); // heapUsed: 46755856 ≈ 44.6M            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 视频| 武陟县| 瑞安市| 依兰县| 南昌县| 陕西省| 搜索| 泾阳县| 皮山县| 中卫市| 南投县| 沐川县| 陇南市| 佛坪县| 瑞昌市| 托克逊县| 松滋市| 淅川县| 那坡县| 怀宁县| 乌兰县| 开封市| 尉犁县| 客服| 新巴尔虎左旗| 赤城县| 尉氏县| 鹤峰县| 定边县| 古蔺县| 蒲江县| 平邑县| 五大连池市| 门头沟区| 大港区| 大同市| 厦门市| 玛曲县| 孟州市| 渑池县| 宜章县|