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

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

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

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

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

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

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

Promise.withResolvers()

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

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

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

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

使用 Promise.withResolvers() 的例子:fwX28资讯网——每日最新资讯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 函数的场景来说非常有用。fwX28资讯网——每日最新资讯28at.com

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

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

Object.groupBy() / Map.groupBy()

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

假设有一个由表示水果的对象组成的数组,需要按照颜色进行分组。以前可以使用forEach循环来实现,代码如下:fwX28资讯网——每日最新资讯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);

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

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

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

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

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

Object.groupBy()

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

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

需要注意,使用Object.groupBy方法返回一个没有原型(即没有继承任何属性和方法)的对象。这意味着该对象不会继承Object.prototype上的任何属性或方法,例如hasOwnProperty或toString等。虽然这样做可以避免意外覆盖Object.prototype上的属性,但也意味着不能使用一些与对象相关的方法。fwX28资讯网——每日最新资讯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 类型的值。如果回调函数返回其他类型的值,它将被强制转换为字符串。fwX28资讯网——每日最新资讯28at.com

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

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

Map.groupBy()

Map.groupBy和Object.groupBy的功能一样,只是返回的结果类型不同。Map.groupBy返回一个 Map 对象,而Object.groupBy返回一个普通对象。fwX28资讯网——每日最新资讯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);

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

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

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

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

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

String:isWellFormed() / toWellFormed()

String.prototype.isWellFormed()

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

下面来看一个例子fwX28资讯网——每日最新资讯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() 之前测试字符串来避免这种情况。fwX28资讯网——每日最新资讯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() 函数的使用场景主要包括以下几种情况:fwX28资讯网——每日最新资讯28at.com

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

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

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

String.prototype.toWellFormed()

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

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

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

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

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

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

标签:
  • 热门焦点
Top
Baidu
map