ES6学习之路(六) Set&WeakSet

来源:互联网 发布:脸上红血丝 知乎 编辑:程序博客网 时间:2024/05/18 03:15

什么是数据结构

数据结构:计算机中存储、组织数据的方式,算是数据的集合体,主要为了方便存取数据;

Set()数据结构

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    }    //没有重复的

Set()可以接受一个数组或者类似数组的对象作为参数,用来初始化

    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

set()中的值不会发生类型转换,所以5和’5’是不相等的,而NaN再set中和它自身是相等的

    let set = new Set();    let a=NaN;    let b=NaN;    set.add(a);    set.add(b);    console.log(set);// {NaN}

set中两个对象总是不相等的

    let se = new Set();    se.add({});    console.log(se.size);//1    se.add({});    console.log(se.size);//2

Set结构实例的属性和方法

一、属性
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];

Set()实例用法

    //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}

WeakSet

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 方法

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