JavaScript Map 和 Object 的區別


不同點

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 的類型的情況。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM