当前位置:首页 > 科技  > 软件

ECMAScript 2024 正式发布,新特性一览!

来源: 责编: 时间:2024-06-28 17:12:30 315观看
导读2024 年 6 月 26 日,第 127 届 ECMA 大会正式批准了 ECMAScript 2024 语言规范,这意味着它现在正式成为最新 ECMAScript 标准。图片下面就来看看 ECMAScript 2024 都有哪些新特性吧!Promise.withResolvers()Object.group

2024 年 6 月 26 日,第 127 届 ECMA 大会正式批准了 ECMAScript 2024 语言规范,这意味着它现在正式成为最新 ECMAScript 标准。vw228资讯网——每日最新资讯28at.com

图片图片vw228资讯网——每日最新资讯28at.com

下面就来看看 ECMAScript 2024 都有哪些新特性吧!vw228资讯网——每日最新资讯28at.com

  • Promise.withResolvers()
  • Object.groupBy / Map.groupBy
  • String:isWellFormed() / toWellFormed()
  • ArrayBuffer:resize / transfer
  • Atomics.waitAsync()
  • 正则表达式 v 标志

Promise.withResolvers()

Promise.withResolvers() 允许创建一个新的 Promise,并同时获得 resolve 和 reject 函数。vw228资讯网——每日最新资讯28at.com

Promise.withResolvers() 等同于以下代码,不过代码会更简洁:vw228资讯网——每日最新资讯28at.com

let resolve, reject;const promise = new Promise((res, rej) => {  resolve = res;  reject = rej;});

通常,当创建一个新的 Promise 时,会传递一个执行器函数给 Promise 构造函数,这个执行器函数接收两个参数:resolve 和 reject 。但在某些情况下,可能想要在 Promise 创建之后仍然能够访问到这两个函数。这就是 Promise.withResolvers() 的用武之地。vw228资讯网——每日最新资讯28at.com

使用 Promise.withResolvers() 的例子:vw228资讯网——每日最新资讯28at.com

const { promise, resolve, reject } = Promise.withResolvers();    // 在这里可以使用 resolve 和 reject 函数  setTimeout(() => resolve('成功!'), 8000);    promise.then(value => {    console.log(value); // 输出: 成功!  });

使用 Promise.withResolvers() 关键的区别在于resolve 和 reject函数现在与 Promise 本身处于同一作用域,而不是在执行器中被创建和一次性使用。这可能使得一些更高级的用例成为可能,例如在重复事件中重用它们,特别是在处理流和队列时。这通常也意味着相比在执行器内包装大量逻辑,嵌套会更少。这个方法对于那些需要更细粒度控制 Promise 的状态,或者在 Promise 创建后仍然需要访问 resolve 和 reject 函数的场景来说非常有用。vw228资讯网——每日最新资讯28at.com

浏览器支持:vw228资讯网——每日最新资讯28at.com

图片图片vw228资讯网——每日最新资讯28at.com

Object.groupBy() / Map.groupBy()

Object.groupBy() 和 Map.groupBy() 方法用于数组分组。vw228资讯网——每日最新资讯28at.com

假设有一个由表示水果的对象组成的数组,需要按照颜色进行分组。以前可以使用forEach循环来实现,代码如下:vw228资讯网——每日最新资讯28at.com

const fruits = [    { name: "Apple", color: "red" },    { name: "Banana", color: "yellow" },    { name: "Cherry", color: "red" },    { name: "Lemon", color: "yellow" },    { name: "Grape", color: "purple" },  ];const fruitsByColor = {};  fruits.forEach(fruit => {    const color = fruit.color;    if (!fruitsByColor[color]) {      fruitsByColor[color] = [];    }    fruitsByColor[color].push(fruit);  }); console.log(fruitsByColor);

输出结果如下:vw228资讯网——每日最新资讯28at.com

图片图片vw228资讯网——每日最新资讯28at.com

也可以使用reduce方法:vw228资讯网——每日最新资讯28at.com

const fruitsByColor = fruits.reduce((acc, fruit) => {    const color = fruit.color;    if (!acc[color]) {      acc[color] = [];    }    acc[color].push(fruit);    return acc;  }, {});

无论哪种方式,代码都略显繁琐。每次都要检查对象,看分组的 key 是否存在,如果不存在,则创建一个空数组,并将项目添加到该数组中。vw228资讯网——每日最新资讯28at.com

Object.groupBy()

可以通过以下方式来使用新的Object.groupBy方法,代码更简洁:vw228资讯网——每日最新资讯28at.com

const fruitsByColor = Object.groupBy(fruits, (fruit) => fruit.color);

需要注意,使用Object.groupBy方法返回一个没有原型(即没有继承任何属性和方法)的对象。这意味着该对象不会继承Object.prototype上的任何属性或方法,例如hasOwnProperty或toString等。虽然这样做可以避免意外覆盖Object.prototype上的属性,但也意味着不能使用一些与对象相关的方法。vw228资讯网——每日最新资讯28at.com

const fruitsByColor = Object.groupBy(fruits, (fruit) => fruit.color);console.log(fruitsByColor.hasOwnProperty("red"));// TypeError: fruitsByColor.hasOwnProperty is not a function

在调用Object.groupBy时,传递给它的回调函数应该返回一个字符串或 Symbol 类型的值。如果回调函数返回其他类型的值,它将被强制转换为字符串。vw228资讯网——每日最新资讯28at.com

浏览器支持:vw228资讯网——每日最新资讯28at.com

图片图片vw228资讯网——每日最新资讯28at.com

Map.groupBy()

Map.groupBy和Object.groupBy的功能一样,只是返回的结果类型不同。Map.groupBy返回一个 Map 对象,而Object.groupBy返回一个普通对象。vw228资讯网——每日最新资讯28at.com

const fruits = [    { name: "Apple", color: "red" },    { name: "Banana", color: "yellow" },    { name: "Cherry", color: "red" },    { name: "Lemon", color: "yellow" },    { name: "Grape", color: "purple" },  ];const fruitsByColor = Map.groupBy(fruits, (fruit) => fruits.color);

这里根据水果颜色进行了分组,输出结果如下:vw228资讯网——每日最新资讯28at.com

图片图片vw228资讯网——每日最新资讯28at.com

可以通过 Map 的 get 方法来来获取分组分组结果:vw228资讯网——每日最新资讯28at.com

fruitsByColor.get("red");// [{"name": "Apple", "color": "red"}, {"name": "Cherry", "color": "red"}]

浏览器支持:vw228资讯网——每日最新资讯28at.com

String:isWellFormed() / toWellFormed()

String.prototype.isWellFormed()

isWellFormed() 用于检查一个 UTF-16 编码的字符串是否包含孤立的代理项(即未与另一个代理项配对的高代理或低代理)。UTF-16使用代理对来表示Unicode中超过基本多文种平面的字符。一个有效的UTF-16字符串应该只包含正确配对的代理对或单独的BMP字符。vw228资讯网——每日最新资讯28at.com

下面来看一个例子vw228资讯网——每日最新资讯28at.com

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

如果传递的字符串格式不正确, encodeURI 会抛出错误。可以通过使用 isWellFormed() 在将字符串传递给 encodeURI() 之前测试字符串来避免这种情况。vw228资讯网——每日最新资讯28at.com

const illFormed = "https://example.com/search?q=/uD800";try {  encodeURI(illFormed);} catch (e) {  console.log(e); // URIError: URI malformed}if (illFormed.isWellFormed()) {  console.log(encodeURI(illFormed));} else {  console.warn("Ill-formed strings encountered."); // Ill-formed strings encountered.}

isWellFormed() 函数的使用场景主要包括以下几种情况:vw228资讯网——每日最新资讯28at.com

  • 数据验证:当你从外部源(如用户输入、文件、网络请求等)接收字符串时,你可能想要验证这些字符串是否包含有效的UTF-16编码。如果字符串包含孤立的代理项(即没有配对的高代理或低代理),那么它可能不是有效的UTF-16字符串,这可能会导致后续处理时出错。
  • 文本处理:在处理文本数据(如搜索、排序、转换等)时,确保文本是有效编码的非常重要。如果文本包含错误的编码,那么处理结果可能会是不正确的或不可预测的。
  • 网络传输:当你通过网络发送或接收文本数据时,确保数据的编码是正确的至关重要。错误的编码可能导致数据在传输过程中被损坏,或者在接收端无法正确解析。
  • 数据库存储:在将文本数据存储到数据库之前,验证其编码的正确性也是一个好习惯。这可以确保数据的完整性和可读性,并避免在后续查询或处理时出现问题。
  • 用户界面显示:在用户界面中显示文本时,确保文本是有效编码的也很重要。错误的编码可能导致文本无法正确显示,或者显示出不正确的字符。

浏览器支持:vw228资讯网——每日最新资讯28at.com

图片图片vw228资讯网——每日最新资讯28at.com

String.prototype.toWellFormed()

toWellFormed() 方法返回一个字符串,其中该字符串的所有单独代理项都被替换为 Unicode 替换字符 U+FFFD。vw228资讯网——每日最新资讯28at.com

toWellFormed() 迭代字符串的码元,并将任何单独代理项替换为 Unicode 替换字符 U+FFFD。这确保了返回的字符串格式正确并可用于期望正确格式字符串的函数,比如 encodeURI。由于引擎能够直接访问字符串的内部表示,与自定义实现相比 toWellFormed() 更高效。vw228资讯网——每日最新资讯28at.com

const strings = [  // 单独的前导代理  "ab/uD800",  "ab/uD800c",  // 单独的后尾代理  "/uDFFFab",  "c/uDFFFab",  // 格式正确  "abc",  "ab/uD83D/uDE04c",];for (const str of strings) {  console.log(str.toWellFormed());}// 输出:// "ab�"// "ab�c"// "�ab"// "c�ab"// "abc"// "ab 
                

本文链接:http://www.28at.com/showinfo-26-97282-0.htmlECMAScript 2024 正式发布,新特性一览!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何获取请求的进度,并展示给用户看?

下一篇: 工程化视角的 Kotlin Multiplatform 核心解读及优化

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对“势”的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾“低价”口号。而过去与他们错位竞争的拼多多,靠
  • 荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    2022年第一季度临近尾声,在该季度内,许多品牌陆续发布自己的最新产品,让大家从全新的角度来了解当今的手机技术。手机是电子设备中,更新迭代十分迅速的一款产品,基
Top