Set、WeakSet,Map、WeakMap

ES6提供了新的數據結構Set。它類似于數組,但是成員的值都是唯一的,沒有重復的值。
Set本身是一個構造函數,用來生成Set數據結構。
Set常用方法:elem.add(添加),elem.delete(刪除), elem.clear(清除),elem.has(true/false)

var set = new Set();
[1,2,3,4,6,2,3,8,1].map(function(elem){
    set.add(elem);
});

for(var i of set){
  console.log(i);  //1,2,3,4,6,8
}
// 去除數組的重復成員
[...new Set(array)]
Array.from將set結構轉為數組這就變成了另一種數組去重
function dedupe(array) { 
    return Array.from(new Set(array));
}
dedupe([1, 1, 2, 3]) // [1, 2, 3]

WeakSet
WeakSet結構與Set類似,也是不重復的值的集合。但是,它與Set有兩個區別。
首先,WeakSet的成員只能是對象,而不能是其他類型的值。
其次,WeakSet中的對象都是弱引用,即垃圾回收機制不考慮WeakSet對該對象的引用,也就是說,如果其他對象都不再引用該對象,那么垃圾回收機制會自動回收該對象所占用的內存,不考慮該對象還存在于WeakSet之中。這個特點意味著,無法引用WeakSet的成員,因此WeakSet是不可遍歷的

作為構造函數,WeakSet可以接受一個數組或類似數組的對象作為參數。(實際上,任何具有iterable接口的對象,都可以作為WeakSet的參數。)該數組的所有成員,都會自動成為WeakSet實例對象的成員。

var a = [[1,2], [3,4]];
var ws = new WeakSet(a);

上面代碼中,a是一個數組,它有兩個成員,也都是數組。將a作WeakSet構造函數的參數,a的成員會自動成為WeakSet的成員。

注意,是a數組的成員成為WeakSet的成員,而不是a數組本身。這意味著,數組的成員只能是對象。

var b = [3, 4];
var ws = new WeakSet(b);// Uncaught TypeError: Invalid value used in weak set(…)

上面代碼中,數組b的成員不是對象,加入WeaKSet就會報錯。

WeakSet沒有size屬性,沒有辦法遍歷它的成員。

var ws = new WeakSet();
ws.size // undefined
ws.forEach // undefined
ws.forEach(function(item){
     console.log('WeakSet has ' + item)})// TypeError: undefined is not a function

上面代碼試圖獲取size和forEach屬性,結果都不能成功。

WeakSet不能遍歷,是因為成員都是弱引用,隨時可能消失,遍歷機制無法保證成員的存在,很可能剛剛遍歷結束,成員就取不到了。WeakSet的一個用處,是儲存DOM節點,而不用擔心這些節點從文檔移除時,會引發內存泄漏。
詳細參考阮一峰set

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容