摘要:這幾意味著,在初始化和調用的時候,都只能傳入對象類型的元素。如果給方法傳入非對象類型,會拋出錯誤。
在我們進入在WeakSet的使用之前,我們先來看一個用Set來存儲對象引用的例子:
let set = new Set(); let key = {}; set.add(key); key = null; console.log(set.size); // 1 console.log([...set][0]); // {}
以上代碼,我們存儲了一個對象的引用key,但是隨后我們通過key = null清楚了對象的引用,但是隨后我們查看set.size依然得到1,且依然可以通過把set展開到數組取到原本已經被我們清除了引用的key。
之所以會出現這樣的結果是因為,Set存儲的是對象的強引用,雖然在代碼的其他地方已經不存在對此變量的引用,但是javaScript的垃圾回收機制依然不會回收這段地址。這種情況,就會造成我們常說的內存泄漏。
而WeakSet就是為了解決上面的問題而存在的,相比Set,WeakSet存的是對象的弱引用。意思就是,如果在代碼的其他地方已經不存在任何引用,那么WeakSet也不會再保留這個引用,這樣就可以被垃圾回收了。
了解了以上WeakSet的存在背景,現在就來看一下WeakSet的一些特性和使用:
一:初始化WeakSet
一:通過new WeakSet()初始化
let weakSet = new WeakSet();
二:傳入可迭代對象初始化
let key1 = {}; let key2= {}; let weakSet = new WeakSet([key1, key2]);
二:WeakSet的add(),delete(),has()方法
區別于Set,WeakSet只有三個方法可用,分別是
1: add() 添加一個元素 2: delete() 刪除一個元素 3: has() 查詢某個元素是否存在
它們的功能和用法與Set所對應的三個方法一致,只是在參數類型上有所限制,即:
以上三個方法都不能傳入基本數據類型,只能傳入對象類型。 我們先來看一下代碼示例:
let key1 = {name: "may"}; let key2= {name: "april"}; let weakSet = new WeakSet([key1, key2]); console.log(weakSet.has(key1)); // true weakSet.delete(key2); let key3 = {name: "mike"}; let result = weakSet.add(key3); console.log(result);
最后打印 console.log(result),我們得到結果:
WeakSet {{…}, {…}} __proto__: WeakSet [[Entries]]: Array(2) 0: value: {name: "may"} 1: value: {name: "mike"} length: 2
可以看到因為調用delete(key2), 所以我們最后的結果里面沒有了key2。
三:WeakSet與Set的區別
WeakSet與Set除了存儲的分別是對象的弱引用和強引用之外,還有很多差別,下面我們就來總結一下WeakSet的特性:
1: WeakSet只能不能存儲基本數據類型。這幾意味著,在初始化和調用add()的時候,都只能傳入對象類型的元素。 2: 如果給add()方法傳入非對象類型,會拋出錯誤。給delete()和has()傳入非對象類型參數,則總是返回false。 3: WeakSet不可迭代,所以所有迭代的場景都不能使用,例如for-of, 展開運算符等 4: WeakSet不暴露任何的迭代器,例如keys(),values(),這也是其不能被迭代的原因 5: WeakSet不支持forEach()方法 6: WeakSet不支持size屬性
以上就是關于WeakSet的基本特性和功能。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106147.html
摘要:概述和差不多,但是有一些不同只能存儲對象,不能存儲任意值不可迭代是弱引用,也就是如果沒有變量引用內的值,很容易被回收初始化因為只能存儲對象,所以這里我想只能傳入類似對象數組之類的東西對象數組添加判斷是否已經有了刪除弱引用特性后輸出,可以看到 0x000 概述 WeakSet和Set差不多,但是有一些不同: WeakSet只能存儲對象,不能存儲任意值 WeakSet不可迭代 We...
摘要:一概述集合是引入的新的內置對象類型,其特點同數學意義的集合,即集合內所有元素不重復元素唯一。數組集合對比數組和集合,數組可以加入重復數據,而集合的所有元素是唯一的不允許重復。因此,適合臨時存放一組對象,以及存放跟對象綁定的信息。 本文同步帶你入門 帶你入門 JavaScript ES6 (五) 集合,轉載請注明出處。 前面我們學習了: for of 變量和擴展語法 塊作用域變量和解構...
摘要:返回一個布爾值,表示該值是否為的成員。清除所有成員,沒有返回值。上面代碼中,方法返回的遍歷器,同時包括鍵名和鍵值,所以每次輸出一個數組,它的兩個成員完全相等。因此,適合臨時存放一組對象,以及存放跟對象綁定的信息。 Js大部分歷史時期都只存在一種集合類型,也就是數組類型。數組在 JS 中的使用正如其他語言的數組一樣,但缺少更多類型的集合導致數組也經常被當作隊列與棧來使用。數組只使用了數值...
摘要:返回一個布爾值,表示該值是否為的成員。返回鍵名的遍歷器返回鍵值的遍歷器返回鍵值對的遍歷器使用回調函數遍歷每個成員需要特別指出的是,的遍歷順序就是插入順序。該數組的所有成員,都會自動成為實例對象的成員。這意味著,數組的成員只能是對象。 1.Set ES6 提供了新的數據結構 Set。它類似于數組,但是成員的值都是唯一的,沒有重復的值。Set 本身是一個構造函數,用來生成 Set 數據結構...
摘要:對象允許你存儲任何類型的唯一值,無論是原始值或者是對象引用。不能重復獲取的值方法用來向一個對象的末尾添加一個指定的值。 Set 對象允許你存儲任何類型的唯一值,無論是原始值或者是對象引用。(不能重復) const set1=new Set([1,2,3,4,5,6]); console.log(set1); //Set { 1, 2, 3, 4, 5, 6 } 獲取set的值 cons...
閱讀 3463·2021-11-25 09:43
閱讀 1062·2021-11-15 11:36
閱讀 3313·2021-11-11 16:54
閱讀 3974·2021-09-27 13:35
閱讀 4364·2021-09-10 11:23
閱讀 5676·2021-09-07 10:22
閱讀 3032·2021-09-04 16:40
閱讀 769·2021-08-03 14:03