不同点

Key filed

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

元素顺序

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

继承

Map 继承自 Object 对象。

新建实例

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

  1. var obj = {...};
  2.  
  3. var obj = new Object();
  4.  
  5. var obj = Object.create(null);

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

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

数据访问

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

  1. map.get() //

Object 可以通过 . 和 [ ] 来访问

  1. obj.id;
  2.  
  3. obj['id'];

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

  1. map.has();

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

  1. obj.id === undefined;
  2.  
  3. // 或者
  4.  
  5. 'id' in obj;
  1. 另外需要注意的一点是,Object 可以使用 Object.prototype.hasOwnProperty() 来判断某个key是否是这个对象本身的属性,从原型链继承的属性不包括在内。

  

新增一个数据

Map 可以使用 set() 操作:

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

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

  1. obj['key'] = value;
  2.  
  3. obj.key = value;
  4.  
  5. // object也会覆盖

删除数据

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

  1. delete obj.id;
  2.  
  3. // 下面这种做法效率更高
  4.  
  5. obj.id = undefined
  1. 需要注意的是,使用 delete 会真正的将属性从对象中删除,而使用赋值 undefined 的方式,仅仅是值变成了 undefined。属性仍然在对象上,也就意味着 在使用 for in 去遍历的时候,仍然会访问到该属性。

  

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

  1. var isDeleteSucceeded = map.delete();
  2.  
  3. console.log(isDeleteSucceeded ); // true
  4.  
  5. // 全部删除
  6.  
  7. map.clear();

获取size

Map 自身有 size 属性,可以自己维持 size 的变化。

Object 则需要借助 Object.keys() 来计算

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

Iterating

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

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

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

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

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

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

JavaScript Map 和 Object 的区别的更多相关文章

  1. Map与object的区别

    Map 对象保存键值对.任何值(对象或者原始值) 都可以作为一个键或一个值. 语法 new Map([iterable]) 参数 iterable Iterable 可以是一个数组或者其他 itera ...

  2. JavaScript中Map和ForEach的区别

    译者按: 惯用Haskell的我更爱map. 原文: JavaScript — Map vs. ForEach - What’s the difference between Map and ForE ...

  3. map泛型 map不指定泛型 与 Map<Object,Object>的区别

    map泛型 map不指定泛型 与 Map<Object,Object>的区别 private void viewDetail(){ Map map1 = new HashMap(); Ma ...

  4. js es6 map 与 原生对象区别

    区别 object和Map存储的都是键值对组合.但是: object的键的类型是 字符串: map的键的类型是 可以是任意类型: 另外注意,object获取键值使用Object.keys(返回数组): ...

  5. JavaScript Map 和 Set

    结论 Map:存放键值对,区别于 Object,键可以是任何值. Set:存放不重复的值 Map 存储键值对,读取时与插入顺序一致. var map = new Map([[1, "1&qu ...

  6. Javascript中Function,Object,Prototypes,__proto__等概念详解

    http://anykoro.sinaapp.com/2012/01/31/javascript%E4%B8%ADfunctionobjectprototypes__proto__%E7%AD%89% ...

  7. 坑:JavaScript 中 操作符“==” 和“===” 的区别

    标题:JavaScript 中 操作符"==" 和"===" 的区别 记录一些很坑的区别: 1. '' == '0' // false 0 == '' // t ...

  8. Javascript控制台打印Object对象

    Javascript控制台打印Object对象 做项目的时候遇到一个问题,在调试代码时需要打印对象来查看具体数值,想了各种方法也没有实现,最后查资料知道了可以使用JSON.stringify()将ob ...

  9. Java不定参数Object… obj 和 Object[] 的区别

    Java不定参数Object… obj 和 Object[] 的区别 简述: java中方法重载可以实现参数不同自动匹配对应方法.但现实中也存在这种问题.普通传参对于形如下面的方法,却显得臃肿而失优雅 ...

随机推荐

  1. 安装VUE教程

    这段时间公司要准备开始用VUE,安装的过程中就遇到各种奇葩问题 1.Node.js安装 https://nodejs.org/en/download/ 安装好noedeJS然后继续安装下一步 3.执行 ...

  2. poj2186--tarjan+缩点(有向图的强连通分量中点的个数)

    题目大意:       每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也 ...

  3. 在docker容器下利用数据卷实现在删除了mysql容器或者镜像的情况下恢复数据

    当把mysql容器销毁,在新建一个容器,进行之前的数据恢复. 因为之前建立了数据卷,那么现在就可以利用这个数据卷进行数据恢复. 使用docker volume create volume_name命令 ...

  4. vue项目1-pizza点餐系统3-路由知识点补充

    1.可以通过tag修改router-link的默认标签 <!--router-link标签默认是a标签,tag标签可以修改默认标签 --> <li><router-lin ...

  5. 62. Unique Paths (JAVA)

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  6. [易学易懂系列|golang语言|零基础|快速入门|(四)]

    今天开始,我们来写代码. 学习一门语言,最快的方式就是写代码,做项目. 别的学习教程,都是hello world. 我们就来点不一样的吧.我们不一样!不一样!不一样! 首先,打开VSCODE.( 关于 ...

  7. python基础练习题7

    1.创建Person类,属性有姓名.年龄.性别,创建方法personInfo,打印这个人的信息2.创建Student类,继承Person类,属性有学院college,班级class,重写父类perso ...

  8. Python之网路编程之socket简单介绍

    一.网络协议 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构(互联网中处处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器 C/S架构与socket的关系: ...

  9. tar命令--数据归档(二)

    tar -cf all.tar *.jpg 这条命令是将所有.jpg的文件打成一个名为all.tar的包.-c是表示产生新的包,-f指定包的文件名. tar -rf all.tar *.gif 这条命 ...

  10. windows窗口启动redis

    必须先得配置好环境变量,才能在窗口开启 启动服务端:redis-server 启动客户端:redis-cli