Những tính năng mới trong ECMAScript 2022 (ES13) JavaScript

JavaScript Versions | by Học Javascript

JavaScript là một trong những ngôn ngữ lập trình phổ biến và quan trọng nhất hiện nay, liên tục được cập nhật để cải thiện hiệu suất và tối ưu hóa cú pháp. ECMAScript 2022 (ES13) mang đến nhiều tính năng mới giúp lập trình viên viết code ngắn gọn hơn, dễ đọc hơn và hiệu quả hơn.

Từ việc cải tiến cách làm việc với class bằng private fields, private methods đến việc đơn giản hóa truy xuất mảng với .at(), ES13 giúp tăng tính linh hoạt và bảo mật trong lập trình JavaScript. Đặc biệt, Top-Level Await cho phép xử lý bất đồng bộ mượt mà hơn trong các module.

Vậy những tính năng này hoạt động ra sao, và chúng giúp lập trình JavaScript hiện đại như thế nào? Hãy cùng tìm hiểu chi tiết trong bài viết này!

ECMAScript 2022 (ES13) là gì?

ECMAScript 2022 (ES13) là phiên bản mới nhất của tiêu chuẩn ECMAScript được phát hành vào năm 2022. Đây là nền tảng của JavaScript – ngôn ngữ lập trình phổ biến nhất hiện nay. Mỗi năm, ECMAScript được cập nhật để mang đến những cải tiến giúp lập trình viên làm việc hiệu quả hơn, tối ưu hiệu suất và cải thiện khả năng đọc hiểu mã nguồn.

Tầm quan trọng của ES13 trong việc nâng cao hiệu suất và tối ưu hóa JavaScript

ES13 không chỉ bổ sung các tính năng giúp lập trình viên viết code ngắn gọn, dễ đọc hơn mà còn cải thiện hiệu suất xử lý, giúp JavaScript trở nên mạnh mẽ hơn trong các ứng dụng thực tế. Một số lý do khiến ES13 quan trọng đối với lập trình JavaScript hiện đại:

Cải thiện cách truy xuất phần tử trong mảng với .at()

  • Hỗ trợ truy cập phần tử từ cuối mảng một cách rõ ràng, thay vì dùng arr[arr.length - 1].

Hỗ trợ xử lý bất đồng bộ tốt hơn với Top-Level Await

  • Giúp sử dụng await trực tiếp trong các module ES mà không cần bọc trong hàm async.

Tăng cường bảo mật với Private Fields và Private Methods trong class

  • Hạn chế quyền truy cập vào các thuộc tính riêng tư, giúp bảo vệ dữ liệu tốt hơn.

Cải tiến cú pháp Regular Expression với d flag

  • Cho phép lấy thông tin chi tiết về vị trí khớp trong chuỗi, giúp xử lý dữ liệu mạnh mẽ hơn.

Những cải tiến giúp lập trình viên viết code dễ dàng và hiệu quả hơn

Những tính năng mới trong ES13 không chỉ giúp giảm thiểu lỗi khi lập trình mà còn làm cho code ngắn gọn hơn, dễ hiểu hơn.

.at() giúp truy xuất mảng linh hoạt hơn

  • Thay vì viết arr[arr.length - 1], lập trình viên có thể dùng arr.at(-1), giúp code gọn gàng và dễ đọc hơn.

Top-Level Await hỗ trợ xử lý bất đồng bộ đơn giản hơn

  • Không cần bọc trong async function, có thể dùng await trực tiếp trong module ES.

Private Fields và Private Methods bảo vệ dữ liệu trong class

  • Các thuộc tính trong class có thể đặt ở chế độ riêng tư bằng cách dùng dấu #, giúp ngăn chặn truy cập từ bên ngoài.

d flag trong RegEx giúp kiểm soát vị trí khớp

  • Cải tiến cú pháp Regular Expression, hỗ trợ kiểm tra vị trí xuất hiện của kết quả khớp, hữu ích khi thao tác với dữ liệu phức tạp.

Nhờ những cải tiến này, ES13 giúp lập trình viên tiết kiệm thời gian, viết code rõ ràng hơn, bảo mật hơn và dễ bảo trì hơn, góp phần nâng cao hiệu suất của các ứng dụng JavaScript hiện đại.

Các tính năng mới trong ECMAScript 2022 (ES13)

