ES6学习之路9----Map数据结构
来源:互联网 发布:淘宝店铺怎么做淘宝客 编辑:程序博客网 时间:2024/05/18 00:30
什么是Map数据结构
Map数据结构类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
实例:
//ES5:var obj = {},arr = {'a':1};obj[arr] = 'Array';console.log(obj);//{'[object Object]':'Array'}//ES6:let map = new Map(),obj = {'a':1};map.set(obj,'Array');console.log(map);//{{…} => "Array"}map.get(obj);//"Array"map.has(obj);//truemap.delete(obj);//truemap.has(obj);//false
从上边实例可以看出在ES5的时候,对象的键值都是字符串,如果不是字符串会进行隐式转换为字符串,保存的结果就不是最开始的初衷。map数据结构就是让键值可以是各种类型的值。
创建Map初始化成员的格式
Map 作为构造函数, 可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。
实例:
let map = new Map([ ['autnor', 'Rattenking'], ['age', '26'], ['sex','gentleman']]);map.size // 3map.has('autnor'); // truemap.get('autnor'); // "Rattenking"map.has('age'); // truemap.get('age'); //"26"map.has('sex'); // truemap.get('sex'); //"gentleman"console.log(map);//{"autnor" => "Rattenking", "age" => "26", "sex" => "gentleman"}
实现map初始数据的原理
let arr = [ ['autnor', 'Rattenking'], ['age', '26'], ['sex','gentleman']]let map = new Map();arr.forEach(current => map.set(current[0],current[1]));console.log(map);//{"autnor" => "Rattenking", "age" => "26", "sex" => "gentleman"}
注意事项
1.任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作Map构造函数的参数。
let set = new Set([['autnor', 'Rattenking'],['age', '26']]);let map = new Map(set);console.log(map);//{"autnor" => "Rattenking", "age" => "26"}
2.对同一个键多次赋值,后面的值将覆盖前面的值。
let map = new Map();map.set('autnor','Rattenking');map.set('autnor','Stone');map.get('autnor');//"Stone"
- 读取一个未知的键,则返回undefined。
let map = new Map([['a',1]]);map.get('a');//1map.get('b');//undefined
4.只有对同一个对象的引用,Map 结构才将其视为同一个键。
let map = new Map();map.set(['autnor'],'Rattenking');map.get(['autnor']);//undefined
5.同理可推:同样的值的两个实例,在 Map 结构中被视为两个键。
let map = new Map();let arr1 = ['autnor', 'Rattenking'];let arr2 = ['autnor', 'Rattenking'];map.set(arr1,'Rattenking').set(arr2,'Stone');console.log(map);//{Array(2) => "Rattenking", Array(2) => "Stone"}map.get(arr1);//"Rattenking"map.get(arr2);//"Stone"
结论:Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。
6.NaN虽然不严格相等,但是在map中会认为是同一键值。其他键值根据严格相等(===)来判断是否为同一键值。
let map = new Map();NaN === NaN//falsemap.set(NaN,1);map.get(NaN);//1-0 === 0 && 0 === +0 && -0 === +0//truemap.set(-0,'num');map.get(+0);//'num'undefined === null//falsemap.set(undefined, undefined);map.set(null, null);map.get(undefined);//undefinedmap.get(null);//nulltrue === 'true'//falsemap.set(true,'bool');map.get('true');//undefined
Map实例的操作属性和方法
- size 属性返回 Map 结构的成员总数。
- set 方法设置键名key对应的键值为value,然后返回整个 Map 结构。
- get 方法读取key对应的键值,如果找不到key,返回undefined。
- has 方法查找某个键是否在当前 Map 对象之中,返回一个布尔值。
- delete 方法删除某个键,返回一个布尔值 。
- clear 方法清除所有成员,没有返回值。
Map实例的遍历方法
- keys():返回键名的遍历器。
- values():返回键值的遍历器。
- entries():返回所有成员的遍历器。
- forEach():遍历 Map 的所有成员。
总结:
- 任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作Map构造函数的参数。—-Map构造函数的参数
- 对同一个键多次赋值,后面的值将覆盖前面的值。—-同名键值的赋值会覆盖前边的值
- 读取一个未知的键,则返回undefined。—-获取map中不存在的键值,返回undefined
- 只有对同一个对象的引用,Map 结构才将其视为同一个键。—-只有内存地址相同的引用,Map 结构才将其视为同一个键
- Map 结构除了NaN是同一键值,其他值的键值都遵循严格相等运算符(===)。
阅读全文
0 0
- ES6学习之路9----Map数据结构
- ES6学习之路~~数据结构:set和map
- ES6学习之路(六) Map&WeakMet
- ES6学习之路7----set数据结构
- ES6学习之路8----WeakSet数据结构
- 4、数据结构 Map—ES6学习笔记
- ES6之Set和Map数据结构
- ES6-新数据结构Map
- ES6--数据结构Map
- js-es6-Map数据结构
- 学习笔记:ES6之Set-map
- ES6学习笔记(五)Set和Map数据结构
- ES6学习10章:Set和Map数据结构
- es6 javascript的map数据结构
- es6 set和map数据结构
- 10、ES6 新增数据结构Map
- ES6系列之---Map
- ES6之SET数据结构
- 使用idea commit代码时遇到的detached head 问题的解决
- JavaSpring之Aop应用(java项目)
- spark(10)-spark高级排序(course19)
- 文章标题
- 关于linux ubuntu的常用命令(不定时更新)
- ES6学习之路9----Map数据结构
- 机器学习之-决策树算法【人工智能工程师--AI转型必修课】
- PHP利用openssl整理AES加解密类
- CentOS7 安装 Nginx
- 括号字符串的相关问题 Python 版
- 蓝桥杯 算法训练 Torry的困惑(基本型)
- 引用pdf插件在线预览的问题
- Eclipse 反编译插件JadClipse安装
- 八周一次课(12月11日) 14.4 多进程锁 14.5 多进程共享内存