Map 的 keys()、values()、entries()均返回按插入顺序遍历的懒执行迭代器,分别产出键、值、[键, 值]数组;不可重用,不响应创建后的 Map 修改,且无 forEach 方法。

JavaScript 中 Map 对象的 keys()、values() 和entries()方法,都返回迭代器(Iterator),用于遍历 Map 中的键、值或键值对。它们不返回数组,而是可迭代对象,需配合 for……of、扩展运算符或Array.from() 等使用。
keys():只获取所有键
keys()返回一个迭代器,按插入顺序依次产出 Map 中每个键。键可以是任意类型(字符串、数字、对象、Symbol 等)。
常见用法:
- 用
for……of循环遍历:
for (const key of myMap.keys()) {console.log(key); } - 转成数组:
const keyArray = Array.from(myMap.keys()); - 解构或展开:
const keys = […myMap.keys()];
values():只获取所有值
values()返回一个迭代器,按插入顺序依次产出 Map 中每个对应值。值同样支持任意类型,且允许重复。
立即学习“Java 免费学习笔记(深入)”;
注意点:
- 即使值是引用类型(如对象),
values()返回的是原值的引用,不是副本。 - 无法通过值反查键,Map 本身不提供“值→键”的查找接口。
- 常用转换方式:
const vals = Array.from(myMap.values());
entries():同时获取键值对
entries()是 Map 默认的迭代方法(myMap[Symbol.iterator] === myMap.entries),返回键值对数组 [key, value] 组成的迭代器。
典型使用场景:
- 配合
for……of解构:
for (const [key, value] of myMap.entries()) {/* 使用 key 和 value */} - 转为二维数组:
const pairs = […myMap.entries()]; // [[k1,v1], [k2,v2]] - 构造新 Map(浅拷贝):
const copy = new Map(myMap.entries());
三者共性与注意事项
它们都遵循 Map 的插入顺序,且返回的迭代器是“懒执行”的——不立即计算全部结果,每次调用 next() 才产出下一个项。
关键细节:
- 迭代器不可重用:一旦遍历完成或中途 break,再次遍历时需重新调用
keys()等获取新迭代器。 - 不响应后续增删:迭代器创建后,对 Map 的修改(如
set()、delete())不会影响已生成的迭代器行为(但会影响后续调用next()的结果,取决于具体时机)。 - 不能直接用
.forEach():这些方法返回的是迭代器,不是数组,没有forEach方法;如需类似逻辑,可用for……of或先转数组。