开篇

ES6里除了增加了Set(集合)类型外(笔者在这篇文章《Set与WeakSet》有过介绍),今天的这篇文章笔者将继续介绍ES6引入的新类型——Map(映射类型)和其对应的弱类型WeakMap。映射类型在计算机科学中定义属于关联数组,而关联数组的定义是若干键值对(Key/Value Pair)组成的集合,其中每个Key值都只能出现一次。

本篇文章将从以下方面进行介绍:

  • Map代码示例

  • Map常用方法示例

  • Map与Object的区别

  • weakMap介绍

本篇文章阅读时间预计5分钟

01

Map代码示例

Map的键和值可以是任何数据类型,键值对按照插入顺序排列,下段代码演示了Map的一些用法:

let map = new Map();let o = {n: 1};map.set(o, "A"); //addmap.set("2", 9);console.log(map.has("2")); //check if key existsconsole.log(map.get(o)); //retrieve value associated with keyconsole.log(...map);console.log(map);map.delete("2"); //delete key and associated valuemap.clear(); //delete everything//create a map from iterable objectlet map_1 = new Map([[1, 2], [4, 5]]);console.log(map_1.size); //number of keys

上述代码将会输出:

trueA[ { n: 1 }, 'A' ] [ '2', 9 ]Map { { n: 1 } => 'A', '2' => 9 }2

从上述代码中,我们可以看出使用new Map()语法进行声明,Map键的类型可以使用任意对象作为键(字符串,object类型),我们还可以直接以二维数组键值对的形传入到构建函数中,第一项为键,后一项为值。

Map中如果插入重复的键,会怎么样?如下段代码所示:

const map=new Map([['foo',1],['foo',2]]);console.log(map);console.log(map.get('foo'));

上述代码将会输出:

Map { 'foo' => 2 }2

上述代码我们可以看出,如果存在相同的键,则会按照FIFO(First in First Out,先进先出)原则,后面的键值信息会覆盖前面的键值信息。

02

Map常用方法示例

以下表格罗列了Map相关的常用操作方法:

操作方法

内容描述

map.set(key,value)

添加键值对到映射中

map.get(key)

获取映射中某一个键的对应值

map.delete(key)

将某一键值对移除映射

map.clear()

清空映射中所有键值对

map.entries()

返回一个以二元数组(键值对)作为元素的数组

map.has(key)

检查映射中是否包含某一键值对

map.keys()

返回一个当前映射中所有键作为元素的可迭代对象

map.values()

返回一个当前映射中所有值作为元素的可迭代对象

map.size

映射中键值对的数量

增删键值对与清空MAP

let user={name:"Aaron",id:1234};let userHobbyMap=new Map();userHobbyMap.set(user,['Ice fishing','Family Outting']);//添加键值对console.log(userHobbyMap);userHobbyMap.delete(user);//删除键值对userHobbyMap.clear(); //清空键值对console.log(userHobbyMap);

上述代码将会输出:

Map { { name: 'Aaron', id: 1234 } => [ 'Ice fishing', 'Family Outting' ] }Map {}


获取键值对

与Set集合对象不一样,集合对象的元素没有元素位置的标识,故没有办法获取集合某元素,但是映射对象由键值对组成,所以可以利用键来获取对应的值。

const map=new Map();map.set('foo', 'bar');console.log(map.get('foo')); //output bar

检查映射对象中是否存在某键

与Set集合一样,Map映射也可以使用has(键)的方法来检查是否包含某键。

const map=new Map([['foo',1]]);console.log(map.has('foo'));//output trueconsole.log(map.has('bar'));//output false


遍历映射中的键值对

映射对象在设计上同样也是一种可迭代的对象,可以通过for-of循环对其遍历,同时也可以使用foreach进行遍历。

映射对象中带有entries()方法,用于返回包含所有键值对的可迭代的二元数组对象,而for-of和foreach便是先利用entries()方法先将映射对象转换成一个类数组对象,然年再进行迭代。

