object.hasown(obj, key)是最简洁安全的自有属性检测方法,它避免了hasownproperty的报错和污染问题,且不等价于in操作符或undefined判断,语义明确无需封装。

直接用 Object.hasOwn(obj, key) 就是最简洁、最可读的写法,无需封装或替代。
为什么不用 obj.hasOwnProperty(key)
hasOwnProperty 是实例方法,当 obj 为 null 或 undefined 时会报错;若 obj 原型上重写了该方法,结果还可能被污染。而 Object.hasOwn 是静态方法,不依赖对象自身,安全可靠。
-
Object.hasOwn(null, 'x')→false(不报错) -
Object.hasOwn({toString: 'hacked'}, 'toString')→true(准确判断自有属性)
避免常见“伪简化”写法
有人试图用 key in obj 或 obj[key] !== undefined 替代,但这两种都不等价:
-
'toString' in {}→true(但不是自有属性) -
{}.toString !== undefined→true(同样会命中继承属性) -
Object.hasOwn({}, 'toString')→false(正确)
在实际代码中保持清晰语义
命名和调用保持直白,不追求“更短”而牺牲意图表达:
- ✅
if (Object.hasOwn(user, 'email')) { ... } - ❌
if ('email' in user && !Object.getPrototypeOf(user).hasOwnProperty('email'))(冗长且易错) - ❌
const has = (o, k) => Object.hasOwn(o, k)(封装无必要,反而增加认知负担)
它本身已是标准、安全、语义明确的最小单元,直接使用就是最佳实践。











