亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

ES6 系列之 WeakMap的使用示例

2024-05-06 16:45:33
字體:
來源:轉載
供稿:網友

前言

我們先從 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 中,一般我們創建一個對象,都是建立一個強引用:

var obj = new Object();

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

而如果我們能創建一個弱引用的對象:

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

我們什么都不用做,只用靜靜的等待垃圾回收機制執行,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 來證明一下這個問題:

// 允許手動執行垃圾回收機制node --expose-gcglobal.gc();// 返回 Nodejs 的內存占用情況,單位是 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 已經是 null 了map.delete(key);global.gc();process.memoryUsage(); // heapUsed: 46755856 ≈ 44.6M

如果你想要讓 Obj 被回收掉,你需要先 delete(key) 然后再 key = null:

let map = new Map();let key = new Array(5 * 1024 * 1024);map.set(key, 1);map.delete(key);key = null;

我們依然通過 Node 證明一下:

node --expose-gcglobal.gc();process.memoryUsage(); // heapUsed: 4638376 ≈ 4.4Mlet map = new Map();let key = new Array(5 * 1024 * 1024);map.set(key, 1);global.gc();process.memoryUsage(); // heapUsed: 46727816 ≈ 44.6Mmap.delete(key);global.gc();process.memoryUsage(); // heapUsed: 46748352 ≈ 44.6Mkey = null;global.gc();process.memoryUsage(); // heapUsed: 4808064 ≈ 4.6M

這個時候就要說到 WeakMap 了:

const wm = new WeakMap();let key = new Array(5 * 1024 * 1024);wm.set(key, 1);key = null;

當我們設置 wm.set(key, 1) 時,其實建立了 wm 對 key 所引用的對象的弱引用,但因為 let key = new Array(5 * 1024 * 1024) 建立了 key 對所引用對象的強引用,被引用的對象并不會被回收,但是當我們設置 key = null 的時候,就只有 wm 對所引用對象的弱引用,下次垃圾回收機制執行的時候,該引用對象就會被回收掉。

我們用 Node 證明一下:

node --expose-gcglobal.gc();process.memoryUsage(); // heapUsed: 4638992 ≈ 4.4Mconst wm = new WeakMap();let key = new Array(5 * 1024 * 1024);wm.set(key, 1);global.gc();process.memoryUsage(); // heapUsed: 46776176 ≈ 44.6Mkey = null;global.gc();process.memoryUsage(); // heapUsed: 4800792 ≈ 4.6M

所以 WeakMap 可以幫你省掉手動刪除對象關聯數據的步驟,所以當你不能或者不想控制關聯數據的生命周期時就可以考慮使用 WeakMap。

總結這個弱引用的特性,就是 WeakMaps 保持了對鍵名所引用的對象的弱引用,即垃圾回收機制不將該引用考慮在內。只要所引用的對象的其他引用都被清除,垃圾回收機制就會釋放該對象所占用的內存。也就是說,一旦不再需要,WeakMap 里面的鍵名對象和所對應的鍵值對會自動消失,不用手動刪除引用。

也正是因為這樣的特性,WeakMap 內部有多少個成員,取決于垃圾回收機制有沒有運行,運行前后很可能成員個數是不一樣的,而垃圾回收機制何時運行是不可預測的,因此 ES6 規定 WeakMap 不可遍歷。

所以 WeakMap 不像 Map,一是沒有遍歷操作(即沒有keys()、values()和entries()方法),也沒有 size 屬性,也不支持 clear 方法,所以 WeakMap只有四個方法可用:get()、set()、has()、delete()。

應用

1. 在 DOM 對象上保存相關數據

傳統使用 jQuery 的時候,我們會通過 $.data() 方法在 DOM 對象上儲存相關信息(就比如在刪除按鈕元素上儲存帖子的 ID 信息),jQuery 內部會使用一個對象管理 DOM 和對應的數據,當你將 DOM 元素刪除,DOM 對象置為空的時候,相關聯的數據并不會被刪除,你必須手動執行 $.removeData() 方法才能刪除掉相關聯的數據,WeakMap 就可以簡化這一操作:

let wm = new WeakMap(), element = document.querySelector(".element");wm.set(element, "data");let value = wm.get(elemet);console.log(value); // dataelement.parentNode.removeChild(element);element = null;

2. 數據緩存

從上一個例子,我們也可以看出,當我們需要關聯對象和數據,比如在不修改原有對象的情況下儲存某些屬性或者根據對象儲存一些計算的值等,而又不想管理這些數據的死活時非常適合考慮使用 WeakMap。數據緩存就是一個非常好的例子:

const cache = new WeakMap();function countOwnKeys(obj) {  if (cache.has(obj)) {    console.log('Cached');    return cache.get(obj);  } else {    console.log('Computed');    const count = Object.keys(obj).length;    cache.set(obj, count);    return count;  }}

3. 私有屬性

WeakMap 也可以被用于實現私有變量,不過在 ES6 中實現私有變量的方式有很多種,這只是其中一種:

