0
点赞
收藏
分享

微信扫一扫

ES6扩展:Map数据结构

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 更合适

举报

相关推荐

0 条评论