ES6学习之路(六) Set&WeakSet

什么是数据结构

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

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

你可能感兴趣的:(ES6学习)