Tìm hiểu về ES6 (ECMAScript 6) trong JavaScript

JavaScript Versions | by Học Javascript

JavaScript là một trong những ngôn ngữ lập trình phổ biến nhất hiện nay, đặc biệt trong phát triển web. Để giúp JavaScript trở nên mạnh mẽ hơn, tổ chức ECMA đã phát triển ECMAScript (ES) – bộ tiêu chuẩn định nghĩa cách JavaScript hoạt động.

Trong đó, ECMAScript 6 (ES6), còn được gọi là ECMAScript 2015, là một bước tiến quan trọng trong sự phát triển của JavaScript. Phiên bản này giới thiệu nhiều tính năng mới giúp mã nguồn dễ đọc, dễ bảo trì và hiệu suất cao hơn. Những cải tiến như let, const, arrow functions, template literals, destructuring, modules, async/await… đã thay đổi cách lập trình JavaScript hiện đại.

Bài viết này sẽ đi sâu vào các tính năng quan trọng của ES6, so sánh với các phiên bản trước, và tìm hiểu tại sao ES6 là nền tảng cho các thư viện và framework như React, Vue, Angular ngày nay.

Giới thiệu về ECMAScript và mối liên hệ với JavaScript

ECMAScript (ES) là một tiêu chuẩn được phát triển bởi ECMA International, định nghĩa cách JavaScript hoạt động. JavaScript được xây dựng dựa trên ECMAScript, nghĩa là mọi phiên bản JavaScript đều tuân theo các quy tắc và cú pháp do ECMAScript đặt ra.

Trước khi ECMAScript ra đời, JavaScript phát triển một cách không đồng nhất giữa các trình duyệt, gây ra nhiều vấn đề tương thích. ECMAScript giúp tiêu chuẩn hóa JavaScript, đảm bảo ngôn ngữ này hoạt động nhất quán trên các nền tảng khác nhau.

Các phiên bản ECMAScript được cập nhật theo thời gian, mang lại nhiều tính năng mới giúp JavaScript ngày càng mạnh mẽ hơn. Một trong những bản cập nhật quan trọng nhất là ECMAScript 6 (ES6), còn được gọi là ECMAScript 2015, đánh dấu một bước tiến lớn trong lịch sử phát triển của JavaScript.

ES6 (ECMAScript 2015) là gì?

ECMAScript 6 (ES6) là phiên bản ECMAScript được phát hành vào năm 2015, mang lại hàng loạt cải tiến lớn cho JavaScript. Đây là một trong những bản nâng cấp quan trọng nhất kể từ ECMAScript 5 (ES5), giúp lập trình viên viết mã dễ hiểu, bảo trì tốt hơn và hiệu suất cao hơn.

Một số tính năng quan trọng được giới thiệu trong ES6 gồm:

  • Khai báo biến mới: letconst thay thế var, giúp quản lý phạm vi biến tốt hơn.
  • Arrow function: Viết hàm ngắn gọn hơn và tự động liên kết với ngữ cảnh this.
  • Template literals: Xâu chuỗi dễ dàng hơn với cú pháp `text ${variable}`.
  • Destructuring: Giúp truy xuất giá trị từ mảng và object nhanh chóng.
  • Modules (import/export): Hỗ trợ lập trình module hóa thay vì phải dùng require() như trước đây.
  • Classes: Giúp lập trình hướng đối tượng dễ dàng hơn, thay thế cách dùng prototype.
  • Promise & Async/Await: Cải thiện xử lý bất đồng bộ, giảm hiện tượng "callback hell".

ES6 không chỉ giúp code trở nên sạch hơn mà còn giúp các framework như React, Angular, Vue hoạt động hiệu quả hơn.

Vai trò của ES6 trong sự phát triển của JavaScript hiện đại

ES6 có ảnh hưởng sâu rộng đến cách viết JavaScript ngày nay, với những lợi ích quan trọng như:

Tối ưu cú pháp, dễ đọc hơn:

  • Giảm bớt sự phức tạp của JavaScript bằng cách cung cấp cú pháp ngắn gọn và trực quan hơn.
  • Ví dụ: Arrow function (=>) giúp code ngắn gọn hơn so với function().

