zoukankan      html  css  js  c++  java
  • es6之数据结构 set,WeakSet,mapWeakMap

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

    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){}
    }

    forEach()

    Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。

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

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

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

    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属性,没有办法遍历它的成员。

    ws.size // undefined
    ws.forEach // undefined

    Map

    JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制.

    ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。

    const m = new Map();
    const o = {p: 'Hello World'};
    
    m.set(o, 'content')
    m.get(o) // "content"
    
    m.has(o) // true
    m.delete(o) // true
    m.has(o) // false

    Map 也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。

    const map = new Map([
      ['name', '张三'],
      ['title', 'Author']
    ]);
    
    map.size // 2
    map.has('name') // true
    map.get('name') // "张三"
    map.has('title') // true
    map.get('title') // "Author"

    如果对同一个键多次赋值,后面的值将覆盖前面的值。

    const map = new Map();
    map
    .set(1, 'aaa')
    .set(1, 'bbb');
    map.get(1) // "bbb"

    实例的属性和操作方法

    (1)size 属性

    (2)set(key, value)

    (3)get(key)

    (4)has(key)

    (5)delete(key)

    (6)clear()

    {
     let map = new Map();
    map.set('foo', 11);
    map.set('bar', 22);
    map.size ;// 2
    map.get('foo');//t1
    map.has('boo');  //true
    map.delete('foo');  //true
    map.clear();
    map.size // 0
    }

    遍历方法

    Map 结构原生提供三个遍历器生成函数和一个遍历方法。

    • keys():返回键名的遍历器。
    • values():返回键值的遍历器。
    • entries():返回所有成员的遍历器。
    • forEach():遍历 Map 的所有成员。

    Map 结构的默认遍历器接口(Symbol.iterator属性),就是entries方法。

    WeakMap

    WeakMap结构与Map结构类似,也是用于生成键值对的集合。

    WeakMapMap的区别有两点。

    首先,WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。

    其次,WeakMap的键名所指向的对象,不计入垃圾回收机制。

    // WeakMap 可以使用 set 方法添加成员
    const wm1 = new WeakMap();
    const key = {foo: 1};
    wm1.set(key, 2);
    wm1.get(key) // 2
    
    // WeakMap 也可以接受一个数组,
    // 作为构造函数的参数
    const k1 = [1, 2, 3];
    const k2 = [4, 5, 6];
    const wm2 = new WeakMap([[k1, 'foo'], [k2, 'bar']]);
    wm2.get(k2) // "bar"

    WeakMap 的语法

    WeakMap 与 Map 在 API 上的区别主要是两个,

    一是没有遍历操作(即没有keys()values()entries()方法),也没有size属性。

    二是无法清空,即不支持clear方法。因此,WeakMap只有四个方法可用:get()set()has()delete()

  • 相关阅读:
    android: 在android studio中使用retrolambda的步骤
    Shiro基础知识03----shiro授权(编程式授权),Permission详解,授权流程(zz)
    [Android] 关于Android的问号?和@符号的用法
    20170506 《摔跤吧,爸爸》观影笔记
    Android关于log日志,华为不输出log.v,log.d(zz)
    阅读日志:协鑫一年的多晶硅料产能能够生产做少装机容量的组件?
    《周鸿祎自述》读书笔记
    使用promise 和 generator来管理工作流
    读书笔记,《刻意练习》,第三章,心理表征
    读书笔记,《刻意练习》,第四章,黄金标准
  • 原文地址:https://www.cnblogs.com/sunmarvell/p/9132682.html
Copyright © 2011-2022 走看看