ES6扩展:Map数据结构
一、Map 是什么
键值对的集合 键->值,key->value
const m = new Map();
m.set('name', 'alex');
m.set('age', 18);
console.log(m);
//Map(2) {'name' => 'alex', 'age' => 18}
二、Map 和对象的区别
1)对象一般用字符串当作键
const obj = {
name: 'alex',
true: 'true',
[{}]: 'object'
};
console.log(obj); //{name: 'alex', true: 'true', [object Object]: 'object'}
console.log({}.toString()); //[object Object]
2)基本数据类型:数字、字符串、布尔值、undefined、null
引用数据类型:对象([]、{}、函数、Set、Map 等)
以上都可以作为 Map 的键
const m = new Map();
m.set('name', 'alex');
m.set(true, 'true');
m.set({}, 'object');
m.set(new Set([1, 2]), 'set');
m.set(undefined, 'undefined');
console.log(m);
三、Map 实例的方法
1、set
使用 set 添加的新成员,键如果已经存在,后添加的键值对覆盖已有的
const m = new Map();
m.set('age', 18).set(true, 'true').set('age', 20);
console.log(m);
//Map(2) {'age' => 20, true => 'true'}
Map不仅可以通过set
设置成员,还可以get
获取指定的成员
Set只能通过add
添加成员,不能获得指定成员 ,forEach
可以遍历
2、get
读取key对应的键值,如果找不到key,返回undefined。
console.log(m.get('age'));
// get 获取不存在的成员,返回 undefined
console.log(m.get('true')); //undefined
console.log(m.get(true)); //20
3、has
返回一个布尔值,表示某个键是否在当前 Map 对象之中。
const m = new Map();
m.set('edition', 6);
m.set(262, 'standard');
m.set(undefined, 'nah');
m.has('edition') // true
m.has('years') // false
m.has(262) // true
m.has(undefined) // true
4、delete
删除某个键,返回true。如果删除失败,返回false。
m.delete('age');
m.delete('name');
//使用 delete 删除不存在的成员,什么都不会发生,也不会报错
5、clear
清除所有成员,没有返回值。
m.clear();
6、forEach
遍历
map.forEach(function(value, key, map) {
console.log("Key: %s, Value: %s", key, value);
});
四、Map 实例的属性
size
属性返回 Map 结构的成员总数。
const map = new Map();
map.set('foo', true);
map.set('bar', false);
map.size //
五、构造函数的参数
1、数组:只能传二维数组,而且必须体现出键和值
console.log(new Map(['name', 'alex', 'age', 18])); //报错
console.log(
new Map([
['name', 'alex'],
['age', 18]
])
);
//Map(2) {'name' => 'alex', 'age' => 18}
2、Set、Map 等
Set 中也必须体现出键和值
const s = new Set([
['name', 'alex'],
['age', 18]
]);
console.log(new Map(s)); //Map(2) {'name' => 'alex', 'age' => 18}
console.log(s); //Set(2) {Array(2), Array(2)}
Map
const m1 = new Map([
['name', 'alex'],
['age', 18]
]);
console.log(m1); //Map(2) {'name' => 'alex', 'age' => 18}
const m2 = new Map(m1);
console.log(m2, m2 === m1); Map(2) {'name' => 'alex', 'age' => 18} false
六、Map 的注意事项
1、判断键名是否相同的方式
基本遵循严格相等(===)
例外就是 NaN,Map 中 NaN 也是等于 NaN
console.log(NaN === NaN); //false
const m = new Map();
m.set(NaN, 1).set(NaN, 2);
console.log(m); //Map(1) {NaN => 2}
2、什么时候使用 Map
如果只是需要 key -> value 的结构,或者需要字符串以外的值做键,使用 Map 更合适