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

首頁 > 編程 > JavaScript > 正文

ES6 系列之 WeakMap的使用示例

2019-11-19 13:20:18
字體:
來源:轉載
供稿:網友

前言

我們先從 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;

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久免费高清电视剧观看| 日本精品一区二区三区在线播放视频| 国产成+人+综合+亚洲欧美丁香花| 久久电影一区二区| 青青精品视频播放| 国产成人一区二区| 777午夜精品福利在线观看| 亚洲三级免费看| 亚洲精品视频中文字幕| 日韩精品极品视频| 中文亚洲视频在线| 国产视频在线一区二区| 国产精品99导航| 国产精品r级在线| 色婷婷久久一区二区| 亚洲免费电影在线观看| 久久av.com| 久久成人这里只有精品| 亚洲最新av网址| 日本高清+成人网在线观看| 久久久久一本一区二区青青蜜月| 亚洲一区二区三区sesese| 7m第一福利500精品视频| 欧美大尺度在线观看| 日韩中文字幕网站| 亚洲精品久久在线| 性视频1819p久久| 色黄久久久久久| 久久偷看各类女兵18女厕嘘嘘| 国产日韩欧美日韩大片| 亚洲一区999| 亚洲一区二区三区xxx视频| 亚洲性夜色噜噜噜7777| 国产精品扒开腿爽爽爽视频| 亚洲free性xxxx护士hd| 日韩毛片中文字幕| 中文字幕欧美日韩| 亚洲直播在线一区| 奇米成人av国产一区二区三区| 久久久久久香蕉网| 中文字幕v亚洲ⅴv天堂| 琪琪第一精品导航| 中文字幕自拍vr一区二区三区| 国产在线视频一区| 欧美久久精品午夜青青大伊人| 92看片淫黄大片欧美看国产片| 亚洲精选在线观看| 大桥未久av一区二区三区| 国产精品成人av性教育| 狠狠做深爱婷婷久久综合一区| 亚洲xxx视频| 一区二区三区国产在线观看| 国产精品免费视频久久久| 亚洲视频视频在线| 日本免费一区二区三区视频观看| 欧美激情videoshd| 亚洲人永久免费| 欧美电影在线观看网站| 最新亚洲国产精品| 国模私拍视频一区| 亚洲男人的天堂在线播放| 欧美电影免费观看电视剧大全| 亚洲美女性生活视频| 91中文精品字幕在线视频| 日韩av综合网站| 欧美国产日韩xxxxx| 国产一区二区三区在线播放免费观看| 国产91露脸中文字幕在线| 国产精品色午夜在线观看| 国产精品久久久久77777| 日韩中文字幕视频在线观看| 欧美大片在线看免费观看| 在线性视频日韩欧美| 精品久久国产精品| 91成品人片a无限观看| 欧美另类暴力丝袜| 欧美第一页在线| 欧美午夜性色大片在线观看| 精品在线观看国产| 精品无人区乱码1区2区3区在线| 精品露脸国产偷人在视频| 亚洲夜晚福利在线观看| 精品国产一区二区三区久久久| 亚洲精品成人久久电影| 国产精品成人v| 国产91ⅴ在线精品免费观看| 中文字幕日本精品| 中文字幕欧美精品日韩中文字幕| 亚洲第一免费播放区| 日本乱人伦a精品| 欧美老女人性生活| 亚洲国产精品久久久久秋霞不卡| 中文字幕日韩欧美在线视频| 欧美午夜丰满在线18影院| 成人免费网视频| 日韩免费高清在线观看| 中文字幕欧美视频在线| 欧美又大又硬又粗bbbbb| 91精品国产乱码久久久久久久久| 欧美成人在线免费视频| 日韩av在线看| 中文字幕欧美日韩va免费视频| 日韩av片免费在线观看| 国产xxx69麻豆国语对白| 国产精品v片在线观看不卡| 久久久国产一区| 国产午夜精品免费一区二区三区| 欧美电影免费看| 性色av香蕉一区二区| 一区二区三区日韩在线| 国产精品日韩av| 欧美一级大片在线观看| 精品视频久久久久久| 日韩电影中文字幕在线观看| 精品动漫一区二区三区| 91久久精品久久国产性色也91| 国语自产精品视频在线看一大j8| 亚洲国产日韩欧美在线图片| 久久视频在线免费观看| 搡老女人一区二区三区视频tv| 最新亚洲国产精品| 国产97在线播放| 欧美日韩xxxxx| 亚洲精品一区二区在线| 午夜精品在线观看| 国产成人精品最新| 国产在线视频不卡| 性欧美亚洲xxxx乳在线观看| 亚洲免费av网址| 国产日韩欧美日韩| 少妇激情综合网| 97视频免费观看| 成人中文字幕+乱码+中文字幕| 亚洲自拍小视频免费观看| 成人性生交大片免费观看嘿嘿视频| 亚洲欧美国产精品va在线观看| 亚洲精品免费网站| 欧美精品成人在线| 久久精品成人欧美大片| 日韩av网址在线| 在线视频欧美日韩| 欧洲成人午夜免费大片| 久久免费福利视频| 亚洲日本欧美日韩高观看| 久久久久久国产精品三级玉女聊斋| 精品国偷自产在线视频| 亚洲第一区在线观看| 丝袜情趣国产精品| 在线观看精品国产视频| 日韩综合视频在线观看| 一区二区欧美亚洲| 亚洲色图狂野欧美| 精品国产乱码久久久久酒店| 国产成人精品电影| 成人中文字幕+乱码+中文字幕| 亚洲福利在线播放| 国产91精品视频在线观看| 国产亚洲精品久久久久动| 91久久久精品| 久久久久久久久久久人体| 亚洲人成在线免费观看| 成人黄色av播放免费| 国产欧美一区二区三区四区| 欧美日韩亚洲一区二区|