[...new Set(arr)]是最简原生去重方法,保持顺序且支持基本类型;引用类型需深比较,可用JSON.stringify配合Map或Set实现;兼容ES6+,旧环境建议Array.from(new Set(arr))。

直接用 Set 构造函数包裹数组,再用扩展运算符转回数组,就是最简写法:
一行代码搞定去重
```js
const uniqueArr = [...new Set(arr)];
```
这是目前 JS 中语法最简洁、性能较优的原生去重方式。它自动去除重复项,且保持原始顺序(Set 会按插入顺序迭代)。
支持任意类型元素(注意引用类型限制)
Set 对基本类型(string、number、boolean、null、undefined、Symbol)去重完全可靠;
对对象、数组等引用类型,判断的是「引用地址是否相同」,不是「内容是否相等」:
-
[...new Set([1, 1, 'a', 'a'])]→[1, 'a'] -
[...new Set([[1], [1], {x:1}, {x:1}])]→[[1], [1], {x:1}, {x:1}](两个数组引用不同,不会去重)
如需深去重(对象/数组内容相同则视为重复),需额外处理
此时不能只靠 Set,得先序列化或自定义比较逻辑。例如用 JSON.stringify 简单处理纯对象数组(仅限可序列化、无函数/undefined/循环引用):
```js
const arr = [{a:1}, {a:1}, {b:2}];
const uniqueByJSON = [...new Map(arr.map(o => [JSON.stringify(o), o])).values()];
// 或更直观:
const seen = new Set();
const unique = arr.filter(o => {
const key = JSON.stringify(o);
if (seen.has(key)) return false;
seen.add(key);
return true;
});
```
兼容性与注意事项
Set 和扩展运算符均支持 ES6+(Chrome 51+/Firefox 45+/Safari 10+/Edge 15+)。若需兼容旧环境,应配合 Babel 转译或改用 Array.from(new Set(arr))(语义等价,兼容性略好一点点)。
不推荐用 filter + indexOf 或 reduce 手动模拟,既冗长又低效。











