【问题标题】:What's the difference between ES6 Set and WeakSet?ES6 Set 和 WeakSet 有什么区别?
【发布时间】:2017-04-10 09:47:29
【问题描述】:

ECMAScript 6 有这些非常相似的集合:SetWeakSet。它们有什么区别?

【问题讨论】:

标签: javascript ecmascript-6 weak-references


【解决方案1】:

主要区别在于对 Set 中对象的引用是强引用,而对 WeakSet 中对象的引用是弱引用。这意味着如果没有其他对 WeakSet 中的对象的引用,则可以对它进行垃圾回收

其他差异(或更确切地说是副作用)是:

  • 集合可以存储任何值。 WeakSet 只是对象的集合。
  • WeakSet 没有 size 属性。
  • WeakSet 没有clear、keys、values、entry、forEach 方法。
  • WeakSet 不可迭代。

【讨论】:

  • 还有其他区别吗?比如内存使用、性能差异?
  • WeakSet is not iterable 那我们为什么要使用它以及如何解析呢?
  • @VikasBansal WeakSet 允许您检查 O(1) 时间是否已添加任何对象。您可以将其用作对象的布尔检查,例如记忆化方法,另一个好处是,如果对象超出范围,您不会像在普通Set 中那样浪费内存,因为它然后可以被垃圾收集。
【解决方案2】:

总结:

弱集是包含对象集合的 javascript 对象。由于集合的性质,在集合中可能只出现同一对象的一个​​对象引用。 Weakset 在以下方面与普通集合不同:

  1. Weakset 只能在其集合中保存对象,不允许使用原始值(例如 intbooleanstring)。
  2. 对对象的引用保持。这意味着只要除了WeakSet 之外没有对该对象的其他引用,该对象就可以被垃圾回收(即JS 引擎将释放该引用指向的对象的内存)。

示例:

let myWeakSet = new WeakSet();
let obj = {};
myWeakSet.add(obj); 
console.log(myWeakSet.has(obj));

// break the last reference to the object we created earlier
obj = 5;

// false because no other references to the object which the weakset points to
// because weakset was the only object holding a reference it released it and got garbage collected
console.log(myWeakSet.has(obj)); 
                     

【讨论】:

  • 在您的示例中使用 Set 而不是 WeakSet,将产生相同的结果!
  • myWeakSet 此时不包含对obj 的引用,因为obj 指向原始值5。这并不能说明WeakSet 的弱引用行为。
  • WeakSet 将允许您在 O(1) 中搜索,因为 Set 需要 O(n) 时间。因此,如果在数组中搜索对象,weakset 更受欢迎,但在这个不可改变的时代,谁想要做这样的事情……为什么不采用更安全的不可改变选项。
【解决方案3】:

Set:- Set 是值的集合,其中每个值只能出现一次。主要方法有add、delete、has、clear和size。

WeakSet:- WeakSet 对象允许您存储唯一键的集合。“WeakSet”键不能是原始类型。 它们也不能由数组或其他集合创建。 WeakSet 的值必须是对象引用。

【讨论】:

  • 您的回答不清楚。我试图改进它,但我仍然认为缺少关于 WeakSet 是什么的信息。
【解决方案4】:
  • Sets 只允许存储一次。
  • set 中存储的元素不 有一个键或索引。所以很难使用检索元素 默认方法如 get()
  • WeakSet 只接受对象作为其值。
  • 如果没有对存储的对象的任何其他引用(引用是弱的),弱集不会阻止垃圾回收

【讨论】:

    猜你喜欢
    • 2015-12-19
    • 2011-07-05
    • 2013-03-14
    • 2021-11-25
    • 2016-08-08
    • 2013-04-19
    • 1970-01-01
    • 2016-10-16
    • 2023-04-09
    相关资源
    最近更新 更多