Set
Set 本身是一个构造函数,用来生成Set 数据结构。
// 去除数组的重复元素
[...new Set(array)]
// 向Set 加入值时不会发生类型转换,所以5 和'5'是两个不同的值。Set 内部判断两个值是否相同时使用的算法叫做“Same-value equality”,它类似精确相等运算符(===),主要的区别是NaN 等于自身,而精确相等运算符认为NaN不等于自身。
Set 实例的属性和方法
set 会维护值插入时的顺序,因此支持按顺序迭代。
// 属性
Set.prototype.constructor
Set.prototype.size
// 操作方法
add(value)
delete(value)
has(value)
clear()
// 迭代方法
keys()
values()
entries()
forEach()
// 扩展运算符(...)内部使用for... of 循环,所以也可以用于Set 结构。
// 数组的map 和filter 方法也可以用于Set。
用 Set 可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)
let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])
// 并集
let union = new Set([...a, ...b]);// Set {1, 2, 3, 4}
// 交集
let intersect = new Set([...a].filter(x => b.has(x))) // set {2, 3}
// (a 相对于 b 的)差集
let difference = new Set([...a].filter(x => !b.has(x))) // Set {1}
WeakSet
- WeakSet 的成员只能是对象,而不能是其他类型的值。
- WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑WeakSet 对该对象的引用。如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象是否还存在于WeakSet 之中。可以用来保存DOM 节点,不容易造成内存泄漏。
应用场景:
-
弱集合在给对象打标签时有价值:
// Set const disabledElements = new Set() const loginButton = document.querySelector('#login') // 通过加入对应集合,给这个节点打上“禁用“标签 disabledElements.add(loginButton) // 这样通过查询元素在不在disabledElements 中,就可以知道它是不是被禁用了。不过,假如元素从DOM 树中被删除了,它的引用却仍然保存在Set 中,因此垃圾回收程序也不能回收它。 // WeakSet const disabledElements = new WeakSet() const loginButton = document.querySelector('#login') disabledElements.add(loginButton) // 只要weakSet 中任何元素从DOM 树中被删除,垃圾回收程序就可以忽略其存在,而立即释放其内存(假设没有其他地方引用这个对象)