若想取得 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 是否存在。

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。

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。

Optional Chaining
let data = { title: 'FP in JavaScript' }
let price = (data?.price ?? 0) * 0.8 // ?
也可使用 ?. 判斷 property 是否存在,若不存在時會回傳 undefined,可再搭配 ?? 提供 undefined 時的預設值。

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