Map 与 Set
约 432 字大约 1 分钟
布欧-Lewyon
2026-05-16
首页 › JavaScript › 对象与数组 › Map 与 Set
Map
键值对集合,键可以是任意类型(对象、函数等)。
const map = new Map();
// 增删改查
map.set('name', '张三');
map.set(42, '数字键');
map.set({ id: 1 }, '对象键');
map.get('name'); // "张三"
map.has('name'); // true
map.delete('name'); // true
map.clear(); // 清空
map.size; // 键值对数量
// 遍历
map.forEach((value, key) => {
console.log(key, value);
});
for (let [key, value] of map) {
console.log(key, value);
}
// 批量创建
const entries = [['a', 1], ['b', 2]];
const m = new Map(entries);Map vs Object
| 对比 | Object | Map |
|---|---|---|
| 键类型 | 字符串/Symbol | 任意类型 |
| 遍历顺序 | 数字键优先/ES6 有序 | 插入顺序 |
| size | Object.keys().length | map.size |
| 性能 | 一般 | 频繁增删改时更优 |
Set
值唯一的集合。
const set = new Set();
set.add(1);
set.add(2);
set.add(2); // 重复添加无效
set.has(1); // true
set.delete(1); // true
set.clear();
set.size; // 元素数量
// 去重
const unique = [...new Set([1, 2, 2, 3, 3, 4])];
console.log(unique); // [1, 2, 3, 4]
// 遍历
set.forEach(value => console.log(value));
for (let val of set) {
console.log(val);
}WeakMap / WeakSet
对键的引用是"弱引用",不影响垃圾回收:
// WeakMap:键必须是对象
let obj = { id: 1 };
const wm = new WeakMap();
wm.set(obj, '数据');
obj = null; // 对象被回收,wm 中对应数据自动移除
// WeakSet:值必须是对象
const ws = new WeakSet();
ws.add({ id: 1 });适用场景:存储 DOM 元素的附加数据、缓存。当 DOM 元素被移除时,WeakMap 自动清理。
小结
| 集合 | 特性 | 场景 |
|---|---|---|
Map | 任意键类型、有序 | 需要非字符串键的场景 |
Set | 值唯一 | 去重 |
WeakMap | 弱引用键 | DOM 数据存储、缓存 |
WeakSet | 弱引用值 | 标记对象 |