Cải thiện hiệu suất và tối ưu bộ nhớ:

  • Các tính năng như const giúp quản lý bộ nhớ hiệu quả hơn bằng cách hạn chế việc thay đổi biến.

Cải thiện khả năng tổ chức code với module:

  • Trước ES6, JavaScript không hỗ trợ module một cách chính thức. ES6 giúp tổ chức code tốt hơn bằng cách sử dụng import/export.

Hỗ trợ lập trình hướng đối tượng dễ dàng hơn:

  • Trước ES6, JavaScript sử dụng prototype-based inheritance. ES6 giới thiệu class, giúp viết code hướng đối tượng dễ dàng hơn.

Tăng cường xử lý bất đồng bộ:

  • Promiseasync/await giúp viết code bất đồng bộ dễ đọc hơn so với cách sử dụng callback.

Nhờ những cải tiến này, ES6 trở thành tiêu chuẩn được hầu hết các trình duyệt và môi trường Node.js hỗ trợ, là nền tảng cho các công nghệ JavaScript hiện đại.

So sánh ES6 với ES5: Những cải tiến quan trọng

Tính năng ES5 ES6
Khai báo biến var let, const (quản lý phạm vi tốt hơn)
Hàm (Function) function() Arrow function (=>) giúp code ngắn gọn hơn
String Nối chuỗi bằng + Template literals với `text ${variable}`
Object & Array Truy xuất dữ liệu theo cách thủ công Destructuring giúp truy xuất dữ liệu nhanh hơn
Modules Không có hỗ trợ import/export giúp tổ chức code tốt hơn
Hướng đối tượng Dùng prototype class giúp lập trình hướng đối tượng dễ dàng hơn
Bất đồng bộ Callback (callback hell) Promiseasync/await giúp code dễ đọc hơn

Nhìn chung, ES6 giúp JavaScript trở nên mạnh mẽ hơn, giúp lập trình viên viết code dễ hiểu, bảo trì tốt hơn và nâng cao hiệu suất. Đây là lý do vì sao ES6 trở thành tiêu chuẩn phổ biến trong các dự án web hiện đại.

Các tính năng mới trong ES6 trong JavaScript

ES6 (ECMAScript 2015) mang đến nhiều cải tiến giúp lập trình JavaScript dễ dàng hơn, nâng cao hiệu suất và tổ chức mã tốt hơn. Dưới đây là các tính năng nổi bật trong ES6 cùng với giải thích chi tiết và ví dụ minh họa.

Khai báo biến mới với let và const

Sự khác biệt giữa var, let, và const

Đặc điểm var let const
Phạm vi (Scope) Function Scope Block Scope Block Scope
Có thể gán lại giá trị? Không
Có thể khai báo lại không? Không Không
Hoisting Được hoisting, nhưng có thể truy cập trước khi gán giá trị (undefined) Được hoisting nhưng không thể truy cập trước khi gán giá trị (Temporal Dead Zone - TDZ) Giống let

Phạm vi của letconst (Block Scope)

function test() {
    if (true) {
        var a = 10;
        let b = 20;
        const c = 30;
    }
    console.log(a); // 10
    console.log(b); //  ReferenceError: b is not defined
    console.log(c); //  ReferenceError: c is not defined
}
test();

Lợi ích khi sử dụng letconst thay vì var

  • Giảm lỗi do Hoisting (Temporal Dead Zone ngăn truy cập biến trước khi khai báo).
  • Phạm vi Block Scope giúp tránh lỗi ngoài mong muốn.
  • const giúp tạo các hằng số, đảm bảo giá trị không bị thay đổi.

Arrow Functions (Hàm mũi tên)

Arrow function giúp viết hàm ngắn gọn hơn và không có this riêng, tránh lỗi khi sử dụng trong lập trình hướng đối tượng.

Cú pháp ngắn gọn

const add = (a, b) => a + b;
console.log(add(5, 10)); //  15

Không có binding this

function ES5Example() {
    this.name = "JavaScript";
    setTimeout(function() {
        console.log(this.name); //  undefined (this tham chiếu đến global)
    }, 1000);
}

const ES6Example = () => {
    this.name = "JavaScript";
    setTimeout(() => {
        console.log(this.name); //  "JavaScript" (this giữ nguyên context)
    }, 1000);
};

