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