不同點
Key filed
在 Object 中, key 必須是簡單數據類型(整數,字符串或者是 symbol),而在 Map 中則可以是 JavaScript 支持的所有數據類型,也就是說可以用一個 Object 來當做一個Map元素的 key。
元素順序
Map 元素的順序遵循插入的順序,而 Object 的則沒有這一特性。
繼承
Map 繼承自 Object 對象。
新建實例
Object 支持以下幾種方法來創建新的實例:
var obj = {...}; var obj = new Object(); var obj = Object.create(null);
Map 僅支持下面這一種構建方法:
var map = new Map([1, 2], [2, 3]); // map = {1 => 2, 2 => 3}
數據訪問
Map 想要訪問元素,可以使用 Map 本身的原生方法:
map.get(1) // 2
Object 可以通過 . 和 [ ] 來訪問
obj.id; obj['id'];
判斷某個元素是否在 Map 中可以使用
map.has(1);
判斷某個元素是不是在 Object 中需要以下操作:
obj.id === undefined; // 或者 'id' in obj;
另外需要注意的一點是,Object 可以使用 Object.prototype.hasOwnProperty() 來判斷某個key是否是這個對象本身的屬性,從原型鏈繼承的屬性不包括在內。
新增一個數據
Map 可以使用 set() 操作:
map.set(key, value) // 當傳入的 key 已經存在的時候,Map 會覆蓋之前的值
Object 新增一個屬性可以使用:
obj['key'] = value; obj.key = value; // object也會覆蓋
刪除數據
在 Object 中沒有原生的刪除方法,我們可以使用如下方式:
delete obj.id; // 下面這種做法效率更高 obj.id = undefined
需要注意的是,使用 delete 會真正的將屬性從對象中刪除,而使用賦值 undefined 的方式,僅僅是值變成了 undefined。屬性仍然在對象上,也就意味着 在使用 for … in… 去遍歷的時候,仍然會訪問到該屬性。
Map 有原生的 delete 方法來刪除元素:
var isDeleteSucceeded = map.delete(1); console.log(isDeleteSucceeded ); // true // 全部刪除 map.clear();
獲取size
Map 自身有 size 屬性,可以自己維持 size 的變化。
Object 則需要借助 Object.keys() 來計算
console.log(Object.keys(obj).length);
Iterating
Map 自身支持迭代,Object 不支持。
如何確定一個類型是不是支持迭代呢? 可以使用以下方法:
console.log(typeof obj[Symbol.iterator]); // undefined console.log(typeof map[Symbol.iterator]); // function
何時使用 Map ,何時使用 Object?
雖然Map 在很多時候優於 Object,但是作為 JavaScript 最基礎的數據類型,還是有很多情景更適合使用 Object。
- 當所要存儲的是簡單數據類型,並且 key 都為字符串或者整數或者 Symbol 的時候,優先使用 Object ,因為Object可以使用 字符變量 的方式創建,更加高效。
- 當需要在單獨的邏輯中訪問屬性或者元素的時候,應該使用 Object,例如:
var obj = { id: 1, name: "It's Me!", print: function(){ return `Object Id: ${this.id}, with Name: ${this.name}`; } } console.log(obj.print());//Object Id: 1, with Name: It's Me. // 以上操作不能用 Map 實現
- JSON 直接支持 Object,但不支持 Map
- Map 是純粹的 hash, 而 Object 還存在一些其他內在邏輯,所以在執行 delete 的時候會有性能問題。所以寫入刪除密集的情況應該使用 Map。
- Map 會按照插入順序保持元素的順序,而Object做不到。
- Map 在存儲大量元素的時候性能表現更好,特別是在代碼執行時不能確定 key 的類型的情況。