摘要:本文主要介绍几个已经进入stage4的提案,这几个提案有望在2022年逐步纳入标准。

本文分享自华为云社区《2022 年你应该尝试的 8个 JavaScript 新功能》,作者:前端picker。

1995年12月4日,Netscape 公司与 Sun 公司联合发布JavaScript 以来,JavaScript从推出就开始了飞速的发展,2015年6,ES6正式发布,此后JavaScript正式进入新阶段,成为企业级大规模开发语言,并仍以高速度不断发展。

下面的表格对应这版本变化:

本文主要介绍几个已经进入stage4的提案,这几个提案有望在2022年逐步纳入标准。(请注意:纳入标准并不等同于浏览器支持)

PS:科普-Javascript的新语法,从提出到纳入标准一共经历下面几个stage

stage-0:新语法还是一个设想,(只能由TC39成员或TC39贡献者提出)

stage-1::提案阶段,比较正式的提议,只能由TC39成员发起,这个提案要解决的问题必须有正式的书面描述。

stage-2:草案,有了初始规范,必须对功能语法和语义进行正式描述,包括一些实验性的实现。

stage-3:候选,该提议基本已经实现,需要等待实验验证,用户反馈及验收测试通过。

stage-4:已完成,必须通过 Test262 验收测试,下一步就纳入ECMA标准。

.at()

TC39建议在所有基本可索引类,例如:数组、字符串、类数组(arguments)中添加.at()方法。

例如

lat arr=[1,2,3,4,5]

之前我们想获取数组中的第二位

arr[1] //2

最后一位的话,可能就是

arr[4] // 5

但是如果arr长度是动态的呢?我们要如何让取出最后一位? 通常的写法是:

arr[arr.length-1]

但是有了.at()方法就很简单了,.at()支持正索引和负索引。

例如

arr.at(-1)  //5
arr.at(-2) //4

具体提案:https://github.com/tc39/proposal-relative-indexing-method

Object.hasOwn(object, property)

Object.hasOwn(object, property)主要是用来替代Object.prototype.hasOwnProperty()。

目前我们想要判断对象是否具有指定的对象,主要写法如下:

if (Object.prototype.hasOwnProperty.call(object, "fn")) {
console.log('有')
}

而Object.hasOwn的写法:

if (Object.hasOwn(object, "fn")) {
console.log("有")
}

具体提案:https://github.com/tc39/proposal-accessible-object-hasownproperty

目前来看,V8引擎的9.3版本已经开始支持,所以说chrome应该会很快支持。

类的私有方法和getter/setter

类是所有支持面向对象语言的基本,而Javascript虽然支持使用class定义类,但是并没有提供 定义私有属性/方法的的 方案。本提案提出使用**#**来定义私有属性/方法

class Person{
name = '小芳';
#age = 16;
consoleAge(){
console.log(this.#age)
}
}
const person = new Person();
console.log(person.name); //小芳
console.log(button.#value); //报错
button.#value = false;//报错

具体提案:https://github.com/tc39/proposal-private-methods

检查私有属性和方法

因为新的标准会支持私有属性和方法,当我们访问不存在的私有属性/方法会报错,而在新标准中也考虑了这个情况,提供了in来检查私有属性和方法是否存在

class C {
#brand; #method() {} get #getter() {} static isC(obj) {
return #brand in obj && #method in obj && #getter in obj;
}
}

具体提案:https://github.com/tc39/proposal-private-fields-in-in

Top-level await(顶层await)

目前,我们使用await必须是在申明async的函数中,本提案,主要是支持在没有async的情况下使用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');
}

具体提案:https://github.com/tc39/proposal-top-level-await

正则匹配索引

该提案提供了一个新的/d,用来获取每个匹配的开始位置和结束位置信息。

const str = 'The question is TO BE, or not to be, that is to be.';
const regex = /to be/gd; const matches = [...str.matchAll(regex)];
matches[0];

具体提案:https://github.com/tc39/proposal-regexp-match-indices

new Error()抛出异常的具体原因

new Error(),可能大家第一反应是,这不是已经存在的语法嘛,是的,没错!只是新的提案:将错误与原因相关联,,向具有属性的Error() 构造函数添加一个附加选项参数cause,其值将作为属性分配给错误实例。

async function doJob() {
const rawResource = await fetch('//domain/resource-a')
.catch(err => {
throw new Error('Download raw resource failed', { cause: err });
});
const jobResult = doComputationalHeavyJob(rawResource);
await fetch('//domain/upload', { method: 'POST', body: jobResult })
.catch(err => {
throw new Error('Upload job result failed', { cause: err });
});
} try {
await doJob();
} catch (e) {
console.log(e);
console.log('Caused by', e.cause);
}
// Error: Upload job result failed
// Caused by TypeError: Failed to fetch

具体提案:https://github.com/tc39/proposal-error-cause

类static初始化块

本田针对静态字段和静态私有字段的提供了一种在 ClassDefinitionEvaluation 期间执行类静态端的每个字段初始化的机制-static blocks.例如官方提供的例子:

在没有static blocks之前,我们想给静态变量初始化(非直接赋值,可能是表达式赋值)的话,可能是放在外部实现:

// without static blocks:
class C {
static x = ...;
static y;
static z;
} try {
const obj = doSomethingWith(C.x);
C.y = obj.y
C.z = obj.z;
}
catch {
C.y = ...;
C.z = ...;
}

有了static block的情况下:我们可以直接在static blocks中初始化变量:

