大家好,我是前端队长Daotin,想要获取更多前端精彩内容,关注我(全网同名),解锁前端成长新姿势。

以下正文:

2021 年 6 月 22 日,第 121 届 Ecma 国际(Ecma International)大会以远程会议形式召开。正式通过了ES2021标准,ECMAScript 2021 (ES12)成为事实的 ECMAScript 标准。

本文简要介绍了 JavaScript 今年新加了哪些语法,还好不是很多。

主要有5个新特性:

逻辑赋值运算符

数字分隔符

Promise.any & AggregateError

String.prototype.replaceAll

WeakRefs & FinalizationRegistry对象

逻辑赋值运算符

??= &&= 和 ||=

??= 的判断逻辑和 ?? 一致,左值为 null 或 undefined 时返回右值,否则返回左值。

不同的是 ??= 包含向左值赋值的操作。类比于于+= -= 中的等号。

// 旧
let a = null;
a = a ?? 'daotin';
a = a && 'daotin';
a = a || 'daotin'; // 新
let a = null;
a ??= 'daotin';
a &&= 'daotin';
a ||= 'daotin';

数字分隔符

允许数值字面量中间包含不连续_ ,以提高可读性。

1_000_000_000           // Ah, so a billion
101_475_938.38 // And this is hundreds of millions let a = 1_1; // 11
let a = 1__1 // 错误,只允许一个下划线作为数字分隔符
let a = 1_; // 错误,分隔符不能在尾部
let a = _1; // 错误,分隔符不能在头部 Number(1_1); // 11
Number('1_1'); // NaN

注意:分隔符不能在尾部和头部,只能在数字之间,只允许一个下划线作为数字分隔符,不可连续。分隔符不影响数值的类型转换值,也无法在字符串转数值时被识别。

Promise.any & AggregateError

Promise.any 方法:any 接受 Promise 数组作为参数,返回合成的 Promise。只要给定的迭代中的一个 promise 成功,就采用第一个 promise 的值作为它的返回值,

const promises = [
fetch('/endpoint-a').then(() => 'a'),
fetch('/endpoint-b').then(() => 'b'),
fetch('/endpoint-c').then(() => 'c'),
];
try {
const first = await Promise.any(promises);
// Any of the promises was fulfilled.
console.log(first);
// → e.g. 'b'
} catch (error) {
// All of the promises were rejected.
console.assert(error instanceof AggregateError);
// Log the rejection values:
console.log(error.errors);
// → [
// <TypeError: Failed to fetch /endpoint-a>,
// <TypeError: Failed to fetch /endpoint-b>,
// <TypeError: Failed to fetch /endpoint-c>
// ]
}

此代码示例检查哪个端点响应最快,然后将其记录下来。只有当 所有 请求都失败时,我们才最终进入代码 catch 块,然后在其中处理错误。

多个 Promise 实例,包装成一个新的 Promise 实例:

名称 描述
all 只要一个 Promise 失败,立即返回失败,全成功返回成功数组
race ace是比赛、竞赛的意思,所以顾名思义,就是看谁快,就返回谁。只要一个 Promise 完成就返回结果(无论成功失败)
any 只要一个 Promise 成功,立即返回成功,全失败返回 AggregateError
allSettled 所有 Promise 完成才返回(无论成功失败),返回结果数组

String.prototype.replaceAll

相比于String.prototype.replace,如果不使用全局正则表达式,就无法替换字符串中子字符串的所有实例。只会替换第一次匹配的字符。

'hello world'.replace('o', '_'); // hell_ world

'hello world'.replace(/o/g, '_'); // hell_ w_rld

'hello world'.replaceAll('o', '_'); // hell_ w_rld

WeakRefs & FinalizationRegistry对象

一般来说,在JavaScript中,对象的引用是强引用的,这意味着只要持有对象的引用,它就不会被垃圾回收。只有当该对象没有任何的强引用时, js引擎垃圾回收器才会销毁该对象并且回收该对象所占的内存空间。

let obj = {a:1, b:2}; // 只要我们访问 obj 对象,这个对象就不会被垃圾回收

但是 WeakRefs 可以创建一个弱引用,对象的弱引用是指当该对象应该被 js引擎垃圾回收器回收时不会阻止垃圾回收器的回收行为。

Weakref 实例具有一个方法 deref,该方法返回被引用的原始对象,如果原始对象已被收集,则返回 undefined 对象。

const ref = new WeakRef({ name: 'daotin' });
let obj = ref.deref();
if (obj) {
console.log(obj.name); // daotin
}

注意:正确使用它们需要仔细考虑,如果可能,最好避免使用它们。

使用 FinalizationRegistry 对象可以在垃圾回收器回收对象时执行回调函数。

