ES6中集合(Set)使用时的一些注意点

    集合拥有确定性、互异性等特性,在很多场景下集合起着举足轻重的地位。所以ES6正式引入Set数据结构,但是在使用时有一些小点是值得注意的,这里讲一讲。

    撸代码时想到了这些,所以记录一下,给自己看看,也给大家参考参考。

一、Set的遍历顺序和插入顺序相同

    Set提供了4个遍历成员方法,分别是

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

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

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

    forEach(),利用回调函数遍历成员

    他们的遍历顺序和数组的插入顺序相同,这个特性在一些场景下非常有用。

    还有一点值得注意的是,Set没有键名,所以默认其为键值,即键名与键值相同。

    上例子测试这个特性。

let set = new Set();
set.add(2);
set.add(1);
set.add(3);
for(let item of set.keys()){
    console.log(item);
}

for(let item of set.values()){
    console.log(item);
}

for(let item of set.entries()){
    console.log(item);
}

set.forEach(data=>{console.log(data);});

    返回结果如下:


    可以看出遍历顺序确实是与插入顺序相同。

二、Set.prototype.add不会改变初始插入顺序

    add这个方法的说明是向Set尾部添加元素,并返回Set对象本身。但是这里会出现一个注意的地方,即如果添加的元素是Set已有的元素,会怎么办呢?上例子说明

let set = new Set();
set.add(2);
set.add(1);
set.add(2);

set.forEach(data=>{console.log(data);});//运行结果是2 1

    这里有人会想,不是尾部添加元素吗?应该会删除之前那个,然后重新添加啊?然而事实是不会改变初始插入顺序,为什么呢?还是从规范文档出发,了解一下。


    从规范文档中不难看出,第五步就是添加元素在Set已存在的情况,如果存在,就直接返回Set对象,不会进入6、7、8步,即不会更新Set元素。所以add方法添加已有元素时,会放弃添加,直接返回Set本身。

猜你喜欢

转载自blog.csdn.net/sinat_36521655/article/details/80803718