ES6之Set和Map及WeakSet和WeakMap总结

1,006 阅读3分钟

Set & Map

一、Set

  • 概念 Set类似于数组,本身是一个构造函数,用来生成 Set 数据结构,成员值都是唯一的,常用于数组去重。

  • 属性 Set.prototype.size:返回Set实例的成员总数

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

  • 遍历 Set.prototype.keys():返回键名的遍历器 Set.prototype.values():返回键值的遍历器 Set.prototype.entries():返回键值对的遍历器 Set.prototype.forEach():使用回调函数遍历每个成员

二、Map

  • 概念 由于Object只能使用字符串作为key,在使用上面会有很大的限制,比如使用DOM节点作为key时,就会被自动转为字符串[object HTMLDivElement]。 为了解决上述问题,ES6 引入了 Map ,它类似于对象,也是键值对的集合,但是其key的范围不限于字符串,各种类型的值(包括对象)都可以当作键。 Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。

  • 与Object的区别 Objectk-v(键-值对),key只能是字符串,value可以为任意类型,无序,不可遍历,有默认属性 Map: k-v(键-值对),keyvalue可以为任意类型,可使用for...of遍历,按插入顺序遍历,可存储大量数据,但是由于.get 函数,可能比Object

常用方法比较:

    Object:
       var o = {};
       var o = Object.create(null);
       o.key = 1;
       o.key += 10;
       for(let k in o) o[k]++;
       var sum = 0;
       for(let v of Object.values(m)) sum += v;
       if('key' in o);
       if(o.hasOwnProperty('key'));
       delete(o.key);
       Object.keys(o).length
    Map:
       var m = new Map();
       m.set('key', 1);
       m.set('key', m.get('key') + 10);
       m.foreach((k, v) => m.set(k, m.get(k) + 1));
       for(let k of m.keys()) m.set(k, m.get(k) + 1);
       var sum = 0;
       for(let v of m.values()) sum += v;
       if(m.has('key'));
       m.delete('key');
       m.size();
  • 属性与方法 size set(k,v) get(K) has(k) delete(k) clear()

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

  • 遍历顺序就是插入顺序

  • Map 转为数组最方便的方法,就是使用扩展运算符(...)

三、WeakSet

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

  • 对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用。如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。

  • WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失,所以WeakSet 的成员是不适合引用的。

  • 由于 WeakSet 内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此 ES6 规定 WeakSet 不可遍历。

  • 方法 WeakSet.prototype.add(value):向 WeakSet 实例添加一个新成员。 WeakSet.prototype.delete(value):清除 WeakSet 实例的指定成员。 WeakSet.prototype.has(value):返回一个布尔值,表示某个值是否在 WeakSet 实例之中。

四、WeakMap

  • WeakMap只接受对象作为键名(null除外)
  • WeakMap的键名所指向的对象,不计入垃圾回收机制
  • WeakMap的键名所引用的对象都是弱引用,即垃圾回收机制不将该引用考虑在内
  • 没有遍历方法,即没有keys()values()entries()方法
  • 没有size属性、clear()方法
  • WeakMap只有四个方法可用:get()set()has()delete()

一个典型应用场景是,在网页的 DOM 元素上添加数据,就可以使用WeakMap结构。当该 DOM 元素被清除,其所对应的WeakMap记录就会自动被移除。

参考

es6.ruanyifeng.com/#docs/set-m… stackoverflow.com/questions/1…