ES6中的 Set数据结构👀

246 阅读3分钟

ES6-Set的数据结构

QQ图片20210824224616.jpg

基本用法

  • ES6 提供了新的数据结构 Set。它类似于数组,但是不同的是它的成员值都是唯一的,不会添加重复的值。

    const s = new Set();
    
    [2, 2, 3 , 4, 5,5].forEach(x => s.add(x));
    //这句代码的意思是:使用forEach遍历[2, 3, 5, 4, 5, 2, 2]这个数组,使得数组的每一项都通过s.add()加入到s中
    
    for (let i of s) {
      console.log(i);
    }
    //输出结果: 2 3 5 4
    
    
  • Set函数可以接受一个数组作为参数,用来初始化

    const set = new Set([1, 2, 3, 4, 4]);
    [...set]
    //输出结果: [1, 2, 3, 4]
    //...是展开运算符
    
    
    const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
    items.size 
    //输出结果: 5
    
  • 用Set数据结构初始化数组可以去除数组中重复的元素

    [...new Set('ababbc')].join('')
    //输出结果: "abc"
    
    //join()方法是用于将数组中的所有元素都放入一个字符串,元素是通过指定的分隔符进行分隔的。
    //语法:arrayObject.join(separator)
    //返回值:返回一个字符串。该字符串是通过把 arrayObject 的每个元素转换为字符串,然后把这些字符串连接起来,在两个元素之间插入 separator 字符串而生成的(若省略该参数,则使用逗号作为分隔符)。
    var arr=new Array(3)
        arr[0]="q"
        arr[1]="a"
        arr[2]="z"
        console.log(arr.join())
    //输出结果:"q,a,z"
        console.log(arr.join('l'))
    //输出结果:"qlalz"
    

Set实例上的的属性和方法

Set本身是没有提供任何方法的。但Set.prototype(Set的原型)属性对象上提供了若干的属性和方法,用于在Set实例上使用。

1. Set实例的属性:
  • Set.prototype.constructor:构造函数,默认就是Set函数。
  • Set.prototype.size:返回实例的成员总数
    var v=new Set([1,2,3]);
        
    console.log(v.size)
    //输出结果:3
    
2. Set实例的的方法:
  • Set.prototype.add(value): 添加某个值,返回Set结构本身
  • Set.prototype.delete(value): 删除某个值,成功则返回true,反之返回false。
  • Set.prototype.has(value): 判断值是否在当前Set结构中,在则返回true,反之返回false。
  • Set.prototype.clear(): 清除所有成员,没有返回值。
var v=new Set([1,2,3]);
   v.add(4)
   console.log(...v)
//输出结果:1 2 3 4
   v.delete(1)
   console.log(...v)
//输出结果:2 3 4
   console.log(v.has(3))
//输出结果:true
   v.clear()
   console.log(v.size)
//输出结果:0

注意:

1. Set实例是一个不重复的值的集合,键名和值是一致的。

2. Set不能通过下标访问数据,因为集合里面元素无序。所以遍历Set中的数据一般使用for of或者forEach方法。

3. 向Set添加值的时候,不会发生类型转换,所以 5 和 “5”是不同的值。

4. 在Set内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===),和它主要的区别是向 Set 加入值时认为NaN等于自身,而精确相等运算符认为NaN不等于自身。

5. 还有,在set中两个对象是不相等的。原因: 因为引用数据类型比较的是引用,而不是值。不同的对象引用地址也不同,所以{}==={}的结果为false