class C {
static x = ...;
static y;
static z;
static {
try {
const obj = doSomethingWith(this.x);
this.y = obj.y;
this.z = obj.z;
}
catch {
this.y = ...;
this.z = ...;
}
}
}

点击关注,第一时间了解华为云新鲜技术~

这8个JS 新功能,你应该去尝试一下的更多相关文章

  1. ES6,ES2105核心功能一览,js新特性详解

    ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...

  2. 【翻译】Ext JS 5.0.1 中的新功能

    原文:What's New in Ext JS 5.0.1 今天,我们很高兴的宣布Ext JS 5.0.1发布了!此维护版本基于Sencha社区的反馈做了一些改进.下面让我们来了解一下这些改变. 可访 ...

  3. LightningChart JS 3.0 新功能上线

    在这次的LC JS更新中,首次将极坐标图引入图表库. 这种全新的图表类型可以通过API轻松地进行样式设置.极坐标可以用作独立图表或在仪表板中使用. 另外,用于 XY图表的对数轴也添加到了这次的更新,L ...

  4. PHP5各个版本的新功能和新特性总结

    因为 PHP 那“集百家之长”的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征 本文目录:PHP5.2 以前:auto ...

  5. HTML5基本特性和新功能

    HTML5的基本特征 1.向前兼容性 核心理念——平滑过渡! 不支持html5的浏览器可以向前兼容,并不会影响web内容的显示! 2.跨平台运行性 从pc浏览器到手机.平板电脑,甚至是智能电视. 只要 ...

  6. PHP5各个版本的新功能和新特性总结(转载 http://www.jb51.net/article/48150.htm)

    本文目录:PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束PHP5.2:JSON 支持PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期静态绑定,Heredo ...

  7. HTML5_提供的 新功能_less 编译_

    HTML5_提供的 新功能 class 操作 ele.classList(注意: 高版本的 IE 都不支持) 获取 <div id="ele" class="... ...

  8. WordPress版微信小程序3.1.5版的新功能

    产品的完善是无止境,每过段时间就会发现产品的新问题,使用的人越多,提的需求也会越多,我听得最多的一句话就是:如果加上某某功能就完美了.其实,完美是不存在的,每个人的视角不一样,完美的定义也是不一样的. ...

  9. DevExpress ASP.NET Core Controls v18.2新功能详解

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress ASP.NET Core ...

  10. PHP 5.2、5.3、5.4、5.5、5.6 版本区别对比以及新功能详解

    截至目前(2015.1), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护  的 PHP5.2, 其余的一半用户在使用 PHP5.3 . 因为 PHP 那“集百家之 ...

随机推荐

  1. Kubernetes网络

    kubernetes-Service 1.service存在的意义 1.防止破的失联(服务发现) 2.定义一组pod的访问策略(提供负载均衡) 2.pod与service的关系 1.通过lablel- ...

  2. CSS色域、色彩空间、CSS Color 4新标准

    引言 近期,三大主流浏览器引擎均发布最新版本,支持W3C的CSS Color 4标准,包含新的取色方法color()和相应语法,可展示更多的色域及色彩空间,这意味着web端能展示更丰富更高清的色彩.虽 ...

  3. 打造我的 Windows 开发环境

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  4. Python根据输入的公司编号、名称、网址,格式化输出公司信息。其中1)冒号统一为英文冒号,编号占6位,不足6位的前面补0。编号后面是制表符。

    根据输入的公司编号.名称.网址,格式化输出公司信息.其中 1)冒号统一为英文冒号,编号占6位,不足6位的前面补0.编号后面是制表符. 2)"公司名称:" 后面输出字符串占8位,左对 ...

  5. 逻辑回归(Logistic Regression) ----转载

    概要: 1. 介绍Logistic Regression的数学模型,推导并详细解释求解最优回归系数的过程:2. Python实现Logistic Regression的基本版:3. 介绍sklearn ...

  6. SQL与NoSQL数据库选型及实际业务场景探讨

    在企业系统架构设计中,选择合适的数据库类型是一项关键决策.本文将对比SQL和NoSQL数据库的特点,分析它们在数据模型.可扩展性.一致性与事务.查询复杂性与频率,以及性能与延迟等方面的优势和劣势.同时 ...

  7. JUC——让步与优先级

    Thread.yield():方法作用是:暂停当前正在执行的线程对象(及放弃当前拥有的cup资源),并执行其他线程 yield():做的是让当前运行线程回到可运行的状态,以允许具有相同优先级的其他线程 ...

  8. 实践篇:1 虚拟机使用rmp方式安装部署GitLab-ce

    01 环境准备 电脑:MAC Air 虚拟机:VMware Fusion 12.2.3 Linux环境:CentOS 7 02 rpm方式安装部署GitLab服务 步骤1:centos 7 安装wge ...

  9. pytorch学习笔记——训练时显存逐渐增加,几个epoch后out-of-memory

    问题起因:笔者想把别人的torch的代码复制到笔者的代码框架下,从而引起的显存爆炸问题 该bug在困扰了笔者三天的情况下,和学长一同解决了该bug,故在此记录这次艰辛的debug之路. 尝试思路1:检 ...

  10. AVL树和红黑树的Python代码实现

    AVL树 AVL树是一种自平衡二叉搜索树.在这种树中,任何节点的两个子树的高度差被严格控制在1以内.这确保了树的平衡,从而保证了搜索.插入和删除操作的高效性.AVL树是由Georgy Adelson- ...