在JavaScript中,Set
是一种集合数据结构,用于存储独特的值。与数组不同,Set
中的每个值都是唯一的,这意味着集合中不会有重复的元素。接下来,我将详细介绍 Set
的相关知识点。
1. 创建 Set
可以使用 Set
构造函数创建一个新的集合:
const mySet = new Set();
你还可以传递一个可迭代对象(如数组)来初始化集合:
const mySet = new Set([1, 2, 3, 4]);
2. 基本方法
-
add(value)
:向集合中添加一个值。如果值已经存在,则不执行任何操作。mySet.add(5); // 添加值5 mySet.add(1); // 1已经存在,不会重复添加
-
delete(value)
:从集合中删除一个值。如果该值存在,则返回true
,否则返回false
。mySet.delete(2); // 删除值2
-
has(value)
:检查集合中是否存在某个值。返回true
或false
。console.log(mySet.has(3)); // true
-
clear()
:清空集合,删除所有元素。mySet.clear(); // 清空集合
3. 属性
-
size
:返回集合中元素的个数。console.log(mySet.size); // 集合的大小
4. 遍历 Set
Set
是可迭代的,你可以使用 for...of
循环、forEach
方法或解构赋值来遍历 Set
中的元素。
-
for...of
循环:for (const value of mySet) { console.log(value); }
-
forEach
方法:mySet.forEach((value) => { console.log(value); });
-
解构赋值:
const arr = [...mySet]; // 将Set转换为数组
5. Set
与数组的转换
-
数组转换为
Set
:const myArray = [1, 2, 3, 4]; const mySet = new Set(myArray);
-
Set
转换为数组:const mySet = new Set([1, 2, 3, 4]); const myArray = Array.from(mySet);
6. Set
的应用场景
-
数组去重:可以使用
Set
来去除数组中的重复元素。const numbers = [1, 2, 2, 3, 4, 4, 5]; const uniqueNumbers = [...new Set(numbers)]; console.log(uniqueNumbers); // [1, 2, 3, 4, 5]
-
高效查找:由于
Set
内部实现使用了类似哈希表的结构,因此查找元素的效率较高。
7. WeakSet
WeakSet
是 Set
的一种变体,但只能存储对象,并且对象是弱引用(不会阻止垃圾回收)。因此,它通常用于跟踪对象的存在,而不影响对象的生命周期。
-
创建 WeakSet:
const ws = new WeakSet();
-
add
,delete
,has
方法:与Set
类似,但不能使用size
属性,也无法遍历。
8. 注意事项
-
Set
内部元素的比较是基于 “SameValueZero” 算法的,这与严格相等 (===
) 非常相似,但区别在于它将NaN
视为相等。const set = new Set([NaN, NaN]); console.log(set.size); // 1
9. 实际用例
-
交集:两个集合的交集。
const setA = new Set([1, 2, 3]); const setB = new Set([2, 3, 4]); const intersection = new Set([...setA].filter(x => setB.has(x))); console.log(intersection); // Set {2, 3}
-
并集:两个集合的并集。
const union = new Set([...setA, ...setB]); console.log(union); // Set {1, 2, 3, 4}
-
差集:集合
A
相对于集合B
的差集。const difference = new Set([...setA].filter(x => !setB.has(x))); console.log(difference); // Set {1}
总结
Set
是一种非常有用的数据结构,尤其适用于需要存储唯一值、数组去重以及高效查找等场景。通过掌握基本方法和遍历操作,可以在日常编程中更灵活地使用 Set
。