在 JavaScript 中,Map 与 object 的差别?为什么有 object 还需要 Map?

2023年8月21日

💎 加入 E+ 成長計畫 與超過 300+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

ES6 推出了Map 物件,让开发者可以透过这个特制资料结构进行键值对(key-value pairs) 的操作。然而 JavaScript 原始物件 (plain object) 就可以用来做键值对的操作,为什么还需要 Map 物件呢? Map 物件解决了什么问题?

原始物件的键 (key) 只可以是字串,但 Map 的键可以是任何东西

在用键值对处理资料时,很常开发者会用各类东西做为键(key),但是在 JavaScript,如果用原始物件,不管用什么当做键,都会被转换成字串,这往往会造成一些错误,例如被转成字串时,原本两格不同的键被转成同样的字串,这就导致撞键问题。而 Map 物件解决了这个问题,开发者想用什么当键都可以。

原始物件不支援迭代 (iteration),但 Map 物件有

过去我们没办法直接对一个原始物件用 for...offorEach 来迭代,而是需要用额外的方法,例如 Object.entriesObject.keys 来协助。但是 Map 物件是可迭代的 (iterable),所以我们可以直接对 Map 物件用 for...offorEach

原始物件的元素没有顺序性,Map 物件则有顺序

上面提到 Map 物件是可迭代的,它有一个相关的优点是在迭代时是有顺序性的。过去用原始物件,即使用用物件方法 (例如 Object.entriesObject.keys 来协助迭代),迭代出的结果顺序不一定会是我们放入键值对的顺序。但有时候在写演算法时,我们需要保留顺序,这时 Map 物件就会好用很多。

Map 提供许多键值对常用的方法,但原始物件没有

举例来说,如果要知道一个键值对的大小,Map 有size 方法,简单又好用;但如果用原始物件,我们可能需要使用Object.keys 然后搭配.length 去自己找该物件有多少个键,这就麻烦很多。另外 Map 也有提供 clear 方法,可以一次把所有键值对删掉;如果是原始物件就需要一个个删。

除了以上提到的几个点之外,Map 与原始物件还有其他细微的差别,以及在不同情境下有不同效能的差别。有兴趣的读者,推荐阅读一下文章:

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們