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

你可能感兴趣的:(Set、WeakSet,Map、WeakMap)