小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
这两天在看一部分源码,发现里面时不时的会出现 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
结语
如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。
文章如有错误之处,希望在评论区指正🙏🙏。