JavaScript:プロパティ存在チェック
基本的には2つの視点がある。
オブジェクトに確かにプロパティが存在しているかどうか
プロパティに有意な値が入っているかどうか
さらに、継承の有無(プロパティチェーンをたどるかどうか)、DontEnum 属性の問題がある。
厄介なのは、以下の2通りがあるため
プロパティがなかったので undefined
プロパティがあってその中身が undefined
!o.propName
falsy であればよいならば。
0 や "" も falsy なので要注意
継承は判定される
o.propName === undefined
キーがあるかどうかではなくて、値がそうであるか
o.propName || "代理の値"
古き良き時代によく使われていた、未設定の時に代理の値(デフォルト値)を上書きする手法。
falsy であればよいならば。
0 や "" も falsy なので要注意
このため、頻繁にバグの原因になっていた。
継承は判定される
boolean の値にならないことに注意。
ヌル値合体演算子 (??)
o.propName ?? "代理の値"
null, undefined の場合に代理の値が選択される仕組み
0、"" は上書きされない。
継承は判定される
Object.keys(o).indexOf(propName)
できるけど冗長
継承は判定されない