[{"data":1,"prerenderedAt":333},["ShallowReactive",2],{"content:\u002Fposts\u002F2026\u002Fthe-latest-js-set-api-you-can-use-in-2026":3,"surround:\u002Fposts\u002F2026\u002Fthe-latest-js-set-api-you-can-use-in-2026":321},{"id":4,"title":5,"body":6,"canonical":299,"categories":300,"date":302,"description":303,"draft":304,"extension":305,"image":306,"meta":307,"navigation":308,"path":309,"permalink":299,"readingTime":310,"recommend":299,"references":299,"seo":315,"sitemap":316,"stem":317,"tags":318,"type":299,"updated":302,"__hash__":320},"content\u002Fposts\u002F2026\u002Fthe-latest-js-set-api-you-can-use-in-2026.md","在 2026 年你可以使用的新的 JavaScript Set API",{"type":7,"value":8,"toc":264},"minimark",[9,18,29,32,37,44,48,57,60,66,70,75,78,84,87,93,97,102,105,111,114,120,124,129,132,138,141,147,151,156,159,165,168,174,178,183,186,192,195,201,205,210,213,219,222,228,231,241,244,247],[10,11,12,13,17],"p",{},"在 JavaScript 中，",[14,15,16],"code",{"code":16},"Set"," 一直是我们处理唯一值集合的好帮手。但在过去，如果我们想要对两个 Set 进行并集、交集等操作，往往需要手动实现，代码既繁琐又容易出错。",[10,19,20,21,25,26,28],{},"好消息是，随着 ",[22,23,24],"strong",{},"ES2025"," 的正式标准化，",[14,27,16],{"code":16}," 新增了一批实用的集合操作方法。到 2026 年，这些 API 已经得到了所有主流浏览器的全面支持，我们可以放心地在生产环境中使用了！",[10,30,31],{},"本文将带你逐一认识这些新方法，通过\"手写实现 vs 原生 API\"的对比方式，让你不仅会用，还能理解其背后的实现原理。",[33,34,36],"h2",{"id":35},"并集-union","并集 union",[10,38,39],{},[40,41],"img",{"alt":42,"src":43},"","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002Fset-union.jpg",[45,46,47],"h3",{"id":47},"自己实现",[49,50,55],"pre",{"className":51,"code":53,"language":54,"meta":42},[52],"language-js","const A = new Set(['a','b','c'])\nconst B = new Set(['a','d','e'])\n\nfunction union(a,b) {\n  return new Set([...a,...b])\n}\n\nconst C = union(A,B)\nconsole.log(C) \u002F\u002F Set(5) {'a', 'b', 'c', 'd', 'e'}\n","js",[14,56,53],{"__ignoreMap":42},[45,58,59],{"id":59},"原生",[49,61,64],{"className":62,"code":63,"language":54,"meta":42},[52],"const A = new Set(['a','b','c'])\nconst B = new Set(['a','d','e'])\nconst C = A.union(B) \nconsole.log(C) \u002F\u002F Set(5) {'a', 'b', 'c', 'd', 'e'}\n",[14,65,63],{"__ignoreMap":42},[33,67,69],{"id":68},"交集-intersection","交集 intersection",[10,71,72],{},[40,73],{"alt":42,"src":74},"https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002Fset-intersection.jpg",[45,76,47],{"id":77},"自己实现-1",[49,79,82],{"className":80,"code":81,"language":54,"meta":42},[52],"const A = new Set(['a','b','c'])\nconst B = new Set(['a','d','e'])\nfunction intersection(a,b) {\n  const includeSet = b instanceof Set ? b : new Set(b)\n  const [smaller, larger] = a.size \u003C b.size ? [a,includeSet] : [includeSet,a]\n  const result = new Set()\n  for(const item of smaller) {\n    if (larger.has(item)) result.add(item)\n  }\n  return result\n}\nconst C = intersection(A,B);\nconsole.log(C) \u002F\u002F Set(1) {'a'}\n",[14,83,81],{"__ignoreMap":42},[45,85,59],{"id":86},"原生-1",[49,88,91],{"className":89,"code":90,"language":54,"meta":42},[52],"const A = new Set(['a','b','c'])\nconst B = new Set(['a','d','e'])\nconst C = A.intersection(B)\nconsole.log(C) \u002F\u002F Set(1) {'a'}\n",[14,92,90],{"__ignoreMap":42},[33,94,96],{"id":95},"差集-difference","差集 difference",[10,98,99],{},[40,100],{"alt":42,"src":101},"https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002Fset-difference.jpg",[45,103,47],{"id":104},"自己实现-2",[49,106,109],{"className":107,"code":108,"language":54,"meta":42},[52],"const A = new Set(['a','b','c'])\nconst B = new Set(['a','d','e'])\nfunction difference(a,b) {\n  const excludeSet = b instanceof Set ? b : new Set(b)\n  return new Set([...a].filter(item => !(excludeSet.has(item))))\n}\nconst C = difference(A,B);\nconsole.log(C) \u002F\u002F Set(2) {'b','c'}\n",[14,110,108],{"__ignoreMap":42},[45,112,59],{"id":113},"原生-2",[49,115,118],{"className":116,"code":117,"language":54,"meta":42},[52],"const A = new Set(['a','b','c'])\nconst B = new Set(['a','d','e'])\nconst C = A.difference(B)\nconsole.log(C) \u002F\u002F Set(2) {'b','c'}\n",[14,119,117],{"__ignoreMap":42},[33,121,123],{"id":122},"对称差集-symmetricdifference","对称差集 symmetricDifference",[10,125,126],{},[40,127],{"alt":42,"src":128},"https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002Fset-symmetric-difference.jpg",[45,130,47],{"id":131},"自己实现-3",[49,133,136],{"className":134,"code":135,"language":54,"meta":42},[52],"const A = new Set(['a','b','c'])\nconst B = new Set(['a','d','e'])\nfunction symmetricDifference(a,b) {\n  const result = new Set(a)\n    for(const item of b) {\n      if (result.has(item)) result.delete(item)\n      else result.add(item)\n    }\n  return result\n}\nconst C = symmetricDifference(A,B)\nconsole.log(C) \u002F\u002F  Set(4) {'b','c','d','e'}\n",[14,137,135],{"__ignoreMap":42},[45,139,59],{"id":140},"原生-3",[49,142,145],{"className":143,"code":144,"language":54,"meta":42},[52],"const A = new Set(['a','b','c'])\nconst B = new Set(['a','d','e'])\nconst C = A.symmetricDifference(B)\nconsole.log(C) \u002F\u002F Set(4) {'b','c','d','e'}\n",[14,146,144],{"__ignoreMap":42},[33,148,150],{"id":149},"是否是子集-issubsetof","是否是子集 isSubsetOf",[10,152,153],{},[40,154],{"alt":42,"src":155},"https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002Fset-is-subset-of.jpg",[45,157,47],{"id":158},"自己实现-4",[49,160,163],{"className":161,"code":162,"language":54,"meta":42},[52],"const A = new Set(['a'])\nconst B = new Set(['a','b','c'])\nfunction isSubsetOf(a,b) {\n  if (b instanceof Set && a.size > b.size) return false\n  for(const item of a) {\n    if (!b.has(item)) return false\n  }\n  return true\n}\nconst result = isSubsetOf(A,B)\nconsole.log(result) \u002F\u002F true\n",[14,164,162],{"__ignoreMap":42},[45,166,59],{"id":167},"原生-4",[49,169,172],{"className":170,"code":171,"language":54,"meta":42},[52],"const A = new Set(['a'])\nconst B = new Set(['a','b','c'])\nconst result = A.isSubsetOf(B)\nconsole.log(result) \u002F\u002F true\n",[14,173,171],{"__ignoreMap":42},[33,175,177],{"id":176},"是否是超集-issupersetof","是否是超集 isSupersetOf",[10,179,180],{},[40,181],{"alt":42,"src":182},"https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002Fset-is-superset-of.jpg",[45,184,47],{"id":185},"自己实现-5",[49,187,190],{"className":188,"code":189,"language":54,"meta":42},[52],"const A = new Set(['a','b','c'])\nconst B = new Set(['a'])\nfunction isSupersetOf(a,b) {\n  if (b instanceof Set && b.size > a.size) return false\n  for(const item of b) {\n    if (!a.has(item)) return false\n  }\n  return true\n}\nconst result = isSupersetOf(A,B)\nconsole.log(result) \u002F\u002F true\n",[14,191,189],{"__ignoreMap":42},[45,193,59],{"id":194},"原生-5",[49,196,199],{"className":197,"code":198,"language":54,"meta":42},[52],"const A = new Set(['a','b','c'])\nconst B = new Set(['a'])\nconst result = A.isSupersetOf(B)\nconsole.log(result) \u002F\u002F true\n",[14,200,198],{"__ignoreMap":42},[33,202,204],{"id":203},"是否有交集-isdisjointfrom","是否有交集 isDisjointFrom",[10,206,207],{},[40,208],{"alt":42,"src":209},"https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002Fset-is-disjoint-from.jpg",[45,211,47],{"id":212},"自己实现-6",[49,214,217],{"className":215,"code":216,"language":54,"meta":42},[52],"const A = new Set(['b','c'])\nconst B = new Set(['d','e'])\nfunction isDisjointFrom(a, b) {\n  \u002F\u002F 迭代较小的集合，减少查找次数\n  const [smaller, larger] = a.size \u003C b.size ? [a, b] : [b, a];\n  for (const item of smaller) {\n    if (larger.has(item)) return false;\n  }\n  return true;\n}\nconst result = isDisjointFrom(A,B)\nconsole.log(result) \u002F\u002F true\n",[14,218,216],{"__ignoreMap":42},[45,220,59],{"id":221},"原生-6",[49,223,226],{"className":224,"code":225,"language":54,"meta":42},[52],"const A = new Set(['b','c'])\nconst B = new Set(['d','e'])\nconst result = A.isDisjointFrom(B)\nconsole.log(result) \u002F\u002F true\n",[14,227,225],{"__ignoreMap":42},[33,229,230],{"id":230},"特性",[232,233,234,238],"ol",{},[235,236,237],"li",{},"都不会修改原有的Set: 所有的方法都返回新的Set实例，不会改变原有的Set",[235,239,240],{},"链式调用",[33,242,243],{"id":243},"使用建议",[10,245,246],{},"原生 API 在底层经过了 JavaScript 引擎的优化，通常比手写实现更快。特别是处理大型 Set 时，性能差距会更加明显。",[10,248,249,250,257,258,263],{},"具体能否使用，可以在 ",[251,252,256],"a",{"href":253,"rel":254},"https:\u002F\u002Fcaniuse.com\u002F",[255],"nofollow","caniuse"," 查查，如果你需要支持更旧的环境，可以使用对应的 ",[251,259,262],{"href":260,"rel":261},"https:\u002F\u002Fgithub.com\u002Fes-shims",[255],"polyfill","。",{"title":42,"searchDepth":265,"depth":265,"links":266},4,[267,273,277,281,285,289,293,297,298],{"id":35,"depth":268,"text":36,"children":269},2,[270,272],{"id":47,"depth":271,"text":47},3,{"id":59,"depth":271,"text":59},{"id":68,"depth":268,"text":69,"children":274},[275,276],{"id":77,"depth":271,"text":47},{"id":86,"depth":271,"text":59},{"id":95,"depth":268,"text":96,"children":278},[279,280],{"id":104,"depth":271,"text":47},{"id":113,"depth":271,"text":59},{"id":122,"depth":268,"text":123,"children":282},[283,284],{"id":131,"depth":271,"text":47},{"id":140,"depth":271,"text":59},{"id":149,"depth":268,"text":150,"children":286},[287,288],{"id":158,"depth":271,"text":47},{"id":167,"depth":271,"text":59},{"id":176,"depth":268,"text":177,"children":290},[291,292],{"id":185,"depth":271,"text":47},{"id":194,"depth":271,"text":59},{"id":203,"depth":268,"text":204,"children":294},[295,296],{"id":212,"depth":271,"text":47},{"id":221,"depth":271,"text":59},{"id":230,"depth":268,"text":230},{"id":243,"depth":268,"text":243},null,[301],"代码","2026-07-02 22:17:50","Set 新添加了一些好用的 API，我们一起来看看吧！",false,"md","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002Fthe-latest-js-set-api-you-can-use-in-2026.webp",{},true,"\u002Fposts\u002F2026\u002Fthe-latest-js-set-api-you-can-use-in-2026",{"text":311,"minutes":312,"time":313,"words":314},"4 min read",3.995,239700,799,{"title":5,"description":303},{"loc":309},"posts\u002F2026\u002Fthe-latest-js-set-api-you-can-use-in-2026",[319],"JavaScript","fgPHq2o7OJCdmaK5aDImqrsuoqQkYBAfldIhpyXJ9j0",[322,328],{"title":323,"path":324,"stem":325,"date":326,"type":327,"children":-1},"AirPods 4 VS AirPods pro 3","\u002Fposts\u002F2026\u002Fair-pods-4-vs-air-pods-pro-3","posts\u002F2026\u002Fair-pods-4-vs-air-pods-pro-3","2026-05-23 16:35:56","story",{"title":329,"path":330,"stem":331,"date":332,"type":299,"children":-1},"手把手教你如何为 shadcn-vue 贡献代码","\u002Fposts\u002F2026\u002Fhow-to-contribute-to-shadcn-vue","posts\u002F2026\u002Fhow-to-contribute-to-shadcn-vue","2026-07-04 18:30:54",1783165398751]