ECMAScript 2020(ES11)新特性简介

2024-02-24 15:58

本文主要是介绍ECMAScript 2020(ES11)新特性简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 简介
  • 动态imports
  • import.meta
  • export加强
  • BigInt
  • matchAll()
  • globalThis
  • Promise.allSettled()
  • ??操作符
  • ?.操作符
  • 总结

简介

ES11是ECMA协会在2020年6月发行的一个版本,因为是ECMAScript的第十一个版本,所以也称为ES11.

今天我们讲解一下ES11的新特性。

ES11引入了9个新特性,我们接下来一一讲解。

动态imports

在ES11之前,我们可以使用下面的方式进行模块的导入:

import * as TestModule from "./test-module.js";

但是上面的导入方式会有一些问题,首先是效率的问题,所有的module都需要在首次加载的时候导入,会导致程序效率的降低。另外上面的模块名字是写死的,不可以在程序运行的时候进行动态修改。

也就是说上面的模块导入方式,不能对模块进行动态导入,或者按需导入,在使用上有诸多的不便。

为了解决这个问题,ES11引入了新的import() 方法,使用这个方法,你可以对模块进行动态导入,并且通过设置模块名为变量的形式,可以对模块名进行动态修改,非常的神奇。我们看一个具体的使用例子:

const baseModulePath = "./baseModules";
const btnImportModule = document.getElementById("btnImportModule");
let userList = [];btnImportModule.addEventListener("click", async e => {const userModule = await import(`${baseModulePath}/users.js`);userList = userModule.getUsers();
});

上面代码中我们定义了一个基本的Module路径,通过点击页面上的按钮,可以动态的加载一个users.js模块,然后调用该模块的getUsers()方法,获得userList列表。

import.meta

除了动态引入模块之外,import还提供了一个元属性meta,它包含了当前引入的模块的信息,目前他里面有一个url属性,代表模块被引用的URL。如果想使用URL信息,那么可以在代码中使用import.meta.url。

export加强

import是在ECMAScript 2015中引入的,主要被用来做模块的引入,import可以引入整个模块,也可以引入部分模块。如下所示:

import {something} from "./test-module.js";
import * from "./test-module.js";

和import对应的就是export,同样可以export所有或者部分,如下所示:

export {something} from "./test-module.js";
export * from "./test-module.js";

通常情况来说,上面讲的import和export已经够用了,但是对于导出模块需要重命名的情况,我们不能直接导出,而是必须先在import的时候进行重命名,然后再使用export将重命名的模块导出:

import * as myModule from "./test-module.js";
export {myModule};

如果使用export的增强,则不需要使用import,直接使用export导出即可:

export * as {myModule} from "./test-module.js";

BigInt

ES11引入了新的数据类型BigInt,在这之前,javascript中表示数字的对象是Number,它可以表示64-bit的浮点类型数字。当然它也可以代表整数,但是整数表示的最大值是2^53,也可以用Number.MAX_SAFE_INTEGER来表示。

一般来说Number已经够用了,但是如果在某些情况下需要对64-bit的整数进行存储或者运算,或者要表示的范围超过了64-bit的话,Number就不够用了。

怎么办呢?如果只是存储的话,可以存储为字符串,但是第二种字符串就不适用了。于是引入了BigInt来解决这个问题。要表示BigInt,只需要在数字的后面加上n即可。

const bigInt = 112233445566778899n;

或者使用构造函数来构造bigInt:

const bigInt = BigInt("112233445566778899");

可以使用typeof来查看bigInt的类型。要注意的是虽然Number和BigInt都代表的是数字,但是两者是不能混用的,你不能将一个Number和一个BigInt相加。这会报TypeError异常。

如果非要进行操作,那么可以使用BigInt构造函数将Number转换成为BigInt之后再进行。

matchAll()

正则表达式的匹配是一个非常常见的操作,通常我们使用regExp.exec来进行正则的匹配,举个正则匹配的例子如下:

const regExp = /yyds(\d+)/g;
const text = 'yyds1 is a very good yyds2';
let matches;while ((matches = regExp.exec(text)) !== null) {console.log(matches);
}

上面的代码运行结果如下:

["yyds1","1"]
["yyds2","2"]

我们得到了所有匹配的值。不过需要使用一个循环来进行遍历,使用起来有诸多的不便,为了简单起见,ES11引入了matchAll()方法。这个方法可以简单的返回一个遍历器,通过遍历这个遍历器,就可以得到所有的匹配的值,如下所示:

