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 实例之中。