Set
对象是 JavaScript 中一个非常有用的数据结构,它允许存储任何类型的唯一值。无论是原始值还是对象引用,Set
都能确保每个值在集合中只出现一次。本文将带你全面了解Set
的特性、用途以及与其他数据结构的对比。
Set、Map 和 Array 的对比
特性 | Set | Map | Array |
---|---|---|---|
数据存储 | 唯一值集合 | 键值对集合 | 有序列表 |
键的类型 | 无键,仅存储值 | 任意类型 | 索引(数字) |
值的类型 | 任意类型 | 任意类型 | 任意类型 |
元素是否唯一 | 是 | 否 | 否 |
迭代顺序 | 插入顺序 | 插入顺序 | 索引顺序 |
访问方式 | has(value) | get(key) | array[index] |
添加元素 | add(value) | set(key, value) | push(value) |
删除元素 | delete(value) | delete(key) | splice(index, 1) |
清空集合 | clear() | clear() | array.length = 0 |
大小属性 | size | size | length |
是否支持重复值 | 否 | 是 | 是 |
常见用途 | 唯一值集合、集合运算 | 键值对存储 | 有序数据列表 |
是否支持迭代器 | 是 | 是 | 是 |
是否支持类集合操作 | 是(如交集、并集等) | 否 | 否 |
适用场景
- Set: 适用于需要存储唯一值的场景,例如去重操作或集合运算。
- Map: 适用于需要存储键值对的场景,例如对象映射或缓存。
- Array: 适用于需要存储有序数据列表的场景,例如列表操作或索引访问。
什么是 Set?
Set
是一个集合(collection),其中的元素是唯一的,并且按照插入顺序存储。它可以存储任何类型的值,包括原始值和对象。
特性
- 唯一性:集合中的每个值只能出现一次。
- 插入顺序:
Set
会按照值插入的顺序进行迭代。 - 零值相等:
Set
使用“零值相等”算法来判断值是否相等,例如0
和-0
被认为是相等的,而NaN
与NaN
也被认为是相等的。
如何使用 Set?
构造函数
// 创建一个空的 Set
const set1 = new Set();
// 使用可迭代对象初始化 Set
const set2 = new Set([1, 2, 3, 4, 5]);
console.log(set2); // Set(5) {1, 2, 3, 4, 5}
常用方法
const set = new Set();
// 添加元素
set.add(1);
set.add(2);
set.add(3);
// 检查元素是否存在
console.log(set.has(2)); // true
console.log(set.has(4)); // false
// 删除元素
set.delete(2);
console.log(set.has(2)); // false
// 获取集合大小
console.log(set.size); // 2
// 清空集合
set.clear();
console.log(set.size); // 0
Set 的高级用法
集合运算
Set
提供了一些方法,可以像数学运算一样操作集合:
- 差集:
A.difference(B)
返回A
中不包含B
的部分。 - 交集:
A.intersection(B)
返回A
和B
的交集。 - 对称差:
A.symmetricDifference(B)
返回(A - B) ∪ (B - A)
。 - 并集:
A.union(B)
返回A
和B
的合集。 - 子集:
A.isSubsetOf(B)
检查A
是否是B
的子集。 - 超集:
A.isSupersetOf(B)
检查A
是否包含B
。
示例
const setA = new Set([1, 2, 3]);
const setB = new Set([3, 4, 5]);
// 并集
const union = new Set([...setA, ...setB]);
console.log(union); // Set(5) {1, 2, 3, 4, 5}
// 交集
const intersection = new Set([...setA].filter(x => setB.has(x)));
console.log(intersection); // Set(1) {3}
// 差集
const difference = new Set([...setA].filter(x => !setB.has(x)));
console.log(difference); // Set(2) {1, 2}
类集合对象
Set
的一些方法(如 union
、intersection
等)要求 this
是一个实际的 Set
实例,但参数只需要是类集合对象。类集合对象需要满足以下条件:
- 拥有
size
属性。 - 拥有
has
方法。 - 拥有
keys
方法,返回集合中元素的迭代器。
例如,Map
是一个类集合对象,因为它具有 size
、has
和 keys
方法。
性能优势
Set
的 has
方法在检查某个值是否存在时,性能优于数组的 includes
方法,尤其是当集合的大小较大时。
示例:从数组中去重
const numbers = [1, 2, 2, 3, 4, 4, 5];
const uniqueNumbers = [...new Set(numbers)];
console.log(uniqueNumbers); // [1, 2, 3, 4, 5]
总结
Set
是一个强大的工具,适用于需要存储唯一值的场景。通过本文的介绍,你应该对 Set
的特性、用法以及与其他数据结构的对比有了更深入的了解。希望你能在实际开发中灵活运用 Set
,提升代码的效率和可读性!