
Javascript中Map与Object的区别
发布日期:2021-05-04 18:17:13
浏览次数:46
分类:精选文章
本文共 1594 字,大约阅读时间需要 5 分钟。
Map和Object在JavaScript中都是常用的数据存储方式,但它们有着显著的区别。以下从几个方面详细分析两者的特点。
1. 键类型的支持
Map支持键的数据类型更为灵活。Map的键可以是任意类型,包括基本类型(如number、string、boolean、null、undefined)、对象、数组甚至是函数。而Object的键则有严格的限制,只能是string、symbol或number。此外,Object的数值键会被转换为字符串形式,这一点需要注意。
2. 数据存储顺序
Map的键是按照插入顺序存储和遍历的,而Object的键的存储顺序则比较复杂。实际上,Object的键会分为三个不同的类别进行排序:
- 数值类型(如'1', '2')
- 字符串类型(如'foo', 'bar')
- Symbol类型
每个类别内的键会按照插入顺序进行排序。例如,以下代码中,键的顺序会按照数值、字符串、Symbol的顺序排列:
const obj = {};obj.b = 'b';obj.a = 'a';obj[1] = 1;obj[Symbol('foo')] = 'symbol foo';obj[2] = 2;obj[Symbol('bar')] = 'symbol bar';console.log(obj); // {1: 1, 2: 2, b: "b", a: "a", Symbol(foo): "symbol foo", Symbol(bar): "symbol bar"}
3. 实现细节
- 迭代接口:Map直接支持Iterator接口,可以直接使用for...of循环遍历。而Object需要通过如Object.entries()等方法来获取键值对进行遍历。
- 大小获取:Map有size属性,可以直接获取键值对的数量。而Object由于原型链中包含多个属性,获取长度时需要特殊处理。
4. 性能对比
在实际应用中,Map相较于Object表现更为高效。通过以下代码可以比较两者的性能差异:
const benchmarkMap = (size) => { console.time('benchmarkMap'); var map = new Map(); for (var i = 0; i < size; i++) { map.set(i + 's', i); } for (var i = 0; i < size; i++) { var x = map.get(i + 's'); } console.timeEnd('benchmarkMap');};const benchmarkObj = (size) => { console.time('benchmarkObj'); var obj = {}; for (var i = 0; i < size; i++) { obj[i + 's'] = i; } for (var i = 0; i < size; i++) { var x = obj[i + 's']; } console.timeEnd('benchmarkObj');};var size = 1000000;benchmarkMap(size); // 结果:764.6181640625 msbenchmarkObj(size); // 结果:1443.76806640625 ms
从结果可以看出,Map在处理大量数据时表现明显优于Object。此外,在频繁增删键值对的场景下,Map的表现更为出色。
5. 参考资料
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年05月05日 17时11分25秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Mybatis配置
2025-04-14
mybatis逆向工程详细配置讲解(全)
2025-04-14
Mybatis连接池与事务深入
2025-04-14
MyBatis实现 if-else功能
2025-04-14
MyBatis实操第一课5月17号.在学完了MaBatis框架后。
2025-04-14
Mybatis学习(1)
2025-04-14
MyBatis学习总结(9)——使用MyBatis Generator自动创建代码
2025-04-14
MyBatis学习总结(8)——Mybatis3.x与Spring4.x整合
2025-04-14
MyBatis学习总结(7)——Mybatis缓存
2025-04-14
MyBatis学习总结(6)——调用存储过程
2025-04-14
MyBatis学习总结(5)——实现关联表查询
2025-04-14
MyBatis学习总结(4)——解决字段名与实体类属性名不相同的冲突
2025-04-14
MyBatis学习总结(3)——优化MyBatis配置文件中的配置
2025-04-14
MyBatis学习总结(2)——使用MyBatis对表执行CRUD操作
2025-04-14
MyBatis学习总结(28)—— MyBatis-Plus 实战技巧总结
2025-04-14
MyBatis学习总结(27)——Mybatis-Plus使用小技巧
2025-04-14
MyBatis学习总结(26)——Mybatis源码中使用了哪些设计模式?
2025-04-14
MyBatis学习总结(24)——Mybatis常见问题汇总
2025-04-14
MyBatis学习总结(23)——Mybatis打印Sql语句配置
2025-04-14