3分钟了解Set,WeakSet,Map,WeakMap,WeakRef,FinalizationRegistry!

1,140 阅读3分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

背景

学习前端三个月了,准备刷刷面试题,总结总结,一天几道面试题,向大厂进军。

问题

介绍下Set,WeakSet,Map,WeakMap,WeakRef,FinalizationRegistry!

Set

  1. 成员的值唯一,没有重复。(对象或者引用都可以)
  2. 类似于数组,只有值。
  3. 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

  1. 本质上是键值对集合(has结构)
  2. key不限于字符串,可以是对象。
  3. key是唯一的(跟内存地址绑定),键是按照严格相等比较的。
  4. 同样具有增删改查方法。

Map与其他数据结构的转化这个某些特殊情景会用到。了解就行。

WeaKMap

与Map的区别:

  1. 只接受对象作为键名(null)除外。
  2. webMap 的键名所指向的对象,不计入垃圾回收机制。(弱引用只有键名,不包含键值)
  3. 没有遍历方法,只有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);

结语

一步一步慢慢来,踏踏实实把活干!