跳到主要内容

Set 是什么,有什么作用?

面试速答(30 秒版 TL;DR)

  • Set 是“值的集合”,特点是元素唯一(不重复)。
  • 适合做:去重、成员检测(has)、集合运算(交并差,手写即可)。
  • 迭代顺序是按插入顺序size 直接读数量。

为什么不用 Array 去做?

Array 去重/查找通常是 O(n),而 Set 的 has/add/delete 平均是 O(1)(实现上通常是哈希结构),更适合做频繁成员判断。


最小例子:去重与成员检测

const arr = [1, 2, 2, 3, 3, 3];
const s = new Set(arr);

console.log(s.size); // 3
console.log([...s]); // [1, 2, 3]
console.log(s.has(2)); // true

典型题:集合运算(交集/并集/差集)

const a = new Set([1, 2, 3]);
const b = new Set([2, 3, 4]);

const union = new Set([...a, ...b]); // 并集
const intersect = new Set([...a].filter((x) => b.has(x))); // 交集
const diff = new Set([...a].filter((x) => !b.has(x))); // 差集(a - b)

console.log([...union]); // [1,2,3,4]
console.log([...intersect]); // [2,3]
console.log([...diff]); // [1]

常见追问

  • Set 的“相等性”规则接近 SameValueZero
    • NaN 会被当作同一个值(Set 里不会出现多个 NaN)。
    • +0-0 视为同一个值。

易错点/坑

  • Set 里存对象时,唯一性取决于引用是否相同,不是“结构相等”:
const s = new Set();
s.add({a: 1});
s.add({a: 1});
console.log(s.size); // 2

速记要点(可背诵)

  • Set:值唯一的集合,去重和 has 成员检测很常用;对象唯一性按引用比较。