我竟然有点忘记了 ES6 的Map😅😅

5,810 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

这两天在看一部分源码,发现里面时不时的会出现 new Map()Map 数据结构作为 ES6 中新的数据结构,在很多场景下已经正在使用。今天就来重新回顾一下它吧。

Map的产生背景

JS 中有一种常见的数据结构-对象(Object),它是以键值对的形式存放数据。例如:const obj = { name: 'Tom' }。它的(key)可以是字符串类型 或者 Symbol类型。

let obj = {};
obj['name'] = 'Tom';
obj[Symbol(1)] = 16;

console.log(obj)  // {name: 'Tom', Symbol(1): 16}

为了解决这个问题,ES6 提出了新的数据结构- Map,它类似对象, 但是比对象更加的灵活。它的(key)可以是任意的数据类型,不在拘泥于字符串Symbol

Map的基本语法

初始化

初始化 Map 直接使用一个二维数组

const newMap = new Map([['name', 'Tom'], ['age', 20], ['root', 'china']]);

Map 构造函数接受数组作为参数,实际上执行的是下面的算法:

const items = [
  ['name', 'Tom'],
  ['age', 20],
  ['root', 'china']
];

const map = new Map();

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

初始化一个空的 Map

let newMap = new Map();

注意事项

  • 如果对同一个键多次赋值,后面的值将覆盖前面的值
const map = new Map();

map
.set(1, 'aaa')
.set(1, 'bbb');

map.get(1) // "bbb"
  • 只有对同一个对象的引用,Map 结构才将其视为同一个键
const map = new Map();

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

['a']['a'] 内存地址是不一样的

Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。

  • 同样的值的两个实例,在 Map 结构中被视为两个键
const map = new Map();

const k1 = ['a'];
const k2 = ['a'];

map
.set(k1, 111)
.set(k2, 222);

map.get(k1) // 111
map.get(k2) // 222

Map常用的方法和属性

size 属性

size 属性返回 Map 结构的成员总数。

const newMap = new Map([['name', 'Tom'], ['age', 20], ['root', 'china']]);
newMap.size;  // 3

Map.prototype.set(key, value)

set 方法设置键名key 键的值为 value,然后返回整个 Map 结构。如果 key 已经有值,则键值会被更新,否则就新生成该键。set方法返回的是当前的 Map对象,因此可以采用链式写法

let newMap = new Map().set(1, 'a').set(2, 'b').set(3, 'c');
// Map(3) {1 => 'a', 2 => 'b', 3 => 'c'}

Map.prototype.get(key)

get 方法读取 key 对应键的,如果找不到key,返回undefined

let newMap = new Map().set(1, 'a').set(2, 'b').set(3, 'c');
newMap.get(1);  // 'a'
newMap.get(4);  // undefined

Map.prototype.has(key)

某个键是否在当前 Map 对象之中,返回一个Boolean

let newMap = new Map().set(1, 'a').set(2, 'b').set(3, 'c');
newMap.has(1);  // true
newMap.has(4);  // false

Map.prototype.delete(key)

删除某个键,返回true。如果删除失败,返回false

let newMap = new Map().set(1, 'a').set(2, 'b').set(3, 'c');
newMap.delete(1); // true
newMap.has(1);  // false
newMap.delete(1); // false

Map.prototype.clear()

清除所有成员,无返回值。

let newMap = new Map().set(1, 'a').set(2, 'b').set(3, 'c');
newMap.clear();

newMap.size;  // 0

结语

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。

文章如有错误之处,希望在评论区指正🙏🙏。