Những tính năng mới của ECMAScript 2016 (ES7) trong JavaScript

JavaScript Versions | by Học Javascript

ECMAScript (ES) là tiêu chuẩn chính thức của JavaScript, định nghĩa các tính năng và cú pháp của ngôn ngữ này. Sau sự ra đời của ECMAScript 2015 (ES6) với nhiều cải tiến lớn, phiên bản ECMAScript 2016 (ES7) tiếp tục bổ sung một số tính năng quan trọng giúp lập trình JavaScript trở nên đơn giản và hiệu quả hơn.

Mặc dù ES7 không có quá nhiều thay đổi so với ES6, nhưng hai tính năng chính – Array.prototype.includes()toán tử lũy thừa ** – đã giúp tối ưu hóa cú pháp và cải thiện khả năng xử lý dữ liệu. Những cải tiến này giúp code ngắn gọn hơn, dễ đọc hơn và phù hợp với các tiêu chuẩn lập trình hiện đại.

Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về các tính năng mới của ES7, ứng dụng thực tế của chúng và sự khác biệt so với các phiên bản trước đó.

ECMAScript 2016 (ES7) là gì?

ECMAScript (ES) là tiêu chuẩn chính thức của JavaScript, được duy trì bởi tổ chức ECMA International. Tiêu chuẩn này xác định cú pháp, quy tắc và tính năng của JavaScript, giúp ngôn ngữ này phát triển mạnh mẽ trong lập trình web và các ứng dụng khác.

Trước năm 2015, ECMAScript cập nhật theo chu kỳ dài (ES3 năm 1999, ES5 năm 2009). Tuy nhiên, từ ECMAScript 2015 (ES6) trở đi, JavaScript bắt đầu có những bản cập nhật hàng năm, với mỗi phiên bản mới bổ sung những tính năng quan trọng giúp lập trình viên viết code dễ dàng hơn, tối ưu hiệu suất và cải thiện khả năng bảo trì mã nguồn.

ECMAScript 2016, hay còn gọi là ES7, là phiên bản tiếp theo của ES6, được phát hành vào tháng 6 năm 2016. Mặc dù không có nhiều thay đổi lớn như ES6, nhưng ES7 đã bổ sung hai tính năng quan trọng giúp lập trình JavaScript trở nên đơn giản và hiệu quả hơn:

  • Array.prototype.includes() – Giúp kiểm tra xem một mảng có chứa một phần tử cụ thể hay không, thay thế cách sử dụng indexOf().
  • Toán tử lũy thừa (**) – Một cách viết ngắn gọn hơn thay vì sử dụng Math.pow().

Những cải tiến trong ES7 so với ES6

Tính năng ES6 ES7 (ECMAScript 2016)
Kiểm tra phần tử trong mảng array.indexOf(value) !== -1 array.includes(value)
Toán tử lũy thừa Math.pow(base, exponent) base ** exponent
Các cải tiến lớn khác Hỗ trợ class, module, arrow function, template literals, destructuring, async/await, promises Không có thay đổi lớn, chỉ cải tiến nhỏ về cú pháp

Mặc dù ES7 không có nhiều thay đổi lớn, nhưng những cải tiến này giúp code JavaScript dễ đọc hơn, trực quan hơn và phù hợp với các tiêu chuẩn lập trình hiện đại. ES7 cũng đặt nền tảng cho các phiên bản sau này như ES8, ES9, ES10, tiếp tục cải thiện hiệu suất và tính tiện dụng của JavaScript.

Các tính năng mới trong ES7 trong Javascript

Mặc dù ES7 (ECMAScript 2016) không có nhiều thay đổi lớn như ES6, nhưng nó đã bổ sung hai tính năng quan trọng giúp code JavaScript dễ viết hơn, ngắn gọn hơn và trực quan hơn.

Array.prototype.includes() – Kiểm tra phần tử trong mảng

Trước khi ES7 ra đời, để kiểm tra xem một phần tử có tồn tại trong một mảng hay không, chúng ta phải sử dụng phương thức indexOf(). Tuy nhiên, phương thức này không trực quan vì nó trả về chỉ số của phần tử nếu tìm thấy và -1 nếu không tìm thấy.

ES7 giới thiệu phương thức includes(), giúp kiểm tra một cách rõ ràng và dễ hiểu hơn.

Lợi ích của .includes()

  • Dễ đọc hơn: Thay vì kiểm tra điều kiện indexOf() !== -1, ta có thể viết trực tiếp includes().
  • Hỗ trợ tốt hơn với NaN: indexOf() không thể tìm NaN, nhưng includes() có thể.
  • Giúp code gọn gàng hơn: Tránh viết điều kiện dài dòng và phức tạp.

