Object.hasOwn 是补全配置对象最清晰可靠的方式,因它只检查自有属性、不查原型链,且是 ES2022 标准化方法,避免了 in 的误判和 hasOwnProperty 的兼容性问题。

直接用 Object.hasOwn 判断属性是否存在,再手动赋默认值,是补全配置对象最清晰、最可靠的方式。
为什么不用 in 或 hasOwnProperty?
in 会检查原型链上的属性,容易误判;hasOwnProperty 虽然安全,但可能被覆盖或在某些老旧环境(如 IE)中不可靠。Object.hasOwn 是 ES2022 正式引入的标准化方法,既安全又语义明确,推荐作为首选。
基础补全逻辑:逐个检查 + 赋默认值
对每个需要默认值的键,先用 Object.hasOwn(obj, key) 判断是否自有属性,不存在就写入默认值:
- 适用于配置项不多、逻辑简单的情况
- 不会覆盖已明确设为
undefined或null的值(因为hasOwn只看是否存在,不关心值) - 示例:
function applyDefaults(config = {}) { if (!Object.hasOwn(config, 'timeout')) config.timeout = 5000; if (!Object.hasOwn(config, 'retries')) config.retries = 3; if (!Object.hasOwn(config, 'method')) config.method = 'GET'; return config; }
批量补全:用默认配置对象驱动
把默认值集中定义为一个对象,遍历其键,只对目标对象中缺失的键赋值:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 避免重复写
if,更易维护 - 默认值对象本身可复用、可导出
- 示例:
const DEFAULTS = { timeout: 5000, retries: 3, method: 'GET', headers: {} }; function applyDefaults(config = {}) { for (const [key, defaultValue] of Object.entries(DEFAULTS)) { if (!Object.hasOwn(config, key)) { config[key] = defaultValue; } } return config; }
注意边界:null、undefined 和空对象
Object.hasOwn 只判断属性是否存在,不管值是什么。所以以下情况不会触发默认值:
-
{ timeout: undefined }—— 属性存在,只是值为undefined -
{ timeout: null }—— 同样存在,不会补默认值 - 如果业务上希望“假值”也视为未设置,需额外判断:
!Object.hasOwn(config, 'timeout') || config.timeout == null
不复杂但容易忽略细节,关键是理解 hasOwn 的语义:只管“有没有”,不管“是不是有效值”。按需组合逻辑,就能写出健壮的默认值补全逻辑。

















