ES6 中加入了Set, Map, WeakSet, WeakMap
为什么加入集合
Javascript中的Object,类似于map,可以向其中添加key-value对(属性),可以get,set,delete,iterate属性,但是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.sizeset的大小 -
set.has(value)value是否在set中 -
set.add(value)向set中添加一个value,如果value已经存在,则不作操作 -
set.delete(value)从set删除value,add和delete都返回set本身 -
set[Symbol.iterator]()返回set的迭代器 -
set.forEach(f)对每个value调用f,跟一下等价
for (let value of set)
f(value, value, set);
-
set.clear()删除set中所有值 -
set.keys,set.values,set.entries()返回对用的迭代器
Map
-
new Map创建空的Map -
new Map(pairs)pair可以是Map,两元素Array的Array,或者产生两元素数组的generator -
map.sizeMap中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支持new,has,get,set,deleteWeakSet支持new,has,add,deleteWeakSet的value和WeakMap的key必须是object