Map和Set是JavaScript中高效的内置数据结构,Map支持任意类型键值对并保持插入顺序,适用于频繁增删的场景;Set自动去重,适合维护唯一值集合;相比普通对象,Map在性能、键类型和安全性上更优;WeakMap和WeakSet提供弱引用,避免内存泄漏,常用于私有数据或元数据管理。

在现代JavaScript中,Map 和 Set 是两种非常实用的内置数据结构,它们弥补了传统对象和数组在某些场景下的不足。相比使用普通对象模拟键值对或去重数组,Map 和 Set 提供了更清晰、高效且语义明确的解决方案。
Map:灵活的键值对集合
Map 是一个存储键值对的集合,与普通对象最大的不同在于它允许任何类型的值作为键——包括对象、函数、原始类型等。
常见操作包括:
- new Map():创建一个新的Map实例
- map.set(key, value):添加或更新键值对
- map.get(key):获取指定键的值
- map.has(key):判断是否包含某个键
- map.delete(key):删除指定键值对
- map.size:获取键值对数量
- map.clear():清空所有内容
示例:
立即学习“Java免费学习笔记(深入)”;
const user = { name: 'Alice' };const map = new Map();
map.set(user, 25);
console.log(map.get(user)); // 25
Map 也支持遍历,使用 forEach 或 for...of 循环:
for (const [key, value] of map) {console.log(key, value);
}
Set:自动去重的值集合
Set 是一种存储唯一值的集合,重复添加相同值时不会生效。它非常适合用于数组去重或维护一组不重复的数据。
基本用法包括:
- new Set():创建Set实例,可传入可迭代对象(如数组)进行初始化
- set.add(value):添加值
- set.has(value):检查是否存在
- set.delete(value):删除值
- set.size:获取元素个数
- set.clear():清空集合
例如,快速去除数组中的重复项:
const unique = [...new Set(arr)];
console.log(unique); // [1, 2, 3, 4]
Set 同样支持遍历,方式与 Map 类似:
set.forEach(value => console.log(value));for (const value of set) {
console.log(value);
}
Map 与普通对象的对比
虽然对象也能存储键值对,但 Map 在以下方面更具优势:
- 键不限于字符串或Symbol,可以是任意类型
- 性能更好,尤其在频繁增删键值对时
- 保持插入顺序
- 直接获取大小(size),无需手动计算
- 避免原型链污染问题
而对象更适合静态配置或需要序列化的场景(如JSON.stringify)。
WeakMap 与 WeakSet:弱引用版本
JavaScript 还提供了 WeakMap 和 WeakSet,它们只持有对键的“弱引用”,不会阻止垃圾回收。
特点包括:
- 键必须是对象
- 不能遍历,没有 size 属性
- 适合用于关联元数据而不影响内存回收
例如,用 WeakMap 存储私有数据:
const privates = new WeakMap();class Person {
constructor(name) {
privates.set(this, { name });
}
getName() {
return privates.get(this).name;
}
}
基本上就这些。Map 和 Set 让JavaScript在处理集合数据时更加高效和直观,合理使用能提升代码质量与性能。










