浅谈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 相关文章推荐
use jscript List Installed Software
Jun 11 Javascript
JavaScript中json使用自己总结
Aug 13 Javascript
jQuery学习之prop和attr的区别示例介绍
Nov 15 Javascript
js判断undefined类型示例代码
Feb 10 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
Aug 22 Javascript
jQuery实现可展开合拢的手风琴面板菜单
Sep 15 Javascript
JS中call/apply、arguments、undefined/null方法详解
Feb 15 Javascript
JavaScript中0和""比较引发的问题
May 26 Javascript
微信小程序 request接口的封装实例代码
Apr 26 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
May 22 Javascript
jquery实现动态改变css样式的方法分析
May 27 jQuery
javascript事件循环event loop的简单模型解释与应用分析
Mar 14 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中常用的转义函数
2014/02/28 PHP
typecho插件编写教程(三):保存配置
2015/05/28 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
php for 循环使用的简单实例
2016/06/02 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
2013/01/17 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
移动节点的jquery代码
2014/01/13 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
完善的jquery处理机制
2016/02/21 Javascript
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
JS产生随机数的几个用法详解
2016/06/22 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
关于JS与jQuery中的文档加载问题
2017/08/22 jQuery
jquery学习笔记之无new构建详解
2017/12/07 jQuery
angularjs 动态从后台获取下拉框的值方法
2018/08/13 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
基于asyncio 异步协程框架实现收集B站直播弹幕
2016/09/11 Python
Python列表(List)知识点总结
2019/02/18 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
Python数据处理篇之Sympy系列(五)---解方程
2019/10/12 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
美国牛仔品牌:True Religion
2018/11/16 全球购物
毕业生求职的求职信
2013/12/05 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
医学检验专业自荐信
2014/09/18 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
结婚司仪主持词
2015/06/29 职场文书
2015国庆节宣传语
2015/07/14 职场文书
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL