ES 2022 正式发布!有哪些新特性?

2022 年 6 月 22 日,第 123 届 Ecma 大会批准了 ECMAScript 2022 语言规范[1],这意味着它现在正式成为标准。

1 ECMAScript 2022编辑

本次发布的编辑有:

  • Shu-yu Guo[2]

  • Michael Ficarra[3]

  • Kevin Gibbons[4]

2 ECMAScript 2022有什么新内容?

2.1 新的class成员

class MyClass {instancePublicField = 1;static staticPublicField = 2;#instancePrivateField = 3;static #staticPrivateField = 4;#nonStaticPrivateMethod() {}get #nonStaticPrivateAccessor() {}set #nonStaticPrivateAccessor(value) {}static #staticPrivateMethod() {}static get #staticPrivateAccessor() {}static set #staticPrivateAccessor(value) {}static {// 静态初始化代码块}
}
  • 可以通过以下方式创建公共属性 (public slots) :

    • 实例公有属性[5]

    • 静态公有属性[6]

  • 私有属性[7]是新的,可以通过以下方式创建:

    • 私有属性 (实例私有属性[8] and 静态私有属性[9])

    • 私有方法和访问器 (非静态[10] 和 静态[11])

  • 静态初始化代码块[12]

2.2 使用 in 操作符检查私有属性

这个操作也被成为 “人性化检查私有属性的方式”. 后面的表达式就是示例 –他检查 obj 是否有一个私有属性 #privateSlot:

#privateSlot in obj

这是个完整例子

class ClassWithPrivateSlot {#privateSlot = true;static hasPrivateSlot(obj) {return #privateSlot in obj;}
}const obj1 = new ClassWithPrivateSlot();
assert.equal(ClassWithPrivateSlot.hasPrivateSlot(obj1), true
);const obj2 = {};
assert.equal(ClassWithPrivateSlot.hasPrivateSlot(obj2), false
);

请注意,我们只能在声明它的范围(scope)内引用私有属性。

更多关于私有属性检查的资料[13]

2.3 模块中的顶层await

我们现在可以在模块的顶层使用 await 并且不再需要输入异步函数或方法

// my-module.mjs
const response = await fetch('https://example.com');
const text = await response.text();
console.log(text);

更多顶层await资料[14]

2.4 error.cause

Error及其子类现在可以让我们指定哪个错误导致了当前错误:

try {// Do something
} catch (otherError) {throw new Error('Something went wrong', {cause: otherError});
}

导致当前错误的 err 会显示在调用堆栈中。而且可以通过 err.cause进行访问

更多关于error.cause[15]

2.5 可索引值方法 .at()

方法 .at() 让我们可以读取给定索引处的元素 (就像 []) 而且支持负数 (与 []不同):

> ['a', 'b', 'c'].at(0)
'a'
> ['a', 'b', 'c'].at(-1)
'c'

以下“可索引”类型具有 .at()方法:

  • string

  • Array

  • 所有的Typed Array : Uint8Array 等.

2.6 RegExp match 指数

如果我们给正则添加标志 /d , 使用它生成匹配对象,就会记录每个组捕获的开始和结束索引(A 行和 B 行):

const matchObj = /(a+)(b+)/d.exec('aaaabb');assert.equal(matchObj[1], 'aaaa'
);
assert.deepEqual(matchObj.indices[1], [0, 4] // (A)
);assert.equal(matchObj[2], 'bb'
);
assert.deepEqual(matchObj.indices[2], [4, 6] // (B)
);

更多关于RegExp match indices[16]

2.7 Object.hasOwn(obj, propKey)

Object.hasOwn(obj, propKey) 提供了一个安全的方式检查对象 obj 是否有键为 propKey的自有(非继承的) 属性:

const proto = {protoProp: 'protoProp',
};
const obj = {__proto__: proto,objProp: 'objProp',
}assert.equal('protoProp' in obj, true); // (A)assert.equal(Object.hasOwn(obj, 'protoProp'), false); // (B)
assert.equal(Object.hasOwn(proto, 'protoProp'), true); // (C)

