Set
简要介绍
Set
是一种数据结构,注意是一种数据的结构,不是数据类型,峰哥说是一个构造函数,es6
已经出类了,所以只要说是构造函数,我的理解就是类。
Set数据结构里面的元素是不能重复的!!!
既然是类,我们要是用,那就肯定要搞个实例出来。
const s = new Set()
// 这样就有了一个Set实例
实例化的时候可以接受参数,可以接收一个数组,或具有
iterable
接口的其他数据结构,关于什么是 iterable 接口, 由于知识点太难,这个待补充。const s = new Set([1, 2, 3])
console.log(s) // Set(3) {1, 2, 3}
可以看到是个集合
// 也可以传入字符串
const s = new Set('abbc')
console.log(s) // Set(3) {'a', 'b', 'c'}
有趣的知识
===
被称为精确相等运算符,在判断2个NaN
是否相等是,是不等滴NaN === NaN // false
Set实例的属性与方法
四大操作方法
- add方法添加元素并返回实例本身
- delete方法返回布尔值,删除成功返回true,失败返回false
- has方法返回布尔值,有这个值返回true,没有返回false
- clear方法清空数据,没有返回值
const s = new Set()
// add 增
s.add(1)
console.log(s) // Set(1) {1}
// 因为add方法返回的是s实例,所以可以链式调用
s.add(2).add(2)
console.log(s) // Set(2) {1, 2}
//delete 删
let isDelete = s.delete(2)
console.log(isDelete) // true
isDelete = s.delete(3)
console.log(isDelete) // false
// has 查
let isHas = s.has(1)
console.log(isHas) // true
isHas = s.has(4)
console.log(isHas) // false
// clear 清空
s.clear()
console.log(s) // Set(0) {size: 0}
Array.from
方法可以讲set结构转为真正的数组const s = new Set([1, 2, 3, 4, 5, 6, 6])
console.log(Array.from(s)) //[1, 2, 3, 4, 5, 6]
四大遍历方法
- keys方法,返回键名的遍历器
- values方法,返回键值的遍历器
- entries方法,返回键值对的遍历器
- forEach方法,与数组的forEach方法类似
Iterator
接口,都可以用for of
遍历,soconst s = new Set([1, 2, 3, 4, 5])
// console.log(s.keys()) // SetIterator {1, 2, 3, 4, 5}
// console.log(s.values()) // SetIterator {1, 2, 3, 4, 5}
// console.log(s.entries()) // SetIterator {1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5}
// s.forEach((val, index) => {
//console.log(val) // 1 2 3 4 5
//console.log(index) // 1 2 3 4 5
// })
const s = new Set([1, 2, 3, 4, 5])
for (item of s.keys()) {
console.log(item) // 依次输出1 2 3 4 5
}
for (item of s.values()) {
console.log(item) // 依次输出1 2 3 4 5
}
for (item of s.entries()) {
console.log(item) // 依次输出[1,1] [2,2] [3,3] [4,4] [5,5]
}const s = new Set([1, 2, 3, 4, 5])
for (item of s.keys()) {
console.log(item) // 依次输出1 2 3 4 5
}
因为set解构键值对是一样的所以keys,values方法返回值一样
遍历应用 求并集,差集,交集
const a = new Set([1, 2, 3])
const b = new Set([2, 3, 4])
// 并集
const union = new Set([...a, ...b])// 1,2,3,4
console.log(union)
// 交集
const interSect = new Set([...a].filter(val => b.has(val))) // 2,3
console.log(interSect)
// 差集 a相对于b少了什么
const difference = new Set([...b].filter(val => !a.has(val)))
console.log(difference)// 4
有一说一,这学的真无聊啊,不学又不行o(╯□╰)o~~~~
WeakSet
WeakSet
跟Set
数据结构有一下3点区别WeakSet
是弱引用类型WeakSet
只能添加引用类型WeakSet
无法被遍历
首先说什么是弱引用,这里推荐大家先了解一下JS的垃圾回收机制,对弱引用就比较好理解一点,我的理解是,弱引用是不参与垃圾回收机制的应用计数的,用代码解释可能更好一点
let obj = { a: 2 }
const s = new WeakSet()
s.add(obj)
console.log(s) // 有时候啥也没有,有时候有obj
obj = null
function demo() {
setTimeout(() => {
console.log(s) // 有时候啥也没有,有时候有obj
}, 5000)
}
demo()
【es6|ES学习之路(六)-Set&Map数据结构】这个地方我把网页刷新了好几次,发现有时候有obj的值,有时候没obj的值。推测是由于垃圾回收机制的原因,obj可能存在提前回收或者延迟回收的问题。
2022-02-22补充
WeakSet
之所以遍历不了,是因为垃圾回收机制运行时不可知的,你遍历的时候每次遍历的结果不一定一样我自认为我这里讲的不够好,如有更懂的朋友,可以发表一下你的见解。
Weakset
没有清空的方法只有以下3个方法- add方法添加元素并返回实例本身
- delete方法返回布尔值,删除成功返回true,失败返回false
- has方法返回布尔值,有这个值返回true,没有返回false
其实吧这些api
我觉得都不需要记你看下面我的截图就懂了
文章图片
Map
也是一个类,是一种存储键值对的数据结构,也就是说里面存的数据是key->value这样的形式,但是与对象不同,对象只能的key只能是字符串,这个key啥都行,undefined
和函数也能放四大操作方法
- set方法添加元素并返回实例本身
- delete方法返回布尔值,删除成功返回true,失败返回false
- has方法返回布尔值,有这个值返回true,没有返回false
- clear方法清空数据,没有返回值
const map = new Map()
const obj = {}
// set添加元素
map.set('foo', 1).set(obj, 2)
console.log(map) // Map(2) {'foo' => 1, {…} => 2}
// get取元素
console.log(map.get('foo')) // 1
console.log(map.get(obj)) // 2
// has判断建
console.log(map.has('bar')) // false
console.log(map.has('foo')) // true
// delete 删除
console.log(map.delete('bar')) //false
console.log(map.delete('foo')) // true
// clear 清空
map.clear()
要注意添加相同的键,值会覆盖,后者会覆盖前者。
const map = new Map()
const obj = {}
map.set(obj, 2)
map.set(obj, 1)
console.log(map) // Map(1) {{…} => 1}
四大遍历方法
- keys方法,返回键名的遍历器
- values方法,返回键值的遍历器
- entries方法,返回键值对的遍历器
- forEach方法,与数组的forEach方法类似
const map = new Map()
const obj = {}
map.set('foo', 1)
map.set(obj, 2)
map.set('bar', 3)
for (item of map.keys()) {
console.log(item) // 依次输出 foo, {}, bar
}
for (item of map.values()) {
console.log(item) // 依次输出1 2 3
}
for (item of map.entries()) {
console.log(item) // 依次输出 ['foo', 1][{…}, 2] ['bar', 3]
}
map.forEach(val => {
console.log(val) // 1 2 3
})
1.map结构转数组
const map = new Map()
const obj = {}
map.set('foo', 1)
map.set(obj, 2)
map.set('bar', 3)
console.log([...map.values()]) // [1,2,3 ]
马上就看完了,坚持就是胜利o(╯□╰)o
2.数组转map
实例化的时候把二维数组丢进行就可以了
const map = new Map(
[
[a, 1],
[b, 2]
]
)
3.map转对象
function mapToObj(map) {
const obj = {}
for (let [key, value] of map) {
obj[key] = value
}
return obj
}
const map = new Map()
const o = {}
map.set('a', 1).set('b', 2).set(o, 3)
console.log(mapToObj(map)) // 没有加set(o,3){a: 1, b: 2} || {a: 1, b: 2, [object Object]: 3}
4.对象转map
const obj = {
a: 1,
b: 2
}
console.log(new Map(Object.entries(obj))) // Map(2) {'a' => 1, 'b' => 2}
WeakMap
WeakMap
跟Map
类似,但是有两点不同key
必须为对象key
指向的引用为弱引用
API
上的不同WeakMap
只有4个方法可以用: get,set,has,delete后续项目遇到再补充
博客 欢迎访问我的博客www.smartxy.cc
推荐阅读
- 逆向进阶,利用 AST 技术还原 JavaScript 混淆代码
- vue|Vuex的作用、使用、核心概念(State、Mutations、Getters、Actions、Modules)、文件抽离
- 小白前端学习日记系列|小白前端学习日记(一)认识前端
- 前端|【前端】利用JavaScript做打砖块小游戏
- js|手把手教你制作一个简单的聊天机器人(图灵api)
- WPS表格|WPS-JS宏开发-基础知识-01-初识
- Vue基础知识|Vue3之Teleport
- java|如果再写for循环,我就锤自己
- React|【React】3_使用react组件化编码流程及案例分享(附源码)