推荐答案
ES13(ES2022)中新增的主要特性包括:
- Top-level
await:允许在模块的顶层使用await,无需包裹在async函数中。 - Class Field Declarations:支持在类中直接声明字段,无需在构造函数中初始化。
- Private Methods and Fields:支持在类中定义私有方法和字段,使用
#前缀。 - Static Class Fields and Methods:支持在类中定义静态字段和方法。
- Ergonomic Brand Checks for Private Fields:提供更简洁的方式来检查私有字段是否存在。
- Array.prototype.at():允许通过索引访问数组元素,支持负索引。
- Object.hasOwn():提供更简洁的方式来检查对象是否拥有某个属性。
- Error Cause:允许在创建错误时指定原因,便于调试。
本题详细解读
1. Top-level await
在 ES13 之前,await 只能在 async 函数中使用。ES13 允许在模块的顶层直接使用 await,简化了异步代码的编写。
// www.javascriptcn.com code example
// ES13 之前
(async function() {
const response = await fetch('https://api.example.com/data');
console.log(response);
})();
// ES13
const response = await fetch('https://api.example.com/data');
console.log(response);2. Class Field Declarations
ES13 允许在类中直接声明字段,无需在构造函数中初始化。
class MyClass {
myField = 42;
}3. Private Methods and Fields
ES13 引入了私有方法和字段,使用 # 前缀表示。
class MyClass {
#privateField = 42;
#privateMethod() {
return this.#privateField;
}
}4. Static Class Fields and Methods
ES13 支持在类中定义静态字段和方法。
class MyClass {
static myStaticField = 42;
static myStaticMethod() {
return this.myStaticField;
}
}5. Ergonomic Brand Checks for Private Fields
ES13 提供了更简洁的方式来检查私有字段是否存在。
class MyClass {
#privateField;
static hasPrivateField(instance) {
return #privateField in instance;
}
}6. Array.prototype.at()
Array.prototype.at() 方法允许通过索引访问数组元素,支持负索引。
const array = [1, 2, 3]; console.log(array.at(-1)); // 输出 3
7. Object.hasOwn()
Object.hasOwn() 方法提供更简洁的方式来检查对象是否拥有某个属性。
const obj = { foo: 'bar' };
console.log(Object.hasOwn(obj, 'foo')); // 输出 true8. Error Cause
ES13 允许在创建错误时指定原因,便于调试。
try {
throw new Error('Something went wrong', { cause: 'Invalid input' });
} catch (error) {
console.log(error.cause); // 输出 'Invalid input'
}