• js es6 介绍set,WeakSet


    前言

    介绍一下es6 的set 和 weakset

    正文

    set

    ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。

    Set 本身是一个构造函数,用来生成 Set 数据结构。

    {
      let list = new Set();
      list.add(5);
      list.add(7);
      console.log(list.size); //2
    }
    

    Set 函数可以接受一个数组作为参数,用来初始化。

    {
      let arr = [1,2,3,4,5];
      let list = new Set(arr);
      console.log(list.size);  //5
    }
    

    Set中重复的元素不会添加,可以用于去重
    Set不会转换数据类型,数字就是数字,字符串就是字符串

    {
     let arr=[1,2,3,1,'2']
      let list2=new Set(arr);
      console.log(list2);    //Set(4) {1, 2, 3, "2"}
    }
    

    在 Set 内部,两个NaN是相等。

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

    两个对象总是不相等的。

    let set = new Set();
    set.add({});
    set.size // 1
    set.add({});
    set.size // 2
    

    Set 实例的属性和方法

    Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)

    四个操作方法:
    add(value):添加某个值,返回 Set 结构本身。
    delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
    has(value):返回一个布尔值,表示该值是否为Set的成员。
    clear():清除所有成员,没有返回值。

    {
      let arr=['add','delete','clear','has'];
      let list=new Set(arr);
    
      console.log(list.has('add')); //true
      console.log(list.delete('add'),list); 
    //true Set(3){"delete", "clear", "has"}
      list.clear();     //清空
      console.log(list);  // Set(0){}
    }
    
    {
      let arr=['add','delete','clear','has'];
      let list=new Set(arr);
    
      for(let key of list.keys()){
        console.log(key);  // add delete clear has 
      }
      for(let value of list.values()){
        console.log(value);   // add delete clear has  
      } 
      for(let [key,value] of list.entries()){
        console.log(key,value);
        // add add delete delete clear clear has has
      }
    
      list.forEach(function(item){console.log(item);})
      // add delete clear has 
    }
    

    Set 结构的实例默认可遍历,它的默认遍历器生成函数就是它的values方法。

    {
      let arr=['add','delete','clear','has'];
      let list=new Set(arr);
    
      for(let key of list.keys()){
        console.log(key);  // add delete clear has 
      }
      for(let value of list.values()){
        console.log(value);   // add delete clear has  
      } 
      for(let [key,value] of list.entries()){
        console.log(key,value);
        // add add delete delete clear clear has has
      }
    
      list.forEach(function(item){console.log(item);})
      // add delete clear has 
    }
    

    这意味着,可以省略values方法,直接用for...of循环遍历 Set。

    {
    let set = new Set(['red', 'green', 'blue']);
    for (let x of set) {
      console.log(x);
    }
    

    WeakSet

    WeakSet 的成员只能是对象,而不能是其他类型的值。

    {
      let weakList=new WeakSet();
      let arg={};
      weakList.add(arg);
      console.log(weakList); //{{}}
    
    }
    
    const ws = new WeakSet();
    ws.add(1)
    // TypeError: Invalid value used in weak set
    ws.add(Symbol())
    // TypeError: invalid value used in weak set
    
    

    WeakSet 可以接受一个数组或类似数组的对象作为参数。

    {const a = [[1, 2], [3, 4]];
    const ws = new WeakSet(a);
    console.log(ws)}
    //WeakSet {Array(2), Array(2)}
    //__proto__:WeakSet
    //[[Entries]]:Array(2)
    //0:Array(2)
    //value:(2) [3, 4]
    //1:Array(2)
    //value:(2) [1, 2]
    //length:2
    

    注意,是a数组的成员成为 WeakSet 的成员,而不是a数组本身。这意味着,数组的成员只能是对象。

    {
    const b = [3, 4];
    const ws = new WeakSet(b);
    // Uncaught TypeError: Invalid value used in weak set(…)
    }
    WeakSet 结构有以下三个方法。
    
    add(value):添加某个值,返回 WeakSet结构本身。
    delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
    has(value):返回一个布尔值,表示该值是否为WeakSet的成员。
    
    const ws = new WeakSet();
    const obj = {};
    const foo = {};
    
    ws.add(window);
    ws.add(obj);
    
    ws.has(window); // true
    ws.has(foo);    // false
    
    ws.delete(window);
    ws.has(window);    // false
    

    WeakSet 没有size属性,没有办法遍历它的成员。

    WeakSet 没有size属性,没有办法遍历它的成员。
    ws.size // undefined
    ws.forEach // undefined
    
  • 相关阅读:
    类的加载过程 以及实例的加载顺序
    设计优化之单例模式
    Java程序性能优化之性能概述
    1-12接口
    1-11多态
    1-9方法的重写(override)
    1-6static关键字
    1-10super和this关键字
    1-8继承extends
    1-7代码块的分类
  • 原文地址:https://www.cnblogs.com/aoximin/p/13193916.html
Copyright © 2020-2023  润新知