map.prototype.entries() 返回的是按插入顺序产出[key, value]数组的mapiterator对象,该迭代器不可重用、不响应后续map变更,仅反映调用时的快照状态。

entries 返回的是什么类型的迭代器
Map.prototype.entries() 返回一个 MapIterator 对象,它按插入顺序产出 [key, value] 数组。这个迭代器不是数组,不能直接用 forEach 或索引访问,但可被 for...of 消费,也兼容解构赋值。
for...of 中直接解构 key 和 value
最常用、最直观的方式是在循环中用数组解构一次性拿到键和值:
const map = new Map([['a', 1], ['b', 2]]);
for (const [key, value] of map.entries()) {
console.log(key, value); // 'a' 1 → 'b' 2
}
注意:map.entries() 可省略为 map(因为 Map 默认迭代器就是 entries),但显式写出更清晰,尤其当后续可能切换成 keys() 或 values() 时。
- 如果只写
for (const item of map),item是[key, value]数组,需再取item[0]/item[1] - 解构时若 key 是对象或 Symbol,仍能正确匹配,不依赖 toString
- 不要在解构中写
[k, v, ...rest]——entries每次只产出两个元素,rest会是空数组,无实际意义
用扩展运算符转成数组后解构遍历
如果需要随机访问、多次遍历或配合数组方法(如 filter),可以先展开:
const entries = [...map.entries()]; console.log(entries[0]); // ['a', 1] entries.forEach(([key, value]) => console.log(key));
但要注意:
- 这会创建新数组,消耗内存;对大
Map(万级以上)建议优先用for...of流式处理 -
[...map.entries()]和Array.from(map)等价,后者语义稍强,但性能几乎无差别 - 不能写
Array.from(map.entries())——会报错,因为entries()返回的迭代器本身不支持二次遍历,而Array.from内部已正确处理该情况;实际上Array.from(map)就够了
entries 迭代器不可重用,且不响应 Map 后续变更
map.entries() 调用瞬间生成迭代器快照,它只反映调用时的键值对顺序和内容:
const map = new Map([['x', 1]]);
const iter = map.entries();
console.log(iter.next().value); // ['x', 1]
map.set('y', 2);
console.log(iter.next().value); // {done: true} —— 迭代器已耗尽,不会包含 'y'
常见误操作:
- 把
iter存起来反复for...of—— 第二次循环无输出 - 期望迭代器自动更新以反映
set/delete操作 —— 它不会 - 用
iter[Symbol.iterator]()试图“重启” ——MapIterator不支持重复调用Symbol.iterator
需要实时视图就每次重新调用 map.entries(),别缓存迭代器本身。










