JavaScript không có từ khóa unset như PHP. Để "hủy" biến, tùy mục đích có các cách khác nhau:
1. Gán undefined – Xóa giá trị, giữ biến
let x = 10;
x = undefined;
console.log(x); // undefined
// Biến x vẫn tồn tại trong scope
2. Gán null – Chỉ định "rỗng chủ động"
let user = { name: "An" };
user = null; // Giải phóng object để GC dọn (nếu không còn ref khác)
console.log(user); // null
3. delete – Xóa PROPERTY khỏi OBJECT (KHÔNG xóa biến)
QUAN TRỌNG: delete chỉ xóa property của object, KHÔNG xóa biến khai báo bằng var/let/const.
const obj = { a: 1, b: 2 };
delete obj.a; // true
console.log(obj); // { b: 2 }
let x = 10;
delete x; // false (strict mode: SyntaxError) - KHÔNG XÓA ĐƯỢC BIẾN
4. Ra khỏi Scope – Cách tự nhiên nhất
function foo() {
let temp = "large data";
// temp chỉ tồn tại trong foo()
} // temp tự động giải phóng khi ra khỏi scope (GC dọn nếu không còn ref)
5. Block Scope tạm (ES6)
{
let temp = "chỉ trong block này";
// xử lý temp
}
// temp tự hủy ở đây
Ví dụ từ bài gốc (đã sửa)
let str = "Demo Text";
let nxt = "Next";
window.onscroll = function() {
let y = this.pageYOffset;
if (y > 200) {
document.write(nxt);
nxt = undefined; // Unset giá trị
// delete nxt; // ❌ SAI: không xóa được biến let
// document.write(nxt); // undefined
}
};
So sánh các cách
| Cách | Áp dụng cho | Hiệu quả | Lưu ý |
|---|---|---|---|
x = undefined | Biến (var/let) | Giá trị = undefined, biến còn tồn tại | Dùng khi sẽ gán lại sau |
x = null | Biến (var/let) | Giá trị = null, giải phóng object ref | Dùng khi không dùng nữa, giúp GC |
delete obj.prop | Property của object | Xóa hoàn toàn property | Không xóa được biến/property non-configurable |
| Ra khỏi scope | Biến let/const/var trong block/hàm | Tự động giải phóng | Cách tốt nhất, tự nhiên |
Cạm bẫy delete
- Không xóa được biến
var/let/const(configurable: false). - Không xóa được property
non-configurable(strict mode ném TypeError). - Không xóa được property kế thừa từ prototype (chỉ xóa own property).
- Trong strict mode:
delete variable→ SyntaxError.
Best Practice
- Dùng
const/letblock scope – tự hủy khi ra scope. - Gán
nullcho object lớn không dùng nữa → giúp GC. - Dùng
delete obj.propchỉ khi thực sự cần xóa key khỏi object. - Tránh biến global – dùng Module/IIFE.