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對象允許你存儲任何類型的唯一值,無論是原始值或者是對象引用。
NaN
和undefined
都可以被存儲在Set 中, NaN
之間被視爲相同的值(儘管 NaN !== NaN)。
與array的區別:
- 不能出現重複值
- 沒有索引值
4、WeakSet
WeakSet
對象允許你將弱保持對象存儲在一個集合中。
WeakSet
對象中只能存放對象引用, 不能存放值, 而Set
對象都可以.WeakSet
對象中存儲的對象值都是被弱引用的, 如果沒有其他的變量或屬性引用這個對象值, 則這個對象值會被當成垃圾回收掉. 正因爲這樣,WeakSet
對象是無法被枚舉的, 沒有辦法拿到它包含的所有元素.
5、Object
- key只能是字符串
- 迭代順序有可能不同於插入的順序
- 長度只能手動計算
6、Array
- 有index索引值
- 可出現重複值