ecma international 批准 ECMAScript 2022:新增功能是什么


1. ECMAScript 2022 中有哪些新增功能?
类的新成员
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 {
   // Static initialization block
 }
}


现在可以通过以下方式创建属性(公共插槽):
实例公共字段
静态公共字段


专用插槽是新的,可以通过以下方式创建:
私有字段(实例私有字段和静态私有字段))
私有方法和访问器(非静态和静态))
静态初始化块


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
);
请注意,我们只能引用声明它的作用域内的专用槽。



3. 顶级模块await
我们现在可以在模块的顶层使用,而不必再输入异步函数或方法:await

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


4.error.cause  
Error它的子类现在让我们指定哪个错误导致了当前的错误:

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


5.可索引值的方法.at()
可索引值的方法允许我们在给定索引处读取元素(如括号运算符),并支持负索引(与括号运算符不同):.at()[]

> ['a', 'b', 'c'].at(0)
'a'
> ['a', 'b', 'c'].at(-1)
'c'
以下“可索引”类型具有方法:.at()

string
Array

6.正则表达式匹配索引
如果我们将标志添加到正则表达式中,则使用它会产生匹配对象,这些对象记录每个组捕获的开始和结束索引(行 A 和 B 行):/d

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)
);


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

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)
请注意,检测继承的属性(行 A),而仅检测自己的属性(行 B 和 C)。inObject.hasOwn()


常见问题
1.JavaScript 和 ECMAScript 之间有什么区别?

JavaScript是由各种平台(浏览器,Node,.js,Deno等)实现的编程语言。
ECMAScript 是它的标准,如 ECMAScript 语言规范中所述。


2.谁设计了 ECMAScript?TC39 – Ecma 技术委员会 39
ECMAScript 由标准组织 Ecma International 的技术委员会 39 (TC39) 设计。

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

每两个月,TC39 都会举行由会员指定的代表和受邀专家参加的会议。这些会议的会议记录在 GitHub 存储库中是公开的。

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

3.如何将功能添加到 ECMAScript 中?他们经历了 TC39 工艺的各个阶段
必须向 TC39 提出新的 ECMAScript 功能。他们经历以下阶段:

从阶段 0 开始(使 TC39 能够对提案发表评论)
到第 4 阶段(建议的功能已准备好添加到 ECMAScript 中)
一旦一个功能达到阶段 4,它就会被安排添加到 ECMAScript 中。ECMAScript 版本的功能集通常在每年的三月被冻结。在该截止日期之后达到阶段 4 的功能将添加到明年的 ECMAScript 版本中。


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



5.在哪里可以查找在给定的 ECMAScript 版本中添加了哪些功能?


我们可以在几个地方查找每个 ECMAScript 版本中的新增功能:

在“JavaScript for impatily 程序员”中,有一个部分列出了每个 ECMAScript 版本中的新增功能。它还链接到解释。

TC39 存储库有一个包含已完成建议的表格,其中说明了它们被(或将要)引入的 ECMAScript 版本。

ECMAScript 语言规范的“简介”部分列出了每个 ECMAScript 版本的新功能。

ECMA-262 存储库有一个包含版本的页面。

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):