ES6 笔记 集合

ES6 中加入了Set, Map, WeakSet, WeakMap

为什么加入集合

Javascript中的Object,类似于map,可以向其中添加key-value对(属性),可以getsetdeleteiterate属性,但是Object相较于Map有以下缺点:

  • 作为Map的Object的方法名有可能和属性名冲突

  • 创建作为Map的Object时需要使用Object.create(null)避免继承Object中的方法

  • 属性的key必须是字符串

  • 无法得到有多少属性

  • 无法和for...of使用

ES6中的集合不会将数据暴露成属性,而是必须使用get(key)方法获取

Set

  • new Set() 创建空的Set
  • new Set(iterable)用iterable的value创建Set
  • set.size set的大小
  • set.has(value) value是否在set中
  • set.add(value) 向set中添加一个value,如果value已经存在,则不作操作
  • set.delete(value)从set删除value,adddelete都返回set本身
  • set[Symbol.iterator]()返回set的迭代器
  • set.forEach(f) 对每个value调用f,跟一下等价
for (let value of set)
    f(value, value, set);
  • set.clear() 删除set中所有值
  • set.keysset.valuesset.entries()返回对用的迭代器

Map

  • new Map创建空的Map
  • new Map(pairs) pair可以是Map,两元素Array的Array,或者产生两元素数组的generator
  • map.size Map中entry的数量
  • map.has(key) key是否在map存在
  • map.get(key) 得到key的value,如果key不存在,返回undefined
  • map.set(key, value) 添加key-value对
  • map.delete(key) 删除一个entry
  • map.clear() 删除所有entry
  • map[Symbol.iterator]() 返回entry的iterator
  • map.forEach(f) 同以下:
for (let [key, value] of map)
  f(value, key, map);
  • map.keys()map.values()map.entries()返回对应的iterator

JS集合的不同之处

  • object没hashcode
var urls = new Set;
urls.add(new URL(location.href));  // two URL objects.
urls.add(new URL(location.href));  // are they the same?
alert(urls.size);  // 2
  • 遍历Map和Set时,是按value插入的顺序

WeakMap和WeakSet

weakMap的key和WeakSet的value都是弱引用的,不会影响GC

  • WeakMap支持 newhasgetsetdelete

  • WeakSet 支持newhasadddelete

  • WeakSet的value和WeakMap的key必须是object

你可能感兴趣的:(ES6 笔记 集合)