跳至主要內容

15. Set

Harry Xiong大约 4 分钟Web 前端JavaScriptPromise 对象JS 异步async 与 await

Set

ES6中提供了数据结构Set,该对象类似于数组,但是所有的值都是唯一的,在其中不会有重复的值,Set本身就是一个构造函数,用来生成Set类的实例对象

**注意:**与数组和一般对象不同的是,Set实例没有属性名(键名),或者说属性名(键名)和属性值(键值)都是相同的值

15.1 用法

var s=new Set();
[1,2,3,4,1,2].forEach(function(value){
    s.add(value);//Set类的对象只能通过add方法添加值
})
console.log(s);//Set(4){1,2,3,4}
//在Set()中可以传入一个数组作为参数来作为Set实例的初始化对象
var s=new Set([1,2,3,4,1,2]);
/*该写法类似于
    [1,2,3,4,1,2].forEach(function(value){
    s.add(value);
})
*/

console.log(s);////Set(4){1,2,3,4}
console.log(s.size);//Set类有一个实例属性size来计算Set实例对象的长度
console.log([...s]);//[1,2,3,4]
/*
    上面的写法可以用作数组的去重
*/

注意:

  • 在向Set实例中添加值的时候不会进行类型转换,如:123与"123"不同

  • 两个对象总是不同

  • Set内部的判断两个值是否相同的算法结果类似全等运算符(===),不同在于在Set内部认为NaN与自身相等,所以也会去重

15.2 属性与方法

15.2.1 size

Set类的实例有一个size属性,专门用来记录Set实例中的值的数量,返回Set实例成员的数量

15.2.2 add,delete,has与clear方法

  • add()方法为Set实例添加一个值,返回实例对象本身,可以用作链式操作

  • delete()方法删除Set实例的某个值,删除成功返回true,删除失败返回false

  • has()方法判断Set实例中是否有某个值.有就返回true,没有返回false

  • clear()方法情况Set实例中的所有值,没有返回值

var s=new Set([1,2,3,4,5]);
s.add(6);
console.log(s);//Set(6){1,2,3,4,5,6}

s.delete(1);
console.log(s);//Set(5){2,3,4,5,6}

console.log(s.has(2));//true

s.clear();
console.log(s);//Set(0)

15.2.3 keys,values与entries方法

keys()方法返回装有Set实例的键名的数组,values()方法返回装有Set实例的键名值的数组,entries()方法返回装有Set实例的键名和键值的数组,但是由于在Set实例中只有键值,所有三个方法返回的数组都是相同的,都只装有键值

var s=new Set([1,2,3,4,5]);
console.log(s.keys());//[1,2,3,4,5]
console.log(s.values());//[1,2,3,4,5]
console.log(s.entries());//[1,2,3,4,5]

15.2.4 forEach方法

Set实例的forEach()方法的用法与表现结果与数组的forEach()方法的表现结果一致,第一个参数是回调函数,第二个参数是回调函数中this的指向对象

var s=new Set([1,2,3,4,5]);
s.forEach(function(value,index){
    console.log(index,value);//1,1 2,2 3,3 4,4 5,5 
})

15.3 set集合转化Array数组

注意:这个可以使用过滤数组中的重复的元素 你可以先把数组转化为set集合 然后在把这个集合通过Array.from这个方法把集合在转化为数组

var set = new Set([1, 2, 3, 3, 4]);
Array.from(set)  //输出[1,2,3,4]

15.4 WeakSet

WeakSet也是一个类,可以用new WeakSet()来创建一个WeakSet实例对象,该对象的结构和Set实例相似,但是还是有所区别

区别:

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

  • WeakSet实例中的成员对象都是弱引用,即垃圾回收机制不会考虐WeakSet实例中对该对象的引用,如果其它对象没有引用该对象,垃圾回收机制会自动回收该对象所占的内存,不会考虐WeakSet实例中是否还保留着对该对象的引用,由于WeakSet实例的弱引用这个特性,所以ES6中有规定WeakSet创建的实例不可被遍历,因为WeakSet中的成员对象的引用随时会消失

var w=new WeakSet([[1,2,3],{a:1,b:2,c:3}]);
console.log(w);

方法

WeakSet实例有add(),delete()和has()方法,用法同Set,但是没有遍历WeakSet实例本身的方法,因为该类实例没有size属性