详解ES6中的set

基本语法

ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值(对于基本类型来说)。Set 本身是一个构造函数,用来生成 Set 数据结构。

   const set = new Set();
   [2, 3, 3, 3].forEach(x => set.add(x));
   for(let i of set){
       console.log(i);     // [2, 3]
   }

上面代码通过add方法向 Set 结构加入成员,结果表明 Set 结构不会添加重复的值。可以在构造函数中直接传入数组初始化(注意:只能传数组,不然会报错),和上面方法效果相同

   var set = new Set([2, 3, 3, 3]);
   [...set]   // [2, 3]
   set.size   // 2

所以上面发现了一种去除数组去重的方法

   var arr = [2, 3, 3, 3];
   var new_arr = [...new Set(arr)];  // [2, 3]

再谈去重

向Set加入值的时候,不会发生类型转换,所以5和”5”是两个不同的值。Set内部判断两个值是否不同,使用的算法叫做“Same-value equality”,它类似于精确相等运算符(===),我们知道在js中判断对象相等,不能通过=====

   {x:2, y:2} == {x:2, y:2}    // false
   {x:2, y:2} === {x:2, y:2}   // false

对象通过指针指向的内存中的地址来做比较,所以要判断对象是否相等,只能通过遍历去判断,这其中包含了很多边际情况。所以set没有去判断这些,只要往里面扔一个对象,那么就是一个新的元素

   var set = new Set();
   var obj1 = {};
   var obj2 = {};
   set.add(obj1);
   for(let i of set){
       console.log(i);     // Object {}
   }
   set.add(obj2);
   for(let i of set){
       console.log(i);     // Object {} Object {}
   }

而js中比较出名的,和任何值都不相等的NaN(not a number)

   NaN == NaN     // false
   NaN === NaN    // false

Set中加入了对NaN的判断

   var set = new Set();
   set.add(NaN); 
   set.size  // 1
   set.add(NaN); 
   set.size // 1

说明NaN在set的判断中是相等的,所以set支持了所有基本类型

Set的基本操作

  • add(value) :添加某个值,返回Set结构本身
  • delete(value) : 删除某个值,返回一个布尔值,表示删除是否成功
  • has(value):返回一个布尔值,表示该值是否是Set的成员
  • clear() :清除所有成员,没有返回值
    下面是一个对比,看看在判断是否包括一个键上面,Object结构和Set结构的写法不同。
   var prop =  {
      name: 'sysuzhyupeng',
      age: 24
   }
   //注意要加引号
   if('name' in prop){
   }
   //Set的写法
   var prop = new Set();
   prop.add('name');
   prop.add('age');
   if(prop.has('name')) ...

Array.from方法可以将Set结构转为数组。

    var set = new Set([1, 2, 3, 4, 5]);
    var arr = Array.from(set);

所以,由于set转化成数组有上述这两种方式,所以数组去重都可以用这两个方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值