object.hasown对非对象类型(null、undefined、字符串、数字等)严格校验并抛出typeerror,而非返回false,这是其明确设计行为;它专用于对象自有属性检测,强制开发者前置类型防护,避免静默错误,与object.keys等现代api行为一致。

Object.hasOwn 对非对象类型(如 null、undefined、字符串、数字、布尔值等)会直接抛出 TypeError,这是其明确设计行为,而非缺陷。
严格参数校验:只接受真实对象
该方法语义上专用于“对象自有属性检测”,原始值不具备属性结构,因此引擎在调用初期就做类型检查:
- 传入
null或undefined→ 抛出TypeError: Cannot convert undefined/null to object - 传入字符串
"abc"→ 抛出TypeError: Expected object, got string(具体消息依引擎而异) - 传入数字
42、布尔值true、SymbolSymbol('a')同样报错
与 hasOwnProperty 的关键区别:不自动装箱
obj.hasOwnProperty() 在某些场景下会隐式调用装箱(boxing)——例如对字符串字面量调用时,临时创建 String 对象:
-
"abc".hasOwnProperty('length')不报错(但返回false,因为length是继承属性) -
Object.hasOwn("abc", 'length')直接抛错,拒绝任何非对象输入
这种设计消除了“看似能用、实则语义错乱”的隐患,强制开发者显式确认输入类型。
安全使用建议:前置类型防护
若需处理可能为非对象的变量,应主动判断,而非依赖兜底:
- ✅ 推荐:
obj != null && typeof obj === 'object' && Object.hasOwn(obj, key) - ✅ 更简洁(ES2020+):
obj && typeof obj === 'object' && !Array.isArray(obj) && Object.hasOwn(obj, key)(排除数组需额外判断) - ❌ 避免:
Object.hasOwn(obj ?? {}, key)—— 会把null变成空对象,掩盖真实数据问题
为什么不是返回 false?
返回 false 容易造成静默失败:
- 若
Object.hasOwn(null, 'x')返回false,你无法区分是“null没有x”还是“{}没有x” - 抛错能快速暴露逻辑错误,比如解构前未校验响应体是否为对象、API 返回了意外类型
- 这与
Object.keys(null)、Object.entries(undefined)等现代 API 行为一致,保持平台一致性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











