背景
ES6新增了兩種集合型別Set、Map,用來實現不同的功能
- Set 是不包含重複值的列表,常被用來檢查某個值是否存在
- Map 是鍵值對的集合,多用來作為快取,儲存和提取資料。Object的屬性型別都會預設轉成字串,比如obj['5']與obj[5]是等價的;Map的屬性型別可以其他型別
Set
- new Set()建立Set型別
- add()向Set中新增新的元素
- size屬性返回當前Set列表包含幾個元素
- has()判斷當前呼叫的Set是否包含某個值
- delete()刪除指定元素
- clear()清空當前Set列表
- Set不會對元素做強制型別轉換,比如5與'5'是兩個不同的元素
- Set列表不存在索引,所以無法像陣列一樣通過索引獲取某一個值,可以使用forEach()依次遍歷列表中的元素
- 對於只想儲存物件型別元素的列表,並且擔心Set列表中的物件強引用造成記憶體洩漏等問題,建議使用new WeakSet()建立弱引用的Set列表,要求所有元素必須為物件型別,否則會報錯。當Weak Set中的物件在Weak Set之外不存在任何引用時,該物件就會被銷燬,也就不會存在干擾垃圾回收,記憶體洩漏的問題(與傳統的Set用法還有些區別,感興趣的可以自己進一步瞭解下)
將陣列轉換成Set,可以刪除掉重複的元素
let arr = [1,2,3,4,5,5,5,4]
let set = new Set(arr)
console.log(set) // Set(5){1, 2, 3, 4, 5}
set.forEach((value) => {
console.log(value) // 1,2,3,4,5
})
複製程式碼
將Set轉換成陣列,使用擴充套件運算子
let arr = [1,2,3,4,5,5,5,4]
let set = new Set(arr)
let array = [...set]
console.log(array) // [1, 2, 3, 4, 5]
複製程式碼
常用來刪除陣列重複陣列的方法
[...new Set(array)]
複製程式碼
Map
Map型別是鍵值對的有序列表,鍵和值可以為任何型別,特別是對鍵的型別不會強制轉換(內部管理鍵的值是使用Object.is()全等於的方式,因此5與'5'是兩個不同的鍵)
- new Map()建立Map列表
- set(key,value)建立鍵值對
- get(key)索引鍵值
- 使用物件作為鍵,每一個不同的物件例項都不相等 Object.is({},{}) //false
Object.is({},{}) //false let map = new Map(), key1 = {}, key2 = {}; map.set(key1, 'Tome'); map.set(key2,'1234'); console.log(map.get(key1)) //Tom console.log(map.get(key2)) // 1234 複製程式碼
- has(key) 判斷Map列表是否存在該鍵值對
- delete(key) 刪除對應的鍵值對
- clear() 清空本Map列表
- size屬性,返回Map列表內有幾個鍵值對
- new WeakMap() 建立弱引用Map,當Weak Map中鍵在Weak Map之外不存在任何引用時,該物件就會被銷燬
Map初始化陣列
let map = new Map([['name','Tom'],['age',20],[3,99]]) // 陣列中有多個含有兩個子元素的子陣列,子陣列中第一個元素作為Map列表的key,第二個值作為Map列表的value
console.log(map.size) //3
console.log(map.get('name')) //Tom
console.log(map.get('age')) //20
console.log(map.get(3)) //99
複製程式碼
forEach(value, key, ownerMap)方法
- value 當前位置鍵值對的值
- key 當前位置鍵值對的鍵
- ownerMap 被呼叫的Map列表
map.forEach((value, key, ownerMap)=>{
console.log(key + ' ' + value)
console.log(ownerMap === map)
})
name Tome
true
age 20
true
3 99
true
複製程式碼