JavaScript中Set转数组推荐用扩展运算符[...set]或Array.from(set);前者简洁直观,后者支持映射函数且兼容性更好;二者均保持插入顺序、不修改原Set、返回新数组。

JavaScript 中的 Set 是一个存储唯一值的集合,它本身不是数组,不能直接使用数组方法(如 map、filter)。要对 Set 进行数组操作,需先将其转为普通数组。最常用且推荐的方式是使用 扩展运算符([...set]) 或 Array.from(set)。
用扩展运算符转为数组
扩展运算符简洁直观,适合大多数场景:
- 语法简单:
const arr = [...mySet]; - 会按插入顺序展开元素,保持 Set 的遍历顺序
- 不修改原 Set,返回全新数组
- 只能用于可迭代对象(Set 是可迭代的,没问题)
示例:
const set = new Set([1, 2, 3, 2, 1]); // {1, 2, 3}
const arr = [...set];
console.log(arr); // [1, 2, 3]
用 Array.from 转为数组
Array.from() 更灵活,适合需要额外处理或兼容老环境的场景:
立即学习“Java免费学习笔记(深入)”;
- 语法:
const arr = Array.from(mySet); - 支持第二个参数(映射函数),类似
Array.from(set, x => x * 2) - 在某些旧版运行时(如未完全支持扩展运算符的环境)更稳妥
- 同样保持插入顺序,返回新数组
示例(带映射):
const set = new Set(['a', 'b', 'c']); const upperArr = Array.from(set, s => s.toUpperCase()); console.log(upperArr); // ['A', 'B', 'C']
两种方式的区别和选择建议
- 功能上等价:默认行为都生成浅拷贝数组,顺序一致
- 扩展运算符更轻量、易读,日常开发首选
-
Array.from更强大,有映射能力,也支持类数组对象(虽 Set 不属于此类) - 性能差异极小,无需为性能刻意选其一
不推荐的方式(避免踩坑)
-
Array.prototype.slice.call(mySet)❌ —— Set 不是类数组,会报错 -
mySet.toArray()❌ —— Set 没有该方法 -
JSON.parse(JSON.stringify([...mySet]))❌ —— 多余且可能丢失函数、undefined、Symbol 等值


















