ES2022 有哪些新功能?🤔

2025-05-25

ES2022 有哪些新功能?🤔

ECMA Script 的新版本将在几个月后成为标准。那么,让我们先来了解一下 ES2022 中将包含哪些功能。

ES2022 的功能

.at()1.可索引值的方法。

此函数用于读取给定索引处的元素。它可以接受负索引,即从给定数据类型的末尾读取元素。

例如

[1,2,3,4,5].at(3)  // returns 4

[1,2,3,4,5].at(-2)   // returns 4
Enter fullscreen mode Exit fullscreen mode

支持此功能的数据类型。

  • 细绳
  • 大批
  • 所有 Typed Array 类:Uint8Array 等。

2. 正则表达式匹配索引

向正则表达式添加标志/d会生成匹配对象,记录每个组捕获的开始和结束。

有多种方法来匹配索引

  • 编号组的匹配索引
const matchObj = /(a+)(b+)/d.exec('aaaabb');

console.log(matchObj);
/*
Output -
['aaaabb', 'aaaa', 'bb', index: 0, input: 'aaaabb', groups: undefined, indices: Array(3)]
*/
Enter fullscreen mode Exit fullscreen mode

由于正则表达式标志/d,matchObj 还具有属性 .indices,用于记录在输入字符串中捕获它的每个编号组。

matchObj.indices[1];
/*
Output - 
[0, 4]
*/
Enter fullscreen mode Exit fullscreen mode
  • 命名组的匹配索引
const matchObj = /(?<as>a+)(?<bs>b+)/d.exec('aaaabb');

console.log(matchObj);
/*
Output - 
['aaaabb', 'aaaa', 'bb', index: 0, input: 'aaaabb', groups: {as: 'aaaa', bs: 'bb'}, indices: Array(3)]
*/
Enter fullscreen mode Exit fullscreen mode

它们的索引存储在matchObj.indices.groups

matchObj.indices.groups;
/*
Output -
{ as: [0,4], bs: [4,6] }
*/
Enter fullscreen mode Exit fullscreen mode

3.Object.hasOwn(obj, propKey)

这是一种检查对象自身属性的安全方法propKeyobj类似,Object.prototype.hasOwnProperty但支持所有对象类型。

const proto = {
  protoProp: 'protoProp',
};

const obj = {
  __proto__: proto,
  objProp: 'objProp',
};

console.log('protoProp' in obj); // output - true.
console.log(Object.hasOwn(obj, 'protoProp')) // output - false
console.log(Object.hasOwn(proto, 'protoProp')); // output - true.
Enter fullscreen mode Exit fullscreen mode

4.error.cause

Error 及其子类现在允许我们指定错误背后的原因。这在深度嵌套的函数中非常有用,因为函数中我们可以使用链式错误代码块来快速查找错误。点击此处了解更多信息

function readFiles(filePaths) {
  return filePaths.map(
    (filePath) => {
      try {
        // ···
      } catch (error) {
        throw new Error(
          `While processing ${filePath}`,
          {cause: error}
        );
      }
    });
}
Enter fullscreen mode Exit fullscreen mode

5. 顶级 await 模块

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

  • 动态加载模块
const messages = await import(`./messages-${language}.mjs`);
Enter fullscreen mode Exit fullscreen mode
  • 如果模块加载失败,则使用回退
let lodash;
try {
  lodash = await import('https://primary.example.com/lodash');
} catch {
  lodash = await import('https://secondary.example.com/lodash');
}
Enter fullscreen mode Exit fullscreen mode
  • 使用加载速度最快的资源
const resource = await Promise.any([
  fetch('http://example.com/first.txt')
    .then(response => response.text()),
  fetch('http://example.com/second.txt')
    .then(response => response.text()),
]);
Enter fullscreen mode Exit fullscreen mode

6. 班级新成员

  • 可以通过以下方式创建公共属性
    • 实例公共字段
class InstPublicClass {
  // Instance public field
  instancePublicField = 0; // (A)

  constructor(value) {
    // We don’t need to mention .property elsewhere!
    this.property = value; // (B)
  }
}