Ví dụ sử dụng .includes()

Trước ES7 (cách dùng indexOf() không trực quan):

const fruits = ['apple', 'banana', 'orange'];

if (fruits.indexOf('banana') !== -1) {
  console.log('Có banana trong danh sách!');
} else {
  console.log('Không tìm thấy banana');
}

Sau ES7 (sử dụng includes() trực quan hơn):

const fruits = ['apple', 'banana', 'orange'];

if (fruits.includes('banana')) {
  console.log('Có banana trong danh sách!');
} else {
  console.log('Không tìm thấy banana');
}

Kết quả: Có banana trong danh sách!

Lưu ý:

  • includes() phân biệt chữ hoa chữ thường ('Apple' khác 'apple').
  • includes() có thể tìm NaN, trong khi indexOf() không thể.

Ví dụ:

const numbers = [1, 2, NaN, 4];

console.log(numbers.includes(NaN)); // true
console.log(numbers.indexOf(NaN));  // -1 (indexOf không tìm thấy NaN)

Toán tử lũy thừa (**) – Exponentiation Operator

Trước ES7, nếu muốn tính lũy thừa trong JavaScript, chúng ta phải sử dụng hàm Math.pow(), điều này làm code dài hơn và khó đọc hơn.

ES7 giới thiệu toán tử lũy thừa **, giúp viết gọn hơn và dễ hiểu hơn.

Cú pháp:

base ** exponent  // Tương đương Math.pow(base, exponent)

Ví dụ trước ES7 (sử dụng Math.pow()):

console.log(Math.pow(2, 3)); // 8
console.log(Math.pow(5, 2)); // 25

Sau ES7 (sử dụng ** gọn hơn):

console.log(2 ** 3); // 8
console.log(5 ** 2); // 25

Ưu điểm của toán tử **

  • Viết code ngắn gọn hơn so với Math.pow().
  • Dễ đọc hơn: Biểu diễn rõ ràng toán tử lũy thừa.
  • Hoạt động giống với các ngôn ngữ lập trình khác như Python (**), Ruby (**).

Ứng dụng thực tế của toán tử lũy thừa

Tính toán số mũ trong công thức toán học

const square = (x) => x ** 2;
console.log(square(4)); // 16
Tạo số Fibonacci lớn hơn bằng lũy thừa
const fibonacciGrowth = (n) => (1.618 ** n) / Math.sqrt(5);
console.log(fibonacciGrowth(10)); // 55.00363657 (xấp xỉ số Fibonacci thứ 10)

Tính toán dung lượng dữ liệu theo lũy thừa của 2

const fileSizeInBytes = 2 ** 10; // 1024 bytes (1 KB)
console.log(fileSizeInBytes); // 1024

Ứng dụng của ES7 trong lập trình JavaScript

Dù ECMAScript 2016 (ES7) chỉ có hai tính năng mới, nhưng chúng mang lại sự cải thiện đáng kể trong việc viết code JavaScript dễ hiểu hơn, ngắn gọn hơn và hiệu quả hơn. Dưới đây là những ứng dụng quan trọng của ES7 trong thực tế.

Cải thiện hiệu suất và tính dễ đọc của code

Vấn đề trước ES7

  • Trước ES7, khi kiểm tra xem một phần tử có trong mảng không, lập trình viên phải dùng indexOf(), dẫn đến việc viết code dài dòng.
  • Khi tính toán số mũ, phải gọi Math.pow(), làm cho code khó đọc hơn.

Cách ES7 cải thiện hiệu suất

  • Sử dụng includes() thay cho indexOf() → Code ngắn gọn, dễ hiểu hơn.
  • Sử dụng ** thay cho Math.pow() → Tăng tốc hiệu suất tính toán số mũ.

Ví dụ minh họa:

Trước ES7 (Dài dòng, khó đọc hơn):

const numbers = [10, 20, 30, 40];

if (numbers.indexOf(30) !== -1) {
  console.log("Số 30 có trong mảng!");
}
console.log(Math.pow(2, 3)); // 8

Sau ES7 (Gọn gàng, dễ hiểu hơn):

const numbers = [10, 20, 30, 40];

if (numbers.includes(30)) {
  console.log("Số 30 có trong mảng!");
}
console.log(2 ** 3); // 8

Giúp lập trình viên đọc hiểu code nhanh hơn, ít lỗi hơn và viết code hiệu quả hơn.

Hỗ trợ trên hầu hết các trình duyệt hiện đại

