作者 | 浪里行舟

责编 | 郭芮

ES2020 是 ECMAScript 对应 2020 年的版本。这个版本不像 ES6 (ES2015)那样包含大量新特性。但也添加了许多有趣且有用的特性。本文的代码地址:https://github.com/ljianshu/Blog

本文以简单的代码示例来介绍 ES2020新特性。这样,你可以很快理解这些新功能,而不需要多么复杂的解释。

可选链操作符(Optional Chaining)

可选链 可让我们在查询具有多个层级的对象时,不再需要进行冗余的各种前置校验。

日常开发中,当需要访问嵌套在对象内部好几层的属性时,可能就会得到臭名昭著的错误Uncaught TypeError: Cannot read property...,这种错误,让整段程序运行中止。

于是,你就要修改你的代码来处理来处理属性链中每一个可能的undefined对象,比如:

let nestedProp = obj && obj.first && obj.first.second;

在访问 obj.first.second 之前,要先确认 obj 和 obj.first 的值非 null(且不是 undefined)。

有了可选链式调用 ,可以大量简化类似繁琐的前置校验操作,而且更安全:

let nestedProp = obj?.first?.second;

如果obj或obj.first是null/undefined,表达式将会短路计算直接返回undefined。

可选链操作符的支持情况:

空位合并操作符(Nullish coalescing Operator)

当我们查询某个属性时,经常会给没有该属性就设置一个默认的值,比如下面两种方式:

let c = a ? a : b // 方式1
let c = a || b // 方式2

这两种方式有个明显的弊端,它都会覆盖所有的假值,如(0, '', false),这些值可能是在某些情况下有效的输入。

let x = {profile: {name: '浪里行舟',age: ''}
}
console.log(x.profile.age || 18) //18

上例中age的属性为空字符串,却被等同为假值,为了解决这个问题,ES2020诞生了个新特性--空位合并操作符,用 ?? 表示。如果表达式在??的左侧运算符求值为 undefined 或 null,就返回其右侧默认值。

let c = a ?? b;
// 等价于let c = a !== undefined && a !== null ? a : b;

例如有以下代码:

const x = null;
const y = x ?? 500;
console.log(y); // 500
const n = 0
const m = n ?? 9000;
console.log(m) // 0

空位合并操作符的支持情况:

Promise.allSettled

我们知道 Promise.all 具有并发执行异步任务的能力。但它的最大问题就是如果参数中的任何一个promise为reject的话,则整个Promise.all 调用会立即终止,并返回一个reject的新的 Promise 对象。

const promises = [Promise.resolve(1),Promise.resolve(2),Promise.reject('error')
];Promise.all(promises).then(responses => console.log(responses)).catch(e => console.log(e)) // "error"

假如有这样的场景:一个页面有三个区域,分别对应三个独立的接口数据,使用 Promise.all 来并发请求三个接口,如果其中任意一个接口出现异常,状态是reject,这会导致页面中该三个区域数据全都无法出来,这个状况我们是无法接受,Promise.allSettled的出现就可以解决这个痛点:

Promise.allSettled([Promise.reject({ code: 500, msg: '服务异常' }),Promise.resolve({ code: 200, list: [] }),Promise.resolve({ code: 200, list: [] })
]).then(res => {console.log(res)/*0: {status: "rejected", reason: {…}}1: {status: "fulfilled", value: {…}}2: {status: "fulfilled", value: {…}}*/// 过滤掉 rejected 状态,尽可能多的保证页面区域数据渲染RenderContent(res.filter(el => {return el.status !== 'rejected'}))
})

Promise.allSettled跟Promise.all类似, 其参数接受一个Promise的数组, 返回一个新的Promise, 唯一的不同在于, 它不会进行短路, 也就是说当Promise全部处理完成后,我们可以拿到每个Promise的状态, 而不管是否处理成功。

Promise.allSettled的支持情况:

String.prototype.matchAll

如果一个正则表达式在字符串里面有多个匹配,现在一般使用g修饰符或y修饰符,在循环里面逐一取出。

function collectGroup1 (regExp, str) {const matches = []while (true) {const match = regExp.exec(str)if (match === null) breakmatches.push(match[1])}return matches
}
console.log(collectGroup1(/"([^"]*)"/g, `"foo" and "bar" and "baz"`))
// [ 'foo', 'bar', 'baz' ]

值得注意的是,如果没有修饰符 /g, .exec() 只返回第一个匹配。现在通过String.prototype.matchAll方法,可以一次性取出所有匹配。

function collectGroup1 (regExp, str) {let results = []for (const match of str.matchAll(regExp)) {results.push(match[1])}return results
}
console.log(collectGroup1(/"([^"]*)"/g, `"foo" and "bar" and "baz"`))
// ["foo", "bar", "baz"]

上面代码中,由于string.matchAll(regex)返回的是遍历器,所以可以用for...of循环取出。