请注意,in 检测继承的属性(A 行),而 Object.hasOwn() 仅检测自己的属性(B 和 C 行)。

3 FAQ

3.1  JavaScript 和 ECMAScript有什么区别?

  • 长话短说版——通俗地说:

    • JavaScript 是由各种平台(浏览器、Node.js、Deno 等)实现的编程语言。

    • ECMAScript是他的标准, 如 the ECMAScript language specification[17]所描述。

  • 长话长说版, 参阅 section “Standardizing JavaScript” in “JavaScript for impatient programmers”[18].

3.2 谁设计ECMAScript?TC39 – Ecma Technical Committee 39

ECMAScript 由标准组织 Ecma International 的技术委员会 39 (TC39) 设计。

其成员严格来说是公司:Adobe、Apple、Facebook、Google、Microsoft、Mozilla、Opera、Twitter 等。 也就是说,通常是竞争对手的公司正在合作开发 JavaScript。

每两个月,TC39 都会召开由成员指定的代表和受邀专家参加的会议。 这些会议的记录在 GitHub 仓库[19]中是公开的。

在会议之外,TC39 还与 JavaScript 社区的各种成员和团体合作。

3.3 新特性是如何被记入ECMAScript 中的? 它们经历了 TC39 的那些流程?

新的ECMAScript 特性必须选TC39提交提案,会经历以下几个阶段:

  • 从阶段 0(使 TC39 能够对提案发表评论)

  • 到第 4 阶段(提议的功能已准备好添加到 ECMAScript 中)

一旦一个特性达到第 4 阶段,它就会被计划添加到 ECMAScript 中。ECMAScript 版本的功能集通常在每年的 3 月冻结。 在截止日期之后达到第 4 阶段的功能将添加到明年的 ECMAScript 版本中

有关更多信息,请参阅section “The TC39 process” in “JavaScript for impatient programmers”[20].

3.4 ECMAScript 的版本有多重要?

自从 TC39 流程建立以来,ECMAScript 版本的重要性已经大大降低。 现在真正重要的是提议的功能处于哪个阶段:一旦达到第 4 阶段,就可以安全地使用它。 但即便如此,你仍然需要检查你的目标引擎是否支持它。

3.5 我最喜欢/关注的xx提案什么进展了?

如果你想知道各种提议的功能处于什么阶段,请参阅 TC39 提议库[21]。

3.6 在哪里可以查看给定 ECMAScript 版本中添加了哪些功能?

有几个地方我们可以查看每个 ECMAScript 版本中的新内容:

  • 在 “JavaScript for impatient programmers”, 有一个章节 列出了每个 ECMAScript 版本中新增内容[22]。同时还附上了解释的连接。

  • TC39 库有一个表格,其中包含已完成的提案[23],其中说明了它们已经(或将要)引入的 ECMAScript 版本。

  • ECMAScript 语言规范的“介绍”[24]部分列出了每个 ECMAScript 版本的新特性。

  • ECMA-262 有一个release页面[25].

3.7 免费的JavaScript 在线书籍

  • “JavaScript for impatient programmers (ES2022 edition)”[26] 涵盖直到ECMAScript 2022 的 JavaScript

  • “Deep JavaScript: Theory and techniques”[27] 更深入地涵盖语言基础。

参考资料

[1]第 123 届 Ecma 大会批准了 ECMAScript 2022 语言规范: https://www.ecma-international.org/news/ecma-international-approves-new-standards-6/

[2]Shu-yu Guo: https://twitter.com/_shu

[3]Michael Ficarra: https://twitter.com/smooshMap

[4]Kevin Gibbons: https://twitter.com/bakkoting

[5]实例公有属性: https://exploringjs.com/impatient-js/ch_classes.html#instance-public-fields

[6]静态公有属性: https://exploringjs.com/impatient-js/ch_classes.html#static-public-fields

