浅谈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 相关文章推荐
大家未必知道的Js技巧收藏
Apr 07 Javascript
JS 巧妙获取剪贴板数据 Excel数据的粘贴
Jul 09 Javascript
JavaScript中检测变量是否存在遇到的一些问题
Nov 11 Javascript
JQuery动画animate的stop方法使用详解
May 09 Javascript
Eclipse配置Javascript开发环境图文教程
Jan 29 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
Feb 20 Javascript
jQuery解析返回的xml和json方法详解
Jan 05 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
May 17 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
Nov 13 Javascript
谈谈JavaScript令人迷惑的==与+
Aug 31 Javascript
vue常用高阶函数及综合实例
Feb 25 Vue.js
Vue监视数据的原理详解
Feb 24 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简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
js控制滚动条缓慢滚动到顶部实现代码
2013/03/20 Javascript
ScrollDown的基本操作示例
2013/06/09 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
jQuery实现的图片分组切换焦点图插件
2015/01/06 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
Vue组件化通讯的实例代码
2017/06/23 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
2020/04/12 Javascript
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
Vant picker 多级联动操作
2020/11/02 Javascript
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
Python 字符串中的字符倒转
2008/09/06 Python
Python抓取百度查询结果的方法
2015/07/08 Python
Python实战购物车项目的实现参考
2019/02/20 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
Pam & Gela官网:美国性感前卫女装品牌
2018/07/19 全球购物
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
学校经典推荐信
2013/10/30 职场文书
委托书的写法
2014/08/30 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
党的群众路线教育实践活动剖析材料
2014/09/30 职场文书
同事欢送会致辞
2015/07/31 职场文书