const map=new Map([['foo',1],['bar',2]]);console.log(Array.from(map.entries()));//output//[ [ 'foo', 1 ], [ 'bar', 2 ] ]for(const [key,value] of map){    console.log(`${key}:${value}`);}//output//foo:1//bar:2map.forEach((value,key,map)=>    console.log(`${key}:${value}`))//output//foo:1//bar:2


03

Map与Object的区别

说了这么多映射对象的方法,Map和Object对象有哪些区别呢?以下表格进行了总结:

对比项

映射对象Map

Object对象

存储键值对

遍历所有的键值对

检查是否包含指定的键值对

使用字符串作为键

使用Symbol作为键

使用任意对象作为键

可以很方便的得知键值对的数量

从中我们可以看出Map对象可以使用任何对象作为键,这就解决了我们实际应用中一个很大的痛点,比如现在有一个DOM对象作为键时,Object就不是那么好用了。

04

WeakMap

与集合类型(Set)一样,映射类型也有一个Weak版本的WeakMap。WeakMap和WeakSet很相似,只不过WeakMap的键会检查变量的引用,只要其中任意一个引用被释放,该键值对就会被删除。

以下三点是Map和WeakMap的主要区别:

  1. Map对象的键可以是任何类型,但WeakMap对象中的键只能是对象引用

  2. WeakMap不能包含无引用的对象,否则会被自动清除出集合(垃圾回收机制)。

  3. WeakSet对象是不可枚举的,无法获取大小。

下段代码示例验证了WeakMap的以上特性:

let weakmap = new WeakMap();(function(){    let o = {n: 1};    weakmap.set(o, "A");})();  // here 'o' key is garbage collectedlet s = {m: 1};weakmap.set(s, "B");console.log(weakmap.get(s));console.log(...weakmap); // exception thrownweakmap.delete(s);weakmap.clear(); // Exception, no such functionlet weakmap_1 = new WeakMap([[{}, 2], [{}, 5]]); //this worksconsole.log(weakmap_1.size); //undefined”
const weakmap=new WeakMap();let keyObject={id:1};const valObject={score:100};weakmap.set(keyObject, valObject);console.log(weakmap.get(keyObject));//output { score: 100 }keyObject=null;console.log(weakmap.has(keyObject));//output false


05

小节

今天的内容就介绍到这里,我们明白了Map是一个键值对的映射对象,相比Object来说可以使用任何键做为键值,并且能够很方便的获取键值对。WeakMap相对于Map是一个不可枚举的对象,必须使用对象作为键值。如何更好的使用Map和WeakMap还需要具体结合我们实际的业务场景进行灵活使用。

精彩推荐

ES6基础丨let和作用域

ES6基础丨const介绍

ES6基础丨默认参数值

ES6基础丨展开语法(Spread syntax)

ES6基础丨解构赋值(destructuring assignment)

ES6基础丨箭头函数(Arrow functions)

ES6基础丨模板字符串(Template String)

ES6基础丨Set与WeakSet

JavaScript基础丨前端不懂它,会再多框架也不过只是会用而已!

JavaScript基础丨你真的了解JavaScript吗?

JavaScript基础丨回调(callback)是什么?

JavaScript基础丨Promise使用指南

JavaScript基础丨深入学习async/await

JS加载慢?谷歌大神带你飞!(文末送电子书)

19年你应该关注这50款前端热门工具(上)

19年你应该关注这50款前端热门工具(中)

19年你应该关注这50款前端热门工具(下)

专注分享当下最实用的前端技术。关注前端达人,与达人一起学习进步!

长按关注"前端达人"

