HOWTO · JavaScript

在 JavaScript 中檢查值是否為物件

在本教程中,我們將檢查一個值是否是 JavaScript 中的物件

本頁內容

若要檢查 JavaScript 值是否為物件,請使用 typeof value === "object" && value !== null。這個判斷式會包含陣列和其他物件,但排除 null 和函式。如果程式也應接受函式,請在條件中加入 typeof value === "function"。請依照程式的需求選擇合適的規則:JavaScript 將函式視為可呼叫的物件,但 typeof 會另外回報函式的型別。

在 JavaScript 中使用 instanceof 檢查值是否為物件

instanceof 是一個運算子,用來檢查建構函式的原型是否出現在某個值的原型鏈中。對於在相同 JavaScript 執行環境中建立的一般物件,value instanceof Object 通常會得到 true。當你想確認某個值是否為特定建構函式所建立的實例時,例如 value instanceof Date,這個運算子就很實用。

不過,它不是通用的物件判斷式。使用 Object.create(null) 建立的物件,其原型鏈中沒有 Object.prototype,因此 instanceof Object 會得到 false。在其他執行環境中建立的物件,例如另一個瀏覽器視窗或 iframe 中的物件,也會有不同的建構函式和原型;因此,該執行環境中的物件可能無法通過本地執行環境的 instanceof Object 檢查。如果你需要涵蓋這些情況的一般物件檢查,請使用以 typeof 為基礎的判斷式。

在 JavaScript 中使用 typeof 檢查值是否為物件

typeof 是運算子,不是函式;它的值不需要放在括號中。對於一般物件(包括陣列),typeof value 會回傳 "object"。有兩種結果需要留意:typeof null 也會回傳 "object",而函式的 typeof 結果則是 "function"。因此,只比較 "object" 會把 null 算進去,卻會排除函式。若你要判斷物件但排除 null,請明確檢查是否為 null。

定義可重複使用的物件檢查

這個判斷式會對非 null 的物件回傳 true,對函式、原始值和 null 回傳 false。範例會顯示物件、null 值、數字和函式各自的判斷結果。

function isObject(value) {
  return value !== null && typeof value === "object";
}

const person = { name: "Ada" };
console.log(isObject(person));
console.log(isObject(null));
console.log(isObject(42));
console.log(isObject(() => {}));

依照輸入值的順序,每次呼叫都會印出一個布林結果。這個定義刻意回答「這是不是非 null 的物件?」如果你的用途也要把函式算進去,請使用 value !== null && (typeof value === "object" || typeof value === "function")。不要用 value.constructor.toString() 來判斷:某個值可能沒有預期的建構函式,而且建構函式名稱或原始碼文字都不是可靠的通用型別檢查方式。Object(value) === value 這種寫法也涉及轉換行為,可能會模糊這個判斷式原本要表達的契約。

使用 Object.getPrototypeOf() 檢查物件的原型

Object.getPrototypeOf(value) 回答的是另一個問題:它會傳回物件的原型。例如,Object.getPrototypeOf(Object.create(null)) 會傳回 null,而 Object.getPrototypeOf({}) 會傳回 Object.prototype。這可以用來檢查繼承關係,或將某個值的原型與已知原型比較,但不能取代物件判斷式。將 null 或 undefined 傳給 Object.getPrototypeOf() 會造成 TypeError;其他原始值則會先被強制轉換為物件,再傳回其原型。只有在需要檢查原型時才使用此方法,不要把它當成通用的物件判斷式。