Template Literals (Chuỗi mẫu)

Cho phép chèn biến vào chuỗi dễ dàng bằng dấu **backtick ()** thay vì dùng dấu +`.

Cú pháp sử dụng dấu backtick (`)

const name = "Alice";
console.log(`Xin chào, tôi là ${name}!`); //  Xin chào, tôi là Alice!

Tạo chuỗi nhiều dòng dễ dàng

const message = `Học JavaScript
là một điều thú vị!
Hãy cùng khám phá ES6!`;
console.log(message);

Destructuring Assignment (Phân rã đối tượng và mảng)

Giúp truy xuất giá trị từ objectarray nhanh chóng.

Trích xuất giá trị từ object

const person = { name: "Alice", age: 25 };
const { name, age } = person;
console.log(name); //  Alice
console.log(age);  //  25

Trích xuất giá trị từ array

const numbers = [1, 2, 3];
const [first, second] = numbers;
console.log(first);  //  1
console.log(second); //  2

Default Parameters (Tham số mặc định trong hàm)

Giúp tránh lỗi khi đối số không được truyền vào.

const greet = (name = "Guest") => `Hello, ${name}!`;
console.log(greet()); //  Hello, Guest!
console.log(greet("Alice")); //  Hello, Alice!

Rest Parameter & Spread Operator (...)

Rest Parameter: Gộp nhiều đối số thành một mảng

const sum = (...numbers) => numbers.reduce((acc, num) => acc + num, 0);
console.log(sum(1, 2, 3, 4)); //  10
Spread Operator: Mở rộng mảng, object
const numbers = [1, 2, 3];
const newNumbers = [...numbers, 4, 5]; //  [1, 2, 3, 4, 5]

Enhanced Object Literals (Cải tiến Object Literals)

Viết gọn key-value khi key và biến có cùng tên.

const name = "Alice";
const person = { name };
console.log(person); //  { name: "Alice" }

Classes (Lớp) và kế thừa (Class & Inheritance)

Cách khai báo class trong ES6.

class Person {
    constructor(name) {
        this.name = name;
    }
    greet() {
        console.log(`Hello, I'm ${this.name}`);
    }
}

class Student extends Person {
    constructor(name, age) {
        super(name);
        this.age = age;
    }
}

Modules (Mô-đun) trong JavaScript

Giúp tổ chức mã tốt hơn với import/export.

Module 1 (math.js)

export const add = (a, b) => a + b;
export const multiply = (a, b) => a * b;

Module 2 (app.js)

import { add, multiply } from './math.js';
console.log(add(2, 3)); //  5
console.log(multiply(2, 3)); //  6

Promises (Lời hứa) và xử lý bất đồng bộ

Giải quyết vấn đề callback hell.

const fetchData = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => resolve("Dữ liệu đã tải!"), 2000);
    });
};

fetchData()
    .then(data => console.log(data))
    .catch(error => console.error(error));

Async/Await (Xử lý bất đồng bộ dễ dàng hơn)

Giúp viết code dễ hiểu hơn so với Promise.

const fetchData = async () => {
    try {
        const data = await fetchDataFromAPI();
        console.log(data);
    } catch (error) {
        console.error(error);
    }
};

Symbol và Set/Map (Kiểu dữ liệu mới)

Symbol (Giá trị duy nhất, tránh xung đột trong object)

const id = Symbol("id");
const user = { [id]: 123 };
console.log(user[id]); //  123

Set (Lưu danh sách giá trị không trùng lặp)

const uniqueNumbers = new Set([1, 2, 3, 3]);
console.log(uniqueNumbers); // Set {1, 2, 3}

Map (Tối ưu hơn object)

const map = new Map();
map.set("name", "Alice");
console.log(map.get("name")); //  Alice

Ứng dụng của ES6 trong JavaScript

ES6 (ECMAScript 2015) không chỉ mang lại cú pháp rõ ràng, gọn gàng hơn mà còn giúp tối ưu hiệu suất và cải thiện khả năng tổ chức mã nguồn. Dưới đây là những ứng dụng quan trọng của ES6 trong lập trình web hiện đại.

Giúp code dễ đọc, dễ bảo trì hơn

