es 6 中的 weak set weak map

只要Set实例中的引用存在,垃圾回收机制就不能释放该对象的内存空间,于是之前提到的Set类型可以被看做是一个强引用的Set集合。
[cc lang=”js”]
let set = new Set();
let key = {};

set.add(key);
console.log(set.size); // 1

// 移除原始引用
key = null;
console.log(set.size); // 1

// 重新取回原始引用
key = […set][0];
[/cc]
例如,在页面中通过JS记录了一些DOM,但是这些DOM可能被另一端脚本移除,而你又不希望自己的代码保留这些DOM元素的最后一个引用(这个情景被称为内存泄漏)。
为了解决这个问题,ES6引入了Weak Set集合。Weak Set集合只存储对象的弱引用,并且不可以存储原始值;

Weak Set只有add、has、delete三个方法。
两类Set的主要区别
最大区别是Weak Set保存的是对象的弱引用,可惜我们没有办法用代码来验证,例如下面的代码
[cc lang=”js”]
let weakSet = new WeakSet(),
set = new Set(),
key = {};

set.add(key);
weakSet.add(key);

console.log(set.size); // 1
console.log(weakSet.size); // undefined

key = null;
console.log(set.size); // 1
console.log(weakSet.size); // undefined
[/cc]
这是因为WeakSet没有size属性。所以说,我们可以看到WeakSet和Set的差别还有下面这几点:

WeakSet中,add、has、delete三个方法传入非对象参数都会报错
WeakSet不可迭代,不能被用于for-of
WeakSet不暴露任何迭代器(例如keys、values方法),所以无法通过程序本身来检测其中的内容
不支持forEach方法
不支持size属性

ES6中的Map集合
Map集合支持的方法
set
get
has(key)
delete(key)
clear()
forEach()
Map集合初始化方式
[cc lang=”js”]let map = new Map([[“name”, “NowhereToRun”], [“age”, “24”]]);[/cc]

Weak Map集合
键名必须是对象,否则会报错;
集合中保存的是对象的弱引用,如果在弱引用之外不存在其他的强引用,会被垃圾回收;但是只有集合的键名遵从这个规则,键名对应的键值如果是一个对象,则保存的是对象的强引用,不会触发垃圾回收
支持的方法:

set
get
has
delete

[cc lang=”js”]let map = new WeakMap();
let element = document.querySelector(“.element”);

map.set(element, “original”);

let value = map.get(element);
console.log(value); // original

// 移除element元素
element.parentNode.removeChild(element);
element = null;[/cc]

Leave a Reply

Your email address will not be published. Required fields are marked *