判斷物件裡是否含有特定屬性


🌿 情境

在進行前端專案時,常會遇到後端回傳的 API 資料內,少了某個 key 值,導致程式報錯,畫面無法渲染。

可能因為該 key 值內沒有值,所以後端索性不給了。看起來資料是簡潔了許多,但是真的是非常困擾……

例如: Object 內少了一個 key favorite,導致 v-if="favorite" 時會報錯

obj = {
  name: "Hobby",
  gender: "female",
  // favorite: 'bubble-tea'
};

🌿 解法

有兩種方式可以判斷物件內屬性,而其中的差別在於確認的屬性深度不同

方法一: obj.hasOwnProperty()

obj.hasOwnProperty(“key”)

  • key: 要判定的 key 值
  • obj: 物件
obj.hasOwnProperty("favorite");
//true

obj.hasOwnProperty("valueOf");
// false, valueOf 繼承自原型鏈結

方法二: in 運算子

“key” in obj

  • key: 要判定的 key 值
  • obj: 物件
"favorite" in obj;
//true

"valueOf" in obj;
// true

🌿 差異

hasOwnProperty() 只會檢查物件本身是否包含該屬性,而 in 運算子則會繼續往物件原型鏈 (Prototype chain) 上檢查。

在網頁 console 測試兩者差異

先建立物件
建立物件

展開物件後,可以看到除了我們設定的參數,還有 Prototype
展開物件

使用 hasOwnProperty() 和 in 運算子 來觀察其中差異。

發現因為 Prototype 裡有 valueOf,所以 in 運算子回傳的結果是 true,而 hasOwnProperty() 因為不會檢查 Prototype,所以回傳 false。
觀察差異


🌿 參考資料


cover: Photo by David van Dijk on Unsplashn


文章作者: Hobby Lee
版權聲明: 本部落格所有文章除特別聲明外,均採用 CC BY 4.0 許可協議。轉載請註明來源 Hobby Lee !
  目錄