/

向 Set 添加項目

# JavaScript 的 Set 數據結構

Set 數據結構允許將數據添加到容器中,這個容器可以是對象或基本類型(字符串、數字或布爾值)的集合,你可以將它看作是一個 Map,其中值被用作 Map 的鍵,而 Map 的值始終是一個布爾值 true。

什麼是 Set

Set 是一種數據結構,用於將數據添加到容器中。

ECMAScript 6(又稱 ES2015)引入了 Set 數據結構到 JavaScript 世界,並且帶有 Map 一起引入。

Set 是一個對象或基本類型(字符串、數字或布爾值)的集合,你可以將它看作是一個 Map,其中值被用作 Map 的鍵,而這個 Map 的值始終是一個布爾值 true。

初始化 Set

可以通過調用以下方法來初始化 Set:

1
const s = new Set()

向 Set 添加項目

你可以使用 add 方法將項目添加到 Set 中:

1
2
s.add('one')
s.add('two')

Set 只能存儲唯一的元素,所以多次調用 s.add('one') 不會添加新的項目。

你不能一次向 Set 中添加多個元素,你需要多次調用 add() 方法。

檢查 Set 中是否存在項目

一旦元素在 Set 中,我们可以檢查 Set 是否包含它:

1
2
s.has('one') //true
s.has('three') //false

按鍵刪除 Set 中的項目

使用 delete() 方法:

1
s.delete('one')

確定 Set 中的項目數量

使用 size 属性:

1
s.size

刪除 Set 中的所有項目

使用 clear() 方法:

1
s.clear()

遍歷 Set 中的項目

使用 keys()values() 方法 - 它們是等價的:

1
2
3
4
5
6
7
for (const k of s.keys()) {
console.log(k)
}

for (const k of s.values()) {
console.log(k)
}

entries() 方法返回一個迭代器,你可以像這樣使用它:

1
2
const i = s.entries()
console.log(i.next())

i.next() 調用將以 { value, done = false } 的對象形式返回每個元素,直到迭代器結束時,done 值為 true

你也可以在 Set 上使用 forEach() 方法:

1
s.forEach(v => console.log(v))

或者你可以直接在 for..of 循環中使用 Set:

1
2
3
for (const k of s) {
console.log(k)
}

使用值初始化 Set

可以使用一組值來初始化 Set:

1
const s = new Set([1, 2, 3, 4])

轉換為數組

將 Set 的鍵轉換為數組

1
2
3
4
5
const a = [...s.keys()]

// 或者

const a = [...s.values()]

WeakSet

WeakSet 是一種特殊類型的 Set。

在 Set 中,項目永遠不會被垃圾回收。而 WeakSet 則允許其所有項目被隨意地垃圾回收。 WeakSet 的每個鍵都是一個對象。當這個對象的引用丟失時,它的值可以被垃圾回收。

以下是主要區別:

  1. 你不能遍歷 WeakSet
  2. 你不能清除 WeakSet 中的所有項目
  3. 你不能檢查它的大小

WeakSet 通常由框架級代碼使用,並且只暴露以下方法:

  • add()
  • has()
  • delete()