const inst = new InstPublicClass('constrArg');
Enter fullscreen mode Exit fullscreen mode
  • 静态公共字段
const computedFieldKey = Symbol('computedFieldKey');
class StaticPublicFieldClass {
  static identifierFieldKey = 1;
  static 'quoted field key' = 2;
  static [computedFieldKey] = 3;
}
console.log(StaticPublicFieldClass.identifierFieldKey) //output -> 1
console.log(StaticPublicFieldClass['quoted field key']) //output -> 2
console.log(StaticPublicFieldClass[computedFieldKey]) //output -> 3
Enter fullscreen mode Exit fullscreen mode
  • 私人插槽是新的,可以通过以下方式创建
    • 实例私有字段
class InstPrivateClass {
  #privateField1 = 'private field 1'; // (A)
  #privateField2; // (B) required!
  constructor(value) {
    this.#privateField2 = value; // (C)
  }
  /**
   * Private fields are not accessible outside the class body.
   */
  checkPrivateValues() {
  console.log(this.#privateField1); // output -> 'private field 1'
  console.log(this.#privateField2); // output -> 'constructor argument'

  }
}

const inst = new InstPrivateClass('constructor argument');
  inst.checkPrivateValues();


console.log("inst", Object.keys(inst).length === 0) //output -> inst, true
Enter fullscreen mode Exit fullscreen mode
  • 实例和静态私有字段
class InstPrivateClass {
  #privateField1 = 'private field 1'; // (A)
  #privateField2; // (B) required!
  static #staticPrivateField = 'hello';
  constructor(value) {
    this.#privateField2 = value; // (C)
  }
  /**
   * Private fields are not accessible outside the class body.
   */
  checkPrivateValues() {
    console.log(this.#privateField1); // output -> 'private field 1'
    console.log(this.#privateField2); // output -> 'constructor argument'

  }

  static #twice() {
    return this.#staticPrivateField + " " + this.#staticPrivateField;
  }

  static getResultTwice() {
    return this.#twice()
  }
}

const inst = new InstPrivateClass('constructor argument');
inst.checkPrivateValues();


console.log("inst", Object.keys(inst).length === 0) //output -> "inst", true
console.log(InstPrivateClass.getResultTwice()); // output -> "hello hello"
Enter fullscreen mode Exit fullscreen mode
  • 私有方法和访问器
class MyClass {
  #privateMethod() {}
  static check() {
    const inst = new MyClass();

    console.log(#privateMethod in inst) // output-> true

    console.log(#privateMethod in MyClass.prototype) // output-> false

    console.log(#privateMethod in MyClass) // output-> false
  }
}
MyClass.check();
Enter fullscreen mode Exit fullscreen mode
  • 类中的静态初始化块。对于静态数据,我们有静态字段静态块,它们在类创建时执行
class Translator {
  static translations = {
    yes: 'ja',
    no: 'nein',
    maybe: 'vielleicht',
  };
  static englishWords = [];
  static germanWords = [];
  static { // (A)
    for (const [english, german] of Object.entries(this.translations)) {
      this.englishWords.push(english);
      this.germanWords.push(german);
    }
  }
}


console.log(Translator.englishWords, Translator.germanWords)
//Output -> ["yes", "no", "maybe"], ["ja", "nein", "vielleicht"]
Enter fullscreen mode Exit fullscreen mode
  • 私有槽检查——此功能帮助我们检查对象是否具有给定的私有槽。
class C1 {
  #priv() {}
  static check(obj) {
    return #priv in obj;
  }
}

console.log(C1.check(new C1())) // output true
Enter fullscreen mode Exit fullscreen mode

这些超棒的功能将帮助我们提升项目质量,并提升我们的编程技巧。我非常期待在我的项目中尝试这些功能。💃

编码愉快!👩🏻‍💻

文章来源:https://dev.to/jasmin/whats-new-in-es2022-1de6
PREV
每个代码新手的秘密开发工具
NEXT
ES2023 有哪些新功能?👀