ES6 推出了 Map 对象,让开发者可以通过这个数据结构进行键值对 (key-value pairs) 的操作。然而 JavaScript 原始对象 (plain object) 就可以用来做键值对的操作,为什么还需要 Map 对象呢?Map 对象解决了什么问题?
原始对象的键 (key) 只可以是字符串,但 Map 的键可以是任何东西
在用键值对处理数据时,很常开发者会用各类东西做为键 (key),但是在 JavaScript,如果用原始对象,不管用什么当做键,都会被转换成字符串,这往往会造成一些错误,例如被转成字符串时,原本两格不同的键被转成同样的字符串,这就导致撞键问题。而 Map 对象解决了这个问题,开发者想用什么当键都可以。
原始对象不支持迭代 (iteration),但 Map 对象有
过去我们没办法直接对一个原始对象用 for...of 、 forEach 来迭代,而是需要用额外的方法,例如 Object.entries 、 Object.keys 来协助。但是 Map 对象是可迭代的 (iterable),所以我们可以直接对 Map 对象用 for...of 、 forEach。
原始对象的元素没有顺序性,Map 对象则有顺序
上面提到 Map 对象是可迭代的,它有一个相关的优点是在迭代时是有顺序性的。过去用原始对象,即使用对象方法 (例如 Object.entries 、 Object.keys 来协助迭代),迭代出的结果顺序不一定会是我们放入键值对的顺序。但有时候在写演算法时,我们需要保留顺序,这时 Map 对象就会好用很多。
Map 提供许多键值对常用的方法,但原始对象没有
举例来说,如果要知道一个键值对的大小,Map 有 size 方法,简单又好用;但如果用原始对象,我们可能需要使用 Object.keys 然后搭配 .length 去自己找该对象有多少个键,这就麻烦很多。另外 Map 也有提供 clear 方法,可以一次把所有键值对删掉;如果是原始对象就需要一个个删。