Set

16 阅读2分钟

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 树中被删除,垃圾回收程序就可以忽略其存在,而立即释放其内存(假设没有其他地方引用这个对象)