Set和Map数据结构
1.Set
定义:是一个构造函数,类似于数组,但成员值唯一。
用法:可用于去除数组重复成员。
const set = new Set([1,2,3,4,4,4]);
[...set] //[1,2,3,4]
[...new Set('abaaac')].join('') //'abc'
注:在Set内部,两个NaN
是相等的,两个对象是不相等的。
属性和方法
Set.prototype.constructor
:构造函数,默认就是Set函数。
Set.prototype.size
:返回Set实例的成员总数。
操作方法
Set.prototype.add(value)
:添加某个值,返回 Set 结构本身。Set.prototype.delete(value)
:删除某个值,返回一个布尔值,表示删除是否成功。Set.prototype.has(value)
:返回一个布尔值,表示该值是否为Set的成员。Set.prototype.clear()
:清除所有成员,没有返回值。
注:Set结构没有键名,只有键值,Keys方法与values方法行为完全一致。
遍历方法:
Set.prototype.keys()
:返回键名的遍历器Set.prototype.values()
:返回键值的遍历器Set.prototype.entries()
:返回键值对的遍历器Set.prototype.forEach()
:使用回调函数遍历每个成员
2.WeakSet
与Set的区别:
- 成员只能是对象
- WeakSet中的对象都是弱引用,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占内存,即不考虑WeakSet中是否还存有该对象。
- 没有
size
属性 - 没有
foreach()
属性
注:3,4原因是WeakSet中对象都是弱引用,所以用处为储存DOM节点。
3.Map
定义:类似于对象,是键值对的集合,且“键”的范围不限于字符串。
用法:
操作方法
const m = new Map();
const o = {p: 'Hello World'};
m.set(o,'Ann')
m.get(o) // "content"
m.has(o) // true
m.delete(o) //true
m.has(o) //false
Map.prototype.set(key,value)
Map.prototype.get(key)
Map.prototype.has(key)
Map.prototype.delete(key)
Map.prototype.clear(key)
清除所有成员
遍历方法(同Set)
4.WeakMap
与Map的区别:
- 键名只能是对象
- WeakMap中的对象都是弱引用,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占内存,即不考虑WeakMap中是否还存有该对象。
- 没有
size
属性 - 没有遍历操作(即
keys()
、values()
、entries()
方法都没有) - 没有
clear()
方法。
注:3,4原因是WeakSet中对象都是弱引用,所以用处为储存DOM节点为键名和部署私有属性。
参考文章:
阮一峰ECMAScript 6 入门.