数据结构:计算机中存储、组织数据的方式,算是数据的集合体,主要为了方便存取数据;
1.内部成员的值都是唯一的,没有重复的;
2.set本身是一个构造函数,用来生成一个Set数据结构;
3.Set()可以接受一个数组或者类似数组的对象作为参数,用来初始化;
4.set()中的值不会发生类型转换,所以5和’5’是不相等的,而NaN再set中和它自身是相等的;
5.set中两个对象总是不相等的;
const s = new Set();
[2,3,4,2,3,4,2,3].forEach(x=>s.add(x));
for(let i of s){
console.log(i);//2,3,4
}
//没有重复的
const set = new Set([1,2,3,4,4]);
console.log([...set]);//[1, 2, 3, 4]
const items = new Set([1,2,3,4,5,5,5,5]);
console.log(items.size);//5
function divs() {
return [...document.querySelectorAll('div')];
}
const sd = new Set(divs());
console.log(sd.size);//16
divs().forEach(div =>sd.add(div));
console.log(sd.size)//16
let set = new Set();
let a=NaN;
let b=NaN;
set.add(a);
set.add(b);
console.log(set);// {NaN}
let se = new Set();
se.add({});
console.log(se.size);//1
se.add({});
console.log(se.size);//2
一、属性
Set.prototype.constructor//Set构造函数
Set.prototype.size //返回set实例的成员总个数
二、方法
Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。
下面先介绍四个操作方法。
//add(value) ;添加某个值,返回Set结构本身
let s = new Set();
s.add(1).add(2).add(2);
console.log(s.size);//2
//has(value);返回一个布尔值,表示是否为Set成员;
console.log(s.has(1));//true
console.log(s.has(2));//true
console.log(s.has(3));//false
//delete(value);删除某个值,返回一个布尔值,表示删除是否成功
console.log(s.delete(2));//true
console.log(s.has(2));//false
//clear();清空所有成员,没有返回值
console.log(s.clear());
console.log(s.size);//0
//数组去重
function defupe(array){
return Array.from(new Set(array));
}
console.log(defupe([1,1,2,3]));//[1,2,3]
下面是遍历操作方法
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历每个成员
注意,set遍历顺序就是插入顺序,可以保证调用时按照添加顺序调用;
let set = new Set(['red','green','blue']);
//keys()
for(let item of set.keys()){
console.log(item);//red// green// blue
}
//values()
for(let item of set.values()){
console.log(item);//red// green// blue
}
//entries()
for(let item of set.entries()){
console.log(item);
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
}
//set实例的遍历默认使用的是values()方法,所以可以省略values();
for(let item of set){
console.log(item);//red// green// blue
}
forEach()循环
let set = new Set([1,2,3]);
set.forEach((value,key)=>console.log(value*2));//2,4,6
//拓展运算符内部使用的就是for...of循环,所以也可以循环set结构
let s1 = new Set(['red','green','blue']);
let arr1 = [...s1];
console.log(arr1);// ["red", "green", "blue"]
//拓展运算符去重
let arr2 = [1,1,2,2,3,3];
let s2 = [...new Set(arr2)];
console.log(s2);//[1,2,3];
//map()与filter方法应用
let set = new Set([1,2,3]);
set = new Set([...set].map(x=>x*2));
console.log(set);// {2, 4, 6}
let s1 = new Set([1,2,3,4,5]);
s1 = new Set([...s1].filter(x=>(x%2)==0));
console.log(Array.from(s1));//[2, 4]
//set 实现并集 交集和差集
let a = new Set([1,2,3]);
let b = new Set([4,3,2]);
let union = new Set([...a,...b]);
console.log(union);//{1, 2, 3, 4}
console.log( a instanceof Array)
let intersect = new Set([...a].filter(x=>b.has(x)));
console.log(intersect)//{2,3}
let difference = new Set([...a].filter(x=>!b.has(x)));
console.log(difference)//{1}
1.WeakSet与Set结构类似;
2.值都是唯一的;不重复;
3.weakset的成员只能是对象,不可以是其它类型的值;
//其它值会报错
const ws = new WeakSet();
console.log(ws.add(1));
//Invalid value used in weak set
console.log(ws.add(Symbol()));
//Invalid value used in weak set
4.WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakMap 里面的引用就会自动消失。
5.WeakSet 不可遍历。
6.WeakSet 可以接受一个数组或类似数组的对象作为参数。该数组的所有成员,都会自动成为 WeakSet 实例对象的成员。
//a数组的成员必须是对象
const a = [[1,2],[3,4]];
const ws = new WeakSet(a);
console.log(ws);//WeakSet {(2) [3, 4], (2) [1, 2]}
//不是对象会报错
const b =[3,4];
const wsb = new WeakSet(b);
console.log(wsb);// Invalid value used in weak set
WeakSet.prototype.add(value):向 WeakSet 实例添加一个新成员。
WeakSet.prototype.delete(value):清除 WeakSet 实例的指定成员。
WeakSet.prototype.has(value):返回一个布尔值,表示某个值是否在 WeakSet 实例之中。
const ws = new WeakSet();
const obj = {};
const foo = {};
ws.add(window);
ws.add(obj);
console.log(ws.has(window));//true
console.log(ws.has(obj));//true
ws.delete(window);
console.log(ws.has(window))//false
//WeakSet,没有size属性,没有遍历方法
const ws = new WeakSet();
console.log(ws.size);//undefined
console.log(ws.fotEach);//undefined