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.size
set的大小 -
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.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
支持new
,has
,get
,set
,delete
WeakSet
支持new
,has
,add
,delete
WeakSet
的value和WeakMap
的key必须是object