Set结构的实例有以下属性:
- Set.prototype.constructor:构造函数,默认是Set函数;
- Set.prototype.size:返回Set实例的成员总数。
Set实例的方法分为以下两大类:操作方法和遍历方法。下面先介绍4个操作方法:
- add(value):添加某个值,返回Set结构本身;
- delete(value):删除某个值,返回一个布尔值,表示删除是否成功;
- has(value):返回一个布尔值,表示参数是否为Set的成员;
- clear():清除所有成员,没有返回值。
s.add(1).add(2).add(2);
s.size //2
s.has(1) //true
s.has(2) //true
s.has(3) //false
s.delete(2)
s.has(2) //false
Array.from方法可以将Set结构转为数组。
const items = new Set([1, 2, 3, 4, 5])
const array = Array.from(items)
这就提供了一种去除数组重复元素的方法。
function dedupe(array) {
return Array.from(new Set(array))
}
遍历操作
Set结构的实例有4个遍历方法,可用于遍历成员。
- keys():返回键名的遍历器;
- values():返回键值的遍历器;
- entries():返回键值对的遍历器;
- forEach():使用回调函数遍历每个成员。
需要特别指出的是,Set的遍历顺序就是插入顺序。
keys()、values()、entries()
let set = new Set(['red', 'green', 'blue'])
for(let item of set.keys()) {
console.log(item);
}
//red
//green
//blue
for(let item of set.values()) {
console.log(item);
}
//red
//green
//blue
for(let item of set.entries()) {
console.log(item);
}
//['red', 'red']
//['green', 'green']
//['blue', 'blue']
Set结构的实例默认可遍历,其默认遍历器生成函数就是它的values()方法。
Set.prototype[Symbol.iterator] === Set.prototype.values
//true
这意味着,可以省略values方法,直接用for ... of循环遍历Set。
另外,使用Set可以很容易地实现并集,交集和差集。
let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])
//并集
let union = new Set([...a, ...b])
// Set {1, 2, 3, 4}
//交集
let intersect = new Set([...a].filter(x => b.has(x)))
// Set {2, 3}
//差集
let difference = new Set([...a].filter(x => !b.has(x)))
WeakSet
1. 含义
- WeakSet的成员只能是对象,而不能是其他类型的值;
- WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存。ES6规定WeakSet不可遍历。
2. 语法
WeakSet是一个构造函数,可以使用new命令创建WeakSet数据结构。
const ws = new WeakSet();
它有以下三个方法:
- WeakSet.prototype.add(value): 向WeakSet实例添加一个新成员;
- WeakSet.prototype.delete(value): 清除WeakSet实例的指定成员;
- WeakSet.prototype.has(value): 返回一个布尔值,表示某个值是否在WeakSet实例中。