Set
- ES6提供了新的數據結構Set。它類似于數組,但是成員的值都是唯一的,沒有重復的值。
- 向Set加入值的時候,不會發生類型轉換,所以5和"5"是兩個不同的值**。
- Set內部判斷兩個值是否不同,使用的算法類似于精確相等運算符(===),這意味著,兩個對象總是不相等的。唯一的例外是NaN等于自身**(精確相等運算符認為NaN不等于自身)。
- size屬性:返回Set實例的成員總數。
- add(value):添加某個值,返回Set結構本身。
- delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。
- has(value):返回一個布爾值,表示該值是否為Set的成員。
- clear():清除所有成員,沒有返回值。
- keys():返回一個鍵名的遍歷器
- values():返回一個鍵值的遍歷器
- entries():返回一個鍵值對的遍歷器
var s = new Set([1,2,3]); // Set {1, 2, 3}
s.keys(); // SetIterator {1, 2, 3}
s.values(); // SetIterator {1, 2, 3}
s.entries(); // SetIterator {[1, 1], [2, 2], [3, 3]}```
12. **forEach()**:使用回調函數遍歷每個成員
let set = new Set([1, 2, 3]);
set.forEach((value, key, set) => console.log(value * 2) ) // 2 4 6
13. ***forEach*方法還可以有第二個參數,表示綁定的*this*對象。**
var s = new Set([1,2,3])
s.forEach(function(v){
console.log(this) // [[Window]]
})
s.forEach(function(v){
console.log(this) // [[Object {foo: "bar"}]]
}, {'foo':'bar'})
# WeakSet
1. *WeakSet*結構與*Set*類似,也是不重復的值的集合。
2. *WeakSet*與Set有兩個區別
* 首先,*WeakSet*的成員只能是對象,而不能是其他類型的值.
* 其次,*WeakSet*中的對象都是弱引用,即垃圾回收機制不考慮*WeakSet*對該對象的引用,也就是說,如果其他對象都不再引用該對象,那么垃圾回收機制會自動回收該對象所占用的內存,不考慮該對象還存在于*WeakSet*之中。這個特點意味著,無法引用*WeakSet*的成員,因此*WeakSet*是不可遍歷的。
3. 作為構造函數,*WeakSet*可以接受一個數組或類似數組的對象作為參數。(實際上,任何具有*iterable*接口的對象,都可以作為*WeakSet*的參數。)該數組的所有成員,都會自動成為*WeakSet*實例對象的成員。
var a = [[1,2], [3,4]];
var ws = new WeakSet(a);```
- add(value):向WeakSet實例添加一個新成員。
- delete(value):清除WeakSet實例的指定成員。
- has(value):返回一個布爾值,表示某個值是否在WeakSet實例之中
- WeakSet沒有size屬性,沒有辦法遍歷它的成員。WeakSet不能遍歷,是因為成員都是弱引用,隨時可能消失,遍歷機制無法保存成員的存在,很可能剛剛遍歷結束,成員就取不到了。WeakSet的一個用處,是儲存DOM節點,而不用擔心這些節點從文檔移除時,會引發內存泄漏。