1. 程式人生 > >ES6系列_11之Set和WeakSet資料結構

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對傳入值必須是物件作了很好的判斷。