Trong JavaScript, var, let, và const đều dùng để khai báo biến, nhưng chúng có sự khác biệt quan trọng về phạm vi (scope), hoisting, và khả năng gán lại giá trị (mutability).
var
- Scope: var có function scope (phạm vi trong hàm) và không có block scope (phạm vi trong khối { }).
- Hoisting: Khi khai báo bằng var, biến sẽ được hoisting lên đầu phạm vi chứa nó nhưng không gán giá trị (undefined).
- Có thể gán lại giá trị: Bạn có thể gán lại giá trị cho biến khai báo bằng var.
🔹 Ví dụ:
console.log(a); // undefined (hoisting xảy ra)
var a = 10;
console.log(a); // 10
if (true) {
var b = 20;
}
console.log(b); // 20 (Không có block scope)
Lưu ý: Dùng var có thể gây lỗi do biến có thể được truy cập ngoài phạm vi mong muốn.
let
- Scope: let có block scope, nghĩa là biến chỉ tồn tại trong { } nơi nó được khai báo.
- Hoisting: Có hoisting nhưng không được gán giá trị trước khi khai báo (nên truy cập trước khi khai báo sẽ gây lỗi).
- Có thể gán lại giá trị.
Ví dụ:
console.log(x); // Lỗi: Cannot access ‘x’ before initialization
let x = 10;
console.log(x); // 10
if (true) {
let y = 20;
console.log(y); // 20
}
console.log(y); // Lỗi: y is not defined (vì y có block scope)
const
- Scope: Giống let, const có block scope.
- Hoisting: Có hoisting nhưng không thể truy cập trước khi khai báo.
- Không thể gán lại giá trị: const yêu cầu phải gán giá trị ngay khi khai báo và không thể thay đổi giá trị của biến đó.
Ví dụ:
const PI = 3.14;
PI = 3.1415; // Lỗi: Assignment to constant variable
Lưu ý: Nếu const là một object hoặc array, bạn không thể gán lại giá trị mới, nhưng có thể thay đổi thuộc tính của object hoặc phần tử của array.
const person = { name: “Alice” };
person.name = “Bob”; // Được phép
person = { name: “Charlie” }; // Lỗi: Không thể gán giá trị mới
const numbers = [1, 2, 3];
numbers.push(4); // Được phép
numbers = [5, 6, 7]; // Lỗi
Tóm tắt sự khác biệt
Đặc điểm | var | let | const |
Scope | Function Scope | Block Scope | Block Scope |
Hoisting | Có, gán undefined | Có, nhưng không thể truy cập trước khai báo | Có, nhưng không thể truy cập trước khai báo |
Có thể gán lại giá trị? | ✅ | ✅ | ❌ |
Có thể khai báo lại? | ✅ | ❌ | ❌ |
Các bạn nên dùng let và const, tránh dùng var để tránh lỗi không mong muốn và dùng const khi giá trị không cần thay đổi, dùng let khi giá trị có thể thay đổi!
Giảng viên Võ Văn Mỹ
Bộ môn Công nghệ thông tin
FPT Polytechnic TP HCM