在 JavaScript 中,Map 與 object 的差別?為什麼有 object 還需要 Map?

2023年8月21日

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

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 上追蹤我們