LeetCode刷题一周总结 :: 大多数时候Map比Array/Object更高效

Jack Learns to Code


Jack Learns to Code
这是为什么呢?我问了下DeepSeek,它回答说在 JavaScript 中,Map
在某些场景下比 Array
或 Object
更高效,主要原因包括:
1. 查找速度(Key-Based Access)
- Map:使用哈希表实现,查找、插入、删除操作的时间复杂度接近 O(1)。第一句话就戳中了重点。关键词:哈希表,O(1)
- Array:查找需要遍历(
indexOf
、includes
),时间复杂度为 O(n);即使通过索引(arr[0]
)访问是 O(1),但基于值的查找效率低。 - Object:虽然属性访问也是 O(1),但键只能是字符串/Symbol,且可能因原型链继承(如
obj.hasOwnProperty
检查)略微影响性能。
2. 插入与删除操作
- Map:
set
和delete
操作是 O(1),动态扩容高效。 - Array:
push
/pop
在末尾是 O(1),但中间插入/删除(splice
)是 O(n);大规模操作需移动元素。 - Object:删除属性(
delete obj.key
)可能触发引擎优化问题(如从“快速模式”退化为“慢速模式”)。
3. 键的灵活性
- Map:键可以是任意类型(对象、函数等),哈希机制直接高效。
- Object:键自动转为字符串(如
obj[1]
和obj["1"]
冲突),且键顺序在某些旧引擎中不可靠。
4. 频繁增删场景
- Map:为高频增删优化,内存管理更紧凑。
- Array/Object:
Array
的中间操作成本高;Object
的删除可能影响隐藏类优化(V8 引擎)。
5. 内存与迭代
- Map:迭代直接遍历键值对(
map.entries()
),无需像Object
先提取键(Object.keys()
)。 - 大数据量时:
Map
的迭代器比Array
的循环或Object
的for...in
(需过滤原型属性)更高效。
示例对比
// Array 查找低效
const arr = [1, 2, 3];
arr.includes(2); // O(n)
// Object 键限制
const obj = { 1: "one" };
obj["1"] === obj[1]; // 键被字符串化
// Map 高效查找与任意键
const map = new Map();
map.set({ id: 1 }, "data"); // 键为对象
map.get(key); // O(1)
何时选择?
- 用 Map:需要高频增删、复杂键或保证顺序(遍历顺序即插入顺序)。
- 用 Array:需要有序数据或栈/队列操作。
- 用 Object:静态键、JSON 兼容或简单键值对。
总之,Map
在动态键值操作上更高效,而 Array
/Object
在特定场景(如有序列表、简单结构)仍有优势。