Kiểm tra biến "tồn tại" có 2 nghĩa: (1) biến đã được khai báo trong scope, (2) biến có giá trị khác null/undefined. Cách kiểm tra tùy mục đích.
1. Kiểm tra đã khai báo trong scope (tránh ReferenceError)
// Cách an toàn: typeof (không ném lỗi nếu chưa khai báo)
if (typeof myVar !== "undefined") {
console.log("Biến đã khai báo");
}
// Hoặc try-catch (ít dùng)
try {
myVar;
console.log("Đã khai báo");
} catch (e) {
console.log("Chưa khai báo");
}
2. Kiểm tra giá trị "hợp lệ" (không null/undefined)
Thường dùng khi biến có thể là null hoặc undefined.
var myVar = 20;
// Cách 1: Kiểm tra cả null và undefined
if (myVar !== undefined && myVar !== null) {
console.log("Có giá trị hợp lệ");
}
// Cách 2: Toán tử AND ngắn gọn (falsy check)
if (myVar != null) { // == null bắt cả null và undefined
console.log("Có giá trị");
}
// Cách 3: Boolean conversion (cẩn thận: 0, "", false cũng bị loại)
if (myVar) {
console.log("Truthy");
}
3. Kiểm tra property trong object
const obj = { a: 1, b: null, c: undefined };
"a" in obj; // true (có key, kể cả prototype)
"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("a"); // true (own property)
Object.hasOwn(obj, "a"); // true (ES2022, an toàn hơn)
4. Kiểm tra biến global
// Browser
"myGlobal" in window; // true nếu tồn tại
window.hasOwnProperty("myGlobal");
// Node.js
"myGlobal" in global;
global.hasOwnProperty("myGlobal");
So sánh các cách
| Cách | Kiểm tra gì | Lưu ý |
|---|---|---|
typeof x !== "undefined" | Đã khai báo (scope) | An toàn, không ném lỗi |
x != null | Không null/undefined | Cho phép 0, "", false |
x !== undefined && x !== null | Không null/undefined | Rõ ràng, explicit |
!!x hoặc Boolean(x) | Truthy | Loại 0, "", false, NaN |
"prop" in obj | Key tồn tại (own + proto) | Kể cả value = undefined |
Object.hasOwn(obj, "prop") | Own property tồn tại | ES2022, khuyến nghị |
Ví dụ thực tế
function greet(user) {
// Kiểm tra object tồn tại
if (!user) return "Khách"; // null/undefined
// Kiểm tra property
const name = Object.hasOwn(user, "name") ? user.name : "Ẩn danh";
const age = user.age ?? "??"; // Nullish coalescing (ES2020)
return `Xin chào ${name}, ${age} tuổi`;
}
console.log(greet({ name: "An", age: 25 })); // "Xin chào An, 25 tuổi"
console.log(greet({ name: "Binh" })); // "Xin chào Binh, ?? tuổi"
console.log(greet(null)); // "Khách"
Lưu ý
typeof undeclaredVartrả về"undefined"– KHÔNG ném ReferenceError (đặc thù JS).typeof null === "object"– bug lịch sử, cẩn thận khi checktypeof x === "object".- Ưu tiên
Object.hasOwn()(ES2022) thayhasOwnProperty(). - Dùng
??(nullish coalescing) thay||khi 0/"" là giá trị hợp lệ.