weakset

141 阅读3分钟

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

前言

往常一样,我们继续复习一下ES6的知识点,今天我们来谈一谈weakset。

WeakSet

 ECMAScript 6新增的“弱集合”( WeakSet )是一种新的集合类型,为这门语言带来了集合数据结。 WeakSet 是 Set 的“兄弟”类型,其 APl 也是 Set 的子集。 WeakSet 中的“ weak ”(弱),描述的 JavaScript 垃圾回收程序对待“弱集合”中值的方式。

基本 API

可以使用 new 关键字实例化一个空的 weakSet :

const ws = new WeakSet ();

弱集合中的值只能是 Object 或者继承自 Object 的类型,尝试使用非对象设置值会抛出 TypeError 。如果想在初始化时填充弱集合,则构造函数可以接收个可迭代对象,其中需要包含有效的值。可代对象中的每个值都会按照迭代顺序插人到新实例中:

 const val1={ id :1}, 
val2={ id :2}, 
val3={ id :3}
//使用数组初始化弱集合
 const ws1= new WeakSet ([val1,val2,val3]);
该退回包含结果的新集合
 alert (ws1.has(val1));1/ true 
 alert (ws1. has (val2));// true alert (ws1. has (va13));// true 
 
 
 //只要有一个值无效就会抛出错误,导致整个初始化失败 
 const ws2= new WeakSet ([val1," BADVAL ",val3])
// TypeError : Invalid value used in WeakSet typeof ws2;
// ReferenceError :ws2 is not defined 

//原始值可以先包装成对象再用作值 )
 const stringVal = new String ("val1"); )
 const ws3= new WeakSet ([ stringVal ])
 alert (ws3. has ( stringVal ));// true 

初始化之后可以使用 add ()再添加新值,可以使用 has ()查询,还可以使用 delete ()删陈: const ws 

const val1={ id :1},
val2={ id :2};
 alert ( ws . has (val1));// false )(6)
((0Je8x we П j Б bs ,() 
 ws . add (val1) 
add (val2);
 alert ( ws . has (val1));//true
 alert ( ws . has (val2));// true 
 ws . delete (val1); //只删除这一个值
 alert ( ws . has (val1));// false 
 alert ( ws . has (val2));// true 

 add (方法返回弱集合实例,因此可以把多个操作连缀起来,包括初始化声明:小镇施 const val1={ id :1},\

val2={ id :2}, 
val3={ id :3};
 const ws = new WeakSet (). add (val1);
 ws . add (val2) ,
 add (va13);

 alert ( ws . has (val1));// true
 alert ( ws . has (val2));// true 
 alert ( ws . has (va13));// true

弱值

不会阻止垃圾回收。 WeakSet 中“ weak ”表示弱集合的值是“弱弱地拿着”的。意思就是,这些值不属于正式的引用, 来看下面的例子: 

 const WS = new WeakSet ();
 ws . add ({});

 add (方法初始化了一个新对象,并将它用作一个值。因为没有指向这个对象的其他引用,所以当这行代码执行完成后,这个对象值就会被当作垃圾回收。然后,这个值就从弱集合中消失了,使其成为一个空集合。 再看一个稍微不同的例子: 

 const ws = new WeakSet ()
 const container ={
 val :{} ;
 ws . add ( container . val );
 function removeReference ()(
 container . val = null ;
 }

这一次, container 对象维护着一个对弱集合值的引用,因此这个对象值不会成为垃圾回收的目标。不过,如果调用了 removeReference (),就会摧毁值对象的最后一个引用,垃圾回收程序就可以把这个值清理掉。 

使用弱集合

相比于 weakMap 实例, WeakSet 实例的用处没有那么大。不过,弱集合在给对象打标签时还是有价值的。 来看下面的例子,这里使用了一个普通 Set : 

 const disabledElements = neW Set ();
 const loginButton = document . querySelector ('# login '); 
//通过加入对应集合,给这个节点打上“禁用”标签 要包含有效的值。可
 disabledElements . add ( loginButton );

这样,通过查询元素在不在 disabledElements 中,就可以知道它是不是被禁用了。不过,假如元素从 DOM 树中被删除了,它的引用却仍然保存在 Set 中,因此垃圾回收程序也不能回收它。 为了让垃圾回收程序回收元素的内存,可以在这里使用 WeakSet : 

 const disabledElementS = new WeakSet ();
 const loginButton = document . querySelector ('# login ');
 //通过加入对应集合,给这个节点打上“禁用”标签 
disabledElement . add ( loginButton );

这样,只要 WeakSet 中任何元素从 DOM 树中被删除,垃圾回收程序就可以忽略其存在,而立即释放其内存(假设没有其他地方引用这个对象)。