前言

随着 Web 技术的日新月异,JavaScript 也在不断地吸收新的特性和技术,以满足日益复杂和多样化的开发需求。在 2024 年,JavaScript 迎来了一系列令人瞩目的新功能,这些功能不仅提升了开发者的效率,也极大地丰富了 Web 应用的表现力和交互性。

在接下来的内容中,我们将逐一介绍这些新功能,并探讨它们如何在实际开发中发挥作用,以及它们如何继续引领前端开发的未来。

Object.groupBy

它是一个新的 JavaScript 方法,它可以根据提供的回调函数返回的字符串值对给定可迭代对象中的元素进行分组。返回的对象具有每个组的单独属性,其中包含组中的元素的数组。

当我们想要根据数组中对象的一个或多个属性的名称对数组元素进行分类时,此方法非常有用。

语法

  1. Object.groupBy(items, callbackFn)

参数

  • items:一个将进行元素分组的可迭代对象
  • callbackFn:对可迭代对象中的每个元素执行的函数。它应该返回一个值,可以被强制转换成属性键(字符串或 symbol),用于指示当前元素所属的分组。该函数被调用时将传入以下参数:
    • element:数组中当前正在处理的元素
    • index:正在处理的元素在数组中的索引

返回值

一个带有所有分组属性的 null 原型对象,每个属性都分配了一个包含相关组元素的数组。

对数组中的元素进行分组

我们可能经常需要对数据库中的项目进行分组并通过 UI 将它们显示给用户。使用 Object.groupBy()就可以简化此类项目的分组。

比如有这样一堆数据:

  1. const arr = [
  2. { product: "iPhone X", quantity: 25, color: "black" },
  3. { product: "Huawei mate50", quantity: 6, color: "white" },
  4. { product: "xiaomi 13", quantity: 0, color: "black" },
  5. { product: "iPhone 13", quantity: 10, color: "white" },
  6. { product: "Huawei P50", quantity: 5, color: "black" },
  7. ]

然后我们希望将这些设备根据颜色进行分类

  1. const newArr = Object.groupBy(arr, (item) => item.color)
  2. console.log('【newArr】', newArr)

上面的代码按产品的属性值color对产品进行分组,每次调用回调函数时,都会返回与每个对象的属性(“黑色”或“白色”)相对应的键。然后使用返回的键对数组的元素进行分组。

有条件地对数组中的元素进行分组

还是上面的数据,如果我们想要分成iphone和国产品牌两类,可以这么来实现:

  1. const arr = [
  2. { product: "iPhone X", quantity: 25, color: "black" },
  3. { product: "Huawei mate50", quantity: 6, color: "white" },
  4. { product: "xiaomi 13", quantity: 0, color: "black" },
  5. { product: "iPhone 13", quantity: 10, color: "white" },
  6. { product: "Huawei P50", quantity: 5, color: "black" },
  7. ]
  8. const list = Object.groupBy(arr, (item) => {
  9. return item.product.includes('iPhone') ? 'iPhone' : '国产品牌'
  10. })
  11. console.log('【list】', list)

扩展

注意: Object.groupBy()最初是作为典型的数组方法实现的。它最初的用途是这样的:

  1. let myArray = [a, b, c]
  2. myArray.groupBy(callbackFunction)

然而,由于ECMAScript技术委员会在实现该方法 时遇到了Web 兼容性问题,因此他们决定将其实现为静态方法 ( )。

Object.groupBy()只需两个参数即可简化数组中对象分组的过程:数组本身和回调函数。

在过去,您必须编写一个自定义函数来对数组元素进行分组或从外部库导入分组方法。

可用性: Object.groupBy()现在所有主要浏览器平台都支持

正则表达式v标志

大家可能熟悉正则表达式 Unicode 标志 ( u),它允许启用对 Unicode 字符的支持。该v标志是u标志大部分功能的扩展。

它除了主要向后兼容该u标志之外,还引入了以下新功能:

交集运算符

