其他分享
首页 > 其他分享> > Set和WeakSet

Set和WeakSet

作者:互联网

Set和WeakSet

Set

ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。需要记录不同成员的又不希望重复记录的情况下可以用到Set

如何生成Set:

let set1 = new Set()
let set2 = new Set([1,2,3])

Set 实例的属性:

Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。

四个操作方法:

由于Set中值不会重复,可以用来Set来做数组去重

四个遍历方法:

注意:Set实例中key和value是一样的,所以keys()values()这两个方法的结果是一样的

实例

Set中查找某个值是否已经存在的时间复杂度是O(1),而数组的indexOf方法时间复杂度是O(n),又由于Set中值不会重复,所以可以使用Set做数组去重:

//使用indexOf 缺点:时间复杂度O(n^2)性能低下, NaN要做特殊处理
function deduplicate1(arr) {
  let temp =[]
  for (let i = 0; i < arr.length; i++) {
    if(temp.indexOf(arr[i]) === -1){
      temp.push(arr[i])
    }
  }
  return temp
}

//使用对象解决性能问题 但是数组里不能有对象,null,undefined,Boolean值,也无法区分字符串和数字
function deduplicate2(arr) {
  let temp = {}
  for (let i = 0; i < arr.length; i++) {
    if(!temp[arr[i]]){
      temp[arr[i]] = true
    }
  }
  return Object.keys(temp)
}

//使用Set来去重
function deduplicate3(arr) {
  let temp = [...(new Set(arr))]
  return temp
}

WeakSet

WeakSet 结构与 Set 类似,也是不重复的值的集合。但是,它与 Set 有两个区别。

如果一个对象没有任何引用,那么此对象会尽快被垃圾回收,释放掉它占用的内存。

即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。

WeakSet 结构有以下三个方法。

WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失。

示例:

let div = document.querySelector('div')
let set = new Set()
set.add(div)
//...some code
document.body.removeChild(div)
div = null //dom对象仍在内存中,因为Set中仍然引用此对象
let div = document.querySelector('div')
let weakset = new WeakSet()
weakset.add(div)
//...some code
document.body.removeChild(div)
div = null //dom对象的已经没有引用,将被垃圾回收机制回收

标签:arr,Set,let,div,prototype,WeakSet
来源: https://www.cnblogs.com/xm0328/p/14128064.html