我国第一个推进到浏览器标准的ECMaScript提案
在2022年6月22日,第123届Ecma大会批准了
ECMAScript 2022
语言规范。一起来看看ES13给我们带来了哪些新特性吧。其中最后一个特性,是我国第一个推进到浏览器标准的EcmaScript提案。
1.私有属性和私有方法
之前js中class
的一个痛点就是没有私有属性,毕竟封装是面向对象的三大特性,没有私有属性如何实现封装。尽管我们可以用很多方法去曲线实现私有属性比如闭包proxy
、weakmap
、symbol
等等,但是他们各自有各自的缺陷,下面的代码演示其中以_
作为命名约定的方式实现私有属性的缺点。
在构造函数中,我们定义了两个字段,其中一个字段是以_开头的, 这是一个命名约定用于将字段声明为私有字段,但是当我们在类外面访问该字段时,并没有引起报错,原因是因为它只是一个命名规范而已。
现在在ES13
中,我们可以用更简单的方法声明公共和私有字段,第一,我们不必在构造函数中定义它们了,其次,我们可以通过在字段前面添加#号来定义一个真正的私有字段。
有了这个特性,我们终于可以简单轻松的定义一个真正的私有属性或私有方法了。
2.私有属性检测
当我们尝试访问对象上不存在的私有属性时会报错,所以就需要一种方法来检测对象是否具有某私有属性,此时,我们可以在class
中使用in
关键字来完成此工作。
当然,你可能会发问对于具有相同名称的私有属性的类,in
关键字是否能正常工作,别担心,请参考以下例子,User类和Person类具有相同的私有属性name,in
关键字可以正确的区分。
3. 类静态初始化块(Class Static Block)
类在初始化的时候会执行静态初始化块(Class Static Block
),一个类可以拥有任意个静态初始化块,它们将会按照声明的顺序执行。静态初始块内还可以访问父类的静态属性。
下面这个例子,我们还可以通过静态初始化块将私有属性暴露出去。
4.Regexp Match Indices
之前 ECMAScript 中的 「RegExp.prototype.exec」 方法的返回值已经提供了对于匹配的捕获组 文本与对应的捕获组在正则表达式中的索引。尽管它已经包含输入字符串,模式匹配的索引以及包含任何已命名捕获组的子字符串的group对象,但是对于复杂情况,此信息可能不足。
所以ES13通过新增/d修饰符,向匹配结果添加一个属性 .indices
,此属性是一个索引数组,其中包含每个捕获的子字符串的一对开始索引和结束索引。
5.Await operator at the top-level
之前await
关键词只能在aysnc function
里进行使用,想要在顶层使用await
就必须要加个aysnc
自执行函数,这样十分的不方便, 所以ES13中,引入了可以直接在顶层使用Await
关键字的特性。
动态加载模块:
依赖回退:
加载最快的资源
6 .at()方法
之前,我们如果想要获取一个数组的元素,如果是正序获取一个元素,我们可以采取arr[0]
这样的方式, 但是如果我们要倒序访问一个数组的元素,就需要采取arr[arr.length - 2]
这样的方式,数组的名称arr
我们写了两次,而且还要写个length
,这很不优雅,复杂的情况下就更是难受。
为了解决这个问题, ES13
引入了at()
方法,无论正序还是倒序获取元素都非常的优雅,有了这个方法,我们可以在数组、字符串、TypedArray
上通过索引值方便的获取元素。
7.Object.hasOwn(obj, propKey)
之前我们如果想要判断某对象是否具有某属性,我们会通过in
和obj.hasOwnProperty
,但是如果指定的属性位于原型链中,“in”运算符也会返回true
。所以之前要想判断对象自身是否具有某属性我们一般都通过obj.hasOwnProperty
来判断。
但是obj.hasOwnProperty
也有自身的缺点:因为hasOwnProperty
是不受保护的属性,所以,人们可能会在对象上定义个自己的hasOwnProperty
,如下所示,自定义的hasOwnProperty
永远返回false
,这是一个坑。
另一个问题是使用Object.create(null)
创建一个不继承自 Object.prototype
的对象,使 hasOwnProperty
方法时会报错。
所以,为了解决上面的问题,ES13引入了Object.hasOwn(obj, propKey)。用法如下所示:
8.Error Cause
Error Cause
提案由阿里巴巴的「昭朗」同学负责,是我国第一个成为浏览器标准的EcmaScript
提案。
以前因为 Error Cause
没有标准化的参数定义及官方实现,所以容易丢失 error
的属性或需要写比较多的代码自定义等,并且开发者工具也难以依赖于非语言特性的自定义方案。
try {
apiCallThatCanThrow();
} catch (err) {
throw new Error('New error message', { cause: err });
}
有了这个新特性,借助cause
属性,我们可以记下导致这个Error
的前一个Error
对象,错误对象就可以以一种简单优雅的方式链接起来。
9.总结
以上就是ES13的新特性,新特性会给js生态带来更多好的东西,提高开发者的效率和体验。
转载自:https://juejin.cn/post/7116729784721211405