交集运算符可以匹配两个字符集中必须存在的字符。其语法为[operand-one&&operand-two],其中&&表示交集运算符, operand-oneoperand-two表示各自的字符集。

  1. const str = 'My name is nanjiu'
  2. const strReg = /[[a-z]&&[^aeiou]]/gv
  3. const strArr = str.match(strReg)
  4. console.log('【strArr】', strArr)
  5. // 【strArr】 ['y', 'n', 'm', 's', 'n', 'n', 'j']
  • [a-z]上面的代码定义了一个匹配小写字母和非元音字符的交集的正则表达式[^aeiuo]
  • 运算&&符确保仅匹配两个集合共有的字符。
  • 这些gv标志启用全局搜索(查找所有匹配项)和正则表达式 v 模式。

差异运算符

差异运算符由两个连续的连字符 ( --) 表示,提供了一种在正则表达式中指定排除项的便捷方法。正则表达式引擎将忽略--后面的任何字符集

查找非 ASCII 表情符号字符:

  1. let myEmojis = ",,,☉‿⊙,:O";
  2. let myRegex = /[\p{Emoji}--\p{ASCII}]/gv;
  3. console.log(myEmojis.match(myRegex));
  4. // ["","",""]

可用性: 所有主要 JavaScript 环境都支持该v标志。

Promise.withResolvers()

Promise.withResolvers()是一个静态方法,它返回一个包含三个属性的对象:

  • promise:一个新的peomise对象
  • resolve:一个函数,用于解决该promise
  • reject:一个函数,用于拒绝该promise

很多时候,我们希望能够在promise外部访问resolvereject,在这之前我们都是通过以下形式解决的

  1. let resolve, reject;
  2. const promise = new Promise((res, rej) => {
  3. resolve = res;
  4. reject = rej;
  5. });

现在我们可以使用Promise.withResolvers来优雅的解决这个问题,并且resolvereject函数现在与 Promise 本身处于同一作用域,而不是在执行器中被创建和一次性使用。这可能使得一些更高级的用例成为可能,例如在重复事件中重用它们,特别是在处理流和队列时。这通常也意味着相比在执行器内包装大量逻辑,嵌套会更少。

  1. const getList = () => {
  2. const { resolve, reject, promise } = Promise.withResolvers()
  3. setTimeout(() => {
  4. const list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  5. resolve(list)
  6. }, 1000)
  7. return promise
  8. }
  9. getList().then(res => {
  10. console.log('【res】', res)
  11. })
  12. // 【res】 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

可用性: 适用于所有主要浏览器。

注意:Promise.withResolvers()尚未包含在 Node.js 中。因此,提供的示例可能无法在 Node.js 中按预期运行

四种新的非改变数组方法

通过复制改变数组引入了四种新的非改变数组方法: toReversed()toSpliced()toSorted()with()

前三个在功能上等同于它们的相似方法: reverse()splice()sort()

它们与对应方法的功能相似,区别在于新增的三个方法不会改变原数组

with()是第四个新的数组方法。它允许我们替换数组中特定位置的元素,同样不会改变原数组

  1. const groupList = [1, 2, 3, 4, 5, 6]
  2. const newGroupList = groupList.with(2, 'nanjiu')
  3. console.log('【newGroupList】', newGroupList)
  4. console.log('【groupList】', groupList)

可用性: 适用于所有主要的 JavaScript 运行时和浏览器中。

