Set、Map、WeakSet 和 WeakMap 的區別

Set

定義

Set在其餘語言中又叫作集合,是由一堆無序的、相關聯的,且不重複的內存結構組成的組合。git

根據定義能夠得出幾個關鍵點:github

  • 集合中的元素無序且惟一
  • 集合中的元素能夠是任何類型,不管是原始值仍是對象引用

Set 的實例屬性和方法

  • size: 返回集合中所包含的元素的數量面試

  • add(value): 向集合中添加一個新的項數組

  • delete(value): 從集合中刪除一個值數據結構

  • has(value): 若是值在集合中存在,返回ture, 不然返回false函數

  • clear(): 移除集合中的全部項ui

  • keys(): 返回鍵名的遍歷器spa

  • values(): 返回鍵值的遍歷器 (因爲 Set 沒有鍵名只有鍵值,全部 keys 和 values 效果一致)code

  • entries(): 返回鍵值對的遍歷器對象

  • forEach(): 使用回調函數遍歷每一個成員

Set 的基本用法

Set 自己是一個構造函數,用來生成Set結構

const s = new Set()

[1,2,3,4,4].forEach(i => s.add(i))

for(let i of s) {
  console.log(i)
}

// output: 1 2 3 4
// Set不會添加劇復元素
複製代碼

上面代碼能夠看出 Set 用途之一是能夠去除數組中的重複元素

Set 構造函數還能夠接受一個數組(或具備 iterable 接口的其餘數據結構)做爲參數,用來初始化一個集合。

// 例 1
const s = new Set([1,2,3,4,5,5,4,'5'])

[...s]  // [1,2,3,4,5,'5'] 
// 注意 向 Set 中加入值的時候不會發生類型轉換, Set內部用 (===) 來判斷兩個值是否相等

// 例 2

const m = new Map()
m.set('a', 1)
m.set('a', 2)

const s = new Set(m)

[...s] // [['a', 1], ['b', 2]]

Array.from(s) // [['a', 1], ['b', 2]] Array.from方法能夠將 Set 轉爲數組
複製代碼

WeakSet

定義

WeakSet 結構與 Set 相似,也是不重複的值的集合

與 Set 的區別

  • WeakSet 中的元素只能是對象,不能是其餘類型的值
  • WeakSet 中的對象都是弱引用,即垃圾回收機制不考慮 WeakSet 對該對象的引用,也就是說,若是該對象不在被其餘變量引用,那麼垃圾回收機制就會自動回收該對象所佔用內存,因此只要 WeakSet 成員對象在外部消失,它們在 WeakSet 裏面的引用就會自動消失。
  • 因爲 WeakSet 內部有多少個成員,取決於垃圾回收機制有沒有運行,運行先後極可能成員個數是不同的,而垃圾回收機制什麼時候運行是不可預測的,所以 ES6 規定 WeakSet 不可遍歷。

Map

定義

相似於對象,也是鍵值對的集合

與對象(Object)的區別:

  • 對象的鍵只能是字符串,Map 的鍵能夠是任意類型

Map 的實例屬性和方法

  • size: 返回 Map 結構的元素總數

  • set(key, value): 向 Map 中加入或更新鍵值對

  • get(key): 讀取 key 對用的值,若是沒有,返回 undefined

  • has(key): 某個鍵是否在 Map 對象中,在返回 true 不然返回 false

  • delete(key): 刪除某個鍵,返回 true, 若是刪除失敗返回 false

  • clear(): 刪除全部元素

  • keys():返回鍵名的遍歷器

  • values():返回鍵值的遍歷器

  • entries():返回全部成員的遍歷器

  • forEach():遍歷 Map 的全部成員

Map 基本用法

const m = new Map()

m.set('a', 1)
m.set(1: 'a')

m.get('a') // 1
m.has(1) // true
m.size() // 2
複製代碼
const map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
])

for (let key of map.keys()) {
  console.log(key)
}
// "F"
// "T"

for (let value of map.values()) {
  console.log(value)
}
// "no"
// "yes"

for (let [key, value] of map) {
  console.log(key, value)
}
// "F" "no"
// "T" "yes"

[...map]  // [['F', 'no'], ['T', 'yes']]
複製代碼

WeakMap

定義

WeakMap 結構與 Map 結構相似,也是用於生成鍵值對的集合。

WeakMap 和 Map 區別

  • WeakMap 只接受對象做爲鍵名(不包括null)
  • WeakMap 鍵名所指向的對象,不計入垃圾回收機制(同 WeakSet)

結論

  • Set、Map、WeakSet、WeakMap、都是一種集合的數據結構
  • Set 和 WeakSet 是一種值-值的集合,且元素惟一不重複
  • Map 和 WeakMap 是一種鍵-值對的集合,Map 的鍵能夠是任意類型,WeakMap 的鍵只能是對象類型。
  • Set 和 Map可遍歷,WeakSet 和 WeakMap不可遍歷
  • WeakSet 和 WeakMap 鍵名所指向的對象,不計入垃圾回收機制

查看原文

關注github每日一道面試題詳解

相關文章
相關標籤/搜索