Vấn đề trước đây

  • Khi có phiên bản ECMAScript mới, trình duyệt cũ có thể không hỗ trợ ngay lập tức.
  • May mắn thay, ES7 có tính tương thích cao, và hầu hết các trình duyệt hiện đại đã hỗ trợ.

Các trình duyệt hỗ trợ ES7

  • Google Chrome: Hỗ trợ từ phiên bản 52 trở lên.
  • Mozilla Firefox: Hỗ trợ từ phiên bản 48 trở lên.
  • Microsoft Edge: Hỗ trợ từ phiên bản 14 trở lên.
  • Safari: Hỗ trợ từ phiên bản 10 trở lên.
  • Opera: Hỗ trợ từ phiên bản 39 trở lên.

Lưu ý: Với trình duyệt cũ không hỗ trợ ES7, có thể dùng Babel để chuyển đổi code về ES5.

Ứng dụng trong xử lý mảng và các phép toán số học

Ứng dụng includes() trong kiểm tra dữ liệu

  • Tìm kiếm dữ liệu trong danh sách nhanh hơn và trực quan hơn.
  • Áp dụng trong lọc danh sách sản phẩm, người dùng, quyền hạn...

Ví dụ: Kiểm tra xem một người dùng có quyền admin không:

const userRoles = ['user', 'editor', 'admin'];

if (userRoles.includes('admin')) {
  console.log("Người dùng có quyền admin.");
} else {
  console.log("Người dùng không có quyền admin.");
}

Ứng dụng includes() trong xử lý form nhập liệu

  • Kiểm tra xem một giá trị có hợp lệ không.

Ví dụ: Kiểm tra email có hợp lệ không (có nằm trong danh sách chặn không?):

const blockedEmails = ['[email protected]', '[email protected]'];

const userEmail = '[email protected]';

if (blockedEmails.includes(userEmail)) {
  console.log("Email bị chặn, không thể đăng ký.");
} else {
  console.log("Email hợp lệ.");
}

Ứng dụng toán tử ** trong xử lý số học

  • Tính toán nhanh hơn với toán tử lũy thừa.
  • Ứng dụng trong khoa học, tài chính, và xử lý dữ liệu lớn.

Ví dụ: Tính lãi kép theo công thức:

const principal = 1000; // Số tiền gốc
const rate = 1.05; // Lãi suất 5%
const years = 10;

const futureValue = principal * (rate ** years);
console.log(`Số tiền sau ${years} năm: ${futureValue.toFixed(2)}`);

So sánh ES7 với ES6 trong Jacascript

ECMAScript 2016 (ES7) là phiên bản tiếp theo sau ES6 (ECMAScript 2015), nhưng so với ES6, ES7 không có quá nhiều thay đổi lớn. Tuy nhiên, nó vẫn giúp code JavaScript trở nên dễ đọc hơn, ngắn gọn hơn, và hiệu quả hơn. Dưới đây là những điểm so sánh chính giữa ES6 và ES7.

ES7 có ít thay đổi hơn so với ES6, nhưng vẫn hữu ích

Tính năng của ES6 (ECMAScript 2015)

ES6 giới thiệu rất nhiều tính năng mới làm thay đổi cách lập trình JavaScript, bao gồm:

  • Khai báo biến mới (let, const) giúp kiểm soát phạm vi biến tốt hơn so với var.
  • Arrow functions (=>) giúp viết hàm ngắn gọn và dễ đọc hơn.
  • Template literals ( ) giúp tạo chuỗi dễ dàng hơn.
  • Destructuring assignment giúp trích xuất dữ liệu từ object và array thuận tiện hơn.
  • Classes và Modules giúp tổ chức code tốt hơn, hỗ trợ lập trình hướng đối tượng.
  • Promises và Async/Await giúp cải thiện xử lý bất đồng bộ.

ES6 là một bản nâng cấp lớn, thay đổi hoàn toàn cách lập trình JavaScript so với ES5.

Tính năng của ES7 (ECMAScript 2016)

ES7 không có nhiều thay đổi như ES6, nhưng nó cải thiện cách viết code bằng hai tính năng đơn giản nhưng rất hữu ích:
Array.prototype.includes() giúp kiểm tra phần tử trong mảng dễ hiểu hơn indexOf().
Toán tử lũy thừa (**) giúp tính toán số mũ gọn gàng hơn so với Math.pow().

ES7 không mang lại thay đổi lớn như ES6, nhưng giúp code ngắn gọn và dễ đọc hơn.

So sánh .includes() với indexOf()

Trước ES7, để kiểm tra xem một phần tử có trong mảng không, lập trình viên phải dùng indexOf(), nhưng cách này không trực quan lắm.