[7]私有属性: https://exploringjs.com/impatient-js/ch_classes.html#private-slots

[8]实例私有属性: https://exploringjs.com/impatient-js/ch_classes.html#instance-private-fields

[9]静态私有属性: https://exploringjs.com/impatient-js/ch_classes.html#static-private-methods-accessors-fields

[10]非静态: https://exploringjs.com/impatient-js/ch_classes.html#private-methods-accessors

[11]静态: https://exploringjs.com/impatient-js/ch_classes.html#static-private-methods-accessors-fields

[12]静态初始化代码块: https://exploringjs.com/impatient-js/ch_classes.html#class-static-initialization-blocks

[13]更多关于私有属性检查的资料: https://exploringjs.com/impatient-js/ch_classes.html#private-slot-checks

[14]更多顶层await资料: https://exploringjs.com/impatient-js/ch_modules.html#top-level-await

[15]更多关于error.cause: https://exploringjs.com/impatient-js/ch_exception-handling.html#error.cause

[16]更多关于RegExp match indices: https://exploringjs.com/impatient-js/ch_regexps.html#regexp-match-indices

[17]the ECMAScript language specification: https://tc39.es/ecma262/

[18]section “Standardizing JavaScript” in “JavaScript for impatient programmers”: https://exploringjs.com/impatient-js/ch_history.html#standardizing-javascript

[19]GitHub 仓库: https://github.com/tc39/tc39-notes/

[20]section “The TC39 process” in “JavaScript for impatient programmers”: https://exploringjs.com/impatient-js/ch_history.html#tc39-process

[21]请参阅 TC39 提议库: https://github.com/tc39/proposals/

[22]列出了每个 ECMAScript 版本中新增内容: https://exploringjs.com/impatient-js/ch_new-javascript-features.html

[23]已完成的提案: https://github.com/tc39/proposals/blob/main/finished-proposals.md

[24]“介绍”: https://tc39.es/ecma262/#sec-intro

[25]release页面: https://github.com/tc39/ecma262/releases

[26]“JavaScript for impatient programmers (ES2022 edition)”: https://exploringjs.com/impatient-js/

[27]“Deep JavaScript: Theory and techniques”: https://exploringjs.com/deep-js/

[28]参考原文: https://2ality.com/2022/06/ecmascript-2022.html

- EOF -

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

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

相关文章

联想(Lenovo)小新310经典版进bios方法

1,找到novo按钮。 2,在关机的状态下桶一下小孔,不用任何操作,电脑进入bios选择界面。转载于:https://www.cnblogs.com/senior-engineer/p/6761457.html

C#中的匿名类型

这节来讲一下C#中的匿名类型。匿名类在C#中,我们可以不去显示的声明一个类,而是通过匿名类去临时声明一个类结构去帮助我们去完成一些功能。声明一个匿名类,我们可以像下面这样做:var Anonymousnew {name"charles",year…

MySQL之MHA高可用集群

