ES6学习之路9----Map数据结构

什么是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);//true
map.delete(obj);//true
map.has(obj);//false

从上边实例可以看出在ES5的时候,对象的键值都是字符串,如果不是字符串会进行隐式转换为字符串,保存的结果就不是最开始的初衷。map数据结构就是让键值可以是各种类型的值。

创建Map初始化成员的格式

Map 作为构造函数, 可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。

实例:

let map = new Map([
  ['autnor', 'Rattenking'],
  ['age', '26'],
  ['sex','gentleman']
]);

map.size // 3
map.has('autnor'); // true
map.get('autnor'); // "Rattenking"
map.has('age'); // true
map.get('age'); //"26"
map.has('sex'); // true
map.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');//1
map.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//false
map.set(NaN,1);
map.get(NaN);//1

-0 === 0 && 0 === +0 && -0 === +0//true
map.set(-0,'num');
map.get(+0);//'num'

undefined === null//false
map.set(undefined, undefined);
map.set(null, null);
map.get(undefined);//undefined
map.get(null);//null

true === 'true'//false
map.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是同一键值,其他值的键值都遵循严格相等运算符(===)。

其他

我的博客,欢迎交流!

我的CSDN博客,欢迎交流!

微信小程序专栏

前端笔记专栏

微信小程序实现部分高德地图功能的DEMO下载

微信小程序实现MUI的部分效果的DEMO下载

微信小程序实现MUI的GIT项目地址

微信小程序实例列表

前端笔记列表

游戏列表

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rattenking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值