ECMAScript 2023(ES14)中的所有新功能

​JavaScript在持续发展,近期ECMAScript 14中发布添加了一批新功能,让我们一起来探索一下今年对JavaScript开发人员的新功能。时间的车轮又过去了一年,随之而来的是JavaScript的新官方版本:ECMAScript 2023,也被称为ECMAScript 14。今年的改进包括对数组的添加和对ECMAScript文件中shebang的支持,以及对弱集合的符号键的扩展。这些变化主要是对语言的细化改进,而不是什么重大的变革。然而,这些改变的综合效果是继续推进语言的发展。下面是JavaScript在2023年的新功能概览演示。

理解规范

ECMAScript规范是一份令人印象深刻的文档,既是开发人员和教育者的基本参考,也是JavaScript引擎实现者的官方技术规范。这是一个相当平衡的过程,规范处理得很好。由于包含了大量的信息,它作为语言的用户指南可能有些繁琐。

关于规范的另一个要了解的事情是,它实际上是一个活动的文档,在语言在实际应用中使用时会不断发展。通常情况下,新功能在被用户社区非正式接受后才会被添加到官方规范中。例如,今年的shebang语法就是一个例子。一旦一个功能被规范所编码和标准化,规范就成为进一步创新该功能的新稳定基础。

有时,ECMAScript规范引入了开创性的想法。一个例子是采用了受C#影响的/语法。async/await 作为一种语言,JavaScript已经从复制粘贴的鼠标悬停效果的时代飞跃而来。ECMAScript规范过程在这一演变中起到了巨大的作用。

现在,让我们来看看在2023年引入的JavaScript的新功能。

数组原型对象的toSorted方法

让我们从新的数组方法toSorted()开始。toSorted()具有与sort()相同的签名,但它创建一个新的数组,而不是在原数组上进行操作。下面是列表1中的新数组方法Array.prototype.sort()与toSorted()的对比。

列表1. sort()与toSorted()的对比

let arr = [5,4,2,3,1]
arr === arr.sort(); // true - [1, 2, 3, 4, 5]
​
arr === arr.toSorted(); // false - [1, 2, 3, 4, 5]

toSorted()和sort()一样,也接受一个可选的参数,即比较函数。例如,我们可以使用toSorted()创建一个按降序排列的新数组,如列表2所示。

列表2. 使用比较函数

const numbers = [10, 5, 2, 7, 3, 9, 1, 6, 4]; 
const sortedNumbers = numbers.toSorted((a, b) => { return b - a; 
}); 
console.log(sortedNumbers); // [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

还需要注意的是,toSorted()也可以应用于对象数组。在这种情况下,您必须提供一个使用对象上的数据的比较函数,因为对象没有自然的排序方式。您可以在列表3中看到一个示例。

列表3. 使用对象的toSorted()

// Comparing objects
const objects = [{ name: "John", age: 30 }, { name: "Jane", age: 25 }, { name: "Bill", age: 40 }, { name: "Mary", age: 20 }];
const sortedObjects = objects.toSorted((a, b) => {return a.name.localeCompare(b.name); 
});
console.log(sortedObjects);
//[{"name":"Bill","age":40},{"name":"Jane","age":25},{"name":"John","age":30},{"name":"Mary","age":20}]

与toSorted()和sort()类似,toReversed()是reverse()的复制版本。列表4中有一些使用toReversed()的快速示例,包括将其应用于带有比较函数的对象。

列表4. 使用toReversed()

["a","b","c","d","e"].toReversed(); // ['e', 'd', 'c', 'b', 'a']

Array.prototype.with新的with()方法允许您根据索引修改单个元素,并返回一个新的数组。因此,如果您知道索引和新值,这个方法非常方便。请注意,with()是set()的复制伴侣。列表5给出了一个简单的示例。

列表5. 使用with()和set()方法的示例

const arr4 = ["I", "am", "the", "Walrus"];
​
// Replace the string "Walrus" with "Octopus".
const newArr4 = arr4.with(3, "Ape Man");
​
console.log(newArr4);

Array.prototype.findLast方法允许您从数组中获取最后一个匹配元素的实例。如果没有找到匹配的元素,则返回undefined。在列表6中给出了一个简单的示例,我们从数组中获取最后一个偶数。

