浅谈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 控制 html元素 显示/隐藏实现代码
Sep 01 Javascript
最新28个很棒的jQuery 教程
May 28 Javascript
复选框全选与全不选操作实现思路
Aug 18 Javascript
javascript 获取iframe里页面中元素值的方法
Feb 17 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
Jun 09 Javascript
javascript 闭包详解
Feb 15 Javascript
Bootstrap Chart组件使用教程
Apr 28 Javascript
浅谈JavaScript的push(),pop(),concat()方法
Jun 03 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
Jun 12 Javascript
js实现转动骰子模型
Oct 24 Javascript
浅谈Node新版本13.2.0正式支持ES Modules特性
Nov 25 Javascript
解决vue自定义组件@click点击失效问题
Apr 30 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中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
用php简单实现加减乘除计算器
2014/01/06 PHP
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
PHP二维数组去重算法
2016/12/17 PHP
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
jQuery使用数组编写图片无缝向左滚动
2012/12/11 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
详解ES6 Fetch API HTTP请求实用指南
2018/11/14 Javascript
js数组去重的方法总结
2019/01/18 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
django框架使用orm实现批量更新数据的方法
2019/06/21 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
使用Python完成15位18位身份证的互转功能
2019/11/06 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
博士研究生自我鉴定范文
2013/12/04 职场文书
挂职思想汇报
2013/12/31 职场文书
英文求职信写作小建议
2014/02/16 职场文书
项目负责人任命书
2014/06/04 职场文书
小学兴趣小组活动总结
2014/07/07 职场文书
责任书范本大全
2015/05/11 职场文书