最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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直观表达意图 - 包含不可枚举属性和继承属性(如
toString、push) - 对数组检查索引存在性(
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:把0、false、''全当“不存在” -
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添加方法,这是污染全局、引发遍历干扰的根源
相关文章
- 火车票余票如何查询-火车票余票查询步骤与官方购票方法 07-17
- 怪物生存战争新手攻略大全 怪物生存战争零基础入门与生存技巧详解 07-17
- 豆包AI在线使用-豆包AI官方网页版直达入口 07-17
- 三国伏魔录新手入门指南 三国伏魔录详细玩法与快速上手教程 07-17
- 奈斯漫画首页登录下载版本怎么进-奈斯漫画免费漫画页面在线看漫画版本观看 07-17
- 创游世界网页端入口-创游世界下载入口 07-17