set.prototype.intersection() 尚未被所有主流浏览器和 node.js 原生支持,截至 2024 年底仅部分版本支持,可用扩展运算符加 filter 模拟实现兼容交集。

目前 Set.prototype.intersection() 尚未被所有主流浏览器和 Node.js 版本原生支持(截至 2024 年底,仅 Chrome 120+、Firefox 122+、Safari 17.4+ 及 Node.js 20.12+ 部分支持),直接调用会报错。但你可以用标准 API 快速模拟出等效行为,尤其适合处理大型权限集合(如成百上千个权限字符串)。
用扩展运算符 + filter 实现兼容交集
这是最直观、可读性高且性能尚可的方式,适用于 Set 大小中等(
- 将较小的 Set 转为数组(减少遍历次数),再对较大的 Set 调用
has() -
has()是 O(1) 操作,整体时间复杂度为 O(min(m, n)) - 避免创建中间大数组,内存更友好
示例:
const userPerms = new Set(['read:post', 'write:post', 'delete:comment']); const requiredPerms = new Set(['read:post', 'read:user', 'write:post']); // 手动实现交集 const intersection = new Set( [...(userPerms.size (userPerms.size <h3>用 for...of + has() 实现零分配交集(推荐用于超大集合)</h3> <p>当权限集合可能达数万项(如 RBAC 中的细粒度权限)时,避免扩展运算符生成临时数组能显著降低 GC 压力:</p>
- 手动遍历较小 Set,逐个检查是否存在于较大 Set 中
- 不产生中间数组,堆内存占用恒定
- 在 Node.js 或长时间运行的服务中更稳定
示例:
function setIntersection(a, b) {
const [smaller, larger] = a.size
<h3>结合 WeakSet 或 Map 缓存提升重复计算性能</h3>
<p>若同一用户权限需频繁与不同角色/接口权限比对(如网关鉴权中间件),可预建索引:</p>
- 把常用权限集(如 adminRolePerms、apiV1Perms)缓存为普通 Set
- 对高频查询组合(如
userA ∩ apiV1)用 Map 缓存结果,键可为${user.id}:${apiId} - 权限变更时主动失效对应缓存项,而非全量刷新
注意权限字符串的标准化处理
实际权限常含大小写、前缀、通配符等变体,交集前务必归一化:
- 统一转小写:
perm.toLowerCase() - 展开通配符(如
read:*→['read:user', 'read:post'])需提前完成,Set本身不支持模式匹配 - 避免用 JSON.stringify(object) 作权限标识——对象引用不同即不相等,应使用稳定字符串 key
不复杂但容易忽略。










