重磅更新!ECMAScript 2024 全新特性全面解析

大厂技术  高级前端  Node进阶点击上方 程序员成长指北,关注公众号
回复1,加入高级Node交流群

转自:OSC开源社区(oschina2013)

2024 年 6 月 26 日,第 127 届 ECMA 大会正式批准了 ECMAScript 2024 语言规范,这意味着它现在正式成为最新 ECMAScript 标准。

c4511c51a65b791f86aca76dbc11c6ae.png

下面就来看看 ECMAScript 2024 都有哪些新特性吧!

1. Group By 分组

Map.groupBy() 将可迭代对象分组为一个新的 MapMap中的 key由回调提供:

Map.groupBy([0, -5, 3, -4, 8, 9], x => Math.sign(x))
3ece8b14d8536f1c3094d115234302ee.png

还有 Object.groupBy() 生成一个 对象 而不是 Map

Object.groupBy([0, -5, 3, -4, 8, 9], x => Math.sign(x))
9270f0fe6033786397531e0b5430d159.png

Math.sign() 方法用于判断一个数的符号,即正负性

兼容性

17cc4fd06023b460a996c2864af1c5a9.png ca0550c3019aff0ce7d8d0edfdf89623.png

2. Promise.withResolvers

Promise.withResolvers() 提供了一种创建我们想要解决的 Promise 的新方法:

const { promise, resolve, reject } = Promise.withResolvers();

兼容性

d7afd56d3a51f036dbc5d8ed31eb0542.png

3. 正则表达式标志 /v

如果使用 v 标志, RegExp.prototype.unicodeSets 的值为 true ;否则, false 。14b8c0233b41156d536c32e1a3d89649.png

809d1dc0ea4a276edaf83f0ff97423b2.png

v 标志是 u 标志的“升级”,可启用更多与 Unicode 相关的功能。(“v”是字母表中“u”之后的下一个字母。)由于 u 和 v 以不兼容的方式解释相同的正则表达式,因此使用这两个标志会产生 SyntaxError 。

使用 v 标志,不光可以继承 u 标志所有的功能,还支持以下功能:

  1. 字符串集合三种集合操作,差异、相交和联合

/^[\w--[a-g]]$/v.test('a') // false 
 /^[\w--[a-g]]$/v.test('i') // true
 

/[\p{ASCII}&&\p{Letter}]/v; // ASCII letters


/[[\p{ASCII}&&\p{Letter}]\p{Number}]/v; // ASCII letters, or any digit
  1. 字符串的属性,允许使用\p 转义的多节点属性

"Did you see the 👩🏿‍❤️‍💋‍👩🏾 emoji?".match(/\p{RGI_Emoji}/v). // ["👩🏿‍❤️‍💋‍👩🏾"]
  1. 集合中的多节点字符串,使用一个新的 \q 转义

/[\r\n\q{\r\n|NEWLINE}]/v; // Matches \r, \n, \r\n or NEWLINE

v模式代码示例参考[1]

4. ArrayBuffers 和 SharedArrayBuffers 的新功能

4.1 ArrayBuffers 就地调整大小

> const buf = new ArrayBuffer(2, { maxByteLength: 32 });
> buf.byteLength
> 2

> buf.resize(12)
> buf.byteLength
> 12

不允许超过预先定义的 maxByteLength , resize 可增大也可以减小

4.2  ArrayBuffers  .transfer() 可转移

原先也是可以进行转移的,之前是通过参数进行配置的,现在对外提供了一个 transfer 函数调用,更加方便了

const original = new ArrayBuffer(16);
const transferred = original.transfer();

detached 属性是一个访问器属性,其 set 访问器函数是 undefined,这意味着你只能读取此属性。该属性的值在创建 ArrayBuffer 时设置为 false。如果 ArrayBuffer 已被传输[2],则该值将变为 true,这将使该实例从其底层内存中分离。一旦缓冲区被分离,它就不再可用。

4.3 SharedArrayBuffers

SharedArrayBuffers 可以调整大小,但它们只能增长而不能缩小。它们不可转移,因此无法获取 ArrayBuffers 所获取的方法 .transfer() 。

5 新增了两个确保字符串格式正确的函数

5.1 String.prototype.isWellFormed

isWellFormed() 让你能够测试一个字符串是否是格式正确的(即不包含单独代理项)。

“单独代理项(lone surrogate)”是指满足以下描述之一的 16 位码元:

它在范围 0xD800 到 0xDBFF 内(含)(即为前导代理),但它是字符串中的最后一个码元,或者下一个码元不是后尾代理。

它在范围 0xDC00 到 0xDFFF 内(含)(即为后尾代理),但它是字符串中的第一个码元,或者前一个码元不是前导代理。

const strings = [
  // 单独的前导代理
  "ab\uD800",
  "ab\uD800c",
  // 单独的后尾代理
  "\uDFFFab",
  "c\uDFFFab",
  // 格式正确
  "abc",
  "ab\uD83D\uDE04c",
];

for (const str of strings) {
  console.log(str.isWellFormed());
}
// 输出:
// false
// false
// false
// false
// true
// true

5.2 String.prototype.toWellFormed

`String`[3] 的 toWellFormed() 方法返回一个字符串,其中该字符串的所有单独代理项[4]都被替换为 Unicode 替换字符 U+FFFD。

const strings = [
  // 单独的前导代理
  "ab\uD800",
  "ab\uD800c",
  // 单独的后尾代理
  "\uDFFFab",
  "c\uDFFFab",
  // 格式正确
  "abc",
  "ab\uD83D\uDE04c",
];

for (const str of strings) {
  console.log(str.toWellFormed());
}
// Logs:
// "ab�"
// "ab�c"
// "�ab"
// "c�ab"
// "abc"
// "ab😄c"

6. Atomics.waitAsync()

Atomics.waitAsync() 静态方法异步等待共享内存的特定位置并返回一个 `Promise`[5]

与 [Atomics.wait()](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Atomics/wait "Atomics.wait( "Atomics.wait()")") 不同,waitAsync 是非阻塞的且可用于主线程。

以上就是 ECMAScript 2024 (ES15) 标准发布的主要内容。

Reference

-《快来看看 ECMAScript 2024 (ES15) 发布了什么新特性》- 前端蛋卷

https://github.com/tc39/ecma262/releases

Node 社群



我组建了一个氛围特别好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你对Node.js学习感兴趣的话(后续有计划也可以),我们可以一起进行Node.js相关的交流、学习、共建。下方加 考拉 好友回复「Node」即可。

   “分享、点赞、在看” 支持一波👍
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值