點燈坊

失くすものさえない今が強くなるチャンスよ

如何判斷 Object 的 Property 是否存在 ?

Sam Xiao's Avatar 2021-08-13

若想取得 Object 的 Property 做運算,但又不確定 Object 是否包含此 Property 時,ECMAScript 提供多種方式可判斷 Property 是否存在。

Version

ECMAScript 2020

Falsy Value

let data = { title: 'FP in JavaScript' }

let price = 0

if (data.price)
  price = data.price * 0.8

price // ?

讀取 property 不存在時會回傳 undefined,可藉由 falsy value 判斷 property 是否存在。

prop000

hasOwnProperty

let data = { title: 'FP in JavaScript' }

let price = 0

if (data.hasOwnProperty ('price'))
  price = data.price * 0.8

price // ?

也可使用 Object.prototype.hasOwnProperty 判斷 property 是否存在。

hasOwnProperty 顧名思義只能判斷 Object 本身的 property,而不能判斷來自於 prototype 的 property,若 Object 只當 data 並不會使用 prototype,因此可安心使用 hasOwnProperty

prop001

in

let data = { title: 'FP in JavaScript' }

let price = 0

if ('price' in data)
  price = data.price * 0.8

price // ?

in 也可判斷 property 是否存在,與 hasOwnProperty 不同的是它會判斷來自於 prototype 的 property。

prop002

Optional Chaining

let data = { title: 'FP in JavaScript' }

let price = (data?.price ?? 0) * 0.8 // ?

也可使用 ?. 判斷 property 是否存在,若不存在時會回傳 undefined,可再搭配 ?? 提供 undefined 時的預設值。

prop003

Conclusion

  • ECMAScript 所提供判斷 property 是否存在都偏 Imperative,若想更 Functional 可使用 Sanctuary 的 get