本文主要整理了截至到 2021年10月12日 为止的且处于 Stage 3->Stage 4 阶段的ECMA提案。

主要包括:

  • Class Fields
  • RegExp Match Indices
  • Top-Level await
  • Ergonomic brand checks for Private Fields
  • .at
  • Object.hasOwn()
  • Class Static Block

Class Fields

class 相关的提案一共有三个,目前都处于 Stage 3 阶段。

Private instance methods and accessors

示例:

/**** es2015 ****/
class Counter extends HTMLElement {
get x() { return this.xValue; }
set x(value) {
this.xValue = value;
window.requestAnimationFrame(this.render.bind(this));
} clicked() {
this.x++;
} constructor() {
super();
this.onclick = this.clicked.bind(this);
this.xValue = 0;
} connectedCallback() { this.render(); } render() {
this.textContent = this.x.toString();
}
}
window.customElements.define('num-counter', Counter);
/**** now(exNext) ****/
class Counter extends HTMLElement {
xValue = 0; // 声明共有属性 get x() { return this.xValue; }
set x(value) {
this.xValue = value;
window.requestAnimationFrame(this.render.bind(this));
} clicked() {
this.x++;
window.requestAnimationFrame(this.render.bind(this));
} constructor() {
super();
this.onclick = this.clicked.bind(this);
} connectedCallback() { this.render(); } render() {
this.textContent = this.x.toString();
}
}
window.customElements.define('num-counter', Counter);

Class Public Instance Fields & Private Instance Fields

示例:

// es2015
class Counter extends HTMLElement {
clicked() {
this.x++;
window.requestAnimationFrame(this.render.bind(this));
} constructor() {
super();
this.onclick = this.clicked.bind(this);
this.x = 0;
} connectedCallback() { this.render(); } render() {
this.textContent = this.x.toString();
}
}
window.customElements.define('num-counter', Counter);
// now
class Counter extends HTMLElement {
x = 0; clicked() {
this.x++;
window.requestAnimationFrame(this.render.bind(this));
} constructor() {
super();
this.onclick = this.clicked.bind(this);
} connectedCallback() { this.render(); } render() {
this.textContent = this.x.toString();
}
}
window.customElements.define('num-counter', Counter);
// 结合私有字段
class Counter extends HTMLElement {
#x = 0; clicked() {
this.#x++;
window.requestAnimationFrame(this.render.bind(this));
} constructor() {
super();
this.onclick = this.clicked.bind(this);
} connectedCallback() { this.render(); } render() {
this.textContent = this.#x.toString();
}
}
window.customElements.define('num-counter', Counter);

Static class fields and private static methods

class Test {

    static instance = new Test(0);// 静态共有变量

    static #value=123; // 静态私有变量
// 静态私有方法
static #print(){
return this.#value;
}
}

RegExp Match Indices

正则的匹配模式之前只有i g m,现在增加 d,目前处于 Stage 4 阶段。

示例:

const re1 = /a+(?<Z>z)?/d;

// indices are relative to start of the input string:
const s1 = "xaaaz";
const m1 = re1.exec(s1);
m1.indices[0][0] === 1;
m1.indices[0][1] === 5;
s1.slice(...m1.indices[0]) === "aaaz"; m1.indices[1][0] === 4;
m1.indices[1][1] === 5;
s1.slice(...m1.indices[1]) === "z"; m1.indices.groups["Z"][0] === 4;
m1.indices.groups["Z"][1] === 5;
s1.slice(...m1.indices.groups["Z"]) === "z"; // capture groups that are not matched return `undefined`:
const m2 = re1.exec("xaaay");
m2.indices[1] === undefined;
m2.indices.groups["Z"] === undefined;

使用 \d 后给 上面代码中的 m1 增加 indices 属性。

Top-Level await

之前只能 async await, 现在则可以直接使用 await ,目前处于 Stage 4 阶段。

示例:

