美文网首页
7. Set集合与Map集合

7. Set集合与Map集合

作者: 莣忧草_3b53 | 来源:发表于2019-12-11 21:40 被阅读0次

    JS 在以前只有一种集合类型,也就是数组类型。ES6 向 JS 添加了 Set 与 Map集合类型。

    7.1 ES6 的 Set

    ES6 新增了 Set 类型,这是一种无重复值的有序列表。

    let set = new Set();
    set.add(5);
    set.add("5");
    set.add(5); // 会被忽略
    console.log(set.size); // 2
    console.log(set.has(5)); // true 可以使用 has() 方法来测试某个值是否存在于 Set 中
    set.delete(5); // 移除值
    console.log(set.has(5)); //false
    set.clear(); //  set 就被清空了。
    console.log(set.has("5")); // false
    console.log(set.size); // 0
    

    Set 不会使用强制类型转换来判断值是否重复。

    let set = new Set(),
    key1 = {},
    key2 = {};
    set.add(key1);
    set.add(key2);
    console.log(set.size);  // 2
    

    可以使用数组来初始化一个 Set ,并且 Set 构造器会确保不重复地使用这些值

    let set = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
    console.log(set.size); 
    

    7.2 Set 上的 forEach() 方法

    forEach() 方法会被传递一个回调函数,该回调接受三个参数:

    1. Set 中下个位置的值;
    2. 与第一个参数相同的值;
    3. 目标 Set 自身。
      具有 forEach() 方法的其他对象(即数组与 Map )都会给回调函数传递三个参数,前两个参数都分别是下个位置的值与键(给数组使用的键是数值索引)。
    let set = new Set([1, 2]);
    set.forEach(function(value, key, ownerSet) {
      console.log(key + " " + value);// 1 1  2  2
      console.log(ownerSet === set);// true true
    });
    

    如果想在回调函数中使用 this ,可以给 forEach() 传入一个 this值作为第二个参数

    let set = new Set([1, 2]);
    
    let processor = {
      output(value) {
        console.log(value); // 1, 2
      },
      process(dataSet) {
        dataSet.forEach(function(value) {
          this.output(value);
        }, this);
      }
    }
    processor.process(set);
    

    或者

    let set = new Set([1, 2]);
    
    let processor = {
      output(value) {
        console.log(value); // 1, 2
      },
      process(dataSet) {
        dataSet.forEach((value)  => this.output(value);
      }
    }
    processor.process(set);
    

    Set无法像数组那样用索引来直接访问某个值。我们可以把Set转换为数组。

    7.3 将 Set 转换为数组

    数组转化为Set,可以防止值的重复

    let set = new Set([1, 2, 3, 3, 3, 4, 5]),
    array = [...set];
    console.log(array); // [1,2,3,4,5]
    

    7.4 Weak Set

    对象存储在 Set 的一个实例中时,实际上相当于把对象存储在变量中。只要对于 Set 实例的引用仍然存在,所存储的对象就无法被垃圾回收机制回收,从而无法释放内存。

    let set = new Set(),
    key = {};
    set.add(key);
    key = null;
    key = [...set][0]; // {}
    // set中还存在{}的引用
    
    let set = new WeakSet(),
    key = {};
    set.add(key);
    key = null;
    set.has(key) // false
    
    1. 对于 WeakSet 的实例,若调用 add() 方法时传入了非对象的参数,就会抛出错误(
      has() 或 delete() 则会在传入了非对象的参数时返回 false );
    2. Weak Set 不可迭代,因此不能被用在 for-of 循环中;
    3. Weak Set 无法暴露出任何迭代器(例如 keys() 与 values() 方法),因此没有任何编
      程手段可用于判断 Weak Set 的内容;
    4. Weak Set 没有 forEach() 方法;
    5. Weak Set 没有 size 属性。

    7.5 ES6 的 Map

    Map是键值对的有序列表,而键和值都可以是任意类型。键的比较使用的是
    Object.is()

    let map = new Map(), key1 = {},
    map.set("title", "Understanding ES6");
    map.set(key1, 2016);
    console.log(map.size); // 2
    console.log(map.get("title")); // "Understanding ES6"
    

    7.6 Map 的方法

    1. has(key) :判断指定的键是否存在于 Map 中;
    2. delete(key) :移除 Map 中的键以及对应的值;
    3. clear() :移除 Map 中所有的键与值。
    4. get() :获取键值
    5. map属性

    7.7 Map 的初始化

    内部数组的首个项会作为键,第二项则为对应值。

    let map = new Map([["name", "Nicholas"], ["age", 25]]);
    console.log(map.has("name")); // true
    console.log(map.get("name")); // "Nicholas"
    console.log(map.size); // 2
    

    7.8 Map 上的 forEach 方法

    forEach参数

    1. Map 中下个位置的值;
    2. 该值所对应的键;
    3. 目标 Map 自身。
    let map = new Map([ ["name", "Nicholas"], ["age", 25]]);
    map.forEach(function(value, key, ownerMap) {
    console.log(key + " " + value);
    console.log(ownerMap === map);
    });
    //name Nicholas
    //true
    //age 25
    //true
    

    7.9 Weak Map

    ES6 的 WeakMap 类型是键值对的无序列表,其中键必须是非空的对象,值则允许是任意类型。
    Weak Map 的键才是弱引用,而值不是。在 Weak Map 的值中存储对象会阻止垃圾回收,即使该对象的其他引用已全都被移除。

    let map = new WeakMap(),
    element = {};
    map.set(element, "Original");
    let value = map.get(element);
    element = null;
    

    Weak Map clear() 方法不存在
    里面涉及内存机制。不过,在不涉及键为对象的时候,我们使用一般的map就好,涉及的时候,试试使用Weak Map

    相关文章

      网友评论

          本文标题:7. Set集合与Map集合

          本文链接:https://www.haomeiwen.com/subject/exjgictx.html