Set 概述
Set
是一种类似数组的数据结构,但是成员的值都是唯一的,没有重复的。内部判断值是否唯一采用的是类似于严格相等
的算法,唯一不同的是严格相等
中NaN
不等于自身,而set
中认为是相等的。
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
for (let i of s) {
console.log(i);
}
- 可以接收一个
数组(或者具有Iterator接口的其他数据结构)
作为参数,用来初始化。
const set = new Set([1, 2, 3, 4, 4]);
[...set]
const set = new Set(document.querySelectorAll('div'));
set.size
const arr = [2, 3, 5, 4, 5, 2, 2];
[...new Set(arr)]
实例属性
constructor
size
const set = new Set([1, 2, 3, 4, 4]);
set.size
实例操作方法
add()
const set = new Set();
set.add(1)
delete()
const set = new Set();
set.add(1)
set.delete(1)
set.delete(1)
set
has()
const set = new Set();
let obj = {};
set.add(obj);
set.has(obj);
clear()
const set = new Set();
let obj = {};
set.add(obj);
set.clear()
实例遍历方法
Set
的遍历顺序就是插入顺序。keys()
、values()
、entries()
返回的都是遍历器对象(Iterator)。
keys()
values()
entries()
let set = new Set(['red', 'green', 'blue']);
set.keys()
set.values()
set.entries()
for (let item of set.keys()) {
console.log(item);
}
for (let item of set.values()) {
console.log(item);
}
for (let item of set.entries()) {
console.log(item);
}
forEach()
- 使用回调函数遍历每个成员。
Set
结构的键名就是键值,因此参数一与参数二的值永远都是一样的。
```js
let set = new Set(['red', 'green', 'blue']);
set.forEach((item, index) => {
console.log(item, index)
})
let set = new Set(['red', 'green', 'blue']);
for (let x of set) {
console.log(x);
}
Set 求并、交、差集
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
let union = new Set([...a, ...b]);
union
let intersect = [...a].filter(item => b.has(item));
intersect
let diff = [...a].filter(item => !b.has(item));
diff
WeakSet 概述
- 与
Set
数据结构类似,也是不重复的值的集合。区别一是WeakSet
的成员只能是对象
和Symbol
值;区别二是WeakSet
中的对象都是弱引用
,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于WeakSet
中。
- 没有
size
属性,也无法遍历。
const ws = new WeakSet();
ws.add(1)
ws.add({})
ws.add(Symbol('foo'))
实例操作方法
add()
delete()
- 清除 WeakSet 实例的指定成员,成功返回
true
,找不到返回false
。
has()
- 返回一个布尔值,表示某个值是否在 WeakSet 实例之中。