用扩展运算符配合Set去重是JS中最简洁常用的方法:const uniqueArr = [...new Set(arr)];它基于SameValueZero比较,能正确处理NaN、0与-0,但对对象数组无效,因Set按引用而非内容去重。

用扩展运算符配合 Set 去重,是 JS 中最简洁、常用的方法之一。核心思路是:利用 Set 自动过滤重复值的特性,再用 ... 把它转回数组。
基础写法(适用于数组)
对一维数组去重,一行就能搞定:
const uniqueArr = [...new Set(arr)];例如:
const uniqueArr = [...new Set(arr)]; // [1, 2, 3, 4, 5]
注意类型与值的判定规则
Set 去重基于 SameValueZero 比较(类似 ===,但 NaN === NaN 为 false,而 Set 认为两个 NaN 是相同的):
-
1和"1"被视为不同(类型不同) -
0和-0被视为相同 -
NaN只保留一个(这是和filter + indexOf的关键区别)
处理对象数组?不能直接用 Set
Set 对对象按引用去重,不是按内容。所以以下写法无效:
[...new Set(objArr)]; // 仍是三个对象,因为引用不同
如需按属性去重,得先提取唯一标识(如 id),或用 Map + filter 等方式,Set + ... 不适用。
兼容性与小提醒
- 需要 ES6+ 环境(现代浏览器和 Node.js ≥ 4 都支持)
- 原数组含
undefined、null、布尔值等,都能正常保留并去重 - 性能上,对超大数组(百万级),
Set构造仍高效,但比纯循环略慢;日常场景完全够用


















