Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Cách sử dụng từ khóa const trong JavaScript

const (constant) khai báo biến chỉ đọc (read-only reference) – không thể gán lại giá trị mới. Ra mắt ES6 (2015), là cách khai báo mặc định khuyến nghị hiện nay.

Đặc điểm chính

  • Block scope – giới hạn trong cặp { } gần nhất.
  • Không hoisting usable – ở TDZ (Temporal Dead Zone) trước dòng khai báo.
  • Bắt buộc khởi tạo ngay – const x; báo lỗi SyntaxError.
  • Không gán lại (re-assign) – x = 2 báo TypeError.
  • Không khai báo lại (re-declare) – const x = 1; const x = 2; báo SyntaxError.

Cú pháp


const PI = 3.14159;
const USER_ROLES = ["admin", "editor", "viewer"];
const CONFIG = { apiUrl: "/api", timeout: 5000 };

Lưu ý quan trọng: Const ≠ Immutable

const bảo vệ binding (liên kết biến), không bảo vệ giá trị object/array.


// Object/Array: Vẫn sửa ĐƯỢC nội dung
const user = { name: "An" };
user.name = "Binh";        // ✅ OK - sửa property
user.age = 25;             // ✅ OK - thêm property
// user = {};              // ❌ TypeError - gán lại biến

const arr = [1, 2];
arr.push(3);               // ✅ OK - sửa mảng
arr[0] = 10;               // ✅ OK
// arr = [];                // ❌ TypeError

// Primitive: Không sửa được (vì immutable bản chất)
const x = 10;
// x = 20;                  // ❌ TypeError

Để làm object/array thực sự bất biến


// Shallow freeze
const obj = Object.freeze({ a: 1, b: { c: 2 } });
obj.a = 10;           // ❌ TypeError (strict mode) hoặc fail silently
obj.b.c = 20;         // ✅ Vẫn sửa được nested object (shallow only)

// Deep freeze (đệ quy)
function deepFreeze(obj) {
  Object.freeze(obj);
  Object.keys(obj).forEach(key => {
    if (typeof obj[key] === "object" && obj[key] !== null) {
      deepFreeze(obj[key]);
    }
  });
  return obj;
}

Ví dụ từ bài gốc


// Khai báo hằng số
const a = 150;

// ❌ Các thao tác SAI dưới đây:
a = 0;     // TypeError: Assignment to constant variable
a++;       // TypeError
var a = 0; // SyntaxError: Identifier 'a' has already been declared

Khi nào dùng const/let/var?

  1. const – Mặc định cho mọi khai báo (primitive, object, array, function).
  2. let – Khi CẦN gán lại giá trị (counter, swap, accumulator).
  3. var – Chỉ cho code legacy (pre-ES6), tránh trong code mới.

Temporal Dead Zone (TDZ)


{
  // TDZ bắt đầu
  console.log(x); // ReferenceError
  const x = 10;   // Khai báo - kết thúc TDZ
  console.log(x); // 10
}

Best Practice

  • Dùng const cho 95% khai báo.
  • Đặt tên hằng số toàn cục UPPER_SNAKE_CASE: API_URL, MAX_RETRY.
  • Dùng Object.freeze() cho config object không muốn thay đổi.
  • Kết hợp với destructuring: const { name, age } = user;