JavaScript ES2021 最值得期待的 5 个新特性解析

大家好,我是若川。欢迎加我微信 ruochuan12,长期交流学习。今天分享一篇关于ES2021的5个新特性。点击下方卡片关注我,或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列


在写本文时,本文提到的新的 JavaScript 提案功能已进入第 4 阶段,并且几乎肯定会包含在 ES2021 中。你已经可以开始在 最新版本的浏览器,Node.js 和 Babel 中使用。

注意:ECMAScript 是 JavaScript 所基于的标准,由 TC39 委员会管理。ECMAScript 始终是一个不需要的名称,这会使一切都对初学者感到困惑。人们经常谈论 JavaScript 功能,但参考的是 ECMAScript 规范。

更新特性

  • 数字分隔符(_

  • 逻辑分配(&&=||=??=

  • 引用不足(WeakRefFinalizationRegistry

  • Promise.any

  • String.prototype.replaceAll

1. 数值分隔符

大数字文字很难使人眼快速解析,尤其是当有很多重复的数字时:

1000000000000   1019436871.42

为了提高可读性,新的 JavaScript 语言功能 启用了下划线作为数字文字中的分隔符。因此,上面的内容现在可以重写为每千位数字,例如:

1_000_000_000_000    1_019_436_871.42

现在,更容易说出第一个数字是 1 万亿,而第二个数字大约是 10 亿。

数字分隔符有助于提高各种数字文字的可读性:

// A decimal integer literal with its digits grouped per thousand:
1_000_000_000_000
// A decimal literal with its digits grouped per thousand:
1_000_000.220_720
// A binary integer literal with its bits grouped per octet:
0b01010110_00111000
// A binary integer literal with its bits grouped per nibble:
0b0101_0110_0011_1000
// A hexadecimal integer literal with its digits grouped by byte:
0x40_76_38_6A_73
// A BigInt literal with its digits grouped per thousand:
4_642_473_943_484_686_707n

它们甚至适用于八进制整数文字(尽管 我想不出 其中分隔符为此类文字提供值 的示例):

// A numeric separator in an octal integer literal: ????‍♀️
0o123_456

请注意,JavaScript 还具有不带显式 0o 前缀的八进制文字的旧式语法。例如,017 === 0o17。在严格模式下或模块内不支持此语法,并且在现代代码中不应使用此语法。因此,这些文字不支持数字分隔符。使用 0o17 风格的文字代替。

2. Promise combinators

自从 ES2015 中引入 Promise 以来,JavaScript 完全支持两种 Promise 组合器:静态方法 Promise.all 和 Promise.race。

目前有两个新提案正在通过标准化流程:Promise.allSettled 和 Promise.any。有了这些添加,JavaScript 中将总共有四个诺言组合器,每个组合器支持不同的用例。

以下是这四个组合器的概述:

2.1 Promise.allSettled

Promise.allSettled 给你当所有输入的诺言是一种信号结算,这意味着他们要么履行或拒绝。如果您不在乎承诺的状态,而只是想知道工作何时完成,无论它是否成功,这都是很有用的。

例如,您可以启动一系列独立的 API 调用,并使用 Promise.allSettled 它们来确保它们已全部完成,然后再执行其他操作,例如删除加载微调器:

const promises = [fetch('/api-call-1'),fetch('/api-call-2'),fetch('/api-call-3'),
];
// Imagine some of these requests fail, and some succeed.await Promise.allSettled(promises);
// All API calls have finished (either failed or succeeded).
removeLoadingIndicator();

2.2 Promise.any

Promise.any 方法和 Promise.race 类似——只要给定的迭代中的一个 promise 成功,就采用第一个 promise 的值作为它的返回值,但与 Promise.race 的不同之处在于——它会等到所有 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.any 拒绝可以一次代表多个错误。为了在语言级别支持此功能,引入了一种新的错误类型,称为 AggregateError。除了上面示例中的基本用法外,还可以以编程方式构造 AggregateError 对象,就像其他错误类型一样:

const aggregateError = new AggregateError([errorA, errorB, errorC], 'Stuff went wrong!');

3. Weak references and finalizers

此功能包含两个高级对象 WeakRefFinalizationRegistry。根据使用情况,这些接口可以单独使用,也可以一起使用。正确使用它们需要仔细考虑,如果可能,最好避免使用它们。

一般来说,在JavaScript中,对象的引用是强保留的,这意味着只要持有对象的引用,它就不会被垃圾回收。

const ref = { x: 42, y: 51 };
// 只要我们访问 ref 对象(或者任何其他引用指向该对象),这个对象就不会被垃圾回收

目前在 Javascript 中,WeakMap 和 WeakSet 是弱引用对象的唯一方法:将对象作为键添加到 WeakMap 或 WeakSet 中,是不会阻止它被垃圾回收的。

JavaScript 的 WeakMap 并不是真正意义上的弱引用:实际上,只要键仍然存活,它就强引用其内容。WeakMap 仅在键被垃圾回收之后,才弱引用它的内容。

WeakRef 是一个更高级的 API,它提供了真正的弱引用,Weakref 实例具有一个方法 deref,该方法返回被引用的原始对象,如果原始对象已被收集,则返回 undefined 对象。

JavaScript 中对象的引用是强引用,WeakMap 和 WeakSet 可以提供部分的弱引用功能,若想在 JavaScript 中实现真正的弱引用,可以通过配合使用 WeakRef 和终结器(Finalizer)来实现。

WeakRef 是用来指目标对象不脱离垃圾收集保留它的对象。如果未通过垃圾回收回收目标对象,则 WeakRefs 可以取消引用以允许访问目标对象。

// Create a WeakRef object referring to a given target object
const ref = new WeakRef(targetObject)// Return the WeakRef instance's target object, or undefined if the target object has been garbage-collected
const obj = ref.deref()

使用 FinalizationRegistry 对象可以在垃圾回收对象时请求回调。

// Create a registry object that uses the given callback
const registry = new FinalizationRegistry([callback])// Register an object with a registry instance so that if the object is garbage-collected, the registry's callback may get called
registry.register(target, heldValue, [unregisterToken])// Unregister a target object from a registry instance
registry.unregister(unregisterToken)

更多信息:TC39提案,V8

4. String.prototype.replaceAll

当前,如果不使用全局正则表达式,就无法替换字符串中子字符串的所有实例。与字符串参数一起使用时,String.prototype.replace 仅影响首次出现。

String.prototype.replaceAll() 将为开发人员提供一种简单的方法来完成此常见的基本操作。

'aabbcc'.replaceAll('b', '.') // 'aa..cc'
'aabbcc'.replaceAll(/b/g, '.') // 'aa..cc'

5. Logical assignment (逻辑分配)

支持与新的运营逻辑分配 &&=||=??=。与它们的 数学和按位对应物不同,逻辑分配遵循其各自逻辑操作的短路行为。仅当逻辑运算将评估右侧时,它们才执行分配。

// falsy: false, 0, -0, 0n, "", null, undefined, and NaN
// truthy: all values are truthy unless defined as falsy
// nullish: null or undefineda ||= b
// Logical OR assignment
// Equivalent to: a || (a = b);
// Only assigns if a is falsya &&= b
// Logical AND assignment
// Equivalent to: a && (a = b);
// Only assigns if a is truthya ??= b
// Logical nullish assignment
// Equivalent to: a ?? (a = b);
// Only assigns if a is nullish

5.1 具体例子

带有 && 运算符的逻辑赋值运算符

仅当 LHS 值为真时,才将 RHS 变量值赋给 LHS 变量。

// Logical Assignment Operator with && operator
let num1 = 5
let num2 = 10
num1 &&= num2
console.log(num1) // 10
// Line 5 can also be written as following ways
// 1. num1 && (num1 = num2)
// 2. if (num1) num1 = num2

带有 || 的运算符逻辑赋值运算符

仅当 LHS 值为假时,才将 RHS 变量值赋给 LHS 变量。

// Logical Assignment Operator with || operator
let num1
let num2 = 10
num1 ||= num2
console.log(num1) // 10
// Line 5 can also be written as following ways
// 1. num1 || (num1 = num2)
// 2. if (!num1) num1 = num2

带有 ?? 运算符的逻辑赋值运算符

ES2020 引入了空值合并运算符,其也可以与赋值运算符结合使用。仅当 LHS 为 undefined 或仅为 null 时,才将 RHS 变量值赋给 LHS 变量。

// Logical Assignment Operator with ?? operator
let num1
let num2 = 10
num1 ??= num2
console.log(num1) // 10
num1 = false
num1 ??= num2
console.log(num1) // false
// Line 5 can also be written as following ways
// num1 ?? (num1 = num2)

概括

作为开发人员,跟紧语言的新特性是很重要的。

以上将在 2021 年发布的一些新功能,它们是进入第 4 阶段的提案,几乎可以肯定会包括在内,这些功能已经在最新的浏览器和 babel 中实现。

参考文章:JavaScript Features in 2021

最近组建了一个江西人的前端交流群,如果你也是江西人可以加我微信 ruochuan12 拉你进群。



················· 若川出品 ·················

今日话题

今天分享一个chrome浏览器标签预览功能,打开chrome://flags,搜索tab hover Card Images,改成Enabled就开启啦,快试试吧。欢迎分享、收藏、点赞、在看我的公众号文章~

一个愿景是帮助5年内前端人走向前列的公众号

可加我个人微信 ruochuan12,长期交流学习

推荐阅读

我在阿里招前端,我该怎么帮你?(现在还能加我进模拟面试群)

如何拿下阿里巴巴 P6 的前端 Offer

点击方卡片关注我,或者查看源码等系列文章。
学习源码整体架构系列、年度总结、JS基础系列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

latex排版基础_排版基础分类

latex排版基础重点 (Top highlight)There are many parts to creating a beautiful, functional, memorizing design. That’s what all User Experience designers set out to do. You need to consider your users, strategy, features, content, color, and so much more. A…

AS3 CookBook学习整理(一)

1. 我要改变swf的尺寸和颜色 在flex builder 3里&#xff0c;默认会生成一个全屏、背景色为#869CA7、帧数为24/秒的swf文件&#xff0c;要修改这些参数&#xff0c;只需要在类文件中定义 [SWF(width"800", height"600", backgroundColor"#ffffff"…

微信小程序研发问题梳理:翻页:下拉:缓存:canvas:富文本:分享

微信小程序研发问题梳理 最近鼓捣小程序的时候&#xff0c;着实遇到了一些问题&#xff0c;尽管有些再翻看文档几遍&#xff0c;就能找到答案&#xff0c;但还是要发挥下烂笔头的功效&#xff0c;顺便梳理下。 问题列表 登录流程小程序标签页地址无法跳转问题页面翻页内容加…

Nginx重启方式

2019独角兽企业重金招聘Python工程师标准>>> 重启方式有三种&#xff1a; 1.简单型&#xff0c;先关闭进程&#xff0c;修改你的配置后&#xff0c;重启进程。 2.重新加载配置文件&#xff0c;不重启进程&#xff0c;不会停止处理请求 3.平滑更新nginx二进制&#x…

axure如何页面滑动时广告位上移_新手APP运营如何做广告位投放

运营是什么&#xff1f;这种问题在各种论坛、贴吧、百度知道、问答百科类中都会出现。上面也有各种大神各式各样的回答&#xff0c;从不同角度向我们阐述了什么是运营。用 户运营、内容运营、社区运营、活动运营、市场运营、等等&#xff0c;各种各样的文章对它们有非常多的分类…

常见的8个前端防御性编程方案

大家好&#xff0c;我是若川。欢迎加我微信 ruochuan12&#xff0c;长期交流学习。今天分享几个常见的前端防御性编程方案。点击下方卡片关注我&#xff0c;或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列关于前端防御性编程我们大多数情况可能遇到过&am…

比特平面分层_平面设计中的分层

比特平面分层One of the first windows to pop up automatically, when I first started using Adobe Photoshop back in 2013, was the Layers one. Albeit I was dabbling around with it for making memes, it was one of the first things I played around with.2013年&…

微软中国推校园先锋计划,保障学生低价获取正版软件

2010年7月13日&#xff0c;人人网 Lucky 7 率先向同学们宣布了"微软校园先锋计划"上线的消息&#xff0c;该计划现在接受学生预购正版 Windows 7 专业版和 Office 2010 专业版&#xff0c;正式销售的日期为7月19日。该计划的官网是&#xff1a;http://ms.shop.edu.cn…

did双重差分法_Stata中双重差分操流程及代码

01简介现代计量经济学和统计学的发展为我们的研究提供了可行的工具。倍差法来源于计量经济学的综列数据模型&#xff0c;是政策分析和工程评估中广为使用的一种计量经济方法。主要是应用于在混合截面数据集中&#xff0c;评价某一事件或政策的影响程度。该方法的基本思路是将调…

Axios 如何缓存请求数据?

大家好&#xff0c;我是若川。欢迎加我微信 ruochuan12&#xff0c;长期交流学习。今天推荐这篇Axios缓存请求数据的文章&#xff0c;相信是常见的业务场景&#xff0c;感兴趣的读者可以看看 umi-request&#xff0c;支持缓存功能。另外我之前也写过 axios源码文章&#xff0c;…

山西万荣盛装迎新春 首届群众文化艺术节启幕

山西万荣盛装迎新春&#xff0c;首届群众文化艺术节启幕。 李继旺 摄 山西万荣盛装迎新春&#xff0c;首届群众文化艺术节启幕。 李继旺 摄 中新网太原1月29日电 (任丽娜)璀璨闪耀的宝鼎广场花灯展、激情活力的群众文体赛事、精彩纷呈的红火热闹、精品年货展销、李家大院游园会…

安装vs2017出现闪退现象_Adobe Reader 闪退

在我们的日常办公、学习中经常会涉及到 PDF 文件&#xff0c;免不了需要处理 PDF 文件如&#xff1a;PDF转Word、PDF合并、导出成图片、PDF解密、PDF转PPT、PDF加水印、PDF签名等等。PDF是与平台无关的文件格式&#xff0c;无论在哪种打印机上都可保证精确的颜色和准确的打印效…

从Vue.js源码中我学到的几个实用函数

大家好&#xff0c;我是若川。欢迎加我微信 ruochuan12&#xff0c;长期交流学习。今天推荐Vuejs源码中几个实用的方法。如果想看Vuejs源码&#xff0c;不知道如何下手&#xff0c;一般推荐配置Sourcemap&#xff0c;针对单个问题调试来看&#xff0c;如何调试Vuejs源码&#x…

real类型_如何使用REAL方法对您的Web内容进行现实检查

real类型Web内容审核模板 (Web content audit template) I recently completed a website audit project for a nonprofit organization through CatchAFire.org. As part of the website audit, I audited every key page’s content, looking for areas of opportunity.我最近…

青海行--(7月26日)翻越祁连山

嘉峪关是最值得一写的&#xff0c;虽然也是著名的旅游城嘉峪关景点是国家&#xff21;&#xff21;&#xff21;&#xff21;&#xff21;级景区&#xff0c;但与敦煌完全不一样&#xff0c;没有人山人海的游客&#xff0c;门票也不贵&#xff0c;才&#xff11;&#xff10;&a…

导出Excel

2019独角兽企业重金招聘Python工程师标准>>> 思路: 1, 引入Excel类库; 2, 创建一个模板; 3, 将数据填充进去; 4, 生成文件; 下面是一个简单的示例 $phpExcelObj new PHPExcel(); $titleMap self::TITLE_MAP; //设置表头 $i 0; foreach ($titleMap as $key > $…

在类中用class时数据是共有还是私有_jvm学习笔记之class文件的加载、初始化

编写的java文件在要真正运行时&#xff0c;会首先被编译成 “.class"结尾的二进制文件&#xff0c;然后被虚拟机加载。那么在虚拟机中一个class文件要成为java实例&#xff0c;需要经历好几个步骤&#xff1a;1、装载&#xff1a;装载阶段由三个基本动作完成&#xff0c;要…

所有前端都要看的2D游戏化互动入门基础知识

背景现在越来越多的公司和APP开始使用游戏化的方式去做产品了&#xff0c;所谓游戏化&#xff0c;是指在非游戏环境中将游戏的思维和游戏的机制进行整合运用&#xff0c;以引导用户互动和使用的方法。支付宝里面的蚂蚁庄园、蚂蚁森林&#xff0c;通过游戏和公益的结合实现用户的…

江苏一动物园现“旋转活马” 园方:创意来自马术训练

中新网南通1月31日电 (记者唐娟)“旋转马设备采用同时容纳六匹马的遛马器组装而成&#xff0c;对马匹没有任何伤害&#xff0c;初衷是希望给小朋友一种全新体验&#xff0c;这才有了这个创意项目。”1月31日&#xff0c;针对活马版“旋转木马”引发的热议&#xff0c;江苏南通森…

加快信息化建设对地方发展的_加快设计师职业发展的9种方法

加快信息化建设对地方发展的重点 (Top highlight)Over the past few months, I have had an increase in conversations with design students from various institutions, as well as early, to senior-level designers, researchers, & product managers from various co…