介绍

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

基本API

1. 创建WeakSet实例

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

const ws = new WeakSet();

弱集合中的值只能是 Object 或者继承自 Object 的类型,尝试使用非对象设置值会抛出 TypeError。

如果想在初始化时填充弱集合,则构造函数可以接收一个可迭代对象,其中需要包含有效的值。可迭代对象中的每个值都会按照迭代顺序插入到新实例中:

const val1 = { id: 1 },
	  val2 = { id: 2 };
const ws = new WeakSet([val1, val2]);

只要有一个值无效就会抛出错误,导致整个初始化失败:

const ws = new WeakSet([{ id: 1 }, true, { id: 2 }]);
// TypeError: Invalid value used in WeakSet 

原始值可以先包装成对象再用作值:

const str = new String("string");
const ws = new WeakSet([str]);
2. add()

add(): 添加元素

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

has(): 查询某个元素是否存在(返回布尔值):

const val1 = { id: 1 },
	  val2 = { id: 2 };
const ws = new WeakSet();
ws.add(val1).add(val2);
ws.has(val1); // true
4. delete()

delete(): 删除某个元素(返回布尔值):

const val1 = { id: 1 },
	  val2 = { id: 2 };
const ws = new WeakSet();
ws.add(val1).add(val2);
ws.delete(val1); // true

弱值

WeakSet中的对象都是弱引用:
WeakSet 中对对象的引用不会被考虑进垃圾回收机制,这些值不属于正式的引用,不会阻止垃圾回收,即只要没有其他的对象引用该对象,则该对象就会被回收,而不管它在不在 WeakSet

不可迭代值

因为 WeakSet 中的值任何时候都可能被销毁,所以没必要提供迭代其值的能力。当然,也用不着像 clear()这样一次性销毁所有值的方法。WeakSet 确实没有这个方法。因为不可能迭代,所以也不可能在不知道对象引用的情况下从弱集合中取得值。即便代码可以访问 WeakSet 实例,也没办法看到其中的内容。
WeakSet 没有size属性。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