ES6 Set和Map

Set

  • Set集合是一种无重复元素的列表,通常的用途用以检测给定的元素在某个集合中是否存在

  • ES5模拟Set

        var set = Object.create(null);
    
        set.foo = true;
    
        if (set.foo) {}
        if ('foo' in set) {}
    
  • ES6里面的Set

    • Set类型是一种有序列表,不会对键进行强制类型转换(对象的键只能是字符串,故会对键进行强制类型转换)

    • 初始化

          let set = new Set(); // 无参数
          let set = new Set([1, 2, 3, 4]); // 参数为数组,会对数组去重,键为元素
          let set = new Set(iterableObj); // 任何可迭代对象,包括Set和Map
      
    • Set使用Object.is()比较两个键是否相同,注意:键+0和-0会被认为是同一个键,但Object.is(+0, -0) = false

    • 增删查

          let set = new Set();
      
          set.add(1);
          set.add(2);
          set.add(3);
          set.add(4);
          console.log(set.size); // 4,返回集合的长度
          console.log(set.has(1)); // true
          set.delete(1);
          console.log(set.has(1)); // false
          set.clear(); // 清空
          console.log(set.size); // 0
      
    • 遍历方法forEach

      • 参数

        Set集合中下一次索引的位置

        与第一个参数一样的值(主要是为了跟Map、数组一样接受三个参数)

        集合本身

          let set = new Set(['a', 'b']);
      
          set.forEach((value, key, ownerSet) => {
              console.log(value, key, ownerSet === set);
          });
      
          // 'a', 'a', true
          // 'b', 'b', true
      
    • 不能通过索引来直接访问元素

    • 使用展开运算符…即可将set转换为数组

          let set = new Set(['a', 'b']);
      
          console.log([...set]); // ['a', 'b']
      

Weak Set

  • Weak Set集合只储存对象的弱引用,并且不可以存储原始值;集合中的弱引用如果是对象唯一的引用,则会被回收并释放相应的内存

  • 增删查(除此之外没有其他的方法,无清空方法clear)

        let set = new WeakSet(),
            key = {};
        
        set.add(key);
    
        console.log(set.has(key));    // true
    
        set.delete(key);
    
        console.log(set.has(key));    // false
    
  • Weak Set构造函数不接受任何原始值,如果数组里面包含其他非对象值,程序会抛出错误

        let key1 = {}, key2 = {};
        let set = new WeakSet([key1, key2]);
    
  • 在WeakSet实例中,如果向add()方法传入非对象参数会导致程序报错,而向has()和delete()方法传入非对象参数则会返回false

  • WeakSet集合不可迭代,所以不能被用于for-of循环

  • WeakSet集合不暴露任何迭代器(例如keys()和value()方法),所以无法通过程序本身来检查其中的内容

  • WeakSet集合不支持forEach()方法

  • WeakSet集合不支持size属性

  • 如果只需要跟踪对象引用,更应该使用WeakSet集合而不是普通的Set集合

Map

  • Map类型是一种储存着许多键值对的有序列表,其中的键名和对应的值支持所有的数据类型

  • 键名的等价性判断是通过Object.is()方法实现的

  • 增删查改

        let map = new Map();
        map.set('name', 'Crane'); // 增加和修改都是同一个接口
        map.set('age', 22);
        map.set('gf', 0);
    
        console.log(map.has('name')); // 查询
    
        console.log(map.get('name')); // 获取
        console.log(map.get('age')); // 获取
    
        console.log(map.size); // 获取长度
        map.delete('gf'); // 删除一个键值对
        console.log(map.size);
        map.clear(); // 清空map
        console.log(map.size);
    
  • 实例化

        // 使用数组传参:
        // 确保键值对被储存到Map集合中之前不会被强制转换为其他数据类型
        let map = new Map([['name', 'Crane'], ['age', 22]]);
    
  • 遍历方法forEach

    • 参数:

      Map集合中下一次索引的位置

      值对应的键名

      Map集合本身

        let map = new Map([['name', 'Crane'], ['age', 22]]);
    
        map.forEach((value, key, ownerMap) => {
            console.log(key + ' ' + value);
            console.log(ownerMap === map);
        });
    
        // name Crane
        // true
        // age 25
        // true
    

WeakMap

  • WeakMap集合中的键名必须是一个对象,如果使用非对象键名会报错,集合中保存的是这些值的弱引用,如果在弱引用之外不存在其他的强引用,引擎的垃圾回收机制会自动回收这个对象,同时也会移除WeakMap集合中的键值对。但是只有集合的键名遵从这个规则,键名对应的值如果是一个对象,则保存的是对象的强引用,不会触发垃圾回收机制

  • WeakMap 类型是一种储存着许多键值对的无序列表,列表的键名必须是非null类型的对象,键名对应的值则可以是任意类型

  • WeakMap实例没有size属性

  • 增删查

    	let key1 = {},
    		key2 = {},
    		map = new WeakMap([[key1, 'Hello'], [key2, 'Crane']]),
    		element = document.getElementById('id');
    	
    	if (map.has(key1)) {
    		console.log(map.get(key1));
    	}
    
    	map.set(element, 'Element');
    	element.parentNode.removeChild(element);
    
    	console.log(map.has(element))
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值