Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Khai báo lại biến (Re-declare) có hủy giá trị không trong JavaScript?

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/let ngă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

KeywordRe-declare same scopeHoistingScopeGiá trị ban đầu
varCho phép (chỉ khai báo)Có (undefined)FunctionGiữ nếu không gán lại
letCấm (SyntaxError)Có (TDZ)BlockN/A
constCấm (SyntaxError)Có (TDZ)BlockN/A