高級之路篇二十二:map、weakMap、set、weakSet、object、array的區別

1、map

Map 對象保存鍵值對。任何值(對象或者原始值) 都可以作爲一個鍵或一個值。

 

  • 鍵值對結構。
  • 任何值(對象或者原始值) 都可以作爲一個鍵或一個值。
  • 強引用存儲
  • null 會被當做 undefined。
  • 雖然NaN !== NaN , 但是map中 NaN 是與 NaN 相等的。

與object的一些對比:

  • 一個Object的鍵只能是字符串或者 Symbols,但一個 Map 的鍵可以是任意值,包括函數、對象、基本類型。
  • Map 中的鍵值是有序的,而添加到對象中的鍵則不是。因此,當對它進行遍歷時,Map 對象是按插入的順序返回鍵值。
  • 你可以通過 size 屬性直接獲取一個 Map 的鍵值對個數,而 Object 的鍵值對個數只能手動計算。
  • Map 可直接進行迭代,而 Object 的迭代需要先獲取它的鍵數組,然後再進行迭代。
  • Object 都有自己的原型,原型鏈上的鍵名有可能和你自己在對象上的設置的鍵名產生衝突。雖然 ES5 開始可以用 map = Object.create(null) 來創建一個沒有原型的對象,但是這種用法不太常見。
  • Map 在涉及頻繁增刪鍵值對的場景下會有些性能優勢。

缺點:

  • 性能不及WakeMap
  • 強引用,垃圾回收算法不能及時清理,容易內存泄漏

 

2、WakeMap 

WeakMap 對象是一組鍵/值對的集合,其中的鍵是弱引用的。其鍵必須是對象,而值可以是任意的。

缺點:由於弱引用,key樹不確定的,所以WeakMap 的 key 是不可枚舉的。

 

3、Set

set對象允許你存儲任何類型的唯一值,無論是原始值或者是對象引用。

NaNundefined都可以被存儲在Set 中, NaN之間被視爲相同的值(儘管 NaN !== NaN)。

與array的區別:

  • 不能出現重複值
  • 沒有索引值

 

4、WeakSet

WeakSet 對象允許你將弱保持對象存儲在一個集合中。

  • WeakSet 對象中只能存放對象引用, 不能存放值, 而 Set 對象都可以.
  • WeakSet 對象中存儲的對象值都是被弱引用的, 如果沒有其他的變量或屬性引用這個對象值, 則這個對象值會被當成垃圾回收掉. 正因爲這樣, WeakSet 對象是無法被枚舉的, 沒有辦法拿到它包含的所有元素.

 

5、Object

  • key只能是字符串
  • 迭代順序有可能不同於插入的順序
  • 長度只能手動計算

 

6、Array

  • 有index索引值
  • 可出現重複值

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章