const regExp = /yyds(\d+)/g;
const text = 'yyds1 is a very good yyds2';
let matches = [...text.matchAll(regExp)];for (const match of matches) {console.log(match);
}

globalThis

对于javascript来说,不同的环境对应的全局对象的获取方式也是不同的,对于浏览器来说通常使用的是window,但是在web worker中使用的是self,而在nodejs中使用的是global。

为了解决在不同环境中的全局对象不同的问题,ES11引入了globalThis,通过这个全局对象,程序员就不用再去区分到底是在哪个环境下了,只需要使用globalThis即可。

Promise.allSettled()

自从Promise引入之后,有两个方法可以对Promise进行组合,分别是Promise.all() 和Promise.race(), 他们分别表示返回所有的Promise和返回最快的那个。

对于Promise.all()来说,它会等待所有的Promise都运行完毕之后返回,如果其中有一个Promise被rejected,那么整个Promise.all()都会被rejected。在这种情况下,如果有一个Promise被rejected,其他的Promise的结果也都获取不了。

为了解决这个问题,ES11引入了Promise.allSettled() 方法,这个方法会等待所有的Promise结束,不管他们是否被rejected,所以可以使用下面的代码获得所有的结果,而不管其中是否有Promise出现问题。

const promises = [promise1("/do1"), promise2("/do2")];
const allResults = await Promise.allSettled(promises);
const errors = results.filter(p => p.status === 'rejected').map(p => p.reason);

??操作符

??操作符是一个判断是否为空然后赋值的操作,如果没有这个操作符,我们通常使用||来简单的进行这个操作,如下所示:

const yourAge = someBody.age || 18

上面的代码意思是如果someBody.age 是空,那么就将yourAge设置成为18。

但是上面代码有个问题,如果someBody.age=0 的话,上述逻辑也成立。使用??操作符可以解决这个问题。

const yourAge = someBody.age ?? 18

?.操作符

我们有时候在获取某个对象的属性的时候,需要进行对象的null判断,否则从null对象中取出属性就会报错,但是通常的?:操作符使用起来太复杂了,如果有多个对象和属性连写的情况下更是如此,如果使用?.操作符就会简单很多:

const age = school?.class?.student?.age;

如上所示,这个一个非常复杂的连写操作,但是使用?.就变得很简单。

同样?.还可以用在对象的方法上:

const age = student.getAge?.();

上面代码表示,如果student的getAge方法存在,则调用,否则返回undefined。

总结

事实上所有的现代浏览器基本上都支持ES11了,IE除外。大家可以尽情尝试ES11的新特征。

本文已收录于 http://www.flydean.com/ecmascript-11/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

这篇关于ECMAScript 2020(ES11)新特性简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/742598

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

业务协同平台--简介

一、使用场景         1.多个系统统一在业务协同平台定义协同策略,由业务协同平台代替人工完成一系列的单据录入         2.同时业务协同平台将执行任务推送给pda、pad等执行终端,通知各人员、设备进行作业执行         3.作业过程中,可设置完成时间预警、作业节点通知,时刻了解作业进程         4.做完再给你做过程分析,给出优化建议         就问你这一套下

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

【Tools】AutoML简介

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 AutoML(自动机器学习)是一种使用机器学习技术来自动化机器学习任务的方法。在大模型中的AutoML是指在大型数据集上使用自动化机器学习技术进行模型训练和优化。

ActiveMQ—消息特性(延迟和定时消息投递)

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery) 转自:http://blog.csdn.net/kimmking/article/details/8443872 有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

深入探讨:ECMAScript与JavaScript的区别

在前端开发的世界中,JavaScript无疑是最受欢迎的编程语言之一。然而,很多开发者在使用JavaScript时,可能并不清楚ECMAScript与JavaScript之间的关系和区别。本文将深入探讨这两者的不同之处,并通过案例帮助大家更好地理解。 一、什么是ECMAScript? ECMAScript(简称ES)是一种脚本语言的标准,由ECMA国际组织制定。它定义了语言的语法、类型、语句、

详解Tomcat 7的七大新特性和新增功能(1)

http://developer.51cto.com/art/201009/228537.htm http://tomcat.apache.org/tomcat-7.0-doc/index.html  Apache发布首个Tomcat 7版本已经发布了有一段时间了,Tomcat 7引入了许多新功能,并对现有功能进行了增强。很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成