Ecma International 批准 ECMAScript 2024:有哪些新内容?

992 阅读2分钟

1_Naae67Ssp2makfMYy2Tx6w.webp 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 文档。