JavaScript 最新动态:2024 年新功能的更多相关文章

  1. JavaScript大杂烩13 - 总结ECMAScript 5新功能

    虽说这个标准已经出来很久了,所有的主流浏览器的最新版本也都支持了这些特性,但是很多的教程中并没有包含这个部分,这一节我们专门来总结一下这个标准中的新功能. Object的新方法 在最新的JavaScr ...

  2. Sitecore 9 您应该了解的所有新功能和变化

    信不信由你,当我谈论Sitecore时,我感到非常兴奋.这是一个充满潜力和机遇的伟大平台 如果你能想象一个刚刚进行过一次双重训练的人,一个特大号的星巴克,并且刚刚在创纪录的时间内完成了中国忍者勇士的障 ...

  3. .NET 6 预览版 7:新功能已完成 ,将专注于改进

    .NET 团队的项目经理 Richard Lander在宣布 .NET 6 Preview 7 时说:"这是 .NET 预览的又一季的结束.", 中文翻译:.NET 6 预览版 7 ...

  4. MySQL 5.7 Replication 相关新功能说明

    背景: MySQL5.7在主从复制上面相对之前版本多了一些新特性,包括多源复制.基于组提交的并行复制.在线修改Replication Filter.GTID增强.半同步复制增强等.因为都是和复制相关, ...

  5. unity5.0新功能

    原作者 只待苍霞 章节1: 先来两个最关心的新功能, 第一章先讲PBS, 第二章讲光影GI.说到PBS, 首先应该想到的是Unity自带的两个新的Shader, 分别是Standard以及Standa ...

  6. JavaScript DOM动态创建(声明)Object元素

    http://www.cnblogs.com/GuominQiu/archive/2011/04/01/2002783.html 一文提及“等整个页面加载完毕后,根据用户所选的阅读机类型,再用Java ...

  7. JPA2.1 中三个提升应用性能的新功能

    经常在网上看到开发者们抱怨 JPA 性能低下的帖子或文章,但如果仔细查看这些性能问题,常会发现导致问题的根本原因大致包括以下几个: 使用过多的 SQL 查询从数据库中获取所需的实体信息,即我们常说的n ...

  8. Red Hat Enterprise Linux 7的新功能

     简介红帽最新版本的旗舰平台交付显著增强的可用性. 性能和可靠性. 丰富的新功能为架构. 系统管理员和开发人员提供所需的资源以更高效地进行创新和管理.架构师: 红帽® 企业 Linux® 7 适合 ...

  9. 理解Javascript的动态语言特性

    原文:理解Javascript的动态语言特性 理解Javascript的动态语言特性 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行: ...

  10. Windows 10新功能

    Windows 10 中面向开发人员的新增功能 Windows 10 及新增的开发人员工具将提供新通用 Windows 平台支持的工具.功能和体验.在 Windows 10 上安装完工具和 SDK后, ...

随机推荐

  1. AspnetCore接入Nacos配置中心

    一.什么是nacos Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现.配置管理 ...

  2. 【3】opencv_contrib 4.3.0库配置+opencv安装

    相关文章: [1]windows下安装OpenCV(4.3)+VS2017安装+opencv_contrib4.3.0配置 [2]Visual Studio 2017同时配置OpenCV2.4 以及O ...

  3. C/C++ 使用CRC检测磁盘文件完整性

    当软件被开发出来时,为了增加软件的安全性,防止被破解,通常情况下都会对自身内存或磁盘文件进行完整性检查,以防止解密者修改程序,我们可以将exe与dll文件同时做校验,来达到相互认证的目的,解密者想要破 ...

  4. 体验 ABP 的功能和服务

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. ABP是一个全栈开发框架,它在企业解决方案的各个方面都有许多构建模块.在前面三章中 ...

  5. 戴尔R7920工作站利用PVE开启vGPU,实现工作站虚拟化(ShareStation)

    介绍 本文介绍了使用Proxmox VE(PVE) + DoraCloud,将一台Dell R7920图形工作站(配置有NVIDIA RTX A6000显卡)实现工作站虚拟化.可以满足多个设计用户同时 ...

  6. Mygin之错误恢复Recover中间件

    本篇是mygin这个系列的最后一篇.如果想自己动手实现一个类似Gin的Web框架,建议从 mgin第一篇开始, 总代码行数有效行数只有600多行 github源码 mygin 目的 实现错误处理机制 ...

  7. Hive中Lateral view用法

    1. lateral view 简介   hive函数 lateral view 主要功能是将原本汇总在一条(行)的数据拆分成多条(行)成虚拟表,再与原表进行笛卡尔积,从而得到明细表.配合UDTF函数 ...

  8. Android上的日志

    Android的日志机制和普通的Java项目有一些不一样, 这里记录一下 安卓内建的Log 安卓应用类型(在build.gradle里定义 android {...})的模块, 可以直接引用内建的an ...

  9. 【Unity3D】绘制物体外框线条盒子

    1 需求描述 ​ 点选物体.框选物体.绘制外边框 中介绍了物体投影到屏幕上的二维外框绘制方法,本文将介绍物体外框线条盒子绘制方法. 内框:选中物体后,绘制物体的内框(紧贴物体.并与物体姿态一致的内框盒 ...

  10. postgresql常见开发技巧

    1.数据类型 名字 描述 bigint 有符号 8 字节整数 bigserial 自增八字节整数 bit [ (n) ] 定长位串 bit varying [ (n) ] 变长位串 boolean 逻 ...