列表6. 使用findLast()方法的示例

onst arr = [54, 34, 55, 75, 98, 77];
​
const lastEvenIndex = arr.findLast((element) => {return element % 2 === 0;
});
​
console.log(lastEvenIndex); // 98

findLast()还支持传入一个" "来设置上下文。也就是说,第二个参数将告诉第一个参数函数关键字将指向什么。您可以在列表7中看到这一点,在列表7中,我们使用一个自定义对象来查找第一个可以被5.thisArgthis整除的元素。

列表7.使用thisArg

const arr6 = [54, 34, 55, 75, 98, 77];
const myObject = {testCase: 5};
const lastEvenIndex = arr5.findLast((element) => {return element % myObject.testCase === 0;
}, myObject);
​
console.log(lastEvenIndex); // 75

findLastIndex()的工作方式与之完全相同,只不过它提供的是元素匹配的索引,而不是元素本身。例如,列表8显示了如何查找可被6整除的最后一个元素的索引。

列表8.使用findLastIndex()查找元素的索引

const arr = [54, 34, 55, 75, 98, 77];
arr.findLastIndex(x => x % 6 === 0); // 0

Array.prototype.toSpliced到目前为止,我们描述的所有方法也适用于。最后一个新的数组方法toSpliced()只存在于。该方法是JavaScript数组操作的复制版本——这是一种熟悉的瑞士军刀。拼接TypedArrayArraytoSpliced () ()假设我们有一个颜色数组,我们需要在中间插入两个新颜色(粉色和青色)。可以在清单9中看到这一点。记住,这会创建一个新数组,而不是修改原来的数组。

列表9.操作中的toSpliced()

const arr = ["red", "orange", "yellow", "green", "blue", "purple"]; const newArr = arr.toSpliced(2, 1, "pink", "cyan"); console.log(newArr); 
// ["red", "orange", "pink", "cyan", "green", "blue", "purple"]
console.log(newArr[3]);
// 'cyan'
console.log(arr[3]);
// ‘green’

shebang是一种老式的Unix说法,表示一个标签后面跟着一个感叹号(其中“bang”是“!”的俚语)。自古以来,在文件开头的注释就会告诉shell这里是一个可执行脚本,以及使用什么引擎来运行它。

列表10.一个典型的bash脚本

#!/bin/bash
​
echo "Hello, world!"

你可以像列表10中的示例那样直接运行一个文件,使用../hello.sh命令。在JavaScript中,你也可以做类似的操作,如列表11所示。

列表11. JavaScript中的Shebang: hello.js

#!/usr/bin/env node
​
console.log("Hello, world!");

列表11中的代码告诉操作系统使用node程序来运行这个脚本。现在,你可以直接输入命令来运行它。如果没有Shebang注释,../hello.js这样是行不通的。Shebang支持是规范中的一个功能更新,已经在多个上下文中非官方地采用和实现。ECMAScript 14中的最后一个新功能是扩展了可以用作弱引用集合键的内容。与日常JavaScript用法相比,弱引用集合有点晦涩。在编程中,弱引用是指如果它本来应该被垃圾回收,那么它将被丢弃。换句话说,单独的弱引用不足以阻止垃圾回收算法将引用目标丢弃(这就是为什么它是弱引用)。你可以在这里了解更多关于弱引用以及它们何时有用的信息。这里也有一个很好的讨论。 ES14允许在集合中使用大多数符号作为键,而以前只能使用对象。如果你想知道什么是符号,你并不孤单。你可以在这里了解更多关于符号的信息。这个新功能本质上使得在集合中使用弱引用更加容易,通过放宽可以用作键的限制。列表12中展示了一个简单的示例。

列表12. 在WeakMap中使用符号作为键

var map = new WeakMap(); // create a weak map
function useSymbol(symbol){doSomethingWith(symbol);var called = map.get(symbol) || 0;called++; // called one more timeif(called > 2) console.log(“Called more than twice”);map.set(symbol, called);
}
​
let mySymbol = Symbol(“FooBar”);
useSymbol(mySymbol);
useSymbol(mySymbol);
useSymbol(mySymbol);
​
delete mySymbol; // No live references are left to mySymbol, so we can count on the garbage collector eliminating the entry in the weakMap when it runs (eventually)

