浅谈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 相关文章推荐
JavaScript 调试器简介
Feb 21 Javascript
利用谷歌地图API获取点与点的距离的js代码
Oct 11 Javascript
JSON传递bool类型数据的处理方式介绍
Sep 18 Javascript
浅谈javascript中字符串String与数组Array
Dec 31 Javascript
JavaScript中window.open用法实例详解
Apr 15 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
Sep 09 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
May 17 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
Jul 13 Javascript
JavaScript中错误正确处理方式小结你用对了吗
Oct 10 Javascript
使用JS中的Replace()方法遇到的问题小结
Oct 20 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
Mar 22 Javascript
Seajs源码详解分析
Apr 02 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
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
PHP基于PDO扩展操作mysql数据库示例
2018/12/24 PHP
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
jQuery中queue()方法用法实例
2014/12/29 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
weUI应用之JS常用信息提示弹层的封装
2016/11/21 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
详解vuex之store源码简单解析
2019/06/13 Javascript
微信小程序如何获取群聊的openGid以及名称详解
2019/07/17 Javascript
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
Python中的localtime()方法使用详解
2015/05/22 Python
Python实现的rsa加密算法详解
2018/01/24 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
Python中asyncio与aiohttp入门教程
2018/10/16 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
python 写一个性能测试工具(一)
2020/10/24 Python
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
《天安门广场》教学反思
2014/04/23 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
招商引资工作汇报材料
2014/10/28 职场文书
2014年工人工作总结
2014/11/25 职场文书
升学宴答谢词
2015/01/05 职场文书
微信小程序实现聊天室功能
2021/06/14 Javascript