zoukankan      html  css  js  c++  java
  • 《红宝书》 |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属性。

  • 相关阅读:
    我所理解的MVC
    关于开发文化的思考
    使用纯C语言开始win32 sdk编程
    谈谈编译原理和其在WEB开发中的应用1
    最简单的win32程序(c语言实现)
    关于Javascript的一些心得与记忆
    Cvv.WebUtility 我的MVC框架介绍
    发现了个不错的图片网站
    轻轻松松做开发--目前网站开发的流行原素
    我的模板分析引擎类PHP的.net开发方法标签设计篇
  • 原文地址:https://www.cnblogs.com/sanhuamao/p/14403929.html
Copyright © 2011-2022 走看看