聊一聊JS中WeakMap与WeakSet的渣男特性

简介: 有一天,恶霸在实验室里卷代码,突然有一个学妹抱着电脑来找我,问我WeakMap和WeakSet与Set和Map的主要区别是什么,这我就提起兴致了,趁这个机会给学妹普及一下渣男的性质

有一天,恶霸在实验室里卷代码,突然有一个学妹抱着电脑来找我,问我WeakMapWeakSetSetMap的主要区别是什么,这我就提起兴致了,趁这个机会给学妹普及一下渣男的性质

如果在看这篇文章之前不了解SetMap,那么请移步学习一下二者的特性,话不多说,开始我们的正题。

浅浅地了解一下垃圾回收机制(gc)

我问学妹,你知道垃圾回收是什么吗,她用无辜的眼神看着我,摇了摇头,由于要透彻地了解WeakMapWeakSet的渣男特性,于是我浅浅得给她讲了一下垃圾回收及内部机制。

垃圾回收是什么?

简单概括一下垃圾回收:当一个变量不会再被调用,就会被释放,之后垃圾回收就会周期性释放它占用的内存,它可以很好的帮助我们再代码执行阶段管理内存,减轻我们开发者的负担,当我们不再使用一个变量的时候,仅仅只需要a = null,a之前所引用的数据就会被释放,然后垃圾回收就会自动清理。

内部的原理

我看了眼学妹,她貌似懂了,那么可以精进一下,了解一下垃圾回收是怎么进行的

垃圾回收机制内部原理之一的引用计数字,一共分为三步

  1. 第一步:当一个变量被声明的时候计数为1
  2. 第二步:当这个变量被给到另外一个变量或者数据结构中,计数加1
  3. 第三步:当这个变量的引用在其他地方使用null或者其他变量引用覆盖后,计数-1
  4. 第四步:垃圾回收周期性自动将计数为0的变量回收

为了更好地理解这四步,我拿代码给学妹举例子

let a = "猪痞恶霸" // 声明计数为 1
let b = a // 赋值计数 +1 = 2
b = null // 覆盖释放计数 -1 = 1
a = null // 释放计数 -1 = 0
// 周期性执行垃圾回收
复制代码

看完这个例子后,学妹清楚了垃圾回收的大概,下面我就要给她灌输WeakMapWeakSet的渣男特性。

WeakMap和WeakSet是什么

WeakMapWeakSet是ES6中新增的数据结构,其对应着SetMap,而仅仅在头部添加Weak一词就造就了其不同的特性,主要有如下几点

  • 只能接受对象作为键值
  • 无法使用clear方法
  • 弱映射的键
  • size属性且无法被遍历

那么WeakMapWeakSet渣男特性是什么呢?就是弱映射的键。 为什么说这个特性是渣男特性?观众老爷往后看!

细说渣男特性

弱映射的键其实是垃圾回收机制会忽略掉WeakMapWeakSet对于其他变量的引用。通俗来讲在变量被WeakMapWeakSet内引用的时候,垃圾回收内部进行的引用计数不会进行计数操作,这就会导致当其他对象不再引用WeakMap存储的对象时,WeakMap会自动释放,后被回收掉。

抽象地讲WeakMapWeakSet在找了一个女朋友后竟然不管她的死活,当女朋友再没有引用后不保护她,直接被垃圾回收掉,你说是不是渣男。

讲到这里,学妹破口大骂:渣男!我对学妹说,等一下再骂,我给你讲完的,于是我用代码给她举了个例子

let a = "猪痞恶霸" // 声明计数为 1
let zhanan = new WeakMap()
zhanan.set({
    a,a
}) // 垃圾回收机制忽略,计数不变为 1
a = null // 释放计数 -1 = 0
// 垃圾回收销毁
复制代码

看完这个例子就在表层理解了垃圾回收忽略弱映射的键的特性,而这个特性会导致另外一个特性,无size属性且无法被遍历。

因为弱映射的特性,所以WeakMapWeakSet会随时释放,销毁,在遍历过程中可能会发生成员消失现象,所以无法对其进行遍历也无法获取其属性size

