JS 中的 Map 默认按插入顺序迭代所有条目,其 keys()、values()、entries() 等遍历方法均严格遵循插入顺序,重复 set 同 key 仅更新值而不影响位置,Object 则无此稳定保障。

JS 中的 Map 默认就是按插入顺序迭代所有条目,无需额外实现。
Map 本身保证插入顺序
Map 是 ECMAScript 2015(ES6)正式引入的原生数据结构,其核心规范明确要求:遍历方法(keys()、values()、entries())必须按照键值对的插入顺序返回结果。
- 这意味着只要用
set(key, value)插入,后续用for...of、forEach()或展开运算符([...map])遍历,顺序天然一致 - 即使重复设置同一个 key,只算一次“插入更新”,不会打乱原有顺序(新值覆盖旧值,位置不变)
常用迭代方式示例
以下写法都严格遵循插入顺序:
for (const [key, value] of map) { ... }map.forEach((value, key) => { ... })-
Array.from(map.keys())或[...map.values()] -
map.entries()返回的迭代器也按序产出[key, value]数组
注意:Object 不具备该特性
普通对象({})的属性遍历顺序在 ES2015 后虽对数字字符串键和新增键做了部分顺序保证,但仍存在兼容性风险和逻辑复杂性。若需稳定有序映射,应优先使用 Map 而非对象模拟。
扩展:想反向迭代怎么办?
Map 本身不提供反向迭代接口,但可借助数组反转:
[...map].reverse().forEach(...)- 或手动从后往前遍历
Array.from(map)的副本
不复杂但容易忽略——Map 的插入顺序保障是语言级行为,直接用即可。


















