# JavaScript 的 Set 數據結構
Set 數據結構允許將數據添加到容器中,這個容器可以是對象或基本類型(字符串、數字或布爾值)的集合,你可以將它看作是一個 Map,其中值被用作 Map 的鍵,而 Map 的值始終是一個布爾值 true。
什麼是 Set
Set 是一種數據結構,用於將數據添加到容器中。
ECMAScript 6(又稱 ES2015)引入了 Set 數據結構到 JavaScript 世界,並且帶有 Map 一起引入。
Set 是一個對象或基本類型(字符串、數字或布爾值)的集合,你可以將它看作是一個 Map,其中值被用作 Map 的鍵,而這個 Map 的值始終是一個布爾值 true。
初始化 Set
可以通過調用以下方法來初始化 Set:
const s = new Set()
向 Set 添加項目
你可以使用 add
方法將項目添加到 Set 中:
s.add('one')
s.add('two')
Set 只能存儲唯一的元素,所以多次調用 s.add('one')
不會添加新的項目。
你不能一次向 Set 中添加多個元素,你需要多次調用 add()
方法。
檢查 Set 中是否存在項目
一旦元素在 Set 中,我们可以檢查 Set 是否包含它:
s.has('one') //true
s.has('three') //false
按鍵刪除 Set 中的項目
使用 delete()
方法:
s.delete('one')
確定 Set 中的項目數量
使用 size
属性:
s.size
刪除 Set 中的所有項目
使用 clear()
方法:
s.clear()
遍歷 Set 中的項目
使用 keys()
或 values()
方法 - 它們是等價的:
for (const k of s.keys()) {
console.log(k)
}
for (const k of s.values()) {
console.log(k)
}
entries()
方法返回一個迭代器,你可以像這樣使用它:
const i = s.entries()
console.log(i.next())
i.next()
調用將以 { value, done = false }
的對象形式返回每個元素,直到迭代器結束時,done
值為 true
。
你也可以在 Set 上使用 forEach() 方法:
s.forEach(v => console.log(v))
或者你可以直接在 for..of 循環中使用 Set:
for (const k of s) {
console.log(k)
}
使用值初始化 Set
可以使用一組值來初始化 Set:
const s = new Set([1, 2, 3, 4])
轉換為數組
將 Set 的鍵轉換為數組
const a = [...s.keys()]
// 或者
const a = [...s.values()]
WeakSet
WeakSet 是一種特殊類型的 Set。
在 Set 中,項目永遠不會被垃圾回收。而 WeakSet 則允許其所有項目被隨意地垃圾回收。 WeakSet 的每個鍵都是一個對象。當這個對象的引用丟失時,它的值可以被垃圾回收。
以下是主要區別:
- 你不能遍歷 WeakSet
- 你不能清除 WeakSet 中的所有項目
- 你不能檢查它的大小
WeakSet 通常由框架級代碼使用,並且只暴露以下方法:
- add()
- has()
- delete()