1、Map 的特点
- Map 对象保存键值对,并且能够记住键的原始插入顺序, 任何值都可以作为一个键或一个值
- Map 对象在迭代时会根据对象中的元素插入顺序来进行
- Map 对象使用 for ... of 循环在每次迭代后会返回一个形式为
[key, value] 的数组 - Map 对象键的比较基于零值相等的算法,在目前的 ECMAScript 规范中,
-0 和 +0 被认为是相等的,使用 Object.is(-0,+0)返回 false - Map 对象设置属性时,以下代码可以正常运行,但是不推荐,因为这种设置属性的方式不会改变 Map 的数据结构,无法被查询到
console.log(map.has('bla'));
console.log(map.get('bla'));
console.log(map.delete('bla'));
- NaN 也可以作为
Map 对象的键 map.set(NaN, 'not a number');
- 正确的存储数据到 Map 中的方式是使用
set(key, value) 方法 console.log(map.has('bla'));
console.log(map.get('bla'));
console.log(map.delete('bla'));
2、Map 的实例属性
size: 返回 Map 对象中的键值对的个数
3、Map 的实例方法:
- set ( key, value ) : 在
Map 对象中设置与指定的键 key 关联的值 value,并返回 Map 对象 - has( key ) : 返回一个布尔值,用来表明
Map 对象中是否存在与 key 关联的值 - get ( key ) : 返回与
key 关联的值,若不存在关联的值,则返回 undefined - delete(key) : 移除
Map 对象中指定的键值对,如果键值对存在并成功被移除,返回 true,否则返回 false。调用 delete 后再调用 Map.prototype.has(key) 将返回 false clear(): 移除 Map 对象中所有的键值对
4、迭代方法
- keys( ) : 返回一个新的迭代对象,其中包含
Map 对象中所有的键,并以插入 Map 对象的顺序排列 - values( ) : 返回一个新的迭代对象,其中包含
Map 对象中所有的值,并以插入 Map 对象的顺序排列 - entries( ) : 返回一个新的迭代对象,其为一个包含
Map 对象中所有键值对的 [key, value] 数组,并以插入 Map 对象的顺序排列 - forEach( callback ) :
5、使用 for ... of 迭代
for (const [key, value] of map) {
console.log(`key: ${key},value: ${value}`);
for (const [key, value] of map.entries()) {
console.log(`key: ${key},value: ${value}`);
for (const key of map.keys()) {
console.log(`key: ${key}`);
for (const value of map.values()) {
console.log(`value: ${value}`);
6、Map 与数组的关系
- 使用常规的 Map 构造函数可以将一个二维键值对数组转成一个 Map 对象
const arr = [['name', 'Andy'], ['age', 14]];
const map = new Map(arr);
- 使用 Array.from 或展开运算符可以将一个Map对象转成一个二维数组
7、复制或合并Map
- 复制
const map1 = new Map([['name', 'zs']]);
const map2 = new Map(map1);
console.log(map2 === map1);
['hobby', { sing: 'xxxx' }],
const map2 = new Map(map1);
for (const [key, value] of map1) {
- Map 对象间合并,但是会保持键的唯一性,相同的键,后面的会把前面的值覆盖掉
const map3 = new Map([...map1, ...map2]);
- Map 对象与数组的合并,但是会保持键的唯一性,相同的键,后面的会把前面的值覆盖掉
const arr = ['name', 'ls'];
const newMap = new Map([...map1, arr]);