写点什么

ECMAScript 2020 的新功能

  • 2020-04-21
  • 本文字数:2608 字

    阅读完需:约 9 分钟

ECMAScript 2020 的新功能

JavaScript 是很受欢迎的前端开发语言之一,而 ECMAScript 在推进 JavaScript 发展上有着不可磨灭的贡献。2015 年 6 月正式发布的 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。ECMAScript 2020 即将到来,让我们先来看看有哪些新功能吧。

ECMAScript 和 JavaScript

JavaScript 作为前端最受欢迎的语言之一,每次更新新特性或者性能优化都会引发前端开发者的关注。那么 ES 和 JS 有什么区别呢?这个问题要回溯到 1996 年 11 月,JavaScript 的创造者 Netscape 公司希望能将这门语言制定成国际标准,于是将 JavaScript 提交至国际标准化组织 ECMA。次年,ECMA 发布了 262 号标准文件的第一版,规定了浏览器脚本语言的标准,并将这门语言称为 ECMAScript,这个版本就是 1.0 版。


可以说,ECMAScript 这一标准从始至终就是针对 JavaScript 语言制定的,那为什么不直接叫做 JavaScript 呢?主要有两点原因:


首先是版权原因,Java 是 Sun 公司的商标,根据授权协议,只有 Netscape 公司可以合法地使用 JavaScript 这个名字,而且 JavaScript 也早已被 Netscape 公司注册为商标。


其次,称之为 ECMAScript 也是希望体现这门语言的规范是由 ECMA 制定,而不是 Netscape,这样也能更好地保证这门语言的开放性和中立性。


综上所述,ECMAScript 和 JavaScript 的关系就很好理清了,ES 是 JS 的规范,而 JS 是 ES 的一种实现方法。

ES 2020 的新功能

动态 import ()

静态 import 语法最早于 ES 2015 引入,用于导入由另一个模块导出的变量。该语法称为静态语法,因为开发者无法在运行时动态导入模块,但静态导入可以在编译时进行优化。此外,还有一个类似函数的动态 import(),它不需要依赖 type="module" 的 script 标签。如果合理地使用动态导入,则可以通过按需加载依赖项减少分发包的大小。


新的动态 import 语法看起来像一个函数,但并不是函数,不过动态 import 语法也支持 await。


https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/import

空值合并运算符

大家都知道,使用短循环设置默认值的方法有一个小缺陷,由于它实际上不是在检查空值,而是在检查结果的虚假性,因此它会破坏值为 false 或 0 的结果,因为两者均被视为虚假性的结果。ES2020 引入了一个新的运算符 ?? ,该运算符的工作原理与短循环类似,但仅当初始值为 null 或 undefined 时才读取为运算符右边的值。


const nullValue = null;
const emptyText = ""; // falsy
const someNumber = 42;
const valA = nullValue ?? "default for A";
const valB = emptyText ?? "default for B";
const valC = someNumber ?? 0;
console.log(valA); // "default for A"
console.log(valB); // "" (as the empty string is not null or undefined)
console.log(valC); // 42
复制代码


https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator

可选链接

新的 optional chaining 运算符旨在在处理嵌套对象和检查可能的代码时使代码更短 undefineds。可选的链接运算符 ?. 允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。运算符的功能与 .chaining 运算符相似,不同之处在于,如果引用为空(null 或 undefined),则表达式会短路,返回值为 undefined。当与函数调用一起使用时,如果给定的函数不存在,则返回未定义的值。


const user = { name: "John" };
// Fails with `Uncaught TypeError: Cannot read property 'city' of undefined`
const city = user.address.city;
// Works but verbose
let city = "Not Set";
if (user.address !== undefined && user.address !== null) {
city = user.address.city;
}
// Works and concise but requires a 3rd party library
const city = _.get(user, "address.city", "Not Set");
// 🤗
const city = user?.address?.city ?? "Not Set";
复制代码


https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

BigInt

BigInt 是一个内置的对象,它提供了一种方法来表示大于 2⁵³-1 的整数,这是 JavaScript 可以可靠地用 number 原语表示的最大数,并由 number 表示。MAX_SAFE_INTEGER 常量。BigInt 可用于任意大整数。


这是一个计算素数的例子:


// Returns true if passed BigInt is a prime number
function isPrime(p) {
for (let i = 2n; i * i <= p; i++) {
if (p % i === 0n) return false;
}
return true
}
// Takes a BigInt as an argument, returns nth prime number as BigInt
function nthPrime(nth) {
let maybePrime = 2n
let prime = 0n

while (nth >= 0n) {
if (isPrime(maybePrime)) {
nth--
prime = maybePrime
}
maybePrime++
}

return prime
}
nthPrime(20n)
// ↪ 73n
复制代码


