在 JavaScript 中,Map 與 object 的差別?為什麼有 object 還需要 Map?
2023年8月21日
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
方法,可以一次把所有鍵值對刪掉;如果是原始物件就需要一個個刪。
除了以上提到的幾個點之外,Map 與原始物件還有其他細微的差別,以及在不同情境下有不同效能的差別。有興趣的讀者,推薦閱讀一下文章: