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. 参考资料

上一篇:Vue.nextTick(this.$nextTick) 与响应式数据的原理
下一篇:JS中快速格式化JSON字符串

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年05月05日 17时11分25秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章