ES6 - Map()的说明

288 阅读2分钟

含义

Map 是 ES6 新增的数据结构,类似对象,区别在于,普通对象的 key 是字符串或数字,而 Map 的 key 可以使任何数据类型

const m = new Map();
const o = {p: 'Hello World'};

m.set(o, 'content')
m.get(o) // "content"

m.has(o) // true
m.delete(o) // true
m.has(o) // false

可以看出 o 被当做一个 key 给其赋值。

作为构造函数 Map 也可以接受一个数组作为参数

const map = new Map([
  ['name', '张三'],
  ['title', 'Author']
]);

map.size // 2
map.has('name') // true
map.get('name') // "张三"
map.has('title') // true
map.get('title') // "Author"

上面在创建 map 的时候,指定了两个键 name 和 title。

实际上面执行的是

const items = [
  ['name', '张三'],
  ['title', 'Author']
];

const map = new Map();

items.forEach(
  ([key, value]) => map.set(key, value)
);

读取一个未知的键则会返回 undefined

new Map().get('asfddfsasadf') // undefined

注意:\color{red}{注意:}只有对同一个对象的引用,Map 结构才将其视为同一个键。

const map = new Map();

map.set(['a'], 555);
map.get(['a']) // undefined

上面 ['a']表面看一样,但 array 是引用类型,存储的是地址,属于内存中两个地址,次改为

const map = new Map();
const a = ['a'];
map.set(a, 555);
map.get(a) // undefined

如果 Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键,比如0和-0就是一个键,布尔值true和字符串true则是两个不同的键。另外,undefined和null也是两个不同的键。虽然NaN不严格相等于自身,但 Map 将其视为同一个键。

let map = new Map();

map.set(-0, 123);
map.get(+0) // 123

map.set(true, 1);
map.set('true', 2);
map.get(true) // 1

map.set(undefined, 3);
map.set(null, 4);
map.get(undefined) // 3

map.set(NaN, 123);
map.get(NaN) // 123

方法

  1. size(); // 返回成员总数
  2. set(key, value);

返回整个 Map 结构,若 key 值存在则键值会被更新,否则生成新的。

  1. get(key);

读取 key 值,找不到返回 undefined。

  1. has(key);

返回 布尔值

  1. delete(key);

删除某个键,删除成功为 true,失败为 false。

  1. clear();

清空所有的成员,没有返回值。

  1. keys(); // 键名 key 的集合,是一个数组
  2. values(); // 键值 value 的集合,是一个数组
  3. entries(); // 返回所有的成员
const map = new Map([
 ['F', 'no'],
 ['T',  'yes'],
]);
for (let item of map.entries()) {
 console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"

//  或者
for (let [key, value] of map.entries()) {
 console.log(key, value);
}
// "F" "no"
// "T" "yes"
  1. forEach();