最直接的方法是用 isSubsetOf() 或 isSupersetOf(),时间复杂度接近 O(n),语义清晰且已优化;空集恒为任意集合的子集;不支持时可用 [...setA].every(item => setB.has(item)) 手动实现。

用 isSubsetOf() 或 isSupersetOf() 方法最直接,时间复杂度接近 O(n),比手动遍历更简洁、语义更清晰。
判断 setA 是否为 setB 的子集(setA ⊆ setB)
调用 setA.isSubsetOf(setB),返回 true 表示 setA 中每个元素都在 setB 中。
- 这是标准方法,无需自己写循环,可读性强
- 底层已做优化,对大型集合也高效
- 注意:空集是任何集合的子集,
new Set().isSubsetOf(otherSet)恒为 true
判断 setA 是否为 setB 的超集(setA ⊇ setB)
调用 setA.isSupersetOf(setB),等价于 setB.isSubsetOf(setA)。
- 适合验证“主集合是否覆盖全部目标元素”场景,比如权限校验、配置项兜底检查
- 如果 setB 是动态生成的(如用户选中的标签),用这个方法能一语断定是否全被包含
兼容旧环境时的手动实现
若运行环境不支持新方法(如部分 Node.js 版本或旧浏览器),可用 has() 配合 every():
-
[...setA].every(item => setB.has(item))—— 判断 setA ⊆ setB - 避免用
Array.from(setA).includes(),因为has()是 O(1),而includes()在数组中是 O(n) - 提前退出:一旦遇到不存在的元素,
every()立即返回 false,不用遍历完
常见误区提醒
别混淆「相等」和「包含」:两个集合元素完全相同(setA.size === setB.size && setA.isSubsetOf(setB))才叫相等;仅元素重合不等于包含。
-
setA.intersection(setB).size === setA.size也能判断子集,但多一次构造交集集合的开销,不推荐 - 不要用
JSON.stringify([...setA]) === JSON.stringify([...setB])判包含——顺序不确定,且无法处理对象、NaN 等特殊值











