hasownproperty 比 in 快,因其是 o(1) 查找且不依赖原型链,而 in 需遍历整个原型链,深度越大性能差距越明显,尤其在多层继承或高频检测场景下。

hasOwnProperty 比 in 快,而且这个差距在多数实际场景中能被明显测出。关键不在“快多少”,而在于“为什么快”和“在哪种情况下快得更明显”。
原型链深度决定 in 的开销大小
in 运算符必须逐级遍历原型链,直到找到属性名或抵达原型链末端(Object.prototype 或 null)。这意味着:
- 对象是普通字面量(如
{a: 1}),原型链只有 1 层,in 的性能损耗几乎不可测; - 对象来自多层继承(比如
class C extends B extends A)或被手动设置过长原型链(Object.setPrototypeOf(obj, longChain)),in 的耗时会随层级线性增长; - 若目标属性恰好在原型链最末端才存在,in 就得走完整条链——这是最坏情况,也是性能落差最大的场景。
hasOwnProperty 是 O(1) 查找,不依赖原型链
它只访问对象自身的属性表(internal property table),现代引擎(V8、SpiderMonkey)对其做了深度内联与快速路径优化:
- 无论原型链有多深,耗时基本恒定;
- 即使对象有上百个自有属性,查找仍是常数时间;
- 完全绕过原型链,天然规避原型污染或方法被覆盖的风险(除非你显式重写了它)。
高频或批量检测时差距显著放大
真实项目常见这类场景:响应式系统频繁判断属性是否存在、配置合并中循环校验几十个 key、工具函数批量校验 API 字段(如 ['id', 'name', 'email'].every(k => k in data))。
- 在原型链深度为 5 的对象上,in 比 hasOwnProperty 慢 2–4 倍;
- 深度达 10 时,差距可扩大到 5–8 倍;
- 若用
Object.keys(obj).includes(key)替代,性能反而更差——每次调用都要创建新数组、遍历全部可枚举属性、漏掉不可枚举属性,比 hasOwnProperty 慢一个数量级以上。
推荐的实测方式
用 console.time() + 循环调用做基准测试,例如:
- 构造一个原型链深度为 10 的对象(用
Object.create链式创建); - 对同一 key 执行 10 万次
key in obj和obj.hasOwnProperty(key); - 对比两次
console.timeEnd()输出的时间差,通常可稳定复现 5 倍以上差异。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











