先说结论:直接使用 Object.hasOwn(obj, key) 替代 obj.hasOwnProperty(key),即可彻底规避原型链被篡改的风险——它不依赖对象自身的 hasOwnProperty 方法,也不访问原型,只检查对象自身是否定义了该属性。这一方法在安全敏感的代码中尤其有效。 为什
先说结论:直接使用 Object.hasOwn(obj, key) 替代 obj.hasOwnProperty(key),即可彻底规避原型链被篡改的风险——它不依赖对象自身的 hasOwnProperty 方法,也不访问原型,只检查对象自身是否定义了该属性。这一方法在安全敏感的代码中尤其有效。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
因为 hasOwnProperty 是从 Object.prototype 继承来的方法,一旦对象自己重写了该方法,或原型链被污染,检测就会失效。来看几个典型场景:
hasOwnProperty: () => false,导致真实存在的属性被误判为不存在Object.create(null) 创建的对象,根本没有 hasOwnProperty 方法,调用直接报错它专为解决上述问题而设计,是 ES2022 正式引入的推荐方案。以下是其关键优势:
Object.prototypeObject.create(null) 创建的对象也能安全调用hasOwnProperty,Object.hasOwn 结果依然准确旧写法(有风险):
obj.hasOwnProperty('name') // 可能被重写、可能报错
新写法(推荐):
Object.hasOwn(obj, 'name') // 安全、简洁、语义明确
遇到需要兼容老环境的场景,可降级为:
Object.prototype.hasOwnProperty.call(obj, 'name')
但注意:这仍需确保 Object.prototype.hasOwnProperty 未被篡改,且写法更冗长。说到底,能上 Object.hasOwn 就上它,省心。
几个容易忽略但关键的点:
undefined、null 还是其他任何值,只要键在对象自身上,就返回 trueObject.hasOwn(arr, '2') 检查索引 2 是否被显式设置(而非仅因数组长度而“存在”)Object.hasOwn(obj, mySym),不能写成 'mySym'侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述