您的位置:首页 > 理论基础 > 数据结构算法

js-ES6学习笔记-Set和Map数据结构

2017-02-25 11:38 471 查看
1、ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。

Set 本身是一个构造函数,用来生成 Set 数据结构。

2、Set 函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化。

3、
Set.prototype.size
:返回
Set
实例的成员总数。

四个操作方法。

add(value)
:添加某个值,返回Set结构本身。

delete(value)
:删除某个值,返回一个布尔值,表示删除是否成功。

has(value)
:返回一个布尔值,表示该值是否为
Set
的成员。

clear()
:清除所有成员,没有返回值。

4、Set结构的实例有四个遍历方法,可以用于遍历成员。

keys()
:返回键名的遍历器

values()
:返回键值的遍历器

entries()
:返回键值对的遍历器

forEach()
:使用回调函数遍历每个成员

由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以
keys
方法和
values
方法的行为完全一致。

entries
方法返回的遍历器,同时包括键名和键值,所以每次输出一个数组,它的两个成员完全相等。

可用
for...of
循环遍历Set。

5、扩展运算符(
...
)内部使用
for...of
循环,所以也可以用于Set结构。

let set = new Set(['red', 'green', 'blue']);
let arr = [...set];
// ['red', 'green', 'blue']


6、使用Set可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)。

let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);

// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}

// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}

// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}


7、WeakSet结构与Set类似,也是不重复的值的集合。但是,它与Set有两个区别。

首先,WeakSet的成员只能是对象,而不能是其他类型的值。

其次,WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于WeakSet之中。这个特点意味着,无法引用WeakSet的成员,因此WeakSet是不可遍历的。

8、WeakSet的一个用处,是储存DOM节点,而不用担心这些节点从文档移除时,会引发内存泄漏。

9、JavaScript的对象(Object),本质上是键值对的集合(Hash结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。

ES6提供了Map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的Hash结构实现。如果你需要“键值对”的数据结构,Map比Object更合适。

10、Map的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。

11、结合数组的
map
方法、
filter
方法,可以实现Map的遍历和过滤(Map本身没有
map
filter
方法)。

let map0 = new Map()
.set(1, 'a')
.set(2, 'b')
.set(3, 'c');

let map1 = new Map(
[...map0].filter(([k, v]) => k < 3)
);
// 产生Map结构 {1 => 'a', 2 => 'b'}

let map2 = new Map(
[...map0].map(([k, v]) => [k * 2, '_' + v])
);
// 产生Map结构 {2 => '_a', 4 => '_b', 6 => '_c'}


12、
WeakMap
结构与
Map
结构基本类似,唯一的区别是它只接受对象作为键名(
null
除外),不接受其他类型的值作为键名,而且键名所指向的对象,不计入垃圾回收机制。

典型应用是,一个对应DOM元素的
WeakMap
结构,当某个DOM元素被清除,其所对应的
WeakMap
记录就会自动被移除。基本上,
WeakMap
的专用场合就是,它的键所对应的对象,可能会在将来消失。
WeakMap
结构有助于防止内存泄漏。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: