一、背景知识
JavaScript的对象(Object)本质上是键值对的集合(Hash结构),但是只能用字符串作为键:
const data = {};
const element = document.getElementById('myDiv');
data[element] = 'metadata';
data['[object HTMLDivElement]']; //"metadata"
上面代码原意是将一个DOM节点作为对象data的键,但由于对象只接受字符串作为键名,所以element被自动转为字符串[Object HTMLDivElement]。为解决这个问题,ES6引入了Map数据结构。它类似于对象,同样也是键值对的集合,但是“键”的范围不限于字符串,是一种更完整的Hash结构实现。
二、基本语法与特性
2.1 添加键值对
①set方法添加键值对:
const m = new Map();
const o = {p:"hello world"};
m.set(o,'GO');
m.get(o);//'GO'
②传入二维数组作为键值对:
const map =new Map([
['name','tony'],
['titile','Author'],
]);
map.size;//2
map.get('name'); //tony
map.get('title'); //Author
③传入二维Set:
const set = new Set([
['foo',1],
['bar',2],
])
const map = new Map(set);
map.get('foo');//1
事实上,任何具有Iterator接口且每个成员都是一个双元素数组的数据结构都可以当作Map构造函数的参数。
2.2键值覆盖
如果对同一个键多次赋值,后面的值将会覆盖前面的值。
const map = new Map();
map
.set(1,'aaa');
.set(1,'bbb');
map.get(1);//bbb
Tips:关于同一个键的定义,内存地址一样才能叫同一个键,比如:
const map = new Map();
map.set(['a'],555);
map.get(['a']);//undefined
三、实例的属性和方法
属性:Map.prototype.size:返回Map实例的长度
方法:
①.set(key,value):添加新键值对,然后返回整个Map结构(若键值已经存在,则可用来更新键值)
②.get(key):得到key对应的键值,若找不到key,返回undefined
③.has(key):返回一个布尔值,表示Map实例是否含有该键
④delete(key):删除某一个键,成功返回true,反之为false
⑤clear():消除所有成员,无返回值