前言
javaScript中的Object对象,本质上是键值对的集合(Hash 结构),但Object对象只能使用字符串当作key,这让它的使用受到了许多限制。为了解决这个问题,ES6新增了一种新的数据结构Map。
一、Map是什么?
Map是ECMAScript 6的新增特性,是一种新的集合类型,为javascript带来了真正的键/值存储机
制。它类似于对象,也是键值对的集合,但是"键"的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了"字符串—值"的对应,Map 结构提供了"值—值"的对应,是一种更完善的 Hash 结构实现。如果你需要"键值对"的数据结构,Map 比 Object 更合适。
(引用自阮一峰ECMAScript 6入门)
Map 对象存储键值对,且键可以是任何数据类型。
Map 对象保存了键的原始插入顺序。
Map 对象具有表示映射大小的属性。
二、Map 和 Object 的区别
一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
三、Map对象的属性
1. size
作用: size属性返回 Map 结构的成员总数。
const map = new Map();
map.set("Very", "稀土");
map.set("Cool", "掘金");
console.log(map.size); // 输出:2
2. set(key, value)
作用: set方法设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。
const map = new Map();
const newMap = map.set("VeryCool", "稀土掘金");
console.log(newMap); // 输出:{'VeryCool' => '稀土掘金'}
3. get(key)
作用: get方法读取key对应的键值,如果找不到key,返回undefined。
const map = new Map();
map.set("VeryCool", "稀土掘金");
console.log(map.get("VeryCool")); // 输出:稀土掘金
4. has(key)
作用: has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中,存在返回true,失败返回false。
const map = new Map();
map.set("VeryCool", "稀土掘金");
console.log(map.has("VeryCool")); // 输出:true
5. delete(key)
作用: delete方法删除某个键,返回true。如果删除失败,返回false。
const map = new Map();
map.set("VeryCool", "稀土掘金");
console.log(map.delete("VeryCool")); // 输出:true
console.log(map); // 输出:{size: 0}
6. clear()
作用: clear方法清除所有成员,没有返回值。
const map = new Map();
map.set("VeryCool", "稀土掘金");
map.clear();
console.log(map); // 输出:{size: 0}
四、Map对象的操作
1. Map 与 Array的转换
const Array = [
["key1", "value1"],
["key2", "value2"],
];
// Map 构造函数可以将一个 二维 键值对数组转换成一个 Map 对象
const map = new Map(Array);
// 使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
const newArray = Array.from(map);
2. Map的克隆
const map1 = new Map([["key1", "value1"], ["key2", "value2"]]);
const map2 = new Map(map1);
3. Map的合并
const map1 = new Map([
[1, "Very"],
[2, "Cool"],
]);
const map2 = new Map([
[1, "稀土"],
[2, "掘金"],
]);
const newMap = new Map([...map1, ...map2]);
五、选择Map的原因
1. 内存占用
Map 存储键值对相比 Object 节省50%的空间。
2. 插入性能
如果涉及大量键值对插入操作,Map 的性能更佳。
3. 查找速度
Object 和 Map 中查找键/值对的性能差异较小。
4、删除性能
如果涉及大量键值对插入操作,Map 的性能更佳。
(文章参考自阮一峰ECMAScript 6入门)