一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

JavaScript 中使用 in 运算符与 hasOwnProperty 的权衡分析

时间:2026-07-11 11:11:04 编辑:袖梨 来源:一聚教程网

核心区别在于in检查整个原型链,hasOwnProperty只查对象自身;现代应优先用Object.hasOwn()替代hasOwnProperty,避免原型污染和null原型问题,for...in遍历时必须用Object.hasOwn过滤。

核心区别就一条:in 查整个原型链,hasOwnProperty 只查对象自己身上有没有这个键名。选哪个,取决于你真正想确认的是什么——是“能不能访问到”,还是“是不是我定义的”。

查“能不能访问”:用 in 或 Reflect.has()

当你关心的是属性是否可被调用或读取(比如判断 obj.method 是否可用),in 是最自然的选择。它不触发 getter,不依赖属性值,只看键名是否存在整个继承链上。

  • 语法简洁:'key' in obj 直观表达意图
  • 包含不可枚举属性和继承属性(如 toStringpush
  • 对数组检查索引存在性(0 in arr),不是元素真假值
  • 属性值为 undefined 时仍返回 true

查“是不是我定义的”:优先用 Object.hasOwn()

现代开发中,检查自有属性应默认走 Object.hasOwn(obj, 'key')。它解决了老式 hasOwnProperty 的两个硬伤:怕被覆盖、怕没原型。

  • 不依赖对象自身方法,不会因 obj.hasOwnProperty = null 失效
  • 兼容 Object.create(null) 创建的对象
  • 语义明确:“对象是否拥有该属性”,而非“调用一个可能不存在的方法”
  • Node.js 16.9+、Chrome 93+、Firefox 91+ 均原生支持

避免踩坑的常见误判方式

用属性值做存在性判断,逻辑上就是错的。哪怕看起来能跑通,也埋下隐患。

立即学习“Java免费学习笔记(深入)”;

  • obj.key !== undefined:值本身是 undefined 就会漏判
  • obj.key != null:把 0false'' 全当“不存在”
  • Object.keys(obj).includes('key'):每次循环新建数组,性能差;且漏掉不可枚举属性
  • 直接调用 obj.hasOwnProperty('key'):对象原型被篡改或为 null 原型时会报错

遍历对象时怎么过滤原型属性

for...in 本身就会遍历原型链,所以必须加守门逻辑。这不是可选项,而是必要操作。

  • 推荐写法:for (const key in obj) { if (Object.hasOwn(obj, key)) { /* 处理自有属性 */ } }
  • 若只需可枚举自有属性,用 Object.keys(obj) 配合 for...of 更轻量
  • 不要给 Object.prototype 添加方法,这是污染全局、引发遍历干扰的根源

热门栏目