在传统JS操作对象是,通常只能用字符串来作为对象的键,在一定程度上是有限制的,在新的标准中,使用map数据结构可以放宽对象键的类型,理论上对象的键可以是任何类型,下面详细说明下map数据结构 。
1.map的申明
const map = new Map();
//或
const map = new Map([
['name', 'smith'],
['age', 20]
]);
以上可以新申明一个map的实例,可以接受数组作为参数,其中数组内的每一个数组表示Map实例的键和值
2.map的实例属性及方法
set方法
let obj = {a: 1};
let dis = new Map();
map.set('test', 1); //键是字符串
map.set(obj, 1); //键是对象
map.set(dis, 1); //键是Map实例
理论上Map实例的键值可以是任何类型
get方法
map.get('test');
map.get(obj);
map.get(dis);
这里注意不能用map.get({a: 1}),此时取不到值的,因为此时的{a:1}与obj是不同的引用,对象作为键必须是相同的引用才能得到正确的值
size属性
map.size; // 3('test',obj,dis)
获得当前实例的长度
has方法
map.has('test'); // true
map.has({a: 1}); // false
map.has(dis); // true
以上也可看出,涉及到不同存储地址的对象不是相同的引用
delete方法
map.delete('test');
map.has('test'); // false
删除指定键的部分
clear方法
map.size; // 2(obj, dis)
map.clear();
map.size; // 0
清空当前实例
3.map遍历方法
Map 结构原生提供三个遍历器生成函数和一个遍历方法
keys() //返回键名的遍历器。
values() //返回键值的遍历器。
entries() //返回所有成员的遍历器。
forEach() //遍历 Map 的所有成员。
具体使用如下所示
for(let key of map.keys()) {
console.log(key);
}
//'size'
//{a: 1}
//Map(0) {}
for(let val of map.values()) {
console.log(key);
}
//1
//1
//1
for(let [key, val] of map.entries()) {
console.log(key,val);
}
//'size' 1
//{a: 1} 1
//Map(0) {} 1
for(let [key, val] of map) {
console.log(key,val);
}
//'size' 1
//{a: 1} 1
//Map(0) {} 1
由上面例子可以看出map.entries()等价于map默认的遍历器接口
map[Symbol.iterator] === map.entries;// true
此外map还有类似数组的forEach遍历方法,使用方法与数组的使用方法相同