在 JavaScript 中,Set 一直是我们处理唯一值集合的好帮手。但在过去,如果我们想要对两个 Set 进行并集、交集等操作,往往需要手动实现,代码既繁琐又容易出错。
好消息是,随着 ES2025 的正式标准化,Set 新增了一批实用的集合操作方法。到 2026 年,这些 API 已经得到了所有主流浏览器的全面支持,我们可以放心地在生产环境中使用了!
本文将带你逐一认识这些新方法,通过"手写实现 vs 原生 API"的对比方式,让你不仅会用,还能理解其背后的实现原理。
并集 union

自己实现
const A = new Set(['a','b','c'])
const B = new Set(['a','d','e'])
function union(a,b) {
return new Set([...a,...b])
}
const C = union(A,B)
console.log(C) // Set(5) {'a', 'b', 'c', 'd', 'e'}
原生
const A = new Set(['a','b','c'])
const B = new Set(['a','d','e'])
const C = A.union(B)
console.log(C) // Set(5) {'a', 'b', 'c', 'd', 'e'}
交集 intersection

自己实现
const A = new Set(['a','b','c'])
const B = new Set(['a','d','e'])
function intersection(a,b) {
const includeSet = b instanceof Set ? b : new Set(b)
const [smaller, larger] = a.size < b.size ? [a,includeSet] : [includeSet,a]
const result = new Set()
for(const item of smaller) {
if (larger.has(item)) result.add(item)
}
return result
}
const C = intersection(A,B);
console.log(C) // Set(1) {'a'}
原生
const A = new Set(['a','b','c'])
const B = new Set(['a','d','e'])
const C = A.intersection(B)
console.log(C) // Set(1) {'a'}
差集 difference

自己实现
const A = new Set(['a','b','c'])
const B = new Set(['a','d','e'])
function difference(a,b) {
const excludeSet = b instanceof Set ? b : new Set(b)
return new Set([...a].filter(item => !(excludeSet.has(item))))
}
const C = difference(A,B);
console.log(C) // Set(2) {'b','c'}
原生
const A = new Set(['a','b','c'])
const B = new Set(['a','d','e'])
const C = A.difference(B)
console.log(C) // Set(2) {'b','c'}
对称差集 symmetricDifference

自己实现
const A = new Set(['a','b','c'])
const B = new Set(['a','d','e'])
function symmetricDifference(a,b) {
const result = new Set(a)
for(const item of b) {
if (result.has(item)) result.delete(item)
else result.add(item)
}
return result
}
const C = symmetricDifference(A,B)
console.log(C) // Set(4) {'b','c','d','e'}
原生
const A = new Set(['a','b','c'])
const B = new Set(['a','d','e'])
const C = A.symmetricDifference(B)
console.log(C) // Set(4) {'b','c','d','e'}
是否是子集 isSubsetOf

自己实现
const A = new Set(['a'])
const B = new Set(['a','b','c'])
function isSubsetOf(a,b) {
if (b instanceof Set && a.size > b.size) return false
for(const item of a) {
if (!b.has(item)) return false
}
return true
}
const result = isSubsetOf(A,B)
console.log(result) // true
原生
const A = new Set(['a']) const B = new Set(['a','b','c']) const result = A.isSubsetOf(B) console.log(result) // true
是否是超集 isSupersetOf

自己实现
const A = new Set(['a','b','c'])
const B = new Set(['a'])
function isSupersetOf(a,b) {
if (b instanceof Set && b.size > a.size) return false
for(const item of b) {
if (!a.has(item)) return false
}
return true
}
const result = isSupersetOf(A,B)
console.log(result) // true
原生
const A = new Set(['a','b','c']) const B = new Set(['a']) const result = A.isSupersetOf(B) console.log(result) // true
是否有交集 isDisjointFrom

自己实现
const A = new Set(['b','c'])
const B = new Set(['d','e'])
function isDisjointFrom(a, b) {
// 迭代较小的集合,减少查找次数
const [smaller, larger] = a.size < b.size ? [a, b] : [b, a];
for (const item of smaller) {
if (larger.has(item)) return false;
}
return true;
}
const result = isDisjointFrom(A,B)
console.log(result) // true
原生
const A = new Set(['b','c']) const B = new Set(['d','e']) const result = A.isDisjointFrom(B) console.log(result) // true
特性
- 都不会修改原有的Set: 所有的方法都返回新的Set实例,不会改变原有的Set
- 链式调用
使用建议
原生 API 在底层经过了 JavaScript 引擎的优化,通常比手写实现更快。特别是处理大型 Set 时,性能差距会更加明显。

评论区
评论加载中...