ES6系列_11之Set和WeakSet資料結構
一、Set
1.Set是什麼?
Set是ES6 提供的一種新的資料結構。類似於陣列。
2.Set能解決什麼問題
Set和Array 的區別是Set不允許內部有重複的值,如果有隻顯示一個,相當於去重。
3.怎麼使用Set相關東西
Set 函式可以接受一個數組(或者具有 iterable 介面的其他資料結構)作為引數,用來初始化。
(1)Set的宣告
let setArr = new Set(['1','2','3']); console.log(setArr);//Set {"1", "2", "3"}
(2)Set值的增刪查
追加add:
在使用Array的時候,使用push進行追加值,那Set稍有不同,它使用add進行追加。
let setArr = new Set(['1','2','3']); console.log(setArr);//Set {"1", "2", "3"} setArr.add('4') console.log(setArr);//Set {"1", "2", "3","4"}
刪除delete:
let setArr = new Set(['1','2','3']); console.log(setArr);//Set {"1", "2", "3"} setArr.delete("1") console.log(setArr);//Set {"2", "3"}
查詢has:
用has進行值的查詢,返回的是true或者false。
let setArr = new Set(['1','2','3']); console.log(setArr);//Set {"1", "2", "3"}
console.log(setArr.has("1"))//true console.log(setArr.has("0"))//false
刪除clear:
清空所有
let setArr = new Set(['1','2','3']); console.log(setArr);//Set {"1", "2", "3"} setArr.clear() console.log(setArr)//{}
set的迴圈 for…of…迴圈:
let setArr = new Set(['1','2','3']); console.log(setArr);//Set {"1", "2", "3"} for (let item of setArr){ console.log(item); //1,2,3 }
forEach迴圈:
let setArr = new Set(['1','2','3']); setArr.forEach((value)=>console.log(value)) //1,2,3
size屬性:
size屬性可以獲得Set值的數量。
let setArr = new Set(['1','2','3']); console.log(setArr.size)// 3
二、WeakSet
WeakSet 結構與 Set 類似,也是不重複的值的集合。但是,它與 Set 有兩個區別。
首先,WeakSet 的成員只能是物件,而不能是其他型別的值。
其次,WeakSet 中的物件都是弱引用,即垃圾回收機制不考慮 WeakSet 對該物件的引用,也就是說,如果其他物件都不再引用該物件,那麼垃圾回收機制會自動回收該物件所佔用的記憶體,不考慮該物件還存在於 WeakSet 之中。
因此WeakSet 適合臨時存放一組物件,以及存放跟物件繫結的資訊。只要這些物件在外部消失,它在 WeakSet 裡面的引用就會自動消失。
ES6 規定 WeakSet 不可遍歷。
(1)WeakSet的宣告以及賦值
宣告只能先new一個空物件,然後在使用add方法將一個已定義的物件新增到其中。
let weakObj=new WeakSet(); let obj={a:'1',b:'2'} weakObj.add(obj); console.log(weakObj);
輸出結果為:
WeakSet裡邊的值也是不允許重複的,比如:
let weakObj=new WeakSet(); let obj={a:'1',b:'2'} let obj1=obj weakObj.add(obj); weakObj.add(obj1) console.log(weakObj);
輸出結果為:
實際為物件指向同一個地址,當物件不指向同一個地址,即使兩個物件裡面的值,相同也是可以新增到WeakSet裡的。比如:
let weakObj=new WeakSet(); let obj={a:'1',b:'2'} let obj1={a:'1',b:'2'} weakObj.add(obj); weakObj.add(obj1) console.log(weakObj);
輸出的結果為:
總結:在實際開發中Set用的比較多,WeakSet用的並不多,但是WeakSet對傳入值必須是物件作了很好的判斷。