# Set 集合
> Set 是 ES6 新增的一種資料型態,類似陣列,但其所有的值都是唯一的 (**==unique values==**),不會有重複的值。
在 Set 加入新的元素時,其內部會用 === 判斷是否有重複,當判定為重複(duplicate values)時,會忽略其值。
:::info
雖然 **NaN !== NaN** ,但 Set 會判斷為重複的值。
:::
#### 基本建置 Set
```javascript=
// 建立一個 Set 物件
const mySet = new Set();
// 新增 Set 內數值
mySet.add(1) // {1}
mySet.add(2) // {1,2}
mySet.add(3) // {1,2,3}
mySet.add({ foo: 'bar' }); // { 1, 2, 3,{ foo: 'bar' } }
// 刪除 Set 內數值
mySet.delete(2) // { 1, 3,{ foo: 'bar' } }
```
#### 應用:比較陣列中是否包含某個值
> 如果想快速判斷一個陣列裡面是否包含某個值,可以使用 Set 集合的 `has` 方法。
```javascript=
mySet.has(1) // true
mySet.has({ foo: 'bar' }) // false
```
:::warning
由於物件的值是以 Ref 的方式被記錄,當 Set 在比較兩個物件時,即使裡面的內容一致,也會因為 Ref 不同,而判定為 false。
:::
#### 應用:過濾陣列中重複的元素
```javascript=
const arr = [1, 1, 3, 5, 5, 7];
const arrToSet = new Set(arr); // Set { 1, 3, 5, 7 }
const uniqueArray = [...arrToSet]; // [ 1, 3, 5, 7 ]
```
:::warning
- 當直接以參數的方式將資料傳入 Set,會得到一個物件,非陣列。(new Set([1,2,3]))
- 使用 ES6 的 Spread Operator,可以將 Set 轉換成陣列。
:::