说明

特点
1、对象保存键值对,并且能够记住键的原始插入顺序
2、键值对,键可以是任意数值类型
和Object对比
| Map | Object | |
|---|---|---|
| 意外的键 | Map默认情况不包含任何键。只包含显式插入的键。 |
一个 Object 有一个原型, 原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。注意: 虽然 ES5 开始可以用 Object.create(null) 来创建一个没有原型的对象,但是这种用法不太常见。 |
| 键的类型 | 一个 Map的键可以是任意值,包括函数、对象或任意基本类型。 |
一个Object的键必须是一个 [String](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String)或是 [Symbol](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol)。 |
| 键的顺序 | Map 中的 key 是有序的。因此,当迭代的时候,一个 Map 对象以插入的顺序返回键值。 |
一个 Object 的键是无序的注意:自ECMAScript 2015规范以来,对象确实保留了字符串和Symbol键的创建顺序; 因此,在只有字符串键的对象上进行迭代将按插入顺序产生键。 |
| Size | Map的键值对个数可以轻易地通过 [size](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map/size)属性获取 |
Object的键值对个数只能手动计算 |
| 迭代 | Map是 iterable 的,所以可以直接被迭代。 |
迭代一个Object需要以某种方式获取它的键然后才能迭代。 |
| 1、内存性能 | 给定固定大小的内存Map 大约可以比 Object 多存储 50%的键/值对 | 不同浏览器差异很大 |
| 2、插入、删除性能 | 在频繁增删键值对的场景下表现更好。 | 在频繁添加和删除键值对的场景下未作出优化。 |
| 3、查找性能 | 从大型 Object 和 Map 中查找键/值对的性能差异极小 | 代码涉及大量查找操作,那么某些情况下可能选择 Object 更好一些。 |
=================
使用
1、创建

也可以创建时初始化里面的元素
格式
2、添加元素 set


3、获取元素值 get
根据键,获取值
4、删除元素 delete

根据键删除,删除成功返回true,失败返回false
5、查看元素数量 size

6、查看键列表 keys
let myMap = new Map();myMap.set("key1", "zero");myMap.set("key2", "one");myMap.keys()
返回的是一个map迭代器,可以用于遍历
7、查看值列表 values
let myMap = new Map();myMap.set("key1", "zero");myMap.set("key2", "one");myMap.values()
返回的是一个map迭代器,可以用于遍历
8、查看键值列表 entries
let myMap = new Map();myMap.set("key1", "zero");myMap.set("key2", "one");myMap.entries()

9、遍历
for of
let myMap = new Map();myMap.set(0, "zero");myMap.set(1, "one");// ============= 1、直接获取,每个item是一个数组 =============for (let item of myMap) {console.log(item);}// [0, "zero"]// [1, "one"]// ============= 2、通过数组解构的方式遍历 =============for (let [key, value] of myMap) {console.log(key + " = " + value);}// 0 = zero// 1 = one// ============= 3、通过遍历键列表 =============for (let key of myMap.keys()) {console.log(key);}// 0// 1// ============= 4、通过遍历值列表 =============for (let value of myMap.values()) {console.log(value);}// zero// one// ============= 5、通过遍历键值列表 =============for (let [key, value] of myMap.entries()) {console.log(key + " = " + value);}// 0 = zero// 1 = one
forEach

10、清空 clear
11、合并
let first = new Map([[1, 'one'],[2, 'two'],[3, 'three'],]);let second = new Map([[1, 'uno'],[2, 'dos']]);// Map对象同数组进行合并时,如果有重复的键值,则后面的会覆盖前面的。let merged = new Map([...first, ...second, [1, 'eins']]);console.log(merged.get(1)); // einsconsole.log(merged.get(2)); // dosconsole.log(merged.get(3)); // three
12、转换
Map转Array
let map= new Map([[a,123]);//法1:console.log(Array.from(map));//法二:console.log([...map]);//法三:let arr=[];for(let key of map){arr.push(key);}console.log(arr);
===============
应用
状态的对应储存值
let assS = {a:"待采购",b:"可领取",c:"使用中"}let assState = new Map()assState.set(assS.a,0)assState.set(assS.b,1)assState.set(assS.c,2)assS.a // "待采购" 需要用于界面显示时,用这个assState.get(assS.a) // 0 把这个状态实际表示的值,传给后端进行储存