// 构建监听对象被垃圾回收器清除的回调
const registry = new FinalizationRegistry(heldValue => {
console.log('----', heldValue);
}); const obj = {};
const token = {}; // 注册监听
registry.register(obj, "obj deleted!", token); // 取消监听
registry.unregister(token); // 可能很久以后,回调执行
// ---- obj deleted!

register 参数分别为:

•需要监听的对象•执行回调函数的参数•取消监听用的标识符

参考链接:

https://h3manth.com/ES2021

https://juejin.cn/post/6978514117006983176

https://mp.weixin.qq.com/s/pRkTLu6mocANvl8UDwZPwg#at

--- End ---

你好,我是前端队长Daotin,专注分享前端与认知。希望在这里,和你分享我的前端学习和工作经验,记录个人成长。

以上,如果你看了觉得对你有所帮助,就点个赞叭,这样队长也有更新下去的动力,跪谢各位父老乡亲啦~~~ 听说喜欢点赞的人,一个月内都会有好运降临哦 ~~

ES2021 新特性!的更多相关文章

  1. ES 2021 来了,详细解读5个新特性,附案例

    ES 2021是世界上最受欢迎的编程语言的最新版本〜 本次迭代中包含了五个新特性,让我们来一睹为快. 1.全部替换replaceAll: js默认的replace 方法仅替换字符串中一个模式的第一个实 ...

  2. SQL Server 2014 新特性——内存数据库

    SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...

  3. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

  4. [干货来袭]C#6.0新特性

    微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...

  5. CSS3新特性应用之结构与布局

    一.自适应内部元素 利用width的新特性min-content实现 width新特性值介绍: fill-available,自动填充盒子模型中剩余的宽度,包含margin.padding.borde ...

  6. 【译】Meteor 新手教程:在排行榜上添加新特性

    原文:http://danneu.com/posts/6-meteor-tutorial-for-fellow-noobs-adding-features-to-the-leaderboard-dem ...

  7. 跨平台的 .NET 运行环境 Mono 3.2 新特性

    Mono 3.2 发布了,对 Mono 3.0 和 2.10 版本的支持不再继续,而且这两个分支也不再提供 bug 修复更新. Mono 3.2 主要新特性: LLVM 更新到 3.2 版本,带来更多 ...

  8. Atitit opencv版本新特性attilax总结

    Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...

  9. es6 新特性2

    es6其他几个非常有用的新特性. import export 这两个家伙对应的就是es6自己的module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成 ...

随机推荐

  1. Linux性能分析利器——火焰图的安装使用

    火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的 ...

  2. 063.Python前端Django分页器

    Django的分页器 1 前期准备 创建一个数据库,用于存放数据 mysql> create database pager default charset=utf8; mysql> use ...

  3. IDEA 常用快捷键列表【建议收藏】

    编辑代码 快捷键 说明 Alt+Enter 导入包.自动变量命名等(万能快捷键) Ctrl+X 删除行 Ctrl+Y 删除当前行 Ctrl+D 复制行 Alt+Shift+Up/Down或Ctrl+S ...

  4. Linux信号(signal) 机制分析-(转自h13)

    [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...

  5. @JSONField与@DateTimeFormat 注解(Day_21)

    @JSONField的常用参数说明 @JSONField(ordinal = 1)   //指定json序列化的顺序 @JSONField(serialize = false)    //json序列 ...

  6. 在 Kubernetes 集群在线部署 KubeSphere

    https://github.com/kubesphere/ks-installer/blob/master/README_zh.md https://kubesphere.com.cn/docs/i ...

  7. Windows 下QT程序发布

    方法1:利用QT自带打包工具 1.新建文件夹,把编译好的exe文件放入该文件夹 2.使用QT下的命令行 3.进入该exe所在文件,执行windeployqt xxx.exe,若出现找不到命令的情况 4 ...

  8. 工作流Activiti框架中表单的使用!详细解析内置表单和外置表单的渲染

    Activiti中的表单 Activiti提供了一种方便而且灵活的方式在业务流程中以手工方式添加表单 对表单的支持有2种方式: 通过表单属性对内置表单进行渲染 通过表单属性对外置表单进行渲染 表单属性 ...

  9. SQL SERVER常用语法记录

    用于记录SQL SERVER常用语法,以及内置函数. 以下语句包含: WITH 临时表语法 ROW_NUMBER()内置函数,我一般主要是用来分页.针对于查出来的所有数据做一个数字排序 分页的BETW ...

  10. 源码简析Spring-Integration执行过程

    一,前言 Spring-Integration基于Spring,在应用程序中启用了轻量级消息传递,并支持通过声明式适配器与外部系统集成.这一段官网的介绍,概况了整个Integration的用途.个人感 ...