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