Sự Khác Biệt Giữa let, const và var trong JavaScript
Trong JavaScript, let, const, và var là ba cách để khai báo biến. Mỗi từ khóa này có các đặc điểm và quy tắc phạm vi khác nhau. Dưới đây là sự khác biệt cụ thể giữa chúng.
1. var
-
Phạm vi (Scope):
varcó phạm vi hàm (function scope) hoặc phạm vi toàn cục (global scope) nếu nó không được khai báo bên trong một hàm.- Nó không có phạm vi khối (block scope), nghĩa là các biến khai báo bằng
varsẽ tồn tại xuyên suốt các khối lệnh như if, for, v.v.
-
Hoisting (Kéo lên):
- Các biến khai báo bằng
varđược "kéo lên" đầu phạm vi hàm hoặc toàn cục và được khởi tạo với giá trịundefined.
- Các biến khai báo bằng
-
Ví dụ:
function example() { console.log(x); // undefined (do hoisting) var x = 10; console.log(x); // 10 } example(); if (true) { var y = 20; } console.log(y); // 20 (var không có phạm vi khối)
2. let
-
Phạm vi (Scope):
letcó phạm vi khối (block scope). Biến khai báo bằngletchỉ tồn tại trong khối lệnh bao quanh nó.
-
Hoisting (Kéo lên):
- Biến khai báo bằng
letcũng được kéo lên đầu phạm vi khối, nhưng không được khởi tạo cho đến khi dòng mã thực hiện đến nó. Điều này gây ra lỗiReferenceErrornếu truy cập biến trước khi khai báo.
- Biến khai báo bằng
-
Ví dụ:
function example() { // console.log(a); // ReferenceError: Cannot access 'a' before initialization let a = 10; console.log(a); // 10 } example(); if (true) { let b = 20; console.log(b); // 20 } // console.log(b); // ReferenceError: b is not defined (let có phạm vi khối)
3. const
-
Phạm vi (Scope):
- Giống như
let,constcó phạm vi khối (block scope).
- Giống như
-
Hoisting (Kéo lên):
- Giống như
let, biến khai báo bằngconstcũng được kéo lên đầu phạm vi khối nhưng không được khởi tạo cho đến khi dòng mã thực hiện đến nó.
- Giống như
-
Giá trị bất biến (Immutable Value):
- Biến khai báo bằng
constphải được khởi tạo ngay khi khai báo và không thể được gán lại giá trị khác sau đó. Tuy nhiên, nếu biến là một đối tượng hoặc mảng, nội dung của đối tượng hoặc mảng đó có thể thay đổi.
- Biến khai báo bằng
-
Ví dụ:
function example() { // console.log(c); // ReferenceError: Cannot access 'c' before initialization const c = 10; console.log(c); // 10 // c = 20; // TypeError: Assignment to constant variable. } example(); if (true) { const d = 20; console.log(d); // 20 } // console.log(d); // ReferenceError: d is not defined (const có phạm vi khối) const obj = { name: "Alice" }; obj.name = "Bob"; // OK, nội dung của đối tượng có thể thay đổi console.log(obj.name); // Bob // obj = { name: "Charlie" }; // TypeError: Assignment to constant variable.
Tổng Kết
| Đặc điểm | var |
let |
const |
|---|---|---|---|
| Phạm vi | Hàm/toàn cục | Khối | Khối |
| Hoisting | Có, giá trị ban đầu là undefined |
Có, nhưng không khởi tạo | Có, nhưng không khởi tạo |
| Khởi tạo lại | Có thể | Có thể | Không thể |
| Thay đổi nội dung | N/A | N/A | Có thể đối với đối tượng/mảng |
Hiểu rõ sự khác biệt giữa var, let, và const sẽ giúp bạn quản lý biến trong JavaScript một cách hiệu quả và tránh các lỗi tiềm ẩn.
Comments