HOWTO · JavaScript

檢查 JavaScript 中屬性是否存在

在今天的帖子中,我們將學習如何檢查 JavaScript 中的屬性是否存在。

本頁內容

若要檢查 JavaScript 物件是否有某個屬性,請依照任務中「存在」的定義選擇檢查方式。Object.prototype.hasOwnProperty() 只檢查物件本身直接儲存的屬性。in 運算子則會同時檢查物件本身的屬性,以及透過原型鏈繼承的屬性。

在 JavaScript 中檢查屬性是否存在

需要確認物件本身是否定義某個鍵時,請使用 Object.prototype.hasOwnProperty()。它會根據鍵是否存在傳回布林值,不受屬性值影響:即使自有屬性的值是 null 或 undefined,該屬性仍然存在。較可靠的寫法是 Object.prototype.hasOwnProperty.call(object, key);即使物件本身有名為 hasOwnProperty 的屬性,也能正常使用。鍵可以是字串或符號。這個方法也能檢查陣列是否將某個索引作為自有屬性。請參閱 MDN 的 hasOwnProperty() 參考文件。

請將屬性是否存在與值的檢查分開看待。若屬性存在但值是 undefined,自有屬性檢查仍會傳回 true;比較屬性值回答的是另一個問題。同樣地,若某個鍵是從原型繼承而來,in 可能會傳回 true,但讀取該鍵並不會顯示它是在哪裡定義的。請依照程式需要的是物件本身的鍵,還是任何可存取的鍵,選擇相應的檢查方式。

如果繼承的屬性也應視為存在,請使用 key in object。這是運算子運算式,不是方法呼叫;左運算元是屬性鍵,右運算元是物件。用於陣列時,它可以檢查索引,也會一併考量陣列的原型鏈。請參閱 MDN 的 in 運算子 參考文件。

執行以下獨立範例:

const defaults = { theme: 'light' };
const settings = Object.create(defaults);
settings.language = 'en';

console.log(Object.prototype.hasOwnProperty.call(settings, 'language'));
console.log(Object.prototype.hasOwnProperty.call(settings, 'theme'));
console.log('theme' in settings);
console.log('timezone' in settings);

if (!Object.prototype.hasOwnProperty.call(settings, 'timezone')) {
  settings.timezone = 'UTC';
}
console.log(settings.timezone);
true
false
true
false
UTC

在此範例中,language 是自有屬性,而 theme 來自 defaults:自有屬性檢查可以區分兩者,in 則會辨識出兩者。範例以否定條件檢查不存在的 timezone,因此只有在物件尚未自行定義該屬性時才會新增。若也要避免新增已繼承的鍵,可以使用相同模式:!('key' in object)。提供的執行結果依序為 true、false、true、false 和 UTC。