es6新特性:Set和WeakSet

书籍参考:《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中是否含有某个值,返回truefalse

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的实例上调用!

文完

文档信息

发表评论

电子邮件地址不会被公开。 必填项已用*标注