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"
  1. 读取一个未知的键,则返回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实例的操作属性和方法

  1. size 属性返回 Map 结构的成员总数
  2. set 方法设置键名key对应的键值为value,然后返回整个 Map 结构
  3. get 方法读取key对应的键值,如果找不到key,返回undefined
  4. has 方法查找某个键是否在当前 Map 对象之中,返回一个布尔值
  5. delete 方法删除某个键,返回一个布尔值
  6. clear 方法清除所有成员,没有返回值

Map实例的遍历方法

  1. keys():返回键名的遍历器。
  2. values():返回键值的遍历器。
  3. entries():返回所有成员的遍历器。
  4. forEach():遍历 Map 的所有成员

总结:

  1. 任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作Map构造函数的参数。—-Map构造函数的参数
  2. 对同一个键多次赋值,后面的值将覆盖前面的值。—-同名键值的赋值会覆盖前边的值
  3. 读取一个未知的键,则返回undefined。—-获取map中不存在的键值,返回undefined
  4. 只有对同一个对象的引用,Map 结构才将其视为同一个键。—-只有内存地址相同的引用,Map 结构才将其视为同一个键
  5. Map 结构除了NaN是同一键值,其他值的键值都遵循严格相等运算符(===)。
原创粉丝点击