Kiểm tra biến undefined hoặc null là thao tác phổ biến. Cách kiểm tra đúng phụ thuộc vào việc bạn muốn kiểm tra gì: "chưa khai báo", "đã khai báo nhưng chưa gán", hay "đã gán null".
Bảng so sánh nhanh
| Biểu thức | Kiểm tra gì | Kết quả với undefined | Kết quả với null | Kết quả với 0/""/false |
|---|---|---|---|---|
if (x) | Truthy | false | false | false (loại cả 0, "", false) |
if (x == null) | Null OR Undefined | true | true | false |
if (x === null) | Chỉ null | false | true | false |
if (x === undefined) | Chỉ undefined | true | false | false |
typeof x === "undefined" | Chưa khai báo HOẶC undefined | true | false | false |
Các tình huống và cách xử lý
1. Kiểm tra biến có giá trị "hợp lệ" (không null/undefined)
// ✅ Khuyến nghị: == null (bắt cả 2)
if (value == null) { /* missing */ }
// Hoặc explicit
if (value === null || value === undefined) { /* missing */ }
// ❌ Tránh: if (!value) – loại cả 0, "", false, NaN
2. Kiểm tra biến đã được KHAI BÁO (tránh ReferenceError)
// ✅ An toàn: typeof không ném lỗi nếu biến chưa khai báo
if (typeof myVar !== "undefined") {
// myVar đã khai báo (có thể giá trị = undefined)
}
// ❌ Nguy hiểm: if (myVar) – ReferenceError nếu chưa khai báo
3. Phân biệt "chưa khai báo" vs "khai báo = undefined"
let declaredButUndefined;
// undeclaredVar không tồn tại
typeof declaredButUndefined; // "undefined"
typeof undeclaredVar; // "undefined" (KHÔNG lỗi!)
"declaredButUndefined" in window; // true (global) / false (local scope)
4. Kiểm tra property object
const obj = { a: 1, b: null, c: undefined };
"a" in obj; // true
"b" in obj; // true (key tồn tại, value null)
"c" in obj; // true (key tồn tại, value undefined)
"d" in obj; // false
obj.hasOwnProperty("b"); // true
Object.hasOwn(obj, "c"); // true (ES2022, an toàn hơn)
Ví dụ từ bài gốc (đã cải tiến)
<script>
var age = 10;
// Cách 1: Truthy check (loại 0, "", false, null, undefined, NaN)
if (age) {
document.write("True - age có giá trị truthy");
} else {
document.write("False - age là falsy");
}
// Cách 2: Kiểm tra cụ thể null/undefined
var maybeNull = null;
if (maybeNull == null) { // bắt cả null và undefined
document.write("
maybeNull là null hoặc undefined");
}
</script>
Modern Patterns (ES2020+)
// Nullish Coalescing (??) - Default cho null/undefined
const value = userInput ?? "default"; // Chỉ null/undefined mới dùng default
// Optional Chaining (?.) - Truy cập an toàn
const city = user?.address?.city ?? "Unknown";
// Logical Assignment (ES2021)
x ??= defaultValue; // Chỉ gán nếu x là null/undefined
Best Practice
- Kiểm tra "có giá trị hay không":
value == null(ngắn) hoặcvalue === null || value === undefined(rõ ràng). - Kiểm tra "đã khai báo":
typeof x !== "undefined". - Kiểm tra property:
Object.hasOwn(obj, 'key')(ES2022). - Default value:
??thay vì||. - Luôn bật
"use strict"hoặc dùng ES Modules.