[...new set(arr)] 是最简洁高效的数组去重方法,利用 set 自动去重特性及扩展运算符转回数组,支持基础类型且保持首次出现顺序,但不适用于对象等引用类型。

直接用 [...new Set(arr)] 就行。这是目前最简洁、可读性高、兼容性足够(现代浏览器和 Node.js 12+)的写法。
为什么这行代码能去重
Set 是 ES6 新增的数据结构,它的核心特性是「自动拒绝重复值」——只要把数组传进去,重复项就被天然过滤掉了。但 Set 本身不是数组,不能直接调用 map、filter 等方法,所以得转回来。
扩展运算符 ... 的作用,就是把任何可迭代对象(比如 Set、Map、字符串)里的每个值“摊开”,放进新数组里。它内部调用的是对象的 Symbol.iterator 接口,而 Set 正好实现了这个接口。
两种等效写法对比
下面两行效果完全一样,都是一行搞定:
-
[...new Set(arr)]—— 更常用,写法更紧凑 -
Array.from(new Set(arr))—— 语义更明确,适合需要兼容旧环境或做额外处理的场景(比如传第二个参数做映射)
需要注意的几个细节
这个方法对基础类型(数字、字符串、布尔值、null、undefined)去重很稳,但有几点要留心:
- 它不区分
42和"42",因为 Set 内部用的是严格相等(===)判断,类型不同即视为不同值 - 无法处理对象、函数、NaN 或 Symbol 类型的去重——因为对象每次都是新引用,
{a:1} !== {a:1};而 NaN 在 Set 中能被正确识别为相同值(这是 Set 的一个特殊行为) - 会保持原始数组中首次出现的顺序,不是随机打乱
简单例子直接上手
比如你有这个数组:
const arr = [1, 2, 2, '2', 3, 3, undefined, undefined, null, null];const unique = [...new Set(arr)];// 结果:[1, 2, "2", 3, undefined, null]











