1. 程式人生 > >Set、WeakSet、Map以及WeakMap結構基本知識點

Set、WeakSet、Map以及WeakMap結構基本知識點

### set
1、set類似於陣列,但是成員都是唯一的,沒有重複的值;

2、Set本身是一個建構函式,用來生成Set資料結構
```
const s = new Set();
let arr =[2,3,4,2,3,4,3];
arr.forEach(x => s.add(x));
for(let i of s){
    console.log(i);
};
```
- set中兩個物件總是不相等的;
- set中兩個NAN是視為相等的;

3、set例項屬性有:
- Set.prototype.constructor  預設是Set函式
- Set.prototype.size 返回set例項的成員數

4、set例項的方法有:
- add(value)
- delete(value)
- has(value)
- clear(value)
- keys():返回鍵名的遍歷器
- values():返回鍵值的遍歷器
- entries():返回鍵值對的遍歷器
- foreach():使用回撥函式遍歷每個成員

**備註**:由於set結構沒有鍵名只有鍵值,所以keys和values方法的行為完全一致;

==問題1:用set結構實現交併差==
```
let s = new Set([1,2,3]);

let m = new Set([3,4,5]);

//並集
let union = new Set([...s,...m]);

//交集
let intersect = new Set([...s].filter(x => m.has(x)));

//差集
let difference = new Set([..a].filter(x => !m.has(x)));

```
==問題2:擴充套件運算子 ... 的作用==

- 可以將陣列變成引數列表
- 可以將set結構資料轉換到陣列中,從而使用陣列的方法
```
let a = new Set([1,2,3,4]);

var b = [...a]//b為陣列

var c = []

c.push(...a)//將a轉為引數列表,然後push金陣列c中
```
==問題3:如何去除陣列重複成員==

```
var arr = [1,1,2,3,4,];

arr = Array.from(new Set(arr));//arr=[1,2,3,4]

```

## WeakSet

1. 成員不重複,成員只能是物件,成員是弱引用,即垃圾回收機制不會考慮weakset對該物件的引用;該資料結構不可比遍歷;
2. WeakSet結構有三種方法
- WeakSet.prototype.add(value)
- WeakSet.prototype.has(value)
- WeakSet.prototype.delete(value)


## Map

1、類似於物件,但鍵不限於字串;

2、例項屬性:.size

3、例項操作方法:
- .set(key,value);
- .has(key)
- .get(key)獲得key的值
- .delete(value)
- .clear()

4、例項的遍歷方法
- keys()
- values()
- entries()
- forEach()

5、與其他資料結構的相互轉換,包括Map轉為陣列?陣列轉為Map?Map轉為物件?物件轉為Map?Map轉為json?json轉為Map

## WeakMap

1、與Map的區別
- 鍵名只能為物件,不接受其他型別作為鍵名;
- 鍵名是弱引用,不計入引用計數;鍵值是正常引用,計入引用計數;

==問題1:一般什麼時候用這種結構?==

答:當想往物件上新增資料,又不想幹擾垃圾回收機制時,方可使用;一個典型應用場景是,在網頁的 DOM 元素上新增資料,就可以使用WeakMap結構。當該 DOM 元素被清除,其所對應的WeakMap記錄就會自動被移除。
總之,WeakMap的專用場合就是,它的鍵所對應的物件,可能會在將來消失。WeakMap結構有助於防止記憶體洩漏。
```
const wm = new WeakMap();

const element = document.getElementById('example');

wm.set(element, 'some information');
wm.get(element) // "some information"
```

2、只有四個方法,與WeakSet類似,都不可遍歷,因此並沒有遍歷操作的方法;
- .set()
- .get()
- .has()
- .delete()