ES2022 有什么新特性? es2019新特性
yuyutoo 2024-10-20 13:12 2 浏览 0 评论
新版本的 ECMA Script 将在今年六月成为标准。让我们来看看 ES2022 有什么新特性?
新功能
1. error.cause
这是一个关于错误捕获的特性,下文代码列举了过去我们常使用的三种捕获错误的方式。
async function doJob() {
const rawResource = await fetch('/test')
.catch(err => {
// 下面三种是过去常用的一些捕获错误的代码方式
// 1. throw new Error('下载资源失败: ' + err.message);
// 2. const wrapErr = new Error('下载资源失败');
// wrapErr.cause = err;
// throw wrapErr;
// 3. class CustomError extends Error {
// constructor(msg, cause) {
// super(msg);
// this.cause = cause;
// }
// }
// throw new CustomError('下载资源失败', err);
})
}
await doJob(); // => Uncaught Error: 下载资源失败: Failed to fetch
复制代码
过去的捕获错误的写法比较复杂,而且开发人员对具体使用哪个属性来获取错误的上下文没有达成共识。
新特性是在 Error 构造函数上添加一个附加选项参数 cause,其值将作为属性分配给错误实例。因此,可以将错误链接起来。
async function doJob() {
const rawResource = await fetch('/test')
.catch(err => {
throw new Error('下载资源失败', { cause: err });
});
}
try {
await doJob();
} catch (e) {
console.log(e);
console.log('Caused by', e.cause);
}
// Error: 下载资源失败
// Caused by TypeError: Failed to fetch
复制代码
2. Top-level await
我们现在可以在模块的顶层使用 await, 并且不再需要配合 async函数使用。
Top-level await 可以在实际生产中有以下用途。
- 动态加载模块
const strings = await import(`/i18n/${navigator.language}`);
复制代码
这允许模块使用运行时值来确定依赖关系。这对于开发/生产拆分、国际化、环境拆分等非常有用。
- 资源初始化
const connection = await dbConnector();
复制代码
允许模块表示资源。
- 依赖回退
let jQuery;
try {
jQuery = await import('https://cdn-a.com/jQuery');
} catch {
jQuery = await import('https://cdn-b.com/jQuery');
}
复制代码
依赖发生故障时,可以回退到旧版本,防止程序崩溃。
3. Object.hasOwn(obj, propKey)
Object.hasOwn() 方法是比 Object.prototype.hasOwnProperty() 方法更加 便捷 和 安全 的策略。
例如 Object.create(null) 创建一个不继承自 Object.prototype 的对象,是 hasOwnProperty 方法无法访问。
Object.create(null).hasOwnProperty("foo")
// Uncaught TypeError: Object.create(...).hasOwnProperty is not a function
复制代码
Object.hasOwn(obj, propKey) 使用案例。
let object = { foo: false }
Object.hasOwn(object, "foo") // true
let object2 = Object.create({ foo: true })
Object.hasOwn(object2, "foo") // false
let object3 = Object.create(null)
Object.hasOwn(object3, "foo") // false
复制代码
4. RegExp match indices
正则表达式,即 /i /m /g 之后,在匹配模式上新加入了 /d,使用 /d 之后,当我们再使用exec() 方法时,返回值会增加一个新的属性 indices。
简单回顾下exec() 方法。
相比于常见的 search() test()而言,exec() 匹配字符串的信息更丰富,它返回一个数组,其中存放匹配的结果,如果未找到匹配,则返回值为 null
let regx = /a+(?<Z>z)?/g;
let string = "xaaaz"
let result = regx.exec(string);
// ['aaaz', 'z', index: 1, input: 'xaaaz', groups: {Z:'z'}]
复制代码
(?<name>)是 ES 2018 加入的正则语法,允许我们把部分正则内容进行 命名 并且 分组,上述例子中,/a+(?<Z>z)?/g表示匹配至少一个 a 以及 0 个或者 1 个 z ,其中包含一个命名为 Z 的捕获组,配合 exec() 方法使用时,我们可以直接获取到捕获组的信息:result.groups,如果正则中没用使用捕获组的正则语法,则 groups 为 undefined
尽管 exec() 返回值提供了 index 属性 来展示首次匹配的索引位置,groups 属性 提供了捕获组的信息,但在一些更高级的场景中,这些信息可能并不足够。例如,语法高亮显示 的实现不仅需要匹配的索引,还需要单个捕获组的开始和结束索引,即上述例子中 Z 捕获组的索引信息。
新特性中,使用 /d匹配模式时,exec() 方法的返回值会增加一个新的属性 indices。
const re = /a+(?<Z>z)?/d;
const s = "xaaaz";
console.log("匹配结果:", re.exec(s));
//['aaaz', 'z', index: 1, input: 'xaaaz', groups: {Z:'z'}, indices: [[1,5],[4,5]]
复制代码
indices属性包含了捕获组的信息,其中,[ 1 , 5 ] 为 aaaz 全部字符串的匹配信息,[ 4 , 5 ] 为 Z 捕获组的匹配索引信息。
5. New members of classes
- 简易变量声明
class 支持在 constructor 外部直接声明变量,过去我们必须在内部声明。
class Cat {
gender = 'female'
}
let cat = new Cat()
cat.gender // female
复制代码
- 私有变量和私有方法
封装是面向对象编程的核心原则之一。它通常使用可见性修饰符来实现,例如 private or public。
class 的最近改动里加入了 #,用来将类中的变量、方法或访问器标记为私有,从外部访问私有化的内容,会直接报错。
class Cat {
#name = 'kitty'
gender = 'female'
setName = () => {
this.#name = 'jack'
console.log(this.#name)
}
#setGender = () => {
this.gender= 'male'
}
}
let cat = new Cat()
cat.#name // SyntaxError
cat.gender // 'female'
cat.setName() // 'jack'
cat.#setGender // SyntaxError
复制代码
- 私有字段的存在性检查
由于尝试访问对象上不存在的私有字段会报错从而引发程序异常,因此需要能够检查对象是否具有给定的私有字段。
class 引入了关键词 in 来解决访问私有变量直接报错的问题。
class Example {
#field
static isExampleInstance(object) {
return #field in object;
}
}
const ex = new Example()
Example.isExampleInstance(ex) // true
Example.isExampleInstance({}) // false
复制代码
isExampleInstance 方法可以判断 object 是否包含 #field。
6. at()
这个特性过去我们聊过了,# JS即将发布数组的4个新特性,学会了拿去吹牛
.at()支持我们读取给定索引处的元素。它可以接受负索引来从给定数据类型的末尾读取元素。
过去我们需要这样来获取数组末尾元素:
const arr = [1,2,3,4,5];
arr[arr.length-1] // 5
复制代码
现在 at() 可以轻松完成任务:
const arr = [1,2,3,4,5];
arr.at(-1) // 5
复制代码
代码的语义会更直观更清爽,非常的方便!
支持类型:
- String
- Array
- Typed Array
作者:导航前端团队
链接:https://juejin.cn/post/7073285958791069704
来源:稀土掘金
相关推荐
- 史上最全的浏览器兼容性问题和解决方案
-
微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...
-
- 平面设计基础知识_平面设计基础知识实验收获与总结
-
CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...
-
2025-02-21 16:01 yuyutoo
- 写作排版简单三步就行-工具篇_作文排版模板
-
和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...
- 写一个2048的游戏_2048小游戏功能实现
-
1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...
- 今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……
-
最近的天气暖和得让很多小伙伴们喊“热”!!! 昨天的气温到底升得有多高呢?你家有没有榜上有名?...
- CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式
-
之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...
- 你的自我界限够强大吗?_你的自我界限够强大吗英文
-
我的结果:A、该设立新的界限...
- 行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?
-
行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...
-
- 让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
-
去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...
-
2025-02-21 16:00 yuyutoo
- 今年国家综合性消防救援队伍计划招录消防员15000名
-
记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...
- 一起盘点最新 Chrome v133 的5大主流特性 ?
-
1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...
- 竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使
-
style="text-align:center;"data-mce-style="text-align:...
- 学物理能做什么?_学物理能做什么 卢昌海
-
作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...
-
- 你不知道的关于这只眯眼兔的6个小秘密
-
在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...
-
2025-02-21 16:00 yuyutoo
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)