ECMAScript 2022 正式发布


ECMAScript 2022 现已获得 ECMA International 的批准。ECMAScript 是标准化的 JavaScript 语言,于 1997 年发布了第一版,现已发展成为世界上使用最广泛的通用编程语言之一。

本 Ecma 标准定义了 ECMAScript 2022 Language,是 ECMAScript 语言规范的第 13 版。

ECMAScript 2022 主要包含内容有:

  • 引入了 top-level await,允许在模块的顶层使用关键字;
// awaiting.mjs
import { process } from "./some-module.mjs";
const dynamic = import(computedModuleSpecifier);
const data = fetch(url);
export const output = process((await dynamic).default, await data);
// usage.mjs
import { output } from "./awaiting.mjs";
export function outputPlusValue(value) { return output + value }

console.log(outputPlusValue(100));
setTimeout(() => console.log(outputPlusValue(100), 1000);
  • 新的 class elements:公共和私有实例字段、公共和私有静态字段、私有实例方法和访问器以及私有静态方法和访问器;
  • 类内的静态块,用于执行每个类的评估初始化;
  • #x in obj语法,用于测试对象上是否存在私有字段;
class X {
#foo;
method() {
console.log(this.#foo)
}
}
  • 通过/d flag 的正则表达式匹配索引,为匹配的子字符串提供开始和结束索引;
const re1 = /a+(?<Z>z)?/d;

// indices are relative to start of the input string:
const s1 = "xaaaz";
const m1 = re1.exec(s1);
m1.indices[0][0] === 1;
m1.indices[0][1] === 5;
s1.slice(...m1.indices[0]) === "aaaz";

m1.indices[1][0] === 4;
m1.indices[1][1] === 5;
s1.slice(...m1.indices[1]) === "z";

m1.indices.groups["Z"][0] === 4;
m1.indices.groups["Z"][1] === 5;
s1.slice(...m1.indices.groups["Z"]) === "z";

// capture groups that are not matched return `undefined`:
const m2 = re1.exec("xaaay");
m2.indices[1] === undefined;
m2.indices.groups["Z"] === undefined;
  • Error对象的cause属性,可用于记录错误的因果链;
async function doJob() {
const rawResource = await fetch('//domain/resource-a')
.catch(err => {
throw new Error('Download raw resource failed', { cause: err });
});
const jobResult = doComputationalHeavyJob(rawResource);
await fetch('//domain/upload', { method: 'POST', body: jobResult })
.catch(err => {
throw new Error('Upload job result failed', { cause: err });
});
}

try {
await doJob();
} catch (e) {
console.log(e);
console.log('Caused by', e.cause);
}
// Error: Upload job result failed
// Caused by TypeError: Failed to fetch
  • Strings、Arrays 和 TypedArrays 的at方法,允许相对索引;
function at(n) {
	// ToInteger() abstract op
	n = Math.trunc(n) || 0;
	// Allow negative indexing from the end
	if (n < 0) n += this.length;
	// OOB access is guaranteed to return undefined
	if (n < 0 || n >= this.length) return undefined;
	// Otherwise, this is just normal property access
	return this[n];
}

const TypedArray = Reflect.getPrototypeOf(Int8Array);
for (const C of [Array, String, TypedArray]) {
Object.defineProperty(C.prototype, "at",
{ value: at,
writable: true,
enumerable: false,
configurable: true });
}
  • 以及Object.hasOwn,这是Object.prototype.hasOwnProperty的一个更简洁方便的替代方法。
let hasOwnProperty = Object.prototype.hasOwnProperty

if (hasOwnProperty.call(object, "foo")) {
console.log("has property foo")
}

简化为: 

if (Object.hasOwn(object, "foo")) {
console.log("has property foo")
}

具体可查看:

  • https://262.ecma-international.org/13.0/index.html
  • https://www.ecma-international.org/wp-content/uploads/ECMA-262_13th_edition_june_2022.pdf

相關推薦

2021-11-18

特性: 实验性功能:在夜间版本支持  Node.js 运行 ECMAScript 模块从 node_modules 支持 lib新的 Awaited 类型和对 Promise 对象的优化模板字符串可以用作判断符引入 es2022 模块(可以在异步函数之外使用 await)移

2023-04-20

ECMAScript 2023 的最终版本预计将于今年 6 月底发布。最新举行的一次 TC39 会议基本已经确定 了 ECMAScript 2023 的新功能列表,预计不会再有任何重大的编辑更改。 本文整理了在 2023 年进入 Stage 4 的几个提案。按照 TC39 的运

2022-06-06

错误修正:Python 协议的自动检测不正确 错误修正:ECMAScript 模块不能与最近的 Node.js 版本一起使用 平台更新 官方软件包现在可用于以下 Linux 发行版: Fedora 36 RHEL 9 Ubuntu 22.04 Docker 镜像已经更新,以使用最新的语言版

2022-09-24

类,而不得不依赖我们自己的实现)。通过采用更现代的ECMAScript标准,我们可以开始努力使Leaflet与现代JavaScript库所期望的相一致。 标准化的模块。当我们发布Leaflet v1时,JavaScript世界的格局非常不同,充满了竞争性的模块标

2023-08-26

p;(Inline Variable Refactoring) TypeScript 5.2 实现了即将推出的 ECMAScript 功能,称为装饰器元数据。此功能的关键思想是使装饰器可以轻松地在其使用的任何类上创建和使用元数据。 每当使用装饰器函数时,它们现在都可以访问其上

2022-06-20

Interface Service Provider WRY Chromium Backend Binding Rust Node.js (ECMAScript) Underlying Engine Rust V8 (C/C++) FLOSS Yes No Multithreading Yes Yes Bytecode Delivery Yes No Multiple Windows Yes Yes Auto Updater Yes Yes1 Custom App Icon Yes Yes Windows Binary Yes Yes macOS

2023-04-11

0.7.12 已发布。njs 以 nginx 插件的方式存在,它是 JavaScript/ECMAscript 的子集,实现了大部分的 JavaScript 语言功能,没有完全遵从 ECMAScript 标准,同时抛弃了 JavaScript 比较难懂的部分。njs 不通过 V8 引擎实现,而是通过一个更小、能

2022-04-15

0.7.3 已发布,njs 以 nginx 插件的方式存在,它是 JavaScript/ECMAscript 的子集,实现了大部分的 JavaScript 语言功能,没有完全遵从 ECMAScript 标准,同时抛弃了 JavaScript 比较难懂的部分。njs 不通过 V8 引擎实现,而是通过一个更小、能

2023-09-15

ems()方法。 njs 以 nginx 插件的方式存在,它是 JavaScript/ECMAscript 的子集,实现了大部分的 JavaScript 语言功能,没有完全遵从 ECMAScript 标准,同时抛弃了 JavaScript 比较难懂的部分。njs 不通过 V8 引擎实现,而是通过一个更小、能

2022-07-21

0.7.6 已发布,njs 以 nginx 插件的方式存在,它是 JavaScript/ECMAscript 的子集,实现了大部分的 JavaScript 语言功能,没有完全遵从 ECMAScript 标准,同时抛弃了 JavaScript 比较难懂的部分。njs 不通过 V8 引擎实现,而是通过一个更小、能

2022-03-09

ll, C shell, CL (OS/400), Clipper, CLIPS, CoffeeScript, DCL, DiBOL, Dylan, ECMAScript, Eiffel, Elm, EXEC, F#, Factor, GML, Hack, Harbour, Haxe, Icon, IDL, Io, J#, Korn shell, Ladder Logic, LiveCode, LPC, ML, Monkey, OCaml, OpenCL, Oz, Processing, Q, Racket, REXX, Ring, S-PLUS, Scheme, SPARK, Tcl

2023-02-09

0.7.10 已发布。njs 以 nginx 插件的方式存在,它是 JavaScript/ECMAscript 的子集,实现了大部分的 JavaScript 语言功能,没有完全遵从 ECMAScript 标准,同时抛弃了 JavaScript 比较难懂的部分。njs 不通过 V8 引擎实现,而是通过一个更小、能

2023-03-12

0.7.11 已发布。njs 以 nginx 插件的方式存在,它是 JavaScript/ECMAscript 的子集,实现了大部分的 JavaScript 语言功能,没有完全遵从 ECMAScript 标准,同时抛弃了 JavaScript 比较难懂的部分。njs 不通过 V8 引擎实现,而是通过一个更小、能

2022-10-27

0.7.8 已发布。njs 以 nginx 插件的方式存在,它是 JavaScript/ECMAscript 的子集,实现了大部分的 JavaScript 语言功能,没有完全遵从 ECMAScript 标准,同时抛弃了 JavaScript 比较难懂的部分。njs 不通过 V8 引擎实现,而是通过一个更小、能