WeakSet

这是我们这四个对象的最后一章的介绍啦。大家加油,还有一点就结束了。

WeakSet 官方描述

原文如下:

WeakSet objects are collections of objects. A distinct object may only occur once as an element of a WeakSet's collection. A WeakSet may be queried to see if it contains a specific object, but no mechanism is provided for enumerating the objects it holds. If an object that is contained by a WeakSet is only reachable by following a chain of references that start within that WeakSet, then that object is inaccessible and is automatically removed from the WeakSet. WeakSet implementations must detect and remove such objects and any associated resources.
An implementation may impose an arbitrarily determined latency between the time an object contained in a WeakSet becomes inaccessible and the time when the object is removed from the WeakSet. If this latency was observable to ECMAScript program, it would be a source of indeterminacy that could impact program execution. For that reason, an ECMAScript implementation must not provide any means to determine if a WeakSet contains a particular object that does not require the observer to present the observed object.
WeakSet objects must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements in the collection. The data structure used in this WeakSet objects specification is only intended to describe the required observable semantics of WeakSet objects. It is not intended to be a viable implementation model.

翻译如下:

WeakSet 对象是对象的集合。一个不同的对象只能作为 WeakSet 集合的一个元素出现一次。可以查询WeakSet 以查看它是否包含特定对象,但是没有提供用于枚举其持有的对象的机制。如果一个 WeakSet 包含的对象只能通过在该 WeakSet 中开始的一系列引用来访问,那么该对象是不可访问的,并从 WeakSet 中自动删除。WeakSet 实现必须检测和删除这些对象和任何相关资源。
内置系统可以在包含在 WeakSet 中的对象变得不可访问的时间与从 WeakSet 中移除对象的时间之间施加任意确定的延迟。如果 ECMAScript 程序可观察到这种延迟,那么它将是可能影响程序执行的不确定性的来源。因此,ECMAScript 内置系统不能提供任何手段来确定 WeakSet 是否包含不需要观察者呈现观察对象的特定对象。
WeakSet 对象必须使用哈希表或其他机制来实现,平均来说,提供对集合中元素数量进行亚线性的访问时间。此 WeakSet 对象规范中使用的数据结构仅用于描述 WeakSet 对象所需的可观察语义。它不是一个可行的内置系统模型。

说实话,由于 WeakSet 与 WeakMap 一样,都是无法迭代的,所以真的没有多少示例去展示它的用法。

我们来说说 WeakSet 与 Set 的区别吧,有以下两点:

  1. WeakSet 对象中只能存放对象(这点与 WeakMap 一样),不能存放原始值;而 Set 对象都可以。
  1. WeakSet 对象中存储的对象值都是被弱引用的,如果没有其他的变量或属性引用这个对象值,则这个对象值会被当成垃圾回收掉。正因为这样, WeakSet 对象是无法被枚举的,没有办法拿到它包含的所有元素。

WeakSet 的原型方法

(1)WeakSet.prototype.add ( value )

概述:add() 方法在 WeakSet 对象的最后一个元素后添加新的对象。

示例:

let set = new WeakSet();
let alphabet = {1: 'a',2: 'b',3: 'c'};
console.log(set.add(alphabet));
// WeakSet {Object {1: "a", 2: "b", 3: "c"}}

(2)WeakSet.prototype.delete ( value )

概述:delete() 方法从 WeakSet 对象中移除指定的元素。

这个方法是个很奇怪的方法。尽管我尝试删除对象,但依然返回 false。

示例:

let set = new WeakSet();
let o = set.add({});
console.log(set.delete(o));  // false

(3)WeakSet.prototype.has ( value )

概述:has() 方法根据 WeakSet 是否存在相应对象返回布尔值。

示例:

let set = new WeakSet();
let o = set.add(['a']);
console.log(set.has(o));  // false

很奇怪的两个方法。。依然返回 false。

关于 WeakSet 的 MDN 社区是我翻译的,所以。。。相信没有几个人关心这个对象,说明这个对象暂时没有什么好的使用。


总结

我们使用四章将 Map、Set、WeakMap、WeakSet 讲完了。希望大家喜欢,如果有什么不懂的地方,欢迎联系我或留言。

你可能感兴趣的:(WeakSet)