javascript中的Map和Set是ES6引入的两种新型数据结构,它们分别用于解决键值对存储和唯一值集合的场景需求,和传统的对象和数组相比有各自独特的优势。

Map的基本概念和特性
Map是一种键值对集合,它的键可以是任意类型,包括对象、函数、基本类型,这一点和普通对象只能使用字符串或Symbol作为键有明显区别。
Map的核心特性如下:
- 键的类型无限制,任意值都可以作为键
- 键值对的顺序是按照插入顺序排列的
- 自带size属性,可以直接获取键值对的数量
- 提供了清晰的增删改查方法,操作语义更明确
Map的常用操作方法
Map提供了set、get、has、delete、clear等操作方法,使用方式如下:
// 创建Map实例
const userMap = new Map();
// 添加键值对,键可以是对象
const userKey = { id: 1 };
userMap.set(userKey, '张三');
// 添加基本类型作为键
userMap.set('age', 25);
// 获取值
console.log(userMap.get(userKey)); // 输出:张三
console.log(userMap.get('age')); // 输出:25
// 判断是否存在某个键
console.log(userMap.has('age')); // 输出:true
// 删除键值对
userMap.delete('age');
// 获取Map的大小
console.log(userMap.size); // 输出:1
// 清空所有键值对
userMap.clear();
Set的基本概念和特性
Set是一种存储唯一值的集合,它内部的值不会重复,常用来做去重操作,和数组相比不需要手动判断元素是否存在。
Set的核心特性如下:
- 存储的成员值都是唯一的,不会出现重复
- 成员值的顺序按照插入顺序排列
- 同样自带size属性,可直接获取成员数量
- 提供了add、has、delete、clear等操作方法
Set的常用操作方法
Set的操作方法使用示例如下:
// 创建Set实例 const numSet = new Set(); // 添加成员 numSet.add(1); numSet.add(2); numSet.add(2); // 重复值不会被添加 // 判断是否包含某个值 console.log(numSet.has(2)); // 输出:true // 获取Set的大小 console.log(numSet.size); // 输出:2 // 删除成员 numSet.delete(1); // 清空所有成员 numSet.clear();
Map和Set的适用场景
适合使用Map的场景
- 需要使用非字符串类型作为键存储数据时,比如用对象作为键关联对应的元信息
- 需要频繁增删键值对,且需要快速获取键值对数量时,Map的size属性和操作方法比对象的Object.keys().length更高效
- 需要保持键值对的插入顺序,后续需要按照插入顺序遍历时,Map的遍历顺序更符合预期
- 需要存储大量键值对,且需要避免普通对象原型链上的属性干扰时,Map不会有原型链属性的问题
适合使用Set的场景
- 需要对数组或类数组进行去重操作时,比手动写循环判断重复更简洁高效
- 需要存储一组唯一值,且需要快速判断某个值是否存在于集合中时,Set的has方法比数组的includes方法性能更好
- 需要求两个集合的交集、并集、差集时,Set的操作逻辑更清晰
Map和Set的遍历方式
Map和Set都支持for...of遍历,也提供了forEach方法,遍历示例如下:
// Map的遍历
const map = new Map([['a', 1], ['b', 2]]);
// for...of遍历键值对
for (const [key, value] of map) {
console.log(key, value);
}
// forEach遍历
map.forEach((value, key) => {
console.log(key, value);
});
// Set的遍历
const set = new Set([1, 2, 3]);
// for...of遍历成员
for (const item of set) {
console.log(item);
}
// forEach遍历
set.forEach(item => {
console.log(item);
});
和普通对象、数组的对比总结
为了更清晰区分使用场景,我们将Map、Set和普通对象、数组做简单对比:
| 数据结构 | 核心特点 | 键/成员限制 | 顺序特性 |
|---|---|---|---|
| 普通对象 | 键值对集合 | 键只能是字符串或Symbol | ES6之后基本按插入顺序,但存在特殊情况 |
| Map | 键值对集合 | 键可以是任意类型 | 严格按插入顺序 |
| 数组 | 有序值集合 | 成员可重复 | 按索引顺序 |
| Set | 唯一值集合 | 成员不可重复 | 按插入顺序 |
在实际开发中,根据具体的业务需求选择合适的数据结构,可以让代码逻辑更清晰,也能获得更好的性能表现。
MapSetjavascript数据结构修改时间:2026-07-18 21:45:26