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