前言
小伙伴们大家好,前面我们已经学习了es6中的Set和WeakSet两种数据结构,今天将给大家分享es6为我们提供的另一种数据结构Map。
大家都知道在JavaScript的对象(Object)中,只能用字符串类型作为对象的key,即使我们在写的时候用了其它类型的key,那么Object也会自动把它转换为字符串类型。但有时候由于业务需要,我们想用一些其它类型来作为对象的key,比如说dom对象,这个时候Object显然已经无法满足我们的需求了,因为dom对象最终会被转换为字符串类型[object HTMLDivElement]。为了解决这个问题,ES6 为我们提供了 Map 数据结构。下面我们来具体分析。
Map
ES6中的Map数据结构类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构则提供了“值—值”的对应,是一种更完善的 Hash 结构实现。Map数据结构有如下一些特点:
- Map是键值对的集合,键值不限于字符串,可以是任意数据类型
- Map通过set方法添加成,通过get方法来获取成员
- Map也是构造函数,也可以接受一个数组作为参数,但该数组的成员也必须是一个个表示键值对的数组。例如:[[“name”,“Alvin”],[“age”,18]]
- 不仅仅是数组,任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作Map构造函数的参数。包括Set和Map本身。
- 如果对同一个键多次赋值,后面的值将覆盖前面的值
- 如果读取一个不存在的键则返回undefined
- 只有对同一对象的引用,Map才会视为同一个键。也就是说两个对象的内存地址是一样的,才会被视为是同一个键。(Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键)
- 如果Map的键值是一个基本类型(数字,字符串,布尔等),则只要两个值严格相等(类型和值都相等)才算是同一个键,如0和-0就是同一键,而true和"true"则是两个键
- undefined 和 null是两个不同的键
- NaN在Map中被视为同一个键
下面我们来看一些小案例
//1. 任意类型作为键名
//2. 通过set添加成员,get访问成员
const m = new Map();
const o = {
"p": 'Hello World'};
m.set(o, 'content')
m.get(o) // "content"
//3. 数组作为构造函数的参数,且数组的成员必须也是包含了一个个表示键值对的数组
const map = new Map([
['name', 'Alvin'],
['age', 18]
]);
map.get("name");//"Alvin"
map.get('age') // 18
//4. Set和Map对象作为Map构造函数的参数
const set