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实例的属性和方法
-
属性:
- Set.prototype.constructor:构造函数,默认就是Set函数
- Set.prototype.size返回Set实例的成员总数
-
方法:(用法很简单,就不一一举例了)
- 4种操作方法:
- add(value):添加某个值,返回Set结构本身
- delete(value):删除某个值,返回一个布尔值,表示删除是否成功
- has(value):返回一个布尔值,表示是否是Set的成员
- clear():清除所有成员,没有返回值
- 4种遍历方法(Set的遍历顺序就是插入顺序)
-
keys():返回键名的遍历器
-
values():返回键值的遍历器.因为Set没有键名只有键值,因此keys(),values()行为完全一致.Set结构的实例默认可遍历,它的默认遍历生成函数就是它的values方法:
Set.prototype[Symbol.iterator]===Set.prototype.values
,因此Set可以直接用for…of遍历 -
entries():返回键值对的遍历器.因为只有键值,返回的键名和键值一样
-
forEach():使用回调函数遍历每个成员.用于对每个成员执行某种操作,没有返回值.举个小例子
let set=new Set([1,2,3]); set.forEach((value,key)=>console.log(value*2)) ==>2,4,6
-
- 4种操作方法:
-
遍历的应用:
-
扩展运算符内部使用for…of循环,所以可以用于Set结构
let set=new Set(['green','red','blue']) let arr=[...set] ==> ["green", "red", "blue"]
-
实现并,交,差集
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的区别
- WeakSet的成员只能是对象,而不是其他类型的值
- WeakSet中的对象都是弱引用,即垃圾回收机制.不考虑WeakSet对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还在WeakSet之中
- 不可遍历,因为它随实会消失,它内部的成员取决于垃圾回收机制有没有运行,而垃圾回收机制不可预测,因此不可遍历
语法基础
-
作为构造函数,WeakSet可以接受一个数组或类似数组的对象作为参数(任何具有iterator接口的对象都可以作为参数),该数组的所有成员都会自动成为WeakSet实例对象的成员
const a=[[1,2],[3,4]]; const ws=new WeakSet(a); ==>WeakSet{[1,2],[3,4]} //a数组的成员成为WeakSet的成员,而不是a数组本身,也就是说数组的成员只能是对象
-
WeakSet结构有以下三个方法:
- WeakSet.prototype.add(value):向WeakSet实例添加一个新成员
- WeakSet.prototype.delete(value):清除WeakSet实例的指定成员
- WeakSet.prototype.has(value):返回一个布尔值,表示某个值是否在WeakSet中
-
WeakSet没有size属性,没有办法遍历它的成员.也就是说
ws.size ==>undefinde
ws.forEach ==>undefined