(JS文檔自譯)
Object和Map非常相似,兩者都可以完成鍵-值對(duì)的設(shè)置、獲取value、刪除key并且根據(jù)key獲取對(duì)應(yīng)的value。因此,在過(guò)去Object經(jīng)常被當(dāng)作Map來(lái)使用。但是,Object和Map的不同之處會(huì)讓Map在特定條件下成為一個(gè)更佳的選擇。
| Map | Object | |
|---|---|---|
| 附加的Key | Map沒(méi)有默認(rèn)的key值 | Object具有原型對(duì)象,所以它包含默認(rèn)的key值,并且使用不當(dāng)時(shí)會(huì)和自定義的key值產(chǎn)生沖突(在ES5中可以通過(guò)Object.create(null)來(lái)設(shè)置去掉默認(rèn)的key值,但這種解決方法并不常用) |
| Key的種類(lèi) | Map的key值可以是任何類(lèi)型的值,包括函數(shù)、Object和任意基礎(chǔ)數(shù)據(jù)類(lèi)型 | Object的key值只能是String或Symbol |
| Key的順序 | Map中的key值排序簡(jiǎn)單直接,一個(gè)Map對(duì)象迭代鍵值對(duì)、Key、Value的順序和插入時(shí)的順序相同 | 一般對(duì)象的鍵值是有順序的,但這并不絕對(duì),有時(shí)對(duì)象的鍵值排序會(huì)變得很復(fù)雜,所以最好不要依賴(lài)于插入的順序。 |
| 大小 | Map的大小可以輕松通過(guò)size屬性來(lái)獲得 | Object的大小必須通過(guò)自行獲取 |
| 迭代 | Map是可迭代對(duì)象,可以輕松完成迭代 | Object沒(méi)有實(shí)現(xiàn)迭代協(xié)議,所以無(wú)法被for...of直接迭代(但可以自行實(shí)現(xiàn)迭代協(xié)議,或者使用Object.keys()或Object.entries()來(lái)迭代對(duì)象的鍵值和實(shí)體,for...in也可以迭代Object的可枚舉屬性) |
| 性能 | 頻繁增減鍵值對(duì)時(shí)表現(xiàn)會(huì)更好 | 頻繁增減鍵值對(duì)時(shí)表現(xiàn)較差 |