当前位置: 首页 > news >正文

Set和weakSet Map和WeakMap

Set和weakSet的用法和区别

1.Set 和weakSet 它是类似于数组,且成员值都是唯一的,
2.Set有 add has delete clear size keys values forEach entries
3.weakSet 有add has delete
4.WeakSet中只能存放对象类型,不能存放基本类型
5.WeakSet它是弱引用,在weakSet里面引用了对象,垃圾回收机制不会考虑该对象的引用,若外面已经没有了该对象的引用,则垃圾回收机制会回收该对象,weakSet内部引用的该对象也会自动消失,所以他内部的对象不适合被引用,也不允许便利,
6.WeakSet在初始化的时候是不能赋值的,必须通过add赋值
7.WeakSet只有add has delete 没有size clear forEach不能使用for of进行便利。

// 普通的对象 如果把一个对象放入到数组中,那么只要这个数组存在,那么这个对象也就存在,即使没有其他对该对象的引用。
let john = { name: "John" };
let array = [ john ];
john = null; // 覆盖引用
console.log(array[0]) // 还是可以访问// Set,如果我们使用对象作为常规 Map 的键,那么当 Map 存在时,该对象也将存在。它会占用内存,并且应该不会被(垃圾回收机制)回收
const set = new Set()
let obj = {name:100}
set.add(obj)
obj = null
console.log(set.size)  // 1
// 它是伪数组 通过 ...变成数组对象  
// 他不会被垃圾回收机制回收,依旧可以访问获取 
console.log([...set][0]); // weakSet
const weakSet = new WeakSet()
let objWeak = {name:234}
let mary = { name: "Mary" };weakSet.add(objWeak)
weakSet.add(mary)
console.log(weakSet.has(objWeak)); // true
objWeak = null 
//若外面已经没有了该对象的引用,则垃圾回收机制会回收该对象,weakSet内部引用的该对象也会自动消失
console.log(weakSet.has(objWeak)); // false 将被自动清理(即自动清除其中已失效的值objWeak)

Map和weakMap

1.Map : set get has delete clear size keys values forEach entries
2.Map是一组键直对的数据局结构,我们知道普通的对象,他的key只能是字符串类型的,但是Map他的key不限制于字符串,可以是函数 可以是对象包含任何类型
entries: 键直对所组成的数组
3.数组转map 传二维数组
4.weakMap:也是若引用,只接受对象类型的数据作为键名weakMap是对于键名引用的弱引用,不是键值指向的对象,键值的引用依然存在,
5.他有 get set has delete属性他也不能被遍历

//普通对象:
let [a, b] = [{}, {}]
let obj = {[a]: 1,[b]: 2,
}
console.log(obj.a); // undefiend  
console.log(obj.b); // undefiend   普通对象他的key是没法获取的,
// 最后是这样转换了 [object Object]的字符串,且下面的会覆盖上面的 {[object Object] : 2}
console.log(Object.prototype.toString.call(a)); // Map
const map = new Map([['a', 1], ['b', 2], ['c', 3]])
map.get('a') // 1
map.has('a') // true// 获取key和value的数组
for (let i of map.entries()) {console.log(i);// ['a',1]// ['b',2]// ['c',3]
}weakMap的使用方式 :比如获取dom的点击事件在不用weakMap之前:
```javascript
var count = 0, button = document.getElementById('btn');
function buttonClick() {count += 1console.log(count);
}
button.addEventListener('click', buttonClick) 
// 如果这个点击事件用完之后,或者离开当前页面需要销毁  我们需要
button.removeEventListener('click', buttonClick)
button = null 
count = null
// 这样的销毁的方法比较不友好,而且当变量多了,很容易遗漏

使用weakMap之后

var button = document.getElementById('btn'), wm = new WeakMap();
wm.set(button, { count: 0 })
function buttonClick() {let data = wm.get(button)data.count += 1console.log(data.count);
}
button.addEventListener('click', buttonClick) 
button.removeEventListener('click', buttonClick)
// 这个时候不需要额外的去关注状态
button = null 

总结
WeakMap 是类似于 Map 的集合,它仅允许对象作为键,并且一旦通过其他方式无法访问它们,便会将它们与其关联值一同删除。

WeakSet 是类似于 Set 的集合,它仅存储对象,并且一旦通过其他方式无法访问它们,便会将其删除。

它们的主要优点是它们对对象是弱引用,所以被它们引用的对象很容易地被垃圾收集器移除。

WeakMap 和 WeakSet 被用作“主要”对象存储之外的“辅助”数据结构。一旦将对象从主存储器中删除,如果该对象仅被用作 WeakMap 或 WeakSet 的键,那么它将被自动清除。

http://www.lryc.cn/news/90912.html

相关文章:

  • Qt基础之三十六:异常处理
  • 【HMS Core】【ML Kit】活体检测FAQ合集
  • ChatGPT:使用OpenAI创建自己的AI网站,使用 flask web框架快速搭建网站主体
  • 后端(一):Tomcat
  • 华为OD机试之最小调整顺序次数、特异性双端队列(Java源码)
  • 2023年武汉住建厅七大员怎么报名?报名流程?精准题库一次过??
  • Rust每日一练(Leetday0014) 组合总和II、缺失正数、接雨水
  • EnjoyVIID部署
  • 用Python解决爱因斯坦的数学问题
  • ChatGPT提示词攻略之基本原则
  • 抖音seo源码如何开发部署?
  • Java中常见锁的分类及概念分析
  • ConcurrentLinkedQueue的源码解析(基于JDK1.8)
  • 低资源方面级情感分析研究综述
  • 将 PDF 压缩到 1 MB 或更小的 5 个工具
  • CSMA/CD协议之计算最短帧长问题
  • 第三章:什么是分库分表
  • SpringMVC第六阶段:数据在域中的保存(02)
  • Springboot +spring security,认证方式---HTTP基本认证的实现
  • 2023年系统分析师案例及论文(回忆版)
  • 数据结构与算法面试题
  • C Primer Plus第十章编程练习答案
  • 奇舞周刊第493期:Hook 革命!浅谈 React 新 Hook 的未来与思想
  • 文件包含的本质、预处理符号、# vs ##
  • 【JavaSE】Java基础语法(三十九):网络编程入门
  • 中间件SOME/IP简述
  • [自学记录03|百人计划]移动端GPU的TB(D)R架构基础
  • 详解Java枚举
  • ES6-ES13学习笔记(4.0)
  • 线段树C++详细讲解和个人见解