浅谈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 相关文章推荐
图片Slider 带左右按钮的js示例
Aug 30 Javascript
jquery提交form表单时禁止重复提交的方法
Feb 13 Javascript
使用typeof判断function是否存在于上下文
Aug 14 Javascript
JavaScript中创建字典对象(dictionary)实例
Mar 31 Javascript
JavaScript解八皇后问题的方法总结
Jun 12 Javascript
js实现统计字符串中特定字符出现个数的方法
Aug 02 Javascript
如何理解jQuery中的ajaxSubmit方法
Mar 13 Javascript
three.js中文文档学习之如何本地运行详解
Nov 20 Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
Dec 27 Javascript
Vue项目中如何引入icon图标
Mar 28 Javascript
JavaScript实现新年倒计时效果
Nov 17 Javascript
JavaScript实现电灯开关小案例
Mar 30 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
CodeIgniter框架提示Disallowed Key Characters的解决办法
2014/04/21 PHP
CI框架中redis缓存相关操作文件示例代码
2016/05/17 PHP
PHP explode()函数用法讲解
2019/02/15 PHP
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
JavaScript Date 知识浅析
2017/01/29 Javascript
详解vue-router 2.0 常用基础知识点之router-link
2017/05/10 Javascript
Node.js 异步异常的处理与domain模块解析
2017/05/10 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
vue.js中使用echarts实现数据动态刷新功能
2019/04/16 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
elementUI同一页面展示多个Dialog的实现
2020/11/19 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
Pytorch 实现权重初始化
2019/12/31 Python
Kmeans均值聚类算法原理以及Python如何实现
2020/09/26 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
极简的HTML5模版
2015/07/09 HTML / CSS
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
区域销售经理职责
2013/12/22 职场文书
专业技术职务聘任书
2014/03/29 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
银行授权委托书样本
2014/10/13 职场文书
2014年资料员工作总结
2014/11/18 职场文书
高三英语教学计划
2015/01/23 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python
Linux下搭建SFTP服务器的命令详解
2022/06/25 Servers