Set去重最简洁高效,一行代码即可实现:[...new Set(arr)]或Array.from(new Set(arr));对原始值严格去重且保持顺序,但对象按引用而非内容去重,NaN和+0/-0自动归一。

用 Set 去重是 JavaScript 中最简洁、性能也较好的方式,核心在于利用 Set 自动忽略重复值的特性。
直接转成数组是最常用方法
Set 构造函数能接收任意可迭代对象(包括数组),自动去重;再用扩展运算符或 Array.from() 转回数组。
[...new Set([1, 2, 2, 3, 3])] → [1, 2, 3]Array.from(new Set([1, 2, 2, 3])) → [1, 2, 3]
两者性能接近,扩展运算符写法更短,Array.from() 支持传入映射函数(如 Array.from(new Set(arr), x => x * 2)),适合需要同步处理的场景。
保持原始顺序且兼容所有类型
Set 按插入顺序存储元素,所以去重后顺序不变。它对基本类型(数字、字符串、布尔值)和引用类型(对象、数组)都有效,但要注意:对象去重基于引用而非内容。
立即学习“Java免费学习笔记(深入)”;
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
[...new Set(['a', 'b', 'a'])] → ['a', 'b'](字符串没问题) -
[...new Set([{x:1}, {x:1}])] → [{x:1}, {x:1}](两个对象引用不同,不会去重)
若需按内容去重对象数组,得先序列化或自定义逻辑,Set 本身不处理深层比较。
处理特殊值要留意
Set 认为 +0 和 -0 相同,NaN 只保留一个(这是 ES6 规范行为,和 === 不同)。
[...new Set([0, -0, NaN, NaN])] → [0, NaN]
多数业务场景下这符合预期,但如果需要区分 +0 和 -0,就得换用 Map 或手动遍历判断。
大数据量时注意内存与性能平衡
Set 的插入和查重时间复杂度接近 O(1),整体去重是 O(n),比双层循环或 filter + indexOf 的 O(n²) 高效得多。
- 几万以内数据,
[...new Set(arr)]完全够用 - 超十万级且内存敏感时,可考虑流式处理或分块,但一般没必要提前优化
避免在循环中反复创建 Set,应一次性构建。

