【ES6基础】Map与WeakMap相关推荐

  1. ES6 中的 Set、Map 和 WeakMap

    ES6 新增了几种集合类型,本文介绍 Set.Map 和 WeakMap.比较新的 Firefox.Chrome(需要在 about:flags 启用实验性 JavaScript)以及 IE11 都有 ...

  2. 第十七节:ES6新增的Map和WeakMap 又是什么东西?

    上节介绍了Set和WeakSet,这节咱就讲Map和WeakMap是什么?当然,两者之前并没什么必然的联系,仅仅是用法类似. 什么是Map 介绍什么是Map,就不得不说起Object对象,我们都知道O ...

  3. ES6——Map和WeakMap

    ES6 提供了新的数据结构 Map. 它有九个常用方法: 通过键检查元素是否存在 has(key) 添加元素 set(key , value) 通过键移除元素 delete(key) 通过键获取值 g ...

  4. 【ES6基础】Object的新方法

    Object对象可谓是JS的重要核心内容,在你使用JS的过程中,你会发现自己的工作大部分都是在操作对象,ES6.ES7.ES8引入了不少新的方法,本篇文章笔者将带着大家一起熟悉下重点的新方法. 本篇文 ...

  5. android log 如何获取double类型后小数点的值_【ES6基础】Symbol介绍:独一无二的值...

    开篇 ES6之前我们都清楚JS有六种数据类型:Undefined.Null.布尔值(Boolean).字符串(String).数值(Number).对象(Object),今天笔者讲的Symbol类型是 ...

  6. 【ES6基础】Symbol介绍:独一无二的值

    开篇 ES6之前我们都清楚JS有六种数据类型:Undefined.Null.布尔值(Boolean).字符串(String).数值(Number).对象(Object),今天笔者讲的Symbol类型是 ...

  7. ES6基础4(数据结构)-学习笔记

    文章目录 ES6基础4(数据结构)-学习笔记 set map symbol ES6基础4(数据结构)-学习笔记 set //set 数据结构 类似数组 成员信息唯一性var s = new Set() ...

  8. ES6基础(var let const 箭头函数)-学习笔记

    文章目录 ES6基础(var let const 箭头函数)- 学习笔记 定义:var let const 箭头函数 数据结构 set map ES6基础(var let const 箭头函数)- 学 ...

  9. Map与WeakMap

    Map与WeakMap Map对象用来保存键值对,并且能够记住键的原始插入顺序,任何对象或者原始值都可以作为键或者是值. WeakMap对象同样用来保存键值对,对于键是弱引用的而且必须为一个对象,而值 ...

最新文章

  1. ExecuteNonQuery() 返回值
  2. 修改时间服务器失败,电脑系统同步时间失败怎么办 修改时间服务器的方法。...
  3. (转)Django ==== 实战学习篇五 模板系统说明
  4. 是时候该了解一波Protocol Buffers了[Java]
  5. python实现给微信指定好友定时发消息
  6. java从0单排之java就业培训教程复习与面试题回顾——02
  7. linux autorun.sh,linux autorun使用详解
  8. 软件测试工程师面试题之操作系统
  9. 码率/比特率完整介绍
  10. 验证邮箱地址和手机号码
  11. 报错:Solving environment: failed with initial frozen solve. Retrying with flexible solve.
  12. Kafka: Consumer
  13. python实现杨辉三角思路_Python极简代码实现杨辉三角示例代码
  14. YY游戏云的AngularJS实践(转载)
  15. 做好准备:独立游戏开发人员适用的 4P 营销理论
  16. a55计算机主板,A55架构简介与A55主板赏析
  17. 卡内基梅隆大学(CMU)的Eric Xing(邢波)教授为什么能读完一般学校的分子生物学PhD后到伯克利去CS PhD?
  18. 计算机无法开机 警报器在响,按下开机键以后报警器一直滴滴滴的响,而且电脑开启不了,响了一段时...
  19. 计算机文化基础(高职高专版 第十一版)第四章答案
  20. MySQL图形管理软件安装及使用

热门文章

  1. 【欧拉计划第 5 题】最小公倍数 Smallest multiple
  2. 【一元多项式算法】设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接。设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中。
  3. 51单片机 | 外部中断实验
  4. 短视频营销的3个重点:KOL化+话题性+深度互动
  5. ID3西瓜决策树python实现
  6. 2016中国IT用户满意度总体保持平稳
  7. python KS-检验(Kolmogorov-Smirnov test) -- 检验数据是否符合某种分布
  8. Centos6 安装yum 完美安装(转载)
  9. php早午晚问候语_微信午安问候语
  10. _kbhit()以及_getch()函数的用法