2024 年 6 月 26 日,第 127 届 Ecma 大会批准了 ECMAScript 2024 语言规范,这意味着它现在正式成为标准。
ECMAScript 2024 有什么新功能?
对同步可迭代对象进行
Map.groupBy()将可迭代项分组到 Map 条目中,这些条目的键由回调提供:
assert.deepEqual(
Map.groupBy([0, -5, 3, -4, 8, 9], x => Math.sign(x)),
new Map()
.set(0, [0])
.set(-1, [-5,-4])
.set(1, [3,8,9])
);
还有一种Object.groupBy()方式可以生成一个对象而不是 Map:
assert.deepEqual(
Object.groupBy([0, -5, 3, -4, 8, 9], x => Math.sign(x)),
{
'0': [0],
'-1': [-5,-4],
'1': [3,8,9],
__proto__: null,
}
);
有关在这两种方法之间进行选择的技巧以及更多示例,请参阅“探索 JavaScript”。
Promise.withResolvers()
Promise.withResolvers()提供了一种创建我们想要解决的 Promise 的新方法:
const { promise, resolve, reject } = Promise.withResolvers();
正则表达式/v
新的正则表达式标志/v(.unicodeSets)可实现以下功能:
-
Unicode 字符串属性的转义(😵💫由三个代码点组成):
// Previously: Unicode code point property `Emoji` via /u assert.equal( /^\p{Emoji}$/u.test('😵💫'), false ); // New: Unicode string property `RGI_Emoji` via /v assert.equal( /^\p{RGI_Emoji}$/v.test('😵💫'), true ); -
\q{}通过字符类中的字符串文字:> /^[\q{😵💫}]$/v.test('😵💫') true > /^[\q{abc|def}]$/v.test('abc') true -
字符类的集合运算:
> /^[\w--[a-g]]$/v.test('a') false > /^[\p{Number}--[0-9]]$/v.test('٣') true > /^[\p{RGI_Emoji}--\q{😵💫}]$/v.test('😵💫') false -
/i如果 Unicode 属性转义被否定,则改进匹配[^···]
ArrayBuffers和SharedArrayBuffers的新功能
ArrayBuffers 有两个新功能:
-
resize:重新调整大小(原来必须分配一个新的,并复制旧的):
const buf = new ArrayBuffer(2, {maxByteLength: 4}); // `typedArray` starts at offset 2 const typedArray = new Uint8Array(buf, 2); assert.equal( typedArray.length, 0 ); buf.resize(4); assert.equal( typedArray.length, 2 ); -
transfer:转移比复制更快
async function validateAndWriteSafeAndFast(arrayBuffer) { const owned = arrayBuffer.transfer(); // We have `owned` and no one can access its data via // `arrayBuffer` now because the latter is detached: assert.equal( arrayBuffer.detached, true ); // `await` pauses this function – which gives external // code the opportunity to access `arrayBuffer`. await validate(owned); await fs.writeFile("data.bin", owned); }
SharedArrayBuffers 可以调整大小,但只能增大而不能缩小。它们不可转移,因此无法获得该.transfer()方法ArrayBuffers。
确保字符串格式正确
两种新方法可以帮助我们确保字符串格式正确(相对于UTF-16代码单元):
isWellFormed()检查 JavaScript 字符串是否格式正确且不包含任何lone surrogate。toWellFormed()返回接收方的副本,其中每个单独的代理都被代码单元 0xFFFD 替换(表示具有相同数字的代码点,其名称为“替换字符”)。因此结果是格式正确的。
Atomics.waitAsync() #
Atomics.waitAsync()让我们异步等待共享内存的更改。有关更多信息,请参阅MDN Web 文档。