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 存储库有一个包含版本的页面。
发表评论 (审核通过后显示评论):