WeakSet
WeakSet 結構與 Set 類似管跺,也是不重復的值的集合锭亏。它與 Set 有兩個區(qū)別咖城。
- WeakSet 的成員只能是對象族檬,而不能是其他類型的值。
- WeakSet 中的對象都是弱引用化戳,即垃圾回收機制不考慮 WeakSet 對該對象的引用单料,也就是說,如果其他對象都不再引用該對象点楼,那么垃圾回收機制會自動回收該對象所占用的內存扫尖,不考慮該對象還存在于 WeakSet 之中。
const arr = [1,2,3,4]
let newarr = new weakSet(arr) // new weakSet(arr)里面的東西會被回收
這是因為垃圾回收機制依賴引用計數(shù)掠廓,如果一個值的引用次數(shù)不為0换怖,垃圾回收機制就不會釋放這塊內存。結束使用該值之后蟀瞧,有時會忘記取消引用沉颂,導致內存無法釋放,進而可能會引發(fā)內存泄漏悦污。WeakSet 里面的引用铸屉,都不計入垃圾回收機制,所以就不存在這個問題切端。因此彻坛,WeakSet 適合臨時存放一組對象,以及存放跟對象綁定的信息踏枣。只要這些對象在外部消失昌屉,它在 WeakSet 里面的引用就會自動消失。
由于上面這個特點茵瀑,WeakSet 的成員是不適合引用的间驮,因為它會隨時消失。另外瘾婿,由于 WeakSet 內部有多少個成員蜻牢,取決于垃圾回收機制有沒有運行,運行前后很可能成員個數(shù)是不一樣的偏陪,而垃圾回收機制何時運行是不可預測的抢呆,因此 ES6 規(guī)定 WeakSet 不可遍歷。
這些特點同樣適用于本章后面要介紹的 WeakMap 結構笛谦。[1]
WeakSet 大致與 Set 的語法類似抱虐,不做詳細介紹。
// 基本語法
const a = new WeakSet();
// 會報錯
a.add(1)
a.add(Symbol())
// 不報錯
const b = [[10, 20], [30, 40]];
const a = new WeakSet(b);
// WeakSet {[10, 20], [30, 40]}
// b 數(shù)組它有兩個成員饥脑,也都是數(shù)組恳邀。將 b 作為 WeakSet 構造函數(shù)的參數(shù)懦冰,b 的成員會自動成為 WeakSet 的成員。
// 報錯
const b = [10, 20];
const a = new WeakSet(b);
// 數(shù)組b的成員不是對象谣沸,加入 WeakSet 就會報錯刷钢。
WeakSet 結構有以下三個方法。用法與 Set 一樣乳附,不做介紹
- WeakSet.prototype.add(value)
- WeakSet.prototype.delete(value)
- WeakSet.prototype.has(value)
WeakSet 沒有size屬性所以不能遍歷内地。
參考資料