书籍参考:《ECMAScript 6入门》 作者:阮一峰
文档参考:MDN
ES6提供了两个新的数据结构:Set和WeakSet数据结构,两个结构很相识,但是有一点区别。
Set数据结构
Set数据结构是一个类数组数据结构,但是它和数组有一点区别不同的是,Set数据结构的值是唯一的,也就是说没有重复值,Set数据结构内部判断两个值是否相等类似于我们使用的精确等运算符(===
),所以"1" 不等于 1
但是区别在于NaN相等。Set的参数接受一个数组或类似数组的对象,它将所有元素添加进新的Set中:
var c = new Set([1,2,3,4,4]); //注意这里添加了两个4
c; // {1,2,3,4} 只添加了一个4,这也就说明了Set数据结构的值唯一性。
由于Set数据结构的值是唯一值,那么我们可以通过这样的特性来去除数组值的重复性
var a = [1,2,3,4,5,4,5];
var b = [...new Set(a)];
b; // [1,2,3,4,5]
Set有四个操作数据的方法和四个遍历数据的方法,首先来看看四个操作数据的方法:
add(value)
:添加某个值,返回该Set本身。
delete(value)
:删除Set数据结构中的一个值,如果删除成功则返回true
,不成功则返回false
。
has(value)
: 检查Set中是否含有某个值,返回true
和false
。
clear()
:移除Set数据结构中的所有值,没有返回结构
上面的四个方法都属于字面意思很容易理解,其中的add方法添加的数据同样会保证Set结构的数值唯一性.
var a = new Set([1,2,3,4]);
a.add(5);
a.add(5);
a; // {1,2,3,4,5} 只添加了一个数值5
Set的四个遍历数据的方法:
keys()
:返回一个新的键名遍历器,由于Set结构没有键名,所以keys()
返回的是一个键值与value()
遍历器结果一样。
values()()
:返回一个新的键值遍历器
entries()
:返回一个键值对遍历器
forEach(callback,this)
:按照插入顺序对每个值调用callback函数进行处理,第二个参数为绑定的this对象。Callback函数接受三个参数,分别为:键名、键值、集合本身
size
:size为属性,返回Set数据结构有多少个值。
由于Set结构的存储顺序是按照我们插入的顺序就行存储的,所以这样就很方便我们储存中间件
函数。
WeakSet数据结构
WeakSet数据结构同样是不能重复值的集合,但是WeakSet数据结构的成员只能是对象,不能是其他类型的值,并且WeakSet数据结构是弱引用,不会影响垃圾回收器的回收。比如我们新声明一个对象并把这个对象赋值给变量a,那么这个对象当前的引用为1,即使我们没有使用这个对象了,但垃圾回收器不会回收此对象,我们必须手动解除变量a对于此对象的引用(a = null
)才能触发垃圾回收器的回收。
WeakSet有四个方法:
add(value)
:添加一个对象到WeakSet中,返回WeakSet本身
delete(value)
:从WeakSet中删除一个对象,返回true和false
has(value)
: 判断一个对象是否存在于WeakSet中,返回true和false
WeakSet没有办法来遍历成员,因为说不定在你遍历的时候,垃圾回收器就已经回收了成员中的对象。简单的使用:
var b = [1,2];
var ws = new WeakSet();
ws.add(1); //报错,因为不是一个对象
ws.add(b); //返回WeakSet本身
ws.has(b); // true
ws.delete(b); // false
WeakSet有很多临时的用处,在阮一峰写的ECMAScript6入门中有一个很好WeakSet使用例子:
const foos = new WeakSet();
class Foo {
constructor() {
foos.add(this)
}
method () {
if (!foos.has(this)) {
throw new TypeError('Foo.prototype.method 只能在Foo的实例上调用!');
}
}
}
Foo.prototype.method(); //Foo.prototype.method 只能在Foo的实例上调用!
文完
《es6新特性:Set和WeakSet》留言数:0