属性访达性
在 JavaScript 里,「属性访达性(property reachability)」可以用多种运算符/关键字来探测,但它们各自探测的作用并不一样——换句话说,它们回答的不是同一个问题。
值的探测
只检测值是否为 null | undefined:
默认值回退: obj?.[key] ?? def 仅当结果是 null 或 undefined 才回退到 def。
宽松判断: obj?.[key] == null 一次性匹配 null 或 undefined,因为 null == undefined 为 true
一次性监测所有falsy
falsy指的是 0、''、false、NaN、null、undefined这些值
默认值回退: obj?.[key] || def
布尔化检查: !obj?.[key] 等价于“读到的值是否是 falsy”,一般不是可靠的“存在性”判断
键的探测
in操作符: key in obj 这通常会检查 obj 对象的整条原型链上是否有 key 属性,包括不可枚举属性。
obj.hasOwnProperty('key'): 只检查对象自有属性,不扫描原型链。
Object.hasOwn(obj, 'key'): ES2022 提供的自有属性检查,防止 obj 把 hasOwnProperty 字段覆盖掉。
obj.propertyIsEnumerable('key'): 判断指定的自有属性是否可枚举,只检查自有属性。
最佳实践
“问值用 ?.,问键用 Object.hasOwn;
只想兜底用 ??,别拿 || 当存在判断。”