在 2026 年你可以使用的新的 JavaScript Set API

在 2026 年你可以使用的新的 JavaScript Set API

Set 新添加了一些好用的 API,我们一起来看看吧!

在 JavaScript 中,Set 一直是我们处理唯一值集合的好帮手。但在过去,如果我们想要对两个 Set 进行并集、交集等操作,往往需要手动实现,代码既繁琐又容易出错。

好消息是,随着 ES2025 的正式标准化,Set 新增了一批实用的集合操作方法。到 2026 年,这些 API 已经得到了所有主流浏览器的全面支持,我们可以放心地在生产环境中使用了!

本文将带你逐一认识这些新方法,通过"手写实现 vs 原生 API"的对比方式,让你不仅会用,还能理解其背后的实现原理。

并集 union

自己实现

js
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'}

原生

js
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

自己实现

js
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'}

原生

js
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

自己实现

js
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'}

原生

js
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

自己实现

js
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'}

原生

js
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

自己实现

js
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

原生

js
const A = new Set(['a'])
const B = new Set(['a','b','c'])
const result = A.isSubsetOf(B)
console.log(result) // true

是否是超集 isSupersetOf

自己实现

js
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

原生

js
const A = new Set(['a','b','c'])
const B = new Set(['a'])
const result = A.isSupersetOf(B)
console.log(result) // true

是否有交集 isDisjointFrom

自己实现

js
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

原生

js
const A = new Set(['b','c'])
const B = new Set(['d','e'])
const result = A.isDisjointFrom(B)
console.log(result) // true

特性

  1. 都不会修改原有的Set: 所有的方法都返回新的Set实例,不会改变原有的Set
  2. 链式调用

使用建议

原生 API 在底层经过了 JavaScript 引擎的优化,通常比手写实现更快。特别是处理大型 Set 时,性能差距会更加明显。

具体能否使用,可以在 caniuse 查查,如果你需要支持更旧的环境,可以使用对应的 polyfill

新故事即将发生
AirPods 4 VS AirPods pro 3

评论区

评论加载中...