Set:
構造函數參數:數組,類數組對象
add方法參數(只有一個參數
):任意
注意:Set之所以能去重,是因爲對內存地址的綁定,保證了唯一性,當add的參數是對象時,全等(===)纔會進行舊值覆蓋,.add({})和再次.add({}),size是會增加的。同理,add(‘5’)和add(5)也是兩個不同的值
========================================================
WeakSet:
構造函數參數:數組,類數組對象
add方法參數(只有一個參數
):只能是對象
弱引用:垃圾回收機制會忽略WeakSet實例,成員對象若不被其他任何對象引用,則會被自動回收,不考慮WeakSet實例中的引用。被回收了也就避免了內存泄漏問題
常用場景:存儲DOM節點,不用擔心節點移除時引發的內存泄露
由於弱引用,意味着無法引用WeakSet的成員,也不可遍歷實例,沒有size屬性,沒有forEach方法
========================================================
Map:
構造函數參數:一個表示鍵值對
的二維
數組,類數組對象
set方法參數(鍵,值
):任意
Map對象的出現,解決了Object對象的key只能爲字符串的問題,Map對象允許鍵爲任意類型
set方法的鍵是對內存地址的綁定,若爲對象時,想要覆蓋也必須是原對象作爲key,要求全等
特例:+0,0,-0相等;NaN和NaN Map裏視作相等
========================================================
WeakMap:
構造函數參數:一個表示鍵值對
的二維
數組,類數組對象,且二維的第一個值
必須是對象
set方法參數(鍵,值
):鍵只能是對象,值任意
注意:鍵只能是對象,沒有遍歷操作(keys,values,entries,forEach), 沒有size屬性,無法清空(clear)
只支持get,set,has,delete
常用場景:DOM作爲鍵名,值綁定相關信息,節點消失時不用擔心內存泄露(由於弱引用)
常用場景2:部署私有屬性(在class內,藉助WeakMap爲this對象實例存儲私有變量)
// 部署私有屬性
let _counter = new WeakMap();
let _action = new WeakMap();
class Countdown {
constructor(count, action){
_counter.set(this, count);
_action.set(this, action);
}
dec(){
let counter = _counter.get(this);
if(counter<1) return;
counter--;
_counter.set(this, counter);
if(counter === 0) {
let a = _action.get(this); // 返回的是參數action
a();
}
}
}
var c = new Countdown(2,()=>{
console.log('done')
});
c.dec()