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

Cách kiểm tra biến có tồn tại (defined) trong JavaScript

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áchKiểm tra gìLưu ý
typeof x !== "undefined"Đã khai báo (scope)An toàn, không ném lỗi
x != nullKhông null/undefinedCho phép 0, "", false
x !== undefined && x !== nullKhông null/undefinedRõ ràng, explicit
!!x hoặc Boolean(x)TruthyLoại 0, "", false, NaN
"prop" in objKey tồn tại (own + proto)Kể cả value = undefined
Object.hasOwn(obj, "prop")Own property tồn tạiES2022, 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 undeclaredVar trả về "undefined" – KHÔNG ném ReferenceError (đặc thù JS).
  • typeof null === "object" – bug lịch sử, cẩn thận khi check typeof x === "object".
  • Ưu tiên Object.hasOwn() (ES2022) thay hasOwnProperty().
  • Dùng ?? (nullish coalescing) thay || khi 0/"" là giá trị hợp lệ.