String.prototype.matchAll的支持情况:

Dynamic import

现在前端打包资源越来越大,前端应用初始化时根本不需要全部加载这些逻辑资源,为了首屏渲染速度更快,很多时候都是动态导入(按需加载)模块,比如懒加载图片等,这样可以帮助您提高应用程序的性能。

其中按需加载这些逻辑资源都一般会在某一个事件回调中去执行:

el.onclick = () => {import('/modules/my-module.js').then(module => {// Do something with the module.}).catch(err => {// load error;})
}

import()可以用于script脚本中,import(module) 函数可以在任何地方调用。它返回一个解析为模块对象的 promise。

这种使用方式也支持 await 关键字。

let module = await import('/modules/my-module.js');

通过动态导入代码,您可以减少应用程序加载所需的时间,并尽可能快地将某些内容返回给用户。

Dynamic import的支持情况:

BigInt

javascript 在 Math 上一直很糟糕的原因之一是只能安全的表示-(2^53-1)至 2^53-1 范的值,即Number.MIN_SAFE_INTEGER 至Number.MAX_SAFE_INTEGER,超出这个范围的整数计算或者表示会丢失精度。

var num = Number.MAX_SAFE_INTEGER;  // -> 9007199254740991num = num + 1; // -> 9007199254740992// 再次加 +1 后无法正常运算
num = num + 1; // -> 9007199254740992// 两个不同的值,却返回了true
9007199254740992 === 9007199254740993  // -> true

于是 BigInt 应运而生,它是第7个原始类型,可安全地进行大数整型计算。你可以在BigInt上使用与普通数字相同的运算符,例如 +, -, /, *, %等等。

创建 BigInt 类型的值也非常简单,只需要在数字后面加上 n 即可。例如,123 变为 123n。也可以使用全局方法 BigInt(value) 转化,入参 value 为数字或数字字符串。

const aNumber = 111;
const aBigInt = BigInt(aNumber);
aBigInt === 111n // true
typeof aBigInt === 'bigint' // true
typeof 111 // "number"
typeof 111n // "bigint"

只要在数字末尾加上 n,就可以正确计算大数了:

1234567890123456789n * 123n;
// -> 151851850485185185047n

不过有一个问题,在大多数操作中,不能将 BigInt与Number混合使用。比较Number和 BigInt是可以的,但是不能把它们相加。

1n < 2
// true1n + 2
// Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions

BigInt的支持情况:

globalThis

globalThis 是一个全新的标准方法用来获取全局 this 。之前开发者会通过如下的一些方法获取:

  • 全局变量 window:是一个经典的获取全局对象的方法。但是它在 Node.js 和 Web Workers 中并不能使用。

  • 全局变量 self:通常只在 Web Workers 和浏览器中生效。但是它不支持 Node.js。一些人会通过判断 self 是否存在识别代码是否运行在 Web Workers 和浏览器中。

  • 全局变量 global:只在 Node.js 中生效。

过去获取全局对象,可通过一个全局函数:

// ES10之前的解决方案
const getGlobal = function(){if(typeof self !== 'undefined') return selfif(typeof window !== 'undefined') return windowif(typeof global !== 'undefined') return globalthrow new Error('unable to locate global object')
}// ES10内置
globalThis.Array(0,1,2) // [0,1,2]// 定义一个全局对象v = { value:true } ,ES10用如下方式定义
globalThis.v = { value:true }

而 globalThis 目的就是提供一种标准化方式访问全局对象,有了 globalThis 后,你可以在任意上下文,任意时刻都能获取到全局对象。

如果您在浏览器上,globalThis将为window,如果您在Node上,globalThis则将为global。因此,不再需要考虑不同的环境问题。

// worker.js
globalThis === self
// node.js
globalThis === global
// browser.js
globalThis === window

新提案也规定了,Object.prototype 必须在全局对象的原型链中。下面的代码在最新浏览器中已经会返回 true 了:

Object.prototype.isPrototypeOf(globalThis); // true

globalThis的支持情况:

作者:浪里行舟,硕士研究生,专注于前端,运营有个人公众号前端工匠,致力于打造适合初中级工程师能够快速吸收的一系列优质文章。

声明:本文为作者投稿,版权归其所有。

防疫、复工如何并行?天云数据推出人工智能监测方案!到底如何做到事前预防,而不是事后诸葛亮?本周四晚8点,天云数据VP陈勇为各位揭晓答案!扫描下方二维码免费报名~

今日福利:点击阅读原文,凭优惠码“AIP1510”都可获得价值299元的「2020 AI开发者万人大会」在线直播门票一张。  

推荐阅读:为什么要在油气行业中应用 IoT?这 8 个应用场景告诉你 IoT 在油气行业中可以做什么
生产环境使用HBase,你必须知道的最佳实践
Java 14 来了!
字节跳动武汉招聘 2000  人,距离大厂 Offer,你还差这篇 Java 干货!| 原力计划
数字合约如何将所有权下放?如何使用脚本系统将交易转换为可编程的智能合约?答案就在这篇文章里!
人生苦短,不光要用Python,还要在VSCode里用
真香,朕在看了!

十分钟上手 ES 2020 新特性相关推荐

  1. 十分钟接入iOS 12新特性——Siri Shortcuts

    前言 Xcode 10已经正式发布,开发者可以接入Siri Shortcuts的iOS 12新特性. WWDC2018的Introduction to Siri Shortcuts Session介绍 ...

  2. access 提供程序无法确定object 值_Python | 加一行注释,让你的程序提速10+倍!numba库十分钟上手指南...

    如果你在使用Python进行高性能计算,Numba提供的加速效果可以比肩原生的C/C++程序,只需要在函数上添加一行@jit的装饰.它支持CPU和GPU,是数据科学家必不可少的编程利器. 之前的文章 ...

  3. 五十八、Java8的新特性Lambda表达式

    @Author:Runsen @Date:2020/6/24 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  4. 十分钟上手2022latex安装与入门

    序言:本次下载是为美赛而用,因此我们选择的下载组合为texlive+texstudio,使用windows10安装.在此提醒大家,类似工具的下载建议大家亲历亲为,不要相信一些诱导性网站,都是非官方的安 ...

  5. 【C++11】30分钟了解C++11新特性

    什么是C++11 C++11是以前被叫做C++0x,是对眼下C++语言的扩展和修正.C++11不仅包括核心语言的新机能,并且扩展了C++的标准程序库(STL).并入了大部分的C++ Technical ...

  6. 30分钟了解C 11新特性

    什么是C 11 C 11是曾经被叫做C 0x,是对目前C 语言的扩展和修正,C 11不仅包含核心语言的新机能,而且扩展了C 的标准程序库(STL),并入了大部分的C Technical Report ...

  7. Web前端面试指导(四十):CSS3有哪些新特性?

    题目点评 CSS3的特性那么多该从哪里说起了?很显然这道题目是有陷阱的,你不可能将所有的特性一个不漏的说出来,就算你说出来,别人还认为你是背的了!所以你主要讲一下在项目中经常用到的Css3的属性就可以 ...

  8. 【Maya绑定】FK骨架拉伸实现思路——基于2020新特性

    此笔记仅为个人平时积累之用,描述并非专业,如有错误恳请指正 前言 我们在上一节[Maya绑定]三点式IK骨架的比例拉伸的实现思路中,实现三点式IK关节的拉伸.IK关节的控制器只有一个(在wrist处, ...

  9. 30分钟了解C++11新特性

    什么是C++11 C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical ...

最新文章

  1. linux 查看 全部网卡 虚拟网卡 物理网卡
  2. 成功解决pywintypes.error: (2, 'LoadLibraryEx', '系统找不到指定的文件。')
  3. Java编程思想——到底选择合成还是继承
  4. centos 7 修复mysql,快速修复Centos7 系统时区!
  5. vue 页面跳转404_Vue 项目棘手问题的解决方案
  6. Windows Mobile 5.0编程—奥运场馆速查
  7. win10系统自带图标/壁纸位置
  8. EPS PanSystem v3.4.0 Full 1CD(解析试井解释软件)\
  9. Java微服务和分布式区别
  10. 写一个程序,将接收的华氏温度转换为对应的摄氏温度。
  11. Ubuntu 分卷压缩
  12. MOS 的TJ TA TC和功耗之类的计算
  13. 对话,对话,全是超级爆笑对话
  14. iOS 应用上架流程(提交到AppStore)
  15. 电脑损坏,电脑文件损坏无法开机怎么办
  16. File.separator是什么?
  17. 【Matlab学习手记】ELM分类
  18. mybatis入门实例(xml文件配置)
  19. 智能合约通证化与 Web3 革命(1):为何智能合约没能成为区块链的杀手级应用?...
  20. 如何寻找软件外包公司?

热门文章

  1. 计算机网络 --- 数据链路层CSMA/CD协议
  2. ios 贝塞尔曲线 颜色填充_iOS贝塞尔曲线(UIBezierPath)的基本使用方法
  3. 优秀!33岁博士,拟作为县长人选!
  4. AI领域都在用Python即将被淘汰?网友预测未来的编程语言不会是TA
  5. 学术诚信是科学精神的基底
  6. “老鹰捉小鸡”小学数学题碾压成人智商,这样的题目有什么意义?
  7. AAAI 2019 四个杰出论文奖论文揭晓
  8. 这位数字艺术的开拓者,通过计算机算法成就了新的艺术表达方式
  9. 那个悲伤的朋友,去了一趟菜场竟然活过来了
  10. windows10 计算文件的HASH(SHA256\MD5等)