Set构造函数配合扩展运算符是JS最简洁去重方式,基于SameValueZero算法,支持基本类型去重但对象需按字段手动处理,兼容ES6+且中小数组性能良好。

直接用 Set 构造函数传入数组,是 JavaScript 中最简洁的去重方式之一,一行代码就能搞定。
基本写法:用 Set + 扩展运算符转回数组
Set 会自动忽略重复值,构造时接受可迭代对象(如数组),再用扩展运算符 [...set] 转成新数组:
const arr = [1, 2, 2, 3, 4, 4, 5]; const uniqueArr = [...new Set(arr)]; // 结果:[1, 2, 3, 4, 5]
注意原始数组元素的类型和比较规则
Set 去重基于 SameValueZero 算法,等价于 ===,所以:
- 数字
0和-0被视为相同 -
NaN和NaN被视为相同(这是 Set 的特殊行为,和===不同) - 对象、函数、Symbol 按引用判断,同一引用才去重;不同对象即使内容一样也不会被去重
处理对象数组需额外逻辑
Set 对对象数组不起作用,因为每个对象字面量都是新引用:
立即学习“Java免费学习笔记(深入)”;
const objArr = [{id: 1}, {id: 1}, {id: 2}];
console.log([...new Set(objArr)]); // 仍是三个对象,没去重
若要按某个字段(如 id)去重,得先提取键值,或配合 filter + Map / Set:
const objArr = [{id: 1}, {id: 1}, {id: 2}];
const seen = new Set();
const uniqueObjArr = objArr.filter(item => {
if (seen.has(item.id)) return false;
seen.add(item.id);
return true;
});
// 结果:[{id: 1}, {id: 2}]
兼容性与性能小提醒
Set 是 ES6+ 特性,现代浏览器和 Node.js(v0.12+)都支持。对几万以内元素的数组,性能良好;超大数组(如百万级)时,Set 构造本身很快,但扩展运算符展开可能触发内存压力,可考虑流式处理或分块。


















