EcmaScript 2022中的新特性

ES2022 feature: class static initialization blocks

Everything new coming in ES2022

前言

从2015年起,Javascript每年都会在标准中加入一些新的特性。本篇文章将介绍几个已经到stage 4阶段的标准。一般来说,标准的提案需要经过4个阶段,第4个阶段是最后一个阶段。到达第4阶段的标准也意味着标准制定的工作已经基本结束。

现在我们来一起看一看ES2022中的新特性:

类的字段

类的共有属性和类的私有属性

在这个标准出来之前,我们在class中是这么定义一个属性的:

class ButtonToggle extends HTMLElement {constructor(){super();// public fieldthis.color = 'green'// private fieldthis._value = true;}toggle(){this.value = !this.value}
}const button = new ButtonToggle();
console.log(button.color);
// green - public fields are accessible from outside classesbutton._value = false;
console.log(button._value);
// false - no error thrown, we can access it from outside the class

在构造函数中,我们定义了2个属性color和_value。其中一个属性名以_开头,在现有的规范中我们一般这么命名来约定它是一个私有的变量,只能在类的内部对它进行赋值和读值。当然,目前这也仅仅只停留在约定层面,实际上我们在类的外面还是可以正常的操作这个属性的,程序并不会抛出异常。

在ES2022中,我们有一个更容易的方法来强制定义一个属性是共有的还是私有的。下面我们来看一个例子:

class ButtonToggle extends HTMLElement {color = 'green';#value = true;toggle(){this.#value = !this.#value;}
}
const button = new ButtonToggle();
console.log(button.color);
// green - public fields are accessible from outside classes// SyntaxError - cannot be accessed or modified from outside the class
console.log(button.#value);
button.#value = false;

首先,我们不再需要在构造函数中定义和初始化类的属性。其次,我们可以通过#符号来定义一个私有属性。与前面的例子不同的是,当我们在类的外部调用该私有属性时,程序会抛出异常。

类的私有的方法和getter/setters

与上面的例子类似,我们现在可以定义一个私有的方法和getter/setters方法,如下代码所示:

class ButtonToggle extends HTMLElement {color = 'green'#value = true;#toggle(){this.#value = !this.#value}set #setFalseValue(){this.#value = false;}
}
const button = new ButtonToggle();
// SyntaxError - cannot be accessed or modified from outside the class
button.#toggle();
// SyntaxError - cannot be accessed or modified from outside the class
button.#setFalseValue;

在代码中,我们将toggle方法用#标记变为私有的。这样一来,#toggle方法只能类的内部进行调用,否则也将抛出异常。

静态属性和方法

静态属性和方法这个概念在其它的编程语言中早就已经有了,Javascript也会在2022的标准中加入它。

在过往,静态属性或方法只能通过原型链来调用。如果我们想给类定义一个静态的方法,我们需要在类的外部进行声明,如下代码所示:

class ButtonToggle extends HTMLElement {// ... class body
}
ButtonToggle.toggle(){// static method define outside of the class body
}

在ES2022中提供了static关键字来允许开发人员在类中声明一个静态属性或方法,可以直接通过类来调用,如下代码所示:

class ButtonToggle extends HTMLElement {#value = true;static toggle(){this.#value = !this.#value}
}
// this will work
ButtonToggle.toggle();// SyntaxError - private static field
const button = new ButtonToggle();
button.toggle();

科学检查私有变量的方式

正如我们在上面的例子中看到的,如果我们尝试访问类之外的私有字段,它将抛出异常并且不会像访问公共字段那样返回 undefined。

我们可以在类中使用try/catch来检查字段是否存在,如下代码所示:

class ButtonToggle extends HTMLElement {// initialised as null#value = null;get #getValue(){if(!this.#value){throw new Error('no value');} return this.#value}static isButtonToggle(obj){try {obj.#getValue;return true;} catch {// could be an error internal to the getterreturn false; }}}

在上面的代码中,我们通过在isButtonToggle方法中加上try/catch来捕获当getValue不存在时的异常。但这样实现会在实际应用中遇到一个问题:try/catch中往往还有其它代码逻辑,当异常发生时,开发人员无法判断是由于属性不存在或者仅仅只是其它的异常。因此,ES2022提供了一个更加科学的方式来应对这种情况。可以来看下面的例子:

class ButtonToggle extends HTMLElement {// initialised as nullvalue = null;get #getValue(){if(!this.#value){throw new Error('no value');} return this.#value;}static isButtonToggle(obj){return #value in obj && #getValue in obj}}

类静态代码块

这里其实原文说了很多,我个人觉得弄复杂了。简单来讲,就是可以在类中直接用逻辑初始化静态属性。

class Translator {static translations = {yes: 'ja',no: 'nein',maybe: 'vielleicht',};static englishWords = [];static germanWords = [];static { // (A)for (const [english, german] of Object.entries(this.translations)) {this.englishWords.push(english);this.germanWords.push(german);}}
}

正则匹配返回下标

可以通过给正则表达式加上 d 字符来让返回的结果中带上匹配字符的开始下标和结束下标。我们来看一组返回的对比:

const fruits = 'Fruits: mango, mangosteen, orange'
const regex = /(mango)/g;// .exec
RegExp(regex).exec(fruits);
// [
//   'mango',
//   index: 8,
//   input: 'Fruits: mango, mangosteen, orange',
//   groups: undefined
// ]// matchAll
const matches = [...fruits.matchAll(regex)];
matches[0];
// [
//   'mango',
//   'mango',
//   index: 8,
//   input: 'Fruits: mango, mangosteen, orange',
//   groups: undefined
// ]

vs

const fruits = 'Fruits: mango, mangosteen, orange'
// /gd instead of the previous /g
const regex = /(mango)/gd;const matches = [...fruits.matchAll(regex)];
matches[0];// [
// "mango",
// "mango",
// groups: undefined
// index: 8
// indices:[]
//  [8, 13],
//  [8, 13]
// ]
// groups: undefined

可以看到加了 d 字符后,返回结果中多了indices字段,里面包含了命中的下标数组。

在async外部使用await

在这之前,await只能在async方法中使用。在ES2022的标准中,可以在async方法之外使用await。例如,我们可以推迟一个模块及其父模块的执行,直到导入其它内容。

这在一些场景中非常有用,例如你需要引入一个动态路径的资源:

// we need to get the appropriate translation keys based on the language
const translationKeys = await import(`/i18n/${navigator.language}`);

或者想要在一些资源引入失败时,替换成其它资源:

let jQuery;
try {jQuery = await import('https://cdn-a.com/jQuery');
} catch {jQuery = await import('https://cdn-b.com/jQuery');
}

EcmaScript 2022中的新特性相关推荐

  1. 2022 最新 JDK8 新特性 面试题

    2022 最新 JDK8 新特性 面试题 1.阐述 Java 7 和 Java 8 的区别 2.Java SE 8中最流行和最著名的最新功能是什么? 3.是什么使Java SE 8优于其他? 4.在J ...

  2. php v5.,PHP V5.3 中的新特性,第 5 部分- 从 PHP V5.2 升级到 PHP V5.3

    PHP V5.3 中的新特性,第 5 部分: 从PHP V5.2 升级到 PHP V5.3 1 2 3 4 5 下一页 PHP V5.3 将于不久后发布."PHP V5.3 中的新特性&qu ...

  3. Entity Framework 4.3 中的新特性

    原文地址:http://www.cnblogs.com/supercpp/archive/2012/02/20/2354751.html EF4.3于2月9号正式发布了,微软的EF小组最近一年开始发力 ...

  4. Spring 2.5:Spring MVC中的新特性

    转载说明:infoQ就是牛人多,看人家去年就把Spring2.5注视驱动的MVC写出来了,还是这么详细,我真是自叹不如,今天偶尔看到这篇文章非常认真的拜读了2遍,简直是茅厕顿开啊....\(^o^)/ ...

  5. iOS7 中的新特性

    iOS7 中的新特性 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳 ...

  6. JDK 8 中的新特性

    目录 JDK 8 中的新特性 JDK 8 中的新特性 JDK 版本说明 JDK 8 版本说明 Java Platform, Standard Edition 8 是一个拥有丰富特性的主要版本.本文档总 ...

  7. iOS 各版本中的新特性(What's New in iOS)- 目录翻译完成

    iOS 各版本中的新特性(What's New in iOS) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&q ...

  8. MS CRM 2011 RC中的新特性(4)——活动方面之批量编辑、自定义活动

    MS CRM2011中,在活动方面加强的新特性包括有:批量编辑.自定义活动类型以及定期约会. 本文将主要说明前两项,关于定期约会的内容,将在后续文章中进行介绍. 批量编辑活动记录: 在MS crm20 ...

  9. MS CRM 2011中的新特性(1)——界面部分

    MS crm2011中,在界面部分的调整包括有ribbon.入门窗格.最近访问列表.以及实例的表单方面的调整,下面一一介绍. Ribbon特性 MS CRM2011中,使用了Ribbon作为工作菜单的 ...

  10. 您应该知道Python 3.10中的新特性!

    Hello,大家好,我是Alex,欢迎来到每周博客! 这篇博客来给大家介绍一下Python 3.10的新特性. Python 3.10版本带来了一些很棒的新功能和改进. 结构模式匹配 结构模式匹配可以 ...

最新文章

  1. 例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard(a.k.a. Beiju Text), UVa 11988)
  2. 电子科大64年来首提Nature封面,邓旭团队为超疏水表面披上「铠甲」
  3. CodeForce 237C Primes on Interval(二分+ 素数筛法)
  4. 【已解决】CMake Error: Cannot determine link language for target “xxx“. CMake Error: CMake can not determ
  5. 关于机器学习,你应该至少学习这8个落地案例|干货集锦
  6. 运用tp5上传图片,并生成缩略图
  7. Dell PowerEdge - 如何配置 iDRAC9 和生命周期控制器网络 IP
  8. cad统计多线段总长度插件_新手入门,学习CAD必须掌握,教你使用标注命令,绘图效率翻一倍...
  9. android intent 视频,Android通过发送Intent播放本地视频和网络视频
  10. 最新丁林松老师全程讲解QT高级编程技术(完整)
  11. 微分方程数值解法(1)——常微分方程初值问题的数值解法
  12. linux下u盘不识别问题,linux u盘不识别解决办法
  13. 解决:Android中常见的热门标签的流式布局flowlayout不能wrap_content
  14. [转]Warzone 2100(战争地带2100)
  15. UE4UE5 VR开发多人联机RPC的坑
  16. ServerPropertiesAutoConfiguration.class cannot be opened because it does not exist
  17. 微信登陆之生成微信二维码
  18. 工作后的5种放松方法
  19. tableau和oracle dv,比较Power BI和Tableau,好比用奔驰对比奥迪
  20. 微信小程序云开发数据库操作

热门文章

  1. win10计算机不显示usb,win10插入U盘不显示怎么办_解决win10u盘插电脑上不显示的办法...
  2. 计算机电源再利用usb充电器,变废为宝,笔记本旧电源改造的8口USB充电器
  3. 任性与自制力差--拖延症(行为训练)
  4. 【摘抄】为什么要学C语言
  5. 2012年度总结:内心宁静的2012
  6. 18-HTML标签的居中
  7. 汽车CAN总线 CAN2.0
  8. amd 服务器cpu型号怎么看,怎么看CPU是几代的?intel和AMD怎么区分CPU是第几代的方法...
  9. 计算机cpu的型号与参数,怎么查看CPU型号和CPU核数
  10. 腾讯云云服务器的功能与优势-Unirech腾讯云代充