这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战
背景
学习前端三个月了,准备刷刷面试题,总结总结,一天几道面试题,向大厂进军。
问题
介绍下Set,WeakSet,Map,WeakMap,WeakRef,FinalizationRegistry!
Set
- 成员的值唯一,没有重复。(对象或者引用都可以)
- 类似于数组,只有值。
- Set还具有增(add),删(delete),迭代(keys,values,entries,forEach),查(has)等方法。
根据Set的特性,常用于数组去重!
例如:
var a=[2,3,4,5,6,3,4,7];
var f=[...new Set(a)];
console.log(f);
// [ 2, 3, 4, 5, 6, 7 ]
还可以用于去除字符串相同字母
var a=[2,3,4,5,6,3,4,7];
var f=[...new Set(a)];
console.log(f);
// [ 2, 3, 4, 5, 6, 7 ]
var str1="abcdefadc";
var e=[...new Set(str1)];
console.log(e);
//[ 'a', 'b', 'c', 'd', 'e', 'f' ]
WeakSet
理解了Set,我们就很好理解WeakSet,WeakSet也具有Set的不可重复的特性,但是它与Set的区别是:
WeakSet的成员只能是对象,不能是其他类型的值,包含symbol值。
另外一个需要特别注意的是:WeakSet中的对象都是弱引用,不会被垃圾回收机制计数,也就是说该WeakSet中成员对象的引用,在垃圾回收中并不会增加计数。
具体方法和Set差不多。
Map
- 本质上是键值对集合(has结构)
- key不限于字符串,可以是对象。
- key是唯一的(跟内存地址绑定),键是按照严格相等比较的。
- 同样具有增删改查方法。
Map与其他数据结构的转化这个某些特殊情景会用到。了解就行。
WeaKMap
与Map的区别:
- 只接受对象作为键名(null)除外。
- webMap 的键名所指向的对象,不计入垃圾回收机制。(弱引用只有键名,不包含键值)
- 没有遍历方法,只有get,set,has,delete四个方法。
看到这里我们就知道这个对象主要是用来干啥的了,也是用来建立弱引用。和WeakSet的功能差不多。不会影响对象的垃圾回收,有助于防止内存泄漏。
WeaKRef
WeakSet 和 WeakMap 是基于弱引用的数据结构,WeakRef是直接创建对象的弱引用。
同样用于防止内存溢出。
var target = {a:1};
var wr = new WeakRef(target);
weakMap的实例提供了一个deref()方法,可以用来判断对象是否被垃圾回收,如果还存在,返回该原始对象,否则返回undefined。
FinalizationRegistry
用来注册对象被垃圾回收的监听,FinalizationRegistry是系统提供的构造函数,当你注册的对象被回收的时候,被调用回调函数告诉你。
//注册一个回调
const registry = new FinalizationRegistry(heldValue => {
// ....
});
//注册要监听的theObject对象,对象被回收时,"some value"会作为参数(heldValue)传入回调。
//如果还想取消监听,则传入第三个参数作为标记,一般是原始对象。在对象被回收之前调用unregister方法取消。
registry.register(theObject, "some value",theObject);
结语
一步一步慢慢来,踏踏实实把活干!