Set?WeakSet?(黑人三个问号一脸懵逼.png)

1.Set

Set是什么?还有一个WeakSet?不懂啊!!! 没关系,今天我们就来聊一下这些ES6提供的“小玩意”。

Set是ES6提供的一种新数据结构,类似于数组,但不同的是,它的成员值是唯一的,没有重复的数组。(没有重复的数组?难道~没错,它可以用来数组去重)

举个粒子:

突然想起Set有几个属性和方法:

Set的属性:

size:返回集合所包含元素的数量

Set的方法:

操作方法

add(value):向集合添加一个新的项
delete(value):从集合中移除一个值
has(value):如果值在集合中存在,返回true,否则false
clear(): 移除集合里所有的项

遍历方法

keys():返回一个包含集合中所有键的数组
values():返回一个包含集合中所有值的数组
entries:返回一个包含集合中所有键值对的数组(感觉没什么用就不实现了)
forEach():用于对集合成员执行某种操作,没有返回值

Set结构里的值是唯一的,但还是有几种比较特殊的情况,比如:

为什么会有两个一模一样的对象呢? 因为其中一个指向的o,所以它们对它来说又是不一样的。

还有一种情况是这样的:

为什么这个时候又只有一个NaN呢?我们来看一下比较官方的解释:

因为 Set 中的值总是唯一的,所以需要判断两个值是否相等。在ECMAScript规范的早期版本中,这不是基于和===操作符中使用的算法相同的算法。具体来说,对于 Set s, +0 (+0 严格相等于-0)和-0是不同的值。然而,在 ECMAScript 2015规范中这点已被更改。有关详细信息,请参阅链接标题 表中的“value equality for -0 and 0”。

另外,NaN和undefined都可以被存储在Set 中, NaN之间被视为相同的值(尽管 NaN !== NaN)。 -----(选自https://developer.mozilla.org/)

并且Set可以非常容易的实现交集、并集、差集,比如:

自从有了Set之后,好像对数据的操作也不那么难了,但它兼容性还是有讲究的:

2.WeakSet

WeakSet与Set结构类似,但有两个不同的区别。第一,WeakSet的值必须是对象,而不是其它类型的值,举个粒子:

第二点就是,WeakSet的对象是弱引用,弱引用的好处就是你可以不用担心它的内存泄露,适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失。但坏处就是WeakSet的对象并不适合长期引用,因为你并不清楚它的情况,它随时会消失。比如:

WeakSet 结构只有三个方法。

WeakSet.prototype.add(value):向 WeakSet 实例添加一个新成员。
WeakSet.prototype.delete(value):清除 WeakSet 实例的指定成员。
WeakSet.prototype.has(value):返回一个布尔值,表示某个值是否在 WeakSet 实例之中。

并且WeakSet 没有size属性,没有办法遍历它的成员

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复