Cách kiểm tra phần tử trong mảng trước ES7 (indexOf())

const fruits = ["apple", "banana", "orange"];

if (fruits.indexOf("banana") !== -1) {
  console.log("Có chuối trong danh sách!");
} else {
  console.log("Không có chuối!");
}

Nhược điểm:

  • Cần so sánh với -1, khiến code khó đọc hơn.
  • indexOf() chỉ trả về vị trí của phần tử, không trực tiếp trả về true/false.

Cách kiểm tra phần tử trong mảng từ ES7 (includes())

const fruits = ["apple", "banana", "orange"];

if (fruits.includes("banana")) {
  console.log("Có chuối trong danh sách!");
} else {
  console.log("Không có chuối!");
}

Ưu điểm của .includes():

  • Trực quan hơn: Trả về true/false thay vì số index.
  • Code gọn gàng hơn: Không cần so sánh với -1.
  • Dễ đọc và dễ hiểu hơn.

Kết luận: .includes() tốt hơn indexOf() vì dễ đọc, trực quan và ngắn gọn hơn.

So sánh toán tử lũy thừa (**) với Math.pow()

Trước ES7, để tính toán số mũ, lập trình viên phải dùng Math.pow(), nhưng cách này dài dòng và không giống với cách viết toán học thông thường.

Cách tính lũy thừa trước ES7 (Math.pow())

console.log(Math.pow(2, 3)); // Kết quả: 8
console.log(Math.pow(5, 2)); // Kết quả: 25

Nhược điểm:

  • Cú pháp dài hơn, không giống toán học.
  • Không trực quan với những ai quen với ký hiệu a^b trong toán học.

Cách tính lũy thừa từ ES7 (**)

console.log(2 ** 3); // Kết quả: 8
console.log(5 ** 2); // Kết quả: 25

Ưu điểm của toán tử **:

  • Giống với ký hiệu toán học (a^b trong nhiều ngôn ngữ khác).
  • Ngắn gọn hơn so với Math.pow().
  • Dễ đọc, dễ hiểu hơn.

Kết luận: Toán tử ** tốt hơn Math.pow() vì cú pháp ngắn gọn, trực quan hơn.

Khi nào nên sử dụng ES7 thay vì ES6?

Bạn nên sử dụng ES7 khi:
Bạn muốn code ngắn gọn hơn, dễ đọc hơn bằng .includes() thay vì indexOf().
Bạn cần thực hiện tính toán số mũ, toán tử ** sẽ giúp code gọn hơn so với Math.pow().
Dự án của bạn chạy trên các trình duyệt hoặc môi trường hỗ trợ ES7.

Khi nào không nên dùng ES7?

  • Nếu bạn cần hỗ trợ trình duyệt cũ không có ES7, bạn có thể cần Babel để chuyển đổi code.
Tiêu chí ES6 (ECMAScript 2015) ES7 (ECMAScript 2016)
Số lượng tính năng mới Rất nhiều (Class, Modules, Arrow functions, Promises, Template literals...) Chỉ có 2 tính năng mới
Ảnh hưởng đến JavaScript Thay đổi cách viết code JavaScript hiện đại Cải thiện cú pháp cho một số thao tác phổ biến
Tính năng nổi bật let, const, Arrow function, Class, Modules, Promises, Async/Await... .includes(), Toán tử **
Lợi ích Giúp tổ chức code tốt hơn, hỗ trợ lập trình hướng đối tượng Giúp code dễ đọc hơn, ngắn gọn hơn

Kết luận

ECMAScript 2016 (ES7) tuy không mang đến nhiều cải tiến lớn như ES6, nhưng vẫn giúp lập trình viên viết code JavaScript ngắn gọn hơn, dễ đọc hơn và trực quan hơn. Hai tính năng mới—.includes() giúp kiểm tra phần tử trong mảng dễ dàng hơn và toán tử ** giúp thực hiện phép toán lũy thừa nhanh chóng—đã cải thiện cách viết code JavaScript theo hướng đơn giản hơn và hiệu quả hơn.

Dù ES7 không có quá nhiều thay đổi, nhưng nó vẫn đóng vai trò quan trọng trong quá trình phát triển của JavaScript hiện đại. Những cải tiến này giúp lập trình viên tăng tốc độ phát triển phần mềm, tối ưu hiệu suất và cải thiện trải nghiệm lập trình. Nếu bạn đang làm việc với JavaScript trên các trình duyệt hoặc môi trường hỗ trợ ES7, bạn nên áp dụng ngay các tính năng mới này để tận dụng tối đa lợi ích mà chúng mang lại.

Bài viết liên quan