const privateData = new WeakMap();class Person {  constructor(name, age) {    privateData.set(this, { name: name, age: age });  }  getName() {    return privateData.get(this).name;  }  getAge() {    return privateData.get(this).age;  }}export default Person;

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久亚洲一区二区三区四区五区高| 精品一区精品二区| 精品无码久久久久久国产| 色婷婷av一区二区三区久久| 亚洲第一精品久久忘忧草社区| 久久久久久久97| 色老头一区二区三区在线观看| 欧美有码在线视频| 中文字幕久热精品视频在线| 91久久精品美女| 日韩美女毛茸茸| 国产精品18久久久久久麻辣| 久久精品视频导航| 日韩av在线一区| 欧美日韩性生活视频| 啪一啪鲁一鲁2019在线视频| 亚洲精品国产精品久久清纯直播| 亚洲日韩欧美视频一区| 欧美亚洲国产视频小说| 欧美成人精品影院| 亚洲欧美日韩另类| 国产美女精彩久久| yw.139尤物在线精品视频| 国产剧情久久久久久| 欧美中文在线字幕| 亚洲精品99久久久久| 亚洲男女自偷自拍图片另类| 一夜七次郎国产精品亚洲| 国产女人18毛片水18精品| 国产国语videosex另类| 亚洲女人被黑人巨大进入al| 性夜试看影院91社区| 欧美精品做受xxx性少妇| 亚洲欧洲偷拍精品| 久久久久久这里只有精品| 国产精品久久av| 欧美猛男性生活免费| 欧美猛男性生活免费| 亚洲性生活视频在线观看| 亚洲xxxx在线| 国产精品成人一区二区| 国产深夜精品福利| 午夜欧美大片免费观看| 黄色成人av在线| 国产精品十八以下禁看| 欧美多人爱爱视频网站| 97激碰免费视频| 欧美激情精品久久久久久蜜臀| 91超碰中文字幕久久精品| 国产精品小说在线| 91久久精品国产91久久| 亚洲免费人成在线视频观看| 亚洲裸体xxxx| 66m—66摸成人免费视频| 亚洲欧美日本精品| 欧美性高跟鞋xxxxhd| 国产精品色婷婷视频| 久久久国产精品免费| 26uuu亚洲国产精品| 亚洲系列中文字幕| 欧美日韩裸体免费视频| 久久久精品国产网站| 国产亚洲日本欧美韩国| 操91在线视频| 久久91精品国产| 国产精国产精品| 日韩av在线导航| 国产成人精品亚洲精品| 欧美日韩国产区| 久久免费视频网站| 国产99视频在线观看| 亚洲第一男人av| 亚洲第一区第一页| 日韩成人久久久| 91精品国产色综合| 国产精品美女久久久免费| 中文字幕亚洲欧美日韩2019| 成人免费观看a| 日韩av片免费在线观看| 欧美在线一区二区三区四| 国产一区二区丝袜| 亚洲欧美国产日韩天堂区| 国产视频亚洲精品| 成年人精品视频| 亚洲天堂色网站| 国产精品电影一区| 日韩国产一区三区| 日韩精品在线播放| 欧美成人在线影院| 亚洲情综合五月天| 亚洲日韩第一页| 久久久国产精品免费| 亚洲精品av在线| 久久免费视频这里只有精品| 成人免费自拍视频| 欧美日韩成人黄色| 一本久久综合亚洲鲁鲁| 欧美日韩亚洲一区二区| 国产精品久久久久免费a∨大胸| 亚洲人成网站免费播放| 精品国偷自产在线视频| 国产日产欧美a一级在线| 久久久精品免费| 国产午夜精品一区理论片飘花| 欧美亚洲国产另类| 91在线观看免费观看| 国产亚洲欧洲高清一区| 久热爱精品视频线路一| 俺去亚洲欧洲欧美日韩| 国产精品com| 国产精品一区二区三| 日韩精品在线免费观看视频| 久久久伊人日本| 国产精品成人免费视频| 操91在线视频| 国产日韩欧美在线视频观看| 亚洲成人精品久久久| 91影院在线免费观看视频| 日韩一区二区精品视频| 亚洲男人天堂网站| 欧美一级bbbbb性bbbb喷潮片| 亚洲精品一区二区久| 日本不卡高字幕在线2019| 久久久精品2019中文字幕神马| 欧美激情在线视频二区| 亚洲人成绝费网站色www| 国产区精品在线观看| 成人xxxxx| 6080yy精品一区二区三区| 日韩国产在线播放| 色综合导航网站| 亚洲国产私拍精品国模在线观看| 亚洲最大的网站| 91亚洲精品一区二区| 亚洲精选在线观看| 久久久女人电视剧免费播放下载| 神马久久久久久| 国语自产精品视频在线看一大j8| 久热99视频在线观看| 中文字幕亚洲欧美一区二区三区| 国产精品一区二区久久久久| 国产欧美va欧美va香蕉在| 欧美xxxx14xxxxx性爽| 91日韩在线视频| 91精品国产91久久久久福利| 亚洲资源在线看| 成人免费视频在线观看超级碰| 日韩视频欧美视频| 亚洲精品福利免费在线观看| 清纯唯美亚洲激情| 色婷婷久久一区二区| 一区二区在线免费视频| 91在线无精精品一区二区| 国产精品视频白浆免费视频| 久久精品电影一区二区| 欧美性xxxxx极品| 久久久久日韩精品久久久男男| 性色av一区二区咪爱| 日韩欧美极品在线观看| 欧美乱大交xxxxx另类电影| 国产精品日韩欧美综合| 亚洲精品美女久久久| 91av免费观看91av精品在线| 色爱av美腿丝袜综合粉嫩av|