• Set 和 WeakSet 数据结构


    Set 和 WeakSet 数据结构是ES6新增。

    它与数组非常相似,但是Set数据结构的成员都是唯一的。

    特别说明:Set 中只能添加一个NaN

    一、Set 数据结构:

    var set = new Set([1,2,3,4,2,8,10])   // 两个2
    
    for (var elem of set) {
      console.log(elem)
    }

    //-----------循环用 add 添加赋值 --------------

    var set = new Set()
    
    [1,2,3,4,2,8,10].map(function(elem){
      set.add(elem)
    })
    
    for (let elem of set) {
      // for...of 遍历
      console.log(elem)
    }

    //---------------- 扩展运算符 --------------------

    var set = new Set ([1,2,3,4,2,8,10])
    
    var arr = [...set]  // 扩展运算符(...)内部使用 for...of 循环
    
    console.log(set)  // [Object set]
    
    console.log(arr)  // 1,2,3,4,2,8,10

    //---------------- 清空、删除 --------------------

    var set = new Set([1,2,3,4,2,8,10])
    
    set.clear() // 清空
    
    set.delete(8) // 删除
    
    var arr = [...set]
    
    console.log(arr)

    //----------------- 遍历键值 ----------------------

    set.forEach(function(value,key){
      console.log(value + '=' + key)
    })

    从输出结果可以看出,键和键值是相同的

    //----------------- 判断set中是否含有 -----------

    console.log(set.has(8))

    //----------------- 遍历值 ------------------------

    let setlter = set.values() //把所有的值单独拿出来
    
    for (let val of setlter) {
      console.log(val)
    }

    //------------------ 数量 -------------------------

    console.log(set.size)

    //------------------- mapfilter 也可以用于set中--------

    es5中数组新增 map 和 filter 方法

    map: 映射的意思,映射返回一个新数组,有返回值;mapArr: 返回一个新对象

    var mapArr = array.map(function(value,index,array){
      return value*value
    })

    filter: 过滤、筛选的意思,有返回值;filterArr: 返回过滤后新数组

    var filterArr = array.filter(function(value,index,array){
      if (value > 20) {
        return true
      }
    
      return false
    })

    //--------------------------------------------------------

    let set = new Set([1,2,3])
    
    set = new Set([...set].map(x => x*2))
    
    var arr = [...set]
    
    console.log(arr)

    // 返回Set结构: {2,4,6}

    let set = new Set([1,2,3,4,5])
    
    set = new Set([...set].filter( x => (x % 2) == 0))
    
    var arr = [...set]
    
    console.log(arr)

    // 返回Set结构: {2,4}

    //------------------ 求并集、交集、差集 ---------------------

    使用 Set 可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)

    let a = new Set([1,2,3])
    
    let b = new Set([4,3,2])

    // 并集

    let union = new Set([...a,...b])
    
    var arr = [...union]
    
    console.log(arr) // Set {1,2,3,4}

    // 交集

    let intersect = [...a].filter(x => b.has(x))
    
    即:let intersect = [...a].filter(function(x){
        return b.has(x)  // 返回 true,则 x 会被放入 intersect 集合中
      })
    
    console.log(intersect)  // Set {2,3}

    // 差集

    let difference = [...a].filter( x => !b.has(x))
    
    即:let difference = [...a].filter(function(x){
        return !b.has(x)
      })
    
    console.log(difference)  // Set {1}

    二、WeakSet 数据结构

    它与 Set 十分相似,对象的值也不能是重复的,与 Set 不同点:

    1.WeakSet 成员只能够是对象 

    2.作为 WeakSet 成员的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在与WeakSet之中。这个特点意味着,无法引用WeakSet的成员,因此WeakSet是不可遍历的

    3.使用WeakSet存储对象实例的好处是,由于是对对象实例的引用,不会被计入内存回收机制,所以删除实例的时候,不用考虑weaket,也不会出现内存泄漏。                                                         //-----错误------

    var weakset = new WeakSet()
    
    weakset.add(5)

    //-----正确------

    var weakset = new WeakSet()
    
    weakset.add({})  // 添加
    
    var weakset = new WeakSet([[1,2],[3,4]])

    //------例子------

    var weakset = new WeakSet()
    
    let aObj = {a:'aa'}
    
    let bObj = new String('你好')
    
    let cObj = new Number(8)
    
    weakset.add(aObj)
    
    weakset.add(bObj)
    
    weakset.add(cObj)

    //----------- 删除 --------------

    weakset.delete(aObj)
    
    bObj = null   // 把对象删除,weakset中的对象也没了,垃圾回收机制,置空
    
    console.log(weakset.has(bObj))  // weakset不能取值,也不能显示,只用来表示是否有重复的对象

    .

                                                                             

  • 相关阅读:
    python全栈开发_day41_数据库5
    python全栈开发_day40_数据库4
    python全栈开发_day39_数据库3
    python全栈开发_day38_数据库2
    python全栈开发_day37_数据库1
    python全栈开发_day36_高并发,协程
    python全栈开发_day35_锁,进程池,线程池
    python全栈开发_day34_线程了解知识点
    python全栈开发_day33_关于进程的了解知识
    python全栈开发_day32_粘包分析,socketserver和多道技术
  • 原文地址:https://www.cnblogs.com/crazycode2/p/6662244.html
Copyright © 2020-2023  润新知