js set 实现
Set 的基本概念
Set 是 ES6 引入的一种新的数据结构,类似于数组,但成员的值都是唯一的,没有重复值。Set 本身是一个构造函数,用来生成 Set 数据结构。
创建 Set
通过 new Set() 构造函数可以创建一个空的 Set。也可以传入一个可迭代对象(如数组)来初始化 Set。
const set1 = new Set();
const set2 = new Set([1, 2, 3, 4, 4]); // 自动去重,set2 包含 1, 2, 3, 4
Set 的常用方法
- add(value): 添加某个值,返回 Set 结构本身。
- delete(value): 删除某个值,返回一个布尔值,表示是否删除成功。
- has(value): 返回一个布尔值,表示该值是否为 Set 的成员。
- clear(): 清除所有成员,没有返回值。
- size: 属性,返回 Set 实例的成员总数。
const set = new Set();
set.add(1).add(2).add(3); // 链式调用
set.has(2); // true
set.delete(2); // true
set.size; // 2
set.clear(); // 清空 Set
Set 的遍历方法
Set 实例有四种遍历方法,可以用于遍历成员:
- keys(): 返回键名的遍历器。
- values(): 返回键值的遍历器(Set 的键和值是同一个值)。
- entries(): 返回键值对的遍历器。
- forEach(): 使用回调函数遍历每个成员。
const set = new Set([1, 2, 3]);
for (let item of set.keys()) {
console.log(item); // 1, 2, 3
}
for (let item of set.values()) {
console.log(item); // 1, 2, 3
}
for (let item of set.entries()) {
console.log(item); // [1, 1], [2, 2], [3, 3]
}
set.forEach((value, key) => {
console.log(key, value); // 1 1, 2 2, 3 3
});
Set 的应用场景
-
数组去重
Set 可以轻松实现数组去重。const arr = [1, 2, 2, 3, 4, 4]; const uniqueArr = [...new Set(arr)]; // [1, 2, 3, 4] -
存储唯一值
适用于需要存储不重复数据的场景,如用户 ID、标签等。 -
集合运算
可以通过 Set 实现并集、交集、差集等操作。const setA = new Set([1, 2, 3]); const setB = new Set([2, 3, 4]); // 并集 const union = new Set([...setA, ...setB]); // Set {1, 2, 3, 4} // 交集 const intersection = new Set([...setA].filter(x => setB.has(x))); // Set {2, 3} // 差集(A 有而 B 没有) const difference = new Set([...setA].filter(x => !setB.has(x))); // Set {1}
WeakSet
WeakSet 是 Set 的变体,主要区别在于:
- WeakSet 的成员只能是对象。
- WeakSet 中的对象是弱引用,不会阻止垃圾回收。
- WeakSet 不可遍历,没有
size属性和遍历方法。
const weakSet = new WeakSet();
const obj = {};
weakSet.add(obj);
weakSet.has(obj); // true
weakSet.delete(obj); // true






