浅谈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计算时间差函数
Oct 28 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
Oct 14 Javascript
JavaScript检测实例属性, 原型属性
Feb 04 Javascript
jQuery实现定时读取分析xml文件的方法
Jul 16 Javascript
jquery带翻页动画的电子杂志代码分享
Aug 21 Javascript
JQuery实现Ajax加载图片的方法
Dec 24 Javascript
jquery限定文本框只能输入数字(整数和小数)
Jan 08 Javascript
简单谈谈JS数组中的indexOf方法
Oct 13 Javascript
jquery操作ul的一些操作笔记整理(干货)
Aug 31 jQuery
js数组方法reduce经典用法代码分享
Jan 07 Javascript
vue-cli3 取消eslint校验代码的解决办法
Jan 16 Javascript
原生JavaScript实现购物车
Jan 10 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读取flv文件的播放时间长度
2009/09/03 PHP
php编写简单的文章发布程序
2015/06/18 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
2017/08/02 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
JQuery扩展插件Validate 2通过参数设置验证规则
2011/09/05 Javascript
js异步加载的三种解决方案
2013/03/04 Javascript
js常用自定义公共函数汇总
2014/01/15 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
JavaScript中的原始值和复杂值
2016/01/07 Javascript
javascript中setAttribute兼容性用法分析
2016/12/12 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
原生js实现淘宝放大镜效果
2020/10/28 Javascript
Vue编程式跳转的实例代码详解
2019/07/10 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
python 查找字符串是否存在实例详解
2017/01/20 Python
python基础_文件操作实现全文或单行替换的方法
2017/09/04 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
简单了解python高阶函数map/reduce
2019/06/28 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
Python使用configparser库读取配置文件
2020/02/22 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
优衣库英国官网:UNIQLO英国
2016/12/25 全球购物
个人授权委托书格式
2014/08/30 职场文书
离婚财产分配协议书
2014/10/21 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
我的法兰西岁月观后感
2015/06/09 职场文书
教师节简报
2015/07/20 职场文书
推广普通话主题班会
2015/08/17 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS