基本API

  • 使用new关键字实例化一个空的WeakSet:
  • 弱集合中的值只能是object或者继承自object的类型,尝试使用非对象设置值会抛出TypeError。
  • 如果想在初始化时填充弱集合,则构造函数可以接收-一个可迭代对象,其中需要包含有效的值。可迭代对象中的每个值都会按照迭代顺序插入到新实例中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const val1 = {id: 1}, 
val2 = {id: 2},
val3 = {id: 3};
// 使用数组初始化弱集合
const ws1 = new WeakSet([val1, val2, val3]);
alert(ws1.has(val1)); // true
alert(ws1.has(val2)); // true
alert(ws1.has(val3)); // 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()删除:
1
2
3
4
5
6
7
8
9
10
11
const ws = new WeakSet(); 
const val1 = {id: 1},
val2 = {id: 2};
alert(ws.has(val1)); // false
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

弱值

原理同WeakMap

不可迭代值

  • Weakset中的值任何时候都可能被销毁,所以没必要提供迭代其值的能力。
  • WeakSet之所以限制只能用对象作为值,是为了保证只有通过值对象的引用才能取得值。如果允许原始值,那就没办法区分初始化时使用的字符串字面量和初始化之后使用的一个相等的字符串了。