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