《ES6標準入門(第2版)》讀書筆記——第13章 Set和Map數據結構

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章