Javascript 什么';ES6集和WeakSet的区别是什么?
ECMAScript 6有以下非常相似的集合:Javascript 什么';ES6集和WeakSet的区别是什么?,javascript,ecmascript-6,weak-references,Javascript,Ecmascript 6,Weak References,ECMAScript 6有以下非常相似的集合:Set和WeakSet。它们之间有什么区别?主要区别在于对集合中对象的引用很强,而对弱集合中对象的引用很弱。这意味着,如果没有对WeakSet中的对象的其他引用,则可以对其进行垃圾收集 其他差异(或更确切地说是副作用)包括: 集合可以存储任何值。弱集仅是对象的集合 WeakSet没有size属性 WeakSet没有clear、key、value、entry和forEach方法 弱点是不可容忍的 集合只允许存储一次 存储在集合中的元素不存在 有一个
Set
和WeakSet
。它们之间有什么区别?主要区别在于对集合中对象的引用很强,而对弱集合中对象的引用很弱。这意味着,如果没有对WeakSet中的对象的其他引用,则可以对其进行垃圾收集
其他差异(或更确切地说是副作用)包括:
- 集合可以存储任何值。弱集仅是对象的集合
- WeakSet没有size属性
- WeakSet没有clear、key、value、entry和forEach方法
- 弱点是不可容忍的
- 集合只允许存储一次李>
- 存储在集合中的元素不存在 有一个键或索引。因此,很难使用 默认方法,如get()
- 弱集仅接受对象作为其值
- 如果未存储对对象的任何其他引用(引用较弱),则弱集不会阻止垃圾收集
- 弱集只能保存其集合中的对象,不允许使用原始值(例如
、int
、boolean
)string
- 对对象的引用保持为弱。这意味着,每当除了
之外没有其他对该对象的引用时,可以对该对象进行垃圾收集(即JS引擎将释放引用所指向的对象的内存)李> 例子:WeakSet
还有其他区别吗?与内存使用一样,性能差异?让myWeakSet=newweakset(); 设obj={}; myWeakSet.add(obj); log(myWeakSet.has(obj)); //断开对前面创建的对象的最后一个引用 obj=5; //false,因为没有对weakset指向的对象的其他引用 //因为weakset是唯一一个持有引用的对象,所以它释放了引用并进行了垃圾回收 log(myWeakSet.has(obj));
那么我们为什么要使用它以及如何解析它呢?@VikasBansalWeakSet是不可移植的
允许您在O(1)时间内检查是否已经添加了任何对象。您可以将其用作对象上的布尔检查,例如,一个已记忆的方法,另一个好处是,如果对象超出范围,您不会像在正常WeakSet
集合中那样浪费内存,因为它可以被垃圾收集。您的答案是否可能重复尚不清楚。我试图改进它,但我仍然认为缺少关于WeakSet是什么的信息。在您的示例中,使用Set而不是WeakSet将产生相同的结果
在该点不包含对myWeakSet
的引用,因为obj
指向原语值5。这并没有说明obj
的弱引用行为。WeakSet将允许您在O(1)中搜索,其中as Set将花费O(n)时间。因此,如果搜索数组中的对象,weakset更喜欢,但在这个不变性的时代,谁会想做这样的事情呢。。。为什么不接受一个更安全的不变性选择呢。WeakSet