源本科技 | 码上会

JavaScript Map

2026/01/13
18
0

学习目标

  • 理解 JavaScript 中 Map 的基本概念与特性

  • 掌握 Map 的创建方式及常用方法

  • 了解 Map 相较于普通对象(Object)的优势

  • 能够在实际开发中合理选择使用 MapObject


什么是 Map

Map 是 JavaScript 提供的一种用于存储键值对(key-value pairs)的数据结构,类似于其他编程语言中的哈希表(Hash Map)或字典(Dictionary)。

核心特性

  • 保持插入顺序Map 会按照元素被插入的顺序进行迭代。

  • 支持任意类型的键和值:无论是原始类型(如字符串、数字)还是对象、函数,都可以作为键或值。

  • 基于哈希实现:内部使用哈希机制,使得查找、插入和删除操作的平均时间复杂度为 O(1)

  • 键必须唯一:如果使用相同的键多次调用 set(),后一次的值会覆盖前一次的值。

  • 适合高频增删场景:当需要频繁地添加或删除键值对时,推荐使用 Map 而非普通对象。


创建的两种方式

1. 使用空构造函数 + set()

let myMap = new Map();
myMap.set('name', 'TechBlog');
myMap.set('age', 5);

2. 通过数组初始化

let anotherMap = new Map([
    ['name', 'TechBlog'],
    ['age', 5],
    ['city', 'Beijing']
]);
console.log(anotherMap);
// 输出: Map(3) { 'name' => 'TechBlog', 'age' => 5, 'city' => 'Beijing' }

注意:传入的数组中每个元素必须是一个包含两个元素的数组(即 [key, value] 形式)。


常用方法与属性

方法 / 属性

说明

set(key, value)

添加或更新一个键值对

get(key)

获取指定键对应的值,若不存在则返回 undefined

has(key)

检查是否存在指定的键,返回布尔值

delete(key)

删除指定键的键值对

clear()

清空整个 Map

size

返回当前 Map 中键值对的数量

const myMap = new Map();

// 1. set()
myMap.set('name', 'TechBlog');
myMap.set('age', 25);
myMap.set(1, 'One');

console.log(myMap);
// Map(3) { 'name' => 'TechBlog', 'age' => 25, 1 => 'One' }

// 2. get()
console.log(myMap.get('name'));        // "TechBlog"
console.log(myMap.get('invalidKey'));  // undefined

// 3. has()
console.log(myMap.has('name'));        // true
console.log(myMap.has('address'));     // false

// 4. delete()
myMap.delete('age');
console.log(myMap.has('age'));         // false

// 5. clear() 和 size
myMap.clear();
console.log(myMap.size);               // 0

myMap.set('a', 1);
myMap.set('b', 2);
console.log(myMap.size);               // 2

Map 相比 Object

特性

Map

Object

键的类型

任意类型(包括对象、函数、Symbol 等)

仅限字符串或 Symbol

插入顺序

严格保持插入顺序

ES2015+ 虽有规范,但对整数键等有特殊处理

性能

高频增删操作更高效

在大量动态属性操作时性能较差

大小获取

直接通过 .size 属性

需手动计算(如 Object.keys(obj).length

原型链干扰

无继承,无默认属性

可能与原型链上的属性冲突(如 toString

建议:当你需要以非字符串作为键,或频繁进行增删操作时,优先使用 Map


重点总结

  • Map 是一种有序、高效的键值对集合,支持任意类型的键。

  • 常用方法包括 setgethasdeleteclear,以及只读属性 size

  • 相比普通对象,Map 在类型灵活性、性能和语义清晰性上更具优势。

  • 在现代 JavaScript 开发中,Map 应被视为处理动态键值映射的首选工具之一。


思考题

  1. 为什么在需要以对象作为键的场景下,不能直接使用普通对象(Object),而必须使用 Map

  2. 假设你需要缓存用户信息,且用户 ID 是一个复杂的对象(如 { id: 123, type: 'admin' }),你会如何设计这个缓存结构?为什么?

  3. Mapsize 属性和 Object.keys(obj).length 在使用上有何本质区别?哪种方式更可靠?