浅谈es6 javascript的map数据结构


Posted in Javascript onDecember 14, 2017

本文介绍了es6 javascript的map数据结构,分享给大家,具体如下:

Map 结构的目的和基本用法

JavaScript 的对象( Object), 本质上是键值对的集合( Hash 结构), 但是传统上只能用字符串当作键。 这给它的使用带来了很大的限制。

var data = {}; 
var element = document.getElementById('myDiv'); 
data[element] = 'metadata'; 
data['[object HTMLDivElement]'] // "metadata"

上面代码原意是将一个 DOM 节点作为对象data的键, 但是由于对象只接受字符串作为键名, 所以element被自动转为字符串[object HTMLDivElement]。

为了解决这个问题, ES6 提供了 Map 数据结构。 它类似于对象, 也是键值对的集合, 但是“ 键” 的范围不限于字符串, 各种类型的值( 包括对象) 都可以当作键。 也就是说, Object 结构提供了“ 字符串— 值” 的对应, Map 结构提供了“ 值— 值” 的对应, 是一种更完善的 Hash 结构实现。 如果你需要“ 键值对” 的数据结构, Map 比 Object 更合适。

var m = new Map(); 
var o = { 
 p: 'Hello World' 
}; 
m.set(o, 'content') 
m.get(o) // "content" 
m.has(o) // true 
m.delete(o) // true 
m.has(o) // false

上面代码使用set方法, 将对象o当作m的一个键, 然后又使用get方法读取这个键, 接着使用delete方法删除了这个键。
作为构造函数, Map 也可以接受一个数组作为参数。 该数组的成员是一个个表示键值对的数组。

var map = new Map([ 
 ['name', ' 张三 '], 
 ['title', 'Author'] 
]); 
map.size // 2 
map.has('name') // true 
map.get('name') // " 张三 " 
map.has('title') // true 
map.get('title') // "Author"

上面代码在新建 Map 实例时, 就指定了两个键name和title。

Map 构造函数接受数组作为参数, 实际上执行的是下面的算法。

var items = [ 
 ['name', ' 张三 '], 
 ['title', 'Author'] 
]; 
var map = new Map(); 
items.forEach(([key, value]) => map.set(key, value));

下面的例子中, 字符串true和布尔值true是两个不同的键。

var m = new Map([ 
 [true, 'foo'], 
 ['true', 'bar'] 
]); 
m.get(true) // 'foo' 
m.get('true') // 'bar'

如果对同一个键多次赋值, 后面的值将覆盖前面的值。

let map = new Map(); 
map 
 .set(1, 'aaa') 
 .set(1, 'bbb'); 
map.get(1) // "bbb"

上面代码对键1连续赋值两次, 后一次的值覆盖前一次的值。

如果读取一个未知的键, 则返回undefined。

new Map().get('asfddfsasadf') 
 // undefined

注意, 只有对同一个对象的引用, Map 结构才将其视为同一个键。 这一点要非常小心。

var map = new Map(); 
map.set(['a'], 555); 
map.get(['a']) // undefined

上面代码的set和get方法, 表面是针对同一个键, 但实际上这是两个值, 内存地址是不一样的, 因此get方法无法读取该键, 返回undefined。

同理, 同样的值的两个实例, 在 Map 结构中被视为两个键。

var map = new Map(); 
var k1 = ['a']; 
var k2 = ['a']; 
map 
 .set(k1, 111) 
 .set(k2, 222); 
map.get(k1) // 111 
map.get(k2) // 222

上面代码中, 变量k1和k2的值是一样的, 但是它们在 Map 结构中被视为两个键。

由上可知, Map 的键实际上是跟内存地址绑定的, 只要内存地址不一样, 就视为两个键。 这就解决了同名属性碰撞( clash) 的问题, 我们扩展别人的库的时候, 如果使用对象作为键名, 就不用担心自己的属性与原作者的属性同名。

如果 Map 的键是一个简单类型的值( 数字、 字符串、 布尔值), 则只要两个值严格相等, Map 将其视为一个键, 包括0和 - 0。 另外, 虽然NaN不严格相等于自身, 但 Map 将其视为同一个键。

let map = new Map(); 
map.set(NaN, 123); 
map.get(NaN) // 123 
map.set(-0, 123); 
map.get(+0) // 123

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
初窥JQuery(一)jquery选择符 必备知识点
Nov 25 Javascript
用JS控制回车事件的代码
Feb 20 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
Jul 26 Javascript
javascript如何动态加载表格与动态添加表格行
Nov 27 Javascript
通过隐藏iframe实现文件下载的js方法介绍
Feb 26 Javascript
纯javascript实现四方向文本无缝滚动效果
Jun 16 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
Apr 03 Javascript
微信小程序 页面传参实例详解
Nov 16 Javascript
ajax级联菜单实现方法实例分析
Nov 28 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
Apr 12 Javascript
JS实现AES加密并与PHP互通的方法分析
Apr 19 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
Feb 20 Javascript
利用Javascript实现一套自定义事件机制
Dec 14 #Javascript
vue登录注册及token验证实现代码
Dec 14 #Javascript
基于vue 实现token验证的实例代码
Dec 14 #Javascript
JavaScript实现左侧菜单效果
Dec 14 #Javascript
JavaScript实现全选取消效果
Dec 14 #Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
Dec 14 #Javascript
javascript实现数字配对游戏的实例讲解
Dec 14 #Javascript
You might like
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
PHP获取文件相对路径的方法
2015/02/26 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
微信支付开发交易通知实例
2016/07/12 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
PHP中16个高危函数整理
2019/09/19 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
AngularJS基础学习笔记之指令
2015/05/10 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
实例解析jQuery中如何取消后续执行内容
2016/12/01 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
微信小程序button标签open-type属性原理解析
2020/01/21 Javascript
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
在Python的Django框架中编写错误提示页面
2015/07/22 Python
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
Python网络编程详解
2017/10/31 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
深入理解python中sort()与sorted()的区别
2018/08/29 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
2018/10/26 Python
Pandas DataFrame中的tuple元素遍历的实现
2019/10/23 Python
python使用配置文件过程详解
2019/12/28 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
售后求职信范文
2014/03/15 职场文书
股权转让意向书
2014/04/01 职场文书
《故乡》教学反思
2014/04/10 职场文书
法人代表任命书范本
2014/06/05 职场文书
护理专科学生自荐书
2014/07/05 职场文书
婚前协议书范本
2014/10/27 职场文书
2015年学校保卫部工作总结
2015/05/11 职场文书
Redis全局ID生成器的实现
2022/06/05 Redis