ECMAScript 2020,也称为 ES11,是 JavaScript 的最新版本。这个版本带来了许多新特性和改进,旨在使开发更加简单方便。本篇文章将介绍其中的一些重要新功能和 API。
1. 可选链操作符
可选链操作符是ES11最引人注目的特性之一,它是一种安全的方式来访问对象上可能不存在的嵌套属性。在以前,要访问一个对象中的嵌套属性,需要使用冗长的 if 语句判断是否存在。有了可选链操作符,我们可以实现更简单和可读性更好的代码。
考虑以下示例,一个由多个嵌套对象构成的数据集合:
-- -------------------- ---- ------- ----- ---- - - ----- -------- -------- - ------ -------------------- ------ - ----- ------------- ----- ------------- -- -- --
如果要访问用户的办公电话号码,以前的代码可能长成这个样子:
let officePhone; if (user && user.contact && user.contact.phone && user.contact.phone.work) { officePhone = user.contact.phone.work; }
现在,我们可以使用可选链操作符来简化代码:
const officePhone = user?.contact?.phone?.work;
这不仅简单易懂,还会在未定义或不正确的键时返回undefined
,避免了错误的处理逻辑。
2. 空值合并操作符
空值合并操作符是另一项实用的功能,它也减少了冗长的代码。它将处理变量为null
或undefined
的情况变得更加简单。
考虑以下代码:
let x; if (a !== null && a !== void 0) { x = a; } else { x = 'default'; }
在 ES11 中,我们可以使用空值合并操作符来达到相同的结果:
const x = a ?? 'default';
如果变量a
的值为null
或undefined
,x
会被赋予 default
的值。
3. 全局对象的 globalThis
ES11引入了一个新的全局对象 globalThis
,它可以在任何地方获得全局对象,无论代码在浏览器还是 Node.js 等其他环境中运行,在访问全局属性时非常方便。
在浏览器中:
console.log(globalThis === window); // true
在 Node.js 中:
console.log(globalThis === global); // true
4. 字符串操作扩展
ES11中的字符串扩展包括了 String.prototype.matchAll() 和 String.prototype.replaceAll() 方法。
String.prototype.matchAll()
matchAll()
方法返回一个迭代器,它通过在字符串上执行全局正则表达式匹配来查找匹配项。返回的迭代器提供了每个匹配项的详细信息。
考虑以下代码:
const regex = /[a-z]/g; const str = 'ab cd ef'; const matches = str.matchAll(regex); for(let match of matches) { console.log(match[0], match.index); }
输出结果:
a 0 b 1 c 3 d 4 e 6 f 7
String.prototype.replaceAll()
replaceAll()
方法是字符串全局替换的一个短语。这个方法接受两个参数,第一个参数用于匹配,第二个参数用于替换匹配项。
例如:
const str = 'hello world'; const newStr = str.replaceAll('o', '0'); console.log(newStr); // "hell0 w0rld"
5. Promise allSettled()
在空间有限的前端应用程序中,资源都是宝贵的,无论是网络连接还是内存占用。为了最大化利用这些资源,我们希望更好的理解 Promise 如何工作,并掌握它的最新特性。
Promise.allSettled()
返回一个 Promise,这个 Promise 在所有 Promise 解析或拒绝后才解决,并在解决时返回一个及其原始 Promise 的描述数组。这意味着在多个 Promise 解析或拒绝时,Promise.allSettled()
不会抛出异常,而是为每个 Promise 返回一个详细的状态,让您在处理 Promise 时更加灵活。它既不被解析所有 Promise 也不被拒绝所有 Promise。
考虑以下代码块:
Promise.all([ Promise.resolve('hello'), Promise.reject('world') ]) .then(results => console.log(results)) .catch(error => console.error(error)); // Promise.all() 异常了!
在 Promise.all() 中的 Promise 之一拒绝时,Promise.all() 将被拒绝并抛出异常。这可能导致应用程序崩溃或产生不可逆的结果。
现在,考虑使用Promise.allSettled()
方法。
Promise.allSettled([ Promise.resolve('hello'), Promise.reject('world') ]) .then(results => console.log(results)) .catch(error => console.error(error)); // 我们不会在这里看到错误
在这种情况下,即使有 Promise 被拒绝,仍然会忠实地解决 Promise。此间接增加了应用程序的鲁棒性。
结论
ES11 中的一些新功能和 API 扩展了 JavaScript 的能力,使其更直观、可读和安全。通过学习这些新特性,您将能够更有效地开发 Web 应用程序并为自己的团队带来更大的价值。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672ebe32eedcc8a97c8aa6de