目录 一、MHA概述 1.1.MHA 是什么 1.2.MHA 的组成 1.3.MHA 的特点 二、MHA搭建准备 2.1.实验思路 三、MHA搭建 3.1配置主从复制 3.2.安装 MHA 软件 3.3.故障模拟 3.4.故障修复 四、总结 一、MHA概述 1.1.MHA 是什么 1.MHA(MasterHigh Availability&…

Tensorflow之安装

1.fellow the instruction of https://www.tensorflow.org/install/install_linux#installing_with_anaconda 2.anaconda安装,修改~/.bash_profile为 export PATH~/anaconda2/bin:/usr/local/cuda/bin:$PATHexport LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRAR…

2、Saltstack的数据系统

一、Grainsgrains是salt用来收集minion端底层系统信息的接口。比如,操作系统type、域名 、IP地址、内存及其他相关系统属性信息等。存储在minion端,用于保存minion端数据信息。minion启动时才加载grains信息,所以他时静态的,Grain…

配置中心 App Configuration (一):轻松集成到Asp.Net Core

写在前面在日常开发中,我这边比较熟悉的配置中心有,携程Apollo,阿里Nacos(配置中心,服务治理一体)之前文章:Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触总体来说,Apollo和Nacos社区都比较活跃&#…

stop-hbase.sh一直处于等待状态

今天关闭HBase时,输入stop-hbase.sh一直处于等待状态 解决方法: 先输入:hbase-daemon.sh stop master 再输入:stop-hbase.sh就可以关闭HBase集群了。 转载于:https://www.cnblogs.com/lijinze-tsinghua/p/8667761.html

shell编程100例

1、编写hello world脚本 #!/bin/bash# 编写hello world脚本echo "Hello World!"2、通过位置变量创建 Linux 系统账户及密码 #!/bin/bash# 通过位置变量创建 Linux 系统账户及密码#$1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数 useradd "$1" …

sqlserver 分页

select top 10 numComImg.* from( select row_number() over(order by id asc) as rownumber,* from (select * FROM [TCCLine].[dbo].[CLine_CommonImage]) as comImg)as numComImg where rownumber>40select top 10 * --10 为页大小from [TCCLine].[dbo].[CLine_CommonIma…

详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good

目录 前言现象源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口的具体应用常用HandlerMethodArgumentResolver介绍常用HandlerMethodReturnValueHandler介绍本文开头现象…

instancing render

当要绘制同一个东西很多次的时候,最简单的想法可能是循环调用glDrawArrays(),但这样会造成性能的损失。因为当显卡在渲染一个物体的时候,可能并不需要太多时间,但系统会花大量的时间,频繁的调用draw命令,再…

对不起,我不是一个自律的人

大家好,我是 🐟💨。前天,星球 的一位大学生朋友问了我几个问题:你大学时如何安排每日的时间?为什么能学那么多技术?你会学习到很晚吗?你是如何保持自律的?我觉得这几个问…

保证接口数据安全的10种方案

前言 大家好,我是程序汪,互联网项目需要特别注意数据安全,如果你简历上是互联网类型项目,安全方面肯定要能说出个一二三,下面分享下这方面的干货,大家可以记住几条,面试时好说道说道 我们日常…

Html5本地存储LocalStorage

HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储sessionStorage - 针对一个 session 的数据存储在浏览器中打开审查元素(如谷歌F12),在Resources下面可以查看里面的数据。 localStorage提供了几…

python 中的os模块

python os模块 Python os 模块提供了一个统一的操作系统接口函数一、对于系统的操作1、os.name 当前使用平台其中 ‘nt’ 是 windows,’posix’ 是linux 或者 unix2、os.sep输出操作系统的特定的路径分隔符。Win下为“\”,Linux下为“/”3、os.pathsep 输…

java第一季2.2

2019独角兽企业重金招聘Python工程师标准>>> 标识符: 是给变量类方法命名的符号、标识符开头可以_、字母、$命名,不可以用数字命名。关键字不可命名,大小写区分。不可以用非法字符 变量:变量类型。变量名。变量值。如&…

读《华为数字化转型之道》

数字化转型应该很多人都听过,但如果你做过 ToB 软件,听得更多的是信息化,那信息化和数字化是什么关系呢?下面用一个小例子来说说我的理解。记得刚上初中的时候,平时测验、考试的试卷,都是人工在板上进行刻写…

Thrift基本原理及使用

参考文章RPC 基本原理与 Apach Thrift 初体验 RPC基本原理 RPC(Remote Procedure Call),远程过程调用,大部分的RPC框架都遵循如下三个开发步骤: 1. 定义一个接口说明文件:描述了对象(结构体)、对象成员、接口方法等一系列信息&am…

01-H5语义化标签

转载于:https://www.cnblogs.com/Zeki/p/5901399.html

JSON 解析的两种方法

今天帮朋友看了下JSON解析结果 eval解析JSON中的注意点在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数。 2. 使用Function对象来进行返回解析。 使用eval函数来解析,并且使用jquery的each方法来遍历 用jque…