← JavaScript Map has() 方法 JavaScript Map set() 方法 →

JavaScript Map keys() 方法

原创 2026-03-24 JavaScript 已有人查阅

JavaScript Map 的 keys() 方法:从迭代器到数组,掌握键的遍历之道

Map 作为 JavaScript 中键值对的重要角色,在需要保持键的原始数据类型和插入顺序时,比普通对象更可靠。而 keys() 方法,正是我们获取 Map 中所有键的专用途径。它返回一个迭代器对象,允许我们按插入顺序逐一访问每个键。这种方法不仅保证了顺序的可预测性,也为我们提供了更灵活的遍历方式。

核心功能:获取键的迭代器

keys() 方法不接收任何参数,它返回一个新的 Map Iterator 对象。这个迭代器对象包含了当前 Map 中所有键,并且会严格按照键被添加的顺序依次返回。你可能会问,为什么不直接返回一个数组?这正是 JavaScript 设计迭代器的初衷——按需取值,节省内存,尤其是在处理大量数据时,迭代器比一次性生成数组更加高效。

语法回顾:

mapInstance.keys()
  • 返回值:一个新的迭代器对象,用于遍历 Map 的键。

  • 特点:键的顺序与插入顺序一致,且不会影响原 Map

个人见解:为什么 keys() 比 Object.keys() 更可靠?

在普通对象中,Object.keys() 返回的是字符串数组,并且键的顺序在某些情况下(如数值键)并不稳定。而 Map 的 keys() 方法严格遵循插入顺序,无论键是字符串、数字还是对象,顺序都如你所期。我在开发中维护一个“操作日志队列”时,就曾因为对象键的顺序混乱而出现异常,换用 Map 后,通过 keys() 遍历,顺序再也没出过问题。如果你需要保证键的遍历顺序一致,Map 配合 keys() 是更合适的选择。

示例解析:从基础遍历到进阶应用

下面通过几个实际示例,展示 keys() 方法在不同场景下的用法。

示例1:基础遍历,按顺序输出键

这个示例展示如何使用 keys() 返回的迭代器,通过 next().value 逐个获取键。

<script>
// 代码号:学习编程,从迭代器开始理解 Map 的键
const techMap = new Map();
techMap.set("React", "前端库");
techMap.set("Node.js", "后端运行时");
techMap.set("Webpack", "模块打包器");

const keyIterator = techMap.keys();

console.log(keyIterator.next().value); // 输出: React
console.log(keyIterator.next().value); // 输出: Node.js
console.log(keyIterator.next().value); // 输出: Webpack
</script>

示例2:用 for...of 循环遍历所有键

手动调用 next() 并不方便,项目开发中更常用 for...of 配合 keys() 直接遍历。

<script>
// 代码号:学习编程,用 for...of 优雅遍历 Map 键
const versionMap = new Map();
versionMap.set("ES6", 2015);
versionMap.set("ES7", 2016);
versionMap.set("ES8", 2017);

// for...of 直接遍历 keys() 返回的迭代器
for (let key of versionMap.keys()) {
    console.log(key); // 依次输出: ES6, ES7, ES8
}
</script>

示例3:对象作为键,keys() 按引用返回

Map 允许任何类型的值作为键,包括对象。keys() 返回的是这些对象的引用,而非其字符串形式。

<script>
// 代码号:学习编程,掌握对象键的遍历
const moduleA = { name: "用户模块" };
const moduleB = { name: "订单模块" };

const moduleMap = new Map();
moduleMap.set(moduleA, "模块A数据");
moduleMap.set(moduleB, "模块B数据");

for (let key of moduleMap.keys()) {
    console.log(key); 
    // 输出: { name: "用户模块" } 
    //       { name: "订单模块" }
    // 注意:内容相同的不同对象不会被视为同一键
}
</script>

示例4:将 keys() 转换为数组

有时候我们需要把键放入数组中进行进一步处理,这时可以通过 Array.from() 或扩展运算符完成转换。

<script>
// 代码号:学习编程,快速将 Map 键转为数组
const configMap = new Map([
    ["theme", "dark"],
    ["language", "zh-CN"],
    ["notifications", true]
]);

const keyArray = Array.from(configMap.keys());
console.log(keyArray); 
// 输出: ['theme', 'language', 'notifications']

// 也可以使用扩展运算符
const anotherKeyArray = [...configMap.keys()];
console.log(anotherKeyArray);
// 输出: ['theme', 'language', 'notifications']
</script>

本节课程知识要点

  1. 优先使用 for...of 遍历for...of 语法比手动调用 next() 更简洁、不易出错,是遍历 Map 键的主要方式。

  2. 对象键的引用特性:使用对象作为键时,keys() 返回的是对象引用。如果两个对象内容相同但引用不同,会被视为两个不同的键。在需要根据内容匹配键的场景下,可以考虑使用 JSON.stringify 或第三方库做序列化处理。

  3. 按需转换为数组:虽然 keys() 返回的是迭代器,但在需要调用数组方法(如 mapfilter)时,通过 Array.from(map.keys()) 或 [...map.keys()] 转换非常方便。

  4. 键的唯一性保障Map 中的键是唯一的,重复设置同一个键只会更新值,不会增加新键。因此 keys() 返回的迭代器中不会出现重复的键,顺序以第一次插入为准。

常见疑问解析

问:keys() 返回的迭代器能用于 JSON 序列化吗?
答:不能直接序列化。迭代器对象不是 JSON 兼容的数据类型。如果需要将键数据转为 JSON,建议先通过 Array.from(map.keys()) 转换为数组后再序列化。

问:如何判断 keys() 是否遍历完成?
答:迭代器对象有一个 next() 方法,每次调用返回 { value, done }。当 done 为 true 时表示遍历结束。不过在 for...of 循环中,这些细节由引擎自动处理,无需手动干预。

问:为什么我修改了 Map 后,之前获取的迭代器不会更新?
答:keys() 返回的迭代器是基于调用时 Map 的快照吗?其实不是。它是动态的,如果你在获取迭代器之后又向 Map 添加了新的键,那么迭代器会包含这些新键吗?答案是:取决于迭代器的活跃状态。在开发中,为了避免混淆,建议在需要完整遍历时,在遍历前获取迭代器,并且遍历过程中不要修改原 Map 的键。这是代码可预测性的一个常见实践。

keys() 方法看似简单,却是连接 Map 与遍历逻辑的重要桥梁。理解它返回的是迭代器而非数组,能让你在处理大规模数据时写出更高效、更清晰的代码。掌握它,就是向精通 JavaScript 数据结构迈出了扎实的一步。

← JavaScript Map has() 方法 JavaScript Map set() 方法 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号