列表12是根据上面链接的StackOverflow答案进行修改的。在这个示例中,目的是允许从外部调用者调用计数器,并在没有引用时销毁映射条目。代码本身无法知道何时不再需要引用,如果使用普通的Map,将会导致内存泄漏。这是因为即使在调用它的客户端不再需要它之后,代码仍然会保持对引用的持有。在这种情况下,我们使用WeakMap,可以依靠垃圾回收在没有对键符号的引用时删除映射条目。

结论

尽管2023年对于JavaScript来说相对较平静,但ECMAScript 14添加了一些有用的功能,并使官方规范与现实世界保持同步。在下一个版本中,我们将会看到一系列的变化,包括一个全新的Temporal API用于处理日期和时间。

作者:Matthew Tyson

更多技术干货请关注公众号“云原生数据库

squids.cn,目前可体验全网zui低价RDS,免费的迁移工具DBMotion、SQL开发工具等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/37508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

与微服务平台厂家联手,一起实现高效率发展!

在如今的快节奏发展社会中,只有利用科技的力量,才能与市场接轨,了解市场和客户需求,最终实现更快速的发展。如果还停留在闭门造车的环境中,不“引进来,走出去”,那势必会与成功擦肩而过。微服务…

clickHouse部署

docker仓库地址 https://hub.docker.com/ 1、docker环境搭建 # 1.先安装yml yum install -y yum-utils device-mapper-persistent-data lvm2 # 2.设置阿里云镜像 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 3.查…

【芯片前端】auto_testbench的大版本升级——加入简单预期与自动比对

前言 前文提要: 【芯片前端】一键生成简易版本定向RTL验证环境的脚本——auto_verification_rtl脚本_尼德兰的喵的博客-CSDN博客 【芯片前端】可能是定向验证的巅峰之作——auto_testbench_autotestbench_尼德兰的喵的博客-CSDN博客 工具路径: auto…

广告聚合平台能为APP开发者提供哪些帮助

应用变现平台是帮助开发者优化广告策略并最终获得更多收入的综合途径。在广告变现过程中,接入单一的广告联盟,变现效率不高,并且开发者需要花费许多精力进行筛选和管理,难免会应接不暇,而聚合广告平台的出现则一定程度…

GloVe、子词嵌入、BPE字节对编码、BERT相关知识(第十四次组会)

GloVe、子词嵌入、BPE字节对编码、BERT相关知识(第十四次组会) Glove子词嵌入上游、下游任务监督学习、无监督学习BERTGlove 子词嵌入 上游、下游任务 监督学习、无监督学习 BERT

springboot使用configtree读取树形文件目录中的配置

文章目录 一、介绍二、演示环境三、项目演示1. 配置文件2. 导入配置3. 检测配置属性 四、应用场景五、源码解析1. ConfigTreeConfigDataLocationResolver2. ConfigTreeConfigDataLoader 六、总结 一、介绍 相信绝大多数使用springboot开发项目的朋友们在添加配置时&#xff0c…

【从零学习python 】23. Python中集合(set)的使用方法和常见操作

文章目录 set的使用创建格式添加元素移除元素set常见方法列表练习 进阶案例 set的使用 集合(set)是一个无序的不重复元素序列,可以使用大括号 { } 或者 set() 函数创建集合。 注意:创建一个空集合必须用 set() 而不是 { }&#x…

母婴即时零售行业数据可视化分析

对新晋父母来说,很多母婴用品如同一位贴心的助手,为他们的宝宝提供温暖和呵护。从婴儿床垫到可爱的拼图玩具,每一件用品都是为宝宝的成长和发展量身定制。对于繁忙的父母们而言,这些用品不仅帮助照顾孩子,更是为他们减…

一百五十一、Kettle——Linux上安装的kettle8.2开启carte服务以及配置子服务器

