ES6 Set和WeakSet结构初识

Set数据结构


Set基础知识
  • 概念:ES6提供的新数据结构,类似于数组,但成员的值都是唯一的,没有重复的值.看一个简单的例子:

      const s=new Set();
      [2,3,5,4,5,2,2].forEach(x=>s.add(x));
      for(let i of s){
      	console.log(i);		==>2,3,5,4  表明Set结构不会重复添加值
      }
    
  • 使用方法:Set函数可以接收一个数组(或具有iterator接口的其他数据结构)作为参数,用来初始化

      const set=new Set([1,2,3,4,4]);
      //不了解...运算符的可以翻看前面的博客
      [...set]  ==>[1,2,3,4] 这个也是真正的数组.
      //之后也可以通过Array.from(set)将其转换为真正的数组
      set.size ==>4
      //通过上述例子,可以有一种简单的数组去重方法:[...new Set(array)]
    
  • 特征:向Set加入值的时候,不会发生类型转换,因此5和’5’是两个不同的值。Set内部判断两个值是否不同,使用的算法叫做"Same-value equality" ,类似于===,主要的区别是NaN自身.此外,两个对象总是不相等的

      let set=new Set();
      set.add({});
      set.size  ==>1
      set.add({});
      set.size  ==>2
      //因此两个空对象不相等,被视为两个值
    
Set实例的属性和方法
  • 属性:

    1. Set.prototype.constructor:构造函数,默认就是Set函数
    2. Set.prototype.size返回Set实例的成员总数
  • 方法:(用法很简单,就不一一举例了)

    • 4种操作方法:
      1. add(value):添加某个值,返回Set结构本身
      2. delete(value):删除某个值,返回一个布尔值,表示删除是否成功
      3. has(value):返回一个布尔值,表示是否是Set的成员
      4. clear():清除所有成员,没有返回值
    • 4种遍历方法(Set的遍历顺序就是插入顺序)
      1. keys():返回键名的遍历器

      2. values():返回键值的遍历器.因为Set没有键名只有键值,因此keys(),values()行为完全一致.Set结构的实例默认可遍历,它的默认遍历生成函数就是它的values方法:Set.prototype[Symbol.iterator]===Set.prototype.values,因此Set可以直接用for…of遍历

      3. entries():返回键值对的遍历器.因为只有键值,返回的键名和键值一样

      4. forEach():使用回调函数遍历每个成员.用于对每个成员执行某种操作,没有返回值.举个小例子

         let set=new Set([1,2,3]);
         set.forEach((value,key)=>console.log(value*2))  ==>2,4,6
        
  • 遍历的应用:

    1. 扩展运算符内部使用for…of循环,所以可以用于Set结构

       let set=new Set(['green','red','blue'])
       let arr=[...set]  ==> ["green", "red", "blue"]
      
    2. 实现并,交,差集

       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}
       //差
       let difference=new Set([...a].filter(x=>!b.has(x))); ==>Set{1}
      

WaekSet数据结构

结构与Set类似,也是不重复的值的集合

与Set的区别
  1. WeakSet的成员只能是对象,而不是其他类型的值
  2. WeakSet中的对象都是弱引用,即垃圾回收机制.不考虑WeakSet对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还在WeakSet之中
  3. 不可遍历,因为它随实会消失,它内部的成员取决于垃圾回收机制有没有运行,而垃圾回收机制不可预测,因此不可遍历
语法基础
  • 作为构造函数,WeakSet可以接受一个数组或类似数组的对象作为参数(任何具有iterator接口的对象都可以作为参数),该数组的所有成员都会自动成为WeakSet实例对象的成员

      const a=[[1,2],[3,4]];
      const ws=new WeakSet(a); ==>WeakSet{[1,2],[3,4]} 
      //a数组的成员成为WeakSet的成员,而不是a数组本身,也就是说数组的成员只能是对象
    
  • WeakSet结构有以下三个方法:

    1. WeakSet.prototype.add(value):向WeakSet实例添加一个新成员
    2. WeakSet.prototype.delete(value):清除WeakSet实例的指定成员
    3. WeakSet.prototype.has(value):返回一个布尔值,表示某个值是否在WeakSet中
  • WeakSet没有size属性,没有办法遍历它的成员.也就是说ws.size ==>undefinde ws.forEach ==>undefined

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值