Một trong những lợi ích lớn nhất của ES6 là giúp code ngắn gọn, rõ ràng và dễ bảo trì hơn. Các tính năng mới như arrow functions, destructuring, template literals, và modules giúp giảm thiểu số dòng code mà vẫn giữ được tính dễ hiểu.

Ví dụ: So sánh ES5 và ES6

ES5 (Dài dòng, khó bảo trì)

var student = {
    name: "Alice",
    age: 21,
    introduce: function() {
        return "Hello, my name is " + this.name + " and I am " + this.age + " years old.";
    }
};
console.log(student.introduce());

ES6 (Ngắn gọn, dễ đọc hơn)

const student = {
    name: "Alice",
    age: 21,
    introduce() {
        return `Hello, my name is ${this.name} and I am ${this.age} years old.`;
    }
};
console.log(student.introduce());
  • Dễ đọc hơn với template literals.
  • Không cần khai báo function cho method trong object.
  • Giảm thiểu lỗi khi làm việc với this trong object.

Tối ưu hiệu suất, hỗ trợ tốt hơn cho lập trình hướng đối tượng

ES6 giúp tối ưu hiệu suất thông qua các cải tiến như:
let và const giúp quản lý bộ nhớ hiệu quả hơn so với var.
Class và kế thừa (class & extends) giúp tổ chức mã tốt hơn.
Async/Await giúp xử lý bất đồng bộ mượt mà hơn.

Ví dụ: Trước và sau khi sử dụng Class trong ES6

ES5 (Sử dụng function constructor & prototype)

function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.greet = function() {
    return "Hello, I'm " + this.name;
};

ES6 (Sử dụng classextends)

class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    greet() {
        return `Hello, I'm ${this.name}`;
    }
}
  • Code gọn gàng hơn với class.
  • Hỗ trợ kế thừa (extends) giúp mở rộng tính năng dễ dàng.

Được sử dụng trong framework hiện đại như React, Vue, Angular

Hầu hết các framework JavaScript hiện đại như React.js, Vue.js, Angular đều sử dụng ES6 làm nền tảng. Các tính năng như module, class, arrow functions, destructuring giúp lập trình viên viết code dễ dàng hơn khi làm việc với các framework này.

Ví dụ: React sử dụng ES6 để khai báo component

Component React sử dụng ES5

var HelloWorld = React.createClass({
    render: function() {
        return React.createElement('h1', null, 'Hello World');
    }
});

Component React sử dụng ES6 (Ngắn gọn hơn với Class Component)

import React from 'react';

class HelloWorld extends React.Component {
    render() {
        return <h1>Hello World</h1>;
    }
}
export default HelloWorld;

ES6 giúp React Component dễ đọc hơn.Tận dụng các tính năng OOP như kế thừa (extends) để mở rộng component.

So sánh ES6 với ES5 trong JavaScript

ECMAScript 6 (ES6) mang lại nhiều cải tiến so với ES5, giúp lập trình JavaScript trở nên hiệu quả hơn. Tuy nhiên, ES6 cũng có những hạn chế nhất định, đặc biệt là về khả năng hỗ trợ trên các trình duyệt cũ. Dưới đây là so sánh chi tiết giữa ES6 và ES5.

Ưu điểm của ES6 so với ES5

Cú pháp gọn hơn, dễ đọc hơn

ES6 mang đến nhiều cú pháp mới giúp code trở nên ngắn gọn và dễ hiểu hơn.

Ví dụ: Khai báo biến với letconst thay vì var

ES5 (Sử dụng var)

var name = "Alice";
var age = 25;
console.log(name + " is " + age + " years old.");
ES6 (Sử dụng letconst + Template literals)
let name = "Alice";
const age = 25;
console.log(`${name} is ${age} years old.`);
  • letconst giúp quản lý biến tốt hơn (const giúp tạo hằng số).
  • Template literals (${}) giúp viết chuỗi dễ dàng và trực quan hơn.

Hỗ trợ lập trình hướng đối tượng với class

ES5 không có cú pháp class, khiến việc viết chương trình theo OOP (Object-Oriented Programming) trở nên phức tạp. ES6 giúp đơn giản hóa với classextends.

Ví dụ: Khai báo class và kế thừa trong ES6 so với ES5

