Set有對應的WeakSet, Map也有WeakMap。這一篇,我們就來學習一下WeakMap有寫什么特性。
先來看一下WeakMap的基本特性:
1: WeakMap是一種存儲多個鍵值對的無序列表 2: WeakMap的鍵必須是非null的對象類型 3: WeakMap的鍵對應的值,可以是任意類型
接下來看一下WeakMap的接口方法:
一:WeakMap的新建與初始化
與Map相同的,WeakMap也可以通過new WeakMap()新建和初始化:
let weakMap1 = new WeakMap(); let key1 = {}; let key2 = {}; let weakMap2 = new WeakMap([[key1, "key1"],[key2, "key2"]]);
只是與Map不同,WeakMap的key必須是對象,不能是原始類型。
二:WeakMap的增刪查減
WeakMap的接口函數(shù)與Map基本一致,只是沒有clear()方法:
1: set(key, value) 添加一個鍵值對 2: get(key) 獲取key對應的value 3: has(key) 判斷key是否存在于WeakMap 4: delete(key) 移除key對應的鍵值對
下面我們看一個用了以上所有方法的示例:
let weakMap = new WeakMap(); let key1 = {"id": 1}; let key2 = {"id": 2}; weakMap.set(key1, {"name": "mike"}); weakMap.set(key2, {"name": "lily"}); console.log(weakMap.get(key1)); //{name: "mike"} console.log(weakMap.has(key1)); //true weakMap.delete(key1); console.log(weakMap);
最后一行代碼的打印結(jié)果為:
WeakMap {{…} => {…}} __proto__: WeakMap [[Entries]]: Array(1) 0: {Object => Object} key: {id: 2} value: {name: "lily"} length: 1
三:WeakMap的限制
1: WeakMap沒有size屬性 2: WeakMap在初始化或者調(diào)用set()的時候,key必須為非null對象,不然會拋出錯誤 3: WeakMap是不可枚舉的,所以沒有clear(), forEach()方法,不能在for...of環(huán)境下使用
四:WeakMap的使用場景
我們前面說到WeakMap的key必須要是非null的對象,WeakMap存儲的key也是對象的弱引用,如果在此之外不存在其他強引用,JavaScript的引擎的垃圾回收機制會自動回收這個對象。而key對應的value如果是對象的話,那依然存儲的對象的強引用。
所以當你遇到一個需要用到存儲鍵值對的場景,在Map和WeakMap之間你需要權(quán)衡的點有:
1:你是否需要用對象做key,如果是,那么WeakMap是比Map更好的選擇 2: 如果你選擇的WeakMap,你功能的實現(xiàn)是否不受限與WeakMap本身的限制(也就是我們前面說到的‘三:WeakMap的限制’)。
以上就是WeakMap的基本特殊和使用方法以及場景。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/106200.html
摘要:概述和使用上類似,在特性上和類似,和相比,有一下特點不可枚舉的只能是對象是弱引用,內(nèi)的如果沒有引用,將會被垃圾回收機制回收初始化添加刪除包含弱引用特性后輸出一下內(nèi)容,數(shù)據(jù)消失了 0x000 概述 WeakMap和Map使用上類似,在特性上和Set類似,和Map相比,有一下特點 不可枚舉 WeakMap的key只能是對象 WeakMap是弱引用,WeakMap內(nèi)的key如果沒有引用...
摘要:一個對象若只被弱引用所引用,則被認為是不可訪問或弱可訪問的,并因此可能在任何時刻被回收。也就是說,一旦不再需要,里面的鍵名對象和所對應的鍵值對會自動消失,不用手動刪除引用。如果有錯誤或者不嚴謹?shù)牡胤?,請務必給予指正,十分感謝。 前言 我們先從 WeakMap 的特性說起,然后聊聊 WeakMap 的一些應用場景。 特性 1. WeakMap 只接受對象作為鍵名 const map = ...
摘要:中對的要求主要是對非對象僅保留弱引用,且取值是復雜度,這導致了它的兩個特性不能求大小,更不能枚舉。按說這種關(guān)乎內(nèi)存管理的對象是沒法的。但是對有一個很奇妙的。在中的每一個中設置一個屬性屬性名是的唯一。值為該在中對應的。同時取值也是復雜度的。 ES6 中對 WeakMap 的要求主要是對 key(非 null 對象) 僅保留弱引用,且取值是 O(1) 復雜度,這導致了它的兩個特性: 不...
摘要:經(jīng)常會用到的的知識點提到我們就來說說,也是誕生,它的初始名叫。又名,在,和大受重用。年,負責制定規(guī)范草案的委員會決定將定義新標準的制度改為一年一次出現(xiàn)。它們在規(guī)范的先前版本中被稱為模板字符串。它與數(shù)組非常相似,但是數(shù)據(jù)結(jié)構(gòu)的成員都是唯一的。 經(jīng)常會用到的es6的知識點 提到es6我們就來說說javascript,es6也是ES2015 1995:JavaScript誕生,它的初始名叫...
摘要:事實上,不僅僅是數(shù)組,任何具有接口且每個成員都是一個雙元素的數(shù)組的數(shù)據(jù)結(jié)構(gòu)都可以當做構(gòu)造函數(shù)的參數(shù)。返回所有成員的遍歷器需要特別注意的是,的遍歷順序就是插入順序。轉(zhuǎn)為轉(zhuǎn)為,正常情況下,所有鍵名都是字符串。 Map JavaScript 的對象(Object),本質(zhì)上是鍵值對的集合(Hash 結(jié)構(gòu)),但是傳統(tǒng)上只能用字符串當作鍵。這給它的使用帶來了很大的限制。為了解決這個問題,ES6 提...
閱讀 1747·2021-11-24 10:18
閱讀 2257·2021-11-18 13:20
閱讀 2349·2021-08-23 09:46
閱讀 1008·2019-08-30 15:56
閱讀 2852·2019-08-30 15:53
閱讀 751·2019-08-30 14:22
閱讀 480·2019-08-29 15:34
閱讀 2549·2019-08-29 12:14