Không. Khai báo lại biến với var (trong cùng scope) không làm mất giá trị — trừ khi gán giá trị mới.
Ví dụ: Re-declare KHÔNG gán lại → Giữ nguyên giá trị
<script>
var x = new Number(4);
var x; // Chỉ khai báo lại, KHÔNG gán giá trị
var y = 8;
var y; // Chỉ khai báo lại
document.write(x + '<br>'); // 4 — giữ nguyên!
document.write(y); // 8 — giữ nguyên!
</script>
Ví dụ: Re-declare CÓ gán lại → Giá trị mới
<script>
var x = new Number(4);
var x = 7; // Khai báo lại VÀ gán mới
var y = 8;
var y = 10; // Khai báo lại VÀ gán mới
document.write(x + '<br>'); // 7
document.write(y); // 10
</script>
Giải thích: Hoisting (Nâng lên)
var bị hoist lên đầu scope (function/global). Code trên tương đương:
// JS engine thấy như sau:
var x; // Hoisted
var x; // Hoisted (gộp)
var y;
var y;
x = new Number(4);
x = 7; // Gán sau hoist
y = 8;
y = 10;
Khác với let/const (Block scope, Temporal Dead Zone)
// let/const — KHÔNG thể re-declare trong cùng scope
let x = 1;
let x = 2; // SyntaxError: Identifier 'x' has already been declared
const y = 1;
const y = 2; // SyntaxError
// Nhưng trong block khác OK
{
let x = 1;
{
let x = 2; // OK — scope khác
}
}
Best Practice
- Dùng const mặc định, let khi cần gán lại — tránh hoàn toàn
var. const/letngăn chặn re-declare bug tại compile time.- Nếu phải dùng
var(legacy): không khai báo lại cùng tên — gây confusion.
Tóm tắt
| Keyword | Re-declare same scope | Hoisting | Scope | Giá trị ban đầu |
|---|---|---|---|---|
var | Cho phép (chỉ khai báo) | Có (undefined) | Function | Giữ nếu không gán lại |
let | Cấm (SyntaxError) | Có (TDZ) | Block | N/A |
const | Cấm (SyntaxError) | Có (TDZ) | Block | N/A |