js 之 map set weakmap weakset

首先介绍下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都不可迭代

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自信小老头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值