ECMAScript 2022 mang đến nhiều cải tiến giúp lập trình viên làm việc hiệu quả hơn với JavaScript. Dưới đây là các tính năng quan trọng của ES13 và cách chúng giúp tối ưu hóa code.

Class Fields và Private Methods chính thức được chuẩn hóa

Trước đây, khi khai báo thuộc tính trong class, lập trình viên phải đặt chúng trong constructor. Tuy nhiên, ES13 đã chuẩn hóa Class Fields và Private Methods, giúp code dễ hiểu hơn và hạn chế truy cập không mong muốn từ bên ngoài.

Tính năng mới

  • Thuộc tính riêng tư (Private Fields): Dùng dấu # trước tên thuộc tính để giới hạn quyền truy cập bên trong class.
  • Phương thức riêng tư (Private Methods): Giống như private fields, private methods chỉ có thể được gọi bên trong class.

Ví dụ về Class Fields và Private Methods

class User {
  #password; // Private field
  
  constructor(name, password) {
    this.name = name;
    this.#password = password;
  }

  #encryptPassword() { // Private method
    return `***${this.#password}***`;
  }

  getEncryptedPassword() {
    return this.#encryptPassword();
  }
}

const user = new User("Alice", "12345");
console.log(user.name); // Alice
console.log(user.getEncryptedPassword()); // ***12345***
console.log(user.#password); //  Lỗi: Private field không thể truy cập
console.log(user.#encryptPassword()); //  Lỗi: Private method không thể truy cập
  • Bảo vệ dữ liệu quan trọng bên trong class.
  • Tránh sửa đổi ngoài ý muốn từ bên ngoài class.

Static Class Fields và Static Private Methods

ES13 hỗ trợ khai báo thuộc tính tĩnh (Static Fields) và phương thức tĩnh (Static Methods) cho class, giúp tạo ra các giá trị hoặc hành vi không cần khởi tạo đối tượng.

  • Static Fields (static): Các thuộc tính không thay đổi giữa các thể hiện của class.
  • Static Private Methods (static #method): Phương thức riêng tư, chỉ có thể gọi bên trong class.

Ví dụ về Static Fields và Static Private Methods

class Counter {
  static count = 0; // Static field

  static #increment() { // Static private method
    Counter.count++;
  }

  static add() {
    this.#increment();
  }
}

Counter.add();
Counter.add();
console.log(Counter.count); // 2
console.log(Counter.#increment()); //  Lỗi: Không thể gọi private method từ bên ngoài
  • Dùng để lưu trữ dữ liệu chung mà không cần khởi tạo đối tượng.
  • Bảo vệ logic riêng tư bên trong class với static private methods.

Array.prototype.at() – Cách mới để truy cập phần tử trong mảng

ES13 giới thiệu phương thức .at(), giúp truy xuất phần tử trong mảng dễ dàng hơn, đặc biệt là với chỉ số âm.

  • Dùng .at(index) thay vì array[index], giúp code rõ ràng hơn.
  • Hỗ trợ truy cập phần tử từ cuối mảng bằng chỉ số âm (-1 lấy phần tử cuối cùng).

Ví dụ về .at()

const regex = /a+/d;
const result = regex.exec("banana");

console.log(result.indices); // [[1, 2]] (Chỉ mục của chữ 'a' đầu tiên)

Tăng cường khả năng thao tác với RegEx.
Hữu ích trong xử lý dữ liệu văn bản phức tạp.

Object.hasOwn() – Kiểm tra thuộc tính an toàn hơn

Trước đây, lập trình viên thường sử dụng Object.prototype.hasOwnProperty() để kiểm tra thuộc tính của object. Tuy nhiên, ES13 giới thiệu Object.hasOwn(), giúp viết code gọn hơn và an toàn hơn.

  • Không bị ảnh hưởng bởi prototype chain.
  • An toàn hơn khi kiểm tra thuộc tính của object.

Ví dụ về Object.hasOwn()

const obj = { name: "Alice", age: 25 };

console.log(Object.hasOwn(obj, "name")); // true
console.log(Object.hasOwn(obj, "gender")); // false
console.log(obj.hasOwnProperty("name")); // true (Cách cũ)
  • Giúp kiểm tra thuộc tính của object an toàn hơn.
  • Tránh các lỗi khi làm việc với prototype chain.

Top-Level Await – Sử dụng await ngoài async function

Trước ES13, await chỉ có thể được dùng trong async function. Tuy nhiên, ES13 cho phép sử dụng await trực tiếp trong module JavaScript mà không cần bọc trong async function.

  • Không cần hàm async khi dùng await trong module.
  • Giúp xử lý bất đồng bộ đơn giản hơn.

Ví dụ về Top-Level Await

// module.js
export const data = await fetch("https://jsonplaceholder.typicode.com/posts/1")
  .then(response => response.json());

console.log(data);
  • Dễ dàng import dữ liệu từ API mà không cần hàm async.
  • Giúp module JavaScript chạy bất đồng bộ một cách tự nhiên hơn.

Ứng dụng của ES13 trong JavaScript

ECMAScript 2022 (ES13) mang đến nhiều tính năng hữu ích giúp code dễ đọc hơn, bảo mật dữ liệu tốt hơn, tối ưu hiệu suất và tăng cường khả năng xử lý chuỗi. Dưới đây là các ứng dụng thực tế của ES13 trong lập trình JavaScript.

Giúp code dễ đọc hơn với Object.hasOwn() và Array.prototype.at()

Object.hasOwn() – Kiểm tra thuộc tính an toàn và dễ đọc hơn

Trước đây, khi kiểm tra thuộc tính của một object, chúng ta sử dụng hasOwnProperty(), nhưng nó có thể gây lỗi nếu object bị ghi đè prototype. ES13 giới thiệu Object.hasOwn(), giúp code gọn gàng hơn và tránh lỗi.

Ứng dụng thực tế:

  • Kiểm tra thuộc tính an toàn hơn trong object.
  • Viết code ngắn gọn, dễ hiểu hơn.

Ví dụ so sánh cách cũ và mới:

const user = { name: "Alice", age: 25 };

// Cách cũ (không an toàn nếu object bị ghi đè prototype)
console.log(user.hasOwnProperty("name")); // true
console.log(Object.prototype.hasOwnProperty.call(user, "name")); // true

// Cách mới trong ES13
console.log(Object.hasOwn(user, "name")); // true (Gọn gàng hơn)
console.log(Object.hasOwn(user, "gender")); // false
  • Tránh lỗi khi object có thể bị ghi đè prototype.
  • Code dễ đọc hơn, không cần gọi Object.prototype.hasOwnProperty.call().

Array.prototype.at() – Truy cập phần tử mảng thuận tiện hơn

Khi truy cập phần tử cuối cùng của một mảng, chúng ta thường phải dùng array[array.length - 1]. ES13 giúp đơn giản hóa điều này với .at().

Ứng dụng thực tế:
  • Làm việc với danh sách dữ liệu dễ dàng hơn.
  • Viết code rõ ràng hơn, đặc biệt khi truy cập phần tử cuối cùng.
Ví dụ so sánh cách cũ và mới:
const numbers = [10, 20, 30, 40, 50];

console.log(numbers.at(0));  // 10 (Phần tử đầu tiên)
console.log(numbers.at(-1)); // 50 (Phần tử cuối cùng)

// Cách cũ
console.log(numbers[numbers.length - 1]); // 50 (Dài dòng hơn)

Lợi ích:

  • Code ngắn gọn hơn, dễ đọc hơn.
  • Không cần tính array.length - 1 khi truy xuất phần tử cuối.

Cải thiện bảo mật dữ liệu trong class với Private Fields và Private Methods

Bảo vệ dữ liệu trong class bằng #privateFields#privateMethods

Trước đây, JavaScript không có cách bảo vệ thuộc tính trong class. ES13 giúp lập trình viên giữ dữ liệu an toàn bằng cách dùng # để tạo các thuộc tính và phương thức riêng tư.

Ứng dụng thực tế:

  • Bảo vệ dữ liệu quan trọng như mật khẩu, token API.
  • Giúp class không bị truy cập hoặc sửa đổi ngoài ý muốn.

Ví dụ về private fields và private methods:

class User {
  #password; // Private field

  constructor(name, password) {
    this.name = name;
    this.#password = password;
  }

  #encryptPassword() { // Private method
    return `***${this.#password}***`;
  }

  getEncryptedPassword() {
    return this.#encryptPassword();
  }
}

const user = new User("Alice", "12345");
console.log(user.getEncryptedPassword()); // ***12345***
console.log(user.#password); //  Lỗi: Không thể truy cập private field
console.log(user.#encryptPassword()); //  Lỗi: Không thể truy cập private method
  • Ngăn chặn truy cập trái phép vào dữ liệu nhạy cảm.
  • Giúp code bảo mật hơn và hạn chế lỗi do thao tác ngoài ý muốn.

Tối ưu hiệu suất xử lý bất đồng bộ với Top-Level Await

Sử dụng await ngoài async function trong module

Trước đây, await chỉ có thể dùng trong async function, nhưng ES13 cho phép dùng await trực tiếp trong module, giúp xử lý bất đồng bộ tự nhiên hơn.

Ứng dụng thực tế:

  • Import dữ liệu từ API mà không cần async function.
  • Giúp code module trở nên gọn gàng và dễ quản lý hơn.

Ví dụ sử dụng Top-Level Await trong module

// data.js
export const data = await fetch("https://jsonplaceholder.typicode.com/posts/1")
  .then(response => response.json());

console.log(data);
  • Dễ dàng lấy dữ liệu từ API ngay khi import module.
  • Không cần bọc await trong một async function.

Cải thiện việc làm việc với RegEx với /d flag trong RegExp

Lấy vị trí chính xác của kết quả khớp trong biểu thức chính quy

Trước đây, khi sử dụng RegEx, chúng ta chỉ lấy được phần khớp, nhưng không biết vị trí chính xác của nó trong chuỗi. ES13 bổ sung /d flag, giúp lấy chỉ mục của từng phần khớp.

Ứng dụng thực tế:

  • Tách dữ liệu từ văn bản mà không cần viết code phức tạp.
  • Tăng độ chính xác khi làm việc với RegEx.

Ví dụ sử dụng /d flag:

const regex = /a+/d;
const result = regex.exec("banana");

console.log(result.indices); // [[1, 2]] (Chỉ mục của chữ 'a' đầu tiên)

Lợi ích:
Dễ dàng thao tác với dữ liệu khớp từ RegEx.
Tăng độ chính xác khi xử lý chuỗi.

So sánh ES13 với ES12 trong JavaScript

ECMAScript 2022 (ES13) và ECMAScript 2021 (ES12) đều mang đến những cải tiến quan trọng trong JavaScript. Tuy nhiên, ES12 tập trung vào tối ưu hóa Promise và quản lý bộ nhớ, trong khi ES13 cải tiến mạnh về Class, giúp code ngắn gọn và tối ưu hơn. Dưới đây là các điểm khác biệt chính giữa hai phiên bản:

ES13 tập trung vào cải tiến class, trong khi ES12 tập trung vào Promise và bộ nhớ

  • ES12 giới thiệu các tính năng quan trọng như Promise.any(), giúp xử lý bất đồng bộ hiệu quả hơn bằng cách trả về Promise đầu tiên thành công.
  • ES12 cũng cung cấp WeakRefFinalizationRegistry, giúp tối ưu hóa bộ nhớ bằng cách quản lý tham chiếu yếu.
  • ES13 lại tập trung vào việc cải tiến Class, bổ sung Private Fields, Private Methods, Static Class FieldsStatic Private Methods, giúp bảo mật dữ liệu tốt hơn.

Ví dụ so sánh:

ES12 – Tối ưu hóa Promise với Promise.any()

const promise1 = new Promise((_, reject) => setTimeout(reject, 100, "Lỗi"));
const promise2 = new Promise((resolve) => setTimeout(resolve, 200, "Thành công"));

Promise.any([promise1, promise2]).then(console.log); 
//  Kết quả: "Thành công" (Trả về Promise đầu tiên thành công)

ES13 – Cải tiến class với Private Fields & Private Methods

class User {
  #password; // Private field

  constructor(name, password) {
    this.name = name;
    this.#password = password;
  }

  #getMaskedPassword() { // Private method
    return `***${this.#password}***`;
  }

  getPassword() {
    return this.#getMaskedPassword();
  }
}

const user = new User("Alice", "12345");
console.log(user.getPassword()); //  ***12345***
console.log(user.#password); //  Lỗi: Không thể truy cập private field

Điểm khác biệt:

  • ES12 tối ưu hóa Promise và bộ nhớ, giúp xử lý bất đồng bộ hiệu quả hơn.
  • ES13 cải tiến class, giúp bảo vệ dữ liệu tốt hơn.

ES13 đơn giản hóa kiểm tra thuộc tính object với Object.hasOwn(), thay vì dùng hasOwnProperty() như ES12

  • ES12 vẫn sử dụng hasOwnProperty() để kiểm tra thuộc tính object, nhưng phương thức này có thể gây lỗi nếu object bị ghi đè prototype.
  • ES13 giới thiệu Object.hasOwn(), giúp code dễ đọc và an toàn hơn.
Ví dụ so sánh:

ES12 – Kiểm tra thuộc tính bằng hasOwnProperty()

const obj = { name: "Alice" };
console.log(obj.hasOwnProperty("name")); // true
console.log(obj.hasOwnProperty("age")); //  false

Lỗi tiềm ẩn: Nếu obj bị ghi đè prototype, hasOwnProperty() có thể không hoạt động chính xác.

ES13 – Dùng Object.hasOwn() để kiểm tra thuộc tính an toàn hơn

const obj = { name: "Alice" };
console.log(Object.hasOwn(obj, "name")); // true
console.log(Object.hasOwn(obj, "age")); //  false

Điểm khác biệt:
ES12 phải sử dụng hasOwnProperty(), có thể gây lỗi nếu object bị ghi đè prototype.
ES13 cung cấp Object.hasOwn(), giúp kiểm tra an toàn hơn.

ES13 hỗ trợ .at() để truy cập phần tử mảng, trong khi ES12 vẫn dùng []

  • ES12 vẫn dùng cú pháp array[index] để truy cập phần tử, nhưng khi cần truy xuất phần tử cuối, phải dùng array.length - 1, khá dài dòng.
  • ES13 giới thiệu .at(), giúp truy xuất phần tử dễ dàng hơn, đặc biệt với số âm.

Ví dụ so sánh:

ES12 – Truy xuất phần tử bằng array[index]
const numbers = [10, 20, 30, 40, 50];
console.log(numbers[numbers.length - 1]); // 50 (Phần tử cuối cùng)
console.log(numbers[-1]); //  Lỗi (Không hỗ trợ số âm)
ES13 – Truy xuất phần tử dễ dàng hơn với .at()
console.log(numbers.at(-1)); //  50 (Dễ đọc hơn)
console.log(numbers.at(0));  //  10 (Phần tử đầu tiên)

Điểm khác biệt:
ES12 phải dùng array.length - 1 để truy xuất phần tử cuối.
ES13.at(), giúp truy xuất phần tử từ cuối dễ dàng hơn.

ES13 hỗ trợ Top-Level Await, giúp code bất đồng bộ đơn giản hơn so với ES12

  • ES12 yêu cầu bọc await trong async function, khiến việc import dữ liệu trong module trở nên phức tạp hơn.
  • ES13 cho phép sử dụng await trực tiếp trong module mà không cần async function.

Ví dụ so sánh:

ES12 – Dùng await trong async function

async function fetchData() {
  const data = await fetch("https://jsonplaceholder.typicode.com/posts/1")
    .then(response => response.json());
  console.log(data);
}

fetchData();

ES13 – Sử dụng Top-Level Await trực tiếp

const data = await fetch("https://jsonplaceholder.typicode.com/posts/1")
  .then(response => response.json());
console.log(data);
Điểm khác biệt:
ES12 phải bọc await trong async function.
ES13Top-Level Await, giúp viết code gọn hơn.

Kết bài

ECMAScript 2022 (ES13) tiếp tục mang đến nhiều cải tiến quan trọng cho JavaScript, giúp lập trình viên viết code an toàn hơn, dễ đọc hơn và tối ưu hơn. Với các tính năng như Private Fields, Private Methods, và Static Class Fields, ES13 giúp bảo vệ dữ liệu tốt hơn trong lập trình hướng đối tượng.

Bên cạnh đó, Object.hasOwn() giúp kiểm tra thuộc tính một cách an toàn hơn, Array.prototype.at() giúp truy cập phần tử dễ dàng hơn, và Top-Level Await giúp xử lý bất đồng bộ đơn giản hơn. Những cải tiến này giúp lập trình viên viết code gọn gàng hơn, tránh lỗi và nâng cao hiệu suất ứng dụng.

Với sự phát triển liên tục của JavaScript qua từng phiên bản ECMAScript, việc cập nhật và áp dụng các tính năng mới trong ES13 sẽ giúp lập trình viên tận dụng tối đa sức mạnh của ngôn ngữ, tạo ra những ứng dụng hiện đại và tối ưu hơn.

Bài viết liên quan