/*** before ***/
// awaiting.mjs
import { process } from "./some-module.mjs";
export default (async () => {
const dynamic = await import(computedModuleSpecifier);
const data = await fetch(url);
const output = process(dynamic.default, data);
return { output };
})();
// usage.mjs
import promise from "./awaiting.mjs"; export default promise.then(({output}) => {
function outputPlusValue(value) { return output + value } console.log(outputPlusValue(100));
setTimeout(() => console.log(outputPlusValue(100), 1000); return { outputPlusValue };
}); /*** now ***/
// awaiting.mjs
import { process } from "./some-module.mjs";
const dynamic = import(computedModuleSpecifier);
const data = fetch(url);
export const output = process((await dynamic).default, await data);
// usage.mjs
import { output } from "./awaiting.mjs";
export function outputPlusValue(value) { return output + value } console.log(outputPlusValue(100));
setTimeout(() => console.log(outputPlusValue(100), 1000);

Ergonomic brand checks for Private Fields

这个提案的作用是检测一个对象中是否存在私有变量,目前处于 Stage 4 阶段。

示例:

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

.at

在所有基本可索引类中添加 .at() 方法,目前处于 Stage 3 阶段。

很多时候,类似于 Python 中的数组负值索引可以非常实用。比如在 Python 中我们可以通过 arr[-1] 来访问数组中的最后一个元素,而不用通过目前 JavaScript 中的方式来访问 arr[arr.length-1]。这里的负数是作为从起始元素(即arr[0])开始的反向索引。

但是现在 JavaScript 中的问题是,[] 这个语法不仅仅只是在数组中使用(当然在 Python 中也不是),而在数组中也不仅仅只可以作为索引使用。像arr[1]一样通过索引引用一个值,事实上引用的是这个对象的 "1" 这个属性。所以 arr[-1] 已经完全可以在现在的 JavaScript 引擎中使用,只是它可能不是代表的我们想要表达的意思而已:它引用的是目标对象的 "-1" 这个属性,而不是一个反向索引。

这个提案提供了一个通用的方案,我们可以通过任意可索引的类型(Array,String,和 TypedArray)上的 .at 方法,来访问任意一个反向索引、或者是正向索引的元素。

示例:

const arr = [1,2];
arr.at(-1); // 2
arr.at(-2); // 1

Object.hasOwn()

采用一种使更易于访问的方法替代 Object.prototype.hasOwnProperty(),目前处于 Stage 4 阶段。

其实现在我们就可以通过 Object.prototype.hasOwnProperty 来使用提案所包含的特性。但是直接通过对象自身的 hasOwnProperty 来使用 obj.hasOwnProperty('foo') 是不安全的,因为这个 obj 可能覆盖了 hasOwnProperty 的定义,MDN 上也对这种使用方式进行了警告。

JavaScript 并没有保护 hasOwnProperty 这个属性名,因此,当某个对象可能自有一个占用该属性名的属性时,就需要使用外部的 hasOwnProperty 获得正确的结果...

示例:

let hasOwnProperty = Object.prototype.hasOwnProperty

if (hasOwnProperty.call(object, "foo")) {
console.log("has property foo")
} // 此提案将该代码简化为: if (Object.hasOwn(object, "foo")) {
console.log("has property foo")
}

Class Static Block

类块提供了在类定义评估期间执行额外静态初始化的机制,目前处于 Stage 4 阶段

自从有了 Class Private Fields,对于类的语法是不断地有新的实践与需求。这个提案提议的 Class Static 初始化块会在类被执行、初始化时被执行。

提案中定义的初始化代码块可以获得 class 内的作用域,如同 class 的方法一样,也意味着可以访问类的 #字段

let getX;

export class C {
#x
constructor(x) {
this.#x = { data: x };
} static {
// getX has privileged access to #x
getX = (obj) => obj.#x;
}
} export function readXData(obj) {
return getX(obj).data;
}

参考资料

ECMA 2022 (es13) 新特性的更多相关文章

  1. ECMA Script 6新特性之解构赋值

    1.基本概念用法 1.1解构赋值:ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值. var a = 1; var b = 2; var c = 3; /*上述赋值语句用解构赋值为*/ v ...

  2. 2022 年最受瞩目的新特性 CSS @layer 到底是个啥?

    步入 2022,CSS 的新特性层出不穷,而最近在 CSS 圈最受瞩目的新特性,非 CSS @layer 莫属. 本文,将用最简洁的语言,快速让读者们搞懂,到底什么是 CSS @layer 新规范. ...

  3. ECMA script 6的新特性

    简单介绍下ES6的新特性: (1)箭头操作符 :简化了函数的书写 (2)类的支持:引入了class关键字,对象的创建,继承更加直观,父类方法的调用,实例化,构造函数等概念更加形象化. (3)增强的对象 ...

  4. atitit.js 各版本 and 新特性跟浏览器支持报告

    atitit.js 各版本 and 新特性跟浏览器支持报告 一个完整的JavaScript实现是由以下3个不同部分组成的 •核心(ECMAScript)--JavaScript的核心ECMAScrip ...

  5. ECMAScript6新特性之let、const

    第一次在博客园写博客,想把自己每一天学习到的知识点记录下来,心里有点紧张(PS:不知道自己能不能写好......嘿嘿).言归正传,咱们先来说说"ECMAScript"这到底是啥玩意 ...

  6. ES2018新特性(译文)

    原文链接:css-tricks.com 第9版ECMAScript标准于2018年6月发布,正式名称为ECMAScript 2018(简称ES2018).从ES2016开始,ECMAScript规范的 ...

  7. 【repost】H5的新特性及部分API详解

    h5新特性总览 移除的元素 纯表现的元素: basefont.big.center.font等 对可用性产生负面影响的元素: frame.frameset.noframes 新增的API 语义: 能够 ...

  8. es2017新特性

    2017年6月底es2017不期而至; 截止目前es8是ecmascript规范的第九个版本:自es2015开始ECMA协会将每年发布一个版本并将年号作为版本号:算了 直接看下es2017的新特性: ...

  9. ECMAScript 5和ECMAScript6的新特性以及浏览器支持情况

    ECMAScript简介: 它是一种由Ecma国际(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范,javascript在它基础上经行了自己的封装.但通常来说,术语ECMAScript和java ...

随机推荐

  1. Redis(二):基本数据类型

    基础 # redis默认有16个数据库,数组下标从0开始,默认使用0号库 # 当我们启动服务器并连接客户端之后: set <key> <value> # 向数据库中添加数据用于 ...

  2. 眼见为实,看看MySQL中的隐藏列!

    在介绍mysql的多版本并发控制mvcc的过程中,我们提到过mysql中存在一些隐藏列,例如行标识.事务ID.回滚指针等,不知道大家是否和我一样好奇过,要怎样才能实际地看到这些隐藏列的值呢? 本文我们 ...

  3. 对抗生成网络GAN

      该方法常用于: 图像生成 图像修复,训练用了MSE+Global+Local数据,其中Global+Local判别式用于全局+局部一致性. 图像超分辨率重构   GAN的基本原理,主要包含两个网络 ...

  4. BUUCTF-[CISCN2019 华东北赛区]Web2

    BUUCTF-[CISCN2019 华东北赛区]Web2 看题 一个论坛,内容不错:) 可以投稿,点击投稿发现要注册,那就先注册登录.随便账号密码就行. 常规操作,扫一下站点,发现有admin.php ...

  5. GUI实现超简单的计算器

    计算器样式 实现代码 //实现超简易的计算器 public class Test02 { public static void main(String[] args) { Counter counte ...

  6. 【Python机器学习实战】决策树与集成学习(五)——集成学习(3)GBDT应用实例

    前面对GBDT的算法原理进行了描述,通过前文了解到GBDT是以回归树为基分类器的集成学习模型,既可以做分类,也可以做回归,由于GBDT设计很多CART决策树相关内容,就暂不对其算法流程进行实现,本节就 ...

  7. noip模拟46

    A. 数数 排好序从两头贪心即可 B. 数树 首先很容易想到容斥 如果选择的边集的相关点集有点的度数大于 \(1\) 是不合法的 也就是说一定形成若干条长度不一的链 要给这些链上的点安排排列中的数,方 ...

  8. Linux内核中的Workqueue机制分析

    1. 什么是workqueue Linux中的workqueue(工作队列)主要是为了简化在内核创建线程而设计的.通过相应的工作队列接口,可以使开发人员只关心与特定功能相关的处理流程,而不必关心内核线 ...

  9. 为老的vueCli项目添加vite支持

    1.前言 接手公司的某个项目已经两年了,现在每次启动项目都接近1分钟,hmr也要好几秒的时间,but vite2发布之后就看到了曙光,但是一直没有动手进行升级,昨天终于忍不住了,升级之后几秒钟就完成了 ...

  10. Identity用户管理入门六(判断是否登录)

    目前用户管理的增删改查及登录功能已经全部实现,但存在一个问题,登录后要取消登录按钮显示退出按钮,未登录应该有注册按钮,现实现过程如下 一.Startup.cs中增加服务 app.UseAuthenti ...