https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt

globalThis

在 JavaScript 中,总会有一个包含了所有内容的很大的对象,但在传统意义上来说,如果你尝试在浏览器中打开它则是会报错的。有的时候全局可以正常访问的节点在浏览器中却可以访问,反之有些可以全局访问的节点在浏览器中却无法访问,而新的 globalThis 属性解决了这个问题。


在此之前 globalThis,获取环境全局对象的唯一可靠的跨平台方法是 Function(‘return this’)()。但是,这会导致在某些设置中违反 CSP,因此 es6-shim 使用这样的检查,例如:


var getGlobal = function () { 
if (typeof self !== 'undefined') { return self; }
if (typeof window !== 'undefined') { return window; }
if (typeof global !== 'undefined') { return global; }
throw new Error('unable to locate global object');
};
var globals = getGlobal();
if (typeof globals.setTimeout !== 'function') {
// no setTimeout in this environment!
}
复制代码


有了 globalThis 这个功能,就不再需要在整个环境中进行全局搜索:


if (typeof globalThis.setTimeout !== 'function') {
// no setTimeout in this environment!
}
复制代码


https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis

延伸阅读

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference


2020-04-21 16:113097
用户头像
李俊辰 InfoQ编辑

发布了 228 篇内容, 共 86.0 次阅读, 收获喜欢 274 次。

关注

评论 1 条评论

发布
用户头像
👏
2020-04-22 00:08
回复
没有更多了
发现更多内容

“逐代传承”提升强化学习效果;LLM重塑Multi-agent建模与仿真

算AI

深度学习 强化学习 NLP 大模型 #人工智能 LLM

【开发者推荐】告别繁琐:一键解锁国产ETL新贵,Kettle的终结者

敏捷调度TASKCTL

kettle 国产数据库 TASKCTL 数据集成平台

三大国际产业与标准组织正式成立,引领全球产业创新与发展

最新动态

未来LED显示屏方向:超薄、散热、柔性

Dylan

国际化 LED显示屏 全彩LED显示屏 户外LED显示屏 led显示屏厂家

接口测试:Mock 工具与定制化

测试人

软件测试 Mock

天润融通"恶意感知系统":提前预警,化解315公关危机

天润融通

甲子光年专访天润融通CEO吴强:客户经营如何穿越低速周期?

天润融通

人工智呢

Qt(C++)绘制指针仪表盘显示当前温度

DS小龙哥

6 月 优质更文活动

Apache Flink类型及序列化研读&生产应用|得物技术

得物技术

flink 技术分享 企业号2024年6月PK榜

原生鸿蒙,激活数字内容一池活水

最新动态

利用反射API和AOP实现业务逻辑的自动化重构

技术冰糖葫芦

API Explorer API boy api 货币化 API 文档

TDengine 新能源行业研讨会上都说了啥?精彩回顾!

TDengine

数据库 tdengine 时序数据库

介绍几种 MySQL 官方高可用方案

Simon

MySQL 数据库 MySQL高可用

我的私人助理 | 办公小浣熊

六月的雨在InfoQ

数据分析 数据可视化 数据分析预测 办公小浣熊 莫比乌斯环

2024年中国零信任发展趋势展望

芯盾时代

iam 统一身份认证 零信任 零信任模型 sdp

深入理解Spring AOP中的@EnableAspectJAutoProxy

华为云开发者联盟

Java spring 华为云 华为云开发者联盟 企业号2024年6月PK榜

KaiwuDB 事务中的 Raft 协议

KaiwuDB

数据一致性 raft协议 KaiwuDB

文献解读-基因编辑-第十二期|《CRISPR-detector:快速、准确地检测、可视化和注释基因组编辑事件引起的全基因组范围突变》

INSVAST

基因数据分析 生信服务 基因编辑

通过搭建 24 点小游戏应用实战,带你了解 AppBuilder 的技术原理

百度Geek说

企业号 6 月 PK 榜 AI 原生云 AppBuilder

mac苹果单机游戏推荐:古墓丽影11:暗影 for Mac安装包

你的猪会飞吗

Mac游戏下载 mac单机游戏

数字黄金 vs 全球计算机:比特币与以太坊现货 ETF 对比

TechubNews

Markdown一键生成PPT!这2个AI工具软件值得推荐!

彭宏豪95

markdown PPT 在线白板 效率软件 AI生成PPT

ECMAScript 2020 的新功能_大前端_李俊辰_InfoQ精选文章