ES6提供了新的數(shù)據(jù)結(jié)構(gòu)Set隐孽。它類似于數(shù)組癌椿,但是成員的值都是唯一的,沒有重復的值菱阵。
Set本身是一個構(gòu)造函數(shù)踢俄,用來生成Set數(shù)據(jù)結(jié)構(gòu)。
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
}
// 去除數(shù)組的重復成員
[...new Set(array)]
Array.from將set結(jié)構(gòu)轉(zhuǎn)為數(shù)組這就變成了另一種數(shù)組去重
function dedupe(array) {
return Array.from(new Set(array));
}
dedupe([1, 1, 2, 3]) // [1, 2, 3]
WeakSet
WeakSet結(jié)構(gòu)與Set類似,也是不重復的值的集合虑稼。但是琳钉,它與Set有兩個區(qū)別。
首先蛛倦,WeakSet的成員只能是對象歌懒,而不能是其他類型的值。
其次溯壶,WeakSet中的對象都是弱引用及皂,即垃圾回收機制不考慮WeakSet對該對象的引用,也就是說茸塞,如果其他對象都不再引用該對象躲庄,那么垃圾回收機制會自動回收該對象所占用的內(nèi)存,不考慮該對象還存在于WeakSet之中钾虐。這個特點意味著噪窘,無法引用WeakSet的成員,因此WeakSet是不可遍歷的
作為構(gòu)造函數(shù),WeakSet可以接受一個數(shù)組或類似數(shù)組的對象作為參數(shù)倔监。(實際上直砂,任何具有iterable接口的對象,都可以作為WeakSet的參數(shù)浩习。)該數(shù)組的所有成員静暂,都會自動成為WeakSet實例對象的成員。
var a = [[1,2], [3,4]];
var ws = new WeakSet(a);
上面代碼中谱秽,a是一個數(shù)組洽蛀,它有兩個成員,也都是數(shù)組疟赊。將a作WeakSet構(gòu)造函數(shù)的參數(shù)郊供,a的成員會自動成為WeakSet的成員。
注意近哟,是a數(shù)組的成員成為WeakSet的成員驮审,而不是a數(shù)組本身。這意味著吉执,數(shù)組的成員只能是對象疯淫。
var b = [3, 4];
var ws = new WeakSet(b);// Uncaught TypeError: Invalid value used in weak set(…)
上面代碼中,數(shù)組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屬性适掰,結(jié)果都不能成功。
WeakSet不能遍歷荠列,是因為成員都是弱引用类浪,隨時可能消失,遍歷機制無法保證成員的存在费就,很可能剛剛遍歷結(jié)束,成員就取不到了力细。WeakSet的一個用處,是儲存DOM節(jié)點眠蚂,而不用擔心這些節(jié)點從文檔移除時,會引發(fā)內(nèi)存泄漏斗躏。
詳細參考阮一峰set