每天3分钟,重学ES6-ES12(八)ES11 ES12新增内容

简介: 每天3分钟,重学ES6-ES12(八)ES11 ES12新增内容

19c2e7a9bfbb7f5e8c7d744db995e29.png

每天3分钟,重学ES6-ES12文章汇总

前言

今天开始和大家一起系统的学习ES6+,每天3分钟,用一把斗地主的时间,重学ES6+,今天介绍的是ES11 ES12中新增的内容

ES11

BigInt 大整数类型

  • 在早期的JavaScript中,我们不能正确的表示过大的数字:
  • 大于MAX_SAFE_INTEGER的数值,表示的可能是不正确的。
  • 那么ES11中,引入了新的数据类型BigInt,用于表示大的整数:
  • BitInt的表示方法是在数值的后面加上n

代码演示

// ES11之前 max_safe_integer
const maxInt = Number.MAX_SAFE_INTEGER
console.log(maxInt) // 9007199254740991
console.log(maxInt + 1) // 9007199254740992
console.log(maxInt + 2) 
// 9007199254740992表示错误
// ES11之后: BigInt
const bigInt = 900719925474099100n
console.log(bigInt + 10n)
// 900719925474099110n
const num = 100
console.log(bigInt + BigInt(num))
// 900719925474099200n
const smallNum = Number(bigInt)
console.log(smallNum)
// 900719925474099100

Nullish Coalescing Operator 空值合并操作符 ??

空值合并操作符?? )是一个逻辑操作符,当左侧的操作数为 [null] 或者 [undefined] 时,返回其右侧操作数,否则返回左侧操作数。

与[逻辑或操作符(||)]不同,逻辑或操作符会在左侧操作数为[假值]时返回右侧操作数。也就是说,如果使用 || 来为某些变量设置默认值,可能会遇到意料之外的行为。比如为假值(例如,''0)时。见下面的例子。

代码演示

// ES11: 空值合并运算 ??
const foo = undefined
const bar1 = foo || "default value"
const bar2 = foo ?? "defualt value"
console.log(bar1,bar2)
//"default value","default value"
const foo1 = ''
const bar3 = foo1 || "default value"
const bar4 = foo1 ?? "defualt value"
console.log(bar1,bar2)
//"default value",""

Optional Chaining 链式操作符

可选链也是ES11中新增一个特性,主要作用是让我们的代码在进行null和undefined判断时更加清晰和简洁:

代码演示

const info = {
  friend: {
    girlFriend: {
       name: "hmm"
    }
  }
}
//ES11 之前的判断方案
console.log(info.friend.girlFriend.name)
if (info && info.friend && info.friend.girlFriend) {
    console.log(info.friend.girlFriend.name)
}
// ES11提供了可选链(Optional Chainling)
console.log(info.friend?.girlFriend?.name)

Global This全局对象

  • 在之前我们希望获取JavaScript环境的全局对象,不同的环境获取的方式是不一样的
  • 比如在浏览器中可以通过this、window来获取;
  • 比如在Node中我们需要通过global来获取;
  • 那么在ES11中对获取全局对象进行了统一的规范:globalThis

代码演示

// 获取某一个环境下的全局对象(Global Object)
// 在浏览器下
// console.log(window)
// console.log(this)
// 在node下
// console.log(global)
// ES11
console.log(globalThis)

for..in标准化

  • 在ES11之前,虽然很多浏览器支持for...in来遍历对象类型,但是并没有被ECMA标准化。
  • 在ES11中,对其进行了标准化,for...in是用于遍历对象的key的:

ES12

FinalizationRegistry

  • FinalizationRegistry 对象可以让你在对象被垃圾回收时请求一个回调。
  • FinalizationRegistry 提供了这样的一种方法:当一个在注册表中注册的对象被回收时,请求在某个时间点上调 用一个清理回调。(清理回调有时被称为 finalizer );
  • 你可以通过调用register方法,注册任何你想要清理回调的对象,传入该对象和所含的值;

代码演示

// ES12: FinalizationRegistry类
const finalRegistry = new FinalizationRegistry((value) => {
  console.log("注册在finalRegistry的对象, 某一个被销毁", value)
})
let obj = { name: "why" }
let info = { age: 18 }
finalRegistry.register(obj, "obj")
finalRegistry.register(info, "value")
obj = null
info = null

WeakRef

  • 如果我们默认将一个对象赋值给另外一个引用,那么这个引用是一个强引用:
  • 如果我们希望是一个弱引用的话,可以使用WeakRef

代码演示

