首先介绍下map和set
set类型可以理解成用哈希表制成的数组,内容不可重复,一般用来数组去重或者存放一些不可以重复的数据
常见方法有
set.has()//判断是否存在某值
set.delete()//删除某值 返回布尔值
set.clear()//清空
set.size //返回长度
set.add() //添加元素
//遍历
set.forEach()
for(let i of set){...}
业务场景:
判断类方法是否为由本身类或其他允许类调用
let sets = new Set()
class Ron{
constructor(){
sets.add(this)
}
going(){
if(sets.has(this)){
console.log("i am going")
}else{
console.error{"错误"}
}
}
}
let obj1 = new Ron()
obj1.going.call({})
但是我们会发现,如果这时候Ron类需要清空为null 根据js回收机制来讲,set中有指向Ron 则gc不会清除没用的Ron类,这时候使用weakmap(弱引用机制
let sets = new WeakSet()
class Ron{
constructor(){
sets.add(this)
}
going(){
if(sets.has(this)){
console.log("i am going")
}else{
console.error{"错误"}
}
}
}
let obj1 = new Ron()
obj1.going.call({})
这样 当ron类为null时,gc会回收掉对应的内存
去重
let list = [1,2,3,4,5,5,5,5,6]
list = [...new Set(list)]
map
在js的键值对中,原版是不支持特殊类型的,他会转为字符串进行解析,作为一个key值,而新增的map类型则让类作为key值成为可能
map的方法和属性
map.get() //获取某值
map.set() //添加某值
map.delete() //删除某值
map.has()//判断某值是否存在
map.size //长度
//遍历
map.forEach((value,key)=>val)
for(let [key,val] of map){...}
而weakmap就层用于vue3的响应式
let obj1 = {
name: "11",
age: 22
}
let obj2 = {
name: "22",
age: 33
}
function s1() {
console.log("修改了obj1的name")
}
function s2() {
console.log("修改了obj1的age")
}
function s3() {
console.log("修改了obj2的name")
}
function s4() {
console.log("修改了obj2的age")
}
let maps = new WeakMap()
let obj1s = new Map()
obj1s.set("name",[s1])
obj1s.set("age",[s2])
let obj2s = new Map()
obj2s.set("name",[s3])
obj2s.set("age",[s4])
maps.set(obj1, obj1s)
maps.set(obj2, obj2s)
//获取
maps.get(obj1).forEach((key,value)=>{
console.log(key,value)
})
所有的weakmap都不可迭代