《红宝书》 |Set与WeakSet

Set

Set也称集合

实例化

cont s=new Set()

//可传入一个可迭代对象,其中是插入到Set实例的元素
const s=new Set(["val1","val2","val3"])

基本API

  • add(val):添加元素。(返回set实例,可连写)
  • has(val):查询指定值是否存在
  • delete(val):删除元素。(返回布尔值,表示实例中是否存在要删除的元素)
  • clear():清空元素
  • size属性:获取元素数量
    const s=new Set()
    s.add("apple").add("strawberry")  //添加元素
    s.has("apple")                    //true  
    s.size                            //2
    s.delete("apple")                 //删除元素
    s.has("apple")                    //false
    s.claer()                         //清空元素
    s.size                            //0
    

Set特性

  • Set可以将任何JavaScript数据类型作为元素
    const s=new Set()
    const functionVal=function(){}
    const symbolVal=Symbol()
    const objectVal=new Object()
    s.add(functionVal).add(symbolVal).add(objectVal)
    
  • 修改set集合中的元素不会影响其作为集合值的身份
    //当元素为原始值时,值不会被修改
    const s1=new Set(["val"])
    for(let value of s1.values()){
        value="newVal"
        console.log(s1.has(value))    //false
        console.log(s1.has("val"))    //true
    }
    
    //当元素为引用值时,修改其属性,该元素仍然在集合中
    const objKey={id:1}
    const s2=new Set([objKey])
    for(let value of s2.values()){
        value.id=2
        console.log(s2.has(objKey))    //true
    }
    

迭代应用

  • keys():返回键的遍历器
  • values():返回值的遍历器
  • entries():返回键值对的遍历器
  • forEach():对每个元素执行某种操作,没有返回值
    //set结构的键与值是同一个,所以keys()和values()的行为完全一致
    let set = new Set(['red', 'green', 'blue']);
    for (let item of set.keys()) {
      console.log(item);
    }
    // red
    // green
    // blue
    
    for (let item of set.values()) {
      console.log(item);
    }
    // red
    // green
    // blue
    
    for (let item of set.entries()) {
      console.log(item);
    }
    // ["red", "red"]
    // ["green", "green"]
    // ["blue", "blue"]
    
    let set = new Set([1, 2, 3]);
    set.forEach((value, key) => console.log(value * 2) )
    // 2
    // 4
    // 6
    

其他应用

  • 转换为数组
    let set = new Set(['red', 'green', 'blue']);
    [...set]    //['red', 'green', 'blue']
    
  • 去除数组重复元素
    let arr = [3, 5, 2, 2, 5, 5];
    let unique = [...new Set(arr)]	
    
  • 结合数组的map方法、filter方法,实现Map的遍历和过滤:
    let set = new Set([1, 2, 3]);
    set = new Set([...set].map(x => x * 2));	// 返回Set结构:{2, 4, 6}
    
    let set = new Set([1, 2, 3, 4, 5]);
    set = new Set([...set].filter(x => (x % 2) == 0));	// 返回Set结构:{2, 4}
    
  • 并集(Union)、交集(Intersect)和差集(Difference)
    let a = new Set([1, 2, 3]);
    let b = new Set([4, 3, 2]);
    
    // 并集
    let union = new Set([...a, ...b]);
    // 交集
    let intersect = new Set([...a].filter(x => b.has(x)));
    // 差集
    let difference = new Set([...a].filter(x => !b.has(x)));
    

WeakSet

WeakSet是Set的兄弟类型,其API也是Set的子集。WeakSet中的Weak指的是JavaScript垃圾回收程序对待弱集合中元素的方法。

实例化

const ws=new WeakSet()

弱集合特性

弱集合中的值只能是Object或者是继承自Object的类型,否则会抛出TypeError错误。

const val1={id:1},val2={id:2},val3={id:3}
const ws=new WeakSet([val1,val2,val3])

初始化是全有全无的操作,只要有一个键不符合要求,那么就初始化失败:

const val1={id:1},val2={id:2},val3={id:3}
const ws=new WeakSet([val1,"hello",val3])

原始值可先转换为原始包装类型再作为值:

const strVal=new String("hello")
const ws=new WeakSet([strVal])

与Set相比,WeakSet是不可迭代的

基本API

  • add(val):添加元素。(返回set实例,可连写)
  • has(val):查询指定值是否存在
  • delete(val):删除元素。

与Set相比,少了clear()size属性。

posted @ 2021-02-15 16:35  sanhuamao  阅读(65)  评论(0编辑  收藏  举报