Map.prototype.keys()返回按插入顺序排列的键迭代器,非数组,支持for...of和扩展运算符转换为数组,但不可直接调用forEach等数组方法。

Map.prototype.keys() 方法返回一个包含该 Map 所有键名的迭代器(Iterator),它按插入顺序遍历键,不包含重复项(因为 Map 键天然唯一)。
keys() 返回的是可迭代对象,不是数组
调用 map.keys() 不会直接得到数组,而是一个 MapIterator 对象,支持 for...of、扩展运算符或手动调用 .next():
- ✅ 可用
for...of遍历:
<code>
const map = new Map([['a', 1], ['b', 2], ['c', 3]]);
for (const key of map.keys()) {
console.log(key); // 'a', 'b', 'c'
}
</code> - ✅ 转成数组:
<code>
const keysArray = [...map.keys()]; // ['a', 'b', 'c']
// 或 Array.from(map.keys())
</code> - ❌ 不能直接调用数组方法:
<code>
map.keys().forEach(...); // TypeError: map.keys(...) is not a function
</code>(因为不是数组,没有forEach)
keys() 的遍历顺序与插入顺序一致
Map 保证键值对按插入顺序存储,.keys() 迭代器也严格遵循该顺序,和 Object.keys()(受属性类型影响,可能乱序)不同:
- 数字键、字符串键、Symbol 键都按添加时间排列;
- 即使后续修改了某个键对应的值,也不影响键的顺序;
- 删除再重新添加同一键,会把它放到末尾(视为新插入)。
结合其他迭代器方法灵活使用
.keys() 常和 .values()、.entries() 搭配,也可与解构、条件过滤组合:
立即学习“Java免费学习笔记(深入)”;
- 只处理特定类型的键:
<code>
for (const key of map.keys()) {
if (typeof key === 'string') console.log('String key:', key);
}
</code> - 转为对象键(注意:仅适用于字符串/Symbol 键):
<code>
const obj = Object.fromEntries(map.entries()); // 更推荐用 entries()
// 若只要键,可用:Object.fromEntries([...map.keys()].map(k => [k, undefined]))
</code>
注意 null、undefined 和对象作为键的兼容性
Map 允许任意类型作键,.keys() 会如实返回它们:
-
map.set(null, 'nil')→map.keys()包含null; -
map.set({a:1}, 'obj')→ 迭代器中会出现该对象引用; - 若需序列化键(如 JSON),需自行处理(对象键无法直接 JSON.stringify)。


















