zoukankan      html  css  js  c++  java
  • 深入理解ES6读书笔记6:Set和Map

    Set 是不包含重复值的列表。
    Map 是键值对的有序列表,键和值都可以是任意类型。

    一、Set

    1、Set的创建、增加、删除、和数组互转等

    1、Set的创建、增加、删除、和数组互转等
    //创建Set和添加项目
    let set = new Set(); 
    set.add(5);
    set.add(5); //多次添加相同值,只保留第一个
    set.add("5");
    console.log(set.size); // 2
    
    //使用数组来初始化一个 Set
    let set2 = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
    console.log(set2.size); // 5
    
    //Set转数组
    let array = [...set2];
    console.log(array); // [1,2,3,4,5]
    
    //判断Set中是否存在某个值
    console.log(set2.has(5)); //true
    console.log(set2.has(6)); //false
    
    //移除单个值
    set2.delete(5);
    console.log(set2.has(5)); //false
    console.log(set2.size); //4
    
    //移除所有值
    set2.clear();
    console.log(set2.size); //0

    2、Set 上的 forEach() 方法

    forEach() 方法会被传递一个回调函数,该回调接受三个参数:Set中下个位置的值、与第一个参数相同的值、目标Set 自身。
    具有 forEach() 方法的其他对象(即数组与 Map )都会给回调函数传递三个参数,前两个参数都分别是下个位置的值与键(给数组使用的键是数值索引)。
    Set却没有键,为了让这些回调函数保持参数相同,将Set中的每一项同时认定为键与值,所以该回调函数的前两个参数就始终相同。

    let set = new Set([1, 2]);
    set.forEach(function(value, key, ownerSet) {
        console.log(key + " " + value);
        console.log(ownerSet === set);
    });
    /*输出:
    1 1
    true
    2 2
    true
    */

    3、Weak Set

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

    let set = new Set(),
    key = {a: 1};
    set.add(key);
    console.log(set.size); // 1
    // 取消原始引用
    key = null;
    console.log(set.size); // 1
    // 重新获得原始引用
    key = [...set][0];
    console.log(key); //{a: 1}

    将key设置为 null 清除了对key对象的一个引用,但是另一个引用还存于set内部。你仍然可以使用扩展运算符将Set 转换为数组,然后访问数组的第一项,key变量就取回了原先的对象。

    Weak Set只允许存储对象弱引用,不能存储基本类型的值。对象的弱引用在它自己成为该对象的唯一引用时,不会阻止垃圾回收。
    Weak Set 没有 forEach() 方法和size 属性。

    let set = new WeakSet(),
    key = {};
    // 将对象加入 set
    set.add(key);
    console.log(set.has(key)); // true
    //set.delete(key);
    //移除对于键的最后一个强引用,同时从Weak Set中移除
    key = null;

    二、 Map

    1、Map的创建、增加、删除等

    1、Map的创建、增加、删除等
    let map = new Map();
    //添加键值对
    map.set("name", "张三"); 
    map.set("age", 20);
    
    //查询有多少个键值对
    console.log(map.size); // 2
    
    //判断指定的键是否存在于 Map 中
    console.log(map.has("name")); // true
    
    //根据指定的键获取对应的值
    console.log(map.get("name")); // "张三"
    
    //移除Map中的键以及对应的值
    map.delete("name");
    
    //移除Map中所有的键与值
    map.clear();
    
    console.log(map.has("name")); // false
    console.log(map.get("name")); // undefined
    
    //使用数组初始化
    let map2 = new Map([["name", "张三"], ["age", 20]]); 
    //map2键值对和map一样
    console.log(map2.get("name")); // "张三"
    console.log(map2.get("age")); // 20
    console.log(map2.size); // 2

    2、Map 上的 forEach 方法

    let map = new Map([["name", "张三"], ["age", 20]]); 
    map.forEach(function(value, key, ownerMap) {
        console.log(key + " " + value);
        console.log(ownerMap === map);
    });
    /*输出:
    name 张三
    true
    age 20
    true
    */

    3、Weak Map

    在Weak Map中,所有的键都必须是对象,当这些键在Weak Map之外不存在引用时,该键值对会被移除。

    let key1 = {},
        key2 = {},
        map = new WeakMap([[key1, "Hello"], [key2, 42]]);
    console.log(map.has(key1)); // true
    console.log(map.get(key1)); // "Hello"
    console.log(map.has(key2)); // true
    console.log(map.get(key2)); // 42
  • 相关阅读:
    【06月18日】A股滚动市净率PB历史新低排名
    沪深300指数的跟踪基金最近1年收益排名
    主要股东近3年净买入排名
    北上资金近1周流入排行榜
    【06月12日】指数估值排名
    最近一月研报推荐次数最多的最热股票
    【06月10日】A股ROE最高排名
    JDK源码阅读-------自学笔记(九)(常用类型Integer初探)
    JDK源码阅读-------自学笔记(八)(数组演示冒泡排序和二分查找)
    JDK源码阅读-------自学笔记(七)(二维数组的浅析)
  • 原文地址:https://www.cnblogs.com/gdjlc/p/14539104.html
Copyright © 2011-2022 走看看