一、目的 kettle8.2在Linux上安装好可以启动界面、并且可以连接MySQL、Hive、ClickHouse等数据库后,准备在Linux上启动kettle的carte服务 二、实施步骤 (一)carte服务文件路径 kettle的Linux运行的carte服务文件是carte.sh (二…

手机两个卡槽的正确使用方法,您用对了吗?

手机上有两个卡槽,该如何搭配才能使话费降到最低?你又是怎么搭配的? 这篇文章小编就来告诉你,如何在不换号的情况下,将自己的话费降到最低。 首先卡槽一我们就用8元保号套餐。 卡槽二,我们就可以办理一张…

【C语言】每日一题(寻找数组的中心下标)

寻找数组的中心下标,链接奉上 方法 暴力循环前缀和 暴力循环 ​​​​​​​思路: 依旧是我们的老朋友,暴力循环。 1.可以利用外层for循环,循环变量为数组下标,在循环内分别求出下标左边与右边的sum 2.在边界时讨论&…

JAVA 鼠标控制与键盘输入控制

核心类:java.awt.Robot 该类是JDK定义的电脑系统的抽象类,可以用来模拟实现鼠标点击与键盘输入等信息 简单实现一个自动抢票代码: Robot rt new Robot();//可以认为是操作间隔的停歇时间,比如等待页面加载,等弹框内容展示等 r…

vue tree禁用和多选变为单选

禁用的话和后台协调一下&#xff0c;参数中多返回一个disabled 多选变单选 在tree结构中加入一个方法 <el-treeaccordion:data"deptOptions":props"defaultProps"show-checkbox:expand-on-click-node"false":filter-node-method"filte…

windows bat 脚本实现FTP自动下载上传

windows bat 脚本实现FTP自动下载上传 1. 自动下载 # 示例&#xff1a;实现自动下载 echo Off echo open 192.168.137.102>>ftp.txt echo admin>>ftp.txt echo admin12345>>ftp.txt echo lcd D:\>>ftp.txt echo cd /admin/1>>ftp.txt echo bin…

k8s整合istio配置gateway入口、配置集群内部服务调用管理

一、 istio gateway使用demo kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata:name: ngdemo-gatewaynamespace: ssx spec:selector:istio: ingressgateway # use Istio default gateway implementationservers:- port:numbe…

码银送书第五期《互联网广告系统:架构、算法与智能化》

广告平台的建设和完善是一项长期工程。例如&#xff0c;谷歌早于2003年通过收购Applied Semantics开展Google AdSense 项目&#xff0c;而直到20年后的今天&#xff0c;谷歌展示广告平台仍在持续创新和提升。广告平台是负有营收责任的复杂在线平台&#xff0c;对其进行任何改动…

Mysql—修改用户密码(重置密码)

Mysql—修改用户密码&#xff08;重置密码&#xff09; 1、登录mysql 1 2 [rootlocalhost ~]# mysql -uroot -p123456 [rootlocalhost ~]# mysql -hlocalhost -uroot -p123456 如果忘记密码&#xff0c;则跳过MySQL的密码认证过程。步骤如下&#xff1a; 修改Mysql配置文件…

TypeScript教程(三)变量声明

一、变量声明 变量是一种使用方便的占位符&#xff0c;用于引用计算机内存地址&#xff0c;可以将变量看做存储数据的容器 命名规则&#xff1a; 1.变量名称可以包含数字和字母 2.除了下划线_和美元$符号外&#xff0c;不能包含其他特殊字符&#xff0c;包括空格 3.变量名…

使用GUI Guider工具在MCU上开发嵌入式GUI应用 (1) - GUI Guider简介及安装

使用GUI Guider工具在MCU上开发嵌入式GUI应用 (1) - GUI Guider简介及安装 受限于每篇文章最多只能贴9张图的限制&#xff0c;这个教程被拆分成了多篇文章连载发布&#xff0c;完整目录结构如下图x所示。后续会发布完整教程的pdf文件&#xff0c;敬请期待。 图x 完整教程文档…

机器学习 | Python实现KNN(K近邻)模型实践

机器学习 | Python实现KNN(K近邻)模型实践 目录 机器学习 | Python实现KNN(K近邻)模型实践基本介绍模型原理源码设计学习小结参考资料基本介绍 一句话就可以概括出KNN(K最近邻算法)的算法原理:综合k个“邻居”的标签值作为新样本的预测值。更具体来讲KNN分类过程,给定一个训…