JavaScript Map 和 Object 的区别解析

 更新时间:2022年08月18日 11:02:07   作者:m0_67402341  
在JavaScript中,Map 和 Object 看起来都是用键值对来存储数据,那么他们有什么不同呢,这篇文章主要介绍了JavaScript Map 和 Object 的区别,需要的朋友可以参考下

在JavaScript中,MapObject 看起来都是用键值对来存储数据,那么他们有什么不同呢?

不同点

Key filed

在 Object 中, key 必须是简单数据类型(整数,字符串或者是 symbol),而在 Map 中则可以是 JavaScript 支持的所有数据类型,也就是说可以用一个 Object 来当做一个Map元素的 key。

元素顺序

Map 元素的顺序遵循插入的顺序,而 Object 的则没有这一特性。

继承

Map 继承自 Object 对象。

新建实例

Object 支持以下几种方法来创建新的实例:

var obj = {...};
var obj = new Object();
var obj = Object.create(null);

Map 仅支持下面这一种构建方法:

var map = new Map([[1, 2], [2, 3]]); // map = {1 => 2, 2 => 3}

数据访问

Map 想要访问元素,可以使用 Map 本身的原生方法:

map.get(1) // 2

Object 可以通过 .[ ] 来访问

obj.id;
obj['id'];

判断某个元素是否在 Map 中可以使用

map.has(1);

判断某个元素是不是在 Object 中需要以下操作:

obj.id === undefined;
// 或者
'id' in obj;

另外需要注意的一点是,Object 可以使用 Object.prototype.hasOwnProperty() 来判断某个key是否是这个对象本身的属性,从原型链继承的属性不包括在内。

新增一个数据

Map 可以使用 set() 操作:

map.set(key, value)
// 当传入的 key 已经存在的时候,Map 会覆盖之前的值

Object 新增一个属性可以使用:

obj['key'] = value;
obj.key = value;
// object也会覆盖

删除数据

在 Object 中没有原生的删除方法,我们可以使用如下方式:

delete obj.id;
// 下面这种做法效率更高
obj.id = undefined

需要注意的是,使用 delete 会真正的将属性从对象中删除,而使用赋值 undefined 的方式,仅仅是值变成了 undefined。属性仍然在对象上,也就意味着 在使用 for … in… 去遍历的时候,仍然会访问到该属性。

Map 有原生的 delete 方法来删除元素:

var isDeleteSucceeded = map.delete(1);
console.log(isDeleteSucceeded ); // true
// 全部删除
map.clear();

获取size

Map 自身有 size 属性,可以自己维持 size 的变化。
Object 则需要借助 Object.keys() 来计算

console.log(Object.keys(obj).length); 

Iterating

Map 自身支持迭代,Object 不支持。

如何确定一个类型是不是支持迭代呢? 可以使用以下方法:

console.log(typeof obj[Symbol.iterator]); // undefined
console.log(typeof map[Symbol.iterator]); // function

何时使用 Map ,何时使用 Object?

虽然Map 在很多时候优于 Object,但是作为 JavaScript 最基础的数据类型,还是有很多情景更适合使用 Object。

  • 当所要存储的是简单数据类型,并且 key 都为字符串或者整数或者 Symbol 的时候,优先使用 Object ,因为Object可以使用 字符变量 的方式创建,更加高效。
  • 当需要在单独的逻辑中访问属性或者元素的时候,应该使用 Object,例如:
var obj = {
id: 1,
name: “It's Me!”,
print: function(){
return Object Id: ${this.id}, with Name: ${this.name};
}
}
console.log(obj.print());//Object Id: 1, with Name: It's Me.
// 以上操作不能用 Map 实现
  • JSON 直接支持 Object,但不支持 Map
  • Map 是纯粹的 hash, 而 Object 还存在一些其他内在逻辑,所以在执行 delete 的时候会有性能问题。所以写入删除密集的情况应该使用 Map。
  • Map 会按照插入顺序保持元素的顺序,而Object做不到。
  • Map 在存储大量元素的时候性能表现更好,特别是在代码执行时不能确定 key 的类型的情况。

到此这篇关于JavaScript Map 和 Object 的区别的文章就介绍到这了,更多相关JavaScript Map 和 Object 区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js判读浏览器是否支持html5的canvas的代码

    js判读浏览器是否支持html5的canvas的代码

    浏览器是否支持html5的canvas,我们可以使用js来判断下,具体如下,喜欢的朋友可以收藏
    2013-11-11
  • 原生js拖拽功能制作滑动条实例代码

    原生js拖拽功能制作滑动条实例代码

    这篇文章主要介绍了原生js拖拽功能制作滑动条实例教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • JavaScript使用AOP编程思想实现监听HTTP请求

    JavaScript使用AOP编程思想实现监听HTTP请求

    这篇文章主要为大家详细介绍了如何在JavaScript使用AOP编程思想实现监听HTTP请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • JavaScript 赋值,浅复制和深复制的区别

    JavaScript 赋值,浅复制和深复制的区别

    这篇文章主要介绍了JavaScript 赋值,浅复制和深复制的区别,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • 原生JavaScript实现购物车

    原生JavaScript实现购物车

    这篇文章主要为大家详细介绍了原生JavaScript实现购物车,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • javascript addLoadEvent函数说明

    javascript addLoadEvent函数说明

    网页加载完整后会触发一个onload事件,默认地一个事件只能和一个函数绑定。
    2010-01-01
  • JavaScript如何删除数组元素(总结篇)

    JavaScript如何删除数组元素(总结篇)

    在JavaScript中,除了Object之外,Array类型恐怕就是最常用的类型了,与其他语言的数组有着很大的区别,JavaScript中的Array非常灵活,今天我就来总结了一下JavaScript中Array删除的方法,感兴趣的朋友跟随小编一起看看吧
    2023-12-12
  • javascript动态添加样式(行内式/嵌入式/外链式等规则)

    javascript动态添加样式(行内式/嵌入式/外链式等规则)

    添加CSS的方式有行内式、嵌入式、外链式、导入式,下面为大家详细介绍下javascript动态添加以上样式规则的方法,感兴趣的朋友可以参考下哈
    2013-06-06
  • js里面的变量范围分享

    js里面的变量范围分享

    今天写一个滑动自动加载的功能的时候,遇到了切换就发现加载完毕的情况,查看了下发现可能是js的全局变量和局部变量的问题,自己测试了下,果不其然,下面分享下
    2020-07-07
  • JS+HTML+CSS实现轮播效果

    JS+HTML+CSS实现轮播效果

    这篇文章主要为大家详细介绍了JS+HTML+CSS实现轮播效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11

最新评论