// ES12: WeakRef类
// WeakRef.prototype.deref: 
// > 如果原对象没有销毁, 那么可以获取到原对象
// > 如果原对象已经销毁, 那么获取到的是undefined
const finalRegistry = new FinalizationRegistry((value) => {
  console.log("注册在finalRegistry的对象, 某一个被销毁", value)
})
let obj = { name: "why" }
let info = new WeakRef(obj)
finalRegistry.register(obj, "obj")
obj = null
setTimeout(() => {
  console.log(info.deref()?.name)
  console.log(info.deref() && info.deref().name)
}, 10000)
// 注册在finalRegistry的对象, 某一个被销毁 obj
// undefined
// undefined

logical assignment operators 逻辑赋值操作符

// 1.||= 逻辑或赋值运算
let message = "hello world"
// es5 写法
 message = message || "default value"
// es12 简写
message ||= "default value"
console.log(message)
// 2.&&= 逻辑与赋值运算
let info = {
    name: "why"
}
// 1.判断info
// 2.有值的情况下, 取出info.name
// es5写法
info = info && info.name
// es12写法
info &&= info.name
console.log(info)
// 3.??= 逻辑空赋值运算
let message = 0
message ??= "default value"
console.log(message)

5f7960c7d6df9745728a755b4491963.png


相关文章
|
域名解析 运维 关系型数据库
3步!完成WordPress博客迁移与重新部署
服务器到期后,该如何迁移、重新部署WordPress博客呢?
3步!完成WordPress博客迁移与重新部署
|
6月前
|
人工智能 边缘计算 弹性计算
阿里云连续两年入选沙利文中国企业出海云服务市场领导者梯队
阿里云连续两年综合竞争力位居领导者梯队,是唯一进入领导者梯队的中国云厂商
|
弹性计算 运维 Linux
基于在Alibaba Cloud Linux 3 的OS Copilot 产品评测
作为一名技术运维的工作者,每天做的最多一件事就是在Linux下敲各种各样的命令,或完成功能性的部署,或检查系统的稳定性。如果 OS Copilot 作为我的日常工具,我使用场景会更集中于快捷命令或脚本的实现,智能帮我生成各类功能脚本,为我提高运维效率。
基于在Alibaba Cloud Linux 3 的OS Copilot 产品评测
|
XML 物联网 API
服务端和客户端 RESTful 接口上传 Excel 的 Python 代码
本文作者木头左是物联网工程师,分享如何使用 Python 和 Flask-RESTful 构建一个简单的 RESTful API,实现文件上传功能,特别支持Excel文件。通过安装Flask和Flask-RESTful库,创建Flask应用,实现文件上传接口,并将其添加到API。该方法具有简单易用、灵活、可扩展及社区支持等优点。
服务端和客户端 RESTful 接口上传 Excel 的 Python 代码
|
存储 Nacos 数据安全/隐私保护
【SpringCloud】Nacos的安装、Nacos注册、Nacos服务多级存储模型
【SpringCloud】Nacos的安装、Nacos注册、Nacos服务多级存储模型
214 1
|
9月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
218 17
|
10月前
|
搜索推荐 Python
快速排序的 Python 实践:从原理到优化,打造你的排序利器!
本文介绍了 Python 中的快速排序算法,从基本原理、实现代码到优化方法进行了详细探讨。快速排序采用分治策略,通过选择基准元素将数组分为两部分,递归排序。文章还对比了快速排序与冒泡排序的性能,展示了优化前后快速排序的差异。通过这些分析,帮助读者理解快速排序的优势及优化的重要性,从而在实际应用中选择合适的排序算法和优化策略,提升程序性能。
288 1
|
9月前
|
机器学习/深度学习 人工智能 计算机视觉
深度学习在医疗影像分析中的应用与挑战
本文探讨了深度学习技术在医疗影像分析领域的应用现状和面临的主要挑战。随着人工智能技术的飞速发展,深度学习已经成为推动医疗影像诊断自动化和智能化的重要力量。文章首先概述了深度学习的基本原理及其在图像识别任务中的优势,随后详细讨论了其在CT、MRI等医疗影像处理中的成功案例,并分析了当前技术面临的数据隐私、模型解释性以及临床验证等方面的挑战。最后,提出了未来研究的方向和可能的解决方案,旨在促进深度学习技术在医疗领域的更广泛应用。
246 0
|
消息中间件 缓存 Java
Java 最常见的面试题:怎么保证缓存和数据库数据的一致性?
Java 最常见的面试题:怎么保证缓存和数据库数据的一致性?
|
分布式计算 MaxCompute
MaxCompute中,collect_set函数是一个聚合函数
MaxCompute中,collect_set函数是一个聚合函数
352 1