功能支持
我们的JavaScript和WebAssembly语言功能解释通常包括如下的功能支持列表:
没有任何支持的功能看起来像这样:
对于前沿功能,在不同环境下常常可以看到混合支持:
目标是提供一个功能成熟度的快速概览,不仅限于V8和Chrome,还包括更广泛的JavaScript生态系统。请注意,这不仅限于像V8这样的活跃开发的JavaScript虚拟机中的原生实现,还包括工具支持,这里用Babel图标表示。
我们的JavaScript和WebAssembly语言功能解释通常包括如下的功能支持列表:
没有任何支持的功能看起来像这样:
对于前沿功能,在不同环境下常常可以看到混合支持:
目标是提供一个功能成熟度的快速概览,不仅限于V8和Chrome,还包括更广泛的JavaScript生态系统。请注意,这不仅限于像V8这样的活跃开发的JavaScript虚拟机中的原生实现,还包括工具支持,这里用Babel图标表示。
本节介绍了 JavaScript(由ECMA-262 (ECMAScript)及ECMA-402 (ECMAScript国际化API)规范的编程语言)和WebAssembly (Wasm)中的最新功能。
显式资源管理(Explicit Resource Management)提案引入了一种确定性方法,用于显式管理像文件句柄、网络连接等资源的生命周期。这一提案包括以下语言新增功能:using
和 await using
声明,自动在资源超出作用域时调用 dispose 方法;[Symbol.dispose]()
和 [Symbol.asyncDispose]()
符号用于清理操作;两个新的全局对象 DisposableStack
和 AsyncDisposableStack
作为容器来聚合可清理的资源;以及一种新的错误类型 SuppressedError
(同时包含最近抛出的错误以及被抑制的错误),用于处理在资源清理期间发生错误而可能掩盖从代码主体或其他资源清理中抛出的现有错误的场景。这些新增功能使开发者能够通过提供对资源清理的精细控制,编写更强健、高效且可维护的代码。
迭代器助手 是迭代器原型上的一组新方法,帮助简化迭代器的使用。由于这些辅助方法在迭代器原型上,任何在其原型链上包含 Iterator.prototype
的对象(例如数组迭代器)都可以使用这些方法。在以下小节中,我们将解释这些迭代器助手功能。所有提供的示例均在博客归档页面中运行,包含博客文章列表,展示如何通过迭代器助手查找和操作文章。您可以在 V8 博客页面 上试用它们!
JavaScript 自 ECMAScript 3(1999)以来就支持正则表达式。十六年后,ES2015 引入了 Unicode 模式(u
标记)、粘滞模式(y
标记) 和 RegExp.prototype.flags
访问器。三年后,ES2018 引入了 dotAll
模式(s
标记)、后瞻断言、命名捕获组 和 Unicode 字符属性转义。而在 ES2020 中,String.prototype.matchAll
简化了使用正则表达式的过程。JavaScript 正则表达式已经取得了长足的发展,并且仍在不断完善。
在Array
中查找满足某个条件的元素是一个常见任务,可以通过Array.prototype
和各种TypedArray原型上的find
和findIndex
方法来完成。Array.prototype.find
接受一个谓词并返回数组中第一个使该谓词返回true
的元素。如果没有元素使谓词返回true
,则方法返回undefined
。
新的at
方法适用于Array.prototype
、各种TypedArray原型和String.prototype
,使得访问集合末尾附近的元素变得更容易和简洁。
从集合末尾访问第N个元素是一种常见操作。然而,通常的做法较为冗长,比如my_array[my_array.length - N]
,或者性能可能不佳,比如my_array.slice(-N)[0]
。新的at
方法通过解释负索引为“从末尾开始”使该操作更加符合人体工学。之前的示例可以表示为my_array.at(-N)
。
假设你有一个函数要调用两个独立的工作负载 doSomeWork
和 doMoreWork
。这两个函数可能抛出同样类型的错误,但你需要以不同的方式处理它们。
捕获错误并通过附加上下文信息将其抛出是解决此问题的一种常见方法,例如:
function doWork() {
try {
doSomeWork();
} catch (err) {
throw new CustomError('某些工作失败', err);
}
doMoreWork();
}
try {
doWork();
} catch (err) {
// |err| 是来自 |doSomeWork| 还是 |doMoreWork|?
}
不幸的是,上面的解决方案非常繁琐,因为需要创建自己的 CustomError
。更糟糕的是,没有任何开发工具能够为意外的异常提供有帮助的诊断信息,因为没有关于如何正确表示这些错误的共识。
今天,写如下代码很常见:
const hasOwnProperty = Object.prototype.hasOwnProperty;
if (hasOwnProperty.call(object, 'foo')) {
// `object` 拥有属性 `foo`。
}
或者使用库,这些库提供了简单版本的 Object.prototype.hasOwnProperty
,比如 has 或 lodash.has。
通过 Object.hasOwn
提案,我们可以简单地写成:
if (Object.hasOwn(object, 'foo')) {
// `object` 拥有属性 `foo`。
}
Object.hasOwn
已经在 V8 v9.3 中启用,可以通过 --harmony-object-has-own
标志使用,且我们即将在 Chrome 中上线。
Object.hasOwn
支持