Map和Set是JavaScript中高效的内置数据结构,Map支持任意类型键值对并保持插入顺序,适用于频繁增删的场景;Set自动去重,适合维护唯一值集合;相比普通对象,Map在性能、键类型和安全性上更优;WeakMap和WeakSet提供弱引用,避免内存泄漏,常用于私有数据或元数据管理。
在现代JavaScript中,Map 和 Set 是两种非常实用的内置数据结构,它们弥补了传统对象和数组在某些场景下的不足。相比使用普通对象模拟键值对或去重数组,Map 和 Set 提供了更清晰、高效且语义明确的解决方案。
Map 是一个存储键值对的集合,与普通对象最大的不同在于它允许任何类型的值作为键——包括对象、函数、原始类型等。
常见操作包括:
示例:
const user = { name: 'Alice' };Map 也支持遍历,使用 forEach 或 for...of 循环:
for (const [key, value] of map) {Set 是一种存储唯一值的集合,重复添加相同值时不会生效。它非常适合用于数组去重或维护一组不重复的数据。
基本用法包括:
例如,快速去除数组中的重复项:
const arr = [1, 2, 2, 3, 4, 4];Set 同样支持遍历,方式与 Map 类似:
set.forEach(value => console.log(value));虽然对象也能存储键值对,但 Map 在以下方面更具优势:
而对象更适合静态配置或需要序列化的场景(如JSON.stringify)。
JavaScript 还提供了 WeakMap 和 WeakSet,它们只持有对键的“弱引用”,不会阻止垃圾回收。
特点包括:
例如,用 WeakMap 存储私有数据:
const privates = new WeakMap();
privates.get(this).name;基本上就这些。Map 和 Set 让JavaScript在处理集合数据时更加高效和直观,合理使用能提升代码质量与性能。