1、Set的定义:Set是ES6中新提供的一种数据结构,类似数组Array,Set本身也是一个构造函数,用来生成Set数据结构;
2、基本语法、用法:
//(1)初始化一个Set数据
let set = new Set()
console.log(set) // Set(0) {}
//(2)传递一个数组作为参数初始化Set数据
let set = new Set([1, 2, 3, 4, 5]) // Set构造函数接收一个数组作为参数,可以将数组转换成Set数据结构
console.log(set) // Set(5) {1, 2, 3, 4, 5}
//(3)原则上也可以传递一个字符串初始化Set数据
let set = new Set('abcde')
console.log(set) // Set(5) {"a", "b", "c", "d", "e"}
//(4)可以接受类似数组的对象作为参数(可以理解为只要存在length属性就是类似数组);
let dv = document.getElementsByTagName('div')
let set = new Set(dv)
console.log(set) // Set(5) {div, div, div, div, div}
3、使用注意事项:
// (1)Set不会添加重复的值,会自动筛选掉重复的值(这个特性经常被用来数组和字符串去重);
let set = new Set([1, 2, 3, 4, 5, 3, 2, 1, 2])
console.log(set) // Set(5) {1, 2, 3, 4, 5}
// (2)向 Set 加入值的时候,不会发生类型转换
let set = new Set();
set.add(5)
set.add('5')
console.log(set) // Set(2) {5, "5"}
let set = new Set();
let a = NaN;
let b = NaN;
set.add(a);
set.add(b);
set // Set {NaN}
// 原理:Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===),
// 主要的区别是向 Set 加入值时认为NaN等于自身,而精确相等运算符认为NaN不等于自身。
4、Set实例存在的属性和方法:
//(1)set.size属性,获取set数据的长度,和数组的length类似
let set = new Set([1, 2, 3, 4, 5]);
console.log(set) // Set(5) {1, 2, 3, 4, 5}
console.log(set.size) // 5
// (2)set.add()方法:方法会将接收的参数,当做一个元素添加到set数据中;返回 Set 结构本身;
let set = new Set([1, 2, 3]);
set.add(6)
set.add([1,7,8])
console.log(set) // Set(5) {1, 2, 3, 6, Array(3)}
// (3)set.delete()方法:方法接收set数据中的一个值作为参数,将该值从set中删除,并且返回一个布尔值,表示此值是否删除成功
let set = new Set([1, 2, 3, 4, 5]);
let isDelete = set.delete(1);
console.log(isDelete) // true
console.log(set) // Set(4) {2, 3, 4, 5}
// (4)set.has()方法:返回一个布尔值,表示该值是否为Set的成员。
let set = new Set([1, 2, 3, 4, 5]);
let isHas1 = set.has(5);
let isHas2 = set.has(6);
console.log(isHas1, isHas2) // true false
// (5)set.clear()方法:清除所有成员,没有返回值。
let set = new Set([1, 2, 3, 4, 5]);
set.clear()
console.log(set) // Set(0) {}
5、对Set类型数据的遍历
// 注意:由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。
let set = new Set(['red', 'green', 'blue']);
console.log(set.keys()) // SetIterator {"red", "green", "blue"}
console.log(set.values()) // SetIterator {"red", "green", "blue"}
console.log(set.entries()) // SetIterator {"red" => "red", "green" => "green", "blue" => "blue"}
// 直接遍历Set数据
for (const item of set) {
console.log(item)
// red
// green
// blue
}
// 遍历Set数据的keys接口
for (const keys of set.keys()) {
console.log(keys)
// red
// green
// blue
}
// 遍历Set数据的values接口
for (const val of set.values()) {
console.log(val)
// red
// green
// blue
}
// 遍历Set数据的entries接口
for (const items of set.entries()) {
console.log(items)
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
}