Cơ bảnKiến thức cơ bản

Biến trong JavaScript: var, let, const khác nhau gì?

8 phút đọc15 lượt xem
#biến javascript#var let const#javascript cơ bản#es6 javascript#scope javascript

Biến trong JavaScript: var, let, const khác nhau gì?

Khi học JavaScript, bạn sẽ thấy 3 từ khóa khai báo biến: var, let, và const. Câu hỏi thực tế là: dùng cái nào, khi nào?

Câu trả lời ngắn: dùng const mặc định, chuyển sang let khi cần thay đổi giá trị, không bao giờ dùng var. Bài này giải thích tại sao.

Biến là gì? Ba cách khai báo

var ten = "Minh";       // Cách cũ (ES5) — Không khuyến nghị
let tuoi = 22;          // Cách mới (ES6) — Dùng khi cần gán lại
const PI = 3.14159;     // Hằng số (ES6) — Dùng mặc định

var — Tại sao không nên dùng nữa

var có 3 vấn đề khiến code dễ sinh bug:

// Vấn đề 1: Function scope — khai báo trong block nhưng thoát ra ngoài
function viDu() {
    var x = 10;
    if (true) {
        var x = 20;     // Ghi đè biến x ban đầu!
        console.log(x); // 20
    }
    console.log(x);     // 20 (không phải 10 như mong đợi)
}

// Vấn đề 2: Hoisting bất ngờ — dùng trước khi khai báo không lỗi
console.log(ten);   // undefined (không báo lỗi!)
var ten = "Minh";

// Vấn đề 3: Khai báo lại được — nguồn gốc của nhiều bug
var email = "a@a.com";
var email = "b@b.com"; // Hoàn toàn hợp lệ, không cảnh báo

let — Biến hiện đại, an toàn hơn

// Block scope — biến chỉ tồn tại trong block {}
function viDu() {
    let x = 10;
    if (true) {
        let x = 20;     // Biến x KHÁC, chỉ tồn tại trong if
        console.log(x); // 20
    }
    console.log(x);     // 10 (x ban đầu, không bị ảnh hưởng)
}

// Phải khai báo trước khi dùng
console.log(ten);   // ReferenceError!
let ten = "Minh";

// Có thể gán lại giá trị
let diem = 8.0;
diem = 8.5;    // OK
diem = 9.0;    // OK

// Không thể khai báo lại cùng tên
let email = "a@a.com";
let email = "b@b.com"; // SyntaxError!

const — Mặc định cho mọi thứ

// Không thể gán lại giá trị primitive
const PI = 3.14159;
const WEBSITE = "vietcode.vn";

PI = 3; // TypeError: Assignment to constant variable!

// Nhưng object và array: CÓ THỂ thay đổi nội dung bên trong
const sinh_vien = { ten: "Minh", tuoi: 22 };
sinh_vien.tuoi = 23;    // OK — thay đổi property
sinh_vien = {};          // TypeError — không gán lại object mới

const mon_hoc = ["Python", "JavaScript"];
mon_hoc.push("SQL");    // OK — thêm phần tử
mon_hoc = [];            // TypeError

So sánh var vs let vs const

varletconst
ScopeFunctionBlockBlock
HoistingCó (undefined)Không (TDZ)Không (TDZ)
Gán lạiĐượcĐượcKhông được
Khai báo lạiĐượcKhôngKhông
Khi nào dùngKhông bao giờGiá trị thay đổiMặc định

Kiểu dữ liệu trong JavaScript

Primitive Types

// String
const ten = "Nguyễn Văn Minh";
const gioi_thieu = `Tôi là ${ten}, 22 tuổi`; // Template literal

// Number (không phân biệt int và float)
const tuoi = 22;
const diem = 8.5;
const vo_cuc = Infinity;
const khong_phai_so = NaN;

// Boolean
const la_sinh_vien = true;

// null và undefined
let ket_qua = null;      // Cố ý không có giá trị
let bien_chua_gan;       // undefined (chưa gán)
console.log(bien_chua_gan); // undefined

Reference Types

// Object
const nguoi_dung = {
    ten: "Minh",
    tuoi: 22,
    skills: ["Python", "JavaScript"]
};

// Array
const mon_hoc = ["Toán", "Lý", "Python"];

// typeof — kiểm tra kiểu
console.log(typeof "Xin chào");  // "string"
console.log(typeof 42);          // "number"
console.log(typeof true);        // "boolean"
console.log(typeof null);        // "object" — lỗi lịch sử của JS!

Template Literals — Chuỗi thông minh

const ten = "Lan";
const tuoi = 20;
const truong = "Đại học Bách Khoa";

// Cách cũ — dễ nhầm
const info1 = "Tôi là " + ten + ", " + tuoi + " tuổi, học " + truong;

// Template literal — rõ ràng hơn
const info2 = `Tôi là ${ten}, ${tuoi} tuổi, học ${truong}`;

// Hỗ trợ biểu thức
const ket_qua = `Tổng: ${2 + 3}`;           // "Tổng: 5"
const trang_thai = `${tuoi >= 18 ? "Người lớn" : "Trẻ em"}`;

Bài tập thực hành

// Tính chu vi và diện tích hình tròn
const PI = 3.14159;
const ban_kinh = 5;

const chu_vi = 2 * PI * ban_kinh;
const dien_tich = PI * ban_kinh ** 2;

console.log(`Hình tròn bán kính ${ban_kinh}:`);
console.log(`Chu vi: ${chu_vi.toFixed(2)}`);       // 31.42
console.log(`Diện tích: ${dien_tich.toFixed(2)}`); // 78.54

Kết luận

Quy tắc đơn giản để không nhầm: dùng const mặc định, chuyển sang let khi cần gán lại, không bao giờ dùng var. Đây là cách tất cả lập trình viên JavaScript hiện đại đang áp dụng.

Về tác giả

Ảnh đại diện tác giả Kenji — họa tiết hình học

Kenji

Kỹ sư phần mềm full-stack (Web), hơn 5 năm kinh nghiệm thực tế

  • Python
  • DB
  • Hạ tầng
  • Đào tạo & cố vấn
  • AI

Làm việc cùng đồng nghiệp người Việt, tôi thấy thiếu tài liệu kỹ thuật rõ ràng bằng tiếng Việt. codeahoc là nơi tôi chia sẻ theo hướng thực tế, dễ áp dụng.

Nguyên tắc nội dung

  • Ưu tiên nguồn gốc và góc nhìn từ thực tế triển khai.
  • Nếu có sai sót, nội dung sẽ được cập nhật và sửa kịp thời.

Khóa học liên quan

The Complete JavaScript Course 2026: From Zero to Expert!

Khóa học JavaScript toàn diện nhất từ cơ bản đến nâng cao.

4.7
Xem khóa học →

React - The Complete Guide (incl. React Router & Redux)

Làm chủ React.js với các dự án thực tế, hooks, Redux.

4.6
Xem khóa học →

Node.js, Express, MongoDB & More: The Complete Bootcamp

Backend với Node.js: REST API, authentication, MongoDB.

4.7
Xem khóa học →

*Đây là liên kết liên kết (affiliate link). Chúng tôi có thể nhận hoa hồng nếu bạn mua khóa học qua liên kết này.