大家好,我是前端队长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 时返回右值,否则返回左值。

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

  1. // 旧
  2. let a = null;
  3. a = a ?? 'daotin';
  4. a = a && 'daotin';
  5. a = a || 'daotin';
  6. // 新
  7. let a = null;
  8. a ??= 'daotin';
  9. a &&= 'daotin';
  10. a ||= 'daotin';

数字分隔符

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

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

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

Promise.any & AggregateError

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

  1. const promises = [
  2. fetch('/endpoint-a').then(() => 'a'),
  3. fetch('/endpoint-b').then(() => 'b'),
  4. fetch('/endpoint-c').then(() => 'c'),
  5. ];
  6. try {
  7. const first = await Promise.any(promises);
  8. // Any of the promises was fulfilled.
  9. console.log(first);
  10. // → e.g. 'b'
  11. } catch (error) {
  12. // All of the promises were rejected.
  13. console.assert(error instanceof AggregateError);
  14. // Log the rejection values:
  15. console.log(error.errors);
  16. // → [
  17. // <TypeError: Failed to fetch /endpoint-a>,
  18. // <TypeError: Failed to fetch /endpoint-b>,
  19. // <TypeError: Failed to fetch /endpoint-c>
  20. // ]
  21. }

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

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

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

String.prototype.replaceAll

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

  1. 'hello world'.replace('o', '_'); // hell_ world
  2. 'hello world'.replace(/o/g, '_'); // hell_ w_rld
  3. 'hello world'.replaceAll('o', '_'); // hell_ w_rld

WeakRefs & FinalizationRegistry对象

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

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

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

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

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

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

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

  1. // 构建监听对象被垃圾回收器清除的回调
  2. const registry = new FinalizationRegistry(heldValue => {
  3. console.log('----', heldValue);
  4. });
  5. const obj = {};
  6. const token = {};
  7. // 注册监听
  8. registry.register(obj, "obj deleted!", token);
  9. // 取消监听
  10. registry.unregister(token);
  11. // 可能很久以后,回调执行
  12. // ---- 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. 【Python成长之路】装逼的一行代码:快速共享文件

    [Python成长之路]装逼的一行代码:快速共享文件 2019-10-26 15:30:05 华为云 阅读数 335 文章标签: Python编程编程语言程序员Python开发 更多 分类专栏: 技术 ...

  2. 《SystemVerilog验证-测试平台编写指南》学习 - 第2章 数据类型

    <SystemVerilog验证-测试平台编写指南>学习 - 第2章 数据类型 2.1 内建数据类型 2.2 定宽数组 2.2.1 声明 2.2.2 常量数组 2.2.3 基本的数组操作 ...

  3. Linux 部署 iSCSI 客户端配置(Linux)

    Linux 部署 iSCSI 客户端配置(Linux) 客户端环境 Client :RHEL8 IP : 192.168.121.11 一.测试与服务端的连通性 [root@Client-linux ...

  4. Linux 核心系统命令目录

    S5 Linux信息显示与搜索文件命令 S6 文件备份与压缩命令 S7 Linux用户管理及用户信息查询命令 S8 Linux磁盘与文件系统管理命令 S9 Linux 进程管理命令 S10 Linux ...

  5. Spring Boot自定义属性配置文件开启提示

    前言:有时候在Sping Boot项目中需要自定义属性.又想在配置文件(*.properties)中显示提示时. 测试环境:Sping Boot2x + Maven + Lombok 准备测试的配置类 ...

  6. unity inputfield 过滤emoji输入

    unity版本:unity2017.1.5f1 复现步骤:InputField在安卓手机InputField连续输入两个emoji会报错 报错内容: 2020-01-08 19:56:38.366 2 ...

  7. 使用BeautifulSoup高效解析网页,再也不用担心睡不着觉了

    BeautifulSoup是一个可以从 HTML 或 XML 文件中提取数据的 Python 库 那需要怎么使用呢? 首先我们要安装一下这个库 1.pip install beautifulsoup4 ...

  8. Docker环境下运行python+selenium+chrome

    Docker环境下运行python+selenium+chrome docker运行时占用的资源非常少,而且能将环境进行有效的隔离,可以快速的进行部署,因此可以将docker与selenium结合实现 ...

  9. Go语言的函数06---闭包函数

    package main import "fmt" /* 李逵和武松的Study方法的逻辑是几乎一模一样的 然而为了分别保存两人的学习进度,需要开辟两个全局变量,函数内部的需要使用 ...

  10. 用python调试Appium和雷电模拟器连接时出现Original error: Could not find 'adb.exe' in PATH

    用python调试Appium和雷电模拟器连接时出现Original error: Could not find 'adb.exe' in PATH 确定环境变量没错,用管理员启动Appium就不会出 ...