最推荐用扩展运算符[...set]转数组,简洁高效且保持插入顺序;次选array.from()以兼容旧环境;避免使用slice.call()、map()等无效或低效方法。

最直接的方法是用扩展运算符 [...set],这是目前最简洁、性能最好的方式。
用扩展运算符展开(推荐)
Set 是可迭代对象,支持扩展运算符,一行就能转成数组:
const mySet = new Set([1, 2, 3, 2, 1]); // {1, 2, 3}
const arr = [...mySet]; // [1, 2, 3]
- 语法简洁,语义清晰,现代浏览器和 Node.js 环境都原生支持
- 不修改原 Set,返回全新数组
- 保持插入顺序(Set 本身按插入顺序遍历)
用 Array.from() 方法
兼容性更好,适合需要支持较老环境(如 IE)的项目:
const arr = Array.from(mySet); // [1, 2, 3]
- 同样返回新数组,不影响原 Set
- 支持传入映射函数,比如
Array.from(mySet, x => x * 2) - 在旧版 JavaScript 引擎中比扩展运算符更稳定
避免使用 Array.prototype.slice.call()
这种写法对 Set 不起作用,因为 Set 不是类数组对象,没有 length 和数字索引属性:
// ❌ 错误示例:会得到空数组 [] Array.prototype.slice.call(mySet);
- 不要试图把它当 arguments 或 NodeList 处理
- 也不要用
mySet.map()或mySet.forEach()直接生成数组——它们不返回数组,需手动收集
小提醒:别忘了 Set 本身不重复
转换后的数组天然去重,但要注意原始顺序:
const s = new Set();
s.add('b').add('a').add('c');
console.log([...s]); // ['b', 'a', 'c'] —— 不是字典序,是插入顺序
- 如果需要排序,得额外调用
.sort() - 如果只是想“还原”某个已有数组(含重复项),Set 本身已丢失重复信息,无法恢复
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











