ES6之Set/Map

Set 和 Map 是 ES6 新引入的两种数据结构,有了这两个数据结构,我们再也不用使用 Array 到处模拟集合和字典了。

Set

一个Set是一群值的集合,它是可变的,能够增删元素。就像数学科学中的“集合”概念,一个Set的成员是无序且唯一的。也就是说,Set中没有相同元素,也不提供对值的索引。

Set() 函数可以用来生成Set数据结构,但其只接受可遍历数据做参数,例如数组、字符串等。

1
2
let set1 = new Set([0, 0, 1, 1, 2, 3, 4]);
set1; // Set { 0, 1, 2, 3, 4 }

由于集合Set是不支持索引的,所以Set中没有传统键值对的键名概念。在遍历Set时,传统意义上的键名的值使用当前元素的实际键值。还有一点需要注意,遍历Set的顺序是各个元素插入的顺序。

Set支持的所有操作如下:

  • new Set():创建一个新的、空的Set
  • new Set(iterable<T>):从任何可遍历数据中提取元素,构造一个新的Set
  • set.size:返回集合set中元素的个数
  • set.has(value):判断集合set中是否存在给定值,返回一个布尔值
  • set.add(value):向集合set中添加元素,如果与已有元素重复则无效果(Set实例中只能存在一个NaN,另:所有对象被认为不相等),返回集合set本身
  • set.delete(value):删除集合set中的给定值,返回一个布尔值,表示操作是否成功
  • set.clear():清空集合set
  • set.forEach(fun(key, value, set){ }) :类似数组的 forEach() 方法,对set的每个元素调用处理函数进行操作,该函数接受三个参数:当前键名、当前键值、集合本身。
  • set.keys() set.values() set.entries() 分别返回遍历set所有元素的键名、键值、键值对的迭代器

Map

一个 Map对象由若干键值对组成,它本质上是键值对的集合,类似于传统对象。与Set类似,Map对象的键名唯一且不支持索引。遍历Map时也是按照其元素的插入顺序进行。

1
2
let map1 = new Map([["name", "lfkid"], ["age", 21]]);
map1 // Map { 'name' => 'lfkid', 'age' => 21 }

Map支持的所有操作如下:

  • new Map() :返回一个新的、空的Map
  • new Map(Iterable<Array>):根据形如[key, value]的数组组成的二维数组创建一个新的Map实例
  • map.size:返回map中键值对的个数
  • map.has(key):判断给定键名是否存在,返回一个布尔值
  • map.get(key):给定键名,返回其对应的键值,若键名不存在则返回undefined
  • map.set(key, value):添加一个新的键值对,若键名已存在则更新键值,返回map本身
  • map.delete(key):按给定键名从map中删除键值对,返回一个布尔值
  • map.clear():清空map
  • map[Symbol.iterator]():返回遍历所有项的迭代器,每项用一个由该项键和值构成的二元数组表示,本质上调用的就是map.entries()
  • map.forEach(function(key, value, map) { }):同数组的forEach()方法类似
  • map.keys() map.values() map.entries() :分别返回遍历map所有键名、键值、项的迭代器

WeakSet和WeakMap

WeakSet和WeakMap与Set和Map类似,也是不能重复的值的集合。但是,它们与Set和Map有以下区别:

  • WeakSet的值和WeakMap的键只能是对象
  • WeakSet只支持new has add delete 操作
  • WeakMap只支持new has get set delete 操作
  • WeakSe和WeakMap属于弱集合,都不可迭代

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

WeakMap中的对象都是弱引用,即垃圾回收机制不考虑WeakMap对该对象的引用。键名对应的对象被自动回收后,WeakMap会自动移除对应的键值对。

WeakSet和WeakMap都有助于防止内存泄漏。


参考