Set与WeakSet
Set
对象允许存储任何类型的唯一值,无论是原始值或者是对象引用,Set
对象中的值不会重复。
WeakSet
对象允许存储对象弱引用的唯一值,WeakSet
对象中的值同样不会重复,且只能保存对象的弱引用。
Set
描述
Set
对象是值的集合,可以按照插入的顺序迭代它的元素,Set
中的元素只会出现一次,即Set
中的元素是唯一的,常用来作数组去重。
属性与方法
Set.prototype.constructor
: 返回构造函数。
Set.prototype.size
: 返回Set
对象的值的个数。
Set.prototype.add(value)
: 在Set
对象尾部添加一个元素,返回该Set
对象。
Set.prototype.clear()
: 移除Set
对象内的所有元素。
Set.prototype.delete(value)
: 移除Set
的中与这个值相等的元素。
Set.prototype.entries()
: 返回一个新的迭代器对象,该对象包含Set
对象中的按插入顺序排列的所有元素的值的[value, value]
数组,为了使这个方法和Map
对象保持相似, 每个值的键和值相等。
Set.prototype.forEach(callbackFn[, thisArg])
: 按照插入顺序,为Set
对象中的每一个值调用一次callback
,如果提供了thisArg
参数,回调中的this
会是这个参数。
Set.prototype.has(value)
: 返回一个布尔值,表示该值在Set
中存在与否。
Set.prototype.keys()
: 返回一个新的迭代器对象,该对象包含Set
对象中的按插入顺序排列的所有元素的值。
Set.prototype.values()
: 返回一个新的迭代器对象,该对象包含Set
对象中的按插入顺序排列的所有元素的值。
Set.prototype[@@iterator]()
: 返回一个新的迭代器对象,该对象包含Set
对象中的按插入顺序排列的所有元素的值。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| var s = new Set([3, 3, 3, 2, 2, 1]);
console.log(s);
s.add(3); console.log(s);
var setIterator = s[Symbol.iterator](); console.log(setIterator);
var arr = [3, 3, 3, 2, 2, 1]; arr = [...new Set(arr).keys()]; console.log(arr);
|
WeakSet
描述
WeakSet
的值只能是Object
类型,持有的是Object
弱引用,原始数据类型不能作为值。WeakSet
持有的是对象的弱引用,这意味着在没有其他引用存在时垃圾回收能正确进行,WeakSet
用于存储的对象引用只有在其没有被回收时才是有效的,正由于弱引用,WeakSet
是不可枚举的。
简单来说,有时需要在某个数组上面存放一些对象,但是这会形成对于这个对象的引用,一旦不再需要这个对象,我们就必须手动删除这个引用,否则垃圾回收机制无法释放对象占用的内存,WeakSet
的设计就是解决这个问题的,其所引用的对象都是弱引用,垃圾回收机制不将该引用考虑在内,因此,只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存,此时WeakSet
里边所对应的对象引用会消失,不需要手动删除引用。如果需要在数组上添加对象而又不想干扰垃圾回收机制的话,就可以使用WeakSet
,此外WeakSet
非常适合于对象引用的跟踪,尤其是在涉及大量对象时。
属性与方法
WeakSet.prototype.constructor
: 返回构造函数。
WeakSet.prototype.add(value)
: 在该WeakSet
对象中添加一个新元素value
。
WeakSet.prototype.delete(value)
: 从该WeakSet
对象中删除value
这个元素。
WeakSet.prototype.has(value)
: 返回一个布尔值, 表示给定的值value
是否存在于这个 WeakSet
中.
内存回收实例
1 2 3 4 5 6 7
| var ws = new WeakSet(); var value = new Array(6 * 1024 * 1024); ws.add(value); console.log(ws.has(value)); value = null; console.log(ws.has(value));
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| global.gc(); process.memoryUsage();
var ws = new WeakSet(); var value = new Array(6 * 1024 * 1024); ws.add(value); console.log(ws.has(value)); process.memoryUsage();
global.gc(); process.memoryUsage();
value = null; global.gc(); process.memoryUsage();
console.log(ws.has(value));
|
1 2 3 4 5 6 7 8 9 10
| var s = new Set(); var value = new Array(6 * 1024 * 1024); s.add(value); console.log(s.has(value)); value = null; console.log(s.has(value)); console.log(s); s.clear(); console.log(s);
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| global.gc(); process.memoryUsage();
var s = new Set(); var value = new Array(6 * 1024 * 1024); s.add(value); console.log(s.has(value)); process.memoryUsage();
global.gc(); process.memoryUsage();
value = null; global.gc(); process.memoryUsage();
console.log(s.has(value)); console.log(s); s.clear(); global.gc(); process.memoryUsage();
console.log(s);
|
参考
1 2 3
| https://www.cnblogs.com/pengaijin/p/7659672.html https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WeakSet
|