ES6 Set数据结构

1.Set 是什么

Set是新的引用型的数据结构 它类似于数组,但是成员的值都是唯一 的,没有重复的值。

Set本身是一个构造函数,用来生成 Set 数据结构。

Set函数可以接受一个数组作为参数,用来初始化。

2.Set特性(重点概括)

重点

  • 1.成员不能重复
  • 2.属于引用数据类型,可以使用 set instanceof Set 或者 Object.prototype.toString.call(set)判断是否为Set类型
  • 3.可以通过Array.from(set)或者 扩展运算符 ...set转为数组
  • 4.可以通过new Set(arr)进行数组去重
  • 5.Set的属性和方法 add(),has(),delete(),clear(), size属性
  • 6.引用数据类型比较的是地址是否相等,所以Set可以重复添加对象,因为不同对象地址不一样
  • 7.Set数据类型遍历:forEach(),for...of遍历
  • 8.通过Set实现数组的并集net Set(...arr1,...arr2)、交集(a转为Set,filter遍历b在a的Set中存在has())、差集(a转为Set,遍历b在a的Set中是否不存在)

3.Set基本用法

javascript 复制代码
const set = new Set([1, 2, 3, 4, 4]);
console.log(set); // Set(4) {1, 2, 3, 4}

4.怎么证明Set是新的引用类型的数据结构instanceof或者Object.prototype.toString.call(set)

先想一想 以前怎么判断是数组还是对象的?instanceof或者Object.prototype.toString.call(set)

javascript 复制代码
        let arr = [1,2,3];
        let obj = {
            a:1
        }

        console.log( arr instanceof Array);//true
        console.log( obj instanceof Object);//true
        console.log( Object.prototype.toString.call(arr));//[object Array]
        console.log( Object.prototype.toString.call(obj));//[object Object]

        let set = new Set([1,2,3,4]);
        console.log( set instanceof Set);//true
        console.log( Set.prototype.toString.call(set));//[object Set]

5.将Set数据类型转化成数组(通过扩展运算符...set或者 Array.from(set))

javascript 复制代码
        let set = new Set([1,2,3,4]);
        let arr1 = Array.from(set);
        let arr2 = [...set];
        console.log(arr1,arr2);//(4) [1, 2, 3, 4]

6.通过Set对数组去重 let arr1 = new Set(arr)

7.Set数据内部判断值的机制

  • Set数据内部判断值的机制:Set 内部判断两个值是否不同,使用的算法它类似于精确相等运算符(===),如5和"5"是两个不同的值
  • 特殊情况就是NaN的情况: 虽然NaN === NaN 返回false(其实NaN == NaN也会返回false),但是在Set数据内部认为相等
javascript 复制代码
        let set = new Set();
        let a = 5;
        let b = '5';
        set.add(a);
        set.add(b);
        
        console.log(Array.from(set))// [5, '5']

8.Set数据结构中两个对象总是不相等的。(因为{} === {} 返回false 其实 {}=={}也是返回false)

javascript 复制代码
let set = new Set();
set.add({});
set.add({});

console.log(...set);// 此时有两项 {} {}

9.set实例的属性和方法

  • 属性size
  • 方法 add() delete() has() clear()
  • 遍历方法forEach():Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。

10.Set和展开运算符...实现数组的并集 交集 差集

javascript 复制代码
        let arr1 = [1, 2, 3]
        let arr2 = [4, 3, 2]
        // 实现交集
        console.log(new Set([...arr1, ...arr2]));//{1, 2, 3, 4}
        let c = new Set([...arr1, ...arr2]);
        let a = new Set(arr1); // 1,2,3
        let b = new Set(arr2); //4, 3, 2
        // 实现并集(has()方法和filter()方法结合) 
        console.log(new Set([...a].filter(a => b.has(a))));//{2, 3}
        // 实现差集(a对于b的差集和b对于a的差集不一样)
        console.log(new Set([...a].filter(item => !b.has(item))));// 1
        console.log(new Set([...b].filter(item => !a.has(item))));// 4
相关推荐
Trouvaille ~3 天前
【Redis篇】Set 与 Zset:集合运算与排行榜的终极武器
数据库·redis·缓存·set·跳表·后端开发·zset
无小道6 天前
Redis——集合类型相关命令
redis·set
chengO_o7 天前
STL关联式容器:map 与 set 的使用
c++·stl·set·map·平衡二叉搜索树
海市公约8 天前
Redis五大基础数据类型命令详解与经典应用场景
redis·list·set·hash·string·zset·缓存架构
梦想不只是梦与想8 天前
Python 中的set集合
python·set·集合
星原望野17 天前
JAVA集合:List、Set和Map
java·开发语言·list·set·map·集合
庞轩px1 个月前
第一篇:Redis数据结构底层——String、List、Hash、Set、ZSet各自用什么实现的?
数据结构·redis·list·set·hash·string·zset
Yant2241 个月前
Python 内置函数深度解析:set()、setattr()、slice()、sorted()、staticmethod、str()、sum()、super()实用指南
python·set·slice·sorted·str·内置函数·setattr
进击的荆棘1 个月前
C++起始之路——封装红黑树实现map和set
c++·stl·set·map
有梦想的攻城狮2 个月前
java中的EnumSet使用详解
java·set·bitset·enumset