javascript 的 set 对象天然保持插入顺序,遍历时按 add() 添加的先后顺序返回元素,支持 for...of、foreach() 和展开运算符等有序遍历方式。

JavaScript 中的 Set 对象**天然保持插入顺序**,遍历时会按照元素被添加的先后顺序返回,不需要额外处理。
Set 本身已按插入顺序遍历
Set 是 ECMAScript 2015(ES6)引入的集合类型,规范明确要求其迭代顺序为「插入顺序」(insertion order)。这意味着只要用 add() 方法依次添加元素,后续用 for...of、forEach() 或展开运算符([...set])遍历时,结果就自然有序。
- 不支持重复值,但顺序不受去重影响——首次插入的位置决定它在迭代中的位置
- 删除(
delete())或清空(clear())不会打乱剩余元素的相对顺序 - 没有类似数组的索引访问,但
values()、keys()和默认迭代器行为一致,都按插入顺序
常用遍历方式示例
以下写法均能保持原始插入顺序:
const set = new Set();
set.add('c');
set.add('a');
set.add('b');
// 方式1:for...of
for (const item of set) {
console.log(item); // 'c', 'a', 'b'
}
// 方式2:forEach
set.forEach(item => console.log(item)); // 'c', 'a', 'b'
// 方式3:转为数组后操作
console.log([...set]); // ['c', 'a', 'b']
console.log(Array.from(set)); // ['c', 'a', 'b']
注意:不要混淆 Set 和 Object 的键序
Object 在 ES2015+ 中也规定了属性遍历顺序(数字键 → 字符串键 → Symbol 键),但它不是为去重和有序集合设计的;而 Set 专为此场景优化,语义清晰、性能可靠。如果需求是「唯一值 + 插入顺序」,直接用 Set 即可,无需用对象模拟。
需要反向或随机访问?考虑封装或搭配数组
Set 不提供 get(index) 或 reverse() 方法。若需反向遍历,可转成数组再操作:
const arr = [...set].reverse(); // ['b', 'a', 'c'] // 或者用 Array.from(set).reverse()
若频繁按索引读取,且仍需去重逻辑,可维护一个 Set 加一个同步更新的数组副本,但多数场景下仅用 Set 迭代已足够。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