console.log(zhanan.size) // undefined
复制代码

以抽象地形式讲完了WeakMap与WeakSet的弱映射特性,学妹也听懂了,于是我收拾书包准备和学妹吃饭去,而此刻一位学弟走来:学长你能给我讲一讲吗? 我:自己百度去。。。。


相关文章
|
21天前
|
JavaScript 前端开发 安全
JavaScript与TypeScript的对比,分析了两者的特性及在实际项目中的应用选择
本文深入探讨了JavaScript与TypeScript的对比,分析了两者的特性及在实际项目中的应用选择。JavaScript以其灵活性和广泛的生态支持著称,而TypeScript通过引入静态类型系统,提高了代码的可靠性和可维护性,特别适合大型项目。文章还讨论了结合使用两种语言的优势,以及如何根据项目需求和技术背景做出最佳选择。
40 4
|
26天前
|
JavaScript 前端开发 安全
ECMAScript 6(以下简称 ES6)的出现为 JavaScript 带来了许多新的特性和改进,其中 let 和 const 是两个非常重要的关键字。
ES6 引入了 `let` 和 `const` 关键字,为 JavaScript 的变量管理带来了革新。`let` 提供了块级作用域和暂存死区特性,避免变量污染,增强代码可读性和安全性;`const` 用于声明不可重新赋值的常量,但允许对象和数组的内部修改。两者在循环、函数内部及复杂项目中广泛应用,有助于实现不可变数据结构,提升代码质量。
24 5
|
26天前
|
自然语言处理 JavaScript 前端开发
ECMAScript 6 的出现为 JavaScript 带来了许多新的特性和改进
这些只是ES6的一些主要特性,它们极大地增强了JavaScript的功能和表现力,使得JavaScript在大型应用开发、前端框架等领域能够更加高效地编写复杂的应用程序。
|
2月前
|
JavaScript 前端开发 编译器
掌握现代化JavaScript:ECMAScript提案与特性
【10月更文挑战第13天】本文介绍了ECMAScript(ES)的最新提案与特性,包括可选链、空值合并运算符、类字段和顶层Await等。通过跟踪TC39提案、使用Babel或TypeScript、测试兼容性以及逐步迁移,开发者可以高效地采用这些新特性,简化代码、提高开发效率并增强应用功能。文章还提供了实战技巧,帮助开发者在现代Web开发中充分利用这些现代化的特性。
|
2月前
|
JavaScript 前端开发 索引
JavaScript ES6及后续版本:新增的常用特性与亮点解析
JavaScript ES6及后续版本:新增的常用特性与亮点解析
55 4
|
1月前
|
前端开发 JavaScript
JavaScript新纪元:ES6+特性深度解析与实战应用
【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
43 0
|
3月前
|
JavaScript 前端开发 Oracle
软件工程师,学习下JavaScript ES6新特性吧
软件工程师,学习下JavaScript ES6新特性吧
46 9
|
4月前
|
Rust JavaScript 前端开发
Rust! 无VDom! 尤雨溪解析 Vue.js 2024 新特性
Rust! 无VDom! 尤雨溪解析 Vue.js 2024 新特性
|
4月前
|
Web App开发 前端开发 JavaScript
[译] JavaScript ES2021 中激动人心的特性
[译] JavaScript ES2021 中激动人心的特性
|
4月前
|
前端开发 JavaScript 开发者
翻天覆地!ES6+新特性大爆发,揭秘JavaScript代码的惊人蜕变!
【8月更文挑战第27天】自ES6标准发布以来,JavaScript新增的特性极大地提升了编程效率并简化了代码。本文重点介绍了五大特性:函数默认参数简化、模板字符串的强大功能、解构赋值的便捷性、箭头函数的简洁之美。这些特性不仅使代码更加简洁、易读,还解决了传统写法中的诸多问题。通过学习和应用这些新特性,开发者可以编写出更高效、更优雅的代码,以应对日益复杂的编程挑战。
74 2