说明
特点
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)); // eins
console.log(merged.get(2)); // dos
console.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 把这个状态实际表示的值,传给后端进行储存