ES6学习笔记-集合

Author Avatar
Splendour 1月 24, 2016

Set

一个 Set 是一群值的集合,它是可变的,能够增删元素。

Set 和 Array 的区别

  • 一个 Set 不会包含相同元素,试图再次加入一个已有元素不会产生任何效果
let set = new Set('1234');
console.log(set.size);

set.add('1');
console.log(set.size);
  • Set 的数据存储结构专门为 包含性检测 作了速度优化
arrayOfWords.indexOf('word') !== -1  // 慢
setOfWords.has('word')               // 快
  • Set 不能提供索引
arrayOfWords[15000] // 'word'
setOfWords[15000]   // undefined

Set 的操作

  • new Set:创建一个新的、空的 Set
  • new Set(iterable):从任何 可遍历数据 中提取元素,构造一个新的集合
    你可以用它把数组转化为集合,在一行代码内去重;也可以传递一个生成器,函数会逐个遍历它,并把生成的值收录为一个集合;也可以用来复制一个已有的集合
  • set.size 获取集合中元素个数
  • set.has(value):判定集合中是否含有指定元素,返回一个布尔值
  • set.add(value):添加元素,如果与已有重复,则不产生效果
  • set.delete(value):删除元素,如果并不存在,则不产生效果。.add().delete() 都会返回集合自身,所以我们可以用链式语法
  • setSymbol.iterator:返回一个新的遍历整个集合的迭代器。一般这个方法不会被直接调用,因为实际上就是它使集合能够被遍历,也就是说,我们可以直接写for (v of set) {...} 等等
  • set.forEach(f):它就像是 for (let value of set) { f(value, value, set); } 的简写,类似于数组的 .forEach() 方法
  • set.clear():清空集合
  • set.keys()、set.values()和set.entries():返回各种迭代器
    // 将迭代器转化为数组输出
    console.log(Array.from(set.keys()));    // [ '1', '2', '3', '4' ]
    console.log(Array.from(set.values()));  // [ '1', '2', '3', '4' ]
    console.log(Array.from(set.entries())); // [ [ '1', '1' ], [ '2', '2' ], [ '3', '3' ], [ '4', '4' ] ]
    

Map

一个 Map 对象由若干键值对组成,类似 Java 的 Map 对象

Map 的操作

  • new Map:返回一个新的、空的 Map
  • new Map(pairs):根据所含元素形如 [key, value] 的数组 pairs 来创建一个新的 Map。这里提供的 pairs 可以是一个已有的 Map 对象,可以是一个由二元数组组成的数组,也可以是逐个生成二元数组的一个生成器,等等。
  • map.size:返回 Map 中键值对的个数
  • map.has(key):测试一个键名是否存在,类似 key in obj
  • map.get(key):返回一个键名对应的值,若键名不存在则返回 undefined,类似 obj[key]
  • map.set(key, value):添加一对新的键值对,如果键名已存在就覆盖
  • map.delete(key):按键名删除一项,类似 delete obj[key]
  • map.clear():清空 Map
  • mapSymbol.iterator:返回遍历所有项的迭代器,每项用一个键和值组成的二元数组表示
  • map.forEach(f):类似 for (let [key, value] of map) { f(value, key, map); }
  • map.keys():返回遍历所有键的迭代器
  • map.values():返回遍历所有值的迭代器
  • map.entries():返回遍历所有项的迭代器,就像 map[Symbol.iterator]()

WeakMap 和 WeakSet

WeakMap 和 WeakSet 被设计来完成与 Map、Set 几乎一样的行为,除了以下一些限制:

  • WeakMap 只支持 new、has、get、set 和 delete
  • WeakSet 只支持 new、has、add 和 delete
  • WeakSet 的值和 WeakMap 的键必须是对象

    这些小心设计的限制让垃圾回收机制能回收仍在使用中的弱集合里的无效对象。这效果类似于弱引用或弱键字典,但ES6的弱集合可以在不暴露脚本中正在垃圾回收的前提下得到垃圾回收的效益