何时使用 Set a vs. WeakSet,有什么区别,哪个更好,为什么?
var arr = [1, 2, 3, 4, 5];
和
var set = new Set([1, 2, 3, 4, 5]);
和
var weak_set = new WeakSet([1, 2, 3, 4, 5]);
文档已经写好,但不清楚应该在哪里使用以及为什么。
何时使用 Set a vs. WeakSet,有什么区别,哪个更好,为什么?
var arr = [1, 2, 3, 4, 5];
和
var set = new Set([1, 2, 3, 4, 5]);
和
var weak_set = new WeakSet([1, 2, 3, 4, 5]);
文档已经写好,但不清楚应该在哪里使用以及为什么。
集合对象是可以包含任何类型数据的唯一值的集合。
让我们做一个简单的集合来看看:
如我们所见,它只包含 numbers 数组中的唯一值,它们的顺序保持不变。
这使得 Set 对象成为从数组中删除重复项的最简单方法之一:
这正是它的关键特性,无论传递什么值,它们都只会存储在单个实例中。
让我们使用add()方法检查这一点:
并使用size属性记住这个集合的大小:
可以在此处查看方法和属性的完整列表。
迭代协议是为 Set 对象定义的,所以我们可以像map一样迭代它们:
如果我们使用entry()方法,我们会得到:
这样做是为了Set与Map向后兼容。
是什么让 WeakSet 与众不同
在普通集合中,我们可以存储任何类型的数据,但在弱集合中只能存储对象;
在弱集中,只有add()、has()、delete()和clear()方法可供我们使用;
垃圾收集器会自动删除没有任何外部引用的对象:
您不能查看 WeakSet'e 中存储的内容:
它的大小是未知的(分别没有size属性);
由于上述原因,它们是不可迭代的。
什么和何时使用:
集合与数组
如果您不需要重复和/或速度很重要,请使用集合而不是数组(集合更快,这在大型集合中尤其明显)。
集与弱集
如果您只处理对象并且需要提高处理数据的效率,请使用弱集。在上面的国家/地区示例中,您可以看到从数组中删除一个对象也会自动将其从 WeakSet 中删除。
我会补充我的想法。
为什么需要它
WeakSet?为此,您可以首先考虑为什么需要WeakMap.假设有一个特定的对象——一个产品。并且有一个特定的可视化工具可以为这个产品形成图片。整形过程繁重,渲染器要缓存图像。他可以在产品中放一张图片,但是:
渲染器可以为自己保存图像,但事实证明:
WeakMap在这一点上,渲染器作为一种处理对象生命周期交集的方式来拯救。仅当(可视化器和产品)都处于活动状态时,图像才会存储在WeakMap渲染器中。这
WeakSet只是一对 kWeakMap,好吧,既然有MapandSet,那么为了对称而拥有它是合乎逻辑的。您可以存储对象的简单关系(某种喜欢)。至于什么
Set比数组快,多半是个意外。在浏览器的下一个版本中,它可能会变得相反,我不会依赖这个。我们无法检查它是否已经(立即)删除了该对象,因为我们只使用
has-th 进行检查,这需要对该对象的引用。如果有引用,那么收集器不会删除该对象。所以可以说它最终会在某个时候删除该对象。