让我们先看看Chrome堆转储的内存消耗情况.
A Set of 1509 strings each of 144 characters consumes 231776 bytes:
A Set of 1509 strings each of 72 characters consumes 111056 bytes:
A Set of 1509 strings each of 36 characters consumes 50696 bytes:
A Set of 1509 elements consumes 20516 bytes:
A Set of 1509 numbers also consumes 20516 bytes:
因此,字符串集的大小随每个项目长度的大小而变化,但内存大小对于元素和数量是一致的.
现在来回答你的问题.根据用例的不同,最高效的内存方法可能会有所不同.
A set of element将实际存储元素引用.JS中对象引用的大小为8字节.
元素引用集合可能看起来是消耗一致存储器的解决方案,因为该集合仅保存对该元素的引用,并且该元素的存储器已经被分配,因为它是DOM的一部分.因此,没有什么真正的增长.
但是,使用元素引用创建集合的一个问题是,如果在从DOM中删除元素之后不删除元素引用,由于集合中保留的元素引用,它将不断消耗为被删除的元素分配的内存.如果页面上的添加/删除元素非常频繁,并且Set包含所有元素引用,则可能会导致内存泄漏.在这种情况下,我们必须从集合中删除已删除的元素引用.Element.isConnected
是一个布尔属性,如果元素仍然附加到DOM,则返回TRUE,如果从DOM中删除元素,则返回FALSE.
A set of strings时,字符串将存储在堆中,而集合将保存它们的引用.最终,这种方法的内存消耗将取决于您要添加的字符串的大小.
现在,对于a set of 100s,数字也将存储在堆中,集合将保存它们的引用.JS中的一个数字需要8个字节.所以在这里你也可以得到一致的尺寸.
Conclusion Based on same size set for different data types个
Set
只存储您要添加到其中的项的引用.因此,差异主要是由于堆中项的大小造成的.
- 如果你有小长度的弦,你可以用它.
- 如果您的用例适合元素方法并正确处理内存泄漏,则可以 Select 元素集方法.
- A set of number can be a decent choice in most cases.个