ES5 (Dùng function constructor)

function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.greet = function() {
    return "Hello, my name is " + this.name;
};

ES6 (Dùng class)

class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    greet() {
        return `Hello, my name is ${this.name}`;
    }
}
  • Code gọn gàng hơn, dễ hiểu hơn với class.
  • Hỗ trợ kế thừa dễ dàng bằng extends.

Hỗ trợ modules giúp quản lý mã nguồn tốt hơn

ES5 không có hỗ trợ importexport, khiến việc chia nhỏ code thành các tệp dễ tái sử dụng trở nên khó khăn. ES6 khắc phục điều này với mô-đun (modules).

Ví dụ: Import/Export trong ES6

Module math.js (Xuất dữ liệu)

export function add(a, b) {
    return a + b;
}

File main.js (Nhập dữ liệu)

import { add } from './math.js';

console.log(add(2, 3)); // 5

Giúp chia nhỏ code thành các tệp dễ quản lý.

Tránh xung đột biến toàn cục.

Cải tiến bất đồng bộ với Promises và async/await

ES5 sử dụng callback, dễ dẫn đến callback hell khi xử lý nhiều tác vụ bất đồng bộ. ES6 cung cấp Promiseasync/await để đơn giản hóa xử lý bất đồng bộ.

ES5 (Callback Hell)

function getData(callback) {
    setTimeout(() => {
        callback("Data received");
    }, 1000);
}

getData(function(result) {
    console.log(result);
});

ES6 (Dùng async/await để viết dễ hiểu hơn)

function getData() {
    return new Promise(resolve => {
        setTimeout(() => resolve("Data received"), 1000);
    });
}

async function fetchData() {
    let result = await getData();
    console.log(result);
}

fetchData();
  • Tránh lồng quá nhiều hàm (callback hell).
  • Dễ đọc, dễ bảo trì hơn.

Nhược điểm của ES6

Không hỗ trợ tốt trên trình duyệt cũ (IE11, IE10, v.v.)
Một số trình duyệt cũ không hỗ trợ các tính năng mới của ES6, chẳng hạn như let, const, class, arrow function, v.v.

  • Dùng Babel để chuyển đổi ES6 về ES5 giúp chạy trên trình duyệt cũ.
  • Kiểm tra trình duyệt có hỗ trợ ES6 hay không trước khi triển khai.

Khi nào nên dùng ES6 thay vì ES5?

Tình huống Nên dùng ES5 Nên dùng ES6
Phát triển ứng dụng web mới
Hỗ trợ trình duyệt cũ (IE11 trở xuống) (Cần dùng Babel)
Lập trình hướng đối tượng (OOP)
Lập trình bất đồng bộ (Callback Hell) (Async/Await, Promise)
Viết code gọn gàng, dễ bảo trì
Làm việc với framework hiện đại (React, Vue, Angular)

Dùng ES6 khi:

  • Viết ứng dụng hiện đại với trình duyệt mới.
  • Làm việc với React, Vue, Angular.
  • Cần xử lý bất đồng bộ mượt mà.

Dùng ES5 khi:

  • Phải hỗ trợ trình duyệt cũ (IE11, IE10, v.v.).
  • Làm việc trên dự án cũ chưa nâng cấp lên ES6.

Kết bài

ES6 (ECMAScript 6) đánh dấu một bước tiến quan trọng trong sự phát triển của JavaScript, mang lại nhiều cải tiến về cú pháp, quản lý mô-đun, lập trình hướng đối tượng, và xử lý bất đồng bộ. Những tính năng mới như let, const, arrow functions, classes, modules, và async/await giúp lập trình viên viết code dễ hiểu, bảo trì tốt hơn, và tối ưu hiệu suất hơn so với ES5.

Tuy nhiên, do ES6 không được hỗ trợ trên một số trình duyệt cũ, việc sử dụng ES5 hoặc các công cụ chuyển đổi như Babel vẫn là cần thiết trong một số trường hợp. Dù vậy, với sự phát triển của các trình duyệt hiện đại và nhu cầu ngày càng cao của lập trình web, ES6 đã trở thành tiêu chuẩn phổ biến và là lựa chọn hàng đầu trong các dự án JavaScript ngày nay.

Bài viết liên quan