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
| var | let | const | |
|---|---|---|---|
| Scope | Function | Block | Block |
| Hoisting | Có (undefined) | Không (TDZ) | Không (TDZ) |
| Gán lại | Được | Được | Không được |
| Khai báo lại | Được | Không | Không |
| Khi nào dùng | Không bao giờ | Giá trị thay đổi | Mặ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.