浅谈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实现的鼠标链接提示效果生成器代码
Jun 28 Javascript
纯Javascript实现Windows 8 Metro风格实现
Oct 15 Javascript
jQuery如何取id有.的值一般的方法是取不到的
Apr 18 Javascript
跟我学习JScript的Bug与内存管理
Nov 18 Javascript
基于jQuery实现二级下拉菜单效果
Feb 01 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
Oct 27 Javascript
jQuery实现弹出窗口弹出div层的实例代码
Jan 09 Javascript
JQuery 封装 Ajax 常用方法(推荐)
May 21 jQuery
清空元素html("") innerHTML="" 与 empty()的区别和应用(推荐)
Aug 14 Javascript
jQuery选择器之基本选择器用法实例分析
Feb 19 jQuery
js实现点击按钮随机生成背景颜色
Sep 05 Javascript
深入讲解Vue中父子组件通信与事件触发
Mar 22 Vue.js
利用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转换颜色为其反色的方法
2015/04/27 PHP
PHP设计模式之观察者模式实例
2016/02/22 PHP
php基于openssl的rsa加密解密示例
2016/07/11 PHP
yii2学习教程之5种内置行为类详解
2017/08/03 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
PHP基于PDO扩展操作mysql数据库示例
2018/12/24 PHP
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
提高javascript效率 一次判断,而不要次次判断
2012/03/30 Javascript
动态添加删除表格行的js实现代码
2014/02/28 Javascript
js截取中英文字符串、标点符号无乱码示例解读
2014/04/17 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
Python实现字符串格式化的方法小结
2017/02/20 Python
python3.4用函数操作mysql5.7数据库
2017/06/23 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
2018/01/04 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
乐高瑞士官方商店:LEGO CH
2020/08/16 全球购物
销售副总经理岗位职责
2013/12/11 职场文书
大四自我鉴定
2014/02/08 职场文书
岗位职责风险防控
2014/02/18 职场文书
服务理念标语
2014/06/18 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
出纳试用期自我评价
2015/03/10 职场文书
聊聊redis-dump工具安装问题
2022/01/18 Redis